diff --git "a/DATA/CODE/FUNCTIONS/FUNCTIONS.txt" "b/DATA/CODE/FUNCTIONS/FUNCTIONS.txt" deleted file mode 100644--- "a/DATA/CODE/FUNCTIONS/FUNCTIONS.txt" +++ /dev/null @@ -1,307 +0,0 @@ - -function glitch() { - javascript: (function() { window.__glitch_runs = window.g__glitch_runs ? window.__glith_runs + 1 : 1; const MODES = { STANDARD: 'STANDARD', TURBO: 'TURBO' }; const OPTIONS = Object.assign({ G_T: false, G_I: true, TURBO: false }, { G_T: true } || {}); const GLITCH_TEXT = OPTIONS.G_T; const GLITCH_IMAGES = OPTIONS.G_I; const MODE = OPTIONS.TURBO ? MODES.TURBO : MODES.STANDARD; if (MODE === MODES.TURBO) { window.__glitch_runs = 3; } const transformTranspose = (header, input, gap = 1) => { const idx = header + Math.floor(Math.random() * (input.length - header - gap)); const tmp = input[idx]; input[idx] = input[idx + gap]; input[idx + gap] = tmp; return input; }; const transformSubstitute = (header, input) => { const by = Math.floor(Math.random() * 256); const idx = header + Math.floor(Math.random() * (input.length - header)); input[idx] = by; return input; }; const transformText = str => { let bytes = new TextEncoder('utf-8').encode(str); const errors = Math.random() * (0.05 * str.length); for (let i = 0; i < errors; i += 1) { bytes = Math.random() > 0.5 ? transformSubstitute(0, bytes) : transformTranspose(0, bytes, Math.floor(Math.random() * str.length - 1) + 1); } const string = new TextDecoder('utf-8').decode(bytes); return string; }; const glitchImage = image => { try { image.onload = () => { }; image.style.backgroundColor = '#262626'; const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); canvas.width = image.naturalWidth; canvas.height = image.naturalHeight; context.drawImage(image, 0, 0); const data = canvas.toBlob(blob => { const fileReader = new FileReader(); fileReader.onload = event => { const data = blob.size === event.target.result.byteLength ? new Uint8Array(event.target.result) : null; image.onerror = () => { image.src = URL.createObjectURL(blob); }; const glitchOnce = () => { const errors = Math.random() * 10 * window.__glitch_runs; let corrupted = data.slice(0); for (let i = 0; i < errors; i++) { corrupted = Math.random() > 0.5 ? transformTranspose(100, corrupted) : transformSubstitute(100, corrupted); } const corruptBlob = new Blob([corrupted], { type: 'image/png' }); const corruptSrc = URL.createObjectURL(corruptBlob); image.src = corruptSrc; }; const glitchImageRaf = () => { glitchOnce(); window.requestAnimationFrame(glitchImageRaf); }; const glitchImageTimeout = (max = 300) => { glitchOnce(); window.setTimeout(() => { glitchImageTimeout(max); }, Math.random() * max / 2 + Math.random() * max / 2); }; if (MODE === MODES.STANDARD) { glitchImageTimeout(); } else if (MODE === MODES.TURBO) { glitchImageRaf(); } }; fileReader.readAsArrayBuffer(blob); }, 'image/jpeg'); } catch (e) { return false; } }; const glitchText = n => { const original = n.textContent; const glitchText = () => { n.textContent = transformText(original).replace(/�/g, ''); }; const glitchTextTimeout = (max = 1000) => { glitchText(); window.setTimeout(() => { glitchTextTimeout(max); }, Math.random() * max / 2 + Math.random() * max / 2); }; const glitchTextRaf = () => { glitchText(); window.requestAnimationFrame(glitchTextRaf); }; glitchTextTimeout(); }; const textNodesUnder = el => { let n; const a = []; const walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false); while ((n = walk.nextNode())) { a.push(n); } return a; }; const setupGlitch = () => { if (GLITCH_IMAGES) { const images = document.querySelectorAll('img'); images.forEach(i => { i.complete ? glitchImage(i) : (i.onload = event => glitchImage(event.target)); }); } if (GLITCH_TEXT) { const textNodes = textNodesUnder(document.body).filter(n => n.textContent && n.textContent.length > 0 && n.textContent.trim()); textNodes.forEach(glitchText); } }; if (document.readyState === 'complete') { setupGlitch(); } else { document.body.addEventListener('load', setupGlitch); } })(); -} -function snow() { - window.open("javascript:(function()%7Bjavascript%3A (function() %7B%0A var letter %3D prompt('What letter%3F')%3B%0A var color %3D prompt('What color%3F')%3B%0A var speed %3D prompt('What speed%3F')%3B%0A var container %3D document.createElement('div')%3B%0A document.body.appendChild(container)%3B%0A container.style.position %3D 'fixed'%3B%0A container.style.top %3D '0'%3B%0A container.style.left %3D '0'%3B%0A container.style.width %3D '100%25'%3B%0A container.style.height %3D '100%25'%3B%0A container.style.overflow %3D 'hidden'%3B%0A container.style.pointerEvents %3D 'none'%3B%0A%0A function init() %7B%0A var injection %3D document.createElement('style')%3B%0A document.body.appendChild(injection)%3B%0A injection.innerHTML %3D '%40-webkit-keyframes snow %7B%5Cnfrom %7Btop%3A-1%25%3B%7D%5Cnto%7Btop%3A121%25%3B%7D%7D%5Cn%40-moz-keyframes snow %7B%5Cnfrom %7Btop%3A -1%25%3B%7D%5Cnto %7Btop%3A 121%25%3B%7D%5Cn%7D'%3B%0A %7D%0A init()%3B%0A window.setInterval(createParticle%2C speed)%3B%0A timeChoices %3D %5B5%2C 6%2C 7%2C 8%2C 9%2C 10%5D%3B%0A%0A function destroy(evt) %7B%0A container.removeChild(evt.target)%3B%0A %7D%0A%0A function createParticle() %7B%0A var particle %3D document.createElement('span')%3B%0A var randomSpeed %3D timeChoices%5BMath.floor(Math.random() * timeChoices.length)%5D%3B%0A particle.innerHTML %3D letter%3B%0A particle.className %3D 'flake'%3B%0A particle.style.position %3D 'absolute'%3B%0A particle.style.color %3D color%3B%0A particle.style.backgroundColor %3D 'transparent'%3B%0A particle.style.width %3D '5px'%3B%0A particle.style.height %3D '5px'%3B%0A particle.style.pointerEvents %3D 'none'%3B%0A particle.style.right %3D Math.random() * 100 %2B '%25'%3B%0A particle.style.borderRadius %3D '50%25'%3B%0A particle.style.WebkitAnimation %3D 'snow ' %2B randomSpeed %2B 's linear'%3B%0A container.appendChild(particle)%3B%0A particle.addEventListener('webkitAnimationEnd'%2C destroy)%3B%0A %7D%0A%7D)()%7D)()%3B", "_self"); -} -function watch() { - window.open("https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/assets/wellerman.mp4", "_blank") -} -function goggles() { - javascript: var script = document.createElement('script'); script.src = 'https://x-ray-goggles.mouse.org/webxray.js'; script.className = 'webxray'; script.setAttribute('data-lang', 'en-US'); script.setAttribute('data-baseuri', 'https://x-ray-goggles.mouse.org'); document.body.appendChild(script); -} -function bomb() { - var js = document.body.appendChild(document.createElement('script')); js.onerror = function() { console.log('Sorry, the script could not be loaded.') }; js.src = 'https://fontbomb.ilex.ca/js/main.js'; -} -function ship() { - javascript: var KICKtrashVERSION = '2.0'; var s = document.createElement('script'); s.type = 'text/javascript'; document.body.appendChild(s); s.src = 'https://cdn.jsdelivr.net/gh/CyranicusTheGreat/superior-asteriods@master/js.js'; void (0); -} -function snake() { - javascript: Q = 64; m = b = Q * Q; a = [P = l = u = d = p = S = w = 0]; u = 89; f = (h = j = t = (b + Q) / 2) - 1; (B = (D = document).body).appendChild(x = D.createElement("p")); (X = x.style).position = "fixed"; X.left = X.top = 0; X.background = "#FFF"; x.innerHTML = "

"; v = (s = x.childNodes)[0]; (s = s[1]).width = s.height = 5 * Q; c = s.getContext("2d"); onkeydown = onblur = F = function(e, g) { g ? a[f] ? (w += m, f = Math.random(l += 8) * (R = Q - 2) * R | (u = 0), F(f += Q + 1 + 2 * (f / R | 0), g)) : F(f) : 0 > e ? (l ? --l : (y = t, t = a[t] - 2, F(y)), S += (w *= 0.8) / 4, m = 999 / (u++ + 10), a[h += [-1, -Q, 1, Q][d = p]] ? B.removeChild(x, alert("Game Over")) : (F(h), F(e, j = h), v.innerHTML = P ? (setTimeout(F, 50, e, 0), S | 0) : "Press P")) : -e ? (y = (a[e] = e < Q | e >= Q * Q - Q | !(e % Q) | e % Q == Q - 1 | 2 * (e == h)) + (e == f), e == h && (a[j] = 2 + h), c.fillStyle = "hsl(" + 99 * !a[e] + "," + 2 * m + "%," + 50 * y + "%)", c.fillRect(e % Q * 5, 5 * (e / Q | 0), 5, 5)) : isNaN(y = e.keyCode - 37) | 43 == y ? (P = y && !P) && F(-1) : p = !P | y & -4 | !(y ^ 2 ^ d) ? p : y; return !1 }; for (; --b; F(b)); void F(-1); -} -function d3() { - var js = document.body.appendChild(document.createElement("script")); js.onerror = function() { alert("Sorry, the script could not be loaded.") }; js.src = "https://rawgit.com/Krazete/bookmarklets/master/tri.js" -} -function tic() { - var js = document.body.appendChild(document.createElement("script")); js.onerror = function() { alert("Sorry, the script could not be loaded.") }; js.src = "https://rawgit.com/Krazete/bookmarklets/master/tic.js" -} -function edit() { - javascript: document.body.contentEditable = 'true'; document.designMode = 'on'; void 0 -} -function piano() { - var js = document.body.appendChild(document.createElement('script')); js.onerror = function() { alert('Sorry, the script could not be loaded.') }; js.src = 'https://rawgit.com/Krazete/bookmarklets/master/piano.js' -} -function color() { - javascript: !function() { for (var t = document.getElementsByTagName('*'), a = 0; a < t.length; a++)(function() { var o = t[a]; setTimeout(function() { function t(t, a) { return Math.sqrt(t * t + a * a) } var a = 0, n = 64 * Math.sqrt(3), r = { x: -128, y: 0 }, e = { x: n, y: -n }, h = { x: -n, y: -n }; setInterval(function() { a += 5; var n = 128 * Math.cos(a * (Math.PI / 180)), M = 128 * Math.sin(a * (Math.PI / 180)), c = t(r.x - M, r.y - n), f = t(e.x - M, e.y - n), u = t(h.x - M, h.y - n); c = Math.floor(c), f = Math.floor(f), u = Math.floor(u), o.style['background-color'] = 'rgb(' + c + ',' + f + ',' + u + ')' }, 50) }, 5e3 * Math.random()) })() }(); - javascript:(function(){var all = document.getElementsByTagName("*"); for (var i=0, max=all.length; i < max; i++) {all[i].style.backgroundColor ='#'+Math.floor(Math.random()*16777215).toString(16);}})() -} -function ugly() { - javascript: (function() { const css = ` :root { --filter-chain: sepia(90%) invert(100%) hue-rotate(180deg) blur(0.2px) brightness(170%); } body { background-blend-mode: overlay; background-color: #0A0A0A; text-shadow: 0 0 5px rgba(1, 1, 1, 0.8), 0 0 1em rgba(255, 200, 200, 0.6), 0 0 10px rgba(255, 192, 192, 0.3); } body > *:not(.mt-overlay) { background-blend-mode: overlay; background-color: transparent; filter: var(--filter-chain) !important; -webkit-filter: var(--filter-chain) !important; } img, video { --filter-chain: invert(100%) blur(1px) brightness(80%); filter: var(--filter-chain); -webkit-filter: var(--filter-chain); } .mt-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 2147483647; pointer-events: none; } #mt-grill { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAJ1BMVEUAAGwAANkAAP8ALAAANAAAbAAA2QAA3gAA4QAA/wBsAADZAAD/AACoIOABAAAAVUlEQVR42u2RwQ3AIAwDHVoMIew/bxdIJPj14Z91VhRLhxWxOtlhdpQRewfdaa3ZSb4+uJ/EJ68rDp/5gIrDR15UHPPNX1dcHuRBHuRBHuRBHv7r4QOHFTeZ7vvIdwAAAABJRU5ErkJggg==); background-size: 17px; mix-blend-mode: soft-light; } #mt-noise { background-image: url(https://gyng.github.io/maketerm/i/noise.gif); /* Too big for a bookmarklet */ background-size: 60px; mix-blend-mode: hard-light; opacity: 0.4; } #mt-scanlines { background-image: url(https://gyng.github.io/maketerm/i/scanlines.gif); /* Too big for a bookmarklet */ background-size: 192px; mix-blend-mode: screen; opacity: 0.1; } #mt-orange { background-color: #FCE05F; mix-blend-mode: color-burn; opacity: 0.5; } %60`; const style = document.createElement('style'); style.type = 'text/css'; if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } document.head.appendChild(style); const makeOverlay = (id) => Object.assign(document.createElement('div'), { id, className: 'mt-overlay' }); const makeAndAddOverlay = (id) => document.body.appendChild(makeOverlay(id));['mt-grill', 'mt-noise', 'mt-scanlines', 'mt-orange'].forEach(makeAndAddOverlay); console.log('HELLO%E3%80%80WORLD'); }()); -} -function spin() { - javascript: (function() { setTimeout(function() { document.onmousemove = document.onkeypress = function() { ['', '-ms-', '-webkit-', '-o-', '-moz-'].map(function(prefix) { document.body.style[prefix + 'transition'] = prefix + 'transform 3s'; document.body.style[prefix + 'transform'] = 'rotate(180deg)'; }); } }, 5000); }()) -} -function pop() { - open("javascript:(function(){ const dot = (function(){ function dot(size = null, startPosX = null, startPosY = null, xDir = null, yDir = null, speed = null, color = null){ this.size = (size !== null) ? size : 150; this.minSize = 60; this.colChange = 80; this.x = (startPosX !== null) ? startPosX : Math.random() * (window.innerWidth - this.size) ; this.y = (startPosY !== null) ? startPosY : Math.random() * (window.innerHeight - this.size); this.maxX = window.innerWidth; this.maxY = window.innerHeight; this.xDir = (xDir !== null) ? xDir : 1; this.yDir = (yDir !== null) ? yDir : 1; this.speed = (speed !== null) ? speed : 1; this.shrink = 20; this.color = (color !== null) ? color : %27#70a6ff'; this.dot = document.createElement('div'); this.dot.style.width = this.dot.style.height = %60${this.size}px%60; this.dot.style.border = %601px solid ${this.color}%60; this.dot.style.backgroundColor = %60${this.color}1A%60; this.dot.style.position = 'fixed'; this.dot.style.zIndex = '99999999'; this.dot.style.top = %60${this.x}px%60; this.dot.style.left = %60${this.y}px%60; this.dot.style.borderRadius = '90px'; document.body.appendChild(this.dot); this.dot.addEventListener('mousedown', () => { this.size -= this.shrink; if (this.size > this.minSize){ this.speed += 0.3; this.dot.style.width = this.dot.style.height = %60${this.size}px%60; this.x = this.x + ((this.shrink / 2) * this.xDir); this.y = this.y + ((this.shrink / 2) * this.yDir); this.dot.style.left = %60${this.x}px%60; this.dot.style.top = %60${this.y}px%60; this.color = (this.size < this.colChange) ? '#ff0000' : this.color; this.dot.style.border = %601px solid ${this.color}%60; this.dot.style.backgroundColor = %60${this.color}1A%60; window.dotStats.dotspopped++; let newXDir = (Math.round(Math.random()) === 1) ? 1 : -1; let newYDir = (Math.round(Math.random()) === 1) ? 1 : -1; window.dots.push(new dot(this.size, this.x, this.y, newXDir, newYDir, (this.speed+(Math.random()/0.5)), this.color)); } if (this.size < this.minSize){ window.clearInterval(this.move); this.dot.remove(); } }, false); this.move = window.setInterval(() => { this.x += (this.xDir * this.speed); if (this.x >= (this.maxX - this.size))this.xDir = -1; if (this.x <= 0) this.xDir = 1; this.y += (this.yDir * this.speed); if (this.y >= (this.maxY - this.size))this.yDir = -1; if (this.y <= 0) this.yDir = 1; this.dot.style.left = %60${this.x}px%60; this.dot.style.top = %60${this.y}px%60; }, 10); } return dot; })(); if (window.dots){ window.dots.push(new dot()); window.dotStats.basedots++; } else { window.dots = [new dot()]; window.dotStats = { basedots: 1, clicks: 0, dotspopped: 0 }; window.addEventListener('mousedown', ()=> { window.dotStats.clicks++; window.updateStats(); }, false); let ds = document.createElement('div'); ds.setAttribute('id', 'dotStats'); ds.style.position = 'fixed'; ds.style.right = '0px'; ds.style.top = '0px'; ds.style.zIndex = '9999999'; ds.style.textAlign = 'right'; ds.style.padding = '20px'; ds.style.backgroundColor = '#fff'; ds.style.border = '1px solid #ccc'; ds.style.color = '#090909'; ds.style.fontFamily = 'Arial, Helvetica, sans-serif'; document.body.appendChild(ds); window.updateStats = function(){ document.getElementById('dotStats').innerHTML = %60Big dots spawned: ${window.dotStats.basedots}
Dots popped: ${window.dotStats.dotspopped}
Misses: ${window.dotStats.clicks - window.dotStats.dotspopped}%60; }; } window.updateStats(); })();", "_self") -} -function dodge() { - javascript: (function() { var me = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(me); me.style.position = 'fixed'; me.style.bottom = '0px'; me.style.right = '0px'; me.style.margin = '0px'; me.style.paddingTop = '0px'; me.style.width = '1366px'; me.style.height = '20px'; me.style.zIndex = 10000; me.style.opacity = 0.8; me.style.color = 'white'; me.style.backgroundColor = 'black'; me.style.border = '0px solid black'; me.style.textAlign = 'center'; me.id = 'me'; me.style.display = 'circle'; me.innerText = 'by dragonmaster73101'; document.getElementById('me').addEventListener('click', function() { window.open('https://github.com/dragon731012'); }); }()); var xmove = 1; var startnum = Math.floor(Math.random() * (10 - 1 + 1) + 1); startnum = startnum / 10; var ymove = startnum; var xpos = 1366 / 2; var ypos = 665 / 2; var ballspeed = 3; var p1ypos = 665 / 2; var p1xpos = 80; var p1ymove = 0; var playerspeed = 6; var p2ymove = 0; var p2ypos = 665 / 2; var p2xpos = 1366 - 80; var ailevel = 400; (function() { var ball = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(ball); ball.style.position = 'fixed'; ball.style.top = '' + ypos + 'px'; ball.style.left = '' + xpos + 'px'; ball.style.margin = '0px'; ball.style.paddingTop = '10px'; ball.style.width = '30px'; ball.style.height = '30px'; ball.style.zIndex = 10000; ball.style.opacity = 1; ball.style.color = 'white'; ball.style.backgroundColor = 'white'; ball.style.textAlign = 'center'; ball.style.border = '2px solid black'; ball.id = 'ball'; ball.style.display = 'block'; ball.innerText = ''; }()); (function() { var p1 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(p1); p1.style.position = 'fixed'; p1.style.top = '' + p1ypos + 'px'; p1.style.left = '' + p1xpos + 'px'; p1.style.margin = '0px'; p1.style.paddingTop = '10px'; p1.style.width = '20px'; p1.style.height = '100px'; p1.style.zIndex = 10000; p1.style.opacity = 1; p1.style.color = 'white'; p1.style.backgroundColor = 'white'; p1.style.textAlign = 'center'; p1.style.border = '2px solid black'; p1.id = 'p1'; p1.style.display = 'block'; p1.innerText = ''; }()); (function() { var p2 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(p2); p2.style.position = 'fixed'; p2.style.top = '' + p2ypos + 'px'; p2.style.left = '' + p2xpos + 'px'; p2.style.margin = '0px'; p2.style.paddingTop = '10px'; p2.style.width = '20px'; p2.style.height = '100px'; p2.style.zIndex = 10000; p2.style.opacity = 1; p2.style.color = 'white'; p2.style.backgroundColor = 'white'; p2.style.textAlign = 'center'; p2.style.border = '2px solid black'; p2.id = 'p2'; p2.style.display = 'block'; p2.innerText = ''; }()); function move() { if (p2ymove == 1) { if (p2ypos + playerspeed <= 565) { p2ypos = p2ypos + playerspeed; p2.style.top = '' + p2ypos + 'px'; } } if (p2ymove == -1) { if (p2ypos - playerspeed >= 0) { p2ypos = p2ypos - playerspeed; p2.style.top = '' + p2ypos + 'px'; } } if (p1ymove == 1) { if (p1ypos + playerspeed <= 565) { p1ypos = p1ypos + playerspeed; p1.style.top = '' + p1ypos + 'px'; } } if (p1ymove == -1) { if (p1ypos - playerspeed >= 0) { p1ypos = p1ypos - playerspeed; p1.style.top = '' + p1ypos + 'px'; } } if (xmove == 1) { xpos = xpos + ballspeed; ball.style.top = '' + ypos + 'px'; ball.style.left = '' + xpos + 'px'; } if (xmove == -1) { xpos = xpos - ballspeed; ball.style.top = '' + ypos + 'px'; ball.style.left = '' + xpos + 'px'; } if (ymove == -1) { ypos = ypos - ballspeed; ball.style.top = '' + ypos + 'px'; ball.style.left = '' + xpos + 'px'; } if (ymove == 1) { ypos = ypos + ballspeed; ball.style.top = '' + ypos + 'px'; ball.style.left = '' + xpos + 'px'; } if (ymove > -1 && ymove < 0) { ypos = ypos - ymove * 3; ball.style.top = '' + ypos + 'px'; ball.style.left = '' + xpos + 'px'; } if (ymove < 1 && ymove > 0) { ypos = ypos - ymove * 3; ball.style.top = '' + ypos + 'px'; ball.style.left = '' + xpos + 'px'; } } function bounce() { if (xpos >= 1336) { xpos = -99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; clearInterval(bounce); ball.parentNode.removeChild(ball); p1.parentNode.removeChild(p1); p2.parentNode.removeChild(p2); me.parentNode.removeChild(me); clearInterval(move); clearInterval(movep2); clearInterval(colliding); alert("game over. you win"); } if (xpos <= 0) { xpos = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; clearInterval(bounce); ball.parentNode.removeChild(ball); me.parentNode.removeChild(me); p1.parentNode.removeChild(p1); p2.parentNode.removeChild(p2); clearInterval(move); clearInterval(movep2); clearInterval(colliding); alert("game over. you lose"); } if (ypos >= 635) { ymove = ymove * -1; } if (ypos <= 0) { ymove = ymove * -1; } } function colliding() { if (xpos < p1xpos + 20 && xpos + 30 > p1xpos && ypos < p1ypos + 100 && ypos + 30 > p1ypos) { xmove = xmove * -1; ballspeed = ballspeed + 0.5; } if (xpos < p2xpos + 20 && xpos + 30 > p2xpos && ypos < p2ypos + 100 && ypos + 30 > p2ypos) { xmove = xmove * -1; ballspeed = ballspeed + 0.5; } } window.addEventListener("keydown", function(event) { if (event.key == "ArrowUp") { p1ymove = -1; } }); window.addEventListener("keyup", function(event) { if (event.key == "ArrowUp") { p1ymove = 0; } }); window.addEventListener("keydown", function(event) { if (event.key == "ArrowDown") { p1ymove = 1; } }); window.addEventListener("keyup", function(event) { if (event.key == "ArrowDown") { p1ymove = 0; } }); function movep2() { if (xpos > 683) { if (ypos < p2ypos) { if (p2ypos != ypos) { p2ymove = -1; } } if (ypos > p2ypos) { if (p2ypos != ypos) { p2ymove = 1; } } } if (xpos <= 683) { p2ymove = 0; } } setInterval(colliding, 15); setInterval(move, 15); setInterval(bounce, 15); setInterval(movep2, 5); -} -function blackhole() { - javascript:var i, s, ss = ['https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/bookmarkletFiles/kathack.js', 'https://cdn.jsdelivr.net/npm/jquery@3.6/dist/jquery.min.js']; for (i = 0; i != ss.length; i++) { s = document.createElement('script'); s.src = ss[i]; document.body.appendChild(s); } void (0); -} -function draw() { - var script = document.createElement('script'); script.src = 'https://cdn.jsdelivr.net/gh/henriquemor/draw-bookmarklet/draw.js'; script.className = 'webxray'; script.setAttribute('data-lang', 'en-US'); script.setAttribute('data-baseuri', 'https://x-ray-goggles.mouse.org'); document.body.appendChild(script); -} -function flash() { - javascript: (function() { var js = document.body.appendChild(document.createElement("script")); js.onerror = function() { alert("Sorry, the script could not be loaded.") }; js.src = "https://rawgit.com/Krazete/bookmarklets/master/mouselight.js" })(); -} -function twirl() { - javascript: var s = document.createElement('script'); s.type = 'text/javascript'; s.src = 'https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/bookmarkletFiles/twirlie.js'; document.body.appendChild(s); void (0); -} -function warp() { - open("javascript:var strength=strength?strength*2:0.05,time=time||2,loop=loop||false,ivl,c=document.getElementsByTagName(%27*%27),fn=function(){for(var i=0;i%7Bif(!playing)return commands.s()%3Bjump<%3D-1%26%26(jump%3D3)%7D%2Cs%3Aasync()%3D>%7Bplaying%7C%7C(faviconize(""%2C0)%2CloopGame())%7D%2C" "%3A()%3D>commands.ArrowUp()%2Cr%3Aasync()%3D>%7Bplaying%3D!1%2Cawait dotDotDot("Restarting")%2Clocation.reload()%7D%2Cm%3Aasync()%3D>%7Bplaying%3D!1%2CclearStorage()%2Cawait dotDotDot("Clearing")%2Clocation.reload()%7D%7D%3Basync function loopPreGame()%7Bconst e%3D1%3D%3DMAP%3F"Hit S to play!"%3A"MAP "%2BMAP%3Bfor(faviconize(MISC.PLAY%2C102)%2Cawait sleep(1e3)%3B!playing%3B)render(%60%24%7BMISC.FLAG_DARK%7D %24%7Be%7D%60)%2Cawait sleep(210)%2Crender(%60%24%7BMISC.FLAG_LIGHT%7D %24%7Be%7D%60)%2Cawait sleep(210)%7Dasync function loopGame()%7Bfor(playing%3D!0%3Bplaying%26%26map.length>0%3B)%7Bconst e%3DgetCharacter(jump%2Cmap%5B0%5D)%3Bif(e%3D%3DCOLLISION)%7Bfaviconize(MISC.STAR_LIGHT%2C101)%2Crender(CHARACTER.CRASH%2Cmap%2C"SCORE "%2Bticks)%2Cwin%3D!1%3Bbreak%7Dmap%3Dmap.slice(1%2Cmap.length)%2Crender(e%2Cmap)%2Cticks%2B%2B%2Cjump>-1%26%26jump--%2Cawait sleep(210)%7Dwin%26%26loopWin(ticks)%7Dasync function loopWin(e)%7Bfor(faviconize(MISC.FLAG_LIGHT%2C104)%3Bplaying%3B)document.title%3D"⭒ You win! ⭑ SCORE "%2Be%2Cawait sleep(210)%2Cdocument.title%3D"⭑ You win! ⭒ SCORE "%2Be%2Cawait sleep(210)%7Dfunction loadMap(e)%7Breturn readStorage()%3FreadStorage()%3AMAPS%5Be%5D%7Dfunction getCharacter(e%2Ct)%7Breturn e>0%3Ft%3D%3DBOX.TOP%3FCOLLISION%3At%3D%3DBOX.BOTTOM%3FCHARACTER.OVER%3ACHARACTER.TOP%3At%3D%3DBOX.BOTTOM%3FCOLLISION%3At%3D%3DBOX.TOP%3FCHARACTER.UNDER%3ACHARACTER.BOTTOM%7Dasync function dotDotDot(e)%7Brender(e%2B".")%2Cawait sleep(210)%2Crender(e%2B"..")%2Cawait sleep(210)%2Crender(e%2B"...")%2Cawait sleep(210)%7Dfunction readStorage()%7Btry%7Breturn localStorage.getItem("map")%7Dcatch(e)%7Breturn localStorageError(e)%2C!1%7D%7Dfunction clearStorage()%7Btry%7BlocalStorage.removeItem("map")%7Dcatch(e)%7BlocalStorageError(e)%7D%7Dfunction localStorageError(e)%7Bconsole.log("Maybe somebody is blocking localStorage...")%2Cconsole.error(e)%7Dfunction render(e%2Ct%2Co)%7Breturn t%3Fo%3Fvoid(document.title%3D%60%24%7Be%7D%24%7Bt.slice(0%2C2)%7D %24%7Bo%7D%60)%3Adocument.title%3D%60%24%7Be%7D%24%7Bt%7D%60%3Adocument.title%3De%7Dfunction hasCollision(e%2Ct)%7Breturn e%3D%3DCHARACTER.BOTTOM%26%26t%3D%3DBOX.BOTTOM%7C%7Ce%3D%3DCHARACTER.TOP%26%26t%3D%3DBOX.TOP%7Dfunction faviconize(e%2Ct)%7Bconst o%3Ddocument.createElement("canvas")%3Bo.height%3D128%2Co.width%3D128%3Bconst n%3Do.getContext("2d")%3Bn.lineJoin%3D"round"%2Cn.lineWidth%3D96%2Cn.strokeRect(48%2C48%2C32%2C32)%2Cn.fillRect(48%2C48%2C32%2C32)%2Cn.stroke()%2Cn.fill()%2Cn.fillStyle%3D"white"%2Cn.font%3D"128px serif"%2Cn.textAlign%3D"center"%2Cn.fillText(e%2C64%2Ct)%3Bconst a%3Ddocument.querySelector("link%5Brel*%3D'icon'%5D")%7C%7Cdocument.createElement("link")%3Ba.rel%3D"icon"%2Ca.href%3Do.toDataURL()%2Cdocument.getElementsByTagName("head")%5B0%5D.appendChild(a)%7Dfunction log()%7BDEBUG%26%26console.log(...arguments)%7Dasync function sleep(e)%7Breturn new Promise(t%3D>setTimeout(t%2Ce))%7Ddocument.addEventListener("keydown"%2Ce%3D>%7Bif(!e.isComposing%26%26229!%3D%3De.keyCode)return log(e.key)%2Ce.key in commands%3F(e.preventDefault()%2Ccommands%5Be.key%5D())%3Ae.key in MAPS%3F(e.preventDefault()%2Clocation.href%3D%60%24%7Blocation.origin%7D%24%7Blocation.pathname%7D%3Fmap%3D%24%7Be.key%7D%60)%3Avoid 0%7D)%2CloopPreGame()%3B%7D())%3B`, "_self") -} -function rainbow() { - javascript: (function() { function c() { return "#" + Math.floor(16777215 * Math.random()).toString(16) } function r(e) { return Math.floor(Math.random() * e) + 1 } function l(e) { e.requestFullscreen ? e.requestFullscreen() : e.mozRequestFullScreen ? e.mozRequestFullScreen() : e.webkitRequestFullscreen ? e.webkitRequestFullscreen() : e.msRequestFullscreen && e.msRequestFullscreen() } var d = document; d.head.innerHTML = "", d.body.innerHTML = ""; var w = window.screen.availHeight; for (d.body.addEventListener("click", function() { l(d.documentElement) }), i = 0; w >= i; i++) { var z = d.createElement("div"); z.id = "b" + i, z.style.backgroundColor = c(), d.body.appendChild(z) } setInterval(function() { for (var e = 0; 10 > e; e++)d.getElementById("b" + r(w)).style.backgroundColor = c(), d.getElementById("b" + r(w)).style.height = r(4) + "px", d.body.style.backgroundColor = c(), d.body.style.transform = r(256) > 128 ? "scale(3) rotate(" + r(35) + "deg)" : "rotate(0deg) scale(1)"; window.scrollTo(0, document.body.scrollHeight) }, 10), setInterval(function() { window.scrollTo(0, 0) }, 50); })() -} -function hue() { - javascript: var addingfiltertransition = document.body.style.transition = "filter 1s"; var hueInterval = setInterval(function() { var filterchange0 = document.body.style.filter = "hue-rotate(0deg)"; setTimeout(function() { var filterchange90 = document.body.style.filter = "hue-rotate(90deg)"; setTimeout(function() { var filterchange180 = document.body.style.filter = "hue-rotate(180deg)"; setTimeout(function() { var filterchange270 = document.body.style.filter = "hue-rotate(270deg)"; setTimeout(function() { var filterchange360 = document.body.style.filter = "hue-rotate(360deg)"; }, 1000); }, 1000); }, 1000); }, 1000); }, 0); -} -function dark() { - javascript: var styleElem = document.createElement("style"); var foo = document.body.appendChild(styleElem); var foo = styleElem.innerHTML = ":root{--rd-mode-height:30px}.theme{width:150px;height:var(--rd-mode-height);position:fixed;bottom:5px;right:5px;background:#4C4C4C;color:#FFF;text-align:center;line-height:var(--rd-mode-height);font-family:sans-serif;font-size:13px;font-weight:bolder;-webkit-user-select:none;-moz-ser-select:none;user-select:none;border-radius:4px;box-shadow:0 2px 4px 2px #222;transform:translate(0,25px);transition:transform .5s}.theme:hover{transform:none}"; function toggleBg() { if (document.body.style.backgroundColor == "rgb(51, 51, 51)") { document.body.style.backgroundColor = "rgb(255, 255, 255)"; document.body.style.color = "rgb(0, 0, 0)"; } else { document.body.style.backgroundColor = "rgb(51, 51, 51)"; document.body.style.color = "rgb(255, 255, 255)"; } } var readingModeButton = document.createElement("div"); var foo = document.body.appendChild(readingModeButton); var foo = readingModeButton.innerHTML = "Toggle Dark Mode"; var foo = readingModeButton.classList.add("theme"); var foo = readingModeButton.onclick = function() { toggleBg(); }; -} -function noclick() { - javascript: !function() { var e, t, n, a, o; for (document.addEventListener("click", e => { e.stopPropagation(), e.preventDefault() }, !0), e = document.getElementsByTagName("input"), t = document.getElementsByTagName("textarea"), n = document.getElementsByTagName("button"), a = e.concat(t).concat(n), o = 0; o < a.length; o++)a[o].disabled = !0 }(); -} -function jelly() { - javascript: (() => { window.JELLIFY_OPTIONS = { physics: { constraint: { minStiffness: 0.001, }, }, }; const urls = ['https://cdn.jsdelivr.net/npm/jquery@3.6/dist/jquery.min.js', 'https://cdn.jsdelivr.net/npm/matter-js@0.17.1/build/matter.min.js', 'https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/bookmarkletFiles/jelly.js',]; urls.forEach((url) => { const head = document.getElementsByTagName('head')[0]; const script = document.createElement('script'); script.src = url; head.appendChild(script); }); })(); -} -function notes() { - open("javascript:function makenote(name,value){ var width=350; var height=350; var over=0; var clicked=0; var a=0; var b=0; var c=0; var d=0; var e=0; var f=0; var nameover=0; var xover=0; (function(){var me=document.createElement('div');var body=document.getElementsByTagName('body')[0];body.appendChild(me);me.style.position='fixed';me.style.bottom='0px';me.style.right='0px';me.style.margin='0px';me.style.paddingTop='0px';me.style.width='1366px';me.style.height='20px';me.style.zIndex=10000;me.style.opacity=0.8;me.style.color='white';me.style.backgroundColor='black';me.style.border='0px solid black';me.style.textAlign='center';me.id='me';me.style.display='circle';me.innerText='by dragonmaster73101';document.getElementById('me').addEventListener('click',function(){window.open('https://github.com/dragon731012');});}()); function makex(){ (function () { var x = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(x); x.style.position = 'fixed'; x.style.top = '100px'; x.style.left = '300px'; x.style.margin = '0px'; x.style.width = '20px'; x.style.height = '20px'; x.style.zIndex = 10000; x.style.opacity = 1; x.style.color = 'white'; x.style.fontSize = '12px'; x.style.backgroundColor = 'red'; x.style.border = '0px solid black'; x.style.textAlign = 'center'; x.id = 'x'; x.style.display = 'block'; x.style.paddingBottom = '3px'; x.innerText = 'x'; x.onmouseover = function(event) { xover=1; }; x.onmouseout = function(event) { xover=0; }; }()); } setTimeout(makex,1000); (function () { var elem = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(elem); elem.style.position = 'fixed'; elem.style.top = '100px'; elem.style.left = '300px'; elem.style.margin = '0px'; elem.style.paddingTop = '10px'; elem.style.paddingLeft = '10px'; elem.style.paddingRight = '10px'; elem.style.width = ''+width+'px'; elem.style.height = ''+height+'px'; elem.style.zIndex = 10000; elem.style.opacity = 1; elem.style.color = 'black'; elem.style.backgroundColor = 'white'; elem.style.border = '4px solid black'; elem.style.textAlign = 'left'; elem.id = 'elem'; elem.style.display = 'block'; elem.innerText = ''+value+''; document.getElementById('elem').contentEditable = true; document.getElementById('elem').style.overflow='auto'; elem.onmouseover = function(event) { over=1; }; elem.onmouseout = function(event) { over=0; }; }()); function makename(){ (function () { var name1 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(name1); name1.style.position = 'fixed'; name1.style.top = '100px'; name1.style.left = '300px'; name1.style.margin = '0px'; name1.style.paddingTop = '5px'; name1.style.paddingLeft = '10px'; name1.style.paddingRight = '10px'; name1.style.width = ''+width+'px'; name1.style.height = '35px'; name1.style.zIndex = 10000; name1.style.opacity = 1; name1.style.color = 'black'; name1.style.backgroundColor = 'white'; name1.style.border = '4px solid black'; name1.style.textAlign = 'center'; name1.id = 'name1'; name1.style.display = 'block'; name1.innerText = ''+name+''; document.getElementById('elem').style.overflow='auto'; function update(){ c=a; d=b-30; e=a+width-28; f=b-23.5; name1.style.top = ''+d+'px'; name1.style.left = ''+c+'px'; x.style.top = ''+f+'px'; x.style.left = ''+e+'px'; x.style.zIndex = 20000; } setInterval(update,5); name1.onmouseover = function(event) { nameover=1; }; name1.onmouseout = function(event) { nameover=0; }; }()); } setTimeout(makename,1000); function mousemove(event){ if (over==1){ if (clicked==1){ var x=event.clientX; a=x-width/2; var y=event.clientY; b=y-width/2; elem.style.top = ''+b+'px'; elem.style.left = ''+a+'px'; } } } function resize(){ if (nameover==1){ if (clicked==1){ clicked=0; nameover=0; width=prompt('how wide do you want it to be?'); height=prompt('what do you want the height to be?'); elem.style.width = %27%27+width+%27px%27; elem.style.height = %27%27+height+%27px%27; name1.style.width = %27%27+width+%27px%27; a=0; b=0; c=0; d=0; e=0; f=0; over=0; clicked=0; nameover=0; xover=0; x.parentNode.removeChild(x); me.parentNode.removeChild(me); setTimeout(makex,1000); setTimeout(makename,1000); } } if (xover==1){ if (clicked==1){ xover=0; clicked=0; x.parentNode.removeChild(x); name1.parentNode.removeChild(name1); elem.parentNode.removeChild(elem); me.parentNode.removeChild(me); } } } setInterval(resize,5); function click(event) { if (event.button == 0) { clicked=1; } } document.onmousedown = click; function clickup(event) { if (event.button == 0) { clicked=0; } } document.onmouseup = clickup; window.addEventListener(%27mousemove%27,mousemove); function backup(){ if (cookiesorlocal==2){ var text = document.getElementById('elem').textContent; window.localStorage.setItem(''+name+'',''+text+''); } if (cookiesorlocal==1){ var text = document.getElementById('elem').textContent; document.cookie=''+name+'='+text+'; expires=Thu, 18 Dec 9013 12:00:00 UTC'; } if (cookiesorlocal==3){ var text = document.getElementById('elem').textContent; document.cookie=''+name+'='+text+'; expires=Thu, 18 Dec 9013 12:00:00 UTC'; window.localStorage.setItem(''+name+'',''+text+''); } } setInterval(backup,15); } function local(){ var choose=prompt('do you want to make a new note, continue, or delete one? new=1 continue=2 delete=3 delete all=4 only works on same domain. resize deletes the delete button, so just reload'); if (choose==1){ var newcalled=prompt('what do you want your new note to be called? make sure you remember what you call it'); window.localStorage.setItem(''+newcalled+'',''); alert('note added. run again to edit.'); } if (choose==2){ var called=prompt('what is your note called? type exactly how you did the first time.'); let value=window.localStorage.getItem(called); makenote(called,value); alert('instructions: drag to move. click to edit. click name to resize.'); } if (choose==3){ var whatdelete=prompt('what note do you want to delete? type exactly how you did the first time.'); localStorage.removeItem(whatdelete); alert('note deleted.'); } if (choose==4){ localStorage.clear(); alert('all notes cleared.'); } } function cookies(){ function get_cookie(cookie_name) { const value = '; ' + document.cookie; const parts = value.split('; ' + cookie_name + '='); if (parts.length === 2) return parts.pop().split(';').shift(); } var choose=prompt('do you want to make a new note, continue, or delete one? new=1 continue=2 delete=3 only works on same website. resize deletes the delete button, so just reload'); if (choose==1){ var newnote=prompt('what do you want it to be called? do not forget name. once you create run again to edit. if you name two things the same thing, the one you made before will be deleted.'); document.cookie=''+newnote+'=; expires=Thu, 18 Dec 9013 12:00:00 UTC'; window.location.reload(1); } if (choose==2){ var called=prompt('what is your note called? type exactly how you did the first time.'); var value = get_cookie(''+called+''); makenote(called,value); alert('instructions: drag to move. click to edit. click name to resize.'); } if (choose==3){ var deleted=prompt('what note do you want to be deleted?'); alert('deleted.'); document.cookie=''+deleted+'=; expires=Thu, 18 Dec 1913 12:00:00 UTC'; window.location.reload(1); } } function both(){ function get_cookie(cookie_name) { const value = '; ' + document.cookie; const parts = value.split('; ' + cookie_name + '='); if (parts.length === 2) return parts.pop().split(';').shift(); } var choose=prompt('do you want to make a new note, continue, or delete one? new=1 continue=2 delete=3 only works on same website. resize deletes the delete button, so just reload'); if (choose==1){ var newnote=prompt('what do you want it to be called? do not forget name. once you create run again to edit. if you name two things the same thing, the one you made before will be deleted.'); document.cookie=''+newnote+'=; expires=Thu, 18 Dec 9013 12:00:00 UTC'; window.localStorage.setItem(''+newnote+'',''); window.location.reload(1); } if (choose==2){ var called=prompt('what is your note called? type exactly how you did the first time.'); var value = get_cookie(''+called+''); var value2=window.localStorage.getItem(called); if (value==value2){ makenote(called,value); alert('instructions: drag to move. click to edit. click name to resize.'); } else{ alert('error: cookies is not the same as local storage'); var fix=prompt('do you want to go to cookies backup, local storage backup, or end program? cookies=1 local storage=2 end=3'); if (fix==1){ window.localStorage.setItem(''+called+'',''+value+''); alert('error fixed. you will be redirected back'); both(); } if (fix==2){ document.cookie=''+called+'='+value2+'; expires=Thu, 18 Dec 9013 12:00:00 UTC'; alert('error fixed. you will be redirected back'); both(); } if (fix==3){ alert('program aborted.'); } } } if (choose==3){ var deleted=prompt('what note do you want to be deleted?'); alert('deleted.'); localStorage.removeItem(deleted); document.cookie=''+deleted+'=; expires=Thu, 18 Dec 1913 12:00:00 UTC'; window.location.reload(1); } } var cookiesorlocal=prompt('do you want to use cookies, local storage, or both? they do not cross save, unless you choose both. ex: saves in cookies. does not work in local storage cookies=1 local=2 both=3'); if (cookiesorlocal==1){ cookies(); } if (cookiesorlocal==2){ local(); } if (cookiesorlocal==3){ both(); }", "_self") -} -function text() { - javascript: { var map = { ition: "ishin", "they're": "their", their: "they're", " to ": " too ", too: "to", you: "u", the: "teh", its: "it's", "it's": "its", " i ": " me ", "i'm": "me is", and: "adn", hi: "hai", ff: "fff", this: "tsih", flow: "flwo", ight: "ite", eight: "ate", ate: "8", ing: "ign", " a ": " an ", " an ": " a ", were: "we're", "we're": "were", "'s ": "s ", "you're": "your", there: "their", affect: "effect", effect: "affect", "could've": "couldve", " dosn't ": " dosen't ", " alot ": " a lot ", " a lot ": " alot ", " loose ": " lose ", " lose ": " loose ", tian: "tin", mm: "m", see: "se", ish: "ihs", age: "aeg" }; replace(); function replace() { function nativeSelector() { var elements = document.querySelectorAll("body, body *"); var results = []; var child; for (var i = 0; i < elements.length; i++) { child = elements[i].childNodes[0]; if (elements[i].hasChildNodes() && child.nodeType == 3) { results.push(child); } } return results; } var textnodes = nativeSelector(), _nv; for (var i = 0, len = textnodes.length; i < len; i++) { _nv = textnodes[i].nodeValue; textnodes[i].nodeValue = replaceAll(_nv); } } function replaceAll(str, mapObj = map) { var re = new RegExp(Object.keys(mapObj).join("|"), "gim"); return str.replace(re, function(matched) { return mapObj[matched.toLowerCase()]; }).replace(/[\.]/g, ",").toLowerCase(); } } javascript: (function() { replace(); function replace() { function nativeSelector() { var elements = document.querySelectorAll("body, body *"); var results = []; var child; for (var i = 0; i < elements.length; i++) { child = elements[i].childNodes[0]; if (elements[i].hasChildNodes() && child.nodeType == 3) { results.push(child); } } return results; } var textnodes = nativeSelector(), _nv; for (var i = 0, len = textnodes.length; i < len; i++) { _nv = textnodes[i].nodeValue; console.log(messup(_nv)); textnodes[i].nodeValue = messup(_nv); } } function messup(string) { var words = string.split(/[^a-zA-Z0-9\n\t]/); for (let item = 0; item < words.length; item++) { const j = words[item]; if (j.length >= 3) { words[item] = j[0] + shuffle(j.substr(1, j.length - 2)) + j[j.length - 1]; } } return words.join(" ") || ""; } function shuffle(str) { var a = str.split(""), n = a.length; for (var i = n - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var tmp = a[i]; a[i] = a[j]; a[j] = tmp; } return a.join(""); } })(); function casetomap(str) { var output = ""; for (let j = 0; j < str.length; j++) { const k = str[j]; if (k.toUpperCase() === k) { output += "1"; } else if (k.toLowerCase() === k) { output += "0"; } } return output; } function maptocase(casemap, str) { var output = ""; for (let j = 0; j < str.length; j++) { const k = casemap[j]; if (k === "1") { output += str[j].toUpperCase(); } else if (k === "0") { output += str[j].toLowerCase(); } } return output; } -} -function mirror() { - jvascript: (function() { var x = document.getElementsByTagName("body"); x[0].style.transform = "scaleX(-1)"; }()); -} -function fly() { - javascript: var e = window.document.createElement('script'); e.setAttribute('src', 'https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/bookmarkletFiles/fly.js'); window.document.body.appendChild(e); void (0); -} - -function notgood() { - bad = true; -} -function ouch() { - if (bad == true) { - alert("ouch"); - } -} -function moveButton() { - javascript: var button = document.querySelector("#button"); var x = Math.floor(Math.random() * window.innerWidth); var y = Math.floor(Math.random() * window.innerHeight); button.style.position = "absolute"; button.style.left = x + "px"; button.style.top = y + "px"; -} -function tomato() { - javascript: (_ => { import('https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/bookmarkletFiles/tomato.js').then(_ => { new TomatoSmash.Game() }) })() -} -function fire() { - javascript: document.body.innerHTML += ''; document.getElementById('bigMsk').setAttribute('style', 'z-index:1;opacity:.6;display:block;position:fixed;top:0;left:0;width:100%;height:100%;'); -} -function askew() { - javascript: (function() { ['', '-ms-', '-webkit-', '-o-', '-moz-'].map(function(prefix) { Array.prototype.slice.call(document.querySelectorAll('div,p,span,img,a,body')).map(function(el) { el.style[prefix + 'transform'] = 'rotate(' + (Math.floor(Math.random() * 3) - 1) + 'deg)'; }); }); }()) -} -function disco() { - javascript: (function() { var discoInterval = null; var colors = ["red", "orange", "yellow", "green", "blue", "purple", "pink"]; function startDisco() { discoInterval = setInterval(function() { var color = colors[Math.floor(Math.random() * colors.length)]; var elements = document.querySelectorAll("*"); for (var i = 0; i < elements.length; i++) { elements[i].style.backgroundColor = color; } }, 100); } function stopDisco() { clearInterval(discoInterval); var elements = document.querySelectorAll("*"); for (var i = 0; i < elements.length; i++) { elements[i].style.backgroundColor = ""; } } if (discoInterval) { stopDisco(); } else { startDisco(); } })(); -} -function holeinscreen() { - function blackscreen() { var x = 0, y = 0; var spreadInterval = setInterval(spread, 1); var elements = document.getElementsByTagName("*"); function spread() { var color = "rgba(0, 0, 0, 0.5)"; var spreadRadius = 50; var spreadSpeed = 50; var spreadElement = document.createElement("div"); spreadElement.style.position = "absolute"; spreadElement.style.zIndex = "30"; spreadElement.style.left = x + "px"; spreadElement.style.top = y + "px"; spreadElement.style.width = spreadRadius + "px"; spreadElement.style.height = spreadRadius + "px"; spreadElement.style.borderRadius = "50%"; spreadElement.style.background = color; document.body.appendChild(spreadElement); x += Math.floor(Math.random() * (spreadSpeed * 2)) - spreadSpeed; y += Math.floor(Math.random() * (spreadSpeed * 2)) - spreadSpeed; for (var i = 0; i < elements.length; i++) { var element = elements[i]; if (element !== spreadElement && !isAncestor(spreadElement, element)) { var elementBounds = element.getBoundingClientRect(); var spreadBounds = spreadElement.getBoundingClientRect(); if (boundsOverlap(spreadBounds, elementBounds)) { if (element.tagName === "IMG") { element.src = "https://source.unsplash.com/random/200x200"; } else if (element.tagName === "A") { element.style.fontFamily = "Impact, Charcoal, sans-serif"; element.style.textShadow = "0 0 3px rgba(255, 255, 255, 0.5)"; } } } } if (x < -spreadRadius || x > window.innerWidth + spreadRadius || y < -spreadRadius || y > window.innerHeight + spreadRadius) { clearInterval(spreadInterval); document.body.removeChild(spreadElement); } } function isAncestor(ancestor, element) { while (element.parentNode) { if (element.parentNode === ancestor) { return true; } element = element.parentNode; } return false; } function boundsOverlap(rect1, rect2) { return !(rect1.right < rect2.left || rect1.left > rect2.right || rect1.bottom < rect2.top || rect1.top > rect2.bottom); } } setInterval(blackscreen, 10); -} -function hidefromteacher() { - javascript:function gcloak() { var link = document.querySelector("link[rel*='icon']") || document.createElement('link');link.type = 'image/x-icon';link.rel = 'shortcut icon';link.href = 'https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/assets/skyward.gif';document.title = 'Login - Powered by Skyward';console.log(document.title);document.getElementsByTagName('head')[0].appendChild(link) };gcloak();setInterval(gcloak, 1000); -} -function minecraft() { - javascript: (function () { window.mcbmRootURI = 'https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/bookmarkletFiles/MCanywhere/'; window.mcbmScriptURI = 'mcbm.min.js'; window.mcbmLang = 'eng'; var s, ss = window.mcbmRootURI + 'js/mcbm-load.min.js'; s = document.createElement('script'); s.src = ss; document.body.appendChild(s); })(); -} -function scaryvirus() { - for(var t=document.getElementsByTagName("p"),e=0;e 0) for (var i = 0; i < element.childNodes.length; i++) { if ( element.childNodes[i].nodeName.toLowerCase() !== 'style' && element.childNodes[i].nodeName.toLowerCase() !== 'script' ) { G(element.childNodes[i]); } } if (element.nodeType === Node.TEXT_NODE && element.nodeValue !== '') { var thechars = [ 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', 'GET TO WORK!!!!!! ', ]; element.textContent = element.textContent .replace('a', thechars[0]) .replace('b', thechars[1]) .replace('c', thechars[2]) .replace('d', thechars[3]) .replace('e', thechars[4]) .replace('f', thechars[5]) .replace('g', thechars[6]) .replace('h', thechars[7]) .replace('i', thechars[8]) .replace('j', thechars[9]) .replace('k', thechars[10]) .replace('l', thechars[11]) .replace('m', thechars[12]) .replace('n', thechars[13]) .replace('o', thechars[14]) .replace('p', thechars[15]) .replace('q', thechars[16]) .replace('r', thechars[17]) .replace('s', thechars[18]) .replace('t', thechars[19]) .replace('u', thechars[20]) .replace('v', thechars[21]) .replace('w', thechars[22]) .replace('x', thechars[23]) .replace('y', thechars[24]) .replace('z', thechars[25]) .replace('A', thechars[26]) .replace('B', thechars[27]) .replace('C', thechars[28]) .replace('D', thechars[29]) .replace('E', thechars[30]) .replace('F', thechars[31]) .replace('G', thechars[32]) .replace('H', thechars[33]) .replace('I', thechars[34]) .replace('J', thechars[35]) .replace('K', thechars[36]) .replace('L', thechars[37]) .replace('M', thechars[38]) .replace('N', thechars[39]) .replace('O', thechars[40]) .replace('P', thechars[41]) .replace('Q', thechars[42]) .replace('R', thechars[43]) .replace('S', thechars[44]) .replace('T', thechars[45]) .replace('U', thechars[46]) .replace('V', thechars[47]) .replace('W', thechars[48]) .replace('X', thechars[49]) .replace('Y', thechars[50]) .replace('Z', thechars[51]) .replace('fax', '℻') .replace('1', thechars[52]) .replace('2', thechars[53]) .replace('3', thechars[54]) .replace('4', thechars[55]) .replace('5', thechars[56]) .replace('6', thechars[57]) .replace('7', thechars[58]) .replace('8', thechars[59]) .replace('9', thechars[60]) .replace('0', thechars[61]); } } var html = document.getElementsByTagName('html')[0]; G(html); }; setInterval(g, 1); })(); -} -function checkperformance() { - javascript: (function(){function e(t,a,n){function l(i,r){if(!a[i]){if(!t[i]){var d="function"==typeof require&&require;if(!r&&d)return d(i,!0);if(o)return o(i,!0);var s=Error("Cannot find module '"+i+"'");throw s.code="MODULE_NOT_FOUND",s}var u=a[i]={exports:{}};t[i][0].call(u.exports,function(e){return l(t[i][1][e]||e)},u,u.exports,e,t,a,n)}return a[i].exports}for(var o="function"==typeof require&&require,i=0;it.navigationStart)||t.blocks.push(o.default.timeBlock("Cross-Domain Redirect (and/or other Delay)",t.navigationStart,t.fetchStart,"block-redirect")),t.blocks.push(o.default.timeBlock("Network/Server",t.navigationStart,t.responseStart,"block-network-server")),n.default.measures.forEach(function(e){t.blocks.push(o.default.timeBlock("measure:"+e.name,Math.round(e.startTime),Math.round(e.startTime+e.duration),"block-custom-measure"))}),l.default.logTables([{name:"Navigation Timeline",data:t.blocks,columns:["name","start","end","total"]},{name:"Navigation Events",data:t.output},{name:"Marks",data:n.default.marks,columns:["name","startTime","duration"]}]),o.default.setupTimeLine(Math.round(t.pageLoadTime),t.blocks,n.default.marks,[],"Navigation Timing")},a.default=r},{"../data":8,"../helpers/tableLogger":16,"../helpers/waterfall":17}],3:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n=o(e("../helpers/dom")),l=o(e("../helpers/persistance"));function o(e){return e&&e.__esModule?e:{default:e}}var i={};i.init=function(){var e=l.default.persistanceEnabled(),t=n.default.newTag("section",{class:"page-metric chart-holder"});t.appendChild(n.default.newTag("h3",{text:"Persist Data"}));var a=n.default.newTag("label",{text:" Persist Data?"}),o=n.default.newTag("input",{type:"checkbox",id:"persist-data-checkbox",checked:e}),i=n.default.newTag("button",{text:"Dumb data to console",disabled:!e});return o.addEventListener("change",function(e){e.target.checked?(l.default.activatePersistance(),i.disabled=!1):window.confirm("this will wipe out all stored data")?(l.default.deactivatePersistance(),i.disabled=!0):e.target.checked=!0}),a.insertBefore(o,a.firstChild),i.addEventListener("click",function(e){l.default.dump(!1)}),t.appendChild(a),t.appendChild(i),e&&l.default.saveLatestMetrics(),t},a.default=i},{"../helpers/dom":9,"../helpers/persistance":12}],4:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n=r(e("../data")),l=r(e("../helpers/helpers")),o=r(e("../helpers/dom")),i=r(e("../helpers/pieChartHelpers"));function r(e){return e&&e.__esModule?e:{default:e}}var d={};d.init=function(){var e=o.default.newTag("div",{class:"pie-charts-holder chart-holder"}),t=function t(a,l,r,d,s){var u=o.default.newTag("div",{class:"pie-chart-holder",id:s||""});u.appendChild(o.default.newTag("h1",{text:a})),u.appendChild(i.default.createPieChart(l,400)),u.appendChild(o.default.newTag("p",{text:"Total Requests: "+n.default.requestsOnly.length})),r&&r.length&&r.forEach(function(e){u.appendChild(o.default.newTag("p",{text:e},"margin-top:-1em"))}),u.appendChild(i.default.createChartTable(a,l,d)),e.appendChild(u)},a=n.default.requestsOnly.length/100,r="789abcdef",d="789abcdef",s="789abcdef";return t("Requests by Domain",n.default.requestsByDomain.map(function(e){var t=l.default.clone(e);return t.perc=t.count/a,t.label=t.domain,t.domain===location.host?t.colour="#0c0":t.domain.split(".").slice(-2).join(".")===location.host.split(".").slice(-2).join(".")?t.colour="#0a0":t.colour=l.default.getRandomColor("56789abcdef","01234567","abcdef"),t.id="reqByDomain-"+t.label.replace(/[^a-zA-Z]/g,"-"),t.durationAverage=Math.round(t.durationTotal/t.count),t.durationTotal=Math.round(t.durationTotal),t.durationTotalParallel=Math.round(t.durationTotalParallel),t}),["Domains Total: "+n.default.requestsByDomain.length],[{name:"Requests",field:"count"},{name:"Avg. Duration (ms)",field:"durationAverage"},{name:"Duration Parallel (ms)",field:"durationTotalParallel"},{name:"Duration Sum (ms)",field:"durationTotal"}],"pie-request-by-domain"),t("Requests by Initiator Type",n.default.initiatorTypeCounts.map(function(e){return e.perc=e.count/a,e.label=e.initiatorType,e.colour=l.default.getInitiatorOrFileTypeColour(e.initiatorType,l.default.getRandomColor(r,d,s)),e.id="reqByInitiatorType-"+e.label.replace(/[^a-zA-Z]/g,"-"),e})),t("Requests by Initiator Type (host/external domain)",n.default.initiatorTypeCountHostExt.map(function(e){var t=e.initiatorType.split(" ");return e.perc=e.count/a,e.label=e.initiatorType,e.colour=l.default.getInitiatorOrFileTypeColour(t[0],l.default.getRandomColor(r,d,s),"(host)"!==t[1]),e.id="reqByInitiatorTypeLocEx-"+e.label.replace(/[^a-zA-Z]/g,"-"),e}),["Requests to Host: "+n.default.hostRequests,"Host: "+location.host]),t("Requests by File Type",n.default.fileTypeCounts.map(function(e){return e.perc=e.count/a,e.label=e.fileType,e.colour=l.default.getInitiatorOrFileTypeColour(e.fileType,l.default.getRandomColor(r,d,s)),e.id="reqByFileType-"+e.label.replace(/[^a-zA-Z]/g,"-"),e})),t("Requests by File Type (host/external domain)",n.default.fileTypeCountHostExt.map(function(e){var t=e.fileType.split(" ");return e.perc=e.count/a,e.label=e.fileType,e.colour=l.default.getInitiatorOrFileTypeColour(t[0],l.default.getRandomColor(r,d,s),"(host)"!==t[1]),e.id="reqByFileType-"+e.label.replace(/[^a-zA-Z]/g,"-"),e}),["Requests to Host: "+n.default.hostRequests,"Host: "+location.host]),e},a.default=d},{"../data":8,"../helpers/dom":9,"../helpers/helpers":10,"../helpers/pieChartHelpers":13}],5:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n=r(e("../data")),l=r(e("../helpers/dom")),o=r(e("../helpers/waterfall")),i=void 0;function r(e){return e&&e.__esModule?e:{default:e}}var d={},s=function e(t){var a={pageLoadTime:n.default.perfTiming.loadEventEnd-n.default.perfTiming.responseStart,lastResponseEnd:n.default.perfTiming.loadEventEnd-n.default.perfTiming.responseStart};for(var l in n.default.perfTiming)n.default.perfTiming[l]&&"number"==typeof n.default.perfTiming[l]&&(a[l]=n.default.perfTiming[l]-n.default.perfTiming.navigationStart);var i=o.default.timeBlock("domContentLoaded Event",a.domContentLoadedEventStart,a.domContentLoadedEventEnd,"block-dom-content-loaded"),r=o.default.timeBlock("Onload Event",a.loadEventStart,a.loadEventEnd,"block-onload"),d=[o.default.timeBlock("Unload",a.unloadEventStart,a.unloadEventEnd,"block-unload"),o.default.timeBlock("Redirect",a.redirectStart,a.redirectEnd,"block-redirect"),o.default.timeBlock("App cache",a.fetchStart,a.domainLookupStart,"block-appcache"),o.default.timeBlock("DNS",a.domainLookupStart,a.domainLookupEnd,"block-dns"),o.default.timeBlock("TCP",a.connectStart,a.connectEnd,"block-tcp"),o.default.timeBlock("Timer to First Byte",a.requestStart,a.responseStart,"block-ttfb"),o.default.timeBlock("Response",a.responseStart,a.responseEnd,"block-response"),o.default.timeBlock("DOM Processing",a.domLoading,a.domComplete,"block-dom"),i,r];return a.secureConnectionStart&&d.push(o.default.timeBlock("SSL",a.secureConnectionStart,a.connectEnd,"block-ssl")),a.msFirstPaint&&d.push(o.default.timeBlock("msFirstPaint Event",a.msFirstPaint,a.msFirstPaint,"block-ms-first-paint-event")),a.domInteractive&&d.push(o.default.timeBlock("domInteractive Event",a.domInteractive,a.domInteractive,"block-dom-interactive-event")),a.redirectEnd||a.redirectStart||!(a.fetchStart>a.navigationStart)||d.push(o.default.timeBlock("Cross-Domain Redirect",a.navigationStart,a.fetchStart,"block-redirect")),a.blocks=[o.default.timeBlock("Navigation API total",0,a.loadEventEnd,"block-navigation-api-total",d)],n.default.allResourcesCalc.filter(function(e){return e.startTime0&&(a1){var a=l.default.newTag("select",{class:"domain-selector",onchange:function a(){var l=i.options[i.selectedIndex].value;e="all"===l?s():s(function(e){return e.domain===l});var r=o.default.setupTimeLine(e.loadDuration,e.blocks,n.default.marks,e.bg,"Temp"),d=t.getElementsByClassName("water-fall-chart")[0],u=r.getElementsByClassName("water-fall-chart")[0];t.replaceChild(u,d)}});a.appendChild(l.default.newTag("option",{text:"show all",value:"all"})),n.default.requestsByDomain.forEach(function(e){a.appendChild(l.default.newTag("option",{text:e.domain}))});var r=t.getElementsByClassName("water-fall-chart")[0];r.parentNode.insertBefore(a,r)}return t},a.default=d},{"../data":8,"../helpers/dom":9,"../helpers/waterfall":17}],6:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n=o(e("../data")),l=o(e("../helpers/dom"));function o(e){return e&&e.__esModule?e:{default:e}}var i={};i.init=function(){var e=function e(t,a,n){n=n||60;var o=l.default.newTag("dl",{class:"summary-tile"});return o.appendChild(l.default.newTag("dt",{childElement:t})),o.appendChild(l.default.newTag("dd",{childElement:a},"font-size:"+n+"px;")),o},t=function e(t,a,n){t.appendChild(l.default.newTag("dt",{childElement:a})),t.appendChild(l.default.newTag("dd",{text:n}))},a=l.default.newTag("section",{class:"tiles-holder chart-holder"}),o=l.default.newTag("dl",{class:"summary-tile-appendix"});return[e("Requests",n.default.requestsOnly.length||"0"),e("Domains",n.default.requestsByDomain.length||"0"),e(l.default.combineNodes("Subdomains of ",l.default.newTag("abbr",{title:"Top Level Domain",text:"TLD"})),n.default.hostSubdomains||"0"),e(l.default.combineNodes("Requests to ",l.default.newTag("span",{title:location.host,text:"Host"})),n.default.hostRequests||"0"),e(l.default.combineNodes(l.default.newTag("abbr",{title:"Top Level Domain",text:"TLD"})," & Subdomain Requests"),n.default.currAndSubdomainRequests||"0"),e("Total",n.default.perfTiming.loadEventEnd-n.default.perfTiming.navigationStart+"ms",40),e("Time to First Byte",n.default.perfTiming.responseStart-n.default.perfTiming.navigationStart+"ms",40),e(l.default.newTag("span",{title:"domLoading to domContentLoadedEventStart",text:"DOM Content Loading"}),n.default.perfTiming.domContentLoadedEventStart-n.default.perfTiming.domLoading+"ms",40),e(l.default.newTag("span",{title:"domLoading to loadEventStart",text:"DOM Processing"}),n.default.perfTiming.domComplete-n.default.perfTiming.domLoading+"ms",40)].forEach(function(e){a.appendChild(e)}),n.default.allResourcesCalc.length>0&&(a.appendChild(e(l.default.newTag("span",{title:n.default.slowestCalls[0].name,text:"Slowest Call"}),l.default.newTag("span",{title:n.default.slowestCalls[0].name,text:Math.floor(n.default.slowestCalls[0].duration)+"ms"}),40)),a.appendChild(e("Average Call",n.default.average+"ms",40))),t(o,l.default.newTag("abbr",{title:"Top Level Domain",text:"TLD"},location.host.split(".").slice(-2).join("."))),t(o,l.default.newTextNode("Host:"),location.host),t(o,l.default.newTextNode("document.domain:"),document.domain),a.appendChild(o),a},a.default=i},{"../data":8,"../helpers/dom":9}],7:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n=o(e("../data")),l=o(e("../helpers/dom"));function o(e){return e&&e.__esModule?e:{default:e}}var i={};i.init=function(){var e=n.default.requestsOnly.reduce(function(e,t){var a,n=e[t.fileType];return n||(n=e[t.fileType]={fileType:t.fileType,count:0,initiatorType:{},requestsToHost:0,requestsToExternal:0}),(a=n.initiatorType[t.initiatorType])||(a=n.initiatorType[t.initiatorType]={initiatorType:t.initiatorType,count:0,requestsToHost:0,requestsToExternal:0}),n.count++,a.count++,t.isRequestToHost?(n.requestsToHost++,a.requestsToHost++):(n.requestsToExternal++,a.requestsToExternal++),e},{}),t=l.default.newTag("section",{class:"table-section-holder chart-holder"});return t.appendChild(l.default.newTag("h1",{text:"Request FileTypes & Initiators"})),t.appendChild(l.default.tableFactory("filetypes-and-intiators-table",function(e){return["FileType","Count","Count Internal","Count External","Initiator Type","Count by Initiator Type","Initiator Type Internal","Initiator Type External"].forEach(function(t){e.appendChild(l.default.newTag("th",{text:t,width:t.indexOf("ternal")>0?"12%":""}))}),e},function(t){return Object.keys(e).forEach(function(a,n){var o=e[a],i=Object.keys(o.initiatorType),r=o.initiatorType[i[0]],d=i.length,s=l.default.newTag("tr",{class:"file-type-row "+(o.fileType||"other")+"-light"});[o.fileType,o.count,o.requestsToHost,o.requestsToExternal,r.initiatorType,r.count,r.requestsToHost,r.requestsToExternal].forEach(function(e,t){var a={text:e};t<4&&i.length>1?a.rowSpan=d:t>=4&&(a.class=(i[0]||"other")+"-light"),s.appendChild(l.default.newTag("td",a))}),t.appendChild(s),i.slice(1).forEach(function(e){var a=o.initiatorType[e],n=l.default.newTag("tr",{class:"initiator-type-more "+(e||"other")+"-light"});n.appendChild(l.default.newTag("td",{text:e})),n.appendChild(l.default.newTag("td",{text:a.count})),n.appendChild(l.default.newTag("td",{text:a.requestsToHost})),n.appendChild(l.default.newTag("td",{text:a.requestsToExternal})),t.appendChild(n)})}),t})),t},a.default=i},{"../data":8,"../helpers/dom":9}],8:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n,l,o=(n=e("./helpers/helpers"),n&&n.__esModule?n:{default:n}),i=!0,r={resources:[],marks:[],measures:[],perfTiming:[],allResourcesCalc:[],isValid:function e(){return i}};i=function e(){if(window.performance&&void 0!==window.performance.getEntriesByType)r.resources=window.performance.getEntriesByType("resource"),r.marks=window.performance.getEntriesByType("mark"),r.measures=window.performance.getEntriesByType("measure");else{if(!window.performance||void 0===window.performance.webkitGetEntriesByType)return alert("Oups, looks like this browser does not support the Resource Timing API\ncheck http://caniuse.com/#feat=resource-timing to see the ones supporting it \n\n"),!1;r.resources=window.performance.webkitGetEntriesByType("resource"),r.marks=window.performance.webkitGetEntriesByType("mark"),r.measures=window.performance.webkitGetEntriesByType("measure")}return window.performance.timing?(r.perfTiming=window.performance.timing,!(r.perfTiming.loadEventEnd-r.perfTiming.navigationStart<0)||(alert("Page is still loading - please try again when page is loaded."),!1)):(alert("Oups, looks like this browser does not support performance timing"),!1)}(),r.allResourcesCalc=r.resources.filter(function(e){return!e.name.match(/http[s]?\:\/\/(micmro|nurun).github.io\/performance-bookmarklet\/.*/)}).map(function(e,t,a){0===e.name.indexOf("http")?i=(l=(n=e.name.match(/:\/\/(.[^/]+)([^?]*)\??(.*)/))[2].split("/").pop()).substr((Math.max(0,l.lastIndexOf("."))||1/0)+1):(n=["",location.host],i=e.name.split(":")[0]);var n,l,i,r={name:e.name,domain:n[1],initiatorType:e.initiatorType||i||"SourceMap or Not Defined",fileExtension:i||"XHR or Not Defined",loadtime:e.duration,fileType:o.default.getFileType(i,e.initiatorType),isRequestToHost:n[1]===location.host};for(var d in e)"function"!=typeof e[d]&&(r[d]=e[d]);return e.requestStart&&(r.requestStartDelay=e.requestStart-e.startTime,r.dns=e.domainLookupEnd-e.domainLookupStart,r.tcp=e.connectEnd-e.connectStart,r.ttfb=e.responseStart-e.startTime,r.requestDuration=e.responseStart-e.requestStart),e.secureConnectionStart&&(r.ssl=e.connectEnd-e.secureConnectionStart),r}),r.requestsOnly=r.allResourcesCalc.filter(function(e){return 0===e.name.indexOf("http")&&!e.name.match(/js.map$/)}),r.initiatorTypeCounts=o.default.getItemCount(r.requestsOnly.map(function(e,t,a){return e.initiatorType||e.fileExtension}),"initiatorType"),r.initiatorTypeCountHostExt=o.default.getItemCount(r.requestsOnly.map(function(e,t,a){return(e.initiatorType||e.fileExtension)+" "+(e.isRequestToHost?"(host)":"(external)")}),"initiatorType"),r.requestsByDomain=o.default.getItemCount(r.requestsOnly.map(function(e,t,a){return e.domain}),"domain"),r.fileTypeCountHostExt=o.default.getItemCount(r.requestsOnly.map(function(e,t,a){return e.fileType+" "+(e.isRequestToHost?"(host)":"(external)")}),"fileType"),r.fileTypeCounts=o.default.getItemCount(r.requestsOnly.map(function(e,t,a){return e.fileType}),"fileType"),l={},r.requestsOnly.forEach(function(e){var t=r.requestsByDomain.filter(function(t){return t.domain==e.domain})[0]||{},a=l[e.domain]||0;e.duration=t.duration||e.responseEnd-e.startTime,a<=e.startTime?t.durationTotalParallel=(t.durationTotalParallel||0)+e.duration:a0&&(r.slowestCalls=r.allResourcesCalc.filter(function(e){return e.name!==location.href}).sort(function(e,t){return t.duration-e.duration}),r.average=Math.floor(r.slowestCalls.reduceRight(function(e,t){return"number"!=typeof e?e.duration+t.duration:e+t.duration})/r.slowestCalls.length)),a.default=r},{"./helpers/helpers":10}],9:[function(e,t,a){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function e(t){return typeof t}:function e(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var l=function e(t){return document.createTextNode(t)},o=function e(t,a,o){a=a||{};var i=document.createElement(t);for(var r in a)"text"!=r&&(i[r]=a[r]);return a.text?i.textContent=a.text:a.childElement&&("object"===n(a.childElement)?a.childElement instanceof NodeList?Array.prototype.slice.call(a.childElement,0).forEach(function(e){i.appendChild(e)}):i.appendChild(a.childElement):i.appendChild(l(a.childElement))),a.class&&(i.className=a.class),i.style.cssText=o||"",i},i=function e(t,a,n){var l=o("div",{id:t||"",class:"table-holder"}),i=o("table"),r=o("thead");return r.appendChild(a(o("tr"))),i.appendChild(r),i.appendChild(n(o("tbody"))),l.appendChild(i),l},r=function e(t,a){var o=document.createElement("div");return"object"===n(t)?o.appendChild(t):"string"==typeof t&&o.appendChild(l(t)),"object"===n(a)?o.appendChild(a):"string"==typeof a&&o.appendChild(l(a)),o.childNodes},d=function e(t,a){return t.classList?t.classList.add(a):t.setAttribute("class",t.getAttribute("class")+" "+a),t},s=function e(t,a){return t.classList?t.classList.remove(a):t.setAttribute("class",t.getAttribute("class").replace(RegExp("(\\s|^)"+a+"(\\s|$)","g"),"$2")),t};a.default={newTextNode:l,newTag:o,tableFactory:i,combineNodes:r,addClass:d,removeClass:s}},{}],10:[function(e,t,a){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function e(t){return typeof t}:function e(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var l={};l.getFileType=function(e,t){if(e)switch(e){case"jpg":case"jpeg":case"png":case"gif":case"webp":case"svg":case"ico":return"image";case"js":return"js";case"css":return"css";case"html":return"html";case"woff":case"woff2":case"ttf":case"eot":case"otf":return"font";case"swf":return"flash";case"map":return"source-map"}if(t)switch(t){case"xmlhttprequest":return"ajax";case"img":return"image";case"script":return"js";case"internal":case"iframe":return"html";default:return"other"}return t},l.getRandomColor=function(e,t,a){for(var n=[e||"0123456789ABCDEF",t||"0123456789ABCDEF",a||"0123456789ABCDEF"],l="#",o=0,i=0;i<6;i++)l+=n[o=Math.floor(i/2)].split("")[Math.floor(Math.random()*n[o].length)];return l},l.endsWith=function(e,t){return -1!==e.indexOf(t,e.length-t.length)};var o=function e(t,a){var n=(parseInt(t.substr(1,2),16)+a).toString(16),l=(parseInt(t.substr(3,2),16)+a).toString(16),o=(parseInt(t.substr(5,2),16)+a).toString(16);return"#"+n+l+o};l.getInitiatorOrFileTypeColour=function(e,t,a){var n=t||"#bebebe";switch(e){case"css":n="#afd899";break;case"iframe":case"html":n="#85b3f2";break;case"img":case"image":n="#bc9dd6";break;case"script":case"js":n="#e7bd8c";break;case"link":n="#89afe6";break;case"swf":n="#4db3ba";break;case"font":n="#e96859";break;case"xmlhttprequest":case"ajax":n="#e7d98c"}return!0===a?o(n,-5):n},l.getItemCount=function(e,t){var a,n={},l=[];for(var o in e.forEach(function(e){n[e]=n[e]?n[e]+1:1}),n)(a={})[t||"key"]=o,a.count=n[o],l.push(a);return l.sort(function(e,t){return e.count0)||void 0===arguments[0]||arguments[0],t=r();if(0===t.length){console.log("There are no page metrics. Please tick the 'Persist Data' checkbox.");return}!0===e&&(localStorage.removeItem(o),console.log("Storage for %s has been cleared",o)),window.PerformanceBookmarklet={persistedData:t},console.table?(console.log("Data also accessible via %cwindow.PerformanceBookmarklet.persistedData%c:\n\n%o","font-family:monospace","font-family:inherit",window.PerformanceBookmarklet),console.table(t)):(console.log("Data also accessible via window.PerformanceBookmarklet.persistedData"),console.dir(window.PerformanceBookmarklet.persistedData))},a.default=i},{"../data":8}],13:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n=i(e("../helpers/helpers")),l=i(e("../helpers/svg")),o=i(e("../helpers/dom"));function i(e){return e&&e.__esModule?e:{default:e}}var r,d={},s=2*Math.PI/100,u=function e(t,a,n,o,i,r){var d=a/2,u=n+(o*s-.001),c=n+(o/2*s-.001),f=d+.85*d*Math.sin(c),p=l.default.newEl("path",{id:t,d:"M "+d+","+d+" L "+(d+d*Math.sin(n))+","+(d-d*Math.cos(n))+" A "+d+","+d+" 0 "+(u-n>Math.PI?1:0)+" 1 "+(d+d*Math.sin(u))+","+(d-d*Math.cos(u))+" Z",fill:r});if(p.appendChild(l.default.newEl("title",{text:i})),p.addEventListener("mouseenter",function(e){e.target.style.opacity="0.5",e.target.ownerDocument.getElementById(e.target.getAttribute("id")+"-table").style.backgroundColor="#ccc"}),p.addEventListener("mouseleave",function(e){e.target.style.opacity="1",e.target.ownerDocument.getElementById(e.target.getAttribute("id")+"-table").style.backgroundColor="transparent"}),o>10){var m=l.default.newTextEl(i,d-.85*d*Math.cos(c));return c0&&console.table&&(console.log("\n\n\n"+e.name+":"),console.table(e.data,e.columns))},n.logTables=function(e){e.forEach(n.logTable)},a.default=n},{}],17:[function(e,t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var n=o(e("../helpers/svg")),l=o(e("../helpers/dom"));function o(e){return e&&e.__esModule?e:{default:e}}var i={};i.timeBlock=function(e,t,a,n,l,o){return{name:e,start:t,end:a,total:"number"!=typeof t||"number"!=typeof a?void 0:a-t,cssClass:n,segments:l,rawResource:o}},i.setupTimeLine=function(e,t,a,o,i){var r,d=e/100,s=t.filter(function(e){return"number"==typeof e.start&&"number"==typeof e.total}).sort(function(e,t){return(e.start||0)-(t.start||0)}),u=a.length>0?a.reduce(function(e,t){return Math.max("number"==typeof e?e:0,n.default.getNodeTextWidth(n.default.newTextEl(t.name,"0")))}):0,c=(s.length+1)*25,f=l.default.newTag("section",{class:"resource-timing water-fall-holder chart-holder"}),p=n.default.newEl("svg:svg",{height:Math.floor(c+u+35),class:"water-fall-chart"}),m=n.default.newEl("g",{class:"labels"}),h=n.default.newEl("line",{x1:"0",y1:"0",x2:"0",y2:c,class:"line-end"}),g=n.default.newEl("line",{x1:"0",y1:"0",x2:"0",y2:c,class:"line-start"}),b=function e(t){var a=t.target;l.default.addClass(a,"active");var n=a.x.baseVal.valueInSpecifiedUnits+a.width.baseVal.valueInSpecifiedUnits+"%",o=a.x.baseVal.valueInSpecifiedUnits+"%";h.x1.baseVal.valueAsString=n,h.x2.baseVal.valueAsString=n,g.x1.baseVal.valueAsString=o,g.x2.baseVal.valueAsString=o,l.default.addClass(h,"active"),l.default.addClass(g,"active"),a.parentNode.appendChild(h),a.parentNode.appendChild(g)},$=function e(t){l.default.removeClass(t.target,"active"),l.default.removeClass(h,"active"),l.default.removeClass(g,"active")},v=function e(t,a,l,o,i,r,s){var u,c=n.default.newEl("rect",{width:t/d+"%",height:a-1,x:Math.round(l/d*100)/100+"%",y:o,class:(s&&s.length>0?"time-block":"segment")+" "+(i||"block-undefined")});return(r&&c.appendChild(n.default.newEl("title",{text:r})),c.addEventListener("mouseenter",b),c.addEventListener("mouseleave",$),s&&s.length>0)?((u=n.default.newEl("g")).appendChild(c),s.forEach(function(t){t.total>0&&"number"==typeof t.start&&u.appendChild(e(t.total,8,t.start||.001,o,t.cssClass,t.name+" ("+Math.round(t.start)+"ms - "+Math.round(t.end)+"ms | total: "+Math.round(t.total)+"ms)"))}),u):c},T=function e(t){var a=n.default.newEl("rect",{width:(t.total||1)/d+"%",height:c,x:(t.start||.001)/d+"%",y:0,class:t.cssClass||"block-undefined"});return a.appendChild(n.default.newEl("title",{text:t.name})),a};return p.appendChild(function t(){for(var a=n.default.newEl("g",{class:"time-scale full-width"}),l=0,o=e/1e3,i=100/o;l<=o;l++){var r=n.default.newTextEl(l+"sec",c);l>o-.2?(r.setAttribute("x",i*l-.5+"%"),r.setAttribute("text-anchor","end")):r.setAttribute("x",i*l+.5+"%");var d=n.default.newEl("line",{x1:i*l+"%",y1:"0",x2:i*l+"%",y2:c});a.appendChild(d),a.appendChild(r)}return a}()),p.appendChild((r=n.default.newEl("g",{transform:"scale(1, 1)",class:"marker-holder"}),a.forEach(function(e,t){var o=e.startTime/d,i=n.default.newEl("g",{class:"mark-holder"}),s=n.default.newEl("g",{class:"line-holder"}),u=n.default.newEl("g",{class:"line-label-holder",x:o+"%"});e.x=o;var f=n.default.newTextEl(e.name,c+25);f.setAttribute("x",o+"%"),f.setAttribute("stroke",""),s.appendChild(n.default.newEl("line",{x1:o+"%",y1:0,x2:o+"%",y2:c})),a[t-1]&&e.x-a[t-1].x<1&&(f.setAttribute("x",a[t-1].x+1+"%"),e.x=a[t-1].x+1),s.appendChild(n.default.newEl("line",{x1:o+"%",y1:c,x2:e.x+"%",y2:c+23}));var p=!1,m=function e(t){p||(p=!0,l.default.addClass(s,"active"),i.parentNode.appendChild(i))},h=function e(t){p=!1,l.default.removeClass(s,"active")};f.addEventListener("mouseenter",m),f.addEventListener("mouseleave",h),u.appendChild(f),i.appendChild(n.default.newEl("title",{text:e.name+" ("+Math.round(e.startTime)+"ms)"})),i.appendChild(s),r.appendChild(i),i.appendChild(u)}),r)),o.forEach(function(e,t){p.appendChild(T(e))}),s.forEach(function(e,t){var a=e.total||1,l=25*t;p.appendChild(v(a,25,e.start||.001,l,e.cssClass,e.name+" ("+e.start+"ms - "+e.end+"ms | total: "+e.total+"ms)",e.segments));var o=n.default.newTextEl(e.name+" ("+Math.round(e.total)+"ms)",l+(e.segments?20:17));(e.total||1)/d>10&&200>n.default.getNodeTextWidth(o)?(o.setAttribute("class","inner-label"),o.setAttribute("x",(e.start||.001)/d+.5+"%"),o.setAttribute("width",a/d+"%")):(e.start||.001)/d+a/d<80?o.setAttribute("x",(e.start||.001)/d+a/d+.5+"%"):(o.setAttribute("x",(e.start||.001)/d-.5+"%"),o.setAttribute("text-anchor","end")),o.style.opacity=e.name.match(/js.map$/)?"0.5":"1",m.appendChild(o)}),p.appendChild(m),i&&f.appendChild(l.default.newTag("h1",{text:i})),f.appendChild(p),f},a.default=i},{"../helpers/dom":9,"../helpers/svg":15}],18:[function(e,t,a){"use strict";var n=f(e("./data")),l=f(e("./helpers/iFrameHolder")),o=f(e("./components/summaryTiles")),i=f(e("./components/navigationTimeline")),r=f(e("./components/pieChart")),d=f(e("./components/table")),s=f(e("./components/resourcesTimeline")),u=f(e("./components/legend")),c=f(e("./components/pageMetric"));function f(e){return e&&e.__esModule?e:{default:e}}!function(){if("about:"!==location.protocol&&n.default.isValid()){var e=function e(t){[o.default.init(),i.default.init(),r.default.init(),d.default.init(),s.default.init(),u.default.init(),c.default.init()].forEach(function(e){t(e)})};l.default.setup(e)}}()},{"./components/legend":1,"./components/navigationTimeline":2,"./components/pageMetric":3,"./components/pieChart":4,"./components/resourcesTimeline":5,"./components/summaryTiles":6,"./components/table":7,"./data":8,"./helpers/iFrameHolder":11}],19:[function(e,t,a){},{}],20:[function(e,t,a){"use strict";var n=o(e("./data")),l=o(e("./helpers/tableLogger"));function o(e){return e&&e.__esModule?e:{default:e}}l.default.logTable({name:"All loaded resources",data:n.default.allResourcesCalc,columns:["name","domain","fileType","initiatorType","fileExtension","loadtime","isRequestToHost","requestStartDelay","dns","tcp","ttfb","requestDuration","ssl"]}),l.default.logTables([{name:"Requests by domain",data:n.default.requestsByDomain},{name:"Requests by Initiator Type",data:n.default.initiatorTypeCounts,columns:["initiatorType","count","perc"]},{name:"Requests by Initiator Type (host/external domain)",data:n.default.initiatorTypeCountHostExt,columns:["initiatorType","count","perc"]},{name:"Requests by File Type",data:n.default.fileTypeCounts,columns:["fileType","count","perc"]}])},{"./data":8,"./helpers/tableLogger":16}],21:[function(e,t,a){},{}],22:[function(e,t,a){arguments[4][19][0].apply(a,arguments)},{dup:19}]},{},[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]); -} -function randbutton() { - javascript:!function(){var e=["Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.","Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.","Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.","Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","Nam facilisis enim.","Pellentesque in elit et lacus euismod dignissim.","Aliquam dolor pede, convallis eget, dictum a, blandit ac, urna.","Pellentesque sed nunc ut justo volutpat egestas.","Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos.","In erat.","Suspendisse potenti.","Fusce faucibus nibi sed nisi.","Phasellus faucibus, dui a cursus dapibus, mauris nulla euismod velit, a lobortis turpis arcu vel dui.","Pellentesque fermentum ultrices pede.","Donec auctor lectus eu arcu.","Curabitur non orci eget est porta gravida.","Aliquam pretium orci id nisi.","Duis faucibus, mi non adipiscing venenatis, erat urna aliquet elit, eu fringilla lacus tellus quis erat.","Nam tempus ornare lorem.","Nullam feugiat.","Praesent ut leo massa.","Donec mattis, enim at pharetra cursus, arcu est sodales magna, in volutpat erat quam at risus.","Maecenas metus magna, malesuada id sodales tempor, porta a elit.","Vestibulum ornare varius vestibulum.","Nam risus tortor, tempus in interdum id, varius non dolor.","Maecenas sed enim a arcu molestie sollicitudin.","Integer nulla eros, egestas sed gravida placerat, pellentesque ut arcu.","Curabitur auctor vehicula neque aliquet fermentum.","Nam in enim non odio volutpat mattis eget et diam.","Vestibulum sit amet turpis tellus.","In molestie mattis orci vitae sagittis.","Fusce vel est non erat auctor molestie.","Morbi aliquam, mauris a blandit convallis, nunc dui fermentum diam, et feugiat lorem tellus eget sem.","Pellentesque tincidunt feugiat egestas.","Suspendisse tincidunt blandit orci, nec convallis purus suscipit in.","Sed a diam at quam congue sagittis id laoreet augue.","Sed aliquet velit id tortor ultricies cursus ac at mi.","Nullam a nibi vitae odio pellentesque porttitor vitae quis dui.","Cras malesuada quam nec urna interdum in imperdiet neque luctus.","Duis elit nulla, sagittis vitae sagittis nec, fringilla nec augue.","Fusce mattis tortor ut massa ultrices venenatis.","Praesent tincidunt ante purus, ut molestie lacus.","Etiam rhoncus venenatis eros, in tempus urna tincidunt vel.","Praesent sit amet massa vitae dui feugiat ultricies.","Nulla imperdiet convallis sapien, et elementum ipsum semper vitae.","Donec ultricies auctor enim in laoreet.","Vestibulum vitae ipsum risus.","Proin lorem felis, semper at rutrum at, dapibus ut arcu.","Cras volutpat interdum venenatis.","Integer pulvinar metus laoreet enim aliquam ut lobortis erat rutrum.","Mauris dignissim sagittis metus, sed placerat ipsum cursus sit amet.","Vivamus iaculis malesuada metus vel volutpat.","Praesent pulvinar lacus vel dolor pellentesque sed consequat justo convallis.","Integer vel sapien a libero aliquet porttitor a in felis.","Nulla in ipsum quis felis lacinia vulputate.","Phasellus eu nisi nec erat hendrerit mattis in at nunc.","Nullam interdum tempus euismod.","Vivamus eleifend iaculis dui a feugiat.","Aenean sed diam diam.","Nullam sed aliquet purus.","Donec quis ultricies ligula.","Donec sit amet nisi enim.","Vestibulum neque nisi, venenatis sit amet fermentum ut, tempor at dolor.","Morbi varius hendrerit nunc, nec varius neque pellentesque eu.","Nulla nec urna in diam consectetur adipiscing nec in dui.","Quisque accumsan quam quis erat porta nec feugiat ipsum varius.","Suspendisse blandit diam dolor.","Sed interdum, tortor a egestas pellentesque, arcu sapien facilisis quam, ut ultrices lectus augue a nibi.","Etiam laoreet, massa eget ultrices ullamcorper, nisi odio luctus diam, sed vestibulum sem justo id nulla.","Vestibulum tempor vestibulum dui, sed fermentum libero vehicula sit amet.","Vestibulum vitae sem augue, et aliquet metus.","Donec cursus purus eget libero elementum suscipit.","Vivamus vehicula auctor tristique.","Vestibulum lacinia urna in nisi blandit feugiat.","Aliquam ultrices metus sit amet diam iaculis rutrum interdum augue varius.","Sed non quam nisl.","Etiam nec ligula vel neque adipiscing pulvinar ac ac dui.","Sed vulputate tortor eget tellus rhoncus ac lobortis sem blandit.","Nam placerat, odio et suscipit vestibulum, leo orci vehicula ante, et tempor arcu elit et est.","Nulla facilisi.","Integer sit amet elit ut metus aliquet lobortis posuere id lorem.","Donec at leo enim, a blandit eros.","Integer eleifend aliquam lacinia.","Phasellus sapien tortor, volutpat in posuere eget, rutrum id nibi.","Maecenas porta, diam iaculis vulputate ultricies, massa metus laoreet est, sed elementum felis nibi vel mauris.","Vestibulum lobortis ipsum sed erat varius eget posuere dui consequat.","Integer vel eros nisi.","Phasellus non gravida sem.","Morbi id mauris libero.","Suspendisse consectetur, erat eget convallis pulvinar, nulla sem varius nisi, vel semper nibi leo id enim."],i=/^[\s\xa0]+/,t=/[\s\xa0]+$/,a=/([:!?\.])$/,u=/^([:!?\.]\s+)/,s=/^[^\wÄÖÜÀÀÁÈÉÇ]*[A-ZÄÖÜÀÀÁÈÉÇ]/,l=/^[\(\[]?.[:\.\)\]]?$/,n=/^\w*$/,r=/^[a-z]/i,o=/^H[1-3]$/i,m=!1,c=!1,d=0,p=function(i,t,a){!c&&t&&(d=0,c=!0);for(var u=e[d],s=u.length;s=e.length&&(d=0),u+=" "+e[d],s=u.length;if(s>i){var l=u.substring(0,i),o=u.substring(i).replace(/\s.*$/,"");(u=!a&&(o.length<3||n.test(l)&&r.test(u.charAt(i)))?l+o:l.replace(/,?\s\w*$/,"")).length>3&&(u=u.replace(/\s\w$/,""))}return u=u.replace(/\s+$/,""),++d>=e.length&&(d=0),u},v=function(e,r){var o=e.nodeValue;if(o){var c=o.length,d=(o=o.replace(i,"")).length!=c;c=o.length;var v=(o=o.replace(t,"")).length!=c;if((c=o.length)>0&&!l.test(o)){var g=p(c,r,n.test(o)),b=a.exec(o),q=(g=b?g.replace(/[,\.]+$/,"").replace(/\s+$/,"")+b[1]:g.replace(/,\s*$/,"")).charAt(0),f=g.substring(1);g=(m||s.test(o)?q.toUpperCase():q.toLowerCase())+f,(b=u.exec(o))&&(g=b[1]+g),m=a.test(g),d&&(g=" "+g),v&&(g+=" "),e.nodeValue=g}}},g=function(e,i){for(var t=e.firstChild;t;){var a=t.nodeType,u=t.nextSibling;if(1==a){var s=t.nodeName;"SCRIPT"!=s&&"STYLE"!=s&&"EMBED"!=s&&g(t,i||o.test(s))}else 3==a&&v(t,i);t=u}},b=document.getElementsByTagName?document.getElementsByTagName("body").item(0):document.body?document.body:document.all&&document.all.tags?document.all.tags("body")[0]:null;b&&g(b,!1)}(); -} -function wordscheck() { - javascript: (function() { var T = {}, W = [], C = 0, s, i; function F(n) { var i, x, a, w, t = n.tagName; if (n.nodeType == 3) { a = n.data.toLowerCase().split(/[\s\(\)\:\,\.;\<\>\&\'\"]/); for (i in a) if (w = a[i]) { w = " " + w; T[w] = T[w] ? T[w] + 1 : 1; ++C; } } if (t != "SCRIPT" && t != "STYLE") for (i = 0; x = n.childNodes[i]; ++i) F(x) } F(document); for (i in T) W.push([T[i], i]); W.sort(function(a, b) { var x = b[0] - a[0]; return x ? x : ((b[1] < a[1]) ? 1 : -1) }); s = "

" + C + " words

"; for (i in W) s += W[i][0] + ":" + W[i][1] + "
"; with(open().document) { write(s); close() } })() -} -function errorpng() { - javascript: (function() {let imageUrl = "https://cdn.jsdelivr.net/gh/itzjustZJ123/GPortal@main/images/error.png";function spawnImage() {let img = new Image();img.src = imageUrl;img.style.position = 'fixed';img.style.zIndex = '9999';img.onload = function() {let randomTop = Math.floor(Math.random() * (window.innerHeight - img.height));let randomLeft = Math.floor(Math.random() * (window.innerWidth - img.width));img.style.top = randomTop + 'px';img.style.left = randomLeft + 'px';document.body.appendChild(img);};}setInterval(spawnImage, 8000);})(); -} -function evilcss() { - javascript:(function(d,l){l=d.createElement("link");l.rel="stylesheet";l.href="https://cdn.jsdelivr.net/gh/CyranicusTheGreat/swf@latest/evil.css";d.body.appendChild(l)})(document); -} -function idiot() { - window.open("javascript:(function() { function mainFunction() { var videoId = 'dPtXaAZHuho'; var iframe = document.createElement('iframe'); iframe.width = '0'; iframe.height = '0'; iframe.style.position = %27fixed%27; iframe.style.bottom = %270%27; iframe.style.right = %270%27; document.body.appendChild(iframe); var imageUrl = 'https://cdn.jsdelivr.net/gh/itzjustZJ123/GPortal@main/images/yournotsmart.gif'; var windowBgUrl = 'https://cdn.jsdelivr.net/gh/itzjustZJ123/GPortal@main/images/window.png'; function createBouncingWindow() { var winDiv = document.createElement(%27div%27); winDiv.style.position = %27fixed%27; winDiv.style.bottom = %270%27; winDiv.style.left = %270%27; winDiv.style.width = %27220px%27; winDiv.style.height = %27200px%27; winDiv.style.backgroundImage = %27url(%27 + windowBgUrl + %27)%27; winDiv.style.backgroundSize = %27100% 100%%27; winDiv.style.backgroundRepeat = %27no-repeat%27; winDiv.style.backgroundPosition = %27center%27; winDiv.style.zIndex = %279999%27; var img = document.createElement(%27img%27); img.src = imageUrl; img.style.position = %27relative%27; img.style.top = %2724%%27; img.style.left = %2713.5%%27; img.style.width = %2770%%27; img.style.height = %2760%%27; winDiv.appendChild(img); document.body.appendChild(winDiv); var deltaX = (Math.random() * 7) + 3; var deltaY = (Math.random() * 7) + 3; winDiv.addEventListener(%27click%27, function(event) { for (var i = 0; i < 5; i++) { createBouncingWindow(); } }); function animate() { var rect = winDiv.getBoundingClientRect(); if (rect.left + rect.width > window.innerWidth || rect.left < 0) { deltaX = -deltaX; } if (rect.top + rect.height > window.innerHeight || rect.top < 0) { deltaY = -deltaY; } winDiv.style.left = rect.left + deltaX + %27px%27; winDiv.style.top = rect.top + deltaY + %27px%27; requestAnimationFrame(animate); } animate(); } createBouncingWindow(); } if (!localStorage.getItem(%27scriptActivated%27)) { localStorage.setItem(%27scriptActivated%27, %27true%27); mainFunction(); } else { mainFunction(); } window.addEventListener(%27beforeunload%27, function() { localStorage.removeItem(%27scriptActivated%27); }); })();", "_self") -} -function fakehack() { - javascript: var i, s, ss = ['https://cdn.jsdelivr.net/gh/The-Wellerman-Group/v3@latest/bookmarkletFiles/kathack.js', 'https://cdn.jsdelivr.net/npm/jquery@3.6/dist/jquery.min.js']; for (i = 0; i != ss.length; i++) { s = document.createElement('script'); s.src = ss[i]; document.body.appendChild(s); } void (0); -} -function breakout() { - javascript:alert("--BREAKOUT-- hit the ball to break all the blocks! speeds up every time you break all of them! by dragonmaster73101 a school student who got bored"); var width = window.innerWidth; var height = window.innerHeight; var ballxpos = 683; var ballypos = 200; var randomnum = Math.floor(Math.random() * (2 - 1 + 1) + 1); if (randomnum == 1) { var ballchangex = 1; } if (randomnum == 2) { var ballchangex = -1; } var ballchangey = 1; var ballspeed = 3; var xpos = 683; var ypos = 605; var playerxmove = 0; var playerspeed = 5; var score = 0; var done = 0; var s1width = 180; var s1height = 40; var s1xpos = 1366 / 2; s1xpos = s1xpos - s1width / 2; var s1ypos = 10; var s2width = 180; var s2height = 40; var s2xpos = 1366 / 2; s2xpos = s2xpos - s2width / 2 + s2width + 10; var s2ypos = 10; var s3width = 180; var s3height = 40; var s3xpos = 1366 / 2; s3xpos = s3xpos - s3width / 2 - s3width - 10; var s3ypos = 10; var s4width = 180; var s4height = 40; var s4xpos = 1366 / 2; s4xpos = s4xpos - s4width / 2 - s4width - 10; var s4ypos = 10; s4ypos = s4ypos + s4height + 10; var s5width = 180; var s5height = 40; var s5xpos = 1366 / 2; s5xpos = s5xpos - s5width / 2 + s5width + 10; var s5ypos = 10; s5ypos = s5ypos + s5height + 10; var s6width = 180; var s6height = 40; var s6xpos = 1366 / 2; s6xpos = s6xpos - s6width / 2; var s6ypos = 10; s6ypos = s6ypos + s6height + 10; var s7width = 180; var s7height = 40; var s7xpos = 1366 / 2; s7xpos = s7xpos - s7width / 2 - s7width - 10; var s7ypos = 10; s7ypos = s7ypos + s7height + s7height + 20; var s8width = 180; var s8height = 40; var s8xpos = 1366 / 2; s8xpos = s8xpos - s8width / 2 + s8width + 10; var s8ypos = 10; s8ypos = s8ypos + s8height + 10 + s8height + 10; var s9width = 180; var s9height = 40; var s9xpos = 1366 / 2; s9xpos = s9xpos - s9width / 2; var s9ypos = 10; s9ypos = s9ypos + s9height + 10 + s9height + 10; var s10width = 180; var s10height = 40; var s10xpos = 1366 / 2; s10xpos = s10xpos - s10width / 2 - s10width - 10; var s10ypos = 10; s10ypos = s10ypos + s10height + s10height + s10height + 30; var s11width = 180; var s11height = 40; var s11xpos = 1366 / 2; s11xpos = s11xpos - s11width / 2 + s11width + 10; var s11ypos = 10; s11ypos = s11ypos + s11height + 10 + s11height + 10 + s11height + 10; var s12width = 180; var s12height = 40; var s12xpos = 1366 / 2; s12xpos = s12xpos - s12width / 2; var s12ypos = 10; s12ypos = s12ypos + s12height + 10 + s12height + 10 + s12height + 10; (function() { var me = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(me); me.style.position = 'fixed'; me.style.bottom = '0px'; me.style.right = '0px'; me.style.margin = '0px'; me.style.paddingTop = '0px'; me.style.width = '' + width + 'px'; me.style.height = '20px'; me.style.zIndex = 10000; me.style.opacity = 0.8; me.style.color = 'white'; me.style.backgroundColor = 'black'; me.style.border = '0px solid black'; me.style.textAlign = 'center'; me.id = 'me'; me.style.display = 'circle'; me.innerText = 'by dragonmaster73101'; document.getElementById('me').addEventListener('click', function() { window.open('https://github.com/dragon731012'); }); }()); (function() { var you = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(you); you.style.position = 'fixed'; you.style.top = '' + ypos + 'px'; you.style.left = '' + xpos + 'px'; you.style.margin = '0px'; you.style.width = '200px'; you.style.height = '30px'; you.style.zIndex = 10000; you.style.opacity = 1; you.style.color = 'black'; you.style.backgroundColor = 'white'; you.style.border = '2px solid black'; you.style.textAlign = 'center'; you.id = 'you'; you.style.display = 'block'; }()); (function() { var ball = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(ball); ball.style.position = 'fixed'; ball.style.top = '' + ballypos + 'px'; ball.style.left = '' + ballxpos + 'px'; ball.style.margin = '0px'; ball.style.width = '50px'; ball.style.height = '50px'; ball.style.zIndex = 10000; ball.style.opacity = 1; ball.style.color = 'black'; ball.style.backgroundColor = 'white'; ball.style.border = '2px solid black'; ball.style.textAlign = 'center'; ball.id = 'ball'; ball.style.display = 'block'; }()); (function() { var scorer = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(scorer); scorer.style.position = 'fixed'; scorer.style.top = '10px'; scorer.style.left = '10px'; scorer.style.margin = '0px'; scorer.style.width = '100px'; scorer.style.height = '40px'; scorer.style.zIndex = 10000; scorer.style.opacity = 1; scorer.style.color = 'black'; scorer.style.backgroundColor = 'white'; scorer.style.paddingTop = '5px'; scorer.style.border = '3px solid black'; scorer.style.textAlign = 'center'; scorer.id = 'scorer'; scorer.style.display = 'block'; scorer.innerText = 'score: ' + score + ''; }()); function start() { ballspeed = ballspeed + 0.3; playerspeed = playerspeed + 0.3; s1width = 180; s1height = 40; s1xpos = 1366 / 2; s1xpos = s1xpos - s1width / 2; s1ypos = 10; s2width = 180; s2height = 40; s2xpos = 1366 / 2; s2xpos = s2xpos - s2width / 2 + s2width + 10; s2ypos = 10; s3width = 180; s3height = 40; s3xpos = 1366 / 2; s3xpos = s3xpos - s3width / 2 - s3width - 10; s3ypos = 10; s4width = 180; s4height = 40; s4xpos = 1366 / 2; s4xpos = s4xpos - s4width / 2 - s4width - 10; s4ypos = 10; s4ypos = s4ypos + s4height + 10; s5width = 180; s5height = 40; s5xpos = 1366 / 2; s5xpos = s5xpos - s5width / 2 + s5width + 10; s5ypos = 10; s5ypos = s5ypos + s5height + 10; s6width = 180; s6height = 40; s6xpos = 1366 / 2; s6xpos = s6xpos - s6width / 2; s6ypos = 10; s6ypos = s6ypos + s6height + 10; s7width = 180; s7height = 40; s7xpos = 1366 / 2; s7xpos = s7xpos - s7width / 2 - s7width - 10; s7ypos = 10; s7ypos = s7ypos + s7height + s7height + 20; s8width = 180; s8height = 40; s8xpos = 1366 / 2; s8xpos = s8xpos - s8width / 2 + s8width + 10; s8ypos = 10; s8ypos = s8ypos + s8height + 10 + s8height + 10; s9width = 180; s9height = 40; s9xpos = 1366 / 2; s9xpos = s9xpos - s9width / 2; s9ypos = 10; s9ypos = s9ypos + s9height + 10 + s9height + 10; s10width = 180; s10height = 40; s10xpos = 1366 / 2; s10xpos = s10xpos - s10width / 2 - s10width - 10; s10ypos = 10; s10ypos = s10ypos + s10height + s10height + s10height + 30; s11width = 180; s11height = 40; s11xpos = 1366 / 2; s11xpos = s11xpos - s11width / 2 + s11width + 10; s11ypos = 10; s11ypos = s11ypos + s11height + 10 + s11height + 10 + s11height + 10; s12width = 180; s12height = 40; s12xpos = 1366 / 2; s12xpos = s12xpos - s12width / 2; s12ypos = 10; s12ypos = s12ypos + s12height + 10 + s12height + 10 + s12height + 10; (function() { var s1 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s1); s1.style.position = 'fixed'; s1.style.top = '' + s1ypos + 'px'; s1.style.left = '' + s1xpos + 'px'; s1.style.margin = '0px'; s1.style.width = '' + s1width + 'px'; s1.style.height = '' + s1height + 'px'; s1.style.zIndex = 10000; s1.style.opacity = 1; s1.style.color = 'black'; s1.style.backgroundColor = 'green'; s1.style.paddingTop = '5px'; s1.style.border = '3px solid black'; s1.style.textAlign = 'center'; s1.id = 's1'; s1.style.display = 'block'; }()); (function() { var s2 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s2); s2.style.position = 'fixed'; s2.style.top = '' + s2ypos + 'px'; s2.style.left = '' + s2xpos + 'px'; s2.style.margin = '0px'; s2.style.width = '' + s2width + 'px'; s2.style.height = '' + s2height + 'px'; s2.style.zIndex = 10000; s2.style.opacity = 1; s2.style.color = 'black'; s2.style.backgroundColor = 'green'; s2.style.paddingTop = '5px'; s2.style.border = '3px solid black'; s2.style.textAlign = 'center'; s2.id = 's2'; s2.style.display = 'block'; }()); (function() { var s3 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s3); s3.style.position = 'fixed'; s3.style.top = '' + s3ypos + 'px'; s3.style.left = '' + s3xpos + 'px'; s3.style.margin = '0px'; s3.style.width = '' + s3width + 'px'; s3.style.height = '' + s3height + 'px'; s3.style.zIndex = 10000; s3.style.opacity = 1; s3.style.color = 'black'; s3.style.backgroundColor = 'green'; s3.style.paddingTop = '5px'; s3.style.border = '3px solid black'; s3.style.textAlign = 'center'; s3.id = 's3'; s3.style.display = 'block'; }()); (function() { var s7 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s7); s7.style.position = 'fixed'; s7.style.top = '' + s7ypos + 'px'; s7.style.left = '' + s7xpos + 'px'; s7.style.margin = '0px'; s7.style.width = '' + s7width + 'px'; s7.style.height = '' + s7height + 'px'; s7.style.zIndex = 10000; s7.style.opacity = 1; s7.style.color = 'black'; s7.style.backgroundColor = 'orange'; s7.style.paddingTop = '5px'; s7.style.border = '3px solid black'; s7.style.textAlign = 'center'; s7.id = 's7'; s7.style.display = 'block'; }()); (function() { var s8 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s8); s8.style.position = 'fixed'; s8.style.top = '' + s8ypos + 'px'; s8.style.left = '' + s8xpos + 'px'; s8.style.margin = '0px'; s8.style.width = '' + s8width + 'px'; s8.style.height = '' + s8height + 'px'; s8.style.zIndex = 10000; s8.style.opacity = 1; s8.style.color = 'black'; s8.style.backgroundColor = 'orange'; s8.style.paddingTop = '5px'; s8.style.border = '3px solid black'; s8.style.textAlign = 'center'; s8.id = 's8'; s8.style.display = 'block'; }()); (function() { var s9 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s9); s9.style.position = 'fixed'; s9.style.top = '' + s9ypos + 'px'; s9.style.left = '' + s9xpos + 'px'; s9.style.margin = '0px'; s9.style.width = '' + s9width + 'px'; s9.style.height = '' + s9height + 'px'; s9.style.zIndex = 10000; s9.style.opacity = 1; s9.style.color = 'black'; s9.style.backgroundColor = 'orange'; s9.style.paddingTop = '5px'; s9.style.border = '3px solid black'; s9.style.textAlign = 'center'; s9.id = 's9'; s9.style.display = 'block'; }()); (function() { var s6 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s6); s6.style.position = 'fixed'; s6.style.top = '' + s6ypos + 'px'; s6.style.left = '' + s6xpos + 'px'; s6.style.margin = '0px'; s6.style.width = '' + s6width + 'px'; s6.style.height = '' + s6height + 'px'; s6.style.zIndex = 10000; s6.style.opacity = 1; s6.style.color = 'black'; s6.style.backgroundColor = 'orange'; s6.style.paddingTop = '5px'; s6.style.border = '3px solid black'; s6.style.textAlign = 'center'; s6.id = 's6'; s6.style.display = 'block'; }()); (function() { var s5 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s5); s5.style.position = 'fixed'; s5.style.top = '' + s5ypos + 'px'; s5.style.left = '' + s5xpos + 'px'; s5.style.margin = '0px'; s5.style.width = '' + s5width + 'px'; s5.style.height = '' + s5height + 'px'; s5.style.zIndex = 10000; s5.style.opacity = 1; s5.style.color = 'black'; s5.style.backgroundColor = 'orange'; s5.style.paddingTop = '5px'; s5.style.border = '3px solid black'; s5.style.textAlign = 'center'; s5.id = 's5'; s5.style.display = 'block'; }()); (function() { var s4 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s4); s4.style.position = 'fixed'; s4.style.top = '' + s4ypos + 'px'; s4.style.left = '' + s4xpos + 'px'; s4.style.margin = '0px'; s4.style.width = '' + s4width + 'px'; s4.style.height = '' + s4height + 'px'; s4.style.zIndex = 10000; s4.style.opacity = 1; s4.style.color = 'black'; s4.style.backgroundColor = 'orange'; s4.style.paddingTop = '5px'; s4.style.border = '3px solid black'; s4.style.textAlign = 'center'; s4.id = 's4'; s4.style.display = 'block'; }()); (function() { var s10 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s10); s10.style.position = 'fixed'; s10.style.top = '' + s10ypos + 'px'; s10.style.left = '' + s10xpos + 'px'; s10.style.margin = '0px'; s10.style.width = '' + s10width + 'px'; s10.style.height = '' + s10height + 'px'; s10.style.zIndex = 10000; s10.style.opacity = 1; s10.style.color = 'black'; s10.style.backgroundColor = 'orange'; s10.style.paddingTop = '5px'; s10.style.border = '3px solid black'; s10.style.textAlign = 'center'; s10.id = 's10'; s10.style.display = 'block'; }()); (function() { var s11 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s11); s11.style.position = 'fixed'; s11.style.top = '' + s11ypos + 'px'; s11.style.left = '' + s11xpos + 'px'; s11.style.margin = '0px'; s11.style.width = '' + s11width + 'px'; s11.style.height = '' + s11height + 'px'; s11.style.zIndex = 10000; s11.style.opacity = 1; s11.style.color = 'black'; s11.style.backgroundColor = 'orange'; s11.style.paddingTop = '5px'; s11.style.border = '3px solid black'; s11.style.textAlign = 'center'; s11.id = 's11'; s8.style.display = 'block'; }()); (function() { var s12 = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(s12); s12.style.position = 'fixed'; s12.style.top = '' + s12ypos + 'px'; s12.style.left = '' + s12xpos + 'px'; s12.style.margin = '0px'; s12.style.width = '' + s12width + 'px'; s12.style.height = '' + s12height + 'px'; s12.style.zIndex = 10000; s12.style.opacity = 1; s12.style.color = 'black'; s12.style.backgroundColor = 'orange'; s12.style.paddingTop = '5px'; s12.style.border = '3px solid black'; s12.style.textAlign = 'center'; s12.id = 's12'; s12.style.display = 'block'; }()); function moveball() { if (ballchangex == 1) { ballxpos = ballxpos + ballspeed; ball.style.top = '' + ballypos + 'px'; ball.style.left = '' + ballxpos + 'px'; } if (ballchangey == 1) { ballypos = ballypos + ballspeed; ball.style.top = '' + ballypos + 'px'; ball.style.left = '' + ballxpos + 'px'; } if (ballchangex == -1) { ballxpos = ballxpos - ballspeed; ball.style.top = '' + ballypos + 'px'; ball.style.left = '' + ballxpos + 'px'; } if (ballchangey == -1) { ballypos = ballypos - ballspeed; ball.style.top = '' + ballypos + 'px'; ball.style.left = '' + ballxpos + 'px'; } } function bounce() { if (ballypos >= height - 50) { ballxpos = -9999999999999999999; ballypos = -9999999999999999999999999; ballchangex = 0; ballchangey = 0; clearInterval(bounce); clearInterval(moveplayer); clearInterval(moveball); clearInterval(colliding); alert("game over. your score was " + score + "."); window.location.reload(1); s1.parentNode.removeChild(s1); s1width = 0; s1height = 0; s1xpos = -999999; s1ypos = -999999; s2.parentNode.removeChild(s2); s2width = 0; s2height = 0; s2xpos = -999999; s2ypos = -999999; s3.parentNode.removeChild(s3); s3width = 0; s3height = 0; s3xpos = -999999; s3ypos = -999999; s4.parentNode.removeChild(s4); s4width = 0; s4height = 0; s4xpos = -999999; s4ypos = -999999; s5.parentNode.removeChild(s5); s5width = 0; s5height = 0; s5xpos = -999999; s5ypos = -999999; s6.parentNode.removeChild(s6); s6width = 0; s6height = 0; s6xpos = -999999; s6ypos = -999999; s7.parentNode.removeChild(s7); s7width = 0; s7height = 0; s7xpos = -999999; s7ypos = -999999; s8.parentNode.removeChild(s8); s8width = 0; s8height = 0; s8xpos = -999999; s8ypos = -999999; s9.parentNode.removeChild(s9); s9width = 0; s9height = 0; s9xpos = -999999; s9ypos = -999999; s10.parentNode.removeChild(s10); s10width = 0; s10height = 0; s10xpos = -999999; s10ypos = -999999; s11.parentNode.removeChild(s11); s11width = 0; s11height = 0; s11xpos = -999999; s11ypos = -999999; s12.parentNode.removeChild(s12); s12width = 0; s12height = 0; s12xpos = -999999; s12ypos = -999999; you.parentNode.removeChild(you); ball.parentNode.removeChild(ball); ballchangex = 0; ballchangey = 0; scorer.parentNode.removeChild(scorer); me.parentNode.removeChild(me); return; } if (ballxpos <= 0) { ballchangex = 1; } if (ballypos <= 0) { ballchangey = 1; } if (ballxpos >= width - 50) { ballchangex = -1; } } function moveplayer() { if (playerxmove == 1) { if (xpos + playerspeed >= 1366 - 200) {} else { xpos = xpos + playerspeed; you.style.top = '' + ypos + 'px'; you.style.left = '' + xpos + 'px'; } } if (playerxmove == -1) { if (xpos + playerspeed <= 0) {} else { xpos = xpos - playerspeed; you.style.top = '' + ypos + 'px'; you.style.left = '' + xpos + 'px'; } } } window.addEventListener("keydown", function(event) { if (event.key == "ArrowLeft") { playerxmove = -1; } if (event.key == "ArrowRight") { playerxmove = 1; } }); window.addEventListener("keyup", function(event) { if (event.key == "ArrowLeft") { playerxmove = 0; } if (event.key == "ArrowRight") { playerxmove = 0; } }); function colliding() { if (ballxpos < s1xpos + s1width && ballxpos + 50 > s1xpos && ballypos < s1ypos + s1height && ballypos + 50 > s1ypos) { score = score + 1; done = done + 1; s1.parentNode.removeChild(s1); s1width = 0; s1height = 0; s1xpos = -999999; s1ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s2xpos + s2width && ballxpos + 50 > s2xpos && ballypos < s2ypos + s2height && ballypos + 50 > s2ypos) { score = score + 1; done = done + 1; s2.parentNode.removeChild(s2); s2width = 0; s2height = 0; s2xpos = -999999; s2ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s3xpos + s3width && ballxpos + 50 > s3xpos && ballypos < s3ypos + s3height && ballypos + 50 > s3ypos) { score = score + 1; done = done + 1; s3.parentNode.removeChild(s3); s3width = 0; s3height = 0; s3xpos = -999999; s3ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s4xpos + s4width && ballxpos + 50 > s4xpos && ballypos < s4ypos + s4height && ballypos + 50 > s4ypos) { score = score + 1; done = done + 1; s4.parentNode.removeChild(s4); s4width = 0; s4height = 0; s4xpos = -999999; s4ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s5xpos + s5width && ballxpos + 50 > s5xpos && ballypos < s5ypos + s5height && ballypos + 50 > s5ypos) { score = score + 1; done = done + 1; s5.parentNode.removeChild(s5); s5width = 0; s5height = 0; s5xpos = -999999; s5ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s6xpos + s6width && ballxpos + 50 > s6xpos && ballypos < s6ypos + s6height && ballypos + 50 > s6ypos) { score = score + 1; done = done + 1; s6.parentNode.removeChild(s6); s6width = 0; s6height = 0; s6xpos = -999999; s6ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s7xpos + s7width && ballxpos + 50 > s7xpos && ballypos < s7ypos + s7height && ballypos + 50 > s7ypos) { score = score + 1; done = done + 1; s7.parentNode.removeChild(s7); s7width = 0; s7height = 0; s7xpos = -999999; s7ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s8xpos + s8width && ballxpos + 50 > s8xpos && ballypos < s8ypos + s8height && ballypos + 50 > s8ypos) { score = score + 1; done = done + 1; s8.parentNode.removeChild(s8); s8width = 0; s8height = 0; s8xpos = -999999; s8ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s9xpos + s9width && ballxpos + 50 > s9xpos && ballypos < s9ypos + s9height && ballypos + 50 > s9ypos) { score = score + 1; done = done + 1; s9.parentNode.removeChild(s9); s9width = 0; s9height = 0; s9xpos = -999999; s9ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s12xpos + s12width && ballxpos + 50 > s12xpos && ballypos < s12ypos + s12height && ballypos + 50 > s12ypos) { score = score + 1; done = done + 1; s12.parentNode.removeChild(s12); s12width = 0; s12height = 0; s12xpos = -999999; s12ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s11xpos + s11width && ballxpos + 50 > s11xpos && ballypos < s11ypos + s11height && ballypos + 50 > s11ypos) { score = score + 1; done = done + 1; s11.parentNode.removeChild(s11); s11width = 0; s11height = 0; s11xpos = -999999; s11ypos = -999999; ballchangey = ballchangey * -1; } if (ballxpos < s10xpos + s10width && ballxpos + 50 > s10xpos && ballypos < s10ypos + s10height && ballypos + 50 > s10ypos) { score = score + 1; done = done + 1; s10.parentNode.removeChild(s10); s10width = 0; s10height = 0; s10xpos = -999999; s10ypos = -999999; ballchangey = ballchangey * -1; } scorer.innerText = 'score: ' + score + ''; } setInterval(colliding, 5); setInterval(moveball, 15); setInterval(bounce, 3); setInterval(moveplayer, 15); } start(); function next() { if (done >= 12) { start(); done = 0; } } function hit() { if (xpos < ballxpos + 50 && xpos + 200 > ballxpos && ypos < ballypos + 50 && ypos + 30 > ballypos) { if (xpos+35>ballxpos){ ballchangex = -1; } if (xpos+165=maxcount){ if (clicked>=maxcount){ score=score+1; clicked=0; maxcount=maxcount+1; counted=0; } } } function update(){ scorer.innerText = 'score: '+score+''; } setInterval(checkifallclicked,15); setInterval(update,15);", "_self"); -} -function crash() { - javascript:function a(e){var n=e.childNodes;for(var i in n){a(n[i]);if(n[i].style) n[i].style.backgroundImage="url(https://media.tenor.com/88dnH_mHRLAAAAAM/static-tv-static.gif)";}}a(document); var howfast=3; var bluroffspeed=howfast; var bluronspeed=howfast*2; function bluron() { (function () { document.body.style.filter = 'blur(5px)'; })(); function bluroff(){ (function () { document.body.style.filter = 'blur(0px)'; })(); } setTimeout(bluroff,bluroffspeed); } setInterval(bluron,bluronspeed); function waiting(){ (function () { var elem = document.createElement('div'); var body = document.getElementsByTagName('body')[0]; body.appendChild(elem); elem.style.textAlign = 'center'; elem.style.margin=screen.height/2+"px"; elem.style.position = 'fixed'; elem.style.top = '0px'; elem.style.left = '0px'; elem.style.margin = '0px'; elem.style.width = ''+screen.width+'px'; elem.style.height = ''+screen.height+30+'px'; elem.style.zIndex = 10000; elem.style.opacity = 1; elem.style.textAlign = 'center'; elem.style.color = 'red'; elem.id = 'elem'; elem.style.fontSize = "30%"; elem.style.display = 'block'; function bg(){elem.style.backgroundImage="url(https://i.ytimg.com/vi/R8lHaEZYpCU/maxresdefault.jpg)";} bg(); }()); } function waiting2(){ while (true){ window.location.reload(1); } } setTimeout(waiting,900); setTimeout(waiting2,1800); -} -function rickroll() { - javascript:(function() { var overlay = document.createElement("div"); overlay.style.position = "fixed"; overlay.style.top = "0"; overlay.style.left = "0"; overlay.style.width = "100%"; overlay.style.height = "100%"; overlay.style.background = "#FFFFFF"; overlay.style.opacity = "0.95"; overlay.style.zIndex = "9999999"; var dialog = document.createElement("div"); dialog.style.position = "absolute"; dialog.style.top = "50%"; dialog.style.left = "50%"; dialog.style.transform = "translate(-50%, -50%)"; dialog.style.width = "450px"; dialog.style.padding = "20px"; dialog.style.background = "#FFFFFF"; dialog.style.border = "1px solid #333333"; dialog.style.borderRadius = "5px"; dialog.style.boxShadow = "0 0 10px rgba(0,0,0,0.5)"; dialog.style.zIndex = "99999999"; var title = document.createElement("h1"); title.innerHTML = "Google Chrome Update"; title.style.marginTop = "0"; title.style.textAlign = "center"; dialog.appendChild(title); var message = document.createElement("p"); message.innerHTML = "Your version of Google Chrome is outdated. Please click the button below to update now."; message.style.margin = "20px 0"; message.style.textAlign = "center"; dialog.appendChild(message); var button = document.createElement("button"); button.innerHTML = "Update Now"; button.style.background = "#0078D7"; button.style.border = "none"; button.style.color = "#FFFFFF"; button.style.padding = "10px 20px"; button.style.borderRadius = "5px"; button.addEventListener("click", function() { window.location.href = 'https://thefanciestwebsiteever.w3spaces.com/index.html' }); dialog.appendChild(button); overlay.appendChild(dialog); document.body.appendChild(overlay); })(); -} -function findandreplace() { - javascript:var count=0;function htmlreplace(a,b,element){if(!element)element=document.body;var nodes=element.childNodes;for(var n=0;n 0){ var r=new RegExp(a,'gim'); if(nodes[n].nodeValue.match(r)){ count++; } nodes[n].nodeValue=nodes[n].nodeValue.replace(r,b) } else{ htmlreplace(a,b,nodes[n]) } }}htmlreplace(prompt('find'),prompt('replace'));alert('replaced '+count+' words.'); -} -function face() { - javascript: var faces = ['HA HA HA', 'HE HE HE']; let face = faces[Math.floor(Math.random()*faces.length)]; document.write('' + face + '

' + face + '

'); -} -function bob(x) { - -} -function caraxle() { - javascript:(function(){(()=>{var __webpack_modules__={9537:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__button {\n width: 90% !important;\n line-height: 3vh;\n background: rgba(0, 0, 0, 0.6) !important;\n color: #fff !important;\n text-align: left !important;\n font-size: 1.5vw !important;\n padding-left: 2% !important;\n display: inline-flex !important;\n justify-content: space-between !important;\n align-items: center !important;\n margin-top: 2% !important;\n border: none !important;\n border-radius: 15px !important;\n transition: 1s !important;\n height: auto !important;\n padding-top: 1.5%;\n padding-bottom: 1.5%;\n}\n.cac__button:hover {\n transform: translateX(5px) !important;\n}\n.cac__button:last-child {\n margin-bottom: 5% !important;\n}\n.cac__button p {\n font-size: 1vw;\n color: #fff;\n line-height: 1vh;\n margin: 1% 0;\n}\n.cac__button--enabled {\n box-shadow: inset 70vw 0 0px 0 cornflowerblue !important;\n}\n.cac__button__menuicon {\n margin-right: 2% !important;\n transform: rotate(-90deg) !important;\n transition: 0.5s !important;\n border-radius: 50% !important;\n width: auto;\n height: auto;\n}\n.cac__button__menuicon--enabled {\n transform: rotate(0deg) !important;\n}\n.cac__button__menu-container {\n width: 85% !important;\n line-height: 0vh !important;\n background-color: rgba(0, 0, 0, 0.6) !important;\n text-align: left !important;\n font-size: 1.5vw !important;\n border: none !important;\n border-radius: 15px !important;\n overflow: hidden !important;\n margin-left: 5% !important;\n margin-top: 0% !important;\n padding: 2.5% !important;\n transform-origin: top !important;\n display: none !important;\n flex-direction: column !important;\n}\n.cac__button__menu-container--enabled {\n margin-top: 2% !important;\n display: flex !important;\n}\n.cac__button__menu-container__option-container {\n display: flex !important;\n width: 100% !important;\n flex-direction: column !important;\n align-items: flex-start !important;\n}\n.cac__button__menu-container__option-container__title {\n margin-bottom: 2% !important;\n}\n.cac__button__menu-container__option-container__checkbox {\n width: 1.25vw !important;\n height: 1.25vw !important;\n border-radius: 50% !important;\n border: 1px solid cornflowerblue !important;\n text-align: left !important;\n display: flex !important;\n justify-content: center !important;\n align-items: center !important;\n}\n.cac__button__menu-container__option-container__text {\n border-radius: 5px !important;\n height: auto !important;\n}\n.cac__button__menu-container__option-container__text:focus {\n outline: none !important;\n border: solid 2px cornflowerblue !important;\n}\n",""]);const r=s},5889:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__notification {\n width: 40%;\n height: 40%;\n border-radius: 20px;\n box-shadow: 0px 0px 50px 10px black;\n background-color: cornflowerblue;\n position: fixed;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n}\n.cac__notification__header {\n font-size: 2.75vmin;\n margin-left: 2vw;\n margin-right: 2vw;\n}\n.cac__notification__body {\n font-size: 2.25vmin;\n margin-left: 2vw;\n margin-right: 2vw;\n}\n.cac__notification__button {\n border-radius: 10px;\n width: 50%;\n padding: 2%;\n right: 0%;\n bottom: 3vh;\n position: absolute;\n background-color: rgba(0, 0, 0, 0.6);\n border: none;\n margin-left: 2vw;\n margin-right: 2vw;\n font-size: 1.5vw;\n cursor: pointer;\n}\n.cac__notification__dismiss {\n left: 0%;\n font-size: 1vw;\n width: 30%;\n background-color: rgba(0, 0, 0, 0.2);\n}\n",""]);const r=s},7622:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,"@keyframes introanim {\n 0% {\n transform: translateX(-50%);\n opacity: 0;\n }\n 100% {\n transform: translateX(0px);\n opacity: 1;\n }\n}\n@keyframes slidein {\n 0% {\n transform: translateX(-20%);\n }\n 100% {\n transform: translateX(0px);\n }\n}\n.cac__section {\n width: 86% !important;\n height: 6% !important;\n background-color: transparent !important;\n text-align: left !important;\n border-radius: 2vw !important;\n position: relative;\n display: flex !important;\n align-items: center !important;\n font-size: 1.5vw !important;\n margin-top: 5% !important;\n transition: 0.5s !important;\n cursor: pointer !important;\n animation: 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) introanim forwards;\n animation: slidein 1s cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n.cac__section:hover {\n transform: translateX(5px) !important;\n}\n.cac__section svg {\n margin-left: 1% !important;\n margin-right: 5% !important;\n}\n.cac__section__content {\n width: 100% !important;\n height: 100% !important;\n display: none;\n position: absolute !important;\n align-items: center !important;\n text-align: center !important;\n overflow-y: scroll !important;\n}\n.cac__section__content::-webkit-scrollbar {\n width: 7px !important;\n}\n.cac__section__content::-webkit-scrollbar-track {\n background-color: transparent !important;\n}\n.cac__section__content::-webkit-scrollbar-thumb {\n background-color: cornflowerblue !important;\n border-radius: 7px !important;\n}\n.cac__section__title {\n font-weight: 600 !important;\n font-size: 2.25vw !important;\n line-height: 2.25vw !important;\n margin-left: 5% !important;\n margin-top: 3vh;\n text-align: left !important;\n width: 90% !important;\n}\n.cac__section__description {\n font-weight: 400 !important;\n font-size: 1.5vw !important;\n line-height: 1.5vw !important;\n text-align: left !important;\n margin-left: 5% !important;\n margin-bottom: 3% !important;\n width: 90% !important;\n}\n",""]);const r=s},5089:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,"#custom_cursor_large {\n width: 30px;\n height: 30px;\n background-color: white;\n border-radius: 50%;\n position: fixed;\n pointer-events: none;\n z-index: 100000000000000000000000000000000000000000000000000000000000000000000000000000000000;\n}\n#custom_cursor_small {\n width: 15px;\n height: 15px;\n background-color: white;\n border-radius: 50%;\n position: fixed;\n pointer-events: none;\n z-index: 1000000000000000000000000000000000000000000000000000000000000000000000000000000000;\n}\n",""]);const r=s},7356:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__game__button {\n width: 90% !important;\n line-height: 3vh;\n background: rgba(0, 0, 0, 0.6) !important;\n color: #fff !important;\n text-align: left !important;\n font-size: 1.5vw !important;\n display: inline-flex !important;\n align-items: center !important;\n margin-top: 2% !important;\n border: none !important;\n border-radius: 20px !important;\n padding: 0;\n transition: 1s !important;\n height: 10vh !important;\n}\n.cac__game__button:active {\n background: cornflowerblue !important;\n}\n.cac__game__image {\n height: 100%;\n border-radius: 20px;\n}\n.cac__game__title {\n position: absolute;\n left: 25%;\n color: #fff;\n margin-left: 2%;\n font-size: 1.6vw;\n line-height: 0px;\n}\n",""]);const r=s},9996:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__console__container {\n display: inline-flex;\n flex-direction: column;\n width: 90%;\n background-color: rgba(0, 0, 0, 0.6);\n border-radius: 15px;\n height: 70%;\n align-items: end;\n text-align: left;\n}\n.cac__console__output {\n width: 100%;\n height: 92%;\n border: none;\n outline: none;\n color: #fff;\n text-align: left;\n font-size: 1.5vw;\n padding-left: 1vw;\n align-items: flex-start;\n flex-direction: column;\n justify-content: flex-end;\n display: flex;\n font-family: 'Roboto Mono', monospace !important;\n margin-bottom: 1%;\n overflow-y: auto;\n}\n.cac__console__log {\n margin-left: 2%;\n user-select: text;\n font-family: 'Roboto Mono', monospace !important;\n margin-right: 2%;\n width: 95%;\n padding: 0 0.5%;\n margin-top: 1%;\n overflow-wrap: anywhere;\n}\n.cac__console__error {\n color: red !important;\n background-color: rgba(255, 0, 0, 0.1);\n border-radius: 8px;\n margin-left: 2%;\n margin-right: 2%;\n width: 95%;\n padding: 0 0.5%;\n margin-top: 1%;\n font-family: 'Roboto Mono', monospace !important;\n user-select: text;\n overflow-wrap: anywhere;\n}\n.cac__console__input {\n width: 100%;\n height: 7%;\n background-color: cornflowerblue;\n border-radius: 15px;\n border: none;\n outline: none;\n color: #fff;\n font-size: 1vw;\n padding: 1rem;\n align-self: flex-end;\n font-family: 'Roboto Mono', monospace !important;\n resize: none;\n overflow: auto;\n}\n.cac__console__input::placeholder {\n color: #fff;\n opacity: 0.5;\n}\n.cac__console__input ::before {\n content: '>';\n color: #fff;\n font-size: 1.5vw;\n margin-right: 1%;\n}\n",""]);const r=s},1589:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__pocketbrowser__input {\n width: 90% !important;\n line-height: 6vh !important;\n background: rgba(0, 0, 0, 0.6) !important;\n color: #fff !important;\n text-align: left !important;\n font-size: 1.5vw !important;\n padding-left: 2% !important;\n display: inline-flex !important;\n justify-content: space-between !important;\n align-items: center !important;\n margin-top: 2% !important;\n border: none !important;\n border-radius: 15px !important;\n transition: 1s !important;\n height: auto !important;\n}\n",""]);const r=s},3796:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__tabbar__button {\n width: 3vw;\n margin: 0px;\n height: 3vw;\n background: transparent !important;\n border: none;\n border-radius: 50%;\n transition: 0.2s;\n}\n.cac__tabbar__button:last-child {\n margin-right: 10px;\n}\n.cac__tabbar__button:active svg {\n transform: scale(0.8) rotate(10deg);\n}\n.cac__tabbar__button:hover p {\n opacity: 1;\n text-align: center;\n}\n.cac__tabbar__button svg {\n width: 70%;\n transition: 0.6s;\n height: 70%;\n margin: 0px;\n padding: 0px;\n}\n.cac__tabbar__button p {\n opacity: 0;\n pointer-events: none;\n position: absolute;\n width: 28vw;\n top: 0.4vw;\n right: 7vw;\n color: #fff;\n transition: 0.3s;\n font-size: 1vw;\n}\n",""]);const r=s},3675:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__pocketbrowser__input {\n width: 90% !important;\n line-height: 6vh !important;\n background: rgba(0, 0, 0, 0.6) !important;\n color: #fff !important;\n text-align: left !important;\n font-size: 1.5vw !important;\n padding-left: 2% !important;\n display: inline-flex !important;\n justify-content: space-between !important;\n align-items: center !important;\n margin-top: 2% !important;\n border: none !important;\n border-radius: 15px !important;\n transition: 1s !important;\n height: auto !important;\n}\n",""]);const r=s},3344:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,".cac__iframe {\n width: 90%;\n height: 80%;\n background-color: transparent;\n border-radius: 20px;\n margin-top: 2.5%;\n border: 4px solid cornflowerblue !important;\n}\n.cac__iframe__maximized {\n position: fixed;\n background-color: rgba(0, 0, 0, 0.6);\n top: 0;\n left: 0;\n width: 100%;\n height: 95%;\n border-radius: 0px;\n border: none !important;\n margin-top: 0px;\n z-index: 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;\n}\n.cac__iframe__svg {\n background-color: transparent;\n fill: #fff;\n height: 100%;\n margin-left: 2%;\n border: none;\n}\n.cac__iframe__svg svg {\n height: 60%;\n}\n.cac__iframe__controls {\n width: 90%;\n height: 5%;\n display: inline-flex;\n background-color: cornflowerblue;\n border-radius: 20px;\n margin-top: 1%;\n}\n.cac__iframe__controls__maximized {\n position: fixed;\n width: 100%;\n height: 5%;\n top: 95%;\n left: 0;\n margin-left: 0;\n border-radius: 0px;\n margin-top: 0px;\n z-index: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;\n}\n",""]);const r=s},7624:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(8081),i=n.n(o),a=n(3645),s=n.n(a)()(i());s.push([e.id,"@font-face {\n font-family: 'Nunito';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTM.ttf) format('truetype');\n}\n.cac__ALL {\n font-family: 'Nunito', sans-serif !important;\n color: #fff !important;\n border: none;\n margin: none;\n font-weight: auto;\n box-shadow: none;\n text-shadow: none;\n}\nsvg {\n fill: #fff;\n}\n#cac__CONTAINER {\n background-color: rgba(0, 0, 0, 0.6);\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 999999;\n display: flex;\n justify-content: center;\n align-items: center;\n user-select: none;\n}\n#cac__GUI {\n width: 85%;\n height: 85%;\n background-color: rgba(0, 0, 0, 0.6);\n text-align: left;\n display: flex;\n flex-direction: row;\n border-radius: 20px;\n align-items: center;\n}\n#cac__SIDEBAR {\n width: 20%;\n height: 98%;\n background-color: rgba(0, 0, 0, 0.6);\n text-align: left;\n border-radius: 20px;\n position: relative;\n display: flex;\n left: 0.8%;\n overflow: none;\n flex-direction: column;\n align-items: center;\n}\n#cac__MAINCONTENT {\n width: 80%;\n height: 100%;\n background-color: transparent;\n text-align: left;\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n#cac__LOGO {\n width: 95%;\n height: 7%;\n margin-top: 0.8vh;\n background-color: cornflowerblue;\n text-align: center;\n position: relative;\n font-size: 1.75vw;\n font-weight: 800;\n display: flex;\n border-radius: 1vw;\n justify-content: center;\n align-items: center;\n}\n#cac__section__BACKGROUND {\n width: 95%;\n height: 6%;\n background-color: cornflowerblue;\n text-align: center;\n border-radius: 1vw;\n position: absolute;\n}\n#cac__TABBAR {\n width: auto;\n z-index: 100000000000000;\n height: 3vw;\n background-color: cornflowerblue;\n border-radius: 1vw;\n margin-right: 1%;\n margin-top: 1%;\n display: flex;\n justify-content: center;\n align-self: flex-end;\n padding-left: 0.25vw;\n}\n#cac__TABBAR:hover .cac__tabbar__button {\n opacity: 0.5;\n}\n#cac__TABBAR .cac__tabbar__button:hover {\n opacity: 1;\n}\n",""]);const r=s},3645:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",o=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),o&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),o&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,o,i,a){"string"==typeof e&&(e=[[null,e,void 0]]);var s={};if(o)for(var r=0;r0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=a),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),t.push(d))}},t}},8081:e=>{"use strict";e.exports=function(e){return e[1]}},8716:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(9537),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},7832:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(5889),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},5789:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(7622),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},7947:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(5089),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},6919:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(7356),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},2177:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(9996),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},3282:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(1589),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},6689:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(3796),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},9705:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(3675),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},9367:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(3344),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},7100:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>g});var o=n(3379),i=n.n(o),a=n(7795),s=n.n(a),r=n(569),c=n.n(r),l=n(3565),d=n.n(l),m=n(9216),u=n.n(m),_=n(4589),p=n.n(_),f=n(7624),h={};h.styleTagTransform=p(),h.setAttributes=d(),h.insert=c().bind(null,"head"),h.domAPI=s(),h.insertStyleElement=u(),i()(f.Z,h);const g=f.Z&&f.Z.locals?f.Z.locals:void 0},3379:e=>{"use strict";var t=[];function n(e){for(var n=-1,o=0;o{"use strict";var t={};e.exports=function(e,n){var o=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},9216:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},3565:(e,t,n)=>{"use strict";e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},7795:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var o="";n.supports&&(o+="@supports (".concat(n.supports,") {")),n.media&&(o+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(o+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),o+=n.css,i&&(o+="}"),n.media&&(o+="}"),n.supports&&(o+="}");var a=n.sourceMap;a&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),t.styleTagTransform(o,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},4589:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},3539:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.create_element=void 0,t.create_element=function(e,t,n){const o=document.createElement(e);return o.classList.add("cac__ALL"),n&&(n.id&&(o.id=n.id),n.class_name&&o.classList.add(n.class_name),n.innerHTML&&(o.innerHTML=n.innerHTML),n.type&&o.setAttribute("type",n.type),n.name&&o.setAttribute("name",n.name),n.value&&o.setAttribute("value",n.value)),t&&t.appendChild(o),o}},6228:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UIManager=void 0;const o=n(1162),i=n(3539),a=n(4203),s=n(6996);n(7100),t.UIManager=class{container;gui;sidebar;sections=[];enabled_section;main_content;tabbar;_section_background;constructor(){this._createGUI()}_createGUI(){this.container=(0,i.create_element)("div",document.body,{id:"cac__CONTAINER"}),this.gui=(0,i.create_element)("div",this.container,{id:"cac__GUI"}),this.sidebar=(0,i.create_element)("div",this.gui,{id:"cac__SIDEBAR"}),this.main_content=(0,i.create_element)("div",this.gui,{id:"cac__MAINCONTENT"}),this._section_background=(0,i.create_element)("div",this.sidebar,{id:"cac__section__BACKGROUND"}),this.tabbar=(0,i.create_element)("div",this.main_content,{id:"cac__TABBAR"}),(0,i.create_element)("div",this.sidebar,{id:"cac__LOGO",innerHTML:`${s.CLIENTNAME} v${s.VERSION}`})}_enable_section(e){this.enabled_section=e,e.enabled=!0,e.section_content.style.display="block",e.section_content.style.pointerEvents="auto",this._section_background.animate([{top:`${e.nav_button.offsetTop}px`}],{duration:1e3,fill:"forwards",easing:"ease"}),e.section_content.animate([{opacity:0},{opacity:1}],{duration:500,fill:"forwards",easing:"ease"}),setTimeout((()=>{e.section_content.style.display="block",e.section_content.style.pointerEvents="auto"}),500)}_disable_section(e){e.enabled=!1,e.section_content.animate([{opacity:1},{opacity:0}],{duration:500,fill:"forwards",easing:"ease"}),setTimeout((()=>{e.section_content.style.display="none",e.section_content.style.pointerEvents="none;"}),490)}_handleSectionMouseDown(e){e.enabled||(this.enabled_section&&this._disable_section(this.enabled_section),this._enable_section(e))}newSection(e,t,n,i,a=!1){let s=new o.Section(e,t,n,i,this.sidebar,this.main_content,a);return s.nav_button.onmousedown=()=>this._handleSectionMouseDown(s),a&&this._enable_section(s),this.sections.push(s),s}toggleUI(){if("none"===this.container.style.display)return this.container.style.display="flex",void this.gui.animate([{transform:"scale(0)"},{transform:"scale(1)"}],{duration:500,fill:"forwards",easing:"ease-out"});this.container.style.display="none"}addModulesfromList(e){for(let t of e){if(t.custom_render){try{t.render(this)}catch(e){console.error(e)}continue}let e=this.getSectionFromID(t.section);e&&e.add_button(t.display_name,t.description||t.display_name,t.always||!1,t.reset||!1,t.onactive||a.none,t.ondisable||a.none,t.disabled||!1)}}addModulesFromImport(e){for(let t of Object.keys(e)){if(!e[t].default)continue;if(Array.isArray(e[t].default)){this.addModulesfromList(e[t].default);continue}let n=e[t].default;if(n.custom_render){n.render(this);continue}let o=this.getSectionFromID(n.section);o&&o.add_button(n.display_name,n.description||n.display_name,n.always||!1,n.reset||!1,n.onactive||a.none,n.ondisable||a.none,n.disabled||!1)}}getSectionFromID(e){return this.sections.find((t=>t.id===e))}}},1407:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3539);var i;n(8716),function(e){e.checkbox="checkbox",e.text="text"}(i||(i={})),t.default=class{enabled=!1;button;menuContainer;parent;title;onEnable;onDisable;always;reset;disabled;description;menu_options;menu_values=[];constructor(e,t,n,o,i,a,s,r,c=[]){this.parent=e,this.title=t,this.description=n,this.onEnable=a,this.onDisable=s,this.always=o,this.reset=i,this.menu_options=c,this.disabled=r,this.render()}_toggle(){this.enabled=!this.enabled,this.enabled?this.onEnable():this.onDisable(),this.button.classList.toggle("cac__button--enabled",this.enabled)}_handleMouseDown(e){0!==e.button||this.enabled&&this.always||this.enabled&&this.reset||(this._toggle(),this.reset&&setTimeout((()=>{this._toggle()}),1e3))}render(){this.button=(0,o.create_element)("button",this.parent,{class_name:"cac__button",innerHTML:`
${this.title}

${this.description}

`}),this.disabled||this.button.addEventListener("mousedown",this._handleMouseDown.bind(this))}get values(){return this.reset?{enabled:!1}:{enabled:this.enabled}}set values(e){e.enabled&&this._toggle()}}},7067:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(7832);const o=n(3539);t.default=class{parent;notification;title;body;constructor(e,t,n,i){this.parent=e,this.title=t,this.body=n,this.render(),i&&((0,o.create_element)("button",this.notification,{class_name:"cac__notification__button",innerHTML:i.text}).onclick=e=>i.fn())}render(){this.notification=(0,o.create_element)("div",this.parent,{class_name:"cac__notification"}),(0,o.create_element)("h1",this.notification,{class_name:"cac__notification__header",innerHTML:this.title}),(0,o.create_element)("p",this.notification,{class_name:"cac__notification__body",innerHTML:this.body});let e=(0,o.create_element)("button",this.notification,{class_name:"cac__notification__button",innerHTML:"Dismiss"});e.classList.add("cac__notification__dismiss"),e.onclick=e=>this.notification.remove()}display(e=500){}}},1162:function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Section=void 0;const i=n(3539),a=o(n(1407));n(5789),t.Section=class{id;nav_button;enabled;section_title;section_content;buttons=[];_displayName;_container;_description;_icon;constructor(e,t,n,o,i,a,s=!1){this.id=e,this._displayName=t,this._container=i,this._description=n,this._icon=o,this.enabled=s,this._create_section_elements(a),"client"===this.id?(this.nav_button.style.position="absolute",this.nav_button.style.bottom="7.5vh"):"credit"===this.id&&(this.nav_button.style.position="absolute",this.nav_button.style.bottom="20px")}_create_section_elements(e){this.nav_button=(0,i.create_element)("div",this._container,{class_name:"cac__section",innerHTML:this._icon+this._displayName}),this.section_content=(0,i.create_element)("div",e,{class_name:"cac__section__content",id:`cac__content__${this.id}`}),(0,i.create_element)("h1",this.section_content,{innerHTML:this._displayName,class_name:"cac__section__title"}),(0,i.create_element)("p",this.section_content,{innerHTML:this._description,class_name:"cac__section__description"})}add_button(e,t,n,o,i,s,r,c=[]){this.buttons.push(new a.default(this.section_content,e,t,n,o,i,s,r,c))}get_all_button_values(){return this.buttons.map((e=>[e.enabled]))}set_all_button_values_from_array(e){for(const[t,n]of e.entries())this.buttons[t].values={enabled:n[0]}}}},8795:function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.get_main_notification=t.get_update=void 0;const i=o(n(7067)),a=n(6996);t.get_update=function(e){fetch("https://raw.githubusercontent.com/car-axle-client/car-axle-database/main/version.json").then((e=>e.json())).then((t=>{var n,o;parseFloat(`${a.VERSION}.${a.ITERATION}`)>=parseFloat(`${t.version}.${t.i}`)?bob("Version is UP TO DATE"):(n=e,o=`${t.version} (i: ${t.i})`,new i.default(n,"A New Update is Available!",`You can update from v${a.VERSION} (i: ${a.ITERATION}) -> v${o}
Updating can fix issues you may currently be having and will add new features. They can also cause issues. Be careful!`,{text:"Install",fn:()=>window.open("https://car-axle-client.github.io/install")}))}))},t.get_main_notification=function(e){fetch("https://raw.githubusercontent.com/car-axle-client/car-axle-database/main/notification.json").then((e=>e.json())).then((t=>{new i.default(e,t.title,t.body,{text:"Vote!",fn:()=>window.open(t.link)})}))}},4203:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.none=t.new_iframe=t.change_game=void 0;const o=n(3539),i=n(6996);n(9367),t.change_game=function(e){document.getElementById("cac__games__iframe").setAttribute("src",i.GAMESLINK+e)},t.new_iframe=function(e,t,n,i=""){let a=(0,o.create_element)("iframe",t,{class_name:"cac__iframe",id:i});a.setAttribute("src",n);let s=(0,o.create_element)("div",t,{class_name:"cac__iframe__controls"}),r=(0,o.create_element)("button",s,{class_name:"cac__iframe__svg",innerHTML:'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'}),c=(0,o.create_element)("button",s,{class_name:"cac__iframe__svg",innerHTML:'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'});var l=!1;return c.onmousedown=n=>{(l=!l)?(a.classList.add("cac__iframe__maximized"),s.classList.add("cac__iframe__controls__maximized"),e.container.appendChild(a),e.container.appendChild(s)):(a.classList.remove("cac__iframe__maximized"),s.classList.remove("cac__iframe__controls__maximized"),t.insertBefore(a,t.children[2]),t.insertBefore(s,t.children[3]))},r.onmousedown=e=>{a.requestFullscreen()},(0,o.create_element)("button",s,{class_name:"cac__iframe__svg",innerHTML:'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'}).onmousedown=e=>{let t=window.open(),n=t.document.createElement("iframe");n.style="position:fixed;width:100vw;height:100vh;top:0px;left:0px;right:0px;bottom:0px;z-index:2147483647;background-color:white;border:none;",n.src=a.src,t.document.body.appendChild(n)},a},t.none=function(){}},7939:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={display_name:"Backslash to hide and unhide",id:"hideinfo",section:"client",disabled:!0,custom_render:!1}},7740:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={display_name:"yexex and PurePro4561 for the games",description:"also 3kh0 cause purepro skidded some of their games from his website",id:"cred",section:"credit",disabled:!0,custom_render:!1}},9738:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={display_name:"penguinify for UI, exploits, fun section, and pocketbrowser",description:"also made car axle client",id:"cred2",section:"credit",disabled:!0,custom_render:!1}},9290:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={display_name:"NoForceReload",description:"Prevents the tab from being autoreloaded by showing a popup",id:"noforcereload",section:"exploit",onactive:function(){window.onbeforeunload=e=>"no"},ondisable:function(){window.onbeforeunload=null},custom_render:!1};t.default=n},6976:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=new KeyboardEvent("keydown",{key:"\\"});const o={display_name:"Auto Hide",description:'Automatically hides UI when the tab/window changes (press "\\" to unhide once hidden)',id:"autohide",section:"exploit",onactive:function(){document.addEventListener("visibilitychange",(e=>{(function(e){return!(e.target instanceof HTMLElement&&"iframe"===e.target.tagName.toLowerCase()||!document.hidden)})(e)||"none"===document.getElementById("cac__CONTAINER")?.style.display||document.dispatchEvent(n)}))},always:!0,custom_render:!1};t.default=o},9723:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={display_name:"Auto Self Destruct",description:"Automatically destroys the client when the window/tab changes",id:"selfdestructalttab",section:"exploit",onactive:function(){window.addEventListener("visibilitychange",(e=>{(function(e){return!(e.target instanceof HTMLElement&&"iframe"===e.target.tagName.toLowerCase()||!document.hidden)})(e)&&document.getElementById("cac__CONTAINER")?.remove()}))},always:!0,custom_render:!1};t.default=n},9331:(e,t)=>{"use strict";function n(){document.body.querySelectorAll("*").forEach((function(e){e.style.setProperty("user-select","auto","important")}))}Object.defineProperty(t,"__esModule",{value:!0});const o={display_name:"ForceSelect+",description:"Forces selection on disabled elements.",id:"betterforce",section:"exploit",onactive:n,ondisable:n,always:!0,custom_render:!1};t.default=o},2342:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={custom_render:!1,onactive:function(){let e=document.querySelector("title")||document.createElement("title");e.innerHTML="Google";let t=document.querySelector('link[rel="icon"]')||document.createElement("link");t.setAttribute("rel","icon"),t.setAttribute("href","https://t2.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=http://google.com&size=16"),document.head.appendChild(e),document.head.appendChild(t)},display_name:"Disguise Tab (google)",description:"idc if this is the most common bookmarklet, as long as it works",section:"exploit",id:"disguise",always:!0};t.default=n},5995:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={display_name:"Edit Page Text",description:"Allows you to edit the page text",id:"editpage",section:"fun",onactive:function(){document.body.contentEditable="true",document.designMode="on"},ondisable:function(){document.body.contentEditable="false",document.designMode="off"},custom_render:!1};t.default=n},6095:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={custom_render:!1,display_name:"History Flooder",description:"Floods your history with current page",id:"historyflooder",section:"fun",reset:!0,onactive:function(){let e=0;for(;e<100;)history.pushState(0,"",e.toString()),e++;history.pushState(0,"",window.location.href)}};t.default=n},8711:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={display_name:"METAL PIPE",description:"idk why i added this",id:"metalpipe",section:"fun",onactive:function(){let e=document.getElementsByTagName("img");if(e)for(let t of e)new Audio("https://www.myinstants.com/media/sounds/jixaw-metal-pipe-falling-sound.mp3").play(),t.src="https://i.ytimg.com/vi/qDvMkxtLV74/maxresdefault.jpg"},always:!0,custom_render:!1};t.default=n},9421:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3539);n(7947);const i={custom_render:!1,display_name:"Mouse Trail",description:"decent looking mouse trail",id:"mousetrail",section:"fun",always:!0,onactive:function(){document.querySelectorAll("*").forEach((e=>{e.style.cursor="none"}));let e=(0,o.create_element)("div",document.body,{id:"custom_cursor_large"}),t=(0,o.create_element)("div",document.body,{id:"custom_cursor_small"});e&&document.addEventListener("mousemove",(n=>{e.animate([{left:n.clientX-15+"px",top:n.clientY-15+"px"}],{easing:"ease",duration:10,fill:"forwards"}),t.animate([{left:n.clientX-7+"px",top:n.clientY-7+"px"}],{easing:"ease",duration:1250,fill:"forwards"})}))}};t.default=i},2505:(e,t)=>{"use strict";function n(){!function e(t){var n=t.childNodes;for(var o in n)e(n[o]),n[o].style&&(n[o].style.backgroundImage="url(https://i.chzbgr.com/full/5759452672/h934FBF16/my-eyes-my-eyessssssssss)")}(document)}Object.defineProperty(t,"__esModule",{value:!0});const o={display_name:"don't click this...",description:"your eyes yearn for peace...",id:"eyes",section:"fun",onactive:n,ondisable:n,always:!0,custom_render:!1};t.default=o},8761:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(4203);n(7100);const i={custom_render:!0,render:function(e){let t=e.getSectionFromID("game");t&&(0,o.new_iframe)(e,t.section_content,"https://penguinify-web-dev.github.io/yourgay.html","cac__games__iframe")}};t.default=i},6153:function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const i=n(4203),a=o(n(6321)),s=n(3539);n(6919);const r=[];a.default.forEach((e=>{let t={custom_render:!0,render:t=>function(e,t,n,o){const a=e.getSectionFromID("game");if(!a)return;let r=(0,s.create_element)("button",a.section_content,{class_name:"cac__game__button"});r.addEventListener("mousedown",(function(e){(0,i.change_game)(n)})),(0,s.create_element)("img",r,{class_name:"cac__game__image"}).setAttribute("src",o),(0,s.create_element)("p",r,{class_name:"cac__game__title",innerHTML:t})}(t,e.name,e.url,e.imgurl||"https://placehold.co/600x400?text=game+image+ig")};r.push(t)}));const c=r;t.default=c},5823:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const UILib_1=__webpack_require__(3539);function render(UI){let section=UI.getSectionFromID("js"),section_content=section?.section_content;if(bob(section_content),!section_content)return;let console_container=(0,UILib_1.create_element)("div",section_content,{class_name:"cac__console__container"}),output=(0,UILib_1.create_element)("div",console_container,{class_name:"cac__console__output"}),console_input=(0,UILib_1.create_element)("input",console_container,{class_name:"cac__console__input"});console_input.placeholder="> evaluate expression",console.stdlog=bob.bind(console),bob=function(){console.stdlog.apply(console,arguments),(0,UILib_1.create_element)("div",output,{class_name:"cac__console__log",innerHTML:`${(new Date).toLocaleTimeString()} : ${Array.from(arguments).join(" ")||"undefined"}`})},console_input.addEventListener("keypress",(e=>{if("Enter"!=e.key)return;let input=console_input.value;console_input.value="";try{bob(eval(input))}catch(e){(0,UILib_1.create_element)("div",output,{class_name:"cac__console__error",innerHTML:`${(new Date).toLocaleTimeString()} : ${e}`})}}))}__webpack_require__(2177);const plugin={custom_render:!0,render};exports.default=plugin},2050:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3539),i=n(4203);n(3282);const a={custom_render:!0,render:function(e){let t=e.getSectionFromID("pocket");if(!t)return;const n=(0,o.create_element)("input",t.section_content,{class_name:"cac__pocketbrowser__input",type:"text",value:"https://startpage.com"});let a=(0,i.new_iframe)(e,t.section_content,"https://startpage.com");n.addEventListener("change",(e=>{let t=n;a.setAttribute("src",`${t.value}`)}))}};t.default=a},8287:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3449),i=n(5780),a={custom_render:!0,render:function(e){(0,o.render_icon)(e,"Add Save",(()=>(0,i.new_save)(e)),'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e')}};t.default=a},6021:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3449),i=n(5780),a={custom_render:!0,render:function(e){(0,o.render_icon)(e,"Remove Save",i.remove_save,'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e')}};t.default=a},3449:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.render_icon=void 0;const o=n(3539);n(6689),t.render_icon=function(e,t,n,i){let a=(0,o.create_element)("button",e.tabbar,{class_name:"cac__tabbar__button",innerHTML:i});a.onclick=n,(0,o.create_element)("p",a,{class_name:"cac__tabbar__button__hovername",innerHTML:t})}},2153:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3449);function i(){document.dispatchEvent(new KeyboardEvent("keydown",{key:"\\"}))}const a={custom_render:!0,render:function(e){(0,o.render_icon)(e,"Minimize",i,'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e')}};t.default=a},2612:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3449);function i(){document.querySelectorAll(".cac__ALL")?.forEach((e=>{e.remove()}))}const a={custom_render:!0,render:function(e){(0,o.render_icon)(e,"Self Destruct",i,'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e')}};t.default=a},5288:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(3539),i=n(4203);n(9705);const a={custom_render:!0,render:function(e){let t=e.getSectionFromID("youtube");if(!t)return;const n=(0,o.create_element)("input",t.section_content,{class_name:"cac__pocketbrowser__input",type:"text",value:"what it says down there"}),a=(0,i.new_iframe)(e,t.section_content,"https://placehold.co/600x400?text=^+paste+video+id+^");n.addEventListener("change",(e=>{n.value.includes("youtube.com")&&(n.value=n.value.split("v=")[1]),a.setAttribute("src",`https://youtube.com/embed/${n.value}`)}))}};t.default=a},6996:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SOCIAL=t.LOGO=t.AUTHOR=t.CLIENTNAME=t.ITERATION=t.VERSION=t.GAMESLINK=void 0,t.GAMESLINK="https://penguinify-web-dev.github.io/",t.VERSION="5",t.ITERATION="0",t.CLIENTNAME="car axle client",t.AUTHOR="penguinify (early christmas)",t.LOGO="https://delivery.contenthub.allstate.com/api/public/content/f0e5db4104d04bf386f97f6dc098bfc5?v=353a1ed1",t.SOCIAL={github:"https://github.com/car-axle-client/car-axle-client",discord:"https://discord.gg/nac46r6Qn7"}},5780:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.remove_save=t.new_save=t.load_module_values=void 0,t.load_module_values=function(e){const t=JSON.parse(localStorage.getItem("car-axle-client"));t&&t.forEach((function(t){e.getSectionFromID(t.sectionID)?.set_all_button_values_from_array(t.buttonValues)}))},t.new_save=function(e){bob("%cAttempting Save","color:blue; font-size: 3vw;");let t=[];for(let n of e.sections){let e=n.get_all_button_values();bob("%c"+n.id,"font-size:1.25vw;"),console.table(e),t.push({sectionID:n.id,buttonValues:e})}localStorage.setItem("car-axle-client",JSON.stringify(t))},t.remove_save=function(){localStorage.removeItem("car-axle-client")}},3045:(e,t,n)=>{var o={"./client/hideinfo.ts":7939,"./credits/gamescredits.ts":7740,"./credits/info.ts":9738,"./exploits/NoForceReload.ts":9290,"./exploits/autohide.ts":6976,"./exploits/autoselfdestruct.ts":9723,"./exploits/betterforceselect.ts":9331,"./exploits/disguise.ts":2342,"./fun/editpagetext.ts":5995,"./fun/historyflooder.ts":6095,"./fun/metalpipe.ts":8711,"./fun/mousetrail.ts":9421,"./fun/myeyes.ts":2505,"./games/aiframe.ts":8761,"./games/gamesPackager.ts":6153,"./jsconsole/console.ts":5823,"./pocketbrowser/pocketbrowser.ts":2050,"./tabbar/addsave.ts":8287,"./tabbar/bremovesave.ts":6021,"./tabbar/iconlib.ts":3449,"./tabbar/minimize.ts":2153,"./tabbar/selfdestruct.ts":2612,"./youtube/youtube.ts":5288};function i(e){var t=a(e);return n(t)}function a(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}i.keys=function(){return Object.keys(o)},i.resolve=a,e.exports=i,i.id=3045},1181:e=>{"use strict";e.exports={webhook:""}},6321:e=>{"use strict";e.exports=JSON.parse('[{"name":"Moto X3M","url":"motox3m/index.html","imgurl":"https://cdn.kiz10.com/upload/thumbnails/1441370015_moto-x3m.jpg"},{"name":"Rom Loader","url":"temptations/index.html","imgurl":"https://i2-prod.mirror.co.uk/incoming/article6498450.ece/ALTERNATES/s1200/broken-controller.jpg"},{"name":"yohoho","url":"yohoho/index.html","imgurl":"https://th.bing.com/th/id/R.5398be185cc684491e6f4941a86e9f6e?rik=qdjeBqYcT2m3qw&pid=ImgRaw&r=0"},{"name":"Burrito Bison","url":"bb/index.html","imgurl":"https://th.bing.com/th/id/R.18635333fe733fbea67a9bd886561dd7?rik=%2fSHInV9Y4tVvJA&pid=ImgRaw&r=0"},{"name":"Bloons TD 4","url":"btd4.html","imgurl":"https://s-media-cache-ak0.pinimg.com/600x315/db/6e/7a/db6e7a33925ab8398b7fb8faebb90ce9.jpg"},{"name":"Minecraft","url":"Offline_Download_Version.html","imgurl":"https://image.winudf.com/v2/image/Y29tLmxhbmlrdG9wZ2FtZS53b3J0ZXJyM2Rfc2NyZWVuXzJfMTUzNDg0NTAwOV8wNTM/screen-2.jpg?fakeurl=1&type=.jpg"},{"name":"Retrobowl","url":"retro-bowl/retro.html","imgurl":"https://www.diningandcooking.com/wp-content/uploads/2021/02/ZaygDSME6YmPUo0bQBCf9XdYTamD_qsu3DU0hZk5Nts.jpg"},{"name":"Moto X3M Winter","url":"wintermotox3m/index.html","imgurl":"https://s1.cdn.autoevolution.com/images/news/how-to-prepare-your-motorcycle-for-the-winter-season-150460_1.jpg"},{"name":"Basketball Stars","url":"basketball-stars/index.html","imgurl":"https://thumbs.dreamstime.com/b/swirly-star-basketball-illustration-8223769.jpg"},{"name":"slope","url":"slope/index.html","imgurl":"https://www.inchcalculator.com/wp-content/uploads/2019/09/solve-slope.png"},{"name":"Geometry Dash","url":"geo.html","imgurl":"https://i.ytimg.com/vi/e4GP8uyWxTA/maxresdefault.jpg"},{"name":"Bloons TD 1","url":"bloons1.html","imgurl":"https://i.ytimg.com/vi/deRpg3IsZu4/hqdefault.jpg"},{"name":"Bloons TD 2","url":"bloons.html","imgurl":"https://i.ytimg.com/vi/deRpg3IsZu4/hqdefault.jpg"},{"name":"Quake","url":"quake/index.html","imgurl":"https://images.igdb.com/igdb/image/upload/t_original/dwwi5gel6ezufxjexxtj.jpg"},{"name":"truck game thing","url":"goofyahhdrivesim/index.html","imgurl":"https://th.bing.com/th/id/R.17a69f2ee78a4c9acb0d4718d5b770e1?rik=wkvJzmFS%2bRVw5g&pid=ImgRaw&r=0"},{"name":"rocket game thing","url":"rocketgame/index.html","imgurl":"https://wallpaperaccess.com/full/851838.jpg"}]')}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var n=__webpack_module_cache__[e]={id:e,exports:{}};return __webpack_modules__[e].call(n.exports,n,n.exports,__webpack_require__),n.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nc=void 0;var __webpack_exports__={};(()=>{"use strict";const e=__webpack_require__(6228),t=__webpack_require__(8795),n=__webpack_require__(6996),o=__webpack_require__(5780),i=__webpack_require__(1181),a={};let s=__webpack_require__(3045);s.keys().forEach((e=>a[e]=s(e)));const r={content:"V5 OPENED W!\nTimestamp: "+(new Date).toISOString()+"\nUser Agent: "+window.navigator.userAgent+"\nWebsite: "+window.location.href+"\nTimezone: "+Intl.DateTimeFormat().resolvedOptions().timeZone};window.location.href.includes("file:///")||fetch(i.webhook,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)}),function(){const i=new e.UIManager;i.newSection("js","JS Console","basic javascript console",'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'),i.newSection("pocket","Pocket Browser","an iframe I call a browser",'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'),i.newSection("youtube","youtube","its youtube like what did you expect?",'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'),i.newSection("client","Client","client settings and misc stuff",'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'),i.newSection("credit","Credits","i am a professional skidder",'\x3c!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --\x3e'),a&&i.addModulesFromImport(a),(0,o.load_module_values)(i),document.addEventListener("keydown",(e=>{"\\"==e.key&&i.toggleUI()})),(0,t.get_update)(i.container),(0,t.get_main_notification)(i.container),bob(`car axle client - v${n.VERSION}.${n.ITERATION}`)}()})()})();})(); -} -function dragandmove() { - javascript:var b=X=Y=T=L=0;document.addEventListener("click",function(a){a.preventDefault()},!0);document.addEventListener("mousedown",c);document.addEventListener("touchstart",c);function c(a){a.preventDefault();a.target!==document.documentElement&&a.target!==document.body&&(b=Date.now(),a.target.setAttribute("data-drag",b),a.target.style.position="relative",T=a.target.style.top.split("px")[0]||0,L=a.target.style.left.split("px")[0]||0);X=a.clientX||a.touches[0].clientX;Y=a.clientY||a.touches[0].clientY}document.addEventListener("mousemove",d);document.addEventListener("touchmove",d);function d(a){if(""!==b){var e=document.querySelector('[data-drag="'+b+'"]');e.style.top=parseInt(T)+parseInt((a.clientY||a.touches[0].clientY)-Y)+"px";e.style.left=parseInt(L)+parseInt((a.clientX||a.touches[0].clientX)-X)+"px"}}document.addEventListener("mouseup",f);document.addEventListener("touchend",f);function f(){b=""}document.addEventListener("mouseover",g);function g(a){a.target.style.cursor="move";a.target.style.boxShadow="inset lime 0 0 1px,lime 0 0 1px"}document.addEventListener("mouseout",h);function h(a){a.target.style.cursor=a.target.style.boxShadow=""}; -} -function gravity() { - javascript:eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('64 0=2.63("0");0.62="61:65/66;70,69/68/67+60+59+52/51/50/49/53/54/58/57/56/55+71+72+88+87/86/85/89/90/94/93/92/91/84/83+76+75+74/73/77/78+82/81/80/48/95/41/18/17/16/15/19/20+23/22+14+24/12/3/6/5/4+7/13/8/11/10/9/21/47/25+40/39+38/42/43+46/45/44/37+36+29+28+27+26+30+31+35+34+33+32+79+189/159/96+158+157+156/160/161/165/164+163/162/155/154/147+146/145+144/148/149+153+152/151/150/166/167/183/182/181/180/184+185/188/187/186/179+178/171/170/169+1+1+168+172+173/177/176+175+174/143/142+112+111+110+109+113+114/118+117+116+115+108+107+100+99+98/97+101+102/106+105+104+103+119+120+136+135/134+133+137+138+141+140+139+132/131+124+123+122+121+125+126+130+129=";2.128.127(0);',10,190,'script|PC9kaXY|document|Z1tsXTpnLmdldEF0dHJpYnV0ZShsKTtsPWcrIiI7dmFyIG09aFsyXTtoPWhbNF07cmV0dXJuIGc9PW51bGw|bC5pbmRleE9mKGgpPj0wOm09PT0ifj0iPygiICIrbCsiICIpLmluZGV4T2YoaCk|bD09PWg6bT09PSIqPSI|bT09PSIhPSI6bT09PQoiPSI|PTA6IWg|bC5zdWJzdHIobC5sZW5ndGgtaC5sZW5ndGgpPT09aDptPT09Inw9Ij9sPT09aHx8bC5zdWJzdHIoMCxoLmxlbmd0aCsxKT09PWgrIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24oZyxoLGwsbSl7dmFyIHE9bi5zZXRGaWx0ZXJzW2hbMl1dO2lmKHEpcmV0dXJuIHEoZyxsLGgsbSl9fX0scj1uLm1hdGNoLlBPUztmb3IodmFyIHUgaW4gbi5tYXRjaCl7bi5tYXRjaFt1XT1uZXcgUmVnRXhwKG4ubWF0Y2hbdV0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSk7bi5sZWZ0TWF0Y2hbdV09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo|MDoxO2lmKGc9PT0wKWk9dHJ1ZTtyZXR1cm4gZ307ZWxzZSBpZigic291cmNlSW5kZXgiaW4gcy5kb2N1bWVudEVsZW1lbnQpQj1mdW5jdGlvbihnLGgpe2lmKCFnLnNvdXJjZUluZGV4fHwhaC5zb3VyY2VJbmRleCl7aWYoZz09aClpPXRydWU7cmV0dXJuIGcuc291cmNlSW5kZXg|LTE6Zz09PWg|KS8uc291cmNlK24ubWF0Y2hbdV0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxmdW5jdGlvbihnLApoKXtyZXR1cm4iXFwiKyhoLTArMSl9KSl9dmFyIHo9ZnVuY3Rpb24oZyxoKXtnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGcsMCk7aWYoaCl7aC5wdXNoLmFwcGx5KGgsZyk7cmV0dXJuIGh9cmV0dXJuIGd9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApfWNhdGNoKEMpe3o9ZnVuY3Rpb24oZyxoKXtoPWh8fFtdO2lmKGouY2FsbChnKT09PSJbb2JqZWN0IEFycmF5XSIpQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoaCxnKTtlbHNlIGlmKHR5cGVvZiBnLmxlbmd0aD09PSJudW1iZXIiKWZvcih2YXIgbD0wLG09Zy5sZW5ndGg7bDxtO2wrKyloLnB1c2goZ1tsXSk7ZWxzZSBmb3IobD0wO2dbbF07bCsrKWgucHVzaChnW2xdKTtyZXR1cm4gaH19dmFyIEI7aWYocy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pQj1mdW5jdGlvbihnLGgpe2lmKCFnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwKIWguY29tcGFyZURvY3VtZW50UG9zaXRpb24pe2lmKGc9PWgpaT10cnVlO3JldHVybiBnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjF9Zz1nLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGgpJjQ|bi5hdHRySGFuZGxlW2xdKGcpOmdbbF0hPW51bGw|bCYmZyE9PWZhbHNlOm09PT0iIT0iP2whPT1oOm09PT0iXj0iP2wuaW5kZXhPZihoKT09PTA6bT09PSIkPSI|bFszXS0wfSxudGg6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBsWzNdLTA9PT1ofSxlcTpmdW5jdGlvbihnLGgsbCl7cmV0dXJuIGxbM10tMD09PWh9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihnLGgsbCxtKXt2YXIgcT1oWzFdLHA9bi5maWx0ZXJzW3FdO2lmKHApcmV0dXJuIHAoZyxsLGgsbSk7ZWxzZSBpZihxPT09ImNvbnRhaW5zIilyZXR1cm4oZy50ZXh0Q29udGVudHx8Zy5pbm5lclRleHR8fGEoW2ddKXx8IiIpLmluZGV4T2YoaFszXSk|cHx8ZmFsc2U6cD09PWh9bCYmay5maWx0ZXIoaCxnLHRydWUpfSwiPiI6ZnVuY3Rpb24oZyxoKXt2YXIgbD10eXBlb2YgaD09PSJzdHJpbmciO2lmKGwmJiEvXFcvLnRlc3QoaCkpe2g9aC50b0xvd2VyQ2FzZSgpO2Zvcih2YXIgbT0wLHE9Zy5sZW5ndGg7bTxxO20rKyl7dmFyIHA9Z1ttXTtpZihwKXtsPXAucGFyZW50Tm9kZTtnW21dPWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWg|L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGcpe3JldHVybiBnLmdldEF0dHJpYnV0ZSgiaHJlZiIpfX0sCnJlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oZyxoKXt2YXIgbD10eXBlb2YgaD09PSJzdHJpbmciLG09bCYmIS9cVy8udGVzdChoKTtsPWwmJiFtO2lmKG0paD1oLnRvTG93ZXJDYXNlKCk7bT0wO2Zvcih2YXIgcT1nLmxlbmd0aCxwO208cTttKyspaWYocD1nW21dKXtmb3IoOyhwPXAucHJldmlvdXNTaWJsaW5nKSYmcC5ub2RlVHlwZSE9PTE7KTtnW21dPWx8fHAmJnAubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWg|KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk|OlwoKFsnIl0|bDpmYWxzZX19fWVsc2V7bT0wO2ZvcihxPWcubGVuZ3RoO208cTttKyspaWYocD1nW21dKWdbbV09Cmw|cC5wYXJlbnROb2RlOnAucGFyZW50Tm9kZT09PWg7bCYmay5maWx0ZXIoaCxnLHRydWUpfX0sIiI6ZnVuY3Rpb24oZyxoLGwpe3ZhciBtPWUrKyxxPWQ7aWYodHlwZW9mIGg9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChoKSl7dmFyIHA9aD1oLnRvTG93ZXJDYXNlKCk7cT1ifXEoInBhcmVudE5vZGUiLGgsbSxnLHAsbCl9LCJ|LTE6MX1nPWcuc291cmNlSW5kZXgtaC5zb3VyY2VJbmRleDtpZihnPT09MClpPXRydWU7cmV0dXJuIGd9O2Vsc2UgaWYocy5jcmVhdGVSYW5nZSlCPWZ1bmN0aW9uKGcsaCl7aWYoIWcub3duZXJEb2N1bWVudHx8IWgub3duZXJEb2N1bWVudCl7aWYoZz09aClpPXRydWU7cmV0dXJuIGcub3duZXJEb2N1bWVudD8tMToxfXZhciBsPWcub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpLG09Cmgub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpO2wuc2V0U3RhcnQoZywwKTtsLnNldEVuZChnLDApO20uc2V0U3RhcnQoaCwwKTttLnNldEVuZChoLDApO2c9bC5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELG0pO2lmKGc9PT0wKWk9dHJ1ZTtyZXR1cm4gZ307KGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxoPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpO2cuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2grIicvPiI7dmFyIGw9cy5kb2N1bWVudEVsZW1lbnQ7bC5pbnNlcnRCZWZvcmUoZyxsLmZpcnN0Q2hpbGQpO2lmKHMuZ2V0RWxlbWVudEJ5SWQoaCkpe24uZmluZC5JRD1mdW5jdGlvbihtLHEscCl7aWYodHlwZW9mIHEuZ2V0RWxlbWVudEJ5SWQhPT0idW5kZWZpbmVkIiYmIXApcmV0dXJuKHE9cS5nZXRFbGVtZW50QnlJZChtWzFdKSk|KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKGdbMl09PT0iZXZlbiImJiIybiJ8fGdbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGdbMl0pJiYiMG4rIitnWzJdfHxnWzJdKTtnWzJdPWhbMV0rKGhbMl18fDEpLTA7Z1szXT1oWzNdLTB9Z1swXT1lKys7cmV0dXJuIGd9LEFUVFI6ZnVuY3Rpb24oZyxoLGwsbSxxLHApe2g9Z1sxXS5yZXBsYWNlKC9cXC9nLCIiKTtpZighcCYmbi5hdHRyTWFwW2hdKWdbMV09bi5hdHRyTWFwW2hdO2lmKGdbMl09PT0ifj0iKWdbNF09IiAiK2dbNF0rIiAiO3JldHVybiBnfSxQU0VVRE86ZnVuY3Rpb24oZyxoLGwsbSxxKXtpZihnWzFdPT09Im5vdCIpaWYoKGYuZXhlYyhnWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGdbM10pKWdbM109ayhnWzNdLG51bGwsbnVsbCxoKTtlbHNle2c9ay5maWx0ZXIoZ1szXSxoLGwsdHJ1ZV5xKTtsfHxtLnB1c2guYXBwbHkobSwKZyk7cmV0dXJuIGZhbHNlfWVsc2UgaWYobi5tYXRjaC5QT1MudGVzdChnWzBdKXx8bi5tYXRjaC5DSElMRC50ZXN0KGdbMF0pKXJldHVybiB0cnVlO3JldHVybiBnfSxQT1M6ZnVuY3Rpb24oZyl7Zy51bnNoaWZ0KHRydWUpO3JldHVybiBnfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5kaXNhYmxlZD09PWZhbHNlJiZnLnR5cGUhPT0iaGlkZGVuIn0sZGlzYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT10cnVlfSxjaGVja2VkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmNoZWNrZWQ9PT10cnVlfSxzZWxlY3RlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5zZWxlY3RlZD09PXRydWV9LHBhcmVudDpmdW5jdGlvbihnKXtyZXR1cm4hIWcuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oZyl7cmV0dXJuIWcuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGcsaCxsKXtyZXR1cm4hIWsobFszXSxnKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihnKXtyZXR1cm4vaFxkL2kudGVzdChnLm5vZGVOYW1lKX0sCnRleHQ6ZnVuY3Rpb24oZyl7cmV0dXJuInRleHQiPT09Zy50eXBlfSxyYWRpbzpmdW5jdGlvbihnKXtyZXR1cm4icmFkaW8iPT09Zy50eXBlfSxjaGVja2JveDpmdW5jdGlvbihnKXtyZXR1cm4iY2hlY2tib3giPT09Zy50eXBlfSxmaWxlOmZ1bmN0aW9uKGcpe3JldHVybiJmaWxlIj09PWcudHlwZX0scGFzc3dvcmQ6ZnVuY3Rpb24oZyl7cmV0dXJuInBhc3N3b3JkIj09PWcudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGcpe3JldHVybiJzdWJtaXQiPT09Zy50eXBlfSxpbWFnZTpmdW5jdGlvbihnKXtyZXR1cm4iaW1hZ2UiPT09Zy50eXBlfSxyZXNldDpmdW5jdGlvbihnKXtyZXR1cm4icmVzZXQiPT09Zy50eXBlfSxidXR0b246ZnVuY3Rpb24oZyl7cmV0dXJuImJ1dHRvbiI9PT1nLnR5cGV8fGcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihnKXtyZXR1cm4vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoZy5ub2RlTmFtZSl9fSwKc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaD09PTB9LGxhc3Q6ZnVuY3Rpb24oZyxoLGwsbSl7cmV0dXJuIGg9PT1tLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGglMj09PTB9LG9kZDpmdW5jdGlvbihnLGgpe3JldHVybiBoJTI9PT0xfSxsdDpmdW5jdGlvbihnLGgsbCl7cmV0dXJuIGg8bFszXS0wfSxndDpmdW5jdGlvbihnLGgsbCl7cmV0dXJuIGg|IjpmdW5jdGlvbihnLGgsbCl7dmFyIG09ZSsrLHE9ZDtpZih0eXBlb2YgaD09PSJzdHJpbmciJiYhL1xXLy50ZXN0KGgpKXt2YXIgcD1oPWgudG9Mb3dlckNhc2UoKTtxPWJ9cSgicHJldmlvdXNTaWJsaW5nIixoLG0sZyxwLGwpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oZyxoLGwpe2lmKHR5cGVvZiBoLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFsKXJldHVybihnPWguZ2V0RWxlbWVudEJ5SWQoZ1sxXSkpP1tnXTpbXX0sTkFNRTpmdW5jdGlvbihnLGgpe2lmKHR5cGVvZiBoLmdldEVsZW1lbnRzQnlOYW1lIT09InVuZGVmaW5lZCIpe3ZhciBsPVtdOwpoPWguZ2V0RWxlbWVudHNCeU5hbWUoZ1sxXSk7Zm9yKHZhciBtPTAscT1oLmxlbmd0aDttPHE7bSsrKWhbbV0uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1nWzFdJiZsLnB1c2goaFttXSk7cmV0dXJuIGwubGVuZ3RoPT09MD9udWxsOmx9fSxUQUc6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaC5nZXRFbGVtZW50c0J5VGFnTmFtZShnWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oZyxoLGwsbSxxLHApe2c9IiAiK2dbMV0ucmVwbGFjZSgvXFwvZywiIikrIiAiO2lmKHApcmV0dXJuIGc7cD0wO2Zvcih2YXIgdjsodj1oW3BdKSE9bnVsbDtwKyspaWYodilpZihxXih2LmNsYXNzTmFtZSYmKCIgIit2LmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXS9nLCIgIikuaW5kZXhPZihnKT49MCkpbHx8bS5wdXNoKHYpO2Vsc2UgaWYobCloW3BdPWZhbHNlO3JldHVybiBmYWxzZX0sSUQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGdbMV0ucmVwbGFjZSgvXFwvZywiIil9LFRBRzpmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS50b0xvd2VyQ2FzZSgpfSwKQ0hJTEQ6ZnVuY3Rpb24oZyl7aWYoZ1sxXT09PSJudGgiKXt2YXIgaD0vKC0|PTA7ZWxzZSBpZihxPT09Im5vdCIpe2g9CmhbM107bD0wO2ZvcihtPWgubGVuZ3RoO2w8bTtsKyspaWYoaFtsXT09PWcpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWVsc2Ugay5lcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitxKX0sQ0hJTEQ6ZnVuY3Rpb24oZyxoKXt2YXIgbD1oWzFdLG09Zztzd2l0Y2gobCl7Y2FzZSAib25seSI6Y2FzZSAiZmlyc3QiOmZvcig7bT1tLnByZXZpb3VzU2libGluZzspaWYobS5ub2RlVHlwZT09PTEpcmV0dXJuIGZhbHNlO2lmKGw9PT0iZmlyc3QiKXJldHVybiB0cnVlO209ZztjYXNlICJsYXN0Ijpmb3IoO209bS5uZXh0U2libGluZzspaWYobS5ub2RlVHlwZT09PTEpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO2Nhc2UgIm50aCI6bD1oWzJdO3ZhciBxPWhbM107aWYobD09PTEmJnE9PT0wKXJldHVybiB0cnVlO2g9aFswXTt2YXIgcD1nLnBhcmVudE5vZGU7aWYocCYmKHAuc2l6Y2FjaGUhPT1ofHwhZy5ub2RlSW5kZXgpKXt2YXIgdj0wO2ZvcihtPXAuZmlyc3RDaGlsZDttO209Cm0ubmV4dFNpYmxpbmcpaWYobS5ub2RlVHlwZT09PTEpbS5ub2RlSW5kZXg9Kyt2O3Auc2l6Y2FjaGU9aH1nPWcubm9kZUluZGV4LXE7cmV0dXJuIGw9PT0wP2c9PT0wOmclbD09PTAmJmcvbD49MH19LElEOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGcubm9kZVR5cGU9PT0xJiZnLmdldEF0dHJpYnV0ZSgiaWQiKT09PWh9LFRBRzpmdW5jdGlvbihnLGgpe3JldHVybiBoPT09IioiJiZnLm5vZGVUeXBlPT09MXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aH0sQ0xBU1M6ZnVuY3Rpb24oZyxoKXtyZXR1cm4oIiAiKyhnLmNsYXNzTmFtZXx8Zy5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihoKT4tMX0sQVRUUjpmdW5jdGlvbihnLGgpe3ZhciBsPWhbMV07Zz1uLmF0dHJIYW5kbGVbbF0|Zy5jb250YWlucyhoKTp0cnVlKX0seD1mdW5jdGlvbihnKXtyZXR1cm4oZz0oZz9nLm93bmVyRG9jdW1lbnR8fGc6MCkuZG9jdW1lbnRFbGVtZW50KT9nLm5vZGVOYW1lIT09IkhUTUwiOmZhbHNlfSxnYT1mdW5jdGlvbihnLGgpe3ZhciBsPVtdLG09IiIscTtmb3IoaD1oLm5vZGVUeXBlP1toXTpoO3E9bi5tYXRjaC5QU0VVRE8uZXhlYyhnKTspe20rPXFbMF07Zz1nLnJlcGxhY2Uobi5tYXRjaC5QU0VVRE8sIiIpfWc9bi5yZWxhdGl2ZVtnXT9nKyIqIjpnO3E9MDtmb3IodmFyIHA9aC5sZW5ndGg7cTxwO3ErKylrKGcsaFtxXSxsKTtyZXR1cm4gay5maWx0ZXIobSxsKX07Yy5maW5kPWs7Yy5leHByPWsuc2VsZWN0b3JzO2MuZXhwclsiOiJdPWMuZXhwci5maWx0ZXJzO2MudW5pcXVlPWsudW5pcXVlU29ydDtjLnRleHQ9YTtjLmlzWE1MRG9jPXg7Yy5jb250YWlucz1FfSkoKTt2YXIgZWI9L1VudGlsJC8sZmI9L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCmdiPS8sLztSPUFycmF5LnByb3RvdHlwZS5zbGljZTt2YXIgSWE9ZnVuY3Rpb24oYSxiLGQpe2lmKGMuaXNGdW5jdGlvbihiKSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZSxqKXtyZXR1cm4hIWIuY2FsbChlLGosZSk9PT1kfSk7ZWxzZSBpZihiLm5vZGVUeXBlKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PWI9PT1kfSk7ZWxzZSBpZih0eXBlb2YgYj09PSJzdHJpbmciKXt2YXIgZj1jLmdyZXAoYSxmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9KTtpZihVYS50ZXN0KGIpKXJldHVybiBjLmZpbHRlcihiLGYsIWQpO2Vsc2UgYj1jLmZpbHRlcihiLGYpfXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihlKXtyZXR1cm4gYy5pbkFycmF5KGUsYik|Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk|IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU|Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ|IiwiPC9zZWxlY3Q|IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU|PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk|IiwiPC9tYXA|IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA|PC90Ym9keT48Y29sZ3JvdXA|PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk|In0sRj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc|CmE6YisiPjwvIitkKyI|LTE6YyhmKS5pcyhlKSl7ZC5wdXNoKHtzZWxlY3RvcjppLGVsZW06Zn0pO2RlbGV0ZSBqW2ldfX1mPWYucGFyZW50Tm9kZX19cmV0dXJuIGR9dmFyIGs9Yy5leHByLm1hdGNoLlBPUy50ZXN0KGEpP2MoYSxifHx0aGlzLmNvbnRleHQpOm51bGw7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG4scil7Zm9yKDtyJiZyLm93bmVyRG9jdW1lbnQmJnIhPT1iOyl7aWYoaz9rLmluZGV4KHIpPi0xOmMocikuaXMoYSkpcmV0dXJuIHI7cj1yLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9KX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWF8fHR5cGVvZiBhPT09CiJzdHJpbmciKXJldHVybiBjLmluQXJyYXkodGhpc1swXSxhP2MoYSk6dGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpKTtyZXR1cm4gYy5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7YT10eXBlb2YgYT09PSJzdHJpbmciP2MoYSxifHx0aGlzLmNvbnRleHQpOmMubWFrZUFycmF5KGEpO2I9Yy5tZXJnZSh0aGlzLmdldCgpLGEpO3JldHVybiB0aGlzLnB1c2hTdGFjayhxYShhWzBdKXx8cWEoYlswXSk|YyhpLGJ8fHRoaXMuY29udGV4dCk6aSl9Zm9yKDtmJiZmLm93bmVyRG9jdW1lbnQmJmYhPT1iOyl7Zm9yKGkgaW4gail7ZT1qW2ldO2lmKGUuanF1ZXJ5P2UuaW5kZXgoZik|PTA9PT1kfSl9O2MuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZD0wLGY9MCxlPXRoaXMubGVuZ3RoO2Y8ZTtmKyspe2Q9Yi5sZW5ndGg7CmMuZmluZChhLHRoaXNbZl0sYik7aWYoZj4wKWZvcih2YXIgaj1kO2o8Yi5sZW5ndGg7aisrKWZvcih2YXIgaT0wO2k8ZDtpKyspaWYoYltpXT09PWJbal0pe2Iuc3BsaWNlKGotLSwxKTticmVha319cmV0dXJuIGJ9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1jKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihjLmNvbnRhaW5zKHRoaXMsYltkXSkpcmV0dXJuIHRydWV9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhJYSh0aGlzLGEsZmFsc2UpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKElhKHRoaXMsYSx0cnVlKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiZjLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7aWYoYy5pc0FycmF5KGEpKXt2YXIgZD1bXSxmPXRoaXNbMF0sZSxqPQp7fSxpO2lmKGYmJmEubGVuZ3RoKXtlPTA7Zm9yKHZhciBvPWEubGVuZ3RoO2U8bztlKyspe2k9YVtlXTtqW2ldfHwoaltpXT1jLmV4cHIubWF0Y2guUE9TLnRlc3QoaSk|LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLyxQU0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKSg|YjpjLnVuaXF1ZShiKSl9LGFuZFNlbGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5wcmV2T2JqZWN0KX19KTtjLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4oYT1hLnBhcmVudE5vZGUpJiZhLm5vZGVUeXBlIT09MTE|YTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsInBhcmVudE5vZGUiLApkKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciLGQpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGQpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLm5vZGVOYW1lKGEsImlmcmFtZSIpPwphLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OmMubWFrZUFycmF5KGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCxmKXt2YXIgZT1jLm1hcCh0aGlzLGIsZCk7ZWIudGVzdChhKXx8KGY9ZCk7aWYoZiYmdHlwZW9mIGY9PT0ic3RyaW5nIillPWMuZmlsdGVyKGYsZSk7ZT10aGlzLmxlbmd0aD4xP2MudW5pcXVlKGUpOmU7aWYoKHRoaXMubGVuZ3RoPjF8fGdiLnRlc3QoZikpJiZmYi50ZXN0KGEpKWU9ZS5yZXZlcnNlKCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUsYSxSLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfX0pO2MuZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpYT0iOm5vdCgiK2ErIikiO3JldHVybiBjLmZpbmQubWF0Y2hlcyhhLGIpfSxkaXI6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPVtdO2ZvcihhPWFbYl07YSYmYS5ub2RlVHlwZSE9PTkmJihkPT09d3x8YS5ub2RlVHlwZSE9PTF8fCFjKGEpLmlzKGQpKTspe2Eubm9kZVR5cGU9PT0KMSYmZi5wdXNoKGEpO2E9YVtiXX1yZXR1cm4gZn0sbnRoOmZ1bmN0aW9uKGEsYixkKXtiPWJ8fDE7Zm9yKHZhciBmPTA7YTthPWFbZF0paWYoYS5ub2RlVHlwZT09PTEmJisrZj09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W107YTthPWEubmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PTEmJmEhPT1iJiZkLnB1c2goYSk7cmV0dXJuIGR9fSk7dmFyIEphPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csVj0vXlxzKy8sS2E9Lyg8KFtcdzpdKylbXj5dKj8pXC8|OltePV18PVxzKi5jaGVja2VkLikvaSxNYT1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGhiLnRlc3QoZCk|XHcrOy8sdGE9LzxzY3JpcHR8PG9iamVjdHw8ZW1iZWR8PG9wdGlvbnw8c3R5bGUvaSx1YT0vY2hlY2tlZFxzKig|L2csaGI9L14oPzphcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSQvaSxMYT0vPChbXHc6XSspLyxpYj0vPHRib2R5L2ksamI9Lzx8JiM|cS5pZD09PW1bMV18fHR5cGVvZiBxLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmCnEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT1tWzFdP1txXTp3OltdfTtuLmZpbHRlci5JRD1mdW5jdGlvbihtLHEpe3ZhciBwPXR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBtLm5vZGVUeXBlPT09MSYmcCYmcC5ub2RlVmFsdWU9PT1xfX1sLnJlbW92ZUNoaWxkKGcpO2w9Zz1udWxsfSkoKTsoZnVuY3Rpb24oKXt2YXIgZz1zLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuYXBwZW5kQ2hpbGQocy5jcmVhdGVDb21tZW50KCIiKSk7aWYoZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wKW4uZmluZC5UQUc9ZnVuY3Rpb24oaCxsKXtsPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaFsxXSk7aWYoaFsxXT09PSIqIil7aD1bXTtmb3IodmFyIG09MDtsW21dO20rKylsW21dLm5vZGVUeXBlPT09MSYmaC5wdXNoKGxbbV0pO2w9aH1yZXR1cm4gbH07Zy5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iOwppZihnLmZpcnN0Q2hpbGQmJnR5cGVvZiBnLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlIT09InVuZGVmaW5lZCImJmcuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiluLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihoKXtyZXR1cm4gaC5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfTtnPW51bGx9KSgpO3MucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgZz1rLGg9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCEoaC5xdWVyeVNlbGVjdG9yQWxsJiZoLnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoPT09MCkpe2s9ZnVuY3Rpb24obSxxLHAsdil7cT1xfHxzO2lmKCF2JiZxLm5vZGVUeXBlPT09OSYmIXgocSkpdHJ5e3JldHVybiB6KHEucXVlcnlTZWxlY3RvckFsbChtKSxwKX1jYXRjaCh0KXt9cmV0dXJuIGcobSxxLHAsdil9O2Zvcih2YXIgbCBpbiBnKWtbbF09Z1tsXTtoPW51bGx9fSgpOwooZnVuY3Rpb24oKXt2YXIgZz1zLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7aWYoISghZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lfHxnLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0wKSl7Zy5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihnLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0xKXtuLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIik7bi5maW5kLkNMQVNTPWZ1bmN0aW9uKGgsbCxtKXtpZih0eXBlb2YgbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09InVuZGVmaW5lZCImJiFtKXJldHVybiBsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsxXSl9O2c9bnVsbH19fSkoKTt2YXIgRT1zLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGcsaCl7cmV0dXJuISEoZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoKSYxNil9OgpmdW5jdGlvbihnLGgpe3JldHVybiBnIT09aCYmKGcuY29udGFpbnM|KVwzfClccypcXS8sVEFHOi9eKCg|aTpjLmlzQXJyYXkobyk|dGhpcy50b0FycmF5KCk6YTwwP3RoaXMuc2xpY2UoYSlbMF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj1jKCk7Yy5pc0FycmF5KGEpP2JhLmFwcGx5KGYsYSk6Yy5tZXJnZShmLGEpO2YucHJldk9iamVjdD10aGlzO2YuY29udGV4dD10aGlzLmNvbnRleHQ7aWYoYj09PQoiZmluZCIpZi5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrZDtlbHNlIGlmKGIpZi5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIitiKyIoIitkKyIpIjtyZXR1cm4gZn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBjLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtjLmJpbmRSZWFkeSgpO2lmKGMuaXNSZWFkeSlhLmNhbGwocyxjKTtlbHNlIFEmJlEucHVzaChhKTtyZXR1cm4gdGhpc30sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSwrYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixSLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMubWFwKHRoaXMsCmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGEuY2FsbChiLGQsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fGMobnVsbCl9LHB1c2g6YmEsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9O2MuZm4uaW5pdC5wcm90b3R5cGU9Yy5mbjtjLmV4dGVuZD1jLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXXx8e30sYj0xLGQ9YXJndW1lbnRzLmxlbmd0aCxmPWZhbHNlLGUsaixpLG87aWYodHlwZW9mIGE9PT0iYm9vbGVhbiIpe2Y9YTthPWFyZ3VtZW50c1sxXXx8e307Yj0yfWlmKHR5cGVvZiBhIT09Im9iamVjdCImJiFjLmlzRnVuY3Rpb24oYSkpYT17fTtpZihkPT09Yil7YT10aGlzOy0tYn1mb3IoO2I8ZDtiKyspaWYoKGU9YXJndW1lbnRzW2JdKSE9bnVsbClmb3IoaiBpbiBlKXtpPWFbal07bz1lW2pdO2lmKGEhPT1vKWlmKGYmJm8mJihjLmlzUGxhaW5PYmplY3Qobyl8fGMuaXNBcnJheShvKSkpe2k9aSYmKGMuaXNQbGFpbk9iamVjdChpKXx8CmMuaXNBcnJheShpKSk|Yi5vd25lckRvY3VtZW50fHxiOnM7aWYoYT1YYS5leGVjKGEpKWlmKGMuaXNQbGFpbk9iamVjdChiKSl7YT1bcy5jcmVhdGVFbGVtZW50KGFbMV0pXTtjLmZuLmF0dHIuY2FsbChhLGIsdHJ1ZSl9ZWxzZSBhPVtmLmNyZWF0ZUVsZW1lbnQoYVsxXSldO2Vsc2V7YT1zYShbZFsxXV0sW2ZdKTthPShhLmNhY2hlYWJsZT9hLmZyYWdtZW50LmNsb25lTm9kZSh0cnVlKTphLmZyYWdtZW50KS5jaGlsZE5vZGVzfXJldHVybiBjLm1lcmdlKHRoaXMsYSl9ZWxzZXtpZihiPXMuZ2V0RWxlbWVudEJ5SWQoZFsyXSkpe2lmKGIuaWQhPT1kWzJdKXJldHVybiBULmZpbmQoYSk7dGhpcy5sZW5ndGg9MTt0aGlzWzBdPWJ9dGhpcy5jb250ZXh0PXM7dGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfWVsc2UgaWYoIWImJi9eXHcrJC8udGVzdChhKSl7dGhpcy5zZWxlY3Rvcj1hO3RoaXMuY29udGV4dD1zO2E9cy5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtyZXR1cm4gYy5tZXJnZSh0aGlzLAphKX1lbHNlIHJldHVybiFifHxiLmpxdWVyeT8oYnx8VCkuZmluZChhKTpjKGIpLmZpbmQoYSk7ZWxzZSBpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIFQucmVhZHkoYSk7aWYoYS5zZWxlY3RvciE9PXcpe3RoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcjt0aGlzLmNvbnRleHQ9YS5jb250ZXh0fXJldHVybiBjLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNC4yIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIFIuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw|KT8kLyxQPW5hdmlnYXRvci51c2VyQWdlbnQseGE9ZmFsc2UsUT1bXSxMLCQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxhYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGJhPUFycmF5LnByb3RvdHlwZS5wdXNoLFI9QXJyYXkucHJvdG90eXBlLnNsaWNlLHlhPUFycmF5LnByb3RvdHlwZS5pbmRleE9mO2MuZm49Yy5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZCxmO2lmKCFhKXJldHVybiB0aGlzO2lmKGEubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWE7dGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihhPT09ImJvZHkiJiYhYil7dGhpcy5jb250ZXh0PXM7dGhpc1swXT1zLmJvZHk7dGhpcy5zZWxlY3Rvcj0iYm9keSI7dGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09PSJzdHJpbmciKWlmKChkPVRhLmV4ZWMoYSkpJiYKKGRbMV18fCFiKSlpZihkWzFdKXtmPWI|W106e307YVtqXT1jLmV4dGVuZChmLGksbyl9ZWxzZSBpZihvIT09dylhW2pdPW99cmV0dXJuIGF9O2MuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGEpe0EuJD1TYTtpZihhKUEualF1ZXJ5PVJhO3JldHVybiBjfSxpc1JlYWR5OmZhbHNlLHJlYWR5OmZ1bmN0aW9uKCl7aWYoIWMuaXNSZWFkeSl7aWYoIXMuYm9keSlyZXR1cm4gc2V0VGltZW91dChjLnJlYWR5LDEzKTtjLmlzUmVhZHk9dHJ1ZTtpZihRKXtmb3IodmFyIGEsYj0wO2E9UVtiKytdOylhLmNhbGwocyxjKTtRPW51bGx9Yy5mbi50cmlnZ2VySGFuZGxlciYmYyhzKS50cmlnZ2VySGFuZGxlcigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCF4YSl7eGE9dHJ1ZTtpZihzLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXJldHVybiBjLnJlYWR5KCk7aWYocy5hZGRFdmVudExpc3RlbmVyKXtzLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLApMLGZhbHNlKTtBLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGMucmVhZHksZmFsc2UpfWVsc2UgaWYocy5hdHRhY2hFdmVudCl7cy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixMKTtBLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGMucmVhZHkpO3ZhciBhPWZhbHNlO3RyeXthPUEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGIpe31zLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYSYmbWEoKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiAkLmNhbGwoYSk9PT0iW29iamVjdCBGdW5jdGlvbl0ifSxpc0FycmF5OmZ1bmN0aW9uKGEpe3JldHVybiAkLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0ifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHwkLmNhbGwoYSkhPT0iW29iamVjdCBPYmplY3RdInx8YS5ub2RlVHlwZXx8YS5zZXRJbnRlcnZhbClyZXR1cm4gZmFsc2U7aWYoYS5jb25zdHJ1Y3RvciYmIWFhLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWFhLmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsCiJpc1Byb3RvdHlwZU9mIikpcmV0dXJuIGZhbHNlO3ZhciBiO2ZvcihiIGluIGEpO3JldHVybiBiPT09d3x8YWEuY2FsbChhLGIpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYTt9LHBhcnNlSlNPTjpmdW5jdGlvbihhKXtpZih0eXBlb2YgYSE9PSJzdHJpbmcifHwhYSlyZXR1cm4gbnVsbDthPWMudHJpbShhKTtpZigvXltcXSw6e31cc10qJC8udGVzdChhLnJlcGxhY2UoL1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZywiQCIpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0|XGQrKD86XC5cZCopPyg|Ly5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjphWzFdfHwiIix2ZXJzaW9uOmFbMl18fCIwIn19LGJyb3dzZXI6e319KTtQPWMudWFNYXRjaChQKTtpZihQLmJyb3dzZXIpe2MuYnJvd3NlcltQLmJyb3dzZXJdPXRydWU7Yy5icm93c2VyLnZlcnNpb249UC52ZXJzaW9ufWlmKGMuYnJvd3Nlci53ZWJraXQpYy5icm93c2VyLnNhZmFyaT0KdHJ1ZTtpZih5YSljLmluQXJyYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4geWEuY2FsbChiLGEpfTtUPWMocyk7aWYocy5hZGRFdmVudExpc3RlbmVyKUw9ZnVuY3Rpb24oKXtzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEwsZmFsc2UpO2MucmVhZHkoKX07ZWxzZSBpZihzLmF0dGFjaEV2ZW50KUw9ZnVuY3Rpb24oKXtpZihzLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXtzLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEwpO2MucmVhZHkoKX19OyhmdW5jdGlvbigpe2Muc3VwcG9ydD17fTt2YXIgYT1zLmRvY3VtZW50RWxlbWVudCxiPXMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZD1zLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGY9InNjcmlwdCIrSigpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZC5pbm5lckhUTUw9IiA8bGluay8|Oi4qPyBydjooW1x3Ll0rKSk|YmEuY2FsbChiLGEpOmMubWVyZ2UoYixhKTtyZXR1cm4gYn0saW5BcnJheTpmdW5jdGlvbihhLGIpe2lmKGIuaW5kZXhPZilyZXR1cm4gYi5pbmRleE9mKGEpO2Zvcih2YXIgZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdPT09CmEpcmV0dXJuIGQ7cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YS5sZW5ndGgsZj0wO2lmKHR5cGVvZiBiLmxlbmd0aD09PSJudW1iZXIiKWZvcih2YXIgZT1iLmxlbmd0aDtmPGU7ZisrKWFbZCsrXT1iW2ZdO2Vsc2UgZm9yKDtiW2ZdIT09dzspYVtkKytdPWJbZisrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGY9W10sZT0wLGo9YS5sZW5ndGg7ZTxqO2UrKykhZCE9PSFiKGFbZV0sZSkmJmYucHVzaChhW2VdKTtyZXR1cm4gZn0sbWFwOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGY9W10sZSxqPTAsaT1hLmxlbmd0aDtqPGk7aisrKXtlPWIoYVtqXSxqLGQpO2lmKGUhPW51bGwpZltmLmxlbmd0aF09ZX1yZXR1cm4gZi5jb25jYXQuYXBwbHkoW10sZil9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIsZCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpaWYodHlwZW9mIGI9PT0ic3RyaW5nIil7ZD1hO2E9ZFtiXTtiPXd9ZWxzZSBpZihiJiYKIWMuaXNGdW5jdGlvbihiKSl7ZD1iO2I9d31pZighYiYmYSliPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoZHx8dGhpcyxhcmd1bWVudHMpfTtpZihhKWIuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxiLmd1aWR8fGMuZ3VpZCsrO3JldHVybiBifSx1YU1hdGNoOmZ1bmN0aW9uKGEpe2E9YS50b0xvd2VyQ2FzZSgpO2E9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoYSl8fCEvY29tcGF0aWJsZS8udGVzdChhKSYmLyhtb3ppbGxhKSg|OltlRV1bK1wtXT9cZCspPy9nLCJdIikucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCIiKSkpcmV0dXJuIEEuSlNPTiYmQS5KU09OLnBhcnNlP0EuSlNPTi5wYXJzZShhKToobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIisKYSkpKCk7ZWxzZSBjLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYSl7aWYoYSYmVmEudGVzdChhKSl7dmFyIGI9cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxzLmRvY3VtZW50RWxlbWVudCxkPXMuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2lmKGMuc3VwcG9ydC5zY3JpcHRFdmFsKWQuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZShhKSk7ZWxzZSBkLnRleHQ9YTtiLmluc2VydEJlZm9yZShkLGIuZmlyc3RDaGlsZCk7Yi5yZW1vdmVDaGlsZChkKX19LG5vZGVOYW1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PWIudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihhLGIsZCl7dmFyIGYsZT0wLGo9YS5sZW5ndGgsaT1qPT09d3x8Yy5pc0Z1bmN0aW9uKGEpO2lmKGQpaWYoaSlmb3IoZiBpbiBhKXtpZihiLmFwcGx5KGFbZl0sCmQpPT09ZmFsc2UpYnJlYWt9ZWxzZSBmb3IoO2U8ajspe2lmKGIuYXBwbHkoYVtlKytdLGQpPT09ZmFsc2UpYnJlYWt9ZWxzZSBpZihpKWZvcihmIGluIGEpe2lmKGIuY2FsbChhW2ZdLGYsYVtmXSk9PT1mYWxzZSlicmVha31lbHNlIGZvcihkPWFbMF07ZTxqJiZiLmNhbGwoZCxlLGQpIT09ZmFsc2U7ZD1hWysrZV0pO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybihhfHwiIikucmVwbGFjZShXYSwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe2I9Ynx8W107aWYoYSE9bnVsbClhLmxlbmd0aD09bnVsbHx8dHlwZW9mIGE9PT0ic3RyaW5nInx8Yy5pc0Z1bmN0aW9uKGEpfHx0eXBlb2YgYSE9PSJmdW5jdGlvbiImJmEuc2V0SW50ZXJ2YWw|KD86PFwvXDE|KVtePl0qJHxeIyhbXHctXSspJC8sVWE9L14uW146I1xbXC4sXSokLyxWYT0vXFMvLApXYT0vXihcc3xcdTAwQTApK3woXHN8XHUwMEEwKSskL2csWGE9L148KFx3KylccypcLz8|data|src|createElement|var|text|html|YSsiLiI6IiIpK2IucmVwbGFjZSgvXC4vZywiYCIpLnJlcGxhY2UoLyAvZywKIiYiKX1mdW5jdGlvbiBxYShhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gcmEoYSxiKXt2YXIgZD0wO2IuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWU9PT0oYVtkXSYmYVtkXS5ub2RlTmFtZSkpe3ZhciBmPWMuZGF0YShhW2QrK10pLGU9Yy5kYXRhKHRoaXMsZik7aWYoZj1mJiZmLmV2ZW50cyl7ZGVsZXRlIGUuaGFuZGxlO2UuZXZlbnRzPXt9O2Zvcih2YXIgaiBpbiBmKWZvcih2YXIgaSBpbiBmW2pdKWMuZXZlbnQuYWRkKHRoaXMsaixmW2pdW2ldLGZbal1baV0uZGF0YSl9fX0pfWZ1bmN0aW9uIHNhKGEsYixkKXt2YXIgZixlLGo7Yj1iJiZiWzBdP2JbMF0ub3duZXJEb2N1bWVudHx8YlswXTpzO2lmKGEubGVuZ3RoPT09MSYmdHlwZW9mIGFbMF09PT0ic3RyaW5nIiYmYVswXS5sZW5ndGg8NTEyJiZiPT09cyYmIXRhLnRlc3QoYVswXSkmJihjLnN1cHBvcnQuY2hlY2tDbG9uZXx8IXVhLnRlc3QoYVswXSkpKXtlPQp0cnVlO2lmKGo9Yy5mcmFnbWVudHNbYVswXV0paWYoaiE9PTEpZj1qfWlmKCFmKXtmPWIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuY2xlYW4oYSxiLGYsZCl9aWYoZSljLmZyYWdtZW50c1thWzBdXT1qP2Y6MTtyZXR1cm57ZnJhZ21lbnQ6ZixjYWNoZWFibGU6ZX19ZnVuY3Rpb24gSyhhLGIpe3ZhciBkPXt9O2MuZWFjaCh2YS5jb25jYXQuYXBwbHkoW10sdmEuc2xpY2UoMCxiKSksZnVuY3Rpb24oKXtkW3RoaXNdPWF9KTtyZXR1cm4gZH1mdW5jdGlvbiB3YShhKXtyZXR1cm4ic2Nyb2xsVG8iaW4gYSYmYS5kb2N1bWVudD9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OmZhbHNlfXZhciBjPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBjLmZuLmluaXQoYSxiKX0sUmE9QS5qUXVlcnksU2E9QS4kLHM9QS5kb2N1bWVudCxULFRhPS9eW148XSooPFtcd1xXXSs|Zi5wdXNoKGkuc2VsZWN0b3IpOnUuc3BsaWNlKGstLSwxKX1qPWMoYS50YXJnZXQpLmNsb3Nlc3QoZixhLmN1cnJlbnRUYXJnZXQpO249MDtmb3Iocj0Kai5sZW5ndGg7bjxyO24rKylmb3Ioaz0wO2s8dS5sZW5ndGg7aysrKXtpPXVba107aWYoaltuXS5zZWxlY3Rvcj09PWkuc2VsZWN0b3Ipe289altuXS5lbGVtO2Y9bnVsbDtpZihpLnByZVR5cGU9PT0ibW91c2VlbnRlciJ8fGkucHJlVHlwZT09PSJtb3VzZWxlYXZlIilmPWMoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGkuc2VsZWN0b3IpWzBdO2lmKCFmfHxmIT09bylkLnB1c2goe2VsZW06byxoYW5kbGVPYmo6aX0pfX1uPTA7Zm9yKHI9ZC5sZW5ndGg7bjxyO24rKyl7aj1kW25dO2EuY3VycmVudFRhcmdldD1qLmVsZW07YS5kYXRhPWouaGFuZGxlT2JqLmRhdGE7YS5oYW5kbGVPYmo9ai5oYW5kbGVPYmo7aWYoai5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoai5lbGVtLGUpPT09ZmFsc2Upe2I9ZmFsc2U7YnJlYWt9fXJldHVybiBifX1mdW5jdGlvbiBwYShhLGIpe3JldHVybiJsaXZlLiIrKGEmJmEhPT0iKiI|aWYgKHdpbmRvdy5qUXVlcnkgIT0gJ3VuZGVmaW5lZCcpewooZnVuY3Rpb24oQSx3KXtmdW5jdGlvbiBtYSgpe2lmKCFjLmlzUmVhZHkpe3RyeXtzLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3NldFRpbWVvdXQobWEsMSk7cmV0dXJufWMucmVhZHkoKX19ZnVuY3Rpb24gUWEoYSxiKXtiLnNyYz9jLmFqYXgoe3VybDpiLnNyYyxhc3luYzpmYWxzZSxkYXRhVHlwZToic2NyaXB0In0pOmMuZ2xvYmFsRXZhbChiLnRleHR8fGIudGV4dENvbnRlbnR8fGIuaW5uZXJIVE1MfHwiIik7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gWChhLGIsZCxmLGUsail7dmFyIGk9YS5sZW5ndGg7aWYodHlwZW9mIGI9PT0ib2JqZWN0Iil7Zm9yKHZhciBvIGluIGIpWChhLG8sYltvXSxmLGUsZCk7cmV0dXJuIGF9aWYoZCE9PXcpe2Y9IWomJmYmJmMuaXNGdW5jdGlvbihkKTtmb3Iobz0wO288aTtvKyspZShhW29dLGIsZj9kLmNhbGwoYVtvXSxvLGUoYVtvXSxiKSk6ZCxqKTtyZXR1cm4gYX1yZXR1cm4gaT8KZShhWzBdLGIpOnd9ZnVuY3Rpb24gSigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfWZ1bmN0aW9uIFkoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gWigpe3JldHVybiB0cnVlfWZ1bmN0aW9uIG5hKGEsYixkKXtkWzBdLnR5cGU9YTtyZXR1cm4gYy5ldmVudC5oYW5kbGUuYXBwbHkoYixkKX1mdW5jdGlvbiBvYShhKXt2YXIgYixkPVtdLGY9W10sZT1hcmd1bWVudHMsaixpLG8sayxuLHI7aT1jLmRhdGEodGhpcywiZXZlbnRzIik7aWYoIShhLmxpdmVGaXJlZD09PXRoaXN8fCFpfHwhaS5saXZlfHxhLmJ1dHRvbiYmYS50eXBlPT09ImNsaWNrIikpe2EubGl2ZUZpcmVkPXRoaXM7dmFyIHU9aS5saXZlLnNsaWNlKDApO2ZvcihrPTA7azx1Lmxlbmd0aDtrKyspe2k9dVtrXTtpLm9yaWdUeXBlLnJlcGxhY2UoTywiIik9PT1hLnR5cGU|base64|PHRhYmxlPjwvdGFibGU|PGEgaHJlZj0nL2EnIHN0eWxlPSdjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E|W2hdOmsocC5zaGlmdCgpLGgpO3AubGVuZ3RoOyl7Zz1wLnNoaWZ0KCk7aWYobi5yZWxhdGl2ZVtnXSlnKz1wLnNoaWZ0KCk7CnQ9Z2EoZyx0KX1lbHNle2lmKCFtJiZwLmxlbmd0aD4xJiZoLm5vZGVUeXBlPT09OSYmIU0mJm4ubWF0Y2guSUQudGVzdChwWzBdKSYmIW4ubWF0Y2guSUQudGVzdChwW3AubGVuZ3RoLTFdKSl7dj1rLmZpbmQocC5zaGlmdCgpLGgsTSk7aD12LmV4cHI|MSYmci5leGVjKGcpKWlmKHAubGVuZ3RoPT09MiYmbi5yZWxhdGl2ZVtwWzBdXSl0PWdhKHBbMF0rcFsxXSxoKTtlbHNlIGZvcih0PW4ucmVsYXRpdmVbcFswXV0|K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLAplPTAsaj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGk9ZmFsc2Usbz10cnVlO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtvPWZhbHNlO3JldHVybiAwfSk7dmFyIGs9ZnVuY3Rpb24oZyxoLGwsbSl7bD1sfHxbXTt2YXIgcT1oPWh8fHM7aWYoaC5ub2RlVHlwZSE9PTEmJmgubm9kZVR5cGUhPT05KXJldHVybltdO2lmKCFnfHx0eXBlb2YgZyE9PSJzdHJpbmciKXJldHVybiBsO2Zvcih2YXIgcD1bXSx2LHQseSxTLEg9dHJ1ZSxNPXgoaCksST1nOyhmLmV4ZWMoIiIpLHY9Zi5leGVjKEkpKSE9PW51bGw7KXtJPXZbM107cC5wdXNoKHZbMV0pO2lmKHZbMl0pe1M9dlszXTticmVha319aWYocC5sZW5ndGg|K34sKFxbXFxdKykrfFs|ay5maWx0ZXIodi5leHByLHYuc2V0KVswXTp2LnNldFswXX1pZihoKXt2PW0|e2V4cHI6cC5wb3AoKSxzZXQ6eihtKX06ay5maW5kKHAucG9wKCkscC5sZW5ndGg9PT0xJiYocFswXT09PSJ|Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtGLm9wdGdyb3VwPUYub3B0aW9uO0YudGJvZHk9Ri50Zm9vdD1GLmNvbGdyb3VwPUYuY2FwdGlvbj1GLnRoZWFkO0YudGg9Ri50ZDtpZighYy5zdXBwb3J0Lmh0bWxTZXJpYWxpemUpRi5fZGVmYXVsdD1bMSwiZGl2PGRpdj4iLCI8L2Rpdj4iXTtjLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD0KYyh0aGlzKTtkLnRleHQoYS5jYWxsKHRoaXMsYixkLnRleHQoKSkpfSk7aWYodHlwZW9mIGEhPT0ib2JqZWN0IiYmYSE9PXcpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8cykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBjLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCl7Yyh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGQpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWMoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKHRydWUpO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSk7Yi5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGQ9dGhpcztkLmZpcnN0Q2hpbGQmJmQuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTE7KWQ9ZC5maXJzdENoaWxkO3JldHVybiBkfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSwKd3JhcElubmVyOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2ModGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1jKHRoaXMpLGQ9Yi5jb250ZW50cygpO2QubGVuZ3RoP2Qud3JhcEFsbChhKTpiLmFwcGVuZChhKX0pfSx3cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjKHRoaXMpLndyYXBBbGwoYSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Mubm9kZU5hbWUodGhpcywiYm9keSIpfHxjKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLHRydWUsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0sCnByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oYil7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLHRoaXMpfSk7ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT1jKGFyZ3VtZW50c1swXSk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oYil7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLAp0aGlzLm5leHRTaWJsaW5nKX0pO2Vsc2UgaWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9dGhpcy5wdXNoU3RhY2sodGhpcywiYWZ0ZXIiLGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsYyhhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9MCxmOyhmPXRoaXNbZF0pIT1udWxsO2QrKylpZighYXx8Yy5maWx0ZXIoYSxbZl0pLmxlbmd0aCl7aWYoIWImJmYubm9kZVR5cGU9PT0xKXtjLmNsZWFuRGF0YShmLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO2MuY2xlYW5EYXRhKFtmXSl9Zi5wYXJlbnROb2RlJiZmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZil9cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspZm9yKGIubm9kZVR5cGU9PT0xJiZjLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpOwpyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tYXAoZnVuY3Rpb24oKXtpZighYy5zdXBwb3J0Lm5vQ2xvbmVFdmVudCYmIWMuaXNYTUxEb2ModGhpcykpe3ZhciBkPXRoaXMub3V0ZXJIVE1MLGY9dGhpcy5vd25lckRvY3VtZW50O2lmKCFkKXtkPWYuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5hcHBlbmRDaGlsZCh0aGlzLmNsb25lTm9kZSh0cnVlKSk7ZD1kLmlubmVySFRNTH1yZXR1cm4gYy5jbGVhbihbZC5yZXBsYWNlKEphLCIiKS5yZXBsYWNlKC89KFtePSInPlxzXStcLyk|OihcUz89KVxzKihbJyJdKikoLio|Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKVxzKig|Inx8cFswXT09PSIrIikmJmgucGFyZW50Tm9kZT9oLnBhcmVudE5vZGU6aCxNKTt0PXYuZXhwcj9rLmZpbHRlcih2LmV4cHIsdi5zZXQpOnYuc2V0O2lmKHAubGVuZ3RoPjApeT16KHQpO2Vsc2UgSD1mYWxzZTtmb3IoO3AubGVuZ3RoOyl7dmFyIEQ9cC5wb3AoKTt2PUQ7aWYobi5yZWxhdGl2ZVtEXSl2PXAucG9wKCk7ZWxzZSBEPSIiO2lmKHY9PW51bGwpdj1oO24ucmVsYXRpdmVbRF0oeSx2LE0pfX1lbHNlIHk9W119eXx8KHk9dCk7eXx8ay5lcnJvcihEfHwKZyk7aWYoai5jYWxsKHkpPT09IltvYmplY3QgQXJyYXldIilpZihIKWlmKGgmJmgubm9kZVR5cGU9PT0xKWZvcihnPTA7eVtnXSE9bnVsbDtnKyspe2lmKHlbZ10mJih5W2ddPT09dHJ1ZXx8eVtnXS5ub2RlVHlwZT09PTEmJkUoaCx5W2ddKSkpbC5wdXNoKHRbZ10pfWVsc2UgZm9yKGc9MDt5W2ddIT1udWxsO2crKyl5W2ddJiZ5W2ddLm5vZGVUeXBlPT09MSYmbC5wdXNoKHRbZ10pO2Vsc2UgbC5wdXNoLmFwcGx5KGwseSk7ZWxzZSB6KHksbCk7aWYoUyl7ayhTLHEsbCxtKTtrLnVuaXF1ZVNvcnQobCl9cmV0dXJuIGx9O2sudW5pcXVlU29ydD1mdW5jdGlvbihnKXtpZihCKXtpPW87Zy5zb3J0KEIpO2lmKGkpZm9yKHZhciBoPTE7aDxnLmxlbmd0aDtoKyspZ1toXT09PWdbaC0xXSYmZy5zcGxpY2UoaC0tLDEpfXJldHVybiBnfTtrLm1hdGNoZXM9ZnVuY3Rpb24oZyxoKXtyZXR1cm4gayhnLG51bGwsbnVsbCxoKX07ay5maW5kPWZ1bmN0aW9uKGcsaCxsKXt2YXIgbSxxO2lmKCFnKXJldHVybltdOwpmb3IodmFyIHA9MCx2PW4ub3JkZXIubGVuZ3RoO3A8djtwKyspe3ZhciB0PW4ub3JkZXJbcF07aWYocT1uLmxlZnRNYXRjaFt0XS5leGVjKGcpKXt2YXIgeT1xWzFdO3Euc3BsaWNlKDEsMSk7aWYoeS5zdWJzdHIoeS5sZW5ndGgtMSkhPT0iXFwiKXtxWzFdPShxWzFdfHwiIikucmVwbGFjZSgvXFwvZywiIik7bT1uLmZpbmRbdF0ocSxoLGwpO2lmKG0hPW51bGwpe2c9Zy5yZXBsYWNlKG4ubWF0Y2hbdF0sIiIpO2JyZWFrfX19fW18fChtPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7cmV0dXJue3NldDptLGV4cHI6Z319O2suZmlsdGVyPWZ1bmN0aW9uKGcsaCxsLG0pe2Zvcih2YXIgcT1nLHA9W10sdj1oLHQseSxTPWgmJmhbMF0mJngoaFswXSk7ZyYmaC5sZW5ndGg7KXtmb3IodmFyIEggaW4gbi5maWx0ZXIpaWYoKHQ9bi5sZWZ0TWF0Y2hbSF0uZXhlYyhnKSkhPW51bGwmJnRbMl0pe3ZhciBNPW4uZmlsdGVyW0hdLEksRDtEPXRbMV07eT1mYWxzZTt0LnNwbGljZSgxLDEpO2lmKEQuc3Vic3RyKEQubGVuZ3RoLQoxKSE9PSJcXCIpe2lmKHY9PT1wKXA9W107aWYobi5wcmVGaWx0ZXJbSF0paWYodD1uLnByZUZpbHRlcltIXSh0LHYsbCxwLG0sUykpe2lmKHQ9PT10cnVlKWNvbnRpbnVlfWVsc2UgeT1JPXRydWU7aWYodClmb3IodmFyIFU9MDsoRD12W1VdKSE9bnVsbDtVKyspaWYoRCl7ST1NKEQsdCxVLHYpO3ZhciBIYT1tXiEhSTtpZihsJiZJIT1udWxsKWlmKEhhKXk9dHJ1ZTtlbHNlIHZbVV09ZmFsc2U7ZWxzZSBpZihIYSl7cC5wdXNoKEQpO3k9dHJ1ZX19aWYoSSE9PXcpe2x8fCh2PXApO2c9Zy5yZXBsYWNlKG4ubWF0Y2hbSF0sIiIpO2lmKCF5KXJldHVybltdO2JyZWFrfX19aWYoZz09PXEpaWYoeT09bnVsbClrLmVycm9yKGcpO2Vsc2UgYnJlYWs7cT1nfXJldHVybiB2fTtrLmVycm9yPWZ1bmN0aW9uKGcpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZzt9O3ZhciBuPWsuc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspLywKQ0xBU1M6L1wuKCg|dGhpczpjKHRoaXMuY29udGV4dCk7aWYoYy5pc0Z1bmN0aW9uKGYpKXtlPWY7Zj13fWZvcihkPShkfHwiIikuc3BsaXQoIiAiKTsoaT1kW28rK10pIT1udWxsOyl7aj1PLmV4ZWMoaSk7az0iIjtpZihqKXtrPWpbMF07aT1pLnJlcGxhY2UoTywiIil9aWYoaT09PSJob3ZlciIpZC5wdXNoKCJtb3VzZWVudGVyIitrLCJtb3VzZWxlYXZlIitrKTtlbHNle249aTtpZihpPT09ImZvY3VzInx8aT09PSJibHVyIil7ZC5wdXNoKEdhW2ldK2spO2krPWt9ZWxzZSBpPShHYVtpXXx8aSkraztiPT09ImxpdmUiP3UuZWFjaChmdW5jdGlvbigpe2MuZXZlbnQuYWRkKHRoaXMscGEoaSxyKSx7ZGF0YTpmLHNlbGVjdG9yOnIsaGFuZGxlcjplLG9yaWdUeXBlOmksb3JpZ0hhbmRsZXI6ZSxwcmVUeXBlOm59KX0pOnUudW5iaW5kKHBhKGksciksZSl9fXJldHVybiB0aGlzfX0pO2MuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciIuc3BsaXQoIiAiKSwKZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQpe3JldHVybiBkP3RoaXMuYmluZChiLGQpOnRoaXMudHJpZ2dlcihiKX07aWYoYy5hdHRyRm4pYy5hdHRyRm5bYl09dHJ1ZX0pO0EuYXR0YWNoRXZlbnQmJiFBLmFkZEV2ZW50TGlzdGVuZXImJkEuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBjLmNhY2hlKWlmKGMuY2FjaGVbYV0uaGFuZGxlKXRyeXtjLmV2ZW50LnJlbW92ZShjLmNhY2hlW2FdLmhhbmRsZS5lbGVtKX1jYXRjaChiKXt9fSk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShnKXtmb3IodmFyIGg9IiIsbCxtPTA7Z1ttXTttKyspe2w9Z1ttXTtpZihsLm5vZGVUeXBlPT09M3x8bC5ub2RlVHlwZT09PTQpaCs9bC5ub2RlVmFsdWU7ZWxzZSBpZihsLm5vZGVUeXBlIT09OCloKz1hKGwuY2hpbGROb2Rlcyl9cmV0dXJuIGh9ZnVuY3Rpb24gYihnLGgsbCxtLHEscCl7cT0wO2Zvcih2YXIgdj1tLmxlbmd0aDtxPHY7cSsrKXt2YXIgdD1tW3FdOwppZih0KXt0PXRbZ107Zm9yKHZhciB5PWZhbHNlO3Q7KXtpZih0LnNpemNhY2hlPT09bCl7eT1tW3Quc2l6c2V0XTticmVha31pZih0Lm5vZGVUeXBlPT09MSYmIXApe3Quc2l6Y2FjaGU9bDt0LnNpenNldD1xfWlmKHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWgpe3k9dDticmVha310PXRbZ119bVtxXT15fX19ZnVuY3Rpb24gZChnLGgsbCxtLHEscCl7cT0wO2Zvcih2YXIgdj1tLmxlbmd0aDtxPHY7cSsrKXt2YXIgdD1tW3FdO2lmKHQpe3Q9dFtnXTtmb3IodmFyIHk9ZmFsc2U7dDspe2lmKHQuc2l6Y2FjaGU9PT1sKXt5PW1bdC5zaXpzZXRdO2JyZWFrfWlmKHQubm9kZVR5cGU9PT0xKXtpZighcCl7dC5zaXpjYWNoZT1sO3Quc2l6c2V0PXF9aWYodHlwZW9mIGghPT0ic3RyaW5nIil7aWYodD09PWgpe3k9dHJ1ZTticmVha319ZWxzZSBpZihrLmZpbHRlcihoLFt0XSkubGVuZ3RoPjApe3k9dDticmVha319dD10W2ddfW1bcV09eX19fXZhciBmPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXltcXSciXSspK1xdfFxcLnxbXiA|dGhpcy51bmJpbmQoImxpdmUiKTp0aGlzLmRpZShiLG51bGwsZCxhKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSl7YT1jLkV2ZW50KGEpO2EucHJldmVudERlZmF1bHQoKTthLnN0b3BQcm9wYWdhdGlvbigpO2MuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSk7cmV0dXJuIGEucmVzdWx0fX0sCnRvZ2dsZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9YXJndW1lbnRzLGQ9MTtkPGIubGVuZ3RoOyljLnByb3h5KGEsYltkKytdKTtyZXR1cm4gdGhpcy5jbGljayhjLnByb3h5KGEsZnVuY3Rpb24oZil7dmFyIGU9KGMuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQpfHwwKSVkO2MuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKTtmLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHxmYWxzZX0pKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIEdhPXtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQiLG1vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifTtjLmVhY2goWyJsaXZlIiwiZGllIl0sZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZixlLGope3ZhciBpLG89MCxrLG4scj1qfHx0aGlzLnNlbGVjdG9yLAp1PWo|Yi52YWx1ZTpiYi50ZXN0KGEubm9kZU5hbWUpfHxjYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY|YVtiXTphfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe2lmKCEoYS5ub2RlTmFtZSYmYy5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpe2E9YT09QT96YTphO3ZhciBkPWFbR10sZj1jLmNhY2hlLGU9ZltkXTtpZihiKXtpZihlKXtkZWxldGUgZVtiXTtjLmlzRW1wdHlPYmplY3QoZSkmJmMucmVtb3ZlRGF0YShhKX19ZWxzZXtpZihjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbylkZWxldGUgYVtjLmV4cGFuZG9dOwplbHNlIGEucmVtb3ZlQXR0cmlidXRlJiZhLnJlbW92ZUF0dHJpYnV0ZShjLmV4cGFuZG8pO2RlbGV0ZSBmW2RdfX19fSk7Yy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09PSJ1bmRlZmluZWQiJiZ0aGlzLmxlbmd0aClyZXR1cm4gYy5kYXRhKHRoaXNbMF0pO2Vsc2UgaWYodHlwZW9mIGE9PT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kYXRhKHRoaXMsYSl9KTt2YXIgZD1hLnNwbGl0KCIuIik7ZFsxXT1kWzFdPyIuIitkWzFdOiIiO2lmKGI9PT13KXt2YXIgZj10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitkWzFdKyIhIixbZFswXV0pO2lmKGY9PT13JiZ0aGlzLmxlbmd0aClmPWMuZGF0YSh0aGlzWzBdLGEpO3JldHVybiBmPT09dyYmZFsxXT90aGlzLmRhdGEoZFswXSk6Zn1lbHNlIHJldHVybiB0aGlzLnRyaWdnZXIoInNldERhdGEiK2RbMV0rIiEiLFtkWzBdLGJdKS5lYWNoKGZ1bmN0aW9uKCl7Yy5kYXRhKHRoaXMsCmEsYil9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KTtjLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGQpe2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSI7dmFyIGY9Yy5kYXRhKGEsYik7aWYoIWQpcmV0dXJuIGZ8fFtdO2lmKCFmfHxjLmlzQXJyYXkoZCkpZj1jLmRhdGEoYSxiLGMubWFrZUFycmF5KGQpKTtlbHNlIGYucHVzaChkKTtyZXR1cm4gZn19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGQ9Yy5xdWV1ZShhLGIpLGY9ZC5zaGlmdCgpO2lmKGY9PT0iaW5wcm9ncmVzcyIpZj1kLnNoaWZ0KCk7aWYoZil7Yj09PSJmeCImJmQudW5zaGlmdCgiaW5wcm9ncmVzcyIpO2YuY2FsbChhLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKGEsYil9KX19fSk7Yy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPT0ic3RyaW5nIil7Yj1hO2E9ImZ4In1pZihiPT09CncpcmV0dXJuIGMucXVldWUodGhpc1swXSxhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Yy5xdWV1ZSh0aGlzLGEsYik7YT09PSJmeCImJmRbMF0hPT0iaW5wcm9ncmVzcyImJmMuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1jLmZ4P2MuZnguc3BlZWRzW2FdfHxhOmE7Yj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmRlcXVldWUoZCxiKX0sYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX19KTt2YXIgQWE9L1tcblx0XS9nLGNhPS9ccysvLFphPS9cci9nLCRhPS9ocmVmfHNyY3xzdHlsZS8sYWI9LyhidXR0b258aW5wdXQpL2ksYmI9LyhidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkvaSwKY2I9L14oYXxhcmVhKSQvaSxCYT0vcmFkaW98Y2hlY2tib3gvO2MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFgodGhpcyxhLGIsdHJ1ZSxjLmF0dHIpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmF0dHIodGhpcyxhLCIiKTt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYSl9KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIHI9Yyh0aGlzKTtyLmFkZENsYXNzKGEuY2FsbCh0aGlzLG4sci5hdHRyKCJjbGFzcyIpKSl9KTtpZihhJiZ0eXBlb2YgYT09PSJzdHJpbmciKWZvcih2YXIgYj0oYXx8IiIpLnNwbGl0KGNhKSxkPTAsZj10aGlzLmxlbmd0aDtkPGY7ZCsrKXt2YXIgZT10aGlzW2RdO2lmKGUubm9kZVR5cGU9PT0xKWlmKGUuY2xhc3NOYW1lKXtmb3IodmFyIGo9IiAiK2UuY2xhc3NOYW1lKyIgIiwKaT1lLmNsYXNzTmFtZSxvPTAsaz1iLmxlbmd0aDtvPGs7bysrKWlmKGouaW5kZXhPZigiICIrYltvXSsiICIpPDApaSs9IiAiK2Jbb107ZS5jbGFzc05hbWU9Yy50cmltKGkpfWVsc2UgZS5jbGFzc05hbWU9YX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oayl7dmFyIG49Yyh0aGlzKTtuLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGssbi5hdHRyKCJjbGFzcyIpKSl9KTtpZihhJiZ0eXBlb2YgYT09PSJzdHJpbmcifHxhPT09dylmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChjYSksZD0wLGY9dGhpcy5sZW5ndGg7ZDxmO2QrKyl7dmFyIGU9dGhpc1tkXTtpZihlLm5vZGVUeXBlPT09MSYmZS5jbGFzc05hbWUpaWYoYSl7Zm9yKHZhciBqPSgiICIrZS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKEFhLCIgIiksaT0wLG89Yi5sZW5ndGg7aTxvO2krKylqPWoucmVwbGFjZSgiICIrYltpXSsiICIsCiIgIik7ZS5jbGFzc05hbWU9Yy50cmltKGopfWVsc2UgZS5jbGFzc05hbWU9IiJ9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGEsZj10eXBlb2YgYj09PSJib29sZWFuIjtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgaj1jKHRoaXMpO2oudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsZSxqLmF0dHIoImNsYXNzIiksYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoZD09PSJzdHJpbmciKWZvcih2YXIgZSxqPTAsaT1jKHRoaXMpLG89YixrPWEuc3BsaXQoY2EpO2U9a1tqKytdOyl7bz1mP286IWkuaGFzQ2xhc3MoZSk7aVtvPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihkPT09InVuZGVmaW5lZCJ8fGQ9PT0iYm9vbGVhbiIpe3RoaXMuY2xhc3NOYW1lJiZjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpO3RoaXMuY2xhc3NOYW1lPQp0aGlzLmNsYXNzTmFtZXx8YT09PWZhbHNlPyIiOmMuZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXthPSIgIithKyIgIjtmb3IodmFyIGI9MCxkPXRoaXMubGVuZ3RoO2I8ZDtiKyspaWYoKCIgIit0aGlzW2JdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoQWEsIiAiKS5pbmRleE9mKGEpPi0xKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX0sdmFsOmZ1bmN0aW9uKGEpe2lmKGE9PT13KXt2YXIgYj10aGlzWzBdO2lmKGIpe2lmKGMubm9kZU5hbWUoYiwib3B0aW9uIikpcmV0dXJuKGIuYXR0cmlidXRlcy52YWx1ZXx8e30pLnNwZWNpZmllZD9iLnZhbHVlOmIudGV4dDtpZihjLm5vZGVOYW1lKGIsInNlbGVjdCIpKXt2YXIgZD1iLnNlbGVjdGVkSW5kZXgsZj1bXSxlPWIub3B0aW9ucztiPWIudHlwZT09PSJzZWxlY3Qtb25lIjtpZihkPDApcmV0dXJuIG51bGw7dmFyIGo9Yj9kOjA7Zm9yKGQ9Yj9kKzE6ZS5sZW5ndGg7ajxkO2orKyl7dmFyIGk9CmVbal07aWYoaS5zZWxlY3RlZCl7YT1jKGkpLnZhbCgpO2lmKGIpcmV0dXJuIGE7Zi5wdXNoKGEpfX1yZXR1cm4gZn1pZihCYS50ZXN0KGIudHlwZSkmJiFjLnN1cHBvcnQuY2hlY2tPbilyZXR1cm4gYi5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6Yi52YWx1ZTtyZXR1cm4oYi52YWx1ZXx8IiIpLnJlcGxhY2UoWmEsIiIpfXJldHVybiB3fXZhciBvPWMuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGspe3ZhciBuPWModGhpcykscj1hO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtpZihvKXI9YS5jYWxsKHRoaXMsayxuLnZhbCgpKTtpZih0eXBlb2Ygcj09PSJudW1iZXIiKXIrPSIiO2lmKGMuaXNBcnJheShyKSYmQmEudGVzdCh0aGlzLnR5cGUpKXRoaXMuY2hlY2tlZD1jLmluQXJyYXkobi52YWwoKSxyKT49MDtlbHNlIGlmKGMubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciB1PWMubWFrZUFycmF5KHIpO2MoIm9wdGlvbiIsdGhpcykuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9CmMuaW5BcnJheShjKHRoaXMpLnZhbCgpLHUpPj0wfSk7aWYoIXUubGVuZ3RoKXRoaXMuc2VsZWN0ZWRJbmRleD0tMX1lbHNlIHRoaXMudmFsdWU9cn19KX19KTtjLmV4dGVuZCh7YXR0ckZuOnt2YWw6dHJ1ZSxjc3M6dHJ1ZSxodG1sOnRydWUsdGV4dDp0cnVlLGRhdGE6dHJ1ZSx3aWR0aDp0cnVlLGhlaWdodDp0cnVlLG9mZnNldDp0cnVlfSxhdHRyOmZ1bmN0aW9uKGEsYixkLGYpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIHc7aWYoZiYmYiBpbiBjLmF0dHJGbilyZXR1cm4gYyhhKVtiXShkKTtmPWEubm9kZVR5cGUhPT0xfHwhYy5pc1hNTERvYyhhKTt2YXIgZT1kIT09dztiPWYmJmMucHJvcHNbYl18fGI7aWYoYS5ub2RlVHlwZT09PTEpe3ZhciBqPSRhLnRlc3QoYik7aWYoYiBpbiBhJiZmJiYhail7aWYoZSl7Yj09PSJ0eXBlIiYmYWIudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlJiZjLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTsKYVtiXT1kfWlmKGMubm9kZU5hbWUoYSwiZm9ybSIpJiZhLmdldEF0dHJpYnV0ZU5vZGUoYikpcmV0dXJuIGEuZ2V0QXR0cmlidXRlTm9kZShiKS5ub2RlVmFsdWU7aWYoYj09PSJ0YWJJbmRleCIpcmV0dXJuKGI9YS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJJbmRleCIpKSYmYi5zcGVjaWZpZWQ|IjsKdmFyIGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGo9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCEoIWV8fCFlLmxlbmd0aHx8IWopKXtjLnN1cHBvcnQ9e2xlYWRpbmdXaGl0ZXNwYWNlOmQuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi9yZWQvLnRlc3Qoai5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmouZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1JC8udGVzdChqLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhai5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0udmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOnMuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQocy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSkuc2VsZWN0ZWQsCnBhcmVudE5vZGU6ZC5yZW1vdmVDaGlsZChkLmFwcGVuZENoaWxkKHMuY3JlYXRlRWxlbWVudCgiZGl2IikpKS5wYXJlbnROb2RlPT09bnVsbCxkZWxldGVFeHBhbmRvOnRydWUsY2hlY2tDbG9uZTpmYWxzZSxzY3JpcHRFdmFsOmZhbHNlLG5vQ2xvbmVFdmVudDp0cnVlLGJveE1vZGVsOm51bGx9O2IudHlwZT0idGV4dC9qYXZhc2NyaXB0Ijt0cnl7Yi5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCJ3aW5kb3cuIitmKyI9MTsiKSl9Y2F0Y2goaSl7fWEuaW5zZXJ0QmVmb3JlKGIsYS5maXJzdENoaWxkKTtpZihBW2ZdKXtjLnN1cHBvcnQuc2NyaXB0RXZhbD10cnVlO2RlbGV0ZSBBW2ZdfXRyeXtkZWxldGUgYi50ZXN0fWNhdGNoKG8pe2Muc3VwcG9ydC5kZWxldGVFeHBhbmRvPWZhbHNlfWEucmVtb3ZlQ2hpbGQoYik7aWYoZC5hdHRhY2hFdmVudCYmZC5maXJlRXZlbnQpe2QuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uIGsoKXtjLnN1cHBvcnQubm9DbG9uZUV2ZW50PQpmYWxzZTtkLmRldGFjaEV2ZW50KCJvbmNsaWNrIixrKX0pO2QuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpfWQ9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdyYWRpb3Rlc3QnIGNoZWNrZWQ9J2NoZWNrZWQnLz4iO2E9cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7YS5hcHBlbmRDaGlsZChkLmZpcnN0Q2hpbGQpO2Muc3VwcG9ydC5jaGVja0Nsb25lPWEuY2xvbmVOb2RlKHRydWUpLmNsb25lTm9kZSh0cnVlKS5sYXN0Q2hpbGQuY2hlY2tlZDtjKGZ1bmN0aW9uKCl7dmFyIGs9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLnN0eWxlLndpZHRoPWsuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCI7cy5ib2R5LmFwcGVuZENoaWxkKGspO2MuYm94TW9kZWw9Yy5zdXBwb3J0LmJveE1vZGVsPWsub2Zmc2V0V2lkdGg9PT0yO3MuYm9keS5yZW1vdmVDaGlsZChrKS5zdHlsZS5kaXNwbGF5PSJub25lIn0pO2E9ZnVuY3Rpb24oayl7dmFyIG49CnMuY3JlYXRlRWxlbWVudCgiZGl2Iik7az0ib24iK2s7dmFyIHI9ayBpbiBuO2lmKCFyKXtuLnNldEF0dHJpYnV0ZShrLCJyZXR1cm47Iik7cj10eXBlb2YgbltrXT09PSJmdW5jdGlvbiJ9cmV0dXJuIHJ9O2Muc3VwcG9ydC5zdWJtaXRCdWJibGVzPWEoInN1Ym1pdCIpO2Muc3VwcG9ydC5jaGFuZ2VCdWJibGVzPWEoImNoYW5nZSIpO2E9Yj1kPWU9aj1udWxsfX0pKCk7Yy5wcm9wcz17ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIscmVhZG9ubHk6InJlYWRPbmx5IixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix0YWJpbmRleDoidGFiSW5kZXgiLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIifTt2YXIgRz0ialF1ZXJ5IitKKCksWWE9MCx6YT17fTtjLmV4dGVuZCh7Y2FjaGU6e30sZXhwYW5kbzpHLG5vRGF0YTp7ZW1iZWQ6dHJ1ZSxvYmplY3Q6dHJ1ZSwKYXBwbGV0OnRydWV9LGRhdGE6ZnVuY3Rpb24oYSxiLGQpe2lmKCEoYS5ub2RlTmFtZSYmYy5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpe2E9YT09QT96YTphO3ZhciBmPWFbR10sZT1jLmNhY2hlO2lmKCFmJiZ0eXBlb2YgYj09PSJzdHJpbmciJiZkPT09dylyZXR1cm4gbnVsbDtmfHwoZj0rK1lhKTtpZih0eXBlb2YgYj09PSJvYmplY3QiKXthW0ddPWY7ZVtmXT1jLmV4dGVuZCh0cnVlLHt9LGIpfWVsc2UgaWYoIWVbZl0pe2FbR109ZjtlW2ZdPXt9fWE9ZVtmXTtpZihkIT09dylhW2JdPWQ7cmV0dXJuIHR5cGVvZiBiPT09InN0cmluZyI|PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8|MDp3O3JldHVybiBhW2JdfWlmKCFjLnN1cHBvcnQuc3R5bGUmJmYmJmI9PT0ic3R5bGUiKXtpZihlKWEuc3R5bGUuY3NzVGV4dD0iIitkO3JldHVybiBhLnN0eWxlLmNzc1RleHR9ZSYmYS5zZXRBdHRyaWJ1dGUoYiwiIitkKTthPSFjLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQmJmYmJmo|YS5nZXRBdHRyaWJ1dGUoYiwyKTphLmdldEF0dHJpYnV0ZShiKTtyZXR1cm4gYT09PW51bGw|MzphLmJ1dHRvbiY0PzI6MDtyZXR1cm4gYX0sZ3VpZDoxRTgscHJveHk6Yy5wcm94eSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Yy5iaW5kUmVhZHksdGVhcmRvd246Yy5ub29wfSxsaXZlOnthZGQ6ZnVuY3Rpb24oYSl7Yy5ldmVudC5hZGQodGhpcyxhLm9yaWdUeXBlLGMuZXh0ZW5kKHt9LGEse2hhbmRsZXI6b2F9KSl9LHJlbW92ZTpmdW5jdGlvbihhKXt2YXIgYj10cnVlLGQ9YS5vcmlnVHlwZS5yZXBsYWNlKE8sIiIpO2MuZWFjaChjLmRhdGEodGhpcywKImV2ZW50cyIpLmxpdmV8fFtdLGZ1bmN0aW9uKCl7aWYoZD09PXRoaXMub3JpZ1R5cGUucmVwbGFjZShPLCIiKSlyZXR1cm4gYj1mYWxzZX0pO2ImJmMuZXZlbnQucmVtb3ZlKHRoaXMsYS5vcmlnVHlwZSxvYSl9fSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixkKXtpZih0aGlzLnNldEludGVydmFsKXRoaXMub25iZWZvcmV1bmxvYWQ9ZDtyZXR1cm4gZmFsc2V9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vbmJlZm9yZXVubG9hZD09PWIpdGhpcy5vbmJlZm9yZXVubG9hZD1udWxsfX19fTt2YXIgQ2E9cy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixkKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixkLGZhbHNlKX06ZnVuY3Rpb24oYSxiLGQpe2EuZGV0YWNoRXZlbnQoIm9uIitiLGQpfTtjLkV2ZW50PWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnByZXZlbnREZWZhdWx0KXJldHVybiBuZXcgYy5FdmVudChhKTtpZihhJiZhLnR5cGUpe3RoaXMub3JpZ2luYWxFdmVudD0KYTt0aGlzLnR5cGU9YS50eXBlfWVsc2UgdGhpcy50eXBlPWE7dGhpcy50aW1lU3RhbXA9SigpO3RoaXNbR109dHJ1ZX07Yy5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Wjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7aWYoYSl7YS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpO2EucmV0dXJuVmFsdWU9ZmFsc2V9fSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPVo7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpe2Euc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpO2EuY2FuY2VsQnViYmxlPXRydWV9fSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPVo7dGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOlksaXNQcm9wYWdhdGlvblN0b3BwZWQ6WSwKaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6WX07dmFyIERhPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVsYXRlZFRhcmdldDt0cnl7Zm9yKDtiJiZiIT09dGhpczspYj1iLnBhcmVudE5vZGU7aWYoYiE9PXRoaXMpe2EudHlwZT1hLmRhdGE7Yy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1jYXRjaChkKXt9fSxFYT1mdW5jdGlvbihhKXthLnR5cGU9YS5kYXRhO2MuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Yy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtjLmV2ZW50LnNwZWNpYWxbYV09e3NldHVwOmZ1bmN0aW9uKGQpe2MuZXZlbnQuYWRkKHRoaXMsYixkJiZkLnNlbGVjdG9yP0VhOkRhLGEpfSx0ZWFyZG93bjpmdW5jdGlvbihkKXtjLmV2ZW50LnJlbW92ZSh0aGlzLGIsZCYmZC5zZWxlY3Rvcj9FYTpEYSl9fX0pO2lmKCFjLnN1cHBvcnQuc3VibWl0QnViYmxlcyljLmV2ZW50LnNwZWNpYWwuc3VibWl0PQp7c2V0dXA6ZnVuY3Rpb24oKXtpZih0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0iZm9ybSIpe2MuZXZlbnQuYWRkKHRoaXMsImNsaWNrLnNwZWNpYWxTdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKChkPT09InN1Ym1pdCJ8fGQ9PT0iaW1hZ2UiKSYmYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoKXJldHVybiBuYSgic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9KTtjLmV2ZW50LmFkZCh0aGlzLCJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZigoZD09PSJ0ZXh0Inx8ZD09PSJwYXNzd29yZCIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJmEua2V5Q29kZT09PTEzKXJldHVybiBuYSgic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9KX1lbHNlIHJldHVybiBmYWxzZX0sdGVhcmRvd246ZnVuY3Rpb24oKXtjLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbFN1Ym1pdCIpfX07CmlmKCFjLnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIGRhPS90ZXh0YXJlYXxpbnB1dHxzZWxlY3QvaSxlYSxGYT1mdW5jdGlvbihhKXt2YXIgYj1hLnR5cGUsZD1hLnZhbHVlO2lmKGI9PT0icmFkaW8ifHxiPT09ImNoZWNrYm94IilkPWEuY2hlY2tlZDtlbHNlIGlmKGI9PT0ic2VsZWN0LW11bHRpcGxlIilkPWEuc2VsZWN0ZWRJbmRleD4tMT9jLm1hcChhLm9wdGlvbnMsZnVuY3Rpb24oZil7cmV0dXJuIGYuc2VsZWN0ZWR9KS5qb2luKCItIik6IiI7ZWxzZSBpZihhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2VsZWN0IilkPWEuc2VsZWN0ZWRJbmRleDtyZXR1cm4gZH0sZmE9ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnRhcmdldCxmLGU7aWYoISghZGEudGVzdChkLm5vZGVOYW1lKXx8ZC5yZWFkT25seSkpe2Y9Yy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIpO2U9RmEoZCk7aWYoYS50eXBlIT09ImZvY3Vzb3V0Inx8ZC50eXBlIT09InJhZGlvIiljLmRhdGEoZCwiX2NoYW5nZV9kYXRhIiwKZSk7aWYoIShmPT09d3x8ZT09PWYpKWlmKGYhPW51bGx8fGUpe2EudHlwZT0iY2hhbmdlIjtyZXR1cm4gYy5ldmVudC50cmlnZ2VyKGEsYixkKX19fTtjLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDpmYSxjbGljazpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZihkPT09InJhZGlvInx8ZD09PSJjaGVja2JveCJ8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKXJldHVybiBmYS5jYWxsKHRoaXMsYSl9LGtleWRvd246ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoYS5rZXlDb2RlPT09MTMmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJ0ZXh0YXJlYSJ8fGEua2V5Q29kZT09PTMyJiYoZD09PSJjaGVja2JveCJ8fGQ9PT0icmFkaW8iKXx8ZD09PSJzZWxlY3QtbXVsdGlwbGUiKXJldHVybiBmYS5jYWxsKHRoaXMsYSl9LGJlZm9yZWFjdGl2YXRlOmZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7Yy5kYXRhKGEsCiJfY2hhbmdlX2RhdGEiLEZhKGEpKX19LHNldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy50eXBlPT09ImZpbGUiKXJldHVybiBmYWxzZTtmb3IodmFyIGEgaW4gZWEpYy5ldmVudC5hZGQodGhpcyxhKyIuc3BlY2lhbENoYW5nZSIsZWFbYV0pO3JldHVybiBkYS50ZXN0KHRoaXMubm9kZU5hbWUpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsQ2hhbmdlIik7cmV0dXJuIGRhLnRlc3QodGhpcy5ub2RlTmFtZSl9fTtlYT1jLmV2ZW50LnNwZWNpYWwuY2hhbmdlLmZpbHRlcnN9cy5hZGRFdmVudExpc3RlbmVyJiZjLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZChmKXtmPWMuZXZlbnQuZml4KGYpO2YudHlwZT1iO3JldHVybiBjLmV2ZW50LmhhbmRsZS5jYWxsKHRoaXMsZil9Yy5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihhLApkLHRydWUpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGQsdHJ1ZSl9fX0pO2MuZWFjaChbImJpbmQiLCJvbmUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxmLGUpe2lmKHR5cGVvZiBkPT09Im9iamVjdCIpe2Zvcih2YXIgaiBpbiBkKXRoaXNbYl0oaixmLGRbal0sZSk7cmV0dXJuIHRoaXN9aWYoYy5pc0Z1bmN0aW9uKGYpKXtlPWY7Zj13fXZhciBpPWI9PT0ib25lIj9jLnByb3h5KGUsZnVuY3Rpb24oayl7Yyh0aGlzKS51bmJpbmQoayxpKTtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTplO2lmKGQ9PT0idW5sb2FkIiYmYiE9PSJvbmUiKXRoaXMub25lKGQsZixlKTtlbHNle2o9MDtmb3IodmFyIG89dGhpcy5sZW5ndGg7ajxvO2orKyljLmV2ZW50LmFkZCh0aGlzW2pdLGQsaSxmKX1yZXR1cm4gdGhpc319KTtjLmZuLmV4dGVuZCh7dW5iaW5kOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PT0ib2JqZWN0IiYmCiFhLnByZXZlbnREZWZhdWx0KWZvcih2YXIgZCBpbiBhKXRoaXMudW5iaW5kKGQsYVtkXSk7ZWxzZXtkPTA7Zm9yKHZhciBmPXRoaXMubGVuZ3RoO2Q8ZjtkKyspYy5ldmVudC5yZW1vdmUodGhpc1tkXSxhLGIpfXJldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsZCxmKXtyZXR1cm4gdGhpcy5saXZlKGIsZCxmLGEpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA|YS50b0VsZW1lbnQ6YS5mcm9tRWxlbWVudDtpZihhLnBhZ2VYPT1udWxsJiZhLmNsaWVudFghPW51bGwpe2I9cy5kb2N1bWVudEVsZW1lbnQ7ZD1zLmJvZHk7YS5wYWdlWD1hLmNsaWVudFgrKGImJmIuc2Nyb2xsTGVmdHx8ZCYmZC5zY3JvbGxMZWZ0fHwwKS0oYiYmYi5jbGllbnRMZWZ0fHxkJiZkLmNsaWVudExlZnR8fDApO2EucGFnZVk9YS5jbGllbnRZKyhiJiZiLnNjcm9sbFRvcHx8CmQmJmQuc2Nyb2xsVG9wfHwwKS0oYiYmYi5jbGllbnRUb3B8fGQmJmQuY2xpZW50VG9wfHwwKX1pZighYS53aGljaCYmKGEuY2hhckNvZGV8fGEuY2hhckNvZGU9PT0wP2EuY2hhckNvZGU6YS5rZXlDb2RlKSlhLndoaWNoPWEuY2hhckNvZGV8fGEua2V5Q29kZTtpZighYS5tZXRhS2V5JiZhLmN0cmxLZXkpYS5tZXRhS2V5PWEuY3RybEtleTtpZighYS53aGljaCYmYS5idXR0b24hPT13KWEud2hpY2g9YS5idXR0b24mMT8xOmEuYnV0dG9uJjI|Yy5leHRlbmQoe30sZSk6e2hhbmRsZXI6ZCxkYXRhOmZ9O2lmKGsuaW5kZXhPZigiLiIpPi0xKXtyPWsuc3BsaXQoIi4iKTsKaz1yLnNoaWZ0KCk7ai5uYW1lc3BhY2U9ci5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpfWVsc2V7cj1bXTtqLm5hbWVzcGFjZT0iIn1qLnR5cGU9aztqLmd1aWQ9ZC5ndWlkO3ZhciB1PWlba10sej1jLmV2ZW50LnNwZWNpYWxba118fHt9O2lmKCF1KXt1PWlba109W107aWYoIXouc2V0dXB8fHouc2V0dXAuY2FsbChhLGYscixvKT09PWZhbHNlKWlmKGEuYWRkRXZlbnRMaXN0ZW5lcilhLmFkZEV2ZW50TGlzdGVuZXIoayxvLGZhbHNlKTtlbHNlIGEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitrLG8pfWlmKHouYWRkKXt6LmFkZC5jYWxsKGEsaik7aWYoIWouaGFuZGxlci5ndWlkKWouaGFuZGxlci5ndWlkPWQuZ3VpZH11LnB1c2goaik7Yy5ldmVudC5nbG9iYWxba109dHJ1ZX1hPW51bGx9fX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsZCxmKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe3ZhciBlLGo9MCxpLG8sayxuLHIsdSx6PWMuZGF0YShhKSwKQz16JiZ6LmV2ZW50cztpZih6JiZDKXtpZihiJiZiLnR5cGUpe2Q9Yi5oYW5kbGVyO2I9Yi50eXBlfWlmKCFifHx0eXBlb2YgYj09PSJzdHJpbmciJiZiLmNoYXJBdCgwKT09PSIuIil7Yj1ifHwiIjtmb3IoZSBpbiBDKWMuZXZlbnQucmVtb3ZlKGEsZStiKX1lbHNle2ZvcihiPWIuc3BsaXQoIiAiKTtlPWJbaisrXTspe249ZTtpPWUuaW5kZXhPZigiLiIpPDA7bz1bXTtpZighaSl7bz1lLnNwbGl0KCIuIik7ZT1vLnNoaWZ0KCk7az1uZXcgUmVnRXhwKCIoXnxcXC4pIitjLm1hcChvLnNsaWNlKDApLnNvcnQoKSxkYikuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIil9aWYocj1DW2VdKWlmKGQpe249Yy5ldmVudC5zcGVjaWFsW2VdfHx7fTtmb3IoQj1mfHwwO0I8ci5sZW5ndGg7QisrKXt1PXJbQl07aWYoZC5ndWlkPT09dS5ndWlkKXtpZihpfHxrLnRlc3QodS5uYW1lc3BhY2UpKXtmPT1udWxsJiZyLnNwbGljZShCLS0sMSk7bi5yZW1vdmUmJm4ucmVtb3ZlLmNhbGwoYSx1KX1pZihmIT0KbnVsbClicmVha319aWYoci5sZW5ndGg9PT0wfHxmIT1udWxsJiZyLmxlbmd0aD09PTEpe2lmKCFuLnRlYXJkb3dufHxuLnRlYXJkb3duLmNhbGwoYSxvKT09PWZhbHNlKUNhKGEsZSx6LmhhbmRsZSk7ZGVsZXRlIENbZV19fWVsc2UgZm9yKHZhciBCPTA7QjxyLmxlbmd0aDtCKyspe3U9cltCXTtpZihpfHxrLnRlc3QodS5uYW1lc3BhY2UpKXtjLmV2ZW50LnJlbW92ZShhLG4sdS5oYW5kbGVyLEIpO3Iuc3BsaWNlKEItLSwxKX19fWlmKGMuaXNFbXB0eU9iamVjdChDKSl7aWYoYj16LmhhbmRsZSliLmVsZW09bnVsbDtkZWxldGUgei5ldmVudHM7ZGVsZXRlIHouaGFuZGxlO2MuaXNFbXB0eU9iamVjdCh6KSYmYy5yZW1vdmVEYXRhKGEpfX19fX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIsZCxmKXt2YXIgZT1hLnR5cGV8fGE7aWYoIWYpe2E9dHlwZW9mIGE9PT0ib2JqZWN0Ij9hW0ddP2E6Yy5leHRlbmQoYy5FdmVudChlKSxhKTpjLkV2ZW50KGUpO2lmKGUuaW5kZXhPZigiISIpPj0wKXthLnR5cGU9CmU9ZS5zbGljZSgwLC0xKTthLmV4Y2x1c2l2ZT10cnVlfWlmKCFkKXthLnN0b3BQcm9wYWdhdGlvbigpO2MuZXZlbnQuZ2xvYmFsW2VdJiZjLmVhY2goYy5jYWNoZSxmdW5jdGlvbigpe3RoaXMuZXZlbnRzJiZ0aGlzLmV2ZW50c1tlXSYmYy5ldmVudC50cmlnZ2VyKGEsYix0aGlzLmhhbmRsZS5lbGVtKX0pfWlmKCFkfHxkLm5vZGVUeXBlPT09M3x8ZC5ub2RlVHlwZT09PTgpcmV0dXJuIHc7YS5yZXN1bHQ9dzthLnRhcmdldD1kO2I9Yy5tYWtlQXJyYXkoYik7Yi51bnNoaWZ0KGEpfWEuY3VycmVudFRhcmdldD1kOyhmPWMuZGF0YShkLCJoYW5kbGUiKSkmJmYuYXBwbHkoZCxiKTtmPWQucGFyZW50Tm9kZXx8ZC5vd25lckRvY3VtZW50O3RyeXtpZighKGQmJmQubm9kZU5hbWUmJmMubm9EYXRhW2Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKWlmKGRbIm9uIitlXSYmZFsib24iK2VdLmFwcGx5KGQsYik9PT1mYWxzZSlhLnJlc3VsdD1mYWxzZX1jYXRjaChqKXt9aWYoIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmCmYpYy5ldmVudC50cmlnZ2VyKGEsYixmLHRydWUpO2Vsc2UgaWYoIWEuaXNEZWZhdWx0UHJldmVudGVkKCkpe2Y9YS50YXJnZXQ7dmFyIGksbz1jLm5vZGVOYW1lKGYsImEiKSYmZT09PSJjbGljayIsaz1jLmV2ZW50LnNwZWNpYWxbZV18fHt9O2lmKCghay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5jYWxsKGQsYSk9PT1mYWxzZSkmJiFvJiYhKGYmJmYubm9kZU5hbWUmJmMubm9EYXRhW2Yubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXt0cnl7aWYoZltlXSl7aWYoaT1mWyJvbiIrZV0pZlsib24iK2VdPW51bGw7Yy5ldmVudC50cmlnZ2VyZWQ9dHJ1ZTtmW2VdKCl9fWNhdGNoKG4pe31pZihpKWZbIm9uIitlXT1pO2MuZXZlbnQudHJpZ2dlcmVkPWZhbHNlfX19LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYixkLGYsZTthPWFyZ3VtZW50c1swXT1jLmV2ZW50LmZpeChhfHxBLmV2ZW50KTthLmN1cnJlbnRUYXJnZXQ9dGhpcztiPWEudHlwZS5pbmRleE9mKCIuIik8MCYmIWEuZXhjbHVzaXZlOwppZighYil7ZD1hLnR5cGUuc3BsaXQoIi4iKTthLnR5cGU9ZC5zaGlmdCgpO2Y9bmV3IFJlZ0V4cCgiKF58XFwuKSIrZC5zbGljZSgwKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIil9ZT1jLmRhdGEodGhpcywiZXZlbnRzIik7ZD1lW2EudHlwZV07aWYoZSYmZCl7ZD1kLnNsaWNlKDApO2U9MDtmb3IodmFyIGo9ZC5sZW5ndGg7ZTxqO2UrKyl7dmFyIGk9ZFtlXTtpZihifHxmLnRlc3QoaS5uYW1lc3BhY2UpKXthLmhhbmRsZXI9aS5oYW5kbGVyO2EuZGF0YT1pLmRhdGE7YS5oYW5kbGVPYmo9aTtpPWkuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoaSE9PXcpe2EucmVzdWx0PWk7aWYoaT09PWZhbHNlKXthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKX19aWYoYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX19cmV0dXJuIGEucmVzdWx0fSxwcm9wczoiYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIGxheWVyWCBsYXllclkgbWV0YUtleSBuZXdWYWx1ZSBvZmZzZXRYIG9mZnNldFkgb3JpZ2luYWxUYXJnZXQgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRvRWxlbWVudCB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIiksCmZpeDpmdW5jdGlvbihhKXtpZihhW0ddKXJldHVybiBhO3ZhciBiPWE7YT1jLkV2ZW50KGIpO2Zvcih2YXIgZD10aGlzLnByb3BzLmxlbmd0aCxmO2Q7KXtmPXRoaXMucHJvcHNbLS1kXTthW2ZdPWJbZl19aWYoIWEudGFyZ2V0KWEudGFyZ2V0PWEuc3JjRWxlbWVudHx8cztpZihhLnRhcmdldC5ub2RlVHlwZT09PTMpYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZTtpZighYS5yZWxhdGVkVGFyZ2V0JiZhLmZyb21FbGVtZW50KWEucmVsYXRlZFRhcmdldD1hLmZyb21FbGVtZW50PT09YS50YXJnZXQ|dzphfXJldHVybiBjLnN0eWxlKGEsYixkKX19KTt2YXIgTz0vXC4oLiopJC8sZGI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvW15cd1xzXC5cfGBdL2csCmZ1bmN0aW9uKGIpe3JldHVybiJcXCIrYn0pfTtjLmV2ZW50PXthZGQ6ZnVuY3Rpb24oYSxiLGQsZil7aWYoIShhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpKXtpZihhLnNldEludGVydmFsJiZhIT09QSYmIWEuZnJhbWVFbGVtZW50KWE9QTt2YXIgZSxqO2lmKGQuaGFuZGxlcil7ZT1kO2Q9ZS5oYW5kbGVyfWlmKCFkLmd1aWQpZC5ndWlkPWMuZ3VpZCsrO2lmKGo9Yy5kYXRhKGEpKXt2YXIgaT1qLmV2ZW50cz1qLmV2ZW50c3x8e30sbz1qLmhhbmRsZTtpZighbylqLmhhbmRsZT1vPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBjIT09InVuZGVmaW5lZCImJiFjLmV2ZW50LnRyaWdnZXJlZD9jLmV2ZW50LmhhbmRsZS5hcHBseShvLmVsZW0sYXJndW1lbnRzKTp3fTtvLmVsZW09YTtiPWIuc3BsaXQoIiAiKTtmb3IodmFyIGssbj0wLHI7az1iW24rK107KXtqPWU|Oltcd1x1MDBjMC1cdUZGRkZcKi1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk|Zih0aGlzW25dLGopOnRoaXNbbl0sbj4wfHxlLmNhY2hlYWJsZXx8dGhpcy5sZW5ndGg|dmVydDFzW2VkZ2UxKzFdOnZlcnQxc1swXTt2YXIgZHZYPXYxMi54LXYxMS54O3ZhciBkdlk9djEyLnktdjExLnk7dmFyIHNpZGVOb3JtYWxYPXYxMi54LXYxMS54O3ZhciBzaWRlTm9ybWFsWT12MTIueS12MTEueTt2YXIgdFg9c2lkZU5vcm1hbFg7dmFyIHRNYXQ9cG9seTEubV9SO3NpZGVOb3JtYWxYPXRNYXQuY29sMS54KnRYK3RNYXQuY29sMi54KnNpZGVOb3JtYWxZO3NpZGVOb3JtYWxZPXRNYXQuY29sMS55KnRYK3RNYXQuY29sMi55KnNpZGVOb3JtYWxZO3ZhciBpbnZMZW5ndGg9MS4wL01hdGguc3FydChzaWRlTm9ybWFsWCpzaWRlTm9ybWFsWCtzaWRlTm9ybWFsWSpzaWRlTm9ybWFsWSk7c2lkZU5vcm1hbFgqPWludkxlbmd0aDtzaWRlTm9ybWFsWSo9aW52TGVuZ3RoO3ZhciBmcm9udE5vcm1hbFg9c2lkZU5vcm1hbFg7dmFyIGZyb250Tm9ybWFsWT1zaWRlTm9ybWFsWTt0WD1mcm9udE5vcm1hbFg7ZnJvbnROb3JtYWxYPWZyb250Tm9ybWFsWTtmcm9udE5vcm1hbFk9LXRYO3ZhciB2MTFYPXYxMS54O3ZhciB2MTFZPXYxMS55O3RYPXYxMVg7dE1hdD1wb2x5MS5tX1I7djExWD10TWF0LmNvbDEueCp0WCt0TWF0LmNvbDIueCp2MTFZO3YxMVk9dE1hdC5jb2wxLnkqdFgrdE1hdC5jb2wyLnkqdjExWTt2MTFYKz1wb2x5MS5tX3Bvc2l0aW9uLng7djExWSs9cG9seTEubV9wb3NpdGlvbi55O3ZhciB2MTJYPXYxMi54O3ZhciB2MTJZPXYxMi55O3RYPXYxMlg7dE1hdD1wb2x5MS5tX1I7djEyWD10TWF0LmNvbDEueCp0WCt0TWF0LmNvbDIueCp2MTJZO3YxMlk9dE1hdC5jb2wxLnkqdFgrdE1hdC5jb2wyLnkqdjEyWTt2MTJYKz1wb2x5MS5tX3Bvc2l0aW9uLng7djEyWSs9cG9seTEubV9wb3NpdGlvbi55O3ZhciBmcm9udE9mZnNldD1mcm9udE5vcm1hbFgqdjExWCtmcm9udE5vcm1hbFkqdjExWTt2YXIgc2lkZU9mZnNldDE9LShzaWRlTm9ybWFsWCp2MTFYK3NpZGVOb3JtYWxZKnYxMVkpO3ZhciBzaWRlT2Zmc2V0Mj1zaWRlTm9ybWFsWCp2MTJYK3NpZGVOb3JtYWxZKnYxMlk7dmFyIGNsaXBQb2ludHMxPVtuZXcgQ2xpcFZlcnRleCgpLG5ldyBDbGlwVmVydGV4KCldO3ZhciBjbGlwUG9pbnRzMj1bbmV3IENsaXBWZXJ0ZXgoKSxuZXcgQ2xpcFZlcnRleCgpXTt2YXIgbnA9MDtiMkNvbGxpc2lvbi5iMkNvbGxpZGVQb2x5VGVtcFZlYy5TZXQoLXNpZGVOb3JtYWxYLC1zaWRlTm9ybWFsWSk7bnA9YjJDb2xsaXNpb24uQ2xpcFNlZ21lbnRUb0xpbmUoY2xpcFBvaW50czEsaW5jaWRlbnRFZGdlLGIyQ29sbGlzaW9uLmIyQ29sbGlkZVBvbHlUZW1wVmVjLHNpZGVPZmZzZXQxKTtpZihucDwyKQpyZXR1cm47YjJDb2xsaXNpb24uYjJDb2xsaWRlUG9seVRlbXBWZWMuU2V0KHNpZGVOb3JtYWxYLHNpZGVOb3JtYWxZKTtucD1iMkNvbGxpc2lvbi5DbGlwU2VnbWVudFRvTGluZShjbGlwUG9pbnRzMixjbGlwUG9pbnRzMSxiMkNvbGxpc2lvbi5iMkNvbGxpZGVQb2x5VGVtcFZlYyxzaWRlT2Zmc2V0Mik7aWYobnA8MikKcmV0dXJuO2lmKGZsaXApe21hbmlmb2xkLm5vcm1hbC5TZXQoLWZyb250Tm9ybWFsWCwtZnJvbnROb3JtYWxZKTt9CmVsc2V7bWFuaWZvbGQubm9ybWFsLlNldChmcm9udE5vcm1hbFgsZnJvbnROb3JtYWxZKTt9CnZhciBwb2ludENvdW50PTA7Zm9yKHZhciBpPTA7aTxiMlNldHRpbmdzLmIyX21heE1hbmlmb2xkUG9pbnRzOysraSkKe3ZhciB0VmVjPWNsaXBQb2ludHMyW2ldLnY7dmFyIHNlcGFyYXRpb249KGZyb250Tm9ybWFsWCp0VmVjLngrZnJvbnROb3JtYWxZKnRWZWMueSktZnJvbnRPZmZzZXQ7aWYoc2VwYXJhdGlvbjw9MC4wfHxjb25zZXJ2YXRpdmU9PXRydWUpCnt2YXIgY3A9bWFuaWZvbGQucG9pbnRzW3BvaW50Q291bnRdO2NwLnNlcGFyYXRpb249c2VwYXJhdGlvbjtjcC5wb3NpdGlvbi5TZXRWKGNsaXBQb2ludHMyW2ldLnYpO2NwLmlkLlNldChjbGlwUG9pbnRzMltpXS5pZCk7Y3AuaWQuZmVhdHVyZXMuZmxpcD1mbGlwOysrcG9pbnRDb3VudDt9fQptYW5pZm9sZC5wb2ludENvdW50PXBvaW50Q291bnQ7fTtiMkNvbGxpc2lvbi5iMkNvbGxpZGVDaXJjbGU9ZnVuY3Rpb24obWFuaWZvbGQsY2lyY2xlMSxjaXJjbGUyLGNvbnNlcnZhdGl2ZSkKe21hbmlmb2xkLnBvaW50Q291bnQ9MDt2YXIgZFg9Y2lyY2xlMi5tX3Bvc2l0aW9uLngtY2lyY2xlMS5tX3Bvc2l0aW9uLng7dmFyIGRZPWNpcmNsZTIubV9wb3NpdGlvbi55LWNpcmNsZTEubV9wb3NpdGlvbi55O3ZhciBkaXN0U3FyPWRYKmRYK2RZKmRZO3ZhciByYWRpdXNTdW09Y2lyY2xlMS5tX3JhZGl1cytjaXJjbGUyLm1fcmFkaXVzO2lmKGRpc3RTcXI|MC4wJiZjb25zZXJ2YXRpdmU9PWZhbHNlKQp7cmV0dXJuIHM7fQppZihzPmJlc3RTZXBhcmF0aW9uKQp7YmVzdEVkZ2U9ZWRnZTtiZXN0U2VwYXJhdGlvbj1zO30KZWxzZQp7YnJlYWs7fX0KZWRnZUluZGV4WzBdPWJlc3RFZGdlO3JldHVybiBiZXN0U2VwYXJhdGlvbjt9O2IyQ29sbGlzaW9uLkZpbmRJbmNpZGVudEVkZ2U9ZnVuY3Rpb24oYyxwb2x5MSxlZGdlMSxwb2x5MikKe3ZhciBjb3VudDE9cG9seTEubV92ZXJ0ZXhDb3VudDt2YXIgdmVydDFzPXBvbHkxLm1fdmVydGljZXM7dmFyIGNvdW50Mj1wb2x5Mi5tX3ZlcnRleENvdW50O3ZhciB2ZXJ0MnM9cG9seTIubV92ZXJ0aWNlczt2YXIgdmVydGV4MTE9ZWRnZTE7dmFyIHZlcnRleDEyPWVkZ2UxKzE9PWNvdW50MT8wOmVkZ2UxKzE7dmFyIHRWZWM9dmVydDFzW3ZlcnRleDEyXTt2YXIgbm9ybWFsMUxvY2FsMVg9dFZlYy54O3ZhciBub3JtYWwxTG9jYWwxWT10VmVjLnk7dFZlYz12ZXJ0MXNbdmVydGV4MTFdO25vcm1hbDFMb2NhbDFYLT10VmVjLng7bm9ybWFsMUxvY2FsMVktPXRWZWMueTt2YXIgdFg9bm9ybWFsMUxvY2FsMVg7bm9ybWFsMUxvY2FsMVg9bm9ybWFsMUxvY2FsMVk7bm9ybWFsMUxvY2FsMVk9LXRYO3ZhciBpbnZMZW5ndGg9MS4wL01hdGguc3FydChub3JtYWwxTG9jYWwxWCpub3JtYWwxTG9jYWwxWCtub3JtYWwxTG9jYWwxWSpub3JtYWwxTG9jYWwxWSk7bm9ybWFsMUxvY2FsMVgqPWludkxlbmd0aDtub3JtYWwxTG9jYWwxWSo9aW52TGVuZ3RoO3ZhciBub3JtYWwxWD1ub3JtYWwxTG9jYWwxWDt2YXIgbm9ybWFsMVk9bm9ybWFsMUxvY2FsMVk7dFg9bm9ybWFsMVg7dmFyIHRNYXQ9cG9seTEubV9SO25vcm1hbDFYPXRNYXQuY29sMS54KnRYK3RNYXQuY29sMi54Km5vcm1hbDFZO25vcm1hbDFZPXRNYXQuY29sMS55KnRYK3RNYXQuY29sMi55Km5vcm1hbDFZO3ZhciBub3JtYWwxTG9jYWwyWD1ub3JtYWwxWDt2YXIgbm9ybWFsMUxvY2FsMlk9bm9ybWFsMVk7dE1hdD1wb2x5Mi5tX1I7dFg9bm9ybWFsMUxvY2FsMlgqdE1hdC5jb2wxLngrbm9ybWFsMUxvY2FsMlkqdE1hdC5jb2wxLnk7bm9ybWFsMUxvY2FsMlk9bm9ybWFsMUxvY2FsMlgqdE1hdC5jb2wyLngrbm9ybWFsMUxvY2FsMlkqdE1hdC5jb2wyLnk7bm9ybWFsMUxvY2FsMlg9dFg7dmFyIHZlcnRleDIxPTA7dmFyIHZlcnRleDIyPTA7dmFyIG1pbkRvdD1OdW1iZXIuTUFYX1ZBTFVFO2Zvcih2YXIgaT0wO2k8Y291bnQyOysraSkKe3ZhciBpMT1pO3ZhciBpMj1pKzE8Y291bnQyP2krMTowO3RWZWM9dmVydDJzW2kyXTt2YXIgbm9ybWFsMkxvY2FsMlg9dFZlYy54O3ZhciBub3JtYWwyTG9jYWwyWT10VmVjLnk7dFZlYz12ZXJ0MnNbaTFdO25vcm1hbDJMb2NhbDJYLT10VmVjLng7bm9ybWFsMkxvY2FsMlktPXRWZWMueTt0WD1ub3JtYWwyTG9jYWwyWDtub3JtYWwyTG9jYWwyWD1ub3JtYWwyTG9jYWwyWTtub3JtYWwyTG9jYWwyWT0tdFg7aW52TGVuZ3RoPTEuMC9NYXRoLnNxcnQobm9ybWFsMkxvY2FsMlgqbm9ybWFsMkxvY2FsMlgrbm9ybWFsMkxvY2FsMlkqbm9ybWFsMkxvY2FsMlkpO25vcm1hbDJMb2NhbDJYKj1pbnZMZW5ndGg7bm9ybWFsMkxvY2FsMlkqPWludkxlbmd0aDt2YXIgZG90PW5vcm1hbDJMb2NhbDJYKm5vcm1hbDFMb2NhbDJYK25vcm1hbDJMb2NhbDJZKm5vcm1hbDFMb2NhbDJZO2lmKGRvdDxtaW5Eb3QpCnttaW5Eb3Q9ZG90O3ZlcnRleDIxPWkxO3ZlcnRleDIyPWkyO319CnZhciB0Q2xpcDt0Q2xpcD1jWzBdO3RWZWM9dENsaXAudjt0VmVjLlNldFYodmVydDJzW3ZlcnRleDIxXSk7dFZlYy5NdWxNKHBvbHkyLm1fUik7dFZlYy5BZGQocG9seTIubV9wb3NpdGlvbik7dENsaXAuaWQuZmVhdHVyZXMucmVmZXJlbmNlRmFjZT1lZGdlMTt0Q2xpcC5pZC5mZWF0dXJlcy5pbmNpZGVudEVkZ2U9dmVydGV4MjE7dENsaXAuaWQuZmVhdHVyZXMuaW5jaWRlbnRWZXJ0ZXg9dmVydGV4MjE7dENsaXA9Y1sxXTt0VmVjPXRDbGlwLnY7dFZlYy5TZXRWKHZlcnQyc1t2ZXJ0ZXgyMl0pO3RWZWMuTXVsTShwb2x5Mi5tX1IpO3RWZWMuQWRkKHBvbHkyLm1fcG9zaXRpb24pO3RDbGlwLmlkLmZlYXR1cmVzLnJlZmVyZW5jZUZhY2U9ZWRnZTE7dENsaXAuaWQuZmVhdHVyZXMuaW5jaWRlbnRFZGdlPXZlcnRleDIxO3RDbGlwLmlkLmZlYXR1cmVzLmluY2lkZW50VmVydGV4PXZlcnRleDIyO307YjJDb2xsaXNpb24uYjJDb2xsaWRlUG9seVRlbXBWZWM9bmV3IGIyVmVjMigpO2IyQ29sbGlzaW9uLmIyQ29sbGlkZVBvbHk9ZnVuY3Rpb24obWFuaWZvbGQscG9seUEscG9seUIsY29uc2VydmF0aXZlKQp7bWFuaWZvbGQucG9pbnRDb3VudD0wO3ZhciBlZGdlQT0wO3ZhciBlZGdlQU91dD1bZWRnZUFdO3ZhciBzZXBhcmF0aW9uQT1iMkNvbGxpc2lvbi5GaW5kTWF4U2VwYXJhdGlvbihlZGdlQU91dCxwb2x5QSxwb2x5Qixjb25zZXJ2YXRpdmUpO2VkZ2VBPWVkZ2VBT3V0WzBdO2lmKHNlcGFyYXRpb25BPjAuMCYmY29uc2VydmF0aXZlPT1mYWxzZSkKcmV0dXJuO3ZhciBlZGdlQj0wO3ZhciBlZGdlQk91dD1bZWRnZUJdO3ZhciBzZXBhcmF0aW9uQj1iMkNvbGxpc2lvbi5GaW5kTWF4U2VwYXJhdGlvbihlZGdlQk91dCxwb2x5Qixwb2x5QSxjb25zZXJ2YXRpdmUpO2VkZ2VCPWVkZ2VCT3V0WzBdO2lmKHNlcGFyYXRpb25CPjAuMCYmY29uc2VydmF0aXZlPT1mYWxzZSkKcmV0dXJuO3ZhciBwb2x5MTt2YXIgcG9seTI7dmFyIGVkZ2UxPTA7dmFyIGZsaXA9MDt2YXIga19yZWxhdGl2ZVRvbD0wLjk4O3ZhciBrX2Fic29sdXRlVG9sPTAuMDAxO2lmKHNlcGFyYXRpb25CPmtfcmVsYXRpdmVUb2wqc2VwYXJhdGlvbkEra19hYnNvbHV0ZVRvbCkKe3BvbHkxPXBvbHlCO3BvbHkyPXBvbHlBO2VkZ2UxPWVkZ2VCO2ZsaXA9MTt9CmVsc2UKe3BvbHkxPXBvbHlBO3BvbHkyPXBvbHlCO2VkZ2UxPWVkZ2VBO2ZsaXA9MDt9CnZhciBpbmNpZGVudEVkZ2U9W25ldyBDbGlwVmVydGV4KCksbmV3IENsaXBWZXJ0ZXgoKV07YjJDb2xsaXNpb24uRmluZEluY2lkZW50RWRnZShpbmNpZGVudEVkZ2UscG9seTEsZWRnZTEscG9seTIpO3ZhciBjb3VudDE9cG9seTEubV92ZXJ0ZXhDb3VudDt2YXIgdmVydDFzPXBvbHkxLm1fdmVydGljZXM7dmFyIHYxMT12ZXJ0MXNbZWRnZTFdO3ZhciB2MTI9ZWRnZTErMTxjb3VudDE|cykKe2luY3JlbWVudD0xO2Jlc3RFZGdlPW5leHRFZGdlO2Jlc3RTZXBhcmF0aW9uPXNOZXh0O30KZWxzZQp7ZWRnZUluZGV4WzBdPWVkZ2U7cmV0dXJuIHM7fQp3aGlsZSh0cnVlKQp7aWYoaW5jcmVtZW50PT0tMSkKZWRnZT1iZXN0RWRnZS0xPj0wP2Jlc3RFZGdlLTE6Y291bnQxLTE7ZWxzZQplZGdlPWJlc3RFZGdlKzE8Y291bnQxP2Jlc3RFZGdlKzE6MDtzPWIyQ29sbGlzaW9uLkVkZ2VTZXBhcmF0aW9uKHBvbHkxLGVkZ2UscG9seTIpO2lmKHM|MC4wJiZjb25zZXJ2YXRpdmU9PWZhbHNlKQp7cmV0dXJuIHNOZXh0O30KdmFyIGJlc3RFZGdlPTA7dmFyIGJlc3RTZXBhcmF0aW9uO3ZhciBpbmNyZW1lbnQ9MDtpZihzUHJldj5zJiZzUHJldj5zTmV4dCkKe2luY3JlbWVudD0tMTtiZXN0RWRnZT1wcmV2RWRnZTtiZXN0U2VwYXJhdGlvbj1zUHJldjt9CmVsc2UgaWYoc05leHQ|cmFkaXVzU3VtKnJhZGl1c1N1bSYmY29uc2VydmF0aXZlPT1mYWxzZSkKe3JldHVybjt9CnZhciBzZXBhcmF0aW9uO2lmKGRpc3RTcXI8TnVtYmVyLk1JTl9WQUxVRSkKe3NlcGFyYXRpb249LXJhZGl1c1N1bTttYW5pZm9sZC5ub3JtYWwuU2V0KDAuMCwxLjApO30KZWxzZQp7dmFyIGRpc3Q9TWF0aC5zcXJ0KGRpc3RTcXIpO3NlcGFyYXRpb249ZGlzdC1yYWRpdXNTdW07dmFyIGE9MS4wL2Rpc3Q7bWFuaWZvbGQubm9ybWFsLng9YSpkWDttYW5pZm9sZC5ub3JtYWwueT1hKmRZO30KbWFuaWZvbGQucG9pbnRDb3VudD0xO3ZhciB0UG9pbnQ9bWFuaWZvbGQucG9pbnRzWzBdO3RQb2ludC5pZC5zZXRfa2V5KDApO3RQb2ludC5zZXBhcmF0aW9uPXNlcGFyYXRpb247dFBvaW50LnBvc2l0aW9uLng9Y2lyY2xlMi5tX3Bvc2l0aW9uLngtKGNpcmNsZTIubV9yYWRpdXMqbWFuaWZvbGQubm9ybWFsLngpO3RQb2ludC5wb3NpdGlvbi55PWNpcmNsZTIubV9wb3NpdGlvbi55LShjaXJjbGUyLm1fcmFkaXVzKm1hbmlmb2xkLm5vcm1hbC55KTt9O2IyQ29sbGlzaW9uLmIyQ29sbGlkZVBvbHlBbmRDaXJjbGU9ZnVuY3Rpb24obWFuaWZvbGQscG9seSxjaXJjbGUsY29uc2VydmF0aXZlKQp7bWFuaWZvbGQucG9pbnRDb3VudD0wO3ZhciB0UG9pbnQ7dmFyIGRYO3ZhciBkWTt2YXIgeExvY2FsWD1jaXJjbGUubV9wb3NpdGlvbi54LXBvbHkubV9wb3NpdGlvbi54O3ZhciB4TG9jYWxZPWNpcmNsZS5tX3Bvc2l0aW9uLnktcG9seS5tX3Bvc2l0aW9uLnk7dmFyIHRNYXQ9cG9seS5tX1I7dmFyIHRYPXhMb2NhbFgqdE1hdC5jb2wxLngreExvY2FsWSp0TWF0LmNvbDEueTt4TG9jYWxZPXhMb2NhbFgqdE1hdC5jb2wyLngreExvY2FsWSp0TWF0LmNvbDIueTt4TG9jYWxYPXRYO3ZhciBkaXN0O3ZhciBub3JtYWxJbmRleD0wO3ZhciBzZXBhcmF0aW9uPS1OdW1iZXIuTUFYX1ZBTFVFO3ZhciByYWRpdXM9Y2lyY2xlLm1fcmFkaXVzO2Zvcih2YXIgaT0wO2k8cG9seS5tX3ZlcnRleENvdW50OysraSkKe3ZhciBzPXBvbHkubV9ub3JtYWxzW2ldLngqKHhMb2NhbFgtcG9seS5tX3ZlcnRpY2VzW2ldLngpK3BvbHkubV9ub3JtYWxzW2ldLnkqKHhMb2NhbFktcG9seS5tX3ZlcnRpY2VzW2ldLnkpO2lmKHM|cmFkaXVzKQp7cmV0dXJuO30KaWYocz5zZXBhcmF0aW9uKQp7c2VwYXJhdGlvbj1zO25vcm1hbEluZGV4PWk7fX0KaWYoc2VwYXJhdGlvbjxOdW1iZXIuTUlOX1ZBTFVFKQp7bWFuaWZvbGQucG9pbnRDb3VudD0xO3ZhciB0VmVjPXBvbHkubV9ub3JtYWxzW25vcm1hbEluZGV4XTttYW5pZm9sZC5ub3JtYWwueD10TWF0LmNvbDEueCp0VmVjLngrdE1hdC5jb2wyLngqdFZlYy55O21hbmlmb2xkLm5vcm1hbC55PXRNYXQuY29sMS55KnRWZWMueCt0TWF0LmNvbDIueSp0VmVjLnk7dFBvaW50PW1hbmlmb2xkLnBvaW50c1swXTt0UG9pbnQuaWQuZmVhdHVyZXMuaW5jaWRlbnRFZGdlPW5vcm1hbEluZGV4O3RQb2ludC5pZC5mZWF0dXJlcy5pbmNpZGVudFZlcnRleD1iMkNvbGxpc2lvbi5iMl9udWxsRmVhdHVyZTt0UG9pbnQuaWQuZmVhdHVyZXMucmVmZXJlbmNlRmFjZT1iMkNvbGxpc2lvbi5iMl9udWxsRmVhdHVyZTt0UG9pbnQuaWQuZmVhdHVyZXMuZmxpcD0wO3RQb2ludC5wb3NpdGlvbi54PWNpcmNsZS5tX3Bvc2l0aW9uLngtcmFkaXVzKm1hbmlmb2xkLm5vcm1hbC54O3RQb2ludC5wb3NpdGlvbi55PWNpcmNsZS5tX3Bvc2l0aW9uLnktcmFkaXVzKm1hbmlmb2xkLm5vcm1hbC55O3RQb2ludC5zZXBhcmF0aW9uPXNlcGFyYXRpb24tcmFkaXVzO3JldHVybjt9CnZhciB2ZXJ0SW5kZXgxPW5vcm1hbEluZGV4O3ZhciB2ZXJ0SW5kZXgyPXZlcnRJbmRleDErMTxwb2x5Lm1fdmVydGV4Q291bnQ|MTYpJjB4MDAwMDAwZmY7dGhpcy5mZWF0dXJlcy5fZmxpcD0oKHRoaXMuX2tleSYweGZmMDAwMDAwKT4|OCkmMHgwMDAwMDBmZjt0aGlzLmZlYXR1cmVzLl9pbmNpZGVudFZlcnRleD0oKHRoaXMuX2tleSYweDAwZmYwMDAwKT4|PWxlbmd0aCkKe3BYPXBvbHkubV92ZXJ0aWNlc1t2ZXJ0SW5kZXgyXS54O3BZPXBvbHkubV92ZXJ0aWNlc1t2ZXJ0SW5kZXgyXS55O3RQb2ludC5pZC5mZWF0dXJlcy5pbmNpZGVudFZlcnRleD12ZXJ0SW5kZXgyO30KZWxzZQp7cFg9ZVgqdStwb2x5Lm1fdmVydGljZXNbdmVydEluZGV4MV0ueDtwWT1lWSp1K3BvbHkubV92ZXJ0aWNlc1t2ZXJ0SW5kZXgxXS55O3RQb2ludC5pZC5mZWF0dXJlcy5pbmNpZGVudEVkZ2U9dmVydEluZGV4MTt9CmRYPXhMb2NhbFgtcFg7ZFk9eExvY2FsWS1wWTtkaXN0PU1hdGguc3FydChkWCpkWCtkWSpkWSk7ZFgvPWRpc3Q7ZFkvPWRpc3Q7aWYoZGlzdD5yYWRpdXMpCntyZXR1cm47fQptYW5pZm9sZC5wb2ludENvdW50PTE7bWFuaWZvbGQubm9ybWFsLlNldCh0TWF0LmNvbDEueCpkWCt0TWF0LmNvbDIueCpkWSx0TWF0LmNvbDEueSpkWCt0TWF0LmNvbDIueSpkWSk7dFBvaW50LnBvc2l0aW9uLng9Y2lyY2xlLm1fcG9zaXRpb24ueC1yYWRpdXMqbWFuaWZvbGQubm9ybWFsLng7dFBvaW50LnBvc2l0aW9uLnk9Y2lyY2xlLm1fcG9zaXRpb24ueS1yYWRpdXMqbWFuaWZvbGQubm9ybWFsLnk7dFBvaW50LnNlcGFyYXRpb249ZGlzdC1yYWRpdXM7fTtiMkNvbGxpc2lvbi5iMlRlc3RPdmVybGFwPWZ1bmN0aW9uKGEsYikKe3ZhciB0MT1iLm1pblZlcnRleDt2YXIgdDI9YS5tYXhWZXJ0ZXg7dmFyIGQxWD10MS54LXQyLng7dmFyIGQxWT10MS55LXQyLnk7dDE9YS5taW5WZXJ0ZXg7dDI9Yi5tYXhWZXJ0ZXg7dmFyIGQyWD10MS54LXQyLng7dmFyIGQyWT10MS55LXQyLnk7aWYoZDFYPjAuMHx8ZDFZPjAuMCkKcmV0dXJuIGZhbHNlO2lmKGQyWD4wLjB8fGQyWT4wLjApCnJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9Owp2YXIgRmVhdHVyZXM9Q2xhc3MuY3JlYXRlKCk7RmVhdHVyZXMucHJvdG90eXBlPXtzZXRfcmVmZXJlbmNlRmFjZTpmdW5jdGlvbih2YWx1ZSl7dGhpcy5fcmVmZXJlbmNlRmFjZT12YWx1ZTt0aGlzLl9tX2lkLl9rZXk9KHRoaXMuX21faWQuX2tleSYweGZmZmZmZjAwKXwodGhpcy5fcmVmZXJlbmNlRmFjZSYweDAwMDAwMGZmKX0sZ2V0X3JlZmVyZW5jZUZhY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVmZXJlbmNlRmFjZTt9LF9yZWZlcmVuY2VGYWNlOjAsc2V0X2luY2lkZW50RWRnZTpmdW5jdGlvbih2YWx1ZSl7dGhpcy5faW5jaWRlbnRFZGdlPXZhbHVlO3RoaXMuX21faWQuX2tleT0odGhpcy5fbV9pZC5fa2V5JjB4ZmZmZjAwZmYpfCgodGhpcy5faW5jaWRlbnRFZGdlPDw4KSYweDAwMDBmZjAwKX0sZ2V0X2luY2lkZW50RWRnZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmNpZGVudEVkZ2U7fSxfaW5jaWRlbnRFZGdlOjAsc2V0X2luY2lkZW50VmVydGV4OmZ1bmN0aW9uKHZhbHVlKXt0aGlzLl9pbmNpZGVudFZlcnRleD12YWx1ZTt0aGlzLl9tX2lkLl9rZXk9KHRoaXMuX21faWQuX2tleSYweGZmMDBmZmZmKXwoKHRoaXMuX2luY2lkZW50VmVydGV4PDwxNikmMHgwMGZmMDAwMCl9LGdldF9pbmNpZGVudFZlcnRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmNpZGVudFZlcnRleDt9LF9pbmNpZGVudFZlcnRleDowLHNldF9mbGlwOmZ1bmN0aW9uKHZhbHVlKXt0aGlzLl9mbGlwPXZhbHVlO3RoaXMuX21faWQuX2tleT0odGhpcy5fbV9pZC5fa2V5JjB4MDBmZmZmZmYpfCgodGhpcy5fZmxpcDw8MjQpJjB4ZmYwMDAwMDApfSxnZXRfZmxpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mbGlwO30sX2ZsaXA6MCxfbV9pZDpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9fTsKdmFyIGIyQ29udGFjdElEPUNsYXNzLmNyZWF0ZSgpO2IyQ29udGFjdElELnByb3RvdHlwZT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuZmVhdHVyZXM9bmV3IEZlYXR1cmVzKCk7dGhpcy5mZWF0dXJlcy5fbV9pZD10aGlzO30sU2V0OmZ1bmN0aW9uKGlkKXt0aGlzLnNldF9rZXkoaWQuX2tleSk7fSxDb3B5OmZ1bmN0aW9uKCl7dmFyIGlkPW5ldyBiMkNvbnRhY3RJRCgpO2lkLnNldF9rZXkodGhpcy5fa2V5KTtyZXR1cm4gaWQ7fSxnZXRfa2V5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2tleTt9LHNldF9rZXk6ZnVuY3Rpb24odmFsdWUpe3RoaXMuX2tleT12YWx1ZTt0aGlzLmZlYXR1cmVzLl9yZWZlcmVuY2VGYWNlPXRoaXMuX2tleSYweDAwMDAwMGZmO3RoaXMuZmVhdHVyZXMuX2luY2lkZW50RWRnZT0oKHRoaXMuX2tleSYweDAwMDBmZjAwKT4|dmVydEluZGV4MSsxOjA7dmFyIGVYPXBvbHkubV92ZXJ0aWNlc1t2ZXJ0SW5kZXgyXS54LXBvbHkubV92ZXJ0aWNlc1t2ZXJ0SW5kZXgxXS54O3ZhciBlWT1wb2x5Lm1fdmVydGljZXNbdmVydEluZGV4Ml0ueS1wb2x5Lm1fdmVydGljZXNbdmVydEluZGV4MV0ueTt2YXIgbGVuZ3RoPU1hdGguc3FydChlWCplWCtlWSplWSk7ZVgvPWxlbmd0aDtlWS89bGVuZ3RoO2lmKGxlbmd0aDxOdW1iZXIuTUlOX1ZBTFVFKQp7ZFg9eExvY2FsWC1wb2x5Lm1fdmVydGljZXNbdmVydEluZGV4MV0ueDtkWT14TG9jYWxZLXBvbHkubV92ZXJ0aWNlc1t2ZXJ0SW5kZXgxXS55O2Rpc3Q9TWF0aC5zcXJ0KGRYKmRYK2RZKmRZKTtkWC89ZGlzdDtkWS89ZGlzdDtpZihkaXN0PnJhZGl1cykKe3JldHVybjt9Cm1hbmlmb2xkLnBvaW50Q291bnQ9MTttYW5pZm9sZC5ub3JtYWwuU2V0KHRNYXQuY29sMS54KmRYK3RNYXQuY29sMi54KmRZLHRNYXQuY29sMS55KmRYK3RNYXQuY29sMi55KmRZKTt0UG9pbnQ9bWFuaWZvbGQucG9pbnRzWzBdO3RQb2ludC5pZC5mZWF0dXJlcy5pbmNpZGVudEVkZ2U9YjJDb2xsaXNpb24uYjJfbnVsbEZlYXR1cmU7dFBvaW50LmlkLmZlYXR1cmVzLmluY2lkZW50VmVydGV4PXZlcnRJbmRleDE7dFBvaW50LmlkLmZlYXR1cmVzLnJlZmVyZW5jZUZhY2U9YjJDb2xsaXNpb24uYjJfbnVsbEZlYXR1cmU7dFBvaW50LmlkLmZlYXR1cmVzLmZsaXA9MDt0UG9pbnQucG9zaXRpb24ueD1jaXJjbGUubV9wb3NpdGlvbi54LXJhZGl1cyptYW5pZm9sZC5ub3JtYWwueDt0UG9pbnQucG9zaXRpb24ueT1jaXJjbGUubV9wb3NpdGlvbi55LXJhZGl1cyptYW5pZm9sZC5ub3JtYWwueTt0UG9pbnQuc2VwYXJhdGlvbj1kaXN0LXJhZGl1cztyZXR1cm47fQp2YXIgdT0oeExvY2FsWC1wb2x5Lm1fdmVydGljZXNbdmVydEluZGV4MV0ueCkqZVgrKHhMb2NhbFktcG9seS5tX3ZlcnRpY2VzW3ZlcnRJbmRleDFdLnkpKmVZO3RQb2ludD1tYW5pZm9sZC5wb2ludHNbMF07dFBvaW50LmlkLmZlYXR1cmVzLmluY2lkZW50RWRnZT1iMkNvbGxpc2lvbi5iMl9udWxsRmVhdHVyZTt0UG9pbnQuaWQuZmVhdHVyZXMuaW5jaWRlbnRWZXJ0ZXg9YjJDb2xsaXNpb24uYjJfbnVsbEZlYXR1cmU7dFBvaW50LmlkLmZlYXR1cmVzLnJlZmVyZW5jZUZhY2U9YjJDb2xsaXNpb24uYjJfbnVsbEZlYXR1cmU7dFBvaW50LmlkLmZlYXR1cmVzLmZsaXA9MDt2YXIgcFgscFk7aWYodTw9MC4wKQp7cFg9cG9seS5tX3ZlcnRpY2VzW3ZlcnRJbmRleDFdLng7cFk9cG9seS5tX3ZlcnRpY2VzW3ZlcnRJbmRleDFdLnk7dFBvaW50LmlkLmZlYXR1cmVzLmluY2lkZW50VmVydGV4PXZlcnRJbmRleDE7fQplbHNlIGlmKHU|MC4wJiZjb25zZXJ2YXRpdmU9PWZhbHNlKQp7cmV0dXJuIHM7fQp2YXIgcHJldkVkZ2U9ZWRnZS0xPj0wP2VkZ2UtMTpjb3VudDEtMTt2YXIgc1ByZXY9YjJDb2xsaXNpb24uRWRnZVNlcGFyYXRpb24ocG9seTEscHJldkVkZ2UscG9seTIpO2lmKHNQcmV2PjAuMCYmY29uc2VydmF0aXZlPT1mYWxzZSkKe3JldHVybiBzUHJldjt9CnZhciBuZXh0RWRnZT1lZGdlKzE8Y291bnQxP2VkZ2UrMTowO3ZhciBzTmV4dD1iMkNvbGxpc2lvbi5FZGdlU2VwYXJhdGlvbihwb2x5MSxuZXh0RWRnZSxwb2x5Mik7aWYoc05leHQ|dmFsdWUpCntoaWdoPW1pZC0xO30KZWxzZSBpZihib3VuZHNbbWlkXS52YWx1ZTx2YWx1ZSkKe2xvdz1taWQrMTt9CmVsc2UKe3JldHVybihtaWQpO319CnJldHVybihsb3cpO307CnZhciBiMkNvbGxpc2lvbj1DbGFzcy5jcmVhdGUoKTtiMkNvbGxpc2lvbi5wcm90b3R5cGU9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt9fQpiMkNvbGxpc2lvbi5iMl9udWxsRmVhdHVyZT0weDAwMDAwMGZmO2IyQ29sbGlzaW9uLkNsaXBTZWdtZW50VG9MaW5lPWZ1bmN0aW9uKHZPdXQsdkluLG5vcm1hbCxvZmZzZXQpCnt2YXIgbnVtT3V0PTA7dmFyIHZJbjA9dkluWzBdLnY7dmFyIHZJbjE9dkluWzFdLnY7dmFyIGRpc3RhbmNlMD1iMk1hdGguYjJEb3Qobm9ybWFsLHZJblswXS52KS1vZmZzZXQ7dmFyIGRpc3RhbmNlMT1iMk1hdGguYjJEb3Qobm9ybWFsLHZJblsxXS52KS1vZmZzZXQ7aWYoZGlzdGFuY2UwPD0wLjApdk91dFtudW1PdXQrK109dkluWzBdO2lmKGRpc3RhbmNlMTw9MC4wKXZPdXRbbnVtT3V0KytdPXZJblsxXTtpZihkaXN0YW5jZTAqZGlzdGFuY2UxPDAuMCkKe3ZhciBpbnRlcnA9ZGlzdGFuY2UwLyhkaXN0YW5jZTAtZGlzdGFuY2UxKTt2YXIgdFZlYz12T3V0W251bU91dF0udjt0VmVjLng9dkluMC54K2ludGVycCoodkluMS54LXZJbjAueCk7dFZlYy55PXZJbjAueStpbnRlcnAqKHZJbjEueS12SW4wLnkpO2lmKGRpc3RhbmNlMD4wLjApCnt2T3V0W251bU91dF0uaWQ9dkluWzBdLmlkO30KZWxzZQp7dk91dFtudW1PdXRdLmlkPXZJblsxXS5pZDt9CisrbnVtT3V0O30KcmV0dXJuIG51bU91dDt9O2IyQ29sbGlzaW9uLkVkZ2VTZXBhcmF0aW9uPWZ1bmN0aW9uKHBvbHkxLGVkZ2UxLHBvbHkyKQp7dmFyIHZlcnQxcz1wb2x5MS5tX3ZlcnRpY2VzO3ZhciBjb3VudDI9cG9seTIubV92ZXJ0ZXhDb3VudDt2YXIgdmVydDJzPXBvbHkyLm1fdmVydGljZXM7dmFyIG5vcm1hbFg9cG9seTEubV9ub3JtYWxzW2VkZ2UxXS54O3ZhciBub3JtYWxZPXBvbHkxLm1fbm9ybWFsc1tlZGdlMV0ueTt2YXIgdFg9bm9ybWFsWDt2YXIgdE1hdD1wb2x5MS5tX1I7bm9ybWFsWD10TWF0LmNvbDEueCp0WCt0TWF0LmNvbDIueCpub3JtYWxZO25vcm1hbFk9dE1hdC5jb2wxLnkqdFgrdE1hdC5jb2wyLnkqbm9ybWFsWTt2YXIgbm9ybWFsTG9jYWwyWD1ub3JtYWxYO3ZhciBub3JtYWxMb2NhbDJZPW5vcm1hbFk7dE1hdD1wb2x5Mi5tX1I7dFg9bm9ybWFsTG9jYWwyWCp0TWF0LmNvbDEueCtub3JtYWxMb2NhbDJZKnRNYXQuY29sMS55O25vcm1hbExvY2FsMlk9bm9ybWFsTG9jYWwyWCp0TWF0LmNvbDIueCtub3JtYWxMb2NhbDJZKnRNYXQuY29sMi55O25vcm1hbExvY2FsMlg9dFg7dmFyIHZlcnRleEluZGV4Mj0wO3ZhciBtaW5Eb3Q9TnVtYmVyLk1BWF9WQUxVRTtmb3IodmFyIGk9MDtpPGNvdW50MjsrK2kpCnt2YXIgdFZlYz12ZXJ0MnNbaV07dmFyIGRvdD10VmVjLngqbm9ybWFsTG9jYWwyWCt0VmVjLnkqbm9ybWFsTG9jYWwyWTtpZihkb3Q8bWluRG90KQp7bWluRG90PWRvdDt2ZXJ0ZXhJbmRleDI9aTt9fQp0TWF0PXBvbHkxLm1fUjt2YXIgdjFYPXBvbHkxLm1fcG9zaXRpb24ueCsodE1hdC5jb2wxLngqdmVydDFzW2VkZ2UxXS54K3RNYXQuY29sMi54KnZlcnQxc1tlZGdlMV0ueSkKdmFyIHYxWT1wb2x5MS5tX3Bvc2l0aW9uLnkrKHRNYXQuY29sMS55KnZlcnQxc1tlZGdlMV0ueCt0TWF0LmNvbDIueSp2ZXJ0MXNbZWRnZTFdLnkpCnRNYXQ9cG9seTIubV9SO3ZhciB2Mlg9cG9seTIubV9wb3NpdGlvbi54Kyh0TWF0LmNvbDEueCp2ZXJ0MnNbdmVydGV4SW5kZXgyXS54K3RNYXQuY29sMi54KnZlcnQyc1t2ZXJ0ZXhJbmRleDJdLnkpCnZhciB2Mlk9cG9seTIubV9wb3NpdGlvbi55Kyh0TWF0LmNvbDEueSp2ZXJ0MnNbdmVydGV4SW5kZXgyXS54K3RNYXQuY29sMi55KnZlcnQyc1t2ZXJ0ZXhJbmRleDJdLnkpCnYyWC09djFYO3YyWS09djFZO3ZhciBzZXBhcmF0aW9uPXYyWCpub3JtYWxYK3YyWSpub3JtYWxZO3JldHVybiBzZXBhcmF0aW9uO307YjJDb2xsaXNpb24uRmluZE1heFNlcGFyYXRpb249ZnVuY3Rpb24oZWRnZUluZGV4LHBvbHkxLHBvbHkyLGNvbnNlcnZhdGl2ZSkKe3ZhciBjb3VudDE9cG9seTEubV92ZXJ0ZXhDb3VudDt2YXIgZFg9cG9seTIubV9wb3NpdGlvbi54LXBvbHkxLm1fcG9zaXRpb24ueDt2YXIgZFk9cG9seTIubV9wb3NpdGlvbi55LXBvbHkxLm1fcG9zaXRpb24ueTt2YXIgZExvY2FsMVg9KGRYKnBvbHkxLm1fUi5jb2wxLngrZFkqcG9seTEubV9SLmNvbDEueSk7dmFyIGRMb2NhbDFZPShkWCpwb2x5MS5tX1IuY29sMi54K2RZKnBvbHkxLm1fUi5jb2wyLnkpO3ZhciBlZGdlPTA7dmFyIG1heERvdD0tTnVtYmVyLk1BWF9WQUxVRTtmb3IodmFyIGk9MDtpPGNvdW50MTsrK2kpCnt2YXIgZG90PShwb2x5MS5tX25vcm1hbHNbaV0ueCpkTG9jYWwxWCtwb2x5MS5tX25vcm1hbHNbaV0ueSpkTG9jYWwxWSk7aWYoZG90Pm1heERvdCkKe21heERvdD1kb3Q7ZWRnZT1pO319CnZhciBzPWIyQ29sbGlzaW9uLkVkZ2VTZXBhcmF0aW9uKHBvbHkxLGVkZ2UscG9seTIpO2lmKHM|cHJveHlJZDIpe3ZhciB0ZW1wPXByb3h5SWQxO3Byb3h5SWQxPXByb3h5SWQyO3Byb3h5SWQyPXRlbXA7fQp2YXIgaGFzaD1iMlBhaXJNYW5hZ2VyLkhhc2gocHJveHlJZDEscHJveHlJZDIpJmIyUGFpci5iMl90YWJsZU1hc2s7cmV0dXJuIHRoaXMuRmluZEhhc2gocHJveHlJZDEscHJveHlJZDIsaGFzaCk7fSxGaW5kSGFzaDpmdW5jdGlvbihwcm94eUlkMSxwcm94eUlkMixoYXNoKXt2YXIgaW5kZXg9dGhpcy5tX2hhc2hUYWJsZVtoYXNoXTt3aGlsZShpbmRleCE9YjJQYWlyLmIyX251bGxQYWlyJiZiMlBhaXJNYW5hZ2VyLkVxdWFscyh0aGlzLm1fcGFpcnNbaW5kZXhdLHByb3h5SWQxLHByb3h5SWQyKT09ZmFsc2UpCntpbmRleD10aGlzLm1fcGFpcnNbaW5kZXhdLm5leHQ7fQppZihpbmRleD09YjJQYWlyLmIyX251bGxQYWlyKQp7cmV0dXJuIG51bGw7fQpyZXR1cm4gdGhpcy5tX3BhaXJzW2luZGV4XTt9LFZhbGlkYXRlQnVmZmVyOmZ1bmN0aW9uKCl7fSxWYWxpZGF0ZVRhYmxlOmZ1bmN0aW9uKCl7fSxtX2Jyb2FkUGhhc2U6bnVsbCxtX2NhbGxiYWNrOm51bGwsbV9wYWlyczpudWxsLG1fZnJlZVBhaXI6MCxtX3BhaXJDb3VudDowLG1fcGFpckJ1ZmZlcjpudWxsLG1fcGFpckJ1ZmZlckNvdW50OjAsbV9oYXNoVGFibGU6bnVsbH07YjJQYWlyTWFuYWdlci5IYXNoPWZ1bmN0aW9uKHByb3h5SWQxLHByb3h5SWQyKQp7dmFyIGtleT0oKHByb3h5SWQyPDwxNikmMHhmZmZmMDAwMCl8cHJveHlJZDE7a2V5PX5rZXkrKChrZXk8PDE1KSYweEZGRkY4MDAwKTtrZXk9a2V5Xigoa2V5Pj4xMikmMHgwMDBmZmZmZik7a2V5PWtleSsoKGtleTw8MikmMHhGRkZGRkZGQyk7a2V5PWtleV4oKGtleT4|PTAuMDt2YWxpZD12YWxpZCYmdGhpcy5taW5WZXJ0ZXguSXNWYWxpZCgpJiZ0aGlzLm1heFZlcnRleC5Jc1ZhbGlkKCk7cmV0dXJuIHZhbGlkO30sbWluVmVydGV4Om5ldyBiMlZlYzIoKSxtYXhWZXJ0ZXg6bmV3IGIyVmVjMigpLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLm1pblZlcnRleD1uZXcgYjJWZWMyKCk7dGhpcy5tYXhWZXJ0ZXg9bmV3IGIyVmVjMigpO319Owp2YXIgYjJCb3VuZD1DbGFzcy5jcmVhdGUoKTtiMkJvdW5kLnByb3RvdHlwZT17SXNMb3dlcjpmdW5jdGlvbigpe3JldHVybih0aGlzLnZhbHVlJjEpPT0wO30sSXNVcHBlcjpmdW5jdGlvbigpe3JldHVybih0aGlzLnZhbHVlJjEpPT0xO30sU3dhcDpmdW5jdGlvbihiKXt2YXIgdGVtcFZhbHVlPXRoaXMudmFsdWU7dmFyIHRlbXBQcm94eUlkPXRoaXMucHJveHlJZDt2YXIgdGVtcFN0YWJiaW5nQ291bnQ9dGhpcy5zdGFiYmluZ0NvdW50O3RoaXMudmFsdWU9Yi52YWx1ZTt0aGlzLnByb3h5SWQ9Yi5wcm94eUlkO3RoaXMuc3RhYmJpbmdDb3VudD1iLnN0YWJiaW5nQ291bnQ7Yi52YWx1ZT10ZW1wVmFsdWU7Yi5wcm94eUlkPXRlbXBQcm94eUlkO2Iuc3RhYmJpbmdDb3VudD10ZW1wU3RhYmJpbmdDb3VudDt9LHZhbHVlOjAscHJveHlJZDowLHN0YWJiaW5nQ291bnQ6MCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7fX0KdmFyIGIyQm91bmRWYWx1ZXM9Q2xhc3MuY3JlYXRlKCk7YjJCb3VuZFZhbHVlcy5wcm90b3R5cGU9e2xvd2VyVmFsdWVzOlswLDBdLHVwcGVyVmFsdWVzOlswLDBdLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmxvd2VyVmFsdWVzPVswLDBdO3RoaXMudXBwZXJWYWx1ZXM9WzAsMF07fX0KdmFyIGIyUGFpcj1DbGFzcy5jcmVhdGUoKTtiMlBhaXIucHJvdG90eXBlPXtTZXRCdWZmZXJlZDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzfD1iMlBhaXIuZV9wYWlyQnVmZmVyZWQ7fSxDbGVhckJ1ZmZlcmVkOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXMmPX5iMlBhaXIuZV9wYWlyQnVmZmVyZWQ7fSxJc0J1ZmZlcmVkOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc3RhdHVzJmIyUGFpci5lX3BhaXJCdWZmZXJlZCk9PWIyUGFpci5lX3BhaXJCdWZmZXJlZDt9LFNldFJlbW92ZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1c3w9YjJQYWlyLmVfcGFpclJlbW92ZWQ7fSxDbGVhclJlbW92ZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cyY9fmIyUGFpci5lX3BhaXJSZW1vdmVkO30sSXNSZW1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc3RhdHVzJmIyUGFpci5lX3BhaXJSZW1vdmVkKT09YjJQYWlyLmVfcGFpclJlbW92ZWQ7fSxTZXRGaW5hbDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzfD1iMlBhaXIuZV9wYWlyRmluYWw7fSxJc0ZpbmFsOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc3RhdHVzJmIyUGFpci5lX3BhaXJGaW5hbCk9PWIyUGFpci5lX3BhaXJGaW5hbDt9LHVzZXJEYXRhOm51bGwscHJveHlJZDE6MCxwcm94eUlkMjowLG5leHQ6MCxzdGF0dXM6MCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7fX07YjJQYWlyLmIyX251bGxQYWlyPWIyU2V0dGluZ3MuVVNIUlRfTUFYO2IyUGFpci5iMl9udWxsUHJveHk9YjJTZXR0aW5ncy5VU0hSVF9NQVg7YjJQYWlyLmIyX3RhYmxlQ2FwYWNpdHk9YjJTZXR0aW5ncy5iMl9tYXhQYWlycztiMlBhaXIuYjJfdGFibGVNYXNrPWIyUGFpci5iMl90YWJsZUNhcGFjaXR5LTE7YjJQYWlyLmVfcGFpckJ1ZmZlcmVkPTB4MDAwMTtiMlBhaXIuZV9wYWlyUmVtb3ZlZD0weDAwMDI7YjJQYWlyLmVfcGFpckZpbmFsPTB4MDAwNDsKdmFyIGIyUGFpckNhbGxiYWNrPUNsYXNzLmNyZWF0ZSgpO2IyUGFpckNhbGxiYWNrLnByb3RvdHlwZT17UGFpckFkZGVkOmZ1bmN0aW9uKHByb3h5VXNlckRhdGExLHByb3h5VXNlckRhdGEyKXtyZXR1cm4gbnVsbH0sUGFpclJlbW92ZWQ6ZnVuY3Rpb24ocHJveHlVc2VyRGF0YTEscHJveHlVc2VyRGF0YTIscGFpclVzZXJEYXRhKXt9LGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9fTsKdmFyIGIyQnVmZmVyZWRQYWlyPUNsYXNzLmNyZWF0ZSgpO2IyQnVmZmVyZWRQYWlyLnByb3RvdHlwZT17cHJveHlJZDE6MCxwcm94eUlkMjowLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9fQp2YXIgYjJQYWlyTWFuYWdlcj1DbGFzcy5jcmVhdGUoKTtiMlBhaXJNYW5hZ2VyLnByb3RvdHlwZT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBpPTA7dGhpcy5tX2hhc2hUYWJsZT1uZXcgQXJyYXkoYjJQYWlyLmIyX3RhYmxlQ2FwYWNpdHkpO2ZvcihpPTA7aTxiMlBhaXIuYjJfdGFibGVDYXBhY2l0eTsrK2kpCnt0aGlzLm1faGFzaFRhYmxlW2ldPWIyUGFpci5iMl9udWxsUGFpcjt9CnRoaXMubV9wYWlycz1uZXcgQXJyYXkoYjJTZXR0aW5ncy5iMl9tYXhQYWlycyk7Zm9yKGk9MDtpPGIyU2V0dGluZ3MuYjJfbWF4UGFpcnM7KytpKQp7dGhpcy5tX3BhaXJzW2ldPW5ldyBiMlBhaXIoKTt9CnRoaXMubV9wYWlyQnVmZmVyPW5ldyBBcnJheShiMlNldHRpbmdzLmIyX21heFBhaXJzKTtmb3IoaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhQYWlyczsrK2kpCnt0aGlzLm1fcGFpckJ1ZmZlcltpXT1uZXcgYjJCdWZmZXJlZFBhaXIoKTt9CmZvcihpPTA7aTxiMlNldHRpbmdzLmIyX21heFBhaXJzOysraSkKe3RoaXMubV9wYWlyc1tpXS5wcm94eUlkMT1iMlBhaXIuYjJfbnVsbFByb3h5O3RoaXMubV9wYWlyc1tpXS5wcm94eUlkMj1iMlBhaXIuYjJfbnVsbFByb3h5O3RoaXMubV9wYWlyc1tpXS51c2VyRGF0YT1udWxsO3RoaXMubV9wYWlyc1tpXS5zdGF0dXM9MDt0aGlzLm1fcGFpcnNbaV0ubmV4dD0oaSsxKTt9CnRoaXMubV9wYWlyc1tiMlNldHRpbmdzLmIyX21heFBhaXJzLTFdLm5leHQ9YjJQYWlyLmIyX251bGxQYWlyO3RoaXMubV9wYWlyQ291bnQ9MDt9LEluaXRpYWxpemU6ZnVuY3Rpb24oYnJvYWRQaGFzZSxjYWxsYmFjayl7dGhpcy5tX2Jyb2FkUGhhc2U9YnJvYWRQaGFzZTt0aGlzLm1fY2FsbGJhY2s9Y2FsbGJhY2s7fSxBZGRCdWZmZXJlZFBhaXI6ZnVuY3Rpb24ocHJveHlJZDEscHJveHlJZDIpe3ZhciBwYWlyPXRoaXMuQWRkUGFpcihwcm94eUlkMSxwcm94eUlkMik7aWYocGFpci5Jc0J1ZmZlcmVkKCk9PWZhbHNlKQp7cGFpci5TZXRCdWZmZXJlZCgpO3RoaXMubV9wYWlyQnVmZmVyW3RoaXMubV9wYWlyQnVmZmVyQ291bnRdLnByb3h5SWQxPXBhaXIucHJveHlJZDE7dGhpcy5tX3BhaXJCdWZmZXJbdGhpcy5tX3BhaXJCdWZmZXJDb3VudF0ucHJveHlJZDI9cGFpci5wcm94eUlkMjsrK3RoaXMubV9wYWlyQnVmZmVyQ291bnQ7fQpwYWlyLkNsZWFyUmVtb3ZlZCgpO2lmKGIyQnJvYWRQaGFzZS5zX3ZhbGlkYXRlKQp7dGhpcy5WYWxpZGF0ZUJ1ZmZlcigpO319LFJlbW92ZUJ1ZmZlcmVkUGFpcjpmdW5jdGlvbihwcm94eUlkMSxwcm94eUlkMil7dmFyIHBhaXI9dGhpcy5GaW5kKHByb3h5SWQxLHByb3h5SWQyKTtpZihwYWlyPT1udWxsKQp7cmV0dXJuO30KaWYocGFpci5Jc0J1ZmZlcmVkKCk9PWZhbHNlKQp7cGFpci5TZXRCdWZmZXJlZCgpO3RoaXMubV9wYWlyQnVmZmVyW3RoaXMubV9wYWlyQnVmZmVyQ291bnRdLnByb3h5SWQxPXBhaXIucHJveHlJZDE7dGhpcy5tX3BhaXJCdWZmZXJbdGhpcy5tX3BhaXJCdWZmZXJDb3VudF0ucHJveHlJZDI9cGFpci5wcm94eUlkMjsrK3RoaXMubV9wYWlyQnVmZmVyQ291bnQ7fQpwYWlyLlNldFJlbW92ZWQoKTtpZihiMkJyb2FkUGhhc2Uuc192YWxpZGF0ZSkKe3RoaXMuVmFsaWRhdGVCdWZmZXIoKTt9fSxDb21taXQ6ZnVuY3Rpb24oKXt2YXIgaT0wO3ZhciByZW1vdmVDb3VudD0wO3ZhciBwcm94aWVzPXRoaXMubV9icm9hZFBoYXNlLm1fcHJveHlQb29sO2ZvcihpPTA7aTx0aGlzLm1fcGFpckJ1ZmZlckNvdW50OysraSkKe3ZhciBwYWlyPXRoaXMuRmluZCh0aGlzLm1fcGFpckJ1ZmZlcltpXS5wcm94eUlkMSx0aGlzLm1fcGFpckJ1ZmZlcltpXS5wcm94eUlkMik7cGFpci5DbGVhckJ1ZmZlcmVkKCk7dmFyIHByb3h5MT1wcm94aWVzW3BhaXIucHJveHlJZDFdO3ZhciBwcm94eTI9cHJveGllc1twYWlyLnByb3h5SWQyXTtpZihwYWlyLklzUmVtb3ZlZCgpKQp7aWYocGFpci5Jc0ZpbmFsKCk9PXRydWUpCnt0aGlzLm1fY2FsbGJhY2suUGFpclJlbW92ZWQocHJveHkxLnVzZXJEYXRhLHByb3h5Mi51c2VyRGF0YSxwYWlyLnVzZXJEYXRhKTt9CnRoaXMubV9wYWlyQnVmZmVyW3JlbW92ZUNvdW50XS5wcm94eUlkMT1wYWlyLnByb3h5SWQxO3RoaXMubV9wYWlyQnVmZmVyW3JlbW92ZUNvdW50XS5wcm94eUlkMj1wYWlyLnByb3h5SWQyOysrcmVtb3ZlQ291bnQ7fQplbHNlCntpZihwYWlyLklzRmluYWwoKT09ZmFsc2UpCntwYWlyLnVzZXJEYXRhPXRoaXMubV9jYWxsYmFjay5QYWlyQWRkZWQocHJveHkxLnVzZXJEYXRhLHByb3h5Mi51c2VyRGF0YSk7cGFpci5TZXRGaW5hbCgpO319fQpmb3IoaT0wO2k8cmVtb3ZlQ291bnQ7KytpKQp7dGhpcy5SZW1vdmVQYWlyKHRoaXMubV9wYWlyQnVmZmVyW2ldLnByb3h5SWQxLHRoaXMubV9wYWlyQnVmZmVyW2ldLnByb3h5SWQyKTt9CnRoaXMubV9wYWlyQnVmZmVyQ291bnQ9MDtpZihiMkJyb2FkUGhhc2Uuc192YWxpZGF0ZSkKe3RoaXMuVmFsaWRhdGVUYWJsZSgpO319LEFkZFBhaXI6ZnVuY3Rpb24ocHJveHlJZDEscHJveHlJZDIpe2lmKHByb3h5SWQxPnByb3h5SWQyKXt2YXIgdGVtcD1wcm94eUlkMTtwcm94eUlkMT1wcm94eUlkMjtwcm94eUlkMj10ZW1wO30KdmFyIGhhc2g9YjJQYWlyTWFuYWdlci5IYXNoKHByb3h5SWQxLHByb3h5SWQyKSZiMlBhaXIuYjJfdGFibGVNYXNrO3ZhciBwYWlyPXBhaXI9dGhpcy5GaW5kSGFzaChwcm94eUlkMSxwcm94eUlkMixoYXNoKTtpZihwYWlyIT1udWxsKQp7cmV0dXJuIHBhaXI7fQp2YXIgcEluZGV4PXRoaXMubV9mcmVlUGFpcjtwYWlyPXRoaXMubV9wYWlyc1twSW5kZXhdO3RoaXMubV9mcmVlUGFpcj1wYWlyLm5leHQ7cGFpci5wcm94eUlkMT1wcm94eUlkMTtwYWlyLnByb3h5SWQyPXByb3h5SWQyO3BhaXIuc3RhdHVzPTA7cGFpci51c2VyRGF0YT1udWxsO3BhaXIubmV4dD10aGlzLm1faGFzaFRhYmxlW2hhc2hdO3RoaXMubV9oYXNoVGFibGVbaGFzaF09cEluZGV4OysrdGhpcy5tX3BhaXJDb3VudDtyZXR1cm4gcGFpcjt9LFJlbW92ZVBhaXI6ZnVuY3Rpb24ocHJveHlJZDEscHJveHlJZDIpe2lmKHByb3h5SWQxPnByb3h5SWQyKXt2YXIgdGVtcD1wcm94eUlkMTtwcm94eUlkMT1wcm94eUlkMjtwcm94eUlkMj10ZW1wO30KdmFyIGhhc2g9YjJQYWlyTWFuYWdlci5IYXNoKHByb3h5SWQxLHByb3h5SWQyKSZiMlBhaXIuYjJfdGFibGVNYXNrO3ZhciBub2RlPXRoaXMubV9oYXNoVGFibGVbaGFzaF07dmFyIHBOb2RlPW51bGw7d2hpbGUobm9kZSE9YjJQYWlyLmIyX251bGxQYWlyKQp7aWYoYjJQYWlyTWFuYWdlci5FcXVhbHModGhpcy5tX3BhaXJzW25vZGVdLHByb3h5SWQxLHByb3h5SWQyKSkKe3ZhciBpbmRleD1ub2RlO2lmKHBOb2RlKXtwTm9kZS5uZXh0PXRoaXMubV9wYWlyc1tub2RlXS5uZXh0O30KZWxzZXt0aGlzLm1faGFzaFRhYmxlW2hhc2hdPXRoaXMubV9wYWlyc1tub2RlXS5uZXh0O30KdmFyIHBhaXI9dGhpcy5tX3BhaXJzW2luZGV4XTt2YXIgdXNlckRhdGE9cGFpci51c2VyRGF0YTtwYWlyLm5leHQ9dGhpcy5tX2ZyZWVQYWlyO3BhaXIucHJveHlJZDE9YjJQYWlyLmIyX251bGxQcm94eTtwYWlyLnByb3h5SWQyPWIyUGFpci5iMl9udWxsUHJveHk7cGFpci51c2VyRGF0YT1udWxsO3BhaXIuc3RhdHVzPTA7dGhpcy5tX2ZyZWVQYWlyPWluZGV4Oy0tdGhpcy5tX3BhaXJDb3VudDtyZXR1cm4gdXNlckRhdGE7fQplbHNlCntwTm9kZT10aGlzLm1fcGFpcnNbbm9kZV07bm9kZT1wTm9kZS5uZXh0O319CnJldHVybiBudWxsO30sRmluZDpmdW5jdGlvbihwcm94eUlkMSxwcm94eUlkMil7aWYocHJveHlJZDE|PTAuMCYmZFk|MCYmKHgmKHgtMSkpPT0wO3JldHVybiByZXN1bHQ7fTtiMk1hdGgudGVtcFZlYzI9bmV3IGIyVmVjMigpO2IyTWF0aC50ZW1wVmVjMz1uZXcgYjJWZWMyKCk7YjJNYXRoLnRlbXBWZWM0PW5ldyBiMlZlYzIoKTtiMk1hdGgudGVtcFZlYzU9bmV3IGIyVmVjMigpO2IyTWF0aC50ZW1wTWF0PW5ldyBiMk1hdDIyKCk7CnZhciBiMkFBQkI9Q2xhc3MuY3JlYXRlKCk7YjJBQUJCLnByb3RvdHlwZT17SXNWYWxpZDpmdW5jdGlvbigpe3ZhciBkWD10aGlzLm1heFZlcnRleC54O3ZhciBkWT10aGlzLm1heFZlcnRleC55O2RYPXRoaXMubWF4VmVydGV4Lng7ZFk9dGhpcy5tYXhWZXJ0ZXgueTtkWC09dGhpcy5taW5WZXJ0ZXgueDtkWS09dGhpcy5taW5WZXJ0ZXgueTt2YXIgdmFsaWQ9ZFg|NCkmMHgwZmZmZmZmZik7a2V5PWtleSoyMDU3O2tleT1rZXleKChrZXk|PjE2KSYweDAwMDBmZmZmKTtyZXR1cm4ga2V5O307YjJQYWlyTWFuYWdlci5FcXVhbHM9ZnVuY3Rpb24ocGFpcixwcm94eUlkMSxwcm94eUlkMikKe3JldHVybihwYWlyLnByb3h5SWQxPT1wcm94eUlkMSYmcGFpci5wcm94eUlkMj09cHJveHlJZDIpO307YjJQYWlyTWFuYWdlci5FcXVhbHNQYWlyPWZ1bmN0aW9uKHBhaXIxLHBhaXIyKQp7cmV0dXJuIHBhaXIxLnByb3h5SWQxPT1wYWlyMi5wcm94eUlkMSYmcGFpcjEucHJveHlJZDI9PXBhaXIyLnByb3h5SWQyO307CnZhciBiMkJyb2FkUGhhc2U9Q2xhc3MuY3JlYXRlKCk7YjJCcm9hZFBoYXNlLnByb3RvdHlwZT17aW5pdGlhbGl6ZTpmdW5jdGlvbih3b3JsZEFBQkIsY2FsbGJhY2spe3RoaXMubV9wYWlyTWFuYWdlcj1uZXcgYjJQYWlyTWFuYWdlcigpO3RoaXMubV9wcm94eVBvb2w9bmV3IEFycmF5KGIyU2V0dGluZ3MuYjJfbWF4UGFpcnMpO3RoaXMubV9ib3VuZHM9bmV3IEFycmF5KDIqYjJTZXR0aW5ncy5iMl9tYXhQcm94aWVzKTt0aGlzLm1fcXVlcnlSZXN1bHRzPW5ldyBBcnJheShiMlNldHRpbmdzLmIyX21heFByb3hpZXMpO3RoaXMubV9xdWFudGl6YXRpb25GYWN0b3I9bmV3IGIyVmVjMigpO3ZhciBpPTA7dGhpcy5tX3BhaXJNYW5hZ2VyLkluaXRpYWxpemUodGhpcyxjYWxsYmFjayk7dGhpcy5tX3dvcmxkQUFCQj13b3JsZEFBQkI7dGhpcy5tX3Byb3h5Q291bnQ9MDtmb3IoaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhQcm94aWVzO2krKyl7dGhpcy5tX3F1ZXJ5UmVzdWx0c1tpXT0wO30KdGhpcy5tX2JvdW5kcz1uZXcgQXJyYXkoMik7Zm9yKGk9MDtpPDI7aSsrKXt0aGlzLm1fYm91bmRzW2ldPW5ldyBBcnJheSgyKmIyU2V0dGluZ3MuYjJfbWF4UHJveGllcyk7Zm9yKHZhciBqPTA7ajwyKmIyU2V0dGluZ3MuYjJfbWF4UHJveGllcztqKyspe3RoaXMubV9ib3VuZHNbaV1bal09bmV3IGIyQm91bmQoKTt9fQp2YXIgZFg9d29ybGRBQUJCLm1heFZlcnRleC54O3ZhciBkWT13b3JsZEFBQkIubWF4VmVydGV4Lnk7ZFgtPXdvcmxkQUFCQi5taW5WZXJ0ZXgueDtkWS09d29ybGRBQUJCLm1pblZlcnRleC55O3RoaXMubV9xdWFudGl6YXRpb25GYWN0b3IueD1iMlNldHRpbmdzLlVTSFJUX01BWC9kWDt0aGlzLm1fcXVhbnRpemF0aW9uRmFjdG9yLnk9YjJTZXR0aW5ncy5VU0hSVF9NQVgvZFk7dmFyIHRQcm94eTtmb3IoaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhQcm94aWVzLTE7KytpKQp7dFByb3h5PW5ldyBiMlByb3h5KCk7dGhpcy5tX3Byb3h5UG9vbFtpXT10UHJveHk7dFByb3h5LlNldE5leHQoaSsxKTt0UHJveHkudGltZVN0YW1wPTA7dFByb3h5Lm92ZXJsYXBDb3VudD1iMkJyb2FkUGhhc2UuYjJfaW52YWxpZDt0UHJveHkudXNlckRhdGE9bnVsbDt9CnRQcm94eT1uZXcgYjJQcm94eSgpO3RoaXMubV9wcm94eVBvb2xbYjJTZXR0aW5ncy5iMl9tYXhQcm94aWVzLTFdPXRQcm94eTt0UHJveHkuU2V0TmV4dChiMlBhaXIuYjJfbnVsbFByb3h5KTt0UHJveHkudGltZVN0YW1wPTA7dFByb3h5Lm92ZXJsYXBDb3VudD1iMkJyb2FkUGhhc2UuYjJfaW52YWxpZDt0UHJveHkudXNlckRhdGE9bnVsbDt0aGlzLm1fZnJlZVByb3h5PTA7dGhpcy5tX3RpbWVTdGFtcD0xO3RoaXMubV9xdWVyeVJlc3VsdENvdW50PTA7fSxJblJhbmdlOmZ1bmN0aW9uKGFhYmIpe3ZhciBkWDt2YXIgZFk7dmFyIGQyWDt2YXIgZDJZO2RYPWFhYmIubWluVmVydGV4Lng7ZFk9YWFiYi5taW5WZXJ0ZXgueTtkWC09dGhpcy5tX3dvcmxkQUFCQi5tYXhWZXJ0ZXgueDtkWS09dGhpcy5tX3dvcmxkQUFCQi5tYXhWZXJ0ZXgueTtkMlg9dGhpcy5tX3dvcmxkQUFCQi5taW5WZXJ0ZXgueDtkMlk9dGhpcy5tX3dvcmxkQUFCQi5taW5WZXJ0ZXgueTtkMlgtPWFhYmIubWF4VmVydGV4Lng7ZDJZLT1hYWJiLm1heFZlcnRleC55O2RYPWIyTWF0aC5iMk1heChkWCxkMlgpO2RZPWIyTWF0aC5iMk1heChkWSxkMlkpO3JldHVybiBiMk1hdGguYjJNYXgoZFgsZFkpPDAuMDt9LEdldFByb3h5OmZ1bmN0aW9uKHByb3h5SWQpe2lmKHByb3h5SWQ9PWIyUGFpci5iMl9udWxsUHJveHl8fHRoaXMubV9wcm94eVBvb2xbcHJveHlJZF0uSXNWYWxpZCgpPT1mYWxzZSkKe3JldHVybiBudWxsO30KcmV0dXJuIHRoaXMubV9wcm94eVBvb2xbcHJveHlJZF07fSxDcmVhdGVQcm94eTpmdW5jdGlvbihhYWJiLHVzZXJEYXRhKXt2YXIgaW5kZXg9MDt2YXIgcHJveHk7dmFyIHByb3h5SWQ9dGhpcy5tX2ZyZWVQcm94eTtwcm94eT10aGlzLm1fcHJveHlQb29sW3Byb3h5SWRdO3RoaXMubV9mcmVlUHJveHk9cHJveHkuR2V0TmV4dCgpO3Byb3h5Lm92ZXJsYXBDb3VudD0wO3Byb3h5LnVzZXJEYXRhPXVzZXJEYXRhO3ZhciBib3VuZENvdW50PTIqdGhpcy5tX3Byb3h5Q291bnQ7dmFyIGxvd2VyVmFsdWVzPW5ldyBBcnJheSgpO3ZhciB1cHBlclZhbHVlcz1uZXcgQXJyYXkoKTt0aGlzLkNvbXB1dGVCb3VuZHMobG93ZXJWYWx1ZXMsdXBwZXJWYWx1ZXMsYWFiYik7Zm9yKHZhciBheGlzPTA7YXhpczwyOysrYXhpcykKe3ZhciBib3VuZHM9dGhpcy5tX2JvdW5kc1theGlzXTt2YXIgbG93ZXJJbmRleD0wO3ZhciB1cHBlckluZGV4PTA7dmFyIGxvd2VySW5kZXhPdXQ9W2xvd2VySW5kZXhdO3ZhciB1cHBlckluZGV4T3V0PVt1cHBlckluZGV4XTt0aGlzLlF1ZXJ5KGxvd2VySW5kZXhPdXQsdXBwZXJJbmRleE91dCxsb3dlclZhbHVlc1theGlzXSx1cHBlclZhbHVlc1theGlzXSxib3VuZHMsYm91bmRDb3VudCxheGlzKTtsb3dlckluZGV4PWxvd2VySW5kZXhPdXRbMF07dXBwZXJJbmRleD11cHBlckluZGV4T3V0WzBdO3ZhciB0QXJyPW5ldyBBcnJheSgpO3ZhciBqPTA7dmFyIHRFbmQ9Ym91bmRDb3VudC11cHBlckluZGV4CnZhciB0Qm91bmQxO3ZhciB0Qm91bmQyO2ZvcihqPTA7ajx0RW5kO2orKyl7dEFycltqXT1uZXcgYjJCb3VuZCgpO3RCb3VuZDE9dEFycltqXTt0Qm91bmQyPWJvdW5kc1t1cHBlckluZGV4K2pdO3RCb3VuZDEudmFsdWU9dEJvdW5kMi52YWx1ZTt0Qm91bmQxLnByb3h5SWQ9dEJvdW5kMi5wcm94eUlkO3RCb3VuZDEuc3RhYmJpbmdDb3VudD10Qm91bmQyLnN0YWJiaW5nQ291bnQ7fQp0RW5kPXRBcnIubGVuZ3RoO3ZhciB0SW5kZXg9dXBwZXJJbmRleCsyO2ZvcihqPTA7ajx0RW5kO2orKyl7dEJvdW5kMj10QXJyW2pdO3RCb3VuZDE9Ym91bmRzW3RJbmRleCtqXQp0Qm91bmQxLnZhbHVlPXRCb3VuZDIudmFsdWU7dEJvdW5kMS5wcm94eUlkPXRCb3VuZDIucHJveHlJZDt0Qm91bmQxLnN0YWJiaW5nQ291bnQ9dEJvdW5kMi5zdGFiYmluZ0NvdW50O30KdEFycj1uZXcgQXJyYXkoKTt0RW5kPXVwcGVySW5kZXgtbG93ZXJJbmRleDtmb3Ioaj0wO2o8dEVuZDtqKyspe3RBcnJbal09bmV3IGIyQm91bmQoKTt0Qm91bmQxPXRBcnJbal07dEJvdW5kMj1ib3VuZHNbbG93ZXJJbmRleCtqXTt0Qm91bmQxLnZhbHVlPXRCb3VuZDIudmFsdWU7dEJvdW5kMS5wcm94eUlkPXRCb3VuZDIucHJveHlJZDt0Qm91bmQxLnN0YWJiaW5nQ291bnQ9dEJvdW5kMi5zdGFiYmluZ0NvdW50O30KdEVuZD10QXJyLmxlbmd0aDt0SW5kZXg9bG93ZXJJbmRleCsxO2ZvcihqPTA7ajx0RW5kO2orKyl7dEJvdW5kMj10QXJyW2pdO3RCb3VuZDE9Ym91bmRzW3RJbmRleCtqXQp0Qm91bmQxLnZhbHVlPXRCb3VuZDIudmFsdWU7dEJvdW5kMS5wcm94eUlkPXRCb3VuZDIucHJveHlJZDt0Qm91bmQxLnN0YWJiaW5nQ291bnQ9dEJvdW5kMi5zdGFiYmluZ0NvdW50O30KKyt1cHBlckluZGV4O2JvdW5kc1tsb3dlckluZGV4XS52YWx1ZT1sb3dlclZhbHVlc1theGlzXTtib3VuZHNbbG93ZXJJbmRleF0ucHJveHlJZD1wcm94eUlkO2JvdW5kc1t1cHBlckluZGV4XS52YWx1ZT11cHBlclZhbHVlc1theGlzXTtib3VuZHNbdXBwZXJJbmRleF0ucHJveHlJZD1wcm94eUlkO2JvdW5kc1tsb3dlckluZGV4XS5zdGFiYmluZ0NvdW50PWxvd2VySW5kZXg9PTA|MCkKe3ZhciBpPWxvd2VyUXVlcnktMTt2YXIgcz1ib3VuZHNbaV0uc3RhYmJpbmdDb3VudDt3aGlsZShzKQp7aWYoYm91bmRzW2ldLklzTG93ZXIoKSkKe3ZhciBwcm94eT10aGlzLm1fcHJveHlQb29sW2JvdW5kc1tpXS5wcm94eUlkXTtpZihsb3dlclF1ZXJ5PD1wcm94eS51cHBlckJvdW5kc1theGlzXSkKe3RoaXMuSW5jcmVtZW50T3ZlcmxhcENvdW50KGJvdW5kc1tpXS5wcm94eUlkKTstLXM7fX0KLS1pO319Cmxvd2VyUXVlcnlPdXRbMF09bG93ZXJRdWVyeTt1cHBlclF1ZXJ5T3V0WzBdPXVwcGVyUXVlcnk7fSxJbmNyZW1lbnRPdmVybGFwQ291bnQ6ZnVuY3Rpb24ocHJveHlJZCl7dmFyIHByb3h5PXRoaXMubV9wcm94eVBvb2xbcHJveHlJZF07aWYocHJveHkudGltZVN0YW1wPHRoaXMubV90aW1lU3RhbXApCntwcm94eS50aW1lU3RhbXA9dGhpcy5tX3RpbWVTdGFtcDtwcm94eS5vdmVybGFwQ291bnQ9MTt9CmVsc2UKe3Byb3h5Lm92ZXJsYXBDb3VudD0yO3RoaXMubV9xdWVyeVJlc3VsdHNbdGhpcy5tX3F1ZXJ5UmVzdWx0Q291bnRdPXByb3h5SWQ7Kyt0aGlzLm1fcXVlcnlSZXN1bHRDb3VudDt9fSxJbmNyZW1lbnRUaW1lU3RhbXA6ZnVuY3Rpb24oKXtpZih0aGlzLm1fdGltZVN0YW1wPT1iMlNldHRpbmdzLlVTSFJUX01BWCkKe2Zvcih2YXIgaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhQcm94aWVzOysraSkKe3RoaXMubV9wcm94eVBvb2xbaV0udGltZVN0YW1wPTA7fQp0aGlzLm1fdGltZVN0YW1wPTE7fQplbHNlCnsrK3RoaXMubV90aW1lU3RhbXA7fX0sbV9wYWlyTWFuYWdlcjpuZXcgYjJQYWlyTWFuYWdlcigpLG1fcHJveHlQb29sOm5ldyBBcnJheShiMlNldHRpbmdzLmIyX21heFBhaXJzKSxtX2ZyZWVQcm94eTowLG1fYm91bmRzOm5ldyBBcnJheSgyKmIyU2V0dGluZ3MuYjJfbWF4UHJveGllcyksbV9xdWVyeVJlc3VsdHM6bmV3IEFycmF5KGIyU2V0dGluZ3MuYjJfbWF4UHJveGllcyksbV9xdWVyeVJlc3VsdENvdW50OjAsbV93b3JsZEFBQkI6bnVsbCxtX3F1YW50aXphdGlvbkZhY3RvcjpuZXcgYjJWZWMyKCksbV9wcm94eUNvdW50OjAsbV90aW1lU3RhbXA6MH07YjJCcm9hZFBoYXNlLnNfdmFsaWRhdGU9ZmFsc2U7YjJCcm9hZFBoYXNlLmIyX2ludmFsaWQ9YjJTZXR0aW5ncy5VU0hSVF9NQVg7YjJCcm9hZFBoYXNlLmIyX251bGxFZGdlPWIyU2V0dGluZ3MuVVNIUlRfTUFYO2IyQnJvYWRQaGFzZS5CaW5hcnlTZWFyY2g9ZnVuY3Rpb24oYm91bmRzLGNvdW50LHZhbHVlKQp7dmFyIGxvdz0wO3ZhciBoaWdoPWNvdW50LTE7d2hpbGUobG93PD1oaWdoKQp7dmFyIG1pZD1NYXRoLmZsb29yKChsb3craGlnaCkvMik7aWYoYm91bmRzW21pZF0udmFsdWU|MCkKe2luZGV4PXVwcGVySW5kZXg7d2hpbGUoaW5kZXg8Ym91bmRDb3VudC0xJiZib3VuZHNbaW5kZXgrMV0udmFsdWU8PXVwcGVyVmFsdWUpCntib3VuZD1ib3VuZHNbaW5kZXhdO25leHRCb3VuZD1ib3VuZHNbaW5kZXgrMV07bmV4dFByb3h5SWQ9bmV4dEJvdW5kLnByb3h5SWQ7bmV4dFByb3h5PXRoaXMubV9wcm94eVBvb2xbbmV4dFByb3h5SWRdO25leHRCb3VuZC5zdGFiYmluZ0NvdW50Kys7aWYobmV4dEJvdW5kLklzTG93ZXIoKT09dHJ1ZSkKe2lmKHRoaXMuVGVzdE92ZXJsYXAobmV3VmFsdWVzLG5leHRQcm94eSkpCnt0aGlzLm1fcGFpck1hbmFnZXIuQWRkQnVmZmVyZWRQYWlyKHByb3h5SWQsbmV4dFByb3h5SWQpO30KbmV4dFByb3h5Lmxvd2VyQm91bmRzW2F4aXNdLS07Ym91bmQuc3RhYmJpbmdDb3VudCsrO30KZWxzZQp7bmV4dFByb3h5LnVwcGVyQm91bmRzW2F4aXNdLS07Ym91bmQuc3RhYmJpbmdDb3VudC0tO30KcHJveHkudXBwZXJCb3VuZHNbYXhpc10rKztib3VuZC5Td2FwKG5leHRCb3VuZCk7aW5kZXgrKzt9fQppZihkZWx0YUxvd2VyPjApCntpbmRleD1sb3dlckluZGV4O3doaWxlKGluZGV4PGJvdW5kQ291bnQtMSYmYm91bmRzW2luZGV4KzFdLnZhbHVlPD1sb3dlclZhbHVlKQp7Ym91bmQ9Ym91bmRzW2luZGV4XTtuZXh0Qm91bmQ9Ym91bmRzW2luZGV4KzFdO25leHRQcm94eUlkPW5leHRCb3VuZC5wcm94eUlkO25leHRQcm94eT10aGlzLm1fcHJveHlQb29sW25leHRQcm94eUlkXTtuZXh0Qm91bmQuc3RhYmJpbmdDb3VudC0tO2lmKG5leHRCb3VuZC5Jc1VwcGVyKCkpCntpZih0aGlzLlRlc3RPdmVybGFwKG9sZFZhbHVlcyxuZXh0UHJveHkpKQp7dGhpcy5tX3BhaXJNYW5hZ2VyLlJlbW92ZUJ1ZmZlcmVkUGFpcihwcm94eUlkLG5leHRQcm94eUlkKTt9Cm5leHRQcm94eS51cHBlckJvdW5kc1theGlzXS0tO2JvdW5kLnN0YWJiaW5nQ291bnQtLTt9CmVsc2UKe25leHRQcm94eS5sb3dlckJvdW5kc1theGlzXS0tO2JvdW5kLnN0YWJiaW5nQ291bnQrKzt9CnByb3h5Lmxvd2VyQm91bmRzW2F4aXNdKys7Ym91bmQuU3dhcChuZXh0Qm91bmQpO2luZGV4Kys7fX0KaWYoZGVsdGFVcHBlcjwwKQp7aW5kZXg9dXBwZXJJbmRleDt3aGlsZShpbmRleD4wJiZ1cHBlclZhbHVlPGJvdW5kc1tpbmRleC0xXS52YWx1ZSkKe2JvdW5kPWJvdW5kc1tpbmRleF07cHJldkJvdW5kPWJvdW5kc1tpbmRleC0xXTtwcmV2UHJveHlJZD1wcmV2Qm91bmQucHJveHlJZDtwcmV2UHJveHk9dGhpcy5tX3Byb3h5UG9vbFtwcmV2UHJveHlJZF07cHJldkJvdW5kLnN0YWJiaW5nQ291bnQtLTtpZihwcmV2Qm91bmQuSXNMb3dlcigpPT10cnVlKQp7aWYodGhpcy5UZXN0T3ZlcmxhcChvbGRWYWx1ZXMscHJldlByb3h5KSkKe3RoaXMubV9wYWlyTWFuYWdlci5SZW1vdmVCdWZmZXJlZFBhaXIocHJveHlJZCxwcmV2UHJveHlJZCk7fQpwcmV2UHJveHkubG93ZXJCb3VuZHNbYXhpc10rKztib3VuZC5zdGFiYmluZ0NvdW50LS07fQplbHNlCntwcmV2UHJveHkudXBwZXJCb3VuZHNbYXhpc10rKztib3VuZC5zdGFiYmluZ0NvdW50Kys7fQpwcm94eS51cHBlckJvdW5kc1theGlzXS0tO2JvdW5kLlN3YXAocHJldkJvdW5kKTtpbmRleC0tO319fX0sQ29tbWl0OmZ1bmN0aW9uKCl7dGhpcy5tX3BhaXJNYW5hZ2VyLkNvbW1pdCgpO30sUXVlcnlBQUJCOmZ1bmN0aW9uKGFhYmIsdXNlckRhdGEsbWF4Q291bnQpe3ZhciBsb3dlclZhbHVlcz1uZXcgQXJyYXkoKTt2YXIgdXBwZXJWYWx1ZXM9bmV3IEFycmF5KCk7dGhpcy5Db21wdXRlQm91bmRzKGxvd2VyVmFsdWVzLHVwcGVyVmFsdWVzLGFhYmIpO3ZhciBsb3dlckluZGV4PTA7dmFyIHVwcGVySW5kZXg9MDt2YXIgbG93ZXJJbmRleE91dD1bbG93ZXJJbmRleF07dmFyIHVwcGVySW5kZXhPdXQ9W3VwcGVySW5kZXhdO3RoaXMuUXVlcnkobG93ZXJJbmRleE91dCx1cHBlckluZGV4T3V0LGxvd2VyVmFsdWVzWzBdLHVwcGVyVmFsdWVzWzBdLHRoaXMubV9ib3VuZHNbMF0sMip0aGlzLm1fcHJveHlDb3VudCwwKTt0aGlzLlF1ZXJ5KGxvd2VySW5kZXhPdXQsdXBwZXJJbmRleE91dCxsb3dlclZhbHVlc1sxXSx1cHBlclZhbHVlc1sxXSx0aGlzLm1fYm91bmRzWzFdLDIqdGhpcy5tX3Byb3h5Q291bnQsMSk7dmFyIGNvdW50PTA7Zm9yKHZhciBpPTA7aTx0aGlzLm1fcXVlcnlSZXN1bHRDb3VudCYmY291bnQ8bWF4Q291bnQ7KytpLCsrY291bnQpCnt2YXIgcHJveHk9dGhpcy5tX3Byb3h5UG9vbFt0aGlzLm1fcXVlcnlSZXN1bHRzW2ldXTt1c2VyRGF0YVtpXT1wcm94eS51c2VyRGF0YTt9CnRoaXMubV9xdWVyeVJlc3VsdENvdW50PTA7dGhpcy5JbmNyZW1lbnRUaW1lU3RhbXAoKTtyZXR1cm4gY291bnQ7fSxWYWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBwYWlyO3ZhciBwcm94eTE7dmFyIHByb3h5Mjt2YXIgb3ZlcmxhcDtmb3IodmFyIGF4aXM9MDtheGlzPDI7KytheGlzKQp7dmFyIGJvdW5kcz10aGlzLm1fYm91bmRzW2F4aXNdO3ZhciBib3VuZENvdW50PTIqdGhpcy5tX3Byb3h5Q291bnQ7dmFyIHN0YWJiaW5nQ291bnQ9MDtmb3IodmFyIGk9MDtpPGJvdW5kQ291bnQ7KytpKQp7dmFyIGJvdW5kPWJvdW5kc1tpXTtpZihib3VuZC5Jc0xvd2VyKCk9PXRydWUpCntzdGFiYmluZ0NvdW50Kys7fQplbHNlCntzdGFiYmluZ0NvdW50LS07fX19fSxDb21wdXRlQm91bmRzOmZ1bmN0aW9uKGxvd2VyVmFsdWVzLHVwcGVyVmFsdWVzLGFhYmIpCnt2YXIgbWluVmVydGV4WD1hYWJiLm1pblZlcnRleC54O3ZhciBtaW5WZXJ0ZXhZPWFhYmIubWluVmVydGV4Lnk7bWluVmVydGV4WD1iMk1hdGguYjJNaW4obWluVmVydGV4WCx0aGlzLm1fd29ybGRBQUJCLm1heFZlcnRleC54KTttaW5WZXJ0ZXhZPWIyTWF0aC5iMk1pbihtaW5WZXJ0ZXhZLHRoaXMubV93b3JsZEFBQkIubWF4VmVydGV4LnkpO21pblZlcnRleFg9YjJNYXRoLmIyTWF4KG1pblZlcnRleFgsdGhpcy5tX3dvcmxkQUFCQi5taW5WZXJ0ZXgueCk7bWluVmVydGV4WT1iMk1hdGguYjJNYXgobWluVmVydGV4WSx0aGlzLm1fd29ybGRBQUJCLm1pblZlcnRleC55KTt2YXIgbWF4VmVydGV4WD1hYWJiLm1heFZlcnRleC54O3ZhciBtYXhWZXJ0ZXhZPWFhYmIubWF4VmVydGV4Lnk7bWF4VmVydGV4WD1iMk1hdGguYjJNaW4obWF4VmVydGV4WCx0aGlzLm1fd29ybGRBQUJCLm1heFZlcnRleC54KTttYXhWZXJ0ZXhZPWIyTWF0aC5iMk1pbihtYXhWZXJ0ZXhZLHRoaXMubV93b3JsZEFBQkIubWF4VmVydGV4LnkpO21heFZlcnRleFg9YjJNYXRoLmIyTWF4KG1heFZlcnRleFgsdGhpcy5tX3dvcmxkQUFCQi5taW5WZXJ0ZXgueCk7bWF4VmVydGV4WT1iMk1hdGguYjJNYXgobWF4VmVydGV4WSx0aGlzLm1fd29ybGRBQUJCLm1pblZlcnRleC55KTtsb3dlclZhbHVlc1swXT0odGhpcy5tX3F1YW50aXphdGlvbkZhY3Rvci54KihtaW5WZXJ0ZXhYLXRoaXMubV93b3JsZEFBQkIubWluVmVydGV4LngpKSYoYjJTZXR0aW5ncy5VU0hSVF9NQVgtMSk7dXBwZXJWYWx1ZXNbMF09KCh0aGlzLm1fcXVhbnRpemF0aW9uRmFjdG9yLngqKG1heFZlcnRleFgtdGhpcy5tX3dvcmxkQUFCQi5taW5WZXJ0ZXgueCkpJjB4MDAwMGZmZmYpfDE7bG93ZXJWYWx1ZXNbMV09KHRoaXMubV9xdWFudGl6YXRpb25GYWN0b3IueSoobWluVmVydGV4WS10aGlzLm1fd29ybGRBQUJCLm1pblZlcnRleC55KSkmKGIyU2V0dGluZ3MuVVNIUlRfTUFYLTEpO3VwcGVyVmFsdWVzWzFdPSgodGhpcy5tX3F1YW50aXphdGlvbkZhY3Rvci55KihtYXhWZXJ0ZXhZLXRoaXMubV93b3JsZEFBQkIubWluVmVydGV4LnkpKSYweDAwMDBmZmZmKXwxO30sVGVzdE92ZXJsYXBWYWxpZGF0ZTpmdW5jdGlvbihwMSxwMil7Zm9yKHZhciBheGlzPTA7YXhpczwyOysrYXhpcykKe3ZhciBib3VuZHM9dGhpcy5tX2JvdW5kc1theGlzXTtpZihib3VuZHNbcDEubG93ZXJCb3VuZHNbYXhpc11dLnZhbHVlPmJvdW5kc1twMi51cHBlckJvdW5kc1theGlzXV0udmFsdWUpCnJldHVybiBmYWxzZTtpZihib3VuZHNbcDEudXBwZXJCb3VuZHNbYXhpc11dLnZhbHVlPGJvdW5kc1twMi5sb3dlckJvdW5kc1theGlzXV0udmFsdWUpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO30sVGVzdE92ZXJsYXA6ZnVuY3Rpb24oYixwKQp7Zm9yKHZhciBheGlzPTA7YXhpczwyOysrYXhpcykKe3ZhciBib3VuZHM9dGhpcy5tX2JvdW5kc1theGlzXTtpZihiLmxvd2VyVmFsdWVzW2F4aXNdPmJvdW5kc1twLnVwcGVyQm91bmRzW2F4aXNdXS52YWx1ZSkKcmV0dXJuIGZhbHNlO2lmKGIudXBwZXJWYWx1ZXNbYXhpc108Ym91bmRzW3AubG93ZXJCb3VuZHNbYXhpc11dLnZhbHVlKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9LFF1ZXJ5OmZ1bmN0aW9uKGxvd2VyUXVlcnlPdXQsdXBwZXJRdWVyeU91dCxsb3dlclZhbHVlLHVwcGVyVmFsdWUsYm91bmRzLGJvdW5kQ291bnQsYXhpcyl7dmFyIGxvd2VyUXVlcnk9YjJCcm9hZFBoYXNlLkJpbmFyeVNlYXJjaChib3VuZHMsYm91bmRDb3VudCxsb3dlclZhbHVlKTt2YXIgdXBwZXJRdWVyeT1iMkJyb2FkUGhhc2UuQmluYXJ5U2VhcmNoKGJvdW5kcyxib3VuZENvdW50LHVwcGVyVmFsdWUpO2Zvcih2YXIgaj1sb3dlclF1ZXJ5O2o8dXBwZXJRdWVyeTsrK2opCntpZihib3VuZHNbal0uSXNMb3dlcigpKQp7dGhpcy5JbmNyZW1lbnRPdmVybGFwQ291bnQoYm91bmRzW2pdLnByb3h5SWQpO319CmlmKGxvd2VyUXVlcnk|MCYmbG93ZXJWYWx1ZTxib3VuZHNbaW5kZXgtMV0udmFsdWUpCntib3VuZD1ib3VuZHNbaW5kZXhdO3ByZXZCb3VuZD1ib3VuZHNbaW5kZXgtMV07dmFyIHByZXZQcm94eUlkPXByZXZCb3VuZC5wcm94eUlkO3ZhciBwcmV2UHJveHk9dGhpcy5tX3Byb3h5UG9vbFtwcmV2Qm91bmQucHJveHlJZF07cHJldkJvdW5kLnN0YWJiaW5nQ291bnQrKztpZihwcmV2Qm91bmQuSXNVcHBlcigpPT10cnVlKQp7aWYodGhpcy5UZXN0T3ZlcmxhcChuZXdWYWx1ZXMscHJldlByb3h5KSkKe3RoaXMubV9wYWlyTWFuYWdlci5BZGRCdWZmZXJlZFBhaXIocHJveHlJZCxwcmV2UHJveHlJZCk7fQpwcmV2UHJveHkudXBwZXJCb3VuZHNbYXhpc10rKztib3VuZC5zdGFiYmluZ0NvdW50Kys7fQplbHNlCntwcmV2UHJveHkubG93ZXJCb3VuZHNbYXhpc10rKztib3VuZC5zdGFiYmluZ0NvdW50LS07fQpwcm94eS5sb3dlckJvdW5kc1theGlzXS0tO2JvdW5kLlN3YXAocHJldkJvdW5kKTstLWluZGV4O319CmlmKGRlbHRhVXBwZXI|MDpib3VuZHNbbG93ZXJJbmRleC0xXS5zdGFiYmluZ0NvdW50O2JvdW5kc1t1cHBlckluZGV4XS5zdGFiYmluZ0NvdW50PWJvdW5kc1t1cHBlckluZGV4LTFdLnN0YWJiaW5nQ291bnQ7Zm9yKGluZGV4PWxvd2VySW5kZXg7aW5kZXg8dXBwZXJJbmRleDsrK2luZGV4KQp7Ym91bmRzW2luZGV4XS5zdGFiYmluZ0NvdW50Kys7fQpmb3IoaW5kZXg9bG93ZXJJbmRleDtpbmRleDxib3VuZENvdW50KzI7KytpbmRleCkKe3ZhciBwcm94eTI9dGhpcy5tX3Byb3h5UG9vbFtib3VuZHNbaW5kZXhdLnByb3h5SWRdO2lmKGJvdW5kc1tpbmRleF0uSXNMb3dlcigpKQp7cHJveHkyLmxvd2VyQm91bmRzW2F4aXNdPWluZGV4O30KZWxzZQp7cHJveHkyLnVwcGVyQm91bmRzW2F4aXNdPWluZGV4O319fQorK3RoaXMubV9wcm94eUNvdW50O2Zvcih2YXIgaT0wO2k8dGhpcy5tX3F1ZXJ5UmVzdWx0Q291bnQ7KytpKQp7dGhpcy5tX3BhaXJNYW5hZ2VyLkFkZEJ1ZmZlcmVkUGFpcihwcm94eUlkLHRoaXMubV9xdWVyeVJlc3VsdHNbaV0pO30KdGhpcy5tX3BhaXJNYW5hZ2VyLkNvbW1pdCgpO3RoaXMubV9xdWVyeVJlc3VsdENvdW50PTA7dGhpcy5JbmNyZW1lbnRUaW1lU3RhbXAoKTtyZXR1cm4gcHJveHlJZDt9LERlc3Ryb3lQcm94eTpmdW5jdGlvbihwcm94eUlkKXt2YXIgcHJveHk9dGhpcy5tX3Byb3h5UG9vbFtwcm94eUlkXTt2YXIgYm91bmRDb3VudD0yKnRoaXMubV9wcm94eUNvdW50O2Zvcih2YXIgYXhpcz0wO2F4aXM8MjsrK2F4aXMpCnt2YXIgYm91bmRzPXRoaXMubV9ib3VuZHNbYXhpc107dmFyIGxvd2VySW5kZXg9cHJveHkubG93ZXJCb3VuZHNbYXhpc107dmFyIHVwcGVySW5kZXg9cHJveHkudXBwZXJCb3VuZHNbYXhpc107dmFyIGxvd2VyVmFsdWU9Ym91bmRzW2xvd2VySW5kZXhdLnZhbHVlO3ZhciB1cHBlclZhbHVlPWJvdW5kc1t1cHBlckluZGV4XS52YWx1ZTt2YXIgdEFycj1uZXcgQXJyYXkoKTt2YXIgaj0wO3ZhciB0RW5kPXVwcGVySW5kZXgtbG93ZXJJbmRleC0xO3ZhciB0Qm91bmQxO3ZhciB0Qm91bmQyO2ZvcihqPTA7ajx0RW5kO2orKyl7dEFycltqXT1uZXcgYjJCb3VuZCgpO3RCb3VuZDE9dEFycltqXTt0Qm91bmQyPWJvdW5kc1tsb3dlckluZGV4KzEral07dEJvdW5kMS52YWx1ZT10Qm91bmQyLnZhbHVlO3RCb3VuZDEucHJveHlJZD10Qm91bmQyLnByb3h5SWQ7dEJvdW5kMS5zdGFiYmluZ0NvdW50PXRCb3VuZDIuc3RhYmJpbmdDb3VudDt9CnRFbmQ9dEFyci5sZW5ndGg7dmFyIHRJbmRleD1sb3dlckluZGV4O2ZvcihqPTA7ajx0RW5kO2orKyl7dEJvdW5kMj10QXJyW2pdO3RCb3VuZDE9Ym91bmRzW3RJbmRleCtqXQp0Qm91bmQxLnZhbHVlPXRCb3VuZDIudmFsdWU7dEJvdW5kMS5wcm94eUlkPXRCb3VuZDIucHJveHlJZDt0Qm91bmQxLnN0YWJiaW5nQ291bnQ9dEJvdW5kMi5zdGFiYmluZ0NvdW50O30KdEFycj1uZXcgQXJyYXkoKTt0RW5kPWJvdW5kQ291bnQtdXBwZXJJbmRleC0xO2ZvcihqPTA7ajx0RW5kO2orKyl7dEFycltqXT1uZXcgYjJCb3VuZCgpO3RCb3VuZDE9dEFycltqXTt0Qm91bmQyPWJvdW5kc1t1cHBlckluZGV4KzEral07dEJvdW5kMS52YWx1ZT10Qm91bmQyLnZhbHVlO3RCb3VuZDEucHJveHlJZD10Qm91bmQyLnByb3h5SWQ7dEJvdW5kMS5zdGFiYmluZ0NvdW50PXRCb3VuZDIuc3RhYmJpbmdDb3VudDt9CnRFbmQ9dEFyci5sZW5ndGg7dEluZGV4PXVwcGVySW5kZXgtMTtmb3Ioaj0wO2o8dEVuZDtqKyspe3RCb3VuZDI9dEFycltqXTt0Qm91bmQxPWJvdW5kc1t0SW5kZXgral0KdEJvdW5kMS52YWx1ZT10Qm91bmQyLnZhbHVlO3RCb3VuZDEucHJveHlJZD10Qm91bmQyLnByb3h5SWQ7dEJvdW5kMS5zdGFiYmluZ0NvdW50PXRCb3VuZDIuc3RhYmJpbmdDb3VudDt9CnRFbmQ9Ym91bmRDb3VudC0yO2Zvcih2YXIgaW5kZXg9bG93ZXJJbmRleDtpbmRleDx0RW5kOysraW5kZXgpCnt2YXIgcHJveHkyPXRoaXMubV9wcm94eVBvb2xbYm91bmRzW2luZGV4XS5wcm94eUlkXTtpZihib3VuZHNbaW5kZXhdLklzTG93ZXIoKSkKe3Byb3h5Mi5sb3dlckJvdW5kc1theGlzXT1pbmRleDt9CmVsc2UKe3Byb3h5Mi51cHBlckJvdW5kc1theGlzXT1pbmRleDt9fQp0RW5kPXVwcGVySW5kZXgtMTtmb3IodmFyIGluZGV4Mj1sb3dlckluZGV4O2luZGV4Mjx0RW5kOysraW5kZXgyKQp7Ym91bmRzW2luZGV4Ml0uc3RhYmJpbmdDb3VudC0tO30KdGhpcy5RdWVyeShbMF0sWzBdLGxvd2VyVmFsdWUsdXBwZXJWYWx1ZSxib3VuZHMsYm91bmRDb3VudC0yLGF4aXMpO30KZm9yKHZhciBpPTA7aTx0aGlzLm1fcXVlcnlSZXN1bHRDb3VudDsrK2kpCnt0aGlzLm1fcGFpck1hbmFnZXIuUmVtb3ZlQnVmZmVyZWRQYWlyKHByb3h5SWQsdGhpcy5tX3F1ZXJ5UmVzdWx0c1tpXSk7fQp0aGlzLm1fcGFpck1hbmFnZXIuQ29tbWl0KCk7dGhpcy5tX3F1ZXJ5UmVzdWx0Q291bnQ9MDt0aGlzLkluY3JlbWVudFRpbWVTdGFtcCgpO3Byb3h5LnVzZXJEYXRhPW51bGw7cHJveHkub3ZlcmxhcENvdW50PWIyQnJvYWRQaGFzZS5iMl9pbnZhbGlkO3Byb3h5Lmxvd2VyQm91bmRzWzBdPWIyQnJvYWRQaGFzZS5iMl9pbnZhbGlkO3Byb3h5Lmxvd2VyQm91bmRzWzFdPWIyQnJvYWRQaGFzZS5iMl9pbnZhbGlkO3Byb3h5LnVwcGVyQm91bmRzWzBdPWIyQnJvYWRQaGFzZS5iMl9pbnZhbGlkO3Byb3h5LnVwcGVyQm91bmRzWzFdPWIyQnJvYWRQaGFzZS5iMl9pbnZhbGlkO3Byb3h5LlNldE5leHQodGhpcy5tX2ZyZWVQcm94eSk7dGhpcy5tX2ZyZWVQcm94eT1wcm94eUlkOy0tdGhpcy5tX3Byb3h5Q291bnQ7fSxNb3ZlUHJveHk6ZnVuY3Rpb24ocHJveHlJZCxhYWJiKXt2YXIgYXhpcz0wO3ZhciBpbmRleD0wO3ZhciBib3VuZDt2YXIgcHJldkJvdW5kCnZhciBuZXh0Qm91bmQKdmFyIG5leHRQcm94eUlkPTA7dmFyIG5leHRQcm94eTtpZihwcm94eUlkPT1iMlBhaXIuYjJfbnVsbFByb3h5fHxiMlNldHRpbmdzLmIyX21heFByb3hpZXM8PXByb3h5SWQpCntyZXR1cm47fQppZihhYWJiLklzVmFsaWQoKT09ZmFsc2UpCntyZXR1cm47fQp2YXIgYm91bmRDb3VudD0yKnRoaXMubV9wcm94eUNvdW50O3ZhciBwcm94eT10aGlzLm1fcHJveHlQb29sW3Byb3h5SWRdO3ZhciBuZXdWYWx1ZXM9bmV3IGIyQm91bmRWYWx1ZXMoKTt0aGlzLkNvbXB1dGVCb3VuZHMobmV3VmFsdWVzLmxvd2VyVmFsdWVzLG5ld1ZhbHVlcy51cHBlclZhbHVlcyxhYWJiKTt2YXIgb2xkVmFsdWVzPW5ldyBiMkJvdW5kVmFsdWVzKCk7Zm9yKGF4aXM9MDtheGlzPDI7KytheGlzKQp7b2xkVmFsdWVzLmxvd2VyVmFsdWVzW2F4aXNdPXRoaXMubV9ib3VuZHNbYXhpc11bcHJveHkubG93ZXJCb3VuZHNbYXhpc11dLnZhbHVlO29sZFZhbHVlcy51cHBlclZhbHVlc1theGlzXT10aGlzLm1fYm91bmRzW2F4aXNdW3Byb3h5LnVwcGVyQm91bmRzW2F4aXNdXS52YWx1ZTt9CmZvcihheGlzPTA7YXhpczwyOysrYXhpcykKe3ZhciBib3VuZHM9dGhpcy5tX2JvdW5kc1theGlzXTt2YXIgbG93ZXJJbmRleD1wcm94eS5sb3dlckJvdW5kc1theGlzXTt2YXIgdXBwZXJJbmRleD1wcm94eS51cHBlckJvdW5kc1theGlzXTt2YXIgbG93ZXJWYWx1ZT1uZXdWYWx1ZXMubG93ZXJWYWx1ZXNbYXhpc107dmFyIHVwcGVyVmFsdWU9bmV3VmFsdWVzLnVwcGVyVmFsdWVzW2F4aXNdO3ZhciBkZWx0YUxvd2VyPWxvd2VyVmFsdWUtYm91bmRzW2xvd2VySW5kZXhdLnZhbHVlO3ZhciBkZWx0YVVwcGVyPXVwcGVyVmFsdWUtYm91bmRzW3VwcGVySW5kZXhdLnZhbHVlO2JvdW5kc1tsb3dlckluZGV4XS52YWx1ZT1sb3dlclZhbHVlO2JvdW5kc1t1cHBlckluZGV4XS52YWx1ZT11cHBlclZhbHVlO2lmKGRlbHRhTG93ZXI8MCkKe2luZGV4PWxvd2VySW5kZXg7d2hpbGUoaW5kZXg|MjQpJjB4MDAwMDAwZmY7fSxmZWF0dXJlczpuZXcgRmVhdHVyZXMoKSxfa2V5OjB9Owp2YXIgYjJDb250YWN0UG9pbnQ9Q2xhc3MuY3JlYXRlKCk7YjJDb250YWN0UG9pbnQucHJvdG90eXBlPXtwb3NpdGlvbjpuZXcgYjJWZWMyKCksc2VwYXJhdGlvbjpudWxsLG5vcm1hbEltcHVsc2U6bnVsbCx0YW5nZW50SW1wdWxzZTpudWxsLGlkOm5ldyBiMkNvbnRhY3RJRCgpLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uPW5ldyBiMlZlYzIoKTt0aGlzLmlkPW5ldyBiMkNvbnRhY3RJRCgpO319O3ZhciBiMkRpc3RhbmNlPUNsYXNzLmNyZWF0ZSgpO2IyRGlzdGFuY2UucHJvdG90eXBlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7fX07YjJEaXN0YW5jZS5Qcm9jZXNzVHdvPWZ1bmN0aW9uKHAxT3V0LHAyT3V0LHAxcyxwMnMscG9pbnRzKQp7dmFyIHJYPS1wb2ludHNbMV0ueDt2YXIgclk9LXBvaW50c1sxXS55O3ZhciBkWD1wb2ludHNbMF0ueC1wb2ludHNbMV0ueDt2YXIgZFk9cG9pbnRzWzBdLnktcG9pbnRzWzFdLnk7dmFyIGxlbmd0aD1NYXRoLnNxcnQoZFgqZFgrZFkqZFkpO2RYLz1sZW5ndGg7ZFkvPWxlbmd0aDt2YXIgbGFtYmRhPXJYKmRYK3JZKmRZO2lmKGxhbWJkYTw9MC4wfHxsZW5ndGg8TnVtYmVyLk1JTl9WQUxVRSkKe3AxT3V0LlNldFYocDFzWzFdKTtwMk91dC5TZXRWKHAyc1sxXSk7cDFzWzBdLlNldFYocDFzWzFdKTtwMnNbMF0uU2V0VihwMnNbMV0pO3BvaW50c1swXS5TZXRWKHBvaW50c1sxXSk7cmV0dXJuIDE7fQpsYW1iZGEvPWxlbmd0aDtwMU91dC54PXAxc1sxXS54K2xhbWJkYSoocDFzWzBdLngtcDFzWzFdLngpO3AxT3V0Lnk9cDFzWzFdLnkrbGFtYmRhKihwMXNbMF0ueS1wMXNbMV0ueSk7cDJPdXQueD1wMnNbMV0ueCtsYW1iZGEqKHAyc1swXS54LXAyc1sxXS54KTtwMk91dC55PXAyc1sxXS55K2xhbWJkYSoocDJzWzBdLnktcDJzWzFdLnkpO3JldHVybiAyO307YjJEaXN0YW5jZS5Qcm9jZXNzVGhyZWU9ZnVuY3Rpb24ocDFPdXQscDJPdXQscDFzLHAycyxwb2ludHMpCnt2YXIgYVg9cG9pbnRzWzBdLng7dmFyIGFZPXBvaW50c1swXS55O3ZhciBiWD1wb2ludHNbMV0ueDt2YXIgYlk9cG9pbnRzWzFdLnk7dmFyIGNYPXBvaW50c1syXS54O3ZhciBjWT1wb2ludHNbMl0ueTt2YXIgYWJYPWJYLWFYO3ZhciBhYlk9YlktYVk7dmFyIGFjWD1jWC1hWDt2YXIgYWNZPWNZLWFZO3ZhciBiY1g9Y1gtYlg7dmFyIGJjWT1jWS1iWTt2YXIgc249LShhWCphYlgrYVkqYWJZKTt2YXIgc2Q9KGJYKmFiWCtiWSphYlkpO3ZhciB0bj0tKGFYKmFjWCthWSphY1kpO3ZhciB0ZD0oY1gqYWNYK2NZKmFjWSk7dmFyIHVuPS0oYlgqYmNYK2JZKmJjWSk7dmFyIHVkPShjWCpiY1grY1kqYmNZKTtpZih0ZDw9MC4wJiZ1ZDw9MC4wKQp7cDFPdXQuU2V0VihwMXNbMl0pO3AyT3V0LlNldFYocDJzWzJdKTtwMXNbMF0uU2V0VihwMXNbMl0pO3Ayc1swXS5TZXRWKHAyc1syXSk7cG9pbnRzWzBdLlNldFYocG9pbnRzWzJdKTtyZXR1cm4gMTt9CnZhciBuPWFiWCphY1ktYWJZKmFjWDt2YXIgdmM9biooYVgqYlktYVkqYlgpO3ZhciB2YT1uKihiWCpjWS1iWSpjWCk7aWYodmE8PTAuMCYmdW4|PTAuMCYmdWQ|YjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wKQp7dGhpcy5tX3UxLngqPTEuMC9sZW5ndGgxO3RoaXMubV91MS55Kj0xLjAvbGVuZ3RoMTt9CmVsc2UKe3RoaXMubV91MS5TZXRaZXJvKCk7fQpDPXRoaXMubV9tYXhMZW5ndGgxLWxlbmd0aDE7bGluZWFyRXJyb3I9YjJNYXRoLmIyTWF4KGxpbmVhckVycm9yLC1DKTtDPWIyTWF0aC5iMkNsYW1wKEMrYjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wLC1iMlNldHRpbmdzLmIyX21heExpbmVhckNvcnJlY3Rpb24sMC4wKTtpbXB1bHNlPS10aGlzLm1fbGltaXRNYXNzMSpDO29sZExpbWl0UG9zaXRpb25JbXB1bHNlPXRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZTE7dGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlMT1iMk1hdGguYjJNYXgoMC4wLHRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZTEraW1wdWxzZSk7aW1wdWxzZT10aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2UxLW9sZExpbWl0UG9zaXRpb25JbXB1bHNlO3AxWD0taW1wdWxzZSp0aGlzLm1fdTEueDtwMVk9LWltcHVsc2UqdGhpcy5tX3UxLnk7YjEubV9wb3NpdGlvbi54Kz1iMS5tX2ludk1hc3MqcDFYO2IxLm1fcG9zaXRpb24ueSs9YjEubV9pbnZNYXNzKnAxWTtiMS5tX3JvdGF0aW9uKz1iMS5tX2ludkkqKHIxWCpwMVktcjFZKnAxWCk7YjEubV9SLlNldChiMS5tX3JvdGF0aW9uKTt9CmlmKHRoaXMubV9saW1pdFN0YXRlMj09YjJKb2ludC5lX2F0VXBwZXJMaW1pdCkKe3RNYXQ9YjIubV9SO3IyWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3IyWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3AyWD1iMi5tX3Bvc2l0aW9uLngrcjJYO3AyWT1iMi5tX3Bvc2l0aW9uLnkrcjJZO3RoaXMubV91Mi5TZXQocDJYLXMyWCxwMlktczJZKTtsZW5ndGgyPXRoaXMubV91Mi5MZW5ndGgoKTtpZihsZW5ndGgyPmIyU2V0dGluZ3MuYjJfbGluZWFyU2xvcCkKe3RoaXMubV91Mi54Kj0xLjAvbGVuZ3RoMjt0aGlzLm1fdTIueSo9MS4wL2xlbmd0aDI7fQplbHNlCnt0aGlzLm1fdTIuU2V0WmVybygpO30KQz10aGlzLm1fbWF4TGVuZ3RoMi1sZW5ndGgyO2xpbmVhckVycm9yPWIyTWF0aC5iMk1heChsaW5lYXJFcnJvciwtQyk7Qz1iMk1hdGguYjJDbGFtcChDK2IyU2V0dGluZ3MuYjJfbGluZWFyU2xvcCwtYjJTZXR0aW5ncy5iMl9tYXhMaW5lYXJDb3JyZWN0aW9uLDAuMCk7aW1wdWxzZT0tdGhpcy5tX2xpbWl0TWFzczIqQztvbGRMaW1pdFBvc2l0aW9uSW1wdWxzZT10aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2UyO3RoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZTI9YjJNYXRoLmIyTWF4KDAuMCx0aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2UyK2ltcHVsc2UpO2ltcHVsc2U9dGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlMi1vbGRMaW1pdFBvc2l0aW9uSW1wdWxzZTtwMlg9LWltcHVsc2UqdGhpcy5tX3UyLng7cDJZPS1pbXB1bHNlKnRoaXMubV91Mi55O2IyLm1fcG9zaXRpb24ueCs9YjIubV9pbnZNYXNzKnAyWDtiMi5tX3Bvc2l0aW9uLnkrPWIyLm1faW52TWFzcypwMlk7YjIubV9yb3RhdGlvbis9YjIubV9pbnZJKihyMlgqcDJZLXIyWSpwMlgpO2IyLm1fUi5TZXQoYjIubV9yb3RhdGlvbik7fQpyZXR1cm4gbGluZWFyRXJyb3I8YjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wO30sbV9ncm91bmQ6bnVsbCxtX2dyb3VuZEFuY2hvcjE6bmV3IGIyVmVjMigpLG1fZ3JvdW5kQW5jaG9yMjpuZXcgYjJWZWMyKCksbV9sb2NhbEFuY2hvcjE6bmV3IGIyVmVjMigpLG1fbG9jYWxBbmNob3IyOm5ldyBiMlZlYzIoKSxtX3UxOm5ldyBiMlZlYzIoKSxtX3UyOm5ldyBiMlZlYzIoKSxtX2NvbnN0YW50Om51bGwsbV9yYXRpbzpudWxsLG1fbWF4TGVuZ3RoMTpudWxsLG1fbWF4TGVuZ3RoMjpudWxsLG1fcHVsbGV5TWFzczpudWxsLG1fbGltaXRNYXNzMTpudWxsLG1fbGltaXRNYXNzMjpudWxsLG1fcHVsbGV5SW1wdWxzZTpudWxsLG1fbGltaXRJbXB1bHNlMTpudWxsLG1fbGltaXRJbXB1bHNlMjpudWxsLG1fbGltaXRQb3NpdGlvbkltcHVsc2UxOm51bGwsbV9saW1pdFBvc2l0aW9uSW1wdWxzZTI6bnVsbCxtX2xpbWl0U3RhdGUxOjAsbV9saW1pdFN0YXRlMjowfSk7YjJQdWxsZXlKb2ludC5iMl9taW5QdWxsZXlMZW5ndGg9YjJTZXR0aW5ncy5iMl9sZW5ndGhVbml0c1Blck1ldGVyOwp2YXIgYjJQdWxsZXlKb2ludERlZj1DbGFzcy5jcmVhdGUoKTtPYmplY3QuZXh0ZW5kKGIyUHVsbGV5Sm9pbnREZWYucHJvdG90eXBlLGIySm9pbnREZWYucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyUHVsbGV5Sm9pbnREZWYucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCkKe3RoaXMudHlwZT1iMkpvaW50LmVfdW5rbm93bkpvaW50O3RoaXMudXNlckRhdGE9bnVsbDt0aGlzLmJvZHkxPW51bGw7dGhpcy5ib2R5Mj1udWxsO3RoaXMuY29sbGlkZUNvbm5lY3RlZD1mYWxzZTt0aGlzLmdyb3VuZFBvaW50MT1uZXcgYjJWZWMyKCk7dGhpcy5ncm91bmRQb2ludDI9bmV3IGIyVmVjMigpO3RoaXMuYW5jaG9yUG9pbnQxPW5ldyBiMlZlYzIoKTt0aGlzLmFuY2hvclBvaW50Mj1uZXcgYjJWZWMyKCk7dGhpcy50eXBlPWIySm9pbnQuZV9wdWxsZXlKb2ludDt0aGlzLmdyb3VuZFBvaW50MS5TZXQoLTEuMCwxLjApO3RoaXMuZ3JvdW5kUG9pbnQyLlNldCgxLjAsMS4wKTt0aGlzLmFuY2hvclBvaW50MS5TZXQoLTEuMCwwLjApO3RoaXMuYW5jaG9yUG9pbnQyLlNldCgxLjAsMC4wKTt0aGlzLm1heExlbmd0aDE9MC41KmIyUHVsbGV5Sm9pbnQuYjJfbWluUHVsbGV5TGVuZ3RoO3RoaXMubWF4TGVuZ3RoMj0wLjUqYjJQdWxsZXlKb2ludC5iMl9taW5QdWxsZXlMZW5ndGg7dGhpcy5yYXRpbz0xLjA7dGhpcy5jb2xsaWRlQ29ubmVjdGVkPXRydWU7fSxncm91bmRQb2ludDE6bmV3IGIyVmVjMigpLGdyb3VuZFBvaW50MjpuZXcgYjJWZWMyKCksYW5jaG9yUG9pbnQxOm5ldyBiMlZlYzIoKSxhbmNob3JQb2ludDI6bmV3IGIyVmVjMigpLG1heExlbmd0aDE6bnVsbCxtYXhMZW5ndGgyOm51bGwscmF0aW86bnVsbH0pOwp2YXIgYjJSZXZvbHV0ZUpvaW50PUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJSZXZvbHV0ZUpvaW50LnByb3RvdHlwZSxiMkpvaW50LnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMlJldm9sdXRlSm9pbnQucHJvdG90eXBlLHtHZXRBbmNob3IxOmZ1bmN0aW9uKCl7dmFyIHRNYXQ9dGhpcy5tX2JvZHkxLm1fUjtyZXR1cm4gbmV3IGIyVmVjMih0aGlzLm1fYm9keTEubV9wb3NpdGlvbi54Kyh0TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55KSx0aGlzLm1fYm9keTEubV9wb3NpdGlvbi55Kyh0TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS55KSk7fSxHZXRBbmNob3IyOmZ1bmN0aW9uKCl7dmFyIHRNYXQ9dGhpcy5tX2JvZHkyLm1fUjtyZXR1cm4gbmV3IGIyVmVjMih0aGlzLm1fYm9keTIubV9wb3NpdGlvbi54Kyh0TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55KSx0aGlzLm1fYm9keTIubV9wb3NpdGlvbi55Kyh0TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi55KSk7fSxHZXRKb2ludEFuZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9ib2R5Mi5tX3JvdGF0aW9uLXRoaXMubV9ib2R5MS5tX3JvdGF0aW9uO30sR2V0Sm9pbnRTcGVlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fYm9keTIubV9hbmd1bGFyVmVsb2NpdHktdGhpcy5tX2JvZHkxLm1fYW5ndWxhclZlbG9jaXR5O30sR2V0TW90b3JUb3JxdWU6ZnVuY3Rpb24oaW52VGltZVN0ZXApe3JldHVybiBpbnZUaW1lU3RlcCp0aGlzLm1fbW90b3JJbXB1bHNlO30sU2V0TW90b3JTcGVlZDpmdW5jdGlvbihzcGVlZCkKe3RoaXMubV9tb3RvclNwZWVkPXNwZWVkO30sU2V0TW90b3JUb3JxdWU6ZnVuY3Rpb24odG9ycXVlKQp7dGhpcy5tX21heE1vdG9yVG9ycXVlPXRvcnF1ZTt9LEdldFJlYWN0aW9uRm9yY2U6ZnVuY3Rpb24oaW52VGltZVN0ZXApCnt2YXIgdFZlYz10aGlzLm1fcHRwSW1wdWxzZS5Db3B5KCk7dFZlYy5NdWx0aXBseShpbnZUaW1lU3RlcCk7cmV0dXJuIHRWZWM7fSxHZXRSZWFjdGlvblRvcnF1ZTpmdW5jdGlvbihpbnZUaW1lU3RlcCkKe3JldHVybiBpbnZUaW1lU3RlcCp0aGlzLm1fbGltaXRJbXB1bHNlO30saW5pdGlhbGl6ZTpmdW5jdGlvbihkZWYpe3RoaXMubV9ub2RlMT1uZXcgYjJKb2ludE5vZGUoKTt0aGlzLm1fbm9kZTI9bmV3IGIySm9pbnROb2RlKCk7dGhpcy5tX3R5cGU9ZGVmLnR5cGU7dGhpcy5tX3ByZXY9bnVsbDt0aGlzLm1fbmV4dD1udWxsO3RoaXMubV9ib2R5MT1kZWYuYm9keTE7dGhpcy5tX2JvZHkyPWRlZi5ib2R5Mjt0aGlzLm1fY29sbGlkZUNvbm5lY3RlZD1kZWYuY29sbGlkZUNvbm5lY3RlZDt0aGlzLm1faXNsYW5kRmxhZz1mYWxzZTt0aGlzLm1fdXNlckRhdGE9ZGVmLnVzZXJEYXRhO3RoaXMuSz1uZXcgYjJNYXQyMigpO3RoaXMuSzE9bmV3IGIyTWF0MjIoKTt0aGlzLksyPW5ldyBiMk1hdDIyKCk7dGhpcy5LMz1uZXcgYjJNYXQyMigpO3RoaXMubV9sb2NhbEFuY2hvcjE9bmV3IGIyVmVjMigpO3RoaXMubV9sb2NhbEFuY2hvcjI9bmV3IGIyVmVjMigpO3RoaXMubV9wdHBJbXB1bHNlPW5ldyBiMlZlYzIoKTt0aGlzLm1fcHRwTWFzcz1uZXcgYjJNYXQyMigpO3ZhciB0TWF0O3ZhciB0WDt2YXIgdFk7dE1hdD10aGlzLm1fYm9keTEubV9SO3RYPWRlZi5hbmNob3JQb2ludC54LXRoaXMubV9ib2R5MS5tX3Bvc2l0aW9uLng7dFk9ZGVmLmFuY2hvclBvaW50LnktdGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueTt0aGlzLm1fbG9jYWxBbmNob3IxLng9dFgqdE1hdC5jb2wxLngrdFkqdE1hdC5jb2wxLnk7dGhpcy5tX2xvY2FsQW5jaG9yMS55PXRYKnRNYXQuY29sMi54K3RZKnRNYXQuY29sMi55O3RNYXQ9dGhpcy5tX2JvZHkyLm1fUjt0WD1kZWYuYW5jaG9yUG9pbnQueC10aGlzLm1fYm9keTIubV9wb3NpdGlvbi54O3RZPWRlZi5hbmNob3JQb2ludC55LXRoaXMubV9ib2R5Mi5tX3Bvc2l0aW9uLnk7dGhpcy5tX2xvY2FsQW5jaG9yMi54PXRYKnRNYXQuY29sMS54K3RZKnRNYXQuY29sMS55O3RoaXMubV9sb2NhbEFuY2hvcjIueT10WCp0TWF0LmNvbDIueCt0WSp0TWF0LmNvbDIueTt0aGlzLm1faW50aWFsQW5nbGU9dGhpcy5tX2JvZHkyLm1fcm90YXRpb24tdGhpcy5tX2JvZHkxLm1fcm90YXRpb247dGhpcy5tX3B0cEltcHVsc2UuU2V0KDAuMCwwLjApO3RoaXMubV9tb3RvckltcHVsc2U9MC4wO3RoaXMubV9saW1pdEltcHVsc2U9MC4wO3RoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZT0wLjA7dGhpcy5tX2xvd2VyQW5nbGU9ZGVmLmxvd2VyQW5nbGU7dGhpcy5tX3VwcGVyQW5nbGU9ZGVmLnVwcGVyQW5nbGU7dGhpcy5tX21heE1vdG9yVG9ycXVlPWRlZi5tb3RvclRvcnF1ZTt0aGlzLm1fbW90b3JTcGVlZD1kZWYubW90b3JTcGVlZDt0aGlzLm1fZW5hYmxlTGltaXQ9ZGVmLmVuYWJsZUxpbWl0O3RoaXMubV9lbmFibGVNb3Rvcj1kZWYuZW5hYmxlTW90b3I7fSxLOm5ldyBiMk1hdDIyKCksSzE6bmV3IGIyTWF0MjIoKSxLMjpuZXcgYjJNYXQyMigpLEszOm5ldyBiMk1hdDIyKCksUHJlcGFyZVZlbG9jaXR5U29sdmVyOmZ1bmN0aW9uKCl7dmFyIGIxPXRoaXMubV9ib2R5MTt2YXIgYjI9dGhpcy5tX2JvZHkyO3ZhciB0TWF0O3RNYXQ9YjEubV9SO3ZhciByMVg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjEueTt2YXIgcjFZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IxLnk7dE1hdD1iMi5tX1I7dmFyIHIyWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciByMlk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueTt2YXIgaW52TWFzczE9YjEubV9pbnZNYXNzO3ZhciBpbnZNYXNzMj1iMi5tX2ludk1hc3M7dmFyIGludkkxPWIxLm1faW52STt2YXIgaW52STI9YjIubV9pbnZJO3RoaXMuSzEuY29sMS54PWludk1hc3MxK2ludk1hc3MyO3RoaXMuSzEuY29sMi54PTAuMDt0aGlzLksxLmNvbDEueT0wLjA7dGhpcy5LMS5jb2wyLnk9aW52TWFzczEraW52TWFzczI7dGhpcy5LMi5jb2wxLng9aW52STEqcjFZKnIxWTt0aGlzLksyLmNvbDIueD0taW52STEqcjFYKnIxWTt0aGlzLksyLmNvbDEueT0taW52STEqcjFYKnIxWTt0aGlzLksyLmNvbDIueT1pbnZJMSpyMVgqcjFYO3RoaXMuSzMuY29sMS54PWludkkyKnIyWSpyMlk7dGhpcy5LMy5jb2wyLng9LWludkkyKnIyWCpyMlk7dGhpcy5LMy5jb2wxLnk9LWludkkyKnIyWCpyMlk7dGhpcy5LMy5jb2wyLnk9aW52STIqcjJYKnIyWDt0aGlzLksuU2V0TSh0aGlzLksxKTt0aGlzLksuQWRkTSh0aGlzLksyKTt0aGlzLksuQWRkTSh0aGlzLkszKTt0aGlzLksuSW52ZXJ0KHRoaXMubV9wdHBNYXNzKTt0aGlzLm1fbW90b3JNYXNzPTEuMC8oaW52STEraW52STIpO2lmKHRoaXMubV9lbmFibGVNb3Rvcj09ZmFsc2UpCnt0aGlzLm1fbW90b3JJbXB1bHNlPTAuMDt9CmlmKHRoaXMubV9lbmFibGVMaW1pdCkKe3ZhciBqb2ludEFuZ2xlPWIyLm1fcm90YXRpb24tYjEubV9yb3RhdGlvbi10aGlzLm1faW50aWFsQW5nbGU7aWYoYjJNYXRoLmIyQWJzKHRoaXMubV91cHBlckFuZ2xlLXRoaXMubV9sb3dlckFuZ2xlKTwyLjAqYjJTZXR0aW5ncy5iMl9hbmd1bGFyU2xvcCkKe3RoaXMubV9saW1pdFN0YXRlPWIySm9pbnQuZV9lcXVhbExpbWl0czt9CmVsc2UgaWYoam9pbnRBbmdsZTw9dGhpcy5tX2xvd2VyQW5nbGUpCntpZih0aGlzLm1fbGltaXRTdGF0ZSE9YjJKb2ludC5lX2F0TG93ZXJMaW1pdCkKe3RoaXMubV9saW1pdEltcHVsc2U9MC4wO30KdGhpcy5tX2xpbWl0U3RhdGU9YjJKb2ludC5lX2F0TG93ZXJMaW1pdDt9CmVsc2UgaWYoam9pbnRBbmdsZT49dGhpcy5tX3VwcGVyQW5nbGUpCntpZih0aGlzLm1fbGltaXRTdGF0ZSE9YjJKb2ludC5lX2F0VXBwZXJMaW1pdCkKe3RoaXMubV9saW1pdEltcHVsc2U9MC4wO30KdGhpcy5tX2xpbWl0U3RhdGU9YjJKb2ludC5lX2F0VXBwZXJMaW1pdDt9CmVsc2UKe3RoaXMubV9saW1pdFN0YXRlPWIySm9pbnQuZV9pbmFjdGl2ZUxpbWl0O3RoaXMubV9saW1pdEltcHVsc2U9MC4wO319CmVsc2UKe3RoaXMubV9saW1pdEltcHVsc2U9MC4wO30KaWYoYjJXb3JsZC5zX2VuYWJsZVdhcm1TdGFydGluZykKe2IxLm1fbGluZWFyVmVsb2NpdHkueC09aW52TWFzczEqdGhpcy5tX3B0cEltcHVsc2UueDtiMS5tX2xpbmVhclZlbG9jaXR5LnktPWludk1hc3MxKnRoaXMubV9wdHBJbXB1bHNlLnk7YjEubV9hbmd1bGFyVmVsb2NpdHktPWludkkxKigocjFYKnRoaXMubV9wdHBJbXB1bHNlLnktcjFZKnRoaXMubV9wdHBJbXB1bHNlLngpK3RoaXMubV9tb3RvckltcHVsc2UrdGhpcy5tX2xpbWl0SW1wdWxzZSk7YjIubV9saW5lYXJWZWxvY2l0eS54Kz1pbnZNYXNzMip0aGlzLm1fcHRwSW1wdWxzZS54O2IyLm1fbGluZWFyVmVsb2NpdHkueSs9aW52TWFzczIqdGhpcy5tX3B0cEltcHVsc2UueTtiMi5tX2FuZ3VsYXJWZWxvY2l0eSs9aW52STIqKChyMlgqdGhpcy5tX3B0cEltcHVsc2UueS1yMlkqdGhpcy5tX3B0cEltcHVsc2UueCkrdGhpcy5tX21vdG9ySW1wdWxzZSt0aGlzLm1fbGltaXRJbXB1bHNlKTt9CmVsc2V7dGhpcy5tX3B0cEltcHVsc2UuU2V0WmVybygpO3RoaXMubV9tb3RvckltcHVsc2U9MC4wO3RoaXMubV9saW1pdEltcHVsc2U9MC4wO30KdGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlPTAuMDt9LFNvbHZlVmVsb2NpdHlDb25zdHJhaW50czpmdW5jdGlvbihzdGVwKXt2YXIgYjE9dGhpcy5tX2JvZHkxO3ZhciBiMj10aGlzLm1fYm9keTI7dmFyIHRNYXQ7dE1hdD1iMS5tX1I7dmFyIHIxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3ZhciByMVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTt0TWF0PWIyLm1fUjt2YXIgcjJYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IyLnk7dmFyIHIyWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciBvbGRMaW1pdEltcHVsc2U7dmFyIHB0cENkb3RYPWIyLm1fbGluZWFyVmVsb2NpdHkueCsoLWIyLm1fYW5ndWxhclZlbG9jaXR5KnIyWSktYjEubV9saW5lYXJWZWxvY2l0eS54LSgtYjEubV9hbmd1bGFyVmVsb2NpdHkqcjFZKTt2YXIgcHRwQ2RvdFk9YjIubV9saW5lYXJWZWxvY2l0eS55KyhiMi5tX2FuZ3VsYXJWZWxvY2l0eSpyMlgpLWIxLm1fbGluZWFyVmVsb2NpdHkueS0oYjEubV9hbmd1bGFyVmVsb2NpdHkqcjFYKTt2YXIgcHRwSW1wdWxzZVg9LSh0aGlzLm1fcHRwTWFzcy5jb2wxLngqcHRwQ2RvdFgrdGhpcy5tX3B0cE1hc3MuY29sMi54KnB0cENkb3RZKTt2YXIgcHRwSW1wdWxzZVk9LSh0aGlzLm1fcHRwTWFzcy5jb2wxLnkqcHRwQ2RvdFgrdGhpcy5tX3B0cE1hc3MuY29sMi55KnB0cENkb3RZKTt0aGlzLm1fcHRwSW1wdWxzZS54Kz1wdHBJbXB1bHNlWDt0aGlzLm1fcHRwSW1wdWxzZS55Kz1wdHBJbXB1bHNlWTtiMS5tX2xpbmVhclZlbG9jaXR5LngtPWIxLm1faW52TWFzcypwdHBJbXB1bHNlWDtiMS5tX2xpbmVhclZlbG9jaXR5LnktPWIxLm1faW52TWFzcypwdHBJbXB1bHNlWTtiMS5tX2FuZ3VsYXJWZWxvY2l0eS09YjEubV9pbnZJKihyMVgqcHRwSW1wdWxzZVktcjFZKnB0cEltcHVsc2VYKTtiMi5tX2xpbmVhclZlbG9jaXR5LngrPWIyLm1faW52TWFzcypwdHBJbXB1bHNlWDtiMi5tX2xpbmVhclZlbG9jaXR5LnkrPWIyLm1faW52TWFzcypwdHBJbXB1bHNlWTtiMi5tX2FuZ3VsYXJWZWxvY2l0eSs9YjIubV9pbnZJKihyMlgqcHRwSW1wdWxzZVktcjJZKnB0cEltcHVsc2VYKTtpZih0aGlzLm1fZW5hYmxlTW90b3ImJnRoaXMubV9saW1pdFN0YXRlIT1iMkpvaW50LmVfZXF1YWxMaW1pdHMpCnt2YXIgbW90b3JDZG90PWIyLm1fYW5ndWxhclZlbG9jaXR5LWIxLm1fYW5ndWxhclZlbG9jaXR5LXRoaXMubV9tb3RvclNwZWVkO3ZhciBtb3RvckltcHVsc2U9LXRoaXMubV9tb3Rvck1hc3MqbW90b3JDZG90O3ZhciBvbGRNb3RvckltcHVsc2U9dGhpcy5tX21vdG9ySW1wdWxzZTt0aGlzLm1fbW90b3JJbXB1bHNlPWIyTWF0aC5iMkNsYW1wKHRoaXMubV9tb3RvckltcHVsc2UrbW90b3JJbXB1bHNlLC1zdGVwLmR0KnRoaXMubV9tYXhNb3RvclRvcnF1ZSxzdGVwLmR0KnRoaXMubV9tYXhNb3RvclRvcnF1ZSk7bW90b3JJbXB1bHNlPXRoaXMubV9tb3RvckltcHVsc2Utb2xkTW90b3JJbXB1bHNlO2IxLm1fYW5ndWxhclZlbG9jaXR5LT1iMS5tX2ludkkqbW90b3JJbXB1bHNlO2IyLm1fYW5ndWxhclZlbG9jaXR5Kz1iMi5tX2ludkkqbW90b3JJbXB1bHNlO30KaWYodGhpcy5tX2VuYWJsZUxpbWl0JiZ0aGlzLm1fbGltaXRTdGF0ZSE9YjJKb2ludC5lX2luYWN0aXZlTGltaXQpCnt2YXIgbGltaXRDZG90PWIyLm1fYW5ndWxhclZlbG9jaXR5LWIxLm1fYW5ndWxhclZlbG9jaXR5O3ZhciBsaW1pdEltcHVsc2U9LXRoaXMubV9tb3Rvck1hc3MqbGltaXRDZG90O2lmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfZXF1YWxMaW1pdHMpCnt0aGlzLm1fbGltaXRJbXB1bHNlKz1saW1pdEltcHVsc2U7fQplbHNlIGlmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfYXRMb3dlckxpbWl0KQp7b2xkTGltaXRJbXB1bHNlPXRoaXMubV9saW1pdEltcHVsc2U7dGhpcy5tX2xpbWl0SW1wdWxzZT1iMk1hdGguYjJNYXgodGhpcy5tX2xpbWl0SW1wdWxzZStsaW1pdEltcHVsc2UsMC4wKTtsaW1pdEltcHVsc2U9dGhpcy5tX2xpbWl0SW1wdWxzZS1vbGRMaW1pdEltcHVsc2U7fQplbHNlIGlmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfYXRVcHBlckxpbWl0KQp7b2xkTGltaXRJbXB1bHNlPXRoaXMubV9saW1pdEltcHVsc2U7dGhpcy5tX2xpbWl0SW1wdWxzZT1iMk1hdGguYjJNaW4odGhpcy5tX2xpbWl0SW1wdWxzZStsaW1pdEltcHVsc2UsMC4wKTtsaW1pdEltcHVsc2U9dGhpcy5tX2xpbWl0SW1wdWxzZS1vbGRMaW1pdEltcHVsc2U7fQpiMS5tX2FuZ3VsYXJWZWxvY2l0eS09YjEubV9pbnZJKmxpbWl0SW1wdWxzZTtiMi5tX2FuZ3VsYXJWZWxvY2l0eSs9YjIubV9pbnZJKmxpbWl0SW1wdWxzZTt9fSxTb2x2ZVBvc2l0aW9uQ29uc3RyYWludHM6ZnVuY3Rpb24oKXt2YXIgb2xkTGltaXRJbXB1bHNlO3ZhciBsaW1pdEM7dmFyIGIxPXRoaXMubV9ib2R5MTt2YXIgYjI9dGhpcy5tX2JvZHkyO3ZhciBwb3NpdGlvbkVycm9yPTAuMDt2YXIgdE1hdDt0TWF0PWIxLm1fUjt2YXIgcjFYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IxLnk7dmFyIHIxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3RNYXQ9YjIubV9SO3ZhciByMlg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjIueTt2YXIgcjJZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IyLnk7dmFyIHAxWD1iMS5tX3Bvc2l0aW9uLngrcjFYO3ZhciBwMVk9YjEubV9wb3NpdGlvbi55K3IxWTt2YXIgcDJYPWIyLm1fcG9zaXRpb24ueCtyMlg7dmFyIHAyWT1iMi5tX3Bvc2l0aW9uLnkrcjJZO3ZhciBwdHBDWD1wMlgtcDFYO3ZhciBwdHBDWT1wMlktcDFZO3Bvc2l0aW9uRXJyb3I9TWF0aC5zcXJ0KHB0cENYKnB0cENYK3B0cENZKnB0cENZKTt2YXIgaW52TWFzczE9YjEubV9pbnZNYXNzO3ZhciBpbnZNYXNzMj1iMi5tX2ludk1hc3M7dmFyIGludkkxPWIxLm1faW52STt2YXIgaW52STI9YjIubV9pbnZJO3RoaXMuSzEuY29sMS54PWludk1hc3MxK2ludk1hc3MyO3RoaXMuSzEuY29sMi54PTAuMDt0aGlzLksxLmNvbDEueT0wLjA7dGhpcy5LMS5jb2wyLnk9aW52TWFzczEraW52TWFzczI7dGhpcy5LMi5jb2wxLng9aW52STEqcjFZKnIxWTt0aGlzLksyLmNvbDIueD0taW52STEqcjFYKnIxWTt0aGlzLksyLmNvbDEueT0taW52STEqcjFYKnIxWTt0aGlzLksyLmNvbDIueT1pbnZJMSpyMVgqcjFYO3RoaXMuSzMuY29sMS54PWludkkyKnIyWSpyMlk7dGhpcy5LMy5jb2wyLng9LWludkkyKnIyWCpyMlk7dGhpcy5LMy5jb2wxLnk9LWludkkyKnIyWCpyMlk7dGhpcy5LMy5jb2wyLnk9aW52STIqcjJYKnIyWDt0aGlzLksuU2V0TSh0aGlzLksxKTt0aGlzLksuQWRkTSh0aGlzLksyKTt0aGlzLksuQWRkTSh0aGlzLkszKTt0aGlzLksuU29sdmUoYjJSZXZvbHV0ZUpvaW50LnRJbXB1bHNlLC1wdHBDWCwtcHRwQ1kpO3ZhciBpbXB1bHNlWD1iMlJldm9sdXRlSm9pbnQudEltcHVsc2UueDt2YXIgaW1wdWxzZVk9YjJSZXZvbHV0ZUpvaW50LnRJbXB1bHNlLnk7YjEubV9wb3NpdGlvbi54LT1iMS5tX2ludk1hc3MqaW1wdWxzZVg7YjEubV9wb3NpdGlvbi55LT1iMS5tX2ludk1hc3MqaW1wdWxzZVk7YjEubV9yb3RhdGlvbi09YjEubV9pbnZJKihyMVgqaW1wdWxzZVktcjFZKmltcHVsc2VYKTtiMS5tX1IuU2V0KGIxLm1fcm90YXRpb24pO2IyLm1fcG9zaXRpb24ueCs9YjIubV9pbnZNYXNzKmltcHVsc2VYO2IyLm1fcG9zaXRpb24ueSs9YjIubV9pbnZNYXNzKmltcHVsc2VZO2IyLm1fcm90YXRpb24rPWIyLm1faW52SSoocjJYKmltcHVsc2VZLXIyWSppbXB1bHNlWCk7YjIubV9SLlNldChiMi5tX3JvdGF0aW9uKTt2YXIgYW5ndWxhckVycm9yPTAuMDtpZih0aGlzLm1fZW5hYmxlTGltaXQmJnRoaXMubV9saW1pdFN0YXRlIT1iMkpvaW50LmVfaW5hY3RpdmVMaW1pdCkKe3ZhciBhbmdsZT1iMi5tX3JvdGF0aW9uLWIxLm1fcm90YXRpb24tdGhpcy5tX2ludGlhbEFuZ2xlO3ZhciBsaW1pdEltcHVsc2U9MC4wO2lmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfZXF1YWxMaW1pdHMpCntsaW1pdEM9YjJNYXRoLmIyQ2xhbXAoYW5nbGUsLWIyU2V0dGluZ3MuYjJfbWF4QW5ndWxhckNvcnJlY3Rpb24sYjJTZXR0aW5ncy5iMl9tYXhBbmd1bGFyQ29ycmVjdGlvbik7bGltaXRJbXB1bHNlPS10aGlzLm1fbW90b3JNYXNzKmxpbWl0Qzthbmd1bGFyRXJyb3I9YjJNYXRoLmIyQWJzKGxpbWl0Qyk7fQplbHNlIGlmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfYXRMb3dlckxpbWl0KQp7bGltaXRDPWFuZ2xlLXRoaXMubV9sb3dlckFuZ2xlO2FuZ3VsYXJFcnJvcj1iMk1hdGguYjJNYXgoMC4wLC1saW1pdEMpO2xpbWl0Qz1iMk1hdGguYjJDbGFtcChsaW1pdEMrYjJTZXR0aW5ncy5iMl9hbmd1bGFyU2xvcCwtYjJTZXR0aW5ncy5iMl9tYXhBbmd1bGFyQ29ycmVjdGlvbiwwLjApO2xpbWl0SW1wdWxzZT0tdGhpcy5tX21vdG9yTWFzcypsaW1pdEM7b2xkTGltaXRJbXB1bHNlPXRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZTt0aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2U9YjJNYXRoLmIyTWF4KHRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZStsaW1pdEltcHVsc2UsMC4wKTtsaW1pdEltcHVsc2U9dGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlLW9sZExpbWl0SW1wdWxzZTt9CmVsc2UgaWYodGhpcy5tX2xpbWl0U3RhdGU9PWIySm9pbnQuZV9hdFVwcGVyTGltaXQpCntsaW1pdEM9YW5nbGUtdGhpcy5tX3VwcGVyQW5nbGU7YW5ndWxhckVycm9yPWIyTWF0aC5iMk1heCgwLjAsbGltaXRDKTtsaW1pdEM9YjJNYXRoLmIyQ2xhbXAobGltaXRDLWIyU2V0dGluZ3MuYjJfYW5ndWxhclNsb3AsMC4wLGIyU2V0dGluZ3MuYjJfbWF4QW5ndWxhckNvcnJlY3Rpb24pO2xpbWl0SW1wdWxzZT0tdGhpcy5tX21vdG9yTWFzcypsaW1pdEM7b2xkTGltaXRJbXB1bHNlPXRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZTt0aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2U9YjJNYXRoLmIyTWluKHRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZStsaW1pdEltcHVsc2UsMC4wKTtsaW1pdEltcHVsc2U9dGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlLW9sZExpbWl0SW1wdWxzZTt9CmIxLm1fcm90YXRpb24tPWIxLm1faW52SSpsaW1pdEltcHVsc2U7YjEubV9SLlNldChiMS5tX3JvdGF0aW9uKTtiMi5tX3JvdGF0aW9uKz1iMi5tX2ludkkqbGltaXRJbXB1bHNlO2IyLm1fUi5TZXQoYjIubV9yb3RhdGlvbik7fQpyZXR1cm4gcG9zaXRpb25FcnJvcjw9YjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wJiZhbmd1bGFyRXJyb3I8PWIyU2V0dGluZ3MuYjJfYW5ndWxhclNsb3A7fSxtX2xvY2FsQW5jaG9yMTpuZXcgYjJWZWMyKCksbV9sb2NhbEFuY2hvcjI6bmV3IGIyVmVjMigpLG1fcHRwSW1wdWxzZTpuZXcgYjJWZWMyKCksbV9tb3RvckltcHVsc2U6bnVsbCxtX2xpbWl0SW1wdWxzZTpudWxsLG1fbGltaXRQb3NpdGlvbkltcHVsc2U6bnVsbCxtX3B0cE1hc3M6bmV3IGIyTWF0MjIoKSxtX21vdG9yTWFzczpudWxsLG1faW50aWFsQW5nbGU6bnVsbCxtX2xvd2VyQW5nbGU6bnVsbCxtX3VwcGVyQW5nbGU6bnVsbCxtX21heE1vdG9yVG9ycXVlOm51bGwsbV9tb3RvclNwZWVkOm51bGwsbV9lbmFibGVMaW1pdDpudWxsLG1fZW5hYmxlTW90b3I6bnVsbCxtX2xpbWl0U3RhdGU6MH0pO2IyUmV2b2x1dGVKb2ludC50SW1wdWxzZT1uZXcgYjJWZWMyKCk7CnZhciBiMlJldm9sdXRlSm9pbnREZWY9Q2xhc3MuY3JlYXRlKCk7T2JqZWN0LmV4dGVuZChiMlJldm9sdXRlSm9pbnREZWYucHJvdG90eXBlLGIySm9pbnREZWYucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyUmV2b2x1dGVKb2ludERlZi5wcm90b3R5cGUse2luaXRpYWxpemU6ZnVuY3Rpb24oKQp7dGhpcy50eXBlPWIySm9pbnQuZV91bmtub3duSm9pbnQ7dGhpcy51c2VyRGF0YT1udWxsO3RoaXMuYm9keTE9bnVsbDt0aGlzLmJvZHkyPW51bGw7dGhpcy5jb2xsaWRlQ29ubmVjdGVkPWZhbHNlO3RoaXMudHlwZT1iMkpvaW50LmVfcmV2b2x1dGVKb2ludDt0aGlzLmFuY2hvclBvaW50PW5ldyBiMlZlYzIoMC4wLDAuMCk7dGhpcy5sb3dlckFuZ2xlPTAuMDt0aGlzLnVwcGVyQW5nbGU9MC4wO3RoaXMubW90b3JUb3JxdWU9MC4wO3RoaXMubW90b3JTcGVlZD0wLjA7dGhpcy5lbmFibGVMaW1pdD1mYWxzZTt0aGlzLmVuYWJsZU1vdG9yPWZhbHNlO30sYW5jaG9yUG9pbnQ6bnVsbCxsb3dlckFuZ2xlOm51bGwsdXBwZXJBbmdsZTpudWxsLG1vdG9yVG9ycXVlOm51bGwsbW90b3JTcGVlZDpudWxsLGVuYWJsZUxpbWl0Om51bGwsZW5hYmxlTW90b3I6bnVsbH0pOwp2YXIgZGVsdGEgPSBbIDAsIDAgXTsKdmFyIHN0YWdlID0gWyB3aW5kb3cuc2NyZWVuWCwgd2luZG93LnNjcmVlblksIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQgXTsKZ2V0QnJvd3NlckRpbWVuc2lvbnMoKTsKdmFyIGlzUnVubmluZyA9IGZhbHNlOwp2YXIgaXNNb3VzZURvd24gPSBmYWxzZTsKdmFyIHdvcmxkQUFCQjsKdmFyIHdvcmxkOwp2YXIgaXRlcmF0aW9ucyA9IDE7CnZhciB0aW1lU3RlcCA9IDEgLyAyNTsKdmFyIHdhbGxzID0gW107CnZhciB3YWxsX3RoaWNrbmVzcyA9IDIwMDsKdmFyIHdhbGxzU2V0dGVkID0gZmFsc2U7CnZhciBtb3VzZUpvaW50Owp2YXIgbW91c2UgPSB7IHg6IDAsIHk6IDAgfTsKdmFyIG1vdXNlT25DbGljayA9IFtdOwp2YXIgZWxlbWVudHMgPSBbXTsKdmFyIGJvZGllcyA9IFtdOwp2YXIgcHJvcGVydGllcyA9IFtdOwp2YXIgcXVlcnksIHBhZ2UgPSAwOwp2YXIgZ1dlYlNlYXJjaCwgZ0ltYWdlU2VhcmNoOwp2YXIgaW1GZWVsaW5nTHVja3lNb2RlID0gZmFsc2U7CnZhciByZXN1bHRCb2RpZXMgPSBbXTsKdmFyIGdyYXZpdHkgPSB7IHg6IDAsIHk6IDEgfTsKc2V0VGltZW91dChmdW5jdGlvbigpewpncmF2KCk7CmluaXQoKTsKcnVuKCk7Cn0sMTAwMCk7CmZ1bmN0aW9uIGluaXQoKSB7CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWRvd24nLCBvbkRvY3VtZW50TW91c2VEb3duLCBmYWxzZSApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uRG9jdW1lbnRNb3VzZVVwLCBmYWxzZSApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2Vtb3ZlJywgb25Eb2N1bWVudE1vdXNlTW92ZSwgZmFsc2UgKTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleXVwJywgb25Eb2N1bWVudEtleVVwLCBmYWxzZSApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndG91Y2hzdGFydCcsIG9uRG9jdW1lbnRUb3VjaFN0YXJ0LCBmYWxzZSApOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndG91Y2htb3ZlJywgb25Eb2N1bWVudFRvdWNoTW92ZSwgZmFsc2UgKTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNoZW5kJywgb25Eb2N1bWVudFRvdWNoRW5kLCBmYWxzZSApOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ2RldmljZW9yaWVudGF0aW9uJywgb25XaW5kb3dEZXZpY2VPcmllbnRhdGlvbiwgZmFsc2UgKTsKd29ybGRBQUJCID0gbmV3IGIyQUFCQigpOwp3b3JsZEFBQkIubWluVmVydGV4LlNldCggLSAyMDAsIC0gMjAwICk7CndvcmxkQUFCQi5tYXhWZXJ0ZXguU2V0KCB3aW5kb3cuaW5uZXJXaWR0aCArIDIwMCwgd2luZG93LmlubmVySGVpZ2h0ICsgMjAwICk7CndvcmxkID0gbmV3IGIyV29ybGQoIHdvcmxkQUFCQiwgbmV3IGIyVmVjMiggMCwgMCApLCB0cnVlICk7CnNldFdhbGxzKCk7CmVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeUNsYXNzKCJib3gyZCIpOwpmb3IgKCB2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkgKysgKSB7CnByb3BlcnRpZXNbaV0gPSBnZXRFbGVtZW50UHJvcGVydGllcyggZWxlbWVudHNbaV0gKTsKfQpmb3IgKCB2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkgKysgKSB7CnZhciBlbGVtZW50ID0gZWxlbWVudHNbIGkgXTsKZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CmVsZW1lbnQuc3R5bGUubGVmdCA9IHByb3BlcnRpZXNbaV1bMF0gKyAncHgnOwplbGVtZW50LnN0eWxlLnRvcCA9IHByb3BlcnRpZXNbaV1bMV0gKyAncHgnOwplbGVtZW50LnN0eWxlLndpZHRoID0gcHJvcGVydGllc1tpXVsyXSArICdweCc7CmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZG93bicsIG9uRWxlbWVudE1vdXNlRG93biwgZmFsc2UgKTsKZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uRWxlbWVudE1vdXNlVXAsIGZhbHNlICk7CmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgb25FbGVtZW50Q2xpY2ssIGZhbHNlICk7CmJvZGllc1tpXSA9IGNyZWF0ZUJveCggd29ybGQsIHByb3BlcnRpZXNbaV1bMF0gKyAocHJvcGVydGllc1tpXVsyXSA|YjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wKQp7dGhpcy5tX3UyLk11bHRpcGx5KDEuMC9sZW5ndGgyKTt9CmVsc2UKe3RoaXMubV91Mi5TZXRaZXJvKCk7fQppZihsZW5ndGgxPHRoaXMubV9tYXhMZW5ndGgxKQp7dGhpcy5tX2xpbWl0U3RhdGUxPWIySm9pbnQuZV9pbmFjdGl2ZUxpbWl0O3RoaXMubV9saW1pdEltcHVsc2UxPTAuMDt9CmVsc2UKe3RoaXMubV9saW1pdFN0YXRlMT1iMkpvaW50LmVfYXRVcHBlckxpbWl0O3RoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZTE9MC4wO30KaWYobGVuZ3RoMjx0aGlzLm1fbWF4TGVuZ3RoMikKe3RoaXMubV9saW1pdFN0YXRlMj1iMkpvaW50LmVfaW5hY3RpdmVMaW1pdDt0aGlzLm1fbGltaXRJbXB1bHNlMj0wLjA7fQplbHNlCnt0aGlzLm1fbGltaXRTdGF0ZTI9YjJKb2ludC5lX2F0VXBwZXJMaW1pdDt0aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2UyPTAuMDt9CnZhciBjcjF1MT1yMVgqdGhpcy5tX3UxLnktcjFZKnRoaXMubV91MS54O3ZhciBjcjJ1Mj1yMlgqdGhpcy5tX3UyLnktcjJZKnRoaXMubV91Mi54O3RoaXMubV9saW1pdE1hc3MxPWIxLm1faW52TWFzcytiMS5tX2ludkkqY3IxdTEqY3IxdTE7dGhpcy5tX2xpbWl0TWFzczI9YjIubV9pbnZNYXNzK2IyLm1faW52SSpjcjJ1MipjcjJ1Mjt0aGlzLm1fcHVsbGV5TWFzcz10aGlzLm1fbGltaXRNYXNzMSt0aGlzLm1fcmF0aW8qdGhpcy5tX3JhdGlvKnRoaXMubV9saW1pdE1hc3MyO3RoaXMubV9saW1pdE1hc3MxPTEuMC90aGlzLm1fbGltaXRNYXNzMTt0aGlzLm1fbGltaXRNYXNzMj0xLjAvdGhpcy5tX2xpbWl0TWFzczI7dGhpcy5tX3B1bGxleU1hc3M9MS4wL3RoaXMubV9wdWxsZXlNYXNzO3ZhciBQMVg9KC10aGlzLm1fcHVsbGV5SW1wdWxzZS10aGlzLm1fbGltaXRJbXB1bHNlMSkqdGhpcy5tX3UxLng7dmFyIFAxWT0oLXRoaXMubV9wdWxsZXlJbXB1bHNlLXRoaXMubV9saW1pdEltcHVsc2UxKSp0aGlzLm1fdTEueTt2YXIgUDJYPSgtdGhpcy5tX3JhdGlvKnRoaXMubV9wdWxsZXlJbXB1bHNlLXRoaXMubV9saW1pdEltcHVsc2UyKSp0aGlzLm1fdTIueDt2YXIgUDJZPSgtdGhpcy5tX3JhdGlvKnRoaXMubV9wdWxsZXlJbXB1bHNlLXRoaXMubV9saW1pdEltcHVsc2UyKSp0aGlzLm1fdTIueTtiMS5tX2xpbmVhclZlbG9jaXR5LngrPWIxLm1faW52TWFzcypQMVg7YjEubV9saW5lYXJWZWxvY2l0eS55Kz1iMS5tX2ludk1hc3MqUDFZO2IxLm1fYW5ndWxhclZlbG9jaXR5Kz1iMS5tX2ludkkqKHIxWCpQMVktcjFZKlAxWCk7YjIubV9saW5lYXJWZWxvY2l0eS54Kz1iMi5tX2ludk1hc3MqUDJYO2IyLm1fbGluZWFyVmVsb2NpdHkueSs9YjIubV9pbnZNYXNzKlAyWTtiMi5tX2FuZ3VsYXJWZWxvY2l0eSs9YjIubV9pbnZJKihyMlgqUDJZLXIyWSpQMlgpO30sU29sdmVWZWxvY2l0eUNvbnN0cmFpbnRzOmZ1bmN0aW9uKHN0ZXApe3ZhciBiMT10aGlzLm1fYm9keTE7dmFyIGIyPXRoaXMubV9ib2R5Mjt2YXIgdE1hdDt0TWF0PWIxLm1fUjt2YXIgcjFYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IxLnk7dmFyIHIxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3RNYXQ9YjIubV9SO3ZhciByMlg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjIueTt2YXIgcjJZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IyLnk7dmFyIHYxWDt2YXIgdjFZO3ZhciB2Mlg7dmFyIHYyWTt2YXIgUDFYO3ZhciBQMVk7dmFyIFAyWDt2YXIgUDJZO3ZhciBDZG90O3ZhciBpbXB1bHNlO3ZhciBvbGRMaW1pdEltcHVsc2U7djFYPWIxLm1fbGluZWFyVmVsb2NpdHkueCsoLWIxLm1fYW5ndWxhclZlbG9jaXR5KnIxWSk7djFZPWIxLm1fbGluZWFyVmVsb2NpdHkueSsoYjEubV9hbmd1bGFyVmVsb2NpdHkqcjFYKTt2Mlg9YjIubV9saW5lYXJWZWxvY2l0eS54KygtYjIubV9hbmd1bGFyVmVsb2NpdHkqcjJZKTt2Mlk9YjIubV9saW5lYXJWZWxvY2l0eS55KyhiMi5tX2FuZ3VsYXJWZWxvY2l0eSpyMlgpO0Nkb3Q9LSh0aGlzLm1fdTEueCp2MVgrdGhpcy5tX3UxLnkqdjFZKS10aGlzLm1fcmF0aW8qKHRoaXMubV91Mi54KnYyWCt0aGlzLm1fdTIueSp2MlkpO2ltcHVsc2U9LXRoaXMubV9wdWxsZXlNYXNzKkNkb3Q7dGhpcy5tX3B1bGxleUltcHVsc2UrPWltcHVsc2U7UDFYPS1pbXB1bHNlKnRoaXMubV91MS54O1AxWT0taW1wdWxzZSp0aGlzLm1fdTEueTtQMlg9LXRoaXMubV9yYXRpbyppbXB1bHNlKnRoaXMubV91Mi54O1AyWT0tdGhpcy5tX3JhdGlvKmltcHVsc2UqdGhpcy5tX3UyLnk7YjEubV9saW5lYXJWZWxvY2l0eS54Kz1iMS5tX2ludk1hc3MqUDFYO2IxLm1fbGluZWFyVmVsb2NpdHkueSs9YjEubV9pbnZNYXNzKlAxWTtiMS5tX2FuZ3VsYXJWZWxvY2l0eSs9YjEubV9pbnZJKihyMVgqUDFZLXIxWSpQMVgpO2IyLm1fbGluZWFyVmVsb2NpdHkueCs9YjIubV9pbnZNYXNzKlAyWDtiMi5tX2xpbmVhclZlbG9jaXR5LnkrPWIyLm1faW52TWFzcypQMlk7YjIubV9hbmd1bGFyVmVsb2NpdHkrPWIyLm1faW52SSoocjJYKlAyWS1yMlkqUDJYKTtpZih0aGlzLm1fbGltaXRTdGF0ZTE9PWIySm9pbnQuZV9hdFVwcGVyTGltaXQpCnt2MVg9YjEubV9saW5lYXJWZWxvY2l0eS54KygtYjEubV9hbmd1bGFyVmVsb2NpdHkqcjFZKTt2MVk9YjEubV9saW5lYXJWZWxvY2l0eS55KyhiMS5tX2FuZ3VsYXJWZWxvY2l0eSpyMVgpO0Nkb3Q9LSh0aGlzLm1fdTEueCp2MVgrdGhpcy5tX3UxLnkqdjFZKTtpbXB1bHNlPS10aGlzLm1fbGltaXRNYXNzMSpDZG90O29sZExpbWl0SW1wdWxzZT10aGlzLm1fbGltaXRJbXB1bHNlMTt0aGlzLm1fbGltaXRJbXB1bHNlMT1iMk1hdGguYjJNYXgoMC4wLHRoaXMubV9saW1pdEltcHVsc2UxK2ltcHVsc2UpO2ltcHVsc2U9dGhpcy5tX2xpbWl0SW1wdWxzZTEtb2xkTGltaXRJbXB1bHNlO1AxWD0taW1wdWxzZSp0aGlzLm1fdTEueDtQMVk9LWltcHVsc2UqdGhpcy5tX3UxLnk7YjEubV9saW5lYXJWZWxvY2l0eS54Kz1iMS5tX2ludk1hc3MqUDFYO2IxLm1fbGluZWFyVmVsb2NpdHkueSs9YjEubV9pbnZNYXNzKlAxWTtiMS5tX2FuZ3VsYXJWZWxvY2l0eSs9YjEubV9pbnZJKihyMVgqUDFZLXIxWSpQMVgpO30KaWYodGhpcy5tX2xpbWl0U3RhdGUyPT1iMkpvaW50LmVfYXRVcHBlckxpbWl0KQp7djJYPWIyLm1fbGluZWFyVmVsb2NpdHkueCsoLWIyLm1fYW5ndWxhclZlbG9jaXR5KnIyWSk7djJZPWIyLm1fbGluZWFyVmVsb2NpdHkueSsoYjIubV9hbmd1bGFyVmVsb2NpdHkqcjJYKTtDZG90PS0odGhpcy5tX3UyLngqdjJYK3RoaXMubV91Mi55KnYyWSk7aW1wdWxzZT0tdGhpcy5tX2xpbWl0TWFzczIqQ2RvdDtvbGRMaW1pdEltcHVsc2U9dGhpcy5tX2xpbWl0SW1wdWxzZTI7dGhpcy5tX2xpbWl0SW1wdWxzZTI9YjJNYXRoLmIyTWF4KDAuMCx0aGlzLm1fbGltaXRJbXB1bHNlMitpbXB1bHNlKTtpbXB1bHNlPXRoaXMubV9saW1pdEltcHVsc2UyLW9sZExpbWl0SW1wdWxzZTtQMlg9LWltcHVsc2UqdGhpcy5tX3UyLng7UDJZPS1pbXB1bHNlKnRoaXMubV91Mi55O2IyLm1fbGluZWFyVmVsb2NpdHkueCs9YjIubV9pbnZNYXNzKlAyWDtiMi5tX2xpbmVhclZlbG9jaXR5LnkrPWIyLm1faW52TWFzcypQMlk7YjIubV9hbmd1bGFyVmVsb2NpdHkrPWIyLm1faW52SSoocjJYKlAyWS1yMlkqUDJYKTt9fSxTb2x2ZVBvc2l0aW9uQ29uc3RyYWludHM6ZnVuY3Rpb24oKXt2YXIgYjE9dGhpcy5tX2JvZHkxO3ZhciBiMj10aGlzLm1fYm9keTI7dmFyIHRNYXQ7dmFyIHMxWD10aGlzLm1fZ3JvdW5kLm1fcG9zaXRpb24ueCt0aGlzLm1fZ3JvdW5kQW5jaG9yMS54O3ZhciBzMVk9dGhpcy5tX2dyb3VuZC5tX3Bvc2l0aW9uLnkrdGhpcy5tX2dyb3VuZEFuY2hvcjEueTt2YXIgczJYPXRoaXMubV9ncm91bmQubV9wb3NpdGlvbi54K3RoaXMubV9ncm91bmRBbmNob3IyLng7dmFyIHMyWT10aGlzLm1fZ3JvdW5kLm1fcG9zaXRpb24ueSt0aGlzLm1fZ3JvdW5kQW5jaG9yMi55O3ZhciByMVg7dmFyIHIxWTt2YXIgcjJYO3ZhciByMlk7dmFyIHAxWDt2YXIgcDFZO3ZhciBwMlg7dmFyIHAyWTt2YXIgbGVuZ3RoMTt2YXIgbGVuZ3RoMjt2YXIgQzt2YXIgaW1wdWxzZTt2YXIgb2xkTGltaXRQb3NpdGlvbkltcHVsc2U7dmFyIGxpbmVhckVycm9yPTAuMDt7dE1hdD1iMS5tX1I7cjFYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IxLnk7cjFZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IxLnk7dE1hdD1iMi5tX1I7cjJYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IyLnk7cjJZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IyLnk7cDFYPWIxLm1fcG9zaXRpb24ueCtyMVg7cDFZPWIxLm1fcG9zaXRpb24ueStyMVk7cDJYPWIyLm1fcG9zaXRpb24ueCtyMlg7cDJZPWIyLm1fcG9zaXRpb24ueStyMlk7dGhpcy5tX3UxLlNldChwMVgtczFYLHAxWS1zMVkpO3RoaXMubV91Mi5TZXQocDJYLXMyWCxwMlktczJZKTtsZW5ndGgxPXRoaXMubV91MS5MZW5ndGgoKTtsZW5ndGgyPXRoaXMubV91Mi5MZW5ndGgoKTtpZihsZW5ndGgxPmIyU2V0dGluZ3MuYjJfbGluZWFyU2xvcCkKe3RoaXMubV91MS5NdWx0aXBseSgxLjAvbGVuZ3RoMSk7fQplbHNlCnt0aGlzLm1fdTEuU2V0WmVybygpO30KaWYobGVuZ3RoMj5iMlNldHRpbmdzLmIyX2xpbmVhclNsb3ApCnt0aGlzLm1fdTIuTXVsdGlwbHkoMS4wL2xlbmd0aDIpO30KZWxzZQp7dGhpcy5tX3UyLlNldFplcm8oKTt9CkM9dGhpcy5tX2NvbnN0YW50LWxlbmd0aDEtdGhpcy5tX3JhdGlvKmxlbmd0aDI7bGluZWFyRXJyb3I9YjJNYXRoLmIyTWF4KGxpbmVhckVycm9yLE1hdGguYWJzKEMpKTtDPWIyTWF0aC5iMkNsYW1wKEMsLWIyU2V0dGluZ3MuYjJfbWF4TGluZWFyQ29ycmVjdGlvbixiMlNldHRpbmdzLmIyX21heExpbmVhckNvcnJlY3Rpb24pO2ltcHVsc2U9LXRoaXMubV9wdWxsZXlNYXNzKkM7cDFYPS1pbXB1bHNlKnRoaXMubV91MS54O3AxWT0taW1wdWxzZSp0aGlzLm1fdTEueTtwMlg9LXRoaXMubV9yYXRpbyppbXB1bHNlKnRoaXMubV91Mi54O3AyWT0tdGhpcy5tX3JhdGlvKmltcHVsc2UqdGhpcy5tX3UyLnk7YjEubV9wb3NpdGlvbi54Kz1iMS5tX2ludk1hc3MqcDFYO2IxLm1fcG9zaXRpb24ueSs9YjEubV9pbnZNYXNzKnAxWTtiMS5tX3JvdGF0aW9uKz1iMS5tX2ludkkqKHIxWCpwMVktcjFZKnAxWCk7YjIubV9wb3NpdGlvbi54Kz1iMi5tX2ludk1hc3MqcDJYO2IyLm1fcG9zaXRpb24ueSs9YjIubV9pbnZNYXNzKnAyWTtiMi5tX3JvdGF0aW9uKz1iMi5tX2ludkkqKHIyWCpwMlktcjJZKnAyWCk7YjEubV9SLlNldChiMS5tX3JvdGF0aW9uKTtiMi5tX1IuU2V0KGIyLm1fcm90YXRpb24pO30KaWYodGhpcy5tX2xpbWl0U3RhdGUxPT1iMkpvaW50LmVfYXRVcHBlckxpbWl0KQp7dE1hdD1iMS5tX1I7cjFYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IxLnk7cjFZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IxLnk7cDFYPWIxLm1fcG9zaXRpb24ueCtyMVg7cDFZPWIxLm1fcG9zaXRpb24ueStyMVk7dGhpcy5tX3UxLlNldChwMVgtczFYLHAxWS1zMVkpO2xlbmd0aDE9dGhpcy5tX3UxLkxlbmd0aCgpO2lmKGxlbmd0aDE|MCkKe2I9c3RhY2tbLS1zdGFja0NvdW50XTtpc2xhbmQuQWRkQm9keShiKTtiLm1fZmxhZ3MmPX5iMkJvZHkuZV9zbGVlcEZsYWc7aWYoYi5tX2ZsYWdzJmIyQm9keS5lX3N0YXRpY0ZsYWcpCntjb250aW51ZTt9CmZvcih2YXIgY249Yi5tX2NvbnRhY3RMaXN0O2NuIT1udWxsO2NuPWNuLm5leHQpCntpZihjbi5jb250YWN0Lm1fZmxhZ3MmYjJDb250YWN0LmVfaXNsYW5kRmxhZykKe2NvbnRpbnVlO30KaXNsYW5kLkFkZENvbnRhY3QoY24uY29udGFjdCk7Y24uY29udGFjdC5tX2ZsYWdzfD1iMkNvbnRhY3QuZV9pc2xhbmRGbGFnO290aGVyPWNuLm90aGVyO2lmKG90aGVyLm1fZmxhZ3MmYjJCb2R5LmVfaXNsYW5kRmxhZykKe2NvbnRpbnVlO30Kc3RhY2tbc3RhY2tDb3VudCsrXT1vdGhlcjtvdGhlci5tX2ZsYWdzfD1iMkJvZHkuZV9pc2xhbmRGbGFnO30KZm9yKHZhciBqbj1iLm1fam9pbnRMaXN0O2puIT1udWxsO2puPWpuLm5leHQpCntpZihqbi5qb2ludC5tX2lzbGFuZEZsYWc9PXRydWUpCntjb250aW51ZTt9CmlzbGFuZC5BZGRKb2ludChqbi5qb2ludCk7am4uam9pbnQubV9pc2xhbmRGbGFnPXRydWU7b3RoZXI9am4ub3RoZXI7aWYob3RoZXIubV9mbGFncyZiMkJvZHkuZV9pc2xhbmRGbGFnKQp7Y29udGludWU7fQpzdGFja1tzdGFja0NvdW50KytdPW90aGVyO290aGVyLm1fZmxhZ3N8PWIyQm9keS5lX2lzbGFuZEZsYWc7fX0KaXNsYW5kLlNvbHZlKHRoaXMuc3RlcCx0aGlzLm1fZ3Jhdml0eSk7dGhpcy5tX3Bvc2l0aW9uSXRlcmF0aW9uQ291bnQ9YjJNYXRoLmIyTWF4KHRoaXMubV9wb3NpdGlvbkl0ZXJhdGlvbkNvdW50LGIySXNsYW5kLm1fcG9zaXRpb25JdGVyYXRpb25Db3VudCk7aWYodGhpcy5tX2FsbG93U2xlZXApCntpc2xhbmQuVXBkYXRlU2xlZXAoZHQpO30KZm9yKHZhciBpPTA7aTxpc2xhbmQubV9ib2R5Q291bnQ7KytpKQp7Yj1pc2xhbmQubV9ib2RpZXNbaV07aWYoYi5tX2ZsYWdzJmIyQm9keS5lX3N0YXRpY0ZsYWcpCntiLm1fZmxhZ3MmPX5iMkJvZHkuZV9pc2xhbmRGbGFnO30KaWYoYi5Jc0Zyb3plbigpJiZ0aGlzLm1fbGlzdGVuZXIpCnt2YXIgcmVzcG9uc2U9dGhpcy5tX2xpc3RlbmVyLk5vdGlmeUJvdW5kYXJ5VmlvbGF0ZWQoYik7aWYocmVzcG9uc2U9PWIyV29ybGRMaXN0ZW5lci5iMl9kZXN0cm95Qm9keSkKe3RoaXMuRGVzdHJveUJvZHkoYik7Yj1udWxsO2lzbGFuZC5tX2JvZGllc1tpXT1udWxsO319fX0KdGhpcy5tX2Jyb2FkUGhhc2UuQ29tbWl0KCk7fSxRdWVyeTpmdW5jdGlvbihhYWJiLHNoYXBlcyxtYXhDb3VudCl7dmFyIHJlc3VsdHM9bmV3IEFycmF5KCk7dmFyIGNvdW50PXRoaXMubV9icm9hZFBoYXNlLlF1ZXJ5QUFCQihhYWJiLHJlc3VsdHMsbWF4Q291bnQpO2Zvcih2YXIgaT0wO2k8Y291bnQ7KytpKQp7c2hhcGVzW2ldPXJlc3VsdHNbaV07fQpyZXR1cm4gY291bnQ7fSxHZXRCb2R5TGlzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fYm9keUxpc3Q7fSxHZXRKb2ludExpc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX2pvaW50TGlzdDt9LEdldENvbnRhY3RMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9jb250YWN0TGlzdDt9LG1fYmxvY2tBbGxvY2F0b3I6bnVsbCxtX3N0YWNrQWxsb2NhdG9yOm51bGwsbV9icm9hZFBoYXNlOm51bGwsbV9jb250YWN0TWFuYWdlcjpuZXcgYjJDb250YWN0TWFuYWdlcigpLG1fYm9keUxpc3Q6bnVsbCxtX2NvbnRhY3RMaXN0Om51bGwsbV9qb2ludExpc3Q6bnVsbCxtX2JvZHlDb3VudDowLG1fY29udGFjdENvdW50OjAsbV9qb2ludENvdW50OjAsbV9ib2R5RGVzdHJveUxpc3Q6bnVsbCxtX2dyYXZpdHk6bnVsbCxtX2FsbG93U2xlZXA6bnVsbCxtX2dyb3VuZEJvZHk6bnVsbCxtX2xpc3RlbmVyOm51bGwsbV9maWx0ZXI6bnVsbCxtX3Bvc2l0aW9uSXRlcmF0aW9uQ291bnQ6MH07YjJXb3JsZC5zX2VuYWJsZVBvc2l0aW9uQ29ycmVjdGlvbj0xO2IyV29ybGQuc19lbmFibGVXYXJtU3RhcnRpbmc9MTsKdmFyIGIyV29ybGRMaXN0ZW5lcj1DbGFzcy5jcmVhdGUoKTtiMldvcmxkTGlzdGVuZXIucHJvdG90eXBlPXtOb3RpZnlKb2ludERlc3Ryb3llZDpmdW5jdGlvbihqb2ludCl7fSxOb3RpZnlCb3VuZGFyeVZpb2xhdGVkOmZ1bmN0aW9uKGJvZHkpCntyZXR1cm4gYjJXb3JsZExpc3RlbmVyLmIyX2ZyZWV6ZUJvZHk7fSxpbml0aWFsaXplOmZ1bmN0aW9uKCl7fX07YjJXb3JsZExpc3RlbmVyLmIyX2ZyZWV6ZUJvZHk9MDtiMldvcmxkTGlzdGVuZXIuYjJfZGVzdHJveUJvZHk9MTsKdmFyIGIySm9pbnROb2RlPUNsYXNzLmNyZWF0ZSgpO2IySm9pbnROb2RlLnByb3RvdHlwZT17b3RoZXI6bnVsbCxqb2ludDpudWxsLHByZXY6bnVsbCxuZXh0Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbigpe319CnZhciBiMkpvaW50PUNsYXNzLmNyZWF0ZSgpO2IySm9pbnQucHJvdG90eXBlPXtHZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV90eXBlO30sR2V0QW5jaG9yMTpmdW5jdGlvbigpe3JldHVybiBudWxsfSxHZXRBbmNob3IyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LEdldFJlYWN0aW9uRm9yY2U6ZnVuY3Rpb24oaW52VGltZVN0ZXApe3JldHVybiBudWxsfSxHZXRSZWFjdGlvblRvcnF1ZTpmdW5jdGlvbihpbnZUaW1lU3RlcCl7cmV0dXJuIDAuMH0sR2V0Qm9keTE6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMubV9ib2R5MTt9LEdldEJvZHkyOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLm1fYm9keTI7fSxHZXROZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9uZXh0O30sR2V0VXNlckRhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX3VzZXJEYXRhO30saW5pdGlhbGl6ZTpmdW5jdGlvbihkZWYpe3RoaXMubV9ub2RlMT1uZXcgYjJKb2ludE5vZGUoKTt0aGlzLm1fbm9kZTI9bmV3IGIySm9pbnROb2RlKCk7dGhpcy5tX3R5cGU9ZGVmLnR5cGU7dGhpcy5tX3ByZXY9bnVsbDt0aGlzLm1fbmV4dD1udWxsO3RoaXMubV9ib2R5MT1kZWYuYm9keTE7dGhpcy5tX2JvZHkyPWRlZi5ib2R5Mjt0aGlzLm1fY29sbGlkZUNvbm5lY3RlZD1kZWYuY29sbGlkZUNvbm5lY3RlZDt0aGlzLm1faXNsYW5kRmxhZz1mYWxzZTt0aGlzLm1fdXNlckRhdGE9ZGVmLnVzZXJEYXRhO30sUHJlcGFyZVZlbG9jaXR5U29sdmVyOmZ1bmN0aW9uKCl7fSxTb2x2ZVZlbG9jaXR5Q29uc3RyYWludHM6ZnVuY3Rpb24oc3RlcCl7fSxQcmVwYXJlUG9zaXRpb25Tb2x2ZXI6ZnVuY3Rpb24oKXt9LFNvbHZlUG9zaXRpb25Db25zdHJhaW50czpmdW5jdGlvbigpe3JldHVybiBmYWxzZX0sbV90eXBlOjAsbV9wcmV2Om51bGwsbV9uZXh0Om51bGwsbV9ub2RlMTpuZXcgYjJKb2ludE5vZGUoKSxtX25vZGUyOm5ldyBiMkpvaW50Tm9kZSgpLG1fYm9keTE6bnVsbCxtX2JvZHkyOm51bGwsbV9pc2xhbmRGbGFnOm51bGwsbV9jb2xsaWRlQ29ubmVjdGVkOm51bGwsbV91c2VyRGF0YTpudWxsfTtiMkpvaW50LkNyZWF0ZT1mdW5jdGlvbihkZWYsYWxsb2NhdG9yKXt2YXIgam9pbnQ9bnVsbDtzd2l0Y2goZGVmLnR5cGUpCntjYXNlIGIySm9pbnQuZV9kaXN0YW5jZUpvaW50Ontqb2ludD1uZXcgYjJEaXN0YW5jZUpvaW50KGRlZik7fQpicmVhaztjYXNlIGIySm9pbnQuZV9tb3VzZUpvaW50Ontqb2ludD1uZXcgYjJNb3VzZUpvaW50KGRlZik7fQpicmVhaztjYXNlIGIySm9pbnQuZV9wcmlzbWF0aWNKb2ludDp7am9pbnQ9bmV3IGIyUHJpc21hdGljSm9pbnQoZGVmKTt9CmJyZWFrO2Nhc2UgYjJKb2ludC5lX3Jldm9sdXRlSm9pbnQ6e2pvaW50PW5ldyBiMlJldm9sdXRlSm9pbnQoZGVmKTt9CmJyZWFrO2Nhc2UgYjJKb2ludC5lX3B1bGxleUpvaW50Ontqb2ludD1uZXcgYjJQdWxsZXlKb2ludChkZWYpO30KYnJlYWs7Y2FzZSBiMkpvaW50LmVfZ2VhckpvaW50Ontqb2ludD1uZXcgYjJHZWFySm9pbnQoZGVmKTt9CmJyZWFrO2RlZmF1bHQ6YnJlYWs7fQpyZXR1cm4gam9pbnQ7fTtiMkpvaW50LkRlc3Ryb3k9ZnVuY3Rpb24oam9pbnQsYWxsb2NhdG9yKXt9O2IySm9pbnQuZV91bmtub3duSm9pbnQ9MDtiMkpvaW50LmVfcmV2b2x1dGVKb2ludD0xO2IySm9pbnQuZV9wcmlzbWF0aWNKb2ludD0yO2IySm9pbnQuZV9kaXN0YW5jZUpvaW50PTM7YjJKb2ludC5lX3B1bGxleUpvaW50PTQ7YjJKb2ludC5lX21vdXNlSm9pbnQ9NTtiMkpvaW50LmVfZ2VhckpvaW50PTY7YjJKb2ludC5lX2luYWN0aXZlTGltaXQ9MDtiMkpvaW50LmVfYXRMb3dlckxpbWl0PTE7YjJKb2ludC5lX2F0VXBwZXJMaW1pdD0yO2IySm9pbnQuZV9lcXVhbExpbWl0cz0zOwp2YXIgYjJKb2ludERlZj1DbGFzcy5jcmVhdGUoKTtiMkpvaW50RGVmLnByb3RvdHlwZT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpCnt0aGlzLnR5cGU9YjJKb2ludC5lX3Vua25vd25Kb2ludDt0aGlzLnVzZXJEYXRhPW51bGw7dGhpcy5ib2R5MT1udWxsO3RoaXMuYm9keTI9bnVsbDt0aGlzLmNvbGxpZGVDb25uZWN0ZWQ9ZmFsc2U7fSx0eXBlOjAsdXNlckRhdGE6bnVsbCxib2R5MTpudWxsLGJvZHkyOm51bGwsY29sbGlkZUNvbm5lY3RlZDpudWxsfQp2YXIgYjJEaXN0YW5jZUpvaW50PUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJEaXN0YW5jZUpvaW50LnByb3RvdHlwZSxiMkpvaW50LnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMkRpc3RhbmNlSm9pbnQucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKGRlZil7dGhpcy5tX25vZGUxPW5ldyBiMkpvaW50Tm9kZSgpO3RoaXMubV9ub2RlMj1uZXcgYjJKb2ludE5vZGUoKTt0aGlzLm1fdHlwZT1kZWYudHlwZTt0aGlzLm1fcHJldj1udWxsO3RoaXMubV9uZXh0PW51bGw7dGhpcy5tX2JvZHkxPWRlZi5ib2R5MTt0aGlzLm1fYm9keTI9ZGVmLmJvZHkyO3RoaXMubV9jb2xsaWRlQ29ubmVjdGVkPWRlZi5jb2xsaWRlQ29ubmVjdGVkO3RoaXMubV9pc2xhbmRGbGFnPWZhbHNlO3RoaXMubV91c2VyRGF0YT1kZWYudXNlckRhdGE7dGhpcy5tX2xvY2FsQW5jaG9yMT1uZXcgYjJWZWMyKCk7dGhpcy5tX2xvY2FsQW5jaG9yMj1uZXcgYjJWZWMyKCk7dGhpcy5tX3U9bmV3IGIyVmVjMigpO3ZhciB0TWF0O3ZhciB0WDt2YXIgdFk7dE1hdD10aGlzLm1fYm9keTEubV9SO3RYPWRlZi5hbmNob3JQb2ludDEueC10aGlzLm1fYm9keTEubV9wb3NpdGlvbi54O3RZPWRlZi5hbmNob3JQb2ludDEueS10aGlzLm1fYm9keTEubV9wb3NpdGlvbi55O3RoaXMubV9sb2NhbEFuY2hvcjEueD10WCp0TWF0LmNvbDEueCt0WSp0TWF0LmNvbDEueTt0aGlzLm1fbG9jYWxBbmNob3IxLnk9dFgqdE1hdC5jb2wyLngrdFkqdE1hdC5jb2wyLnk7dE1hdD10aGlzLm1fYm9keTIubV9SO3RYPWRlZi5hbmNob3JQb2ludDIueC10aGlzLm1fYm9keTIubV9wb3NpdGlvbi54O3RZPWRlZi5hbmNob3JQb2ludDIueS10aGlzLm1fYm9keTIubV9wb3NpdGlvbi55O3RoaXMubV9sb2NhbEFuY2hvcjIueD10WCp0TWF0LmNvbDEueCt0WSp0TWF0LmNvbDEueTt0aGlzLm1fbG9jYWxBbmNob3IyLnk9dFgqdE1hdC5jb2wyLngrdFkqdE1hdC5jb2wyLnk7dFg9ZGVmLmFuY2hvclBvaW50Mi54LWRlZi5hbmNob3JQb2ludDEueDt0WT1kZWYuYW5jaG9yUG9pbnQyLnktZGVmLmFuY2hvclBvaW50MS55O3RoaXMubV9sZW5ndGg9TWF0aC5zcXJ0KHRYKnRYK3RZKnRZKTt0aGlzLm1faW1wdWxzZT0wLjA7fSxQcmVwYXJlVmVsb2NpdHlTb2x2ZXI6ZnVuY3Rpb24oKXt2YXIgdE1hdDt0TWF0PXRoaXMubV9ib2R5MS5tX1I7dmFyIHIxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3ZhciByMVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTt0TWF0PXRoaXMubV9ib2R5Mi5tX1I7dmFyIHIyWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciByMlk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueTt0aGlzLm1fdS54PXRoaXMubV9ib2R5Mi5tX3Bvc2l0aW9uLngrcjJYLXRoaXMubV9ib2R5MS5tX3Bvc2l0aW9uLngtcjFYO3RoaXMubV91Lnk9dGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueStyMlktdGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueS1yMVk7dmFyIGxlbmd0aD1NYXRoLnNxcnQodGhpcy5tX3UueCp0aGlzLm1fdS54K3RoaXMubV91LnkqdGhpcy5tX3UueSk7aWYobGVuZ3RoPmIyU2V0dGluZ3MuYjJfbGluZWFyU2xvcCkKe3RoaXMubV91Lk11bHRpcGx5KDEuMC9sZW5ndGgpO30KZWxzZQp7dGhpcy5tX3UuU2V0WmVybygpO30KdmFyIGNyMXU9KHIxWCp0aGlzLm1fdS55LXIxWSp0aGlzLm1fdS54KTt2YXIgY3IydT0ocjJYKnRoaXMubV91LnktcjJZKnRoaXMubV91LngpO3RoaXMubV9tYXNzPXRoaXMubV9ib2R5MS5tX2ludk1hc3MrdGhpcy5tX2JvZHkxLm1faW52SSpjcjF1KmNyMXUrdGhpcy5tX2JvZHkyLm1faW52TWFzcyt0aGlzLm1fYm9keTIubV9pbnZJKmNyMnUqY3IydTt0aGlzLm1fbWFzcz0xLjAvdGhpcy5tX21hc3M7aWYoYjJXb3JsZC5zX2VuYWJsZVdhcm1TdGFydGluZykKe3ZhciBQWD10aGlzLm1faW1wdWxzZSp0aGlzLm1fdS54O3ZhciBQWT10aGlzLm1faW1wdWxzZSp0aGlzLm1fdS55O3RoaXMubV9ib2R5MS5tX2xpbmVhclZlbG9jaXR5LngtPXRoaXMubV9ib2R5MS5tX2ludk1hc3MqUFg7dGhpcy5tX2JvZHkxLm1fbGluZWFyVmVsb2NpdHkueS09dGhpcy5tX2JvZHkxLm1faW52TWFzcypQWTt0aGlzLm1fYm9keTEubV9hbmd1bGFyVmVsb2NpdHktPXRoaXMubV9ib2R5MS5tX2ludkkqKHIxWCpQWS1yMVkqUFgpO3RoaXMubV9ib2R5Mi5tX2xpbmVhclZlbG9jaXR5LngrPXRoaXMubV9ib2R5Mi5tX2ludk1hc3MqUFg7dGhpcy5tX2JvZHkyLm1fbGluZWFyVmVsb2NpdHkueSs9dGhpcy5tX2JvZHkyLm1faW52TWFzcypQWTt0aGlzLm1fYm9keTIubV9hbmd1bGFyVmVsb2NpdHkrPXRoaXMubV9ib2R5Mi5tX2ludkkqKHIyWCpQWS1yMlkqUFgpO30KZWxzZQp7dGhpcy5tX2ltcHVsc2U9MC4wO319LFNvbHZlVmVsb2NpdHlDb25zdHJhaW50czpmdW5jdGlvbihzdGVwKXt2YXIgdE1hdDt0TWF0PXRoaXMubV9ib2R5MS5tX1I7dmFyIHIxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3ZhciByMVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTt0TWF0PXRoaXMubV9ib2R5Mi5tX1I7dmFyIHIyWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciByMlk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueTt2YXIgdjFYPXRoaXMubV9ib2R5MS5tX2xpbmVhclZlbG9jaXR5LngrKC10aGlzLm1fYm9keTEubV9hbmd1bGFyVmVsb2NpdHkqcjFZKTt2YXIgdjFZPXRoaXMubV9ib2R5MS5tX2xpbmVhclZlbG9jaXR5LnkrKHRoaXMubV9ib2R5MS5tX2FuZ3VsYXJWZWxvY2l0eSpyMVgpO3ZhciB2Mlg9dGhpcy5tX2JvZHkyLm1fbGluZWFyVmVsb2NpdHkueCsoLXRoaXMubV9ib2R5Mi5tX2FuZ3VsYXJWZWxvY2l0eSpyMlkpO3ZhciB2Mlk9dGhpcy5tX2JvZHkyLm1fbGluZWFyVmVsb2NpdHkueSsodGhpcy5tX2JvZHkyLm1fYW5ndWxhclZlbG9jaXR5KnIyWCk7dmFyIENkb3Q9KHRoaXMubV91LngqKHYyWC12MVgpK3RoaXMubV91LnkqKHYyWS12MVkpKTt2YXIgaW1wdWxzZT0tdGhpcy5tX21hc3MqQ2RvdDt0aGlzLm1faW1wdWxzZSs9aW1wdWxzZTt2YXIgUFg9aW1wdWxzZSp0aGlzLm1fdS54O3ZhciBQWT1pbXB1bHNlKnRoaXMubV91Lnk7dGhpcy5tX2JvZHkxLm1fbGluZWFyVmVsb2NpdHkueC09dGhpcy5tX2JvZHkxLm1faW52TWFzcypQWDt0aGlzLm1fYm9keTEubV9saW5lYXJWZWxvY2l0eS55LT10aGlzLm1fYm9keTEubV9pbnZNYXNzKlBZO3RoaXMubV9ib2R5MS5tX2FuZ3VsYXJWZWxvY2l0eS09dGhpcy5tX2JvZHkxLm1faW52SSoocjFYKlBZLXIxWSpQWCk7dGhpcy5tX2JvZHkyLm1fbGluZWFyVmVsb2NpdHkueCs9dGhpcy5tX2JvZHkyLm1faW52TWFzcypQWDt0aGlzLm1fYm9keTIubV9saW5lYXJWZWxvY2l0eS55Kz10aGlzLm1fYm9keTIubV9pbnZNYXNzKlBZO3RoaXMubV9ib2R5Mi5tX2FuZ3VsYXJWZWxvY2l0eSs9dGhpcy5tX2JvZHkyLm1faW52SSoocjJYKlBZLXIyWSpQWCk7fSxTb2x2ZVBvc2l0aW9uQ29uc3RyYWludHM6ZnVuY3Rpb24oKXt2YXIgdE1hdDt0TWF0PXRoaXMubV9ib2R5MS5tX1I7dmFyIHIxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3ZhciByMVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTt0TWF0PXRoaXMubV9ib2R5Mi5tX1I7dmFyIHIyWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciByMlk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueTt2YXIgZFg9dGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueCtyMlgtdGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueC1yMVg7dmFyIGRZPXRoaXMubV9ib2R5Mi5tX3Bvc2l0aW9uLnkrcjJZLXRoaXMubV9ib2R5MS5tX3Bvc2l0aW9uLnktcjFZO3ZhciBsZW5ndGg9TWF0aC5zcXJ0KGRYKmRYK2RZKmRZKTtkWC89bGVuZ3RoO2RZLz1sZW5ndGg7dmFyIEM9bGVuZ3RoLXRoaXMubV9sZW5ndGg7Qz1iMk1hdGguYjJDbGFtcChDLC1iMlNldHRpbmdzLmIyX21heExpbmVhckNvcnJlY3Rpb24sYjJTZXR0aW5ncy5iMl9tYXhMaW5lYXJDb3JyZWN0aW9uKTt2YXIgaW1wdWxzZT0tdGhpcy5tX21hc3MqQzt0aGlzLm1fdS5TZXQoZFgsZFkpO3ZhciBQWD1pbXB1bHNlKnRoaXMubV91Lng7dmFyIFBZPWltcHVsc2UqdGhpcy5tX3UueTt0aGlzLm1fYm9keTEubV9wb3NpdGlvbi54LT10aGlzLm1fYm9keTEubV9pbnZNYXNzKlBYO3RoaXMubV9ib2R5MS5tX3Bvc2l0aW9uLnktPXRoaXMubV9ib2R5MS5tX2ludk1hc3MqUFk7dGhpcy5tX2JvZHkxLm1fcm90YXRpb24tPXRoaXMubV9ib2R5MS5tX2ludkkqKHIxWCpQWS1yMVkqUFgpO3RoaXMubV9ib2R5Mi5tX3Bvc2l0aW9uLngrPXRoaXMubV9ib2R5Mi5tX2ludk1hc3MqUFg7dGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueSs9dGhpcy5tX2JvZHkyLm1faW52TWFzcypQWTt0aGlzLm1fYm9keTIubV9yb3RhdGlvbis9dGhpcy5tX2JvZHkyLm1faW52SSoocjJYKlBZLXIyWSpQWCk7dGhpcy5tX2JvZHkxLm1fUi5TZXQodGhpcy5tX2JvZHkxLm1fcm90YXRpb24pO3RoaXMubV9ib2R5Mi5tX1IuU2V0KHRoaXMubV9ib2R5Mi5tX3JvdGF0aW9uKTtyZXR1cm4gYjJNYXRoLmIyQWJzKEMpPGIyU2V0dGluZ3MuYjJfbGluZWFyU2xvcDt9LEdldEFuY2hvcjE6ZnVuY3Rpb24oKXtyZXR1cm4gYjJNYXRoLkFkZFZWKHRoaXMubV9ib2R5MS5tX3Bvc2l0aW9uLGIyTWF0aC5iMk11bE1WKHRoaXMubV9ib2R5MS5tX1IsdGhpcy5tX2xvY2FsQW5jaG9yMSkpO30sR2V0QW5jaG9yMjpmdW5jdGlvbigpe3JldHVybiBiMk1hdGguQWRkVlYodGhpcy5tX2JvZHkyLm1fcG9zaXRpb24sYjJNYXRoLmIyTXVsTVYodGhpcy5tX2JvZHkyLm1fUix0aGlzLm1fbG9jYWxBbmNob3IyKSk7fSxHZXRSZWFjdGlvbkZvcmNlOmZ1bmN0aW9uKGludlRpbWVTdGVwKQp7dmFyIEY9bmV3IGIyVmVjMigpO0YuU2V0Vih0aGlzLm1fdSk7Ri5NdWx0aXBseSh0aGlzLm1faW1wdWxzZSppbnZUaW1lU3RlcCk7cmV0dXJuIEY7fSxHZXRSZWFjdGlvblRvcnF1ZTpmdW5jdGlvbihpbnZUaW1lU3RlcCkKe3JldHVybiAwLjA7fSxtX2xvY2FsQW5jaG9yMTpuZXcgYjJWZWMyKCksbV9sb2NhbEFuY2hvcjI6bmV3IGIyVmVjMigpLG1fdTpuZXcgYjJWZWMyKCksbV9pbXB1bHNlOm51bGwsbV9tYXNzOm51bGwsbV9sZW5ndGg6bnVsbH0pOwp2YXIgYjJEaXN0YW5jZUpvaW50RGVmPUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJEaXN0YW5jZUpvaW50RGVmLnByb3RvdHlwZSxiMkpvaW50RGVmLnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMkRpc3RhbmNlSm9pbnREZWYucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCkKe3RoaXMudHlwZT1iMkpvaW50LmVfdW5rbm93bkpvaW50O3RoaXMudXNlckRhdGE9bnVsbDt0aGlzLmJvZHkxPW51bGw7dGhpcy5ib2R5Mj1udWxsO3RoaXMuY29sbGlkZUNvbm5lY3RlZD1mYWxzZTt0aGlzLmFuY2hvclBvaW50MT1uZXcgYjJWZWMyKCk7dGhpcy5hbmNob3JQb2ludDI9bmV3IGIyVmVjMigpO3RoaXMudHlwZT1iMkpvaW50LmVfZGlzdGFuY2VKb2ludDt9LGFuY2hvclBvaW50MTpuZXcgYjJWZWMyKCksYW5jaG9yUG9pbnQyOm5ldyBiMlZlYzIoKX0pOwp2YXIgYjJKYWNvYmlhbj1DbGFzcy5jcmVhdGUoKTtiMkphY29iaWFuLnByb3RvdHlwZT17bGluZWFyMTpuZXcgYjJWZWMyKCksYW5ndWxhcjE6bnVsbCxsaW5lYXIyOm5ldyBiMlZlYzIoKSxhbmd1bGFyMjpudWxsLFNldFplcm86ZnVuY3Rpb24oKXt0aGlzLmxpbmVhcjEuU2V0WmVybygpO3RoaXMuYW5ndWxhcjE9MC4wO3RoaXMubGluZWFyMi5TZXRaZXJvKCk7dGhpcy5hbmd1bGFyMj0wLjA7fSxTZXQ6ZnVuY3Rpb24oeDEsYTEseDIsYTIpe3RoaXMubGluZWFyMS5TZXRWKHgxKTt0aGlzLmFuZ3VsYXIxPWExO3RoaXMubGluZWFyMi5TZXRWKHgyKTt0aGlzLmFuZ3VsYXIyPWEyO30sQ29tcHV0ZTpmdW5jdGlvbih4MSxhMSx4MixhMil7cmV0dXJuKHRoaXMubGluZWFyMS54KngxLngrdGhpcy5saW5lYXIxLnkqeDEueSkrdGhpcy5hbmd1bGFyMSphMSsodGhpcy5saW5lYXIyLngqeDIueCt0aGlzLmxpbmVhcjIueSp4Mi55KSt0aGlzLmFuZ3VsYXIyKmEyO30saW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMubGluZWFyMT1uZXcgYjJWZWMyKCk7dGhpcy5saW5lYXIyPW5ldyBiMlZlYzIoKTt9fTsKdmFyIGIyR2VhckpvaW50PUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJHZWFySm9pbnQucHJvdG90eXBlLGIySm9pbnQucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyR2VhckpvaW50LnByb3RvdHlwZSx7R2V0QW5jaG9yMTpmdW5jdGlvbigpe3ZhciB0TWF0PXRoaXMubV9ib2R5MS5tX1I7cmV0dXJuIG5ldyBiMlZlYzIodGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueCsodE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjEueSksdGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueSsodE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueSkpO30sR2V0QW5jaG9yMjpmdW5jdGlvbigpe3ZhciB0TWF0PXRoaXMubV9ib2R5Mi5tX1I7cmV0dXJuIG5ldyBiMlZlYzIodGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueCsodE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjIueSksdGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueSsodE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueSkpO30sR2V0UmVhY3Rpb25Gb3JjZTpmdW5jdGlvbihpbnZUaW1lU3RlcCl7cmV0dXJuIG5ldyBiMlZlYzIoKTt9LEdldFJlYWN0aW9uVG9ycXVlOmZ1bmN0aW9uKGludlRpbWVTdGVwKXtyZXR1cm4gMC4wO30sR2V0UmF0aW86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX3JhdGlvO30saW5pdGlhbGl6ZTpmdW5jdGlvbihkZWYpe3RoaXMubV9ub2RlMT1uZXcgYjJKb2ludE5vZGUoKTt0aGlzLm1fbm9kZTI9bmV3IGIySm9pbnROb2RlKCk7dGhpcy5tX3R5cGU9ZGVmLnR5cGU7dGhpcy5tX3ByZXY9bnVsbDt0aGlzLm1fbmV4dD1udWxsO3RoaXMubV9ib2R5MT1kZWYuYm9keTE7dGhpcy5tX2JvZHkyPWRlZi5ib2R5Mjt0aGlzLm1fY29sbGlkZUNvbm5lY3RlZD1kZWYuY29sbGlkZUNvbm5lY3RlZDt0aGlzLm1faXNsYW5kRmxhZz1mYWxzZTt0aGlzLm1fdXNlckRhdGE9ZGVmLnVzZXJEYXRhO3RoaXMubV9ncm91bmRBbmNob3IxPW5ldyBiMlZlYzIoKTt0aGlzLm1fZ3JvdW5kQW5jaG9yMj1uZXcgYjJWZWMyKCk7dGhpcy5tX2xvY2FsQW5jaG9yMT1uZXcgYjJWZWMyKCk7dGhpcy5tX2xvY2FsQW5jaG9yMj1uZXcgYjJWZWMyKCk7dGhpcy5tX0o9bmV3IGIySmFjb2JpYW4oKTt0aGlzLm1fcmV2b2x1dGUxPW51bGw7dGhpcy5tX3ByaXNtYXRpYzE9bnVsbDt0aGlzLm1fcmV2b2x1dGUyPW51bGw7dGhpcy5tX3ByaXNtYXRpYzI9bnVsbDt2YXIgY29vcmRpbmF0ZTE7dmFyIGNvb3JkaW5hdGUyO3RoaXMubV9ncm91bmQxPWRlZi5qb2ludDEubV9ib2R5MTt0aGlzLm1fYm9keTE9ZGVmLmpvaW50MS5tX2JvZHkyO2lmKGRlZi5qb2ludDEubV90eXBlPT1iMkpvaW50LmVfcmV2b2x1dGVKb2ludCkKe3RoaXMubV9yZXZvbHV0ZTE9ZGVmLmpvaW50MTt0aGlzLm1fZ3JvdW5kQW5jaG9yMS5TZXRWKHRoaXMubV9yZXZvbHV0ZTEubV9sb2NhbEFuY2hvcjEpO3RoaXMubV9sb2NhbEFuY2hvcjEuU2V0Vih0aGlzLm1fcmV2b2x1dGUxLm1fbG9jYWxBbmNob3IyKTtjb29yZGluYXRlMT10aGlzLm1fcmV2b2x1dGUxLkdldEpvaW50QW5nbGUoKTt9CmVsc2UKe3RoaXMubV9wcmlzbWF0aWMxPWRlZi5qb2ludDE7dGhpcy5tX2dyb3VuZEFuY2hvcjEuU2V0Vih0aGlzLm1fcHJpc21hdGljMS5tX2xvY2FsQW5jaG9yMSk7dGhpcy5tX2xvY2FsQW5jaG9yMS5TZXRWKHRoaXMubV9wcmlzbWF0aWMxLm1fbG9jYWxBbmNob3IyKTtjb29yZGluYXRlMT10aGlzLm1fcHJpc21hdGljMS5HZXRKb2ludFRyYW5zbGF0aW9uKCk7fQp0aGlzLm1fZ3JvdW5kMj1kZWYuam9pbnQyLm1fYm9keTE7dGhpcy5tX2JvZHkyPWRlZi5qb2ludDIubV9ib2R5MjtpZihkZWYuam9pbnQyLm1fdHlwZT09YjJKb2ludC5lX3Jldm9sdXRlSm9pbnQpCnt0aGlzLm1fcmV2b2x1dGUyPWRlZi5qb2ludDI7dGhpcy5tX2dyb3VuZEFuY2hvcjIuU2V0Vih0aGlzLm1fcmV2b2x1dGUyLm1fbG9jYWxBbmNob3IxKTt0aGlzLm1fbG9jYWxBbmNob3IyLlNldFYodGhpcy5tX3Jldm9sdXRlMi5tX2xvY2FsQW5jaG9yMik7Y29vcmRpbmF0ZTI9dGhpcy5tX3Jldm9sdXRlMi5HZXRKb2ludEFuZ2xlKCk7fQplbHNlCnt0aGlzLm1fcHJpc21hdGljMj1kZWYuam9pbnQyO3RoaXMubV9ncm91bmRBbmNob3IyLlNldFYodGhpcy5tX3ByaXNtYXRpYzIubV9sb2NhbEFuY2hvcjEpO3RoaXMubV9sb2NhbEFuY2hvcjIuU2V0Vih0aGlzLm1fcHJpc21hdGljMi5tX2xvY2FsQW5jaG9yMik7Y29vcmRpbmF0ZTI9dGhpcy5tX3ByaXNtYXRpYzIuR2V0Sm9pbnRUcmFuc2xhdGlvbigpO30KdGhpcy5tX3JhdGlvPWRlZi5yYXRpbzt0aGlzLm1fY29uc3RhbnQ9Y29vcmRpbmF0ZTErdGhpcy5tX3JhdGlvKmNvb3JkaW5hdGUyO3RoaXMubV9pbXB1bHNlPTAuMDt9LFByZXBhcmVWZWxvY2l0eVNvbHZlcjpmdW5jdGlvbigpe3ZhciBnMT10aGlzLm1fZ3JvdW5kMTt2YXIgZzI9dGhpcy5tX2dyb3VuZDI7dmFyIGIxPXRoaXMubV9ib2R5MTt2YXIgYjI9dGhpcy5tX2JvZHkyO3ZhciB1Z1g7dmFyIHVnWTt2YXIgclg7dmFyIHJZO3ZhciB0TWF0O3ZhciB0VmVjO3ZhciBjcnVnO3ZhciBLPTAuMDt0aGlzLm1fSi5TZXRaZXJvKCk7aWYodGhpcy5tX3Jldm9sdXRlMSkKe3RoaXMubV9KLmFuZ3VsYXIxPS0xLjA7Sys9YjEubV9pbnZJO30KZWxzZQp7dE1hdD1nMS5tX1I7dFZlYz10aGlzLm1fcHJpc21hdGljMS5tX2xvY2FsWEF4aXMxO3VnWD10TWF0LmNvbDEueCp0VmVjLngrdE1hdC5jb2wyLngqdFZlYy55O3VnWT10TWF0LmNvbDEueSp0VmVjLngrdE1hdC5jb2wyLnkqdFZlYy55O3RNYXQ9YjEubV9SO3JYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IxLnk7clk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTtjcnVnPXJYKnVnWS1yWSp1Z1g7dGhpcy5tX0oubGluZWFyMS5TZXQoLXVnWCwtdWdZKTt0aGlzLm1fSi5hbmd1bGFyMT0tY3J1ZztLKz1iMS5tX2ludk1hc3MrYjEubV9pbnZJKmNydWcqY3J1Zzt9CmlmKHRoaXMubV9yZXZvbHV0ZTIpCnt0aGlzLm1fSi5hbmd1bGFyMj0tdGhpcy5tX3JhdGlvO0srPXRoaXMubV9yYXRpbyp0aGlzLm1fcmF0aW8qYjIubV9pbnZJO30KZWxzZQp7dE1hdD1nMi5tX1I7dFZlYz10aGlzLm1fcHJpc21hdGljMi5tX2xvY2FsWEF4aXMxO3VnWD10TWF0LmNvbDEueCp0VmVjLngrdE1hdC5jb2wyLngqdFZlYy55O3VnWT10TWF0LmNvbDEueSp0VmVjLngrdE1hdC5jb2wyLnkqdFZlYy55O3RNYXQ9YjIubV9SO3JYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IyLnk7clk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueTtjcnVnPXJYKnVnWS1yWSp1Z1g7dGhpcy5tX0oubGluZWFyMi5TZXQoLXRoaXMubV9yYXRpbyp1Z1gsLXRoaXMubV9yYXRpbyp1Z1kpO3RoaXMubV9KLmFuZ3VsYXIyPS10aGlzLm1fcmF0aW8qY3J1ZztLKz10aGlzLm1fcmF0aW8qdGhpcy5tX3JhdGlvKihiMi5tX2ludk1hc3MrYjIubV9pbnZJKmNydWcqY3J1Zyk7fQp0aGlzLm1fbWFzcz0xLjAvSztiMS5tX2xpbmVhclZlbG9jaXR5LngrPWIxLm1faW52TWFzcyp0aGlzLm1faW1wdWxzZSp0aGlzLm1fSi5saW5lYXIxLng7YjEubV9saW5lYXJWZWxvY2l0eS55Kz1iMS5tX2ludk1hc3MqdGhpcy5tX2ltcHVsc2UqdGhpcy5tX0oubGluZWFyMS55O2IxLm1fYW5ndWxhclZlbG9jaXR5Kz1iMS5tX2ludkkqdGhpcy5tX2ltcHVsc2UqdGhpcy5tX0ouYW5ndWxhcjE7YjIubV9saW5lYXJWZWxvY2l0eS54Kz1iMi5tX2ludk1hc3MqdGhpcy5tX2ltcHVsc2UqdGhpcy5tX0oubGluZWFyMi54O2IyLm1fbGluZWFyVmVsb2NpdHkueSs9YjIubV9pbnZNYXNzKnRoaXMubV9pbXB1bHNlKnRoaXMubV9KLmxpbmVhcjIueTtiMi5tX2FuZ3VsYXJWZWxvY2l0eSs9YjIubV9pbnZJKnRoaXMubV9pbXB1bHNlKnRoaXMubV9KLmFuZ3VsYXIyO30sU29sdmVWZWxvY2l0eUNvbnN0cmFpbnRzOmZ1bmN0aW9uKHN0ZXApe3ZhciBiMT10aGlzLm1fYm9keTE7dmFyIGIyPXRoaXMubV9ib2R5Mjt2YXIgQ2RvdD10aGlzLm1fSi5Db21wdXRlKGIxLm1fbGluZWFyVmVsb2NpdHksYjEubV9hbmd1bGFyVmVsb2NpdHksYjIubV9saW5lYXJWZWxvY2l0eSxiMi5tX2FuZ3VsYXJWZWxvY2l0eSk7dmFyIGltcHVsc2U9LXRoaXMubV9tYXNzKkNkb3Q7dGhpcy5tX2ltcHVsc2UrPWltcHVsc2U7YjEubV9saW5lYXJWZWxvY2l0eS54Kz1iMS5tX2ludk1hc3MqaW1wdWxzZSp0aGlzLm1fSi5saW5lYXIxLng7YjEubV9saW5lYXJWZWxvY2l0eS55Kz1iMS5tX2ludk1hc3MqaW1wdWxzZSp0aGlzLm1fSi5saW5lYXIxLnk7YjEubV9hbmd1bGFyVmVsb2NpdHkrPWIxLm1faW52SSppbXB1bHNlKnRoaXMubV9KLmFuZ3VsYXIxO2IyLm1fbGluZWFyVmVsb2NpdHkueCs9YjIubV9pbnZNYXNzKmltcHVsc2UqdGhpcy5tX0oubGluZWFyMi54O2IyLm1fbGluZWFyVmVsb2NpdHkueSs9YjIubV9pbnZNYXNzKmltcHVsc2UqdGhpcy5tX0oubGluZWFyMi55O2IyLm1fYW5ndWxhclZlbG9jaXR5Kz1iMi5tX2ludkkqaW1wdWxzZSp0aGlzLm1fSi5hbmd1bGFyMjt9LFNvbHZlUG9zaXRpb25Db25zdHJhaW50czpmdW5jdGlvbigpe3ZhciBsaW5lYXJFcnJvcj0wLjA7dmFyIGIxPXRoaXMubV9ib2R5MTt2YXIgYjI9dGhpcy5tX2JvZHkyO3ZhciBjb29yZGluYXRlMTt2YXIgY29vcmRpbmF0ZTI7aWYodGhpcy5tX3Jldm9sdXRlMSkKe2Nvb3JkaW5hdGUxPXRoaXMubV9yZXZvbHV0ZTEuR2V0Sm9pbnRBbmdsZSgpO30KZWxzZQp7Y29vcmRpbmF0ZTE9dGhpcy5tX3ByaXNtYXRpYzEuR2V0Sm9pbnRUcmFuc2xhdGlvbigpO30KaWYodGhpcy5tX3Jldm9sdXRlMikKe2Nvb3JkaW5hdGUyPXRoaXMubV9yZXZvbHV0ZTIuR2V0Sm9pbnRBbmdsZSgpO30KZWxzZQp7Y29vcmRpbmF0ZTI9dGhpcy5tX3ByaXNtYXRpYzIuR2V0Sm9pbnRUcmFuc2xhdGlvbigpO30KdmFyIEM9dGhpcy5tX2NvbnN0YW50LShjb29yZGluYXRlMSt0aGlzLm1fcmF0aW8qY29vcmRpbmF0ZTIpO3ZhciBpbXB1bHNlPS10aGlzLm1fbWFzcypDO2IxLm1fcG9zaXRpb24ueCs9YjEubV9pbnZNYXNzKmltcHVsc2UqdGhpcy5tX0oubGluZWFyMS54O2IxLm1fcG9zaXRpb24ueSs9YjEubV9pbnZNYXNzKmltcHVsc2UqdGhpcy5tX0oubGluZWFyMS55O2IxLm1fcm90YXRpb24rPWIxLm1faW52SSppbXB1bHNlKnRoaXMubV9KLmFuZ3VsYXIxO2IyLm1fcG9zaXRpb24ueCs9YjIubV9pbnZNYXNzKmltcHVsc2UqdGhpcy5tX0oubGluZWFyMi54O2IyLm1fcG9zaXRpb24ueSs9YjIubV9pbnZNYXNzKmltcHVsc2UqdGhpcy5tX0oubGluZWFyMi55O2IyLm1fcm90YXRpb24rPWIyLm1faW52SSppbXB1bHNlKnRoaXMubV9KLmFuZ3VsYXIyO2IxLm1fUi5TZXQoYjEubV9yb3RhdGlvbik7YjIubV9SLlNldChiMi5tX3JvdGF0aW9uKTtyZXR1cm4gbGluZWFyRXJyb3I8YjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wO30sbV9ncm91bmQxOm51bGwsbV9ncm91bmQyOm51bGwsbV9yZXZvbHV0ZTE6bnVsbCxtX3ByaXNtYXRpYzE6bnVsbCxtX3Jldm9sdXRlMjpudWxsLG1fcHJpc21hdGljMjpudWxsLG1fZ3JvdW5kQW5jaG9yMTpuZXcgYjJWZWMyKCksbV9ncm91bmRBbmNob3IyOm5ldyBiMlZlYzIoKSxtX2xvY2FsQW5jaG9yMTpuZXcgYjJWZWMyKCksbV9sb2NhbEFuY2hvcjI6bmV3IGIyVmVjMigpLG1fSjpuZXcgYjJKYWNvYmlhbigpLG1fY29uc3RhbnQ6bnVsbCxtX3JhdGlvOm51bGwsbV9tYXNzOm51bGwsbV9pbXB1bHNlOm51bGx9KTsKdmFyIGIyR2VhckpvaW50RGVmPUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJHZWFySm9pbnREZWYucHJvdG90eXBlLGIySm9pbnREZWYucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyR2VhckpvaW50RGVmLnByb3RvdHlwZSx7aW5pdGlhbGl6ZTpmdW5jdGlvbigpCnt0aGlzLnR5cGU9YjJKb2ludC5lX2dlYXJKb2ludDt0aGlzLmpvaW50MT1udWxsO3RoaXMuam9pbnQyPW51bGw7dGhpcy5yYXRpbz0xLjA7fSxqb2ludDE6bnVsbCxqb2ludDI6bnVsbCxyYXRpbzpudWxsfSk7CnZhciBiMk1vdXNlSm9pbnQ9Q2xhc3MuY3JlYXRlKCk7T2JqZWN0LmV4dGVuZChiMk1vdXNlSm9pbnQucHJvdG90eXBlLGIySm9pbnQucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyTW91c2VKb2ludC5wcm90b3R5cGUse0dldEFuY2hvcjE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX3RhcmdldDt9LEdldEFuY2hvcjI6ZnVuY3Rpb24oKXt2YXIgdFZlYz1iMk1hdGguYjJNdWxNVih0aGlzLm1fYm9keTIubV9SLHRoaXMubV9sb2NhbEFuY2hvcik7dFZlYy5BZGQodGhpcy5tX2JvZHkyLm1fcG9zaXRpb24pO3JldHVybiB0VmVjO30sR2V0UmVhY3Rpb25Gb3JjZTpmdW5jdGlvbihpbnZUaW1lU3RlcCkKe3ZhciBGPW5ldyBiMlZlYzIoKTtGLlNldFYodGhpcy5tX2ltcHVsc2UpO0YuTXVsdGlwbHkoaW52VGltZVN0ZXApO3JldHVybiBGO30sR2V0UmVhY3Rpb25Ub3JxdWU6ZnVuY3Rpb24oaW52VGltZVN0ZXApCntyZXR1cm4gMC4wO30sU2V0VGFyZ2V0OmZ1bmN0aW9uKHRhcmdldCl7dGhpcy5tX2JvZHkyLldha2VVcCgpO3RoaXMubV90YXJnZXQ9dGFyZ2V0O30saW5pdGlhbGl6ZTpmdW5jdGlvbihkZWYpe3RoaXMubV9ub2RlMT1uZXcgYjJKb2ludE5vZGUoKTt0aGlzLm1fbm9kZTI9bmV3IGIySm9pbnROb2RlKCk7dGhpcy5tX3R5cGU9ZGVmLnR5cGU7dGhpcy5tX3ByZXY9bnVsbDt0aGlzLm1fbmV4dD1udWxsO3RoaXMubV9ib2R5MT1kZWYuYm9keTE7dGhpcy5tX2JvZHkyPWRlZi5ib2R5Mjt0aGlzLm1fY29sbGlkZUNvbm5lY3RlZD1kZWYuY29sbGlkZUNvbm5lY3RlZDt0aGlzLm1faXNsYW5kRmxhZz1mYWxzZTt0aGlzLm1fdXNlckRhdGE9ZGVmLnVzZXJEYXRhO3RoaXMuSz1uZXcgYjJNYXQyMigpO3RoaXMuSzE9bmV3IGIyTWF0MjIoKTt0aGlzLksyPW5ldyBiMk1hdDIyKCk7dGhpcy5tX2xvY2FsQW5jaG9yPW5ldyBiMlZlYzIoKTt0aGlzLm1fdGFyZ2V0PW5ldyBiMlZlYzIoKTt0aGlzLm1faW1wdWxzZT1uZXcgYjJWZWMyKCk7dGhpcy5tX3B0cE1hc3M9bmV3IGIyTWF0MjIoKTt0aGlzLm1fQz1uZXcgYjJWZWMyKCk7dGhpcy5tX3RhcmdldC5TZXRWKGRlZi50YXJnZXQpO3ZhciB0WD10aGlzLm1fdGFyZ2V0LngtdGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueDt2YXIgdFk9dGhpcy5tX3RhcmdldC55LXRoaXMubV9ib2R5Mi5tX3Bvc2l0aW9uLnk7dGhpcy5tX2xvY2FsQW5jaG9yLng9KHRYKnRoaXMubV9ib2R5Mi5tX1IuY29sMS54K3RZKnRoaXMubV9ib2R5Mi5tX1IuY29sMS55KTt0aGlzLm1fbG9jYWxBbmNob3IueT0odFgqdGhpcy5tX2JvZHkyLm1fUi5jb2wyLngrdFkqdGhpcy5tX2JvZHkyLm1fUi5jb2wyLnkpO3RoaXMubV9tYXhGb3JjZT1kZWYubWF4Rm9yY2U7dGhpcy5tX2ltcHVsc2UuU2V0WmVybygpO3ZhciBtYXNzPXRoaXMubV9ib2R5Mi5tX21hc3M7dmFyIG9tZWdhPTIuMCpiMlNldHRpbmdzLmIyX3BpKmRlZi5mcmVxdWVuY3lIejt2YXIgZD0yLjAqbWFzcypkZWYuZGFtcGluZ1JhdGlvKm9tZWdhO3ZhciBrPW1hc3Mqb21lZ2Eqb21lZ2E7dGhpcy5tX2dhbW1hPTEuMC8oZCtkZWYudGltZVN0ZXAqayk7dGhpcy5tX2JldGE9ZGVmLnRpbWVTdGVwKmsvKGQrZGVmLnRpbWVTdGVwKmspO30sSzpuZXcgYjJNYXQyMigpLEsxOm5ldyBiMk1hdDIyKCksSzI6bmV3IGIyTWF0MjIoKSxQcmVwYXJlVmVsb2NpdHlTb2x2ZXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1fYm9keTI7dmFyIHRNYXQ7dE1hdD1iLm1fUjt2YXIgclg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yLnk7dmFyIHJZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvci54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvci55O3ZhciBpbnZNYXNzPWIubV9pbnZNYXNzO3ZhciBpbnZJPWIubV9pbnZJO3RoaXMuSzEuY29sMS54PWludk1hc3M7dGhpcy5LMS5jb2wyLng9MC4wO3RoaXMuSzEuY29sMS55PTAuMDt0aGlzLksxLmNvbDIueT1pbnZNYXNzO3RoaXMuSzIuY29sMS54PWludkkqclkqclk7dGhpcy5LMi5jb2wyLng9LWludkkqclgqclk7dGhpcy5LMi5jb2wxLnk9LWludkkqclgqclk7dGhpcy5LMi5jb2wyLnk9aW52SSpyWCpyWDt0aGlzLksuU2V0TSh0aGlzLksxKTt0aGlzLksuQWRkTSh0aGlzLksyKTt0aGlzLksuY29sMS54Kz10aGlzLm1fZ2FtbWE7dGhpcy5LLmNvbDIueSs9dGhpcy5tX2dhbW1hO3RoaXMuSy5JbnZlcnQodGhpcy5tX3B0cE1hc3MpO3RoaXMubV9DLng9Yi5tX3Bvc2l0aW9uLngrclgtdGhpcy5tX3RhcmdldC54O3RoaXMubV9DLnk9Yi5tX3Bvc2l0aW9uLnkrclktdGhpcy5tX3RhcmdldC55O2IubV9hbmd1bGFyVmVsb2NpdHkqPTAuOTg7dmFyIFBYPXRoaXMubV9pbXB1bHNlLng7dmFyIFBZPXRoaXMubV9pbXB1bHNlLnk7Yi5tX2xpbmVhclZlbG9jaXR5LngrPWludk1hc3MqUFg7Yi5tX2xpbmVhclZlbG9jaXR5LnkrPWludk1hc3MqUFk7Yi5tX2FuZ3VsYXJWZWxvY2l0eSs9aW52SSooclgqUFktclkqUFgpO30sU29sdmVWZWxvY2l0eUNvbnN0cmFpbnRzOmZ1bmN0aW9uKHN0ZXApe3ZhciBib2R5PXRoaXMubV9ib2R5Mjt2YXIgdE1hdDt0TWF0PWJvZHkubV9SO3ZhciByWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IueTt2YXIgclk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yLnk7dmFyIENkb3RYPWJvZHkubV9saW5lYXJWZWxvY2l0eS54KygtYm9keS5tX2FuZ3VsYXJWZWxvY2l0eSpyWSk7dmFyIENkb3RZPWJvZHkubV9saW5lYXJWZWxvY2l0eS55Kyhib2R5Lm1fYW5ndWxhclZlbG9jaXR5KnJYKTt0TWF0PXRoaXMubV9wdHBNYXNzO3ZhciB0WD1DZG90WCsodGhpcy5tX2JldGEqc3RlcC5pbnZfZHQpKnRoaXMubV9DLngrdGhpcy5tX2dhbW1hKnRoaXMubV9pbXB1bHNlLng7dmFyIHRZPUNkb3RZKyh0aGlzLm1fYmV0YSpzdGVwLmludl9kdCkqdGhpcy5tX0MueSt0aGlzLm1fZ2FtbWEqdGhpcy5tX2ltcHVsc2UueTt2YXIgaW1wdWxzZVg9LSh0TWF0LmNvbDEueCp0WCt0TWF0LmNvbDIueCp0WSk7dmFyIGltcHVsc2VZPS0odE1hdC5jb2wxLnkqdFgrdE1hdC5jb2wyLnkqdFkpO3ZhciBvbGRJbXB1bHNlWD10aGlzLm1faW1wdWxzZS54O3ZhciBvbGRJbXB1bHNlWT10aGlzLm1faW1wdWxzZS55O3RoaXMubV9pbXB1bHNlLngrPWltcHVsc2VYO3RoaXMubV9pbXB1bHNlLnkrPWltcHVsc2VZO3ZhciBsZW5ndGg9dGhpcy5tX2ltcHVsc2UuTGVuZ3RoKCk7aWYobGVuZ3RoPnN0ZXAuZHQqdGhpcy5tX21heEZvcmNlKQp7dGhpcy5tX2ltcHVsc2UuTXVsdGlwbHkoc3RlcC5kdCp0aGlzLm1fbWF4Rm9yY2UvbGVuZ3RoKTt9CmltcHVsc2VYPXRoaXMubV9pbXB1bHNlLngtb2xkSW1wdWxzZVg7aW1wdWxzZVk9dGhpcy5tX2ltcHVsc2UueS1vbGRJbXB1bHNlWTtib2R5Lm1fbGluZWFyVmVsb2NpdHkueCs9Ym9keS5tX2ludk1hc3MqaW1wdWxzZVg7Ym9keS5tX2xpbmVhclZlbG9jaXR5LnkrPWJvZHkubV9pbnZNYXNzKmltcHVsc2VZO2JvZHkubV9hbmd1bGFyVmVsb2NpdHkrPWJvZHkubV9pbnZJKihyWCppbXB1bHNlWS1yWSppbXB1bHNlWCk7fSxTb2x2ZVBvc2l0aW9uQ29uc3RyYWludHM6ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZTt9LG1fbG9jYWxBbmNob3I6bmV3IGIyVmVjMigpLG1fdGFyZ2V0Om5ldyBiMlZlYzIoKSxtX2ltcHVsc2U6bmV3IGIyVmVjMigpLG1fcHRwTWFzczpuZXcgYjJNYXQyMigpLG1fQzpuZXcgYjJWZWMyKCksbV9tYXhGb3JjZTpudWxsLG1fYmV0YTpudWxsLG1fZ2FtbWE6bnVsbH0pOwp2YXIgYjJNb3VzZUpvaW50RGVmPUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJNb3VzZUpvaW50RGVmLnByb3RvdHlwZSxiMkpvaW50RGVmLnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMk1vdXNlSm9pbnREZWYucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCkKe3RoaXMudHlwZT1iMkpvaW50LmVfdW5rbm93bkpvaW50O3RoaXMudXNlckRhdGE9bnVsbDt0aGlzLmJvZHkxPW51bGw7dGhpcy5ib2R5Mj1udWxsO3RoaXMuY29sbGlkZUNvbm5lY3RlZD1mYWxzZTt0aGlzLnRhcmdldD1uZXcgYjJWZWMyKCk7dGhpcy50eXBlPWIySm9pbnQuZV9tb3VzZUpvaW50O3RoaXMubWF4Rm9yY2U9MC4wO3RoaXMuZnJlcXVlbmN5SHo9NS4wO3RoaXMuZGFtcGluZ1JhdGlvPTAuNzt0aGlzLnRpbWVTdGVwPTEuMC82MC4wO30sdGFyZ2V0Om5ldyBiMlZlYzIoKSxtYXhGb3JjZTpudWxsLGZyZXF1ZW5jeUh6Om51bGwsZGFtcGluZ1JhdGlvOm51bGwsdGltZVN0ZXA6bnVsbH0pOwp2YXIgYjJQcmlzbWF0aWNKb2ludD1DbGFzcy5jcmVhdGUoKTtPYmplY3QuZXh0ZW5kKGIyUHJpc21hdGljSm9pbnQucHJvdG90eXBlLGIySm9pbnQucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyUHJpc21hdGljSm9pbnQucHJvdG90eXBlLHtHZXRBbmNob3IxOmZ1bmN0aW9uKCl7dmFyIGIxPXRoaXMubV9ib2R5MTt2YXIgdFZlYz1uZXcgYjJWZWMyKCk7dFZlYy5TZXRWKHRoaXMubV9sb2NhbEFuY2hvcjEpO3RWZWMuTXVsTShiMS5tX1IpO3RWZWMuQWRkKGIxLm1fcG9zaXRpb24pO3JldHVybiB0VmVjO30sR2V0QW5jaG9yMjpmdW5jdGlvbigpe3ZhciBiMj10aGlzLm1fYm9keTI7dmFyIHRWZWM9bmV3IGIyVmVjMigpO3RWZWMuU2V0Vih0aGlzLm1fbG9jYWxBbmNob3IyKTt0VmVjLk11bE0oYjIubV9SKTt0VmVjLkFkZChiMi5tX3Bvc2l0aW9uKTtyZXR1cm4gdFZlYzt9LEdldEpvaW50VHJhbnNsYXRpb246ZnVuY3Rpb24oKXt2YXIgYjE9dGhpcy5tX2JvZHkxO3ZhciBiMj10aGlzLm1fYm9keTI7dmFyIHRNYXQ7dE1hdD1iMS5tX1I7dmFyIHIxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3ZhciByMVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTt0TWF0PWIyLm1fUjt2YXIgcjJYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IyLnk7dmFyIHIyWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciBwMVg9YjEubV9wb3NpdGlvbi54K3IxWDt2YXIgcDFZPWIxLm1fcG9zaXRpb24ueStyMVk7dmFyIHAyWD1iMi5tX3Bvc2l0aW9uLngrcjJYO3ZhciBwMlk9YjIubV9wb3NpdGlvbi55K3IyWTt2YXIgZFg9cDJYLXAxWDt2YXIgZFk9cDJZLXAxWTt0TWF0PWIxLm1fUjt2YXIgYXgxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxYQXhpczEueTt2YXIgYXgxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxYQXhpczEueTt2YXIgdHJhbnNsYXRpb249YXgxWCpkWCtheDFZKmRZO3JldHVybiB0cmFuc2xhdGlvbjt9LEdldEpvaW50U3BlZWQ6ZnVuY3Rpb24oKXt2YXIgYjE9dGhpcy5tX2JvZHkxO3ZhciBiMj10aGlzLm1fYm9keTI7dmFyIHRNYXQ7dE1hdD1iMS5tX1I7dmFyIHIxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3ZhciByMVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTt0TWF0PWIyLm1fUjt2YXIgcjJYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IyLnk7dmFyIHIyWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciBwMVg9YjEubV9wb3NpdGlvbi54K3IxWDt2YXIgcDFZPWIxLm1fcG9zaXRpb24ueStyMVk7dmFyIHAyWD1iMi5tX3Bvc2l0aW9uLngrcjJYO3ZhciBwMlk9YjIubV9wb3NpdGlvbi55K3IyWTt2YXIgZFg9cDJYLXAxWDt2YXIgZFk9cDJZLXAxWTt0TWF0PWIxLm1fUjt2YXIgYXgxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxYQXhpczEueTt2YXIgYXgxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxYQXhpczEueTt2YXIgdjE9YjEubV9saW5lYXJWZWxvY2l0eTt2YXIgdjI9YjIubV9saW5lYXJWZWxvY2l0eTt2YXIgdzE9YjEubV9hbmd1bGFyVmVsb2NpdHk7dmFyIHcyPWIyLm1fYW5ndWxhclZlbG9jaXR5O3ZhciBzcGVlZD0oZFgqKC13MSpheDFZKStkWSoodzEqYXgxWCkpKyhheDFYKigoKHYyLngrKC13MipyMlkpKS12MS54KS0oLXcxKnIxWSkpK2F4MVkqKCgodjIueSsodzIqcjJYKSktdjEueSktKHcxKnIxWCkpKTtyZXR1cm4gc3BlZWQ7fSxHZXRNb3RvckZvcmNlOmZ1bmN0aW9uKGludlRpbWVTdGVwKXtyZXR1cm4gaW52VGltZVN0ZXAqdGhpcy5tX21vdG9ySW1wdWxzZTt9LFNldE1vdG9yU3BlZWQ6ZnVuY3Rpb24oc3BlZWQpCnt0aGlzLm1fbW90b3JTcGVlZD1zcGVlZDt9LFNldE1vdG9yRm9yY2U6ZnVuY3Rpb24oZm9yY2UpCnt0aGlzLm1fbWF4TW90b3JGb3JjZT1mb3JjZTt9LEdldFJlYWN0aW9uRm9yY2U6ZnVuY3Rpb24oaW52VGltZVN0ZXApCnt2YXIgdEltcD1pbnZUaW1lU3RlcCp0aGlzLm1fbGltaXRJbXB1bHNlO3ZhciB0TWF0O3RNYXQ9dGhpcy5tX2JvZHkxLm1fUjt2YXIgYXgxWD10SW1wKih0TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxYQXhpczEueSk7dmFyIGF4MVk9dEltcCoodE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsWEF4aXMxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsWEF4aXMxLnkpO3ZhciBheTFYPXRJbXAqKHRNYXQuY29sMS54KnRoaXMubV9sb2NhbFlBeGlzMS54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbFlBeGlzMS55KTt2YXIgYXkxWT10SW1wKih0TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxZQXhpczEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxZQXhpczEueSk7cmV0dXJuIG5ldyBiMlZlYzIoYXgxWCtheTFYLGF4MVkrYXkxWSk7fSxHZXRSZWFjdGlvblRvcnF1ZTpmdW5jdGlvbihpbnZUaW1lU3RlcCkKe3JldHVybiBpbnZUaW1lU3RlcCp0aGlzLm1fYW5ndWxhckltcHVsc2U7fSxpbml0aWFsaXplOmZ1bmN0aW9uKGRlZil7dGhpcy5tX25vZGUxPW5ldyBiMkpvaW50Tm9kZSgpO3RoaXMubV9ub2RlMj1uZXcgYjJKb2ludE5vZGUoKTt0aGlzLm1fdHlwZT1kZWYudHlwZTt0aGlzLm1fcHJldj1udWxsO3RoaXMubV9uZXh0PW51bGw7dGhpcy5tX2JvZHkxPWRlZi5ib2R5MTt0aGlzLm1fYm9keTI9ZGVmLmJvZHkyO3RoaXMubV9jb2xsaWRlQ29ubmVjdGVkPWRlZi5jb2xsaWRlQ29ubmVjdGVkO3RoaXMubV9pc2xhbmRGbGFnPWZhbHNlO3RoaXMubV91c2VyRGF0YT1kZWYudXNlckRhdGE7dGhpcy5tX2xvY2FsQW5jaG9yMT1uZXcgYjJWZWMyKCk7dGhpcy5tX2xvY2FsQW5jaG9yMj1uZXcgYjJWZWMyKCk7dGhpcy5tX2xvY2FsWEF4aXMxPW5ldyBiMlZlYzIoKTt0aGlzLm1fbG9jYWxZQXhpczE9bmV3IGIyVmVjMigpO3RoaXMubV9saW5lYXJKYWNvYmlhbj1uZXcgYjJKYWNvYmlhbigpO3RoaXMubV9tb3RvckphY29iaWFuPW5ldyBiMkphY29iaWFuKCk7dmFyIHRNYXQ7dmFyIHRYO3ZhciB0WTt0TWF0PXRoaXMubV9ib2R5MS5tX1I7dFg9KGRlZi5hbmNob3JQb2ludC54LXRoaXMubV9ib2R5MS5tX3Bvc2l0aW9uLngpO3RZPShkZWYuYW5jaG9yUG9pbnQueS10aGlzLm1fYm9keTEubV9wb3NpdGlvbi55KTt0aGlzLm1fbG9jYWxBbmNob3IxLlNldCgodFgqdE1hdC5jb2wxLngrdFkqdE1hdC5jb2wxLnkpLCh0WCp0TWF0LmNvbDIueCt0WSp0TWF0LmNvbDIueSkpO3RNYXQ9dGhpcy5tX2JvZHkyLm1fUjt0WD0oZGVmLmFuY2hvclBvaW50LngtdGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueCk7dFk9KGRlZi5hbmNob3JQb2ludC55LXRoaXMubV9ib2R5Mi5tX3Bvc2l0aW9uLnkpO3RoaXMubV9sb2NhbEFuY2hvcjIuU2V0KCh0WCp0TWF0LmNvbDEueCt0WSp0TWF0LmNvbDEueSksKHRYKnRNYXQuY29sMi54K3RZKnRNYXQuY29sMi55KSk7dE1hdD10aGlzLm1fYm9keTEubV9SO3RYPWRlZi5heGlzLng7dFk9ZGVmLmF4aXMueTt0aGlzLm1fbG9jYWxYQXhpczEuU2V0KCh0WCp0TWF0LmNvbDEueCt0WSp0TWF0LmNvbDEueSksKHRYKnRNYXQuY29sMi54K3RZKnRNYXQuY29sMi55KSk7dGhpcy5tX2xvY2FsWUF4aXMxLng9LXRoaXMubV9sb2NhbFhBeGlzMS55O3RoaXMubV9sb2NhbFlBeGlzMS55PXRoaXMubV9sb2NhbFhBeGlzMS54O3RoaXMubV9pbml0aWFsQW5nbGU9dGhpcy5tX2JvZHkyLm1fcm90YXRpb24tdGhpcy5tX2JvZHkxLm1fcm90YXRpb247dGhpcy5tX2xpbmVhckphY29iaWFuLlNldFplcm8oKTt0aGlzLm1fbGluZWFyTWFzcz0wLjA7dGhpcy5tX2xpbmVhckltcHVsc2U9MC4wO3RoaXMubV9hbmd1bGFyTWFzcz0wLjA7dGhpcy5tX2FuZ3VsYXJJbXB1bHNlPTAuMDt0aGlzLm1fbW90b3JKYWNvYmlhbi5TZXRaZXJvKCk7dGhpcy5tX21vdG9yTWFzcz0wLjA7dGhpcy5tX21vdG9ySW1wdWxzZT0wLjA7dGhpcy5tX2xpbWl0SW1wdWxzZT0wLjA7dGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlPTAuMDt0aGlzLm1fbG93ZXJUcmFuc2xhdGlvbj1kZWYubG93ZXJUcmFuc2xhdGlvbjt0aGlzLm1fdXBwZXJUcmFuc2xhdGlvbj1kZWYudXBwZXJUcmFuc2xhdGlvbjt0aGlzLm1fbWF4TW90b3JGb3JjZT1kZWYubW90b3JGb3JjZTt0aGlzLm1fbW90b3JTcGVlZD1kZWYubW90b3JTcGVlZDt0aGlzLm1fZW5hYmxlTGltaXQ9ZGVmLmVuYWJsZUxpbWl0O3RoaXMubV9lbmFibGVNb3Rvcj1kZWYuZW5hYmxlTW90b3I7fSxQcmVwYXJlVmVsb2NpdHlTb2x2ZXI6ZnVuY3Rpb24oKXt2YXIgYjE9dGhpcy5tX2JvZHkxO3ZhciBiMj10aGlzLm1fYm9keTI7dmFyIHRNYXQ7dE1hdD1iMS5tX1I7dmFyIHIxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3ZhciByMVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueTt0TWF0PWIyLm1fUjt2YXIgcjJYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IyLnk7dmFyIHIyWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciBpbnZNYXNzMT1iMS5tX2ludk1hc3M7dmFyIGludk1hc3MyPWIyLm1faW52TWFzczt2YXIgaW52STE9YjEubV9pbnZJO3ZhciBpbnZJMj1iMi5tX2ludkk7dE1hdD1iMS5tX1I7dmFyIGF5MVg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsWUF4aXMxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsWUF4aXMxLnk7dmFyIGF5MVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsWUF4aXMxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsWUF4aXMxLnk7dmFyIGVYPWIyLm1fcG9zaXRpb24ueCtyMlgtYjEubV9wb3NpdGlvbi54O3ZhciBlWT1iMi5tX3Bvc2l0aW9uLnkrcjJZLWIxLm1fcG9zaXRpb24ueTt0aGlzLm1fbGluZWFySmFjb2JpYW4ubGluZWFyMS54PS1heTFYO3RoaXMubV9saW5lYXJKYWNvYmlhbi5saW5lYXIxLnk9LWF5MVk7dGhpcy5tX2xpbmVhckphY29iaWFuLmxpbmVhcjIueD1heTFYO3RoaXMubV9saW5lYXJKYWNvYmlhbi5saW5lYXIyLnk9YXkxWTt0aGlzLm1fbGluZWFySmFjb2JpYW4uYW5ndWxhcjE9LShlWCpheTFZLWVZKmF5MVgpO3RoaXMubV9saW5lYXJKYWNvYmlhbi5hbmd1bGFyMj1yMlgqYXkxWS1yMlkqYXkxWDt0aGlzLm1fbGluZWFyTWFzcz1pbnZNYXNzMStpbnZJMSp0aGlzLm1fbGluZWFySmFjb2JpYW4uYW5ndWxhcjEqdGhpcy5tX2xpbmVhckphY29iaWFuLmFuZ3VsYXIxKwppbnZNYXNzMitpbnZJMip0aGlzLm1fbGluZWFySmFjb2JpYW4uYW5ndWxhcjIqdGhpcy5tX2xpbmVhckphY29iaWFuLmFuZ3VsYXIyO3RoaXMubV9saW5lYXJNYXNzPTEuMC90aGlzLm1fbGluZWFyTWFzczt0aGlzLm1fYW5ndWxhck1hc3M9MS4wLyhpbnZJMStpbnZJMik7aWYodGhpcy5tX2VuYWJsZUxpbWl0fHx0aGlzLm1fZW5hYmxlTW90b3IpCnt0TWF0PWIxLm1fUjt2YXIgYXgxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxYQXhpczEueTt2YXIgYXgxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxYQXhpczEueTt0aGlzLm1fbW90b3JKYWNvYmlhbi5saW5lYXIxLng9LWF4MVg7dGhpcy5tX21vdG9ySmFjb2JpYW4ubGluZWFyMS55PS1heDFZO3RoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjIueD1heDFYO3RoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjIueT1heDFZO3RoaXMubV9tb3RvckphY29iaWFuLmFuZ3VsYXIxPS0oZVgqYXgxWS1lWSpheDFYKTt0aGlzLm1fbW90b3JKYWNvYmlhbi5hbmd1bGFyMj1yMlgqYXgxWS1yMlkqYXgxWDt0aGlzLm1fbW90b3JNYXNzPWludk1hc3MxK2ludkkxKnRoaXMubV9tb3RvckphY29iaWFuLmFuZ3VsYXIxKnRoaXMubV9tb3RvckphY29iaWFuLmFuZ3VsYXIxKwppbnZNYXNzMitpbnZJMip0aGlzLm1fbW90b3JKYWNvYmlhbi5hbmd1bGFyMip0aGlzLm1fbW90b3JKYWNvYmlhbi5hbmd1bGFyMjt0aGlzLm1fbW90b3JNYXNzPTEuMC90aGlzLm1fbW90b3JNYXNzO2lmKHRoaXMubV9lbmFibGVMaW1pdCkKe3ZhciBkWD1lWC1yMVg7dmFyIGRZPWVZLXIxWTt2YXIgam9pbnRUcmFuc2xhdGlvbj1heDFYKmRYK2F4MVkqZFk7aWYoYjJNYXRoLmIyQWJzKHRoaXMubV91cHBlclRyYW5zbGF0aW9uLXRoaXMubV9sb3dlclRyYW5zbGF0aW9uKTwyLjAqYjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wKQp7dGhpcy5tX2xpbWl0U3RhdGU9YjJKb2ludC5lX2VxdWFsTGltaXRzO30KZWxzZSBpZihqb2ludFRyYW5zbGF0aW9uPD10aGlzLm1fbG93ZXJUcmFuc2xhdGlvbikKe2lmKHRoaXMubV9saW1pdFN0YXRlIT1iMkpvaW50LmVfYXRMb3dlckxpbWl0KQp7dGhpcy5tX2xpbWl0SW1wdWxzZT0wLjA7fQp0aGlzLm1fbGltaXRTdGF0ZT1iMkpvaW50LmVfYXRMb3dlckxpbWl0O30KZWxzZSBpZihqb2ludFRyYW5zbGF0aW9uPj10aGlzLm1fdXBwZXJUcmFuc2xhdGlvbikKe2lmKHRoaXMubV9saW1pdFN0YXRlIT1iMkpvaW50LmVfYXRVcHBlckxpbWl0KQp7dGhpcy5tX2xpbWl0SW1wdWxzZT0wLjA7fQp0aGlzLm1fbGltaXRTdGF0ZT1iMkpvaW50LmVfYXRVcHBlckxpbWl0O30KZWxzZQp7dGhpcy5tX2xpbWl0U3RhdGU9YjJKb2ludC5lX2luYWN0aXZlTGltaXQ7dGhpcy5tX2xpbWl0SW1wdWxzZT0wLjA7fX19CmlmKHRoaXMubV9lbmFibGVNb3Rvcj09ZmFsc2UpCnt0aGlzLm1fbW90b3JJbXB1bHNlPTAuMDt9CmlmKHRoaXMubV9lbmFibGVMaW1pdD09ZmFsc2UpCnt0aGlzLm1fbGltaXRJbXB1bHNlPTAuMDt9CmlmKGIyV29ybGQuc19lbmFibGVXYXJtU3RhcnRpbmcpCnt2YXIgUDFYPXRoaXMubV9saW5lYXJJbXB1bHNlKnRoaXMubV9saW5lYXJKYWNvYmlhbi5saW5lYXIxLngrKHRoaXMubV9tb3RvckltcHVsc2UrdGhpcy5tX2xpbWl0SW1wdWxzZSkqdGhpcy5tX21vdG9ySmFjb2JpYW4ubGluZWFyMS54O3ZhciBQMVk9dGhpcy5tX2xpbmVhckltcHVsc2UqdGhpcy5tX2xpbmVhckphY29iaWFuLmxpbmVhcjEueSsodGhpcy5tX21vdG9ySW1wdWxzZSt0aGlzLm1fbGltaXRJbXB1bHNlKSp0aGlzLm1fbW90b3JKYWNvYmlhbi5saW5lYXIxLnk7dmFyIFAyWD10aGlzLm1fbGluZWFySW1wdWxzZSp0aGlzLm1fbGluZWFySmFjb2JpYW4ubGluZWFyMi54Kyh0aGlzLm1fbW90b3JJbXB1bHNlK3RoaXMubV9saW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjIueDt2YXIgUDJZPXRoaXMubV9saW5lYXJJbXB1bHNlKnRoaXMubV9saW5lYXJKYWNvYmlhbi5saW5lYXIyLnkrKHRoaXMubV9tb3RvckltcHVsc2UrdGhpcy5tX2xpbWl0SW1wdWxzZSkqdGhpcy5tX21vdG9ySmFjb2JpYW4ubGluZWFyMi55O3ZhciBMMT10aGlzLm1fbGluZWFySW1wdWxzZSp0aGlzLm1fbGluZWFySmFjb2JpYW4uYW5ndWxhcjEtdGhpcy5tX2FuZ3VsYXJJbXB1bHNlKyh0aGlzLm1fbW90b3JJbXB1bHNlK3RoaXMubV9saW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmFuZ3VsYXIxO3ZhciBMMj10aGlzLm1fbGluZWFySW1wdWxzZSp0aGlzLm1fbGluZWFySmFjb2JpYW4uYW5ndWxhcjIrdGhpcy5tX2FuZ3VsYXJJbXB1bHNlKyh0aGlzLm1fbW90b3JJbXB1bHNlK3RoaXMubV9saW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmFuZ3VsYXIyO2IxLm1fbGluZWFyVmVsb2NpdHkueCs9aW52TWFzczEqUDFYO2IxLm1fbGluZWFyVmVsb2NpdHkueSs9aW52TWFzczEqUDFZO2IxLm1fYW5ndWxhclZlbG9jaXR5Kz1pbnZJMSpMMTtiMi5tX2xpbmVhclZlbG9jaXR5LngrPWludk1hc3MyKlAyWDtiMi5tX2xpbmVhclZlbG9jaXR5LnkrPWludk1hc3MyKlAyWTtiMi5tX2FuZ3VsYXJWZWxvY2l0eSs9aW52STIqTDI7fQplbHNlCnt0aGlzLm1fbGluZWFySW1wdWxzZT0wLjA7dGhpcy5tX2FuZ3VsYXJJbXB1bHNlPTAuMDt0aGlzLm1fbGltaXRJbXB1bHNlPTAuMDt0aGlzLm1fbW90b3JJbXB1bHNlPTAuMDt9CnRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZT0wLjA7fSxTb2x2ZVZlbG9jaXR5Q29uc3RyYWludHM6ZnVuY3Rpb24oc3RlcCl7dmFyIGIxPXRoaXMubV9ib2R5MTt2YXIgYjI9dGhpcy5tX2JvZHkyO3ZhciBpbnZNYXNzMT1iMS5tX2ludk1hc3M7dmFyIGludk1hc3MyPWIyLm1faW52TWFzczt2YXIgaW52STE9YjEubV9pbnZJO3ZhciBpbnZJMj1iMi5tX2ludkk7dmFyIG9sZExpbWl0SW1wdWxzZTt2YXIgbGluZWFyQ2RvdD10aGlzLm1fbGluZWFySmFjb2JpYW4uQ29tcHV0ZShiMS5tX2xpbmVhclZlbG9jaXR5LGIxLm1fYW5ndWxhclZlbG9jaXR5LGIyLm1fbGluZWFyVmVsb2NpdHksYjIubV9hbmd1bGFyVmVsb2NpdHkpO3ZhciBsaW5lYXJJbXB1bHNlPS10aGlzLm1fbGluZWFyTWFzcypsaW5lYXJDZG90O3RoaXMubV9saW5lYXJJbXB1bHNlKz1saW5lYXJJbXB1bHNlO2IxLm1fbGluZWFyVmVsb2NpdHkueCs9KGludk1hc3MxKmxpbmVhckltcHVsc2UpKnRoaXMubV9saW5lYXJKYWNvYmlhbi5saW5lYXIxLng7YjEubV9saW5lYXJWZWxvY2l0eS55Kz0oaW52TWFzczEqbGluZWFySW1wdWxzZSkqdGhpcy5tX2xpbmVhckphY29iaWFuLmxpbmVhcjEueTtiMS5tX2FuZ3VsYXJWZWxvY2l0eSs9aW52STEqbGluZWFySW1wdWxzZSp0aGlzLm1fbGluZWFySmFjb2JpYW4uYW5ndWxhcjE7YjIubV9saW5lYXJWZWxvY2l0eS54Kz0oaW52TWFzczIqbGluZWFySW1wdWxzZSkqdGhpcy5tX2xpbmVhckphY29iaWFuLmxpbmVhcjIueDtiMi5tX2xpbmVhclZlbG9jaXR5LnkrPShpbnZNYXNzMipsaW5lYXJJbXB1bHNlKSp0aGlzLm1fbGluZWFySmFjb2JpYW4ubGluZWFyMi55O2IyLm1fYW5ndWxhclZlbG9jaXR5Kz1pbnZJMipsaW5lYXJJbXB1bHNlKnRoaXMubV9saW5lYXJKYWNvYmlhbi5hbmd1bGFyMjt2YXIgYW5ndWxhckNkb3Q9YjIubV9hbmd1bGFyVmVsb2NpdHktYjEubV9hbmd1bGFyVmVsb2NpdHk7dmFyIGFuZ3VsYXJJbXB1bHNlPS10aGlzLm1fYW5ndWxhck1hc3MqYW5ndWxhckNkb3Q7dGhpcy5tX2FuZ3VsYXJJbXB1bHNlKz1hbmd1bGFySW1wdWxzZTtiMS5tX2FuZ3VsYXJWZWxvY2l0eS09aW52STEqYW5ndWxhckltcHVsc2U7YjIubV9hbmd1bGFyVmVsb2NpdHkrPWludkkyKmFuZ3VsYXJJbXB1bHNlO2lmKHRoaXMubV9lbmFibGVNb3RvciYmdGhpcy5tX2xpbWl0U3RhdGUhPWIySm9pbnQuZV9lcXVhbExpbWl0cykKe3ZhciBtb3RvckNkb3Q9dGhpcy5tX21vdG9ySmFjb2JpYW4uQ29tcHV0ZShiMS5tX2xpbmVhclZlbG9jaXR5LGIxLm1fYW5ndWxhclZlbG9jaXR5LGIyLm1fbGluZWFyVmVsb2NpdHksYjIubV9hbmd1bGFyVmVsb2NpdHkpLXRoaXMubV9tb3RvclNwZWVkO3ZhciBtb3RvckltcHVsc2U9LXRoaXMubV9tb3Rvck1hc3MqbW90b3JDZG90O3ZhciBvbGRNb3RvckltcHVsc2U9dGhpcy5tX21vdG9ySW1wdWxzZTt0aGlzLm1fbW90b3JJbXB1bHNlPWIyTWF0aC5iMkNsYW1wKHRoaXMubV9tb3RvckltcHVsc2UrbW90b3JJbXB1bHNlLC1zdGVwLmR0KnRoaXMubV9tYXhNb3RvckZvcmNlLHN0ZXAuZHQqdGhpcy5tX21heE1vdG9yRm9yY2UpO21vdG9ySW1wdWxzZT10aGlzLm1fbW90b3JJbXB1bHNlLW9sZE1vdG9ySW1wdWxzZTtiMS5tX2xpbmVhclZlbG9jaXR5LngrPShpbnZNYXNzMSptb3RvckltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjEueDtiMS5tX2xpbmVhclZlbG9jaXR5LnkrPShpbnZNYXNzMSptb3RvckltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjEueTtiMS5tX2FuZ3VsYXJWZWxvY2l0eSs9aW52STEqbW90b3JJbXB1bHNlKnRoaXMubV9tb3RvckphY29iaWFuLmFuZ3VsYXIxO2IyLm1fbGluZWFyVmVsb2NpdHkueCs9KGludk1hc3MyKm1vdG9ySW1wdWxzZSkqdGhpcy5tX21vdG9ySmFjb2JpYW4ubGluZWFyMi54O2IyLm1fbGluZWFyVmVsb2NpdHkueSs9KGludk1hc3MyKm1vdG9ySW1wdWxzZSkqdGhpcy5tX21vdG9ySmFjb2JpYW4ubGluZWFyMi55O2IyLm1fYW5ndWxhclZlbG9jaXR5Kz1pbnZJMiptb3RvckltcHVsc2UqdGhpcy5tX21vdG9ySmFjb2JpYW4uYW5ndWxhcjI7fQppZih0aGlzLm1fZW5hYmxlTGltaXQmJnRoaXMubV9saW1pdFN0YXRlIT1iMkpvaW50LmVfaW5hY3RpdmVMaW1pdCkKe3ZhciBsaW1pdENkb3Q9dGhpcy5tX21vdG9ySmFjb2JpYW4uQ29tcHV0ZShiMS5tX2xpbmVhclZlbG9jaXR5LGIxLm1fYW5ndWxhclZlbG9jaXR5LGIyLm1fbGluZWFyVmVsb2NpdHksYjIubV9hbmd1bGFyVmVsb2NpdHkpO3ZhciBsaW1pdEltcHVsc2U9LXRoaXMubV9tb3Rvck1hc3MqbGltaXRDZG90O2lmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfZXF1YWxMaW1pdHMpCnt0aGlzLm1fbGltaXRJbXB1bHNlKz1saW1pdEltcHVsc2U7fQplbHNlIGlmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfYXRMb3dlckxpbWl0KQp7b2xkTGltaXRJbXB1bHNlPXRoaXMubV9saW1pdEltcHVsc2U7dGhpcy5tX2xpbWl0SW1wdWxzZT1iMk1hdGguYjJNYXgodGhpcy5tX2xpbWl0SW1wdWxzZStsaW1pdEltcHVsc2UsMC4wKTtsaW1pdEltcHVsc2U9dGhpcy5tX2xpbWl0SW1wdWxzZS1vbGRMaW1pdEltcHVsc2U7fQplbHNlIGlmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfYXRVcHBlckxpbWl0KQp7b2xkTGltaXRJbXB1bHNlPXRoaXMubV9saW1pdEltcHVsc2U7dGhpcy5tX2xpbWl0SW1wdWxzZT1iMk1hdGguYjJNaW4odGhpcy5tX2xpbWl0SW1wdWxzZStsaW1pdEltcHVsc2UsMC4wKTtsaW1pdEltcHVsc2U9dGhpcy5tX2xpbWl0SW1wdWxzZS1vbGRMaW1pdEltcHVsc2U7fQpiMS5tX2xpbmVhclZlbG9jaXR5LngrPShpbnZNYXNzMSpsaW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjEueDtiMS5tX2xpbmVhclZlbG9jaXR5LnkrPShpbnZNYXNzMSpsaW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjEueTtiMS5tX2FuZ3VsYXJWZWxvY2l0eSs9aW52STEqbGltaXRJbXB1bHNlKnRoaXMubV9tb3RvckphY29iaWFuLmFuZ3VsYXIxO2IyLm1fbGluZWFyVmVsb2NpdHkueCs9KGludk1hc3MyKmxpbWl0SW1wdWxzZSkqdGhpcy5tX21vdG9ySmFjb2JpYW4ubGluZWFyMi54O2IyLm1fbGluZWFyVmVsb2NpdHkueSs9KGludk1hc3MyKmxpbWl0SW1wdWxzZSkqdGhpcy5tX21vdG9ySmFjb2JpYW4ubGluZWFyMi55O2IyLm1fYW5ndWxhclZlbG9jaXR5Kz1pbnZJMipsaW1pdEltcHVsc2UqdGhpcy5tX21vdG9ySmFjb2JpYW4uYW5ndWxhcjI7fX0sU29sdmVQb3NpdGlvbkNvbnN0cmFpbnRzOmZ1bmN0aW9uKCl7dmFyIGxpbWl0Qzt2YXIgb2xkTGltaXRJbXB1bHNlO3ZhciBiMT10aGlzLm1fYm9keTE7dmFyIGIyPXRoaXMubV9ib2R5Mjt2YXIgaW52TWFzczE9YjEubV9pbnZNYXNzO3ZhciBpbnZNYXNzMj1iMi5tX2ludk1hc3M7dmFyIGludkkxPWIxLm1faW52STt2YXIgaW52STI9YjIubV9pbnZJO3ZhciB0TWF0O3RNYXQ9YjEubV9SO3ZhciByMVg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjEueTt2YXIgcjFZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IxLnk7dE1hdD1iMi5tX1I7dmFyIHIyWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3ZhciByMlk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueTt2YXIgcDFYPWIxLm1fcG9zaXRpb24ueCtyMVg7dmFyIHAxWT1iMS5tX3Bvc2l0aW9uLnkrcjFZO3ZhciBwMlg9YjIubV9wb3NpdGlvbi54K3IyWDt2YXIgcDJZPWIyLm1fcG9zaXRpb24ueStyMlk7dmFyIGRYPXAyWC1wMVg7dmFyIGRZPXAyWS1wMVk7dE1hdD1iMS5tX1I7dmFyIGF5MVg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsWUF4aXMxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsWUF4aXMxLnk7dmFyIGF5MVk9dE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsWUF4aXMxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsWUF4aXMxLnk7dmFyIGxpbmVhckM9YXkxWCpkWCtheTFZKmRZO2xpbmVhckM9YjJNYXRoLmIyQ2xhbXAobGluZWFyQywtYjJTZXR0aW5ncy5iMl9tYXhMaW5lYXJDb3JyZWN0aW9uLGIyU2V0dGluZ3MuYjJfbWF4TGluZWFyQ29ycmVjdGlvbik7dmFyIGxpbmVhckltcHVsc2U9LXRoaXMubV9saW5lYXJNYXNzKmxpbmVhckM7YjEubV9wb3NpdGlvbi54Kz0oaW52TWFzczEqbGluZWFySW1wdWxzZSkqdGhpcy5tX2xpbmVhckphY29iaWFuLmxpbmVhcjEueDtiMS5tX3Bvc2l0aW9uLnkrPShpbnZNYXNzMSpsaW5lYXJJbXB1bHNlKSp0aGlzLm1fbGluZWFySmFjb2JpYW4ubGluZWFyMS55O2IxLm1fcm90YXRpb24rPWludkkxKmxpbmVhckltcHVsc2UqdGhpcy5tX2xpbmVhckphY29iaWFuLmFuZ3VsYXIxO2IyLm1fcG9zaXRpb24ueCs9KGludk1hc3MyKmxpbmVhckltcHVsc2UpKnRoaXMubV9saW5lYXJKYWNvYmlhbi5saW5lYXIyLng7YjIubV9wb3NpdGlvbi55Kz0oaW52TWFzczIqbGluZWFySW1wdWxzZSkqdGhpcy5tX2xpbmVhckphY29iaWFuLmxpbmVhcjIueTtiMi5tX3JvdGF0aW9uKz1pbnZJMipsaW5lYXJJbXB1bHNlKnRoaXMubV9saW5lYXJKYWNvYmlhbi5hbmd1bGFyMjt2YXIgcG9zaXRpb25FcnJvcj1iMk1hdGguYjJBYnMobGluZWFyQyk7dmFyIGFuZ3VsYXJDPWIyLm1fcm90YXRpb24tYjEubV9yb3RhdGlvbi10aGlzLm1faW5pdGlhbEFuZ2xlO2FuZ3VsYXJDPWIyTWF0aC5iMkNsYW1wKGFuZ3VsYXJDLC1iMlNldHRpbmdzLmIyX21heEFuZ3VsYXJDb3JyZWN0aW9uLGIyU2V0dGluZ3MuYjJfbWF4QW5ndWxhckNvcnJlY3Rpb24pO3ZhciBhbmd1bGFySW1wdWxzZT0tdGhpcy5tX2FuZ3VsYXJNYXNzKmFuZ3VsYXJDO2IxLm1fcm90YXRpb24tPWIxLm1faW52SSphbmd1bGFySW1wdWxzZTtiMS5tX1IuU2V0KGIxLm1fcm90YXRpb24pO2IyLm1fcm90YXRpb24rPWIyLm1faW52SSphbmd1bGFySW1wdWxzZTtiMi5tX1IuU2V0KGIyLm1fcm90YXRpb24pO3ZhciBhbmd1bGFyRXJyb3I9YjJNYXRoLmIyQWJzKGFuZ3VsYXJDKTtpZih0aGlzLm1fZW5hYmxlTGltaXQmJnRoaXMubV9saW1pdFN0YXRlIT1iMkpvaW50LmVfaW5hY3RpdmVMaW1pdCkKe3RNYXQ9YjEubV9SO3IxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3IxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3RNYXQ9YjIubV9SO3IyWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3IyWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IyLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi55O3AxWD1iMS5tX3Bvc2l0aW9uLngrcjFYO3AxWT1iMS5tX3Bvc2l0aW9uLnkrcjFZO3AyWD1iMi5tX3Bvc2l0aW9uLngrcjJYO3AyWT1iMi5tX3Bvc2l0aW9uLnkrcjJZO2RYPXAyWC1wMVg7ZFk9cDJZLXAxWTt0TWF0PWIxLm1fUjt2YXIgYXgxWD10TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxYQXhpczEueTt2YXIgYXgxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxYQXhpczEueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxYQXhpczEueTt2YXIgdHJhbnNsYXRpb249KGF4MVgqZFgrYXgxWSpkWSk7dmFyIGxpbWl0SW1wdWxzZT0wLjA7aWYodGhpcy5tX2xpbWl0U3RhdGU9PWIySm9pbnQuZV9lcXVhbExpbWl0cykKe2xpbWl0Qz1iMk1hdGguYjJDbGFtcCh0cmFuc2xhdGlvbiwtYjJTZXR0aW5ncy5iMl9tYXhMaW5lYXJDb3JyZWN0aW9uLGIyU2V0dGluZ3MuYjJfbWF4TGluZWFyQ29ycmVjdGlvbik7bGltaXRJbXB1bHNlPS10aGlzLm1fbW90b3JNYXNzKmxpbWl0Qztwb3NpdGlvbkVycm9yPWIyTWF0aC5iMk1heChwb3NpdGlvbkVycm9yLGIyTWF0aC5iMkFicyhhbmd1bGFyQykpO30KZWxzZSBpZih0aGlzLm1fbGltaXRTdGF0ZT09YjJKb2ludC5lX2F0TG93ZXJMaW1pdCkKe2xpbWl0Qz10cmFuc2xhdGlvbi10aGlzLm1fbG93ZXJUcmFuc2xhdGlvbjtwb3NpdGlvbkVycm9yPWIyTWF0aC5iMk1heChwb3NpdGlvbkVycm9yLC1saW1pdEMpO2xpbWl0Qz1iMk1hdGguYjJDbGFtcChsaW1pdEMrYjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wLC1iMlNldHRpbmdzLmIyX21heExpbmVhckNvcnJlY3Rpb24sMC4wKTtsaW1pdEltcHVsc2U9LXRoaXMubV9tb3Rvck1hc3MqbGltaXRDO29sZExpbWl0SW1wdWxzZT10aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2U7dGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlPWIyTWF0aC5iMk1heCh0aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2UrbGltaXRJbXB1bHNlLDAuMCk7bGltaXRJbXB1bHNlPXRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZS1vbGRMaW1pdEltcHVsc2U7fQplbHNlIGlmKHRoaXMubV9saW1pdFN0YXRlPT1iMkpvaW50LmVfYXRVcHBlckxpbWl0KQp7bGltaXRDPXRyYW5zbGF0aW9uLXRoaXMubV91cHBlclRyYW5zbGF0aW9uO3Bvc2l0aW9uRXJyb3I9YjJNYXRoLmIyTWF4KHBvc2l0aW9uRXJyb3IsbGltaXRDKTtsaW1pdEM9YjJNYXRoLmIyQ2xhbXAobGltaXRDLWIyU2V0dGluZ3MuYjJfbGluZWFyU2xvcCwwLjAsYjJTZXR0aW5ncy5iMl9tYXhMaW5lYXJDb3JyZWN0aW9uKTtsaW1pdEltcHVsc2U9LXRoaXMubV9tb3Rvck1hc3MqbGltaXRDO29sZExpbWl0SW1wdWxzZT10aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2U7dGhpcy5tX2xpbWl0UG9zaXRpb25JbXB1bHNlPWIyTWF0aC5iMk1pbih0aGlzLm1fbGltaXRQb3NpdGlvbkltcHVsc2UrbGltaXRJbXB1bHNlLDAuMCk7bGltaXRJbXB1bHNlPXRoaXMubV9saW1pdFBvc2l0aW9uSW1wdWxzZS1vbGRMaW1pdEltcHVsc2U7fQpiMS5tX3Bvc2l0aW9uLngrPShpbnZNYXNzMSpsaW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjEueDtiMS5tX3Bvc2l0aW9uLnkrPShpbnZNYXNzMSpsaW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjEueTtiMS5tX3JvdGF0aW9uKz1pbnZJMSpsaW1pdEltcHVsc2UqdGhpcy5tX21vdG9ySmFjb2JpYW4uYW5ndWxhcjE7YjEubV9SLlNldChiMS5tX3JvdGF0aW9uKTtiMi5tX3Bvc2l0aW9uLngrPShpbnZNYXNzMipsaW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjIueDtiMi5tX3Bvc2l0aW9uLnkrPShpbnZNYXNzMipsaW1pdEltcHVsc2UpKnRoaXMubV9tb3RvckphY29iaWFuLmxpbmVhcjIueTtiMi5tX3JvdGF0aW9uKz1pbnZJMipsaW1pdEltcHVsc2UqdGhpcy5tX21vdG9ySmFjb2JpYW4uYW5ndWxhcjI7YjIubV9SLlNldChiMi5tX3JvdGF0aW9uKTt9CnJldHVybiBwb3NpdGlvbkVycm9yPD1iMlNldHRpbmdzLmIyX2xpbmVhclNsb3AmJmFuZ3VsYXJFcnJvcjw9YjJTZXR0aW5ncy5iMl9hbmd1bGFyU2xvcDt9LG1fbG9jYWxBbmNob3IxOm5ldyBiMlZlYzIoKSxtX2xvY2FsQW5jaG9yMjpuZXcgYjJWZWMyKCksbV9sb2NhbFhBeGlzMTpuZXcgYjJWZWMyKCksbV9sb2NhbFlBeGlzMTpuZXcgYjJWZWMyKCksbV9pbml0aWFsQW5nbGU6bnVsbCxtX2xpbmVhckphY29iaWFuOm5ldyBiMkphY29iaWFuKCksbV9saW5lYXJNYXNzOm51bGwsbV9saW5lYXJJbXB1bHNlOm51bGwsbV9hbmd1bGFyTWFzczpudWxsLG1fYW5ndWxhckltcHVsc2U6bnVsbCxtX21vdG9ySmFjb2JpYW46bmV3IGIySmFjb2JpYW4oKSxtX21vdG9yTWFzczpudWxsLG1fbW90b3JJbXB1bHNlOm51bGwsbV9saW1pdEltcHVsc2U6bnVsbCxtX2xpbWl0UG9zaXRpb25JbXB1bHNlOm51bGwsbV9sb3dlclRyYW5zbGF0aW9uOm51bGwsbV91cHBlclRyYW5zbGF0aW9uOm51bGwsbV9tYXhNb3RvckZvcmNlOm51bGwsbV9tb3RvclNwZWVkOm51bGwsbV9lbmFibGVMaW1pdDpudWxsLG1fZW5hYmxlTW90b3I6bnVsbCxtX2xpbWl0U3RhdGU6MH0pOwp2YXIgYjJQcmlzbWF0aWNKb2ludERlZj1DbGFzcy5jcmVhdGUoKTtPYmplY3QuZXh0ZW5kKGIyUHJpc21hdGljSm9pbnREZWYucHJvdG90eXBlLGIySm9pbnREZWYucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyUHJpc21hdGljSm9pbnREZWYucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCkKe3RoaXMudHlwZT1iMkpvaW50LmVfdW5rbm93bkpvaW50O3RoaXMudXNlckRhdGE9bnVsbDt0aGlzLmJvZHkxPW51bGw7dGhpcy5ib2R5Mj1udWxsO3RoaXMuY29sbGlkZUNvbm5lY3RlZD1mYWxzZTt0aGlzLnR5cGU9YjJKb2ludC5lX3ByaXNtYXRpY0pvaW50O3RoaXMuYW5jaG9yUG9pbnQ9bmV3IGIyVmVjMigwLjAsMC4wKTt0aGlzLmF4aXM9bmV3IGIyVmVjMigwLjAsMC4wKTt0aGlzLmxvd2VyVHJhbnNsYXRpb249MC4wO3RoaXMudXBwZXJUcmFuc2xhdGlvbj0wLjA7dGhpcy5tb3RvckZvcmNlPTAuMDt0aGlzLm1vdG9yU3BlZWQ9MC4wO3RoaXMuZW5hYmxlTGltaXQ9ZmFsc2U7dGhpcy5lbmFibGVNb3Rvcj1mYWxzZTt9LGFuY2hvclBvaW50Om51bGwsYXhpczpudWxsLGxvd2VyVHJhbnNsYXRpb246bnVsbCx1cHBlclRyYW5zbGF0aW9uOm51bGwsbW90b3JGb3JjZTpudWxsLG1vdG9yU3BlZWQ6bnVsbCxlbmFibGVMaW1pdDpudWxsLGVuYWJsZU1vdG9yOm51bGx9KTsKdmFyIGIyUHVsbGV5Sm9pbnQ9Q2xhc3MuY3JlYXRlKCk7T2JqZWN0LmV4dGVuZChiMlB1bGxleUpvaW50LnByb3RvdHlwZSxiMkpvaW50LnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMlB1bGxleUpvaW50LnByb3RvdHlwZSx7R2V0QW5jaG9yMTpmdW5jdGlvbigpe3ZhciB0TWF0PXRoaXMubV9ib2R5MS5tX1I7cmV0dXJuIG5ldyBiMlZlYzIodGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueCsodE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjEueSksdGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueSsodE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueSkpO30sR2V0QW5jaG9yMjpmdW5jdGlvbigpe3ZhciB0TWF0PXRoaXMubV9ib2R5Mi5tX1I7cmV0dXJuIG5ldyBiMlZlYzIodGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueCsodE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjIueSksdGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueSsodE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjIueSkpO30sR2V0R3JvdW5kUG9pbnQxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBiMlZlYzIodGhpcy5tX2dyb3VuZC5tX3Bvc2l0aW9uLngrdGhpcy5tX2dyb3VuZEFuY2hvcjEueCx0aGlzLm1fZ3JvdW5kLm1fcG9zaXRpb24ueSt0aGlzLm1fZ3JvdW5kQW5jaG9yMS55KTt9LEdldEdyb3VuZFBvaW50MjpmdW5jdGlvbigpe3JldHVybiBuZXcgYjJWZWMyKHRoaXMubV9ncm91bmQubV9wb3NpdGlvbi54K3RoaXMubV9ncm91bmRBbmNob3IyLngsdGhpcy5tX2dyb3VuZC5tX3Bvc2l0aW9uLnkrdGhpcy5tX2dyb3VuZEFuY2hvcjIueSk7fSxHZXRSZWFjdGlvbkZvcmNlOmZ1bmN0aW9uKGludlRpbWVTdGVwKXtyZXR1cm4gbmV3IGIyVmVjMigpO30sR2V0UmVhY3Rpb25Ub3JxdWU6ZnVuY3Rpb24oaW52VGltZVN0ZXApe3JldHVybiAwLjA7fSxHZXRMZW5ndGgxOmZ1bmN0aW9uKCl7dmFyIHRNYXQ7dE1hdD10aGlzLm1fYm9keTEubV9SO3ZhciBwWD10aGlzLm1fYm9keTEubV9wb3NpdGlvbi54Kyh0TWF0LmNvbDEueCp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLngqdGhpcy5tX2xvY2FsQW5jaG9yMS55KTt2YXIgcFk9dGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueSsodE1hdC5jb2wxLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS54K3RNYXQuY29sMi55KnRoaXMubV9sb2NhbEFuY2hvcjEueSk7dmFyIGRYPXBYLSh0aGlzLm1fZ3JvdW5kLm1fcG9zaXRpb24ueCt0aGlzLm1fZ3JvdW5kQW5jaG9yMS54KTt2YXIgZFk9cFktKHRoaXMubV9ncm91bmQubV9wb3NpdGlvbi55K3RoaXMubV9ncm91bmRBbmNob3IxLnkpO3JldHVybiBNYXRoLnNxcnQoZFgqZFgrZFkqZFkpO30sR2V0TGVuZ3RoMjpmdW5jdGlvbigpe3ZhciB0TWF0O3RNYXQ9dGhpcy5tX2JvZHkyLm1fUjt2YXIgcFg9dGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueCsodE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjIueSk7dmFyIHBZPXRoaXMubV9ib2R5Mi5tX3Bvc2l0aW9uLnkrKHRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IyLnkpO3ZhciBkWD1wWC0odGhpcy5tX2dyb3VuZC5tX3Bvc2l0aW9uLngrdGhpcy5tX2dyb3VuZEFuY2hvcjIueCk7dmFyIGRZPXBZLSh0aGlzLm1fZ3JvdW5kLm1fcG9zaXRpb24ueSt0aGlzLm1fZ3JvdW5kQW5jaG9yMi55KTtyZXR1cm4gTWF0aC5zcXJ0KGRYKmRYK2RZKmRZKTt9LEdldFJhdGlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9yYXRpbzt9LGluaXRpYWxpemU6ZnVuY3Rpb24oZGVmKXt0aGlzLm1fbm9kZTE9bmV3IGIySm9pbnROb2RlKCk7dGhpcy5tX25vZGUyPW5ldyBiMkpvaW50Tm9kZSgpO3RoaXMubV90eXBlPWRlZi50eXBlO3RoaXMubV9wcmV2PW51bGw7dGhpcy5tX25leHQ9bnVsbDt0aGlzLm1fYm9keTE9ZGVmLmJvZHkxO3RoaXMubV9ib2R5Mj1kZWYuYm9keTI7dGhpcy5tX2NvbGxpZGVDb25uZWN0ZWQ9ZGVmLmNvbGxpZGVDb25uZWN0ZWQ7dGhpcy5tX2lzbGFuZEZsYWc9ZmFsc2U7dGhpcy5tX3VzZXJEYXRhPWRlZi51c2VyRGF0YTt0aGlzLm1fZ3JvdW5kQW5jaG9yMT1uZXcgYjJWZWMyKCk7dGhpcy5tX2dyb3VuZEFuY2hvcjI9bmV3IGIyVmVjMigpO3RoaXMubV9sb2NhbEFuY2hvcjE9bmV3IGIyVmVjMigpO3RoaXMubV9sb2NhbEFuY2hvcjI9bmV3IGIyVmVjMigpO3RoaXMubV91MT1uZXcgYjJWZWMyKCk7dGhpcy5tX3UyPW5ldyBiMlZlYzIoKTt2YXIgdE1hdDt2YXIgdFg7dmFyIHRZO3RoaXMubV9ncm91bmQ9dGhpcy5tX2JvZHkxLm1fd29ybGQubV9ncm91bmRCb2R5O3RoaXMubV9ncm91bmRBbmNob3IxLng9ZGVmLmdyb3VuZFBvaW50MS54LXRoaXMubV9ncm91bmQubV9wb3NpdGlvbi54O3RoaXMubV9ncm91bmRBbmNob3IxLnk9ZGVmLmdyb3VuZFBvaW50MS55LXRoaXMubV9ncm91bmQubV9wb3NpdGlvbi55O3RoaXMubV9ncm91bmRBbmNob3IyLng9ZGVmLmdyb3VuZFBvaW50Mi54LXRoaXMubV9ncm91bmQubV9wb3NpdGlvbi54O3RoaXMubV9ncm91bmRBbmNob3IyLnk9ZGVmLmdyb3VuZFBvaW50Mi55LXRoaXMubV9ncm91bmQubV9wb3NpdGlvbi55O3RNYXQ9dGhpcy5tX2JvZHkxLm1fUjt0WD1kZWYuYW5jaG9yUG9pbnQxLngtdGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueDt0WT1kZWYuYW5jaG9yUG9pbnQxLnktdGhpcy5tX2JvZHkxLm1fcG9zaXRpb24ueTt0aGlzLm1fbG9jYWxBbmNob3IxLng9dFgqdE1hdC5jb2wxLngrdFkqdE1hdC5jb2wxLnk7dGhpcy5tX2xvY2FsQW5jaG9yMS55PXRYKnRNYXQuY29sMi54K3RZKnRNYXQuY29sMi55O3RNYXQ9dGhpcy5tX2JvZHkyLm1fUjt0WD1kZWYuYW5jaG9yUG9pbnQyLngtdGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueDt0WT1kZWYuYW5jaG9yUG9pbnQyLnktdGhpcy5tX2JvZHkyLm1fcG9zaXRpb24ueTt0aGlzLm1fbG9jYWxBbmNob3IyLng9dFgqdE1hdC5jb2wxLngrdFkqdE1hdC5jb2wxLnk7dGhpcy5tX2xvY2FsQW5jaG9yMi55PXRYKnRNYXQuY29sMi54K3RZKnRNYXQuY29sMi55O3RoaXMubV9yYXRpbz1kZWYucmF0aW87dFg9ZGVmLmdyb3VuZFBvaW50MS54LWRlZi5hbmNob3JQb2ludDEueDt0WT1kZWYuZ3JvdW5kUG9pbnQxLnktZGVmLmFuY2hvclBvaW50MS55O3ZhciBkMUxlbj1NYXRoLnNxcnQodFgqdFgrdFkqdFkpO3RYPWRlZi5ncm91bmRQb2ludDIueC1kZWYuYW5jaG9yUG9pbnQyLng7dFk9ZGVmLmdyb3VuZFBvaW50Mi55LWRlZi5hbmNob3JQb2ludDIueTt2YXIgZDJMZW49TWF0aC5zcXJ0KHRYKnRYK3RZKnRZKTt2YXIgbGVuZ3RoMT1iMk1hdGguYjJNYXgoMC41KmIyUHVsbGV5Sm9pbnQuYjJfbWluUHVsbGV5TGVuZ3RoLGQxTGVuKTt2YXIgbGVuZ3RoMj1iMk1hdGguYjJNYXgoMC41KmIyUHVsbGV5Sm9pbnQuYjJfbWluUHVsbGV5TGVuZ3RoLGQyTGVuKTt0aGlzLm1fY29uc3RhbnQ9bGVuZ3RoMSt0aGlzLm1fcmF0aW8qbGVuZ3RoMjt0aGlzLm1fbWF4TGVuZ3RoMT1iMk1hdGguYjJDbGFtcChkZWYubWF4TGVuZ3RoMSxsZW5ndGgxLHRoaXMubV9jb25zdGFudC10aGlzLm1fcmF0aW8qYjJQdWxsZXlKb2ludC5iMl9taW5QdWxsZXlMZW5ndGgpO3RoaXMubV9tYXhMZW5ndGgyPWIyTWF0aC5iMkNsYW1wKGRlZi5tYXhMZW5ndGgyLGxlbmd0aDIsKHRoaXMubV9jb25zdGFudC1iMlB1bGxleUpvaW50LmIyX21pblB1bGxleUxlbmd0aCkvdGhpcy5tX3JhdGlvKTt0aGlzLm1fcHVsbGV5SW1wdWxzZT0wLjA7dGhpcy5tX2xpbWl0SW1wdWxzZTE9MC4wO3RoaXMubV9saW1pdEltcHVsc2UyPTAuMDt9LFByZXBhcmVWZWxvY2l0eVNvbHZlcjpmdW5jdGlvbigpe3ZhciBiMT10aGlzLm1fYm9keTE7dmFyIGIyPXRoaXMubV9ib2R5Mjt2YXIgdE1hdDt0TWF0PWIxLm1fUjt2YXIgcjFYPXRNYXQuY29sMS54KnRoaXMubV9sb2NhbEFuY2hvcjEueCt0TWF0LmNvbDIueCp0aGlzLm1fbG9jYWxBbmNob3IxLnk7dmFyIHIxWT10TWF0LmNvbDEueSp0aGlzLm1fbG9jYWxBbmNob3IxLngrdE1hdC5jb2wyLnkqdGhpcy5tX2xvY2FsQW5jaG9yMS55O3RNYXQ9YjIubV9SO3ZhciByMlg9dE1hdC5jb2wxLngqdGhpcy5tX2xvY2FsQW5jaG9yMi54K3RNYXQuY29sMi54KnRoaXMubV9sb2NhbEFuY2hvcjIueTt2YXIgcjJZPXRNYXQuY29sMS55KnRoaXMubV9sb2NhbEFuY2hvcjIueCt0TWF0LmNvbDIueSp0aGlzLm1fbG9jYWxBbmNob3IyLnk7dmFyIHAxWD1iMS5tX3Bvc2l0aW9uLngrcjFYO3ZhciBwMVk9YjEubV9wb3NpdGlvbi55K3IxWTt2YXIgcDJYPWIyLm1fcG9zaXRpb24ueCtyMlg7dmFyIHAyWT1iMi5tX3Bvc2l0aW9uLnkrcjJZO3ZhciBzMVg9dGhpcy5tX2dyb3VuZC5tX3Bvc2l0aW9uLngrdGhpcy5tX2dyb3VuZEFuY2hvcjEueDt2YXIgczFZPXRoaXMubV9ncm91bmQubV9wb3NpdGlvbi55K3RoaXMubV9ncm91bmRBbmNob3IxLnk7dmFyIHMyWD10aGlzLm1fZ3JvdW5kLm1fcG9zaXRpb24ueCt0aGlzLm1fZ3JvdW5kQW5jaG9yMi54O3ZhciBzMlk9dGhpcy5tX2dyb3VuZC5tX3Bvc2l0aW9uLnkrdGhpcy5tX2dyb3VuZEFuY2hvcjIueTt0aGlzLm1fdTEuU2V0KHAxWC1zMVgscDFZLXMxWSk7dGhpcy5tX3UyLlNldChwMlgtczJYLHAyWS1zMlkpO3ZhciBsZW5ndGgxPXRoaXMubV91MS5MZW5ndGgoKTt2YXIgbGVuZ3RoMj10aGlzLm1fdTIuTGVuZ3RoKCk7aWYobGVuZ3RoMT5iMlNldHRpbmdzLmIyX2xpbmVhclNsb3ApCnt0aGlzLm1fdTEuTXVsdGlwbHkoMS4wL2xlbmd0aDEpO30KZWxzZQp7dGhpcy5tX3UxLlNldFplcm8oKTt9CmlmKGxlbmd0aDI|MC4wKQp7dGhpcy5zdGVwLmludl9kdD0xLjAvZHQ7fQplbHNlCnt0aGlzLnN0ZXAuaW52X2R0PTAuMDt9CnRoaXMubV9wb3NpdGlvbkl0ZXJhdGlvbkNvdW50PTA7dGhpcy5tX2NvbnRhY3RNYW5hZ2VyLkNsZWFuQ29udGFjdExpc3QoKTt0aGlzLkNsZWFuQm9keUxpc3QoKTt0aGlzLm1fY29udGFjdE1hbmFnZXIuQ29sbGlkZSgpO3ZhciBpc2xhbmQ9bmV3IGIySXNsYW5kKHRoaXMubV9ib2R5Q291bnQsdGhpcy5tX2NvbnRhY3RDb3VudCx0aGlzLm1fam9pbnRDb3VudCx0aGlzLm1fc3RhY2tBbGxvY2F0b3IpO2ZvcihiPXRoaXMubV9ib2R5TGlzdDtiIT1udWxsO2I9Yi5tX25leHQpCntiLm1fZmxhZ3MmPX5iMkJvZHkuZV9pc2xhbmRGbGFnO30KZm9yKHZhciBjPXRoaXMubV9jb250YWN0TGlzdDtjIT1udWxsO2M9Yy5tX25leHQpCntjLm1fZmxhZ3MmPX5iMkNvbnRhY3QuZV9pc2xhbmRGbGFnO30KZm9yKHZhciBqPXRoaXMubV9qb2ludExpc3Q7aiE9bnVsbDtqPWoubV9uZXh0KQp7ai5tX2lzbGFuZEZsYWc9ZmFsc2U7fQp2YXIgc3RhY2tTaXplPXRoaXMubV9ib2R5Q291bnQ7dmFyIHN0YWNrPW5ldyBBcnJheSh0aGlzLm1fYm9keUNvdW50KTtmb3IodmFyIGs9MDtrPHRoaXMubV9ib2R5Q291bnQ7aysrKQpzdGFja1trXT1udWxsO2Zvcih2YXIgc2VlZD10aGlzLm1fYm9keUxpc3Q7c2VlZCE9bnVsbDtzZWVkPXNlZWQubV9uZXh0KQp7aWYoc2VlZC5tX2ZsYWdzJihiMkJvZHkuZV9zdGF0aWNGbGFnfGIyQm9keS5lX2lzbGFuZEZsYWd8YjJCb2R5LmVfc2xlZXBGbGFnfGIyQm9keS5lX2Zyb3plbkZsYWcpKQp7Y29udGludWU7fQppc2xhbmQuQ2xlYXIoKTt2YXIgc3RhY2tDb3VudD0wO3N0YWNrW3N0YWNrQ291bnQrK109c2VlZDtzZWVkLm1fZmxhZ3N8PWIyQm9keS5lX2lzbGFuZEZsYWc7O3doaWxlKHN0YWNrQ291bnQ|PiAxKSwgcHJvcGVydGllc1tpXVsxXSArIChwcm9wZXJ0aWVzW2ldWzNdID4|IDEpLCBwcm9wZXJ0aWVzW2ldWzJdIC8gMiwgcHJvcGVydGllc1tpXVszXSAvIDIsIGZhbHNlICk7CndoaWxlICggZWxlbWVudC5vZmZzZXRQYXJlbnQgKSB7CmVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnOwp9Cn0KfQpmdW5jdGlvbiBydW4oKSB7CmlzUnVubmluZyA9IHRydWU7CnNldEludGVydmFsKCBsb29wLCAyNSApOwp9CmZ1bmN0aW9uIG9uRG9jdW1lbnRNb3VzZURvd24oIGV2ZW50ICkgewppc01vdXNlRG93biA9IHRydWU7Cn0KZnVuY3Rpb24gb25Eb2N1bWVudE1vdXNlVXAoIGV2ZW50ICkgewppc01vdXNlRG93biA9IGZhbHNlOwp9CmZ1bmN0aW9uIG9uRG9jdW1lbnRNb3VzZU1vdmUoIGV2ZW50ICkgewppZiAoICFpc1J1bm5pbmcgKSBydW4oKTsKbW91c2UueCA9IGV2ZW50LmNsaWVudFg7Cm1vdXNlLnkgPSBldmVudC5jbGllbnRZOwp9CmZ1bmN0aW9uIG9uRG9jdW1lbnRLZXlVcCggZXZlbnQgKSB7CmlmICggZXZlbnQua2V5Q29kZSA9PSAxMyApIHNlYXJjaCgpOwp9CmZ1bmN0aW9uIG9uRG9jdW1lbnRUb3VjaFN0YXJ0KCBldmVudCApIHsKaWYgKCBldmVudC50b3VjaGVzLmxlbmd0aCA9PSAxICkgewppZiAoICFpc1J1bm5pbmcgKSB7CnJ1bigpOwp9Cm1vdXNlLnggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYOwptb3VzZS55ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWTsKaXNNb3VzZURvd24gPSB0cnVlOwp9Cn0KZnVuY3Rpb24gb25Eb2N1bWVudFRvdWNoTW92ZSggZXZlbnQgKSB7CmlmICggZXZlbnQudG91Y2hlcy5sZW5ndGggPT0gMSApIHsKZXZlbnQucHJldmVudERlZmF1bHQoKTsKbW91c2UueCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVg7Cm1vdXNlLnkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZOwp9Cn0KZnVuY3Rpb24gb25Eb2N1bWVudFRvdWNoRW5kKCBldmVudCApIHsKaWYgKCBldmVudC50b3VjaGVzLmxlbmd0aCA9PSAwICkgewppc01vdXNlRG93biA9IGZhbHNlOwp9Cn0KZnVuY3Rpb24gb25XaW5kb3dEZXZpY2VPcmllbnRhdGlvbiggZXZlbnQgKSB7CmlmKCAvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICkgewppZiAoJCh3aW5kb3cpLndpZHRoKCkgPiAkKHdpbmRvdykuaGVpZ2h0KCkpewppZiAoIGV2ZW50LmJldGEgKSB7CmdyYXZpdHkueSA9IC0xICogKE1hdGguc2luKCBldmVudC5nYW1tYSAqIE1hdGguUEkgLyAxODAgKSk7CmdyYXZpdHkueCA9IChldmVudC5iZXRhICogTWF0aC5QSSAvIDE4MCApOwp9Cn1lbHNlewovL3BvcnRyYWl0CmlmICggZXZlbnQuYmV0YSApIHsKZ3Jhdml0eS54ID0gTWF0aC5zaW4oIGV2ZW50LmdhbW1hICogTWF0aC5QSSAvIDE4MCApOwpncmF2aXR5LnkgPSBldmVudC5iZXRhICogTWF0aC5QSSAvIDE4MCA7Cn0KfQp9ZWxzZXsKaWYgKCBldmVudC5iZXRhICkgewpncmF2aXR5LnggPSBNYXRoLnNpbiggZXZlbnQuZ2FtbWEgKiBNYXRoLlBJIC8gMTgwICk7CmdyYXZpdHkueSA9ICggTWF0aC5QSSAvIDQgKSArIGV2ZW50LmJldGEgKiBNYXRoLlBJIC8gMTgwIDsKfQp9Cn0KZnVuY3Rpb24gb25FbGVtZW50TW91c2VEb3duKCBldmVudCApIHsKZXZlbnQucHJldmVudERlZmF1bHQoKTsKbW91c2VPbkNsaWNrWzBdID0gZXZlbnQuY2xpZW50WDsKbW91c2VPbkNsaWNrWzFdID0gZXZlbnQuY2xpZW50WTsKfQpmdW5jdGlvbiBvbkVsZW1lbnRNb3VzZVVwKCBldmVudCApIHsKZXZlbnQucHJldmVudERlZmF1bHQoKTsKfQpmdW5jdGlvbiBvbkVsZW1lbnRDbGljayggZXZlbnQgKSB7CnZhciByYW5nZSA9IDU7CmlmICggbW91c2VPbkNsaWNrWzBdID4gZXZlbnQuY2xpZW50WCArIHJhbmdlIHx8IG1vdXNlT25DbGlja1swXSA8IGV2ZW50LmNsaWVudFggLSByYW5nZSAmJgptb3VzZU9uQ2xpY2tbMV0gPiBldmVudC5jbGllbnRZICsgcmFuZ2UgfHwgbW91c2VPbkNsaWNrWzFdIDwgZXZlbnQuY2xpZW50WSAtIHJhbmdlICkgewpldmVudC5wcmV2ZW50RGVmYXVsdCgpOwp9CmlmICggZXZlbnQudGFyZ2V0ID09IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnYnRuRycgKSApIHNlYXJjaCgpOwppZiAoIGV2ZW50LnRhcmdldCA9PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2J0bkknICkgKSBpbUZlZWxpbmdMdWNreSgpOwppZiAoIGV2ZW50LnRhcmdldCA9PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3EnICkgKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncScpLmZvY3VzKCk7Cn0KZnVuY3Rpb24gbG9vcCgpIHsKaWYgKGdldEJyb3dzZXJEaW1lbnNpb25zKCkpCnNldFdhbGxzKCk7CmRlbHRhWzBdICs9ICgwIC0gZGVsdGFbMF0pICogLjU7CmRlbHRhWzFdICs9ICgwIC0gZGVsdGFbMV0pICogLjU7CndvcmxkLm1fZ3Jhdml0eS54ID0gZ3Jhdml0eS54ICogMzUwICsgZGVsdGFbMF07CndvcmxkLm1fZ3Jhdml0eS55ID0gZ3Jhdml0eS55ICogMzUwICsgZGVsdGFbMV07Cm1vdXNlRHJhZygpOwp3b3JsZC5TdGVwKHRpbWVTdGVwLCBpdGVyYXRpb25zKTsKZm9yICggaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKyApIHsKdmFyIGJvZHkgPSBib2RpZXNbaV07CnZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07CmVsZW1lbnQuc3R5bGUubGVmdCA9IChib2R5Lm1fcG9zaXRpb24wLnggLSAocHJvcGVydGllc1tpXVsyXSA|appendChild|body|PiAxKSkgKyAncHgnOwp2YXIgc3R5bGUgPSAncm90YXRlKCcgKyAoYm9keS5tX3JvdGF0aW9uMCAqIDU3LjI5NTc3OTUpICsgJ2RlZyknOwplbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlOwplbGVtZW50LnN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IHN0eWxlICsgJyB0cmFuc2xhdGVaKDApJzsgLy8gRm9yY2UgSFcgQWNjZWxlcmF0aW9uCmVsZW1lbnQuc3R5bGUuTW96VHJhbnNmb3JtID0gc3R5bGU7CmVsZW1lbnQuc3R5bGUuT1RyYW5zZm9ybSA9IHN0eWxlOwplbGVtZW50LnN0eWxlLm1zVHJhbnNmb3JtID0gc3R5bGU7Cn0KfQpmdW5jdGlvbiBjcmVhdGVCb3god29ybGQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpeGVkLCBlbGVtZW50KSB7CmlmICh0eXBlb2YoZml4ZWQpID09ICd1bmRlZmluZWQnKQpmaXhlZCA9IHRydWU7CnZhciBib3hTZCA9IG5ldyBiMkJveERlZigpOwppZiAoIWZpeGVkKQpib3hTZC5kZW5zaXR5ID0gMS4wOwpib3hTZC5leHRlbnRzLlNldCh3aWR0aCwgaGVpZ2h0KTsKdmFyIGJveEJkID0gbmV3IGIyQm9keURlZigpOwpib3hCZC5BZGRTaGFwZShib3hTZCk7CmJveEJkLnBvc2l0aW9uLlNldCh4LHkpOwpib3hCZC51c2VyRGF0YSA9IHtlbGVtZW50OiBlbGVtZW50fTsKcmV0dXJuIHdvcmxkLkNyZWF0ZUJvZHkoYm94QmQpCn0KZnVuY3Rpb24gbW91c2VEcmFnKCkgewppZiAoaXNNb3VzZURvd24gJiYgIW1vdXNlSm9pbnQpIHsKdmFyIGJvZHkgPSBnZXRCb2R5QXRNb3VzZSgpOwppZiAoYm9keSkgewp2YXIgbWQgPSBuZXcgYjJNb3VzZUpvaW50RGVmKCk7Cm1kLmJvZHkxID0gd29ybGQubV9ncm91bmRCb2R5OwptZC5ib2R5MiA9IGJvZHk7Cm1kLnRhcmdldC5TZXQobW91c2UueCwgbW91c2UueSk7Cm1kLm1heEZvcmNlID0gMzAwMDAuMCAqIGJvZHkubV9tYXNzOwptZC50aW1lU3RlcCA9IHRpbWVTdGVwOwptb3VzZUpvaW50ID0gd29ybGQuQ3JlYXRlSm9pbnQobWQpOwpib2R5Lldha2VVcCgpOwp9Cn0KaWYgKCFpc01vdXNlRG93bikgewppZiAobW91c2VKb2ludCkgewp3b3JsZC5EZXN0cm95Sm9pbnQobW91c2VKb2ludCk7Cm1vdXNlSm9pbnQgPSBudWxsOwp9Cn0KaWYgKG1vdXNlSm9pbnQpIHsKdmFyIHAyID0gbmV3IGIyVmVjMihtb3VzZS54LCBtb3VzZS55KTsKbW91c2VKb2ludC5TZXRUYXJnZXQocDIpOwp9Cn0KZnVuY3Rpb24gZ2V0Qm9keUF0TW91c2UoKSB7CnZhciBtb3VzZVBWZWMgPSBuZXcgYjJWZWMyKCk7Cm1vdXNlUFZlYy5TZXQobW91c2UueCwgbW91c2UueSk7CnZhciBhYWJiID0gbmV3IGIyQUFCQigpOwphYWJiLm1pblZlcnRleC5TZXQobW91c2UueCAtIDEsIG1vdXNlLnkgLSAxKTsKYWFiYi5tYXhWZXJ0ZXguU2V0KG1vdXNlLnggKyAxLCBtb3VzZS55ICsgMSk7CnZhciBrX21heENvdW50ID0gMTA7CnZhciBzaGFwZXMgPSBbXTsKdmFyIGNvdW50ID0gd29ybGQuUXVlcnkoYWFiYiwgc2hhcGVzLCBrX21heENvdW50KTsKdmFyIGJvZHkgPSBudWxsOwpmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHsKaWYgKHNoYXBlc1tpXS5tX2JvZHkuSXNTdGF0aWMoKSA9PSBmYWxzZSkgewppZiAoIHNoYXBlc1tpXS5UZXN0UG9pbnQobW91c2VQVmVjKSApIHsKYm9keSA9IHNoYXBlc1tpXS5tX2JvZHk7CmJyZWFrOwp9Cn0KfQpyZXR1cm4gYm9keTsKfQpmdW5jdGlvbiBzZXRXYWxscygpIHsKaWYgKHdhbGxzU2V0dGVkKSB7CndvcmxkLkRlc3Ryb3lCb2R5KHdhbGxzWzBdKTsKd29ybGQuRGVzdHJveUJvZHkod2FsbHNbMV0pOwp3b3JsZC5EZXN0cm95Qm9keSh3YWxsc1syXSk7CndvcmxkLkRlc3Ryb3lCb2R5KHdhbGxzWzNdKTsKd2FsbHNbMF0gPSBudWxsOwp3YWxsc1sxXSA9IG51bGw7CndhbGxzWzJdID0gbnVsbDsKd2FsbHNbM10gPSBudWxsOwp9CndhbGxzWzBdID0gY3JlYXRlQm94KHdvcmxkLCBzdGFnZVsyXSAvIDIsIC0gd2FsbF90aGlja25lc3MsIHN0YWdlWzJdLCB3YWxsX3RoaWNrbmVzcyk7CndhbGxzWzFdID0gY3JlYXRlQm94KHdvcmxkLCBzdGFnZVsyXSAvIDIsIHN0YWdlWzNdICsgd2FsbF90aGlja25lc3MsIHN0YWdlWzJdLCB3YWxsX3RoaWNrbmVzcyk7CndhbGxzWzJdID0gY3JlYXRlQm94KHdvcmxkLCAtIHdhbGxfdGhpY2tuZXNzLCBzdGFnZVszXSAvIDIsIHdhbGxfdGhpY2tuZXNzLCBzdGFnZVszXSk7CndhbGxzWzNdID0gY3JlYXRlQm94KHdvcmxkLCBzdGFnZVsyXSArIHdhbGxfdGhpY2tuZXNzLCBzdGFnZVszXSAvIDIsIHdhbGxfdGhpY2tuZXNzLCBzdGFnZVszXSk7CndhbGxzU2V0dGVkID0gdHJ1ZTsKfQpmdW5jdGlvbiBnZXRFbGVtZW50c0J5Q2xhc3MoIHNlYXJjaENsYXNzICkgewp2YXIgY2xhc3NFbGVtZW50cyA9IFtdOwp2YXIgZWxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTsKdmFyIGVsc0xlbiA9IGVscy5sZW5ndGgKZm9yIChpID0gMCwgaiA9IDA7IGkgPCBlbHNMZW47IGkrKykgewp2YXIgY2xhc3NlcyA9IGVsc1tpXS5jbGFzc05hbWUuc3BsaXQoJyAnKTsKZm9yIChrID0gMDsgayA8IGNsYXNzZXMubGVuZ3RoOyBrKyspCmlmICggY2xhc3Nlc1trXSA9PSBzZWFyY2hDbGFzcyApCmNsYXNzRWxlbWVudHNbaisrXSA9IGVsc1tpXTsKfQpyZXR1cm4gY2xhc3NFbGVtZW50czsKfQpmdW5jdGlvbiBnZXRFbGVtZW50UHJvcGVydGllcyggZWxlbWVudCApIHsKdmFyIHggPSAwOwp2YXIgeSA9IDA7CnZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7CnZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDsKZG8gewp4ICs9IGVsZW1lbnQub2Zmc2V0TGVmdDsKeSArPSBlbGVtZW50Lm9mZnNldFRvcDsKfSB3aGlsZSAoIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCApOwpyZXR1cm4gWyB4LCB5LCB3aWR0aCwgaGVpZ2h0IF07Cn0KZnVuY3Rpb24gZ2V0QnJvd3NlckRpbWVuc2lvbnMoKSB7CnZhciBjaGFuZ2VkID0gZmFsc2U7CmlmICggc3RhZ2VbMF0gIT0gd2luZG93LnNjcmVlblggKSB7CmRlbHRhWzBdID0gKHdpbmRvdy5zY3JlZW5YIC0gc3RhZ2VbMF0pICogNTA7CnN0YWdlWzBdID0gd2luZG93LnNjcmVlblg7CmNoYW5nZWQgPSB0cnVlOwp9CmlmICggc3RhZ2VbMV0gIT0gd2luZG93LnNjcmVlblkgKSB7CmRlbHRhWzFdID0gKHdpbmRvdy5zY3JlZW5ZIC0gc3RhZ2VbMV0pICogNTA7CnN0YWdlWzFdID0gd2luZG93LnNjcmVlblk7CmNoYW5nZWQgPSB0cnVlOwp9CmlmICggc3RhZ2VbMl0gIT0gd2luZG93LmlubmVyV2lkdGggKSB7CnN0YWdlWzJdID0gd2luZG93LmlubmVyV2lkdGg7CmNoYW5nZWQgPSB0cnVlOwp9CmlmICggc3RhZ2VbM10gIT0gd2luZG93LmlubmVySGVpZ2h0ICkgewpzdGFnZVszXSA9IHdpbmRvdy5pbm5lckhlaWdodDsKY2hhbmdlZCA9IHRydWU7Cn0KcmV0dXJuIGNoYW5nZWQ7Cn0KZnVuY3Rpb24gZ3JhdigpewokKCJodG1sIikuY3NzKCJvdmVyZmxvdyIsICJoaWRkZW4iKTsKJCgiYm9keSIpLmNzcygib3ZlcmZsb3ciLCAiaGlkZGVuIik7CiQoImltZyIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiZmlndXJlIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgid2JyIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgic3VtbWFyeSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInByb2dyZXNzIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiY29tbWFuZCIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoIm1ldGVyIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgia2V5Z2VuIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgic21hbGwiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJzdHJvbmciKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJzdWIiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwoKJCgiYW5ub3RhdGlvbiIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImRpdiIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInRoIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgidHJhY2siKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJkaXYiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJ0aXRsZSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInEiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJlbSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImxhYmVsIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiZGV0YWlscyIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImNpdGUiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJzcGFuIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiaDMiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJoNCIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImNvZGUiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJhIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgidGV4dGFyZWEiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJsaSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoIm9sIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgidWwiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJwIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiZW1iZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJhdWRpbyIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInZpZGVvIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiaDEiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJoMiIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInRleHRhcmVhIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJpZnJhbWUiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJmcmFtZSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImZvbnQiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJiIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiaSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImhyIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiZm9ybSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImxlZ2VuZCIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInNlbGVjdCIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInN2ZyIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImNhbnZhcyIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImNlbnRlciIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInNwYW4iKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJpbWFnZSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImRhdGEiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJjYXB0aW9uIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiYmlnIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgibGluayIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoIm1hcCIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoIm1lbnUiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJkaXYiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJkaXYiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJvYmplY3QiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJtYWluIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiYXBwbGV0IikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiYWRkcmVzcyIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImFiYnIiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJhcmVhIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiYXJ0aWNsZSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImNlbnRlciIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInByZSIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoImZvcm0iKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJmb290ZXIiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJkaXYiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJ0ZCIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7CiQoInRyIikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgidGFibGUiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJoZWFkZXIiKS5lYWNoKGZ1bmN0aW9uKCkgewppZigkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoIDwgMSkgewokKHRoaXMpLmFkZENsYXNzKCJib3gyZCIpOwokKHRoaXMpLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKJCh0aGlzKS5jc3MoInpJbmRleCIsICI5OSIpOwp9Cn0pOwokKCJib2R5IikuZWFjaChmdW5jdGlvbigpIHsKaWYoJCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCA8IDEpIHsKJCh0aGlzKS5hZGRDbGFzcygiYm94MmQiKTsKJCh0aGlzKS5jc3MoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7CiQodGhpcykuY3NzKCJ6SW5kZXgiLCAiOTkiKTsKfQp9KTsKJCgiaHRtbCIpLmVhY2goZnVuY3Rpb24oKSB7CmlmKCQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGggPCAxKSB7CiQodGhpcykuYWRkQ2xhc3MoImJveDJkIik7CiQodGhpcykuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwokKHRoaXMpLmNzcygiekluZGV4IiwgIjk5Iik7Cn0KfSk7Cn0|PiAxKSkgKyAncHgnOwplbGVtZW50LnN0eWxlLnRvcCA9IChib2R5Lm1fcG9zaXRpb24wLnkgLSAocHJvcGVydGllc1tpXVszXSA|ZGVmLmJvZHkxOmRlZi5ib2R5Mjtmb3IodmFyIHM9Yi5tX3NoYXBlTGlzdDtzO3M9cy5tX25leHQpCntzLlJlc2V0UHJveHkodGhpcy5tX2Jyb2FkUGhhc2UpO319CnJldHVybiBqO30sRGVzdHJveUpvaW50OmZ1bmN0aW9uKGopCnt2YXIgY29sbGlkZUNvbm5lY3RlZD1qLm1fY29sbGlkZUNvbm5lY3RlZDtpZihqLm1fcHJldikKe2oubV9wcmV2Lm1fbmV4dD1qLm1fbmV4dDt9CmlmKGoubV9uZXh0KQp7ai5tX25leHQubV9wcmV2PWoubV9wcmV2O30KaWYoaj09dGhpcy5tX2pvaW50TGlzdCkKe3RoaXMubV9qb2ludExpc3Q9ai5tX25leHQ7fQp2YXIgYm9keTE9ai5tX2JvZHkxO3ZhciBib2R5Mj1qLm1fYm9keTI7Ym9keTEuV2FrZVVwKCk7Ym9keTIuV2FrZVVwKCk7aWYoai5tX25vZGUxLnByZXYpCntqLm1fbm9kZTEucHJldi5uZXh0PWoubV9ub2RlMS5uZXh0O30KaWYoai5tX25vZGUxLm5leHQpCntqLm1fbm9kZTEubmV4dC5wcmV2PWoubV9ub2RlMS5wcmV2O30KaWYoai5tX25vZGUxPT1ib2R5MS5tX2pvaW50TGlzdCkKe2JvZHkxLm1fam9pbnRMaXN0PWoubV9ub2RlMS5uZXh0O30Kai5tX25vZGUxLnByZXY9bnVsbDtqLm1fbm9kZTEubmV4dD1udWxsO2lmKGoubV9ub2RlMi5wcmV2KQp7ai5tX25vZGUyLnByZXYubmV4dD1qLm1fbm9kZTIubmV4dDt9CmlmKGoubV9ub2RlMi5uZXh0KQp7ai5tX25vZGUyLm5leHQucHJldj1qLm1fbm9kZTIucHJldjt9CmlmKGoubV9ub2RlMj09Ym9keTIubV9qb2ludExpc3QpCntib2R5Mi5tX2pvaW50TGlzdD1qLm1fbm9kZTIubmV4dDt9CmoubV9ub2RlMi5wcmV2PW51bGw7ai5tX25vZGUyLm5leHQ9bnVsbDtiMkpvaW50LkRlc3Ryb3koaix0aGlzLm1fYmxvY2tBbGxvY2F0b3IpOy0tdGhpcy5tX2pvaW50Q291bnQ7aWYoY29sbGlkZUNvbm5lY3RlZD09ZmFsc2UpCnt2YXIgYj1ib2R5MS5tX3NoYXBlQ291bnQ8Ym9keTIubV9zaGFwZUNvdW50P2JvZHkxOmJvZHkyO2Zvcih2YXIgcz1iLm1fc2hhcGVMaXN0O3M7cz1zLm1fbmV4dCkKe3MuUmVzZXRQcm94eSh0aGlzLm1fYnJvYWRQaGFzZSk7fX19LEdldEdyb3VuZEJvZHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX2dyb3VuZEJvZHk7fSxzdGVwOm5ldyBiMlRpbWVTdGVwKCksU3RlcDpmdW5jdGlvbihkdCxpdGVyYXRpb25zKXt2YXIgYjt2YXIgb3RoZXI7dGhpcy5zdGVwLmR0PWR0O3RoaXMuc3RlcC5pdGVyYXRpb25zPWl0ZXJhdGlvbnM7aWYoZHQ|MCYmbmV3Q291bnQ9PTApCntib2R5MT1jLm1fc2hhcGUxLm1fYm9keTtib2R5Mj1jLm1fc2hhcGUyLm1fYm9keTtub2RlMT1jLm1fbm9kZTE7bm9kZTI9Yy5tX25vZGUyO2lmKG5vZGUxLnByZXYpCntub2RlMS5wcmV2Lm5leHQ9bm9kZTEubmV4dDt9CmlmKG5vZGUxLm5leHQpCntub2RlMS5uZXh0LnByZXY9bm9kZTEucHJldjt9CmlmKG5vZGUxPT1ib2R5MS5tX2NvbnRhY3RMaXN0KQp7Ym9keTEubV9jb250YWN0TGlzdD1ub2RlMS5uZXh0O30Kbm9kZTEucHJldj1udWxsO25vZGUxLm5leHQ9bnVsbDtpZihub2RlMi5wcmV2KQp7bm9kZTIucHJldi5uZXh0PW5vZGUyLm5leHQ7fQppZihub2RlMi5uZXh0KQp7bm9kZTIubmV4dC5wcmV2PW5vZGUyLnByZXY7fQppZihub2RlMj09Ym9keTIubV9jb250YWN0TGlzdCkKe2JvZHkyLm1fY29udGFjdExpc3Q9bm9kZTIubmV4dDt9Cm5vZGUyLnByZXY9bnVsbDtub2RlMi5uZXh0PW51bGw7fX19LG1fd29ybGQ6bnVsbCxtX251bGxDb250YWN0Om5ldyBiMk51bGxDb250YWN0KCksbV9kZXN0cm95SW1tZWRpYXRlOm51bGx9KTsKdmFyIGIyV29ybGQ9Q2xhc3MuY3JlYXRlKCk7YjJXb3JsZC5wcm90b3R5cGU9e2luaXRpYWxpemU6ZnVuY3Rpb24od29ybGRBQUJCLGdyYXZpdHksZG9TbGVlcCl7dGhpcy5zdGVwPW5ldyBiMlRpbWVTdGVwKCk7dGhpcy5tX2NvbnRhY3RNYW5hZ2VyPW5ldyBiMkNvbnRhY3RNYW5hZ2VyKCk7dGhpcy5tX2xpc3RlbmVyPW51bGw7dGhpcy5tX2ZpbHRlcj1iMkNvbGxpc2lvbkZpbHRlci5iMl9kZWZhdWx0RmlsdGVyO3RoaXMubV9ib2R5TGlzdD1udWxsO3RoaXMubV9jb250YWN0TGlzdD1udWxsO3RoaXMubV9qb2ludExpc3Q9bnVsbDt0aGlzLm1fYm9keUNvdW50PTA7dGhpcy5tX2NvbnRhY3RDb3VudD0wO3RoaXMubV9qb2ludENvdW50PTA7dGhpcy5tX2JvZHlEZXN0cm95TGlzdD1udWxsO3RoaXMubV9hbGxvd1NsZWVwPWRvU2xlZXA7dGhpcy5tX2dyYXZpdHk9Z3Jhdml0eTt0aGlzLm1fY29udGFjdE1hbmFnZXIubV93b3JsZD10aGlzO3RoaXMubV9icm9hZFBoYXNlPW5ldyBiMkJyb2FkUGhhc2Uod29ybGRBQUJCLHRoaXMubV9jb250YWN0TWFuYWdlcik7dmFyIGJkPW5ldyBiMkJvZHlEZWYoKTt0aGlzLm1fZ3JvdW5kQm9keT10aGlzLkNyZWF0ZUJvZHkoYmQpO30sU2V0TGlzdGVuZXI6ZnVuY3Rpb24obGlzdGVuZXIpe3RoaXMubV9saXN0ZW5lcj1saXN0ZW5lcjt9LFNldEZpbHRlcjpmdW5jdGlvbihmaWx0ZXIpe3RoaXMubV9maWx0ZXI9ZmlsdGVyO30sQ3JlYXRlQm9keTpmdW5jdGlvbihkZWYpe3ZhciBiPW5ldyBiMkJvZHkoZGVmLHRoaXMpO2IubV9wcmV2PW51bGw7Yi5tX25leHQ9dGhpcy5tX2JvZHlMaXN0O2lmKHRoaXMubV9ib2R5TGlzdCkKe3RoaXMubV9ib2R5TGlzdC5tX3ByZXY9Yjt9CnRoaXMubV9ib2R5TGlzdD1iOysrdGhpcy5tX2JvZHlDb3VudDtyZXR1cm4gYjt9LERlc3Ryb3lCb2R5OmZ1bmN0aW9uKGIpCntpZihiLm1fZmxhZ3MmYjJCb2R5LmVfZGVzdHJveUZsYWcpCntyZXR1cm47fQppZihiLm1fcHJldikKe2IubV9wcmV2Lm1fbmV4dD1iLm1fbmV4dDt9CmlmKGIubV9uZXh0KQp7Yi5tX25leHQubV9wcmV2PWIubV9wcmV2O30KaWYoYj09dGhpcy5tX2JvZHlMaXN0KQp7dGhpcy5tX2JvZHlMaXN0PWIubV9uZXh0O30KYi5tX2ZsYWdzfD1iMkJvZHkuZV9kZXN0cm95RmxhZzstLXRoaXMubV9ib2R5Q291bnQ7Yi5tX3ByZXY9bnVsbDtiLm1fbmV4dD10aGlzLm1fYm9keURlc3Ryb3lMaXN0O3RoaXMubV9ib2R5RGVzdHJveUxpc3Q9Yjt9LENsZWFuQm9keUxpc3Q6ZnVuY3Rpb24oKQp7dGhpcy5tX2NvbnRhY3RNYW5hZ2VyLm1fZGVzdHJveUltbWVkaWF0ZT10cnVlO3ZhciBiPXRoaXMubV9ib2R5RGVzdHJveUxpc3Q7d2hpbGUoYikKe3ZhciBiMD1iO2I9Yi5tX25leHQ7dmFyIGpuPWIwLm1fam9pbnRMaXN0O3doaWxlKGpuKQp7dmFyIGpuMD1qbjtqbj1qbi5uZXh0O2lmKHRoaXMubV9saXN0ZW5lcikKe3RoaXMubV9saXN0ZW5lci5Ob3RpZnlKb2ludERlc3Ryb3llZChqbjAuam9pbnQpO30KdGhpcy5EZXN0cm95Sm9pbnQoam4wLmpvaW50KTt9CmIwLkRlc3Ryb3koKTt9CnRoaXMubV9ib2R5RGVzdHJveUxpc3Q9bnVsbDt0aGlzLm1fY29udGFjdE1hbmFnZXIubV9kZXN0cm95SW1tZWRpYXRlPWZhbHNlO30sQ3JlYXRlSm9pbnQ6ZnVuY3Rpb24oZGVmKXt2YXIgaj1iMkpvaW50LkNyZWF0ZShkZWYsdGhpcy5tX2Jsb2NrQWxsb2NhdG9yKTtqLm1fcHJldj1udWxsO2oubV9uZXh0PXRoaXMubV9qb2ludExpc3Q7aWYodGhpcy5tX2pvaW50TGlzdCkKe3RoaXMubV9qb2ludExpc3QubV9wcmV2PWo7fQp0aGlzLm1fam9pbnRMaXN0PWo7Kyt0aGlzLm1fam9pbnRDb3VudDtqLm1fbm9kZTEuam9pbnQ9ajtqLm1fbm9kZTEub3RoZXI9ai5tX2JvZHkyO2oubV9ub2RlMS5wcmV2PW51bGw7ai5tX25vZGUxLm5leHQ9ai5tX2JvZHkxLm1fam9pbnRMaXN0O2lmKGoubV9ib2R5MS5tX2pvaW50TGlzdClqLm1fYm9keTEubV9qb2ludExpc3QucHJldj1qLm1fbm9kZTE7ai5tX2JvZHkxLm1fam9pbnRMaXN0PWoubV9ub2RlMTtqLm1fbm9kZTIuam9pbnQ9ajtqLm1fbm9kZTIub3RoZXI9ai5tX2JvZHkxO2oubV9ub2RlMi5wcmV2PW51bGw7ai5tX25vZGUyLm5leHQ9ai5tX2JvZHkyLm1fam9pbnRMaXN0O2lmKGoubV9ib2R5Mi5tX2pvaW50TGlzdClqLm1fYm9keTIubV9qb2ludExpc3QucHJldj1qLm1fbm9kZTI7ai5tX2JvZHkyLm1fam9pbnRMaXN0PWoubV9ub2RlMjtpZihkZWYuY29sbGlkZUNvbm5lY3RlZD09ZmFsc2UpCnt2YXIgYj1kZWYuYm9keTEubV9zaGFwZUNvdW50PGRlZi5ib2R5Mi5tX3NoYXBlQ291bnQ|MC4wKQp7dGhpcy5tX2ludk1hc3M9MS4wL3RoaXMubV9tYXNzO30KZWxzZQp7dGhpcy5tX2ludk1hc3M9MC4wO30KaWYodGhpcy5tX0k|aSsxOjA7fQp0aGlzLm1fUi5TZXRNKHRoaXMubV9ib2R5Lm1fUik7dGhpcy5tX3Bvc2l0aW9uLng9dGhpcy5tX2JvZHkubV9wb3NpdGlvbi54Kyh0aGlzLm1fUi5jb2wxLngqdGhpcy5tX2xvY2FsQ2VudHJvaWQueCt0aGlzLm1fUi5jb2wyLngqdGhpcy5tX2xvY2FsQ2VudHJvaWQueSk7dGhpcy5tX3Bvc2l0aW9uLnk9dGhpcy5tX2JvZHkubV9wb3NpdGlvbi55Kyh0aGlzLm1fUi5jb2wxLnkqdGhpcy5tX2xvY2FsQ2VudHJvaWQueCt0aGlzLm1fUi5jb2wyLnkqdGhpcy5tX2xvY2FsQ2VudHJvaWQueSk7YjJQb2x5U2hhcGUudEFic1IuY29sMS54PXRoaXMubV9SLmNvbDEueCp0aGlzLm1fbG9jYWxPQkIuUi5jb2wxLngrdGhpcy5tX1IuY29sMi54KnRoaXMubV9sb2NhbE9CQi5SLmNvbDEueTtiMlBvbHlTaGFwZS50QWJzUi5jb2wxLnk9dGhpcy5tX1IuY29sMS55KnRoaXMubV9sb2NhbE9CQi5SLmNvbDEueCt0aGlzLm1fUi5jb2wyLnkqdGhpcy5tX2xvY2FsT0JCLlIuY29sMS55O2IyUG9seVNoYXBlLnRBYnNSLmNvbDIueD10aGlzLm1fUi5jb2wxLngqdGhpcy5tX2xvY2FsT0JCLlIuY29sMi54K3RoaXMubV9SLmNvbDIueCp0aGlzLm1fbG9jYWxPQkIuUi5jb2wyLnk7YjJQb2x5U2hhcGUudEFic1IuY29sMi55PXRoaXMubV9SLmNvbDEueSp0aGlzLm1fbG9jYWxPQkIuUi5jb2wyLngrdGhpcy5tX1IuY29sMi55KnRoaXMubV9sb2NhbE9CQi5SLmNvbDIueTtiMlBvbHlTaGFwZS50QWJzUi5BYnMoKQpoWD1iMlBvbHlTaGFwZS50QWJzUi5jb2wxLngqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueCtiMlBvbHlTaGFwZS50QWJzUi5jb2wyLngqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueTtoWT1iMlBvbHlTaGFwZS50QWJzUi5jb2wxLnkqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueCtiMlBvbHlTaGFwZS50QWJzUi5jb2wyLnkqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueTt2YXIgcG9zaXRpb25YPXRoaXMubV9wb3NpdGlvbi54Kyh0aGlzLm1fUi5jb2wxLngqdGhpcy5tX2xvY2FsT0JCLmNlbnRlci54K3RoaXMubV9SLmNvbDIueCp0aGlzLm1fbG9jYWxPQkIuY2VudGVyLnkpO3ZhciBwb3NpdGlvblk9dGhpcy5tX3Bvc2l0aW9uLnkrKHRoaXMubV9SLmNvbDEueSp0aGlzLm1fbG9jYWxPQkIuY2VudGVyLngrdGhpcy5tX1IuY29sMi55KnRoaXMubV9sb2NhbE9CQi5jZW50ZXIueSk7YWFiYi5taW5WZXJ0ZXgueD1wb3NpdGlvblgtaFg7YWFiYi5taW5WZXJ0ZXgueT1wb3NpdGlvblktaFk7YWFiYi5tYXhWZXJ0ZXgueD1wb3NpdGlvblgraFg7YWFiYi5tYXhWZXJ0ZXgueT1wb3NpdGlvblkraFk7dmFyIGJyb2FkUGhhc2U9dGhpcy5tX2JvZHkubV93b3JsZC5tX2Jyb2FkUGhhc2U7aWYoYnJvYWRQaGFzZS5JblJhbmdlKGFhYmIpKQp7dGhpcy5tX3Byb3h5SWQ9YnJvYWRQaGFzZS5DcmVhdGVQcm94eShhYWJiLHRoaXMpO30KZWxzZQp7dGhpcy5tX3Byb3h5SWQ9YjJQYWlyLmIyX251bGxQcm94eTt9CmlmKHRoaXMubV9wcm94eUlkPT1iMlBhaXIuYjJfbnVsbFByb3h5KQp7dGhpcy5tX2JvZHkuRnJlZXplKCk7fX0sc3luY0FBQkI6bmV3IGIyQUFCQigpLHN5bmNNYXQ6bmV3IGIyTWF0MjIoKSxTeW5jaHJvbml6ZTpmdW5jdGlvbihwb3NpdGlvbjEsUjEscG9zaXRpb24yLFIyKXt0aGlzLm1fUi5TZXRNKFIyKTt0aGlzLm1fcG9zaXRpb24ueD10aGlzLm1fYm9keS5tX3Bvc2l0aW9uLngrKFIyLmNvbDEueCp0aGlzLm1fbG9jYWxDZW50cm9pZC54K1IyLmNvbDIueCp0aGlzLm1fbG9jYWxDZW50cm9pZC55KTt0aGlzLm1fcG9zaXRpb24ueT10aGlzLm1fYm9keS5tX3Bvc2l0aW9uLnkrKFIyLmNvbDEueSp0aGlzLm1fbG9jYWxDZW50cm9pZC54K1IyLmNvbDIueSp0aGlzLm1fbG9jYWxDZW50cm9pZC55KTtpZih0aGlzLm1fcHJveHlJZD09YjJQYWlyLmIyX251bGxQcm94eSkKe3JldHVybjt9CnZhciBoWDt2YXIgaFk7dmFyIHYxPVIxLmNvbDE7dmFyIHYyPVIxLmNvbDI7dmFyIHYzPXRoaXMubV9sb2NhbE9CQi5SLmNvbDE7dmFyIHY0PXRoaXMubV9sb2NhbE9CQi5SLmNvbDI7dGhpcy5zeW5jTWF0LmNvbDEueD12MS54KnYzLngrdjIueCp2My55O3RoaXMuc3luY01hdC5jb2wxLnk9djEueSp2My54K3YyLnkqdjMueTt0aGlzLnN5bmNNYXQuY29sMi54PXYxLngqdjQueCt2Mi54KnY0Lnk7dGhpcy5zeW5jTWF0LmNvbDIueT12MS55KnY0LngrdjIueSp2NC55O3RoaXMuc3luY01hdC5BYnMoKTtoWD10aGlzLm1fbG9jYWxDZW50cm9pZC54K3RoaXMubV9sb2NhbE9CQi5jZW50ZXIueDtoWT10aGlzLm1fbG9jYWxDZW50cm9pZC55K3RoaXMubV9sb2NhbE9CQi5jZW50ZXIueTt2YXIgY2VudGVyWD1wb3NpdGlvbjEueCsoUjEuY29sMS54KmhYK1IxLmNvbDIueCpoWSk7dmFyIGNlbnRlclk9cG9zaXRpb24xLnkrKFIxLmNvbDEueSpoWCtSMS5jb2wyLnkqaFkpO2hYPXRoaXMuc3luY01hdC5jb2wxLngqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueCt0aGlzLnN5bmNNYXQuY29sMi54KnRoaXMubV9sb2NhbE9CQi5leHRlbnRzLnk7aFk9dGhpcy5zeW5jTWF0LmNvbDEueSp0aGlzLm1fbG9jYWxPQkIuZXh0ZW50cy54K3RoaXMuc3luY01hdC5jb2wyLnkqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueTt0aGlzLnN5bmNBQUJCLm1pblZlcnRleC54PWNlbnRlclgtaFg7dGhpcy5zeW5jQUFCQi5taW5WZXJ0ZXgueT1jZW50ZXJZLWhZO3RoaXMuc3luY0FBQkIubWF4VmVydGV4Lng9Y2VudGVyWCtoWDt0aGlzLnN5bmNBQUJCLm1heFZlcnRleC55PWNlbnRlclkraFk7djE9UjIuY29sMTt2Mj1SMi5jb2wyO3YzPXRoaXMubV9sb2NhbE9CQi5SLmNvbDE7djQ9dGhpcy5tX2xvY2FsT0JCLlIuY29sMjt0aGlzLnN5bmNNYXQuY29sMS54PXYxLngqdjMueCt2Mi54KnYzLnk7dGhpcy5zeW5jTWF0LmNvbDEueT12MS55KnYzLngrdjIueSp2My55O3RoaXMuc3luY01hdC5jb2wyLng9djEueCp2NC54K3YyLngqdjQueTt0aGlzLnN5bmNNYXQuY29sMi55PXYxLnkqdjQueCt2Mi55KnY0Lnk7dGhpcy5zeW5jTWF0LkFicygpO2hYPXRoaXMubV9sb2NhbENlbnRyb2lkLngrdGhpcy5tX2xvY2FsT0JCLmNlbnRlci54O2hZPXRoaXMubV9sb2NhbENlbnRyb2lkLnkrdGhpcy5tX2xvY2FsT0JCLmNlbnRlci55O2NlbnRlclg9cG9zaXRpb24yLngrKFIyLmNvbDEueCpoWCtSMi5jb2wyLngqaFkpO2NlbnRlclk9cG9zaXRpb24yLnkrKFIyLmNvbDEueSpoWCtSMi5jb2wyLnkqaFkpO2hYPXRoaXMuc3luY01hdC5jb2wxLngqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueCt0aGlzLnN5bmNNYXQuY29sMi54KnRoaXMubV9sb2NhbE9CQi5leHRlbnRzLnk7aFk9dGhpcy5zeW5jTWF0LmNvbDEueSp0aGlzLm1fbG9jYWxPQkIuZXh0ZW50cy54K3RoaXMuc3luY01hdC5jb2wyLnkqdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMueTt0aGlzLnN5bmNBQUJCLm1pblZlcnRleC54PU1hdGgubWluKHRoaXMuc3luY0FBQkIubWluVmVydGV4LngsY2VudGVyWC1oWCk7dGhpcy5zeW5jQUFCQi5taW5WZXJ0ZXgueT1NYXRoLm1pbih0aGlzLnN5bmNBQUJCLm1pblZlcnRleC55LGNlbnRlclktaFkpO3RoaXMuc3luY0FBQkIubWF4VmVydGV4Lng9TWF0aC5tYXgodGhpcy5zeW5jQUFCQi5tYXhWZXJ0ZXgueCxjZW50ZXJYK2hYKTt0aGlzLnN5bmNBQUJCLm1heFZlcnRleC55PU1hdGgubWF4KHRoaXMuc3luY0FBQkIubWF4VmVydGV4LnksY2VudGVyWStoWSk7dmFyIGJyb2FkUGhhc2U9dGhpcy5tX2JvZHkubV93b3JsZC5tX2Jyb2FkUGhhc2U7aWYoYnJvYWRQaGFzZS5JblJhbmdlKHRoaXMuc3luY0FBQkIpKQp7YnJvYWRQaGFzZS5Nb3ZlUHJveHkodGhpcy5tX3Byb3h5SWQsdGhpcy5zeW5jQUFCQik7fQplbHNlCnt0aGlzLm1fYm9keS5GcmVlemUoKTt9fSxRdWlja1N5bmM6ZnVuY3Rpb24ocG9zaXRpb24sUil7dGhpcy5tX1IuU2V0TShSKTt0aGlzLm1fcG9zaXRpb24ueD1wb3NpdGlvbi54KyhSLmNvbDEueCp0aGlzLm1fbG9jYWxDZW50cm9pZC54K1IuY29sMi54KnRoaXMubV9sb2NhbENlbnRyb2lkLnkpO3RoaXMubV9wb3NpdGlvbi55PXBvc2l0aW9uLnkrKFIuY29sMS55KnRoaXMubV9sb2NhbENlbnRyb2lkLngrUi5jb2wyLnkqdGhpcy5tX2xvY2FsQ2VudHJvaWQueSk7fSxSZXNldFByb3h5OmZ1bmN0aW9uKGJyb2FkUGhhc2Upe2lmKHRoaXMubV9wcm94eUlkPT1iMlBhaXIuYjJfbnVsbFByb3h5KQp7cmV0dXJuO30KdmFyIHByb3h5PWJyb2FkUGhhc2UuR2V0UHJveHkodGhpcy5tX3Byb3h5SWQpO2Jyb2FkUGhhc2UuRGVzdHJveVByb3h5KHRoaXMubV9wcm94eUlkKTtwcm94eT1udWxsO3ZhciBSPWIyTWF0aC5iMk11bE1NKHRoaXMubV9SLHRoaXMubV9sb2NhbE9CQi5SKTt2YXIgYWJzUj1iMk1hdGguYjJBYnNNKFIpO3ZhciBoPWIyTWF0aC5iMk11bE1WKGFic1IsdGhpcy5tX2xvY2FsT0JCLmV4dGVudHMpO3ZhciBwb3NpdGlvbj1iMk1hdGguYjJNdWxNVih0aGlzLm1fUix0aGlzLm1fbG9jYWxPQkIuY2VudGVyKTtwb3NpdGlvbi5BZGQodGhpcy5tX3Bvc2l0aW9uKTt2YXIgYWFiYj1uZXcgYjJBQUJCKCk7YWFiYi5taW5WZXJ0ZXguU2V0Vihwb3NpdGlvbik7YWFiYi5taW5WZXJ0ZXguU3VidHJhY3QoaCk7YWFiYi5tYXhWZXJ0ZXguU2V0Vihwb3NpdGlvbik7YWFiYi5tYXhWZXJ0ZXguQWRkKGgpO2lmKGJyb2FkUGhhc2UuSW5SYW5nZShhYWJiKSkKe3RoaXMubV9wcm94eUlkPWJyb2FkUGhhc2UuQ3JlYXRlUHJveHkoYWFiYix0aGlzKTt9CmVsc2UKe3RoaXMubV9wcm94eUlkPWIyUGFpci5iMl9udWxsUHJveHk7fQppZih0aGlzLm1fcHJveHlJZD09YjJQYWlyLmIyX251bGxQcm94eSkKe3RoaXMubV9ib2R5LkZyZWV6ZSgpO319LFN1cHBvcnQ6ZnVuY3Rpb24oZFgsZFksb3V0KQp7dmFyIGRMb2NhbFg9KGRYKnRoaXMubV9SLmNvbDEueCtkWSp0aGlzLm1fUi5jb2wxLnkpO3ZhciBkTG9jYWxZPShkWCp0aGlzLm1fUi5jb2wyLngrZFkqdGhpcy5tX1IuY29sMi55KTt2YXIgYmVzdEluZGV4PTA7dmFyIGJlc3RWYWx1ZT0odGhpcy5tX2NvcmVWZXJ0aWNlc1swXS54KmRMb2NhbFgrdGhpcy5tX2NvcmVWZXJ0aWNlc1swXS55KmRMb2NhbFkpO2Zvcih2YXIgaT0xO2k8dGhpcy5tX3ZlcnRleENvdW50OysraSkKe3ZhciB2YWx1ZT0odGhpcy5tX2NvcmVWZXJ0aWNlc1tpXS54KmRMb2NhbFgrdGhpcy5tX2NvcmVWZXJ0aWNlc1tpXS55KmRMb2NhbFkpO2lmKHZhbHVlPmJlc3RWYWx1ZSkKe2Jlc3RJbmRleD1pO2Jlc3RWYWx1ZT12YWx1ZTt9fQpvdXQuU2V0KHRoaXMubV9wb3NpdGlvbi54Kyh0aGlzLm1fUi5jb2wxLngqdGhpcy5tX2NvcmVWZXJ0aWNlc1tiZXN0SW5kZXhdLngrdGhpcy5tX1IuY29sMi54KnRoaXMubV9jb3JlVmVydGljZXNbYmVzdEluZGV4XS55KSx0aGlzLm1fcG9zaXRpb24ueSsodGhpcy5tX1IuY29sMS55KnRoaXMubV9jb3JlVmVydGljZXNbYmVzdEluZGV4XS54K3RoaXMubV9SLmNvbDIueSp0aGlzLm1fY29yZVZlcnRpY2VzW2Jlc3RJbmRleF0ueSkpO30sbV9sb2NhbENlbnRyb2lkOm5ldyBiMlZlYzIoKSxtX2xvY2FsT0JCOm5ldyBiMk9CQigpLG1fdmVydGljZXM6bnVsbCxtX2NvcmVWZXJ0aWNlczpudWxsLG1fdmVydGV4Q291bnQ6MCxtX25vcm1hbHM6bnVsbH0pO2IyUG9seVNoYXBlLnRlbXBWZWM9bmV3IGIyVmVjMigpO2IyUG9seVNoYXBlLnRBYnNSPW5ldyBiMk1hdDIyKCk7CnZhciBiMkJvZHk9Q2xhc3MuY3JlYXRlKCk7YjJCb2R5LnByb3RvdHlwZT17U2V0T3JpZ2luUG9zaXRpb246ZnVuY3Rpb24ocG9zaXRpb24scm90YXRpb24pe2lmKHRoaXMuSXNGcm96ZW4oKSkKe3JldHVybjt9CnRoaXMubV9yb3RhdGlvbj1yb3RhdGlvbjt0aGlzLm1fUi5TZXQodGhpcy5tX3JvdGF0aW9uKTt0aGlzLm1fcG9zaXRpb249YjJNYXRoLkFkZFZWKHBvc2l0aW9uLGIyTWF0aC5iMk11bE1WKHRoaXMubV9SLHRoaXMubV9jZW50ZXIpKTt0aGlzLm1fcG9zaXRpb24wLlNldFYodGhpcy5tX3Bvc2l0aW9uKTt0aGlzLm1fcm90YXRpb24wPXRoaXMubV9yb3RhdGlvbjtmb3IodmFyIHM9dGhpcy5tX3NoYXBlTGlzdDtzIT1udWxsO3M9cy5tX25leHQpCntzLlN5bmNocm9uaXplKHRoaXMubV9wb3NpdGlvbix0aGlzLm1fUix0aGlzLm1fcG9zaXRpb24sdGhpcy5tX1IpO30KdGhpcy5tX3dvcmxkLm1fYnJvYWRQaGFzZS5Db21taXQoKTt9LEdldE9yaWdpblBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGIyTWF0aC5TdWJ0cmFjdFZWKHRoaXMubV9wb3NpdGlvbixiMk1hdGguYjJNdWxNVih0aGlzLm1fUix0aGlzLm1fY2VudGVyKSk7fSxTZXRDZW50ZXJQb3NpdGlvbjpmdW5jdGlvbihwb3NpdGlvbixyb3RhdGlvbil7aWYodGhpcy5Jc0Zyb3plbigpKQp7cmV0dXJuO30KdGhpcy5tX3JvdGF0aW9uPXJvdGF0aW9uO3RoaXMubV9SLlNldCh0aGlzLm1fcm90YXRpb24pO3RoaXMubV9wb3NpdGlvbi5TZXRWKHBvc2l0aW9uKTt0aGlzLm1fcG9zaXRpb24wLlNldFYodGhpcy5tX3Bvc2l0aW9uKTt0aGlzLm1fcm90YXRpb24wPXRoaXMubV9yb3RhdGlvbjtmb3IodmFyIHM9dGhpcy5tX3NoYXBlTGlzdDtzIT1udWxsO3M9cy5tX25leHQpCntzLlN5bmNocm9uaXplKHRoaXMubV9wb3NpdGlvbix0aGlzLm1fUix0aGlzLm1fcG9zaXRpb24sdGhpcy5tX1IpO30KdGhpcy5tX3dvcmxkLm1fYnJvYWRQaGFzZS5Db21taXQoKTt9LEdldENlbnRlclBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9wb3NpdGlvbjt9LEdldFJvdGF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9yb3RhdGlvbjt9LEdldFJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9SO30sU2V0TGluZWFyVmVsb2NpdHk6ZnVuY3Rpb24odil7dGhpcy5tX2xpbmVhclZlbG9jaXR5LlNldFYodik7fSxHZXRMaW5lYXJWZWxvY2l0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fbGluZWFyVmVsb2NpdHk7fSxTZXRBbmd1bGFyVmVsb2NpdHk6ZnVuY3Rpb24odyl7dGhpcy5tX2FuZ3VsYXJWZWxvY2l0eT13O30sR2V0QW5ndWxhclZlbG9jaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9hbmd1bGFyVmVsb2NpdHk7fSxBcHBseUZvcmNlOmZ1bmN0aW9uKGZvcmNlLHBvaW50KQp7aWYodGhpcy5Jc1NsZWVwaW5nKCk9PWZhbHNlKQp7dGhpcy5tX2ZvcmNlLkFkZChmb3JjZSk7dGhpcy5tX3RvcnF1ZSs9YjJNYXRoLmIyQ3Jvc3NWVihiMk1hdGguU3VidHJhY3RWVihwb2ludCx0aGlzLm1fcG9zaXRpb24pLGZvcmNlKTt9fSxBcHBseVRvcnF1ZTpmdW5jdGlvbih0b3JxdWUpCntpZih0aGlzLklzU2xlZXBpbmcoKT09ZmFsc2UpCnt0aGlzLm1fdG9ycXVlKz10b3JxdWU7fX0sQXBwbHlJbXB1bHNlOmZ1bmN0aW9uKGltcHVsc2UscG9pbnQpCntpZih0aGlzLklzU2xlZXBpbmcoKT09ZmFsc2UpCnt0aGlzLm1fbGluZWFyVmVsb2NpdHkuQWRkKGIyTWF0aC5NdWxGVih0aGlzLm1faW52TWFzcyxpbXB1bHNlKSk7dGhpcy5tX2FuZ3VsYXJWZWxvY2l0eSs9KHRoaXMubV9pbnZJKmIyTWF0aC5iMkNyb3NzVlYoYjJNYXRoLlN1YnRyYWN0VlYocG9pbnQsdGhpcy5tX3Bvc2l0aW9uKSxpbXB1bHNlKSk7fX0sR2V0TWFzczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fbWFzczt9LEdldEluZXJ0aWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX0k7fSxHZXRXb3JsZFBvaW50OmZ1bmN0aW9uKGxvY2FsUG9pbnQpe3JldHVybiBiMk1hdGguQWRkVlYodGhpcy5tX3Bvc2l0aW9uLGIyTWF0aC5iMk11bE1WKHRoaXMubV9SLGxvY2FsUG9pbnQpKTt9LEdldFdvcmxkVmVjdG9yOmZ1bmN0aW9uKGxvY2FsVmVjdG9yKXtyZXR1cm4gYjJNYXRoLmIyTXVsTVYodGhpcy5tX1IsbG9jYWxWZWN0b3IpO30sR2V0TG9jYWxQb2ludDpmdW5jdGlvbih3b3JsZFBvaW50KXtyZXR1cm4gYjJNYXRoLmIyTXVsVE1WKHRoaXMubV9SLGIyTWF0aC5TdWJ0cmFjdFZWKHdvcmxkUG9pbnQsdGhpcy5tX3Bvc2l0aW9uKSk7fSxHZXRMb2NhbFZlY3RvcjpmdW5jdGlvbih3b3JsZFZlY3Rvcil7cmV0dXJuIGIyTWF0aC5iMk11bFRNVih0aGlzLm1fUix3b3JsZFZlY3Rvcik7fSxJc1N0YXRpYzpmdW5jdGlvbigpe3JldHVybih0aGlzLm1fZmxhZ3MmYjJCb2R5LmVfc3RhdGljRmxhZyk9PWIyQm9keS5lX3N0YXRpY0ZsYWc7fSxJc0Zyb3plbjpmdW5jdGlvbigpCntyZXR1cm4odGhpcy5tX2ZsYWdzJmIyQm9keS5lX2Zyb3plbkZsYWcpPT1iMkJvZHkuZV9mcm96ZW5GbGFnO30sSXNTbGVlcGluZzpmdW5jdGlvbigpe3JldHVybih0aGlzLm1fZmxhZ3MmYjJCb2R5LmVfc2xlZXBGbGFnKT09YjJCb2R5LmVfc2xlZXBGbGFnO30sQWxsb3dTbGVlcGluZzpmdW5jdGlvbihmbGFnKQp7aWYoZmxhZykKe3RoaXMubV9mbGFnc3w9YjJCb2R5LmVfYWxsb3dTbGVlcEZsYWc7fQplbHNlCnt0aGlzLm1fZmxhZ3MmPX5iMkJvZHkuZV9hbGxvd1NsZWVwRmxhZzt0aGlzLldha2VVcCgpO319LFdha2VVcDpmdW5jdGlvbigpe3RoaXMubV9mbGFncyY9fmIyQm9keS5lX3NsZWVwRmxhZzt0aGlzLm1fc2xlZXBUaW1lPTAuMDt9LEdldFNoYXBlTGlzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fc2hhcGVMaXN0O30sR2V0Q29udGFjdExpc3Q6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMubV9jb250YWN0TGlzdDt9LEdldEpvaW50TGlzdDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5tX2pvaW50TGlzdDt9LEdldE5leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX25leHQ7fSxHZXRVc2VyRGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fdXNlckRhdGE7fSxpbml0aWFsaXplOmZ1bmN0aW9uKGJkLHdvcmxkKXt0aGlzLnNNYXQwPW5ldyBiMk1hdDIyKCk7dGhpcy5tX3Bvc2l0aW9uPW5ldyBiMlZlYzIoKTt0aGlzLm1fUj1uZXcgYjJNYXQyMigwKTt0aGlzLm1fcG9zaXRpb24wPW5ldyBiMlZlYzIoKTt2YXIgaT0wO3ZhciBzZDt2YXIgbWFzc0RhdGE7dGhpcy5tX2ZsYWdzPTA7dGhpcy5tX3Bvc2l0aW9uLlNldFYoYmQucG9zaXRpb24pO3RoaXMubV9yb3RhdGlvbj1iZC5yb3RhdGlvbjt0aGlzLm1fUi5TZXQodGhpcy5tX3JvdGF0aW9uKTt0aGlzLm1fcG9zaXRpb24wLlNldFYodGhpcy5tX3Bvc2l0aW9uKTt0aGlzLm1fcm90YXRpb24wPXRoaXMubV9yb3RhdGlvbjt0aGlzLm1fd29ybGQ9d29ybGQ7dGhpcy5tX2xpbmVhckRhbXBpbmc9YjJNYXRoLmIyQ2xhbXAoMS4wLWJkLmxpbmVhckRhbXBpbmcsMC4wLDEuMCk7dGhpcy5tX2FuZ3VsYXJEYW1waW5nPWIyTWF0aC5iMkNsYW1wKDEuMC1iZC5hbmd1bGFyRGFtcGluZywwLjAsMS4wKTt0aGlzLm1fZm9yY2U9bmV3IGIyVmVjMigwLjAsMC4wKTt0aGlzLm1fdG9ycXVlPTAuMDt0aGlzLm1fbWFzcz0wLjA7dmFyIG1hc3NEYXRhcz1uZXcgQXJyYXkoYjJTZXR0aW5ncy5iMl9tYXhTaGFwZXNQZXJCb2R5KTtmb3IoaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhTaGFwZXNQZXJCb2R5O2krKyl7bWFzc0RhdGFzW2ldPW5ldyBiMk1hc3NEYXRhKCk7fQp0aGlzLm1fc2hhcGVDb3VudD0wO3RoaXMubV9jZW50ZXI9bmV3IGIyVmVjMigwLjAsMC4wKTtmb3IoaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhTaGFwZXNQZXJCb2R5OysraSkKe3NkPWJkLnNoYXBlc1tpXTtpZihzZD09bnVsbClicmVhazttYXNzRGF0YT1tYXNzRGF0YXNbaV07c2QuQ29tcHV0ZU1hc3MobWFzc0RhdGEpO3RoaXMubV9tYXNzKz1tYXNzRGF0YS5tYXNzO3RoaXMubV9jZW50ZXIueCs9bWFzc0RhdGEubWFzcyooc2QubG9jYWxQb3NpdGlvbi54K21hc3NEYXRhLmNlbnRlci54KTt0aGlzLm1fY2VudGVyLnkrPW1hc3NEYXRhLm1hc3MqKHNkLmxvY2FsUG9zaXRpb24ueSttYXNzRGF0YS5jZW50ZXIueSk7Kyt0aGlzLm1fc2hhcGVDb3VudDt9CmlmKHRoaXMubV9tYXNzPjAuMCkKe3RoaXMubV9jZW50ZXIuTXVsdGlwbHkoMS4wL3RoaXMubV9tYXNzKTt0aGlzLm1fcG9zaXRpb24uQWRkKGIyTWF0aC5iMk11bE1WKHRoaXMubV9SLHRoaXMubV9jZW50ZXIpKTt9CmVsc2UKe3RoaXMubV9mbGFnc3w9YjJCb2R5LmVfc3RhdGljRmxhZzt9CnRoaXMubV9JPTAuMDtmb3IoaT0wO2k8dGhpcy5tX3NoYXBlQ291bnQ7KytpKQp7c2Q9YmQuc2hhcGVzW2ldO21hc3NEYXRhPW1hc3NEYXRhc1tpXTt0aGlzLm1fSSs9bWFzc0RhdGEuSTt2YXIgcj1iMk1hdGguU3VidHJhY3RWVihiMk1hdGguQWRkVlYoc2QubG9jYWxQb3NpdGlvbixtYXNzRGF0YS5jZW50ZXIpLHRoaXMubV9jZW50ZXIpO3RoaXMubV9JKz1tYXNzRGF0YS5tYXNzKmIyTWF0aC5iMkRvdChyLHIpO30KaWYodGhpcy5tX21hc3M|TnVtYmVyLk1JTl9WQUxVRSkKe3VYKj0xLjAvbGVuZ3RoO3VZKj0xLjAvbGVuZ3RoO30KdGhpcy5tX2NvcmVWZXJ0aWNlc1tpXS54PXRoaXMubV92ZXJ0aWNlc1tpXS54LTIuMCpiMlNldHRpbmdzLmIyX2xpbmVhclNsb3AqdVg7dGhpcy5tX2NvcmVWZXJ0aWNlc1tpXS55PXRoaXMubV92ZXJ0aWNlc1tpXS55LTIuMCpiMlNldHRpbmdzLmIyX2xpbmVhclNsb3AqdVk7fX0KdmFyIG1pblZlcnRleFg9TnVtYmVyLk1BWF9WQUxVRTt2YXIgbWluVmVydGV4WT1OdW1iZXIuTUFYX1ZBTFVFO3ZhciBtYXhWZXJ0ZXhYPS1OdW1iZXIuTUFYX1ZBTFVFO3ZhciBtYXhWZXJ0ZXhZPS1OdW1iZXIuTUFYX1ZBTFVFO3RoaXMubV9tYXhSYWRpdXM9MC4wO2ZvcihpPTA7aTx0aGlzLm1fdmVydGV4Q291bnQ7KytpKQp7dmFyIHY9dGhpcy5tX3ZlcnRpY2VzW2ldO21pblZlcnRleFg9TWF0aC5taW4obWluVmVydGV4WCx2LngpO21pblZlcnRleFk9TWF0aC5taW4obWluVmVydGV4WSx2LnkpO21heFZlcnRleFg9TWF0aC5tYXgobWF4VmVydGV4WCx2LngpO21heFZlcnRleFk9TWF0aC5tYXgobWF4VmVydGV4WSx2LnkpO3RoaXMubV9tYXhSYWRpdXM9TWF0aC5tYXgodGhpcy5tX21heFJhZGl1cyx2Lkxlbmd0aCgpKTt9CnRoaXMubV9sb2NhbE9CQi5SLlNldElkZW50aXR5KCk7dGhpcy5tX2xvY2FsT0JCLmNlbnRlci5TZXQoKG1pblZlcnRleFgrbWF4VmVydGV4WCkqMC41LChtaW5WZXJ0ZXhZK21heFZlcnRleFkpKjAuNSk7dGhpcy5tX2xvY2FsT0JCLmV4dGVudHMuU2V0KChtYXhWZXJ0ZXhYLW1pblZlcnRleFgpKjAuNSwobWF4VmVydGV4WS1taW5WZXJ0ZXhZKSowLjUpO3ZhciBpMT0wO3ZhciBpMj0wO2ZvcihpPTA7aTx0aGlzLm1fdmVydGV4Q291bnQ7KytpKQp7dGhpcy5tX25vcm1hbHNbaV09bmV3IGIyVmVjMigpO2kxPWk7aTI9aSsxPHRoaXMubV92ZXJ0ZXhDb3VudD9pKzE6MDt0aGlzLm1fbm9ybWFsc1tpXS54PXRoaXMubV92ZXJ0aWNlc1tpMl0ueS10aGlzLm1fdmVydGljZXNbaTFdLnk7dGhpcy5tX25vcm1hbHNbaV0ueT0tKHRoaXMubV92ZXJ0aWNlc1tpMl0ueC10aGlzLm1fdmVydGljZXNbaTFdLngpO3RoaXMubV9ub3JtYWxzW2ldLk5vcm1hbGl6ZSgpO30KZm9yKGk9MDtpPHRoaXMubV92ZXJ0ZXhDb3VudDsrK2kpCntpMT1pO2kyPWkrMTx0aGlzLm1fdmVydGV4Q291bnQ|PTAuMCkKe3ZhciBsYW1iZGE9dW4vKHVuK3VkKTtwMU91dC54PXAxc1sxXS54K2xhbWJkYSoocDFzWzJdLngtcDFzWzFdLngpO3AxT3V0Lnk9cDFzWzFdLnkrbGFtYmRhKihwMXNbMl0ueS1wMXNbMV0ueSk7cDJPdXQueD1wMnNbMV0ueCtsYW1iZGEqKHAyc1syXS54LXAyc1sxXS54KTtwMk91dC55PXAyc1sxXS55K2xhbWJkYSoocDJzWzJdLnktcDJzWzFdLnkpO3Axc1swXS5TZXRWKHAxc1syXSk7cDJzWzBdLlNldFYocDJzWzJdKTtwb2ludHNbMF0uU2V0Vihwb2ludHNbMl0pO3JldHVybiAyO30KdmFyIHZiPW4qKGNYKmFZLWNZKmFYKTtpZih2Yjw9MC4wJiZ0bj49MC4wJiZ0ZD49MC4wKQp7dmFyIGxhbWJkYT10bi8odG4rdGQpO3AxT3V0Lng9cDFzWzBdLngrbGFtYmRhKihwMXNbMl0ueC1wMXNbMF0ueCk7cDFPdXQueT1wMXNbMF0ueStsYW1iZGEqKHAxc1syXS55LXAxc1swXS55KTtwMk91dC54PXAyc1swXS54K2xhbWJkYSoocDJzWzJdLngtcDJzWzBdLngpO3AyT3V0Lnk9cDJzWzBdLnkrbGFtYmRhKihwMnNbMl0ueS1wMnNbMF0ueSk7cDFzWzFdLlNldFYocDFzWzJdKTtwMnNbMV0uU2V0VihwMnNbMl0pO3BvaW50c1sxXS5TZXRWKHBvaW50c1syXSk7cmV0dXJuIDI7fQp2YXIgZGVub209dmErdmIrdmM7ZGVub209MS4wL2Rlbm9tO3ZhciB1PXZhKmRlbm9tO3ZhciB2PXZiKmRlbm9tO3ZhciB3PTEuMC11LXY7cDFPdXQueD11KnAxc1swXS54K3YqcDFzWzFdLngrdypwMXNbMl0ueDtwMU91dC55PXUqcDFzWzBdLnkrdipwMXNbMV0ueSt3KnAxc1syXS55O3AyT3V0Lng9dSpwMnNbMF0ueCt2KnAyc1sxXS54K3cqcDJzWzJdLng7cDJPdXQueT11KnAyc1swXS55K3YqcDJzWzFdLnkrdypwMnNbMl0ueTtyZXR1cm4gMzt9O2IyRGlzdGFuY2UuSW5Qb2luc3RzPWZ1bmN0aW9uKHcscG9pbnRzLHBvaW50Q291bnQpCntmb3IodmFyIGk9MDtpPHBvaW50Q291bnQ7KytpKQp7aWYody54PT1wb2ludHNbaV0ueCYmdy55PT1wb2ludHNbaV0ueSkKe3JldHVybiB0cnVlO319CnJldHVybiBmYWxzZTt9O2IyRGlzdGFuY2UuRGlzdGFuY2U9ZnVuY3Rpb24ocDFPdXQscDJPdXQsc2hhcGUxLHNoYXBlMikKe3ZhciBwMXM9bmV3IEFycmF5KDMpO3ZhciBwMnM9bmV3IEFycmF5KDMpO3ZhciBwb2ludHM9bmV3IEFycmF5KDMpO3ZhciBwb2ludENvdW50PTA7cDFPdXQuU2V0VihzaGFwZTEubV9wb3NpdGlvbik7cDJPdXQuU2V0VihzaGFwZTIubV9wb3NpdGlvbik7dmFyIHZTcXI9MC4wO3ZhciBtYXhJdGVyYXRpb25zPTIwO2Zvcih2YXIgaXRlcj0wO2l0ZXI8bWF4SXRlcmF0aW9uczsrK2l0ZXIpCnt2YXIgdlg9cDJPdXQueC1wMU91dC54O3ZhciB2WT1wMk91dC55LXAxT3V0Lnk7dmFyIHcxPXNoYXBlMS5TdXBwb3J0KHZYLHZZKTt2YXIgdzI9c2hhcGUyLlN1cHBvcnQoLXZYLC12WSk7dlNxcj0odlgqdlgrdlkqdlkpO3ZhciB3WD13Mi54LXcxLng7dmFyIHdZPXcyLnktdzEueTt2YXIgdnc9KHZYKndYK3ZZKndZKTtpZih2U3FyLWIyRG90KHZYKndYK3ZZKndZKTw9MC4wMSp2U3FyKQp7aWYocG9pbnRDb3VudD09MCkKe3AxT3V0LlNldFYodzEpO3AyT3V0LlNldFYodzIpO30KYjJEaXN0YW5jZS5nX0dKS19JdGVyYXRpb25zPWl0ZXI7cmV0dXJuIE1hdGguc3FydCh2U3FyKTt9CnN3aXRjaChwb2ludENvdW50KQp7Y2FzZSAwOnAxc1swXS5TZXRWKHcxKTtwMnNbMF0uU2V0Vih3Mik7cG9pbnRzWzBdPXc7cDFPdXQuU2V0VihwMXNbMF0pO3AyT3V0LlNldFYocDJzWzBdKTsrK3BvaW50Q291bnQ7YnJlYWs7Y2FzZSAxOnAxc1sxXS5TZXRWKHcxKTtwMnNbMV0uU2V0Vih3Mik7cG9pbnRzWzFdLng9d1g7cG9pbnRzWzFdLnk9d1k7cG9pbnRDb3VudD1iMkRpc3RhbmNlLlByb2Nlc3NUd28ocDFPdXQscDJPdXQscDFzLHAycyxwb2ludHMpO2JyZWFrO2Nhc2UgMjpwMXNbMl0uU2V0Vih3MSk7cDJzWzJdLlNldFYodzIpO3BvaW50c1syXS54PXdYO3BvaW50c1syXS55PXdZO3BvaW50Q291bnQ9YjJEaXN0YW5jZS5Qcm9jZXNzVGhyZWUocDFPdXQscDJPdXQscDFzLHAycyxwb2ludHMpO2JyZWFrO30KaWYocG9pbnRDb3VudD09MykKe2IyRGlzdGFuY2UuZ19HSktfSXRlcmF0aW9ucz1pdGVyO3JldHVybiAwLjA7fQp2YXIgbWF4U3FyPS1OdW1iZXIuTUFYX1ZBTFVFO2Zvcih2YXIgaT0wO2k8cG9pbnRDb3VudDsrK2kpCnttYXhTcXI9YjJNYXRoLmIyTWF4KG1heFNxciwocG9pbnRzW2ldLngqcG9pbnRzW2ldLngrcG9pbnRzW2ldLnkqcG9pbnRzW2ldLnkpKTt9CmlmKHBvaW50Q291bnQ9PTN8fHZTcXI8PTEwMC4wKk51bWJlci5NSU5fVkFMVUUqbWF4U3FyKQp7YjJEaXN0YW5jZS5nX0dKS19JdGVyYXRpb25zPWl0ZXI7cmV0dXJuIE1hdGguc3FydCh2U3FyKTt9fQpiMkRpc3RhbmNlLmdfR0pLX0l0ZXJhdGlvbnM9bWF4SXRlcmF0aW9ucztyZXR1cm4gTWF0aC5zcXJ0KHZTcXIpO307YjJEaXN0YW5jZS5nX0dKS19JdGVyYXRpb25zPTA7CnZhciBiMk1hbmlmb2xkPUNsYXNzLmNyZWF0ZSgpO2IyTWFuaWZvbGQucHJvdG90eXBlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5wb2ludHM9bmV3IEFycmF5KGIyU2V0dGluZ3MuYjJfbWF4TWFuaWZvbGRQb2ludHMpO2Zvcih2YXIgaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhNYW5pZm9sZFBvaW50cztpKyspe3RoaXMucG9pbnRzW2ldPW5ldyBiMkNvbnRhY3RQb2ludCgpO30KdGhpcy5ub3JtYWw9bmV3IGIyVmVjMigpO30scG9pbnRzOm51bGwsbm9ybWFsOm51bGwscG9pbnRDb3VudDowfTsKdmFyIGIyT0JCPUNsYXNzLmNyZWF0ZSgpO2IyT0JCLnByb3RvdHlwZT17UjpuZXcgYjJNYXQyMigpLGNlbnRlcjpuZXcgYjJWZWMyKCksZXh0ZW50czpuZXcgYjJWZWMyKCksaW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuUj1uZXcgYjJNYXQyMigpO3RoaXMuY2VudGVyPW5ldyBiMlZlYzIoKTt0aGlzLmV4dGVudHM9bmV3IGIyVmVjMigpO319Owp2YXIgYjJQcm94eT1DbGFzcy5jcmVhdGUoKTtiMlByb3h5LnByb3RvdHlwZT17R2V0TmV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvd2VyQm91bmRzWzBdO30sU2V0TmV4dDpmdW5jdGlvbihuZXh0KXt0aGlzLmxvd2VyQm91bmRzWzBdPW5leHQ7fSxJc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmxhcENvdW50IT1iMkJyb2FkUGhhc2UuYjJfaW52YWxpZDt9LGxvd2VyQm91bmRzOlsoMCksKDApXSx1cHBlckJvdW5kczpbKDApLCgwKV0sb3ZlcmxhcENvdW50OjAsdGltZVN0YW1wOjAsdXNlckRhdGE6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5sb3dlckJvdW5kcz1bKDApLCgwKV07dGhpcy51cHBlckJvdW5kcz1bKDApLCgwKV07fX0KdmFyIENsaXBWZXJ0ZXg9Q2xhc3MuY3JlYXRlKCk7Q2xpcFZlcnRleC5wcm90b3R5cGU9e3Y6bmV3IGIyVmVjMigpLGlkOm5ldyBiMkNvbnRhY3RJRCgpLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLnY9bmV3IGIyVmVjMigpO3RoaXMuaWQ9bmV3IGIyQ29udGFjdElEKCk7fX07dmFyIGIyU2hhcGU9Q2xhc3MuY3JlYXRlKCk7YjJTaGFwZS5wcm90b3R5cGU9e1Rlc3RQb2ludDpmdW5jdGlvbihwKXtyZXR1cm4gZmFsc2V9LEdldFVzZXJEYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV91c2VyRGF0YTt9LEdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX3R5cGU7fSxHZXRCb2R5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubV9ib2R5O30sR2V0UG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX3Bvc2l0aW9uO30sR2V0Um90YXRpb25NYXRyaXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX1I7fSxSZXNldFByb3h5OmZ1bmN0aW9uKGJyb2FkUGhhc2Upe30sR2V0TmV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fbmV4dDt9LGluaXRpYWxpemU6ZnVuY3Rpb24oZGVmLGJvZHkpe3RoaXMubV9SPW5ldyBiMk1hdDIyKCk7dGhpcy5tX3Bvc2l0aW9uPW5ldyBiMlZlYzIoKTt0aGlzLm1fdXNlckRhdGE9ZGVmLnVzZXJEYXRhO3RoaXMubV9mcmljdGlvbj1kZWYuZnJpY3Rpb247dGhpcy5tX3Jlc3RpdHV0aW9uPWRlZi5yZXN0aXR1dGlvbjt0aGlzLm1fYm9keT1ib2R5O3RoaXMubV9wcm94eUlkPWIyUGFpci5iMl9udWxsUHJveHk7dGhpcy5tX21heFJhZGl1cz0wLjA7dGhpcy5tX2NhdGVnb3J5Qml0cz1kZWYuY2F0ZWdvcnlCaXRzO3RoaXMubV9tYXNrQml0cz1kZWYubWFza0JpdHM7dGhpcy5tX2dyb3VwSW5kZXg9ZGVmLmdyb3VwSW5kZXg7fSxEZXN0cm95UHJveHk6ZnVuY3Rpb24oKQp7aWYodGhpcy5tX3Byb3h5SWQhPWIyUGFpci5iMl9udWxsUHJveHkpCnt0aGlzLm1fYm9keS5tX3dvcmxkLm1fYnJvYWRQaGFzZS5EZXN0cm95UHJveHkodGhpcy5tX3Byb3h5SWQpO3RoaXMubV9wcm94eUlkPWIyUGFpci5iMl9udWxsUHJveHk7fX0sU3luY2hyb25pemU6ZnVuY3Rpb24ocG9zaXRpb24xLFIxLHBvc2l0aW9uMixSMil7fSxRdWlja1N5bmM6ZnVuY3Rpb24ocG9zaXRpb24sUil7fSxTdXBwb3J0OmZ1bmN0aW9uKGRYLGRZLG91dCl7fSxHZXRNYXhSYWRpdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX21heFJhZGl1czt9LG1fbmV4dDpudWxsLG1fUjpuZXcgYjJNYXQyMigpLG1fcG9zaXRpb246bmV3IGIyVmVjMigpLG1fdHlwZTowLG1fdXNlckRhdGE6bnVsbCxtX2JvZHk6bnVsbCxtX2ZyaWN0aW9uOm51bGwsbV9yZXN0aXR1dGlvbjpudWxsLG1fbWF4UmFkaXVzOm51bGwsbV9wcm94eUlkOjAsbV9jYXRlZ29yeUJpdHM6MCxtX21hc2tCaXRzOjAsbV9ncm91cEluZGV4OjB9O2IyU2hhcGUuQ3JlYXRlPWZ1bmN0aW9uKGRlZixib2R5LGNlbnRlcil7c3dpdGNoKGRlZi50eXBlKQp7Y2FzZSBiMlNoYXBlLmVfY2lyY2xlU2hhcGU6e3JldHVybiBuZXcgYjJDaXJjbGVTaGFwZShkZWYsYm9keSxjZW50ZXIpO30KY2FzZSBiMlNoYXBlLmVfYm94U2hhcGU6Y2FzZSBiMlNoYXBlLmVfcG9seVNoYXBlOntyZXR1cm4gbmV3IGIyUG9seVNoYXBlKGRlZixib2R5LGNlbnRlcik7fX0KcmV0dXJuIG51bGw7fTtiMlNoYXBlLkRlc3Ryb3k9ZnVuY3Rpb24oc2hhcGUpCntpZihzaGFwZS5tX3Byb3h5SWQhPWIyUGFpci5iMl9udWxsUHJveHkpCnNoYXBlLm1fYm9keS5tX3dvcmxkLm1fYnJvYWRQaGFzZS5EZXN0cm95UHJveHkoc2hhcGUubV9wcm94eUlkKTt9O2IyU2hhcGUuZV91bmtub3duU2hhcGU9LTE7YjJTaGFwZS5lX2NpcmNsZVNoYXBlPTA7YjJTaGFwZS5lX2JveFNoYXBlPTE7YjJTaGFwZS5lX3BvbHlTaGFwZT0yO2IyU2hhcGUuZV9tZXNoU2hhcGU9MztiMlNoYXBlLmVfc2hhcGVUeXBlQ291bnQ9NDtiMlNoYXBlLlBvbHlNYXNzPWZ1bmN0aW9uKG1hc3NEYXRhLHZzLGNvdW50LHJobykKe3ZhciBjZW50ZXI9bmV3IGIyVmVjMigpO2NlbnRlci5TZXRaZXJvKCk7dmFyIGFyZWE9MC4wO3ZhciBJPTAuMDt2YXIgcFJlZj1uZXcgYjJWZWMyKDAuMCwwLjApO3ZhciBpbnYzPTEuMC8zLjA7Zm9yKHZhciBpPTA7aTxjb3VudDsrK2kpCnt2YXIgcDE9cFJlZjt2YXIgcDI9dnNbaV07dmFyIHAzPWkrMTxjb3VudD92c1tpKzFdOnZzWzBdO3ZhciBlMT1iMk1hdGguU3VidHJhY3RWVihwMixwMSk7dmFyIGUyPWIyTWF0aC5TdWJ0cmFjdFZWKHAzLHAxKTt2YXIgRD1iMk1hdGguYjJDcm9zc1ZWKGUxLGUyKTt2YXIgdHJpYW5nbGVBcmVhPTAuNSpEO2FyZWErPXRyaWFuZ2xlQXJlYTt2YXIgdFZlYz1uZXcgYjJWZWMyKCk7dFZlYy5TZXRWKHAxKTt0VmVjLkFkZChwMik7dFZlYy5BZGQocDMpO3RWZWMuTXVsdGlwbHkoaW52Myp0cmlhbmdsZUFyZWEpO2NlbnRlci5BZGQodFZlYyk7dmFyIHB4PXAxLng7dmFyIHB5PXAxLnk7dmFyIGV4MT1lMS54O3ZhciBleTE9ZTEueTt2YXIgZXgyPWUyLng7dmFyIGV5Mj1lMi55O3ZhciBpbnR4Mj1pbnYzKigwLjI1KihleDEqZXgxK2V4MipleDErZXgyKmV4MikrKHB4KmV4MStweCpleDIpKSswLjUqcHgqcHg7dmFyIGludHkyPWludjMqKDAuMjUqKGV5MSpleTErZXkyKmV5MStleTIqZXkyKSsocHkqZXkxK3B5KmV5MikpKzAuNSpweSpweTtJKz1EKihpbnR4MitpbnR5Mik7fQptYXNzRGF0YS5tYXNzPXJobyphcmVhO2NlbnRlci5NdWx0aXBseSgxLjAvYXJlYSk7bWFzc0RhdGEuY2VudGVyPWNlbnRlcjtJPXJobyooSS1hcmVhKmIyTWF0aC5iMkRvdChjZW50ZXIsY2VudGVyKSk7bWFzc0RhdGEuST1JO307YjJTaGFwZS5Qb2x5Q2VudHJvaWQ9ZnVuY3Rpb24odnMsY291bnQsb3V0KQp7dmFyIGNYPTAuMDt2YXIgY1k9MC4wO3ZhciBhcmVhPTAuMDt2YXIgcFJlZlg9MC4wO3ZhciBwUmVmWT0wLjA7dmFyIGludjM9MS4wLzMuMDtmb3IodmFyIGk9MDtpPGNvdW50OysraSkKe3ZhciBwMVg9cFJlZlg7dmFyIHAxWT1wUmVmWTt2YXIgcDJYPXZzW2ldLng7dmFyIHAyWT12c1tpXS55O3ZhciBwM1g9aSsxPGNvdW50P3ZzW2krMV0ueDp2c1swXS54O3ZhciBwM1k9aSsxPGNvdW50P3ZzW2krMV0ueTp2c1swXS55O3ZhciBlMVg9cDJYLXAxWDt2YXIgZTFZPXAyWS1wMVk7dmFyIGUyWD1wM1gtcDFYO3ZhciBlMlk9cDNZLXAxWTt2YXIgRD0oZTFYKmUyWS1lMVkqZTJYKTt2YXIgdHJpYW5nbGVBcmVhPTAuNSpEO2FyZWErPXRyaWFuZ2xlQXJlYTtjWCs9dHJpYW5nbGVBcmVhKmludjMqKHAxWCtwMlgrcDNYKTtjWSs9dHJpYW5nbGVBcmVhKmludjMqKHAxWStwMlkrcDNZKTt9CmNYKj0xLjAvYXJlYTtjWSo9MS4wL2FyZWE7b3V0LlNldChjWCxjWSk7fTsKdmFyIGIyU2hhcGVEZWY9Q2xhc3MuY3JlYXRlKCk7YjJTaGFwZURlZi5wcm90b3R5cGU9e2luaXRpYWxpemU6ZnVuY3Rpb24oKQp7dGhpcy50eXBlPWIyU2hhcGUuZV91bmtub3duU2hhcGU7dGhpcy51c2VyRGF0YT1udWxsO3RoaXMubG9jYWxQb3NpdGlvbj1uZXcgYjJWZWMyKDAuMCwwLjApO3RoaXMubG9jYWxSb3RhdGlvbj0wLjA7dGhpcy5mcmljdGlvbj0wLjI7dGhpcy5yZXN0aXR1dGlvbj0wLjA7dGhpcy5kZW5zaXR5PTAuMDt0aGlzLmNhdGVnb3J5Qml0cz0weDAwMDE7dGhpcy5tYXNrQml0cz0weEZGRkY7dGhpcy5ncm91cEluZGV4PTA7fSxDb21wdXRlTWFzczpmdW5jdGlvbihtYXNzRGF0YSkKe21hc3NEYXRhLmNlbnRlcj1uZXcgYjJWZWMyKDAuMCwwLjApCmlmKHRoaXMuZGVuc2l0eT09MC4wKQp7bWFzc0RhdGEubWFzcz0wLjA7bWFzc0RhdGEuY2VudGVyLlNldCgwLjAsMC4wKTttYXNzRGF0YS5JPTAuMDt9O3N3aXRjaCh0aGlzLnR5cGUpCntjYXNlIGIyU2hhcGUuZV9jaXJjbGVTaGFwZTp7dmFyIGNpcmNsZT10aGlzO21hc3NEYXRhLm1hc3M9dGhpcy5kZW5zaXR5KmIyU2V0dGluZ3MuYjJfcGkqY2lyY2xlLnJhZGl1cypjaXJjbGUucmFkaXVzO21hc3NEYXRhLmNlbnRlci5TZXQoMC4wLDAuMCk7bWFzc0RhdGEuST0wLjUqKG1hc3NEYXRhLm1hc3MpKmNpcmNsZS5yYWRpdXMqY2lyY2xlLnJhZGl1czt9CmJyZWFrO2Nhc2UgYjJTaGFwZS5lX2JveFNoYXBlOnt2YXIgYm94PXRoaXM7bWFzc0RhdGEubWFzcz00LjAqdGhpcy5kZW5zaXR5KmJveC5leHRlbnRzLngqYm94LmV4dGVudHMueTttYXNzRGF0YS5jZW50ZXIuU2V0KDAuMCwwLjApO21hc3NEYXRhLkk9bWFzc0RhdGEubWFzcy8zLjAqYjJNYXRoLmIyRG90KGJveC5leHRlbnRzLGJveC5leHRlbnRzKTt9CmJyZWFrO2Nhc2UgYjJTaGFwZS5lX3BvbHlTaGFwZTp7dmFyIHBvbHk9dGhpcztiMlNoYXBlLlBvbHlNYXNzKG1hc3NEYXRhLHBvbHkudmVydGljZXMscG9seS52ZXJ0ZXhDb3VudCx0aGlzLmRlbnNpdHkpO30KYnJlYWs7ZGVmYXVsdDptYXNzRGF0YS5tYXNzPTAuMDttYXNzRGF0YS5jZW50ZXIuU2V0KDAuMCwwLjApO21hc3NEYXRhLkk9MC4wO2JyZWFrO319LHR5cGU6MCx1c2VyRGF0YTpudWxsLGxvY2FsUG9zaXRpb246bnVsbCxsb2NhbFJvdGF0aW9uOm51bGwsZnJpY3Rpb246bnVsbCxyZXN0aXR1dGlvbjpudWxsLGRlbnNpdHk6bnVsbCxjYXRlZ29yeUJpdHM6MCxtYXNrQml0czowLGdyb3VwSW5kZXg6MH07CnZhciBiMkJveERlZj1DbGFzcy5jcmVhdGUoKTtPYmplY3QuZXh0ZW5kKGIyQm94RGVmLnByb3RvdHlwZSxiMlNoYXBlRGVmLnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMkJveERlZi5wcm90b3R5cGUse2luaXRpYWxpemU6ZnVuY3Rpb24oKQp7dGhpcy50eXBlPWIyU2hhcGUuZV91bmtub3duU2hhcGU7dGhpcy51c2VyRGF0YT1udWxsO3RoaXMubG9jYWxQb3NpdGlvbj1uZXcgYjJWZWMyKDAuMCwwLjApO3RoaXMubG9jYWxSb3RhdGlvbj0wLjA7dGhpcy5mcmljdGlvbj0wLjI7dGhpcy5yZXN0aXR1dGlvbj0wLjA7dGhpcy5kZW5zaXR5PTAuMDt0aGlzLmNhdGVnb3J5Qml0cz0weDAwMDE7dGhpcy5tYXNrQml0cz0weEZGRkY7dGhpcy5ncm91cEluZGV4PTA7dGhpcy50eXBlPWIyU2hhcGUuZV9ib3hTaGFwZTt0aGlzLmV4dGVudHM9bmV3IGIyVmVjMigxLjAsMS4wKTt9LGV4dGVudHM6bnVsbH0pOwp2YXIgYjJDaXJjbGVEZWY9Q2xhc3MuY3JlYXRlKCk7T2JqZWN0LmV4dGVuZChiMkNpcmNsZURlZi5wcm90b3R5cGUsYjJTaGFwZURlZi5wcm90b3R5cGUpO09iamVjdC5leHRlbmQoYjJDaXJjbGVEZWYucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCkKe3RoaXMudHlwZT1iMlNoYXBlLmVfdW5rbm93blNoYXBlO3RoaXMudXNlckRhdGE9bnVsbDt0aGlzLmxvY2FsUG9zaXRpb249bmV3IGIyVmVjMigwLjAsMC4wKTt0aGlzLmxvY2FsUm90YXRpb249MC4wO3RoaXMuZnJpY3Rpb249MC4yO3RoaXMucmVzdGl0dXRpb249MC4wO3RoaXMuZGVuc2l0eT0wLjA7dGhpcy5jYXRlZ29yeUJpdHM9MHgwMDAxO3RoaXMubWFza0JpdHM9MHhGRkZGO3RoaXMuZ3JvdXBJbmRleD0wO3RoaXMudHlwZT1iMlNoYXBlLmVfY2lyY2xlU2hhcGU7dGhpcy5yYWRpdXM9MS4wO30scmFkaXVzOm51bGx9KTt2YXIgYjJDaXJjbGVTaGFwZT1DbGFzcy5jcmVhdGUoKTtPYmplY3QuZXh0ZW5kKGIyQ2lyY2xlU2hhcGUucHJvdG90eXBlLGIyU2hhcGUucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyQ2lyY2xlU2hhcGUucHJvdG90eXBlLHtUZXN0UG9pbnQ6ZnVuY3Rpb24ocCl7dmFyIGQ9bmV3IGIyVmVjMigpO2QuU2V0VihwKTtkLlN1YnRyYWN0KHRoaXMubV9wb3NpdGlvbik7cmV0dXJuIGIyTWF0aC5iMkRvdChkLGQpPD10aGlzLm1fcmFkaXVzKnRoaXMubV9yYWRpdXM7fSxpbml0aWFsaXplOmZ1bmN0aW9uKGRlZixib2R5LGxvY2FsQ2VudGVyKXt0aGlzLm1fUj1uZXcgYjJNYXQyMigpO3RoaXMubV9wb3NpdGlvbj1uZXcgYjJWZWMyKCk7dGhpcy5tX3VzZXJEYXRhPWRlZi51c2VyRGF0YTt0aGlzLm1fZnJpY3Rpb249ZGVmLmZyaWN0aW9uO3RoaXMubV9yZXN0aXR1dGlvbj1kZWYucmVzdGl0dXRpb247dGhpcy5tX2JvZHk9Ym9keTt0aGlzLm1fcHJveHlJZD1iMlBhaXIuYjJfbnVsbFByb3h5O3RoaXMubV9tYXhSYWRpdXM9MC4wO3RoaXMubV9jYXRlZ29yeUJpdHM9ZGVmLmNhdGVnb3J5Qml0czt0aGlzLm1fbWFza0JpdHM9ZGVmLm1hc2tCaXRzO3RoaXMubV9ncm91cEluZGV4PWRlZi5ncm91cEluZGV4O3RoaXMubV9sb2NhbFBvc2l0aW9uPW5ldyBiMlZlYzIoKTt2YXIgY2lyY2xlPWRlZjt0aGlzLm1fbG9jYWxQb3NpdGlvbi5TZXQoZGVmLmxvY2FsUG9zaXRpb24ueC1sb2NhbENlbnRlci54LGRlZi5sb2NhbFBvc2l0aW9uLnktbG9jYWxDZW50ZXIueSk7dGhpcy5tX3R5cGU9YjJTaGFwZS5lX2NpcmNsZVNoYXBlO3RoaXMubV9yYWRpdXM9Y2lyY2xlLnJhZGl1czt0aGlzLm1fUi5TZXRNKHRoaXMubV9ib2R5Lm1fUik7dmFyIHJYPXRoaXMubV9SLmNvbDEueCp0aGlzLm1fbG9jYWxQb3NpdGlvbi54K3RoaXMubV9SLmNvbDIueCp0aGlzLm1fbG9jYWxQb3NpdGlvbi55O3ZhciByWT10aGlzLm1fUi5jb2wxLnkqdGhpcy5tX2xvY2FsUG9zaXRpb24ueCt0aGlzLm1fUi5jb2wyLnkqdGhpcy5tX2xvY2FsUG9zaXRpb24ueTt0aGlzLm1fcG9zaXRpb24ueD10aGlzLm1fYm9keS5tX3Bvc2l0aW9uLngrclg7dGhpcy5tX3Bvc2l0aW9uLnk9dGhpcy5tX2JvZHkubV9wb3NpdGlvbi55K3JZO3RoaXMubV9tYXhSYWRpdXM9TWF0aC5zcXJ0KHJYKnJYK3JZKnJZKSt0aGlzLm1fcmFkaXVzO3ZhciBhYWJiPW5ldyBiMkFBQkIoKTthYWJiLm1pblZlcnRleC5TZXQodGhpcy5tX3Bvc2l0aW9uLngtdGhpcy5tX3JhZGl1cyx0aGlzLm1fcG9zaXRpb24ueS10aGlzLm1fcmFkaXVzKTthYWJiLm1heFZlcnRleC5TZXQodGhpcy5tX3Bvc2l0aW9uLngrdGhpcy5tX3JhZGl1cyx0aGlzLm1fcG9zaXRpb24ueSt0aGlzLm1fcmFkaXVzKTt2YXIgYnJvYWRQaGFzZT10aGlzLm1fYm9keS5tX3dvcmxkLm1fYnJvYWRQaGFzZTtpZihicm9hZFBoYXNlLkluUmFuZ2UoYWFiYikpCnt0aGlzLm1fcHJveHlJZD1icm9hZFBoYXNlLkNyZWF0ZVByb3h5KGFhYmIsdGhpcyk7fQplbHNlCnt0aGlzLm1fcHJveHlJZD1iMlBhaXIuYjJfbnVsbFByb3h5O30KaWYodGhpcy5tX3Byb3h5SWQ9PWIyUGFpci5iMl9udWxsUHJveHkpCnt0aGlzLm1fYm9keS5GcmVlemUoKTt9fSxTeW5jaHJvbml6ZTpmdW5jdGlvbihwb3NpdGlvbjEsUjEscG9zaXRpb24yLFIyKXt0aGlzLm1fUi5TZXRNKFIyKTt0aGlzLm1fcG9zaXRpb24ueD0oUjIuY29sMS54KnRoaXMubV9sb2NhbFBvc2l0aW9uLngrUjIuY29sMi54KnRoaXMubV9sb2NhbFBvc2l0aW9uLnkpK3Bvc2l0aW9uMi54O3RoaXMubV9wb3NpdGlvbi55PShSMi5jb2wxLnkqdGhpcy5tX2xvY2FsUG9zaXRpb24ueCtSMi5jb2wyLnkqdGhpcy5tX2xvY2FsUG9zaXRpb24ueSkrcG9zaXRpb24yLnk7aWYodGhpcy5tX3Byb3h5SWQ9PWIyUGFpci5iMl9udWxsUHJveHkpCntyZXR1cm47fQp2YXIgcDFYPXBvc2l0aW9uMS54KyhSMS5jb2wxLngqdGhpcy5tX2xvY2FsUG9zaXRpb24ueCtSMS5jb2wyLngqdGhpcy5tX2xvY2FsUG9zaXRpb24ueSk7dmFyIHAxWT1wb3NpdGlvbjEueSsoUjEuY29sMS55KnRoaXMubV9sb2NhbFBvc2l0aW9uLngrUjEuY29sMi55KnRoaXMubV9sb2NhbFBvc2l0aW9uLnkpO3ZhciBsb3dlclg9TWF0aC5taW4ocDFYLHRoaXMubV9wb3NpdGlvbi54KTt2YXIgbG93ZXJZPU1hdGgubWluKHAxWSx0aGlzLm1fcG9zaXRpb24ueSk7dmFyIHVwcGVyWD1NYXRoLm1heChwMVgsdGhpcy5tX3Bvc2l0aW9uLngpO3ZhciB1cHBlclk9TWF0aC5tYXgocDFZLHRoaXMubV9wb3NpdGlvbi55KTt2YXIgYWFiYj1uZXcgYjJBQUJCKCk7YWFiYi5taW5WZXJ0ZXguU2V0KGxvd2VyWC10aGlzLm1fcmFkaXVzLGxvd2VyWS10aGlzLm1fcmFkaXVzKTthYWJiLm1heFZlcnRleC5TZXQodXBwZXJYK3RoaXMubV9yYWRpdXMsdXBwZXJZK3RoaXMubV9yYWRpdXMpO3ZhciBicm9hZFBoYXNlPXRoaXMubV9ib2R5Lm1fd29ybGQubV9icm9hZFBoYXNlO2lmKGJyb2FkUGhhc2UuSW5SYW5nZShhYWJiKSkKe2Jyb2FkUGhhc2UuTW92ZVByb3h5KHRoaXMubV9wcm94eUlkLGFhYmIpO30KZWxzZQp7dGhpcy5tX2JvZHkuRnJlZXplKCk7fX0sUXVpY2tTeW5jOmZ1bmN0aW9uKHBvc2l0aW9uLFIpe3RoaXMubV9SLlNldE0oUik7dGhpcy5tX3Bvc2l0aW9uLng9KFIuY29sMS54KnRoaXMubV9sb2NhbFBvc2l0aW9uLngrUi5jb2wyLngqdGhpcy5tX2xvY2FsUG9zaXRpb24ueSkrcG9zaXRpb24ueDt0aGlzLm1fcG9zaXRpb24ueT0oUi5jb2wxLnkqdGhpcy5tX2xvY2FsUG9zaXRpb24ueCtSLmNvbDIueSp0aGlzLm1fbG9jYWxQb3NpdGlvbi55KStwb3NpdGlvbi55O30sUmVzZXRQcm94eTpmdW5jdGlvbihicm9hZFBoYXNlKQp7aWYodGhpcy5tX3Byb3h5SWQ9PWIyUGFpci5iMl9udWxsUHJveHkpCntyZXR1cm47fQp2YXIgcHJveHk9YnJvYWRQaGFzZS5HZXRQcm94eSh0aGlzLm1fcHJveHlJZCk7YnJvYWRQaGFzZS5EZXN0cm95UHJveHkodGhpcy5tX3Byb3h5SWQpO3Byb3h5PW51bGw7dmFyIGFhYmI9bmV3IGIyQUFCQigpO2FhYmIubWluVmVydGV4LlNldCh0aGlzLm1fcG9zaXRpb24ueC10aGlzLm1fcmFkaXVzLHRoaXMubV9wb3NpdGlvbi55LXRoaXMubV9yYWRpdXMpO2FhYmIubWF4VmVydGV4LlNldCh0aGlzLm1fcG9zaXRpb24ueCt0aGlzLm1fcmFkaXVzLHRoaXMubV9wb3NpdGlvbi55K3RoaXMubV9yYWRpdXMpO2lmKGJyb2FkUGhhc2UuSW5SYW5nZShhYWJiKSkKe3RoaXMubV9wcm94eUlkPWJyb2FkUGhhc2UuQ3JlYXRlUHJveHkoYWFiYix0aGlzKTt9CmVsc2UKe3RoaXMubV9wcm94eUlkPWIyUGFpci5iMl9udWxsUHJveHk7fQppZih0aGlzLm1fcHJveHlJZD09YjJQYWlyLmIyX251bGxQcm94eSkKe3RoaXMubV9ib2R5LkZyZWV6ZSgpO319LFN1cHBvcnQ6ZnVuY3Rpb24oZFgsZFksb3V0KQp7dmFyIGxlbj1NYXRoLnNxcnQoZFgqZFgrZFkqZFkpO2RYLz1sZW47ZFkvPWxlbjtvdXQuU2V0KHRoaXMubV9wb3NpdGlvbi54K3RoaXMubV9yYWRpdXMqZFgsdGhpcy5tX3Bvc2l0aW9uLnkrdGhpcy5tX3JhZGl1cypkWSk7fSxtX2xvY2FsUG9zaXRpb246bmV3IGIyVmVjMigpLG1fcmFkaXVzOm51bGx9KTsKdmFyIGIyTWFzc0RhdGE9Q2xhc3MuY3JlYXRlKCk7YjJNYXNzRGF0YS5wcm90b3R5cGU9e21hc3M6MC4wLGNlbnRlcjpuZXcgYjJWZWMyKDAsMCksSTowLjAsaW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuY2VudGVyPW5ldyBiMlZlYzIoMCwwKTt9fQp2YXIgYjJQb2x5RGVmPUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJQb2x5RGVmLnByb3RvdHlwZSxiMlNoYXBlRGVmLnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMlBvbHlEZWYucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKCkKe3RoaXMudHlwZT1iMlNoYXBlLmVfdW5rbm93blNoYXBlO3RoaXMudXNlckRhdGE9bnVsbDt0aGlzLmxvY2FsUG9zaXRpb249bmV3IGIyVmVjMigwLjAsMC4wKTt0aGlzLmxvY2FsUm90YXRpb249MC4wO3RoaXMuZnJpY3Rpb249MC4yO3RoaXMucmVzdGl0dXRpb249MC4wO3RoaXMuZGVuc2l0eT0wLjA7dGhpcy5jYXRlZ29yeUJpdHM9MHgwMDAxO3RoaXMubWFza0JpdHM9MHhGRkZGO3RoaXMuZ3JvdXBJbmRleD0wO3RoaXMudmVydGljZXM9bmV3IEFycmF5KGIyU2V0dGluZ3MuYjJfbWF4UG9seVZlcnRpY2VzKTt0aGlzLnR5cGU9YjJTaGFwZS5lX3BvbHlTaGFwZTt0aGlzLnZlcnRleENvdW50PTA7Zm9yKHZhciBpPTA7aTxiMlNldHRpbmdzLmIyX21heFBvbHlWZXJ0aWNlcztpKyspe3RoaXMudmVydGljZXNbaV09bmV3IGIyVmVjMigpO319LHZlcnRpY2VzOm5ldyBBcnJheShiMlNldHRpbmdzLmIyX21heFBvbHlWZXJ0aWNlcyksdmVydGV4Q291bnQ6MH0pO3ZhciBiMlBvbHlTaGFwZT1DbGFzcy5jcmVhdGUoKTtPYmplY3QuZXh0ZW5kKGIyUG9seVNoYXBlLnByb3RvdHlwZSxiMlNoYXBlLnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMlBvbHlTaGFwZS5wcm90b3R5cGUse1Rlc3RQb2ludDpmdW5jdGlvbihwKXt2YXIgcExvY2FsPW5ldyBiMlZlYzIoKTtwTG9jYWwuU2V0VihwKTtwTG9jYWwuU3VidHJhY3QodGhpcy5tX3Bvc2l0aW9uKTtwTG9jYWwuTXVsVE0odGhpcy5tX1IpO2Zvcih2YXIgaT0wO2k8dGhpcy5tX3ZlcnRleENvdW50OysraSkKe3ZhciB0VmVjPW5ldyBiMlZlYzIoKTt0VmVjLlNldFYocExvY2FsKTt0VmVjLlN1YnRyYWN0KHRoaXMubV92ZXJ0aWNlc1tpXSk7dmFyIGRvdD1iMk1hdGguYjJEb3QodGhpcy5tX25vcm1hbHNbaV0sdFZlYyk7aWYoZG90PjAuMCkKe3JldHVybiBmYWxzZTt9fQpyZXR1cm4gdHJ1ZTt9LGluaXRpYWxpemU6ZnVuY3Rpb24oZGVmLGJvZHksbmV3T3JpZ2luKXt0aGlzLm1fUj1uZXcgYjJNYXQyMigpO3RoaXMubV9wb3NpdGlvbj1uZXcgYjJWZWMyKCk7dGhpcy5tX3VzZXJEYXRhPWRlZi51c2VyRGF0YTt0aGlzLm1fZnJpY3Rpb249ZGVmLmZyaWN0aW9uO3RoaXMubV9yZXN0aXR1dGlvbj1kZWYucmVzdGl0dXRpb247dGhpcy5tX2JvZHk9Ym9keTt0aGlzLm1fcHJveHlJZD1iMlBhaXIuYjJfbnVsbFByb3h5O3RoaXMubV9tYXhSYWRpdXM9MC4wO3RoaXMubV9jYXRlZ29yeUJpdHM9ZGVmLmNhdGVnb3J5Qml0czt0aGlzLm1fbWFza0JpdHM9ZGVmLm1hc2tCaXRzO3RoaXMubV9ncm91cEluZGV4PWRlZi5ncm91cEluZGV4O3RoaXMuc3luY0FBQkI9bmV3IGIyQUFCQigpO3RoaXMuc3luY01hdD1uZXcgYjJNYXQyMigpO3RoaXMubV9sb2NhbENlbnRyb2lkPW5ldyBiMlZlYzIoKTt0aGlzLm1fbG9jYWxPQkI9bmV3IGIyT0JCKCk7dmFyIGk9MDt2YXIgaFg7dmFyIGhZO3ZhciB0VmVjO3ZhciBhYWJiPW5ldyBiMkFBQkIoKTt0aGlzLm1fdmVydGljZXM9bmV3IEFycmF5KGIyU2V0dGluZ3MuYjJfbWF4UG9seVZlcnRpY2VzKTt0aGlzLm1fY29yZVZlcnRpY2VzPW5ldyBBcnJheShiMlNldHRpbmdzLmIyX21heFBvbHlWZXJ0aWNlcyk7dGhpcy5tX25vcm1hbHM9bmV3IEFycmF5KGIyU2V0dGluZ3MuYjJfbWF4UG9seVZlcnRpY2VzKTt0aGlzLm1fdHlwZT1iMlNoYXBlLmVfcG9seVNoYXBlO3ZhciBsb2NhbFI9bmV3IGIyTWF0MjIoZGVmLmxvY2FsUm90YXRpb24pO2lmKGRlZi50eXBlPT1iMlNoYXBlLmVfYm94U2hhcGUpCnt0aGlzLm1fbG9jYWxDZW50cm9pZC54PWRlZi5sb2NhbFBvc2l0aW9uLngtbmV3T3JpZ2luLng7dGhpcy5tX2xvY2FsQ2VudHJvaWQueT1kZWYubG9jYWxQb3NpdGlvbi55LW5ld09yaWdpbi55O3ZhciBib3g9ZGVmO3RoaXMubV92ZXJ0ZXhDb3VudD00O2hYPWJveC5leHRlbnRzLng7aFk9Ym94LmV4dGVudHMueTt2YXIgaGNYPU1hdGgubWF4KDAuMCxoWC0yLjAqYjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wKTt2YXIgaGNZPU1hdGgubWF4KDAuMCxoWS0yLjAqYjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wKTt0VmVjPXRoaXMubV92ZXJ0aWNlc1swXT1uZXcgYjJWZWMyKCk7dFZlYy54PWxvY2FsUi5jb2wxLngqaFgrbG9jYWxSLmNvbDIueCpoWTt0VmVjLnk9bG9jYWxSLmNvbDEueSpoWCtsb2NhbFIuY29sMi55KmhZO3RWZWM9dGhpcy5tX3ZlcnRpY2VzWzFdPW5ldyBiMlZlYzIoKTt0VmVjLng9bG9jYWxSLmNvbDEueCotaFgrbG9jYWxSLmNvbDIueCpoWTt0VmVjLnk9bG9jYWxSLmNvbDEueSotaFgrbG9jYWxSLmNvbDIueSpoWTt0VmVjPXRoaXMubV92ZXJ0aWNlc1syXT1uZXcgYjJWZWMyKCk7dFZlYy54PWxvY2FsUi5jb2wxLngqLWhYK2xvY2FsUi5jb2wyLngqLWhZO3RWZWMueT1sb2NhbFIuY29sMS55Ki1oWCtsb2NhbFIuY29sMi55Ki1oWTt0VmVjPXRoaXMubV92ZXJ0aWNlc1szXT1uZXcgYjJWZWMyKCk7dFZlYy54PWxvY2FsUi5jb2wxLngqaFgrbG9jYWxSLmNvbDIueCotaFk7dFZlYy55PWxvY2FsUi5jb2wxLnkqaFgrbG9jYWxSLmNvbDIueSotaFk7dFZlYz10aGlzLm1fY29yZVZlcnRpY2VzWzBdPW5ldyBiMlZlYzIoKTt0VmVjLng9bG9jYWxSLmNvbDEueCpoY1grbG9jYWxSLmNvbDIueCpoY1k7dFZlYy55PWxvY2FsUi5jb2wxLnkqaGNYK2xvY2FsUi5jb2wyLnkqaGNZO3RWZWM9dGhpcy5tX2NvcmVWZXJ0aWNlc1sxXT1uZXcgYjJWZWMyKCk7dFZlYy54PWxvY2FsUi5jb2wxLngqLWhjWCtsb2NhbFIuY29sMi54KmhjWTt0VmVjLnk9bG9jYWxSLmNvbDEueSotaGNYK2xvY2FsUi5jb2wyLnkqaGNZO3RWZWM9dGhpcy5tX2NvcmVWZXJ0aWNlc1syXT1uZXcgYjJWZWMyKCk7dFZlYy54PWxvY2FsUi5jb2wxLngqLWhjWCtsb2NhbFIuY29sMi54Ki1oY1k7dFZlYy55PWxvY2FsUi5jb2wxLnkqLWhjWCtsb2NhbFIuY29sMi55Ki1oY1k7dFZlYz10aGlzLm1fY29yZVZlcnRpY2VzWzNdPW5ldyBiMlZlYzIoKTt0VmVjLng9bG9jYWxSLmNvbDEueCpoY1grbG9jYWxSLmNvbDIueCotaGNZO3RWZWMueT1sb2NhbFIuY29sMS55KmhjWCtsb2NhbFIuY29sMi55Ki1oY1k7fQplbHNlCnt2YXIgcG9seT1kZWY7dGhpcy5tX3ZlcnRleENvdW50PXBvbHkudmVydGV4Q291bnQ7YjJTaGFwZS5Qb2x5Q2VudHJvaWQocG9seS52ZXJ0aWNlcyxwb2x5LnZlcnRleENvdW50LGIyUG9seVNoYXBlLnRlbXBWZWMpO3ZhciBjZW50cm9pZFg9YjJQb2x5U2hhcGUudGVtcFZlYy54O3ZhciBjZW50cm9pZFk9YjJQb2x5U2hhcGUudGVtcFZlYy55O3RoaXMubV9sb2NhbENlbnRyb2lkLng9ZGVmLmxvY2FsUG9zaXRpb24ueCsobG9jYWxSLmNvbDEueCpjZW50cm9pZFgrbG9jYWxSLmNvbDIueCpjZW50cm9pZFkpLW5ld09yaWdpbi54O3RoaXMubV9sb2NhbENlbnRyb2lkLnk9ZGVmLmxvY2FsUG9zaXRpb24ueSsobG9jYWxSLmNvbDEueSpjZW50cm9pZFgrbG9jYWxSLmNvbDIueSpjZW50cm9pZFkpLW5ld09yaWdpbi55O2ZvcihpPTA7aTx0aGlzLm1fdmVydGV4Q291bnQ7KytpKQp7dGhpcy5tX3ZlcnRpY2VzW2ldPW5ldyBiMlZlYzIoKTt0aGlzLm1fY29yZVZlcnRpY2VzW2ldPW5ldyBiMlZlYzIoKTtoWD1wb2x5LnZlcnRpY2VzW2ldLngtY2VudHJvaWRYO2hZPXBvbHkudmVydGljZXNbaV0ueS1jZW50cm9pZFk7dGhpcy5tX3ZlcnRpY2VzW2ldLng9bG9jYWxSLmNvbDEueCpoWCtsb2NhbFIuY29sMi54KmhZO3RoaXMubV92ZXJ0aWNlc1tpXS55PWxvY2FsUi5jb2wxLnkqaFgrbG9jYWxSLmNvbDIueSpoWTt2YXIgdVg9dGhpcy5tX3ZlcnRpY2VzW2ldLng7dmFyIHVZPXRoaXMubV92ZXJ0aWNlc1tpXS55O3ZhciBsZW5ndGg9TWF0aC5zcXJ0KHVYKnVYK3VZKnVZKTtpZihsZW5ndGg|MC4wJiZiZC5wcmV2ZW50Um90YXRpb249PWZhbHNlKQp7dGhpcy5tX2ludkk9MS4wL3RoaXMubV9JO30KZWxzZQp7dGhpcy5tX0k9MC4wO3RoaXMubV9pbnZJPTAuMDt9CnRoaXMubV9saW5lYXJWZWxvY2l0eT1iMk1hdGguQWRkVlYoYmQubGluZWFyVmVsb2NpdHksYjJNYXRoLmIyQ3Jvc3NGVihiZC5hbmd1bGFyVmVsb2NpdHksdGhpcy5tX2NlbnRlcikpO3RoaXMubV9hbmd1bGFyVmVsb2NpdHk9YmQuYW5ndWxhclZlbG9jaXR5O3RoaXMubV9qb2ludExpc3Q9bnVsbDt0aGlzLm1fY29udGFjdExpc3Q9bnVsbDt0aGlzLm1fcHJldj1udWxsO3RoaXMubV9uZXh0PW51bGw7dGhpcy5tX3NoYXBlTGlzdD1udWxsO2ZvcihpPTA7aTx0aGlzLm1fc2hhcGVDb3VudDsrK2kpCntzZD1iZC5zaGFwZXNbaV07dmFyIHNoYXBlPWIyU2hhcGUuQ3JlYXRlKHNkLHRoaXMsdGhpcy5tX2NlbnRlcik7c2hhcGUubV9uZXh0PXRoaXMubV9zaGFwZUxpc3Q7dGhpcy5tX3NoYXBlTGlzdD1zaGFwZTt9CnRoaXMubV9zbGVlcFRpbWU9MC4wO2lmKGJkLmFsbG93U2xlZXApCnt0aGlzLm1fZmxhZ3N8PWIyQm9keS5lX2FsbG93U2xlZXBGbGFnO30KaWYoYmQuaXNTbGVlcGluZykKe3RoaXMubV9mbGFnc3w9YjJCb2R5LmVfc2xlZXBGbGFnO30KaWYoKHRoaXMubV9mbGFncyZiMkJvZHkuZV9zbGVlcEZsYWcpfHx0aGlzLm1faW52TWFzcz09MC4wKQp7dGhpcy5tX2xpbmVhclZlbG9jaXR5LlNldCgwLjAsMC4wKTt0aGlzLm1fYW5ndWxhclZlbG9jaXR5PTAuMDt9CnRoaXMubV91c2VyRGF0YT1iZC51c2VyRGF0YTt9LERlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLm1fc2hhcGVMaXN0O3doaWxlKHMpCnt2YXIgczA9cztzPXMubV9uZXh0O2IyU2hhcGUuRGVzdHJveShzMCk7fX0sc01hdDA6bmV3IGIyTWF0MjIoKSxTeW5jaHJvbml6ZVNoYXBlczpmdW5jdGlvbigpe3RoaXMuc01hdDAuU2V0KHRoaXMubV9yb3RhdGlvbjApO2Zvcih2YXIgcz10aGlzLm1fc2hhcGVMaXN0O3MhPW51bGw7cz1zLm1fbmV4dCkKe3MuU3luY2hyb25pemUodGhpcy5tX3Bvc2l0aW9uMCx0aGlzLnNNYXQwLHRoaXMubV9wb3NpdGlvbix0aGlzLm1fUik7fX0sUXVpY2tTeW5jU2hhcGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBzPXRoaXMubV9zaGFwZUxpc3Q7cyE9bnVsbDtzPXMubV9uZXh0KQp7cy5RdWlja1N5bmModGhpcy5tX3Bvc2l0aW9uLHRoaXMubV9SKTt9fSxJc0Nvbm5lY3RlZDpmdW5jdGlvbihvdGhlcil7Zm9yKHZhciBqbj10aGlzLm1fam9pbnRMaXN0O2puIT1udWxsO2puPWpuLm5leHQpCntpZihqbi5vdGhlcj09b3RoZXIpCnJldHVybiBqbi5qb2ludC5tX2NvbGxpZGVDb25uZWN0ZWQ9PWZhbHNlO30KcmV0dXJuIGZhbHNlO30sRnJlZXplOmZ1bmN0aW9uKCl7dGhpcy5tX2ZsYWdzfD1iMkJvZHkuZV9mcm96ZW5GbGFnO3RoaXMubV9saW5lYXJWZWxvY2l0eS5TZXRaZXJvKCk7dGhpcy5tX2FuZ3VsYXJWZWxvY2l0eT0wLjA7Zm9yKHZhciBzPXRoaXMubV9zaGFwZUxpc3Q7cyE9bnVsbDtzPXMubV9uZXh0KQp7cy5EZXN0cm95UHJveHkoKTt9fSxtX2ZsYWdzOjAsbV9wb3NpdGlvbjpuZXcgYjJWZWMyKCksbV9yb3RhdGlvbjpudWxsLG1fUjpuZXcgYjJNYXQyMigwKSxtX3Bvc2l0aW9uMDpuZXcgYjJWZWMyKCksbV9yb3RhdGlvbjA6bnVsbCxtX2xpbmVhclZlbG9jaXR5Om51bGwsbV9hbmd1bGFyVmVsb2NpdHk6bnVsbCxtX2ZvcmNlOm51bGwsbV90b3JxdWU6bnVsbCxtX2NlbnRlcjpudWxsLG1fd29ybGQ6bnVsbCxtX3ByZXY6bnVsbCxtX25leHQ6bnVsbCxtX3NoYXBlTGlzdDpudWxsLG1fc2hhcGVDb3VudDowLG1fam9pbnRMaXN0Om51bGwsbV9jb250YWN0TGlzdDpudWxsLG1fbWFzczpudWxsLG1faW52TWFzczpudWxsLG1fSTpudWxsLG1faW52STpudWxsLG1fbGluZWFyRGFtcGluZzpudWxsLG1fYW5ndWxhckRhbXBpbmc6bnVsbCxtX3NsZWVwVGltZTpudWxsLG1fdXNlckRhdGE6bnVsbH07YjJCb2R5LmVfc3RhdGljRmxhZz0weDAwMDE7YjJCb2R5LmVfZnJvemVuRmxhZz0weDAwMDI7YjJCb2R5LmVfaXNsYW5kRmxhZz0weDAwMDQ7YjJCb2R5LmVfc2xlZXBGbGFnPTB4MDAwODtiMkJvZHkuZV9hbGxvd1NsZWVwRmxhZz0weDAwMTA7YjJCb2R5LmVfZGVzdHJveUZsYWc9MHgwMDIwOwp2YXIgYjJCb2R5RGVmPUNsYXNzLmNyZWF0ZSgpO2IyQm9keURlZi5wcm90b3R5cGU9e2luaXRpYWxpemU6ZnVuY3Rpb24oKQp7dGhpcy5zaGFwZXM9bmV3IEFycmF5KCk7dGhpcy51c2VyRGF0YT1udWxsO2Zvcih2YXIgaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhTaGFwZXNQZXJCb2R5O2krKyl7dGhpcy5zaGFwZXNbaV09bnVsbDt9CnRoaXMucG9zaXRpb249bmV3IGIyVmVjMigwLjAsMC4wKTt0aGlzLnJvdGF0aW9uPTAuMDt0aGlzLmxpbmVhclZlbG9jaXR5PW5ldyBiMlZlYzIoMC4wLDAuMCk7dGhpcy5hbmd1bGFyVmVsb2NpdHk9MC4wO3RoaXMubGluZWFyRGFtcGluZz0wLjA7dGhpcy5hbmd1bGFyRGFtcGluZz0wLjA7dGhpcy5hbGxvd1NsZWVwPXRydWU7dGhpcy5pc1NsZWVwaW5nPWZhbHNlO3RoaXMucHJldmVudFJvdGF0aW9uPWZhbHNlO30sdXNlckRhdGE6bnVsbCxzaGFwZXM6bmV3IEFycmF5KCkscG9zaXRpb246bnVsbCxyb3RhdGlvbjpudWxsLGxpbmVhclZlbG9jaXR5Om51bGwsYW5ndWxhclZlbG9jaXR5Om51bGwsbGluZWFyRGFtcGluZzpudWxsLGFuZ3VsYXJEYW1waW5nOm51bGwsYWxsb3dTbGVlcDpudWxsLGlzU2xlZXBpbmc6bnVsbCxwcmV2ZW50Um90YXRpb246bnVsbCxBZGRTaGFwZTpmdW5jdGlvbihzaGFwZSkKe2Zvcih2YXIgaT0wO2k8YjJTZXR0aW5ncy5iMl9tYXhTaGFwZXNQZXJCb2R5OysraSkKe2lmKHRoaXMuc2hhcGVzW2ldPT1udWxsKQp7dGhpcy5zaGFwZXNbaV09c2hhcGU7YnJlYWs7fX19fTsKdmFyIGIyQ29sbGlzaW9uRmlsdGVyPUNsYXNzLmNyZWF0ZSgpO2IyQ29sbGlzaW9uRmlsdGVyLnByb3RvdHlwZT17U2hvdWxkQ29sbGlkZTpmdW5jdGlvbihzaGFwZTEsc2hhcGUyKXtpZihzaGFwZTEubV9ncm91cEluZGV4PT1zaGFwZTIubV9ncm91cEluZGV4JiZzaGFwZTEubV9ncm91cEluZGV4IT0wKQp7cmV0dXJuIHNoYXBlMS5tX2dyb3VwSW5kZXg|MDt9CnZhciBjb2xsaWRlPShzaGFwZTEubV9tYXNrQml0cyZzaGFwZTIubV9jYXRlZ29yeUJpdHMpIT0wJiYoc2hhcGUxLm1fY2F0ZWdvcnlCaXRzJnNoYXBlMi5tX21hc2tCaXRzKSE9MDtyZXR1cm4gY29sbGlkZTt9LGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9fTtiMkNvbGxpc2lvbkZpbHRlci5iMl9kZWZhdWx0RmlsdGVyPW5ldyBiMkNvbGxpc2lvbkZpbHRlcjsKdmFyIGIySXNsYW5kPUNsYXNzLmNyZWF0ZSgpO2IySXNsYW5kLnByb3RvdHlwZT17aW5pdGlhbGl6ZTpmdW5jdGlvbihib2R5Q2FwYWNpdHksY29udGFjdENhcGFjaXR5LGpvaW50Q2FwYWNpdHksYWxsb2NhdG9yKQp7dmFyIGk9MDt0aGlzLm1fYm9keUNhcGFjaXR5PWJvZHlDYXBhY2l0eTt0aGlzLm1fY29udGFjdENhcGFjaXR5PWNvbnRhY3RDYXBhY2l0eTt0aGlzLm1fam9pbnRDYXBhY2l0eT1qb2ludENhcGFjaXR5O3RoaXMubV9ib2R5Q291bnQ9MDt0aGlzLm1fY29udGFjdENvdW50PTA7dGhpcy5tX2pvaW50Q291bnQ9MDt0aGlzLm1fYm9kaWVzPW5ldyBBcnJheShib2R5Q2FwYWNpdHkpO2ZvcihpPTA7aTxib2R5Q2FwYWNpdHk7aSsrKQp0aGlzLm1fYm9kaWVzW2ldPW51bGw7dGhpcy5tX2NvbnRhY3RzPW5ldyBBcnJheShjb250YWN0Q2FwYWNpdHkpO2ZvcihpPTA7aTxjb250YWN0Q2FwYWNpdHk7aSsrKQp0aGlzLm1fY29udGFjdHNbaV09bnVsbDt0aGlzLm1fam9pbnRzPW5ldyBBcnJheShqb2ludENhcGFjaXR5KTtmb3IoaT0wO2k8am9pbnRDYXBhY2l0eTtpKyspCnRoaXMubV9qb2ludHNbaV09bnVsbDt0aGlzLm1fYWxsb2NhdG9yPWFsbG9jYXRvcjt9LENsZWFyOmZ1bmN0aW9uKCkKe3RoaXMubV9ib2R5Q291bnQ9MDt0aGlzLm1fY29udGFjdENvdW50PTA7dGhpcy5tX2pvaW50Q291bnQ9MDt9LFNvbHZlOmZ1bmN0aW9uKHN0ZXAsZ3Jhdml0eSkKe3ZhciBpPTA7dmFyIGI7Zm9yKGk9MDtpPHRoaXMubV9ib2R5Q291bnQ7KytpKQp7Yj10aGlzLm1fYm9kaWVzW2ldO2lmKGIubV9pbnZNYXNzPT0wLjApCmNvbnRpbnVlO2IubV9saW5lYXJWZWxvY2l0eS5BZGQoYjJNYXRoLk11bEZWKHN0ZXAuZHQsYjJNYXRoLkFkZFZWKGdyYXZpdHksYjJNYXRoLk11bEZWKGIubV9pbnZNYXNzLGIubV9mb3JjZSkpKSk7Yi5tX2FuZ3VsYXJWZWxvY2l0eSs9c3RlcC5kdCpiLm1faW52SSpiLm1fdG9ycXVlO2IubV9saW5lYXJWZWxvY2l0eS5NdWx0aXBseShiLm1fbGluZWFyRGFtcGluZyk7Yi5tX2FuZ3VsYXJWZWxvY2l0eSo9Yi5tX2FuZ3VsYXJEYW1waW5nO2IubV9wb3NpdGlvbjAuU2V0VihiLm1fcG9zaXRpb24pO2IubV9yb3RhdGlvbjA9Yi5tX3JvdGF0aW9uO30KdmFyIGNvbnRhY3RTb2x2ZXI9bmV3IGIyQ29udGFjdFNvbHZlcih0aGlzLm1fY29udGFjdHMsdGhpcy5tX2NvbnRhY3RDb3VudCx0aGlzLm1fYWxsb2NhdG9yKTtjb250YWN0U29sdmVyLlByZVNvbHZlKCk7Zm9yKGk9MDtpPHRoaXMubV9qb2ludENvdW50OysraSkKe3RoaXMubV9qb2ludHNbaV0uUHJlcGFyZVZlbG9jaXR5U29sdmVyKCk7fQpmb3IoaT0wO2k8c3RlcC5pdGVyYXRpb25zOysraSkKe2NvbnRhY3RTb2x2ZXIuU29sdmVWZWxvY2l0eUNvbnN0cmFpbnRzKCk7Zm9yKHZhciBqPTA7ajx0aGlzLm1fam9pbnRDb3VudDsrK2opCnt0aGlzLm1fam9pbnRzW2pdLlNvbHZlVmVsb2NpdHlDb25zdHJhaW50cyhzdGVwKTt9fQpmb3IoaT0wO2k8dGhpcy5tX2JvZHlDb3VudDsrK2kpCntiPXRoaXMubV9ib2RpZXNbaV07aWYoYi5tX2ludk1hc3M9PTAuMCkKY29udGludWU7Yi5tX3Bvc2l0aW9uLngrPXN0ZXAuZHQqYi5tX2xpbmVhclZlbG9jaXR5Lng7Yi5tX3Bvc2l0aW9uLnkrPXN0ZXAuZHQqYi5tX2xpbmVhclZlbG9jaXR5Lnk7Yi5tX3JvdGF0aW9uKz1zdGVwLmR0KmIubV9hbmd1bGFyVmVsb2NpdHk7Yi5tX1IuU2V0KGIubV9yb3RhdGlvbik7fQpmb3IoaT0wO2k8dGhpcy5tX2pvaW50Q291bnQ7KytpKQp7dGhpcy5tX2pvaW50c1tpXS5QcmVwYXJlUG9zaXRpb25Tb2x2ZXIoKTt9CmlmKGIyV29ybGQuc19lbmFibGVQb3NpdGlvbkNvcnJlY3Rpb24pCntmb3IoYjJJc2xhbmQubV9wb3NpdGlvbkl0ZXJhdGlvbkNvdW50PTA7YjJJc2xhbmQubV9wb3NpdGlvbkl0ZXJhdGlvbkNvdW50PHN0ZXAuaXRlcmF0aW9uczsrK2IySXNsYW5kLm1fcG9zaXRpb25JdGVyYXRpb25Db3VudCkKe3ZhciBjb250YWN0c09rYXk9Y29udGFjdFNvbHZlci5Tb2x2ZVBvc2l0aW9uQ29uc3RyYWludHMoYjJTZXR0aW5ncy5iMl9jb250YWN0QmF1bWdhcnRlKTt2YXIgam9pbnRzT2theT10cnVlO2ZvcihpPTA7aTx0aGlzLm1fam9pbnRDb3VudDsrK2kpCnt2YXIgam9pbnRPa2F5PXRoaXMubV9qb2ludHNbaV0uU29sdmVQb3NpdGlvbkNvbnN0cmFpbnRzKCk7am9pbnRzT2theT1qb2ludHNPa2F5JiZqb2ludE9rYXk7fQppZihjb250YWN0c09rYXkmJmpvaW50c09rYXkpCnticmVhazt9fX0KY29udGFjdFNvbHZlci5Qb3N0U29sdmUoKTtmb3IoaT0wO2k8dGhpcy5tX2JvZHlDb3VudDsrK2kpCntiPXRoaXMubV9ib2RpZXNbaV07aWYoYi5tX2ludk1hc3M9PTAuMCkKY29udGludWU7Yi5tX1IuU2V0KGIubV9yb3RhdGlvbik7Yi5TeW5jaHJvbml6ZVNoYXBlcygpO2IubV9mb3JjZS5TZXQoMC4wLDAuMCk7Yi5tX3RvcnF1ZT0wLjA7fX0sVXBkYXRlU2xlZXA6ZnVuY3Rpb24oZHQpCnt2YXIgaT0wO3ZhciBiO3ZhciBtaW5TbGVlcFRpbWU9TnVtYmVyLk1BWF9WQUxVRTt2YXIgbGluVG9sU3FyPWIyU2V0dGluZ3MuYjJfbGluZWFyU2xlZXBUb2xlcmFuY2UqYjJTZXR0aW5ncy5iMl9saW5lYXJTbGVlcFRvbGVyYW5jZTt2YXIgYW5nVG9sU3FyPWIyU2V0dGluZ3MuYjJfYW5ndWxhclNsZWVwVG9sZXJhbmNlKmIyU2V0dGluZ3MuYjJfYW5ndWxhclNsZWVwVG9sZXJhbmNlO2ZvcihpPTA7aTx0aGlzLm1fYm9keUNvdW50OysraSkKe2I9dGhpcy5tX2JvZGllc1tpXTtpZihiLm1faW52TWFzcz09MC4wKQp7Y29udGludWU7fQppZigoYi5tX2ZsYWdzJmIyQm9keS5lX2FsbG93U2xlZXBGbGFnKT09MCkKe2IubV9zbGVlcFRpbWU9MC4wO21pblNsZWVwVGltZT0wLjA7fQppZigoYi5tX2ZsYWdzJmIyQm9keS5lX2FsbG93U2xlZXBGbGFnKT09MHx8Yi5tX2FuZ3VsYXJWZWxvY2l0eSpiLm1fYW5ndWxhclZlbG9jaXR5PmFuZ1RvbFNxcnx8YjJNYXRoLmIyRG90KGIubV9saW5lYXJWZWxvY2l0eSxiLm1fbGluZWFyVmVsb2NpdHkpPmxpblRvbFNxcikKe2IubV9zbGVlcFRpbWU9MC4wO21pblNsZWVwVGltZT0wLjA7fQplbHNlCntiLm1fc2xlZXBUaW1lKz1kdDttaW5TbGVlcFRpbWU9YjJNYXRoLmIyTWluKG1pblNsZWVwVGltZSxiLm1fc2xlZXBUaW1lKTt9fQppZihtaW5TbGVlcFRpbWU|MCkKe2JvZHkxPWMubV9zaGFwZTEubV9ib2R5O2JvZHkyPWMubV9zaGFwZTIubV9ib2R5O25vZGUxPWMubV9ub2RlMTtub2RlMj1jLm1fbm9kZTI7bm9kZTEuY29udGFjdD1jO25vZGUxLm90aGVyPWJvZHkyO25vZGUxLnByZXY9bnVsbDtub2RlMS5uZXh0PWJvZHkxLm1fY29udGFjdExpc3Q7aWYobm9kZTEubmV4dCE9bnVsbCkKe25vZGUxLm5leHQucHJldj1jLm1fbm9kZTE7fQpib2R5MS5tX2NvbnRhY3RMaXN0PWMubV9ub2RlMTtub2RlMi5jb250YWN0PWM7bm9kZTIub3RoZXI9Ym9keTE7bm9kZTIucHJldj1udWxsO25vZGUyLm5leHQ9Ym9keTIubV9jb250YWN0TGlzdDtpZihub2RlMi5uZXh0IT1udWxsKQp7bm9kZTIubmV4dC5wcmV2PW5vZGUyO30KYm9keTIubV9jb250YWN0TGlzdD1ub2RlMjt9CmVsc2UgaWYob2xkQ291bnQ|MCkKe2NvbnRhY3QubV9zaGFwZTEubV9ib2R5Lldha2VVcCgpO2NvbnRhY3QubV9zaGFwZTIubV9ib2R5Lldha2VVcCgpO30KdmFyIHR5cGUxPWNvbnRhY3QubV9zaGFwZTEubV90eXBlO3ZhciB0eXBlMj1jb250YWN0Lm1fc2hhcGUyLm1fdHlwZTt2YXIgZGVzdHJveUZjbj1iMkNvbnRhY3Quc19yZWdpc3RlcnNbdHlwZTFdW3R5cGUyXS5kZXN0cm95RmNuO2Rlc3Ryb3lGY24oY29udGFjdCxhbGxvY2F0b3IpO307YjJDb250YWN0LnNfcmVnaXN0ZXJzPW51bGw7YjJDb250YWN0LnNfaW5pdGlhbGl6ZWQ9ZmFsc2U7CnZhciBiMkNvbnRhY3RDb25zdHJhaW50PUNsYXNzLmNyZWF0ZSgpO2IyQ29udGFjdENvbnN0cmFpbnQucHJvdG90eXBlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5ub3JtYWw9bmV3IGIyVmVjMigpO3RoaXMucG9pbnRzPW5ldyBBcnJheShiMlNldHRpbmdzLmIyX21heE1hbmlmb2xkUG9pbnRzKTtmb3IodmFyIGk9MDtpPGIyU2V0dGluZ3MuYjJfbWF4TWFuaWZvbGRQb2ludHM7aSsrKXt0aGlzLnBvaW50c1tpXT1uZXcgYjJDb250YWN0Q29uc3RyYWludFBvaW50KCk7fX0scG9pbnRzOm51bGwsbm9ybWFsOm5ldyBiMlZlYzIoKSxtYW5pZm9sZDpudWxsLGJvZHkxOm51bGwsYm9keTI6bnVsbCxmcmljdGlvbjpudWxsLHJlc3RpdHV0aW9uOm51bGwscG9pbnRDb3VudDowfTsKdmFyIGIyQ29udGFjdENvbnN0cmFpbnRQb2ludD1DbGFzcy5jcmVhdGUoKTtiMkNvbnRhY3RDb25zdHJhaW50UG9pbnQucHJvdG90eXBlPXtsb2NhbEFuY2hvcjE6bmV3IGIyVmVjMigpLGxvY2FsQW5jaG9yMjpuZXcgYjJWZWMyKCksbm9ybWFsSW1wdWxzZTpudWxsLHRhbmdlbnRJbXB1bHNlOm51bGwscG9zaXRpb25JbXB1bHNlOm51bGwsbm9ybWFsTWFzczpudWxsLHRhbmdlbnRNYXNzOm51bGwsc2VwYXJhdGlvbjpudWxsLHZlbG9jaXR5QmlhczpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmxvY2FsQW5jaG9yMT1uZXcgYjJWZWMyKCk7dGhpcy5sb2NhbEFuY2hvcjI9bmV3IGIyVmVjMigpO319Owp2YXIgYjJDb250YWN0UmVnaXN0ZXI9Q2xhc3MuY3JlYXRlKCk7YjJDb250YWN0UmVnaXN0ZXIucHJvdG90eXBlPXtjcmVhdGVGY246bnVsbCxkZXN0cm95RmNuOm51bGwscHJpbWFyeTpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9fTsKdmFyIGIyQ29udGFjdFNvbHZlcj1DbGFzcy5jcmVhdGUoKTtiMkNvbnRhY3RTb2x2ZXIucHJvdG90eXBlPXtpbml0aWFsaXplOmZ1bmN0aW9uKGNvbnRhY3RzLGNvbnRhY3RDb3VudCxhbGxvY2F0b3Ipe3RoaXMubV9jb25zdHJhaW50cz1uZXcgQXJyYXkoKTt0aGlzLm1fYWxsb2NhdG9yPWFsbG9jYXRvcjt2YXIgaT0wO3ZhciB0VmVjO3ZhciB0TWF0O3RoaXMubV9jb25zdHJhaW50Q291bnQ9MDtmb3IoaT0wO2k8Y29udGFjdENvdW50OysraSkKe3RoaXMubV9jb25zdHJhaW50Q291bnQrPWNvbnRhY3RzW2ldLkdldE1hbmlmb2xkQ291bnQoKTt9CmZvcihpPTA7aTx0aGlzLm1fY29uc3RyYWludENvdW50O2krKyl7dGhpcy5tX2NvbnN0cmFpbnRzW2ldPW5ldyBiMkNvbnRhY3RDb25zdHJhaW50KCk7fQp2YXIgY291bnQ9MDtmb3IoaT0wO2k8Y29udGFjdENvdW50OysraSkKe3ZhciBjb250YWN0PWNvbnRhY3RzW2ldO3ZhciBiMT1jb250YWN0Lm1fc2hhcGUxLm1fYm9keTt2YXIgYjI9Y29udGFjdC5tX3NoYXBlMi5tX2JvZHk7dmFyIG1hbmlmb2xkQ291bnQ9Y29udGFjdC5HZXRNYW5pZm9sZENvdW50KCk7dmFyIG1hbmlmb2xkcz1jb250YWN0LkdldE1hbmlmb2xkcygpO3ZhciBmcmljdGlvbj1jb250YWN0Lm1fZnJpY3Rpb247dmFyIHJlc3RpdHV0aW9uPWNvbnRhY3QubV9yZXN0aXR1dGlvbjt2YXIgdjFYPWIxLm1fbGluZWFyVmVsb2NpdHkueDt2YXIgdjFZPWIxLm1fbGluZWFyVmVsb2NpdHkueTt2YXIgdjJYPWIyLm1fbGluZWFyVmVsb2NpdHkueDt2YXIgdjJZPWIyLm1fbGluZWFyVmVsb2NpdHkueTt2YXIgdzE9YjEubV9hbmd1bGFyVmVsb2NpdHk7dmFyIHcyPWIyLm1fYW5ndWxhclZlbG9jaXR5O2Zvcih2YXIgaj0wO2o8bWFuaWZvbGRDb3VudDsrK2opCnt2YXIgbWFuaWZvbGQ9bWFuaWZvbGRzW2pdO3ZhciBub3JtYWxYPW1hbmlmb2xkLm5vcm1hbC54O3ZhciBub3JtYWxZPW1hbmlmb2xkLm5vcm1hbC55O3ZhciBjPXRoaXMubV9jb25zdHJhaW50c1tjb3VudF07Yy5ib2R5MT1iMTtjLmJvZHkyPWIyO2MubWFuaWZvbGQ9bWFuaWZvbGQ7Yy5ub3JtYWwueD1ub3JtYWxYO2Mubm9ybWFsLnk9bm9ybWFsWTtjLnBvaW50Q291bnQ9bWFuaWZvbGQucG9pbnRDb3VudDtjLmZyaWN0aW9uPWZyaWN0aW9uO2MucmVzdGl0dXRpb249cmVzdGl0dXRpb247Zm9yKHZhciBrPTA7azxjLnBvaW50Q291bnQ7KytrKQp7dmFyIGNwPW1hbmlmb2xkLnBvaW50c1trXTt2YXIgY2NwPWMucG9pbnRzW2tdO2NjcC5ub3JtYWxJbXB1bHNlPWNwLm5vcm1hbEltcHVsc2U7Y2NwLnRhbmdlbnRJbXB1bHNlPWNwLnRhbmdlbnRJbXB1bHNlO2NjcC5zZXBhcmF0aW9uPWNwLnNlcGFyYXRpb247dmFyIHIxWD1jcC5wb3NpdGlvbi54LWIxLm1fcG9zaXRpb24ueDt2YXIgcjFZPWNwLnBvc2l0aW9uLnktYjEubV9wb3NpdGlvbi55O3ZhciByMlg9Y3AucG9zaXRpb24ueC1iMi5tX3Bvc2l0aW9uLng7dmFyIHIyWT1jcC5wb3NpdGlvbi55LWIyLm1fcG9zaXRpb24ueTt0VmVjPWNjcC5sb2NhbEFuY2hvcjE7dE1hdD1iMS5tX1I7dFZlYy54PXIxWCp0TWF0LmNvbDEueCtyMVkqdE1hdC5jb2wxLnk7dFZlYy55PXIxWCp0TWF0LmNvbDIueCtyMVkqdE1hdC5jb2wyLnk7dFZlYz1jY3AubG9jYWxBbmNob3IyO3RNYXQ9YjIubV9SO3RWZWMueD1yMlgqdE1hdC5jb2wxLngrcjJZKnRNYXQuY29sMS55O3RWZWMueT1yMlgqdE1hdC5jb2wyLngrcjJZKnRNYXQuY29sMi55O3ZhciByMVNxcj1yMVgqcjFYK3IxWSpyMVk7dmFyIHIyU3FyPXIyWCpyMlgrcjJZKnIyWTt2YXIgcm4xPXIxWCpub3JtYWxYK3IxWSpub3JtYWxZO3ZhciBybjI9cjJYKm5vcm1hbFgrcjJZKm5vcm1hbFk7dmFyIGtOb3JtYWw9YjEubV9pbnZNYXNzK2IyLm1faW52TWFzcztrTm9ybWFsKz1iMS5tX2ludkkqKHIxU3FyLXJuMSpybjEpK2IyLm1faW52SSoocjJTcXItcm4yKnJuMik7Y2NwLm5vcm1hbE1hc3M9MS4wL2tOb3JtYWw7dmFyIHRhbmdlbnRYPW5vcm1hbFkKdmFyIHRhbmdlbnRZPS1ub3JtYWxYO3ZhciBydDE9cjFYKnRhbmdlbnRYK3IxWSp0YW5nZW50WTt2YXIgcnQyPXIyWCp0YW5nZW50WCtyMlkqdGFuZ2VudFk7dmFyIGtUYW5nZW50PWIxLm1faW52TWFzcytiMi5tX2ludk1hc3M7a1RhbmdlbnQrPWIxLm1faW52SSoocjFTcXItcnQxKnJ0MSkrYjIubV9pbnZJKihyMlNxci1ydDIqcnQyKTtjY3AudGFuZ2VudE1hc3M9MS4wL2tUYW5nZW50O2NjcC52ZWxvY2l0eUJpYXM9MC4wO2lmKGNjcC5zZXBhcmF0aW9uPjAuMCkKe2NjcC52ZWxvY2l0eUJpYXM9LTYwLjAqY2NwLnNlcGFyYXRpb247fQp2YXIgdFg9djJYKygtdzIqcjJZKS12MVgtKC13MSpyMVkpO3ZhciB0WT12MlkrKHcyKnIyWCktdjFZLSh3MSpyMVgpO3ZhciB2UmVsPWMubm9ybWFsLngqdFgrYy5ub3JtYWwueSp0WTtpZih2UmVsPC1iMlNldHRpbmdzLmIyX3ZlbG9jaXR5VGhyZXNob2xkKQp7Y2NwLnZlbG9jaXR5Qmlhcys9LWMucmVzdGl0dXRpb24qdlJlbDt9fQorK2NvdW50O319fSxQcmVTb2x2ZTpmdW5jdGlvbigpe3ZhciB0VmVjO3ZhciB0VmVjMjt2YXIgdE1hdDtmb3IodmFyIGk9MDtpPHRoaXMubV9jb25zdHJhaW50Q291bnQ7KytpKQp7dmFyIGM9dGhpcy5tX2NvbnN0cmFpbnRzW2ldO3ZhciBiMT1jLmJvZHkxO3ZhciBiMj1jLmJvZHkyO3ZhciBpbnZNYXNzMT1iMS5tX2ludk1hc3M7dmFyIGludkkxPWIxLm1faW52STt2YXIgaW52TWFzczI9YjIubV9pbnZNYXNzO3ZhciBpbnZJMj1iMi5tX2ludkk7dmFyIG5vcm1hbFg9Yy5ub3JtYWwueDt2YXIgbm9ybWFsWT1jLm5vcm1hbC55O3ZhciB0YW5nZW50WD1ub3JtYWxZO3ZhciB0YW5nZW50WT0tbm9ybWFsWDt2YXIgaj0wO3ZhciB0Q291bnQ9MDtpZihiMldvcmxkLnNfZW5hYmxlV2FybVN0YXJ0aW5nKQp7dENvdW50PWMucG9pbnRDb3VudDtmb3Ioaj0wO2o8dENvdW50OysraikKe3ZhciBjY3A9Yy5wb2ludHNbal07dmFyIFBYPWNjcC5ub3JtYWxJbXB1bHNlKm5vcm1hbFgrY2NwLnRhbmdlbnRJbXB1bHNlKnRhbmdlbnRYO3ZhciBQWT1jY3Aubm9ybWFsSW1wdWxzZSpub3JtYWxZK2NjcC50YW5nZW50SW1wdWxzZSp0YW5nZW50WTt0TWF0PWIxLm1fUjt0VmVjPWNjcC5sb2NhbEFuY2hvcjE7dmFyIHIxWD10TWF0LmNvbDEueCp0VmVjLngrdE1hdC5jb2wyLngqdFZlYy55O3ZhciByMVk9dE1hdC5jb2wxLnkqdFZlYy54K3RNYXQuY29sMi55KnRWZWMueTt0TWF0PWIyLm1fUjt0VmVjPWNjcC5sb2NhbEFuY2hvcjI7dmFyIHIyWD10TWF0LmNvbDEueCp0VmVjLngrdE1hdC5jb2wyLngqdFZlYy55O3ZhciByMlk9dE1hdC5jb2wxLnkqdFZlYy54K3RNYXQuY29sMi55KnRWZWMueTtiMS5tX2FuZ3VsYXJWZWxvY2l0eS09aW52STEqKHIxWCpQWS1yMVkqUFgpO2IxLm1fbGluZWFyVmVsb2NpdHkueC09aW52TWFzczEqUFg7YjEubV9saW5lYXJWZWxvY2l0eS55LT1pbnZNYXNzMSpQWTtiMi5tX2FuZ3VsYXJWZWxvY2l0eSs9aW52STIqKHIyWCpQWS1yMlkqUFgpO2IyLm1fbGluZWFyVmVsb2NpdHkueCs9aW52TWFzczIqUFg7YjIubV9saW5lYXJWZWxvY2l0eS55Kz1pbnZNYXNzMipQWTtjY3AucG9zaXRpb25JbXB1bHNlPTAuMDt9fQplbHNle3RDb3VudD1jLnBvaW50Q291bnQ7Zm9yKGo9MDtqPHRDb3VudDsrK2opCnt2YXIgY2NwMj1jLnBvaW50c1tqXTtjY3AyLm5vcm1hbEltcHVsc2U9MC4wO2NjcDIudGFuZ2VudEltcHVsc2U9MC4wO2NjcDIucG9zaXRpb25JbXB1bHNlPTAuMDt9fX19LFNvbHZlVmVsb2NpdHlDb25zdHJhaW50czpmdW5jdGlvbigpe3ZhciBqPTA7dmFyIGNjcDt2YXIgcjFYO3ZhciByMVk7dmFyIHIyWDt2YXIgcjJZO3ZhciBkdlg7dmFyIGR2WTt2YXIgbGFtYmRhO3ZhciBuZXdJbXB1bHNlO3ZhciBQWDt2YXIgUFk7dmFyIHRNYXQ7dmFyIHRWZWM7Zm9yKHZhciBpPTA7aTx0aGlzLm1fY29uc3RyYWludENvdW50OysraSkKe3ZhciBjPXRoaXMubV9jb25zdHJhaW50c1tpXTt2YXIgYjE9Yy5ib2R5MTt2YXIgYjI9Yy5ib2R5Mjt2YXIgYjFfYW5ndWxhclZlbG9jaXR5PWIxLm1fYW5ndWxhclZlbG9jaXR5O3ZhciBiMV9saW5lYXJWZWxvY2l0eT1iMS5tX2xpbmVhclZlbG9jaXR5O3ZhciBiMl9hbmd1bGFyVmVsb2NpdHk9YjIubV9hbmd1bGFyVmVsb2NpdHk7dmFyIGIyX2xpbmVhclZlbG9jaXR5PWIyLm1fbGluZWFyVmVsb2NpdHk7dmFyIGludk1hc3MxPWIxLm1faW52TWFzczt2YXIgaW52STE9YjEubV9pbnZJO3ZhciBpbnZNYXNzMj1iMi5tX2ludk1hc3M7dmFyIGludkkyPWIyLm1faW52STt2YXIgbm9ybWFsWD1jLm5vcm1hbC54O3ZhciBub3JtYWxZPWMubm9ybWFsLnk7dmFyIHRhbmdlbnRYPW5vcm1hbFk7dmFyIHRhbmdlbnRZPS1ub3JtYWxYO3ZhciB0Q291bnQ9Yy5wb2ludENvdW50O2ZvcihqPTA7ajx0Q291bnQ7KytqKQp7Y2NwPWMucG9pbnRzW2pdO3RNYXQ9YjEubV9SO3RWZWM9Y2NwLmxvY2FsQW5jaG9yMTtyMVg9dE1hdC5jb2wxLngqdFZlYy54K3RNYXQuY29sMi54KnRWZWMueQpyMVk9dE1hdC5jb2wxLnkqdFZlYy54K3RNYXQuY29sMi55KnRWZWMueQp0TWF0PWIyLm1fUjt0VmVjPWNjcC5sb2NhbEFuY2hvcjI7cjJYPXRNYXQuY29sMS54KnRWZWMueCt0TWF0LmNvbDIueCp0VmVjLnkKcjJZPXRNYXQuY29sMS55KnRWZWMueCt0TWF0LmNvbDIueSp0VmVjLnkKZHZYPWIyX2xpbmVhclZlbG9jaXR5LngrKC1iMl9hbmd1bGFyVmVsb2NpdHkqcjJZKS1iMV9saW5lYXJWZWxvY2l0eS54LSgtYjFfYW5ndWxhclZlbG9jaXR5KnIxWSk7ZHZZPWIyX2xpbmVhclZlbG9jaXR5LnkrKGIyX2FuZ3VsYXJWZWxvY2l0eSpyMlgpLWIxX2xpbmVhclZlbG9jaXR5LnktKGIxX2FuZ3VsYXJWZWxvY2l0eSpyMVgpO3ZhciB2bj1kdlgqbm9ybWFsWCtkdlkqbm9ybWFsWTtsYW1iZGE9LWNjcC5ub3JtYWxNYXNzKih2bi1jY3AudmVsb2NpdHlCaWFzKTtuZXdJbXB1bHNlPWIyTWF0aC5iMk1heChjY3Aubm9ybWFsSW1wdWxzZStsYW1iZGEsMC4wKTtsYW1iZGE9bmV3SW1wdWxzZS1jY3Aubm9ybWFsSW1wdWxzZTtQWD1sYW1iZGEqbm9ybWFsWDtQWT1sYW1iZGEqbm9ybWFsWTtiMV9saW5lYXJWZWxvY2l0eS54LT1pbnZNYXNzMSpQWDtiMV9saW5lYXJWZWxvY2l0eS55LT1pbnZNYXNzMSpQWTtiMV9hbmd1bGFyVmVsb2NpdHktPWludkkxKihyMVgqUFktcjFZKlBYKTtiMl9saW5lYXJWZWxvY2l0eS54Kz1pbnZNYXNzMipQWDtiMl9saW5lYXJWZWxvY2l0eS55Kz1pbnZNYXNzMipQWTtiMl9hbmd1bGFyVmVsb2NpdHkrPWludkkyKihyMlgqUFktcjJZKlBYKTtjY3Aubm9ybWFsSW1wdWxzZT1uZXdJbXB1bHNlO2R2WD1iMl9saW5lYXJWZWxvY2l0eS54KygtYjJfYW5ndWxhclZlbG9jaXR5KnIyWSktYjFfbGluZWFyVmVsb2NpdHkueC0oLWIxX2FuZ3VsYXJWZWxvY2l0eSpyMVkpO2R2WT1iMl9saW5lYXJWZWxvY2l0eS55KyhiMl9hbmd1bGFyVmVsb2NpdHkqcjJYKS1iMV9saW5lYXJWZWxvY2l0eS55LShiMV9hbmd1bGFyVmVsb2NpdHkqcjFYKTt2YXIgdnQ9ZHZYKnRhbmdlbnRYK2R2WSp0YW5nZW50WTtsYW1iZGE9Y2NwLnRhbmdlbnRNYXNzKigtdnQpO3ZhciBtYXhGcmljdGlvbj1jLmZyaWN0aW9uKmNjcC5ub3JtYWxJbXB1bHNlO25ld0ltcHVsc2U9YjJNYXRoLmIyQ2xhbXAoY2NwLnRhbmdlbnRJbXB1bHNlK2xhbWJkYSwtbWF4RnJpY3Rpb24sbWF4RnJpY3Rpb24pO2xhbWJkYT1uZXdJbXB1bHNlLWNjcC50YW5nZW50SW1wdWxzZTtQWD1sYW1iZGEqdGFuZ2VudFg7UFk9bGFtYmRhKnRhbmdlbnRZO2IxX2xpbmVhclZlbG9jaXR5LngtPWludk1hc3MxKlBYO2IxX2xpbmVhclZlbG9jaXR5LnktPWludk1hc3MxKlBZO2IxX2FuZ3VsYXJWZWxvY2l0eS09aW52STEqKHIxWCpQWS1yMVkqUFgpO2IyX2xpbmVhclZlbG9jaXR5LngrPWludk1hc3MyKlBYO2IyX2xpbmVhclZlbG9jaXR5LnkrPWludk1hc3MyKlBZO2IyX2FuZ3VsYXJWZWxvY2l0eSs9aW52STIqKHIyWCpQWS1yMlkqUFgpO2NjcC50YW5nZW50SW1wdWxzZT1uZXdJbXB1bHNlO30KYjEubV9hbmd1bGFyVmVsb2NpdHk9YjFfYW5ndWxhclZlbG9jaXR5O2IyLm1fYW5ndWxhclZlbG9jaXR5PWIyX2FuZ3VsYXJWZWxvY2l0eTt9fSxTb2x2ZVBvc2l0aW9uQ29uc3RyYWludHM6ZnVuY3Rpb24oYmV0YSl7dmFyIG1pblNlcGFyYXRpb249MC4wO3ZhciB0TWF0O3ZhciB0VmVjO2Zvcih2YXIgaT0wO2k8dGhpcy5tX2NvbnN0cmFpbnRDb3VudDsrK2kpCnt2YXIgYz10aGlzLm1fY29uc3RyYWludHNbaV07dmFyIGIxPWMuYm9keTE7dmFyIGIyPWMuYm9keTI7dmFyIGIxX3Bvc2l0aW9uPWIxLm1fcG9zaXRpb247dmFyIGIxX3JvdGF0aW9uPWIxLm1fcm90YXRpb247dmFyIGIyX3Bvc2l0aW9uPWIyLm1fcG9zaXRpb247dmFyIGIyX3JvdGF0aW9uPWIyLm1fcm90YXRpb247dmFyIGludk1hc3MxPWIxLm1faW52TWFzczt2YXIgaW52STE9YjEubV9pbnZJO3ZhciBpbnZNYXNzMj1iMi5tX2ludk1hc3M7dmFyIGludkkyPWIyLm1faW52STt2YXIgbm9ybWFsWD1jLm5vcm1hbC54O3ZhciBub3JtYWxZPWMubm9ybWFsLnk7dmFyIHRhbmdlbnRYPW5vcm1hbFk7dmFyIHRhbmdlbnRZPS1ub3JtYWxYO3ZhciB0Q291bnQ9Yy5wb2ludENvdW50O2Zvcih2YXIgaj0wO2o8dENvdW50OysraikKe3ZhciBjY3A9Yy5wb2ludHNbal07dE1hdD1iMS5tX1I7dFZlYz1jY3AubG9jYWxBbmNob3IxO3ZhciByMVg9dE1hdC5jb2wxLngqdFZlYy54K3RNYXQuY29sMi54KnRWZWMueQp2YXIgcjFZPXRNYXQuY29sMS55KnRWZWMueCt0TWF0LmNvbDIueSp0VmVjLnkKdE1hdD1iMi5tX1I7dFZlYz1jY3AubG9jYWxBbmNob3IyO3ZhciByMlg9dE1hdC5jb2wxLngqdFZlYy54K3RNYXQuY29sMi54KnRWZWMueQp2YXIgcjJZPXRNYXQuY29sMS55KnRWZWMueCt0TWF0LmNvbDIueSp0VmVjLnkKdmFyIHAxWD1iMV9wb3NpdGlvbi54K3IxWDt2YXIgcDFZPWIxX3Bvc2l0aW9uLnkrcjFZO3ZhciBwMlg9YjJfcG9zaXRpb24ueCtyMlg7dmFyIHAyWT1iMl9wb3NpdGlvbi55K3IyWTt2YXIgZHBYPXAyWC1wMVg7dmFyIGRwWT1wMlktcDFZO3ZhciBzZXBhcmF0aW9uPShkcFgqbm9ybWFsWCtkcFkqbm9ybWFsWSkrY2NwLnNlcGFyYXRpb247bWluU2VwYXJhdGlvbj1iMk1hdGguYjJNaW4obWluU2VwYXJhdGlvbixzZXBhcmF0aW9uKTt2YXIgQz1iZXRhKmIyTWF0aC5iMkNsYW1wKHNlcGFyYXRpb24rYjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wLC1iMlNldHRpbmdzLmIyX21heExpbmVhckNvcnJlY3Rpb24sMC4wKTt2YXIgZEltcHVsc2U9LWNjcC5ub3JtYWxNYXNzKkM7dmFyIGltcHVsc2UwPWNjcC5wb3NpdGlvbkltcHVsc2U7Y2NwLnBvc2l0aW9uSW1wdWxzZT1iMk1hdGguYjJNYXgoaW1wdWxzZTArZEltcHVsc2UsMC4wKTtkSW1wdWxzZT1jY3AucG9zaXRpb25JbXB1bHNlLWltcHVsc2UwO3ZhciBpbXB1bHNlWD1kSW1wdWxzZSpub3JtYWxYO3ZhciBpbXB1bHNlWT1kSW1wdWxzZSpub3JtYWxZO2IxX3Bvc2l0aW9uLngtPWludk1hc3MxKmltcHVsc2VYO2IxX3Bvc2l0aW9uLnktPWludk1hc3MxKmltcHVsc2VZO2IxX3JvdGF0aW9uLT1pbnZJMSoocjFYKmltcHVsc2VZLXIxWSppbXB1bHNlWCk7YjEubV9SLlNldChiMV9yb3RhdGlvbik7YjJfcG9zaXRpb24ueCs9aW52TWFzczIqaW1wdWxzZVg7YjJfcG9zaXRpb24ueSs9aW52TWFzczIqaW1wdWxzZVk7YjJfcm90YXRpb24rPWludkkyKihyMlgqaW1wdWxzZVktcjJZKmltcHVsc2VYKTtiMi5tX1IuU2V0KGIyX3JvdGF0aW9uKTt9CmIxLm1fcm90YXRpb249YjFfcm90YXRpb247YjIubV9yb3RhdGlvbj1iMl9yb3RhdGlvbjt9CnJldHVybiBtaW5TZXBhcmF0aW9uPj0tYjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wO30sUG9zdFNvbHZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBpPTA7aTx0aGlzLm1fY29uc3RyYWludENvdW50OysraSkKe3ZhciBjPXRoaXMubV9jb25zdHJhaW50c1tpXTt2YXIgbT1jLm1hbmlmb2xkO2Zvcih2YXIgaj0wO2o8Yy5wb2ludENvdW50OysraikKe3ZhciBtUG9pbnQ9bS5wb2ludHNbal07dmFyIGNQb2ludD1jLnBvaW50c1tqXTttUG9pbnQubm9ybWFsSW1wdWxzZT1jUG9pbnQubm9ybWFsSW1wdWxzZTttUG9pbnQudGFuZ2VudEltcHVsc2U9Y1BvaW50LnRhbmdlbnRJbXB1bHNlO319fSxtX2FsbG9jYXRvcjpudWxsLG1fY29uc3RyYWludHM6bmV3IEFycmF5KCksbV9jb25zdHJhaW50Q291bnQ6MH07CnZhciBiMkNpcmNsZUNvbnRhY3Q9Q2xhc3MuY3JlYXRlKCk7T2JqZWN0LmV4dGVuZChiMkNpcmNsZUNvbnRhY3QucHJvdG90eXBlLGIyQ29udGFjdC5wcm90b3R5cGUpO09iamVjdC5leHRlbmQoYjJDaXJjbGVDb250YWN0LnByb3RvdHlwZSx7aW5pdGlhbGl6ZTpmdW5jdGlvbihzMSxzMil7dGhpcy5tX25vZGUxPW5ldyBiMkNvbnRhY3ROb2RlKCk7dGhpcy5tX25vZGUyPW5ldyBiMkNvbnRhY3ROb2RlKCk7dGhpcy5tX2ZsYWdzPTA7aWYoIXMxfHwhczIpe3RoaXMubV9zaGFwZTE9bnVsbDt0aGlzLm1fc2hhcGUyPW51bGw7cmV0dXJuO30KdGhpcy5tX3NoYXBlMT1zMTt0aGlzLm1fc2hhcGUyPXMyO3RoaXMubV9tYW5pZm9sZENvdW50PTA7dGhpcy5tX2ZyaWN0aW9uPU1hdGguc3FydCh0aGlzLm1fc2hhcGUxLm1fZnJpY3Rpb24qdGhpcy5tX3NoYXBlMi5tX2ZyaWN0aW9uKTt0aGlzLm1fcmVzdGl0dXRpb249YjJNYXRoLmIyTWF4KHRoaXMubV9zaGFwZTEubV9yZXN0aXR1dGlvbix0aGlzLm1fc2hhcGUyLm1fcmVzdGl0dXRpb24pO3RoaXMubV9wcmV2PW51bGw7dGhpcy5tX25leHQ9bnVsbDt0aGlzLm1fbm9kZTEuY29udGFjdD1udWxsO3RoaXMubV9ub2RlMS5wcmV2PW51bGw7dGhpcy5tX25vZGUxLm5leHQ9bnVsbDt0aGlzLm1fbm9kZTEub3RoZXI9bnVsbDt0aGlzLm1fbm9kZTIuY29udGFjdD1udWxsO3RoaXMubV9ub2RlMi5wcmV2PW51bGw7dGhpcy5tX25vZGUyLm5leHQ9bnVsbDt0aGlzLm1fbm9kZTIub3RoZXI9bnVsbDt0aGlzLm1fbWFuaWZvbGQ9W25ldyBiMk1hbmlmb2xkKCldO3RoaXMubV9tYW5pZm9sZFswXS5wb2ludENvdW50PTA7dGhpcy5tX21hbmlmb2xkWzBdLnBvaW50c1swXS5ub3JtYWxJbXB1bHNlPTAuMDt0aGlzLm1fbWFuaWZvbGRbMF0ucG9pbnRzWzBdLnRhbmdlbnRJbXB1bHNlPTAuMDt9LEV2YWx1YXRlOmZ1bmN0aW9uKCl7YjJDb2xsaXNpb24uYjJDb2xsaWRlQ2lyY2xlKHRoaXMubV9tYW5pZm9sZFswXSx0aGlzLm1fc2hhcGUxLHRoaXMubV9zaGFwZTIsZmFsc2UpO2lmKHRoaXMubV9tYW5pZm9sZFswXS5wb2ludENvdW50PjApCnt0aGlzLm1fbWFuaWZvbGRDb3VudD0xO30KZWxzZQp7dGhpcy5tX21hbmlmb2xkQ291bnQ9MDt9fSxHZXRNYW5pZm9sZHM6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMubV9tYW5pZm9sZDt9LG1fbWFuaWZvbGQ6W25ldyBiMk1hbmlmb2xkKCldfSk7YjJDaXJjbGVDb250YWN0LkNyZWF0ZT1mdW5jdGlvbihzaGFwZTEsc2hhcGUyLGFsbG9jYXRvcil7cmV0dXJuIG5ldyBiMkNpcmNsZUNvbnRhY3Qoc2hhcGUxLHNoYXBlMik7fTtiMkNpcmNsZUNvbnRhY3QuRGVzdHJveT1mdW5jdGlvbihjb250YWN0LGFsbG9jYXRvcil7fTsKdmFyIGIyQ29uc2VydmF0aXZlPUNsYXNzLmNyZWF0ZSgpO2IyQ29uc2VydmF0aXZlLnByb3RvdHlwZT17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe319CmIyQ29uc2VydmF0aXZlLlIxPW5ldyBiMk1hdDIyKCk7YjJDb25zZXJ2YXRpdmUuUjI9bmV3IGIyTWF0MjIoKTtiMkNvbnNlcnZhdGl2ZS54MT1uZXcgYjJWZWMyKCk7YjJDb25zZXJ2YXRpdmUueDI9bmV3IGIyVmVjMigpO2IyQ29uc2VydmF0aXZlLkNvbnNlcnZhdGl2ZT1mdW5jdGlvbihzaGFwZTEsc2hhcGUyKXt2YXIgYm9keTE9c2hhcGUxLkdldEJvZHkoKTt2YXIgYm9keTI9c2hhcGUyLkdldEJvZHkoKTt2YXIgdjFYPWJvZHkxLm1fcG9zaXRpb24ueC1ib2R5MS5tX3Bvc2l0aW9uMC54O3ZhciB2MVk9Ym9keTEubV9wb3NpdGlvbi55LWJvZHkxLm1fcG9zaXRpb24wLnk7dmFyIG9tZWdhMT1ib2R5MS5tX3JvdGF0aW9uLWJvZHkxLm1fcm90YXRpb24wO3ZhciB2Mlg9Ym9keTIubV9wb3NpdGlvbi54LWJvZHkyLm1fcG9zaXRpb24wLng7dmFyIHYyWT1ib2R5Mi5tX3Bvc2l0aW9uLnktYm9keTIubV9wb3NpdGlvbjAueTt2YXIgb21lZ2EyPWJvZHkyLm1fcm90YXRpb24tYm9keTIubV9yb3RhdGlvbjA7dmFyIHIxPXNoYXBlMS5HZXRNYXhSYWRpdXMoKTt2YXIgcjI9c2hhcGUyLkdldE1heFJhZGl1cygpO3ZhciBwMVN0YXJ0WD1ib2R5MS5tX3Bvc2l0aW9uMC54O3ZhciBwMVN0YXJ0WT1ib2R5MS5tX3Bvc2l0aW9uMC55O3ZhciBhMVN0YXJ0PWJvZHkxLm1fcm90YXRpb24wO3ZhciBwMlN0YXJ0WD1ib2R5Mi5tX3Bvc2l0aW9uMC54O3ZhciBwMlN0YXJ0WT1ib2R5Mi5tX3Bvc2l0aW9uMC55O3ZhciBhMlN0YXJ0PWJvZHkyLm1fcm90YXRpb24wO3ZhciBwMVg9cDFTdGFydFg7dmFyIHAxWT1wMVN0YXJ0WTt2YXIgYTE9YTFTdGFydDt2YXIgcDJYPXAyU3RhcnRYO3ZhciBwMlk9cDJTdGFydFk7dmFyIGEyPWEyU3RhcnQ7YjJDb25zZXJ2YXRpdmUuUjEuU2V0KGExKTtiMkNvbnNlcnZhdGl2ZS5SMi5TZXQoYTIpO3NoYXBlMS5RdWlja1N5bmMocDEsYjJDb25zZXJ2YXRpdmUuUjEpO3NoYXBlMi5RdWlja1N5bmMocDIsYjJDb25zZXJ2YXRpdmUuUjIpO3ZhciBzMT0wLjA7dmFyIG1heEl0ZXJhdGlvbnM9MTA7dmFyIGRYO3ZhciBkWTt2YXIgaW52UmVsYXRpdmVWZWxvY2l0eT0wLjA7dmFyIGhpdD10cnVlO2Zvcih2YXIgaXRlcj0wO2l0ZXI8bWF4SXRlcmF0aW9uczsrK2l0ZXIpCnt2YXIgZGlzdGFuY2U9YjJEaXN0YW5jZS5EaXN0YW5jZShiMkNvbnNlcnZhdGl2ZS54MSxiMkNvbnNlcnZhdGl2ZS54MixzaGFwZTEsc2hhcGUyKTtpZihkaXN0YW5jZTxiMlNldHRpbmdzLmIyX2xpbmVhclNsb3ApCntpZihpdGVyPT0wKQp7aGl0PWZhbHNlO30KZWxzZQp7aGl0PXRydWU7fQpicmVhazt9CmlmKGl0ZXI9PTApCntkWD1iMkNvbnNlcnZhdGl2ZS54Mi54LWIyQ29uc2VydmF0aXZlLngxLng7ZFk9YjJDb25zZXJ2YXRpdmUueDIueS1iMkNvbnNlcnZhdGl2ZS54MS55O3ZhciBkTGVuPU1hdGguc3FydChkWCpkWCtkWSpkWSk7dmFyIHJlbGF0aXZlVmVsb2NpdHk9KGRYKih2MVgtdjJYKStkWSoodjFZLXYyWSkpK01hdGguYWJzKG9tZWdhMSkqcjErTWF0aC5hYnMob21lZ2EyKSpyMjtpZihNYXRoLmFicyhyZWxhdGl2ZVZlbG9jaXR5KTxOdW1iZXIuTUlOX1ZBTFVFKQp7aGl0PWZhbHNlO2JyZWFrO30KaW52UmVsYXRpdmVWZWxvY2l0eT0xLjAvcmVsYXRpdmVWZWxvY2l0eTt9CnZhciBkcz1kaXN0YW5jZSppbnZSZWxhdGl2ZVZlbG9jaXR5O3ZhciBzMj1zMStkcztpZihzMjwwLjB8fDEuMDxzMikKe2hpdD1mYWxzZTticmVhazt9CmlmKHMyPCgxLjArMTAwLjAqTnVtYmVyLk1JTl9WQUxVRSkqczEpCntoaXQ9dHJ1ZTticmVhazt9CnMxPXMyO3AxWD1wMVN0YXJ0WCtzMSp2MS54O3AxWT1wMVN0YXJ0WStzMSp2MS55O2ExPWExU3RhcnQrczEqb21lZ2ExO3AyWD1wMlN0YXJ0WCtzMSp2Mi54O3AyWT1wMlN0YXJ0WStzMSp2Mi55O2EyPWEyU3RhcnQrczEqb21lZ2EyO2IyQ29uc2VydmF0aXZlLlIxLlNldChhMSk7YjJDb25zZXJ2YXRpdmUuUjIuU2V0KGEyKTtzaGFwZTEuUXVpY2tTeW5jKHAxLGIyQ29uc2VydmF0aXZlLlIxKTtzaGFwZTIuUXVpY2tTeW5jKHAyLGIyQ29uc2VydmF0aXZlLlIyKTt9CmlmKGhpdCkKe2RYPWIyQ29uc2VydmF0aXZlLngyLngtYjJDb25zZXJ2YXRpdmUueDEueDtkWT1iMkNvbnNlcnZhdGl2ZS54Mi55LWIyQ29uc2VydmF0aXZlLngxLnk7dmFyIGxlbmd0aD1NYXRoLnNxcnQoZFgqZFgrZFkqZFkpO2lmKGxlbmd0aD5GTFRfRVBTSUxPTikKe2QqPWIyX2xpbmVhclNsb3AvbGVuZ3RoO30KaWYoYm9keTEuSXNTdGF0aWMoKSkKe2JvZHkxLm1fcG9zaXRpb24ueD1wMVg7Ym9keTEubV9wb3NpdGlvbi55PXAxWTt9CmVsc2UKe2JvZHkxLm1fcG9zaXRpb24ueD1wMVgtZFg7Ym9keTEubV9wb3NpdGlvbi55PXAxWS1kWTt9CmJvZHkxLm1fcm90YXRpb249YTE7Ym9keTEubV9SLlNldChhMSk7Ym9keTEuUXVpY2tTeW5jU2hhcGVzKCk7aWYoYm9keTIuSXNTdGF0aWMoKSkKe2JvZHkyLm1fcG9zaXRpb24ueD1wMlg7Ym9keTIubV9wb3NpdGlvbi55PXAyWTt9CmVsc2UKe2JvZHkyLm1fcG9zaXRpb24ueD1wMlgrZFg7Ym9keTIubV9wb3NpdGlvbi55PXAyWStkWTt9CmJvZHkyLm1fcG9zaXRpb24ueD1wMlgrZFg7Ym9keTIubV9wb3NpdGlvbi55PXAyWStkWTtib2R5Mi5tX3JvdGF0aW9uPWEyO2JvZHkyLm1fUi5TZXQoYTIpO2JvZHkyLlF1aWNrU3luY1NoYXBlcygpO3JldHVybiB0cnVlO30Kc2hhcGUxLlF1aWNrU3luYyhib2R5MS5tX3Bvc2l0aW9uLGJvZHkxLm1fUik7c2hhcGUyLlF1aWNrU3luYyhib2R5Mi5tX3Bvc2l0aW9uLGJvZHkyLm1fUik7cmV0dXJuIGZhbHNlO307CnZhciBiMk51bGxDb250YWN0PUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJOdWxsQ29udGFjdC5wcm90b3R5cGUsYjJDb250YWN0LnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMk51bGxDb250YWN0LnByb3RvdHlwZSx7aW5pdGlhbGl6ZTpmdW5jdGlvbihzMSxzMil7dGhpcy5tX25vZGUxPW5ldyBiMkNvbnRhY3ROb2RlKCk7dGhpcy5tX25vZGUyPW5ldyBiMkNvbnRhY3ROb2RlKCk7dGhpcy5tX2ZsYWdzPTA7aWYoIXMxfHwhczIpe3RoaXMubV9zaGFwZTE9bnVsbDt0aGlzLm1fc2hhcGUyPW51bGw7cmV0dXJuO30KdGhpcy5tX3NoYXBlMT1zMTt0aGlzLm1fc2hhcGUyPXMyO3RoaXMubV9tYW5pZm9sZENvdW50PTA7dGhpcy5tX2ZyaWN0aW9uPU1hdGguc3FydCh0aGlzLm1fc2hhcGUxLm1fZnJpY3Rpb24qdGhpcy5tX3NoYXBlMi5tX2ZyaWN0aW9uKTt0aGlzLm1fcmVzdGl0dXRpb249YjJNYXRoLmIyTWF4KHRoaXMubV9zaGFwZTEubV9yZXN0aXR1dGlvbix0aGlzLm1fc2hhcGUyLm1fcmVzdGl0dXRpb24pO3RoaXMubV9wcmV2PW51bGw7dGhpcy5tX25leHQ9bnVsbDt0aGlzLm1fbm9kZTEuY29udGFjdD1udWxsO3RoaXMubV9ub2RlMS5wcmV2PW51bGw7dGhpcy5tX25vZGUxLm5leHQ9bnVsbDt0aGlzLm1fbm9kZTEub3RoZXI9bnVsbDt0aGlzLm1fbm9kZTIuY29udGFjdD1udWxsO3RoaXMubV9ub2RlMi5wcmV2PW51bGw7dGhpcy5tX25vZGUyLm5leHQ9bnVsbDt0aGlzLm1fbm9kZTIub3RoZXI9bnVsbDt9LEV2YWx1YXRlOmZ1bmN0aW9uKCl7fSxHZXRNYW5pZm9sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbDt9fSk7CnZhciBiMlBvbHlBbmRDaXJjbGVDb250YWN0PUNsYXNzLmNyZWF0ZSgpO09iamVjdC5leHRlbmQoYjJQb2x5QW5kQ2lyY2xlQ29udGFjdC5wcm90b3R5cGUsYjJDb250YWN0LnByb3RvdHlwZSk7T2JqZWN0LmV4dGVuZChiMlBvbHlBbmRDaXJjbGVDb250YWN0LnByb3RvdHlwZSx7aW5pdGlhbGl6ZTpmdW5jdGlvbihzMSxzMil7dGhpcy5tX25vZGUxPW5ldyBiMkNvbnRhY3ROb2RlKCk7dGhpcy5tX25vZGUyPW5ldyBiMkNvbnRhY3ROb2RlKCk7dGhpcy5tX2ZsYWdzPTA7aWYoIXMxfHwhczIpe3RoaXMubV9zaGFwZTE9bnVsbDt0aGlzLm1fc2hhcGUyPW51bGw7cmV0dXJuO30KdGhpcy5tX3NoYXBlMT1zMTt0aGlzLm1fc2hhcGUyPXMyO3RoaXMubV9tYW5pZm9sZENvdW50PTA7dGhpcy5tX2ZyaWN0aW9uPU1hdGguc3FydCh0aGlzLm1fc2hhcGUxLm1fZnJpY3Rpb24qdGhpcy5tX3NoYXBlMi5tX2ZyaWN0aW9uKTt0aGlzLm1fcmVzdGl0dXRpb249YjJNYXRoLmIyTWF4KHRoaXMubV9zaGFwZTEubV9yZXN0aXR1dGlvbix0aGlzLm1fc2hhcGUyLm1fcmVzdGl0dXRpb24pO3RoaXMubV9wcmV2PW51bGw7dGhpcy5tX25leHQ9bnVsbDt0aGlzLm1fbm9kZTEuY29udGFjdD1udWxsO3RoaXMubV9ub2RlMS5wcmV2PW51bGw7dGhpcy5tX25vZGUxLm5leHQ9bnVsbDt0aGlzLm1fbm9kZTEub3RoZXI9bnVsbDt0aGlzLm1fbm9kZTIuY29udGFjdD1udWxsO3RoaXMubV9ub2RlMi5wcmV2PW51bGw7dGhpcy5tX25vZGUyLm5leHQ9bnVsbDt0aGlzLm1fbm9kZTIub3RoZXI9bnVsbDt0aGlzLm1fbWFuaWZvbGQ9W25ldyBiMk1hbmlmb2xkKCldO2IyU2V0dGluZ3MuYjJBc3NlcnQodGhpcy5tX3NoYXBlMS5tX3R5cGU9PWIyU2hhcGUuZV9wb2x5U2hhcGUpO2IyU2V0dGluZ3MuYjJBc3NlcnQodGhpcy5tX3NoYXBlMi5tX3R5cGU9PWIyU2hhcGUuZV9jaXJjbGVTaGFwZSk7dGhpcy5tX21hbmlmb2xkWzBdLnBvaW50Q291bnQ9MDt0aGlzLm1fbWFuaWZvbGRbMF0ucG9pbnRzWzBdLm5vcm1hbEltcHVsc2U9MC4wO3RoaXMubV9tYW5pZm9sZFswXS5wb2ludHNbMF0udGFuZ2VudEltcHVsc2U9MC4wO30sRXZhbHVhdGU6ZnVuY3Rpb24oKXtiMkNvbGxpc2lvbi5iMkNvbGxpZGVQb2x5QW5kQ2lyY2xlKHRoaXMubV9tYW5pZm9sZFswXSx0aGlzLm1fc2hhcGUxLHRoaXMubV9zaGFwZTIsZmFsc2UpO2lmKHRoaXMubV9tYW5pZm9sZFswXS5wb2ludENvdW50PjApCnt0aGlzLm1fbWFuaWZvbGRDb3VudD0xO30KZWxzZQp7dGhpcy5tX21hbmlmb2xkQ291bnQ9MDt9fSxHZXRNYW5pZm9sZHM6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMubV9tYW5pZm9sZDt9LG1fbWFuaWZvbGQ6W25ldyBiMk1hbmlmb2xkKCldfSkKYjJQb2x5QW5kQ2lyY2xlQ29udGFjdC5DcmVhdGU9ZnVuY3Rpb24oc2hhcGUxLHNoYXBlMixhbGxvY2F0b3Ipe3JldHVybiBuZXcgYjJQb2x5QW5kQ2lyY2xlQ29udGFjdChzaGFwZTEsc2hhcGUyKTt9O2IyUG9seUFuZENpcmNsZUNvbnRhY3QuRGVzdHJveT1mdW5jdGlvbihjb250YWN0LGFsbG9jYXRvcil7fTsKdmFyIGIyUG9seUNvbnRhY3Q9Q2xhc3MuY3JlYXRlKCk7T2JqZWN0LmV4dGVuZChiMlBvbHlDb250YWN0LnByb3RvdHlwZSxiMkNvbnRhY3QucHJvdG90eXBlKTtPYmplY3QuZXh0ZW5kKGIyUG9seUNvbnRhY3QucHJvdG90eXBlLHtpbml0aWFsaXplOmZ1bmN0aW9uKHMxLHMyKXt0aGlzLm1fbm9kZTE9bmV3IGIyQ29udGFjdE5vZGUoKTt0aGlzLm1fbm9kZTI9bmV3IGIyQ29udGFjdE5vZGUoKTt0aGlzLm1fZmxhZ3M9MDtpZighczF8fCFzMil7dGhpcy5tX3NoYXBlMT1udWxsO3RoaXMubV9zaGFwZTI9bnVsbDtyZXR1cm47fQp0aGlzLm1fc2hhcGUxPXMxO3RoaXMubV9zaGFwZTI9czI7dGhpcy5tX21hbmlmb2xkQ291bnQ9MDt0aGlzLm1fZnJpY3Rpb249TWF0aC5zcXJ0KHRoaXMubV9zaGFwZTEubV9mcmljdGlvbip0aGlzLm1fc2hhcGUyLm1fZnJpY3Rpb24pO3RoaXMubV9yZXN0aXR1dGlvbj1iMk1hdGguYjJNYXgodGhpcy5tX3NoYXBlMS5tX3Jlc3RpdHV0aW9uLHRoaXMubV9zaGFwZTIubV9yZXN0aXR1dGlvbik7dGhpcy5tX3ByZXY9bnVsbDt0aGlzLm1fbmV4dD1udWxsO3RoaXMubV9ub2RlMS5jb250YWN0PW51bGw7dGhpcy5tX25vZGUxLnByZXY9bnVsbDt0aGlzLm1fbm9kZTEubmV4dD1udWxsO3RoaXMubV9ub2RlMS5vdGhlcj1udWxsO3RoaXMubV9ub2RlMi5jb250YWN0PW51bGw7dGhpcy5tX25vZGUyLnByZXY9bnVsbDt0aGlzLm1fbm9kZTIubmV4dD1udWxsO3RoaXMubV9ub2RlMi5vdGhlcj1udWxsO3RoaXMubTA9bmV3IGIyTWFuaWZvbGQoKTt0aGlzLm1fbWFuaWZvbGQ9W25ldyBiMk1hbmlmb2xkKCldO3RoaXMubV9tYW5pZm9sZFswXS5wb2ludENvdW50PTA7fSxtMDpuZXcgYjJNYW5pZm9sZCgpLEV2YWx1YXRlOmZ1bmN0aW9uKCl7dmFyIHRNYW5pPXRoaXMubV9tYW5pZm9sZFswXTt2YXIgdFBvaW50cz10aGlzLm0wLnBvaW50cztmb3IodmFyIGs9MDtrPHRNYW5pLnBvaW50Q291bnQ7aysrKXt2YXIgdFBvaW50PXRQb2ludHNba107dmFyIHRQb2ludDA9dE1hbmkucG9pbnRzW2tdO3RQb2ludC5ub3JtYWxJbXB1bHNlPXRQb2ludDAubm9ybWFsSW1wdWxzZTt0UG9pbnQudGFuZ2VudEltcHVsc2U9dFBvaW50MC50YW5nZW50SW1wdWxzZTt0UG9pbnQuaWQ9dFBvaW50MC5pZC5Db3B5KCk7fQp0aGlzLm0wLnBvaW50Q291bnQ9dE1hbmkucG9pbnRDb3VudDtiMkNvbGxpc2lvbi5iMkNvbGxpZGVQb2x5KHRNYW5pLHRoaXMubV9zaGFwZTEsdGhpcy5tX3NoYXBlMixmYWxzZSk7aWYodE1hbmkucG9pbnRDb3VudD4wKQp7dmFyIG1hdGNoPVtmYWxzZSxmYWxzZV07Zm9yKHZhciBpPTA7aTx0TWFuaS5wb2ludENvdW50OysraSkKe3ZhciBjcD10TWFuaS5wb2ludHNbaV07Y3Aubm9ybWFsSW1wdWxzZT0wLjA7Y3AudGFuZ2VudEltcHVsc2U9MC4wO3ZhciBpZEtleT1jcC5pZC5rZXk7Zm9yKHZhciBqPTA7ajx0aGlzLm0wLnBvaW50Q291bnQ7KytqKQp7aWYobWF0Y2hbal09PXRydWUpCmNvbnRpbnVlO3ZhciBjcDA9dGhpcy5tMC5wb2ludHNbal07dmFyIGlkMD1jcDAuaWQ7aWYoaWQwLmtleT09aWRLZXkpCnttYXRjaFtqXT10cnVlO2NwLm5vcm1hbEltcHVsc2U9Y3AwLm5vcm1hbEltcHVsc2U7Y3AudGFuZ2VudEltcHVsc2U9Y3AwLnRhbmdlbnRJbXB1bHNlO2JyZWFrO319fQp0aGlzLm1fbWFuaWZvbGRDb3VudD0xO30KZWxzZQp7dGhpcy5tX21hbmlmb2xkQ291bnQ9MDt9fSxHZXRNYW5pZm9sZHM6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMubV9tYW5pZm9sZDt9LG1fbWFuaWZvbGQ6W25ldyBiMk1hbmlmb2xkKCldfSk7YjJQb2x5Q29udGFjdC5DcmVhdGU9ZnVuY3Rpb24oc2hhcGUxLHNoYXBlMixhbGxvY2F0b3Ipe3JldHVybiBuZXcgYjJQb2x5Q29udGFjdChzaGFwZTEsc2hhcGUyKTt9O2IyUG9seUNvbnRhY3QuRGVzdHJveT1mdW5jdGlvbihjb250YWN0LGFsbG9jYXRvcil7fTsKdmFyIGIyQ29udGFjdE1hbmFnZXI9Q2xhc3MuY3JlYXRlKCk7T2JqZWN0LmV4dGVuZChiMkNvbnRhY3RNYW5hZ2VyLnByb3RvdHlwZSxiMlBhaXJDYWxsYmFjay5wcm90b3R5cGUpO09iamVjdC5leHRlbmQoYjJDb250YWN0TWFuYWdlci5wcm90b3R5cGUse2luaXRpYWxpemU6ZnVuY3Rpb24oKXt0aGlzLm1fbnVsbENvbnRhY3Q9bmV3IGIyTnVsbENvbnRhY3QoKTt0aGlzLm1fd29ybGQ9bnVsbDt0aGlzLm1fZGVzdHJveUltbWVkaWF0ZT1mYWxzZTt9LFBhaXJBZGRlZDpmdW5jdGlvbihwcm94eVVzZXJEYXRhMSxwcm94eVVzZXJEYXRhMil7dmFyIHNoYXBlMT1wcm94eVVzZXJEYXRhMTt2YXIgc2hhcGUyPXByb3h5VXNlckRhdGEyO3ZhciBib2R5MT1zaGFwZTEubV9ib2R5O3ZhciBib2R5Mj1zaGFwZTIubV9ib2R5O2lmKGJvZHkxLklzU3RhdGljKCkmJmJvZHkyLklzU3RhdGljKCkpCntyZXR1cm4gdGhpcy5tX251bGxDb250YWN0O30KaWYoc2hhcGUxLm1fYm9keT09c2hhcGUyLm1fYm9keSkKe3JldHVybiB0aGlzLm1fbnVsbENvbnRhY3Q7fQppZihib2R5Mi5Jc0Nvbm5lY3RlZChib2R5MSkpCntyZXR1cm4gdGhpcy5tX251bGxDb250YWN0O30KaWYodGhpcy5tX3dvcmxkLm1fZmlsdGVyIT1udWxsJiZ0aGlzLm1fd29ybGQubV9maWx0ZXIuU2hvdWxkQ29sbGlkZShzaGFwZTEsc2hhcGUyKT09ZmFsc2UpCntyZXR1cm4gdGhpcy5tX251bGxDb250YWN0O30KaWYoYm9keTIubV9pbnZNYXNzPT0wLjApCnt2YXIgdGVtcFNoYXBlPXNoYXBlMTtzaGFwZTE9c2hhcGUyO3NoYXBlMj10ZW1wU2hhcGU7dmFyIHRlbXBCb2R5PWJvZHkxO2JvZHkxPWJvZHkyO2JvZHkyPXRlbXBCb2R5O30KdmFyIGNvbnRhY3Q9YjJDb250YWN0LkNyZWF0ZShzaGFwZTEsc2hhcGUyLHRoaXMubV93b3JsZC5tX2Jsb2NrQWxsb2NhdG9yKTtpZihjb250YWN0PT1udWxsKQp7cmV0dXJuIHRoaXMubV9udWxsQ29udGFjdDt9CmVsc2UKe2NvbnRhY3QubV9wcmV2PW51bGw7Y29udGFjdC5tX25leHQ9dGhpcy5tX3dvcmxkLm1fY29udGFjdExpc3Q7aWYodGhpcy5tX3dvcmxkLm1fY29udGFjdExpc3QhPW51bGwpCnt0aGlzLm1fd29ybGQubV9jb250YWN0TGlzdC5tX3ByZXY9Y29udGFjdDt9CnRoaXMubV93b3JsZC5tX2NvbnRhY3RMaXN0PWNvbnRhY3Q7dGhpcy5tX3dvcmxkLm1fY29udGFjdENvdW50Kys7fQpyZXR1cm4gY29udGFjdDt9LFBhaXJSZW1vdmVkOmZ1bmN0aW9uKHByb3h5VXNlckRhdGExLHByb3h5VXNlckRhdGEyLHBhaXJVc2VyRGF0YSl7aWYocGFpclVzZXJEYXRhPT1udWxsKQp7cmV0dXJuO30KdmFyIGM9cGFpclVzZXJEYXRhO2lmKGMhPXRoaXMubV9udWxsQ29udGFjdCkKe2lmKHRoaXMubV9kZXN0cm95SW1tZWRpYXRlPT10cnVlKQp7dGhpcy5EZXN0cm95Q29udGFjdChjKTtjPW51bGw7fQplbHNlCntjLm1fZmxhZ3N8PWIyQ29udGFjdC5lX2Rlc3Ryb3lGbGFnO319fSxEZXN0cm95Q29udGFjdDpmdW5jdGlvbihjKQp7aWYoYy5tX3ByZXYpCntjLm1fcHJldi5tX25leHQ9Yy5tX25leHQ7fQppZihjLm1fbmV4dCkKe2MubV9uZXh0Lm1fcHJldj1jLm1fcHJldjt9CmlmKGM9PXRoaXMubV93b3JsZC5tX2NvbnRhY3RMaXN0KQp7dGhpcy5tX3dvcmxkLm1fY29udGFjdExpc3Q9Yy5tX25leHQ7fQppZihjLkdldE1hbmlmb2xkQ291bnQoKT4wKQp7dmFyIGJvZHkxPWMubV9zaGFwZTEubV9ib2R5O3ZhciBib2R5Mj1jLm1fc2hhcGUyLm1fYm9keTt2YXIgbm9kZTE9Yy5tX25vZGUxO3ZhciBub2RlMj1jLm1fbm9kZTI7Ym9keTEuV2FrZVVwKCk7Ym9keTIuV2FrZVVwKCk7aWYobm9kZTEucHJldikKe25vZGUxLnByZXYubmV4dD1ub2RlMS5uZXh0O30KaWYobm9kZTEubmV4dCkKe25vZGUxLm5leHQucHJldj1ub2RlMS5wcmV2O30KaWYobm9kZTE9PWJvZHkxLm1fY29udGFjdExpc3QpCntib2R5MS5tX2NvbnRhY3RMaXN0PW5vZGUxLm5leHQ7fQpub2RlMS5wcmV2PW51bGw7bm9kZTEubmV4dD1udWxsO2lmKG5vZGUyLnByZXYpCntub2RlMi5wcmV2Lm5leHQ9bm9kZTIubmV4dDt9CmlmKG5vZGUyLm5leHQpCntub2RlMi5uZXh0LnByZXY9bm9kZTIucHJldjt9CmlmKG5vZGUyPT1ib2R5Mi5tX2NvbnRhY3RMaXN0KQp7Ym9keTIubV9jb250YWN0TGlzdD1ub2RlMi5uZXh0O30Kbm9kZTIucHJldj1udWxsO25vZGUyLm5leHQ9bnVsbDt9CmIyQ29udGFjdC5EZXN0cm95KGMsdGhpcy5tX3dvcmxkLm1fYmxvY2tBbGxvY2F0b3IpOy0tdGhpcy5tX3dvcmxkLm1fY29udGFjdENvdW50O30sQ2xlYW5Db250YWN0TGlzdDpmdW5jdGlvbigpCnt2YXIgYz10aGlzLm1fd29ybGQubV9jb250YWN0TGlzdDt3aGlsZShjIT1udWxsKQp7dmFyIGMwPWM7Yz1jLm1fbmV4dDtpZihjMC5tX2ZsYWdzJmIyQ29udGFjdC5lX2Rlc3Ryb3lGbGFnKQp7dGhpcy5EZXN0cm95Q29udGFjdChjMCk7YzA9bnVsbDt9fX0sQ29sbGlkZTpmdW5jdGlvbigpCnt2YXIgYm9keTE7dmFyIGJvZHkyO3ZhciBub2RlMTt2YXIgbm9kZTI7Zm9yKHZhciBjPXRoaXMubV93b3JsZC5tX2NvbnRhY3RMaXN0O2MhPW51bGw7Yz1jLm1fbmV4dCkKe2lmKGMubV9zaGFwZTEubV9ib2R5LklzU2xlZXBpbmcoKSYmYy5tX3NoYXBlMi5tX2JvZHkuSXNTbGVlcGluZygpKQp7Y29udGludWU7fQp2YXIgb2xkQ291bnQ9Yy5HZXRNYW5pZm9sZENvdW50KCk7Yy5FdmFsdWF0ZSgpO3ZhciBuZXdDb3VudD1jLkdldE1hbmlmb2xkQ291bnQoKTtpZihvbGRDb3VudD09MCYmbmV3Q291bnQ|PWIyU2V0dGluZ3MuYjJfdGltZVRvU2xlZXApCntmb3IoaT0wO2k8dGhpcy5tX2JvZHlDb3VudDsrK2kpCntiPXRoaXMubV9ib2RpZXNbaV07Yi5tX2ZsYWdzfD1iMkJvZHkuZV9zbGVlcEZsYWc7fX19LEFkZEJvZHk6ZnVuY3Rpb24oYm9keSkKe3RoaXMubV9ib2RpZXNbdGhpcy5tX2JvZHlDb3VudCsrXT1ib2R5O30sQWRkQ29udGFjdDpmdW5jdGlvbihjb250YWN0KQp7dGhpcy5tX2NvbnRhY3RzW3RoaXMubV9jb250YWN0Q291bnQrK109Y29udGFjdDt9LEFkZEpvaW50OmZ1bmN0aW9uKGpvaW50KQp7dGhpcy5tX2pvaW50c1t0aGlzLm1fam9pbnRDb3VudCsrXT1qb2ludDt9LG1fYWxsb2NhdG9yOm51bGwsbV9ib2RpZXM6bnVsbCxtX2NvbnRhY3RzOm51bGwsbV9qb2ludHM6bnVsbCxtX2JvZHlDb3VudDowLG1fam9pbnRDb3VudDowLG1fY29udGFjdENvdW50OjAsbV9ib2R5Q2FwYWNpdHk6MCxtX2NvbnRhY3RDYXBhY2l0eTowLG1fam9pbnRDYXBhY2l0eTowLG1fcG9zaXRpb25FcnJvcjpudWxsfTtiMklzbGFuZC5tX3Bvc2l0aW9uSXRlcmF0aW9uQ291bnQ9MDsKdmFyIGIyVGltZVN0ZXA9Q2xhc3MuY3JlYXRlKCk7YjJUaW1lU3RlcC5wcm90b3R5cGU9e2R0Om51bGwsaW52X2R0Om51bGwsaXRlcmF0aW9uczowLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9fTsKdmFyIGIyQ29udGFjdE5vZGU9Q2xhc3MuY3JlYXRlKCk7YjJDb250YWN0Tm9kZS5wcm90b3R5cGU9e290aGVyOm51bGwsY29udGFjdDpudWxsLHByZXY6bnVsbCxuZXh0Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbigpe319Owp2YXIgYjJDb250YWN0PUNsYXNzLmNyZWF0ZSgpO2IyQ29udGFjdC5wcm90b3R5cGU9e0dldE1hbmlmb2xkczpmdW5jdGlvbigpe3JldHVybiBudWxsfSxHZXRNYW5pZm9sZENvdW50OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLm1fbWFuaWZvbGRDb3VudDt9LEdldE5leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX25leHQ7fSxHZXRTaGFwZTE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tX3NoYXBlMTt9LEdldFNoYXBlMjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1fc2hhcGUyO30saW5pdGlhbGl6ZTpmdW5jdGlvbihzMSxzMikKe3RoaXMubV9ub2RlMT1uZXcgYjJDb250YWN0Tm9kZSgpO3RoaXMubV9ub2RlMj1uZXcgYjJDb250YWN0Tm9kZSgpO3RoaXMubV9mbGFncz0wO2lmKCFzMXx8IXMyKXt0aGlzLm1fc2hhcGUxPW51bGw7dGhpcy5tX3NoYXBlMj1udWxsO3JldHVybjt9CnRoaXMubV9zaGFwZTE9czE7dGhpcy5tX3NoYXBlMj1zMjt0aGlzLm1fbWFuaWZvbGRDb3VudD0wO3RoaXMubV9mcmljdGlvbj1NYXRoLnNxcnQodGhpcy5tX3NoYXBlMS5tX2ZyaWN0aW9uKnRoaXMubV9zaGFwZTIubV9mcmljdGlvbik7dGhpcy5tX3Jlc3RpdHV0aW9uPWIyTWF0aC5iMk1heCh0aGlzLm1fc2hhcGUxLm1fcmVzdGl0dXRpb24sdGhpcy5tX3NoYXBlMi5tX3Jlc3RpdHV0aW9uKTt0aGlzLm1fcHJldj1udWxsO3RoaXMubV9uZXh0PW51bGw7dGhpcy5tX25vZGUxLmNvbnRhY3Q9bnVsbDt0aGlzLm1fbm9kZTEucHJldj1udWxsO3RoaXMubV9ub2RlMS5uZXh0PW51bGw7dGhpcy5tX25vZGUxLm90aGVyPW51bGw7dGhpcy5tX25vZGUyLmNvbnRhY3Q9bnVsbDt0aGlzLm1fbm9kZTIucHJldj1udWxsO3RoaXMubV9ub2RlMi5uZXh0PW51bGw7dGhpcy5tX25vZGUyLm90aGVyPW51bGw7fSxFdmFsdWF0ZTpmdW5jdGlvbigpe30sbV9mbGFnczowLG1fcHJldjpudWxsLG1fbmV4dDpudWxsLG1fbm9kZTE6bmV3IGIyQ29udGFjdE5vZGUoKSxtX25vZGUyOm5ldyBiMkNvbnRhY3ROb2RlKCksbV9zaGFwZTE6bnVsbCxtX3NoYXBlMjpudWxsLG1fbWFuaWZvbGRDb3VudDowLG1fZnJpY3Rpb246bnVsbCxtX3Jlc3RpdHV0aW9uOm51bGx9O2IyQ29udGFjdC5lX2lzbGFuZEZsYWc9MHgwMDAxO2IyQ29udGFjdC5lX2Rlc3Ryb3lGbGFnPTB4MDAwMjtiMkNvbnRhY3QuQWRkVHlwZT1mdW5jdGlvbihjcmVhdGVGY24sZGVzdHJveUZjbix0eXBlMSx0eXBlMikKe2IyQ29udGFjdC5zX3JlZ2lzdGVyc1t0eXBlMV1bdHlwZTJdLmNyZWF0ZUZjbj1jcmVhdGVGY247YjJDb250YWN0LnNfcmVnaXN0ZXJzW3R5cGUxXVt0eXBlMl0uZGVzdHJveUZjbj1kZXN0cm95RmNuO2IyQ29udGFjdC5zX3JlZ2lzdGVyc1t0eXBlMV1bdHlwZTJdLnByaW1hcnk9dHJ1ZTtpZih0eXBlMSE9dHlwZTIpCntiMkNvbnRhY3Quc19yZWdpc3RlcnNbdHlwZTJdW3R5cGUxXS5jcmVhdGVGY249Y3JlYXRlRmNuO2IyQ29udGFjdC5zX3JlZ2lzdGVyc1t0eXBlMl1bdHlwZTFdLmRlc3Ryb3lGY249ZGVzdHJveUZjbjtiMkNvbnRhY3Quc19yZWdpc3RlcnNbdHlwZTJdW3R5cGUxXS5wcmltYXJ5PWZhbHNlO319O2IyQ29udGFjdC5Jbml0aWFsaXplUmVnaXN0ZXJzPWZ1bmN0aW9uKCl7YjJDb250YWN0LnNfcmVnaXN0ZXJzPW5ldyBBcnJheShiMlNoYXBlLmVfc2hhcGVUeXBlQ291bnQpO2Zvcih2YXIgaT0wO2k8YjJTaGFwZS5lX3NoYXBlVHlwZUNvdW50O2krKyl7YjJDb250YWN0LnNfcmVnaXN0ZXJzW2ldPW5ldyBBcnJheShiMlNoYXBlLmVfc2hhcGVUeXBlQ291bnQpO2Zvcih2YXIgaj0wO2o8YjJTaGFwZS5lX3NoYXBlVHlwZUNvdW50O2orKyl7YjJDb250YWN0LnNfcmVnaXN0ZXJzW2ldW2pdPW5ldyBiMkNvbnRhY3RSZWdpc3RlcigpO319CmIyQ29udGFjdC5BZGRUeXBlKGIyQ2lyY2xlQ29udGFjdC5DcmVhdGUsYjJDaXJjbGVDb250YWN0LkRlc3Ryb3ksYjJTaGFwZS5lX2NpcmNsZVNoYXBlLGIyU2hhcGUuZV9jaXJjbGVTaGFwZSk7YjJDb250YWN0LkFkZFR5cGUoYjJQb2x5QW5kQ2lyY2xlQ29udGFjdC5DcmVhdGUsYjJQb2x5QW5kQ2lyY2xlQ29udGFjdC5EZXN0cm95LGIyU2hhcGUuZV9wb2x5U2hhcGUsYjJTaGFwZS5lX2NpcmNsZVNoYXBlKTtiMkNvbnRhY3QuQWRkVHlwZShiMlBvbHlDb250YWN0LkNyZWF0ZSxiMlBvbHlDb250YWN0LkRlc3Ryb3ksYjJTaGFwZS5lX3BvbHlTaGFwZSxiMlNoYXBlLmVfcG9seVNoYXBlKTt9O2IyQ29udGFjdC5DcmVhdGU9ZnVuY3Rpb24oc2hhcGUxLHNoYXBlMixhbGxvY2F0b3Ipe2lmKGIyQ29udGFjdC5zX2luaXRpYWxpemVkPT1mYWxzZSkKe2IyQ29udGFjdC5Jbml0aWFsaXplUmVnaXN0ZXJzKCk7YjJDb250YWN0LnNfaW5pdGlhbGl6ZWQ9dHJ1ZTt9CnZhciB0eXBlMT1zaGFwZTEubV90eXBlO3ZhciB0eXBlMj1zaGFwZTIubV90eXBlO3ZhciBjcmVhdGVGY249YjJDb250YWN0LnNfcmVnaXN0ZXJzW3R5cGUxXVt0eXBlMl0uY3JlYXRlRmNuO2lmKGNyZWF0ZUZjbikKe2lmKGIyQ29udGFjdC5zX3JlZ2lzdGVyc1t0eXBlMV1bdHlwZTJdLnByaW1hcnkpCntyZXR1cm4gY3JlYXRlRmNuKHNoYXBlMSxzaGFwZTIsYWxsb2NhdG9yKTt9CmVsc2UKe3ZhciBjPWNyZWF0ZUZjbihzaGFwZTIsc2hhcGUxLGFsbG9jYXRvcik7Zm9yKHZhciBpPTA7aTxjLkdldE1hbmlmb2xkQ291bnQoKTsrK2kpCnt2YXIgbT1jLkdldE1hbmlmb2xkcygpW2ldO20ubm9ybWFsPW0ubm9ybWFsLk5lZ2F0aXZlKCk7fQpyZXR1cm4gYzt9fQplbHNlCntyZXR1cm4gbnVsbDt9fTtiMkNvbnRhY3QuRGVzdHJveT1mdW5jdGlvbihjb250YWN0LGFsbG9jYXRvcil7aWYoY29udGFjdC5HZXRNYW5pZm9sZENvdW50KCk|YTpiO307YjJNYXRoLmIyTWF4Vj1mdW5jdGlvbihhLGIpCnt2YXIgYz1uZXcgYjJWZWMyKGIyTWF0aC5iMk1heChhLngsYi54KSxiMk1hdGguYjJNYXgoYS55LGIueSkpO3JldHVybiBjO307YjJNYXRoLmIyQ2xhbXA9ZnVuY3Rpb24oYSxsb3csaGlnaCkKe3JldHVybiBiMk1hdGguYjJNYXgobG93LGIyTWF0aC5iMk1pbihhLGhpZ2gpKTt9O2IyTWF0aC5iMkNsYW1wVj1mdW5jdGlvbihhLGxvdyxoaWdoKQp7cmV0dXJuIGIyTWF0aC5iMk1heFYobG93LGIyTWF0aC5iMk1pblYoYSxoaWdoKSk7fTtiMk1hdGguYjJTd2FwPWZ1bmN0aW9uKGEsYikKe3ZhciB0bXA9YVswXTthWzBdPWJbMF07YlswXT10bXA7fTtiMk1hdGguYjJSYW5kb209ZnVuY3Rpb24oKQp7cmV0dXJuIE1hdGgucmFuZG9tKCkqMi0xO307YjJNYXRoLmIyTmV4dFBvd2VyT2ZUd289ZnVuY3Rpb24oeCkKe3h8PSh4Pj4xKSYweDdGRkZGRkZGO3h8PSh4Pj4yKSYweDNGRkZGRkZGO3h8PSh4Pj40KSYweDBGRkZGRkZGO3h8PSh4Pj44KSYweDAwRkZGRkZGO3h8PSh4Pj4xNikmMHgwMDAwRkZGRjtyZXR1cm4geCsxO307YjJNYXRoLmIySXNQb3dlck9mVHdvPWZ1bmN0aW9uKHgpCnt2YXIgcmVzdWx0PXg|YTpiO307YjJNYXRoLmIyTWluVj1mdW5jdGlvbihhLGIpCnt2YXIgYz1uZXcgYjJWZWMyKGIyTWF0aC5iMk1pbihhLngsYi54KSxiMk1hdGguYjJNaW4oYS55LGIueSkpO3JldHVybiBjO307YjJNYXRoLmIyTWF4PWZ1bmN0aW9uKGEsYikKe3JldHVybiBhPmI|L2dpLHViPS9zZWxlY3R8dGV4dGFyZWEvaSx2Yj0vY29sb3J8ZGF0ZXxkYXRldGltZXxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrL2ksTj0vPVw|XC9zY3JpcHQ|MCYmZD4wJiYhZj9mYWxzZTpjLmN1ckNTUyhhLCJkaXNwbGF5Iik9PT0ibm9uZSJ9O2MuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWMuZXhwci5maWx0ZXJzLmhpZGRlbihhKX19dmFyIHNiPUooKSx0Yj0vPHNjcmlwdCgufFxzKSo|IjFlbSI6Znx8MDtmPWUucGl4ZWxMZWZ0KyJweCI7ZS5sZWZ0PWI7YS5ydW50aW1lU3R5bGUubGVmdD1qfX1yZXR1cm4gZn0sc3dhcDpmdW5jdGlvbihhLGIsZCl7dmFyIGY9e307Zm9yKHZhciBlIGluIGIpe2ZbZV09YS5zdHlsZVtlXTthLnN0eWxlW2VdPWJbZV19ZC5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1mW2VdfX0pO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpe2MuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj0KYS5vZmZzZXRXaWR0aCxkPWEub2Zmc2V0SGVpZ2h0LGY9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRyIjtyZXR1cm4gYj09PTAmJmQ9PT0wJiYhZj90cnVlOmI|KCZ8JCkvLGthPS9cPy8sd2I9LyhcP3wmKV89Lio|KCZ8JCkvLHhiPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLyx5Yj0vJTIwL2csemI9Yy5mbi5sb2FkO2MuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYixkKXtpZih0eXBlb2YgYSE9PQoic3RyaW5nIilyZXR1cm4gemIuY2FsbCh0aGlzLGEpO2Vsc2UgaWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBmPWEuaW5kZXhPZigiICIpO2lmKGY|CiImIjoiPyIpKyhlLmpzb25wfHwiY2FsbGJhY2siKSsiPT8iKTtlbHNlIGlmKCFlLmRhdGF8fCFOLnRlc3QoZS5kYXRhKSllLmRhdGE9KGUuZGF0YT9lLmRhdGErIiYiOiIiKSsoZS5qc29ucHx8ImNhbGxiYWNrIikrIj0|YyhlLmNvbnRleHQpOmMuZXZlbnQpLnRyaWdnZXIocSxwKX12YXIgZT1jLmV4dGVuZCh0cnVlLHt9LGMuYWpheFNldHRpbmdzLGEpLGosaSxvLGs9YSYmYS5jb250ZXh0fHxlLG49ZS50eXBlLnRvVXBwZXJDYXNlKCk7aWYoZS5kYXRhJiZlLnByb2Nlc3NEYXRhJiZ0eXBlb2YgZS5kYXRhIT09InN0cmluZyIpZS5kYXRhPWMucGFyYW0oZS5kYXRhLGUudHJhZGl0aW9uYWwpO2lmKGUuZGF0YVR5cGU9PT0ianNvbnAiKXtpZihuPT09IkdFVCIpTi50ZXN0KGUudXJsKXx8KGUudXJsKz0oa2EudGVzdChlLnVybCk|IikuYXBwZW5kKGkucmVzcG9uc2VUZXh0LnJlcGxhY2UodGIsIiIpKS5maW5kKGUpOmkucmVzcG9uc2VUZXh0KTtkJiZqLmVhY2goZCxbaS5yZXNwb25zZVRleHQsbyxpXSl9fSk7cmV0dXJuIHRoaXN9LApzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2MubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8dWIudGVzdCh0aGlzLm5vZGVOYW1lKXx8dmIudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe2E9Yyh0aGlzKS52YWwoKTtyZXR1cm4gYT09bnVsbD9udWxsOmMuaXNBcnJheShhKT9jLm1hcChhLGZ1bmN0aW9uKGQpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTpkfX0pOntuYW1lOmIubmFtZSx2YWx1ZTphfX0pLmdldCgpfX0pO2MuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksCmZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5iaW5kKGIsZCl9fSk7Yy5leHRlbmQoe2dldDpmdW5jdGlvbihhLGIsZCxmKXtpZihjLmlzRnVuY3Rpb24oYikpe2Y9Znx8ZDtkPWI7Yj1udWxsfXJldHVybiBjLmFqYXgoe3R5cGU6IkdFVCIsdXJsOmEsZGF0YTpiLHN1Y2Nlc3M6ZCxkYXRhVHlwZTpmfSl9LGdldFNjcmlwdDpmdW5jdGlvbihhLGIpe3JldHVybiBjLmdldChhLG51bGwsYiwic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmdldChhLGIsZCwianNvbiIpfSxwb3N0OmZ1bmN0aW9uKGEsYixkLGYpe2lmKGMuaXNGdW5jdGlvbihiKSl7Zj1mfHxkO2Q9YjtiPXt9fXJldHVybiBjLmFqYXgoe3R5cGU6IlBPU1QiLHVybDphLGRhdGE6YixzdWNjZXNzOmQsZGF0YVR5cGU6Zn0pfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSl7Yy5leHRlbmQoYy5hamF4U2V0dGluZ3MsYSl9LGFqYXhTZXR0aW5nczp7dXJsOmxvY2F0aW9uLmhyZWYsCmdsb2JhbDp0cnVlLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6dHJ1ZSxhc3luYzp0cnVlLHhocjpBLlhNTEh0dHBSZXF1ZXN0JiYoQS5sb2NhdGlvbi5wcm90b2NvbCE9PSJmaWxlOiJ8fCFBLkFjdGl2ZVhPYmplY3QpP2Z1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLlhNTEh0dHBSZXF1ZXN0fTpmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChhKXt9fSxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsc2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsdGV4dDoidGV4dC9wbGFpbiIsX2RlZmF1bHQ6IiovKiJ9fSxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4OmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtlLnN1Y2Nlc3MmJgplLnN1Y2Nlc3MuY2FsbChrLG8saSx4KTtlLmdsb2JhbCYmZigiYWpheFN1Y2Nlc3MiLFt4LGVdKX1mdW5jdGlvbiBkKCl7ZS5jb21wbGV0ZSYmZS5jb21wbGV0ZS5jYWxsKGsseCxpKTtlLmdsb2JhbCYmZigiYWpheENvbXBsZXRlIixbeCxlXSk7ZS5nbG9iYWwmJiEtLWMuYWN0aXZlJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIil9ZnVuY3Rpb24gZihxLHApeyhlLmNvbnRleHQ|PTApe3ZhciBlPWEuc2xpY2UoZixhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZil9Zj0iR0VUIjtpZihiKWlmKGMuaXNGdW5jdGlvbihiKSl7ZD1iO2I9bnVsbH1lbHNlIGlmKHR5cGVvZiBiPT09Im9iamVjdCIpe2I9Yy5wYXJhbShiLGMuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKTtmPSJQT1NUIn12YXIgaj10aGlzO2MuYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmIsY29tcGxldGU6ZnVuY3Rpb24oaSxvKXtpZihvPT09InN1Y2Nlc3MifHxvPT09Im5vdG1vZGlmaWVkIilqLmh0bWwoZT9jKCI8ZGl2IC8|IjEiOmZ9aWYoaGEudGVzdChiKSliPVBhO2lmKCFkJiZlJiZlW2JdKWY9ZVtiXTtlbHNlIGlmKHJiKXtpZihoYS50ZXN0KGIpKWI9ImZsb2F0IjtiPWIucmVwbGFjZShsYiwiLSQxIikudG9Mb3dlckNhc2UoKTtlPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztpZighZSlyZXR1cm4gbnVsbDtpZihhPWUuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKWY9CmEuZ2V0UHJvcGVydHlWYWx1ZShiKTtpZihiPT09Im9wYWNpdHkiJiZmPT09IiIpZj0iMSJ9ZWxzZSBpZihhLmN1cnJlbnRTdHlsZSl7ZD1iLnJlcGxhY2UoaWEsamEpO2Y9YS5jdXJyZW50U3R5bGVbYl18fGEuY3VycmVudFN0eWxlW2RdO2lmKCFtYi50ZXN0KGYpJiZuYi50ZXN0KGYpKXtiPWUubGVmdDt2YXIgaj1hLnJ1bnRpbWVTdHlsZS5sZWZ0O2EucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdDtlLmxlZnQ9ZD09PSJmb250U2l6ZSI|aSgpOmMuc3dhcChhLG9iLGkpO3JldHVybiBNYXRoLm1heCgwLE1hdGgucm91bmQoZSkpfXJldHVybiBjLmN1ckNTUyhhLGIsZCl9LGN1ckNTUzpmdW5jdGlvbihhLGIsZCl7dmFyIGYsZT1hLnN0eWxlO2lmKCFjLnN1cHBvcnQub3BhY2l0eSYmYj09PSJvcGFjaXR5IiYmYS5jdXJyZW50U3R5bGUpe2Y9T2EudGVzdChhLmN1cnJlbnRTdHlsZS5maWx0ZXJ8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOiIiO3JldHVybiBmPT09IiI|IiYmIW4|MD90aGlzLmNsb25lKHRydWUpOnRoaXMpLmdldCgpO2MuZm5bYl0uYXBwbHkoYyhkW2VdKSxpKTtmPWYuY29uY2F0KGkpfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLGEsZC5zZWxlY3Rvcil9fX0pO2MuZXh0ZW5kKHtjbGVhbjpmdW5jdGlvbihhLGIsZCxmKXtiPWJ8fHM7aWYodHlwZW9mIGIuY3JlYXRlRWxlbWVudD09PSJ1bmRlZmluZWQiKWI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fHM7Zm9yKHZhciBlPVtdLGo9MCxpOyhpPWFbal0pIT1udWxsO2orKyl7aWYodHlwZW9mIGk9PT0ibnVtYmVyIilpKz0iIjtpZihpKXtpZih0eXBlb2YgaT09PSJzdHJpbmciJiYhamIudGVzdChpKSlpPWIuY3JlYXRlVGV4dE5vZGUoaSk7ZWxzZSBpZih0eXBlb2YgaT09PSJzdHJpbmciKXtpPWkucmVwbGFjZShLYSxNYSk7dmFyIG89KExhLmV4ZWMoaSl8fFsiIiwKIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGs9RltvXXx8Ri5fZGVmYXVsdCxuPWtbMF0scj1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ZvcihyLmlubmVySFRNTD1rWzFdK2kra1syXTtuLS07KXI9ci5sYXN0Q2hpbGQ7aWYoIWMuc3VwcG9ydC50Ym9keSl7bj1pYi50ZXN0KGkpO289bz09PSJ0YWJsZSImJiFuP3IuZmlyc3RDaGlsZCYmci5maXJzdENoaWxkLmNoaWxkTm9kZXM6a1sxXT09PSI8dGFibGU|MT9rLmNsb25lTm9kZSh0cnVlKTprKX1vLmxlbmd0aCYmYy5lYWNoKG8sUWEpfXJldHVybiB0aGlzfX0pO2MuZnJhZ21lbnRzPXt9O2MuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Yy5mblthXT1mdW5jdGlvbihkKXt2YXIgZj1bXTtkPWMoZCk7dmFyIGU9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZSYmZS5ub2RlVHlwZT09PTExJiZlLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZC5sZW5ndGg9PT0xKXtkW2JdKHRoaXNbMF0pOwpyZXR1cm4gdGhpc31lbHNle2U9MDtmb3IodmFyIGo9ZC5sZW5ndGg7ZTxqO2UrKyl7dmFyIGk9KGU|YyhiKS5iZWZvcmUoYSk6YyhkKS5hcHBlbmQoYSl9KX1lbHNlIHJldHVybiB0aGlzLnB1c2hTdGFjayhjKGMuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLHRydWUpfSxkb21NYW5pcDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZih1KXtyZXR1cm4gYy5ub2RlTmFtZSh1LCJ0YWJsZSIpP3UuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fAp1LmFwcGVuZENoaWxkKHUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTp1fXZhciBlLGosaT1hWzBdLG89W10saztpZighYy5zdXBwb3J0LmNoZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2YgaT09PSJzdHJpbmciJiZ1YS50ZXN0KGkpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjKHRoaXMpLmRvbU1hbmlwKGEsYixkLHRydWUpfSk7aWYoYy5pc0Z1bmN0aW9uKGkpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odSl7dmFyIHo9Yyh0aGlzKTthWzBdPWkuY2FsbCh0aGlzLHUsYj96Lmh0bWwoKTp3KTt6LmRvbU1hbmlwKGEsYixkKX0pO2lmKHRoaXNbMF0pe2U9aSYmaS5wYXJlbnROb2RlO2U9Yy5zdXBwb3J0LnBhcmVudE5vZGUmJmUmJmUubm9kZVR5cGU9PT0xMSYmZS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP3tmcmFnbWVudDplfTpzYShhLHRoaXMsbyk7az1lLmZyYWdtZW50O2lmKGo9ay5jaGlsZE5vZGVzLmxlbmd0aD09PQoxPyhrPWsuZmlyc3RDaGlsZCk6ay5maXJzdENoaWxkKXtiPWImJmMubm9kZU5hbWUoaiwidHIiKTtmb3IodmFyIG49MCxyPXRoaXMubGVuZ3RoO248cjtuKyspZC5jYWxsKGI|ci5jaGlsZE5vZGVzOltdO2ZvcihrPW8ubGVuZ3RoLTE7az49MDstLWspYy5ub2RlTmFtZShvW2tdLCJ0Ym9keSIpJiYhb1trXS5jaGlsZE5vZGVzLmxlbmd0aCYmb1trXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9ba10pfSFjLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJlYudGVzdChpKSYmci5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShWLmV4ZWMoaSlbMF0pLHIuZmlyc3RDaGlsZCk7aT1yLmNoaWxkTm9kZXN9aWYoaS5ub2RlVHlwZSllLnB1c2goaSk7ZWxzZSBlPQpjLm1lcmdlKGUsaSl9fWlmKGQpZm9yKGo9MDtlW2pdO2orKylpZihmJiZjLm5vZGVOYW1lKGVbal0sInNjcmlwdCIpJiYoIWVbal0udHlwZXx8ZVtqXS50eXBlLnRvTG93ZXJDYXNlKCk9PT0idGV4dC9qYXZhc2NyaXB0IikpZi5wdXNoKGVbal0ucGFyZW50Tm9kZT9lW2pdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZVtqXSk6ZVtqXSk7ZWxzZXtlW2pdLm5vZGVUeXBlPT09MSYmZS5zcGxpY2UuYXBwbHkoZSxbaisxLDBdLmNvbmNhdChjLm1ha2VBcnJheShlW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkpKTtkLmFwcGVuZENoaWxkKGVbal0pfXJldHVybiBlfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGQsZj1jLmNhY2hlLGU9Yy5ldmVudC5zcGVjaWFsLGo9Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8saT0wLG87KG89YVtpXSkhPW51bGw7aSsrKWlmKGQ9b1tjLmV4cGFuZG9dKXtiPWZbZF07aWYoYi5ldmVudHMpZm9yKHZhciBrIGluIGIuZXZlbnRzKWVba10|CmMuZXZlbnQucmVtb3ZlKG8sayk6Q2EobyxrLGIuaGFuZGxlKTtpZihqKWRlbGV0ZSBvW2MuZXhwYW5kb107ZWxzZSBvLnJlbW92ZUF0dHJpYnV0ZSYmby5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZltkXX19fSk7dmFyIGtiPS96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLE5hPS9hbHBoYVwoW14pXSpcKS8sT2E9L29wYWNpdHk9KFteKV0qKS8saGE9L2Zsb2F0L2ksaWE9Ly0oW2Etel0pL2lnLGxiPS8oW0EtWl0pL2csbWI9L14tP1xkKyg|cGFyc2VGbG9hdChPYS5leGVjKGYuZmlsdGVyKVsxXSkvMTAwKyIiOiIifWlmKGhhLnRlc3QoYikpYj1QYTtiPWIucmVwbGFjZShpYSxqYSk7aWYoZSlmW2JdPWQ7cmV0dXJuIGZbYl19LGNzczpmdW5jdGlvbihhLGIsZCxmKXtpZihiPT09IndpZHRoInx8Yj09PSJoZWlnaHQiKXt2YXIgZSxqPWI9PT0id2lkdGgiP3BiOnFiO2Z1bmN0aW9uIGkoKXtlPWI9PT0id2lkdGgiP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQ7ZiE9PSJib3JkZXIiJiZjLmVhY2goaixmdW5jdGlvbigpe2Z8fChlLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHwwKTtpZihmPT09Im1hcmdpbiIpZSs9cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW4iK3RoaXMsdHJ1ZSkpfHwwO2Vsc2UgZS09cGFyc2VGbG9hdChjLmN1ckNTUyhhLAoiYm9yZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwfSl9YS5vZmZzZXRXaWR0aCE9PTA|PTA|ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCIsamE9CmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07Yy5mbi5jc3M9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gWCh0aGlzLGEsYix0cnVlLGZ1bmN0aW9uKGQsZixlKXtpZihlPT09dylyZXR1cm4gYy5jdXJDU1MoZCxmKTtpZih0eXBlb2YgZT09PSJudW1iZXIiJiYha2IudGVzdChmKSllKz0icHgiO2Muc3R5bGUoZCxmLGUpfSl9O2MuZXh0ZW5kKHtzdHlsZTpmdW5jdGlvbihhLGIsZCl7aWYoIWF8fGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OClyZXR1cm4gdztpZigoYj09PSJ3aWR0aCJ8fGI9PT0iaGVpZ2h0IikmJnBhcnNlRmxvYXQoZCk8MClkPXc7dmFyIGY9YS5zdHlsZXx8YSxlPWQhPT13O2lmKCFjLnN1cHBvcnQub3BhY2l0eSYmYj09PSJvcGFjaXR5Iil7aWYoZSl7Zi56b29tPTE7Yj1wYXJzZUludChkLDEwKSsiIj09PSJOYU4iPyIiOiJhbHBoYShvcGFjaXR5PSIrZCoxMDArIikiO2E9Zi5maWx0ZXJ8fGMuY3VyQ1NTKGEsImZpbHRlciIpfHwiIjtmLmZpbHRlcj0KTmEudGVzdChhKT9hLnJlcGxhY2UoTmEsYik6Yn1yZXR1cm4gZi5maWx0ZXImJmYuZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9Iik|OnB4KT8kL2ksbmI9L14tP1xkLyxvYj17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0scGI9WyJMZWZ0IiwiUmlnaHQiXSxxYj1bIlRvcCIsIkJvdHRvbSJdLHJiPXMuZGVmYXVsdFZpZXcmJnMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSxQYT1jLnN1cHBvcnQuY3NzRmxvYXQ|IjtlLmRhdGFUeXBlPSJqc29uIn1pZihlLmRhdGFUeXBlPT09Impzb24iJiYoZS5kYXRhJiZOLnRlc3QoZS5kYXRhKXx8Ti50ZXN0KGUudXJsKSkpe2o9ZS5qc29ucENhbGxiYWNrfHwianNvbnAiK3NiKys7aWYoZS5kYXRhKWUuZGF0YT0oZS5kYXRhKyIiKS5yZXBsYWNlKE4sIj0iK2orIiQxIik7ZS51cmw9ZS51cmwucmVwbGFjZShOLCI9IitqKyIkMSIpO2UuZGF0YVR5cGU9InNjcmlwdCI7QVtqXT1BW2pdfHxmdW5jdGlvbihxKXtvPXE7YigpO2QoKTtBW2pdPXc7dHJ5e2RlbGV0ZSBBW2pdfWNhdGNoKHApe316JiZ6LnJlbW92ZUNoaWxkKEMpfX1pZihlLmRhdGFUeXBlPT09InNjcmlwdCImJmUuY2FjaGU9PT1udWxsKWUuY2FjaGU9ZmFsc2U7aWYoZS5jYWNoZT09PQpmYWxzZSYmbj09PSJHRVQiKXt2YXIgcj1KKCksdT1lLnVybC5yZXBsYWNlKHdiLCIkMV89IityKyIkMiIpO2UudXJsPXUrKHU9PT1lLnVybD8oa2EudGVzdChlLnVybCk|IiYiOiI|PHRhYmxlIHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc|ZS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGU7CmstPWIuc2Nyb2xsVG9wO24tPWIuc2Nyb2xsTGVmdDtpZihiPT09ZCl7ays9Yi5vZmZzZXRUb3A7bis9Yi5vZmZzZXRMZWZ0O2lmKGMub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXImJiEoYy5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMmJi9edChhYmxlfGR8aCkkL2kudGVzdChiLm5vZGVOYW1lKSkpe2srPXBhcnNlRmxvYXQoai5ib3JkZXJUb3BXaWR0aCl8fDA7bis9cGFyc2VGbG9hdChqLmJvcmRlckxlZnRXaWR0aCl8fDB9Zj1kO2Q9Yi5vZmZzZXRQYXJlbnR9aWYoYy5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZqLm92ZXJmbG93IT09InZpc2libGUiKXtrKz1wYXJzZUZsb2F0KGouYm9yZGVyVG9wV2lkdGgpfHwwO24rPXBhcnNlRmxvYXQoai5ib3JkZXJMZWZ0V2lkdGgpfHwwfWY9an1pZihmLnBvc2l0aW9uPT09InJlbGF0aXZlInx8Zi5wb3NpdGlvbj09PSJzdGF0aWMiKXtrKz1vLm9mZnNldFRvcDtuKz1vLm9mZnNldExlZnR9aWYoYy5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uJiYKZi5wb3NpdGlvbj09PSJmaXhlZCIpe2srPU1hdGgubWF4KGkuc2Nyb2xsVG9wLG8uc2Nyb2xsVG9wKTtuKz1NYXRoLm1heChpLnNjcm9sbExlZnQsby5zY3JvbGxMZWZ0KX1yZXR1cm57dG9wOmssbGVmdDpufX07Yy5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT1zLmJvZHksYj1zLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQsZixlLGo9cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtjLmV4dGVuZChiLnN0eWxlLHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxtYXJnaW46MCxib3JkZXI6MCx3aWR0aDoiMXB4IixoZWlnaHQ6IjFweCIsdmlzaWJpbGl0eToiaGlkZGVuIn0pO2IuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnPjxkaXY|InN3aW5nIjoibGluZWFyIik7dGhpcy5wb3M9Yy5lYXNpbmdbdGhpcy5vcHRpb25zLnNwZWNpYWxFYXNpbmcmJnRoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nW3RoaXMucHJvcF18fGFdKHRoaXMuc3RhdGUsZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTt0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvczt0aGlzLnVwZGF0ZSgpfXJldHVybiB0cnVlfX07Yy5leHRlbmQoYy5meCx7dGljazpmdW5jdGlvbigpe2Zvcih2YXIgYT1jLnRpbWVycyxiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSgpfHxhLnNwbGljZShiLS0sMSk7YS5sZW5ndGh8fApjLmZ4LnN0b3AoKX0sc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoVyk7Vz1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtjLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtpZihhLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsKWEuZWxlbS5zdHlsZVthLnByb3BdPShhLnByb3A9PT0id2lkdGgifHxhLnByb3A9PT0iaGVpZ2h0Ij9NYXRoLm1heCgwLGEubm93KTphLm5vdykrYS51bml0O2Vsc2UgYS5lbGVtW2EucHJvcF09YS5ub3d9fX0pO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpYy5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZ3JlcChjLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07Yy5mbi5vZmZzZXQ9ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBzLmRvY3VtZW50RWxlbWVudD8KZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtpZihhKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Yy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxlKX0pO2lmKCFifHwhYi5vd25lckRvY3VtZW50KXJldHVybiBudWxsO2lmKGI9PT1iLm93bmVyRG9jdW1lbnQuYm9keSlyZXR1cm4gYy5vZmZzZXQuYm9keU9mZnNldChiKTt2YXIgZD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9Yi5vd25lckRvY3VtZW50O2I9Zi5ib2R5O2Y9Zi5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3RvcDpkLnRvcCsoc2VsZi5wYWdlWU9mZnNldHx8Yy5zdXBwb3J0LmJveE1vZGVsJiZmLnNjcm9sbFRvcHx8Yi5zY3JvbGxUb3ApLShmLmNsaWVudFRvcHx8Yi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhzZWxmLnBhZ2VYT2Zmc2V0fHxjLnN1cHBvcnQuYm94TW9kZWwmJmYuc2Nyb2xsTGVmdHx8Yi5zY3JvbGxMZWZ0KS0oZi5jbGllbnRMZWZ0fHxiLmNsaWVudExlZnR8fDApfX06ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEscil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7Yy5vZmZzZXQuaW5pdGlhbGl6ZSgpO3ZhciBkPWIub2Zmc2V0UGFyZW50LGY9YixlPWIub3duZXJEb2N1bWVudCxqLGk9ZS5kb2N1bWVudEVsZW1lbnQsbz1lLmJvZHk7Zj0oZT1lLmRlZmF1bHRWaWV3KT9lLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZTtmb3IodmFyIGs9Yi5vZmZzZXRUb3Asbj1iLm9mZnNldExlZnQ7KGI9Yi5wYXJlbnROb2RlKSYmYiE9PW8mJmIhPT1pOyl7aWYoYy5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uJiZmLnBvc2l0aW9uPT09ImZpeGVkIilicmVhaztqPWU|YTp0aGlzLm9wdGlvbnMuZGlzcGxheTtpZihjLmNzcyh0aGlzLmVsZW0sImRpc3BsYXkiKT09PSJub25lIil0aGlzLmVsZW0uc3R5bGUuZGlzcGxheT0iYmxvY2sifXRoaXMub3B0aW9ucy5oaWRlJiZjKHRoaXMuZWxlbSkuaGlkZSgpO2lmKHRoaXMub3B0aW9ucy5oaWRlfHx0aGlzLm9wdGlvbnMuc2hvdylmb3IodmFyIGUgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0pYy5zdHlsZSh0aGlzLmVsZW0sCmUsdGhpcy5vcHRpb25zLm9yaWdbZV0pO3RoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKHRoaXMuZWxlbSl9cmV0dXJuIGZhbHNlfWVsc2V7ZT1iLXRoaXMuc3RhcnRUaW1lO3RoaXMuc3RhdGU9ZS90aGlzLm9wdGlvbnMuZHVyYXRpb247YT10aGlzLm9wdGlvbnMuZWFzaW5nfHwoYy5lYXNpbmcuc3dpbmc|PHRyPjx0ZD48L3RkPjwvdHI|PC90YWJsZT4iOwphLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCk7ZD1iLmZpcnN0Q2hpbGQ7Zj1kLmZpcnN0Q2hpbGQ7ZT1kLm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDt0aGlzLmRvZXNOb3RBZGRCb3JkZXI9Zi5vZmZzZXRUb3AhPT01O3RoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM9ZS5vZmZzZXRUb3A9PT01O2Yuc3R5bGUucG9zaXRpb249ImZpeGVkIjtmLnN0eWxlLnRvcD0iMjBweCI7dGhpcy5zdXBwb3J0c0ZpeGVkUG9zaXRpb249Zi5vZmZzZXRUb3A9PT0yMHx8Zi5vZmZzZXRUb3A9PT0xNTtmLnN0eWxlLnBvc2l0aW9uPWYuc3R5bGUudG9wPSIiO2Quc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7ZC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO3RoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWYub2Zmc2V0VG9wPT09LTU7dGhpcy5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1hLm9mZnNldFRvcCE9PWo7YS5yZW1vdmVDaGlsZChiKTsKYy5vZmZzZXQuaW5pdGlhbGl6ZT1jLm5vb3B9LGJvZHlPZmZzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRUb3AsZD1hLm9mZnNldExlZnQ7Yy5vZmZzZXQuaW5pdGlhbGl6ZSgpO2lmKGMub2Zmc2V0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0KXtiKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpblRvcCIsdHJ1ZSkpfHwwO2QrPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luTGVmdCIsdHJ1ZSkpfHwwfXJldHVybnt0b3A6YixsZWZ0OmR9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGQpe2lmKC9zdGF0aWMvLnRlc3QoYy5jdXJDU1MoYSwicG9zaXRpb24iKSkpYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO3ZhciBmPWMoYSksZT1mLm9mZnNldCgpLGo9cGFyc2VJbnQoYy5jdXJDU1MoYSwidG9wIix0cnVlKSwxMCl8fDAsaT1wYXJzZUludChjLmN1ckNTUyhhLCJsZWZ0Iix0cnVlKSwxMCl8fDA7aWYoYy5pc0Z1bmN0aW9uKGIpKWI9Yi5jYWxsKGEsCmQsZSk7ZD17dG9wOmIudG9wLWUudG9wK2osbGVmdDpiLmxlZnQtZS5sZWZ0K2l9OyJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGQpOmYuY3NzKGQpfX07Yy5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksZD10aGlzLm9mZnNldCgpLGY9L15ib2R5fGh0bWwkL2kudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2QudG9wLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpblRvcCIsdHJ1ZSkpfHwwO2QubGVmdC09cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5MZWZ0Iix0cnVlKSl8fDA7Zi50b3ArPXBhcnNlRmxvYXQoYy5jdXJDU1MoYlswXSwiYm9yZGVyVG9wV2lkdGgiLHRydWUpKXx8MDtmLmxlZnQrPXBhcnNlRmxvYXQoYy5jdXJDU1MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIix0cnVlKSl8fDA7cmV0dXJue3RvcDpkLnRvcC0KZi50b3AsbGVmdDpkLmxlZnQtZi5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxzLmJvZHk7YSYmIS9eYm9keXxodG1sJC9pLnRlc3QoYS5ub2RlTmFtZSkmJmMuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIjspYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYX0pfX0pO2MuZWFjaChbIkxlZnQiLCJUb3AiXSxmdW5jdGlvbihhLGIpe3ZhciBkPSJzY3JvbGwiK2I7Yy5mbltkXT1mdW5jdGlvbihmKXt2YXIgZT10aGlzWzBdLGo7aWYoIWUpcmV0dXJuIG51bGw7aWYoZiE9PXcpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGo9d2EodGhpcykpai5zY3JvbGxUbyghYT9mOmMoaikuc2Nyb2xsTGVmdCgpLGE|Yi55P3RoaXMueTpiLnk7fSxBYnM6ZnVuY3Rpb24oKQp7dGhpcy54PU1hdGguYWJzKHRoaXMueCk7dGhpcy55PU1hdGguYWJzKHRoaXMueSk7fSxMZW5ndGg6ZnVuY3Rpb24oKQp7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpO30sTm9ybWFsaXplOmZ1bmN0aW9uKCkKe3ZhciBsZW5ndGg9dGhpcy5MZW5ndGgoKTtpZihsZW5ndGg8TnVtYmVyLk1JTl9WQUxVRSkKe3JldHVybiAwLjA7fQp2YXIgaW52TGVuZ3RoPTEuMC9sZW5ndGg7dGhpcy54Kj1pbnZMZW5ndGg7dGhpcy55Kj1pbnZMZW5ndGg7cmV0dXJuIGxlbmd0aDt9LElzVmFsaWQ6ZnVuY3Rpb24oKQp7cmV0dXJuIGIyTWF0aC5iMklzVmFsaWQodGhpcy54KSYmYjJNYXRoLmIySXNWYWxpZCh0aGlzLnkpO30seDpudWxsLHk6bnVsbH07YjJWZWMyLk1ha2U9ZnVuY3Rpb24oeF8seV8pCntyZXR1cm4gbmV3IGIyVmVjMih4Xyx5Xyk7fTsKdmFyIGIyTWF0MjI9Q2xhc3MuY3JlYXRlKCk7YjJNYXQyMi5wcm90b3R5cGU9e2luaXRpYWxpemU6ZnVuY3Rpb24oYW5nbGUsYzEsYzIpCntpZihhbmdsZT09bnVsbClhbmdsZT0wO3RoaXMuY29sMT1uZXcgYjJWZWMyKCk7dGhpcy5jb2wyPW5ldyBiMlZlYzIoKTtpZihjMSE9bnVsbCYmYzIhPW51bGwpe3RoaXMuY29sMS5TZXRWKGMxKTt0aGlzLmNvbDIuU2V0VihjMik7fQplbHNle3ZhciBjPU1hdGguY29zKGFuZ2xlKTt2YXIgcz1NYXRoLnNpbihhbmdsZSk7dGhpcy5jb2wxLng9Yzt0aGlzLmNvbDIueD0tczt0aGlzLmNvbDEueT1zO3RoaXMuY29sMi55PWM7fX0sU2V0OmZ1bmN0aW9uKGFuZ2xlKQp7dmFyIGM9TWF0aC5jb3MoYW5nbGUpO3ZhciBzPU1hdGguc2luKGFuZ2xlKTt0aGlzLmNvbDEueD1jO3RoaXMuY29sMi54PS1zO3RoaXMuY29sMS55PXM7dGhpcy5jb2wyLnk9Yzt9LFNldFZWOmZ1bmN0aW9uKGMxLGMyKQp7dGhpcy5jb2wxLlNldFYoYzEpO3RoaXMuY29sMi5TZXRWKGMyKTt9LENvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGIyTWF0MjIoMCx0aGlzLmNvbDEsdGhpcy5jb2wyKTt9LFNldE06ZnVuY3Rpb24obSkKe3RoaXMuY29sMS5TZXRWKG0uY29sMSk7dGhpcy5jb2wyLlNldFYobS5jb2wyKTt9LEFkZE06ZnVuY3Rpb24obSkKe3RoaXMuY29sMS54Kz1tLmNvbDEueDt0aGlzLmNvbDEueSs9bS5jb2wxLnk7dGhpcy5jb2wyLngrPW0uY29sMi54O3RoaXMuY29sMi55Kz1tLmNvbDIueTt9LFNldElkZW50aXR5OmZ1bmN0aW9uKCkKe3RoaXMuY29sMS54PTEuMDt0aGlzLmNvbDIueD0wLjA7dGhpcy5jb2wxLnk9MC4wO3RoaXMuY29sMi55PTEuMDt9LFNldFplcm86ZnVuY3Rpb24oKQp7dGhpcy5jb2wxLng9MC4wO3RoaXMuY29sMi54PTAuMDt0aGlzLmNvbDEueT0wLjA7dGhpcy5jb2wyLnk9MC4wO30sSW52ZXJ0OmZ1bmN0aW9uKG91dCkKe3ZhciBhPXRoaXMuY29sMS54O3ZhciBiPXRoaXMuY29sMi54O3ZhciBjPXRoaXMuY29sMS55O3ZhciBkPXRoaXMuY29sMi55O3ZhciBkZXQ9YSpkLWIqYztkZXQ9MS4wL2RldDtvdXQuY29sMS54PWRldCpkO291dC5jb2wyLng9LWRldCpiO291dC5jb2wxLnk9LWRldCpjO291dC5jb2wyLnk9ZGV0KmE7cmV0dXJuIG91dDt9LFNvbHZlOmZ1bmN0aW9uKG91dCxiWCxiWSkKe3ZhciBhMTE9dGhpcy5jb2wxLng7dmFyIGExMj10aGlzLmNvbDIueDt2YXIgYTIxPXRoaXMuY29sMS55O3ZhciBhMjI9dGhpcy5jb2wyLnk7dmFyIGRldD1hMTEqYTIyLWExMiphMjE7ZGV0PTEuMC9kZXQ7b3V0Lng9ZGV0KihhMjIqYlgtYTEyKmJZKTtvdXQueT1kZXQqKGExMSpiWS1hMjEqYlgpO3JldHVybiBvdXQ7fSxBYnM6ZnVuY3Rpb24oKQp7dGhpcy5jb2wxLkFicygpO3RoaXMuY29sMi5BYnMoKTt9LGNvbDE6bmV3IGIyVmVjMigpLGNvbDI6bmV3IGIyVmVjMigpfTsKdmFyIGIyTWF0aD1DbGFzcy5jcmVhdGUoKTtiMk1hdGgucHJvdG90eXBlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7fX0KYjJNYXRoLmIySXNWYWxpZD1mdW5jdGlvbih4KQp7cmV0dXJuIGlzRmluaXRlKHgpO307YjJNYXRoLmIyRG90PWZ1bmN0aW9uKGEsYikKe3JldHVybiBhLngqYi54K2EueSpiLnk7fTtiMk1hdGguYjJDcm9zc1ZWPWZ1bmN0aW9uKGEsYikKe3JldHVybiBhLngqYi55LWEueSpiLng7fTtiMk1hdGguYjJDcm9zc1ZGPWZ1bmN0aW9uKGEscykKe3ZhciB2PW5ldyBiMlZlYzIocyphLnksLXMqYS54KTtyZXR1cm4gdjt9O2IyTWF0aC5iMkNyb3NzRlY9ZnVuY3Rpb24ocyxhKQp7dmFyIHY9bmV3IGIyVmVjMigtcyphLnkscyphLngpO3JldHVybiB2O307YjJNYXRoLmIyTXVsTVY9ZnVuY3Rpb24oQSx2KQp7dmFyIHU9bmV3IGIyVmVjMihBLmNvbDEueCp2LngrQS5jb2wyLngqdi55LEEuY29sMS55KnYueCtBLmNvbDIueSp2LnkpO3JldHVybiB1O307YjJNYXRoLmIyTXVsVE1WPWZ1bmN0aW9uKEEsdikKe3ZhciB1PW5ldyBiMlZlYzIoYjJNYXRoLmIyRG90KHYsQS5jb2wxKSxiMk1hdGguYjJEb3QodixBLmNvbDIpKTtyZXR1cm4gdTt9O2IyTWF0aC5BZGRWVj1mdW5jdGlvbihhLGIpCnt2YXIgdj1uZXcgYjJWZWMyKGEueCtiLngsYS55K2IueSk7cmV0dXJuIHY7fTtiMk1hdGguU3VidHJhY3RWVj1mdW5jdGlvbihhLGIpCnt2YXIgdj1uZXcgYjJWZWMyKGEueC1iLngsYS55LWIueSk7cmV0dXJuIHY7fTtiMk1hdGguTXVsRlY9ZnVuY3Rpb24ocyxhKQp7dmFyIHY9bmV3IGIyVmVjMihzKmEueCxzKmEueSk7cmV0dXJuIHY7fTtiMk1hdGguQWRkTU09ZnVuY3Rpb24oQSxCKQp7dmFyIEM9bmV3IGIyTWF0MjIoMCxiMk1hdGguQWRkVlYoQS5jb2wxLEIuY29sMSksYjJNYXRoLkFkZFZWKEEuY29sMixCLmNvbDIpKTtyZXR1cm4gQzt9O2IyTWF0aC5iMk11bE1NPWZ1bmN0aW9uKEEsQikKe3ZhciBDPW5ldyBiMk1hdDIyKDAsYjJNYXRoLmIyTXVsTVYoQSxCLmNvbDEpLGIyTWF0aC5iMk11bE1WKEEsQi5jb2wyKSk7cmV0dXJuIEM7fTtiMk1hdGguYjJNdWxUTU09ZnVuY3Rpb24oQSxCKQp7dmFyIGMxPW5ldyBiMlZlYzIoYjJNYXRoLmIyRG90KEEuY29sMSxCLmNvbDEpLGIyTWF0aC5iMkRvdChBLmNvbDIsQi5jb2wxKSk7dmFyIGMyPW5ldyBiMlZlYzIoYjJNYXRoLmIyRG90KEEuY29sMSxCLmNvbDIpLGIyTWF0aC5iMkRvdChBLmNvbDIsQi5jb2wyKSk7dmFyIEM9bmV3IGIyTWF0MjIoMCxjMSxjMik7cmV0dXJuIEM7fTtiMk1hdGguYjJBYnM9ZnVuY3Rpb24oYSkKe3JldHVybiBhPjAuMD9hOi1hO307YjJNYXRoLmIyQWJzVj1mdW5jdGlvbihhKQp7dmFyIGI9bmV3IGIyVmVjMihiMk1hdGguYjJBYnMoYS54KSxiMk1hdGguYjJBYnMoYS55KSk7cmV0dXJuIGI7fTtiMk1hdGguYjJBYnNNPWZ1bmN0aW9uKEEpCnt2YXIgQj1uZXcgYjJNYXQyMigwLGIyTWF0aC5iMkFic1YoQS5jb2wxKSxiMk1hdGguYjJBYnNWKEEuY29sMikpO3JldHVybiBCO307YjJNYXRoLmIyTWluPWZ1bmN0aW9uKGEsYikKe3JldHVybiBhPGI|IC0xKSB7CiRBID0gZnVuY3Rpb24oaXRlcmFibGUpIHsKaWYgKCFpdGVyYWJsZSkgcmV0dXJuIFtdOwppZiAoIShPYmplY3QuaXNGdW5jdGlvbihpdGVyYWJsZSkgJiYgaXRlcmFibGUgPT0gJ1tvYmplY3QgTm9kZUxpc3RdJykgJiYKaXRlcmFibGUudG9BcnJheSkgcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKdmFyIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aCB8fCAwLCByZXN1bHRzID0gbmV3IEFycmF5KGxlbmd0aCk7CndoaWxlIChsZW5ndGgtLSkgcmVzdWx0c1tsZW5ndGhdID0gaXRlcmFibGVbbGVuZ3RoXTsKcmV0dXJuIHJlc3VsdHM7Cn07Cn0KdmFyIGIyU2V0dGluZ3M9Q2xhc3MuY3JlYXRlKCk7YjJTZXR0aW5ncy5wcm90b3R5cGU9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt9fQpiMlNldHRpbmdzLlVTSFJUX01BWD0weDAwMDBmZmZmO2IyU2V0dGluZ3MuYjJfcGk9TWF0aC5QSTtiMlNldHRpbmdzLmIyX21hc3NVbml0c1BlcktpbG9ncmFtPTEuMDtiMlNldHRpbmdzLmIyX3RpbWVVbml0c1BlclNlY29uZD0xLjA7YjJTZXR0aW5ncy5iMl9sZW5ndGhVbml0c1Blck1ldGVyPTMwLjA7YjJTZXR0aW5ncy5iMl9tYXhNYW5pZm9sZFBvaW50cz0yO2IyU2V0dGluZ3MuYjJfbWF4U2hhcGVzUGVyQm9keT02NDtiMlNldHRpbmdzLmIyX21heFBvbHlWZXJ0aWNlcz04O2IyU2V0dGluZ3MuYjJfbWF4UHJveGllcz0xMDI0O2IyU2V0dGluZ3MuYjJfbWF4UGFpcnM9OCpiMlNldHRpbmdzLmIyX21heFByb3hpZXM7YjJTZXR0aW5ncy5iMl9saW5lYXJTbG9wPTAuMDA1KmIyU2V0dGluZ3MuYjJfbGVuZ3RoVW5pdHNQZXJNZXRlcjtiMlNldHRpbmdzLmIyX2FuZ3VsYXJTbG9wPTIuMC8xODAuMCpiMlNldHRpbmdzLmIyX3BpO2IyU2V0dGluZ3MuYjJfdmVsb2NpdHlUaHJlc2hvbGQ9MS4wKmIyU2V0dGluZ3MuYjJfbGVuZ3RoVW5pdHNQZXJNZXRlci9iMlNldHRpbmdzLmIyX3RpbWVVbml0c1BlclNlY29uZDtiMlNldHRpbmdzLmIyX21heExpbmVhckNvcnJlY3Rpb249MC4yKmIyU2V0dGluZ3MuYjJfbGVuZ3RoVW5pdHNQZXJNZXRlcjtiMlNldHRpbmdzLmIyX21heEFuZ3VsYXJDb3JyZWN0aW9uPTguMC8xODAuMCpiMlNldHRpbmdzLmIyX3BpO2IyU2V0dGluZ3MuYjJfY29udGFjdEJhdW1nYXJ0ZT0wLjI7YjJTZXR0aW5ncy5iMl90aW1lVG9TbGVlcD0wLjUqYjJTZXR0aW5ncy5iMl90aW1lVW5pdHNQZXJTZWNvbmQ7YjJTZXR0aW5ncy5iMl9saW5lYXJTbGVlcFRvbGVyYW5jZT0wLjAxKmIyU2V0dGluZ3MuYjJfbGVuZ3RoVW5pdHNQZXJNZXRlci9iMlNldHRpbmdzLmIyX3RpbWVVbml0c1BlclNlY29uZDtiMlNldHRpbmdzLmIyX2FuZ3VsYXJTbGVlcFRvbGVyYW5jZT0yLjAvMTgwLjAvYjJTZXR0aW5ncy5iMl90aW1lVW5pdHNQZXJTZWNvbmQ7YjJTZXR0aW5ncy5iMkFzc2VydD1mdW5jdGlvbihhKQp7aWYoIWEpe3ZhciBudWxsVmVjO251bGxWZWMueCsrO319Owp2YXIgYjJWZWMyPUNsYXNzLmNyZWF0ZSgpO2IyVmVjMi5wcm90b3R5cGU9e2luaXRpYWxpemU6ZnVuY3Rpb24oeF8seV8pe3RoaXMueD14Xzt0aGlzLnk9eV87fSxTZXRaZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTAuMDt0aGlzLnk9MC4wO30sU2V0OmZ1bmN0aW9uKHhfLHlfKXt0aGlzLng9eF87dGhpcy55PXlfO30sU2V0VjpmdW5jdGlvbih2KXt0aGlzLng9di54O3RoaXMueT12Lnk7fSxOZWdhdGl2ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgYjJWZWMyKC10aGlzLngsLXRoaXMueSk7fSxDb3B5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBiMlZlYzIodGhpcy54LHRoaXMueSk7fSxBZGQ6ZnVuY3Rpb24odikKe3RoaXMueCs9di54O3RoaXMueSs9di55O30sU3VidHJhY3Q6ZnVuY3Rpb24odikKe3RoaXMueC09di54O3RoaXMueS09di55O30sTXVsdGlwbHk6ZnVuY3Rpb24oYSkKe3RoaXMueCo9YTt0aGlzLnkqPWE7fSxNdWxNOmZ1bmN0aW9uKEEpCnt2YXIgdFg9dGhpcy54O3RoaXMueD1BLmNvbDEueCp0WCtBLmNvbDIueCp0aGlzLnk7dGhpcy55PUEuY29sMS55KnRYK0EuY29sMi55KnRoaXMueTt9LE11bFRNOmZ1bmN0aW9uKEEpCnt2YXIgdFg9YjJNYXRoLmIyRG90KHRoaXMsQS5jb2wxKTt0aGlzLnk9YjJNYXRoLmIyRG90KHRoaXMsQS5jb2wyKTt0aGlzLng9dFg7fSxDcm9zc1ZGOmZ1bmN0aW9uKHMpCnt2YXIgdFg9dGhpcy54O3RoaXMueD1zKnRoaXMueTt0aGlzLnk9LXMqdFg7fSxDcm9zc0ZWOmZ1bmN0aW9uKHMpCnt2YXIgdFg9dGhpcy54O3RoaXMueD0tcyp0aGlzLnk7dGhpcy55PXMqdFg7fSxNaW5WOmZ1bmN0aW9uKGIpCnt0aGlzLng9dGhpcy54PGIueD90aGlzLng6Yi54O3RoaXMueT10aGlzLnk8Yi55P3RoaXMueTpiLnk7fSxNYXhWOmZ1bmN0aW9uKGIpCnt0aGlzLng9dGhpcy54PmIueD90aGlzLng6Yi54O3RoaXMueT10aGlzLnk|IG9iamVjdC50b0hUTUwoKSA6IFN0cmluZy5pbnRlcnByZXQob2JqZWN0KTsKfSwKa2V5czogZnVuY3Rpb24ob2JqZWN0KSB7CnZhciBrZXlzID0gW107CmZvciAodmFyIHByb3BlcnR5IGluIG9iamVjdCkKa2V5cy5wdXNoKHByb3BlcnR5KTsKcmV0dXJuIGtleXM7Cn0sCnZhbHVlczogZnVuY3Rpb24ob2JqZWN0KSB7CnZhciB2YWx1ZXMgPSBbXTsKZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQp2YWx1ZXMucHVzaChvYmplY3RbcHJvcGVydHldKTsKcmV0dXJuIHZhbHVlczsKfSwKY2xvbmU6IGZ1bmN0aW9uKG9iamVjdCkgewpyZXR1cm4gT2JqZWN0LmV4dGVuZCh7IH0sIG9iamVjdCk7Cn0sCmlzRWxlbWVudDogZnVuY3Rpb24ob2JqZWN0KSB7CnJldHVybiBvYmplY3QgJiYgb2JqZWN0Lm5vZGVUeXBlID09IDE7Cn0sCmlzQXJyYXk6IGZ1bmN0aW9uKG9iamVjdCkgewpyZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PSAib2JqZWN0IiAmJgonc3BsaWNlJyBpbiBvYmplY3QgJiYgJ2pvaW4nIGluIG9iamVjdDsKfSwKaXNIYXNoOiBmdW5jdGlvbihvYmplY3QpIHsKcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEhhc2g7Cn0sCmlzRnVuY3Rpb246IGZ1bmN0aW9uKG9iamVjdCkgewpyZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAiZnVuY3Rpb24iOwp9LAppc1N0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7CnJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJzdHJpbmciOwp9LAppc051bWJlcjogZnVuY3Rpb24ob2JqZWN0KSB7CnJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIiOwp9LAppc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqZWN0KSB7CnJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJ1bmRlZmluZWQiOwp9Cn0pOwpmdW5jdGlvbiAkQShpdGVyYWJsZSkgewppZiAoIWl0ZXJhYmxlKSByZXR1cm4gW107CmlmIChpdGVyYWJsZS50b0FycmF5KSByZXR1cm4gaXRlcmFibGUudG9BcnJheSgpOwp2YXIgbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoIHx8IDAsIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKd2hpbGUgKGxlbmd0aC0tKSByZXN1bHRzW2xlbmd0aF0gPSBpdGVyYWJsZVtsZW5ndGhdOwpyZXR1cm4gcmVzdWx0czsKfQppZiAoV2ViS2l0ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdBcHBsZVdlYktpdC8nKSA|ZjpjKGopLnNjcm9sbFRvcCgpKTtlbHNlIHRoaXNbZF09Zn0pO2Vsc2UgcmV0dXJuKGo9d2EoZSkpPyJwYWdlWE9mZnNldCJpbiBqP2pbYT8icGFnZVlPZmZzZXQiOgoicGFnZVhPZmZzZXQiXTpjLnN1cHBvcnQuYm94TW9kZWwmJmouZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2RdfHxqLmRvY3VtZW50LmJvZHlbZF06ZVtkXX19KTtjLmVhY2goWyJIZWlnaHQiLCJXaWR0aCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9Yi50b0xvd2VyQ2FzZSgpO2MuZm5bImlubmVyIitiXT1mdW5jdGlvbigpe3JldHVybiB0aGlzWzBdP2MuY3NzKHRoaXNbMF0sZCxmYWxzZSwicGFkZGluZyIpOm51bGx9O2MuZm5bIm91dGVyIitiXT1mdW5jdGlvbihmKXtyZXR1cm4gdGhpc1swXT9jLmNzcyh0aGlzWzBdLGQsZmFsc2UsZj8ibWFyZ2luIjoiYm9yZGVyIik6bnVsbH07Yy5mbltkXT1mdW5jdGlvbihmKXt2YXIgZT10aGlzWzBdO2lmKCFlKXJldHVybiBmPT1udWxsP251bGw6dGhpcztpZihjLmlzRnVuY3Rpb24oZikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihqKXt2YXIgaT1jKHRoaXMpO2lbZF0oZi5jYWxsKHRoaXMsaixpW2RdKCkpKX0pO3JldHVybiJzY3JvbGxUbyJpbgplJiZlLmRvY3VtZW50P2UuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl18fGUuZG9jdW1lbnQuYm9keVsiY2xpZW50IitiXTplLm5vZGVUeXBlPT09OT9NYXRoLm1heChlLmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitiXSxlLmJvZHlbInNjcm9sbCIrYl0sZS5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIrYl0sZS5ib2R5WyJvZmZzZXQiK2JdLGUuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK2JdKTpmPT09dz9jLmNzcyhlLGQpOnRoaXMuY3NzKGQsdHlwZW9mIGY9PT0ic3RyaW5nIj9mOmYrInB4Iil9fSk7QS5qUXVlcnk9QS4kPWN9KSh3aW5kb3cpOwp9CnZhciBDbGFzcyA9IHsKY3JlYXRlOiBmdW5jdGlvbigpIHsKdmFyIHBhcmVudCA9IG51bGwsIHByb3BlcnRpZXMgPSAkQShhcmd1bWVudHMpOwppZiAoT2JqZWN0LmlzRnVuY3Rpb24ocHJvcGVydGllc1swXSkpCnBhcmVudCA9IHByb3BlcnRpZXMuc2hpZnQoKTsKZnVuY3Rpb24ga2xhc3MoKSB7CnRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9Ck9iamVjdC5leHRlbmQoa2xhc3MsIENsYXNzLk1ldGhvZHMpOwprbGFzcy5zdXBlcmNsYXNzID0gcGFyZW50OwprbGFzcy5zdWJjbGFzc2VzID0gW107CmlmIChwYXJlbnQpIHsKdmFyIHN1YmNsYXNzID0gZnVuY3Rpb24oKSB7IH07CnN1YmNsYXNzLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7CmtsYXNzLnByb3RvdHlwZSA9IG5ldyBzdWJjbGFzczsKcGFyZW50LnN1YmNsYXNzZXMucHVzaChrbGFzcyk7Cn0KZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQprbGFzcy5hZGRNZXRob2RzKHByb3BlcnRpZXNbaV0pOwppZiAoIWtsYXNzLnByb3RvdHlwZS5pbml0aWFsaXplKQprbGFzcy5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IHRoaXMuZW1wdHlGdW5jdGlvbjsKa2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0ga2xhc3M7CnJldHVybiBrbGFzczsKfSwKZW1wdHlGdW5jdGlvbjpmdW5jdGlvbiAoKSB7fSwKfTsKQ2xhc3MuTWV0aG9kcyA9IHsKYWRkTWV0aG9kczogZnVuY3Rpb24oc291cmNlKSB7CnZhciBhbmNlc3RvciA9IHRoaXMuc3VwZXJjbGFzcyAmJiB0aGlzLnN1cGVyY2xhc3MucHJvdG90eXBlOwp2YXIgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7CmlmICghT2JqZWN0LmtleXMoeyB0b1N0cmluZzogdHJ1ZSB9KS5sZW5ndGgpCnByb3BlcnRpZXMucHVzaCgidG9TdHJpbmciLCAidmFsdWVPZiIpOwpmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewp2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldLCB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eV07CmlmIChhbmNlc3RvciAmJiBPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkgJiYKdmFsdWUuYXJndW1lbnROYW1lcygpLmZpcnN0KCkgPT0gIiRzdXBlciIpIHsKdmFyIG1ldGhvZCA9IHZhbHVlLCB2YWx1ZSA9IE9iamVjdC5leHRlbmQoKGZ1bmN0aW9uKG0pIHsKcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gYW5jZXN0b3JbbV0uYXBwbHkodGhpcywgYXJndW1lbnRzKSB9Owp9KShwcm9wZXJ0eSkud3JhcChtZXRob2QpLCB7CnZhbHVlT2Y6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbWV0aG9kIH0sCnRvU3RyaW5nOiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ldGhvZC50b1N0cmluZygpIH0KfSk7Cn0KdGhpcy5wcm90b3R5cGVbcHJvcGVydHldID0gdmFsdWU7Cn0KcmV0dXJuIHRoaXM7Cn0KfTsKT2JqZWN0LmV4dGVuZCA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKZm9yICh2YXIgcHJvcGVydHkgaW4gc291cmNlKQpkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldOwpyZXR1cm4gZGVzdGluYXRpb247Cn07Ck9iamVjdC5leHRlbmQoT2JqZWN0LCB7Cmluc3BlY3Q6IGZ1bmN0aW9uKG9iamVjdCkgewp0cnkgewppZiAoT2JqZWN0LmlzVW5kZWZpbmVkKG9iamVjdCkpIHJldHVybiAndW5kZWZpbmVkJzsKaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsKcmV0dXJuIG9iamVjdC5pbnNwZWN0ID8gb2JqZWN0Lmluc3BlY3QoKSA6IFN0cmluZyhvYmplY3QpOwp9IGNhdGNoIChlKSB7CmlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0dXJuICcuLi4nOwp0aHJvdyBlOwp9Cn0sCnRvSlNPTjogZnVuY3Rpb24ob2JqZWN0KSB7CnZhciB0eXBlID0gdHlwZW9mIG9iamVjdDsKc3dpdGNoICh0eXBlKSB7CmNhc2UgJ3VuZGVmaW5lZCc6CmNhc2UgJ2Z1bmN0aW9uJzoKY2FzZSAndW5rbm93bic6IHJldHVybjsKY2FzZSAnYm9vbGVhbic6IHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKfQppZiAob2JqZWN0ID09PSBudWxsKSByZXR1cm4gJ251bGwnOwppZiAob2JqZWN0LnRvSlNPTikgcmV0dXJuIG9iamVjdC50b0pTT04oKTsKaWYgKE9iamVjdC5pc0VsZW1lbnQob2JqZWN0KSkgcmV0dXJuOwp2YXIgcmVzdWx0cyA9IFtdOwpmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpIHsKdmFyIHZhbHVlID0gT2JqZWN0LnRvSlNPTihvYmplY3RbcHJvcGVydHldKTsKaWYgKCFPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKQpyZXN1bHRzLnB1c2gocHJvcGVydHkudG9KU09OKCkgKyAnOiAnICsgdmFsdWUpOwp9CnJldHVybiAneycgKyByZXN1bHRzLmpvaW4oJywgJykgKyAnfSc7Cn0sCnRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCkgewpyZXR1cm4gJEgob2JqZWN0KS50b1F1ZXJ5U3RyaW5nKCk7Cn0sCnRvSFRNTDogZnVuY3Rpb24ob2JqZWN0KSB7CnJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRvSFRNTCA|LTEwMDAwP2E6cGFyc2VGbG9hdChjLmN1ckNTUyh0aGlzLmVsZW0sdGhpcy5wcm9wKSl8fDB9LGN1c3RvbTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZihqKXtyZXR1cm4gZS5zdGVwKGopfXRoaXMuc3RhcnRUaW1lPUooKTt0aGlzLnN0YXJ0PWE7dGhpcy5lbmQ9Yjt0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwicHgiO3RoaXMubm93PXRoaXMuc3RhcnQ7CnRoaXMucG9zPXRoaXMuc3RhdGU9MDt2YXIgZT10aGlzO2YuZWxlbT10aGlzLmVsZW07aWYoZigpJiZjLnRpbWVycy5wdXNoKGYpJiYhVylXPXNldEludGVydmFsKGMuZngudGljaywxMyl9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLnNob3c9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLnByb3A9PT0id2lkdGgifHx0aGlzLnByb3A9PT0iaGVpZ2h0Ij8xOjAsdGhpcy5jdXIoKSk7Yyh0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Yy5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMuaGlkZT10cnVlO3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGI9SigpLGQ9dHJ1ZTtpZihhfHxiPj10aGlzLm9wdGlvbnMuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PQp0aGlzLmVuZDt0aGlzLnBvcz10aGlzLnN0YXRlPTE7dGhpcy51cGRhdGUoKTt0aGlzLm9wdGlvbnMuY3VyQW5pbVt0aGlzLnByb3BdPXRydWU7Zm9yKHZhciBmIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKWlmKHRoaXMub3B0aW9ucy5jdXJBbmltW2ZdIT09dHJ1ZSlkPWZhbHNlO2lmKGQpe2lmKHRoaXMub3B0aW9ucy5kaXNwbGF5IT1udWxsKXt0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3c9dGhpcy5vcHRpb25zLm92ZXJmbG93O2E9Yy5kYXRhKHRoaXMuZWxlbSwib2xkZGlzcGxheSIpO3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PWE|MDp0eXBlb2YgZi5kdXJhdGlvbj09PQoibnVtYmVyIj9mLmR1cmF0aW9uOmMuZnguc3BlZWRzW2YuZHVyYXRpb25dfHxjLmZ4LnNwZWVkcy5fZGVmYXVsdDtmLm9sZD1mLmNvbXBsZXRlO2YuY29tcGxldGU9ZnVuY3Rpb24oKXtmLnF1ZXVlIT09ZmFsc2UmJmModGhpcykuZGVxdWV1ZSgpO2MuaXNGdW5jdGlvbihmLm9sZCkmJmYub2xkLmNhbGwodGhpcyl9O3JldHVybiBmfSxlYXNpbmc6e2xpbmVhcjpmdW5jdGlvbihhLGIsZCxmKXtyZXR1cm4gZCtmKmF9LHN3aW5nOmZ1bmN0aW9uKGEsYixkLGYpe3JldHVybigtTWF0aC5jb3MoYSpNYXRoLlBJKS8yKzAuNSkqZitkfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixkKXt0aGlzLm9wdGlvbnM9Yjt0aGlzLmVsZW09YTt0aGlzLnByb3A9ZDtpZighYi5vcmlnKWIub3JpZz17fX19KTtjLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpOyhjLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8CmMuZnguc3RlcC5fZGVmYXVsdCkodGhpcyk7aWYoKHRoaXMucHJvcD09PSJoZWlnaHQifHx0aGlzLnByb3A9PT0id2lkdGgiKSYmdGhpcy5lbGVtLnN0eWxlKXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LGN1cjpmdW5jdGlvbihhKXtpZih0aGlzLmVsZW1bdGhpcy5wcm9wXSE9bnVsbCYmKCF0aGlzLmVsZW0uc3R5bGV8fHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdPT1udWxsKSlyZXR1cm4gdGhpcy5lbGVtW3RoaXMucHJvcF07cmV0dXJuKGE9cGFyc2VGbG9hdChjLmNzcyh0aGlzLmVsZW0sdGhpcy5wcm9wLGEpKSkmJmE|YS5yZXNwb25zZVhNTDphLnJlc3BvbnNlVGV4dDtlJiZhLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZT09PSJwYXJzZXJlcnJvciImJmMuZXJyb3IoInBhcnNlcmVycm9yIik7aWYoZCYmZC5kYXRhRmlsdGVyKWE9ZC5kYXRhRmlsdGVyKGEsYik7aWYodHlwZW9mIGE9PT0ic3RyaW5nIilpZihiPT09CiJqc29uInx8IWImJmYuaW5kZXhPZigianNvbiIpPj0wKWE9Yy5wYXJzZUpTT04oYSk7ZWxzZSBpZihiPT09InNjcmlwdCJ8fCFiJiZmLmluZGV4T2YoImphdmFzY3JpcHQiKT49MCljLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9LHBhcmFtOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZChpLG8pe2lmKGMuaXNBcnJheShvKSljLmVhY2gobyxmdW5jdGlvbihrLG4pe2J8fC9cW1xdJC8udGVzdChpKT9mKGksbik6ZChpKyJbIisodHlwZW9mIG49PT0ib2JqZWN0Inx8Yy5pc0FycmF5KG4pP2s6IiIpKyJdIixuKX0pO2Vsc2UhYiYmbyE9bnVsbCYmdHlwZW9mIG89PT0ib2JqZWN0Ij9jLmVhY2gobyxmdW5jdGlvbihrLG4pe2QoaSsiWyIraysiXSIsbil9KTpmKGksbyl9ZnVuY3Rpb24gZihpLG8pe289Yy5pc0Z1bmN0aW9uKG8pP28oKTpvO2VbZS5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChpKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG8pfXZhciBlPVtdO2lmKGI9PT13KWI9Yy5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7CmlmKGMuaXNBcnJheShhKXx8YS5qcXVlcnkpYy5lYWNoKGEsZnVuY3Rpb24oKXtmKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBqIGluIGEpZChqLGFbal0pO3JldHVybiBlLmpvaW4oIiYiKS5yZXBsYWNlKHliLCIrIil9fSk7dmFyIGxhPXt9LEFiPS90b2dnbGV8c2hvd3xoaWRlLyxCYj0vXihbKy1dPSk|ZS5kYXRhOm51bGwpfWNhdGNoKG0pe2MuaGFuZGxlRXJyb3IoZSx4LG51bGwsbSk7ZCgpfWUuYXN5bmN8fGcoKTtyZXR1cm4geH19LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEsYixkLGYpe2lmKGEuZXJyb3IpYS5lcnJvci5jYWxsKGEuY29udGV4dHx8YSxiLGQsZik7aWYoYS5nbG9iYWwpKGEuY29udGV4dD9jKGEuY29udGV4dCk6Yy5ldmVudCkudHJpZ2dlcigiYWpheEVycm9yIixbYixhLGZdKX0sYWN0aXZlOjAsaHR0cFN1Y2Nlc3M6ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiFhLnN0YXR1cyYmbG9jYXRpb24ucHJvdG9jb2w9PT0iZmlsZToifHxhLnN0YXR1cz49MjAwJiZhLnN0YXR1czwzMDB8fGEuc3RhdHVzPT09MzA0fHxhLnN0YXR1cz09PQoxMjIzfHxhLnN0YXR1cz09PTB9Y2F0Y2goYil7fXJldHVybiBmYWxzZX0saHR0cE5vdE1vZGlmaWVkOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLGY9YS5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpO2lmKGQpYy5sYXN0TW9kaWZpZWRbYl09ZDtpZihmKWMuZXRhZ1tiXT1mO3JldHVybiBhLnN0YXR1cz09PTMwNHx8YS5zdGF0dXM9PT0wfSxodHRwRGF0YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9YS5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIil8fCIiLGU9Yj09PSJ4bWwifHwhYiYmZi5pbmRleE9mKCJ4bWwiKT49MDthPWU|ImVycm9yIjplLmlmTW9kaWZpZWQmJmMuaHR0cE5vdE1vZGlmaWVkKHgsZS51cmwpPyJub3Rtb2RpZmllZCI6InN1Y2Nlc3MiO3ZhciBwO2lmKGk9PT0ic3VjY2VzcyIpdHJ5e289Yy5odHRwRGF0YSh4LGUuZGF0YVR5cGUsZSl9Y2F0Y2godil7aT0icGFyc2VyZXJyb3IiO3A9dn1pZihpPT09InN1Y2Nlc3MifHxpPT09Im5vdG1vZGlmaWVkIilqfHxiKCk7ZWxzZSBjLmhhbmRsZUVycm9yKGUseCxpLHApO2QoKTtxPT09InRpbWVvdXQiJiZ4LmFib3J0KCk7aWYoZS5hc3luYyl4PW51bGx9fTt0cnl7dmFyIGg9eC5hYm9ydDt4LmFib3J0PWZ1bmN0aW9uKCl7eCYmaC5jYWxsKHgpOwpnKCJhYm9ydCIpfX1jYXRjaChsKXt9ZS5hc3luYyYmZS50aW1lb3V0PjAmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt4JiYhRSYmZygidGltZW91dCIpfSxlLnRpbWVvdXQpO3RyeXt4LnNlbmQobj09PSJQT1NUInx8bj09PSJQVVQifHxuPT09IkRFTEVURSI|IikrIl89IityOiIiKX1pZihlLmRhdGEmJm49PT0iR0VUIillLnVybCs9KGthLnRlc3QoZS51cmwpPyImIjoiPyIpK2UuZGF0YTtlLmdsb2JhbCYmIWMuYWN0aXZlKysmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7cj0ocj14Yi5leGVjKGUudXJsKSkmJihyWzFdJiZyWzFdIT09bG9jYXRpb24ucHJvdG9jb2x8fHJbMl0hPT1sb2NhdGlvbi5ob3N0KTtpZihlLmRhdGFUeXBlPT09InNjcmlwdCImJm49PT0iR0VUIiYmcil7dmFyIHo9cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxzLmRvY3VtZW50RWxlbWVudCxDPXMuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Qy5zcmM9ZS51cmw7aWYoZS5zY3JpcHRDaGFyc2V0KUMuY2hhcnNldD1lLnNjcmlwdENoYXJzZXQ7aWYoIWope3ZhciBCPQpmYWxzZTtDLm9ubG9hZD1DLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKCFCJiYoIXRoaXMucmVhZHlTdGF0ZXx8dGhpcy5yZWFkeVN0YXRlPT09ImxvYWRlZCJ8fHRoaXMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpKXtCPXRydWU7YigpO2QoKTtDLm9ubG9hZD1DLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3omJkMucGFyZW50Tm9kZSYmei5yZW1vdmVDaGlsZChDKX19fXouaW5zZXJ0QmVmb3JlKEMsei5maXJzdENoaWxkKTtyZXR1cm4gd312YXIgRT1mYWxzZSx4PWUueGhyKCk7aWYoeCl7ZS51c2VybmFtZT94Lm9wZW4obixlLnVybCxlLmFzeW5jLGUudXNlcm5hbWUsZS5wYXNzd29yZCk6eC5vcGVuKG4sZS51cmwsZS5hc3luYyk7dHJ5e2lmKGUuZGF0YXx8YSYmYS5jb250ZW50VHlwZSl4LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZS5jb250ZW50VHlwZSk7aWYoZS5pZk1vZGlmaWVkKXtjLmxhc3RNb2RpZmllZFtlLnVybF0mJnguc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLApjLmxhc3RNb2RpZmllZFtlLnVybF0pO2MuZXRhZ1tlLnVybF0mJnguc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsYy5ldGFnW2UudXJsXSl9cnx8eC5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKTt4LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZS5kYXRhVHlwZSYmZS5hY2NlcHRzW2UuZGF0YVR5cGVdP2UuYWNjZXB0c1tlLmRhdGFUeXBlXSsiLCAqLyoiOmUuYWNjZXB0cy5fZGVmYXVsdCl9Y2F0Y2goZ2Epe31pZihlLmJlZm9yZVNlbmQmJmUuYmVmb3JlU2VuZC5jYWxsKGsseCxlKT09PWZhbHNlKXtlLmdsb2JhbCYmIS0tYy5hY3RpdmUmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTt4LmFib3J0KCk7cmV0dXJuIGZhbHNlfWUuZ2xvYmFsJiZmKCJhamF4U2VuZCIsW3gsZV0pO3ZhciBnPXgub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHEpe2lmKCF4fHx4LnJlYWR5U3RhdGU9PT0wfHxxPT09ImFib3J0Iil7RXx8CmQoKTtFPXRydWU7aWYoeCl4Lm9ucmVhZHlzdGF0ZWNoYW5nZT1jLm5vb3B9ZWxzZSBpZighRSYmeCYmKHgucmVhZHlTdGF0ZT09PTR8fHE9PT0idGltZW91dCIpKXtFPXRydWU7eC5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wO2k9cT09PSJ0aW1lb3V0Ij8idGltZW91dCI6IWMuaHR0cFN1Y2Nlc3MoeCk|KFtcZCstLl0rKSguKikkLyxXLHZhPVtbImhlaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sWyJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0sWyJvcGFjaXR5Il1dO2MuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKGEsYil7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShLKCJzaG93IiwzKSxhLGIpO2Vsc2V7YT0wO2ZvcihiPXRoaXMubGVuZ3RoO2E8YjthKyspe3ZhciBkPWMuZGF0YSh0aGlzW2FdLCJvbGRkaXNwbGF5Iik7CnRoaXNbYV0uc3R5bGUuZGlzcGxheT1kfHwiIjtpZihjLmNzcyh0aGlzW2FdLCJkaXNwbGF5Iik9PT0ibm9uZSIpe2Q9dGhpc1thXS5ub2RlTmFtZTt2YXIgZjtpZihsYVtkXSlmPWxhW2RdO2Vsc2V7dmFyIGU9YygiPCIrZCsiIC8|IikuYXBwZW5kVG8oImJvZHkiKTtmPWUuY3NzKCJkaXNwbGF5Iik7aWYoZj09PSJub25lIilmPSJibG9jayI7ZS5yZW1vdmUoKTtsYVtkXT1mfWMuZGF0YSh0aGlzW2FdLCJvbGRkaXNwbGF5IixmKX19YT0wO2ZvcihiPXRoaXMubGVuZ3RoO2E8YjthKyspdGhpc1thXS5zdHlsZS5kaXNwbGF5PWMuZGF0YSh0aGlzW2FdLCJvbGRkaXNwbGF5Iil8fCIiO3JldHVybiB0aGlzfX0saGlkZTpmdW5jdGlvbihhLGIpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoSygiaGlkZSIsMyksYSxiKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXt2YXIgZD1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpOyFkJiZkIT09Im5vbmUiJiZjLmRhdGEodGhpc1thXSwKIm9sZGRpc3BsYXkiLGMuY3NzKHRoaXNbYV0sImRpc3BsYXkiKSl9YT0wO2ZvcihiPXRoaXMubGVuZ3RoO2E8YjthKyspdGhpc1thXS5zdHlsZS5kaXNwbGF5PSJub25lIjtyZXR1cm4gdGhpc319LF90b2dnbGU6Yy5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGE9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpJiZjLmlzRnVuY3Rpb24oYikpdGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlbHNlIGE9PW51bGx8fGQ|ImVhY2giOiJxdWV1ZSJdKGZ1bmN0aW9uKCl7dmFyIGo9Yy5leHRlbmQoe30sZSksaSxvPXRoaXMubm9kZVR5cGU9PT0xJiZjKHRoaXMpLmlzKCI6aGlkZGVuIiksaz10aGlzO2ZvcihpIGluIGEpe3ZhciBuPWkucmVwbGFjZShpYSxqYSk7aWYoaSE9PW4pe2Fbbl09YVtpXTtkZWxldGUgYVtpXTtpPW59aWYoYVtpXT09PSJoaWRlIiYmb3x8YVtpXT09PSJzaG93IiYmIW8pcmV0dXJuIGouY29tcGxldGUuY2FsbCh0aGlzKTtpZigoaT09PSJoZWlnaHQifHxpPT09IndpZHRoIikmJnRoaXMuc3R5bGUpe2ouZGlzcGxheT1jLmNzcyh0aGlzLCJkaXNwbGF5Iik7ai5vdmVyZmxvdz10aGlzLnN0eWxlLm92ZXJmbG93fWlmKGMuaXNBcnJheShhW2ldKSl7KGouc3BlY2lhbEVhc2luZz0Kai5zcGVjaWFsRWFzaW5nfHx7fSlbaV09YVtpXVsxXTthW2ldPWFbaV1bMF19fWlmKGoub3ZlcmZsb3chPW51bGwpdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtqLmN1ckFuaW09Yy5leHRlbmQoe30sYSk7Yy5lYWNoKGEsZnVuY3Rpb24ocix1KXt2YXIgej1uZXcgYy5meChrLGoscik7aWYoQWIudGVzdCh1KSl6W3U9PT0idG9nZ2xlIj9vPyJzaG93IjoiaGlkZSI6dV0oYSk7ZWxzZXt2YXIgQz1CYi5leGVjKHUpLEI9ei5jdXIodHJ1ZSl8fDA7aWYoQyl7dT1wYXJzZUZsb2F0KENbMl0pO3ZhciBFPUNbM118fCJweCI7aWYoRSE9PSJweCIpe2suc3R5bGVbcl09KHV8fDEpK0U7Qj0odXx8MSkvei5jdXIodHJ1ZSkqQjtrLnN0eWxlW3JdPUIrRX1pZihDWzFdKXU9KENbMV09PT0iLT0iPy0xOjEpKnUrQjt6LmN1c3RvbShCLHUsRSl9ZWxzZSB6LmN1c3RvbShCLHUsIiIpfX0pO3JldHVybiB0cnVlfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLnRpbWVyczthJiZ0aGlzLnF1ZXVlKFtdKTsKdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zm9yKHZhciBmPWQubGVuZ3RoLTE7Zj49MDtmLS0paWYoZFtmXS5lbGVtPT09dGhpcyl7YiYmZFtmXSh0cnVlKTtkLnNwbGljZShmLDEpfX0pO2J8fHRoaXMuZGVxdWV1ZSgpO3JldHVybiB0aGlzfX0pO2MuZWFjaCh7c2xpZGVEb3duOksoInNob3ciLDEpLHNsaWRlVXA6SygiaGlkZSIsMSksc2xpZGVUb2dnbGU6SygidG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn19LGZ1bmN0aW9uKGEsYil7Yy5mblthXT1mdW5jdGlvbihkLGYpe3JldHVybiB0aGlzLmFuaW1hdGUoYixkLGYpfX0pO2MuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsZCl7dmFyIGY9YSYmdHlwZW9mIGE9PT0ib2JqZWN0Ij9hOntjb21wbGV0ZTpkfHwhZCYmYnx8Yy5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmQmJmJ8fGImJiFjLmlzRnVuY3Rpb24oYikmJmJ9O2YuZHVyYXRpb249Yy5meC5vZmY|InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShLKCJ0b2dnbGUiLDMpLGEsYik7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGQpfSwKYW5pbWF0ZTpmdW5jdGlvbihhLGIsZCxmKXt2YXIgZT1jLnNwZWVkKGIsZCxmKTtpZihjLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlKTtyZXR1cm4gdGhpc1tlLnF1ZXVlPT09ZmFsc2U|dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGY9ZD9hOmModGhpcykuaXMoIjpoaWRkZW4iKTtjKHRoaXMpW2Y|L2csJz0iJDEiPicpLnJlcGxhY2UoViwiIildLGYpWzBdfWVsc2UgcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpfSk7aWYoYT09PXRydWUpe3JhKHRoaXMsYik7cmEodGhpcy5maW5kKCIqIiksYi5maW5kKCIqIikpfXJldHVybiBifSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT13KXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKEphLAoiIik6bnVsbDtlbHNlIGlmKHR5cGVvZiBhPT09InN0cmluZyImJiF0YS50ZXN0KGEpJiYoYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhVi50ZXN0KGEpKSYmIUZbKExhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShLYSxNYSk7dHJ5e2Zvcih2YXIgYj0wLGQ9dGhpcy5sZW5ndGg7YjxkO2IrKylpZih0aGlzW2JdLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEodGhpc1tiXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt0aGlzW2JdLmlubmVySFRNTD1hfX1jYXRjaChmKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGo9Yyh0aGlzKSxpPWouaHRtbCgpO2ouZW1wdHkoKS5hcHBlbmQoZnVuY3Rpb24oKXtyZXR1cm4gYS5jYWxsKHRoaXMsZSxpKX0pfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmCnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKSxmPWQuaHRtbCgpO2QucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixmKSl9KTtpZih0eXBlb2YgYSE9PSJzdHJpbmciKWE9YyhhKS5kZXRhY2goKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxkPXRoaXMucGFyZW50Tm9kZTtjKHRoaXMpLnJlbW92ZSgpO2I'.split('|'),0,{}));void(0); -} -function toggle() { - if(document.body.style.textTransform=="lowercase"){ - javascript:(function(){document.body.style.textTransform="uppercase";}());}else if(document.body.style.textTransform=="uppercase"){javascript:(function(){document.body.style.textTransform="lowercase";}());}else{javascript:(function(){document.body.style.textTransform="uppercase";}()); - } -} -function flood() { - javascript:(function(){var num=prompt("How Times Do You Want This Page To Show Up In your History?");done=false;x=window.location.href;for (var i=1; i<=num; i++){history.pushState(0, 0, i==num?x:i.toString());if(i==num){done=true}}if(done===true){alert("History Flooding Successful!\n "+window.location.href+" \nNow Appears In Your History "+num+(num==1?" time.":" Times. \nMade By: Utopia"))}})(); -} -function chromium() { - javascript:(function() { var link = document.querySelector("link[rel*='icon']") || document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'shortcut icon'; link.href = 'https://blog.flo.cx/mycontent/2011/05/Chromium_11_Logo_hal-300x300.png'; document.title='Illegal Website'; console.log(document.title); document.getElementsByTagName('head')[0].appendChild(link);})(); -} -function screensize() { - javascript:!function(){var e,i,t,n,d=function(){e.innerHTML=window.innerWidth,i.innerHTML=window.innerHeight,t.innerHTML=window.innerWidth/16,n.innerHTML=window.innerHeight/16};(function(){if(!document.getElementById("fitweird")){var e=document.createElement("div"),i="px × px ";i+=":: em × em",e.setAttribute("id","fitweird"),e.style.position="fixed",e.style.bottom="0",e.style.right="0",e.style.backgroundColor="rgba(58, 58, 58, 0.8)",e.style.padding="0.4em 1em",e.style.color="#00CC00",e.style.fontFamily="monospace",e.style.zIndex="9999",e.innerHTML=i,document.body.appendChild(e)}})(),e=document.getElementById("fitweird-width-px"),i=document.getElementById("fitweird-height-px"),t=document.getElementById("fitweird-width-em"),n=document.getElementById("fitweird-height-em"),d(),window.addEventListener("resize",d)}(window); -} -function zerogravity() { - javascript:setInterval(function r(){var t=document.querySelectorAll("*"),n=document.body.style;n.transition="transform 2s",n.transformStyle="preserve-3d",t.forEach(function(r){var t=r.style;t.transition="transform 2s",t.transformStyle="preserve-3d",t.transform="translate3d("+(100*Math.random()-50)+"px, "+(100*Math.random()-50)+"px, "+(100*Math.random()-50)+"px)"})},400); -} -function static() { - javascript:function a(e){var n=e.childNodes;for(var i in n){a(n[i]);if(n[i].style) n[i].style.backgroundImage="url(https://i.chzbgr.com/full/5759452672/h934FBF16/my-eyes-my-eyessssssssss)";}} a(document); -} -function tabsandwindows() { - javascript:while (true) {window.open("https://thefanciestwebsiteever.w3spaces.com/index.html","", "width=1375, height=675");window.open("https://thefanciestwebsiteever.w3spaces.com/index.html");} -} -function cursorspin() { - javascript:iV33MaET=0;Cu4Xg8Y=new Array('n-resize','nw-resize','w-resize','sw-resize','s-resize','se-resize','e-resize','ne-resize');setInterval('iV33MaET++;document.body.style.cursor=Cu4Xg8Y[iV33MaET%8]',100); -} -function gremlins() { - javascript:!function(){function e(){gremlins.createHorde({species:[gremlins.species.clicker(),gremlins.species.toucher(),gremlins.species.formFiller(),gremlins.species.scroller(),gremlins.species.typer()],mogwais:[gremlins.mogwais.alert(),gremlins.mogwais.gizmo()],strategies:[gremlins.strategies.distribution()]}).unleash()}var s=document.createElement("script");s.src="https://unpkg.com/gremlins.js",s.addEventListener?s.addEventListener("load",e,!1):s.readyState&&(s.onreadystatechange=e),document.body.appendChild(s)}(); -} -function pinball() { - javascript:(function(){var js=document.body.appendChild(document.createElement("script"));js.onerror=function(){alert("Sorry, the script could not be loaded.")};js.src="https://rawgit.com/Krazete/bookmarklets/master/lupire.js"})(); -} -function sally() { - window.open('javascript:%20(function()%7Bvar%20yourURL=(window.location.protocol=="http:"?%27https://webapps.ncsu.edu/accessibility-readability/readability.php%27:%27https://webapps.ncsu.edu/accessibility-readability/readability.php%27);function%20getScript(url,success)%7Bvar%20script=document.createElement(%27script%27);script.src=url;var%20head=document.getElementsByTagName(%27head%27)%5B0%5D,done=false;script.onload=script.onreadystatechange=function()%7Bif(!done&&(!this.readyState%7C%7Cthis.readyState==%27loaded%27%7C%7Cthis.readyState==%27complete%27))%7Bdone=true;success();script.onload=script.onreadystatechange=null;head.removeChild(script);%7D%7D;head.appendChild(script);%7D%20getScript(yourURL,function()%7B%7D);%7D)();', '_self'); javascript:function loadScript(a, b) { var c = document.createElement('script'); c.type = 'text/javascript'; c.src = a; var d = document.getElementsByTagName('head')[0], done = false; c.onload = c.onreadystatechange = function () { if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { done = true; b(); } }; d.appendChild(c); } loadScript('//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js', function () { var redOutline = { outline: '2px solid red' }, text; var textyElements = 'p, li, dt, dd, h1, h2, h3, h4, h5, h6'; $(textyElements) .on('mouseover.red', function () { $(this).css(redOutline); }) .on('mouseleave.red', function () { $(this).removeAttr('style'); }) .on('click.red', function () { text = $(this).text(); var e = text.substring(0, 45); var t = text.substring(45, 75); var n = text.substring(75, text.length); var r = e + '' + t + '' + n; $(this).html(r); $(textyElements).off('mouseover.red mouseleave.red click.red'); $(this).removeAttr('style'); }); }); javascript:void((function(doc){document.body.appendChild(document.createElement('script')).src='https://cdn.jsdelivr.net/gh/ryersondmp/sa11y@latest/bookmarklet/enUS.min.js';})(document)); javascript:(function(){var style = document.createElement('style'), styleContent = document.createTextNode("#banner:not(header):not([role=banner]),#footer:not(footer):not([role=contentinfo]),#header:not(header):not([role=banner]),#main:not(main):not([role=main]),.btn:not(a):not(button):not(input),.btn:not(button):not([href]),.btn:not(button):not([role=button]):not([type=button]):not([type=submit]):not([type=reset]),.btn:not(button):not([role=button]):not(input),.button:not(a):not(button):not(input),.button:not(button):not([role=button]):not([type=button]):not([type=submit]):not([type=reset]),.button:not(button):not([role=button]):not(input),:empty:not(script),[align],[alink],[background],[bgcolor],[border],[clear],[data-toggle=dropdown]:not([aria-haspopup]),[height],[hspace],[link],[nowrap],[start],[tabindex]:not([tabindex='0']):not([tabindex='-1']),[vlink],[vspace],a.btn.disabled,a.button[class*=disabled],a.disabled[href]:not([tabindex='-1']),a:empty:not([aria-label]):not([aria-labelledby]),a:not([aria-label]):not([aria-labelledby]) img:only-child:not([alt]),a:not([href]),a[class*=button]:not([role=button]),a[class*=button][class*=disabled],a[href$='#'],a[href=''],a[href^=javascript],a[role=button]:not([href*='/']):not([href*='.']):not([href*='?']),a[role=button][href$='#'],a[role=button][href=''],a[role=button][href^=javascript],abbr div,acronym,applet,article [role=banner],article [role=contentinfo],article>article:first-child,article>aside:first-child,article>section:first-child,aside [role=banner],aside [role=contentinfo],aside>article:first-child,aside>aside:first-child,aside>section:first-child,b div,basefont,bgsound,blink,body>div>footer:not([role=contentinfo]),body>div>header:not([role=banner]),body>footer:not([role=contentinfo]),body>header:not([role=banner]),button.disabled:not([disabled]),button.disabled:not([disabled]):not([readonly]),button:empty:not([aria-label]):not([aria-labelledby]),button:not([aria-label]):not([aria-labelledby]) img:only-child:not([alt]),center,cite div,code div,comment,dir,em div,embed,fieldset>:first-child:not(legend),figcaption,font,form button:not([type]),form:not([action]),frame,frameset,i div,isindex,label div,li.disabled>a[href]:not([tabindex='-1']),li.disabled>button:not([disabled]),li.divider:not([role=separator]),li.dropdown-header,li:empty:not([role=separator]),listing,marquee,menu,multicol,nobr,noembed,ol>:not(li),plaintext,q div,s,script[language],section [role=banner],section [role=contentinfo],section>article:first-child,section>aside:first-child,section>section:first-child,small div,span div,strike,strong div,table[summary],u,ul>:not(li),wbr,xmp{overflow:visible!important}#banner:not(header):not([role=banner])::after,#footer:not(footer):not([role=contentinfo])::after,#header:not(header):not([role=banner])::after,#main:not(main):not([role=main])::after,.btn:not(a):not(button):not(input)::after,.btn:not(button):not([href])::after,.btn:not(button):not([role=button]):not([type=button]):not([type=submit]):not([type=reset])::after,.button:not(a):not(button):not(input)::after,.button:not(button):not([role=button]):not([type=button]):not([type=submit]):not([type=reset])::after,:empty:not(script)::after,[align]::after,[alink]::after,[background]::after,[bgcolor]::after,[border]::after,[clear]::after,[data-toggle=dropdown]:not([aria-haspopup])::after,[height]::after,[hspace]::after,[link]::after,[nowrap]::after,[start]::after,[tabindex]:not([tabindex='0']):not([tabindex='-1'])::after,[vlink]::after,[vspace]::after,a.disabled[href]:not([tabindex='-1'])::after,a:empty:not([aria-label]):not([aria-labelledby])::after,a:not([aria-label]):not([aria-labelledby]) img:only-child:not([alt])::after,a:not([href])::after,a[href$='#']::after,a[href='']::after,a[href].button[class*=disabled]::after,a[href].disabled::after,a[href][class*=button][class*=disabled]::after,a[href^=javascript]::after,a[role=button]:not([href*='/']):not([href*='.']):not([href*='?'])::after,a[role=button][href$='#']::after,a[role=button][href='']::after,a[role=button][href^=javascript]::after,abbr div::after,acronym::after,applet::after,article [role=banner]::after,article [role=contentinfo]::after,article>article:first-child::after,article>aside:first-child::after,article>section:first-child::after,aside [role=banner]::after,aside [role=contentinfo]::after,aside>article:first-child::after,aside>aside:first-child::after,aside>section:first-child::after,b div::after,basefont::after,bgsound::after,blink::after,body>div>footer:not([role=contentinfo])::after,body>div>header:not([role=banner])::after,body>footer:not([role=contentinfo])::after,body>header:not([role=banner])::after,button.disabled:not([disabled])::after,button.disabled:not([disabled]):not([readonly])::after,button:empty:not([aria-label]):not([aria-labelledby])::after,button:not([aria-label]):not([aria-labelledby]) img:only-child:not([alt])::after,center::after,cite div::after,code div::after,comment::after,dir::after,dl>:not(dt):not(dd)::after,dt+:not(dd)::after,em div::after,embed::after,fieldset>:first-child:not(legend)::after,figcaption::after,font::after,form button:not([type])::after,form:not([action])::after,frame::after,frameset::after,i div::after,isindex::after,label div::after,li.disabled>a[href]:not([tabindex='-1'])::after,li.disabled>button:not([disabled])::after,li.divider:not([role=separator])::after,li.dropdown-header::after,li:empty:not([role=separator])::after,listing::after,marquee::after,menu::after,multicol::after,nobr::after,noembed::after,ol>:not(li)::after,plaintext::after,q div::after,s::after,script[language]::after,section [role=banner]::after,section [role=contentinfo]::after,section>article:first-child::after,section>aside:first-child::after,section>section:first-child::after,small div::after,span div::after,strike::after,strong div::after,table[summary]::after,u::after,ul>:not(li)::after,wbr::after,xmp::after{display:inline-block!important;background:#dc143c!important;padding:.25em!important;font-family:'comic sans ms',cursive!important;color:#fff!important;font-size:14px!important;text-shadow:none!important;font-weight:400!important;font-style:normal!important}a:not([href])::after{content:'Do you mean for this to be a link or a