Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save matoken/c783afa38c7574be04340f9b6005bc10 to your computer and use it in GitHub Desktop.
Save matoken/c783afa38c7574be04340f9b6005bc10 to your computer and use it in GitHub Desktop.
<!DOCTYPE html> <html lang=en class=title><!--
Page saved with SingleFile
url: file:///home/matoken/Yandex.Disk/Nextcloud_matoken@files.matoken.org/Linux/OSC/2022/oscnagoya(2022-05-28)/slide/slide.html#/
saved date: Sat May 28 2022 16:24:31 GMT+0900 (Japan Standard Time)
--><meta charset=utf-8><meta name=viewport content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui"><title>OSCの動画を聞く</title><meta name=author content="Kenichiro Matohara(matoken) <maroken@kagolug.org>"><style>html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,main,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}html{width:100%;height:100%;height:100vh;height:calc(var(--vh, 1vh) * 100);overflow:hidden}body{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000}.reveal .slides section .fragment{opacity:0;visibility:hidden;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow.visible{-webkit-transform:scale(1.3);transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1;visibility:inherit}.reveal .slides section .fragment.shrink.visible{-webkit-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{-webkit-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{-webkit-transform:none;transform:none}.reveal .slides section .fragment.fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .slides section .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.semi-fade-out.visible{opacity:0.5;visibility:inherit}.reveal .slides section .fragment.strike{opacity:1;visibility:inherit}.reveal .slides section .fragment.strike.visible{text-decoration:line-through}.reveal .slides section .fragment.fade-up{-webkit-transform:translate(0,40px);transform:translate(0,40px)}.reveal .slides section .fragment.fade-up.visible{-webkit-transform:translate(0,0);transform:translate(0,0)}.reveal .slides section .fragment.fade-down{-webkit-transform:translate(0,-40px);transform:translate(0,-40px)}.reveal .slides section .fragment.fade-down.visible{-webkit-transform:translate(0,0);transform:translate(0,0)}.reveal .slides section .fragment.fade-right{-webkit-transform:translate(-40px,0);transform:translate(-40px,0)}.reveal .slides section .fragment.fade-right.visible{-webkit-transform:translate(0,0);transform:translate(0,0)}.reveal .slides section .fragment.fade-left{-webkit-transform:translate(40px,0);transform:translate(40px,0)}.reveal .slides section .fragment.fade-left.visible{-webkit-transform:translate(0,0);transform:translate(0,0)}.reveal .slides section .fragment.fade-in-then-out,.reveal .slides section .fragment.current-visible{opacity:0;visibility:hidden}.reveal .slides section .fragment.fade-in-then-out.current-fragment,.reveal .slides section .fragment.current-visible.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.fade-in-then-semi-out.visible{opacity:0.5;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-red,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}.reveal .stretch{max-width:none;max-height:none}.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}@-webkit-keyframes bounce-right{0%,10%,25%,40%,50%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(10px);transform:translateX(10px)}30%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}}@keyframes bounce-right{0%,10%,25%,40%,50%{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(10px);transform:translateX(10px)}30%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}}@-webkit-keyframes bounce-down{0%,10%,25%,40%,50%{-webkit-transform:translateY(0);transform:translateY(0)}20%{-webkit-transform:translateY(10px);transform:translateY(10px)}30%{-webkit-transform:translateY(-5px);transform:translateY(-5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{-webkit-transform:translateY(0);transform:translateY(0)}20%{-webkit-transform:translateY(10px);transform:translateY(10px)}30%{-webkit-transform:translateY(-5px);transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:12px;right:12px;left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;-webkit-transform:scale(0.9999);transform:scale(0.9999);transition:color 0.2s ease,opacity 0.2s ease,-webkit-transform 0.2s ease;transition:color 0.2s ease,opacity 0.2s ease,transform 0.2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.reveal .controls .controls-arrow:before,.reveal .controls .controls-arrow:after{content:'';position:absolute;top:0;left:0;width:2.6em;height:0.5em;border-radius:0.25em;background-color:currentColor;transition:all 0.15s ease,background-color 0.8s ease;-webkit-transform-origin:0.2em 50%;transform-origin:0.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(45deg);transform:translateX(0.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(-45deg);transform:translateX(0.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(40deg);transform:translateX(0.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(-40deg);transform:translateX(0.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(36deg);transform:translateX(0.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(-36deg);transform:translateX(0.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.reveal .controls .navigate-right{right:0;bottom:3.2em;-webkit-transform:translateX(10px);transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{-webkit-animation:bounce-right 2s 50 both ease-out;animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;-webkit-transform:translateY(10px);transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{-webkit-animation:bounce-down 2s 50 both ease-out;animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows="faded"] .navigate-left.enabled,.reveal .controls[data-controls-back-arrows="faded"] .navigate-up.enabled{opacity:0.3}.reveal .controls[data-controls-back-arrows="faded"] .navigate-left.enabled:hover,.reveal .controls[data-controls-back-arrows="faded"] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows="hidden"] .navigate-left.enabled,.reveal .controls[data-controls-back-arrows="hidden"] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:0.9;cursor:pointer;-webkit-transform:none;transform:none}.reveal .controls .enabled.fragmented{opacity:0.5}.reveal .controls .enabled:hover,.reveal .controls .enabled.fragmented:hover{opacity:1}.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-up,.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-down{display:none}.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-left,.reveal:not(.has-vertical-slides) .controls .navigate-left{bottom:1.4em;right:5.5em}.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-right,.reveal:not(.has-vertical-slides) .controls .navigate-right{bottom:1.4em;right:0.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:0.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:hover:before,.reveal.no-hover .controls .controls-arrow:active:before{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(45deg);transform:translateX(0.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:hover:after,.reveal.no-hover .controls .controls-arrow:active:after{-webkit-transform:translateX(0.5em) translateY(1.55em) rotate(-45deg);transform:translateX(0.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal .controls[data-controls-layout="edges"]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout="edges"] .navigate-left,.reveal .controls[data-controls-layout="edges"] .navigate-right,.reveal .controls[data-controls-layout="edges"] .navigate-up,.reveal .controls[data-controls-layout="edges"] .navigate-down{bottom:auto;right:auto}.reveal .controls[data-controls-layout="edges"] .navigate-left{top:50%;left:0.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout="edges"] .navigate-right{top:50%;right:0.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout="edges"] .navigate-up{top:0.8em;left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout="edges"] .navigate-down{bottom:-0.3em;left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,0.2);color:#fff}.reveal .progress:after{content:'';display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:0px;background-color:currentColor;transition:width 800ms cubic-bezier(0.26,0.86,0.44,0.985)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,0.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;-ms-touch-action:pinch-zoom;touch-action:pinch-zoom}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;-webkit-perspective:600px;perspective:600px;-webkit-perspective-origin:50% 40%;perspective-origin:50% 40%}.reveal .slides>section{-webkit-perspective:600px;perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0px;pointer-events:auto;z-index:10;-webkit-transform-style:flat;transform-style:flat;transition:-webkit-transform-origin 800ms cubic-bezier(0.26,0.86,0.44,0.985),-webkit-transform 800ms cubic-bezier(0.26,0.86,0.44,0.985),visibility 800ms cubic-bezier(0.26,0.86,0.44,0.985),opacity 800ms cubic-bezier(0.26,0.86,0.44,0.985);transition:transform-origin 800ms cubic-bezier(0.26,0.86,0.44,0.985),transform 800ms cubic-bezier(0.26,0.86,0.44,0.985),visibility 800ms cubic-bezier(0.26,0.86,0.44,0.985),opacity 800ms cubic-bezier(0.26,0.86,0.44,0.985)}.reveal[data-transition-speed="fast"] .slides section{transition-duration:400ms}.reveal[data-transition-speed="slow"] .slides section{transition-duration:1200ms}.reveal .slides section[data-transition-speed="fast"]{transition-duration:400ms}.reveal .slides section[data-transition-speed="slow"]{transition-duration:1200ms}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section[data-background-interactive],.reveal .slides>section>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section.future,.reveal .slides>section>section.future,.reveal .slides>section.past,.reveal .slides>section>section.past{pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.past,.reveal .slides>section.future,.reveal .slides>section>section.past,.reveal .slides>section>section.future{opacity:0}.reveal.slide section{-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{-webkit-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{-webkit-transform:translate(150%,0);transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{-webkit-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{-webkit-transform:translate(0,150%);transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{-webkit-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{-webkit-transform:translate(150%,0);transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{-webkit-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{-webkit-transform:translate(0,150%);transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{-webkit-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{-webkit-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;-webkit-transform:scale(16);transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;-webkit-transform:scale(0.2);transform:scale(0.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{-webkit-transform:scale(16);transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{-webkit-transform:scale(0.2);transform:scale(0.2)}.reveal.cube .slides{-webkit-perspective:1300px;perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,0.1);border-radius:4px;-webkit-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:none;z-index:1;border-radius:4px;box-shadow:0px 95px 25px rgba(0,0,0,0.2);-webkit-transform:translateZ(-90px) rotateX(65deg);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:none}.reveal.cube .slides>section.past{-webkit-transform-origin:100% 0%;transform-origin:100% 0%;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg);transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{-webkit-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transform:translate3d(100%,0,0) rotateY(90deg);transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{-webkit-transform-origin:0% 100%;transform-origin:0% 100%;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg);transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{-webkit-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg);transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{-webkit-perspective-origin:0% 50%;perspective-origin:0% 50%;-webkit-perspective:3000px;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,0.1);-webkit-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:none;z-index:1;border-radius:4px;box-shadow:0px 95px 25px rgba(0,0,0,0.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:none}.reveal.page .slides>section.past{-webkit-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transform:translate3d(-40%,0,0) rotateY(-80deg);transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{-webkit-transform-origin:100% 0%;transform-origin:100% 0%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{-webkit-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transform:translate3d(0,-40%,0) rotateX(80deg);transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{-webkit-transform-origin:0% 100%;transform-origin:0% 100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){-webkit-transform:none;transform:none;transition:opacity 0.5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){-webkit-transform:none;transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:black;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:transparent;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .reveal{overflow:visible}.no-transforms .reveal .slides{position:relative;width:80%;max-width:1280px;height:auto;top:0;margin:0 auto;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none}.no-transforms .reveal .slides section{display:block;opacity:1;position:relative;height:auto;min-height:0;top:0;left:0;margin:10vh 0;margin:70px 0;-webkit-transform:none;transform:none}.reveal .no-transition,.reveal .no-transition *{transition:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;-webkit-perspective:600px;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all 800ms cubic-bezier(0.26,0.86,0.44,0.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;-o-object-fit:cover;object-fit:cover}.reveal .slide-background[data-background-size="contain"] video{-o-object-fit:contain;object-fit:contain}.reveal[data-background-transition=none]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=none]{transition:none}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=zoom]{transition-timing-function:ease}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);transform:scale(0.2)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);transform:scale(0.2)}.reveal[data-transition-speed="fast"]>.backgrounds .slide-background{transition-duration:400ms}.reveal[data-transition-speed="slow"]>.backgrounds .slide-background{transition-duration:1200ms}.reveal.overview{-webkit-perspective-origin:50% 50%;perspective-origin:50% 50%;-webkit-perspective:700px;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section:hover,.reveal.overview .slides section.present{outline:10px solid rgba(150,150,150,0.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:none;outline:none;overflow:visible}.reveal.overview .backgrounds{-webkit-perspective:inherit;perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,0.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl pre,.reveal.rtl code{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{float:right}.reveal.has-parallax-background .backgrounds{transition:all 0.8s ease}.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds{transition-duration:400ms}.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds{transition-duration:1200ms}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,0.9);opacity:0;visibility:hidden;transition:all 0.3s ease}.reveal>.overlay.visible{opacity:1;visibility:visible}.reveal>.overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:0.6;transition:all 0.3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:0.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:-webkit-box;display:-ms-flexbox;display:flex;top:40px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all 0.3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity 0.3s ease 0.3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);transform:scale(0.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table th,.reveal>.overlay.overlay-help .viewport .viewport-inner table td{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all 400ms ease;-webkit-tap-highlight-color:rgba(0,0,0,0)}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:0.6;padding-right:0.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:0.4}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;-webkit-perspective:400px;perspective:400px;-webkit-perspective-origin:50% 50%;perspective-origin:50% 50%}.reveal .roll:hover{background:none;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all 400ms ease;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,0.5);-webkit-transform:translate3d(0px,0px,-45px) rotateX(90deg);transform:translate3d(0px,0px,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;-webkit-transform:translate3d(0px,110%,0px) rotateX(-90deg);transform:translate3d(0px,110%,0px) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.3333333333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,0.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:none}.reveal .speaker-notes:before{content:'Speaker notes';display:block;margin-bottom:10px;opacity:0.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:42.8571428571%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:66.6666666667%;height:40vh}.reveal .speaker-notes{font-size:14px}}.zoomed .reveal *,.zoomed .reveal *:before,.zoomed .reveal *:after{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .progress,.zoomed .reveal .controls{opacity:0}.zoomed .reveal .roll span{background:none}.zoomed .reveal .roll span:after{visibility:hidden}.reveal a{line-height:1.3em}body{background:#F0F1EB;background-color:#F0F1EB}.reveal{font-family:"Palatino Linotype","Book Antiqua",Palatino,FreeSerif,serif;font-size:40px;font-weight:normal;color:#000}::selection{color:#fff;background:#26351C;text-shadow:none}::-moz-selection{color:#fff;background:#26351C;text-shadow:none}.reveal .slides section,.reveal .slides section>section{line-height:1.3;font-weight:inherit}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{margin:0 0 20px 0;color:#383D3D;font-family:"Palatino Linotype","Book Antiqua",Palatino,FreeSerif,serif;font-weight:normal;line-height:1.2;letter-spacing:normal;text-transform:none;text-shadow:none;word-wrap:break-word}.reveal h1{font-size:3.77em}.reveal h2{font-size:2.11em}.reveal h3{font-size:1.55em}.reveal h4{font-size:1em}.reveal h1{text-shadow:none}.reveal p{margin:20px 0;line-height:1.3}.reveal img,.reveal video,.reveal iframe{max-width:95%;max-height:95%}.reveal strong,.reveal b{font-weight:bold}.reveal em{font-style:italic}.reveal ol,.reveal dl,.reveal ul{display:inline-block;text-align:left;margin:0 0 0 1em}.reveal ol{list-style-type:decimal}.reveal ul{list-style-type:disc}.reveal ul ul{list-style-type:square}.reveal ul ul ul{list-style-type:circle}.reveal ul ul,.reveal ul ol,.reveal ol ol,.reveal ol ul{display:block;margin-left:40px}.reveal dt{font-weight:bold}.reveal dd{margin-left:40px}.reveal blockquote{display:block;position:relative;width:70%;margin:20px auto;padding:5px;font-style:italic;background:rgba(255,255,255,0.05);box-shadow:0px 0px 2px rgba(0,0,0,0.2)}.reveal blockquote p:first-child,.reveal blockquote p:last-child{display:inline-block}.reveal q{font-style:italic}.reveal pre{display:block;position:relative;width:90%;margin:20px auto;text-align:left;font-size:0.55em;font-family:monospace;line-height:1.2em;word-wrap:break-word;box-shadow:0px 5px 15px rgba(0,0,0,0.15)}.reveal code{font-family:monospace;text-transform:none}.reveal pre code{display:block;padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.reveal table{margin:auto;border-collapse:collapse;border-spacing:0}.reveal table th{font-weight:bold}.reveal table th,.reveal table td{text-align:left;padding:0.2em 0.5em 0.2em 0.5em;border-bottom:1px solid}.reveal table th[align="center"],.reveal table td[align="center"]{text-align:center}.reveal table th[align="right"],.reveal table td[align="right"]{text-align:right}.reveal table tbody tr:last-child th,.reveal table tbody tr:last-child td{border-bottom:none}.reveal sup{vertical-align:super;font-size:smaller}.reveal sub{vertical-align:sub;font-size:smaller}.reveal small{display:inline-block;font-size:0.6em;line-height:1.2em;vertical-align:top}.reveal small *{vertical-align:top}.reveal a{color:#51483D;text-decoration:none;-webkit-transition:color .15s ease;-moz-transition:color .15s ease;transition:color .15s ease}.reveal a:hover{color:#8b7c69;text-shadow:none;border:none}.reveal .roll span:after{color:#fff;background:#25211c}.reveal section img{margin:15px 0px;background:rgba(255,255,255,0.12);border:4px solid #000;box-shadow:0 0 10px rgba(0,0,0,0.15)}.reveal section img.plain{border:0;box-shadow:none}.reveal a img{-webkit-transition:all .15s linear;-moz-transition:all .15s linear;transition:all .15s linear}.reveal a:hover img{background:rgba(255,255,255,0.2);border-color:#51483D;box-shadow:0 0 20px rgba(0,0,0,0.55)}.reveal .controls{color:#51483D}.reveal .progress{background:rgba(0,0,0,0.2);color:#51483D}.reveal .progress span{-webkit-transition:width 800ms cubic-bezier(0.26,0.86,0.44,0.985);-moz-transition:width 800ms cubic-bezier(0.26,0.86,0.44,0.985);transition:width 800ms cubic-bezier(0.26,0.86,0.44,0.985)}.reveal div.right{float:right}.reveal .listingblock.stretch>.content{height:100%}.reveal .listingblock.stretch>.content>pre{height:100%}.reveal .listingblock.stretch>.content>pre>code{height:100%;max-height:100%}table{border-collapse:collapse;border-spacing:0}table{margin-bottom:1.25em;border:solid 1px #dedede}table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;text-align:left}table tr th,table tr td{padding:.5625em .625em;font-size:inherit}table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}td.tableblock>.content{margin-bottom:1.25em}td.tableblock>.content>:last-child{margin-bottom:-1.25em}table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}table.frame-all{border-width:1px}table.frame-sides{border-width:0 1px}table.frame-topbot,table.frame-ends{border-width:1px 0}.reveal table th.halign-left,.reveal table td.halign-left{text-align:left}.reveal table th.halign-right,.reveal table td.halign-right{text-align:right}.reveal table th.halign-center,.reveal table td.halign-center{text-align:center}.reveal table th.valign-top,.reveal table td.valign-top{vertical-align:top}.reveal table th.valign-bottom,.reveal table td.valign-bottom{vertical-align:bottom}.reveal table th.valign-middle,.reveal table td.valign-middle{vertical-align:middle}table thead th,table tfoot th{font-weight:bold}tbody tr th{display:table-cell;line-height:1.6}tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{font-weight:bold}thead{display:table-header-group}.reveal table.grid-none th,.reveal table.grid-none td{border-bottom:0!important}kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}.keyseq kbd:first-child{margin-left:0}.keyseq kbd:last-child{margin-right:0}.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}.conum[data-value] *{color:#fff!important}.conum[data-value]+b{display:none}.conum[data-value]:after{content:attr(data-value)}pre .conum[data-value]{position:relative;top:-.125em}b.conum *{color:inherit!important}.conum:not([data-value]):empty{display:none}.hdlist>table,.colist>table{border:0;background:none}.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}td.hdlist1{font-weight:bold;padding-bottom:1.25em}.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}.colist td:not([class]):first-child img{max-width:none}.colist td:not([class]):last-child{padding:.25em 0}.reveal .hljs table{border:0}.reveal .colist>table th,.reveal .colist>table td{border-bottom:0}.reveal .hljs table thead tr th,.reveal .hljs table tfoot tr th,.reveal .hljs table tbody tr td,.reveal .hljs table tr td,.reveal .hljs table tfoot tr td{line-height:inherit}.columns .slide-content{display:flex}.columns.wrap .slide-content{flex-wrap:wrap}.columns.is-vcentered .slide-content{align-items:center}.columns .slide-content>.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1}.columns .slide-content>.column>*{padding:.75rem}.columns.wrap .slide-content>.column{flex-basis:auto}.columns .slide-content>.column.is-full{flex:none;width:100%}.columns .slide-content>.column.is-four-fifths{flex:none;width:80%}.columns .slide-content>.column.is-three-quarters{flex:none;width:75%}.columns .slide-content>.column.is-two-thirds{flex:none;width:66.6666%}.columns .slide-content>.column.is-three-fifths{flex:none;width:60%}.columns .slide-content>.column.is-half{flex:none;width:50%}.columns .slide-content>.column.is-two-fifths{flex:none;width:40%}.columns .slide-content>.column.is-one-third{flex:none;width:33.3333%}.columns .slide-content>.column.is-one-quarter{flex:none;width:25%}.columns .slide-content>.column.is-one-fifth{flex:none;width:20%}.columns .slide-content>.column.has-text-left{text-align:left}.columns .slide-content>.column.has-text-justified{text-align:justify}.columns .slide-content>.column.has-text-right{text-align:right}.columns .slide-content>.column.has-text-left{text-align:left}.columns .slide-content>.column.has-text-justified{text-align:justify}.columns .slide-content>.column.has-text-right{text-align:right}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}.text-justify{text-align:justify!important}.footnotes{border-top:1px solid rgba(0,0,0,0.2);padding:0.5em 0 0 0;font-size:0.65em;margin-top:4em}.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.fab{font-family:"Font Awesome 5 Brands"}.fab,.far{font-weight:400}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f884"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cab:before{content:"\f1ba"}</style><script>var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? "node_modules/reveal.js/css/print/pdf.css" : "node_modules/reveal.js/css/print/paper.css";
document.getElementsByTagName( 'head' )[0].appendChild( link );</script><script src=data:text/javascript;base64,Ly8gQ3VzdG9tIHJldmVhbC5qcyBpbnRlZ3JhdGlvbgp2YXIgUmV2ZWFsWm9vbSA9IChmdW5jdGlvbigpewoKCXJldHVybiB7CgkJaW5pdDogZnVuY3Rpb24oKSB7CgoJCQlSZXZlYWwuZ2V0UmV2ZWFsRWxlbWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWRvd24nLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl2YXIgZGVmYXVsdE1vZGlmaWVyID0gL0xpbnV4Ly50ZXN0KCB3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtICkgPyAnY3RybCcgOiAnYWx0JzsKCgkJCQl2YXIgbW9kaWZpZXIgPSAoIFJldmVhbC5nZXRDb25maWcoKS56b29tS2V5ID8gUmV2ZWFsLmdldENvbmZpZygpLnpvb21LZXkgOiBkZWZhdWx0TW9kaWZpZXIgKSArICdLZXknOwoJCQkJdmFyIHpvb21MZXZlbCA9ICggUmV2ZWFsLmdldENvbmZpZygpLnpvb21MZXZlbCA/IFJldmVhbC5nZXRDb25maWcoKS56b29tTGV2ZWwgOiAyICk7CgoJCQkJaWYoIGV2ZW50WyBtb2RpZmllciBdICYmICFSZXZlYWwuaXNPdmVydmlldygpICkgewoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkJCXpvb20udG8oewoJCQkJCQl4OiBldmVudC5jbGllbnRYLAoJCQkJCQl5OiBldmVudC5jbGllbnRZLAoJCQkJCQlzY2FsZTogem9vbUxldmVsLAoJCQkJCQlwYW46IGZhbHNlCgkJCQkJfSk7CgkJCQl9CgkJCX0gKTsKCgkJfQoJfQoKfSkoKTsKClJldmVhbC5yZWdpc3RlclBsdWdpbiggJ3pvb20nLCBSZXZlYWxab29tICk7CgovKiEKICogem9vbS5qcyAwLjMgKG1vZGlmaWVkIGZvciB1c2Ugd2l0aCByZXZlYWwuanMpCiAqIGh0dHA6Ly9sYWIuaGFraW0uc2Uvem9vbS1qcwogKiBNSVQgbGljZW5zZWQKICoKICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTQgSGFraW0gRWwgSGF0dGFiLCBodHRwOi8vaGFraW0uc2UKICovCnZhciB6b29tID0gKGZ1bmN0aW9uKCl7CgoJLy8gVGhlIGN1cnJlbnQgem9vbSBsZXZlbCAoc2NhbGUpCgl2YXIgbGV2ZWwgPSAxOwoKCS8vIFRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uLCB1c2VkIGZvciBwYW5uaW5nCgl2YXIgbW91c2VYID0gMCwKCQltb3VzZVkgPSAwOwoKCS8vIFRpbWVvdXQgYmVmb3JlIHBhbiBpcyBhY3RpdmF0ZWQKCXZhciBwYW5FbmdhZ2VUaW1lb3V0ID0gLTEsCgkJcGFuVXBkYXRlSW50ZXJ2YWwgPSAtMTsKCgkvLyBDaGVjayBmb3IgdHJhbnNmb3JtIHN1cHBvcnQgc28gdGhhdCB3ZSBjYW4gZmFsbGJhY2sgb3RoZXJ3aXNlCgl2YXIgc3VwcG9ydHNUcmFuc2Zvcm1zID0gCSdXZWJraXRUcmFuc2Zvcm0nIGluIGRvY3VtZW50LmJvZHkuc3R5bGUgfHwKCQkJCQkJCQknTW96VHJhbnNmb3JtJyBpbiBkb2N1bWVudC5ib2R5LnN0eWxlIHx8CgkJCQkJCQkJJ21zVHJhbnNmb3JtJyBpbiBkb2N1bWVudC5ib2R5LnN0eWxlIHx8CgkJCQkJCQkJJ09UcmFuc2Zvcm0nIGluIGRvY3VtZW50LmJvZHkuc3R5bGUgfHwKCQkJCQkJCQkndHJhbnNmb3JtJyBpbiBkb2N1bWVudC5ib2R5LnN0eWxlOwoKCWlmKCBzdXBwb3J0c1RyYW5zZm9ybXMgKSB7CgkJLy8gVGhlIGVhc2luZyB0aGF0IHdpbGwgYmUgYXBwbGllZCB3aGVuIHdlIHpvb20gaW4vb3V0CgkJZG9jdW1lbnQuYm9keS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAwLjhzIGVhc2UnOwoJCWRvY3VtZW50LmJvZHkuc3R5bGUuT1RyYW5zaXRpb24gPSAnLW8tdHJhbnNmb3JtIDAuOHMgZWFzZSc7CgkJZG9jdW1lbnQuYm9keS5zdHlsZS5tc1RyYW5zaXRpb24gPSAnLW1zLXRyYW5zZm9ybSAwLjhzIGVhc2UnOwoJCWRvY3VtZW50LmJvZHkuc3R5bGUuTW96VHJhbnNpdGlvbiA9ICctbW96LXRyYW5zZm9ybSAwLjhzIGVhc2UnOwoJCWRvY3VtZW50LmJvZHkuc3R5bGUuV2Via2l0VHJhbnNpdGlvbiA9ICctd2Via2l0LXRyYW5zZm9ybSAwLjhzIGVhc2UnOwoJfQoKCS8vIFpvb20gb3V0IGlmIHRoZSB1c2VyIGhpdHMgZXNjYXBlCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAna2V5dXAnLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYoIGxldmVsICE9PSAxICYmIGV2ZW50LmtleUNvZGUgPT09IDI3ICkgewoJCQl6b29tLm91dCgpOwoJCX0KCX0gKTsKCgkvLyBNb25pdG9yIG1vdXNlIG1vdmVtZW50IGZvciBwYW5uaW5nCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2Vtb3ZlJywgZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmKCBsZXZlbCAhPT0gMSApIHsKCQkJbW91c2VYID0gZXZlbnQuY2xpZW50WDsKCQkJbW91c2VZID0gZXZlbnQuY2xpZW50WTsKCQl9Cgl9ICk7CgoJLyoqCgkgKiBBcHBsaWVzIHRoZSBDU1MgcmVxdWlyZWQgdG8gem9vbSBpbiwgcHJlZmVycyB0aGUgdXNlIG9mIENTUzMKCSAqIHRyYW5zZm9ybXMgYnV0IGZhbGxzIGJhY2sgb24gem9vbSBmb3IgSUUuCgkgKgoJICogQHBhcmFtIHtPYmplY3R9IHJlY3QKCSAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZQoJICovCglmdW5jdGlvbiBtYWduaWZ5KCByZWN0LCBzY2FsZSApIHsKCgkJdmFyIHNjcm9sbE9mZnNldCA9IGdldFNjcm9sbE9mZnNldCgpOwoKCQkvLyBFbnN1cmUgYSB3aWR0aC9oZWlnaHQgaXMgc2V0CgkJcmVjdC53aWR0aCA9IHJlY3Qud2lkdGggfHwgMTsKCQlyZWN0LmhlaWdodCA9IHJlY3QuaGVpZ2h0IHx8IDE7CgoJCS8vIENlbnRlciB0aGUgcmVjdCB3aXRoaW4gdGhlIHpvb21lZCB2aWV3cG9ydAoJCXJlY3QueCAtPSAoIHdpbmRvdy5pbm5lcldpZHRoIC0gKCByZWN0LndpZHRoICogc2NhbGUgKSApIC8gMjsKCQlyZWN0LnkgLT0gKCB3aW5kb3cuaW5uZXJIZWlnaHQgLSAoIHJlY3QuaGVpZ2h0ICogc2NhbGUgKSApIC8gMjsKCgkJaWYoIHN1cHBvcnRzVHJhbnNmb3JtcyApIHsKCQkJLy8gUmVzZXQKCQkJaWYoIHNjYWxlID09PSAxICkgewoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS50cmFuc2Zvcm0gPSAnJzsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUuT1RyYW5zZm9ybSA9ICcnOwoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS5tc1RyYW5zZm9ybSA9ICcnOwoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS5Nb3pUcmFuc2Zvcm0gPSAnJzsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUuV2Via2l0VHJhbnNmb3JtID0gJyc7CgkJCX0KCQkJLy8gU2NhbGUKCQkJZWxzZSB7CgkJCQl2YXIgb3JpZ2luID0gc2Nyb2xsT2Zmc2V0LnggKydweCAnKyBzY3JvbGxPZmZzZXQueSArJ3B4JywKCQkJCQl0cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcrIC1yZWN0LnggKydweCwnKyAtcmVjdC55ICsncHgpIHNjYWxlKCcrIHNjYWxlICsnKSc7CgoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSBvcmlnaW47CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLk9UcmFuc2Zvcm1PcmlnaW4gPSBvcmlnaW47CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLm1zVHJhbnNmb3JtT3JpZ2luID0gb3JpZ2luOwoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS5Nb3pUcmFuc2Zvcm1PcmlnaW4gPSBvcmlnaW47CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLldlYmtpdFRyYW5zZm9ybU9yaWdpbiA9IG9yaWdpbjsKCgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUuT1RyYW5zZm9ybSA9IHRyYW5zZm9ybTsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUubXNUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLk1velRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUuV2Via2l0VHJhbnNmb3JtID0gdHJhbnNmb3JtOwoJCQl9CgkJfQoJCWVsc2UgewoJCQkvLyBSZXNldAoJCQlpZiggc2NhbGUgPT09IDEgKSB7CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLnBvc2l0aW9uID0gJyc7CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLmxlZnQgPSAnJzsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUudG9wID0gJyc7CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gJyc7CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodCA9ICcnOwoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS56b29tID0gJyc7CgkJCX0KCQkJLy8gU2NhbGUKCQkJZWxzZSB7CgkJCQlkb2N1bWVudC5ib2R5LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUubGVmdCA9ICggLSAoIHNjcm9sbE9mZnNldC54ICsgcmVjdC54ICkgLyBzY2FsZSApICsgJ3B4JzsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUudG9wID0gKCAtICggc2Nyb2xsT2Zmc2V0LnkgKyByZWN0LnkgKSAvIHNjYWxlICkgKyAncHgnOwoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICggc2NhbGUgKiAxMDAgKSArICclJzsKCQkJCWRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gKCBzY2FsZSAqIDEwMCApICsgJyUnOwoJCQkJZG9jdW1lbnQuYm9keS5zdHlsZS56b29tID0gc2NhbGU7CgkJCX0KCQl9CgoJCWxldmVsID0gc2NhbGU7CgoJCWlmKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0ICkgewoJCQlpZiggbGV2ZWwgIT09IDEgKSB7CgkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ3pvb21lZCcgKTsKCQkJfQoJCQllbHNlIHsKCQkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAnem9vbWVkJyApOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogUGFuIHRoZSBkb2N1bWVudCB3aGVuIHRoZSBtb3N1ZSBjdXJzb3IgYXBwcm9hY2hlcyB0aGUgZWRnZXMKCSAqIG9mIHRoZSB3aW5kb3cuCgkgKi8KCWZ1bmN0aW9uIHBhbigpIHsKCQl2YXIgcmFuZ2UgPSAwLjEyLAoJCQlyYW5nZVggPSB3aW5kb3cuaW5uZXJXaWR0aCAqIHJhbmdlLAoJCQlyYW5nZVkgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiByYW5nZSwKCQkJc2Nyb2xsT2Zmc2V0ID0gZ2V0U2Nyb2xsT2Zmc2V0KCk7CgoJCS8vIFVwCgkJaWYoIG1vdXNlWSA8IHJhbmdlWSApIHsKCQkJd2luZG93LnNjcm9sbCggc2Nyb2xsT2Zmc2V0LngsIHNjcm9sbE9mZnNldC55IC0gKCAxIC0gKCBtb3VzZVkgLyByYW5nZVkgKSApICogKCAxNCAvIGxldmVsICkgKTsKCQl9CgkJLy8gRG93bgoJCWVsc2UgaWYoIG1vdXNlWSA+IHdpbmRvdy5pbm5lckhlaWdodCAtIHJhbmdlWSApIHsKCQkJd2luZG93LnNjcm9sbCggc2Nyb2xsT2Zmc2V0LngsIHNjcm9sbE9mZnNldC55ICsgKCAxIC0gKCB3aW5kb3cuaW5uZXJIZWlnaHQgLSBtb3VzZVkgKSAvIHJhbmdlWSApICogKCAxNCAvIGxldmVsICkgKTsKCQl9CgoJCS8vIExlZnQKCQlpZiggbW91c2VYIDwgcmFuZ2VYICkgewoJCQl3aW5kb3cuc2Nyb2xsKCBzY3JvbGxPZmZzZXQueCAtICggMSAtICggbW91c2VYIC8gcmFuZ2VYICkgKSAqICggMTQgLyBsZXZlbCApLCBzY3JvbGxPZmZzZXQueSApOwoJCX0KCQkvLyBSaWdodAoJCWVsc2UgaWYoIG1vdXNlWCA+IHdpbmRvdy5pbm5lcldpZHRoIC0gcmFuZ2VYICkgewoJCQl3aW5kb3cuc2Nyb2xsKCBzY3JvbGxPZmZzZXQueCArICggMSAtICggd2luZG93LmlubmVyV2lkdGggLSBtb3VzZVggKSAvIHJhbmdlWCApICogKCAxNCAvIGxldmVsICksIHNjcm9sbE9mZnNldC55ICk7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldFNjcm9sbE9mZnNldCgpIHsKCQlyZXR1cm4gewoJCQl4OiB3aW5kb3cuc2Nyb2xsWCAhPT0gdW5kZWZpbmVkID8gd2luZG93LnNjcm9sbFggOiB3aW5kb3cucGFnZVhPZmZzZXQsCgkJCXk6IHdpbmRvdy5zY3JvbGxZICE9PSB1bmRlZmluZWQgPyB3aW5kb3cuc2Nyb2xsWSA6IHdpbmRvdy5wYWdlWU9mZnNldAoJCX0KCX0KCglyZXR1cm4gewoJCS8qKgoJCSAqIFpvb21zIGluIG9uIGVpdGhlciBhIHJlY3RhbmdsZSBvciBIVE1MIGVsZW1lbnQuCgkJICoKCQkgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwoJCSAqICAgLSBlbGVtZW50OiBIVE1MIGVsZW1lbnQgdG8gem9vbSBpbiBvbgoJCSAqICAgT1IKCQkgKiAgIC0geC95OiBjb29yZGluYXRlcyBpbiBub24tdHJhbnNmb3JtZWQgc3BhY2UgdG8gem9vbSBpbiBvbgoJCSAqICAgLSB3aWR0aC9oZWlnaHQ6IHRoZSBwb3J0aW9uIG9mIHRoZSBzY3JlZW4gdG8gem9vbSBpbiBvbgoJCSAqICAgLSBzY2FsZTogY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiB3aWR0aC9oZWlnaHQgdG8gZXhwbGljaXRseSBzZXQgc2NhbGUKCQkgKi8KCQl0bzogZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgoJCQkvLyBEdWUgdG8gYW4gaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbiB3ZSBjYW4ndCB6b29tIGluCgkJCS8vIHRvIGFub3RoZXIgZWxlbWVudCB3aXRob3V0IHpvb21pbmcgb3V0IGZpcnN0CgkJCWlmKCBsZXZlbCAhPT0gMSApIHsKCQkJCXpvb20ub3V0KCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlvcHRpb25zLnggPSBvcHRpb25zLnggfHwgMDsKCQkJCW9wdGlvbnMueSA9IG9wdGlvbnMueSB8fCAwOwoKCQkJCS8vIElmIGFuIGVsZW1lbnQgaXMgc2V0LCB0aGF0IHRha2VzIHByZWNlZGVuY2UKCQkJCWlmKCAhIW9wdGlvbnMuZWxlbWVudCApIHsKCQkJCQkvLyBTcGFjZSBhcm91bmQgdGhlIHpvb21lZCBpbiBlbGVtZW50IHRvIGxlYXZlIG9uIHNjcmVlbgoJCQkJCXZhciBwYWRkaW5nID0gMjA7CgkJCQkJdmFyIGJvdW5kcyA9IG9wdGlvbnMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJCQkJb3B0aW9ucy54ID0gYm91bmRzLmxlZnQgLSBwYWRkaW5nOwoJCQkJCW9wdGlvbnMueSA9IGJvdW5kcy50b3AgLSBwYWRkaW5nOwoJCQkJCW9wdGlvbnMud2lkdGggPSBib3VuZHMud2lkdGggKyAoIHBhZGRpbmcgKiAyICk7CgkJCQkJb3B0aW9ucy5oZWlnaHQgPSBib3VuZHMuaGVpZ2h0ICsgKCBwYWRkaW5nICogMiApOwoJCQkJfQoKCQkJCS8vIElmIHdpZHRoL2hlaWdodCB2YWx1ZXMgYXJlIHNldCwgY2FsY3VsYXRlIHNjYWxlIGZyb20gdGhvc2UgdmFsdWVzCgkJCQlpZiggb3B0aW9ucy53aWR0aCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJb3B0aW9ucy5zY2FsZSA9IE1hdGgubWF4KCBNYXRoLm1pbiggd2luZG93LmlubmVyV2lkdGggLyBvcHRpb25zLndpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQgLyBvcHRpb25zLmhlaWdodCApLCAxICk7CgkJCQl9CgoJCQkJaWYoIG9wdGlvbnMuc2NhbGUgPiAxICkgewoJCQkJCW9wdGlvbnMueCAqPSBvcHRpb25zLnNjYWxlOwoJCQkJCW9wdGlvbnMueSAqPSBvcHRpb25zLnNjYWxlOwoKCQkJCQltYWduaWZ5KCBvcHRpb25zLCBvcHRpb25zLnNjYWxlICk7CgoJCQkJCWlmKCBvcHRpb25zLnBhbiAhPT0gZmFsc2UgKSB7CgoJCQkJCQkvLyBXYWl0IHdpdGggZW5nYWdpbmcgcGFubmluZyBhcyBpdCBtYXkgY29uZmxpY3Qgd2l0aCB0aGUKCQkJCQkJLy8gem9vbSB0cmFuc2l0aW9uCgkJCQkJCXBhbkVuZ2FnZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQkJCQkJCXBhblVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoIHBhbiwgMTAwMCAvIDYwICk7CgkJCQkJCX0sIDgwMCApOwoKCQkJCQl9CgkJCQl9CgkJCX0KCQl9LAoKCQkvKioKCQkgKiBSZXNldHMgdGhlIGRvY3VtZW50IHpvb20gc3RhdGUgdG8gaXRzIGRlZmF1bHQuCgkJICovCgkJb3V0OiBmdW5jdGlvbigpIHsKCQkJY2xlYXJUaW1lb3V0KCBwYW5FbmdhZ2VUaW1lb3V0ICk7CgkJCWNsZWFySW50ZXJ2YWwoIHBhblVwZGF0ZUludGVydmFsICk7CgoJCQltYWduaWZ5KCB7IHg6IDAsIHk6IDAgfSwgMSApOwoKCQkJbGV2ZWwgPSAxOwoJCX0sCgoJCS8vIEFsaWFzCgkJbWFnbmlmeTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7IHRoaXMudG8oIG9wdGlvbnMgKSB9LAoJCXJlc2V0OiBmdW5jdGlvbigpIHsgdGhpcy5vdXQoKSB9LAoKCQl6b29tTGV2ZWw6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gbGV2ZWw7CgkJfQoJfQoKfSkoKTsK></script><script src="data:text/javascript;base64,LyoqCiAqIEhhbmRsZXMgb3BlbmluZyBvZiBhbmQgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIHJldmVhbC5qcwogKiBub3RlcyB3aW5kb3cuCiAqCiAqIEhhbmRzaGFrZSBwcm9jZXNzOgogKiAxLiBUaGlzIHdpbmRvdyBwb3N0cyAnY29ubmVjdCcgdG8gbm90ZXMgd2luZG93CiAqICAgIC0gSW5jbHVkZXMgVVJMIG9mIHByZXNlbnRhdGlvbiB0byBzaG93CiAqIDIuIE5vdGVzIHdpbmRvdyByZXNwb25kcyB3aXRoICdjb25uZWN0ZWQnIHdoZW4gaXQgaXMgYXZhaWxhYmxlCiAqIDMuIFRoaXMgd2luZG93IHByb2NlZWRzIHRvIHNlbmQgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIHN0YXRlCiAqICAgIHRvIHRoZSBub3RlcyB3aW5kb3cKICovCnZhciBSZXZlYWxOb3RlcyA9IChmdW5jdGlvbigpIHsKCiAgICB2YXIgbm90ZXNQb3B1cCA9IG51bGw7CgoJZnVuY3Rpb24gb3Blbk5vdGVzKCBub3Rlc0ZpbGVQYXRoICkgewoKICAgICAgICBpZiAobm90ZXNQb3B1cCAmJiAhbm90ZXNQb3B1cC5jbG9zZWQpIHsKICAgICAgICAgICAgbm90ZXNQb3B1cC5mb2N1cygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKCQlpZiggIW5vdGVzRmlsZVBhdGggKSB7CgkJCXZhciBqc0ZpbGVMb2NhdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMkPSJub3Rlcy5qcyJdJykuc3JjOyAgLy8gdGhpcyBqcyBmaWxlIHBhdGgKCQkJanNGaWxlTG9jYXRpb24gPSBqc0ZpbGVMb2NhdGlvbi5yZXBsYWNlKC9ub3Rlc1wuanMoXD8uKik/JC8sICcnKTsgICAvLyB0aGUganMgZm9sZGVyIHBhdGgKCQkJbm90ZXNGaWxlUGF0aCA9IGpzRmlsZUxvY2F0aW9uICsgJ25vdGVzLmh0bWwnOwoJCX0KCgkJbm90ZXNQb3B1cCA9IHdpbmRvdy5vcGVuKCBub3Rlc0ZpbGVQYXRoLCAncmV2ZWFsLmpzIC0gTm90ZXMnLCAnd2lkdGg9MTEwMCxoZWlnaHQ9NzAwJyApOwoKCQlpZiggIW5vdGVzUG9wdXAgKSB7CgkJCWFsZXJ0KCAnU3BlYWtlciB2aWV3IHBvcHVwIGZhaWxlZCB0byBvcGVuLiBQbGVhc2UgbWFrZSBzdXJlIHBvcHVwcyBhcmUgYWxsb3dlZCBhbmQgcmVvcGVuIHRoZSBzcGVha2VyIHZpZXcuJyApOwoJCQlyZXR1cm47CgkJfQoKCQkvKioKCQkgKiBDb25uZWN0IHRvIHRoZSBub3RlcyB3aW5kb3cgdGhyb3VnaCBhIHBvc3RtZXNzYWdlIGhhbmRzaGFrZS4KCQkgKiBVc2luZyBwb3N0bWVzc2FnZSBlbmFibGVzIHVzIHRvIHdvcmsgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUKCQkgKiBvcmlnaW5zIGRpZmZlciwgc3VjaCBhcyBhIHByZXNlbnRhdGlvbiBiZWluZyBvcGVuZWQgZnJvbSB0aGUKCQkgKiBmaWxlIHN5c3RlbS4KCQkgKi8KCQlmdW5jdGlvbiBjb25uZWN0KCkgewoJCQkvLyBLZWVwIHRyeWluZyB0byBjb25uZWN0IHVudGlsIHdlIGdldCBhICdjb25uZWN0ZWQnIG1lc3NhZ2UgYmFjawoJCQl2YXIgY29ubmVjdEludGVydmFsID0gc2V0SW50ZXJ2YWwoIGZ1bmN0aW9uKCkgewoJCQkJbm90ZXNQb3B1cC5wb3N0TWVzc2FnZSggSlNPTi5zdHJpbmdpZnkoIHsKCQkJCQluYW1lc3BhY2U6ICdyZXZlYWwtbm90ZXMnLAoJCQkJCXR5cGU6ICdjb25uZWN0JywKCQkJCQl1cmw6IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyB3aW5kb3cubG9jYXRpb24uaG9zdCArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsCgkJCQkJc3RhdGU6IFJldmVhbC5nZXRTdGF0ZSgpCgkJCQl9ICksICcqJyApOwoJCQl9LCA1MDAgKTsKCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnbWVzc2FnZScsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCXZhciBkYXRhID0gSlNPTi5wYXJzZSggZXZlbnQuZGF0YSApOwoJCQkJaWYoIGRhdGEgJiYgZGF0YS5uYW1lc3BhY2UgPT09ICdyZXZlYWwtbm90ZXMnICYmIGRhdGEudHlwZSA9PT0gJ2Nvbm5lY3RlZCcgKSB7CgkJCQkJY2xlYXJJbnRlcnZhbCggY29ubmVjdEludGVydmFsICk7CgkJCQkJb25Db25uZWN0ZWQoKTsKCQkJCX0KCQkJCWlmKCBkYXRhICYmIGRhdGEubmFtZXNwYWNlID09PSAncmV2ZWFsLW5vdGVzJyAmJiBkYXRhLnR5cGUgPT09ICdjYWxsJyApIHsKCQkJCQljYWxsUmV2ZWFsQXBpKCBkYXRhLm1ldGhvZE5hbWUsIGRhdGEuYXJndW1lbnRzLCBkYXRhLmNhbGxJZCApOwoJCQkJfQoJCQl9ICk7CgkJfQoKCQkvKioKCQkgKiBDYWxscyB0aGUgc3BlY2lmaWVkIFJldmVhbC5qcyBtZXRob2Qgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnQKCQkgKiBhbmQgdGhlbiBwdXNoZXMgdGhlIHJlc3VsdCB0byB0aGUgbm90ZXMgZnJhbWUuCgkJICovCgkJZnVuY3Rpb24gY2FsbFJldmVhbEFwaSggbWV0aG9kTmFtZSwgbWV0aG9kQXJndW1lbnRzLCBjYWxsSWQgKSB7CgoJCQl2YXIgcmVzdWx0ID0gUmV2ZWFsW21ldGhvZE5hbWVdLmFwcGx5KCBSZXZlYWwsIG1ldGhvZEFyZ3VtZW50cyApOwoJCQlub3Rlc1BvcHVwLnBvc3RNZXNzYWdlKCBKU09OLnN0cmluZ2lmeSggewoJCQkJbmFtZXNwYWNlOiAncmV2ZWFsLW5vdGVzJywKCQkJCXR5cGU6ICdyZXR1cm4nLAoJCQkJcmVzdWx0OiByZXN1bHQsCgkJCQljYWxsSWQ6IGNhbGxJZAoJCQl9ICksICcqJyApOwoKCQl9CgoJCS8qKgoJCSAqIFBvc3RzIHRoZSBjdXJyZW50IHNsaWRlIGRhdGEgdG8gdGhlIG5vdGVzIHdpbmRvdwoJCSAqLwoJCWZ1bmN0aW9uIHBvc3QoIGV2ZW50ICkgewoKCQkJdmFyIHNsaWRlRWxlbWVudCA9IFJldmVhbC5nZXRDdXJyZW50U2xpZGUoKSwKCQkJCW5vdGVzRWxlbWVudCA9IHNsaWRlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCAnYXNpZGUubm90ZXMnICksCgkJCQlmcmFnbWVudEVsZW1lbnQgPSBzbGlkZUVsZW1lbnQucXVlcnlTZWxlY3RvciggJy5jdXJyZW50LWZyYWdtZW50JyApOwoKCQkJdmFyIG1lc3NhZ2VEYXRhID0gewoJCQkJbmFtZXNwYWNlOiAncmV2ZWFsLW5vdGVzJywKCQkJCXR5cGU6ICdzdGF0ZScsCgkJCQlub3RlczogJycsCgkJCQltYXJrZG93bjogZmFsc2UsCgkJCQl3aGl0ZXNwYWNlOiAnbm9ybWFsJywKCQkJCXN0YXRlOiBSZXZlYWwuZ2V0U3RhdGUoKQoJCQl9OwoKCQkJLy8gTG9vayBmb3Igbm90ZXMgZGVmaW5lZCBpbiBhIHNsaWRlIGF0dHJpYnV0ZQoJCQlpZiggc2xpZGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtbm90ZXMnICkgKSB7CgkJCQltZXNzYWdlRGF0YS5ub3RlcyA9IHNsaWRlRWxlbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLW5vdGVzJyApOwoJCQkJbWVzc2FnZURhdGEud2hpdGVzcGFjZSA9ICdwcmUtd3JhcCc7CgkJCX0KCgkJCS8vIExvb2sgZm9yIG5vdGVzIGRlZmluZWQgaW4gYSBmcmFnbWVudAoJCQlpZiggZnJhZ21lbnRFbGVtZW50ICkgewoJCQkJdmFyIGZyYWdtZW50Tm90ZXMgPSBmcmFnbWVudEVsZW1lbnQucXVlcnlTZWxlY3RvciggJ2FzaWRlLm5vdGVzJyApOwoJCQkJaWYoIGZyYWdtZW50Tm90ZXMgKSB7CgkJCQkJbm90ZXNFbGVtZW50ID0gZnJhZ21lbnROb3RlczsKCQkJCX0KCQkJCWVsc2UgaWYoIGZyYWdtZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoICdkYXRhLW5vdGVzJyApICkgewoJCQkJCW1lc3NhZ2VEYXRhLm5vdGVzID0gZnJhZ21lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSggJ2RhdGEtbm90ZXMnICk7CgkJCQkJbWVzc2FnZURhdGEud2hpdGVzcGFjZSA9ICdwcmUtd3JhcCc7CgoJCQkJCS8vIEluIGNhc2UgdGhlcmUgYXJlIHNsaWRlIG5vdGVzCgkJCQkJbm90ZXNFbGVtZW50ID0gbnVsbDsKCQkJCX0KCQkJfQoKCQkJLy8gTG9vayBmb3Igbm90ZXMgZGVmaW5lZCBpbiBhbiBhc2lkZSBlbGVtZW50CgkJCWlmKCBub3Rlc0VsZW1lbnQgKSB7CgkJCQltZXNzYWdlRGF0YS5ub3RlcyA9IG5vdGVzRWxlbWVudC5pbm5lckhUTUw7CgkJCQltZXNzYWdlRGF0YS5tYXJrZG93biA9IHR5cGVvZiBub3Rlc0VsZW1lbnQuZ2V0QXR0cmlidXRlKCAnZGF0YS1tYXJrZG93bicgKSA9PT0gJ3N0cmluZyc7CgkJCX0KCgkJCW5vdGVzUG9wdXAucG9zdE1lc3NhZ2UoIEpTT04uc3RyaW5naWZ5KCBtZXNzYWdlRGF0YSApLCAnKicgKTsKCgkJfQoKCQkvKioKCQkgKiBDYWxsZWQgb25jZSB3ZSBoYXZlIGVzdGFibGlzaGVkIGEgY29ubmVjdGlvbiB0byB0aGUgbm90ZXMKCQkgKiB3aW5kb3cuCgkJICovCgkJZnVuY3Rpb24gb25Db25uZWN0ZWQoKSB7CgoJCQkvLyBNb25pdG9yIGV2ZW50cyB0aGF0IHRyaWdnZXIgYSBjaGFuZ2UgaW4gc3RhdGUKCQkJUmV2ZWFsLmFkZEV2ZW50TGlzdGVuZXIoICdzbGlkZWNoYW5nZWQnLCBwb3N0ICk7CgkJCVJldmVhbC5hZGRFdmVudExpc3RlbmVyKCAnZnJhZ21lbnRzaG93bicsIHBvc3QgKTsKCQkJUmV2ZWFsLmFkZEV2ZW50TGlzdGVuZXIoICdmcmFnbWVudGhpZGRlbicsIHBvc3QgKTsKCQkJUmV2ZWFsLmFkZEV2ZW50TGlzdGVuZXIoICdvdmVydmlld2hpZGRlbicsIHBvc3QgKTsKCQkJUmV2ZWFsLmFkZEV2ZW50TGlzdGVuZXIoICdvdmVydmlld3Nob3duJywgcG9zdCApOwoJCQlSZXZlYWwuYWRkRXZlbnRMaXN0ZW5lciggJ3BhdXNlZCcsIHBvc3QgKTsKCQkJUmV2ZWFsLmFkZEV2ZW50TGlzdGVuZXIoICdyZXN1bWVkJywgcG9zdCApOwoKCQkJLy8gUG9zdCB0aGUgaW5pdGlhbCBzdGF0ZQoJCQlwb3N0KCk7CgoJCX0KCgkJY29ubmVjdCgpOwoKCX0KCglyZXR1cm4gewoJCWluaXQ6IGZ1bmN0aW9uKCkgewoKCQkJaWYoICEvcmVjZWl2ZXIvaS50ZXN0KCB3aW5kb3cubG9jYXRpb24uc2VhcmNoICkgKSB7CgoJCQkJLy8gSWYgdGhlIHRoZXJlJ3MgYSAnbm90ZXMnIHF1ZXJ5IHNldCwgb3BlbiBkaXJlY3RseQoJCQkJaWYoIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gubWF0Y2goIC8oXD98XCYpbm90ZXMvZ2kgKSAhPT0gbnVsbCApIHsKCQkJCQlvcGVuTm90ZXMoKTsKCQkJCX0KCgkJCQkvLyBPcGVuIHRoZSBub3RlcyB3aGVuIHRoZSAncycga2V5IGlzIGhpdAoJCQkJUmV2ZWFsLmFkZEtleUJpbmRpbmcoe2tleUNvZGU6IDgzLCBrZXk6ICdTJywgZGVzY3JpcHRpb246ICdTcGVha2VyIG5vdGVzIHZpZXcnfSwgZnVuY3Rpb24oKSB7CgkJCQkJb3Blbk5vdGVzKCk7CgkJCQl9ICk7CgoJCQl9CgoJCX0sCgoJCW9wZW46IG9wZW5Ob3RlcwoJfTsKCn0pKCk7CgpSZXZlYWwucmVnaXN0ZXJQbHVnaW4oICdub3RlcycsIFJldmVhbE5vdGVzICk7Cg=="></script><style>@media /slide/resources/my-css.css){}.reveal .slides{font-family:'BIZ UDPGothic';font-size:calc(28px + 0.25vw)}.reveal .slides h1,.reveal .slides h2{font-weight:90%}.line-through{text-decoration:line-through}</style><meta http-equiv=content-security-policy content="default-src 'none'; font-src 'self' data:; img-src 'self' data:; style-src 'unsafe-inline'; media-src 'self' data:; script-src 'unsafe-inline' data:;"><style>img[src="data:,"],source[src="data:,"]{display:none!important}</style><body style="transition:-webkit-transform 0.8s ease 0s"><div class="reveal false center has-vertical-slides has-horizontal-slides ready" role=application data-transition-speed=fast data-background-transition=fade><div class=slides style=width:960px;height:700px;zoom:1.00929><section class="title present" data-state=title data-transition=none style=top:217px;display:block><h1>OSCの動画を聞く</h1><p class=author><small>Kenichiro Matohara(matoken) &lt;maroken@kagolug.org&gt;</small></p></section><section id=_kenichiro_matoharamatoken_httpsmatoken_org data-background-image=data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wEEEAAUABQAFAAUABUAFAAXABkAGQAXAB8AIgAeACIAHwAuACsAJwAnACsALgBGADIANgAyADYAMgBGAGoAQgBOAEIAQgBOAEIAagBeAHIAXQBWAF0AcgBeAKkAhQB2AHYAhQCpAMMApACbAKQAwwDsANMA0wDsASoBGwEqAYUBhQILEQAUABQAFAAUABUAFAAXABkAGQAXAB8AIgAeACIAHwAuACsAJwAnACsALgBGADIANgAyADYAMgBGAGoAQgBOAEIAQgBOAEIAagBeAHIAXQBWAF0AcgBeAKkAhQB2AHYAhQCpAMMApACbAKQAwwDsANMA0wDsASoBGwEqAYUBhQIL/8IAEQgC5ASOAwEiAAIRAQMRAf/EABoAAQADAQEBAAAAAAAAAAAAAAABAgMEBQb/2gAIAQEAAAAA90ARTQKTYZXspGgAAAAAAAGWqb00RTOwSTwa2vrovRSLE1TNVa32tSqLRmy1ABnoAKRoZzcUXFLSAAAAAAADLVe0SUqRFgztadEWVRMFqxaFNGkUhExVnoADLUAIzL2DLUGegAAAAAAAUtLQtSgqsFefXpTWqNK1sWiSJnXPXCaCIitwAZagAAFJsKTYAAAAAAAMtV70TmKzFhOfN6dLc849Ge05XLGeVLtemKqJrnak2ABWLgAAGWkq01AAAAAAABnomms8uyIsrYm6d8oM4vVErIYomOneudaY3c/XjqABFbgAADMaAAAAAAAARTRa96ZxWxW0xrFb2pEwVqumIiyWHRGiKK3tiy1AAqsAAAAAAAAAAAAMtV85yjWLWRzc/pUy6LTCObOyenO81XTpFq8+l60vbTCjPQABnoAAAAAAAAAAAAM9EzSl0ui/NVM0vW+mVbXpW8IpoTF9mPBfsx4b2nezLUABlqAAAAAAAAAAAAMtUzM0JtEVXrWZvbNF8rzEznYlPTXHk1xr0RXHXXHYAAy1AAAAAAAAAAAAMtJa5aXed2RlshePK31x9KkZ2vW0WrXSGlqbVpxdMCjKnRIABnoAAAAAAAAAAAAoqTbplntGVW18XJfal6xclatF3L00z72Xn9jKzPTm6ZAAGWoAAAAAAAAAAAEZ64a5bzbRrXPNNenJelbZTeFojbCImWtL7Rlxdda1HN1AABlqAAAAAAzGgAAAAK01NResTmTlXdaq05XmM05bxLO9tqclra83UjOrKdQAAz0AAAAAAx1lGWsgAAAGbQ16OaKaq0Lct211K8VuzasQNorla0tOGdqN1Gbn6QAAimgAAAAAMtQZagAAARlosnWIpF4rdWC064yrpQi198raZ4TZpZ5s165i2dHN1AABneQAAAAAoumaqTYAAAM2iIkx6q52aSjCKRbupFrznM4ab0yvXflurvnydU0zRTpzc/SAAFI0AAAAAGV7F1DPQAAArS9i2vPrna1eatp6E4qWt24QtdnS7GHJ1TONtbZ9c1iL1nCM2oAAK10AAAAAUmwm+alpAAAZtBVZnuRTNra9SE9OecqyyvalMujWc86RbqpLOnVVyWx2uAABlqAAAAAy1TasDLUAACtL2DLDbfDogm1VompMbefpbLptEJjnjqlcjO5SmlrV4rX5uwAADPQAAAABlqlAouAADK162C+mUxaKRdHLTp5PTpS60LTWJpGMdFoTG0Z2TWlibRiybAAAz0AAAAAZ3kK0tcAAM40krYvOucTM5VuWhERaJgb8ufZng1m1ENZresxpnKObKba83UAADLUAAAAAx2DLUAERMKxpIQlNsJvXVNa3JrETZMTDm4urm6bX2iFrwvnF4prWF6RFWLcAAM9AAAAACM72rTUAKVmUxNgFbF62vVVETaKaZ3LVlbLn6ikaUWz0hqxml5YXvrM1pRz72AAKWkAAAAAUptGYtaVawtcIrFroISxvcJiZzvFd84snHl2r0c/YiLIRQnail29UZ7LVyzOfpAAMtQAAAAEZr2BVUm5CQyrF9RWyeHa8aXsqmJi0TWLKzWcraWpN4pNU3sV5rWva1dBy3is8/SAArTUAAAAEZzoKc2XVqsALxMomYiiFqxqzvXRExNLJiWd4XrOeHRZERKeNs2tlhqumnPvXXC96K7AAGWoAAAARnqE3rnat5qSmYXVm2axSa1nK+1F6xdNmRF16FdKuHrmUY2vMrJp4vD7V8u69ox2xkUw6wABlqAAAAGehXSUommsJoXphjS3emEQmFqTphtCidrKcqLbxNKQutw9crFZiM4s+exy9X2l2ldMc3OW3AAFJsAAAAGOy2Ok06K3w2vkxTTpmaV0itqRamG16as2rlite6+uOeWfVaJnOPM7WtuPqlFomqZ5vE48+jL3+/RajXCMbagAAZagAAACMthvRalvO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 data-background-size=cover hidden aria-hidden=true class=future style=top:89px;display:block><h2><a href=https://matoken.org/>Kenichiro Matohara(matoken) https://matoken.org</a></h2><div class=slide-content>
<div class=ulist><ul><li><p>南隅から参加(鹿児島の右下)</p><li><p>好きなLinuxディストリビューションはDebian</p><li><p>お仕事募集 mailto:work@matohara.org</p></ul></div>
<div class=paragraph><p><a href=https://overpass-turbo.eu/s/1hHV>©OpenStreetMap協力者 + overpass turbo</a></p></div></div></section>
<section id=_oscを聞く hidden aria-hidden=true class=future style=top:279.5px;display:block><h2>OSCを聞く🦻</h2></section>
<section id=_podcastをよく聞いています hidden aria-hidden=true class=future style=top:187px;display:none><h2>Podcastをよく聞いています</h2><div class=slide-content><div class=ulist><ul><li><p>基本的にラジオのような音声メディア<div class=ulist><ul><li><p>基本的に音声ファイルをダウンロードして聞くので時間や場所を選ばず聞ける</p></ul></div></ul></div></div></section>
<section class="stack future" style=top:0px;display:none data-previous-indexv=0 hidden aria-hidden=true><section id=_youtubeのコンテンツを聞く hidden aria-hidden=true class=past style=top:350px;display:none><h2>YouTubeのコンテンツを聞く</h2><div class=slide-content><div class=ulist><ul><li><p>YouTube映像を見る暇がない</p><li><p>オープンソースカンファレンス動画も<div class=ulist><ul><li><p>見きれないのでとりあえず聞いて興味を持ったものを視聴し直す</p></ul></div></ul></div></div></section><section id=_yt_dlp class=past aria-hidden=true hidden style=top:350px;display:none><h2>yt-dlp</h2><div class=slide-content><div class=paragraph><p><a href=https://github.com/yt-dlp/yt-dlp class=bare>https://github.com/yt-dlp/yt-dlp</a></p></div>
<div class=ulist><ul><li><p>YouTubeの動画などをダウンロードできる</p><li><p>YouTube以外にもいろいろなサービスに対応</p></ul></div></div></section><section id=_導入例 class=past aria-hidden=true hidden style=top:350px;display:none><h2>導入例</h2><div class=slide-content><div class=listingblock><div class=content><pre>$ wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp
https://github.com/yt-dlp/yt-dlp/releases/latest/download/SHA2-512SUMS
$ sha512sum -c ./SHA2-512SUMS 2&gt;&amp;1 | grep OK
yt-dlp: OK
$ install -m700 ./yt-dlp ~/bin/
$ rm ./yt-dlp ./SHA2-512SUMS</pre></div></div></div></section><section id=_youtubeにはいくつかのメディアがある class=past aria-hidden=true hidden style=top:350px;display:none><h2>YouTubeにはいくつかのメディアがある</h2><div class=slide-content><div class=ulist><ul><li><p><strong>音声のみ</strong> ← これが欲しい</p><li><p>ビデオのみ</p><li><p>ビデオ+動画</p><li><p>いろいろなメタデータ</p></ul></div></div></section><section id=_ダウンロード可能なフォーマットを確認idをメモ class=past aria-hidden=true hidden style=top:350px;display:none><h2>ダウンロード可能なフォーマットを確認&amp;IDをメモ</h2><div class=slide-content><div class=listingblock><div class=content><pre>$ yt-dlp -F https://www.youtube.com/watch?v=BoFSOt0mtvg
[youtube] BoFSOt0mtvg: Downloading webpage
[youtube] BoFSOt0mtvg: Downloading android player API JSON
[info] Available formats for BoFSOt0mtvg:
ID EXT RESOLUTION FPS │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ASR MORE INFO
─────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb2 mhtml 48x27 │ mhtml │ images storyboard
sb1 mhtml 80x45 │ mhtml │ images storyboard
sb0 mhtml 160x90 │ mhtml │ images storyboard
139 m4a audio only │ 20.17MiB 48k https │ audio only mp4a.40.5 48k 22050Hz low, m4a_dash
249 webm audio only │ 20.80MiB 50k https │ audio only opus 50k 48000Hz low, webm_dash
250 webm audio only │ 25.84MiB 62k https │ audio only opus 62k 48000Hz low, webm_dash
140 m4a audio only │ 53.53MiB 129k https │ audio only mp4a.40.2 129k 44100Hz medium, m4a_dash
251 webm audio only │ 48.99MiB 118k https │ audio only opus 118k 48000Hz medium, webm_dash
17 3gp 176x144 12 │ 18.87MiB 45k https │ mp4v.20.3 45k mp4a.40.2 0k 22050Hz 144p
160 mp4 256x144 24 │ 13.37MiB 32k https │ avc1.4d400c 32k video only 144p, mp4_dash
278 webm 256x144 24 │ 17.94MiB 43k https │ vp9 43k video only 144p, webm_dash
133 mp4 426x240 24 │ 27.53MiB 66k https │ avc1.4d4015 66k video only 240p, mp4_dash
242 webm 426x240 24 │ 29.36MiB 71k https │ vp9 71k video only 240p, webm_dash
134 mp4 640x360 24 │ 48.95MiB 118k https │ avc1.4d401e 118k video only 360p, mp4_dash
18 mp4 640x360 24 │ 88.97MiB 215k https │ avc1.42001E 215k mp4a.40.2 0k 44100Hz 360p
243 webm 640x360 24 │ 56.62MiB 136k https │ vp9 136k video only 360p, webm_dash
135 mp4 854x480 24 │ 82.40MiB 199k https │ avc1.4d401e 199k video only 480p, mp4_dash
244 webm 854x480 24 │ 76.90MiB 185k https │ vp9 185k video only 480p, webm_dash
136 mp4 1280x720 24 │ 134.08MiB 324k https │ avc1.64001f 324k video only 720p, mp4_dash
22 mp4 1280x720 24 │ ~191.73MiB 452k https │ avc1.64001F 452k mp4a.40.2 0k 44100Hz 720p
247 webm 1280x720 24 │ 143.82MiB 347k https │ vp9 347k video only 720p, webm_dash
137 mp4 1920x1080 24 │ 201.57MiB 487k https │ avc1.640028 487k video only 1080p, mp4_dash
248 webm 1920x1080 24 │ 168.30MiB 407k https │ vp9 407k video only 1080p, webm_dash</pre></div></div></div></section><section id=_音声サムネイルダウンロード class=past aria-hidden=true hidden style=top:350px;display:none><h2>音声+サムネイルダウンロード</h2><div class=slide-content><div class=listingblock><div class=content><pre>$ yt-dlp -f 140 \ <i class=conum data-value=1></i><b>(1)</b>
--embed-thumbnail \ <i class=conum data-value=2></i><b>(2)</b>
https://www.youtube.com/watch?v=BoFSOt0mtvg <i class=conum data-value=3></i><b>(3)</b></pre></div></div>
<div class="colist arabic"><table><tbody><tr><td><i class=conum data-value=1></i><b>1</b><td><code>.m4a</code> ダウンロード<tr><td><i class=conum data-value=2></i><b>2</b><td>サムネイル埋め込み<tr><td><i class=conum data-value=3></i><b>3</b><td>対象動画URL</table></div></div></section><section id=_youtubeチャンネルやプレイリストからタイトルで絞り込んでダウンロード class=past aria-hidden=true hidden style=top:46.5px;display:none><h2>YouTubeチャンネルやプレイリストからタイトルで絞り込んでダウンロード</h2><div class=slide-content><div class=listingblock><div class=title>ファイラーでサムネイルもOK</div><div class=content><pre>$ yt-dlp -f 140 \
--embed-thumbnail \
--match-filter "title~=ラジオ" \ <i class=conum data-value=1></i><b>(1)</b>
https://www.youtube.com/watch?list=PLUH30mfo5wJwdafMdAJFcrcryUbYiixl4 <i class=conum data-value=2></i><b>(2)</b></pre></div></div>
<div class="colist arabic"><table><tbody><tr><td><i class=conum data-value=1></i><b>1</b><td>タイトルに「ラジオ」の含まれている動画のみダウンロード<tr><td><i class=conum data-value=2></i><b>2</b><td>対象プレイリストURL</table></div></div></section><section id=_指定期間でダウンロード class=past aria-hidden=true hidden style=top:165px;display:none><h2>指定期間でダウンロード</h2><div class=slide-content><div class=paragraph><p>最新n件,いつからいつまでの間……</p></div>
<div class=listingblock><div class=content><pre>--playlist-start NUMBER
--playlist-end NUMBER
--playlist-items ITEM_SPEC
--date DATE
--datebefore DATE
--dateafter DATE
--match-filter FILTER</pre></div></div></div></section><section id=_視聴履歴に残す class=past style=top:12px;display:none hidden aria-hidden=true><h2>視聴履歴に残す</h2><div class=slide-content><div class=dlist><dl><dt class=hdlist1><code>--cookies-from-browser BROWSER[+KEYRING][:PROFILE]</code><dd><p>YouTubeログイン済のブラウザ( brave, chrome, chromium, edge, firefox, opera, safari, vivaldi)からcookieを取得</p><dt class=hdlist1><code>--cookies FILE</code><dd><p>ブラウザからYouTubeのcookieを書き出したファイル指定,cookie書き出しには拡張機能の<strong>cookies.txt</strong>利用 <br>
リモートで利用時に便利<div class=ulist><ul><li><p><a href=https://addons.mozilla.org/en-US/firefox/addon/cookies-txt/>cookies.txt – Get this Extension for &lt;F0&gt;&lt;9F&gt;&lt;A6&gt;&lt;8A&gt; Firefox (en-US)</a></p></ul></div></dl></div></div></section><section id=_その他よく使うオプション style=top:0px;display:none aria-hidden=true><h2>その他よく使うオプション</h2><div class=slide-content><div class=dlist><dl><dt class=hdlist1><code>-i</code><dd><p>ダウンロード失敗しても次の動画を処理する</p><dt class=hdlist1><code>-f</code><dd><p>保存ファイル名指定</p><dt class=hdlist1><code>-P</code><dd><p>ダウンロードテンポラリパス(exFATおすすめ)</p><dt class=hdlist1><code>-s, --simulate</code><dd><p>ダウンロードをしない,ドライラン</p></dl></div>
<div class=paragraph><p>他にも大量にオプションがあるので <code>yt-dlp -h</code> をチェック</p></div></div></section></section>
<section id=_まとめ class=future style=top:135.5px;display:none hidden aria-hidden=true><h2>まとめ</h2><div class=slide-content><div class=ulist><ul><li><p>音声コンテンツはながら聴きができるので便利<div class=ulist><ul><li><p>気になったら戻って聞き返したり何度も聞いたり</p><li><p>オープンソースカンファレンス動画がいっぱい公開,後で見よう……もう次のOSC!というのを繰り返してしまう.とりあえず音声だけ聞いて気になったものを動画で見る</p></ul></div></ul></div></div></section>
<section id=_鹿児島らぐ鹿児島linux_user_group class=future style=top:106px;display:none hidden aria-hidden=true><h2>鹿児島らぐ(鹿児島Linux User Group)</h2><div class=slide-content><div class=ulist><ul><li><p>毎月オンラインで開催中<div class=ulist><ul><li><p>オンラインなのでどこからでも参加OK</p></ul></div><li><p>次回は 06/19(sun)</p><li><p><a href=https://kagolug.org/ class=bare>https://kagolug.org/</a></p></ul></div></div></section></div><div class=backgrounds><div class="slide-background title present" style=display:block data-loaded=true><div class=slide-background-content></div></div><div class="slide-background future" data-background-hash=nullcoverdata:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wEEEAAUABQAFAAUABUAFAAXABkAGQAXAB8AIgAeACIAHwAuACsAJwAnACsALgBGADIANgAyADYAMgBGAGoAQgBOAEIAQgBOAEIAagBeAHIAXQBWAF0AcgBeAKkAhQB2AHYAhQCpAMMApACbAKQAwwDsANMA0wDsASoBGwEqAYUBhQILEQAUABQAFAAUABUAFAAXABkAGQAXAB8AIgAeACIAHwAuACsAJwAnACsALgBGADIANgAyADYAMgBGAGoAQgBOAEIAQgBOAEIAagBeAHIAXQBWAF0AcgBeAKkAhQB2AHYAhQCpAMMApACbAKQAwwDsANMA0wDsASoBGwEqAYUBhQIL/8IAEQgC5ASOAwEiAAIRAQMRAf/EABoAAQADAQEBAAAAAAAAAAAAAAABAgMEBQb/2gAIAQEAAAAA90ARTQKTYZXspGgAAAAAAAGWqb00RTOwSTwa2vrovRSLE1TNVa32tSqLRmy1ABnoAKRoZzcUXFLSAAAAAAADLVe0SUqRFgztadEWVRMFqxaFNGkUhExVnoADLUAIzL2DLUGegAAAAAAAUtLQtSgqsFefXpTWqNK1sWiSJnXPXCaCIitwAZagAAFJsKTYAAAAAAAMtV70TmKzFhOfN6dLc849Ge05XLGeVLtemKqJrnak2ABWLgAAGWkq01AAAAAAABnomms8uyIsrYm6d8oM4vVErIYomOneudaY3c/XjqABFbgAADMaAAAAAAAARTRa96ZxWxW0xrFb2pEwVqumIiyWHRGiKK3tiy1AAqsAAAAAAAAAAAAMtV85yjWLWRzc/pUy6LTCObOyenO81XTpFq8+l60vbTCjPQABnoAAAAAAAAAAAAM9EzSl0ui/NVM0vW+mVbXpW8IpoTF9mPBfsx4b2nezLUABlqAAAAAAAAAAAAMtUzM0JtEVXrWZvbNF8rzEznYlPTXHk1xr0RXHXXHYAAy1AAAAAAAAAAAAMtJa5aXed2RlshePK31x9KkZ2vW0WrXSGlqbVpxdMCjKnRIABnoAAAAAAAAAAAAoqTbplntGVW18XJfal6xclatF3L00z72Xn9jKzPTm6ZAAGWoAAAAAAAAAAAEZ64a5bzbRrXPNNenJelbZTeFojbCImWtL7Rlxdda1HN1AABlqAAAAAAzGgAAAAK01NResTmTlXdaq05XmM05bxLO9tqclra83UjOrKdQAAz0AAAAAAx1lGWsgAAAGbQ16OaKaq0Lct211K8VuzasQNorla0tOGdqN1Gbn6QAAimgAAAAAMtQZagAAARlosnWIpF4rdWC064yrpQi198raZ4TZpZ5s165i2dHN1AABneQAAAAAoumaqTYAAAM2iIkx6q52aSjCKRbupFrznM4ab0yvXflurvnydU0zRTpzc/SAAFI0AAAAAGV7F1DPQAAArS9i2vPrna1eatp6E4qWt24QtdnS7GHJ1TONtbZ9c1iL1nCM2oAAK10AAAAAUmwm+alpAAAZtBVZnuRTNra9SE9OecqyyvalMujWc86RbqpLOnVVyWx2uAABlqAAAAAy1TasDLUAACtL2DLDbfDogm1VompMbefpbLptEJjnjqlcjO5SmlrV4rX5uwAADPQAAAABlqlAouAADK162C+mUxaKRdHLTp5PTpS60LTWJpGMdFoTG0Z2TWlibRiybAAAz0AAAAAZ3kK0tcAAM40krYvOucTM5VuWhERaJgb8ufZng1m1ENZresxpnKObKba83UAADLUAAAAAx2DLUAERMKxpIQlNsJvXVNa3JrETZMTDm4urm6bX2iFrwvnF4prWF6RFWLcAAM9AAAAACM72rTUAKVmUxNgFbF62vVVETaKaZ3LVlbLn6ikaUWz0hqxml5YXvrM1pRz72AAKWkAAAAAUptGYtaVawtcIrFroISxvcJiZzvFd84snHl2r0c/YiLIRQnail29UZ7LVyzOfpAAMtQAAAAEZr2BVUm5CQyrF9RWyeHa8aXsqmJi0TWLKzWcraWpN4pNU3sV5rWva1dBy3is8/SAArTUAAAAEZzoKc2XVqsALxMomYiiFqxqzvXRExNLJiWd4XrOeHRZERKeNs2tlhqumnPvXXC96K7AAGWoAAAARnqE3rnat5qSmYXVm2axSa1nK+1F6xdNmRF16FdKuHrmUY2vMrJp4vD7V8u69ox2xkUw6wABlqAAAAGehXSUommsJoXphjS3emEQmFqTphtCidrKcqLbxNKQutw9crFZiM4s+exy9X2l2ldMc3OW3AAFJsAAAAGOy2Ok06K3w2vkxTTpmaV0itqRamG16as2rlite6+uOeWfVaJnOPM7WtuPqlFomqZ5vE48+jL3+/RajXCMbagAAZagAAACMthvRalvO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 data-background-size=cover style=display:block data-loaded=true><div class=slide-background-content style='background-size:cover;background-image:url("data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wEEEAAUABQAFAAUABUAFAAXABkAGQAXAB8AIgAeACIAHwAuACsAJwAnACsALgBGADIANgAyADYAMgBGAGoAQgBOAEIAQgBOAEIAagBeAHIAXQBWAF0AcgBeAKkAhQB2AHYAhQCpAMMApACbAKQAwwDsANMA0wDsASoBGwEqAYUBhQILEQAUABQAFAAUABUAFAAXABkAGQAXAB8AIgAeACIAHwAuACsAJwAnACsALgBGADIANgAyADYAMgBGAGoAQgBOAEIAQgBOAEIAagBeAHIAXQBWAF0AcgBeAKkAhQB2AHYAhQCpAMMApACbAKQAwwDsANMA0wDsASoBGwEqAYUBhQIL/8IAEQgC5ASOAwEiAAIRAQMRAf/EABoAAQADAQEBAAAAAAAAAAAAAAABAgMEBQb/2gAIAQEAAAAA90ARTQKTYZXspGgAAAAAAAGWqb00RTOwSTwa2vrovRSLE1TNVa32tSqLRmy1ABnoAKRoZzcUXFLSAAAAAAADLVe0SUqRFgztadEWVRMFqxaFNGkUhExVnoADLUAIzL2DLUGegAAAAAAAUtLQtSgqsFefXpTWqNK1sWiSJnXPXCaCIitwAZagAAFJsKTYAAAAAAAMtV70TmKzFhOfN6dLc849Ge05XLGeVLtemKqJrnak2ABWLgAAGWkq01AAAAAAABnomms8uyIsrYm6d8oM4vVErIYomOneudaY3c/XjqABFbgAADMaAAAAAAAARTRa96ZxWxW0xrFb2pEwVqumIiyWHRGiKK3tiy1AAqsAAAAAAAAAAAAMtV85yjWLWRzc/pUy6LTCObOyenO81XTpFq8+l60vbTCjPQABnoAAAAAAAAAAAAM9EzSl0ui/NVM0vW+mVbXpW8IpoTF9mPBfsx4b2nezLUABlqAAAAAAAAAAAAMtUzM0JtEVXrWZvbNF8rzEznYlPTXHk1xr0RXHXXHYAAy1AAAAAAAAAAAAMtJa5aXed2RlshePK31x9KkZ2vW0WrXSGlqbVpxdMCjKnRIABnoAAAAAAAAAAAAoqTbplntGVW18XJfal6xclatF3L00z72Xn9jKzPTm6ZAAGWoAAAAAAAAAAAEZ64a5bzbRrXPNNenJelbZTeFojbCImWtL7Rlxdda1HN1AABlqAAAAAAzGgAAAAK01NResTmTlXdaq05XmM05bxLO9tqclra83UjOrKdQAAz0AAAAAAx1lGWsgAAAGbQ16OaKaq0Lct211K8VuzasQNorla0tOGdqN1Gbn6QAAimgAAAAAMtQZagAAARlosnWIpF4rdWC064yrpQi198raZ4TZpZ5s165i2dHN1AABneQAAAAAoumaqTYAAAM2iIkx6q52aSjCKRbupFrznM4ab0yvXflurvnydU0zRTpzc/SAAFI0AAAAAGV7F1DPQAAArS9i2vPrna1eatp6E4qWt24QtdnS7GHJ1TONtbZ9c1iL1nCM2oAAK10AAAAAUmwm+alpAAAZtBVZnuRTNra9SE9OecqyyvalMujWc86RbqpLOnVVyWx2uAABlqAAAAAy1TasDLUAACtL2DLDbfDogm1VompMbefpbLptEJjnjqlcjO5SmlrV4rX5uwAADPQAAAABlqlAouAADK162C+mUxaKRdHLTp5PTpS60LTWJpGMdFoTG0Z2TWlibRiybAAAz0AAAAAZ3kK0tcAAM40krYvOucTM5VuWhERaJgb8ufZng1m1ENZresxpnKObKba83UAADLUAAAAAx2DLUAERMKxpIQlNsJvXVNa3JrETZMTDm4urm6bX2iFrwvnF4prWF6RFWLcAAM9AAAAACM72rTUAKVmUxNgFbF62vVVETaKaZ3LVlbLn6ikaUWz0hqxml5YXvrM1pRz72AAKWkAAAAAUptGYtaVawtcIrFroISxvcJiZzvFd84snHl2r0c/YiLIRQnail29UZ7LVyzOfpAAMtQAAAAEZr2BVUm5CQyrF9RWyeHa8aXsqmJi0TWLKzWcraWpN4pNU3sV5rWva1dBy3is8/SAArTUAAAAEZzoKc2XVqsALxMomYiiFqxqzvXRExNLJiWd4XrOeHRZERKeNs2tlhqumnPvXXC96K7AAGWoAAAARnqE3rnat5qSmYXVm2axSa1nK+1F6xdNmRF16FdKuHrmUY2vMrJp4vD7V8u69ox2xkUw6wABlqAAAAGehXSUommsJoXphjS3emEQmFqTphtCidrKcqLbxNKQutw9crFZiM4s+exy9X2l2ldMc3OW3AAFJsAAAAGOy2Ok06K3w2vkxTTpmaV0itqRamG16as2rlite6+uOeWfVaJnOPM7WtuPqlFomqZ5vE48+jL3+/RajXCMbagAAZagAAACMthvRalvO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")'></div></div><div class="slide-background future" data-loaded=true style=display:block><div class=slide-background-content></div></div><div class="slide-background future" data-loaded=true style=display:none><div class=slide-background-content></div></div><div class="slide-background stack future" data-loaded=true style=display:none><div class=slide-background-content></div><div class="slide-background past" style=display:none><div class=slide-background-content></div></div><div class="slide-background past" style=display:none><div class=slide-background-content></div></div><div class="slide-background past" style=display:none><div class=slide-background-content></div></div><div class="slide-background past" style=display:none><div class=slide-background-content></div></div><div class="slide-background past" style=display:none><div class=slide-background-content></div></div><div class="slide-background past" style=display:none><div class=slide-background-content></div></div><div class="slide-background past" data-loaded=true style=display:none><div class=slide-background-content></div></div><div class="slide-background past" data-loaded=true style=display:none><div class=slide-background-content></div></div><div class="slide-background past" data-loaded=true style=display:none><div class=slide-background-content></div></div><div class="slide-background present" data-loaded=true style=display:none><div class=slide-background-content></div></div></div><div class="slide-background future" data-loaded=true style=display:none><div class=slide-background-content></div></div><div class="slide-background future" data-loaded=true style=display:none><div class=slide-background-content></div></div></div><div class=progress style=display:block><span style=width:0px></span></div><aside class=controls data-controls-layout=bottom-right data-controls-back-arrows=faded style=display:block><button class=navigate-left aria-label="previous slide" disabled><div class=controls-arrow></div></button><button class="navigate-right enabled" aria-label="next slide"><div class=controls-arrow></div></button><button class=navigate-up aria-label="above slide" disabled><div class=controls-arrow></div></button><button class=navigate-down aria-label="below slide" disabled><div class=controls-arrow></div></button></aside><div class=slide-number style=display:block><a href=#/><span class=slide-number-a>1</span><span class=slide-number-delimiter>/</span><span class=slide-number-b>16</span></a></div><div class=speaker-notes data-prevent-swipe tabindex=0></div><div class=pause-overlay><button class=resume-button>Resume presentation</button></div><div id=aria-status-div aria-live=polite aria-atomic=true style=position:absolute;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)>OSCの動画を聞くKenichiro Matohara(matoken) &lt;maroken@kagolug.org&gt;</div></div><script src=data:text/javascript;base64,LyohCiAqIHJldmVhbC5qcwogKiBodHRwOi8vcmV2ZWFsanMuY29tCiAqIE1JVCBsaWNlbnNlZAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMjAgSGFraW0gRWwgSGF0dGFiLCBodHRwOi8vaGFraW0uc2UKICovCihmdW5jdGlvbiggcm9vdCwgZmFjdG9yeSApIHsKCWlmKCB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7CgkJLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLgoJCWRlZmluZSggZnVuY3Rpb24oKSB7CgkJCXJvb3QuUmV2ZWFsID0gZmFjdG9yeSgpOwoJCQlyZXR1cm4gcm9vdC5SZXZlYWw7CgkJfSApOwoJfSBlbHNlIGlmKCB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgKSB7CgkJLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUy4KCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCX0gZWxzZSB7CgkJLy8gQnJvd3NlciBnbG9iYWxzLgoJCXJvb3QuUmV2ZWFsID0gZmFjdG9yeSgpOwoJfQp9KCB0aGlzLCBmdW5jdGlvbigpIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIFJldmVhbDsKCgkvLyBUaGUgcmV2ZWFsLmpzIHZlcnNpb24KCXZhciBWRVJTSU9OID0gJzMuOS4yJzsKCgl2YXIgU0xJREVTX1NFTEVDVE9SID0gJy5zbGlkZXMgc2VjdGlvbicsCgkJSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgPSAnLnNsaWRlcz5zZWN0aW9uJywKCQlWRVJUSUNBTF9TTElERVNfU0VMRUNUT1IgPSAnLnNsaWRlcz5zZWN0aW9uLnByZXNlbnQ+c2VjdGlvbicsCgkJSE9NRV9TTElERV9TRUxFQ1RPUiA9ICcuc2xpZGVzPnNlY3Rpb246Zmlyc3Qtb2YtdHlwZScsCgoJCVVBID0gbmF2aWdhdG9yLnVzZXJBZ2VudCwKCgkJLy8gTWV0aG9kcyB0aGF0IG1heSBub3QgYmUgaW52b2tlZCB2aWEgdGhlIHBvc3RNZXNzYWdlIEFQSQoJCVBPU1RfTUVTU0FHRV9NRVRIT0RfQkxBQ0tMSVNUID0gL3JlZ2lzdGVyUGx1Z2lufHJlZ2lzdGVyS2V5Ym9hcmRTaG9ydGN1dHxhZGRLZXlCaW5kaW5nfGFkZEV2ZW50TGlzdGVuZXIvLAoKCQkvLyBDb25maWd1cmF0aW9uIGRlZmF1bHRzLCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBpbml0aWFsaXphdGlvbiB0aW1lCgkJY29uZmlnID0gewoKCQkJLy8gVGhlICJub3JtYWwiIHNpemUgb2YgdGhlIHByZXNlbnRhdGlvbiwgYXNwZWN0IHJhdGlvIHdpbGwgYmUgcHJlc2VydmVkCgkJCS8vIHdoZW4gdGhlIHByZXNlbnRhdGlvbiBpcyBzY2FsZWQgdG8gZml0IGRpZmZlcmVudCByZXNvbHV0aW9ucwoJCQl3aWR0aDogOTYwLAoJCQloZWlnaHQ6IDcwMCwKCgkJCS8vIEZhY3RvciBvZiB0aGUgZGlzcGxheSBzaXplIHRoYXQgc2hvdWxkIHJlbWFpbiBlbXB0eSBhcm91bmQgdGhlIGNvbnRlbnQKCQkJbWFyZ2luOiAwLjA0LAoKCQkJLy8gQm91bmRzIGZvciBzbWFsbGVzdC9sYXJnZXN0IHBvc3NpYmxlIHNjYWxlIHRvIGFwcGx5IHRvIGNvbnRlbnQKCQkJbWluU2NhbGU6IDAuMiwKCQkJbWF4U2NhbGU6IDIuMCwKCgkJCS8vIERpc3BsYXkgcHJlc2VudGF0aW9uIGNvbnRyb2wgYXJyb3dzCgkJCWNvbnRyb2xzOiB0cnVlLAoKCQkJLy8gSGVscCB0aGUgdXNlciBsZWFybiB0aGUgY29udHJvbHMgYnkgcHJvdmlkaW5nIGhpbnRzLCBmb3IgZXhhbXBsZSBieQoJCQkvLyBib3VuY2luZyB0aGUgZG93biBhcnJvdyB3aGVuIHRoZXkgZmlyc3QgZW5jb3VudGVyIGEgdmVydGljYWwgc2xpZGUKCQkJY29udHJvbHNUdXRvcmlhbDogdHJ1ZSwKCgkJCS8vIERldGVybWluZXMgd2hlcmUgY29udHJvbHMgYXBwZWFyLCAiZWRnZXMiIG9yICJib3R0b20tcmlnaHQiCgkJCWNvbnRyb2xzTGF5b3V0OiAnYm90dG9tLXJpZ2h0JywKCgkJCS8vIFZpc2liaWxpdHkgcnVsZSBmb3IgYmFja3dhcmRzIG5hdmlnYXRpb24gYXJyb3dzOyAiZmFkZWQiLCAiaGlkZGVuIgoJCQkvLyBvciAidmlzaWJsZSIKCQkJY29udHJvbHNCYWNrQXJyb3dzOiAnZmFkZWQnLAoKCQkJLy8gRGlzcGxheSBhIHByZXNlbnRhdGlvbiBwcm9ncmVzcyBiYXIKCQkJcHJvZ3Jlc3M6IHRydWUsCgoJCQkvLyBEaXNwbGF5IHRoZSBwYWdlIG51bWJlciBvZiB0aGUgY3VycmVudCBzbGlkZQoJCQkvLyAtIHRydWU6ICAgIFNob3cgc2xpZGUgbnVtYmVyCgkJCS8vIC0gZmFsc2U6ICAgSGlkZSBzbGlkZSBudW1iZXIKCQkJLy8KCQkJLy8gQ2FuIG9wdGlvbmFsbHkgYmUgc2V0IGFzIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgZm9ybWF0dGluZzoKCQkJLy8gLSAiaC52IjoJICBIb3Jpem9udGFsIC4gdmVydGljYWwgc2xpZGUgbnVtYmVyIChkZWZhdWx0KQoJCQkvLyAtICJoL3YiOgkgIEhvcml6b250YWwgLyB2ZXJ0aWNhbCBzbGlkZSBudW1iZXIKCQkJLy8gLSAiYyI6CSAgRmxhdHRlbmVkIHNsaWRlIG51bWJlcgoJCQkvLyAtICJjL3QiOgkgIEZsYXR0ZW5lZCBzbGlkZSBudW1iZXIgLyB0b3RhbCBzbGlkZXMKCQkJLy8KCQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwcm92aWRlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzbGlkZQoJCQkvLyBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHNsaWRlLiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgaW4gYSBzbGlkZQoJCQkvLyBvYmplY3QgYW5kIHJldHVybiBhbiBhcnJheSB3aXRoIG9uZSBzdHJpbmcgW3NsaWRlTnVtYmVyXSBvcgoJCQkvLyB0aHJlZSBzdHJpbmdzIFtuMSxkZWxpbWl0ZXIsbjJdLiBTZWUgI2Zvcm1hdFNsaWRlTnVtYmVyKCkuCgkJCXNsaWRlTnVtYmVyOiBmYWxzZSwKCgkJCS8vIENhbiBiZSB1c2VkIHRvIGxpbWl0IHRoZSBjb250ZXh0cyBpbiB3aGljaCB0aGUgc2xpZGUgbnVtYmVyIGFwcGVhcnMKCQkJLy8gLSAiYWxsIjogICAgICBBbHdheXMgc2hvdyB0aGUgc2xpZGUgbnVtYmVyCgkJCS8vIC0gInByaW50IjogICAgT25seSB3aGVuIHByaW50aW5nIHRvIFBERgoJCQkvLyAtICJzcGVha2VyIjogIE9ubHkgaW4gdGhlIHNwZWFrZXIgdmlldwoJCQlzaG93U2xpZGVOdW1iZXI6ICdhbGwnLAoKCQkJLy8gVXNlIDEgYmFzZWQgaW5kZXhpbmcgZm9yICMgbGlua3MgdG8gbWF0Y2ggc2xpZGUgbnVtYmVyIChkZWZhdWx0IGlzIHplcm8KCQkJLy8gYmFzZWQpCgkJCWhhc2hPbmVCYXNlZEluZGV4OiBmYWxzZSwKCgkJCS8vIEFkZCB0aGUgY3VycmVudCBzbGlkZSBudW1iZXIgdG8gdGhlIFVSTCBoYXNoIHNvIHRoYXQgcmVsb2FkaW5nIHRoZQoJCQkvLyBwYWdlL2NvcHlpbmcgdGhlIFVSTCB3aWxsIHJldHVybiB5b3UgdG8gdGhlIHNhbWUgc2xpZGUKCQkJaGFzaDogZmFsc2UsCgoJCQkvLyBQdXNoIGVhY2ggc2xpZGUgY2hhbmdlIHRvIHRoZSBicm93c2VyIGhpc3RvcnkuICBJbXBsaWVzIGBoYXNoOiB0cnVlYAoJCQloaXN0b3J5OiBmYWxzZSwKCgkJCS8vIEVuYWJsZSBrZXlib2FyZCBzaG9ydGN1dHMgZm9yIG5hdmlnYXRpb24KCQkJa2V5Ym9hcmQ6IHRydWUsCgoJCQkvLyBPcHRpb25hbCBmdW5jdGlvbiB0aGF0IGJsb2NrcyBrZXlib2FyZCBldmVudHMgd2hlbiByZXR1bmluZyBmYWxzZQoJCQlrZXlib2FyZENvbmRpdGlvbjogbnVsbCwKCgkJCS8vIEVuYWJsZSB0aGUgc2xpZGUgb3ZlcnZpZXcgbW9kZQoJCQlvdmVydmlldzogdHJ1ZSwKCgkJCS8vIERpc2FibGVzIHRoZSBkZWZhdWx0IHJldmVhbC5qcyBzbGlkZSBsYXlvdXQgc28gdGhhdCB5b3UgY2FuIHVzZQoJCQkvLyBjdXN0b20gQ1NTIGxheW91dAoJCQlkaXNhYmxlTGF5b3V0OiBmYWxzZSwKCgkJCS8vIFZlcnRpY2FsIGNlbnRlcmluZyBvZiBzbGlkZXMKCQkJY2VudGVyOiB0cnVlLAoKCQkJLy8gRW5hYmxlcyB0b3VjaCBuYXZpZ2F0aW9uIG9uIGRldmljZXMgd2l0aCB0b3VjaCBpbnB1dAoJCQl0b3VjaDogdHJ1ZSwKCgkJCS8vIExvb3AgdGhlIHByZXNlbnRhdGlvbgoJCQlsb29wOiBmYWxzZSwKCgkJCS8vIENoYW5nZSB0aGUgcHJlc2VudGF0aW9uIGRpcmVjdGlvbiB0byBiZSBSVEwKCQkJcnRsOiBmYWxzZSwKCgkJCS8vIENoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIG91ciBuYXZpZ2F0aW9uIGRpcmVjdGlvbnMuCgkJCS8vCgkJCS8vICJkZWZhdWx0IgoJCQkvLyBMZWZ0L3JpZ2h0IGFycm93IGtleXMgc3RlcCBiZXR3ZWVuIGhvcml6b250YWwgc2xpZGVzLCB1cC9kb3duCgkJCS8vIGFycm93IGtleXMgc3RlcCBiZXR3ZWVuIHZlcnRpY2FsIHNsaWRlcy4gU3BhY2Uga2V5IHN0ZXBzIHRocm91Z2gKCQkJLy8gYWxsIHNsaWRlcyAoYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCkuCgkJCS8vCgkJCS8vICJsaW5lYXIiCgkJCS8vIFJlbW92ZXMgdGhlIHVwL2Rvd24gYXJyb3dzLiBMZWZ0L3JpZ2h0IGFycm93cyBzdGVwIHRocm91Z2ggYWxsCgkJCS8vIHNsaWRlcyAoYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCkuCgkJCS8vCgkJCS8vICJncmlkIgoJCQkvLyBXaGVuIHRoaXMgaXMgZW5hYmxlZCwgc3RlcHBpbmcgbGVmdC9yaWdodCBmcm9tIGEgdmVydGljYWwgc3RhY2sKCQkJLy8gdG8gYW4gYWRqYWNlbnQgdmVydGljYWwgc3RhY2sgd2lsbCBsYW5kIHlvdSBhdCB0aGUgc2FtZSB2ZXJ0aWNhbAoJCQkvLyBpbmRleC4KCQkJLy8KCQkJLy8gQ29uc2lkZXIgYSBkZWNrIHdpdGggc2l4IHNsaWRlcyBvcmRlcmVkIGluIHR3byB2ZXJ0aWNhbCBzdGFja3M6CgkJCS8vIDEuMSAgICAyLjEKCQkJLy8gMS4yICAgIDIuMgoJCQkvLyAxLjMgICAgMi4zCgkJCS8vCgkJCS8vIElmIHlvdSdyZSBvbiBzbGlkZSAxLjMgYW5kIG5hdmlnYXRlIHJpZ2h0LCB5b3Ugd2lsbCBub3JtYWxseSBtb3ZlCgkJCS8vIGZyb20gMS4zIC0+IDIuMS4gSWYgImdyaWQiIGlzIHVzZWQsIHRoZSBzYW1lIG5hdmlnYXRpb24gdGFrZXMgeW91CgkJCS8vIGZyb20gMS4zIC0+IDIuMy4KCQkJbmF2aWdhdGlvbk1vZGU6ICdkZWZhdWx0JywKCgkJCS8vIFJhbmRvbWl6ZXMgdGhlIG9yZGVyIG9mIHNsaWRlcyBlYWNoIHRpbWUgdGhlIHByZXNlbnRhdGlvbiBsb2FkcwoJCQlzaHVmZmxlOiBmYWxzZSwKCgkJCS8vIFR1cm5zIGZyYWdtZW50cyBvbiBhbmQgb2ZmIGdsb2JhbGx5CgkJCWZyYWdtZW50czogdHJ1ZSwKCgkJCS8vIEZsYWdzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgY3VycmVudCBmcmFnbWVudCBpbiB0aGUgVVJMLAoJCQkvLyBzbyB0aGF0IHJlbG9hZGluZyBicmluZ3MgeW91IHRvIHRoZSBzYW1lIGZyYWdtZW50IHBvc2l0aW9uCgkJCWZyYWdtZW50SW5VUkw6IGZhbHNlLAoKCQkJLy8gRmxhZ3MgaWYgdGhlIHByZXNlbnRhdGlvbiBpcyBydW5uaW5nIGluIGFuIGVtYmVkZGVkIG1vZGUsCgkJCS8vIGkuZS4gY29udGFpbmVkIHdpdGhpbiBhIGxpbWl0ZWQgcG9ydGlvbiBvZiB0aGUgc2NyZWVuCgkJCWVtYmVkZGVkOiBmYWxzZSwKCgkJCS8vIEZsYWdzIGlmIHdlIHNob3VsZCBzaG93IGEgaGVscCBvdmVybGF5IHdoZW4gdGhlIHF1ZXN0aW9uLW1hcmsKCQkJLy8ga2V5IGlzIHByZXNzZWQKCQkJaGVscDogdHJ1ZSwKCgkJCS8vIEZsYWdzIGlmIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBwYXVzZSB0aGUgcHJlc2VudGF0aW9uIChibGFja291dCkKCQkJcGF1c2U6IHRydWUsCgoJCQkvLyBGbGFncyBpZiBzcGVha2VyIG5vdGVzIHNob3VsZCBiZSB2aXNpYmxlIHRvIGFsbCB2aWV3ZXJzCgkJCXNob3dOb3RlczogZmFsc2UsCgoJCQkvLyBHbG9iYWwgb3ZlcnJpZGUgZm9yIGF1dG9sYXlpbmcgZW1iZWRkZWQgbWVkaWEgKHZpZGVvL2F1ZGlvL2lmcmFtZSkKCQkJLy8gLSBudWxsOiAgIE1lZGlhIHdpbGwgb25seSBhdXRvcGxheSBpZiBkYXRhLWF1dG9wbGF5IGlzIHByZXNlbnQKCQkJLy8gLSB0cnVlOiAgIEFsbCBtZWRpYSB3aWxsIGF1dG9wbGF5LCByZWdhcmRsZXNzIG9mIGluZGl2aWR1YWwgc2V0dGluZwoJCQkvLyAtIGZhbHNlOiAgTm8gbWVkaWEgd2lsbCBhdXRvcGxheSwgcmVnYXJkbGVzcyBvZiBpbmRpdmlkdWFsIHNldHRpbmcKCQkJYXV0b1BsYXlNZWRpYTogbnVsbCwKCgkJCS8vIEdsb2JhbCBvdmVycmlkZSBmb3IgcHJlbG9hZGluZyBsYXp5LWxvYWRlZCBpZnJhbWVzCgkJCS8vIC0gbnVsbDogICBJZnJhbWVzIHdpdGggZGF0YS1zcmMgQU5EIGRhdGEtcHJlbG9hZCB3aWxsIGJlIGxvYWRlZCB3aGVuIHdpdGhpbgoJCQkvLyAgICAgICAgICAgdGhlIHZpZXdEaXN0YW5jZSwgaWZyYW1lcyB3aXRoIG9ubHkgZGF0YS1zcmMgd2lsbCBiZSBsb2FkZWQgd2hlbiB2aXNpYmxlCgkJCS8vIC0gdHJ1ZTogICBBbGwgaWZyYW1lcyB3aXRoIGRhdGEtc3JjIHdpbGwgYmUgbG9hZGVkIHdoZW4gd2l0aGluIHRoZSB2aWV3RGlzdGFuY2UKCQkJLy8gLSBmYWxzZTogIEFsbCBpZnJhbWVzIHdpdGggZGF0YS1zcmMgd2lsbCBiZSBsb2FkZWQgb25seSB3aGVuIHZpc2libGUKCQkJcHJlbG9hZElmcmFtZXM6IG51bGwsCgoJCQkvLyBDb250cm9scyBhdXRvbWF0aWMgcHJvZ3Jlc3Npb24gdG8gdGhlIG5leHQgc2xpZGUKCQkJLy8gLSAwOiAgICAgIEF1dG8tc2xpZGluZyBvbmx5IGhhcHBlbnMgaWYgdGhlIGRhdGEtYXV0b3NsaWRlIEhUTUwgYXR0cmlidXRlCgkJCS8vICAgICAgICAgICBpcyBwcmVzZW50IG9uIHRoZSBjdXJyZW50IHNsaWRlIG9yIGZyYWdtZW50CgkJCS8vIC0gMSs6ICAgICBBbGwgc2xpZGVzIHdpbGwgcHJvZ3Jlc3MgYXV0b21hdGljYWxseSBhdCB0aGUgZ2l2ZW4gaW50ZXJ2YWwKCQkJLy8gLSBmYWxzZTogIE5vIGF1dG8tc2xpZGluZywgZXZlbiBpZiBkYXRhLWF1dG9zbGlkZSBpcyBwcmVzZW50CgkJCWF1dG9TbGlkZTogMCwKCgkJCS8vIFN0b3AgYXV0by1zbGlkaW5nIGFmdGVyIHVzZXIgaW5wdXQKCQkJYXV0b1NsaWRlU3RvcHBhYmxlOiB0cnVlLAoKCQkJLy8gVXNlIHRoaXMgbWV0aG9kIGZvciBuYXZpZ2F0aW9uIHdoZW4gYXV0by1zbGlkaW5nIChkZWZhdWx0cyB0byBuYXZpZ2F0ZU5leHQpCgkJCWF1dG9TbGlkZU1ldGhvZDogbnVsbCwKCgkJCS8vIFNwZWNpZnkgdGhlIGF2ZXJhZ2UgdGltZSBpbiBzZWNvbmRzIHRoYXQgeW91IHRoaW5rIHlvdSB3aWxsIHNwZW5kCgkJCS8vIHByZXNlbnRpbmcgZWFjaCBzbGlkZS4gVGhpcyBpcyB1c2VkIHRvIHNob3cgYSBwYWNpbmcgdGltZXIgaW4gdGhlCgkJCS8vIHNwZWFrZXIgdmlldwoJCQlkZWZhdWx0VGltaW5nOiBudWxsLAoKCQkJLy8gRW5hYmxlIHNsaWRlIG5hdmlnYXRpb24gdmlhIG1vdXNlIHdoZWVsCgkJCW1vdXNlV2hlZWw6IGZhbHNlLAoKCQkJLy8gQXBwbHkgYSAzRCByb2xsIHRvIGxpbmtzIG9uIGhvdmVyCgkJCXJvbGxpbmdMaW5rczogZmFsc2UsCgoJCQkvLyBIaWRlcyB0aGUgYWRkcmVzcyBiYXIgb24gbW9iaWxlIGRldmljZXMKCQkJaGlkZUFkZHJlc3NCYXI6IHRydWUsCgoJCQkvLyBPcGVucyBsaW5rcyBpbiBhbiBpZnJhbWUgcHJldmlldyBvdmVybGF5CgkJCS8vIEFkZCBgZGF0YS1wcmV2aWV3LWxpbmtgIGFuZCBgZGF0YS1wcmV2aWV3LWxpbms9ImZhbHNlImAgdG8gY3VzdG9taXNlIGVhY2ggbGluawoJCQkvLyBpbmRpdmlkdWFsbHkKCQkJcHJldmlld0xpbmtzOiBmYWxzZSwKCgkJCS8vIEV4cG9zZXMgdGhlIHJldmVhbC5qcyBBUEkgdGhyb3VnaCB3aW5kb3cucG9zdE1lc3NhZ2UKCQkJcG9zdE1lc3NhZ2U6IHRydWUsCgoJCQkvLyBEaXNwYXRjaGVzIGFsbCByZXZlYWwuanMgZXZlbnRzIHRvIHRoZSBwYXJlbnQgd2luZG93IHRocm91Z2ggcG9zdE1lc3NhZ2UKCQkJcG9zdE1lc3NhZ2VFdmVudHM6IGZhbHNlLAoKCQkJLy8gRm9jdXNlcyBib2R5IHdoZW4gcGFnZSBjaGFuZ2VzIHZpc2liaWxpdHkgdG8gZW5zdXJlIGtleWJvYXJkIHNob3J0Y3V0cyB3b3JrCgkJCWZvY3VzQm9keU9uUGFnZVZpc2liaWxpdHlDaGFuZ2U6IHRydWUsCgoJCQkvLyBUcmFuc2l0aW9uIHN0eWxlCgkJCXRyYW5zaXRpb246ICdzbGlkZScsIC8vIG5vbmUvZmFkZS9zbGlkZS9jb252ZXgvY29uY2F2ZS96b29tCgoJCQkvLyBUcmFuc2l0aW9uIHNwZWVkCgkJCXRyYW5zaXRpb25TcGVlZDogJ2RlZmF1bHQnLCAvLyBkZWZhdWx0L2Zhc3Qvc2xvdwoKCQkJLy8gVHJhbnNpdGlvbiBzdHlsZSBmb3IgZnVsbCBwYWdlIHNsaWRlIGJhY2tncm91bmRzCgkJCWJhY2tncm91bmRUcmFuc2l0aW9uOiAnZmFkZScsIC8vIG5vbmUvZmFkZS9zbGlkZS9jb252ZXgvY29uY2F2ZS96b29tCgoJCQkvLyBQYXJhbGxheCBiYWNrZ3JvdW5kIGltYWdlCgkJCXBhcmFsbGF4QmFja2dyb3VuZEltYWdlOiAnJywgLy8gQ1NTIHN5bnRheCwgZS5nLiAiYS5qcGciCgoJCQkvLyBQYXJhbGxheCBiYWNrZ3JvdW5kIHNpemUKCQkJcGFyYWxsYXhCYWNrZ3JvdW5kU2l6ZTogJycsIC8vIENTUyBzeW50YXgsIGUuZy4gIjMwMDBweCAyMDAwcHgiCgoJCQkvLyBQYXJhbGxheCBiYWNrZ3JvdW5kIHJlcGVhdAoJCQlwYXJhbGxheEJhY2tncm91bmRSZXBlYXQ6ICcnLCAvLyByZXBlYXQvcmVwZWF0LXgvcmVwZWF0LXkvbm8tcmVwZWF0L2luaXRpYWwvaW5oZXJpdAoKCQkJLy8gUGFyYWxsYXggYmFja2dyb3VuZCBwb3NpdGlvbgoJCQlwYXJhbGxheEJhY2tncm91bmRQb3NpdGlvbjogJycsIC8vIENTUyBzeW50YXgsIGUuZy4gInRvcCBsZWZ0IgoKCQkJLy8gQW1vdW50IG9mIHBpeGVscyB0byBtb3ZlIHRoZSBwYXJhbGxheCBiYWNrZ3JvdW5kIHBlciBzbGlkZSBzdGVwCgkJCXBhcmFsbGF4QmFja2dyb3VuZEhvcml6b250YWw6IG51bGwsCgkJCXBhcmFsbGF4QmFja2dyb3VuZFZlcnRpY2FsOiBudWxsLAoKCQkJLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIGEgc2luZ2xlIHNsaWRlIGNhbiBleHBhbmQgb250byB3aGVuIHByaW50aW5nCgkJCS8vIHRvIFBERiwgdW5saW1pdGVkIGJ5IGRlZmF1bHQKCQkJcGRmTWF4UGFnZXNQZXJTbGlkZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLAoKCQkJLy8gUHJpbnRzIGVhY2ggZnJhZ21lbnQgb24gYSBzZXBhcmF0ZSBzbGlkZQoJCQlwZGZTZXBhcmF0ZUZyYWdtZW50czogdHJ1ZSwKCgkJCS8vIE9mZnNldCB1c2VkIHRvIHJlZHVjZSB0aGUgaGVpZ2h0IG9mIGNvbnRlbnQgd2l0aGluIGV4cG9ydGVkIFBERiBwYWdlcy4KCQkJLy8gVGhpcyBleGlzdHMgdG8gYWNjb3VudCBmb3IgZW52aXJvbm1lbnQgZGlmZmVyZW5jZXMgYmFzZWQgb24gaG93IHlvdQoJCQkvLyBwcmludCB0byBQREYuIENMSSBwcmludGluZyBvcHRpb25zLCBsaWtlIHBoYW50b21qcyBhbmQgd2twZGYsIGNhbiBlbmQKCQkJLy8gb24gcHJlY2lzZWx5IHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIGRvY3VtZW50IHdoZXJlYXMgaW4tYnJvd3NlcgoJCQkvLyBwcmludGluZyBoYXMgdG8gZW5kIG9uZSBwaXhlbCBiZWZvcmUuCgkJCXBkZlBhZ2VIZWlnaHRPZmZzZXQ6IC0xLAoKCQkJLy8gTnVtYmVyIG9mIHNsaWRlcyBhd2F5IGZyb20gdGhlIGN1cnJlbnQgdGhhdCBhcmUgdmlzaWJsZQoJCQl2aWV3RGlzdGFuY2U6IDMsCgoJCQkvLyBOdW1iZXIgb2Ygc2xpZGVzIGF3YXkgZnJvbSB0aGUgY3VycmVudCB0aGF0IGFyZSB2aXNpYmxlIG9uIG1vYmlsZQoJCQkvLyBkZXZpY2VzLiBJdCBpcyBhZHZpc2FibGUgdG8gc2V0IHRoaXMgdG8gYSBsb3dlciBudW1iZXIgdGhhbgoJCQkvLyB2aWV3RGlzdGFuY2UgaW4gb3JkZXIgdG8gc2F2ZSByZXNvdXJjZXMuCgkJCW1vYmlsZVZpZXdEaXN0YW5jZTogMiwKCgkJCS8vIFRoZSBkaXNwbGF5IG1vZGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2hvdyBzbGlkZXMKCQkJZGlzcGxheTogJ2Jsb2NrJywKCgkJCS8vIEhpZGUgY3Vyc29yIGlmIGluYWN0aXZlCgkJCWhpZGVJbmFjdGl2ZUN1cnNvcjogdHJ1ZSwKCgkJCS8vIFRpbWUgYmVmb3JlIHRoZSBjdXJzb3IgaXMgaGlkZGVuIChpbiBtcykKCQkJaGlkZUN1cnNvclRpbWU6IDUwMDAsCgoJCQkvLyBTY3JpcHQgZGVwZW5kZW5jaWVzIHRvIGxvYWQKCQkJZGVwZW5kZW5jaWVzOiBbXQoKCQl9LAoKCQkvLyBGbGFncyBpZiBSZXZlYWwuaW5pdGlhbGl6ZSgpIGhhcyBiZWVuIGNhbGxlZAoJCWluaXRpYWxpemVkID0gZmFsc2UsCgoJCS8vIEZsYWdzIGlmIHJldmVhbC5qcyBpcyBsb2FkZWQgKGhhcyBkaXNwYXRjaGVkIHRoZSAncmVhZHknIGV2ZW50KQoJCWxvYWRlZCA9IGZhbHNlLAoKCQkvLyBGbGFncyBpZiB0aGUgb3ZlcnZpZXcgbW9kZSBpcyBjdXJyZW50bHkgYWN0aXZlCgkJb3ZlcnZpZXcgPSBmYWxzZSwKCgkJLy8gSG9sZHMgdGhlIGRpbWVuc2lvbnMgb2Ygb3VyIG92ZXJ2aWV3IHNsaWRlcywgaW5jbHVkaW5nIG1hcmdpbnMKCQlvdmVydmlld1NsaWRlV2lkdGggPSBudWxsLAoJCW92ZXJ2aWV3U2xpZGVIZWlnaHQgPSBudWxsLAoKCQkvLyBUaGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2xpZGUKCQlpbmRleGgsCgkJaW5kZXh2LAoKCQkvLyBUaGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgc2xpZGUgSFRNTCBlbGVtZW50cwoJCXByZXZpb3VzU2xpZGUsCgkJY3VycmVudFNsaWRlLAoKCQlwcmV2aW91c0JhY2tncm91bmQsCgoJCS8vIFJlbWVtYmVyIHdoaWNoIGRpcmVjdGlvbnMgdGhhdCB0aGUgdXNlciBoYXMgbmF2aWdhdGVkIHRvd2FyZHMKCQloYXNOYXZpZ2F0ZWRSaWdodCA9IGZhbHNlLAoJCWhhc05hdmlnYXRlZERvd24gPSBmYWxzZSwKCgkJLy8gU2xpZGVzIG1heSBob2xkIGEgZGF0YS1zdGF0ZSBhdHRyaWJ1dGUgd2hpY2ggd2UgcGljayB1cCBhbmQgYXBwbHkKCQkvLyBhcyBhIGNsYXNzIHRvIHRoZSBib2R5LiBUaGlzIGxpc3QgY29udGFpbnMgdGhlIGNvbWJpbmVkIHN0YXRlIG9mCgkJLy8gYWxsIGN1cnJlbnQgc2xpZGVzLgoJCXN0YXRlID0gW10sCgoJCS8vIFRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZSBwcmVzZW50YXRpb24gKHNlZSB3aWR0aC9oZWlnaHQgY29uZmlnKQoJCXNjYWxlID0gMSwKCgkJLy8gQ1NTIHRyYW5zZm9ybSB0aGF0IGlzIGN1cnJlbnRseSBhcHBsaWVkIHRvIHRoZSBzbGlkZXMgY29udGFpbmVyLAoJCS8vIHNwbGl0IGludG8gdHdvIGdyb3VwcwoJCXNsaWRlc1RyYW5zZm9ybSA9IHsgbGF5b3V0OiAnJywgb3ZlcnZpZXc6ICcnIH0sCgoJCS8vIENhY2hlZCByZWZlcmVuY2VzIHRvIERPTSBlbGVtZW50cwoJCWRvbSA9IHt9LAoKCQkvLyBBIGxpc3Qgb2YgcmVnaXN0ZXJlZCByZXZlYWwuanMgcGx1Z2lucwoJCXBsdWdpbnMgPSB7fSwKCgkJLy8gTGlzdCBvZiBhc3luY2hyb25vdXNseSBsb2FkZWQgcmV2ZWFsLmpzIGRlcGVuZGVuY2llcwoJCWFzeW5jRGVwZW5kZW5jaWVzID0gW10sCgoJCS8vIEZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlciwgc2VlICNjaGVja0NhcGFiaWxpdGllcygpCgkJZmVhdHVyZXMgPSB7fSwKCgkJLy8gQ2xpZW50IGlzIGEgbW9iaWxlIGRldmljZSwgc2VlICNjaGVja0NhcGFiaWxpdGllcygpCgkJaXNNb2JpbGVEZXZpY2UsCgoJCS8vIENsaWVudCBpcyBhIGRlc2t0b3AgQ2hyb21lLCBzZWUgI2NoZWNrQ2FwYWJpbGl0aWVzKCkKCQlpc0Nocm9tZSwKCgkJLy8gVGhyb3R0bGVzIG1vdXNlIHdoZWVsIG5hdmlnYXRpb24KCQlsYXN0TW91c2VXaGVlbFN0ZXAgPSAwLAoKCQkvLyBEZWxheXMgdXBkYXRlcyB0byB0aGUgVVJMIGR1ZSB0byBhIENocm9tZSB0aHVtYm5haWxlciBidWcKCQl3cml0ZVVSTFRpbWVvdXQgPSAwLAoKCQkvLyBJcyB0aGUgbW91c2UgcG9pbnRlciBjdXJyZW50bHkgaGlkZGVuIGZyb20gdmlldwoJCWN1cnNvckhpZGRlbiA9IGZhbHNlLAoKCQkvLyBUaW1lb3V0IHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIGN1cnNvciBpcyBpbmFjdGl2ZQoJCWN1cnNvckluYWN0aXZlVGltZW91dCA9IDAsCgoJCS8vIEZsYWdzIGlmIHRoZSBpbnRlcmFjdGlvbiBldmVudCBsaXN0ZW5lcnMgYXJlIGJvdW5kCgkJZXZlbnRzQXJlQm91bmQgPSBmYWxzZSwKCgkJLy8gVGhlIGN1cnJlbnQgYXV0by1zbGlkZSBkdXJhdGlvbgoJCWF1dG9TbGlkZSA9IDAsCgoJCS8vIEF1dG8gc2xpZGUgcHJvcGVydGllcwoJCWF1dG9TbGlkZVBsYXllciwKCQlhdXRvU2xpZGVUaW1lb3V0ID0gMCwKCQlhdXRvU2xpZGVTdGFydFRpbWUgPSAtMSwKCQlhdXRvU2xpZGVQYXVzZWQgPSBmYWxzZSwKCgkJLy8gSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBvbmdvaW5nIHRvdWNoIGlucHV0CgkJdG91Y2ggPSB7CgkJCXN0YXJ0WDogMCwKCQkJc3RhcnRZOiAwLAoJCQlzdGFydENvdW50OiAwLAoJCQljYXB0dXJlZDogZmFsc2UsCgkJCXRocmVzaG9sZDogNDAKCQl9LAoKCQkvLyBBIGtleTp2YWx1ZSBtYXAgb2Ygc2hvcnRjdXQga2V5Ym9hcmQga2V5cyBhbmQgZGVzY3JpcHRpb25zIG9mCgkJLy8gdGhlIGFjdGlvbnMgdGhleSB0cmlnZ2VyLCBnZW5lcmF0ZWQgaW4gI2NvbmZpZ3VyZSgpCgkJa2V5Ym9hcmRTaG9ydGN1dHMgPSB7fSwKCgkJLy8gSG9sZHMgY3VzdG9tIGtleSBjb2RlIG1hcHBpbmdzCgkJcmVnaXN0ZXJlZEtleUJpbmRpbmdzID0ge307CgoJLyoqCgkgKiBTdGFydHMgdXAgdGhlIHByZXNlbnRhdGlvbiBpZiB0aGUgY2xpZW50IGlzIGNhcGFibGUuCgkgKi8KCWZ1bmN0aW9uIGluaXRpYWxpemUoIG9wdGlvbnMgKSB7CgoJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGluaXRpYWxpemUgb25jZQoJCWlmKCBpbml0aWFsaXplZCA9PT0gdHJ1ZSApIHJldHVybjsKCgkJaW5pdGlhbGl6ZWQgPSB0cnVlOwoKCQljaGVja0NhcGFiaWxpdGllcygpOwoKCQlpZiggIWZlYXR1cmVzLnRyYW5zZm9ybXMyZCAmJiAhZmVhdHVyZXMudHJhbnNmb3JtczNkICkgewoJCQlkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ25vLXRyYW5zZm9ybXMnICk7CgoJCQkvLyBTaW5jZSBKUyB3b24ndCBiZSBydW5uaW5nIGFueSBmdXJ0aGVyLCB3ZSBsb2FkIGFsbCBsYXp5CgkJCS8vIGxvYWRpbmcgZWxlbWVudHMgdXBmcm9udAoJCQl2YXIgaW1hZ2VzID0gdG9BcnJheSggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICdpbWcnICkgKSwKCQkJCWlmcmFtZXMgPSB0b0FycmF5KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2lmcmFtZScgKSApOwoKCQkJdmFyIGxhenlMb2FkYWJsZSA9IGltYWdlcy5jb25jYXQoIGlmcmFtZXMgKTsKCgkJCWZvciggdmFyIGkgPSAwLCBsZW4gPSBsYXp5TG9hZGFibGUubGVuZ3RoOyBpIDwgbGVuOyBpKysgKSB7CgkJCQl2YXIgZWxlbWVudCA9IGxhenlMb2FkYWJsZVtpXTsKCQkJCWlmKCBlbGVtZW50LmdldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJyApICkgewoJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnc3JjJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycgKSApOwoJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1zcmMnICk7CgkJCQl9CgkJCX0KCgkJCS8vIElmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjb3JlIGZlYXR1cmVzIHdlIHdvbid0IGJlCgkJCS8vIHVzaW5nIEphdmFTY3JpcHQgdG8gY29udHJvbCB0aGUgcHJlc2VudGF0aW9uCgkJCXJldHVybjsKCQl9CgoJCS8vIENhY2hlIHJlZmVyZW5jZXMgdG8ga2V5IERPTSBlbGVtZW50cwoJCWRvbS53cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy5yZXZlYWwnICk7CgkJZG9tLnNsaWRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcucmV2ZWFsIC5zbGlkZXMnICk7CgoJCS8vIEZvcmNlIGEgbGF5b3V0IHdoZW4gdGhlIHdob2xlIHBhZ2UsIGluY2wgZm9udHMsIGhhcyBsb2FkZWQKCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBsYXlvdXQsIGZhbHNlICk7CgoJCXZhciBxdWVyeSA9IFJldmVhbC5nZXRRdWVyeUhhc2goKTsKCgkJLy8gRG8gbm90IGFjY2VwdCBuZXcgZGVwZW5kZW5jaWVzIHZpYSBxdWVyeSBjb25maWcgdG8gYXZvaWQKCQkvLyB0aGUgcG90ZW50aWFsIG9mIG1hbGljaW91cyBzY3JpcHQgaW5qZWN0aW9uCgkJaWYoIHR5cGVvZiBxdWVyeVsnZGVwZW5kZW5jaWVzJ10gIT09ICd1bmRlZmluZWQnICkgZGVsZXRlIHF1ZXJ5WydkZXBlbmRlbmNpZXMnXTsKCgkJLy8gQ29weSBvcHRpb25zIG92ZXIgdG8gb3VyIGNvbmZpZyBvYmplY3QKCQlleHRlbmQoIGNvbmZpZywgb3B0aW9ucyApOwoJCWV4dGVuZCggY29uZmlnLCBxdWVyeSApOwoKCQkvLyBIaWRlIHRoZSBhZGRyZXNzIGJhciBpbiBtb2JpbGUgYnJvd3NlcnMKCQloaWRlQWRkcmVzc0JhcigpOwoKCQkvLyBMb2FkcyBkZXBlbmRlbmNpZXMgYW5kIGNvbnRpbnVlcyB0byAjc3RhcnQoKSBvbmNlIGRvbmUKCQlsb2FkKCk7CgoJfQoKCS8qKgoJICogSW5zcGVjdCB0aGUgY2xpZW50IHRvIHNlZSB3aGF0IGl0J3MgY2FwYWJsZSBvZiwgdGhpcwoJICogc2hvdWxkIG9ubHkgaGFwcGVucyBvbmNlIHBlciBydW50aW1lLgoJICovCglmdW5jdGlvbiBjaGVja0NhcGFiaWxpdGllcygpIHsKCgkJaXNNb2JpbGVEZXZpY2UgPSAvKGlwaG9uZXxpcG9kfGlwYWR8YW5kcm9pZCkvZ2kudGVzdCggVUEgKSB8fAoJCQkJCQkJKCBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMSApOyAvLyBpUGFkT1MKCQlpc0Nocm9tZSA9IC9jaHJvbWUvaS50ZXN0KCBVQSApICYmICEvZWRnZS9pLnRlc3QoIFVBICk7CgoJCXZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgoJCWZlYXR1cmVzLnRyYW5zZm9ybXMzZCA9ICdXZWJraXRQZXJzcGVjdGl2ZScgaW4gdGVzdEVsZW1lbnQuc3R5bGUgfHwKCQkJCQkJCQknTW96UGVyc3BlY3RpdmUnIGluIHRlc3RFbGVtZW50LnN0eWxlIHx8CgkJCQkJCQkJJ21zUGVyc3BlY3RpdmUnIGluIHRlc3RFbGVtZW50LnN0eWxlIHx8CgkJCQkJCQkJJ09QZXJzcGVjdGl2ZScgaW4gdGVzdEVsZW1lbnQuc3R5bGUgfHwKCQkJCQkJCQkncGVyc3BlY3RpdmUnIGluIHRlc3RFbGVtZW50LnN0eWxlOwoKCQlmZWF0dXJlcy50cmFuc2Zvcm1zMmQgPSAnV2Via2l0VHJhbnNmb3JtJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSB8fAoJCQkJCQkJCSdNb3pUcmFuc2Zvcm0nIGluIHRlc3RFbGVtZW50LnN0eWxlIHx8CgkJCQkJCQkJJ21zVHJhbnNmb3JtJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSB8fAoJCQkJCQkJCSdPVHJhbnNmb3JtJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSB8fAoJCQkJCQkJCSd0cmFuc2Zvcm0nIGluIHRlc3RFbGVtZW50LnN0eWxlOwoKCQlmZWF0dXJlcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVNZXRob2QgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZTsKCQlmZWF0dXJlcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB0eXBlb2YgZmVhdHVyZXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lTWV0aG9kID09PSAnZnVuY3Rpb24nOwoKCQlmZWF0dXJlcy5jYW52YXMgPSAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdjYW52YXMnICkuZ2V0Q29udGV4dDsKCgkJLy8gVHJhbnNpdGlvbnMgaW4gdGhlIG92ZXJ2aWV3IGFyZSBkaXNhYmxlZCBpbiBkZXNrdG9wIGFuZAoJCS8vIFNhZmFyaSBkdWUgdG8gbGFnCgkJZmVhdHVyZXMub3ZlcnZpZXdUcmFuc2l0aW9ucyA9ICEvVmVyc2lvblwvW1xkXC5dKy4qU2FmYXJpLy50ZXN0KCBVQSApOwoKCQkvLyBGbGFncyBpZiB3ZSBzaG91bGQgdXNlIHpvb20gaW5zdGVhZCBvZiB0cmFuc2Zvcm0gdG8gc2NhbGUKCQkvLyB1cCBzbGlkZXMuIFpvb20gcHJvZHVjZXMgY3Jpc3BlciByZXN1bHRzIGJ1dCBoYXMgYSBsb3Qgb2YKCQkvLyB4YnJvd3NlciBxdWlya3Mgc28gd2Ugb25seSB1c2UgaXQgaW4gd2hpdGVsc2l0ZWQgYnJvd3NlcnMuCgkJZmVhdHVyZXMuem9vbSA9ICd6b29tJyBpbiB0ZXN0RWxlbWVudC5zdHlsZSAmJiAhaXNNb2JpbGVEZXZpY2UgJiYKCQkJCQkJKCBpc0Nocm9tZSB8fCAvVmVyc2lvblwvW1xkXC5dKy4qU2FmYXJpLy50ZXN0KCBVQSApICk7CgoJfQoKCS8qKgoJICogTG9hZHMgdGhlIGRlcGVuZGVuY2llcyBvZiByZXZlYWwuanMuIERlcGVuZGVuY2llcyBhcmUKCSAqIGRlZmluZWQgdmlhIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbiAnZGVwZW5kZW5jaWVzJwoJICogYW5kIHdpbGwgYmUgbG9hZGVkIHByaW9yIHRvIHN0YXJ0aW5nL2JpbmRpbmcgcmV2ZWFsLmpzLgoJICogU29tZSBkZXBlbmRlbmNpZXMgbWF5IGhhdmUgYW4gJ2FzeW5jJyBmbGFnLCBpZiBzbyB0aGV5CgkgKiB3aWxsIGxvYWQgYWZ0ZXIgcmV2ZWFsLmpzIGhhcyBiZWVuIHN0YXJ0ZWQgdXAuCgkgKi8KCWZ1bmN0aW9uIGxvYWQoKSB7CgoJCXZhciBzY3JpcHRzID0gW10sCgkJCXNjcmlwdHNUb0xvYWQgPSAwOwoKCQljb25maWcuZGVwZW5kZW5jaWVzLmZvckVhY2goIGZ1bmN0aW9uKCBzICkgewoJCQkvLyBMb2FkIGlmIHRoZXJlJ3Mgbm8gY29uZGl0aW9uIG9yIHRoZSBjb25kaXRpb24gaXMgdHJ1dGh5CgkJCWlmKCAhcy5jb25kaXRpb24gfHwgcy5jb25kaXRpb24oKSApIHsKCQkJCWlmKCBzLmFzeW5jICkgewoJCQkJCWFzeW5jRGVwZW5kZW5jaWVzLnB1c2goIHMgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNjcmlwdHMucHVzaCggcyApOwoJCQkJfQoJCQl9CgkJfSApOwoKCQlpZiggc2NyaXB0cy5sZW5ndGggKSB7CgkJCXNjcmlwdHNUb0xvYWQgPSBzY3JpcHRzLmxlbmd0aDsKCgkJCS8vIExvYWQgc3luY2hyb25vdXMgc2NyaXB0cwoJCQlzY3JpcHRzLmZvckVhY2goIGZ1bmN0aW9uKCBzICkgewoJCQkJbG9hZFNjcmlwdCggcy5zcmMsIGZ1bmN0aW9uKCkgewoKCQkJCQlpZiggdHlwZW9mIHMuY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgKSBzLmNhbGxiYWNrKCk7CgoJCQkJCWlmKCAtLXNjcmlwdHNUb0xvYWQgPT09IDAgKSB7CgkJCQkJCWluaXRQbHVnaW5zKCk7CgkJCQkJfQoKCQkJCX0gKTsKCQkJfSApOwoJCX0KCQllbHNlIHsKCQkJaW5pdFBsdWdpbnMoKTsKCQl9CgoJfQoKCS8qKgoJICogSW5pdGlhbGl6ZXMgb3VyIHBsdWdpbnMgYW5kIHdhaXRzIGZvciB0aGVtIHRvIGJlIHJlYWR5CgkgKiBiZWZvcmUgcHJvY2VlZGluZy4KCSAqLwoJZnVuY3Rpb24gaW5pdFBsdWdpbnMoKSB7CgoJCXZhciBwbHVnaW5zVG9Jbml0aWFsaXplID0gT2JqZWN0LmtleXMoIHBsdWdpbnMgKS5sZW5ndGg7CgoJCS8vIElmIHRoZXJlIGFyZSBubyBwbHVnaW5zLCBza2lwIHRoaXMgc3RlcAoJCWlmKCBwbHVnaW5zVG9Jbml0aWFsaXplID09PSAwICkgewoJCQlsb2FkQXN5bmNEZXBlbmRlbmNpZXMoKTsKCQl9CgkJLy8gLi4uIG90aGVyd2lzZSBpbml0aWFsaXplIHBsdWdpbnMKCQllbHNlIHsKCgkJCXZhciBhZnRlclBsdWdJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkgewoJCQkJaWYoIC0tcGx1Z2luc1RvSW5pdGlhbGl6ZSA9PT0gMCApIHsKCQkJCQlsb2FkQXN5bmNEZXBlbmRlbmNpZXMoKTsKCQkJCX0KCQkJfTsKCgkJCWZvciggdmFyIGkgaW4gcGx1Z2lucyApIHsKCgkJCQl2YXIgcGx1Z2luID0gcGx1Z2luc1tpXTsKCgkJCQkvLyBJZiB0aGUgcGx1Z2luIGhhcyBhbiAnaW5pdCcgbWV0aG9kLCBpbnZva2UgaXQKCQkJCWlmKCB0eXBlb2YgcGx1Z2luLmluaXQgPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJdmFyIGNhbGxiYWNrID0gcGx1Z2luLmluaXQoKTsKCgkJCQkJLy8gSWYgdGhlIHBsdWdpbiByZXR1cm5lZCBhIFByb21pc2UsIHdhaXQgZm9yIGl0CgkJCQkJaWYoIGNhbGxiYWNrICYmIHR5cGVvZiBjYWxsYmFjay50aGVuID09PSAnZnVuY3Rpb24nICkgewoJCQkJCQljYWxsYmFjay50aGVuKCBhZnRlclBsdWdJbml0aWFsaXplZCApOwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJYWZ0ZXJQbHVnSW5pdGlhbGl6ZWQoKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlhZnRlclBsdWdJbml0aWFsaXplZCgpOwoJCQkJfQoKCQkJfQoKCQl9CgoJfQoKCS8qKgoJICogTG9hZHMgYWxsIGFzeW5jIHJldmVhbC5qcyBkZXBlbmRlbmNpZXMuCgkgKi8KCWZ1bmN0aW9uIGxvYWRBc3luY0RlcGVuZGVuY2llcygpIHsKCgkJaWYoIGFzeW5jRGVwZW5kZW5jaWVzLmxlbmd0aCApIHsKCQkJYXN5bmNEZXBlbmRlbmNpZXMuZm9yRWFjaCggZnVuY3Rpb24oIHMgKSB7CgkJCQlsb2FkU2NyaXB0KCBzLnNyYywgcy5jYWxsYmFjayApOwoJCQl9ICk7CgkJfQoKCQlzdGFydCgpOwoKCX0KCgkvKioKCSAqIExvYWRzIGEgSmF2YVNjcmlwdCBmaWxlIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgZXhlY3V0ZXMgaXQuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd9IHVybCBBZGRyZXNzIG9mIHRoZSAuanMgZmlsZSB0byBsb2FkCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBNZXRob2QgdG8gaW52b2tlIHdoZW4gdGhlIHNjcmlwdAoJICogaGFzIGxvYWRlZCBhbmQgZXhlY3V0ZWQKCSAqLwoJZnVuY3Rpb24gbG9hZFNjcmlwdCggdXJsLCBjYWxsYmFjayApIHsKCgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzY3JpcHQnICk7CgkJc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCQlzY3JpcHQuYXN5bmMgPSBmYWxzZTsKCQlzY3JpcHQuZGVmZXIgPSBmYWxzZTsKCQlzY3JpcHQuc3JjID0gdXJsOwoKCQlpZiggY2FsbGJhY2sgKSB7CgoJCQkvLyBTdWNjZXNzIGNhbGxiYWNrCgkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYoIGV2ZW50LnR5cGUgPT09ICJsb2FkIiB8fCAoL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApICkgewoKCQkJCQkvLyBLaWxsIGV2ZW50IGxpc3RlbmVycwoJCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gc2NyaXB0Lm9uZXJyb3IgPSBudWxsOwoKCQkJCQljYWxsYmFjaygpOwoKCQkJCX0KCQkJfTsKCgkJCS8vIEVycm9yIGNhbGxiYWNrCgkJCXNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24oIGVyciApIHsKCgkJCQkvLyBLaWxsIGV2ZW50IGxpc3RlbmVycwoJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBzY3JpcHQub25lcnJvciA9IG51bGw7CgoJCQkJY2FsbGJhY2soIG5ldyBFcnJvciggJ0ZhaWxlZCBsb2FkaW5nIHNjcmlwdDogJyArIHNjcmlwdC5zcmMgKyAnXG4nICsgZXJyKSApOwoKCQkJfTsKCgkJfQoKCQkvLyBBcHBlbmQgdGhlIHNjcmlwdCBhdCB0aGUgZW5kIG9mIDxoZWFkPgoJCXZhciBoZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJ2hlYWQnICk7CgkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5sYXN0Q2hpbGQgKTsKCgl9CgoJLyoqCgkgKiBTdGFydHMgdXAgcmV2ZWFsLmpzIGJ5IGJpbmRpbmcgaW5wdXQgZXZlbnRzIGFuZCBuYXZpZ2F0aW5nCgkgKiB0byB0aGUgY3VycmVudCBVUkwgZGVlcGxpbmsgaWYgdGhlcmUgaXMgb25lLgoJICovCglmdW5jdGlvbiBzdGFydCgpIHsKCgkJbG9hZGVkID0gdHJ1ZTsKCgkJLy8gTWFrZSBzdXJlIHdlJ3ZlIGdvdCBhbGwgdGhlIERPTSBlbGVtZW50cyB3ZSBuZWVkCgkJc2V0dXBET00oKTsKCgkJLy8gTGlzdGVuIHRvIG1lc3NhZ2VzIHBvc3RlZCB0byB0aGlzIHdpbmRvdwoJCXNldHVwUG9zdE1lc3NhZ2UoKTsKCgkJLy8gUHJldmVudCB0aGUgc2xpZGVzIGZyb20gYmVpbmcgc2Nyb2xsZWQgb3V0IG9mIHZpZXcKCQlzZXR1cFNjcm9sbFByZXZlbnRpb24oKTsKCgkJLy8gUmVzZXRzIGFsbCB2ZXJ0aWNhbCBzbGlkZXMgc28gdGhhdCBvbmx5IHRoZSBmaXJzdCBpcyB2aXNpYmxlCgkJcmVzZXRWZXJ0aWNhbFNsaWRlcygpOwoKCQkvLyBVcGRhdGVzIHRoZSBwcmVzZW50YXRpb24gdG8gbWF0Y2ggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMKCQljb25maWd1cmUoKTsKCgkJLy8gUmVhZCB0aGUgaW5pdGlhbCBoYXNoCgkJcmVhZFVSTCgpOwoKCQkvLyBVcGRhdGUgYWxsIGJhY2tncm91bmRzCgkJdXBkYXRlQmFja2dyb3VuZCggdHJ1ZSApOwoKCQkvLyBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHByZXNlbnRhdGlvbiBpcyByZWFkeSBidXQgdXNlIGEgMW1zCgkJLy8gdGltZW91dCB0byBlbnN1cmUgaXQncyBub3QgZmlyZWQgc3luY2hyb25vdXNseSBhZnRlciAjaW5pdGlhbGl6ZSgpCgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCS8vIEVuYWJsZSB0cmFuc2l0aW9ucyBub3cgdGhhdCB3ZSdyZSBsb2FkZWQKCQkJZG9tLnNsaWRlcy5jbGFzc0xpc3QucmVtb3ZlKCAnbm8tdHJhbnNpdGlvbicgKTsKCgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdyZWFkeScgKTsKCgkJCWRpc3BhdGNoRXZlbnQoICdyZWFkeScsIHsKCQkJCSdpbmRleGgnOiBpbmRleGgsCgkJCQknaW5kZXh2JzogaW5kZXh2LAoJCQkJJ2N1cnJlbnRTbGlkZSc6IGN1cnJlbnRTbGlkZQoJCQl9ICk7CgkJfSwgMSApOwoKCQkvLyBTcGVjaWFsIHNldHVwIGFuZCBjb25maWcgaXMgcmVxdWlyZWQgd2hlbiBwcmludGluZyB0byBQREYKCQlpZiggaXNQcmludGluZ1BERigpICkgewoJCQlyZW1vdmVFdmVudExpc3RlbmVycygpOwoKCQkJLy8gVGhlIGRvY3VtZW50IG5lZWRzIHRvIGhhdmUgbG9hZGVkIGZvciB0aGUgUERGIGxheW91dAoJCQkvLyBtZWFzdXJlbWVudHMgdG8gYmUgYWNjdXJhdGUKCQkJaWYoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgKSB7CgkJCQlzZXR1cFBERigpOwoJCQl9CgkJCWVsc2UgewoJCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgc2V0dXBQREYgKTsKCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBGaW5kcyBhbmQgc3RvcmVzIHJlZmVyZW5jZXMgdG8gRE9NIGVsZW1lbnRzIHdoaWNoIGFyZQoJICogcmVxdWlyZWQgYnkgdGhlIHByZXNlbnRhdGlvbi4gSWYgYSByZXF1aXJlZCBlbGVtZW50IGlzCgkgKiBub3QgZm91bmQsIGl0IGlzIGNyZWF0ZWQuCgkgKi8KCWZ1bmN0aW9uIHNldHVwRE9NKCkgewoKCQkvLyBQcmV2ZW50IHRyYW5zaXRpb25zIHdoaWxlIHdlJ3JlIGxvYWRpbmcKCQlkb20uc2xpZGVzLmNsYXNzTGlzdC5hZGQoICduby10cmFuc2l0aW9uJyApOwoKCQlpZiggaXNNb2JpbGVEZXZpY2UgKSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICduby1ob3ZlcicgKTsKCQl9CgkJZWxzZSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICduby1ob3ZlcicgKTsKCQl9CgoJCWlmKCAvaXBob25lL2dpLnRlc3QoIFVBICkgKSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICd1YS1pcGhvbmUnICk7CgkJfQoJCWVsc2UgewoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAndWEtaXBob25lJyApOwoJCX0KCgkJLy8gQmFja2dyb3VuZCBlbGVtZW50CgkJZG9tLmJhY2tncm91bmQgPSBjcmVhdGVTaW5nbGV0b25Ob2RlKCBkb20ud3JhcHBlciwgJ2RpdicsICdiYWNrZ3JvdW5kcycsIG51bGwgKTsKCgkJLy8gUHJvZ3Jlc3MgYmFyCgkJZG9tLnByb2dyZXNzID0gY3JlYXRlU2luZ2xldG9uTm9kZSggZG9tLndyYXBwZXIsICdkaXYnLCAncHJvZ3Jlc3MnLCAnPHNwYW4+PC9zcGFuPicgKTsKCQlkb20ucHJvZ3Jlc3NiYXIgPSBkb20ucHJvZ3Jlc3MucXVlcnlTZWxlY3RvciggJ3NwYW4nICk7CgoJCS8vIEFycm93IGNvbnRyb2xzCgkJZG9tLmNvbnRyb2xzID0gY3JlYXRlU2luZ2xldG9uTm9kZSggZG9tLndyYXBwZXIsICdhc2lkZScsICdjb250cm9scycsCgkJCSc8YnV0dG9uIGNsYXNzPSJuYXZpZ2F0ZS1sZWZ0IiBhcmlhLWxhYmVsPSJwcmV2aW91cyBzbGlkZSI+PGRpdiBjbGFzcz0iY29udHJvbHMtYXJyb3ciPjwvZGl2PjwvYnV0dG9uPicgKwoJCQknPGJ1dHRvbiBjbGFzcz0ibmF2aWdhdGUtcmlnaHQiIGFyaWEtbGFiZWw9Im5leHQgc2xpZGUiPjxkaXYgY2xhc3M9ImNvbnRyb2xzLWFycm93Ij48L2Rpdj48L2J1dHRvbj4nICsKCQkJJzxidXR0b24gY2xhc3M9Im5hdmlnYXRlLXVwIiBhcmlhLWxhYmVsPSJhYm92ZSBzbGlkZSI+PGRpdiBjbGFzcz0iY29udHJvbHMtYXJyb3ciPjwvZGl2PjwvYnV0dG9uPicgKwoJCQknPGJ1dHRvbiBjbGFzcz0ibmF2aWdhdGUtZG93biIgYXJpYS1sYWJlbD0iYmVsb3cgc2xpZGUiPjxkaXYgY2xhc3M9ImNvbnRyb2xzLWFycm93Ij48L2Rpdj48L2J1dHRvbj4nICk7CgoJCS8vIFNsaWRlIG51bWJlcgoJCWRvbS5zbGlkZU51bWJlciA9IGNyZWF0ZVNpbmdsZXRvbk5vZGUoIGRvbS53cmFwcGVyLCAnZGl2JywgJ3NsaWRlLW51bWJlcicsICcnICk7CgoJCS8vIEVsZW1lbnQgY29udGFpbmluZyBub3RlcyB0aGF0IGFyZSB2aXNpYmxlIHRvIHRoZSBhdWRpZW5jZQoJCWRvbS5zcGVha2VyTm90ZXMgPSBjcmVhdGVTaW5nbGV0b25Ob2RlKCBkb20ud3JhcHBlciwgJ2RpdicsICdzcGVha2VyLW5vdGVzJywgbnVsbCApOwoJCWRvbS5zcGVha2VyTm90ZXMuc2V0QXR0cmlidXRlKCAnZGF0YS1wcmV2ZW50LXN3aXBlJywgJycgKTsKCQlkb20uc3BlYWtlck5vdGVzLnNldEF0dHJpYnV0ZSggJ3RhYmluZGV4JywgJzAnICk7CgoJCS8vIE92ZXJsYXkgZ3JhcGhpYyB3aGljaCBpcyBkaXNwbGF5ZWQgZHVyaW5nIHRoZSBwYXVzZWQgbW9kZQoJCWRvbS5wYXVzZU92ZXJsYXkgPSBjcmVhdGVTaW5nbGV0b25Ob2RlKCBkb20ud3JhcHBlciwgJ2RpdicsICdwYXVzZS1vdmVybGF5JywgY29uZmlnLmNvbnRyb2xzID8gJzxidXR0b24gY2xhc3M9InJlc3VtZS1idXR0b24iPlJlc3VtZSBwcmVzZW50YXRpb248L2J1dHRvbj4nIDogbnVsbCApOwoKCQlkb20ud3JhcHBlci5zZXRBdHRyaWJ1dGUoICdyb2xlJywgJ2FwcGxpY2F0aW9uJyApOwoKCQkvLyBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGNvbnRyb2xzIHRocm91Z2hvdXQgdGhlIHBhZ2UKCQlkb20uY29udHJvbHNMZWZ0ID0gdG9BcnJheSggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5uYXZpZ2F0ZS1sZWZ0JyApICk7CgkJZG9tLmNvbnRyb2xzUmlnaHQgPSB0b0FycmF5KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLm5hdmlnYXRlLXJpZ2h0JyApICk7CgkJZG9tLmNvbnRyb2xzVXAgPSB0b0FycmF5KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLm5hdmlnYXRlLXVwJyApICk7CgkJZG9tLmNvbnRyb2xzRG93biA9IHRvQXJyYXkoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICcubmF2aWdhdGUtZG93bicgKSApOwoJCWRvbS5jb250cm9sc1ByZXYgPSB0b0FycmF5KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLm5hdmlnYXRlLXByZXYnICkgKTsKCQlkb20uY29udHJvbHNOZXh0ID0gdG9BcnJheSggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5uYXZpZ2F0ZS1uZXh0JyApICk7CgoJCS8vIFRoZSByaWdodCBhbmQgZG93biBhcnJvd3MgaW4gdGhlIHN0YW5kYXJkIHJldmVhbC5qcyBjb250cm9scwoJCWRvbS5jb250cm9sc1JpZ2h0QXJyb3cgPSBkb20uY29udHJvbHMucXVlcnlTZWxlY3RvciggJy5uYXZpZ2F0ZS1yaWdodCcgKTsKCQlkb20uY29udHJvbHNEb3duQXJyb3cgPSBkb20uY29udHJvbHMucXVlcnlTZWxlY3RvciggJy5uYXZpZ2F0ZS1kb3duJyApOwoKCQlkb20uc3RhdHVzRGl2ID0gY3JlYXRlU3RhdHVzRGl2KCk7Cgl9CgoJLyoqCgkgKiBDcmVhdGVzIGEgaGlkZGVuIGRpdiB3aXRoIHJvbGUgYXJpYS1saXZlIHRvIGFubm91bmNlIHRoZQoJICogY3VycmVudCBzbGlkZSBjb250ZW50LiBIaWRlIHRoZSBkaXYgb2ZmLXNjcmVlbiB0byBtYWtlIGl0CgkgKiBhdmFpbGFibGUgb25seSB0byBBc3Npc3RpdmUgVGVjaG5vbG9naWVzLgoJICoKCSAqIEByZXR1cm4ge0hUTUxFbGVtZW50fQoJICovCglmdW5jdGlvbiBjcmVhdGVTdGF0dXNEaXYoKSB7CgoJCXZhciBzdGF0dXNEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2FyaWEtc3RhdHVzLWRpdicgKTsKCQlpZiggIXN0YXR1c0RpdiApIHsKCQkJc3RhdHVzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTsKCQkJc3RhdHVzRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKCQkJc3RhdHVzRGl2LnN0eWxlLmhlaWdodCA9ICcxcHgnOwoJCQlzdGF0dXNEaXYuc3R5bGUud2lkdGggPSAnMXB4JzsKCQkJc3RhdHVzRGl2LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CgkJCXN0YXR1c0Rpdi5zdHlsZS5jbGlwID0gJ3JlY3QoIDFweCwgMXB4LCAxcHgsIDFweCApJzsKCQkJc3RhdHVzRGl2LnNldEF0dHJpYnV0ZSggJ2lkJywgJ2FyaWEtc3RhdHVzLWRpdicgKTsKCQkJc3RhdHVzRGl2LnNldEF0dHJpYnV0ZSggJ2FyaWEtbGl2ZScsICdwb2xpdGUnICk7CgkJCXN0YXR1c0Rpdi5zZXRBdHRyaWJ1dGUoICdhcmlhLWF0b21pYycsJ3RydWUnICk7CgkJCWRvbS53cmFwcGVyLmFwcGVuZENoaWxkKCBzdGF0dXNEaXYgKTsKCQl9CgkJcmV0dXJuIHN0YXR1c0RpdjsKCgl9CgoJLyoqCgkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gSFRNTCBlbGVtZW50IGludG8gYSBzdHJpbmcgb2YgdGV4dAoJICogdGhhdCBjYW4gYmUgYW5ub3VuY2VkIHRvIGEgc2NyZWVuIHJlYWRlci4gSGlkZGVuCgkgKiBlbGVtZW50cyBhcmUgZXhjbHVkZWQuCgkgKi8KCWZ1bmN0aW9uIGdldFN0YXR1c1RleHQoIG5vZGUgKSB7CgoJCXZhciB0ZXh0ID0gJyc7CgoJCS8vIFRleHQgbm9kZQoJCWlmKCBub2RlLm5vZGVUeXBlID09PSAzICkgewoJCQl0ZXh0ICs9IG5vZGUudGV4dENvbnRlbnQ7CgkJfQoJCS8vIEVsZW1lbnQgbm9kZQoJCWVsc2UgaWYoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CgoJCQl2YXIgaXNBcmlhSGlkZGVuID0gbm9kZS5nZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicgKTsKCQkJdmFyIGlzRGlzcGxheUhpZGRlbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBub2RlIClbJ2Rpc3BsYXknXSA9PT0gJ25vbmUnOwoJCQlpZiggaXNBcmlhSGlkZGVuICE9PSAndHJ1ZScgJiYgIWlzRGlzcGxheUhpZGRlbiApIHsKCgkJCQl0b0FycmF5KCBub2RlLmNoaWxkTm9kZXMgKS5mb3JFYWNoKCBmdW5jdGlvbiggY2hpbGQgKSB7CgkJCQkJdGV4dCArPSBnZXRTdGF0dXNUZXh0KCBjaGlsZCApOwoJCQkJfSApOwoKCQkJfQoKCQl9CgoJCXJldHVybiB0ZXh0OwoKCX0KCgkvKioKCSAqIENvbmZpZ3VyZXMgdGhlIHByZXNlbnRhdGlvbiBmb3IgcHJpbnRpbmcgdG8gYSBzdGF0aWMKCSAqIFBERi4KCSAqLwoJZnVuY3Rpb24gc2V0dXBQREYoKSB7CgoJCXZhciBzbGlkZVNpemUgPSBnZXRDb21wdXRlZFNsaWRlU2l6ZSggd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCApOwoKCQkvLyBEaW1lbnNpb25zIG9mIHRoZSBQREYgcGFnZXMKCQl2YXIgcGFnZVdpZHRoID0gTWF0aC5mbG9vciggc2xpZGVTaXplLndpZHRoICogKCAxICsgY29uZmlnLm1hcmdpbiApICksCgkJCXBhZ2VIZWlnaHQgPSBNYXRoLmZsb29yKCBzbGlkZVNpemUuaGVpZ2h0ICogKCAxICsgY29uZmlnLm1hcmdpbiApICk7CgoJCS8vIERpbWVuc2lvbnMgb2Ygc2xpZGVzIHdpdGhpbiB0aGUgcGFnZXMKCQl2YXIgc2xpZGVXaWR0aCA9IHNsaWRlU2l6ZS53aWR0aCwKCQkJc2xpZGVIZWlnaHQgPSBzbGlkZVNpemUuaGVpZ2h0OwoKCQkvLyBMZXQgdGhlIGJyb3dzZXIga25vdyB3aGF0IHBhZ2Ugc2l6ZSB3ZSB3YW50IHRvIHByaW50CgkJaW5qZWN0U3R5bGVTaGVldCggJ0BwYWdle3NpemU6JysgcGFnZVdpZHRoICsncHggJysgcGFnZUhlaWdodCArJ3B4OyBtYXJnaW46IDBweDt9JyApOwoKCQkvLyBMaW1pdCB0aGUgc2l6ZSBvZiBjZXJ0YWluIGVsZW1lbnRzIHRvIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBzbGlkZQoJCWluamVjdFN0eWxlU2hlZXQoICcucmV2ZWFsIHNlY3Rpb24+aW1nLCAucmV2ZWFsIHNlY3Rpb24+dmlkZW8sIC5yZXZlYWwgc2VjdGlvbj5pZnJhbWV7bWF4LXdpZHRoOiAnKyBzbGlkZVdpZHRoICsncHg7IG1heC1oZWlnaHQ6Jysgc2xpZGVIZWlnaHQgKydweH0nICk7CgoJCWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCggJ3ByaW50LXBkZicgKTsKCQlkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gcGFnZVdpZHRoICsgJ3B4JzsKCQlkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodCA9IHBhZ2VIZWlnaHQgKyAncHgnOwoKCQkvLyBNYWtlIHN1cmUgc3RyZXRjaCBlbGVtZW50cyBmaXQgb24gc2xpZGUKCQlsYXlvdXRTbGlkZUNvbnRlbnRzKCBzbGlkZVdpZHRoLCBzbGlkZUhlaWdodCApOwoKCQkvLyBDb21wdXRlIHNsaWRlIG51bWJlcnMgbm93LCBiZWZvcmUgd2Ugc3RhcnQgZHVwbGljYXRpbmcgc2xpZGVzCgkJdmFyIGRvaW5nU2xpZGVOdW1iZXJzID0gY29uZmlnLnNsaWRlTnVtYmVyICYmIC9hbGx8cHJpbnQvaS50ZXN0KCBjb25maWcuc2hvd1NsaWRlTnVtYmVyICk7CgkJdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggU0xJREVTX1NFTEVDVE9SICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggc2xpZGUgKSB7CgkJCXNsaWRlLnNldEF0dHJpYnV0ZSggJ2RhdGEtc2xpZGUtbnVtYmVyJywgZ2V0U2xpZGVOdW1iZXIoIHNsaWRlICkgKTsKCQl9ICk7CgoJCS8vIFNsaWRlIGFuZCBzbGlkZSBiYWNrZ3JvdW5kIGxheW91dAoJCXRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIFNMSURFU19TRUxFQ1RPUiApICkuZm9yRWFjaCggZnVuY3Rpb24oIHNsaWRlICkgewoKCQkJLy8gVmVydGljYWwgc3RhY2tzIGFyZSBub3QgY2VudHJlZCBzaW5jZSB0aGVpciBzZWN0aW9uCgkJCS8vIGNoaWxkcmVuIHdpbGwgYmUKCQkJaWYoIHNsaWRlLmNsYXNzTGlzdC5jb250YWlucyggJ3N0YWNrJyApID09PSBmYWxzZSApIHsKCQkJCS8vIENlbnRlciB0aGUgc2xpZGUgaW5zaWRlIG9mIHRoZSBwYWdlLCBnaXZpbmcgdGhlIHNsaWRlIHNvbWUgbWFyZ2luCgkJCQl2YXIgbGVmdCA9ICggcGFnZVdpZHRoIC0gc2xpZGVXaWR0aCApIC8gMiwKCQkJCQl0b3AgPSAoIHBhZ2VIZWlnaHQgLSBzbGlkZUhlaWdodCApIC8gMjsKCgkJCQl2YXIgY29udGVudEhlaWdodCA9IHNsaWRlLnNjcm9sbEhlaWdodDsKCQkJCXZhciBudW1iZXJPZlBhZ2VzID0gTWF0aC5tYXgoIE1hdGguY2VpbCggY29udGVudEhlaWdodCAvIHBhZ2VIZWlnaHQgKSwgMSApOwoKCQkJCS8vIEFkaGVyZSB0byBjb25maWd1cmVkIHBhZ2VzIHBlciBzbGlkZSBsaW1pdAoJCQkJbnVtYmVyT2ZQYWdlcyA9IE1hdGgubWluKCBudW1iZXJPZlBhZ2VzLCBjb25maWcucGRmTWF4UGFnZXNQZXJTbGlkZSApOwoKCQkJCS8vIENlbnRlciBzbGlkZXMgdmVydGljYWxseQoJCQkJaWYoIG51bWJlck9mUGFnZXMgPT09IDEgJiYgY29uZmlnLmNlbnRlciB8fCBzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoICdjZW50ZXInICkgKSB7CgkJCQkJdG9wID0gTWF0aC5tYXgoICggcGFnZUhlaWdodCAtIGNvbnRlbnRIZWlnaHQgKSAvIDIsIDAgKTsKCQkJCX0KCgkJCQkvLyBXcmFwIHRoZSBzbGlkZSBpbiBhIHBhZ2UgZWxlbWVudCBhbmQgaGlkZSBpdHMgb3ZlcmZsb3cKCQkJCS8vIHNvIHRoYXQgbm8gcGFnZSBldmVyIGZsb3dzIG9udG8gYW5vdGhlcgoJCQkJdmFyIHBhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApOwoJCQkJcGFnZS5jbGFzc05hbWUgPSAncGRmLXBhZ2UnOwoJCQkJcGFnZS5zdHlsZS5oZWlnaHQgPSAoICggcGFnZUhlaWdodCArIGNvbmZpZy5wZGZQYWdlSGVpZ2h0T2Zmc2V0ICkgKiBudW1iZXJPZlBhZ2VzICkgKyAncHgnOwoJCQkJc2xpZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIHBhZ2UsIHNsaWRlICk7CgkJCQlwYWdlLmFwcGVuZENoaWxkKCBzbGlkZSApOwoKCQkJCS8vIFBvc2l0aW9uIHRoZSBzbGlkZSBpbnNpZGUgb2YgdGhlIHBhZ2UKCQkJCXNsaWRlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JzsKCQkJCXNsaWRlLnN0eWxlLnRvcCA9IHRvcCArICdweCc7CgkJCQlzbGlkZS5zdHlsZS53aWR0aCA9IHNsaWRlV2lkdGggKyAncHgnOwoKCQkJCWlmKCBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50ICkgewoJCQkJCXBhZ2UuaW5zZXJ0QmVmb3JlKCBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50LCBzbGlkZSApOwoJCQkJfQoKCQkJCS8vIEluamVjdCBub3RlcyBpZiBgc2hvd05vdGVzYCBpcyBlbmFibGVkCgkJCQlpZiggY29uZmlnLnNob3dOb3RlcyApIHsKCgkJCQkJLy8gQXJlIHRoZXJlIG5vdGVzIGZvciB0aGlzIHNsaWRlPwoJCQkJCXZhciBub3RlcyA9IGdldFNsaWRlTm90ZXMoIHNsaWRlICk7CgkJCQkJaWYoIG5vdGVzICkgewoKCQkJCQkJdmFyIG5vdGVzU3BhY2luZyA9IDg7CgkJCQkJCXZhciBub3Rlc0xheW91dCA9IHR5cGVvZiBjb25maWcuc2hvd05vdGVzID09PSAnc3RyaW5nJyA/IGNvbmZpZy5zaG93Tm90ZXMgOiAnaW5saW5lJzsKCQkJCQkJdmFyIG5vdGVzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgkJCQkJCW5vdGVzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnc3BlYWtlci1ub3RlcycgKTsKCQkJCQkJbm90ZXNFbGVtZW50LmNsYXNzTGlzdC5hZGQoICdzcGVha2VyLW5vdGVzLXBkZicgKTsKCQkJCQkJbm90ZXNFbGVtZW50LnNldEF0dHJpYnV0ZSggJ2RhdGEtbGF5b3V0Jywgbm90ZXNMYXlvdXQgKTsKCQkJCQkJbm90ZXNFbGVtZW50LmlubmVySFRNTCA9IG5vdGVzOwoKCQkJCQkJaWYoIG5vdGVzTGF5b3V0ID09PSAnc2VwYXJhdGUtcGFnZScgKSB7CgkJCQkJCQlwYWdlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBub3Rlc0VsZW1lbnQsIHBhZ2UubmV4dFNpYmxpbmcgKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCW5vdGVzRWxlbWVudC5zdHlsZS5sZWZ0ID0gbm90ZXNTcGFjaW5nICsgJ3B4JzsKCQkJCQkJCW5vdGVzRWxlbWVudC5zdHlsZS5ib3R0b20gPSBub3Rlc1NwYWNpbmcgKyAncHgnOwoJCQkJCQkJbm90ZXNFbGVtZW50LnN0eWxlLndpZHRoID0gKCBwYWdlV2lkdGggLSBub3Rlc1NwYWNpbmcqMiApICsgJ3B4JzsKCQkJCQkJCXBhZ2UuYXBwZW5kQ2hpbGQoIG5vdGVzRWxlbWVudCApOwoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQkJLy8gSW5qZWN0IHNsaWRlIG51bWJlcnMgaWYgYHNsaWRlTnVtYmVyc2AgYXJlIGVuYWJsZWQKCQkJCWlmKCBkb2luZ1NsaWRlTnVtYmVycyApIHsKCQkJCQl2YXIgbnVtYmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgkJCQkJbnVtYmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnc2xpZGUtbnVtYmVyJyApOwoJCQkJCW51bWJlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ3NsaWRlLW51bWJlci1wZGYnICk7CgkJCQkJbnVtYmVyRWxlbWVudC5pbm5lckhUTUwgPSBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLXNsaWRlLW51bWJlcicgKTsKCQkJCQlwYWdlLmFwcGVuZENoaWxkKCBudW1iZXJFbGVtZW50ICk7CgkJCQl9CgoJCQkJLy8gQ29weSBwYWdlIGFuZCBzaG93IGZyYWdtZW50cyBvbmUgYWZ0ZXIgYW5vdGhlcgoJCQkJaWYoIGNvbmZpZy5wZGZTZXBhcmF0ZUZyYWdtZW50cyApIHsKCgkJCQkJLy8gRWFjaCBmcmFnbWVudCAnZ3JvdXAnIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgb25lIG9yIG1vcmUKCQkJCQkvLyBmcmFnbWVudHMuIE11bHRpcGxlIGZyYWdtZW50cyB0aGF0IGFwcGVhciBhdCB0aGUgc2FtZSB0aW1lCgkJCQkJLy8gYXJlIHBhcnQgb2YgdGhlIHNhbWUgZ3JvdXAuCgkJCQkJdmFyIGZyYWdtZW50R3JvdXBzID0gc29ydEZyYWdtZW50cyggcGFnZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApLCB0cnVlICk7CgoJCQkJCXZhciBwcmV2aW91c0ZyYWdtZW50U3RlcDsKCQkJCQl2YXIgcHJldmlvdXNQYWdlOwoKCQkJCQlmcmFnbWVudEdyb3Vwcy5mb3JFYWNoKCBmdW5jdGlvbiggZnJhZ21lbnRzICkgewoKCQkJCQkJLy8gUmVtb3ZlICdjdXJyZW50LWZyYWdtZW50JyBmcm9tIHRoZSBwcmV2aW91cyBncm91cAoJCQkJCQlpZiggcHJldmlvdXNGcmFnbWVudFN0ZXAgKSB7CgkJCQkJCQlwcmV2aW91c0ZyYWdtZW50U3RlcC5mb3JFYWNoKCBmdW5jdGlvbiggZnJhZ21lbnQgKSB7CgkJCQkJCQkJZnJhZ21lbnQuY2xhc3NMaXN0LnJlbW92ZSggJ2N1cnJlbnQtZnJhZ21lbnQnICk7CgkJCQkJCQl9ICk7CgkJCQkJCX0KCgkJCQkJCS8vIFNob3cgdGhlIGZyYWdtZW50cyBmb3IgdGhlIGN1cnJlbnQgaW5kZXgKCQkJCQkJZnJhZ21lbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBmcmFnbWVudCApIHsKCQkJCQkJCWZyYWdtZW50LmNsYXNzTGlzdC5hZGQoICd2aXNpYmxlJywgJ2N1cnJlbnQtZnJhZ21lbnQnICk7CgkJCQkJCX0gKTsKCgkJCQkJCS8vIENyZWF0ZSBhIHNlcGFyYXRlIHBhZ2UgZm9yIHRoZSBjdXJyZW50IGZyYWdtZW50IHN0YXRlCgkJCQkJCXZhciBjbG9uZWRQYWdlID0gcGFnZS5jbG9uZU5vZGUoIHRydWUgKTsKCQkJCQkJcGFnZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggY2xvbmVkUGFnZSwgKCBwcmV2aW91c1BhZ2UgfHwgcGFnZSApLm5leHRTaWJsaW5nICk7CgoJCQkJCQlwcmV2aW91c0ZyYWdtZW50U3RlcCA9IGZyYWdtZW50czsKCQkJCQkJcHJldmlvdXNQYWdlID0gY2xvbmVkUGFnZTsKCgkJCQkJfSApOwoKCQkJCQkvLyBSZXNldCB0aGUgZmlyc3Qvb3JpZ2luYWwgcGFnZSBzbyB0aGF0IGFsbCBmcmFnbWVudHMgYXJlIGhpZGRlbgoJCQkJCWZyYWdtZW50R3JvdXBzLmZvckVhY2goIGZ1bmN0aW9uKCBmcmFnbWVudHMgKSB7CgkJCQkJCWZyYWdtZW50cy5mb3JFYWNoKCBmdW5jdGlvbiggZnJhZ21lbnQgKSB7CgkJCQkJCQlmcmFnbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAndmlzaWJsZScsICdjdXJyZW50LWZyYWdtZW50JyApOwoJCQkJCQl9ICk7CgkJCQkJfSApOwoKCQkJCX0KCQkJCS8vIFNob3cgYWxsIGZyYWdtZW50cwoJCQkJZWxzZSB7CgkJCQkJdG9BcnJheSggcGFnZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50Om5vdCguZmFkZS1vdXQpJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGZyYWdtZW50ICkgewoJCQkJCQlmcmFnbWVudC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKTsKCQkJCQl9ICk7CgkJCQl9CgoJCQl9CgoJCX0gKTsKCgkJLy8gTm90aWZ5IHN1YnNjcmliZXJzIHRoYXQgdGhlIFBERiBsYXlvdXQgaXMgZ29vZCB0byBnbwoJCWRpc3BhdGNoRXZlbnQoICdwZGYtcmVhZHknICk7CgoJfQoKCS8qKgoJICogVGhpcyBpcyBhbiB1bmZvcnR1bmF0ZSBuZWNlc3NpdHkuIFNvbWUgYWN0aW9ucyDigJMgc3VjaCBhcwoJICogYW4gaW5wdXQgZmllbGQgYmVpbmcgZm9jdXNlZCBpbiBhbiBpZnJhbWUgb3IgdXNpbmcgdGhlCgkgKiBrZXlib2FyZCB0byBleHBhbmQgdGV4dCBzZWxlY3Rpb24gYmV5b25kIHRoZSBib3VuZHMgb2YKCSAqIGEgc2xpZGUg4oCTIGNhbiB0cmlnZ2VyIG91ciBjb250ZW50IHRvIGJlIHB1c2hlZCBvdXQgb2Ygdmlldy4KCSAqIFRoaXMgc2Nyb2xsaW5nIGNhbiBub3QgYmUgcHJldmVudGVkIGJ5IGhpZGluZyBvdmVyZmxvdyBpbgoJICogQ1NTICh3ZSBhbHJlYWR5IGRvKSBzbyB3ZSBoYXZlIHRvIHJlc29ydCB0byByZXBlYXRlZGx5CgkgKiBjaGVja2luZyBpZiB0aGUgc2xpZGVzIGhhdmUgYmVlbiBvZmZzZXQgOigKCSAqLwoJZnVuY3Rpb24gc2V0dXBTY3JvbGxQcmV2ZW50aW9uKCkgewoKCQlzZXRJbnRlcnZhbCggZnVuY3Rpb24oKSB7CgkJCWlmKCBkb20ud3JhcHBlci5zY3JvbGxUb3AgIT09IDAgfHwgZG9tLndyYXBwZXIuc2Nyb2xsTGVmdCAhPT0gMCApIHsKCQkJCWRvbS53cmFwcGVyLnNjcm9sbFRvcCA9IDA7CgkJCQlkb20ud3JhcHBlci5zY3JvbGxMZWZ0ID0gMDsKCQkJfQoJCX0sIDEwMDAgKTsKCgl9CgoJLyoqCgkgKiBDcmVhdGVzIGFuIEhUTUwgZWxlbWVudCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdC4KCSAqIElmIHRoZSBlbGVtZW50IGFscmVhZHkgZXhpc3RzIHRoZSBleGlzdGluZyBpbnN0YW5jZSB3aWxsCgkgKiBiZSByZXR1cm5lZC4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIKCSAqIEBwYXJhbSB7c3RyaW5nfSB0YWduYW1lCgkgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lCgkgKiBAcGFyYW0ge3N0cmluZ30gaW5uZXJIVE1MCgkgKgoJICogQHJldHVybiB7SFRNTEVsZW1lbnR9CgkgKi8KCWZ1bmN0aW9uIGNyZWF0ZVNpbmdsZXRvbk5vZGUoIGNvbnRhaW5lciwgdGFnbmFtZSwgY2xhc3NuYW1lLCBpbm5lckhUTUwgKSB7CgoJCS8vIEZpbmQgYWxsIG5vZGVzIG1hdGNoaW5nIHRoZSBkZXNjcmlwdGlvbgoJCXZhciBub2RlcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCAnLicgKyBjbGFzc25hbWUgKTsKCgkJLy8gQ2hlY2sgYWxsIG1hdGNoZXMgdG8gZmluZCBvbmUgd2hpY2ggaXMgYSBkaXJlY3QgY2hpbGQgb2YKCQkvLyB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lcgoJCWZvciggdmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKysgKSB7CgkJCXZhciB0ZXN0Tm9kZSA9IG5vZGVzW2ldOwoJCQlpZiggdGVzdE5vZGUucGFyZW50Tm9kZSA9PT0gY29udGFpbmVyICkgewoJCQkJcmV0dXJuIHRlc3ROb2RlOwoJCQl9CgkJfQoKCQkvLyBJZiBubyBub2RlIHdhcyBmb3VuZCwgY3JlYXRlIGl0IG5vdwoJCXZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggdGFnbmFtZSApOwoJCW5vZGUuY2xhc3NOYW1lID0gY2xhc3NuYW1lOwoJCWlmKCB0eXBlb2YgaW5uZXJIVE1MID09PSAnc3RyaW5nJyApIHsKCQkJbm9kZS5pbm5lckhUTUwgPSBpbm5lckhUTUw7CgkJfQoJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCggbm9kZSApOwoKCQlyZXR1cm4gbm9kZTsKCgl9CgoJLyoqCgkgKiBDcmVhdGVzIHRoZSBzbGlkZSBiYWNrZ3JvdW5kIGVsZW1lbnRzIGFuZCBhcHBlbmRzIHRoZW0KCSAqIHRvIHRoZSBiYWNrZ3JvdW5kIGNvbnRhaW5lci4gT25lIGVsZW1lbnQgaXMgY3JlYXRlZCBwZXIKCSAqIHNsaWRlIG5vIG1hdHRlciBpZiB0aGUgZ2l2ZW4gc2xpZGUgaGFzIHZpc2libGUgYmFja2dyb3VuZC4KCSAqLwoJZnVuY3Rpb24gY3JlYXRlQmFja2dyb3VuZHMoKSB7CgoJCXZhciBwcmludE1vZGUgPSBpc1ByaW50aW5nUERGKCk7CgoJCS8vIENsZWFyIHByaW9yIGJhY2tncm91bmRzCgkJZG9tLmJhY2tncm91bmQuaW5uZXJIVE1MID0gJyc7CgkJZG9tLmJhY2tncm91bmQuY2xhc3NMaXN0LmFkZCggJ25vLXRyYW5zaXRpb24nICk7CgoJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgaG9yaXpvbnRhbCBzbGlkZXMKCQl0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApICkuZm9yRWFjaCggZnVuY3Rpb24oIHNsaWRlaCApIHsKCgkJCXZhciBiYWNrZ3JvdW5kU3RhY2sgPSBjcmVhdGVCYWNrZ3JvdW5kKCBzbGlkZWgsIGRvbS5iYWNrZ3JvdW5kICk7CgoJCQkvLyBJdGVyYXRlIG92ZXIgYWxsIHZlcnRpY2FsIHNsaWRlcwoJCQl0b0FycmF5KCBzbGlkZWgucXVlcnlTZWxlY3RvckFsbCggJ3NlY3Rpb24nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggc2xpZGV2ICkgewoKCQkJCWNyZWF0ZUJhY2tncm91bmQoIHNsaWRldiwgYmFja2dyb3VuZFN0YWNrICk7CgoJCQkJYmFja2dyb3VuZFN0YWNrLmNsYXNzTGlzdC5hZGQoICdzdGFjaycgKTsKCgkJCX0gKTsKCgkJfSApOwoKCQkvLyBBZGQgcGFyYWxsYXggYmFja2dyb3VuZCBpZiBzcGVjaWZpZWQKCQlpZiggY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZEltYWdlICkgewoKCQkJZG9tLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3VybCgiJyArIGNvbmZpZy5wYXJhbGxheEJhY2tncm91bmRJbWFnZSArICciKSc7CgkJCWRvbS5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRTaXplID0gY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZFNpemU7CgkJCWRvbS5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRSZXBlYXQgPSBjb25maWcucGFyYWxsYXhCYWNrZ3JvdW5kUmVwZWF0OwoJCQlkb20uYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSBjb25maWcucGFyYWxsYXhCYWNrZ3JvdW5kUG9zaXRpb247CgoJCQkvLyBNYWtlIHN1cmUgdGhlIGJlbG93IHByb3BlcnRpZXMgYXJlIHNldCBvbiB0aGUgZWxlbWVudCAtIHRoZXNlIHByb3BlcnRpZXMgYXJlCgkJCS8vIG5lZWRlZCBmb3IgcHJvcGVyIHRyYW5zaXRpb25zIHRvIGJlIHNldCBvbiB0aGUgZWxlbWVudCB2aWEgQ1NTLiBUbyByZW1vdmUKCQkJLy8gYW5ub3lpbmcgYmFja2dyb3VuZCBzbGlkZS1pbiBlZmZlY3Qgd2hlbiB0aGUgcHJlc2VudGF0aW9uIHN0YXJ0cywgYXBwbHkKCQkJLy8gdGhlc2UgcHJvcGVydGllcyBhZnRlciBzaG9ydCB0aW1lIGRlbGF5CgkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LmFkZCggJ2hhcy1wYXJhbGxheC1iYWNrZ3JvdW5kJyApOwoJCQl9LCAxICk7CgoJCX0KCQllbHNlIHsKCgkJCWRvbS5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICcnOwoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAnaGFzLXBhcmFsbGF4LWJhY2tncm91bmQnICk7CgoJCX0KCgl9CgoJLyoqCgkgKiBDcmVhdGVzIGEgYmFja2dyb3VuZCBmb3IgdGhlIGdpdmVuIHNsaWRlLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNsaWRlCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgVGhlIGVsZW1lbnQgdGhhdCB0aGUgYmFja2dyb3VuZAoJICogc2hvdWxkIGJlIGFwcGVuZGVkIHRvCgkgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gTmV3IGJhY2tncm91bmQgZGl2CgkgKi8KCWZ1bmN0aW9uIGNyZWF0ZUJhY2tncm91bmQoIHNsaWRlLCBjb250YWluZXIgKSB7CgoKCQkvLyBNYWluIHNsaWRlIGJhY2tncm91bmQgZWxlbWVudAoJCXZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTsKCQllbGVtZW50LmNsYXNzTmFtZSA9ICdzbGlkZS1iYWNrZ3JvdW5kICcgKyBzbGlkZS5jbGFzc05hbWUucmVwbGFjZSggL3ByZXNlbnR8cGFzdHxmdXR1cmUvLCAnJyApOwoKCQkvLyBJbm5lciBiYWNrZ3JvdW5kIGVsZW1lbnQgdGhhdCB3cmFwcyBpbWFnZXMvdmlkZW9zL2lmcmFtZXMKCQl2YXIgY29udGVudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApOwoJCWNvbnRlbnRFbGVtZW50LmNsYXNzTmFtZSA9ICdzbGlkZS1iYWNrZ3JvdW5kLWNvbnRlbnQnOwoKCQllbGVtZW50LmFwcGVuZENoaWxkKCBjb250ZW50RWxlbWVudCApOwoJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCggZWxlbWVudCApOwoKCQlzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50ID0gZWxlbWVudDsKCQlzbGlkZS5zbGlkZUJhY2tncm91bmRDb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwoKCQkvLyBTeW5jcyB0aGUgYmFja2dyb3VuZCB0byByZWZsZWN0IGFsbCBjdXJyZW50IGJhY2tncm91bmQgc2V0dGluZ3MKCQlzeW5jQmFja2dyb3VuZCggc2xpZGUgKTsKCgkJcmV0dXJuIGVsZW1lbnQ7CgoJfQoKCS8qKgoJICogUmVuZGVycyBhbGwgb2YgdGhlIHZpc3VhbCBwcm9wZXJ0aWVzIG9mIGEgc2xpZGUgYmFja2dyb3VuZAoJICogYmFzZWQgb24gdGhlIHZhcmlvdXMgYmFja2dyb3VuZCBhdHRyaWJ1dGVzLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNsaWRlCgkgKi8KCWZ1bmN0aW9uIHN5bmNCYWNrZ3JvdW5kKCBzbGlkZSApIHsKCgkJdmFyIGVsZW1lbnQgPSBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50LAoJCQljb250ZW50RWxlbWVudCA9IHNsaWRlLnNsaWRlQmFja2dyb3VuZENvbnRlbnRFbGVtZW50OwoKCQkvLyBSZXNldCB0aGUgcHJpb3IgYmFja2dyb3VuZCBzdGF0ZSBpbiBjYXNlIHRoaXMgaXMgbm90IHRoZQoJCS8vIGluaXRpYWwgc3luYwoJCXNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoICdoYXMtZGFyay1iYWNrZ3JvdW5kJyApOwoJCXNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoICdoYXMtbGlnaHQtYmFja2dyb3VuZCcgKTsKCgkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoICdkYXRhLWxvYWRlZCcgKTsKCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1oYXNoJyApOwoJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXNpemUnICk7CgkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtdHJhbnNpdGlvbicgKTsKCQllbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcnOwoKCQljb250ZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9ICcnOwoJCWNvbnRlbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRSZXBlYXQgPSAnJzsKCQljb250ZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSAnJzsKCQljb250ZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJzsKCQljb250ZW50RWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJyc7CgkJY29udGVudEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgoJCXZhciBkYXRhID0gewoJCQliYWNrZ3JvdW5kOiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQnICksCgkJCWJhY2tncm91bmRTaXplOiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtc2l6ZScgKSwKCQkJYmFja2dyb3VuZEltYWdlOiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaW1hZ2UnICksCgkJCWJhY2tncm91bmRWaWRlbzogc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXZpZGVvJyApLAoJCQliYWNrZ3JvdW5kSWZyYW1lOiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaWZyYW1lJyApLAoJCQliYWNrZ3JvdW5kQ29sb3I6IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1jb2xvcicgKSwKCQkJYmFja2dyb3VuZFJlcGVhdDogc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXJlcGVhdCcgKSwKCQkJYmFja2dyb3VuZFBvc2l0aW9uOiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtcG9zaXRpb24nICksCgkJCWJhY2tncm91bmRUcmFuc2l0aW9uOiBzbGlkZS5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtdHJhbnNpdGlvbicgKSwKCQkJYmFja2dyb3VuZE9wYWNpdHk6IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1vcGFjaXR5JyApCgkJfTsKCgkJaWYoIGRhdGEuYmFja2dyb3VuZCApIHsKCQkJLy8gQXV0by13cmFwIGltYWdlIHVybHMgaW4gdXJsKC4uLikKCQkJaWYoIC9eKGh0dHB8ZmlsZXxcL1wvKS9naS50ZXN0KCBkYXRhLmJhY2tncm91bmQgKSB8fCAvXC4oc3ZnfHBuZ3xqcGd8anBlZ3xnaWZ8Ym1wKShbPyNcc118JCkvZ2kudGVzdCggZGF0YS5iYWNrZ3JvdW5kICkgKSB7CgkJCQlzbGlkZS5zZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaW1hZ2UnLCBkYXRhLmJhY2tncm91bmQgKTsKCQkJfQoJCQllbHNlIHsKCQkJCWVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9IGRhdGEuYmFja2dyb3VuZDsKCQkJfQoJCX0KCgkJLy8gQ3JlYXRlIGEgaGFzaCBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiBiYWNrZ3JvdW5kIHNldHRpbmdzLgoJCS8vIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiB0d28gc2xpZGUgYmFja2dyb3VuZHMgYXJlCgkJLy8gdGhlIHNhbWUuCgkJaWYoIGRhdGEuYmFja2dyb3VuZCB8fCBkYXRhLmJhY2tncm91bmRDb2xvciB8fCBkYXRhLmJhY2tncm91bmRJbWFnZSB8fCBkYXRhLmJhY2tncm91bmRWaWRlbyB8fCBkYXRhLmJhY2tncm91bmRJZnJhbWUgKSB7CgkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLWhhc2gnLCBkYXRhLmJhY2tncm91bmQgKwoJCQkJCQkJCQkJCQkJCQlkYXRhLmJhY2tncm91bmRTaXplICsKCQkJCQkJCQkJCQkJCQkJZGF0YS5iYWNrZ3JvdW5kSW1hZ2UgKwoJCQkJCQkJCQkJCQkJCQlkYXRhLmJhY2tncm91bmRWaWRlbyArCgkJCQkJCQkJCQkJCQkJCWRhdGEuYmFja2dyb3VuZElmcmFtZSArCgkJCQkJCQkJCQkJCQkJCWRhdGEuYmFja2dyb3VuZENvbG9yICsKCQkJCQkJCQkJCQkJCQkJZGF0YS5iYWNrZ3JvdW5kUmVwZWF0ICsKCQkJCQkJCQkJCQkJCQkJZGF0YS5iYWNrZ3JvdW5kUG9zaXRpb24gKwoJCQkJCQkJCQkJCQkJCQlkYXRhLmJhY2tncm91bmRUcmFuc2l0aW9uICsKCQkJCQkJCQkJCQkJCQkJZGF0YS5iYWNrZ3JvdW5kT3BhY2l0eSApOwoJCX0KCgkJLy8gQWRkaXRpb25hbCBhbmQgb3B0aW9uYWwgYmFja2dyb3VuZCBwcm9wZXJ0aWVzCgkJaWYoIGRhdGEuYmFja2dyb3VuZFNpemUgKSBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC1zaXplJywgZGF0YS5iYWNrZ3JvdW5kU2l6ZSApOwoJCWlmKCBkYXRhLmJhY2tncm91bmRDb2xvciApIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZGF0YS5iYWNrZ3JvdW5kQ29sb3I7CgkJaWYoIGRhdGEuYmFja2dyb3VuZFRyYW5zaXRpb24gKSBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC10cmFuc2l0aW9uJywgZGF0YS5iYWNrZ3JvdW5kVHJhbnNpdGlvbiApOwoKCQlpZiggc2xpZGUuaGFzQXR0cmlidXRlKCAnZGF0YS1wcmVsb2FkJyApICkgZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdkYXRhLXByZWxvYWQnLCAnJyApOwoKCQkvLyBCYWNrZ3JvdW5kIGltYWdlIG9wdGlvbnMgYXJlIHNldCBvbiB0aGUgY29udGVudCB3cmFwcGVyCgkJaWYoIGRhdGEuYmFja2dyb3VuZFNpemUgKSBjb250ZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IGRhdGEuYmFja2dyb3VuZFNpemU7CgkJaWYoIGRhdGEuYmFja2dyb3VuZFJlcGVhdCApIGNvbnRlbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRSZXBlYXQgPSBkYXRhLmJhY2tncm91bmRSZXBlYXQ7CgkJaWYoIGRhdGEuYmFja2dyb3VuZFBvc2l0aW9uICkgY29udGVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gZGF0YS5iYWNrZ3JvdW5kUG9zaXRpb247CgkJaWYoIGRhdGEuYmFja2dyb3VuZE9wYWNpdHkgKSBjb250ZW50RWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gZGF0YS5iYWNrZ3JvdW5kT3BhY2l0eTsKCgkJLy8gSWYgdGhpcyBzbGlkZSBoYXMgYSBiYWNrZ3JvdW5kIGNvbG9yLCB3ZSBhZGQgYSBjbGFzcyB0aGF0CgkJLy8gc2lnbmFscyBpZiBpdCBpcyBsaWdodCBvciBkYXJrLiBJZiB0aGUgc2xpZGUgaGFzIG5vIGJhY2tncm91bmQKCQkvLyBjb2xvciwgbm8gY2xhc3Mgd2lsbCBiZSBhZGRlZAoJCXZhciBjb250cmFzdENvbG9yID0gZGF0YS5iYWNrZ3JvdW5kQ29sb3I7CgoJCS8vIElmIG5vIGJnIGNvbG9yIHdhcyBmb3VuZCwgY2hlY2sgdGhlIGNvbXB1dGVkIGJhY2tncm91bmQKCQlpZiggIWNvbnRyYXN0Q29sb3IgKSB7CgkJCXZhciBjb21wdXRlZEJhY2tncm91bmRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtZW50ICk7CgkJCWlmKCBjb21wdXRlZEJhY2tncm91bmRTdHlsZSAmJiBjb21wdXRlZEJhY2tncm91bmRTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgKSB7CgkJCQljb250cmFzdENvbG9yID0gY29tcHV0ZWRCYWNrZ3JvdW5kU3R5bGUuYmFja2dyb3VuZENvbG9yOwoJCQl9CgkJfQoKCQlpZiggY29udHJhc3RDb2xvciApIHsKCQkJdmFyIHJnYiA9IGNvbG9yVG9SZ2IoIGNvbnRyYXN0Q29sb3IgKTsKCgkJCS8vIElnbm9yZSBmdWxseSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kcy4gU29tZSBicm93c2VycyByZXR1cm4KCQkJLy8gcmdiYSgwLDAsMCwwKSB3aGVuIHJlYWRpbmcgdGhlIGNvbXB1dGVkIGJhY2tncm91bmQgY29sb3Igb2YKCQkJLy8gYW4gZWxlbWVudCB3aXRoIG5vIGJhY2tncm91bmQKCQkJaWYoIHJnYiAmJiByZ2IuYSAhPT0gMCApIHsKCQkJCWlmKCBjb2xvckJyaWdodG5lc3MoIGNvbnRyYXN0Q29sb3IgKSA8IDEyOCApIHsKCQkJCQlzbGlkZS5jbGFzc0xpc3QuYWRkKCAnaGFzLWRhcmstYmFja2dyb3VuZCcgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNsaWRlLmNsYXNzTGlzdC5hZGQoICdoYXMtbGlnaHQtYmFja2dyb3VuZCcgKTsKCQkJCX0KCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBSZWdpc3RlcnMgYSBsaXN0ZW5lciB0byBwb3N0TWVzc2FnZSBldmVudHMsIHRoaXMgbWFrZXMgaXQKCSAqIHBvc3NpYmxlIHRvIGNhbGwgYWxsIHJldmVhbC5qcyBBUEkgbWV0aG9kcyBmcm9tIGFub3RoZXIKCSAqIHdpbmRvdy4gRm9yIGV4YW1wbGU6CgkgKgoJICogcmV2ZWFsV2luZG93LnBvc3RNZXNzYWdlKCBKU09OLnN0cmluZ2lmeSh7CgkgKiAgIG1ldGhvZDogJ3NsaWRlJywKCSAqICAgYXJnczogWyAyIF0KCSAqIH0pLCAnKicgKTsKCSAqLwoJZnVuY3Rpb24gc2V0dXBQb3N0TWVzc2FnZSgpIHsKCgkJaWYoIGNvbmZpZy5wb3N0TWVzc2FnZSApIHsKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdtZXNzYWdlJywgZnVuY3Rpb24gKCBldmVudCApIHsKCQkJCXZhciBkYXRhID0gZXZlbnQuZGF0YTsKCgkJCQkvLyBNYWtlIHN1cmUgd2UncmUgZGVhbGluZyB3aXRoIEpTT04KCQkJCWlmKCB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgJiYgZGF0YS5jaGFyQXQoIDAgKSA9PT0gJ3snICYmIGRhdGEuY2hhckF0KCBkYXRhLmxlbmd0aCAtIDEgKSA9PT0gJ30nICkgewoJCQkJCWRhdGEgPSBKU09OLnBhcnNlKCBkYXRhICk7CgoJCQkJCS8vIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIGNhbiBiZSBmb3VuZAoJCQkJCWlmKCBkYXRhLm1ldGhvZCAmJiB0eXBlb2YgUmV2ZWFsW2RhdGEubWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJyApIHsKCgkJCQkJCWlmKCBQT1NUX01FU1NBR0VfTUVUSE9EX0JMQUNLTElTVC50ZXN0KCBkYXRhLm1ldGhvZCApID09PSBmYWxzZSApIHsKCgkJCQkJCQl2YXIgcmVzdWx0ID0gUmV2ZWFsW2RhdGEubWV0aG9kXS5hcHBseSggUmV2ZWFsLCBkYXRhLmFyZ3MgKTsKCgkJCQkJCQkvLyBEaXNwYXRjaCBhIHBvc3RNZXNzYWdlIGV2ZW50IHdpdGggdGhlIHJldHVybmVkIHZhbHVlIGZyb20KCQkJCQkJCS8vIG91ciBtZXRob2QgaW52b2NhdGlvbiBmb3IgZ2V0dGVyIGZ1bmN0aW9ucwoJCQkJCQkJZGlzcGF0Y2hQb3N0TWVzc2FnZSggJ2NhbGxiYWNrJywgeyBtZXRob2Q6IGRhdGEubWV0aG9kLCByZXN1bHQ6IHJlc3VsdCB9ICk7CgoJCQkJCQl9CgkJCQkJCWVsc2UgewoJCQkJCQkJY29uc29sZS53YXJuKCAncmV2ZWFsLmpzOiAiJysgZGF0YS5tZXRob2QgKyciIGlzIGlzIGJsYWNrbGlzdGVkIGZyb20gdGhlIHBvc3RNZXNzYWdlIEFQSScgKTsKCQkJCQkJfQoKCQkJCQl9CgkJCQl9CgkJCX0sIGZhbHNlICk7CgkJfQoKCX0KCgkvKioKCSAqIEFwcGxpZXMgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZnJvbSB0aGUgY29uZmlnCgkgKiBvYmplY3QuIE1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMKCSAqLwoJZnVuY3Rpb24gY29uZmlndXJlKCBvcHRpb25zICkgewoKCQl2YXIgb2xkVHJhbnNpdGlvbiA9IGNvbmZpZy50cmFuc2l0aW9uOwoKCQkvLyBOZXcgY29uZmlnIG9wdGlvbnMgbWF5IGJlIHBhc3NlZCB3aGVuIHRoaXMgbWV0aG9kCgkJLy8gaXMgaW52b2tlZCB0aHJvdWdoIHRoZSBBUEkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KCQlpZiggdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICkgZXh0ZW5kKCBjb25maWcsIG9wdGlvbnMgKTsKCgkJLy8gQWJvcnQgaWYgcmV2ZWFsLmpzIGhhc24ndCBmaW5pc2hlZCBsb2FkaW5nLCBjb25maWcKCQkvLyBjaGFuZ2VzIHdpbGwgYmUgYXBwbGllZCBhdXRvbWF0aWNhbGx5IG9uY2UgbG9hZGluZwoJCS8vIGZpbmlzaGVzCgkJaWYoIGxvYWRlZCA9PT0gZmFsc2UgKSByZXR1cm47CgoJCXZhciBudW1iZXJPZlNsaWRlcyA9IGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIFNMSURFU19TRUxFQ1RPUiApLmxlbmd0aDsKCgkJLy8gUmVtb3ZlIHRoZSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgdHJhbnNpdGlvbiBjbGFzcwoJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoIG9sZFRyYW5zaXRpb24gKTsKCgkJLy8gRm9yY2UgbGluZWFyIHRyYW5zaXRpb24gYmFzZWQgb24gYnJvd3NlciBjYXBhYmlsaXRpZXMKCQlpZiggZmVhdHVyZXMudHJhbnNmb3JtczNkID09PSBmYWxzZSApIGNvbmZpZy50cmFuc2l0aW9uID0gJ2xpbmVhcic7CgoJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoIGNvbmZpZy50cmFuc2l0aW9uICk7CgoJCWRvbS53cmFwcGVyLnNldEF0dHJpYnV0ZSggJ2RhdGEtdHJhbnNpdGlvbi1zcGVlZCcsIGNvbmZpZy50cmFuc2l0aW9uU3BlZWQgKTsKCQlkb20ud3JhcHBlci5zZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtdHJhbnNpdGlvbicsIGNvbmZpZy5iYWNrZ3JvdW5kVHJhbnNpdGlvbiApOwoKCQlkb20uY29udHJvbHMuc3R5bGUuZGlzcGxheSA9IGNvbmZpZy5jb250cm9scyA/ICdibG9jaycgOiAnbm9uZSc7CgkJZG9tLnByb2dyZXNzLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvZ3Jlc3MgPyAnYmxvY2snIDogJ25vbmUnOwoKCQlkb20uY29udHJvbHMuc2V0QXR0cmlidXRlKCAnZGF0YS1jb250cm9scy1sYXlvdXQnLCBjb25maWcuY29udHJvbHNMYXlvdXQgKTsKCQlkb20uY29udHJvbHMuc2V0QXR0cmlidXRlKCAnZGF0YS1jb250cm9scy1iYWNrLWFycm93cycsIGNvbmZpZy5jb250cm9sc0JhY2tBcnJvd3MgKTsKCgkJaWYoIGNvbmZpZy5zaHVmZmxlICkgewoJCQlzaHVmZmxlKCk7CgkJfQoKCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LmFkZCggJ3J0bCcgKTsKCQl9CgkJZWxzZSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdydGwnICk7CgkJfQoKCQlpZiggY29uZmlnLmNlbnRlciApIHsKCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LmFkZCggJ2NlbnRlcicgKTsKCQl9CgkJZWxzZSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdjZW50ZXInICk7CgkJfQoKCQkvLyBFeGl0IHRoZSBwYXVzZWQgbW9kZSBpZiBpdCB3YXMgY29uZmlndXJlZCBvZmYKCQlpZiggY29uZmlnLnBhdXNlID09PSBmYWxzZSApIHsKCQkJcmVzdW1lKCk7CgkJfQoKCQlpZiggY29uZmlnLnNob3dOb3RlcyApIHsKCQkJZG9tLnNwZWFrZXJOb3Rlcy5zZXRBdHRyaWJ1dGUoICdkYXRhLWxheW91dCcsIHR5cGVvZiBjb25maWcuc2hvd05vdGVzID09PSAnc3RyaW5nJyA/IGNvbmZpZy5zaG93Tm90ZXMgOiAnaW5saW5lJyApOwoJCX0KCgkJaWYoIGNvbmZpZy5tb3VzZVdoZWVsICkgewoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnRE9NTW91c2VTY3JvbGwnLCBvbkRvY3VtZW50TW91c2VTY3JvbGwsIGZhbHNlICk7IC8vIEZGCgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZXdoZWVsJywgb25Eb2N1bWVudE1vdXNlU2Nyb2xsLCBmYWxzZSApOwoJCX0KCQllbHNlIHsKCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ0RPTU1vdXNlU2Nyb2xsJywgb25Eb2N1bWVudE1vdXNlU2Nyb2xsLCBmYWxzZSApOyAvLyBGRgoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2V3aGVlbCcsIG9uRG9jdW1lbnRNb3VzZVNjcm9sbCwgZmFsc2UgKTsKCQl9CgoJCS8vIFJvbGxpbmcgM0QgbGlua3MKCQlpZiggY29uZmlnLnJvbGxpbmdMaW5rcyApIHsKCQkJZW5hYmxlUm9sbGluZ0xpbmtzKCk7CgkJfQoJCWVsc2UgewoJCQlkaXNhYmxlUm9sbGluZ0xpbmtzKCk7CgkJfQoKCQkvLyBBdXRvLWhpZGUgdGhlIG1vdXNlIHBvaW50ZXIgd2hlbiBpdHMgaW5hY3RpdmUKCQlpZiggY29uZmlnLmhpZGVJbmFjdGl2ZUN1cnNvciApIHsKCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlbW92ZScsIG9uRG9jdW1lbnRDdXJzb3JBY3RpdmUsIGZhbHNlICk7CgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWRvd24nLCBvbkRvY3VtZW50Q3Vyc29yQWN0aXZlLCBmYWxzZSApOwoJCX0KCQllbHNlIHsKCQkJc2hvd0N1cnNvcigpOwoKCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlbW92ZScsIG9uRG9jdW1lbnRDdXJzb3JBY3RpdmUsIGZhbHNlICk7CgkJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZWRvd24nLCBvbkRvY3VtZW50Q3Vyc29yQWN0aXZlLCBmYWxzZSApOwoJCX0KCgkJLy8gSWZyYW1lIGxpbmsgcHJldmlld3MKCQlpZiggY29uZmlnLnByZXZpZXdMaW5rcyApIHsKCQkJZW5hYmxlUHJldmlld0xpbmtzKCk7CgkJCWRpc2FibGVQcmV2aWV3TGlua3MoICdbZGF0YS1wcmV2aWV3LWxpbms9ZmFsc2VdJyApOwoJCX0KCQllbHNlIHsKCQkJZGlzYWJsZVByZXZpZXdMaW5rcygpOwoJCQllbmFibGVQcmV2aWV3TGlua3MoICdbZGF0YS1wcmV2aWV3LWxpbmtdOm5vdChbZGF0YS1wcmV2aWV3LWxpbms9ZmFsc2VdKScgKTsKCQl9CgoJCS8vIFJlbW92ZSBleGlzdGluZyBhdXRvLXNsaWRlIGNvbnRyb2xzCgkJaWYoIGF1dG9TbGlkZVBsYXllciApIHsKCQkJYXV0b1NsaWRlUGxheWVyLmRlc3Ryb3koKTsKCQkJYXV0b1NsaWRlUGxheWVyID0gbnVsbDsKCQl9CgoJCS8vIEdlbmVyYXRlIGF1dG8tc2xpZGUgY29udHJvbHMgaWYgbmVlZGVkCgkJaWYoIG51bWJlck9mU2xpZGVzID4gMSAmJiBjb25maWcuYXV0b1NsaWRlICYmIGNvbmZpZy5hdXRvU2xpZGVTdG9wcGFibGUgJiYgZmVhdHVyZXMuY2FudmFzICYmIGZlYXR1cmVzLnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJYXV0b1NsaWRlUGxheWVyID0gbmV3IFBsYXliYWNrKCBkb20ud3JhcHBlciwgZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gTWF0aC5taW4oIE1hdGgubWF4KCAoIERhdGUubm93KCkgLSBhdXRvU2xpZGVTdGFydFRpbWUgKSAvIGF1dG9TbGlkZSwgMCApLCAxICk7CgkJCX0gKTsKCgkJCWF1dG9TbGlkZVBsYXllci5vbiggJ2NsaWNrJywgb25BdXRvU2xpZGVQbGF5ZXJDbGljayApOwoJCQlhdXRvU2xpZGVQYXVzZWQgPSBmYWxzZTsKCQl9CgoJCS8vIFdoZW4gZnJhZ21lbnRzIGFyZSB0dXJuZWQgb2ZmIHRoZXkgc2hvdWxkIGJlIHZpc2libGUKCQlpZiggY29uZmlnLmZyYWdtZW50cyA9PT0gZmFsc2UgKSB7CgkJCXRvQXJyYXkoIGRvbS5zbGlkZXMucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudCcgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCQkJZWxlbWVudC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKTsKCQkJCWVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSggJ2N1cnJlbnQtZnJhZ21lbnQnICk7CgkJCX0gKTsKCQl9CgoJCS8vIFNsaWRlIG51bWJlcnMKCQl2YXIgc2xpZGVOdW1iZXJEaXNwbGF5ID0gJ25vbmUnOwoJCWlmKCBjb25maWcuc2xpZGVOdW1iZXIgJiYgIWlzUHJpbnRpbmdQREYoKSApIHsKCQkJaWYoIGNvbmZpZy5zaG93U2xpZGVOdW1iZXIgPT09ICdhbGwnICkgewoJCQkJc2xpZGVOdW1iZXJEaXNwbGF5ID0gJ2Jsb2NrJzsKCQkJfQoJCQllbHNlIGlmKCBjb25maWcuc2hvd1NsaWRlTnVtYmVyID09PSAnc3BlYWtlcicgJiYgaXNTcGVha2VyTm90ZXMoKSApIHsKCQkJCXNsaWRlTnVtYmVyRGlzcGxheSA9ICdibG9jayc7CgkJCX0KCQl9CgoJCWRvbS5zbGlkZU51bWJlci5zdHlsZS5kaXNwbGF5ID0gc2xpZGVOdW1iZXJEaXNwbGF5OwoKCQkvLyBBZGQgdGhlIG5hdmlnYXRpb24gbW9kZSB0byB0aGUgRE9NIHNvIHdlIGNhbiBhZGp1c3Qgc3R5bGluZwoJCWlmKCBjb25maWcubmF2aWdhdGlvbk1vZGUgIT09ICdkZWZhdWx0JyApIHsKCQkJZG9tLndyYXBwZXIuc2V0QXR0cmlidXRlKCAnZGF0YS1uYXZpZ2F0aW9uLW1vZGUnLCBjb25maWcubmF2aWdhdGlvbk1vZGUgKTsKCQl9CgkJZWxzZSB7CgkJCWRvbS53cmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtbmF2aWdhdGlvbi1tb2RlJyApOwoJCX0KCgkJLy8gRGVmaW5lIG91ciBjb250ZXh0dWFsIGxpc3Qgb2Yga2V5Ym9hcmQgc2hvcnRjdXRzCgkJaWYoIGNvbmZpZy5uYXZpZ2F0aW9uTW9kZSA9PT0gJ2xpbmVhcicgKSB7CgkJCWtleWJvYXJkU2hvcnRjdXRzWycmIzg1OTQ7ICAsICAmIzg1OTU7ICAsICBTUEFDRSAgLCAgTiAgLCAgTCAgLCAgSiddID0gJ05leHQgc2xpZGUnOwoJCQlrZXlib2FyZFNob3J0Y3V0c1snJiM4NTkyOyAgLCAgJiM4NTkzOyAgLCAgUCAgLCAgSCAgLCAgSyddICAgICAgICAgICA9ICdQcmV2aW91cyBzbGlkZSc7CgkJfQoJCWVsc2UgewoJCQlrZXlib2FyZFNob3J0Y3V0c1snTiAgLCAgU1BBQ0UnXSAgID0gJ05leHQgc2xpZGUnOwoJCQlrZXlib2FyZFNob3J0Y3V0c1snUCddICAgICAgICAgICAgID0gJ1ByZXZpb3VzIHNsaWRlJzsKCQkJa2V5Ym9hcmRTaG9ydGN1dHNbJyYjODU5MjsgICwgIEgnXSA9ICdOYXZpZ2F0ZSBsZWZ0JzsKCQkJa2V5Ym9hcmRTaG9ydGN1dHNbJyYjODU5NDsgICwgIEwnXSA9ICdOYXZpZ2F0ZSByaWdodCc7CgkJCWtleWJvYXJkU2hvcnRjdXRzWycmIzg1OTM7ICAsICBLJ10gPSAnTmF2aWdhdGUgdXAnOwoJCQlrZXlib2FyZFNob3J0Y3V0c1snJiM4NTk1OyAgLCAgSiddID0gJ05hdmlnYXRlIGRvd24nOwoJCX0KCgkJa2V5Ym9hcmRTaG9ydGN1dHNbJ0hvbWUgICwgIFNoaWZ0ICYjODU5MjsnXSAgICAgICAgPSAnRmlyc3Qgc2xpZGUnOwoJCWtleWJvYXJkU2hvcnRjdXRzWydFbmQgICwgIFNoaWZ0ICYjODU5NDsnXSAgICAgICAgID0gJ0xhc3Qgc2xpZGUnOwoJCWtleWJvYXJkU2hvcnRjdXRzWydCICAsICAuJ10gICAgICAgICAgICAgICAgICAgICAgID0gJ1BhdXNlJzsKCQlrZXlib2FyZFNob3J0Y3V0c1snRiddICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGdWxsc2NyZWVuJzsKCQlrZXlib2FyZFNob3J0Y3V0c1snRVNDLCBPJ10gICAgICAgICAgICAgICAgICAgICAgICA9ICdTbGlkZSBvdmVydmlldyc7CgoJCXN5bmMoKTsKCgl9CgoJLyoqCgkgKiBCaW5kcyBhbGwgZXZlbnQgbGlzdGVuZXJzLgoJICovCglmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycygpIHsKCgkJZXZlbnRzQXJlQm91bmQgPSB0cnVlOwoKCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ2hhc2hjaGFuZ2UnLCBvbldpbmRvd0hhc2hDaGFuZ2UsIGZhbHNlICk7CgkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSwgZmFsc2UgKTsKCgkJaWYoIGNvbmZpZy50b3VjaCApIHsKCQkJaWYoICdvbnBvaW50ZXJkb3duJyBpbiB3aW5kb3cgKSB7CgkJCQkvLyBVc2UgVzNDIHBvaW50ZXIgZXZlbnRzCgkJCQlkb20ud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCAncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duLCBmYWxzZSApOwoJCQkJZG9tLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lciggJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSwgZmFsc2UgKTsKCQkJCWRvbS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoICdwb2ludGVydXAnLCBvblBvaW50ZXJVcCwgZmFsc2UgKTsKCQkJfQoJCQllbHNlIGlmKCB3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQgKSB7CgkJCQkvLyBJRSAxMCB1c2VzIHByZWZpeGVkIHZlcnNpb24gb2YgcG9pbnRlciBldmVudHMKCQkJCWRvbS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoICdNU1BvaW50ZXJEb3duJywgb25Qb2ludGVyRG93biwgZmFsc2UgKTsKCQkJCWRvbS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoICdNU1BvaW50ZXJNb3ZlJywgb25Qb2ludGVyTW92ZSwgZmFsc2UgKTsKCQkJCWRvbS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoICdNU1BvaW50ZXJVcCcsIG9uUG9pbnRlclVwLCBmYWxzZSApOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gRmFsbCBiYWNrIHRvIHRvdWNoIGV2ZW50cwoJCQkJZG9tLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlICk7CgkJCQlkb20ud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCAndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIGZhbHNlICk7CgkJCQlkb20ud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCAndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSApOwoJCQl9CgkJfQoKCQlpZiggY29uZmlnLmtleWJvYXJkICkgewoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAna2V5ZG93bicsIG9uRG9jdW1lbnRLZXlEb3duLCBmYWxzZSApOwoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAna2V5cHJlc3MnLCBvbkRvY3VtZW50S2V5UHJlc3MsIGZhbHNlICk7CgkJfQoKCQlpZiggY29uZmlnLnByb2dyZXNzICYmIGRvbS5wcm9ncmVzcyApIHsKCQkJZG9tLnByb2dyZXNzLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIG9uUHJvZ3Jlc3NDbGlja2VkLCBmYWxzZSApOwoJCX0KCgkJZG9tLnBhdXNlT3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCByZXN1bWUsIGZhbHNlICk7CgoJCWlmKCBjb25maWcuZm9jdXNCb2R5T25QYWdlVmlzaWJpbGl0eUNoYW5nZSApIHsKCQkJdmFyIHZpc2liaWxpdHlDaGFuZ2U7CgoJCQlpZiggJ2hpZGRlbicgaW4gZG9jdW1lbnQgKSB7CgkJCQl2aXNpYmlsaXR5Q2hhbmdlID0gJ3Zpc2liaWxpdHljaGFuZ2UnOwoJCQl9CgkJCWVsc2UgaWYoICdtc0hpZGRlbicgaW4gZG9jdW1lbnQgKSB7CgkJCQl2aXNpYmlsaXR5Q2hhbmdlID0gJ21zdmlzaWJpbGl0eWNoYW5nZSc7CgkJCX0KCQkJZWxzZSBpZiggJ3dlYmtpdEhpZGRlbicgaW4gZG9jdW1lbnQgKSB7CgkJCQl2aXNpYmlsaXR5Q2hhbmdlID0gJ3dlYmtpdHZpc2liaWxpdHljaGFuZ2UnOwoJCQl9CgoJCQlpZiggdmlzaWJpbGl0eUNoYW5nZSApIHsKCQkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIHZpc2liaWxpdHlDaGFuZ2UsIG9uUGFnZVZpc2liaWxpdHlDaGFuZ2UsIGZhbHNlICk7CgkJCX0KCQl9CgoJCS8vIExpc3RlbiB0byBib3RoIHRvdWNoIGFuZCBjbGljayBldmVudHMsIGluIGNhc2UgdGhlIGRldmljZQoJCS8vIHN1cHBvcnRzIGJvdGgKCQl2YXIgcG9pbnRlckV2ZW50cyA9IFsgJ3RvdWNoc3RhcnQnLCAnY2xpY2snIF07CgoJCS8vIE9ubHkgc3VwcG9ydCB0b3VjaCBmb3IgQW5kcm9pZCwgZml4ZXMgZG91YmxlIG5hdmlnYXRpb25zIGluCgkJLy8gc3RvY2sgYnJvd3NlcgoJCWlmKCBVQS5tYXRjaCggL2FuZHJvaWQvZ2kgKSApIHsKCQkJcG9pbnRlckV2ZW50cyA9IFsgJ3RvdWNoc3RhcnQnIF07CgkJfQoKCQlwb2ludGVyRXZlbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudE5hbWUgKSB7CgkJCWRvbS5jb250cm9sc0xlZnQuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5hZGRFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVMZWZ0Q2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNSaWdodC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmFkZEV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZVJpZ2h0Q2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNVcC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmFkZEV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZVVwQ2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNEb3duLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuYWRkRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCBvbk5hdmlnYXRlRG93bkNsaWNrZWQsIGZhbHNlICk7IH0gKTsKCQkJZG9tLmNvbnRyb2xzUHJldi5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmFkZEV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZVByZXZDbGlja2VkLCBmYWxzZSApOyB9ICk7CgkJCWRvbS5jb250cm9sc05leHQuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5hZGRFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVOZXh0Q2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCX0gKTsKCgl9CgoJLyoqCgkgKiBVbmJpbmRzIGFsbCBldmVudCBsaXN0ZW5lcnMuCgkgKi8KCWZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCkgewoKCQlldmVudHNBcmVCb3VuZCA9IGZhbHNlOwoKCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAna2V5ZG93bicsIG9uRG9jdW1lbnRLZXlEb3duLCBmYWxzZSApOwoJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdrZXlwcmVzcycsIG9uRG9jdW1lbnRLZXlQcmVzcywgZmFsc2UgKTsKCQl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2hhc2hjaGFuZ2UnLCBvbldpbmRvd0hhc2hDaGFuZ2UsIGZhbHNlICk7CgkJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSwgZmFsc2UgKTsKCgkJZG9tLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3BvaW50ZXJkb3duJywgb25Qb2ludGVyRG93biwgZmFsc2UgKTsKCQlkb20ud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCAncG9pbnRlcm1vdmUnLCBvblBvaW50ZXJNb3ZlLCBmYWxzZSApOwoJCWRvbS53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdwb2ludGVydXAnLCBvblBvaW50ZXJVcCwgZmFsc2UgKTsKCgkJZG9tLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ01TUG9pbnRlckRvd24nLCBvblBvaW50ZXJEb3duLCBmYWxzZSApOwoJCWRvbS53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdNU1BvaW50ZXJNb3ZlJywgb25Qb2ludGVyTW92ZSwgZmFsc2UgKTsKCQlkb20ud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKCAnTVNQb2ludGVyVXAnLCBvblBvaW50ZXJVcCwgZmFsc2UgKTsKCgkJZG9tLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlICk7CgkJZG9tLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBmYWxzZSApOwoJCWRvbS53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlICk7CgoJCWRvbS5wYXVzZU92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgcmVzdW1lLCBmYWxzZSApOwoKCQlpZiAoIGNvbmZpZy5wcm9ncmVzcyAmJiBkb20ucHJvZ3Jlc3MgKSB7CgkJCWRvbS5wcm9ncmVzcy5yZW1vdmVFdmVudExpc3RlbmVyKCAnY2xpY2snLCBvblByb2dyZXNzQ2xpY2tlZCwgZmFsc2UgKTsKCQl9CgoJCVsgJ3RvdWNoc3RhcnQnLCAnY2xpY2snIF0uZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50TmFtZSApIHsKCQkJZG9tLmNvbnRyb2xzTGVmdC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZUxlZnRDbGlja2VkLCBmYWxzZSApOyB9ICk7CgkJCWRvbS5jb250cm9sc1JpZ2h0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCBvbk5hdmlnYXRlUmlnaHRDbGlja2VkLCBmYWxzZSApOyB9ICk7CgkJCWRvbS5jb250cm9sc1VwLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCBvbk5hdmlnYXRlVXBDbGlja2VkLCBmYWxzZSApOyB9ICk7CgkJCWRvbS5jb250cm9sc0Rvd24uZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCBldmVudE5hbWUsIG9uTmF2aWdhdGVEb3duQ2xpY2tlZCwgZmFsc2UgKTsgfSApOwoJCQlkb20uY29udHJvbHNQcmV2LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCBvbk5hdmlnYXRlUHJldkNsaWNrZWQsIGZhbHNlICk7IH0gKTsKCQkJZG9tLmNvbnRyb2xzTmV4dC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgb25OYXZpZ2F0ZU5leHRDbGlja2VkLCBmYWxzZSApOyB9ICk7CgkJfSApOwoKCX0KCgkvKioKCSAqIFJlZ2lzdGVycyBhIG5ldyBwbHVnaW4gd2l0aCB0aGlzIHJldmVhbC5qcyBpbnN0YW5jZS4KCSAqCgkgKiByZXZlYWwuanMgd2FpdHMgZm9yIGFsbCByZWdpc2VyZWQgcGx1Z2lucyB0byBpbml0aWFsaXplCgkgKiBiZWZvcmUgY29uc2lkZXJpbmcgaXRzZWxmIHJlYWR5LCBhcyBsb25nIGFzIHRoZSBwbHVnaW4KCSAqIGlzIHJlZ2lzdGVyZWQgYmVmb3JlIGNhbGxpbmcgYFJldmVhbC5pbml0aWFsaXplKClgLgoJICovCglmdW5jdGlvbiByZWdpc3RlclBsdWdpbiggaWQsIHBsdWdpbiApIHsKCgkJaWYoIHBsdWdpbnNbaWRdID09PSB1bmRlZmluZWQgKSB7CgkJCXBsdWdpbnNbaWRdID0gcGx1Z2luOwoKCQkJLy8gSWYgYSBwbHVnaW4gaXMgcmVnaXN0ZXJlZCBhZnRlciByZXZlYWwuanMgaXMgbG9hZGVkLAoJCQkvLyBpbml0aWFsaXplIGl0IHJpZ2h0IGF3YXkKCQkJaWYoIGxvYWRlZCAmJiB0eXBlb2YgcGx1Z2luLmluaXQgPT09ICdmdW5jdGlvbicgKSB7CgkJCQlwbHVnaW4uaW5pdCgpOwoJCQl9CgkJfQoJCWVsc2UgewoJCQljb25zb2xlLndhcm4oICdyZXZlYWwuanM6ICInKyBpZCArJyIgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCcgKTsKCQl9CgoJfQoKCS8qKgoJICogQ2hlY2tzIGlmIGEgc3BlY2lmaWMgcGx1Z2luIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCgkgKgoJICogQHBhcmFtIHtTdHJpbmd9IGlkIFVuaXF1ZSBwbHVnaW4gaWRlbnRpZmllcgoJICovCglmdW5jdGlvbiBoYXNQbHVnaW4oIGlkICkgewoKCQlyZXR1cm4gISFwbHVnaW5zW2lkXTsKCgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpYyBwbHVnaW4gaW5zdGFuY2UsIGlmIGEgcGx1Z2luCgkgKiB3aXRoIHRoZSBnaXZlbiBJRCBoYXMgYmVlbiByZWdpc3RlcmVkLgoJICoKCSAqIEBwYXJhbSB7U3RyaW5nfSBpZCBVbmlxdWUgcGx1Z2luIGlkZW50aWZpZXIKCSAqLwoJZnVuY3Rpb24gZ2V0UGx1Z2luKCBpZCApIHsKCgkJcmV0dXJuIHBsdWdpbnNbaWRdOwoKCX0KCgkvKioKCSAqIEFkZCBhIGN1c3RvbSBrZXkgYmluZGluZyB3aXRoIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHRvCgkgKiBiZSBhZGRlZCB0byB0aGUgaGVscCBzY3JlZW4uCgkgKi8KCWZ1bmN0aW9uIGFkZEtleUJpbmRpbmcoIGJpbmRpbmcsIGNhbGxiYWNrICkgewoKCQlpZiggdHlwZW9mIGJpbmRpbmcgPT09ICdvYmplY3QnICYmIGJpbmRpbmcua2V5Q29kZSApIHsKCQkJcmVnaXN0ZXJlZEtleUJpbmRpbmdzW2JpbmRpbmcua2V5Q29kZV0gPSB7CgkJCQljYWxsYmFjazogY2FsbGJhY2ssCgkJCQlrZXk6IGJpbmRpbmcua2V5LAoJCQkJZGVzY3JpcHRpb246IGJpbmRpbmcuZGVzY3JpcHRpb24KCQkJfTsKCQl9CgkJZWxzZSB7CgkJCXJlZ2lzdGVyZWRLZXlCaW5kaW5nc1tiaW5kaW5nXSA9IHsKCQkJCWNhbGxiYWNrOiBjYWxsYmFjaywKCQkJCWtleTogbnVsbCwKCQkJCWRlc2NyaXB0aW9uOiBudWxsCgkJCX07CgkJfQoKCX0KCgkvKioKCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjdXN0b20ga2V5IGJpbmRpbmcuCgkgKi8KCWZ1bmN0aW9uIHJlbW92ZUtleUJpbmRpbmcoIGtleUNvZGUgKSB7CgoJCWRlbGV0ZSByZWdpc3RlcmVkS2V5QmluZGluZ3Nba2V5Q29kZV07CgoJfQoKCS8qKgoJICogRXh0ZW5kIG9iamVjdCBhIHdpdGggdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuCgkgKiBJZiB0aGVyZSdzIGEgY29uZmxpY3QsIG9iamVjdCBiIHRha2VzIHByZWNlZGVuY2UuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGEKCSAqIEBwYXJhbSB7b2JqZWN0fSBiCgkgKi8KCWZ1bmN0aW9uIGV4dGVuZCggYSwgYiApIHsKCgkJZm9yKCB2YXIgaSBpbiBiICkgewoJCQlhWyBpIF0gPSBiWyBpIF07CgkJfQoKCQlyZXR1cm4gYTsKCgl9CgoJLyoqCgkgKiBDb252ZXJ0cyB0aGUgdGFyZ2V0IG9iamVjdCB0byBhbiBhcnJheS4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gbwoJICogQHJldHVybiB7b2JqZWN0W119CgkgKi8KCWZ1bmN0aW9uIHRvQXJyYXkoIG8gKSB7CgoJCXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggbyApOwoKCX0KCgkvKioKCSAqIFV0aWxpdHkgZm9yIGRlc2VyaWFsaXppbmcgYSB2YWx1ZS4KCSAqCgkgKiBAcGFyYW0geyp9IHZhbHVlCgkgKiBAcmV0dXJuIHsqfQoJICovCglmdW5jdGlvbiBkZXNlcmlhbGl6ZSggdmFsdWUgKSB7CgoJCWlmKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkgewoJCQlpZiggdmFsdWUgPT09ICdudWxsJyApIHJldHVybiBudWxsOwoJCQllbHNlIGlmKCB2YWx1ZSA9PT0gJ3RydWUnICkgcmV0dXJuIHRydWU7CgkJCWVsc2UgaWYoIHZhbHVlID09PSAnZmFsc2UnICkgcmV0dXJuIGZhbHNlOwoJCQllbHNlIGlmKCB2YWx1ZS5tYXRjaCggL14tP1tcZFwuXSskLyApICkgcmV0dXJuIHBhcnNlRmxvYXQoIHZhbHVlICk7CgkJfQoKCQlyZXR1cm4gdmFsdWU7CgoJfQoKCS8qKgoJICogTWVhc3VyZXMgdGhlIGRpc3RhbmNlIGluIHBpeGVscyBiZXR3ZWVuIHBvaW50IGEKCSAqIGFuZCBwb2ludCBiLgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBhIHBvaW50IHdpdGggeC95IHByb3BlcnRpZXMKCSAqIEBwYXJhbSB7b2JqZWN0fSBiIHBvaW50IHdpdGggeC95IHByb3BlcnRpZXMKCSAqCgkgKiBAcmV0dXJuIHtudW1iZXJ9CgkgKi8KCWZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlbiggYSwgYiApIHsKCgkJdmFyIGR4ID0gYS54IC0gYi54LAoJCQlkeSA9IGEueSAtIGIueTsKCgkJcmV0dXJuIE1hdGguc3FydCggZHgqZHggKyBkeSpkeSApOwoKCX0KCgkvKioKCSAqIEFwcGxpZXMgYSBDU1MgdHJhbnNmb3JtIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50CgkgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtCgkgKi8KCWZ1bmN0aW9uIHRyYW5zZm9ybUVsZW1lbnQoIGVsZW1lbnQsIHRyYW5zZm9ybSApIHsKCgkJZWxlbWVudC5zdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07CgkJZWxlbWVudC5zdHlsZS5Nb3pUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07CgkJZWxlbWVudC5zdHlsZS5tc1RyYW5zZm9ybSA9IHRyYW5zZm9ybTsKCQllbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKCgl9CgoJLyoqCgkgKiBBcHBsaWVzIENTUyB0cmFuc2Zvcm1zIHRvIHRoZSBzbGlkZXMgY29udGFpbmVyLiBUaGUgY29udGFpbmVyCgkgKiBpcyB0cmFuc2Zvcm1lZCBmcm9tIHR3byBzZXBhcmF0ZSBzb3VyY2VzOiBsYXlvdXQgYW5kIHRoZSBvdmVydmlldwoJICogbW9kZS4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gdHJhbnNmb3JtcwoJICovCglmdW5jdGlvbiB0cmFuc2Zvcm1TbGlkZXMoIHRyYW5zZm9ybXMgKSB7CgoJCS8vIFBpY2sgdXAgbmV3IHRyYW5zZm9ybXMgZnJvbSBhcmd1bWVudHMKCQlpZiggdHlwZW9mIHRyYW5zZm9ybXMubGF5b3V0ID09PSAnc3RyaW5nJyApIHNsaWRlc1RyYW5zZm9ybS5sYXlvdXQgPSB0cmFuc2Zvcm1zLmxheW91dDsKCQlpZiggdHlwZW9mIHRyYW5zZm9ybXMub3ZlcnZpZXcgPT09ICdzdHJpbmcnICkgc2xpZGVzVHJhbnNmb3JtLm92ZXJ2aWV3ID0gdHJhbnNmb3Jtcy5vdmVydmlldzsKCgkJLy8gQXBwbHkgdGhlIHRyYW5zZm9ybXMgdG8gdGhlIHNsaWRlcyBjb250YWluZXIKCQlpZiggc2xpZGVzVHJhbnNmb3JtLmxheW91dCApIHsKCQkJdHJhbnNmb3JtRWxlbWVudCggZG9tLnNsaWRlcywgc2xpZGVzVHJhbnNmb3JtLmxheW91dCArICcgJyArIHNsaWRlc1RyYW5zZm9ybS5vdmVydmlldyApOwoJCX0KCQllbHNlIHsKCQkJdHJhbnNmb3JtRWxlbWVudCggZG9tLnNsaWRlcywgc2xpZGVzVHJhbnNmb3JtLm92ZXJ2aWV3ICk7CgkJfQoKCX0KCgkvKioKCSAqIEluamVjdHMgdGhlIGdpdmVuIENTUyBzdHlsZXMgaW50byB0aGUgRE9NLgoJICoKCSAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZQoJICovCglmdW5jdGlvbiBpbmplY3RTdHlsZVNoZWV0KCB2YWx1ZSApIHsKCgkJdmFyIHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzdHlsZScgKTsKCQl0YWcudHlwZSA9ICd0ZXh0L2Nzcyc7CgkJaWYoIHRhZy5zdHlsZVNoZWV0ICkgewoJCQl0YWcuc3R5bGVTaGVldC5jc3NUZXh0ID0gdmFsdWU7CgkJfQoJCWVsc2UgewoJCQl0YWcuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCB2YWx1ZSApICk7CgkJfQoJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAnaGVhZCcgKVswXS5hcHBlbmRDaGlsZCggdGFnICk7CgoJfQoKCS8qKgoJICogRmluZCB0aGUgY2xvc2VzdCBwYXJlbnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbgoJICogc2VsZWN0b3IuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0IFRoZSBjaGlsZCBlbGVtZW50CgkgKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgVGhlIENTUyBzZWxlY3RvciB0byBtYXRjaAoJICogdGhlIHBhcmVudHMgYWdhaW5zdAoJICoKCSAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSBUaGUgbWF0Y2hlZCBwYXJlbnQgb3IgbnVsbAoJICogaWYgbm8gbWF0Y2hpbmcgcGFyZW50IHdhcyBmb3VuZAoJICovCglmdW5jdGlvbiBjbG9zZXN0UGFyZW50KCB0YXJnZXQsIHNlbGVjdG9yICkgewoKCQl2YXIgcGFyZW50ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgoJCXdoaWxlKCBwYXJlbnQgKSB7CgoJCQkvLyBUaGVyZSdzIHNvbWUgb3ZlcmhlYWQgZG9pbmcgdGhpcyBlYWNoIHRpbWUsIHdlIGRvbid0CgkJCS8vIHdhbnQgdG8gcmV3cml0ZSB0aGUgZWxlbWVudCBwcm90b3R5cGUgYnV0IHNob3VsZCBzdGlsbAoJCQkvLyBiZSBlbm91Z2ggdG8gZmVhdHVyZSBkZXRlY3Qgb25jZSBhdCBzdGFydHVwLi4uCgkJCXZhciBtYXRjaGVzTWV0aG9kID0gcGFyZW50Lm1hdGNoZXMgfHwgcGFyZW50Lm1hdGNoZXNTZWxlY3RvciB8fCBwYXJlbnQubXNNYXRjaGVzU2VsZWN0b3I7CgoJCQkvLyBJZiB3ZSBmaW5kIGEgbWF0Y2gsIHdlJ3JlIGFsbCBzZXQKCQkJaWYoIG1hdGNoZXNNZXRob2QgJiYgbWF0Y2hlc01ldGhvZC5jYWxsKCBwYXJlbnQsIHNlbGVjdG9yICkgKSB7CgkJCQlyZXR1cm4gcGFyZW50OwoJCQl9CgoJCQkvLyBLZWVwIHNlYXJjaGluZwoJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsKCgkJfQoKCQlyZXR1cm4gbnVsbDsKCgl9CgoJLyoqCgkgKiBDb252ZXJ0cyB2YXJpb3VzIGNvbG9yIGlucHV0IGZvcm1hdHMgdG8gYW4ge3I6MCxnOjAsYjowfSBvYmplY3QuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBjb2xvcgoJICogQGV4YW1wbGUKCSAqIGNvbG9yVG9SZ2IoJyMwMDAnKTsKCSAqIEBleGFtcGxlCgkgKiBjb2xvclRvUmdiKCcjMDAwMDAwJyk7CgkgKiBAZXhhbXBsZQoJICogY29sb3JUb1JnYigncmdiKDAsMCwwKScpOwoJICogQGV4YW1wbGUKCSAqIGNvbG9yVG9SZ2IoJ3JnYmEoMCwwLDApJyk7CgkgKgoJICogQHJldHVybiB7e3I6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIFthXTogbnVtYmVyfXxudWxsfQoJICovCglmdW5jdGlvbiBjb2xvclRvUmdiKCBjb2xvciApIHsKCgkJdmFyIGhleDMgPSBjb2xvci5tYXRjaCggL14jKFswLTlhLWZdezN9KSQvaSApOwoJCWlmKCBoZXgzICYmIGhleDNbMV0gKSB7CgkJCWhleDMgPSBoZXgzWzFdOwoJCQlyZXR1cm4gewoJCQkJcjogcGFyc2VJbnQoIGhleDMuY2hhckF0KCAwICksIDE2ICkgKiAweDExLAoJCQkJZzogcGFyc2VJbnQoIGhleDMuY2hhckF0KCAxICksIDE2ICkgKiAweDExLAoJCQkJYjogcGFyc2VJbnQoIGhleDMuY2hhckF0KCAyICksIDE2ICkgKiAweDExCgkJCX07CgkJfQoKCQl2YXIgaGV4NiA9IGNvbG9yLm1hdGNoKCAvXiMoWzAtOWEtZl17Nn0pJC9pICk7CgkJaWYoIGhleDYgJiYgaGV4NlsxXSApIHsKCQkJaGV4NiA9IGhleDZbMV07CgkJCXJldHVybiB7CgkJCQlyOiBwYXJzZUludCggaGV4Ni5zdWJzdHIoIDAsIDIgKSwgMTYgKSwKCQkJCWc6IHBhcnNlSW50KCBoZXg2LnN1YnN0ciggMiwgMiApLCAxNiApLAoJCQkJYjogcGFyc2VJbnQoIGhleDYuc3Vic3RyKCA0LCAyICksIDE2ICkKCQkJfTsKCQl9CgoJCXZhciByZ2IgPSBjb2xvci5tYXRjaCggL15yZ2JccypcKFxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqXCkkL2kgKTsKCQlpZiggcmdiICkgewoJCQlyZXR1cm4gewoJCQkJcjogcGFyc2VJbnQoIHJnYlsxXSwgMTAgKSwKCQkJCWc6IHBhcnNlSW50KCByZ2JbMl0sIDEwICksCgkJCQliOiBwYXJzZUludCggcmdiWzNdLCAxMCApCgkJCX07CgkJfQoKCQl2YXIgcmdiYSA9IGNvbG9yLm1hdGNoKCAvXnJnYmFccypcKFxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqXCxccyooW1xkXSt8W1xkXSouW1xkXSspXHMqXCkkL2kgKTsKCQlpZiggcmdiYSApIHsKCQkJcmV0dXJuIHsKCQkJCXI6IHBhcnNlSW50KCByZ2JhWzFdLCAxMCApLAoJCQkJZzogcGFyc2VJbnQoIHJnYmFbMl0sIDEwICksCgkJCQliOiBwYXJzZUludCggcmdiYVszXSwgMTAgKSwKCQkJCWE6IHBhcnNlRmxvYXQoIHJnYmFbNF0gKQoJCQl9OwoJCX0KCgkJcmV0dXJuIG51bGw7CgoJfQoKCS8qKgoJICogQ2FsY3VsYXRlcyBicmlnaHRuZXNzIG9uIGEgc2NhbGUgb2YgMC0yNTUuCgkgKgoJICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIFNlZSBjb2xvclRvUmdiIGZvciBzdXBwb3J0ZWQgZm9ybWF0cy4KCSAqIEBzZWUge0BsaW5rIGNvbG9yVG9SZ2J9CgkgKi8KCWZ1bmN0aW9uIGNvbG9yQnJpZ2h0bmVzcyggY29sb3IgKSB7CgoJCWlmKCB0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnICkgY29sb3IgPSBjb2xvclRvUmdiKCBjb2xvciApOwoKCQlpZiggY29sb3IgKSB7CgkJCXJldHVybiAoIGNvbG9yLnIgKiAyOTkgKyBjb2xvci5nICogNTg3ICsgY29sb3IuYiAqIDExNCApIC8gMTAwMDsKCQl9CgoJCXJldHVybiBudWxsOwoKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHJlbWFpbmluZyBoZWlnaHQgd2l0aGluIHRoZSBwYXJlbnQgb2YgdGhlCgkgKiB0YXJnZXQgZWxlbWVudC4KCSAqCgkgKiByZW1haW5pbmcgaGVpZ2h0ID0gWyBjb25maWd1cmVkIHBhcmVudCBoZWlnaHQgXSAtIFsgY3VycmVudCBwYXJlbnQgaGVpZ2h0IF0KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50CgkgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0KCSAqLwoJZnVuY3Rpb24gZ2V0UmVtYWluaW5nSGVpZ2h0KCBlbGVtZW50LCBoZWlnaHQgKSB7CgoJCWhlaWdodCA9IGhlaWdodCB8fCAwOwoKCQlpZiggZWxlbWVudCApIHsKCQkJdmFyIG5ld0hlaWdodCwgb2xkSGVpZ2h0ID0gZWxlbWVudC5zdHlsZS5oZWlnaHQ7CgoJCQkvLyBDaGFuZ2UgdGhlIC5zdHJldGNoIGVsZW1lbnQgaGVpZ2h0IHRvIDAgaW4gb3JkZXIgZmluZCB0aGUgaGVpZ2h0IG9mIGFsbAoJCQkvLyB0aGUgb3RoZXIgZWxlbWVudHMKCQkJZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMHB4JzsKCgkJCS8vIEluIE92ZXJ2aWV3IG1vZGUsIHRoZSBwYXJlbnQgKC5zbGlkZSkgaGVpZ2h0IGlzIHNldCBvZiA3MDBweC4KCQkJLy8gUmVzdG9yZSBpdCB0ZW1wb3JhcmlseSB0byBpdHMgbmF0dXJhbCBoZWlnaHQuCgkJCWVsZW1lbnQucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7CgoJCQluZXdIZWlnaHQgPSBoZWlnaHQgLSBlbGVtZW50LnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0OwoKCQkJLy8gUmVzdG9yZSB0aGUgb2xkIGhlaWdodCwganVzdCBpbiBjYXNlCgkJCWVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gb2xkSGVpZ2h0ICsgJ3B4JzsKCgkJCS8vIENsZWFyIHRoZSBwYXJlbnQgKC5zbGlkZSkgaGVpZ2h0LiAucmVtb3ZlUHJvcGVydHkgd29ya3MgaW4gSUU5KwoJCQllbGVtZW50LnBhcmVudE5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpOwoKCQkJcmV0dXJuIG5ld0hlaWdodDsKCQl9CgoJCXJldHVybiBoZWlnaHQ7CgoJfQoKCS8qKgoJICogQ2hlY2tzIGlmIHRoaXMgaW5zdGFuY2UgaXMgYmVpbmcgdXNlZCB0byBwcmludCBhIFBERi4KCSAqLwoJZnVuY3Rpb24gaXNQcmludGluZ1BERigpIHsKCgkJcmV0dXJuICggL3ByaW50LXBkZi9naSApLnRlc3QoIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKTsKCgl9CgoJLyoqCgkgKiBIaWRlcyB0aGUgYWRkcmVzcyBiYXIgaWYgd2UncmUgb24gYSBtb2JpbGUgZGV2aWNlLgoJICovCglmdW5jdGlvbiBoaWRlQWRkcmVzc0JhcigpIHsKCgkJaWYoIGNvbmZpZy5oaWRlQWRkcmVzc0JhciAmJiBpc01vYmlsZURldmljZSApIHsKCQkJLy8gRXZlbnRzIHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGFkZHJlc3MgYmFyIHRvIGhpZGUKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgcmVtb3ZlQWRkcmVzc0JhciwgZmFsc2UgKTsKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdvcmllbnRhdGlvbmNoYW5nZScsIHJlbW92ZUFkZHJlc3NCYXIsIGZhbHNlICk7CgkJfQoKCX0KCgkvKioKCSAqIENhdXNlcyB0aGUgYWRkcmVzcyBiYXIgdG8gaGlkZSBvbiBtb2JpbGUgZGV2aWNlcywKCSAqIG1vcmUgdmVydGljYWwgc3BhY2UgZnR3LgoJICovCglmdW5jdGlvbiByZW1vdmVBZGRyZXNzQmFyKCkgewoKCQlzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQkJd2luZG93LnNjcm9sbFRvKCAwLCAxICk7CgkJfSwgMTAgKTsKCgl9CgoJLyoqCgkgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZQoJICogcmV2ZWFsIERPTSBlbGVtZW50LgoJICovCglmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KCB0eXBlLCBhcmdzICkgewoKCQl2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCggJ0hUTUxFdmVudHMnLCAxLCAyICk7CgkJZXZlbnQuaW5pdEV2ZW50KCB0eXBlLCB0cnVlLCB0cnVlICk7CgkJZXh0ZW5kKCBldmVudCwgYXJncyApOwoJCWRvbS53cmFwcGVyLmRpc3BhdGNoRXZlbnQoIGV2ZW50ICk7CgoJCS8vIElmIHdlJ3JlIGluIGFuIGlmcmFtZSwgcG9zdCBlYWNoIHJldmVhbC5qcyBldmVudCB0byB0aGUKCQkvLyBwYXJlbnQgd2luZG93LiBVc2VkIGJ5IHRoZSBub3RlcyBwbHVnaW4KCQlkaXNwYXRjaFBvc3RNZXNzYWdlKCB0eXBlICk7CgoJfQoKCS8qKgoJICogRGlzcGF0Y2hlZCBhIHBvc3RNZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gb3VyIHdpbmRvdy4KCSAqLwoJZnVuY3Rpb24gZGlzcGF0Y2hQb3N0TWVzc2FnZSggdHlwZSwgZGF0YSApIHsKCgkJaWYoIGNvbmZpZy5wb3N0TWVzc2FnZUV2ZW50cyAmJiB3aW5kb3cucGFyZW50ICE9PSB3aW5kb3cuc2VsZiApIHsKCQkJdmFyIG1lc3NhZ2UgPSB7CgkJCQluYW1lc3BhY2U6ICdyZXZlYWwnLAoJCQkJZXZlbnROYW1lOiB0eXBlLAoJCQkJc3RhdGU6IGdldFN0YXRlKCkKCQkJfTsKCgkJCWV4dGVuZCggbWVzc2FnZSwgZGF0YSApOwoKCQkJd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSggSlNPTi5zdHJpbmdpZnkoIG1lc3NhZ2UgKSwgJyonICk7CgkJfQoKCX0KCgkvKioKCSAqIFdyYXAgYWxsIGxpbmtzIGluIDNEIGdvb2RuZXNzLgoJICovCglmdW5jdGlvbiBlbmFibGVSb2xsaW5nTGlua3MoKSB7CgoJCWlmKCBmZWF0dXJlcy50cmFuc2Zvcm1zM2QgJiYgISggJ21zUGVyc3BlY3RpdmUnIGluIGRvY3VtZW50LmJvZHkuc3R5bGUgKSApIHsKCQkJdmFyIGFuY2hvcnMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBTTElERVNfU0VMRUNUT1IgKyAnIGEnICk7CgoJCQlmb3IoIHZhciBpID0gMCwgbGVuID0gYW5jaG9ycy5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHsKCQkJCXZhciBhbmNob3IgPSBhbmNob3JzW2ldOwoKCQkJCWlmKCBhbmNob3IudGV4dENvbnRlbnQgJiYgIWFuY2hvci5xdWVyeVNlbGVjdG9yKCAnKicgKSAmJiAoICFhbmNob3IuY2xhc3NOYW1lIHx8ICFhbmNob3IuY2xhc3NMaXN0LmNvbnRhaW5zKCBhbmNob3IsICdyb2xsJyApICkgKSB7CgkJCQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJCQkJc3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGl0bGUnLCBhbmNob3IudGV4dCk7CgkJCQkJc3Bhbi5pbm5lckhUTUwgPSBhbmNob3IuaW5uZXJIVE1MOwoKCQkJCQlhbmNob3IuY2xhc3NMaXN0LmFkZCggJ3JvbGwnICk7CgkJCQkJYW5jaG9yLmlubmVySFRNTCA9ICcnOwoJCQkJCWFuY2hvci5hcHBlbmRDaGlsZChzcGFuKTsKCQkJCX0KCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBVbndyYXAgYWxsIDNEIGxpbmtzLgoJICovCglmdW5jdGlvbiBkaXNhYmxlUm9sbGluZ0xpbmtzKCkgewoKCQl2YXIgYW5jaG9ycyA9IGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIFNMSURFU19TRUxFQ1RPUiArICcgYS5yb2xsJyApOwoKCQlmb3IoIHZhciBpID0gMCwgbGVuID0gYW5jaG9ycy5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHsKCQkJdmFyIGFuY2hvciA9IGFuY2hvcnNbaV07CgkJCXZhciBzcGFuID0gYW5jaG9yLnF1ZXJ5U2VsZWN0b3IoICdzcGFuJyApOwoKCQkJaWYoIHNwYW4gKSB7CgkJCQlhbmNob3IuY2xhc3NMaXN0LnJlbW92ZSggJ3JvbGwnICk7CgkJCQlhbmNob3IuaW5uZXJIVE1MID0gc3Bhbi5pbm5lckhUTUw7CgkJCX0KCQl9CgoJfQoKCS8qKgoJICogQmluZCBwcmV2aWV3IGZyYW1lIGxpbmtzLgoJICoKCSAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9YV0gLSBzZWxlY3RvciBmb3IgYW5jaG9ycwoJICovCglmdW5jdGlvbiBlbmFibGVQcmV2aWV3TGlua3MoIHNlbGVjdG9yICkgewoKCQl2YXIgYW5jaG9ycyA9IHRvQXJyYXkoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yID8gc2VsZWN0b3IgOiAnYScgKSApOwoKCQlhbmNob3JzLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCQlpZiggL14oaHR0cHx3d3cpL2dpLnRlc3QoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAnaHJlZicgKSApICkgewoJCQkJZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBvblByZXZpZXdMaW5rQ2xpY2tlZCwgZmFsc2UgKTsKCQkJfQoJCX0gKTsKCgl9CgoJLyoqCgkgKiBVbmJpbmQgcHJldmlldyBmcmFtZSBsaW5rcy4KCSAqLwoJZnVuY3Rpb24gZGlzYWJsZVByZXZpZXdMaW5rcyggc2VsZWN0b3IgKSB7CgoJCXZhciBhbmNob3JzID0gdG9BcnJheSggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgPyBzZWxlY3RvciA6ICdhJyApICk7CgoJCWFuY2hvcnMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJCWlmKCAvXihodHRwfHd3dykvZ2kudGVzdCggZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdocmVmJyApICkgKSB7CgkJCQllbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjbGljaycsIG9uUHJldmlld0xpbmtDbGlja2VkLCBmYWxzZSApOwoJCQl9CgkJfSApOwoKCX0KCgkvKioKCSAqIE9wZW5zIGEgcHJldmlldyB3aW5kb3cgZm9yIHRoZSB0YXJnZXQgVVJMLgoJICoKCSAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSB1cmwgZm9yIHByZXZpZXcgaWZyYW1lIHNyYwoJICovCglmdW5jdGlvbiBzaG93UHJldmlldyggdXJsICkgewoKCQljbG9zZU92ZXJsYXkoKTsKCgkJZG9tLm92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApOwoJCWRvbS5vdmVybGF5LmNsYXNzTGlzdC5hZGQoICdvdmVybGF5JyApOwoJCWRvbS5vdmVybGF5LmNsYXNzTGlzdC5hZGQoICdvdmVybGF5LXByZXZpZXcnICk7CgkJZG9tLndyYXBwZXIuYXBwZW5kQ2hpbGQoIGRvbS5vdmVybGF5ICk7CgoJCWRvbS5vdmVybGF5LmlubmVySFRNTCA9IFsKCQkJJzxoZWFkZXI+JywKCQkJCSc8YSBjbGFzcz0iY2xvc2UiIGhyZWY9IiMiPjxzcGFuIGNsYXNzPSJpY29uIj48L3NwYW4+PC9hPicsCgkJCQknPGEgY2xhc3M9ImV4dGVybmFsIiBocmVmPSInKyB1cmwgKyciIHRhcmdldD0iX2JsYW5rIj48c3BhbiBjbGFzcz0iaWNvbiI+PC9zcGFuPjwvYT4nLAoJCQknPC9oZWFkZXI+JywKCQkJJzxkaXYgY2xhc3M9InNwaW5uZXIiPjwvZGl2PicsCgkJCSc8ZGl2IGNsYXNzPSJ2aWV3cG9ydCI+JywKCQkJCSc8aWZyYW1lIHNyYz0iJysgdXJsICsnIj48L2lmcmFtZT4nLAoJCQkJJzxzbWFsbCBjbGFzcz0idmlld3BvcnQtaW5uZXIiPicsCgkJCQkJJzxzcGFuIGNsYXNzPSJ4LWZyYW1lLWVycm9yIj5VbmFibGUgdG8gbG9hZCBpZnJhbWUuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byB0aGUgc2l0ZVwncyBwb2xpY3kgKHgtZnJhbWUtb3B0aW9ucykuPC9zcGFuPicsCgkJCQknPC9zbWFsbD4nLAoJCQknPC9kaXY+JwoJCV0uam9pbignJyk7CgoJCWRvbS5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoICdpZnJhbWUnICkuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWRvbS5vdmVybGF5LmNsYXNzTGlzdC5hZGQoICdsb2FkZWQnICk7CgkJfSwgZmFsc2UgKTsKCgkJZG9tLm92ZXJsYXkucXVlcnlTZWxlY3RvciggJy5jbG9zZScgKS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWNsb3NlT3ZlcmxheSgpOwoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0sIGZhbHNlICk7CgoJCWRvbS5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoICcuZXh0ZXJuYWwnICkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQljbG9zZU92ZXJsYXkoKTsKCQl9LCBmYWxzZSApOwoKCQlzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQkJZG9tLm92ZXJsYXkuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnICk7CgkJfSwgMSApOwoKCX0KCgkvKioKCSAqIE9wZW4gb3IgY2xvc2UgaGVscCBvdmVybGF5IHdpbmRvdy4KCSAqCgkgKiBAcGFyYW0ge0Jvb2xlYW59IFtvdmVycmlkZV0gRmxhZyB3aGljaCBvdmVycmlkZXMgdGhlCgkgKiB0b2dnbGUgbG9naWMgYW5kIGZvcmNpYmx5IHNldHMgdGhlIGRlc2lyZWQgc3RhdGUuIFRydWUgbWVhbnMKCSAqIGhlbHAgaXMgb3BlbiwgZmFsc2UgbWVhbnMgaXQncyBjbG9zZWQuCgkgKi8KCWZ1bmN0aW9uIHRvZ2dsZUhlbHAoIG92ZXJyaWRlICl7CgoJCWlmKCB0eXBlb2Ygb3ZlcnJpZGUgPT09ICdib29sZWFuJyApIHsKCQkJb3ZlcnJpZGUgPyBzaG93SGVscCgpIDogY2xvc2VPdmVybGF5KCk7CgkJfQoJCWVsc2UgewoJCQlpZiggZG9tLm92ZXJsYXkgKSB7CgkJCQljbG9zZU92ZXJsYXkoKTsKCQkJfQoJCQllbHNlIHsKCQkJCXNob3dIZWxwKCk7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBPcGVucyBhbiBvdmVybGF5IHdpbmRvdyB3aXRoIGhlbHAgbWF0ZXJpYWwuCgkgKi8KCWZ1bmN0aW9uIHNob3dIZWxwKCkgewoKCQlpZiggY29uZmlnLmhlbHAgKSB7CgoJCQljbG9zZU92ZXJsYXkoKTsKCgkJCWRvbS5vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTsKCQkJZG9tLm92ZXJsYXkuY2xhc3NMaXN0LmFkZCggJ292ZXJsYXknICk7CgkJCWRvbS5vdmVybGF5LmNsYXNzTGlzdC5hZGQoICdvdmVybGF5LWhlbHAnICk7CgkJCWRvbS53cmFwcGVyLmFwcGVuZENoaWxkKCBkb20ub3ZlcmxheSApOwoKCQkJdmFyIGh0bWwgPSAnPHAgY2xhc3M9InRpdGxlIj5LZXlib2FyZCBTaG9ydGN1dHM8L3A+PGJyLz4nOwoKCQkJaHRtbCArPSAnPHRhYmxlPjx0aD5LRVk8L3RoPjx0aD5BQ1RJT048L3RoPic7CgkJCWZvciggdmFyIGtleSBpbiBrZXlib2FyZFNob3J0Y3V0cyApIHsKCQkJCWh0bWwgKz0gJzx0cj48dGQ+JyArIGtleSArICc8L3RkPjx0ZD4nICsga2V5Ym9hcmRTaG9ydGN1dHNbIGtleSBdICsgJzwvdGQ+PC90cj4nOwoJCQl9CgoJCQkvLyBBZGQgY3VzdG9tIGtleSBiaW5kaW5ncyB0aGF0IGhhdmUgYXNzb2NpYXRlZCBkZXNjcmlwdGlvbnMKCQkJZm9yKCB2YXIgYmluZGluZyBpbiByZWdpc3RlcmVkS2V5QmluZGluZ3MgKSB7CgkJCQlpZiggcmVnaXN0ZXJlZEtleUJpbmRpbmdzW2JpbmRpbmddLmtleSAmJiByZWdpc3RlcmVkS2V5QmluZGluZ3NbYmluZGluZ10uZGVzY3JpcHRpb24gKSB7CgkJCQkJaHRtbCArPSAnPHRyPjx0ZD4nICsgcmVnaXN0ZXJlZEtleUJpbmRpbmdzW2JpbmRpbmddLmtleSArICc8L3RkPjx0ZD4nICsgcmVnaXN0ZXJlZEtleUJpbmRpbmdzW2JpbmRpbmddLmRlc2NyaXB0aW9uICsgJzwvdGQ+PC90cj4nOwoJCQkJfQoJCQl9CgoJCQlodG1sICs9ICc8L3RhYmxlPic7CgoJCQlkb20ub3ZlcmxheS5pbm5lckhUTUwgPSBbCgkJCQknPGhlYWRlcj4nLAoJCQkJCSc8YSBjbGFzcz0iY2xvc2UiIGhyZWY9IiMiPjxzcGFuIGNsYXNzPSJpY29uIj48L3NwYW4+PC9hPicsCgkJCQknPC9oZWFkZXI+JywKCQkJCSc8ZGl2IGNsYXNzPSJ2aWV3cG9ydCI+JywKCQkJCQknPGRpdiBjbGFzcz0idmlld3BvcnQtaW5uZXIiPicrIGh0bWwgKyc8L2Rpdj4nLAoJCQkJJzwvZGl2PicKCQkJXS5qb2luKCcnKTsKCgkJCWRvbS5vdmVybGF5LnF1ZXJ5U2VsZWN0b3IoICcuY2xvc2UnICkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJY2xvc2VPdmVybGF5KCk7CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9LCBmYWxzZSApOwoKCQkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCQlkb20ub3ZlcmxheS5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKTsKCQkJfSwgMSApOwoKCQl9CgoJfQoKCS8qKgoJICogQ2xvc2VzIGFueSBjdXJyZW50bHkgb3BlbiBvdmVybGF5LgoJICovCglmdW5jdGlvbiBjbG9zZU92ZXJsYXkoKSB7CgoJCWlmKCBkb20ub3ZlcmxheSApIHsKCQkJZG9tLm92ZXJsYXkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZG9tLm92ZXJsYXkgKTsKCQkJZG9tLm92ZXJsYXkgPSBudWxsOwoJCX0KCgl9CgoJLyoqCgkgKiBBcHBsaWVzIEphdmFTY3JpcHQtY29udHJvbGxlZCBsYXlvdXQgcnVsZXMgdG8gdGhlCgkgKiBwcmVzZW50YXRpb24uCgkgKi8KCWZ1bmN0aW9uIGxheW91dCgpIHsKCgkJaWYoIGRvbS53cmFwcGVyICYmICFpc1ByaW50aW5nUERGKCkgKSB7CgoJCQlpZiggIWNvbmZpZy5kaXNhYmxlTGF5b3V0ICkgewoKCQkJCS8vIE9uIHNvbWUgbW9iaWxlIGRldmljZXMgJzEwMHZoJyBpcyB0YWxsZXIgdGhhbiB0aGUgdmlzaWJsZQoJCQkJLy8gdmlld3BvcnQgd2hpY2ggbGVhZHMgdG8gcGFydCBvZiB0aGUgcHJlc2VudGF0aW9uIGJlaW5nCgkJCQkvLyBjdXQgb2ZmLiBUbyB3b3JrIGFyb3VuZCB0aGlzIHdlIGRlZmluZSBvdXIgb3duICctLXZoJyBjdXN0b20KCQkJCS8vIHByb3BlcnR5IHdoZXJlIDEwMHggYWRkcyB1cCB0byB0aGUgY29ycmVjdCBoZWlnaHQuCgkJCQkvLwoJCQkJLy8gaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS90aGUtdHJpY2stdG8tdmlld3BvcnQtdW5pdHMtb24tbW9iaWxlLwoJCQkJaWYoIGlzTW9iaWxlRGV2aWNlICkgewoJCQkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSggJy0tdmgnLCAoIHdpbmRvdy5pbm5lckhlaWdodCAqIDAuMDEgKSArICdweCcgKTsKCQkJCX0KCgkJCQl2YXIgc2l6ZSA9IGdldENvbXB1dGVkU2xpZGVTaXplKCk7CgoJCQkJdmFyIG9sZFNjYWxlID0gc2NhbGU7CgoJCQkJLy8gTGF5b3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc2xpZGVzCgkJCQlsYXlvdXRTbGlkZUNvbnRlbnRzKCBjb25maWcud2lkdGgsIGNvbmZpZy5oZWlnaHQgKTsKCgkJCQlkb20uc2xpZGVzLnN0eWxlLndpZHRoID0gc2l6ZS53aWR0aCArICdweCc7CgkJCQlkb20uc2xpZGVzLnN0eWxlLmhlaWdodCA9IHNpemUuaGVpZ2h0ICsgJ3B4JzsKCgkJCQkvLyBEZXRlcm1pbmUgc2NhbGUgb2YgY29udGVudCB0byBmaXQgd2l0aGluIGF2YWlsYWJsZSBzcGFjZQoJCQkJc2NhbGUgPSBNYXRoLm1pbiggc2l6ZS5wcmVzZW50YXRpb25XaWR0aCAvIHNpemUud2lkdGgsIHNpemUucHJlc2VudGF0aW9uSGVpZ2h0IC8gc2l6ZS5oZWlnaHQgKTsKCgkJCQkvLyBSZXNwZWN0IG1heC9taW4gc2NhbGUgc2V0dGluZ3MKCQkJCXNjYWxlID0gTWF0aC5tYXgoIHNjYWxlLCBjb25maWcubWluU2NhbGUgKTsKCQkJCXNjYWxlID0gTWF0aC5taW4oIHNjYWxlLCBjb25maWcubWF4U2NhbGUgKTsKCgkJCQkvLyBEb24ndCBhcHBseSBhbnkgc2NhbGluZyBzdHlsZXMgaWYgc2NhbGUgaXMgMQoJCQkJaWYoIHNjYWxlID09PSAxICkgewoJCQkJCWRvbS5zbGlkZXMuc3R5bGUuem9vbSA9ICcnOwoJCQkJCWRvbS5zbGlkZXMuc3R5bGUubGVmdCA9ICcnOwoJCQkJCWRvbS5zbGlkZXMuc3R5bGUudG9wID0gJyc7CgkJCQkJZG9tLnNsaWRlcy5zdHlsZS5ib3R0b20gPSAnJzsKCQkJCQlkb20uc2xpZGVzLnN0eWxlLnJpZ2h0ID0gJyc7CgkJCQkJdHJhbnNmb3JtU2xpZGVzKCB7IGxheW91dDogJycgfSApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJLy8gWm9vbSBTY2FsaW5nCgkJCQkJLy8gQ29udGVudCByZW1haW5zIGNyaXNwIG5vIG1hdHRlciBob3cgbXVjaCB3ZSBzY2FsZS4gU2lkZQoJCQkJCS8vIGVmZmVjdHMgYXJlIG1pbm9yIGRpZmZlcmVuY2VzIGluIHRleHQgbGF5b3V0IGFuZCBpZnJhbWUKCQkJCQkvLyB2aWV3cG9ydHMgY2hhbmdpbmcgc2l6ZS4gQSAyMDB4MjAwIGlmcmFtZSB2aWV3cG9ydCBpbiBhCgkJCQkJLy8gMnggem9vbWVkIHByZXNlbnRhdGlvbiBlbmRzIHVwIGhhdmluZyBhIDQwMHg0MDAgdmlld3BvcnQuCgkJCQkJaWYoIHNjYWxlID4gMSAmJiBmZWF0dXJlcy56b29tICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDwgMiApIHsKCQkJCQkJZG9tLnNsaWRlcy5zdHlsZS56b29tID0gc2NhbGU7CgkJCQkJCWRvbS5zbGlkZXMuc3R5bGUubGVmdCA9ICcnOwoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLnRvcCA9ICcnOwoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLmJvdHRvbSA9ICcnOwoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLnJpZ2h0ID0gJyc7CgkJCQkJCXRyYW5zZm9ybVNsaWRlcyggeyBsYXlvdXQ6ICcnIH0gKTsKCQkJCQl9CgkJCQkJLy8gVHJhbnNmb3JtIFNjYWxpbmcKCQkJCQkvLyBDb250ZW50IGxheW91dCByZW1haW5zIHRoZSBleGFjdCBzYW1lIHdoZW4gc2NhbGVkIHVwLgoJCQkJCS8vIFNpZGUgZWZmZWN0IGlzIGNvbnRlbnQgYmVjb21pbmcgYmx1cnJlZCwgZXNwZWNpYWxseSB3aXRoCgkJCQkJLy8gaGlnaCBzY2FsZSB2YWx1ZXMgb24gbGRwaSBzY3JlZW5zLgoJCQkJCWVsc2UgewoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLnpvb20gPSAnJzsKCQkJCQkJZG9tLnNsaWRlcy5zdHlsZS5sZWZ0ID0gJzUwJSc7CgkJCQkJCWRvbS5zbGlkZXMuc3R5bGUudG9wID0gJzUwJSc7CgkJCQkJCWRvbS5zbGlkZXMuc3R5bGUuYm90dG9tID0gJ2F1dG8nOwoJCQkJCQlkb20uc2xpZGVzLnN0eWxlLnJpZ2h0ID0gJ2F1dG8nOwoJCQkJCQl0cmFuc2Zvcm1TbGlkZXMoIHsgbGF5b3V0OiAndHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKCcrIHNjYWxlICsnKScgfSApOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBTZWxlY3QgYWxsIHNsaWRlcywgdmVydGljYWwgYW5kIGhvcml6b250YWwKCQkJCXZhciBzbGlkZXMgPSB0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBTTElERVNfU0VMRUNUT1IgKSApOwoKCQkJCWZvciggdmFyIGkgPSAwLCBsZW4gPSBzbGlkZXMubGVuZ3RoOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJdmFyIHNsaWRlID0gc2xpZGVzWyBpIF07CgoJCQkJCS8vIERvbid0IGJvdGhlciB1cGRhdGluZyBpbnZpc2libGUgc2xpZGVzCgkJCQkJaWYoIHNsaWRlLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyApIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoKCQkJCQlpZiggY29uZmlnLmNlbnRlciB8fCBzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoICdjZW50ZXInICkgKSB7CgkJCQkJCS8vIFZlcnRpY2FsIHN0YWNrcyBhcmUgbm90IGNlbnRyZWQgc2luY2UgdGhlaXIgc2VjdGlvbgoJCQkJCQkvLyBjaGlsZHJlbiB3aWxsIGJlCgkJCQkJCWlmKCBzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoICdzdGFjaycgKSApIHsKCQkJCQkJCXNsaWRlLnN0eWxlLnRvcCA9IDA7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQlzbGlkZS5zdHlsZS50b3AgPSBNYXRoLm1heCggKCBzaXplLmhlaWdodCAtIHNsaWRlLnNjcm9sbEhlaWdodCApIC8gMiwgMCApICsgJ3B4JzsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJc2xpZGUuc3R5bGUudG9wID0gJyc7CgkJCQkJfQoKCQkJCX0KCgkJCQlpZiggb2xkU2NhbGUgIT09IHNjYWxlICkgewoJCQkJCWRpc3BhdGNoRXZlbnQoICdyZXNpemUnLCB7CgkJCQkJCSdvbGRTY2FsZSc6IG9sZFNjYWxlLAoJCQkJCQknc2NhbGUnOiBzY2FsZSwKCQkJCQkJJ3NpemUnOiBzaXplCgkJCQkJfSApOwoJCQkJfQoJCQl9CgoJCQl1cGRhdGVQcm9ncmVzcygpOwoJCQl1cGRhdGVQYXJhbGxheCgpOwoKCQkJaWYoIGlzT3ZlcnZpZXcoKSApIHsKCQkJCXVwZGF0ZU92ZXJ2aWV3KCk7CgkJCX0KCgkJfQoKCX0KCgkvKioKCSAqIEFwcGxpZXMgbGF5b3V0IGxvZ2ljIHRvIHRoZSBjb250ZW50cyBvZiBhbGwgc2xpZGVzIGluCgkgKiB0aGUgcHJlc2VudGF0aW9uLgoJICoKCSAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gd2lkdGgKCSAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaGVpZ2h0CgkgKi8KCWZ1bmN0aW9uIGxheW91dFNsaWRlQ29udGVudHMoIHdpZHRoLCBoZWlnaHQgKSB7CgoJCS8vIEhhbmRsZSBzaXppbmcgb2YgZWxlbWVudHMgd2l0aCB0aGUgJ3N0cmV0Y2gnIGNsYXNzCgkJdG9BcnJheSggZG9tLnNsaWRlcy5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbiA+IC5zdHJldGNoJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgoJCQkvLyBEZXRlcm1pbmUgaG93IG11Y2ggdmVydGljYWwgc3BhY2Ugd2UgY2FuIHVzZQoJCQl2YXIgcmVtYWluaW5nSGVpZ2h0ID0gZ2V0UmVtYWluaW5nSGVpZ2h0KCBlbGVtZW50LCBoZWlnaHQgKTsKCgkJCS8vIENvbnNpZGVyIHRoZSBhc3BlY3QgcmF0aW8gb2YgbWVkaWEgZWxlbWVudHMKCQkJaWYoIC8oaW1nfHZpZGVvKS9naS50ZXN0KCBlbGVtZW50Lm5vZGVOYW1lICkgKSB7CgkJCQl2YXIgbncgPSBlbGVtZW50Lm5hdHVyYWxXaWR0aCB8fCBlbGVtZW50LnZpZGVvV2lkdGgsCgkJCQkJbmggPSBlbGVtZW50Lm5hdHVyYWxIZWlnaHQgfHwgZWxlbWVudC52aWRlb0hlaWdodDsKCgkJCQl2YXIgZXMgPSBNYXRoLm1pbiggd2lkdGggLyBudywgcmVtYWluaW5nSGVpZ2h0IC8gbmggKTsKCgkJCQllbGVtZW50LnN0eWxlLndpZHRoID0gKCBudyAqIGVzICkgKyAncHgnOwoJCQkJZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAoIG5oICogZXMgKSArICdweCc7CgoJCQl9CgkJCWVsc2UgewoJCQkJZWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JzsKCQkJCWVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmVtYWluaW5nSGVpZ2h0ICsgJ3B4JzsKCQkJfQoKCQl9ICk7CgoJfQoKCS8qKgoJICogQ2FsY3VsYXRlcyB0aGUgY29tcHV0ZWQgcGl4ZWwgc2l6ZSBvZiBvdXIgc2xpZGVzLiBUaGVzZQoJICogdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBjb25maWd1cmF0aW9uCgkgKiBvcHRpb25zLgoJICoKCSAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlc2VudGF0aW9uV2lkdGg9ZG9tLndyYXBwZXIub2Zmc2V0V2lkdGhdCgkgKiBAcGFyYW0ge251bWJlcn0gW3ByZXNlbnRhdGlvbkhlaWdodD1kb20ud3JhcHBlci5vZmZzZXRIZWlnaHRdCgkgKi8KCWZ1bmN0aW9uIGdldENvbXB1dGVkU2xpZGVTaXplKCBwcmVzZW50YXRpb25XaWR0aCwgcHJlc2VudGF0aW9uSGVpZ2h0ICkgewoKCQl2YXIgc2l6ZSA9IHsKCQkJLy8gU2xpZGUgc2l6ZQoJCQl3aWR0aDogY29uZmlnLndpZHRoLAoJCQloZWlnaHQ6IGNvbmZpZy5oZWlnaHQsCgoJCQkvLyBQcmVzZW50YXRpb24gc2l6ZQoJCQlwcmVzZW50YXRpb25XaWR0aDogcHJlc2VudGF0aW9uV2lkdGggfHwgZG9tLndyYXBwZXIub2Zmc2V0V2lkdGgsCgkJCXByZXNlbnRhdGlvbkhlaWdodDogcHJlc2VudGF0aW9uSGVpZ2h0IHx8IGRvbS53cmFwcGVyLm9mZnNldEhlaWdodAoJCX07CgoJCS8vIFJlZHVjZSBhdmFpbGFibGUgc3BhY2UgYnkgbWFyZ2luCgkJc2l6ZS5wcmVzZW50YXRpb25XaWR0aCAtPSAoIHNpemUucHJlc2VudGF0aW9uV2lkdGggKiBjb25maWcubWFyZ2luICk7CgkJc2l6ZS5wcmVzZW50YXRpb25IZWlnaHQgLT0gKCBzaXplLnByZXNlbnRhdGlvbkhlaWdodCAqIGNvbmZpZy5tYXJnaW4gKTsKCgkJLy8gU2xpZGUgd2lkdGggbWF5IGJlIGEgcGVyY2VudGFnZSBvZiBhdmFpbGFibGUgd2lkdGgKCQlpZiggdHlwZW9mIHNpemUud2lkdGggPT09ICdzdHJpbmcnICYmIC8lJC8udGVzdCggc2l6ZS53aWR0aCApICkgewoJCQlzaXplLndpZHRoID0gcGFyc2VJbnQoIHNpemUud2lkdGgsIDEwICkgLyAxMDAgKiBzaXplLnByZXNlbnRhdGlvbldpZHRoOwoJCX0KCgkJLy8gU2xpZGUgaGVpZ2h0IG1heSBiZSBhIHBlcmNlbnRhZ2Ugb2YgYXZhaWxhYmxlIGhlaWdodAoJCWlmKCB0eXBlb2Ygc2l6ZS5oZWlnaHQgPT09ICdzdHJpbmcnICYmIC8lJC8udGVzdCggc2l6ZS5oZWlnaHQgKSApIHsKCQkJc2l6ZS5oZWlnaHQgPSBwYXJzZUludCggc2l6ZS5oZWlnaHQsIDEwICkgLyAxMDAgKiBzaXplLnByZXNlbnRhdGlvbkhlaWdodDsKCQl9CgoJCXJldHVybiBzaXplOwoKCX0KCgkvKioKCSAqIFN0b3JlcyB0aGUgdmVydGljYWwgaW5kZXggb2YgYSBzdGFjayBzbyB0aGF0IHRoZSBzYW1lCgkgKiB2ZXJ0aWNhbCBzbGlkZSBjYW4gYmUgc2VsZWN0ZWQgd2hlbiBuYXZpZ2F0aW5nIHRvIGFuZAoJICogZnJvbSB0aGUgc3RhY2suCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc3RhY2sgVGhlIHZlcnRpY2FsIHN0YWNrIGVsZW1lbnQKCSAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3Y9MF0gSW5kZXggdG8gbWVtb3JpemUKCSAqLwoJZnVuY3Rpb24gc2V0UHJldmlvdXNWZXJ0aWNhbEluZGV4KCBzdGFjaywgdiApIHsKCgkJaWYoIHR5cGVvZiBzdGFjayA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHN0YWNrLnNldEF0dHJpYnV0ZSA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJc3RhY2suc2V0QXR0cmlidXRlKCAnZGF0YS1wcmV2aW91cy1pbmRleHYnLCB2IHx8IDAgKTsKCQl9CgoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSB2ZXJ0aWNhbCBpbmRleCB3aGljaCB3YXMgc3RvcmVkIHVzaW5nCgkgKiAjc2V0UHJldmlvdXNWZXJ0aWNhbEluZGV4KCkgb3IgMCBpZiBubyBwcmV2aW91cyBpbmRleAoJICogZXhpc3RzLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHN0YWNrIFRoZSB2ZXJ0aWNhbCBzdGFjayBlbGVtZW50CgkgKi8KCWZ1bmN0aW9uIGdldFByZXZpb3VzVmVydGljYWxJbmRleCggc3RhY2sgKSB7CgoJCWlmKCB0eXBlb2Ygc3RhY2sgPT09ICdvYmplY3QnICYmIHR5cGVvZiBzdGFjay5zZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbicgJiYgc3RhY2suY2xhc3NMaXN0LmNvbnRhaW5zKCAnc3RhY2snICkgKSB7CgkJCS8vIFByZWZlciBtYW51YWxseSBkZWZpbmVkIHN0YXJ0LWluZGV4dgoJCQl2YXIgYXR0cmlidXRlTmFtZSA9IHN0YWNrLmhhc0F0dHJpYnV0ZSggJ2RhdGEtc3RhcnQtaW5kZXh2JyApID8gJ2RhdGEtc3RhcnQtaW5kZXh2JyA6ICdkYXRhLXByZXZpb3VzLWluZGV4dic7CgoJCQlyZXR1cm4gcGFyc2VJbnQoIHN0YWNrLmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApIHx8IDAsIDEwICk7CgkJfQoKCQlyZXR1cm4gMDsKCgl9CgoJLyoqCgkgKiBEaXNwbGF5cyB0aGUgb3ZlcnZpZXcgb2Ygc2xpZGVzIChxdWljayBuYXYpIGJ5IHNjYWxpbmcKCSAqIGRvd24gYW5kIGFycmFuZ2luZyBhbGwgc2xpZGUgZWxlbWVudHMuCgkgKi8KCWZ1bmN0aW9uIGFjdGl2YXRlT3ZlcnZpZXcoKSB7CgoJCS8vIE9ubHkgcHJvY2VlZCBpZiBlbmFibGVkIGluIGNvbmZpZwoJCWlmKCBjb25maWcub3ZlcnZpZXcgJiYgIWlzT3ZlcnZpZXcoKSApIHsKCgkJCW92ZXJ2aWV3ID0gdHJ1ZTsKCgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdvdmVydmlldycgKTsKCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSggJ292ZXJ2aWV3LWRlYWN0aXZhdGluZycgKTsKCgkJCWlmKCBmZWF0dXJlcy5vdmVydmlld1RyYW5zaXRpb25zICkgewoJCQkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LmFkZCggJ292ZXJ2aWV3LWFuaW1hdGVkJyApOwoJCQkJfSwgMSApOwoJCQl9CgoJCQkvLyBEb24ndCBhdXRvLXNsaWRlIHdoaWxlIGluIG92ZXJ2aWV3IG1vZGUKCQkJY2FuY2VsQXV0b1NsaWRlKCk7CgoJCQkvLyBNb3ZlIHRoZSBiYWNrZ3JvdW5kcyBlbGVtZW50IGludG8gdGhlIHNsaWRlIGNvbnRhaW5lciB0bwoJCQkvLyB0aGF0IHRoZSBzYW1lIHNjYWxpbmcgaXMgYXBwbGllZAoJCQlkb20uc2xpZGVzLmFwcGVuZENoaWxkKCBkb20uYmFja2dyb3VuZCApOwoKCQkJLy8gQ2xpY2tpbmcgb24gYW4gb3ZlcnZpZXcgc2xpZGUgbmF2aWdhdGVzIHRvIGl0CgkJCXRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIFNMSURFU19TRUxFQ1RPUiApICkuZm9yRWFjaCggZnVuY3Rpb24oIHNsaWRlICkgewoJCQkJaWYoICFzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoICdzdGFjaycgKSApIHsKCQkJCQlzbGlkZS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBvbk92ZXJ2aWV3U2xpZGVDbGlja2VkLCB0cnVlICk7CgkJCQl9CgkJCX0gKTsKCgkJCS8vIENhbGN1bGF0ZSBzbGlkZSBzaXplcwoJCQl2YXIgbWFyZ2luID0gNzA7CgkJCXZhciBzbGlkZVNpemUgPSBnZXRDb21wdXRlZFNsaWRlU2l6ZSgpOwoJCQlvdmVydmlld1NsaWRlV2lkdGggPSBzbGlkZVNpemUud2lkdGggKyBtYXJnaW47CgkJCW92ZXJ2aWV3U2xpZGVIZWlnaHQgPSBzbGlkZVNpemUuaGVpZ2h0ICsgbWFyZ2luOwoKCQkJLy8gUmV2ZXJzZSBpbiBSVEwgbW9kZQoJCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJCW92ZXJ2aWV3U2xpZGVXaWR0aCA9IC1vdmVydmlld1NsaWRlV2lkdGg7CgkJCX0KCgkJCXVwZGF0ZVNsaWRlc1Zpc2liaWxpdHkoKTsKCQkJbGF5b3V0T3ZlcnZpZXcoKTsKCQkJdXBkYXRlT3ZlcnZpZXcoKTsKCgkJCWxheW91dCgpOwoKCQkJLy8gTm90aWZ5IG9ic2VydmVycyBvZiB0aGUgb3ZlcnZpZXcgc2hvd2luZwoJCQlkaXNwYXRjaEV2ZW50KCAnb3ZlcnZpZXdzaG93bicsIHsKCQkJCSdpbmRleGgnOiBpbmRleGgsCgkJCQknaW5kZXh2JzogaW5kZXh2LAoJCQkJJ2N1cnJlbnRTbGlkZSc6IGN1cnJlbnRTbGlkZQoJCQl9ICk7CgoJCX0KCgl9CgoJLyoqCgkgKiBVc2VzIENTUyB0cmFuc2Zvcm1zIHRvIHBvc2l0aW9uIGFsbCBzbGlkZXMgaW4gYSBncmlkIGZvcgoJICogZGlzcGxheSBpbnNpZGUgb2YgdGhlIG92ZXJ2aWV3IG1vZGUuCgkgKi8KCWZ1bmN0aW9uIGxheW91dE92ZXJ2aWV3KCkgewoKCQkvLyBMYXlvdXQgc2xpZGVzCgkJdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBoc2xpZGUsIGggKSB7CgkJCWhzbGlkZS5zZXRBdHRyaWJ1dGUoICdkYXRhLWluZGV4LWgnLCBoICk7CgkJCXRyYW5zZm9ybUVsZW1lbnQoIGhzbGlkZSwgJ3RyYW5zbGF0ZTNkKCcgKyAoIGggKiBvdmVydmlld1NsaWRlV2lkdGggKSArICdweCwgMCwgMCknICk7CgoJCQlpZiggaHNsaWRlLmNsYXNzTGlzdC5jb250YWlucyggJ3N0YWNrJyApICkgewoKCQkJCXRvQXJyYXkoIGhzbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbicgKSApLmZvckVhY2goIGZ1bmN0aW9uKCB2c2xpZGUsIHYgKSB7CgkJCQkJdnNsaWRlLnNldEF0dHJpYnV0ZSggJ2RhdGEtaW5kZXgtaCcsIGggKTsKCQkJCQl2c2xpZGUuc2V0QXR0cmlidXRlKCAnZGF0YS1pbmRleC12JywgdiApOwoKCQkJCQl0cmFuc2Zvcm1FbGVtZW50KCB2c2xpZGUsICd0cmFuc2xhdGUzZCgwLCAnICsgKCB2ICogb3ZlcnZpZXdTbGlkZUhlaWdodCApICsgJ3B4LCAwKScgKTsKCQkJCX0gKTsKCgkJCX0KCQl9ICk7CgoJCS8vIExheW91dCBzbGlkZSBiYWNrZ3JvdW5kcwoJCXRvQXJyYXkoIGRvbS5iYWNrZ3JvdW5kLmNoaWxkTm9kZXMgKS5mb3JFYWNoKCBmdW5jdGlvbiggaGJhY2tncm91bmQsIGggKSB7CgkJCXRyYW5zZm9ybUVsZW1lbnQoIGhiYWNrZ3JvdW5kLCAndHJhbnNsYXRlM2QoJyArICggaCAqIG92ZXJ2aWV3U2xpZGVXaWR0aCApICsgJ3B4LCAwLCAwKScgKTsKCgkJCXRvQXJyYXkoIGhiYWNrZ3JvdW5kLnF1ZXJ5U2VsZWN0b3JBbGwoICcuc2xpZGUtYmFja2dyb3VuZCcgKSApLmZvckVhY2goIGZ1bmN0aW9uKCB2YmFja2dyb3VuZCwgdiApIHsKCQkJCXRyYW5zZm9ybUVsZW1lbnQoIHZiYWNrZ3JvdW5kLCAndHJhbnNsYXRlM2QoMCwgJyArICggdiAqIG92ZXJ2aWV3U2xpZGVIZWlnaHQgKSArICdweCwgMCknICk7CgkJCX0gKTsKCQl9ICk7CgoJfQoKCS8qKgoJICogTW92ZXMgdGhlIG92ZXJ2aWV3IHZpZXdwb3J0IHRvIHRoZSBjdXJyZW50IHNsaWRlcy4KCSAqIENhbGxlZCBlYWNoIHRpbWUgdGhlIGN1cnJlbnQgc2xpZGUgY2hhbmdlcy4KCSAqLwoJZnVuY3Rpb24gdXBkYXRlT3ZlcnZpZXcoKSB7CgoJCXZhciB2bWluID0gTWF0aC5taW4oIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQgKTsKCQl2YXIgc2NhbGUgPSBNYXRoLm1heCggdm1pbiAvIDUsIDE1MCApIC8gdm1pbjsKCgkJdHJhbnNmb3JtU2xpZGVzKCB7CgkJCW92ZXJ2aWV3OiBbCgkJCQknc2NhbGUoJysgc2NhbGUgKycpJywKCQkJCSd0cmFuc2xhdGVYKCcrICggLWluZGV4aCAqIG92ZXJ2aWV3U2xpZGVXaWR0aCApICsncHgpJywKCQkJCSd0cmFuc2xhdGVZKCcrICggLWluZGV4diAqIG92ZXJ2aWV3U2xpZGVIZWlnaHQgKSArJ3B4KScKCQkJXS5qb2luKCAnICcgKQoJCX0gKTsKCgl9CgoJLyoqCgkgKiBFeGl0cyB0aGUgc2xpZGUgb3ZlcnZpZXcgYW5kIGVudGVycyB0aGUgY3VycmVudGx5CgkgKiBhY3RpdmUgc2xpZGUuCgkgKi8KCWZ1bmN0aW9uIGRlYWN0aXZhdGVPdmVydmlldygpIHsKCgkJLy8gT25seSBwcm9jZWVkIGlmIGVuYWJsZWQgaW4gY29uZmlnCgkJaWYoIGNvbmZpZy5vdmVydmlldyApIHsKCgkJCW92ZXJ2aWV3ID0gZmFsc2U7CgoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAnb3ZlcnZpZXcnICk7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdvdmVydmlldy1hbmltYXRlZCcgKTsKCgkJCS8vIFRlbXBvcmFyaWx5IGFkZCBhIGNsYXNzIHNvIHRoYXQgdHJhbnNpdGlvbnMgY2FuIGRvIGRpZmZlcmVudCB0aGluZ3MKCQkJLy8gZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhleSBhcmUgZXhpdGluZy9lbnRlcmluZyBvdmVydmlldywgb3IganVzdAoJCQkvLyBtb3ZpbmcgZnJvbSBzbGlkZSB0byBzbGlkZQoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCAnb3ZlcnZpZXctZGVhY3RpdmF0aW5nJyApOwoKCQkJc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewoJCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSggJ292ZXJ2aWV3LWRlYWN0aXZhdGluZycgKTsKCQkJfSwgMSApOwoKCQkJLy8gTW92ZSB0aGUgYmFja2dyb3VuZCBlbGVtZW50IGJhY2sgb3V0CgkJCWRvbS53cmFwcGVyLmFwcGVuZENoaWxkKCBkb20uYmFja2dyb3VuZCApOwoKCQkJLy8gQ2xlYW4gdXAgY2hhbmdlcyBtYWRlIHRvIHNsaWRlcwoJCQl0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBTTElERVNfU0VMRUNUT1IgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZSApIHsKCQkJCXRyYW5zZm9ybUVsZW1lbnQoIHNsaWRlLCAnJyApOwoKCQkJCXNsaWRlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjbGljaycsIG9uT3ZlcnZpZXdTbGlkZUNsaWNrZWQsIHRydWUgKTsKCQkJfSApOwoKCQkJLy8gQ2xlYW4gdXAgY2hhbmdlcyBtYWRlIHRvIGJhY2tncm91bmRzCgkJCXRvQXJyYXkoIGRvbS5iYWNrZ3JvdW5kLnF1ZXJ5U2VsZWN0b3JBbGwoICcuc2xpZGUtYmFja2dyb3VuZCcgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBiYWNrZ3JvdW5kICkgewoJCQkJdHJhbnNmb3JtRWxlbWVudCggYmFja2dyb3VuZCwgJycgKTsKCQkJfSApOwoKCQkJdHJhbnNmb3JtU2xpZGVzKCB7IG92ZXJ2aWV3OiAnJyB9ICk7CgoJCQlzbGlkZSggaW5kZXhoLCBpbmRleHYgKTsKCgkJCWxheW91dCgpOwoKCQkJY3VlQXV0b1NsaWRlKCk7CgoJCQkvLyBOb3RpZnkgb2JzZXJ2ZXJzIG9mIHRoZSBvdmVydmlldyBoaWRpbmcKCQkJZGlzcGF0Y2hFdmVudCggJ292ZXJ2aWV3aGlkZGVuJywgewoJCQkJJ2luZGV4aCc6IGluZGV4aCwKCQkJCSdpbmRleHYnOiBpbmRleHYsCgkJCQknY3VycmVudFNsaWRlJzogY3VycmVudFNsaWRlCgkJCX0gKTsKCgkJfQoJfQoKCS8qKgoJICogVG9nZ2xlcyB0aGUgc2xpZGUgb3ZlcnZpZXcgbW9kZSBvbiBhbmQgb2ZmLgoJICoKCSAqIEBwYXJhbSB7Qm9vbGVhbn0gW292ZXJyaWRlXSBGbGFnIHdoaWNoIG92ZXJyaWRlcyB0aGUKCSAqIHRvZ2dsZSBsb2dpYyBhbmQgZm9yY2libHkgc2V0cyB0aGUgZGVzaXJlZCBzdGF0ZS4gVHJ1ZSBtZWFucwoJICogb3ZlcnZpZXcgaXMgb3BlbiwgZmFsc2UgbWVhbnMgaXQncyBjbG9zZWQuCgkgKi8KCWZ1bmN0aW9uIHRvZ2dsZU92ZXJ2aWV3KCBvdmVycmlkZSApIHsKCgkJaWYoIHR5cGVvZiBvdmVycmlkZSA9PT0gJ2Jvb2xlYW4nICkgewoJCQlvdmVycmlkZSA/IGFjdGl2YXRlT3ZlcnZpZXcoKSA6IGRlYWN0aXZhdGVPdmVydmlldygpOwoJCX0KCQllbHNlIHsKCQkJaXNPdmVydmlldygpID8gZGVhY3RpdmF0ZU92ZXJ2aWV3KCkgOiBhY3RpdmF0ZU92ZXJ2aWV3KCk7CgkJfQoKCX0KCgkvKioKCSAqIENoZWNrcyBpZiB0aGUgb3ZlcnZpZXcgaXMgY3VycmVudGx5IGFjdGl2ZS4KCSAqCgkgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoZSBvdmVydmlldyBpcyBhY3RpdmUsCgkgKiBmYWxzZSBvdGhlcndpc2UKCSAqLwoJZnVuY3Rpb24gaXNPdmVydmlldygpIHsKCgkJcmV0dXJuIG92ZXJ2aWV3OwoKCX0KCgkvKioKCSAqIFJldHVybiBhIGhhc2ggVVJMIHRoYXQgd2lsbCByZXNvbHZlIHRvIHRoZSBnaXZlbiBzbGlkZSBsb2NhdGlvbi4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbc2xpZGU9Y3VycmVudFNsaWRlXSBUaGUgc2xpZGUgdG8gbGluayB0bwoJICovCglmdW5jdGlvbiBsb2NhdGlvbkhhc2goIHNsaWRlICkgewoKCQl2YXIgdXJsID0gJy8nOwoKCQkvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIG5hbWVkIGxpbmsgYmFzZWQgb24gdGhlIHNsaWRlJ3MgSUQKCQl2YXIgcyA9IHNsaWRlIHx8IGN1cnJlbnRTbGlkZTsKCQl2YXIgaWQgPSBzID8gcy5nZXRBdHRyaWJ1dGUoICdpZCcgKSA6IG51bGw7CgkJaWYoIGlkICkgewoJCQlpZCA9IGVuY29kZVVSSUNvbXBvbmVudCggaWQgKTsKCQl9CgoJCXZhciBpbmRleCA9IGdldEluZGljZXMoIHNsaWRlICk7CgkJaWYoICFjb25maWcuZnJhZ21lbnRJblVSTCApIHsKCQkJaW5kZXguZiA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIElmIHRoZSBjdXJyZW50IHNsaWRlIGhhcyBhbiBJRCwgdXNlIHRoYXQgYXMgYSBuYW1lZCBsaW5rLAoJCS8vIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IG5hbWVkIGxpbmtzIHdpdGggYSBmcmFnbWVudCBpbmRleAoJCWlmKCB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCAmJiBpbmRleC5mID09PSB1bmRlZmluZWQgKSB7CgkJCXVybCA9ICcvJyArIGlkOwoJCX0KCQkvLyBPdGhlcndpc2UgdXNlIHRoZSAvaC92IGluZGV4CgkJZWxzZSB7CgkJCXZhciBoYXNoSW5kZXhCYXNlID0gY29uZmlnLmhhc2hPbmVCYXNlZEluZGV4ID8gMSA6IDA7CgkJCWlmKCBpbmRleC5oID4gMCB8fCBpbmRleC52ID4gMCB8fCBpbmRleC5mICE9PSB1bmRlZmluZWQgKSB1cmwgKz0gaW5kZXguaCArIGhhc2hJbmRleEJhc2U7CgkJCWlmKCBpbmRleC52ID4gMCB8fCBpbmRleC5mICE9PSB1bmRlZmluZWQgKSB1cmwgKz0gJy8nICsgKGluZGV4LnYgKyBoYXNoSW5kZXhCYXNlICk7CgkJCWlmKCBpbmRleC5mICE9PSB1bmRlZmluZWQgKSB1cmwgKz0gJy8nICsgaW5kZXguZjsKCQl9CgoJCXJldHVybiB1cmw7CgoJfQoKCS8qKgoJICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9yIHNwZWNpZmllZCBzbGlkZSBpcyB2ZXJ0aWNhbAoJICogKG5lc3RlZCB3aXRoaW4gYW5vdGhlciBzbGlkZSkuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3NsaWRlPWN1cnJlbnRTbGlkZV0gVGhlIHNsaWRlIHRvIGNoZWNrCgkgKiBvcmllbnRhdGlvbiBvZgoJICogQHJldHVybiB7Qm9vbGVhbn0KCSAqLwoJZnVuY3Rpb24gaXNWZXJ0aWNhbFNsaWRlKCBzbGlkZSApIHsKCgkJLy8gUHJlZmVyIHNsaWRlIGFyZ3VtZW50LCBvdGhlcndpc2UgdXNlIGN1cnJlbnQgc2xpZGUKCQlzbGlkZSA9IHNsaWRlID8gc2xpZGUgOiBjdXJyZW50U2xpZGU7CgoJCXJldHVybiBzbGlkZSAmJiBzbGlkZS5wYXJlbnROb2RlICYmICEhc2xpZGUucGFyZW50Tm9kZS5ub2RlTmFtZS5tYXRjaCggL3NlY3Rpb24vaSApOwoKCX0KCgkvKioKCSAqIEhhbmRsaW5nIHRoZSBmdWxsc2NyZWVuIGZ1bmN0aW9uYWxpdHkgdmlhIHRoZSBmdWxsc2NyZWVuIEFQSQoJICoKCSAqIEBzZWUgaHR0cDovL2Z1bGxzY3JlZW4uc3BlYy53aGF0d2cub3JnLwoJICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RPTS9Vc2luZ19mdWxsc2NyZWVuX21vZGUKCSAqLwoJZnVuY3Rpb24gZW50ZXJGdWxsc2NyZWVuKCkgewoKCQl2YXIgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgkJLy8gQ2hlY2sgd2hpY2ggaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlCgkJdmFyIHJlcXVlc3RNZXRob2QgPSBlbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuIHx8CgkJCQkJCQllbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIHx8CgkJCQkJCQllbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIHx8CgkJCQkJCQllbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuIHx8CgkJCQkJCQllbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW47CgoJCWlmKCByZXF1ZXN0TWV0aG9kICkgewoJCQlyZXF1ZXN0TWV0aG9kLmFwcGx5KCBlbGVtZW50ICk7CgkJfQoKCX0KCgkvKioKCSAqIFNob3dzIHRoZSBtb3VzZSBwb2ludGVyIGFmdGVyIGl0IGhhcyBiZWVuIGhpZGRlbiB3aXRoCgkgKiAjaGlkZUN1cnNvci4KCSAqLwoJZnVuY3Rpb24gc2hvd0N1cnNvcigpIHsKCgkJaWYoIGN1cnNvckhpZGRlbiApIHsKCQkJY3Vyc29ySGlkZGVuID0gZmFsc2U7CgkJCWRvbS53cmFwcGVyLnN0eWxlLmN1cnNvciA9ICcnOwoJCX0KCgl9CgoJLyoqCgkgKiBIaWRlcyB0aGUgbW91c2UgcG9pbnRlciB3aGVuIGl0J3Mgb24gdG9wIG9mIHRoZSAucmV2ZWFsCgkgKiBjb250YWluZXIuCgkgKi8KCWZ1bmN0aW9uIGhpZGVDdXJzb3IoKSB7CgoJCWlmKCBjdXJzb3JIaWRkZW4gPT09IGZhbHNlICkgewoJCQljdXJzb3JIaWRkZW4gPSB0cnVlOwoJCQlkb20ud3JhcHBlci5zdHlsZS5jdXJzb3IgPSAnbm9uZSc7CgkJfQoKCX0KCgkvKioKCSAqIEVudGVycyB0aGUgcGF1c2VkIG1vZGUgd2hpY2ggZmFkZXMgZXZlcnl0aGluZyBvbiBzY3JlZW4gdG8KCSAqIGJsYWNrLgoJICovCglmdW5jdGlvbiBwYXVzZSgpIHsKCgkJaWYoIGNvbmZpZy5wYXVzZSApIHsKCQkJdmFyIHdhc1BhdXNlZCA9IGRvbS53cmFwcGVyLmNsYXNzTGlzdC5jb250YWlucyggJ3BhdXNlZCcgKTsKCgkJCWNhbmNlbEF1dG9TbGlkZSgpOwoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCAncGF1c2VkJyApOwoKCQkJaWYoIHdhc1BhdXNlZCA9PT0gZmFsc2UgKSB7CgkJCQlkaXNwYXRjaEV2ZW50KCAncGF1c2VkJyApOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIEV4aXRzIGZyb20gdGhlIHBhdXNlZCBtb2RlLgoJICovCglmdW5jdGlvbiByZXN1bWUoKSB7CgoJCXZhciB3YXNQYXVzZWQgPSBkb20ud3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoICdwYXVzZWQnICk7CgkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSggJ3BhdXNlZCcgKTsKCgkJY3VlQXV0b1NsaWRlKCk7CgoJCWlmKCB3YXNQYXVzZWQgKSB7CgkJCWRpc3BhdGNoRXZlbnQoICdyZXN1bWVkJyApOwoJCX0KCgl9CgoJLyoqCgkgKiBUb2dnbGVzIHRoZSBwYXVzZWQgbW9kZSBvbiBhbmQgb2ZmLgoJICovCglmdW5jdGlvbiB0b2dnbGVQYXVzZSggb3ZlcnJpZGUgKSB7CgoJCWlmKCB0eXBlb2Ygb3ZlcnJpZGUgPT09ICdib29sZWFuJyApIHsKCQkJb3ZlcnJpZGUgPyBwYXVzZSgpIDogcmVzdW1lKCk7CgkJfQoJCWVsc2UgewoJCQlpc1BhdXNlZCgpID8gcmVzdW1lKCkgOiBwYXVzZSgpOwoJCX0KCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGUgcGF1c2VkIG1vZGUuCgkgKgoJICogQHJldHVybiB7Qm9vbGVhbn0KCSAqLwoJZnVuY3Rpb24gaXNQYXVzZWQoKSB7CgoJCXJldHVybiBkb20ud3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoICdwYXVzZWQnICk7CgoJfQoKCS8qKgoJICogVG9nZ2xlcyB0aGUgYXV0byBzbGlkZSBtb2RlIG9uIGFuZCBvZmYuCgkgKgoJICogQHBhcmFtIHtCb29sZWFufSBbb3ZlcnJpZGVdIEZsYWcgd2hpY2ggc2V0cyB0aGUgZGVzaXJlZCBzdGF0ZS4KCSAqIFRydWUgbWVhbnMgYXV0b3BsYXkgc3RhcnRzLCBmYWxzZSBtZWFucyBpdCBzdG9wcy4KCSAqLwoKCWZ1bmN0aW9uIHRvZ2dsZUF1dG9TbGlkZSggb3ZlcnJpZGUgKSB7CgoJCWlmKCB0eXBlb2Ygb3ZlcnJpZGUgPT09ICdib29sZWFuJyApIHsKCQkJb3ZlcnJpZGUgPyByZXN1bWVBdXRvU2xpZGUoKSA6IHBhdXNlQXV0b1NsaWRlKCk7CgkJfQoKCQllbHNlIHsKCQkJYXV0b1NsaWRlUGF1c2VkID8gcmVzdW1lQXV0b1NsaWRlKCkgOiBwYXVzZUF1dG9TbGlkZSgpOwoJCX0KCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhlIGF1dG8gc2xpZGUgbW9kZSBpcyBjdXJyZW50bHkgb24uCgkgKgoJICogQHJldHVybiB7Qm9vbGVhbn0KCSAqLwoJZnVuY3Rpb24gaXNBdXRvU2xpZGluZygpIHsKCgkJcmV0dXJuICEhKCBhdXRvU2xpZGUgJiYgIWF1dG9TbGlkZVBhdXNlZCApOwoKCX0KCgkvKioKCSAqIFN0ZXBzIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIHByZXNlbnRhdGlvbiB0byB0aGUKCSAqIHNsaWRlIHdoaWNoIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbAoJICogaW5kaWNlcy4KCSAqCgkgKiBAcGFyYW0ge251bWJlcn0gW2g9aW5kZXhoXSBIb3Jpem9udGFsIGluZGV4IG9mIHRoZSB0YXJnZXQgc2xpZGUKCSAqIEBwYXJhbSB7bnVtYmVyfSBbdj1pbmRleHZdIFZlcnRpY2FsIGluZGV4IG9mIHRoZSB0YXJnZXQgc2xpZGUKCSAqIEBwYXJhbSB7bnVtYmVyfSBbZl0gSW5kZXggb2YgYSBmcmFnbWVudCB3aXRoaW4gdGhlCgkgKiB0YXJnZXQgc2xpZGUgdG8gYWN0aXZhdGUKCSAqIEBwYXJhbSB7bnVtYmVyfSBbb10gT3JpZ2luIGZvciB1c2UgaW4gbXVsdGltYXN0ZXIgZW52aXJvbm1lbnRzCgkgKi8KCWZ1bmN0aW9uIHNsaWRlKCBoLCB2LCBmLCBvICkgewoKCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSB3ZXJlIGF0IGJlZm9yZQoJCXByZXZpb3VzU2xpZGUgPSBjdXJyZW50U2xpZGU7CgoJCS8vIFF1ZXJ5IGFsbCBob3Jpem9udGFsIHNsaWRlcyBpbiB0aGUgZGVjawoJCXZhciBob3Jpem9udGFsU2xpZGVzID0gZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKTsKCgkJLy8gQWJvcnQgaWYgdGhlcmUgYXJlIG5vIHNsaWRlcwoJCWlmKCBob3Jpem9udGFsU2xpZGVzLmxlbmd0aCA9PT0gMCApIHJldHVybjsKCgkJLy8gSWYgbm8gdmVydGljYWwgaW5kZXggaXMgc3BlY2lmaWVkIGFuZCB0aGUgdXBjb21pbmcgc2xpZGUgaXMgYQoJCS8vIHN0YWNrLCByZXN1bWUgYXQgaXRzIHByZXZpb3VzIHZlcnRpY2FsIGluZGV4CgkJaWYoIHYgPT09IHVuZGVmaW5lZCAmJiAhaXNPdmVydmlldygpICkgewoJCQl2ID0gZ2V0UHJldmlvdXNWZXJ0aWNhbEluZGV4KCBob3Jpem9udGFsU2xpZGVzWyBoIF0gKTsKCQl9CgoJCS8vIElmIHdlIHdlcmUgb24gYSB2ZXJ0aWNhbCBzdGFjaywgcmVtZW1iZXIgd2hhdCB2ZXJ0aWNhbCBpbmRleAoJCS8vIGl0IHdhcyBvbiBzbyB3ZSBjYW4gcmVzdW1lIGF0IHRoZSBzYW1lIHBvc2l0aW9uIHdoZW4gcmV0dXJuaW5nCgkJaWYoIHByZXZpb3VzU2xpZGUgJiYgcHJldmlvdXNTbGlkZS5wYXJlbnROb2RlICYmIHByZXZpb3VzU2xpZGUucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoICdzdGFjaycgKSApIHsKCQkJc2V0UHJldmlvdXNWZXJ0aWNhbEluZGV4KCBwcmV2aW91c1NsaWRlLnBhcmVudE5vZGUsIGluZGV4diApOwoJCX0KCgkJLy8gUmVtZW1iZXIgdGhlIHN0YXRlIGJlZm9yZSB0aGlzIHNsaWRlCgkJdmFyIHN0YXRlQmVmb3JlID0gc3RhdGUuY29uY2F0KCk7CgoJCS8vIFJlc2V0IHRoZSBzdGF0ZSBhcnJheQoJCXN0YXRlLmxlbmd0aCA9IDA7CgoJCXZhciBpbmRleGhCZWZvcmUgPSBpbmRleGggfHwgMCwKCQkJaW5kZXh2QmVmb3JlID0gaW5kZXh2IHx8IDA7CgoJCS8vIEFjdGl2YXRlIGFuZCB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc2xpZGUKCQlpbmRleGggPSB1cGRhdGVTbGlkZXMoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SLCBoID09PSB1bmRlZmluZWQgPyBpbmRleGggOiBoICk7CgkJaW5kZXh2ID0gdXBkYXRlU2xpZGVzKCBWRVJUSUNBTF9TTElERVNfU0VMRUNUT1IsIHYgPT09IHVuZGVmaW5lZCA/IGluZGV4diA6IHYgKTsKCgkJLy8gVXBkYXRlIHRoZSB2aXNpYmlsaXR5IG9mIHNsaWRlcyBub3cgdGhhdCB0aGUgaW5kaWNlcyBoYXZlIGNoYW5nZWQKCQl1cGRhdGVTbGlkZXNWaXNpYmlsaXR5KCk7CgoJCWxheW91dCgpOwoKCQkvLyBVcGRhdGUgdGhlIG92ZXJ2aWV3IGlmIGl0J3MgY3VycmVudGx5IGFjdGl2ZQoJCWlmKCBpc092ZXJ2aWV3KCkgKSB7CgkJCXVwZGF0ZU92ZXJ2aWV3KCk7CgkJfQoKCQkvLyBGaW5kIHRoZSBjdXJyZW50IGhvcml6b250YWwgc2xpZGUgYW5kIGFueSBwb3NzaWJsZSB2ZXJ0aWNhbCBzbGlkZXMKCQkvLyB3aXRoaW4gaXQKCQl2YXIgY3VycmVudEhvcml6b250YWxTbGlkZSA9IGhvcml6b250YWxTbGlkZXNbIGluZGV4aCBdLAoJCQljdXJyZW50VmVydGljYWxTbGlkZXMgPSBjdXJyZW50SG9yaXpvbnRhbFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApOwoKCQkvLyBTdG9yZSByZWZlcmVuY2VzIHRvIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBzbGlkZXMKCQljdXJyZW50U2xpZGUgPSBjdXJyZW50VmVydGljYWxTbGlkZXNbIGluZGV4diBdIHx8IGN1cnJlbnRIb3Jpem9udGFsU2xpZGU7CgoJCS8vIFNob3cgZnJhZ21lbnQsIGlmIHNwZWNpZmllZAoJCWlmKCB0eXBlb2YgZiAhPT0gJ3VuZGVmaW5lZCcgKSB7CgkJCW5hdmlnYXRlRnJhZ21lbnQoIGYgKTsKCQl9CgoJCS8vIERpc3BhdGNoIGFuIGV2ZW50IGlmIHRoZSBzbGlkZSBjaGFuZ2VkCgkJdmFyIHNsaWRlQ2hhbmdlZCA9ICggaW5kZXhoICE9PSBpbmRleGhCZWZvcmUgfHwgaW5kZXh2ICE9PSBpbmRleHZCZWZvcmUgKTsKCQlpZiAoIXNsaWRlQ2hhbmdlZCkgewoJCQkvLyBFbnN1cmUgdGhhdCB0aGUgcHJldmlvdXMgc2xpZGUgaXMgbmV2ZXIgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQKCQkJcHJldmlvdXNTbGlkZSA9IG51bGw7CgkJfQoKCQkvLyBTb2x2ZXMgYW4gZWRnZSBjYXNlIHdoZXJlIHRoZSBwcmV2aW91cyBzbGlkZSBtYWludGFpbnMgdGhlCgkJLy8gJ3ByZXNlbnQnIGNsYXNzIHdoZW4gbmF2aWdhdGluZyBiZXR3ZWVuIGFkamFjZW50IHZlcnRpY2FsCgkJLy8gc3RhY2tzCgkJaWYoIHByZXZpb3VzU2xpZGUgJiYgcHJldmlvdXNTbGlkZSAhPT0gY3VycmVudFNsaWRlICkgewoJCQlwcmV2aW91c1NsaWRlLmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQlwcmV2aW91c1NsaWRlLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7CgoJCQkvLyBSZXNldCBhbGwgc2xpZGVzIHVwb24gbmF2aWdhdGUgdG8gaG9tZQoJCQkvLyBJc3N1ZTogIzI4NQoJCQlpZiAoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoIEhPTUVfU0xJREVfU0VMRUNUT1IgKS5jbGFzc0xpc3QuY29udGFpbnMoICdwcmVzZW50JyApICkgewoJCQkJLy8gTGF1bmNoIGFzeW5jIHRhc2sKCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsKCQkJCQl2YXIgc2xpZGVzID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKyAnLnN0YWNrJykgKSwgaTsKCQkJCQlmb3IoIGkgaW4gc2xpZGVzICkgewoJCQkJCQlpZiggc2xpZGVzW2ldICkgewoJCQkJCQkJLy8gUmVzZXQgc3RhY2sKCQkJCQkJCXNldFByZXZpb3VzVmVydGljYWxJbmRleCggc2xpZGVzW2ldLCAwICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9LCAwICk7CgkJCX0KCQl9CgoJCS8vIEFwcGx5IHRoZSBuZXcgc3RhdGUKCQlzdGF0ZUxvb3A6IGZvciggdmFyIGkgPSAwLCBsZW4gPSBzdGF0ZS5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHsKCQkJLy8gQ2hlY2sgaWYgdGhpcyBzdGF0ZSBleGlzdGVkIG9uIHRoZSBwcmV2aW91cyBzbGlkZS4gSWYgaXQKCQkJLy8gZGlkLCB3ZSB3aWxsIGF2b2lkIGFkZGluZyBpdCByZXBlYXRlZGx5CgkJCWZvciggdmFyIGogPSAwOyBqIDwgc3RhdGVCZWZvcmUubGVuZ3RoOyBqKysgKSB7CgkJCQlpZiggc3RhdGVCZWZvcmVbal0gPT09IHN0YXRlW2ldICkgewoJCQkJCXN0YXRlQmVmb3JlLnNwbGljZSggaiwgMSApOwoJCQkJCWNvbnRpbnVlIHN0YXRlTG9vcDsKCQkJCX0KCQkJfQoKCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoIHN0YXRlW2ldICk7CgoJCQkvLyBEaXNwYXRjaCBjdXN0b20gZXZlbnQgbWF0Y2hpbmcgdGhlIHN0YXRlJ3MgbmFtZQoJCQlkaXNwYXRjaEV2ZW50KCBzdGF0ZVtpXSApOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIHJlbWFpbnMgb2YgdGhlIHByZXZpb3VzIHN0YXRlCgkJd2hpbGUoIHN0YXRlQmVmb3JlLmxlbmd0aCApIHsKCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIHN0YXRlQmVmb3JlLnBvcCgpICk7CgkJfQoKCQlpZiggc2xpZGVDaGFuZ2VkICkgewoJCQlkaXNwYXRjaEV2ZW50KCAnc2xpZGVjaGFuZ2VkJywgewoJCQkJJ2luZGV4aCc6IGluZGV4aCwKCQkJCSdpbmRleHYnOiBpbmRleHYsCgkJCQkncHJldmlvdXNTbGlkZSc6IHByZXZpb3VzU2xpZGUsCgkJCQknY3VycmVudFNsaWRlJzogY3VycmVudFNsaWRlLAoJCQkJJ29yaWdpbic6IG8KCQkJfSApOwoJCX0KCgkJLy8gSGFuZGxlIGVtYmVkZGVkIGNvbnRlbnQKCQlpZiggc2xpZGVDaGFuZ2VkIHx8ICFwcmV2aW91c1NsaWRlICkgewoJCQlzdG9wRW1iZWRkZWRDb250ZW50KCBwcmV2aW91c1NsaWRlICk7CgkJCXN0YXJ0RW1iZWRkZWRDb250ZW50KCBjdXJyZW50U2xpZGUgKTsKCQl9CgoJCS8vIEFubm91bmNlIHRoZSBjdXJyZW50IHNsaWRlIGNvbnRlbnRzLCBmb3Igc2NyZWVuIHJlYWRlcnMKCQlkb20uc3RhdHVzRGl2LnRleHRDb250ZW50ID0gZ2V0U3RhdHVzVGV4dCggY3VycmVudFNsaWRlICk7CgoJCXVwZGF0ZUNvbnRyb2xzKCk7CgkJdXBkYXRlUHJvZ3Jlc3MoKTsKCQl1cGRhdGVCYWNrZ3JvdW5kKCk7CgkJdXBkYXRlUGFyYWxsYXgoKTsKCQl1cGRhdGVTbGlkZU51bWJlcigpOwoJCXVwZGF0ZU5vdGVzKCk7CgkJdXBkYXRlRnJhZ21lbnRzKCk7CgoJCS8vIFVwZGF0ZSB0aGUgVVJMIGhhc2gKCQl3cml0ZVVSTCgpOwoKCQljdWVBdXRvU2xpZGUoKTsKCgl9CgoJLyoqCgkgKiBTeW5jcyB0aGUgcHJlc2VudGF0aW9uIHdpdGggdGhlIGN1cnJlbnQgRE9NLiBVc2VmdWwKCSAqIHdoZW4gbmV3IHNsaWRlcyBvciBjb250cm9sIGVsZW1lbnRzIGFyZSBhZGRlZCBvciB3aGVuCgkgKiB0aGUgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZC4KCSAqLwoJZnVuY3Rpb24gc3luYygpIHsKCgkJLy8gU3Vic2NyaWJlIHRvIGlucHV0CgkJcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTsKCQlhZGRFdmVudExpc3RlbmVycygpOwoKCQkvLyBGb3JjZSBhIGxheW91dCB0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY29uZmlnIGlzIGFjY291bnRlZCBmb3IKCQlsYXlvdXQoKTsKCgkJLy8gUmVmbGVjdCB0aGUgY3VycmVudCBhdXRvU2xpZGUgdmFsdWUKCQlhdXRvU2xpZGUgPSBjb25maWcuYXV0b1NsaWRlOwoKCQkvLyBTdGFydCBhdXRvLXNsaWRpbmcgaWYgaXQncyBlbmFibGVkCgkJY3VlQXV0b1NsaWRlKCk7CgoJCS8vIFJlLWNyZWF0ZSB0aGUgc2xpZGUgYmFja2dyb3VuZHMKCQljcmVhdGVCYWNrZ3JvdW5kcygpOwoKCQkvLyBXcml0ZSB0aGUgY3VycmVudCBoYXNoIHRvIHRoZSBVUkwKCQl3cml0ZVVSTCgpOwoKCQlzb3J0QWxsRnJhZ21lbnRzKCk7CgoJCXVwZGF0ZUNvbnRyb2xzKCk7CgkJdXBkYXRlUHJvZ3Jlc3MoKTsKCQl1cGRhdGVTbGlkZU51bWJlcigpOwoJCXVwZGF0ZVNsaWRlc1Zpc2liaWxpdHkoKTsKCQl1cGRhdGVCYWNrZ3JvdW5kKCB0cnVlICk7CgkJdXBkYXRlTm90ZXNWaXNpYmlsaXR5KCk7CgkJdXBkYXRlTm90ZXMoKTsKCgkJZm9ybWF0RW1iZWRkZWRDb250ZW50KCk7CgoJCS8vIFN0YXJ0IG9yIHN0b3AgZW1iZWRkZWQgY29udGVudCBkZXBlbmRpbmcgb24gZ2xvYmFsIGNvbmZpZwoJCWlmKCBjb25maWcuYXV0b1BsYXlNZWRpYSA9PT0gZmFsc2UgKSB7CgkJCXN0b3BFbWJlZGRlZENvbnRlbnQoIGN1cnJlbnRTbGlkZSwgeyB1bmxvYWRJZnJhbWVzOiBmYWxzZSB9ICk7CgkJfQoJCWVsc2UgewoJCQlzdGFydEVtYmVkZGVkQ29udGVudCggY3VycmVudFNsaWRlICk7CgkJfQoKCQlpZiggaXNPdmVydmlldygpICkgewoJCQlsYXlvdXRPdmVydmlldygpOwoJCX0KCgl9CgoJLyoqCgkgKiBVcGRhdGVzIHJldmVhbC5qcyB0byBrZWVwIGluIHN5bmMgd2l0aCBuZXcgc2xpZGUgYXR0cmlidXRlcy4gRm9yCgkgKiBleGFtcGxlLCBpZiB5b3UgYWRkIGEgbmV3IGBkYXRhLWJhY2tncm91bmQtaW1hZ2VgIHlvdSBjYW4gY2FsbAoJICogdGhpcyB0byBoYXZlIHJldmVhbC5qcyByZW5kZXIgdGhlIG5ldyBiYWNrZ3JvdW5kIGltYWdlLgoJICoKCSAqIFNpbWlsYXIgdG8gI3N5bmMoKSBidXQgbW9yZSBlZmZpY2llbnQgd2hlbiB5b3Ugb25seSBuZWVkIHRvCgkgKiByZWZyZXNoIGEgc3BlY2lmaWMgc2xpZGUuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2xpZGUKCSAqLwoJZnVuY3Rpb24gc3luY1NsaWRlKCBzbGlkZSApIHsKCgkJLy8gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzbGlkZQoJCXNsaWRlID0gc2xpZGUgfHwgY3VycmVudFNsaWRlOwoKCQlzeW5jQmFja2dyb3VuZCggc2xpZGUgKTsKCQlzeW5jRnJhZ21lbnRzKCBzbGlkZSApOwoKCQlsb2FkU2xpZGUoIHNsaWRlICk7CgoJCXVwZGF0ZUJhY2tncm91bmQoKTsKCQl1cGRhdGVOb3RlcygpOwoKCX0KCgkvKioKCSAqIEZvcm1hdHMgdGhlIGZyYWdtZW50cyBvbiB0aGUgZ2l2ZW4gc2xpZGUgc28gdGhhdCB0aGV5IGhhdmUKCSAqIHZhbGlkIGluZGljZXMuIENhbGwgdGhpcyBpZiBmcmFnbWVudHMgYXJlIGNoYW5nZWQgaW4gdGhlIERPTQoJICogYWZ0ZXIgcmV2ZWFsLmpzIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNsaWRlCgkgKiBAcmV0dXJuIHtBcnJheX0gYSBsaXN0IG9mIHRoZSBIVE1MIGZyYWdtZW50cyB0aGF0IHdlcmUgc3luY2VkCgkgKi8KCWZ1bmN0aW9uIHN5bmNGcmFnbWVudHMoIHNsaWRlICkgewoKCQkvLyBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IHNsaWRlCgkJc2xpZGUgPSBzbGlkZSB8fCBjdXJyZW50U2xpZGU7CgoJCXJldHVybiBzb3J0RnJhZ21lbnRzKCBzbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApICk7CgoJfQoKCS8qKgoJICogUmVzZXRzIGFsbCB2ZXJ0aWNhbCBzbGlkZXMgc28gdGhhdCBvbmx5IHRoZSBmaXJzdAoJICogaXMgdmlzaWJsZS4KCSAqLwoJZnVuY3Rpb24gcmVzZXRWZXJ0aWNhbFNsaWRlcygpIHsKCgkJdmFyIGhvcml6b250YWxTbGlkZXMgPSB0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApICk7CgkJaG9yaXpvbnRhbFNsaWRlcy5mb3JFYWNoKCBmdW5jdGlvbiggaG9yaXpvbnRhbFNsaWRlICkgewoKCQkJdmFyIHZlcnRpY2FsU2xpZGVzID0gdG9BcnJheSggaG9yaXpvbnRhbFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApICk7CgkJCXZlcnRpY2FsU2xpZGVzLmZvckVhY2goIGZ1bmN0aW9uKCB2ZXJ0aWNhbFNsaWRlLCB5ICkgewoKCQkJCWlmKCB5ID4gMCApIHsKCQkJCQl2ZXJ0aWNhbFNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQkJCXZlcnRpY2FsU2xpZGUuY2xhc3NMaXN0LnJlbW92ZSggJ3Bhc3QnICk7CgkJCQkJdmVydGljYWxTbGlkZS5jbGFzc0xpc3QuYWRkKCAnZnV0dXJlJyApOwoJCQkJCXZlcnRpY2FsU2xpZGUuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCAndHJ1ZScgKTsKCQkJCX0KCgkJCX0gKTsKCgkJfSApOwoKCX0KCgkvKioKCSAqIFNvcnRzIGFuZCBmb3JtYXRzIGFsbCBvZiBmcmFnbWVudHMgaW4gdGhlCgkgKiBwcmVzZW50YXRpb24uCgkgKi8KCWZ1bmN0aW9uIHNvcnRBbGxGcmFnbWVudHMoKSB7CgoJCXZhciBob3Jpem9udGFsU2xpZGVzID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApOwoJCWhvcml6b250YWxTbGlkZXMuZm9yRWFjaCggZnVuY3Rpb24oIGhvcml6b250YWxTbGlkZSApIHsKCgkJCXZhciB2ZXJ0aWNhbFNsaWRlcyA9IHRvQXJyYXkoIGhvcml6b250YWxTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbicgKSApOwoJCQl2ZXJ0aWNhbFNsaWRlcy5mb3JFYWNoKCBmdW5jdGlvbiggdmVydGljYWxTbGlkZSwgeSApIHsKCgkJCQlzb3J0RnJhZ21lbnRzKCB2ZXJ0aWNhbFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICkgKTsKCgkJCX0gKTsKCgkJCWlmKCB2ZXJ0aWNhbFNsaWRlcy5sZW5ndGggPT09IDAgKSBzb3J0RnJhZ21lbnRzKCBob3Jpem9udGFsU2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudCcgKSApOwoKCQl9ICk7CgoJfQoKCS8qKgoJICogUmFuZG9tbHkgc2h1ZmZsZXMgYWxsIHNsaWRlcyBpbiB0aGUgZGVjay4KCSAqLwoJZnVuY3Rpb24gc2h1ZmZsZSgpIHsKCgkJdmFyIHNsaWRlcyA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKTsKCgkJc2xpZGVzLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZSApIHsKCgkJCS8vIEluc2VydCB0aGlzIHNsaWRlIG5leHQgdG8gYW5vdGhlciByYW5kb20gc2xpZGUuIFRoaXMgbWF5CgkJCS8vIGNhdXNlIHRoZSBzbGlkZSB0byBpbnNlcnQgYmVmb3JlIGl0c2VsZiBidXQgdGhhdCdzIGZpbmUuCgkJCWRvbS5zbGlkZXMuaW5zZXJ0QmVmb3JlKCBzbGlkZSwgc2xpZGVzWyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogc2xpZGVzLmxlbmd0aCApIF0gKTsKCgkJfSApOwoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgb25lIGRpbWVuc2lvbiBvZiBzbGlkZXMgYnkgc2hvd2luZyB0aGUgc2xpZGUKCSAqIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleC4KCSAqCgkgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgQSBDU1Mgc2VsZWN0b3IgdGhhdCB3aWxsIGZldGNoCgkgKiB0aGUgZ3JvdXAgb2Ygc2xpZGVzIHdlIGFyZSB3b3JraW5nIHdpdGgKCSAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHNsaWRlIHRoYXQgc2hvdWxkIGJlCgkgKiBzaG93bgoJICoKCSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBzbGlkZSB0aGF0IGlzIG5vdyBzaG93biwKCSAqIG1pZ2h0IGRpZmZlciBmcm9tIHRoZSBwYXNzZWQgaW4gaW5kZXggaWYgaXQgd2FzIG91dCBvZgoJICogYm91bmRzLgoJICovCglmdW5jdGlvbiB1cGRhdGVTbGlkZXMoIHNlbGVjdG9yLCBpbmRleCApIHsKCgkJLy8gU2VsZWN0IGFsbCBzbGlkZXMgYW5kIGNvbnZlcnQgdGhlIE5vZGVMaXN0IHJlc3VsdCB0bwoJCS8vIGFuIGFycmF5CgkJdmFyIHNsaWRlcyA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yICkgKSwKCQkJc2xpZGVzTGVuZ3RoID0gc2xpZGVzLmxlbmd0aDsKCgkJdmFyIHByaW50TW9kZSA9IGlzUHJpbnRpbmdQREYoKTsKCgkJaWYoIHNsaWRlc0xlbmd0aCApIHsKCgkJCS8vIFNob3VsZCB0aGUgaW5kZXggbG9vcD8KCQkJaWYoIGNvbmZpZy5sb29wICkgewoJCQkJaW5kZXggJT0gc2xpZGVzTGVuZ3RoOwoKCQkJCWlmKCBpbmRleCA8IDAgKSB7CgkJCQkJaW5kZXggPSBzbGlkZXNMZW5ndGggKyBpbmRleDsKCQkJCX0KCQkJfQoKCQkJLy8gRW5mb3JjZSBtYXggYW5kIG1pbmltdW0gaW5kZXggYm91bmRzCgkJCWluZGV4ID0gTWF0aC5tYXgoIE1hdGgubWluKCBpbmRleCwgc2xpZGVzTGVuZ3RoIC0gMSApLCAwICk7CgoJCQlmb3IoIHZhciBpID0gMDsgaSA8IHNsaWRlc0xlbmd0aDsgaSsrICkgewoJCQkJdmFyIGVsZW1lbnQgPSBzbGlkZXNbaV07CgoJCQkJdmFyIHJldmVyc2UgPSBjb25maWcucnRsICYmICFpc1ZlcnRpY2FsU2xpZGUoIGVsZW1lbnQgKTsKCgkJCQllbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoICdwYXN0JyApOwoJCQkJZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAncHJlc2VudCcgKTsKCQkJCWVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSggJ2Z1dHVyZScgKTsKCgkJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9lZGl0aW5nLmh0bWwjdGhlLWhpZGRlbi1hdHRyaWJ1dGUKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnaGlkZGVuJywgJycgKTsKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCAndHJ1ZScgKTsKCgkJCQkvLyBJZiB0aGlzIGVsZW1lbnQgY29udGFpbnMgdmVydGljYWwgc2xpZGVzCgkJCQlpZiggZWxlbWVudC5xdWVyeVNlbGVjdG9yKCAnc2VjdGlvbicgKSApIHsKCQkJCQllbGVtZW50LmNsYXNzTGlzdC5hZGQoICdzdGFjaycgKTsKCQkJCX0KCgkJCQkvLyBJZiB3ZSdyZSBwcmludGluZyBzdGF0aWMgc2xpZGVzLCBhbGwgc2xpZGVzIGFyZSAicHJlc2VudCIKCQkJCWlmKCBwcmludE1vZGUgKSB7CgkJCQkJZWxlbWVudC5jbGFzc0xpc3QuYWRkKCAncHJlc2VudCcgKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpZiggaSA8IGluZGV4ICkgewoJCQkJCS8vIEFueSBlbGVtZW50IHByZXZpb3VzIHRvIGluZGV4IGlzIGdpdmVuIHRoZSAncGFzdCcgY2xhc3MKCQkJCQllbGVtZW50LmNsYXNzTGlzdC5hZGQoIHJldmVyc2UgPyAnZnV0dXJlJyA6ICdwYXN0JyApOwoKCQkJCQlpZiggY29uZmlnLmZyYWdtZW50cyApIHsKCQkJCQkJLy8gU2hvdyBhbGwgZnJhZ21lbnRzIGluIHByaW9yIHNsaWRlcwoJCQkJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZnJhZ21lbnQgKSB7CgkJCQkJCQlmcmFnbWVudC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKTsKCQkJCQkJCWZyYWdtZW50LmNsYXNzTGlzdC5yZW1vdmUoICdjdXJyZW50LWZyYWdtZW50JyApOwoJCQkJCQl9ICk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiggaSA+IGluZGV4ICkgewoJCQkJCS8vIEFueSBlbGVtZW50IHN1YnNlcXVlbnQgdG8gaW5kZXggaXMgZ2l2ZW4gdGhlICdmdXR1cmUnIGNsYXNzCgkJCQkJZWxlbWVudC5jbGFzc0xpc3QuYWRkKCByZXZlcnNlID8gJ3Bhc3QnIDogJ2Z1dHVyZScgKTsKCgkJCQkJaWYoIGNvbmZpZy5mcmFnbWVudHMgKSB7CgkJCQkJCS8vIEhpZGUgYWxsIGZyYWdtZW50cyBpbiBmdXR1cmUgc2xpZGVzCgkJCQkJCXRvQXJyYXkoIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudC52aXNpYmxlJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGZyYWdtZW50ICkgewoJCQkJCQkJZnJhZ21lbnQuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnICk7CgkJCQkJCQlmcmFnbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAnY3VycmVudC1mcmFnbWVudCcgKTsKCQkJCQkJfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gTWFyayB0aGUgY3VycmVudCBzbGlkZSBhcyBwcmVzZW50CgkJCXNsaWRlc1tpbmRleF0uY2xhc3NMaXN0LmFkZCggJ3ByZXNlbnQnICk7CgkJCXNsaWRlc1tpbmRleF0ucmVtb3ZlQXR0cmlidXRlKCAnaGlkZGVuJyApOwoJCQlzbGlkZXNbaW5kZXhdLnJlbW92ZUF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJyApOwoKCQkJLy8gSWYgdGhpcyBzbGlkZSBoYXMgYSBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggaXQsIGFkZCBpdAoJCQkvLyBvbnRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNrCgkJCXZhciBzbGlkZVN0YXRlID0gc2xpZGVzW2luZGV4XS5nZXRBdHRyaWJ1dGUoICdkYXRhLXN0YXRlJyApOwoJCQlpZiggc2xpZGVTdGF0ZSApIHsKCQkJCXN0YXRlID0gc3RhdGUuY29uY2F0KCBzbGlkZVN0YXRlLnNwbGl0KCAnICcgKSApOwoJCQl9CgoJCX0KCQllbHNlIHsKCQkJLy8gU2luY2UgdGhlcmUgYXJlIG5vIHNsaWRlcyB3ZSBjYW4ndCBiZSBhbnl3aGVyZSBiZXlvbmQgdGhlCgkJCS8vIHplcm90aCBpbmRleAoJCQlpbmRleCA9IDA7CgkJfQoKCQlyZXR1cm4gaW5kZXg7CgoJfQoKCS8qKgoJICogT3B0aW1pemF0aW9uIG1ldGhvZDsgaGlkZSBhbGwgc2xpZGVzIHRoYXQgYXJlIGZhciBhd2F5CgkgKiBmcm9tIHRoZSBwcmVzZW50IHNsaWRlLgoJICovCglmdW5jdGlvbiB1cGRhdGVTbGlkZXNWaXNpYmlsaXR5KCkgewoKCQkvLyBTZWxlY3QgYWxsIHNsaWRlcyBhbmQgY29udmVydCB0aGUgTm9kZUxpc3QgcmVzdWx0IHRvCgkJLy8gYW4gYXJyYXkKCQl2YXIgaG9yaXpvbnRhbFNsaWRlcyA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICkgKSwKCQkJaG9yaXpvbnRhbFNsaWRlc0xlbmd0aCA9IGhvcml6b250YWxTbGlkZXMubGVuZ3RoLAoJCQlkaXN0YW5jZVgsCgkJCWRpc3RhbmNlWTsKCgkJaWYoIGhvcml6b250YWxTbGlkZXNMZW5ndGggJiYgdHlwZW9mIGluZGV4aCAhPT0gJ3VuZGVmaW5lZCcgKSB7CgoJCQkvLyBUaGUgbnVtYmVyIG9mIHN0ZXBzIGF3YXkgZnJvbSB0aGUgcHJlc2VudCBzbGlkZSB0aGF0IHdpbGwKCQkJLy8gYmUgdmlzaWJsZQoJCQl2YXIgdmlld0Rpc3RhbmNlID0gaXNPdmVydmlldygpID8gMTAgOiBjb25maWcudmlld0Rpc3RhbmNlOwoKCQkJLy8gU2hvcnRlbiB0aGUgdmlldyBkaXN0YW5jZSBvbiBkZXZpY2VzIHRoYXQgdHlwaWNhbGx5IGhhdmUKCQkJLy8gbGVzcyByZXNvdXJjZXMKCQkJaWYoIGlzTW9iaWxlRGV2aWNlICkgewoJCQkJdmlld0Rpc3RhbmNlID0gaXNPdmVydmlldygpID8gNiA6IGNvbmZpZy5tb2JpbGVWaWV3RGlzdGFuY2U7CgkJCX0KCgkJCS8vIEFsbCBzbGlkZXMgbmVlZCB0byBiZSB2aXNpYmxlIHdoZW4gZXhwb3J0aW5nIHRvIFBERgoJCQlpZiggaXNQcmludGluZ1BERigpICkgewoJCQkJdmlld0Rpc3RhbmNlID0gTnVtYmVyLk1BWF9WQUxVRTsKCQkJfQoKCQkJZm9yKCB2YXIgeCA9IDA7IHggPCBob3Jpem9udGFsU2xpZGVzTGVuZ3RoOyB4KysgKSB7CgkJCQl2YXIgaG9yaXpvbnRhbFNsaWRlID0gaG9yaXpvbnRhbFNsaWRlc1t4XTsKCgkJCQl2YXIgdmVydGljYWxTbGlkZXMgPSB0b0FycmF5KCBob3Jpem9udGFsU2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ3NlY3Rpb24nICkgKSwKCQkJCQl2ZXJ0aWNhbFNsaWRlc0xlbmd0aCA9IHZlcnRpY2FsU2xpZGVzLmxlbmd0aDsKCgkJCQkvLyBEZXRlcm1pbmUgaG93IGZhciBhd2F5IHRoaXMgc2xpZGUgaXMgZnJvbSB0aGUgcHJlc2VudAoJCQkJZGlzdGFuY2VYID0gTWF0aC5hYnMoICggaW5kZXhoIHx8IDAgKSAtIHggKSB8fCAwOwoKCQkJCS8vIElmIHRoZSBwcmVzZW50YXRpb24gaXMgbG9vcGVkLCBkaXN0YW5jZSBzaG91bGQgbWVhc3VyZQoJCQkJLy8gMSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBzbGlkZXMKCQkJCWlmKCBjb25maWcubG9vcCApIHsKCQkJCQlkaXN0YW5jZVggPSBNYXRoLmFicyggKCAoIGluZGV4aCB8fCAwICkgLSB4ICkgJSAoIGhvcml6b250YWxTbGlkZXNMZW5ndGggLSB2aWV3RGlzdGFuY2UgKSApIHx8IDA7CgkJCQl9CgoJCQkJLy8gU2hvdyB0aGUgaG9yaXpvbnRhbCBzbGlkZSBpZiBpdCdzIHdpdGhpbiB0aGUgdmlldyBkaXN0YW5jZQoJCQkJaWYoIGRpc3RhbmNlWCA8IHZpZXdEaXN0YW5jZSApIHsKCQkJCQlsb2FkU2xpZGUoIGhvcml6b250YWxTbGlkZSApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdW5sb2FkU2xpZGUoIGhvcml6b250YWxTbGlkZSApOwoJCQkJfQoKCQkJCWlmKCB2ZXJ0aWNhbFNsaWRlc0xlbmd0aCApIHsKCgkJCQkJdmFyIG95ID0gZ2V0UHJldmlvdXNWZXJ0aWNhbEluZGV4KCBob3Jpem9udGFsU2xpZGUgKTsKCgkJCQkJZm9yKCB2YXIgeSA9IDA7IHkgPCB2ZXJ0aWNhbFNsaWRlc0xlbmd0aDsgeSsrICkgewoJCQkJCQl2YXIgdmVydGljYWxTbGlkZSA9IHZlcnRpY2FsU2xpZGVzW3ldOwoKCQkJCQkJZGlzdGFuY2VZID0geCA9PT0gKCBpbmRleGggfHwgMCApID8gTWF0aC5hYnMoICggaW5kZXh2IHx8IDAgKSAtIHkgKSA6IE1hdGguYWJzKCB5IC0gb3kgKTsKCgkJCQkJCWlmKCBkaXN0YW5jZVggKyBkaXN0YW5jZVkgPCB2aWV3RGlzdGFuY2UgKSB7CgkJCQkJCQlsb2FkU2xpZGUoIHZlcnRpY2FsU2xpZGUgKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCXVubG9hZFNsaWRlKCB2ZXJ0aWNhbFNsaWRlICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJfQoJCQl9CgoJCQkvLyBGbGFnIGlmIHRoZXJlIGFyZSBBTlkgdmVydGljYWwgc2xpZGVzLCBhbnl3aGVyZSBpbiB0aGUgZGVjawoJCQlpZiggaGFzVmVydGljYWxTbGlkZXMoKSApIHsKCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdoYXMtdmVydGljYWwtc2xpZGVzJyApOwoJCQl9CgkJCWVsc2UgewoJCQkJZG9tLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSggJ2hhcy12ZXJ0aWNhbC1zbGlkZXMnICk7CgkJCX0KCgkJCS8vIEZsYWcgaWYgdGhlcmUgYXJlIEFOWSBob3Jpem9udGFsIHNsaWRlcywgYW55d2hlcmUgaW4gdGhlIGRlY2sKCQkJaWYoIGhhc0hvcml6b250YWxTbGlkZXMoKSApIHsKCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoICdoYXMtaG9yaXpvbnRhbC1zbGlkZXMnICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCAnaGFzLWhvcml6b250YWwtc2xpZGVzJyApOwoJCQl9CgoJCX0KCgl9CgoJLyoqCgkgKiBQaWNrIHVwIG5vdGVzIGZyb20gdGhlIGN1cnJlbnQgc2xpZGUgYW5kIGRpc3BsYXkgdGhlbQoJICogdG8gdGhlIHZpZXdlci4KCSAqCgkgKiBAc2VlIHtAbGluayBjb25maWcuc2hvd05vdGVzfQoJICovCglmdW5jdGlvbiB1cGRhdGVOb3RlcygpIHsKCgkJaWYoIGNvbmZpZy5zaG93Tm90ZXMgJiYgZG9tLnNwZWFrZXJOb3RlcyAmJiBjdXJyZW50U2xpZGUgJiYgIWlzUHJpbnRpbmdQREYoKSApIHsKCgkJCWRvbS5zcGVha2VyTm90ZXMuaW5uZXJIVE1MID0gZ2V0U2xpZGVOb3RlcygpIHx8ICc8c3BhbiBjbGFzcz0ibm90ZXMtcGxhY2Vob2xkZXIiPk5vIG5vdGVzIG9uIHRoaXMgc2xpZGUuPC9zcGFuPic7CgoJCX0KCgl9CgoJLyoqCgkgKiBVcGRhdGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzcGVha2VyIG5vdGVzIHNpZGViYXIgdGhhdAoJICogaXMgdXNlZCB0byBzaGFyZSBhbm5vdGF0ZWQgc2xpZGVzLiBUaGUgbm90ZXMgc2lkZWJhciBpcwoJICogb25seSB2aXNpYmxlIGlmIHNob3dOb3RlcyBpcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm90ZXMgb24KCSAqIG9uZSBvciBtb3JlIHNsaWRlcyBpbiB0aGUgZGVjay4KCSAqLwoJZnVuY3Rpb24gdXBkYXRlTm90ZXNWaXNpYmlsaXR5KCkgewoKCQlpZiggY29uZmlnLnNob3dOb3RlcyAmJiBoYXNOb3RlcygpICkgewoJCQlkb20ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCAnc2hvdy1ub3RlcycgKTsKCQl9CgkJZWxzZSB7CgkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoICdzaG93LW5vdGVzJyApOwoJCX0KCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHNwZWFrZXIgbm90ZXMgZm9yIEFOWSBzbGlkZSBpbiB0aGUKCSAqIHByZXNlbnRhdGlvbi4KCSAqLwoJZnVuY3Rpb24gaGFzTm90ZXMoKSB7CgoJCXJldHVybiBkb20uc2xpZGVzLnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1ub3Rlc10sIGFzaWRlLm5vdGVzJyApLmxlbmd0aCA+IDA7CgoJfQoKCS8qKgoJICogVXBkYXRlcyB0aGUgcHJvZ3Jlc3MgYmFyIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc2xpZGUuCgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZVByb2dyZXNzKCkgewoKCQkvLyBVcGRhdGUgcHJvZ3Jlc3MgaWYgZW5hYmxlZAoJCWlmKCBjb25maWcucHJvZ3Jlc3MgJiYgZG9tLnByb2dyZXNzYmFyICkgewoKCQkJZG9tLnByb2dyZXNzYmFyLnN0eWxlLndpZHRoID0gZ2V0UHJvZ3Jlc3MoKSAqIGRvbS53cmFwcGVyLm9mZnNldFdpZHRoICsgJ3B4JzsKCgkJfQoKCX0KCgoJLyoqCgkgKiBVcGRhdGVzIHRoZSBzbGlkZSBudW1iZXIgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc2xpZGUuCgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZVNsaWRlTnVtYmVyKCkgewoKCQkvLyBVcGRhdGUgc2xpZGUgbnVtYmVyIGlmIGVuYWJsZWQKCQlpZiggY29uZmlnLnNsaWRlTnVtYmVyICYmIGRvbS5zbGlkZU51bWJlciApIHsKCQkJZG9tLnNsaWRlTnVtYmVyLmlubmVySFRNTCA9IGdldFNsaWRlTnVtYmVyKCk7CgkJfQoKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIEhUTUwgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgc2xpZGUgbnVtYmVyLAoJICogaW5jbHVkaW5nIGZvcm1hdHRpbmcuCgkgKi8KCWZ1bmN0aW9uIGdldFNsaWRlTnVtYmVyKCBzbGlkZSApIHsKCgkJdmFyIHZhbHVlOwoJCXZhciBmb3JtYXQgPSAnaC52JzsKCQlpZiggc2xpZGUgPT09IHVuZGVmaW5lZCApIHsKCQkJc2xpZGUgPSBjdXJyZW50U2xpZGU7CgkJfQoKCQlpZiAoIHR5cGVvZiBjb25maWcuc2xpZGVOdW1iZXIgPT09ICdmdW5jdGlvbicgKSB7CgkJCXZhbHVlID0gY29uZmlnLnNsaWRlTnVtYmVyKCBzbGlkZSApOwoJCX0gZWxzZSB7CgkJCS8vIENoZWNrIGlmIGEgY3VzdG9tIG51bWJlciBmb3JtYXQgaXMgYXZhaWxhYmxlCgkJCWlmKCB0eXBlb2YgY29uZmlnLnNsaWRlTnVtYmVyID09PSAnc3RyaW5nJyApIHsKCQkJCWZvcm1hdCA9IGNvbmZpZy5zbGlkZU51bWJlcjsKCQkJfQoKCQkJLy8gSWYgdGhlcmUgYXJlIE9OTFkgdmVydGljYWwgc2xpZGVzIGluIHRoaXMgZGVjaywgYWx3YXlzIHVzZQoJCQkvLyBhIGZsYXR0ZW5lZCBzbGlkZSBudW1iZXIKCQkJaWYoICEvYy8udGVzdCggZm9ybWF0ICkgJiYgZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKS5sZW5ndGggPT09IDEgKSB7CgkJCQlmb3JtYXQgPSAnYyc7CgkJCX0KCgkJCXZhbHVlID0gW107CgkJCXN3aXRjaCggZm9ybWF0ICkgewoJCQkJY2FzZSAnYyc6CgkJCQkJdmFsdWUucHVzaCggZ2V0U2xpZGVQYXN0Q291bnQoIHNsaWRlICkgKyAxICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdjL3QnOgoJCQkJCXZhbHVlLnB1c2goIGdldFNsaWRlUGFzdENvdW50KCBzbGlkZSApICsgMSwgJy8nLCBnZXRUb3RhbFNsaWRlcygpICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXZhciBpbmRpY2VzID0gZ2V0SW5kaWNlcyggc2xpZGUgKTsKCQkJCQl2YWx1ZS5wdXNoKCBpbmRpY2VzLmggKyAxICk7CgkJCQkJdmFyIHNlcCA9IGZvcm1hdCA9PT0gJ2gvdicgPyAnLycgOiAnLic7CgkJCQkJaWYoIGlzVmVydGljYWxTbGlkZSggc2xpZGUgKSApIHZhbHVlLnB1c2goIHNlcCwgaW5kaWNlcy52ICsgMSApOwoJCQl9CgkJfQoKCQl2YXIgdXJsID0gJyMnICsgbG9jYXRpb25IYXNoKCBzbGlkZSApOwoJCXJldHVybiBmb3JtYXRTbGlkZU51bWJlciggdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdXJsICk7CgoJfQoKCS8qKgoJICogQXBwbGllcyBIVE1MIGZvcm1hdHRpbmcgdG8gYSBzbGlkZSBudW1iZXIgYmVmb3JlIGl0J3MKCSAqIHdyaXR0ZW4gdG8gdGhlIERPTS4KCSAqCgkgKiBAcGFyYW0ge251bWJlcn0gYSBDdXJyZW50IHNsaWRlCgkgKiBAcGFyYW0ge3N0cmluZ30gZGVsaW1pdGVyIENoYXJhY3RlciB0byBzZXBhcmF0ZSBzbGlkZSBudW1iZXJzCgkgKiBAcGFyYW0geyhudW1iZXJ8Kil9IGIgVG90YWwgc2xpZGVzCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbdXJsPScjJytsb2NhdGlvbkhhc2goKV0gVGhlIHVybCB0byBsaW5rIHRvCgkgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5nIGZyYWdtZW50CgkgKi8KCWZ1bmN0aW9uIGZvcm1hdFNsaWRlTnVtYmVyKCBhLCBkZWxpbWl0ZXIsIGIsIHVybCApIHsKCgkJaWYoIHVybCA9PT0gdW5kZWZpbmVkICkgewoJCQl1cmwgPSAnIycgKyBsb2NhdGlvbkhhc2goKTsKCQl9CgkJaWYoIHR5cGVvZiBiID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oIGIgKSApIHsKCQkJcmV0dXJuICAnPGEgaHJlZj0iJyArIHVybCArICciPicgKwoJCQkJCSc8c3BhbiBjbGFzcz0ic2xpZGUtbnVtYmVyLWEiPicrIGEgKyc8L3NwYW4+JyArCgkJCQkJJzxzcGFuIGNsYXNzPSJzbGlkZS1udW1iZXItZGVsaW1pdGVyIj4nKyBkZWxpbWl0ZXIgKyc8L3NwYW4+JyArCgkJCQkJJzxzcGFuIGNsYXNzPSJzbGlkZS1udW1iZXItYiI+JysgYiArJzwvc3Bhbj4nICsKCQkJCQknPC9hPic7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gJzxhIGhyZWY9IicgKyB1cmwgKyAnIj4nICsKCQkJICAgICAgICc8c3BhbiBjbGFzcz0ic2xpZGUtbnVtYmVyLWEiPicrIGEgKyc8L3NwYW4+JyArCgkJCSAgICAgICAnPC9hPic7CgkJfQoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGFsbCBjb250cm9sL25hdmlnYXRpb24gYXJyb3dzLgoJICovCglmdW5jdGlvbiB1cGRhdGVDb250cm9scygpIHsKCgkJdmFyIHJvdXRlcyA9IGF2YWlsYWJsZVJvdXRlcygpOwoJCXZhciBmcmFnbWVudHMgPSBhdmFpbGFibGVGcmFnbWVudHMoKTsKCgkJLy8gUmVtb3ZlIHRoZSAnZW5hYmxlZCcgY2xhc3MgZnJvbSBhbGwgZGlyZWN0aW9ucwoJCWRvbS5jb250cm9sc0xlZnQuY29uY2F0KCBkb20uY29udHJvbHNSaWdodCApCgkJCQkJCS5jb25jYXQoIGRvbS5jb250cm9sc1VwICkKCQkJCQkJLmNvbmNhdCggZG9tLmNvbnRyb2xzRG93biApCgkJCQkJCS5jb25jYXQoIGRvbS5jb250cm9sc1ByZXYgKQoJCQkJCQkuY29uY2F0KCBkb20uY29udHJvbHNOZXh0ICkuZm9yRWFjaCggZnVuY3Rpb24oIG5vZGUgKSB7CgkJCW5vZGUuY2xhc3NMaXN0LnJlbW92ZSggJ2VuYWJsZWQnICk7CgkJCW5vZGUuY2xhc3NMaXN0LnJlbW92ZSggJ2ZyYWdtZW50ZWQnICk7CgoJCQkvLyBTZXQgJ2Rpc2FibGVkJyBhdHRyaWJ1dGUgb24gYWxsIGRpcmVjdGlvbnMKCQkJbm9kZS5zZXRBdHRyaWJ1dGUoICdkaXNhYmxlZCcsICdkaXNhYmxlZCcgKTsKCQl9ICk7CgoJCS8vIEFkZCB0aGUgJ2VuYWJsZWQnIGNsYXNzIHRvIHRoZSBhdmFpbGFibGUgcm91dGVzOyByZW1vdmUgJ2Rpc2FibGVkJyBhdHRyaWJ1dGUgdG8gZW5hYmxlIGJ1dHRvbnMKCQlpZiggcm91dGVzLmxlZnQgKSBkb20uY29udHJvbHNMZWZ0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy5yaWdodCApIGRvbS5jb250cm9sc1JpZ2h0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy51cCApIGRvbS5jb250cm9sc1VwLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy5kb3duICkgZG9tLmNvbnRyb2xzRG93bi5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmNsYXNzTGlzdC5hZGQoICdlbmFibGVkJyApOyBlbC5yZW1vdmVBdHRyaWJ1dGUoICdkaXNhYmxlZCcgKTsgfSApOwoKCQkvLyBQcmV2L25leHQgYnV0dG9ucwoJCWlmKCByb3V0ZXMubGVmdCB8fCByb3V0ZXMudXAgKSBkb20uY29udHJvbHNQcmV2LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJaWYoIHJvdXRlcy5yaWdodCB8fCByb3V0ZXMuZG93biApIGRvbS5jb250cm9sc05leHQuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5jbGFzc0xpc3QuYWRkKCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCgkJLy8gSGlnaGxpZ2h0IGZyYWdtZW50IGRpcmVjdGlvbnMKCQlpZiggY3VycmVudFNsaWRlICkgewoKCQkJLy8gQWx3YXlzIGFwcGx5IGZyYWdtZW50IGRlY29yYXRvciB0byBwcmV2L25leHQgYnV0dG9ucwoJCQlpZiggZnJhZ21lbnRzLnByZXYgKSBkb20uY29udHJvbHNQcmV2LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2ZyYWdtZW50ZWQnLCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCQkJaWYoIGZyYWdtZW50cy5uZXh0ICkgZG9tLmNvbnRyb2xzTmV4dC5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmNsYXNzTGlzdC5hZGQoICdmcmFnbWVudGVkJywgJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgoJCQkvLyBBcHBseSBmcmFnbWVudCBkZWNvcmF0b3JzIHRvIGRpcmVjdGlvbmFsIGJ1dHRvbnMgYmFzZWQgb24KCQkJLy8gd2hhdCBzbGlkZSBheGlzIHRoZXkgYXJlIGluCgkJCWlmKCBpc1ZlcnRpY2FsU2xpZGUoIGN1cnJlbnRTbGlkZSApICkgewoJCQkJaWYoIGZyYWdtZW50cy5wcmV2ICkgZG9tLmNvbnRyb2xzVXAuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBlbC5jbGFzc0xpc3QuYWRkKCAnZnJhZ21lbnRlZCcsICdlbmFibGVkJyApOyBlbC5yZW1vdmVBdHRyaWJ1dGUoICdkaXNhYmxlZCcgKTsgfSApOwoJCQkJaWYoIGZyYWdtZW50cy5uZXh0ICkgZG9tLmNvbnRyb2xzRG93bi5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IGVsLmNsYXNzTGlzdC5hZGQoICdmcmFnbWVudGVkJywgJ2VuYWJsZWQnICk7IGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApOyB9ICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiggZnJhZ21lbnRzLnByZXYgKSBkb20uY29udHJvbHNMZWZ0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2ZyYWdtZW50ZWQnLCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCQkJCWlmKCBmcmFnbWVudHMubmV4dCApIGRvbS5jb250cm9sc1JpZ2h0LmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgZWwuY2xhc3NMaXN0LmFkZCggJ2ZyYWdtZW50ZWQnLCAnZW5hYmxlZCcgKTsgZWwucmVtb3ZlQXR0cmlidXRlKCAnZGlzYWJsZWQnICk7IH0gKTsKCQkJfQoKCQl9CgoJCWlmKCBjb25maWcuY29udHJvbHNUdXRvcmlhbCApIHsKCgkJCS8vIEhpZ2hsaWdodCBjb250cm9sIGFycm93cyB3aXRoIGFuIGFuaW1hdGlvbiB0byBlbnN1cmUKCQkJLy8gdGhhdCB0aGUgdmlld2VyIGtub3dzIGhvdyB0byBuYXZpZ2F0ZQoJCQlpZiggIWhhc05hdmlnYXRlZERvd24gJiYgcm91dGVzLmRvd24gKSB7CgkJCQlkb20uY29udHJvbHNEb3duQXJyb3cuY2xhc3NMaXN0LmFkZCggJ2hpZ2hsaWdodCcgKTsKCQkJfQoJCQllbHNlIHsKCQkJCWRvbS5jb250cm9sc0Rvd25BcnJvdy5jbGFzc0xpc3QucmVtb3ZlKCAnaGlnaGxpZ2h0JyApOwoKCQkJCWlmKCAhaGFzTmF2aWdhdGVkUmlnaHQgJiYgcm91dGVzLnJpZ2h0ICYmIGluZGV4diA9PT0gMCApIHsKCQkJCQlkb20uY29udHJvbHNSaWdodEFycm93LmNsYXNzTGlzdC5hZGQoICdoaWdobGlnaHQnICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlkb20uY29udHJvbHNSaWdodEFycm93LmNsYXNzTGlzdC5yZW1vdmUoICdoaWdobGlnaHQnICk7CgkJCQl9CgkJCX0KCgkJfQoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgdGhlIGJhY2tncm91bmQgZWxlbWVudHMgdG8gcmVmbGVjdCB0aGUgY3VycmVudAoJICogc2xpZGUuCgkgKgoJICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsIElmIHRydWUsIHRoZSBiYWNrZ3JvdW5kcyBvZgoJICogYWxsIHZlcnRpY2FsIHNsaWRlcyAobm90IGp1c3QgdGhlIHByZXNlbnQpIHdpbGwgYmUgdXBkYXRlZC4KCSAqLwoJZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZCggaW5jbHVkZUFsbCApIHsKCgkJdmFyIGN1cnJlbnRCYWNrZ3JvdW5kID0gbnVsbDsKCgkJLy8gUmV2ZXJzZSBwYXN0L2Z1dHVyZSBjbGFzc2VzIHdoZW4gaW4gUlRMIG1vZGUKCQl2YXIgaG9yaXpvbnRhbFBhc3QgPSBjb25maWcucnRsID8gJ2Z1dHVyZScgOiAncGFzdCcsCgkJCWhvcml6b250YWxGdXR1cmUgPSBjb25maWcucnRsID8gJ3Bhc3QnIDogJ2Z1dHVyZSc7CgoJCS8vIFVwZGF0ZSB0aGUgY2xhc3NlcyBvZiBhbGwgYmFja2dyb3VuZHMgdG8gbWF0Y2ggdGhlCgkJLy8gc3RhdGVzIG9mIHRoZWlyIHNsaWRlcyAocGFzdC9wcmVzZW50L2Z1dHVyZSkKCQl0b0FycmF5KCBkb20uYmFja2dyb3VuZC5jaGlsZE5vZGVzICkuZm9yRWFjaCggZnVuY3Rpb24oIGJhY2tncm91bmRoLCBoICkgewoKCQkJYmFja2dyb3VuZGguY2xhc3NMaXN0LnJlbW92ZSggJ3Bhc3QnICk7CgkJCWJhY2tncm91bmRoLmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQliYWNrZ3JvdW5kaC5jbGFzc0xpc3QucmVtb3ZlKCAnZnV0dXJlJyApOwoKCQkJaWYoIGggPCBpbmRleGggKSB7CgkJCQliYWNrZ3JvdW5kaC5jbGFzc0xpc3QuYWRkKCBob3Jpem9udGFsUGFzdCApOwoJCQl9CgkJCWVsc2UgaWYgKCBoID4gaW5kZXhoICkgewoJCQkJYmFja2dyb3VuZGguY2xhc3NMaXN0LmFkZCggaG9yaXpvbnRhbEZ1dHVyZSApOwoJCQl9CgkJCWVsc2UgewoJCQkJYmFja2dyb3VuZGguY2xhc3NMaXN0LmFkZCggJ3ByZXNlbnQnICk7CgoJCQkJLy8gU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYmFja2dyb3VuZCBlbGVtZW50CgkJCQljdXJyZW50QmFja2dyb3VuZCA9IGJhY2tncm91bmRoOwoJCQl9CgoJCQlpZiggaW5jbHVkZUFsbCB8fCBoID09PSBpbmRleGggKSB7CgkJCQl0b0FycmF5KCBiYWNrZ3JvdW5kaC5xdWVyeVNlbGVjdG9yQWxsKCAnLnNsaWRlLWJhY2tncm91bmQnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggYmFja2dyb3VuZHYsIHYgKSB7CgoJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5yZW1vdmUoICdwYXN0JyApOwoJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5yZW1vdmUoICdwcmVzZW50JyApOwoJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5yZW1vdmUoICdmdXR1cmUnICk7CgoJCQkJCWlmKCB2IDwgaW5kZXh2ICkgewoJCQkJCQliYWNrZ3JvdW5kdi5jbGFzc0xpc3QuYWRkKCAncGFzdCcgKTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoIHYgPiBpbmRleHYgKSB7CgkJCQkJCWJhY2tncm91bmR2LmNsYXNzTGlzdC5hZGQoICdmdXR1cmUnICk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQliYWNrZ3JvdW5kdi5jbGFzc0xpc3QuYWRkKCAncHJlc2VudCcgKTsKCgkJCQkJCS8vIE9ubHkgaWYgdGhpcyBpcyB0aGUgcHJlc2VudCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzbGlkZQoJCQkJCQlpZiggaCA9PT0gaW5kZXhoICkgY3VycmVudEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kdjsKCQkJCQl9CgoJCQkJfSApOwoJCQl9CgoJCX0gKTsKCgkJLy8gU3RvcCBjb250ZW50IGluc2lkZSBvZiBwcmV2aW91cyBiYWNrZ3JvdW5kcwoJCWlmKCBwcmV2aW91c0JhY2tncm91bmQgKSB7CgoJCQlzdG9wRW1iZWRkZWRDb250ZW50KCBwcmV2aW91c0JhY2tncm91bmQsIHsgdW5sb2FkSWZyYW1lczogIXNob3VsZFByZWxvYWQoIHByZXZpb3VzQmFja2dyb3VuZCApIH0gKTsKCgkJfQoKCQkvLyBTdGFydCBjb250ZW50IGluIHRoZSBjdXJyZW50IGJhY2tncm91bmQKCQlpZiggY3VycmVudEJhY2tncm91bmQgKSB7CgoJCQlzdGFydEVtYmVkZGVkQ29udGVudCggY3VycmVudEJhY2tncm91bmQgKTsKCgkJCXZhciBjdXJyZW50QmFja2dyb3VuZENvbnRlbnQgPSBjdXJyZW50QmFja2dyb3VuZC5xdWVyeVNlbGVjdG9yKCAnLnNsaWRlLWJhY2tncm91bmQtY29udGVudCcgKTsKCQkJaWYoIGN1cnJlbnRCYWNrZ3JvdW5kQ29udGVudCApIHsKCgkJCQl2YXIgYmFja2dyb3VuZEltYWdlVVJMID0gY3VycmVudEJhY2tncm91bmRDb250ZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSB8fCAnJzsKCgkJCQkvLyBSZXN0YXJ0IEdJRnMgKGRvZXNuJ3Qgd29yayBpbiBGaXJlZm94KQoJCQkJaWYoIC9cLmdpZi9pLnRlc3QoIGJhY2tncm91bmRJbWFnZVVSTCApICkgewoJCQkJCWN1cnJlbnRCYWNrZ3JvdW5kQ29udGVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJzsKCQkJCQl3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggY3VycmVudEJhY2tncm91bmRDb250ZW50ICkub3BhY2l0eTsKCQkJCQljdXJyZW50QmFja2dyb3VuZENvbnRlbnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlVVJMOwoJCQkJfQoKCQkJfQoKCQkJLy8gRG9uJ3QgdHJhbnNpdGlvbiBiZXR3ZWVuIGlkZW50aWNhbCBiYWNrZ3JvdW5kcy4gVGhpcwoJCQkvLyBwcmV2ZW50cyB1bndhbnRlZCBmbGlja2VyLgoJCQl2YXIgcHJldmlvdXNCYWNrZ3JvdW5kSGFzaCA9IHByZXZpb3VzQmFja2dyb3VuZCA/IHByZXZpb3VzQmFja2dyb3VuZC5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaGFzaCcgKSA6IG51bGw7CgkJCXZhciBjdXJyZW50QmFja2dyb3VuZEhhc2ggPSBjdXJyZW50QmFja2dyb3VuZC5nZXRBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtaGFzaCcgKTsKCQkJaWYoIGN1cnJlbnRCYWNrZ3JvdW5kSGFzaCAmJiBjdXJyZW50QmFja2dyb3VuZEhhc2ggPT09IHByZXZpb3VzQmFja2dyb3VuZEhhc2ggJiYgY3VycmVudEJhY2tncm91bmQgIT09IHByZXZpb3VzQmFja2dyb3VuZCApIHsKCQkJCWRvbS5iYWNrZ3JvdW5kLmNsYXNzTGlzdC5hZGQoICduby10cmFuc2l0aW9uJyApOwoJCQl9CgoJCQlwcmV2aW91c0JhY2tncm91bmQgPSBjdXJyZW50QmFja2dyb3VuZDsKCgkJfQoKCQkvLyBJZiB0aGVyZSdzIGEgYmFja2dyb3VuZCBicmlnaHRuZXNzIGZsYWcgZm9yIHRoaXMgc2xpZGUsCgkJLy8gYnViYmxlIGl0IHRvIHRoZSAucmV2ZWFsIGNvbnRhaW5lcgoJCWlmKCBjdXJyZW50U2xpZGUgKSB7CgkJCVsgJ2hhcy1saWdodC1iYWNrZ3JvdW5kJywgJ2hhcy1kYXJrLWJhY2tncm91bmQnIF0uZm9yRWFjaCggZnVuY3Rpb24oIGNsYXNzVG9CdWJibGUgKSB7CgkJCQlpZiggY3VycmVudFNsaWRlLmNsYXNzTGlzdC5jb250YWlucyggY2xhc3NUb0J1YmJsZSApICkgewoJCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5hZGQoIGNsYXNzVG9CdWJibGUgKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWRvbS53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoIGNsYXNzVG9CdWJibGUgKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gQWxsb3cgdGhlIGZpcnN0IGJhY2tncm91bmQgdG8gYXBwbHkgd2l0aG91dCB0cmFuc2l0aW9uCgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCWRvbS5iYWNrZ3JvdW5kLmNsYXNzTGlzdC5yZW1vdmUoICduby10cmFuc2l0aW9uJyApOwoJCX0sIDEgKTsKCgl9CgoJLyoqCgkgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGFyYWxsYXggYmFja2dyb3VuZCBiYXNlZAoJICogb24gdGhlIGN1cnJlbnQgc2xpZGUgaW5kZXguCgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZVBhcmFsbGF4KCkgewoKCQlpZiggY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZEltYWdlICkgewoKCQkJdmFyIGhvcml6b250YWxTbGlkZXMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApLAoJCQkJdmVydGljYWxTbGlkZXMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBWRVJUSUNBTF9TTElERVNfU0VMRUNUT1IgKTsKCgkJCXZhciBiYWNrZ3JvdW5kU2l6ZSA9IGRvbS5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRTaXplLnNwbGl0KCAnICcgKSwKCQkJCWJhY2tncm91bmRXaWR0aCwgYmFja2dyb3VuZEhlaWdodDsKCgkJCWlmKCBiYWNrZ3JvdW5kU2l6ZS5sZW5ndGggPT09IDEgKSB7CgkJCQliYWNrZ3JvdW5kV2lkdGggPSBiYWNrZ3JvdW5kSGVpZ2h0ID0gcGFyc2VJbnQoIGJhY2tncm91bmRTaXplWzBdLCAxMCApOwoJCQl9CgkJCWVsc2UgewoJCQkJYmFja2dyb3VuZFdpZHRoID0gcGFyc2VJbnQoIGJhY2tncm91bmRTaXplWzBdLCAxMCApOwoJCQkJYmFja2dyb3VuZEhlaWdodCA9IHBhcnNlSW50KCBiYWNrZ3JvdW5kU2l6ZVsxXSwgMTAgKTsKCQkJfQoKCQkJdmFyIHNsaWRlV2lkdGggPSBkb20uYmFja2dyb3VuZC5vZmZzZXRXaWR0aCwKCQkJCWhvcml6b250YWxTbGlkZUNvdW50ID0gaG9yaXpvbnRhbFNsaWRlcy5sZW5ndGgsCgkJCQlob3Jpem9udGFsT2Zmc2V0TXVsdGlwbGllciwKCQkJCWhvcml6b250YWxPZmZzZXQ7CgoJCQlpZiggdHlwZW9mIGNvbmZpZy5wYXJhbGxheEJhY2tncm91bmRIb3Jpem9udGFsID09PSAnbnVtYmVyJyApIHsKCQkJCWhvcml6b250YWxPZmZzZXRNdWx0aXBsaWVyID0gY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZEhvcml6b250YWw7CgkJCX0KCQkJZWxzZSB7CgkJCQlob3Jpem9udGFsT2Zmc2V0TXVsdGlwbGllciA9IGhvcml6b250YWxTbGlkZUNvdW50ID4gMSA/ICggYmFja2dyb3VuZFdpZHRoIC0gc2xpZGVXaWR0aCApIC8gKCBob3Jpem9udGFsU2xpZGVDb3VudC0xICkgOiAwOwoJCQl9CgoJCQlob3Jpem9udGFsT2Zmc2V0ID0gaG9yaXpvbnRhbE9mZnNldE11bHRpcGxpZXIgKiBpbmRleGggKiAtMTsKCgkJCXZhciBzbGlkZUhlaWdodCA9IGRvbS5iYWNrZ3JvdW5kLm9mZnNldEhlaWdodCwKCQkJCXZlcnRpY2FsU2xpZGVDb3VudCA9IHZlcnRpY2FsU2xpZGVzLmxlbmd0aCwKCQkJCXZlcnRpY2FsT2Zmc2V0TXVsdGlwbGllciwKCQkJCXZlcnRpY2FsT2Zmc2V0OwoKCQkJaWYoIHR5cGVvZiBjb25maWcucGFyYWxsYXhCYWNrZ3JvdW5kVmVydGljYWwgPT09ICdudW1iZXInICkgewoJCQkJdmVydGljYWxPZmZzZXRNdWx0aXBsaWVyID0gY29uZmlnLnBhcmFsbGF4QmFja2dyb3VuZFZlcnRpY2FsOwoJCQl9CgkJCWVsc2UgewoJCQkJdmVydGljYWxPZmZzZXRNdWx0aXBsaWVyID0gKCBiYWNrZ3JvdW5kSGVpZ2h0IC0gc2xpZGVIZWlnaHQgKSAvICggdmVydGljYWxTbGlkZUNvdW50LTEgKTsKCQkJfQoKCQkJdmVydGljYWxPZmZzZXQgPSB2ZXJ0aWNhbFNsaWRlQ291bnQgPiAwID8gIHZlcnRpY2FsT2Zmc2V0TXVsdGlwbGllciAqIGluZGV4diA6IDA7CgoJCQlkb20uYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSBob3Jpem9udGFsT2Zmc2V0ICsgJ3B4ICcgKyAtdmVydGljYWxPZmZzZXQgKyAncHgnOwoKCQl9CgoJfQoKCS8qKgoJICogU2hvdWxkIHRoZSBnaXZlbiBlbGVtZW50IGJlIHByZWxvYWRlZD8KCSAqIERlY2lkZXMgYmFzZWQgb24gbG9jYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFuZCBnbG9iYWwgY29uZmlnLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQKCSAqLwoJZnVuY3Rpb24gc2hvdWxkUHJlbG9hZCggZWxlbWVudCApIHsKCgkJLy8gUHJlZmVyIGFuIGV4cGxpY2l0IGdsb2JhbCBwcmVsb2FkIHNldHRpbmcKCQl2YXIgcHJlbG9hZCA9IGNvbmZpZy5wcmVsb2FkSWZyYW1lczsKCgkJLy8gSWYgbm8gZ2xvYmFsIHNldHRpbmcgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgb24gdGhlIGVsZW1lbnQncwoJCS8vIG93biBwcmVsb2FkIHNldHRpbmcKCQlpZiggdHlwZW9mIHByZWxvYWQgIT09ICdib29sZWFuJyApIHsKCQkJcHJlbG9hZCA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCAnZGF0YS1wcmVsb2FkJyApOwoJCX0KCgkJcmV0dXJuIHByZWxvYWQ7Cgl9CgoJLyoqCgkgKiBDYWxsZWQgd2hlbiB0aGUgZ2l2ZW4gc2xpZGUgaXMgd2l0aGluIHRoZSBjb25maWd1cmVkIHZpZXcKCSAqIGRpc3RhbmNlLiBTaG93cyB0aGUgc2xpZGUgZWxlbWVudCBhbmQgbG9hZHMgYW55IGNvbnRlbnQKCSAqIHRoYXQgaXMgc2V0IHRvIGxvYWQgbGF6aWx5IChkYXRhLXNyYykuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2xpZGUgU2xpZGUgdG8gc2hvdwoJICovCglmdW5jdGlvbiBsb2FkU2xpZGUoIHNsaWRlLCBvcHRpb25zICkgewoKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJLy8gU2hvdyB0aGUgc2xpZGUgZWxlbWVudAoJCXNsaWRlLnN0eWxlLmRpc3BsYXkgPSBjb25maWcuZGlzcGxheTsKCgkJLy8gTWVkaWEgZWxlbWVudHMgd2l0aCBkYXRhLXNyYyBhdHRyaWJ1dGVzCgkJdG9BcnJheSggc2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ2ltZ1tkYXRhLXNyY10sIHZpZGVvW2RhdGEtc3JjXSwgYXVkaW9bZGF0YS1zcmNdLCBpZnJhbWVbZGF0YS1zcmNdJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJCWlmKCBlbGVtZW50LnRhZ05hbWUgIT09ICdJRlJBTUUnIHx8IHNob3VsZFByZWxvYWQoIGVsZW1lbnQgKSApIHsKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAnc3JjJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycgKSApOwoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdkYXRhLWxhenktbG9hZGVkJywgJycgKTsKCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1zcmMnICk7CgkJCX0KCQl9ICk7CgoJCS8vIE1lZGlhIGVsZW1lbnRzIHdpdGggPHNvdXJjZT4gY2hpbGRyZW4KCQl0b0FycmF5KCBzbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAndmlkZW8sIGF1ZGlvJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIG1lZGlhICkgewoJCQl2YXIgc291cmNlcyA9IDA7CgoJCQl0b0FycmF5KCBtZWRpYS5xdWVyeVNlbGVjdG9yQWxsKCAnc291cmNlW2RhdGEtc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBzb3VyY2UgKSB7CgkJCQlzb3VyY2Uuc2V0QXR0cmlidXRlKCAnc3JjJywgc291cmNlLmdldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJyApICk7CgkJCQlzb3VyY2UucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1zcmMnICk7CgkJCQlzb3VyY2Uuc2V0QXR0cmlidXRlKCAnZGF0YS1sYXp5LWxvYWRlZCcsICcnICk7CgkJCQlzb3VyY2VzICs9IDE7CgkJCX0gKTsKCgkJCS8vIElmIHdlIHJld3JvdGUgc291cmNlcyBmb3IgdGhpcyB2aWRlby9hdWRpbyBlbGVtZW50LCB3ZSBuZWVkCgkJCS8vIHRvIG1hbnVhbGx5IHRlbGwgaXQgdG8gbG9hZCBmcm9tIGl0cyBuZXcgb3JpZ2luCgkJCWlmKCBzb3VyY2VzID4gMCApIHsKCQkJCW1lZGlhLmxvYWQoKTsKCQkJfQoJCX0gKTsKCgoJCS8vIFNob3cgdGhlIGNvcnJlc3BvbmRpbmcgYmFja2dyb3VuZCBlbGVtZW50CgkJdmFyIGJhY2tncm91bmQgPSBzbGlkZS5zbGlkZUJhY2tncm91bmRFbGVtZW50OwoJCWlmKCBiYWNrZ3JvdW5kICkgewoJCQliYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwoKCQkJdmFyIGJhY2tncm91bmRDb250ZW50ID0gc2xpZGUuc2xpZGVCYWNrZ3JvdW5kQ29udGVudEVsZW1lbnQ7CgkJCXZhciBiYWNrZ3JvdW5kSWZyYW1lID0gc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLWlmcmFtZScgKTsKCgkJCS8vIElmIHRoZSBiYWNrZ3JvdW5kIGNvbnRhaW5zIG1lZGlhLCBsb2FkIGl0CgkJCWlmKCBiYWNrZ3JvdW5kLmhhc0F0dHJpYnV0ZSggJ2RhdGEtbG9hZGVkJyApID09PSBmYWxzZSApIHsKCQkJCWJhY2tncm91bmQuc2V0QXR0cmlidXRlKCAnZGF0YS1sb2FkZWQnLCAndHJ1ZScgKTsKCgkJCQl2YXIgYmFja2dyb3VuZEltYWdlID0gc2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLWltYWdlJyApLAoJCQkJCWJhY2tncm91bmRWaWRlbyA9IHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtYmFja2dyb3VuZC12aWRlbycgKSwKCQkJCQliYWNrZ3JvdW5kVmlkZW9Mb29wID0gc2xpZGUuaGFzQXR0cmlidXRlKCAnZGF0YS1iYWNrZ3JvdW5kLXZpZGVvLWxvb3AnICksCgkJCQkJYmFja2dyb3VuZFZpZGVvTXV0ZWQgPSBzbGlkZS5oYXNBdHRyaWJ1dGUoICdkYXRhLWJhY2tncm91bmQtdmlkZW8tbXV0ZWQnICk7CgoJCQkJLy8gSW1hZ2VzCgkJCQlpZiggYmFja2dyb3VuZEltYWdlICkgewoJCQkJCWJhY2tncm91bmRDb250ZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJysgZW5jb2RlVVJJKCBiYWNrZ3JvdW5kSW1hZ2UgKSArJyknOwoJCQkJfQoJCQkJLy8gVmlkZW9zCgkJCQllbHNlIGlmICggYmFja2dyb3VuZFZpZGVvICYmICFpc1NwZWFrZXJOb3RlcygpICkgewoJCQkJCXZhciB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICd2aWRlbycgKTsKCgkJCQkJaWYoIGJhY2tncm91bmRWaWRlb0xvb3AgKSB7CgkJCQkJCXZpZGVvLnNldEF0dHJpYnV0ZSggJ2xvb3AnLCAnJyApOwoJCQkJCX0KCgkJCQkJaWYoIGJhY2tncm91bmRWaWRlb011dGVkICkgewoJCQkJCQl2aWRlby5tdXRlZCA9IHRydWU7CgkJCQkJfQoKCQkJCQkvLyBJbmxpbmUgdmlkZW8gcGxheWJhY2sgd29ya3MgKGF0IGxlYXN0IGluIE1vYmlsZSBTYWZhcmkpIGFzCgkJCQkJLy8gbG9uZyBhcyB0aGUgdmlkZW8gaXMgbXV0ZWQgYW5kIHRoZSBgcGxheXNpbmxpbmVgIGF0dHJpYnV0ZSBpcwoJCQkJCS8vIHByZXNlbnQKCQkJCQlpZiggaXNNb2JpbGVEZXZpY2UgKSB7CgkJCQkJCXZpZGVvLm11dGVkID0gdHJ1ZTsKCQkJCQkJdmlkZW8uYXV0b3BsYXkgPSB0cnVlOwoJCQkJCQl2aWRlby5zZXRBdHRyaWJ1dGUoICdwbGF5c2lubGluZScsICcnICk7CgkJCQkJfQoKCQkJCQkvLyBTdXBwb3J0IGNvbW1hIHNlcGFyYXRlZCBsaXN0cyBvZiB2aWRlbyBzb3VyY2VzCgkJCQkJYmFja2dyb3VuZFZpZGVvLnNwbGl0KCAnLCcgKS5mb3JFYWNoKCBmdW5jdGlvbiggc291cmNlICkgewoJCQkJCQl2aWRlby5pbm5lckhUTUwgKz0gJzxzb3VyY2Ugc3JjPSInKyBzb3VyY2UgKyciPic7CgkJCQkJfSApOwoKCQkJCQliYWNrZ3JvdW5kQ29udGVudC5hcHBlbmRDaGlsZCggdmlkZW8gKTsKCQkJCX0KCQkJCS8vIElmcmFtZXMKCQkJCWVsc2UgaWYoIGJhY2tncm91bmRJZnJhbWUgJiYgb3B0aW9ucy5leGNsdWRlSWZyYW1lcyAhPT0gdHJ1ZSApIHsKCQkJCQl2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2lmcmFtZScgKTsKCQkJCQlpZnJhbWUuc2V0QXR0cmlidXRlKCAnYWxsb3dmdWxsc2NyZWVuJywgJycgKTsKCQkJCQlpZnJhbWUuc2V0QXR0cmlidXRlKCAnbW96YWxsb3dmdWxsc2NyZWVuJywgJycgKTsKCQkJCQlpZnJhbWUuc2V0QXR0cmlidXRlKCAnd2Via2l0YWxsb3dmdWxsc2NyZWVuJywgJycgKTsKCQkJCQlpZnJhbWUuc2V0QXR0cmlidXRlKCAnYWxsb3cnLCAnYXV0b3BsYXknICk7CgoJCQkJCWlmcmFtZS5zZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycsIGJhY2tncm91bmRJZnJhbWUgKTsKCgkJCQkJaWZyYW1lLnN0eWxlLndpZHRoICA9ICcxMDAlJzsKCQkJCQlpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwoJCQkJCWlmcmFtZS5zdHlsZS5tYXhIZWlnaHQgPSAnMTAwJSc7CgkJCQkJaWZyYW1lLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnOwoKCQkJCQliYWNrZ3JvdW5kQ29udGVudC5hcHBlbmRDaGlsZCggaWZyYW1lICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IGxvYWRpbmcgcHJlbG9hZGFibGUgaWZyYW1lcwoJCQl2YXIgYmFja2dyb3VuZElmcmFtZUVsZW1lbnQgPSBiYWNrZ3JvdW5kQ29udGVudC5xdWVyeVNlbGVjdG9yKCAnaWZyYW1lW2RhdGEtc3JjXScgKTsKCQkJaWYoIGJhY2tncm91bmRJZnJhbWVFbGVtZW50ICkgewoKCQkJCS8vIENoZWNrIGlmIHRoaXMgaWZyYW1lIGlzIGVsaWdpYmxlIHRvIGJlIHByZWxvYWRlZAoJCQkJaWYoIHNob3VsZFByZWxvYWQoIGJhY2tncm91bmQgKSAmJiAhL2F1dG9wbGF5PSgxfHRydWV8eWVzKS9naS50ZXN0KCBiYWNrZ3JvdW5kSWZyYW1lICkgKSB7CgkJCQkJaWYoIGJhY2tncm91bmRJZnJhbWVFbGVtZW50LmdldEF0dHJpYnV0ZSggJ3NyYycgKSAhPT0gYmFja2dyb3VuZElmcmFtZSApIHsKCQkJCQkJYmFja2dyb3VuZElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKCAnc3JjJywgYmFja2dyb3VuZElmcmFtZSApOwoJCQkJCX0KCQkJCX0KCgkJCX0KCgkJfQoKCX0KCgkvKioKCSAqIFVubG9hZHMgYW5kIGhpZGVzIHRoZSBnaXZlbiBzbGlkZS4gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUKCSAqIHNsaWRlIGlzIG1vdmVkIG91dHNpZGUgb2YgdGhlIGNvbmZpZ3VyZWQgdmlldyBkaXN0YW5jZS4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzbGlkZQoJICovCglmdW5jdGlvbiB1bmxvYWRTbGlkZSggc2xpZGUgKSB7CgoJCS8vIEhpZGUgdGhlIHNsaWRlIGVsZW1lbnQKCQlzbGlkZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoKCQkvLyBIaWRlIHRoZSBjb3JyZXNwb25kaW5nIGJhY2tncm91bmQgZWxlbWVudAoJCXZhciBiYWNrZ3JvdW5kID0gZ2V0U2xpZGVCYWNrZ3JvdW5kKCBzbGlkZSApOwoJCWlmKCBiYWNrZ3JvdW5kICkgewoJCQliYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgoJCQkvLyBVbmxvYWQgYW55IGJhY2tncm91bmQgaWZyYW1lcwoJCQl0b0FycmF5KCBiYWNrZ3JvdW5kLnF1ZXJ5U2VsZWN0b3JBbGwoICdpZnJhbWVbc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoICdzcmMnICk7CgkJCX0gKTsKCQl9CgoJCS8vIFJlc2V0IGxhenktbG9hZGVkIG1lZGlhIGVsZW1lbnRzIHdpdGggc3JjIGF0dHJpYnV0ZXMKCQl0b0FycmF5KCBzbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAndmlkZW9bZGF0YS1sYXp5LWxvYWRlZF1bc3JjXSwgYXVkaW9bZGF0YS1sYXp5LWxvYWRlZF1bc3JjXSwgaWZyYW1lW2RhdGEtbGF6eS1sb2FkZWRdW3NyY10nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbWVudCApIHsKCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAnc3JjJyApICk7CgkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCAnc3JjJyApOwoJCX0gKTsKCgkJLy8gUmVzZXQgbGF6eS1sb2FkZWQgbWVkaWEgZWxlbWVudHMgd2l0aCA8c291cmNlPiBjaGlsZHJlbgoJCXRvQXJyYXkoIHNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICd2aWRlb1tkYXRhLWxhenktbG9hZGVkXSBzb3VyY2Vbc3JjXSwgYXVkaW8gc291cmNlW3NyY10nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggc291cmNlICkgewoJCQlzb3VyY2Uuc2V0QXR0cmlidXRlKCAnZGF0YS1zcmMnLCBzb3VyY2UuZ2V0QXR0cmlidXRlKCAnc3JjJyApICk7CgkJCXNvdXJjZS5yZW1vdmVBdHRyaWJ1dGUoICdzcmMnICk7CgkJfSApOwoKCX0KCgkvKioKCSAqIERldGVybWluZSB3aGF0IGF2YWlsYWJsZSByb3V0ZXMgdGhlcmUgYXJlIGZvciBuYXZpZ2F0aW9uLgoJICoKCSAqIEByZXR1cm4ge3tsZWZ0OiBib29sZWFuLCByaWdodDogYm9vbGVhbiwgdXA6IGJvb2xlYW4sIGRvd246IGJvb2xlYW59fQoJICovCglmdW5jdGlvbiBhdmFpbGFibGVSb3V0ZXMoKSB7CgoJCXZhciBob3Jpem9udGFsU2xpZGVzID0gZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSwKCQkJdmVydGljYWxTbGlkZXMgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBWRVJUSUNBTF9TTElERVNfU0VMRUNUT1IgKTsKCgkJdmFyIHJvdXRlcyA9IHsKCQkJbGVmdDogaW5kZXhoID4gMCwKCQkJcmlnaHQ6IGluZGV4aCA8IGhvcml6b250YWxTbGlkZXMubGVuZ3RoIC0gMSwKCQkJdXA6IGluZGV4diA+IDAsCgkJCWRvd246IGluZGV4diA8IHZlcnRpY2FsU2xpZGVzLmxlbmd0aCAtIDEKCQl9OwoKCQkvLyBMb29wZWQgcHJlc2VudGF0aW9ucyBjYW4gYWx3YXlzIGJlIG5hdmlnYXRlZCBhcyBsb25nIGFzCgkJLy8gdGhlcmUgYXJlIHNsaWRlcyBhdmFpbGFibGUKCQlpZiggY29uZmlnLmxvb3AgKSB7CgkJCWlmKCBob3Jpem9udGFsU2xpZGVzLmxlbmd0aCA+IDEgKSB7CgkJCQlyb3V0ZXMubGVmdCA9IHRydWU7CgkJCQlyb3V0ZXMucmlnaHQgPSB0cnVlOwoJCQl9CgoJCQlpZiggdmVydGljYWxTbGlkZXMubGVuZ3RoID4gMSApIHsKCQkJCXJvdXRlcy51cCA9IHRydWU7CgkJCQlyb3V0ZXMuZG93biA9IHRydWU7CgkJCX0KCQl9CgoJCS8vIFJldmVyc2UgaG9yaXpvbnRhbCBjb250cm9scyBmb3IgcnRsCgkJaWYoIGNvbmZpZy5ydGwgKSB7CgkJCXZhciBsZWZ0ID0gcm91dGVzLmxlZnQ7CgkJCXJvdXRlcy5sZWZ0ID0gcm91dGVzLnJpZ2h0OwoJCQlyb3V0ZXMucmlnaHQgPSBsZWZ0OwoJCX0KCgkJcmV0dXJuIHJvdXRlczsKCgl9CgoJLyoqCgkgKiBSZXR1cm5zIGFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBhdmFpbGFibGUgZnJhZ21lbnQKCSAqIGRpcmVjdGlvbnMuCgkgKgoJICogQHJldHVybiB7e3ByZXY6IGJvb2xlYW4sIG5leHQ6IGJvb2xlYW59fQoJICovCglmdW5jdGlvbiBhdmFpbGFibGVGcmFnbWVudHMoKSB7CgoJCWlmKCBjdXJyZW50U2xpZGUgJiYgY29uZmlnLmZyYWdtZW50cyApIHsKCQkJdmFyIGZyYWdtZW50cyA9IGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApOwoJCQl2YXIgaGlkZGVuRnJhZ21lbnRzID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQ6bm90KC52aXNpYmxlKScgKTsKCgkJCXJldHVybiB7CgkJCQlwcmV2OiBmcmFnbWVudHMubGVuZ3RoIC0gaGlkZGVuRnJhZ21lbnRzLmxlbmd0aCA+IDAsCgkJCQluZXh0OiAhIWhpZGRlbkZyYWdtZW50cy5sZW5ndGgKCQkJfTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiB7IHByZXY6IGZhbHNlLCBuZXh0OiBmYWxzZSB9OwoJCX0KCgl9CgoJLyoqCgkgKiBFbmZvcmNlcyBvcmlnaW4tc3BlY2lmaWMgZm9ybWF0IHJ1bGVzIGZvciBlbWJlZGRlZCBtZWRpYS4KCSAqLwoJZnVuY3Rpb24gZm9ybWF0RW1iZWRkZWRDb250ZW50KCkgewoKCQl2YXIgX2FwcGVuZFBhcmFtVG9JZnJhbWVTb3VyY2UgPSBmdW5jdGlvbiggc291cmNlQXR0cmlidXRlLCBzb3VyY2VVUkwsIHBhcmFtICkgewoJCQl0b0FycmF5KCBkb20uc2xpZGVzLnF1ZXJ5U2VsZWN0b3JBbGwoICdpZnJhbWVbJysgc291cmNlQXR0cmlidXRlICsnKj0iJysgc291cmNlVVJMICsnIl0nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7CgkJCQl2YXIgc3JjID0gZWwuZ2V0QXR0cmlidXRlKCBzb3VyY2VBdHRyaWJ1dGUgKTsKCQkJCWlmKCBzcmMgJiYgc3JjLmluZGV4T2YoIHBhcmFtICkgPT09IC0xICkgewoJCQkJCWVsLnNldEF0dHJpYnV0ZSggc291cmNlQXR0cmlidXRlLCBzcmMgKyAoICEvXD8vLnRlc3QoIHNyYyApID8gJz8nIDogJyYnICkgKyBwYXJhbSApOwoJCQkJfQoJCQl9KTsKCQl9OwoKCQkvLyBZb3VUdWJlIGZyYW1lcyBtdXN0IGluY2x1ZGUgIj9lbmFibGVqc2FwaT0xIgoJCV9hcHBlbmRQYXJhbVRvSWZyYW1lU291cmNlKCAnc3JjJywgJ3lvdXR1YmUuY29tL2VtYmVkLycsICdlbmFibGVqc2FwaT0xJyApOwoJCV9hcHBlbmRQYXJhbVRvSWZyYW1lU291cmNlKCAnZGF0YS1zcmMnLCAneW91dHViZS5jb20vZW1iZWQvJywgJ2VuYWJsZWpzYXBpPTEnICk7CgoJCS8vIFZpbWVvIGZyYW1lcyBtdXN0IGluY2x1ZGUgIj9hcGk9MSIKCQlfYXBwZW5kUGFyYW1Ub0lmcmFtZVNvdXJjZSggJ3NyYycsICdwbGF5ZXIudmltZW8uY29tLycsICdhcGk9MScgKTsKCQlfYXBwZW5kUGFyYW1Ub0lmcmFtZVNvdXJjZSggJ2RhdGEtc3JjJywgJ3BsYXllci52aW1lby5jb20vJywgJ2FwaT0xJyApOwoKCX0KCgkvKioKCSAqIFN0YXJ0IHBsYXliYWNrIG9mIGFueSBlbWJlZGRlZCBjb250ZW50IGluc2lkZSBvZgoJICogdGhlIGdpdmVuIGVsZW1lbnQuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudAoJICovCglmdW5jdGlvbiBzdGFydEVtYmVkZGVkQ29udGVudCggZWxlbWVudCApIHsKCgkJaWYoIGVsZW1lbnQgJiYgIWlzU3BlYWtlck5vdGVzKCkgKSB7CgoJCQkvLyBSZXN0YXJ0IEdJRnMKCQkJdG9BcnJheSggZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnaW1nW3NyYyQ9Ii5naWYiXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCS8vIFNldHRpbmcgdGhlIHNhbWUgdW5jaGFuZ2VkIHNvdXJjZSBsaWtlIHRoaXMgd2FzIGNvbmZpcm1lZAoJCQkJLy8gdG8gd29yayBpbiBDaHJvbWUsIEZGICYgU2FmYXJpCgkJCQllbC5zZXRBdHRyaWJ1dGUoICdzcmMnLCBlbC5nZXRBdHRyaWJ1dGUoICdzcmMnICkgKTsKCQkJfSApOwoKCQkJLy8gSFRNTDUgbWVkaWEgZWxlbWVudHMKCQkJdG9BcnJheSggZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAndmlkZW8sIGF1ZGlvJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgewoJCQkJaWYoIGNsb3Nlc3RQYXJlbnQoIGVsLCAnLmZyYWdtZW50JyApICYmICFjbG9zZXN0UGFyZW50KCBlbCwgJy5mcmFnbWVudC52aXNpYmxlJyApICkgewoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQkvLyBQcmVmZXIgYW4gZXhwbGljaXQgZ2xvYmFsIGF1dG9wbGF5IHNldHRpbmcKCQkJCXZhciBhdXRvcGxheSA9IGNvbmZpZy5hdXRvUGxheU1lZGlhOwoKCQkJCS8vIElmIG5vIGdsb2JhbCBzZXR0aW5nIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIG9uIHRoZSBlbGVtZW50J3MKCQkJCS8vIG93biBhdXRvcGxheSBzZXR0aW5nCgkJCQlpZiggdHlwZW9mIGF1dG9wbGF5ICE9PSAnYm9vbGVhbicgKSB7CgkJCQkJYXV0b3BsYXkgPSBlbC5oYXNBdHRyaWJ1dGUoICdkYXRhLWF1dG9wbGF5JyApIHx8ICEhY2xvc2VzdFBhcmVudCggZWwsICcuc2xpZGUtYmFja2dyb3VuZCcgKTsKCQkJCX0KCgkJCQlpZiggYXV0b3BsYXkgJiYgdHlwZW9mIGVsLnBsYXkgPT09ICdmdW5jdGlvbicgKSB7CgoJCQkJCS8vIElmIHRoZSBtZWRpYSBpcyByZWFkeSwgc3RhcnQgcGxheWJhY2sKCQkJCQlpZiggZWwucmVhZHlTdGF0ZSA+IDEgKSB7CgkJCQkJCXN0YXJ0RW1iZWRkZWRNZWRpYSggeyB0YXJnZXQ6IGVsIH0gKTsKCQkJCQl9CgkJCQkJLy8gTW9iaWxlIGRldmljZXMgbmV2ZXIgZmlyZSBhIGxvYWRlZCBldmVudCBzbyBpbnN0ZWFkCgkJCQkJLy8gb2Ygd2FpdGluZywgd2UgaW5pdGlhdGUgcGxheWJhY2sKCQkJCQllbHNlIGlmKCBpc01vYmlsZURldmljZSApIHsKCQkJCQkJdmFyIHByb21pc2UgPSBlbC5wbGF5KCk7CgoJCQkJCQkvLyBJZiBhdXRvcGxheSBkb2VzIG5vdCB3b3JrLCBlbnN1cmUgdGhhdCB0aGUgY29udHJvbHMgYXJlIHZpc2libGUgc28KCQkJCQkJLy8gdGhhdCB0aGUgdmlld2VyIGNhbiBzdGFydCB0aGUgbWVkaWEgb24gdGhlaXIgb3duCgkJCQkJCWlmKCBwcm9taXNlICYmIHR5cGVvZiBwcm9taXNlLmNhdGNoID09PSAnZnVuY3Rpb24nICYmIGVsLmNvbnRyb2xzID09PSBmYWxzZSApIHsKCQkJCQkJCXByb21pc2UuY2F0Y2goIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWVsLmNvbnRyb2xzID0gdHJ1ZTsKCgkJCQkJCQkJLy8gT25jZSB0aGUgdmlkZW8gZG9lcyBzdGFydCBwbGF5aW5nLCBoaWRlIHRoZSBjb250cm9scyBhZ2FpbgoJCQkJCQkJCWVsLmFkZEV2ZW50TGlzdGVuZXIoICdwbGF5JywgZnVuY3Rpb24oKSB7CgkJCQkJCQkJCWVsLmNvbnRyb2xzID0gZmFsc2U7CgkJCQkJCQkJfSApOwoJCQkJCQkJfSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCS8vIElmIHRoZSBtZWRpYSBpc24ndCBsb2FkZWQsIHdhaXQgYmVmb3JlIHBsYXlpbmcKCQkJCQllbHNlIHsKCQkJCQkJZWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWRlZGRhdGEnLCBzdGFydEVtYmVkZGVkTWVkaWEgKTsgLy8gcmVtb3ZlIGZpcnN0IHRvIGF2b2lkIGR1cGVzCgkJCQkJCWVsLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkZWRkYXRhJywgc3RhcnRFbWJlZGRlZE1lZGlhICk7CgkJCQkJfQoKCQkJCX0KCQkJfSApOwoKCQkJLy8gTm9ybWFsIGlmcmFtZXMKCQkJdG9BcnJheSggZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnaWZyYW1lW3NyY10nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7CgkJCQlpZiggY2xvc2VzdFBhcmVudCggZWwsICcuZnJhZ21lbnQnICkgJiYgIWNsb3Nlc3RQYXJlbnQoIGVsLCAnLmZyYWdtZW50LnZpc2libGUnICkgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCXN0YXJ0RW1iZWRkZWRJZnJhbWUoIHsgdGFyZ2V0OiBlbCB9ICk7CgkJCX0gKTsKCgkJCS8vIExhenkgbG9hZGluZyBpZnJhbWVzCgkJCXRvQXJyYXkoIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2lmcmFtZVtkYXRhLXNyY10nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7CgkJCQlpZiggY2xvc2VzdFBhcmVudCggZWwsICcuZnJhZ21lbnQnICkgJiYgIWNsb3Nlc3RQYXJlbnQoIGVsLCAnLmZyYWdtZW50LnZpc2libGUnICkgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCWlmKCBlbC5nZXRBdHRyaWJ1dGUoICdzcmMnICkgIT09IGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtc3JjJyApICkgewoJCQkJCWVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgc3RhcnRFbWJlZGRlZElmcmFtZSApOyAvLyByZW1vdmUgZmlyc3QgdG8gYXZvaWQgZHVwZXMKCQkJCQllbC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIHN0YXJ0RW1iZWRkZWRJZnJhbWUgKTsKCQkJCQllbC5zZXRBdHRyaWJ1dGUoICdzcmMnLCBlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNyYycgKSApOwoJCQkJfQoJCQl9ICk7CgoJCX0KCgl9CgoJLyoqCgkgKiBTdGFydHMgcGxheWluZyBhbiBlbWJlZGRlZCB2aWRlby9hdWRpbyBlbGVtZW50IGFmdGVyCgkgKiBpdCBoYXMgZmluaXNoZWQgbG9hZGluZy4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gc3RhcnRFbWJlZGRlZE1lZGlhKCBldmVudCApIHsKCgkJdmFyIGlzQXR0YWNoZWRUb0RPTSA9ICEhY2xvc2VzdFBhcmVudCggZXZlbnQudGFyZ2V0LCAnaHRtbCcgKSwKCQkJaXNWaXNpYmxlICAJCT0gISFjbG9zZXN0UGFyZW50KCBldmVudC50YXJnZXQsICcucHJlc2VudCcgKTsKCgkJaWYoIGlzQXR0YWNoZWRUb0RPTSAmJiBpc1Zpc2libGUgKSB7CgkJCWV2ZW50LnRhcmdldC5jdXJyZW50VGltZSA9IDA7CgkJCWV2ZW50LnRhcmdldC5wbGF5KCk7CgkJfQoKCQlldmVudC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWRlZGRhdGEnLCBzdGFydEVtYmVkZGVkTWVkaWEgKTsKCgl9CgoJLyoqCgkgKiAiU3RhcnRzIiB0aGUgY29udGVudCBvZiBhbiBlbWJlZGRlZCBpZnJhbWUgdXNpbmcgdGhlCgkgKiBwb3N0TWVzc2FnZSBBUEkuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIHN0YXJ0RW1iZWRkZWRJZnJhbWUoIGV2ZW50ICkgewoKCQl2YXIgaWZyYW1lID0gZXZlbnQudGFyZ2V0OwoKCQlpZiggaWZyYW1lICYmIGlmcmFtZS5jb250ZW50V2luZG93ICkgewoKCQkJdmFyIGlzQXR0YWNoZWRUb0RPTSA9ICEhY2xvc2VzdFBhcmVudCggZXZlbnQudGFyZ2V0LCAnaHRtbCcgKSwKCQkJCWlzVmlzaWJsZSAgCQk9ICEhY2xvc2VzdFBhcmVudCggZXZlbnQudGFyZ2V0LCAnLnByZXNlbnQnICk7CgoJCQlpZiggaXNBdHRhY2hlZFRvRE9NICYmIGlzVmlzaWJsZSApIHsKCgkJCQkvLyBQcmVmZXIgYW4gZXhwbGljaXQgZ2xvYmFsIGF1dG9wbGF5IHNldHRpbmcKCQkJCXZhciBhdXRvcGxheSA9IGNvbmZpZy5hdXRvUGxheU1lZGlhOwoKCQkJCS8vIElmIG5vIGdsb2JhbCBzZXR0aW5nIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIG9uIHRoZSBlbGVtZW50J3MKCQkJCS8vIG93biBhdXRvcGxheSBzZXR0aW5nCgkJCQlpZiggdHlwZW9mIGF1dG9wbGF5ICE9PSAnYm9vbGVhbicgKSB7CgkJCQkJYXV0b3BsYXkgPSBpZnJhbWUuaGFzQXR0cmlidXRlKCAnZGF0YS1hdXRvcGxheScgKSB8fCAhIWNsb3Nlc3RQYXJlbnQoIGlmcmFtZSwgJy5zbGlkZS1iYWNrZ3JvdW5kJyApOwoJCQkJfQoKCQkJCS8vIFlvdVR1YmUgcG9zdE1lc3NhZ2UgQVBJCgkJCQlpZiggL3lvdXR1YmVcLmNvbVwvZW1iZWRcLy8udGVzdCggaWZyYW1lLmdldEF0dHJpYnV0ZSggJ3NyYycgKSApICYmIGF1dG9wbGF5ICkgewoJCQkJCWlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCAneyJldmVudCI6ImNvbW1hbmQiLCJmdW5jIjoicGxheVZpZGVvIiwiYXJncyI6IiJ9JywgJyonICk7CgkJCQl9CgkJCQkvLyBWaW1lbyBwb3N0TWVzc2FnZSBBUEkKCQkJCWVsc2UgaWYoIC9wbGF5ZXJcLnZpbWVvXC5jb21cLy8udGVzdCggaWZyYW1lLmdldEF0dHJpYnV0ZSggJ3NyYycgKSApICYmIGF1dG9wbGF5ICkgewoJCQkJCWlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCAneyJtZXRob2QiOiJwbGF5In0nLCAnKicgKTsKCQkJCX0KCQkJCS8vIEdlbmVyaWMgcG9zdE1lc3NhZ2UgQVBJCgkJCQllbHNlIHsKCQkJCQlpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSggJ3NsaWRlOnN0YXJ0JywgJyonICk7CgkJCQl9CgoJCQl9CgoJCX0KCgl9CgoJLyoqCgkgKiBTdG9wIHBsYXliYWNrIG9mIGFueSBlbWJlZGRlZCBjb250ZW50IGluc2lkZSBvZgoJICogdGhlIHRhcmdldGVkIHNsaWRlLgoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQKCSAqLwoJZnVuY3Rpb24gc3RvcEVtYmVkZGVkQ29udGVudCggZWxlbWVudCwgb3B0aW9ucyApIHsKCgkJb3B0aW9ucyA9IGV4dGVuZCggewoJCQkvLyBEZWZhdWx0cwoJCQl1bmxvYWRJZnJhbWVzOiB0cnVlCgkJfSwgb3B0aW9ucyB8fCB7fSApOwoKCQlpZiggZWxlbWVudCAmJiBlbGVtZW50LnBhcmVudE5vZGUgKSB7CgkJCS8vIEhUTUw1IG1lZGlhIGVsZW1lbnRzCgkJCXRvQXJyYXkoIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ3ZpZGVvLCBhdWRpbycgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCWlmKCAhZWwuaGFzQXR0cmlidXRlKCAnZGF0YS1pZ25vcmUnICkgJiYgdHlwZW9mIGVsLnBhdXNlID09PSAnZnVuY3Rpb24nICkgewoJCQkJCWVsLnNldEF0dHJpYnV0ZSgnZGF0YS1wYXVzZWQtYnktcmV2ZWFsJywgJycpOwoJCQkJCWVsLnBhdXNlKCk7CgkJCQl9CgkJCX0gKTsKCgkJCS8vIEdlbmVyaWMgcG9zdE1lc3NhZ2UgQVBJIGZvciBub24tbGF6eSBsb2FkZWQgaWZyYW1lcwoJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdpZnJhbWUnICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7CgkJCQlpZiggZWwuY29udGVudFdpbmRvdyApIGVsLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoICdzbGlkZTpzdG9wJywgJyonICk7CgkJCQllbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHN0YXJ0RW1iZWRkZWRJZnJhbWUgKTsKCQkJfSk7CgoJCQkvLyBZb3VUdWJlIHBvc3RNZXNzYWdlIEFQSQoJCQl0b0FycmF5KCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdpZnJhbWVbc3JjKj0ieW91dHViZS5jb20vZW1iZWQvIl0nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7CgkJCQlpZiggIWVsLmhhc0F0dHJpYnV0ZSggJ2RhdGEtaWdub3JlJyApICYmIGVsLmNvbnRlbnRXaW5kb3cgJiYgdHlwZW9mIGVsLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJZWwuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSggJ3siZXZlbnQiOiJjb21tYW5kIiwiZnVuYyI6InBhdXNlVmlkZW8iLCJhcmdzIjoiIn0nLCAnKicgKTsKCQkJCX0KCQkJfSk7CgoJCQkvLyBWaW1lbyBwb3N0TWVzc2FnZSBBUEkKCQkJdG9BcnJheSggZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnaWZyYW1lW3NyYyo9InBsYXllci52aW1lby5jb20vIl0nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7CgkJCQlpZiggIWVsLmhhc0F0dHJpYnV0ZSggJ2RhdGEtaWdub3JlJyApICYmIGVsLmNvbnRlbnRXaW5kb3cgJiYgdHlwZW9mIGVsLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJZWwuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSggJ3sibWV0aG9kIjoicGF1c2UifScsICcqJyApOwoJCQkJfQoJCQl9KTsKCgkJCWlmKCBvcHRpb25zLnVubG9hZElmcmFtZXMgPT09IHRydWUgKSB7CgkJCQkvLyBVbmxvYWQgbGF6eS1sb2FkZWQgaWZyYW1lcwoJCQkJdG9BcnJheSggZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnaWZyYW1lW2RhdGEtc3JjXScgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCQkvLyBPbmx5IHJlbW92aW5nIHRoZSBzcmMgZG9lc24ndCBhY3R1YWxseSB1bmxvYWQgdGhlIGZyYW1lCgkJCQkJLy8gaW4gYWxsIGJyb3dzZXJzIChGaXJlZm94KSBzbyB3ZSBzZXQgaXQgdG8gYmxhbmsgZmlyc3QKCQkJCQllbC5zZXRBdHRyaWJ1dGUoICdzcmMnLCAnYWJvdXQ6YmxhbmsnICk7CgkJCQkJZWwucmVtb3ZlQXR0cmlidXRlKCAnc3JjJyApOwoJCQkJfSApOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXN0IHNsaWRlcy4gVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGdsb2JhbAoJICogZmxhdHRlbmVkIGluZGV4IGZvciBzbGlkZXMuCgkgKgoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3NsaWRlPWN1cnJlbnRTbGlkZV0gVGhlIHNsaWRlIHdlJ3JlIGNvdW50aW5nIGJlZm9yZQoJICoKCSAqIEByZXR1cm4ge251bWJlcn0gUGFzdCBzbGlkZSBjb3VudAoJICovCglmdW5jdGlvbiBnZXRTbGlkZVBhc3RDb3VudCggc2xpZGUgKSB7CgoJCWlmKCBzbGlkZSA9PT0gdW5kZWZpbmVkICkgewoJCQlzbGlkZSA9IGN1cnJlbnRTbGlkZTsKCQl9CgoJCXZhciBob3Jpem9udGFsU2xpZGVzID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApOwoKCQkvLyBUaGUgbnVtYmVyIG9mIHBhc3Qgc2xpZGVzCgkJdmFyIHBhc3RDb3VudCA9IDA7CgoJCS8vIFN0ZXAgdGhyb3VnaCBhbGwgc2xpZGVzIGFuZCBjb3VudCB0aGUgcGFzdCBvbmVzCgkJbWFpbkxvb3A6IGZvciggdmFyIGkgPSAwOyBpIDwgaG9yaXpvbnRhbFNsaWRlcy5sZW5ndGg7IGkrKyApIHsKCgkJCXZhciBob3Jpem9udGFsU2xpZGUgPSBob3Jpem9udGFsU2xpZGVzW2ldOwoJCQl2YXIgdmVydGljYWxTbGlkZXMgPSB0b0FycmF5KCBob3Jpem9udGFsU2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ3NlY3Rpb24nICkgKTsKCgkJCWZvciggdmFyIGogPSAwOyBqIDwgdmVydGljYWxTbGlkZXMubGVuZ3RoOyBqKysgKSB7CgoJCQkJLy8gU3RvcCBhcyBzb29uIGFzIHdlIGFycml2ZSBhdCB0aGUgcHJlc2VudAoJCQkJaWYoIHZlcnRpY2FsU2xpZGVzW2pdID09PSBzbGlkZSApIHsKCQkJCQlicmVhayBtYWluTG9vcDsKCQkJCX0KCgkJCQlwYXN0Q291bnQrKzsKCgkJCX0KCgkJCS8vIFN0b3AgYXMgc29vbiBhcyB3ZSBhcnJpdmUgYXQgdGhlIHByZXNlbnQKCQkJaWYoIGhvcml6b250YWxTbGlkZSA9PT0gc2xpZGUgKSB7CgkJCQlicmVhazsKCQkJfQoKCQkJLy8gRG9uJ3QgY291bnQgdGhlIHdyYXBwaW5nIHNlY3Rpb24gZm9yIHZlcnRpY2FsIHNsaWRlcwoJCQlpZiggaG9yaXpvbnRhbFNsaWRlLmNsYXNzTGlzdC5jb250YWlucyggJ3N0YWNrJyApID09PSBmYWxzZSApIHsKCQkJCXBhc3RDb3VudCsrOwoJCQl9CgoJCX0KCgkJcmV0dXJuIHBhc3RDb3VudDsKCgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgdmFsdWUgcmFuZ2luZyBmcm9tIDAtMSB0aGF0IHJlcHJlc2VudHMKCSAqIGhvdyBmYXIgaW50byB0aGUgcHJlc2VudGF0aW9uIHdlIGhhdmUgbmF2aWdhdGVkLgoJICoKCSAqIEByZXR1cm4ge251bWJlcn0KCSAqLwoJZnVuY3Rpb24gZ2V0UHJvZ3Jlc3MoKSB7CgoJCS8vIFRoZSBudW1iZXIgb2YgcGFzdCBhbmQgdG90YWwgc2xpZGVzCgkJdmFyIHRvdGFsQ291bnQgPSBnZXRUb3RhbFNsaWRlcygpOwoJCXZhciBwYXN0Q291bnQgPSBnZXRTbGlkZVBhc3RDb3VudCgpOwoKCQlpZiggY3VycmVudFNsaWRlICkgewoKCQkJdmFyIGFsbEZyYWdtZW50cyA9IGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50JyApOwoKCQkJLy8gSWYgdGhlcmUgYXJlIGZyYWdtZW50cyBpbiB0aGUgY3VycmVudCBzbGlkZSB0aG9zZSBzaG91bGQgYmUKCQkJLy8gYWNjb3VudGVkIGZvciBpbiB0aGUgcHJvZ3Jlc3MuCgkJCWlmKCBhbGxGcmFnbWVudHMubGVuZ3RoID4gMCApIHsKCQkJCXZhciB2aXNpYmxlRnJhZ21lbnRzID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQudmlzaWJsZScgKTsKCgkJCQkvLyBUaGlzIHZhbHVlIHJlcHJlc2VudHMgaG93IGJpZyBhIHBvcnRpb24gb2YgdGhlIHNsaWRlIHByb2dyZXNzCgkJCQkvLyB0aGF0IGlzIG1hZGUgdXAgYnkgaXRzIGZyYWdtZW50cyAoMC0xKQoJCQkJdmFyIGZyYWdtZW50V2VpZ2h0ID0gMC45OwoKCQkJCS8vIEFkZCBmcmFnbWVudCBwcm9ncmVzcyB0byB0aGUgcGFzdCBzbGlkZSBjb3VudAoJCQkJcGFzdENvdW50ICs9ICggdmlzaWJsZUZyYWdtZW50cy5sZW5ndGggLyBhbGxGcmFnbWVudHMubGVuZ3RoICkgKiBmcmFnbWVudFdlaWdodDsKCQkJfQoKCQl9CgoJCXJldHVybiBNYXRoLm1pbiggcGFzdENvdW50IC8gKCB0b3RhbENvdW50IC0gMSApLCAxICk7CgoJfQoKCS8qKgoJICogQ2hlY2tzIGlmIHRoaXMgcHJlc2VudGF0aW9uIGlzIHJ1bm5pbmcgaW5zaWRlIG9mIHRoZQoJICogc3BlYWtlciBub3RlcyB3aW5kb3cuCgkgKgoJICogQHJldHVybiB7Ym9vbGVhbn0KCSAqLwoJZnVuY3Rpb24gaXNTcGVha2VyTm90ZXMoKSB7CgoJCXJldHVybiAhIXdpbmRvdy5sb2NhdGlvbi5zZWFyY2gubWF0Y2goIC9yZWNlaXZlci9naSApOwoKCX0KCgkvKioKCSAqIFJlYWRzIHRoZSBjdXJyZW50IFVSTCAoaGFzaCkgYW5kIG5hdmlnYXRlcyBhY2NvcmRpbmdseS4KCSAqLwoJZnVuY3Rpb24gcmVhZFVSTCgpIHsKCgkJdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDsKCgkJLy8gQXR0ZW1wdCB0byBwYXJzZSB0aGUgaGFzaCBhcyBlaXRoZXIgYW4gaW5kZXggb3IgbmFtZQoJCXZhciBiaXRzID0gaGFzaC5zbGljZSggMiApLnNwbGl0KCAnLycgKSwKCQkJbmFtZSA9IGhhc2gucmVwbGFjZSggLyN8XC8vZ2ksICcnICk7CgoJCS8vIElmIHRoZSBmaXJzdCBiaXQgaXMgbm90IGZ1bGx5IG51bWVyaWMgYW5kIHRoZXJlIGlzIGEgbmFtZSB3ZQoJCS8vIGNhbiBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgbmFtZWQgbGluawoJCWlmKCAhL15bMC05XSokLy50ZXN0KCBiaXRzWzBdICkgJiYgbmFtZS5sZW5ndGggKSB7CgkJCXZhciBlbGVtZW50OwoKCQkJLy8gRW5zdXJlIHRoZSBuYW1lZCBsaW5rIGlzIGEgdmFsaWQgSFRNTCBJRCBhdHRyaWJ1dGUKCQkJdHJ5IHsKCQkJCWVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggZGVjb2RlVVJJQ29tcG9uZW50KCBuYW1lICkgKTsKCQkJfQoJCQljYXRjaCAoIGVycm9yICkgeyB9CgoJCQkvLyBFbnN1cmUgdGhhdCB3ZSdyZSBub3QgYWxyZWFkeSBvbiBhIHNsaWRlIHdpdGggdGhlIHNhbWUgbmFtZQoJCQl2YXIgaXNTYW1lTmFtZUFzQ3VycmVudFNsaWRlID0gY3VycmVudFNsaWRlID8gY3VycmVudFNsaWRlLmdldEF0dHJpYnV0ZSggJ2lkJyApID09PSBuYW1lIDogZmFsc2U7CgoJCQlpZiggZWxlbWVudCApIHsKCQkJCS8vIElmIHRoZSBzbGlkZSBleGlzdHMgYW5kIGlzIG5vdCB0aGUgY3VycmVudCBzbGlkZS4uLgoJCQkJaWYgKCAhaXNTYW1lTmFtZUFzQ3VycmVudFNsaWRlICkgewoJCQkJCS8vIC4uLmZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBuYW1lZCBzbGlkZSBhbmQgbmF2aWdhdGUgdG8gaXQKCQkJCQl2YXIgaW5kaWNlcyA9IFJldmVhbC5nZXRJbmRpY2VzKGVsZW1lbnQpOwoJCQkJCXNsaWRlKGluZGljZXMuaCwgaW5kaWNlcy52KTsKCQkJCX0KCQkJfQoJCQkvLyBJZiB0aGUgc2xpZGUgZG9lc24ndCBleGlzdCwgbmF2aWdhdGUgdG8gdGhlIGN1cnJlbnQgc2xpZGUKCQkJZWxzZSB7CgkJCQlzbGlkZSggaW5kZXhoIHx8IDAsIGluZGV4diB8fCAwICk7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCXZhciBoYXNoSW5kZXhCYXNlID0gY29uZmlnLmhhc2hPbmVCYXNlZEluZGV4ID8gMSA6IDA7CgoJCQkvLyBSZWFkIHRoZSBpbmRleCBjb21wb25lbnRzIG9mIHRoZSBoYXNoCgkJCXZhciBoID0gKCBwYXJzZUludCggYml0c1swXSwgMTAgKSAtIGhhc2hJbmRleEJhc2UgKSB8fCAwLAoJCQkJdiA9ICggcGFyc2VJbnQoIGJpdHNbMV0sIDEwICkgLSBoYXNoSW5kZXhCYXNlICkgfHwgMCwKCQkJCWY7CgoJCQlpZiggY29uZmlnLmZyYWdtZW50SW5VUkwgKSB7CgkJCQlmID0gcGFyc2VJbnQoIGJpdHNbMl0sIDEwICk7CgkJCQlpZiggaXNOYU4oIGYgKSApIHsKCQkJCQlmID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgoJCQlpZiggaCAhPT0gaW5kZXhoIHx8IHYgIT09IGluZGV4diB8fCBmICE9PSB1bmRlZmluZWQgKSB7CgkJCQlzbGlkZSggaCwgdiwgZiApOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIFVwZGF0ZXMgdGhlIHBhZ2UgVVJMIChoYXNoKSB0byByZWZsZWN0IHRoZSBjdXJyZW50CgkgKiBzdGF0ZS4KCSAqCgkgKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgVGhlIHRpbWUgaW4gbXMgdG8gd2FpdCBiZWZvcmUKCSAqIHdyaXRpbmcgdGhlIGhhc2gKCSAqLwoJZnVuY3Rpb24gd3JpdGVVUkwoIGRlbGF5ICkgewoKCQkvLyBNYWtlIHN1cmUgdGhlcmUncyBuZXZlciBtb3JlIHRoYW4gb25lIHRpbWVvdXQgcnVubmluZwoJCWNsZWFyVGltZW91dCggd3JpdGVVUkxUaW1lb3V0ICk7CgoJCS8vIElmIGEgZGVsYXkgaXMgc3BlY2lmaWVkLCB0aW1lb3V0IHRoaXMgY2FsbAoJCWlmKCB0eXBlb2YgZGVsYXkgPT09ICdudW1iZXInICkgewoJCQl3cml0ZVVSTFRpbWVvdXQgPSBzZXRUaW1lb3V0KCB3cml0ZVVSTCwgZGVsYXkgKTsKCQl9CgkJZWxzZSBpZiggY3VycmVudFNsaWRlICkgewoJCQkvLyBJZiB3ZSdyZSBjb25maWd1cmVkIHRvIHB1c2ggdG8gaGlzdG9yeSBPUiB0aGUgaGlzdG9yeQoJCQkvLyBBUEkgaXMgbm90IGF2YWlhbGJsZS4KCQkJaWYoIGNvbmZpZy5oaXN0b3J5IHx8ICF3aW5kb3cuaGlzdG9yeSApIHsKCQkJCXdpbmRvdy5sb2NhdGlvbi5oYXNoID0gbG9jYXRpb25IYXNoKCk7CgkJCX0KCQkJLy8gSWYgd2UncmUgY29uZmlndXJlZCB0byByZWZsZWN0IHRoZSBjdXJyZW50IHNsaWRlIGluIHRoZQoJCQkvLyBVUkwgd2l0aG91dCBwdXNoaW5nIHRvIGhpc3RvcnkuCgkJCWVsc2UgaWYoIGNvbmZpZy5oYXNoICkgewoJCQkJd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCBudWxsLCBudWxsLCAnIycgKyBsb2NhdGlvbkhhc2goKSApOwoJCQl9CgkJCS8vIElmIGhpc3RvcnkgYW5kIGhhc2ggYXJlIGJvdGggZGlzYWJsZWQsIGEgaGFzaCBtYXkgc3RpbGwKCQkJLy8gYmUgYWRkZWQgdG8gdGhlIFVSTCBieSBjbGlja2luZyBvbiBhIGhyZWYgd2l0aCBhIGhhc2gKCQkJLy8gdGFyZ2V0LiBDb3VudGVyIHRoaXMgYnkgYWx3YXlzIHJlbW92aW5nIHRoZSBoYXNoLgoJCQllbHNlIHsKCQkJCXdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSggbnVsbCwgbnVsbCwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCApOwoJCQl9CgkJfQoKCX0KCS8qKgoJICogUmV0cmlldmVzIHRoZSBoL3YgbG9jYXRpb24gYW5kIGZyYWdtZW50IG9mIHRoZSBjdXJyZW50LAoJICogb3Igc3BlY2lmaWVkLCBzbGlkZS4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbc2xpZGVdIElmIHNwZWNpZmllZCwgdGhlIHJldHVybmVkCgkgKiBpbmRleCB3aWxsIGJlIGZvciB0aGlzIHNsaWRlIHJhdGhlciB0aGFuIHRoZSBjdXJyZW50bHkKCSAqIGFjdGl2ZSBvbmUKCSAqCgkgKiBAcmV0dXJuIHt7aDogbnVtYmVyLCB2OiBudW1iZXIsIGY6IG51bWJlcn19CgkgKi8KCWZ1bmN0aW9uIGdldEluZGljZXMoIHNsaWRlICkgewoKCQkvLyBCeSBkZWZhdWx0LCByZXR1cm4gdGhlIGN1cnJlbnQgaW5kaWNlcwoJCXZhciBoID0gaW5kZXhoLAoJCQl2ID0gaW5kZXh2LAoJCQlmOwoKCQkvLyBJZiBhIHNsaWRlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBpbmRpY2VzIG9mIHRoYXQgc2xpZGUKCQlpZiggc2xpZGUgKSB7CgkJCXZhciBpc1ZlcnRpY2FsID0gaXNWZXJ0aWNhbFNsaWRlKCBzbGlkZSApOwoJCQl2YXIgc2xpZGVoID0gaXNWZXJ0aWNhbCA/IHNsaWRlLnBhcmVudE5vZGUgOiBzbGlkZTsKCgkJCS8vIFNlbGVjdCBhbGwgaG9yaXpvbnRhbCBzbGlkZXMKCQkJdmFyIGhvcml6b250YWxTbGlkZXMgPSB0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApICk7CgoJCQkvLyBOb3cgdGhhdCB3ZSBrbm93IHdoaWNoIHRoZSBob3Jpem9udGFsIHNsaWRlIGlzLCBnZXQgaXRzIGluZGV4CgkJCWggPSBNYXRoLm1heCggaG9yaXpvbnRhbFNsaWRlcy5pbmRleE9mKCBzbGlkZWggKSwgMCApOwoKCQkJLy8gQXNzdW1lIHdlJ3JlIG5vdCB2ZXJ0aWNhbAoJCQl2ID0gdW5kZWZpbmVkOwoKCQkJLy8gSWYgdGhpcyBpcyBhIHZlcnRpY2FsIHNsaWRlLCBncmFiIHRoZSB2ZXJ0aWNhbCBpbmRleAoJCQlpZiggaXNWZXJ0aWNhbCApIHsKCQkJCXYgPSBNYXRoLm1heCggdG9BcnJheSggc2xpZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbicgKSApLmluZGV4T2YoIHNsaWRlICksIDAgKTsKCQkJfQoJCX0KCgkJaWYoICFzbGlkZSAmJiBjdXJyZW50U2xpZGUgKSB7CgkJCXZhciBoYXNGcmFnbWVudHMgPSBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudCcgKS5sZW5ndGggPiAwOwoJCQlpZiggaGFzRnJhZ21lbnRzICkgewoJCQkJdmFyIGN1cnJlbnRGcmFnbWVudCA9IGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yKCAnLmN1cnJlbnQtZnJhZ21lbnQnICk7CgkJCQlpZiggY3VycmVudEZyYWdtZW50ICYmIGN1cnJlbnRGcmFnbWVudC5oYXNBdHRyaWJ1dGUoICdkYXRhLWZyYWdtZW50LWluZGV4JyApICkgewoJCQkJCWYgPSBwYXJzZUludCggY3VycmVudEZyYWdtZW50LmdldEF0dHJpYnV0ZSggJ2RhdGEtZnJhZ21lbnQtaW5kZXgnICksIDEwICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlmID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQudmlzaWJsZScgKS5sZW5ndGggLSAxOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4geyBoOiBoLCB2OiB2LCBmOiBmIH07CgoJfQoKCS8qKgoJICogUmV0cmlldmVzIGFsbCBzbGlkZXMgaW4gdGhpcyBwcmVzZW50YXRpb24uCgkgKi8KCWZ1bmN0aW9uIGdldFNsaWRlcygpIHsKCgkJcmV0dXJuIHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIFNMSURFU19TRUxFQ1RPUiArICc6bm90KC5zdGFjayknICkgKTsKCgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgaG9yaXpvbnRhbCBzbGlkZXMgaW4gdGhlIGRlY2suIEVhY2gKCSAqIHZlcnRpY2FsIHN0YWNrIGlzIGluY2x1ZGVkIGFzIG9uZSBob3Jpem9udGFsIHNsaWRlIGluIHRoZQoJICogcmVzdWx0aW5nIGFycmF5LgoJICovCglmdW5jdGlvbiBnZXRIb3Jpem9udGFsU2xpZGVzKCkgewoKCQlyZXR1cm4gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApOwoKCX0KCgkvKioKCSAqIFJldHVybnMgYWxsIHZlcnRpY2FsIHNsaWRlcyB0aGF0IGV4aXN0IHdpdGhpbiB0aGlzIGRlY2suCgkgKi8KCWZ1bmN0aW9uIGdldFZlcnRpY2FsU2xpZGVzKCkgewoKCQlyZXR1cm4gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggJy5zbGlkZXM+c2VjdGlvbj5zZWN0aW9uJyApICk7CgoJfQoKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gaG9yaXpvbnRhbCBzbGlkZXMuCgkgKi8KCWZ1bmN0aW9uIGhhc0hvcml6b250YWxTbGlkZXMoKSB7CgoJCXJldHVybiBnZXRIb3Jpem9udGFsU2xpZGVzKCkubGVuZ3RoID4gMTsKCX0KCgkvKioKCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHZlcnRpY2FsIHNsaWRlcy4KCSAqLwoJZnVuY3Rpb24gaGFzVmVydGljYWxTbGlkZXMoKSB7CgoJCXJldHVybiBnZXRWZXJ0aWNhbFNsaWRlcygpLmxlbmd0aCA+IDE7CgoJfQoKCS8qKgoJICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIHdoZXJlIGVhY2ggb2JqZWN0IHJlcHJlc2VudHMgdGhlCgkgKiBhdHRyaWJ1dGVzIG9uIGl0cyByZXNwZWN0aXZlIHNsaWRlLgoJICovCglmdW5jdGlvbiBnZXRTbGlkZXNBdHRyaWJ1dGVzKCkgewoKCQlyZXR1cm4gZ2V0U2xpZGVzKCkubWFwKCBmdW5jdGlvbiggc2xpZGUgKSB7CgoJCQl2YXIgYXR0cmlidXRlcyA9IHt9OwoJCQlmb3IoIHZhciBpID0gMDsgaSA8IHNsaWRlLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKysgKSB7CgkJCQl2YXIgYXR0cmlidXRlID0gc2xpZGUuYXR0cmlidXRlc1sgaSBdOwoJCQkJYXR0cmlidXRlc1sgYXR0cmlidXRlLm5hbWUgXSA9IGF0dHJpYnV0ZS52YWx1ZTsKCQkJfQoJCQlyZXR1cm4gYXR0cmlidXRlczsKCgkJfSApOwoKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHNsaWRlcyBpbiB0aGlzIHByZXNlbnRhdGlvbi4KCSAqCgkgKiBAcmV0dXJuIHtudW1iZXJ9CgkgKi8KCWZ1bmN0aW9uIGdldFRvdGFsU2xpZGVzKCkgewoKCQlyZXR1cm4gZ2V0U2xpZGVzKCkubGVuZ3RoOwoKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNsaWRlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBpbmRleC4KCSAqCgkgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0KCSAqLwoJZnVuY3Rpb24gZ2V0U2xpZGUoIHgsIHkgKSB7CgoJCXZhciBob3Jpem9udGFsU2xpZGUgPSBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiApWyB4IF07CgkJdmFyIHZlcnRpY2FsU2xpZGVzID0gaG9yaXpvbnRhbFNsaWRlICYmIGhvcml6b250YWxTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnc2VjdGlvbicgKTsKCgkJaWYoIHZlcnRpY2FsU2xpZGVzICYmIHZlcnRpY2FsU2xpZGVzLmxlbmd0aCAmJiB0eXBlb2YgeSA9PT0gJ251bWJlcicgKSB7CgkJCXJldHVybiB2ZXJ0aWNhbFNsaWRlcyA/IHZlcnRpY2FsU2xpZGVzWyB5IF0gOiB1bmRlZmluZWQ7CgkJfQoKCQlyZXR1cm4gaG9yaXpvbnRhbFNsaWRlOwoKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGJhY2tncm91bmQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHNsaWRlLgoJICogQWxsIHNsaWRlcywgZXZlbiB0aGUgb25lcyB3aXRoIG5vIGJhY2tncm91bmQgcHJvcGVydGllcwoJICogZGVmaW5lZCwgaGF2ZSBhIGJhY2tncm91bmQgZWxlbWVudCBzbyBhcyBsb25nIGFzIHRoZQoJICogaW5kZXggaXMgdmFsaWQgYW4gZWxlbWVudCB3aWxsIGJlIHJldHVybmVkLgoJICoKCSAqIEBwYXJhbSB7bWl4ZWR9IHggSG9yaXpvbnRhbCBiYWNrZ3JvdW5kIGluZGV4IE9SIGEgc2xpZGUKCSAqIEhUTUwgZWxlbWVudAoJICogQHBhcmFtIHtudW1iZXJ9IHkgVmVydGljYWwgYmFja2dyb3VuZCBpbmRleAoJICogQHJldHVybiB7KEhUTUxFbGVtZW50W118Kil9CgkgKi8KCWZ1bmN0aW9uIGdldFNsaWRlQmFja2dyb3VuZCggeCwgeSApIHsKCgkJdmFyIHNsaWRlID0gdHlwZW9mIHggPT09ICdudW1iZXInID8gZ2V0U2xpZGUoIHgsIHkgKSA6IHg7CgkJaWYoIHNsaWRlICkgewoJCQlyZXR1cm4gc2xpZGUuc2xpZGVCYWNrZ3JvdW5kRWxlbWVudDsKCQl9CgoJCXJldHVybiB1bmRlZmluZWQ7CgoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSBzcGVha2VyIG5vdGVzIGZyb20gYSBzbGlkZS4gTm90ZXMgY2FuIGJlCgkgKiBkZWZpbmVkIGluIHR3byB3YXlzOgoJICogMS4gQXMgYSBkYXRhLW5vdGVzIGF0dHJpYnV0ZSBvbiB0aGUgc2xpZGUgPHNlY3Rpb24+CgkgKiAyLiBBcyBhbiA8YXNpZGUgY2xhc3M9Im5vdGVzIj4gaW5zaWRlIG9mIHRoZSBzbGlkZQoJICoKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtzbGlkZT1jdXJyZW50U2xpZGVdCgkgKiBAcmV0dXJuIHsoc3RyaW5nfG51bGwpfQoJICovCglmdW5jdGlvbiBnZXRTbGlkZU5vdGVzKCBzbGlkZSApIHsKCgkJLy8gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzbGlkZQoJCXNsaWRlID0gc2xpZGUgfHwgY3VycmVudFNsaWRlOwoKCQkvLyBOb3RlcyBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgZGF0YS1ub3RlcyBhdHRyaWJ1dGUuLi4KCQlpZiggc2xpZGUuaGFzQXR0cmlidXRlKCAnZGF0YS1ub3RlcycgKSApIHsKCQkJcmV0dXJuIHNsaWRlLmdldEF0dHJpYnV0ZSggJ2RhdGEtbm90ZXMnICk7CgkJfQoKCQkvLyAuLi4gb3IgdXNpbmcgYW4gPGFzaWRlIGNsYXNzPSJub3RlcyI+IGVsZW1lbnQKCQl2YXIgbm90ZXNFbGVtZW50ID0gc2xpZGUucXVlcnlTZWxlY3RvciggJ2FzaWRlLm5vdGVzJyApOwoJCWlmKCBub3Rlc0VsZW1lbnQgKSB7CgkJCXJldHVybiBub3Rlc0VsZW1lbnQuaW5uZXJIVE1MOwoJCX0KCgkJcmV0dXJuIG51bGw7CgoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwcmVzZW50YXRpb24gYXMKCSAqIGFuIG9iamVjdC4gVGhpcyBzdGF0ZSBjYW4gdGhlbiBiZSByZXN0b3JlZCBhdCBhbnkKCSAqIHRpbWUuCgkgKgoJICogQHJldHVybiB7e2luZGV4aDogbnVtYmVyLCBpbmRleHY6IG51bWJlciwgaW5kZXhmOiBudW1iZXIsIHBhdXNlZDogYm9vbGVhbiwgb3ZlcnZpZXc6IGJvb2xlYW59fQoJICovCglmdW5jdGlvbiBnZXRTdGF0ZSgpIHsKCgkJdmFyIGluZGljZXMgPSBnZXRJbmRpY2VzKCk7CgoJCXJldHVybiB7CgkJCWluZGV4aDogaW5kaWNlcy5oLAoJCQlpbmRleHY6IGluZGljZXMudiwKCQkJaW5kZXhmOiBpbmRpY2VzLmYsCgkJCXBhdXNlZDogaXNQYXVzZWQoKSwKCQkJb3ZlcnZpZXc6IGlzT3ZlcnZpZXcoKQoJCX07CgoJfQoKCS8qKgoJICogUmVzdG9yZXMgdGhlIHByZXNlbnRhdGlvbiB0byB0aGUgZ2l2ZW4gc3RhdGUuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIEFzIGdlbmVyYXRlZCBieSBnZXRTdGF0ZSgpCgkgKiBAc2VlIHtAbGluayBnZXRTdGF0ZX0gZ2VuZXJhdGVzIHRoZSBwYXJhbWV0ZXIgYHN0YXRlYAoJICovCglmdW5jdGlvbiBzZXRTdGF0ZSggc3RhdGUgKSB7CgoJCWlmKCB0eXBlb2Ygc3RhdGUgPT09ICdvYmplY3QnICkgewoJCQlzbGlkZSggZGVzZXJpYWxpemUoIHN0YXRlLmluZGV4aCApLCBkZXNlcmlhbGl6ZSggc3RhdGUuaW5kZXh2ICksIGRlc2VyaWFsaXplKCBzdGF0ZS5pbmRleGYgKSApOwoKCQkJdmFyIHBhdXNlZEZsYWcgPSBkZXNlcmlhbGl6ZSggc3RhdGUucGF1c2VkICksCgkJCQlvdmVydmlld0ZsYWcgPSBkZXNlcmlhbGl6ZSggc3RhdGUub3ZlcnZpZXcgKTsKCgkJCWlmKCB0eXBlb2YgcGF1c2VkRmxhZyA9PT0gJ2Jvb2xlYW4nICYmIHBhdXNlZEZsYWcgIT09IGlzUGF1c2VkKCkgKSB7CgkJCQl0b2dnbGVQYXVzZSggcGF1c2VkRmxhZyApOwoJCQl9CgoJCQlpZiggdHlwZW9mIG92ZXJ2aWV3RmxhZyA9PT0gJ2Jvb2xlYW4nICYmIG92ZXJ2aWV3RmxhZyAhPT0gaXNPdmVydmlldygpICkgewoJCQkJdG9nZ2xlT3ZlcnZpZXcoIG92ZXJ2aWV3RmxhZyApOwoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIFJldHVybiBhIHNvcnRlZCBmcmFnbWVudHMgbGlzdCwgb3JkZXJlZCBieSBhbiBpbmNyZWFzaW5nCgkgKiAiZGF0YS1mcmFnbWVudC1pbmRleCIgYXR0cmlidXRlLgoJICoKCSAqIEZyYWdtZW50cyB3aWxsIGJlIHJldmVhbGVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJldHVybmVkIGJ5CgkgKiB0aGlzIGZ1bmN0aW9uLCBzbyB5b3UgY2FuIHVzZSB0aGUgaW5kZXggYXR0cmlidXRlcyB0byBjb250cm9sIHRoZQoJICogb3JkZXIgb2YgZnJhZ21lbnQgYXBwZWFyYW5jZS4KCSAqCgkgKiBUbyBtYWludGFpbiBhIHNlbnNpYmxlIGRlZmF1bHQgZnJhZ21lbnQgb3JkZXIsIGZyYWdtZW50cyBhcmUgcHJlc3VtZWQKCSAqIHRvIGJlIHBhc3NlZCBpbiBkb2N1bWVudCBvcmRlci4gVGhpcyBmdW5jdGlvbiBhZGRzIGEgImZyYWdtZW50LWluZGV4IgoJICogYXR0cmlidXRlIHRvIGVhY2ggbm9kZSBpZiBzdWNoIGFuIGF0dHJpYnV0ZSBpcyBub3QgYWxyZWFkeSBwcmVzZW50LAoJICogYW5kIHNldHMgdGhhdCBhdHRyaWJ1dGUgdG8gYW4gaW50ZWdlciB2YWx1ZSB3aGljaCBpcyB0aGUgcG9zaXRpb24gb2YKCSAqIHRoZSBmcmFnbWVudCB3aXRoaW4gdGhlIGZyYWdtZW50cyBsaXN0LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0W118Kn0gZnJhZ21lbnRzCgkgKiBAcGFyYW0ge2Jvb2xlYW59IGdyb3VwZWQgSWYgdHJ1ZSB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluCgkgKiBuZXN0ZWQgYXJyYXlzIGZvciBhbGwgZnJhZ21lbnRzIHdpdGggdGhlIHNhbWUgaW5kZXgKCSAqIEByZXR1cm4ge29iamVjdFtdfSBzb3J0ZWQgU29ydGVkIGFycmF5IG9mIGZyYWdtZW50cwoJICovCglmdW5jdGlvbiBzb3J0RnJhZ21lbnRzKCBmcmFnbWVudHMsIGdyb3VwZWQgKSB7CgoJCWZyYWdtZW50cyA9IHRvQXJyYXkoIGZyYWdtZW50cyApOwoKCQl2YXIgb3JkZXJlZCA9IFtdLAoJCQl1bm9yZGVyZWQgPSBbXSwKCQkJc29ydGVkID0gW107CgoJCS8vIEdyb3VwIG9yZGVyZWQgYW5kIHVub3JkZXJlZCBlbGVtZW50cwoJCWZyYWdtZW50cy5mb3JFYWNoKCBmdW5jdGlvbiggZnJhZ21lbnQsIGkgKSB7CgkJCWlmKCBmcmFnbWVudC5oYXNBdHRyaWJ1dGUoICdkYXRhLWZyYWdtZW50LWluZGV4JyApICkgewoJCQkJdmFyIGluZGV4ID0gcGFyc2VJbnQoIGZyYWdtZW50LmdldEF0dHJpYnV0ZSggJ2RhdGEtZnJhZ21lbnQtaW5kZXgnICksIDEwICk7CgoJCQkJaWYoICFvcmRlcmVkW2luZGV4XSApIHsKCQkJCQlvcmRlcmVkW2luZGV4XSA9IFtdOwoJCQkJfQoKCQkJCW9yZGVyZWRbaW5kZXhdLnB1c2goIGZyYWdtZW50ICk7CgkJCX0KCQkJZWxzZSB7CgkJCQl1bm9yZGVyZWQucHVzaCggWyBmcmFnbWVudCBdICk7CgkJCX0KCQl9ICk7CgoJCS8vIEFwcGVuZCBmcmFnbWVudHMgd2l0aG91dCBleHBsaWNpdCBpbmRpY2VzIGluIHRoZWlyCgkJLy8gRE9NIG9yZGVyCgkJb3JkZXJlZCA9IG9yZGVyZWQuY29uY2F0KCB1bm9yZGVyZWQgKTsKCgkJLy8gTWFudWFsbHkgY291bnQgdGhlIGluZGV4IHVwIHBlciBncm91cCB0byBlbnN1cmUgdGhlcmUKCQkvLyBhcmUgbm8gZ2FwcwoJCXZhciBpbmRleCA9IDA7CgoJCS8vIFB1c2ggYWxsIGZyYWdtZW50cyBpbiB0aGVpciBzb3J0ZWQgb3JkZXIgdG8gYW4gYXJyYXksCgkJLy8gdGhpcyBmbGF0dGVucyB0aGUgZ3JvdXBzCgkJb3JkZXJlZC5mb3JFYWNoKCBmdW5jdGlvbiggZ3JvdXAgKSB7CgkJCWdyb3VwLmZvckVhY2goIGZ1bmN0aW9uKCBmcmFnbWVudCApIHsKCQkJCXNvcnRlZC5wdXNoKCBmcmFnbWVudCApOwoJCQkJZnJhZ21lbnQuc2V0QXR0cmlidXRlKCAnZGF0YS1mcmFnbWVudC1pbmRleCcsIGluZGV4ICk7CgkJCX0gKTsKCgkJCWluZGV4ICsrOwoJCX0gKTsKCgkJcmV0dXJuIGdyb3VwZWQgPT09IHRydWUgPyBvcmRlcmVkIDogc29ydGVkOwoKCX0KCgkvKioKCSAqIFJlZnJlc2hlcyB0aGUgZnJhZ21lbnRzIG9uIHRoZSBjdXJyZW50IHNsaWRlIHNvIHRoYXQgdGhleQoJICogaGF2ZSB0aGUgYXBwcm9wcmlhdGUgY2xhc3NlcyAoLnZpc2libGUgKyAuY3VycmVudC1mcmFnbWVudCkuCgkgKgoJICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleF0gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGZyYWdtZW50CgkgKiBAcGFyYW0ge2FycmF5fSBbZnJhZ21lbnRzXSBBcnJheSBjb250YWluaW5nIGFsbCBmcmFnbWVudHMKCSAqIGluIHRoZSBjdXJyZW50IHNsaWRlCgkgKgoJICogQHJldHVybiB7e3Nob3duOiBhcnJheSwgaGlkZGVuOiBhcnJheX19CgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50cyggaW5kZXgsIGZyYWdtZW50cyApIHsKCgkJdmFyIGNoYW5nZWRGcmFnbWVudHMgPSB7CgkJCXNob3duOiBbXSwKCQkJaGlkZGVuOiBbXQoJCX07CgoJCWlmKCBjdXJyZW50U2xpZGUgJiYgY29uZmlnLmZyYWdtZW50cyApIHsKCgkJCWZyYWdtZW50cyA9IGZyYWdtZW50cyB8fCBzb3J0RnJhZ21lbnRzKCBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudCcgKSApOwoKCQkJaWYoIGZyYWdtZW50cy5sZW5ndGggKSB7CgoJCQkJdmFyIG1heEluZGV4ID0gMDsKCgkJCQlpZiggdHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyApIHsKCQkJCQl2YXIgY3VycmVudEZyYWdtZW50ID0gc29ydEZyYWdtZW50cyggY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQudmlzaWJsZScgKSApLnBvcCgpOwoJCQkJCWlmKCBjdXJyZW50RnJhZ21lbnQgKSB7CgkJCQkJCWluZGV4ID0gcGFyc2VJbnQoIGN1cnJlbnRGcmFnbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLWZyYWdtZW50LWluZGV4JyApIHx8IDAsIDEwICk7CgkJCQkJfQoJCQkJfQoKCQkJCXRvQXJyYXkoIGZyYWdtZW50cyApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCwgaSApIHsKCgkJCQkJaWYoIGVsLmhhc0F0dHJpYnV0ZSggJ2RhdGEtZnJhZ21lbnQtaW5kZXgnICkgKSB7CgkJCQkJCWkgPSBwYXJzZUludCggZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1mcmFnbWVudC1pbmRleCcgKSwgMTAgKTsKCQkJCQl9CgoJCQkJCW1heEluZGV4ID0gTWF0aC5tYXgoIG1heEluZGV4LCBpICk7CgoJCQkJCS8vIFZpc2libGUgZnJhZ21lbnRzCgkJCQkJaWYoIGkgPD0gaW5kZXggKSB7CgkJCQkJCWlmKCAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAndmlzaWJsZScgKSApIGNoYW5nZWRGcmFnbWVudHMuc2hvd24ucHVzaCggZWwgKTsKCQkJCQkJZWwuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnICk7CgkJCQkJCWVsLmNsYXNzTGlzdC5yZW1vdmUoICdjdXJyZW50LWZyYWdtZW50JyApOwoKCQkJCQkJLy8gQW5ub3VuY2UgdGhlIGZyYWdtZW50cyBvbmUgYnkgb25lIHRvIHRoZSBTY3JlZW4gUmVhZGVyCgkJCQkJCWRvbS5zdGF0dXNEaXYudGV4dENvbnRlbnQgPSBnZXRTdGF0dXNUZXh0KCBlbCApOwoKCQkJCQkJaWYoIGkgPT09IGluZGV4ICkgewoJCQkJCQkJZWwuY2xhc3NMaXN0LmFkZCggJ2N1cnJlbnQtZnJhZ21lbnQnICk7CgkJCQkJCQlzdGFydEVtYmVkZGVkQ29udGVudCggZWwgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkvLyBIaWRkZW4gZnJhZ21lbnRzCgkJCQkJZWxzZSB7CgkJCQkJCWlmKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd2aXNpYmxlJyApICkgY2hhbmdlZEZyYWdtZW50cy5oaWRkZW4ucHVzaCggZWwgKTsKCQkJCQkJZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnICk7CgkJCQkJCWVsLmNsYXNzTGlzdC5yZW1vdmUoICdjdXJyZW50LWZyYWdtZW50JyApOwoJCQkJCX0KCgkJCQl9ICk7CgoJCQkJLy8gV3JpdGUgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaW5kZXggdG8gdGhlIHNsaWRlIDxzZWN0aW9uPi4KCQkJCS8vIFRoaXMgY2FuIGJlIHVzZWQgYnkgZW5kIHVzZXJzIHRvIGFwcGx5IHN0eWxlcyBiYXNlZCBvbgoJCQkJLy8gdGhlIGN1cnJlbnQgZnJhZ21lbnQgaW5kZXguCgkJCQlpbmRleCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IC0xOwoJCQkJaW5kZXggPSBNYXRoLm1heCggTWF0aC5taW4oIGluZGV4LCBtYXhJbmRleCApLCAtMSApOwoJCQkJY3VycmVudFNsaWRlLnNldEF0dHJpYnV0ZSggJ2RhdGEtZnJhZ21lbnQnLCBpbmRleCApOwoKCQkJfQoKCQl9CgoJCXJldHVybiBjaGFuZ2VkRnJhZ21lbnRzOwoKCX0KCgkvKioKCSAqIE5hdmlnYXRlIHRvIHRoZSBzcGVjaWZpZWQgc2xpZGUgZnJhZ21lbnQuCgkgKgoJICogQHBhcmFtIHs/bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZyYWdtZW50IHRoYXQKCSAqIHNob3VsZCBiZSBzaG93biwgLTEgbWVhbnMgYWxsIGFyZSBpbnZpc2libGUKCSAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgSW50ZWdlciBvZmZzZXQgdG8gYXBwbHkgdG8gdGhlCgkgKiBmcmFnbWVudCBpbmRleAoJICoKCSAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYSBjaGFuZ2Ugd2FzIG1hZGUgaW4gYW55CgkgKiBmcmFnbWVudHMgdmlzaWJpbGl0eSBhcyBwYXJ0IG9mIHRoaXMgY2FsbAoJICovCglmdW5jdGlvbiBuYXZpZ2F0ZUZyYWdtZW50KCBpbmRleCwgb2Zmc2V0ICkgewoKCQlpZiggY3VycmVudFNsaWRlICYmIGNvbmZpZy5mcmFnbWVudHMgKSB7CgoJCQl2YXIgZnJhZ21lbnRzID0gc29ydEZyYWdtZW50cyggY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICcuZnJhZ21lbnQnICkgKTsKCQkJaWYoIGZyYWdtZW50cy5sZW5ndGggKSB7CgoJCQkJLy8gSWYgbm8gaW5kZXggaXMgc3BlY2lmaWVkLCBmaW5kIHRoZSBjdXJyZW50CgkJCQlpZiggdHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyApIHsKCQkJCQl2YXIgbGFzdFZpc2libGVGcmFnbWVudCA9IHNvcnRGcmFnbWVudHMoIGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZyYWdtZW50LnZpc2libGUnICkgKS5wb3AoKTsKCgkJCQkJaWYoIGxhc3RWaXNpYmxlRnJhZ21lbnQgKSB7CgkJCQkJCWluZGV4ID0gcGFyc2VJbnQoIGxhc3RWaXNpYmxlRnJhZ21lbnQuZ2V0QXR0cmlidXRlKCAnZGF0YS1mcmFnbWVudC1pbmRleCcgKSB8fCAwLCAxMCApOwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJaW5kZXggPSAtMTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gSWYgYW4gb2Zmc2V0IGlzIHNwZWNpZmllZCwgYXBwbHkgaXQgdG8gdGhlIGluZGV4CgkJCQlpZiggdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgKSB7CgkJCQkJaW5kZXggKz0gb2Zmc2V0OwoJCQkJfQoKCQkJCXZhciBjaGFuZ2VkRnJhZ21lbnRzID0gdXBkYXRlRnJhZ21lbnRzKCBpbmRleCwgZnJhZ21lbnRzICk7CgoJCQkJaWYoIGNoYW5nZWRGcmFnbWVudHMuaGlkZGVuLmxlbmd0aCApIHsKCQkJCQlkaXNwYXRjaEV2ZW50KCAnZnJhZ21lbnRoaWRkZW4nLCB7IGZyYWdtZW50OiBjaGFuZ2VkRnJhZ21lbnRzLmhpZGRlblswXSwgZnJhZ21lbnRzOiBjaGFuZ2VkRnJhZ21lbnRzLmhpZGRlbiB9ICk7CgkJCQl9CgoJCQkJaWYoIGNoYW5nZWRGcmFnbWVudHMuc2hvd24ubGVuZ3RoICkgewoJCQkJCWRpc3BhdGNoRXZlbnQoICdmcmFnbWVudHNob3duJywgeyBmcmFnbWVudDogY2hhbmdlZEZyYWdtZW50cy5zaG93blswXSwgZnJhZ21lbnRzOiBjaGFuZ2VkRnJhZ21lbnRzLnNob3duIH0gKTsKCQkJCX0KCgkJCQl1cGRhdGVDb250cm9scygpOwoJCQkJdXBkYXRlUHJvZ3Jlc3MoKTsKCgkJCQlpZiggY29uZmlnLmZyYWdtZW50SW5VUkwgKSB7CgkJCQkJd3JpdGVVUkwoKTsKCQkJCX0KCgkJCQlyZXR1cm4gISEoIGNoYW5nZWRGcmFnbWVudHMuc2hvd24ubGVuZ3RoIHx8IGNoYW5nZWRGcmFnbWVudHMuaGlkZGVuLmxlbmd0aCApOwoKCQkJfQoKCQl9CgoJCXJldHVybiBmYWxzZTsKCgl9CgoJLyoqCgkgKiBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBzbGlkZSBmcmFnbWVudC4KCSAqCgkgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZXJlIHdhcyBhIG5leHQgZnJhZ21lbnQsCgkgKiBmYWxzZSBvdGhlcndpc2UKCSAqLwoJZnVuY3Rpb24gbmV4dEZyYWdtZW50KCkgewoKCQlyZXR1cm4gbmF2aWdhdGVGcmFnbWVudCggbnVsbCwgMSApOwoKCX0KCgkvKioKCSAqIE5hdmlnYXRlIHRvIHRoZSBwcmV2aW91cyBzbGlkZSBmcmFnbWVudC4KCSAqCgkgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZXJlIHdhcyBhIHByZXZpb3VzIGZyYWdtZW50LAoJICogZmFsc2Ugb3RoZXJ3aXNlCgkgKi8KCWZ1bmN0aW9uIHByZXZpb3VzRnJhZ21lbnQoKSB7CgoJCXJldHVybiBuYXZpZ2F0ZUZyYWdtZW50KCBudWxsLCAtMSApOwoKCX0KCgkvKioKCSAqIEN1ZXMgYSBuZXcgYXV0b21hdGVkIHNsaWRlIGlmIGVuYWJsZWQgaW4gdGhlIGNvbmZpZy4KCSAqLwoJZnVuY3Rpb24gY3VlQXV0b1NsaWRlKCkgewoKCQljYW5jZWxBdXRvU2xpZGUoKTsKCgkJaWYoIGN1cnJlbnRTbGlkZSAmJiBjb25maWcuYXV0b1NsaWRlICE9PSBmYWxzZSApIHsKCgkJCXZhciBmcmFnbWVudCA9IGN1cnJlbnRTbGlkZS5xdWVyeVNlbGVjdG9yKCAnLmN1cnJlbnQtZnJhZ21lbnQnICk7CgoJCQkvLyBXaGVuIHRoZSBzbGlkZSBmaXJzdCBhcHBlYXJzIHRoZXJlIGlzIG5vICJjdXJyZW50IiBmcmFnbWVudCBzbwoJCQkvLyB3ZSBsb29rIGZvciBhIGRhdGEtYXV0b3NsaWRlIHRpbWluZyBvbiB0aGUgZmlyc3QgZnJhZ21lbnQKCQkJaWYoICFmcmFnbWVudCApIGZyYWdtZW50ID0gY3VycmVudFNsaWRlLnF1ZXJ5U2VsZWN0b3IoICcuZnJhZ21lbnQnICk7CgoJCQl2YXIgZnJhZ21lbnRBdXRvU2xpZGUgPSBmcmFnbWVudCA/IGZyYWdtZW50LmdldEF0dHJpYnV0ZSggJ2RhdGEtYXV0b3NsaWRlJyApIDogbnVsbDsKCQkJdmFyIHBhcmVudEF1dG9TbGlkZSA9IGN1cnJlbnRTbGlkZS5wYXJlbnROb2RlID8gY3VycmVudFNsaWRlLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1hdXRvc2xpZGUnICkgOiBudWxsOwoJCQl2YXIgc2xpZGVBdXRvU2xpZGUgPSBjdXJyZW50U2xpZGUuZ2V0QXR0cmlidXRlKCAnZGF0YS1hdXRvc2xpZGUnICk7CgoJCQkvLyBQaWNrIHZhbHVlIGluIHRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgb3JkZXI6CgkJCS8vIDEuIEN1cnJlbnQgZnJhZ21lbnQncyBkYXRhLWF1dG9zbGlkZQoJCQkvLyAyLiBDdXJyZW50IHNsaWRlJ3MgZGF0YS1hdXRvc2xpZGUKCQkJLy8gMy4gUGFyZW50IHNsaWRlJ3MgZGF0YS1hdXRvc2xpZGUKCQkJLy8gNC4gR2xvYmFsIGF1dG9TbGlkZSBzZXR0aW5nCgkJCWlmKCBmcmFnbWVudEF1dG9TbGlkZSApIHsKCQkJCWF1dG9TbGlkZSA9IHBhcnNlSW50KCBmcmFnbWVudEF1dG9TbGlkZSwgMTAgKTsKCQkJfQoJCQllbHNlIGlmKCBzbGlkZUF1dG9TbGlkZSApIHsKCQkJCWF1dG9TbGlkZSA9IHBhcnNlSW50KCBzbGlkZUF1dG9TbGlkZSwgMTAgKTsKCQkJfQoJCQllbHNlIGlmKCBwYXJlbnRBdXRvU2xpZGUgKSB7CgkJCQlhdXRvU2xpZGUgPSBwYXJzZUludCggcGFyZW50QXV0b1NsaWRlLCAxMCApOwoJCQl9CgkJCWVsc2UgewoJCQkJYXV0b1NsaWRlID0gY29uZmlnLmF1dG9TbGlkZTsKCQkJfQoKCQkJLy8gSWYgdGhlcmUgYXJlIG1lZGlhIGVsZW1lbnRzIHdpdGggZGF0YS1hdXRvcGxheSwKCQkJLy8gYXV0b21hdGljYWxseSBzZXQgdGhlIGF1dG9TbGlkZSBkdXJhdGlvbiB0byB0aGUKCQkJLy8gbGVuZ3RoIG9mIHRoYXQgbWVkaWEuIE5vdCBhcHBsaWNhYmxlIGlmIHRoZSBzbGlkZQoJCQkvLyBpcyBkaXZpZGVkIHVwIGludG8gZnJhZ21lbnRzLgoJCQkvLyBwbGF5YmFja1JhdGUgaXMgYWNjb3VudGVkIGZvciBpbiB0aGUgZHVyYXRpb24uCgkJCWlmKCBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJy5mcmFnbWVudCcgKS5sZW5ndGggPT09IDAgKSB7CgkJCQl0b0FycmF5KCBjdXJyZW50U2xpZGUucXVlcnlTZWxlY3RvckFsbCggJ3ZpZGVvLCBhdWRpbycgKSApLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsKCQkJCQlpZiggZWwuaGFzQXR0cmlidXRlKCAnZGF0YS1hdXRvcGxheScgKSApIHsKCQkJCQkJaWYoIGF1dG9TbGlkZSAmJiAoZWwuZHVyYXRpb24gKiAxMDAwIC8gZWwucGxheWJhY2tSYXRlICkgPiBhdXRvU2xpZGUgKSB7CgkJCQkJCQlhdXRvU2xpZGUgPSAoIGVsLmR1cmF0aW9uICogMTAwMCAvIGVsLnBsYXliYWNrUmF0ZSApICsgMTAwMDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gKTsKCQkJfQoKCQkJLy8gQ3VlIHRoZSBuZXh0IGF1dG8tc2xpZGUgaWY6CgkJCS8vIC0gVGhlcmUgaXMgYW4gYXV0b1NsaWRlIHZhbHVlCgkJCS8vIC0gQXV0by1zbGlkaW5nIGlzbid0IHBhdXNlZCBieSB0aGUgdXNlcgoJCQkvLyAtIFRoZSBwcmVzZW50YXRpb24gaXNuJ3QgcGF1c2VkCgkJCS8vIC0gVGhlIG92ZXJ2aWV3IGlzbid0IGFjdGl2ZQoJCQkvLyAtIFRoZSBwcmVzZW50YXRpb24gaXNuJ3Qgb3ZlcgoJCQlpZiggYXV0b1NsaWRlICYmICFhdXRvU2xpZGVQYXVzZWQgJiYgIWlzUGF1c2VkKCkgJiYgIWlzT3ZlcnZpZXcoKSAmJiAoICFSZXZlYWwuaXNMYXN0U2xpZGUoKSB8fCBhdmFpbGFibGVGcmFnbWVudHMoKS5uZXh0IHx8IGNvbmZpZy5sb29wID09PSB0cnVlICkgKSB7CgkJCQlhdXRvU2xpZGVUaW1lb3V0ID0gc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCQkJdHlwZW9mIGNvbmZpZy5hdXRvU2xpZGVNZXRob2QgPT09ICdmdW5jdGlvbicgPyBjb25maWcuYXV0b1NsaWRlTWV0aG9kKCkgOiBuYXZpZ2F0ZU5leHQoKTsKCQkJCQljdWVBdXRvU2xpZGUoKTsKCQkJCX0sIGF1dG9TbGlkZSApOwoJCQkJYXV0b1NsaWRlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKCQkJfQoKCQkJaWYoIGF1dG9TbGlkZVBsYXllciApIHsKCQkJCWF1dG9TbGlkZVBsYXllci5zZXRQbGF5aW5nKCBhdXRvU2xpZGVUaW1lb3V0ICE9PSAtMSApOwoJCQl9CgoJCX0KCgl9CgoJLyoqCgkgKiBDYW5jZWxzIGFueSBvbmdvaW5nIHJlcXVlc3QgdG8gYXV0by1zbGlkZS4KCSAqLwoJZnVuY3Rpb24gY2FuY2VsQXV0b1NsaWRlKCkgewoKCQljbGVhclRpbWVvdXQoIGF1dG9TbGlkZVRpbWVvdXQgKTsKCQlhdXRvU2xpZGVUaW1lb3V0ID0gLTE7CgoJfQoKCWZ1bmN0aW9uIHBhdXNlQXV0b1NsaWRlKCkgewoKCQlpZiggYXV0b1NsaWRlICYmICFhdXRvU2xpZGVQYXVzZWQgKSB7CgkJCWF1dG9TbGlkZVBhdXNlZCA9IHRydWU7CgkJCWRpc3BhdGNoRXZlbnQoICdhdXRvc2xpZGVwYXVzZWQnICk7CgkJCWNsZWFyVGltZW91dCggYXV0b1NsaWRlVGltZW91dCApOwoKCQkJaWYoIGF1dG9TbGlkZVBsYXllciApIHsKCQkJCWF1dG9TbGlkZVBsYXllci5zZXRQbGF5aW5nKCBmYWxzZSApOwoJCQl9CgkJfQoKCX0KCglmdW5jdGlvbiByZXN1bWVBdXRvU2xpZGUoKSB7CgoJCWlmKCBhdXRvU2xpZGUgJiYgYXV0b1NsaWRlUGF1c2VkICkgewoJCQlhdXRvU2xpZGVQYXVzZWQgPSBmYWxzZTsKCQkJZGlzcGF0Y2hFdmVudCggJ2F1dG9zbGlkZXJlc3VtZWQnICk7CgkJCWN1ZUF1dG9TbGlkZSgpOwoJCX0KCgl9CgoJZnVuY3Rpb24gbmF2aWdhdGVMZWZ0KCkgewoKCQkvLyBSZXZlcnNlIGZvciBSVEwKCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJaWYoICggaXNPdmVydmlldygpIHx8IG5leHRGcmFnbWVudCgpID09PSBmYWxzZSApICYmIGF2YWlsYWJsZVJvdXRlcygpLmxlZnQgKSB7CgkJCQlzbGlkZSggaW5kZXhoICsgMSwgY29uZmlnLm5hdmlnYXRpb25Nb2RlID09PSAnZ3JpZCcgPyBpbmRleHYgOiB1bmRlZmluZWQgKTsKCQkJfQoJCX0KCQkvLyBOb3JtYWwgbmF2aWdhdGlvbgoJCWVsc2UgaWYoICggaXNPdmVydmlldygpIHx8IHByZXZpb3VzRnJhZ21lbnQoKSA9PT0gZmFsc2UgKSAmJiBhdmFpbGFibGVSb3V0ZXMoKS5sZWZ0ICkgewoJCQlzbGlkZSggaW5kZXhoIC0gMSwgY29uZmlnLm5hdmlnYXRpb25Nb2RlID09PSAnZ3JpZCcgPyBpbmRleHYgOiB1bmRlZmluZWQgKTsKCQl9CgoJfQoKCWZ1bmN0aW9uIG5hdmlnYXRlUmlnaHQoKSB7CgoJCWhhc05hdmlnYXRlZFJpZ2h0ID0gdHJ1ZTsKCgkJLy8gUmV2ZXJzZSBmb3IgUlRMCgkJaWYoIGNvbmZpZy5ydGwgKSB7CgkJCWlmKCAoIGlzT3ZlcnZpZXcoKSB8fCBwcmV2aW91c0ZyYWdtZW50KCkgPT09IGZhbHNlICkgJiYgYXZhaWxhYmxlUm91dGVzKCkucmlnaHQgKSB7CgkJCQlzbGlkZSggaW5kZXhoIC0gMSwgY29uZmlnLm5hdmlnYXRpb25Nb2RlID09PSAnZ3JpZCcgPyBpbmRleHYgOiB1bmRlZmluZWQgKTsKCQkJfQoJCX0KCQkvLyBOb3JtYWwgbmF2aWdhdGlvbgoJCWVsc2UgaWYoICggaXNPdmVydmlldygpIHx8IG5leHRGcmFnbWVudCgpID09PSBmYWxzZSApICYmIGF2YWlsYWJsZVJvdXRlcygpLnJpZ2h0ICkgewoJCQlzbGlkZSggaW5kZXhoICsgMSwgY29uZmlnLm5hdmlnYXRpb25Nb2RlID09PSAnZ3JpZCcgPyBpbmRleHYgOiB1bmRlZmluZWQgKTsKCQl9CgoJfQoKCWZ1bmN0aW9uIG5hdmlnYXRlVXAoKSB7CgoJCS8vIFByaW9yaXRpemUgaGlkaW5nIGZyYWdtZW50cwoJCWlmKCAoIGlzT3ZlcnZpZXcoKSB8fCBwcmV2aW91c0ZyYWdtZW50KCkgPT09IGZhbHNlICkgJiYgYXZhaWxhYmxlUm91dGVzKCkudXAgKSB7CgkJCXNsaWRlKCBpbmRleGgsIGluZGV4diAtIDEgKTsKCQl9CgoJfQoKCWZ1bmN0aW9uIG5hdmlnYXRlRG93bigpIHsKCgkJaGFzTmF2aWdhdGVkRG93biA9IHRydWU7CgoJCS8vIFByaW9yaXRpemUgcmV2ZWFsaW5nIGZyYWdtZW50cwoJCWlmKCAoIGlzT3ZlcnZpZXcoKSB8fCBuZXh0RnJhZ21lbnQoKSA9PT0gZmFsc2UgKSAmJiBhdmFpbGFibGVSb3V0ZXMoKS5kb3duICkgewoJCQlzbGlkZSggaW5kZXhoLCBpbmRleHYgKyAxICk7CgkJfQoKCX0KCgkvKioKCSAqIE5hdmlnYXRlcyBiYWNrd2FyZHMsIHByaW9yaXRpemVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CgkgKiAxKSBQcmV2aW91cyBmcmFnbWVudAoJICogMikgUHJldmlvdXMgdmVydGljYWwgc2xpZGUKCSAqIDMpIFByZXZpb3VzIGhvcml6b250YWwgc2xpZGUKCSAqLwoJZnVuY3Rpb24gbmF2aWdhdGVQcmV2KCkgewoKCQkvLyBQcmlvcml0aXplIHJldmVhbGluZyBmcmFnbWVudHMKCQlpZiggcHJldmlvdXNGcmFnbWVudCgpID09PSBmYWxzZSApIHsKCQkJaWYoIGF2YWlsYWJsZVJvdXRlcygpLnVwICkgewoJCQkJbmF2aWdhdGVVcCgpOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gRmV0Y2ggdGhlIHByZXZpb3VzIGhvcml6b250YWwgc2xpZGUsIGlmIHRoZXJlIGlzIG9uZQoJCQkJdmFyIHByZXZpb3VzU2xpZGU7CgoJCQkJaWYoIGNvbmZpZy5ydGwgKSB7CgkJCQkJcHJldmlvdXNTbGlkZSA9IHRvQXJyYXkoIGRvbS53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoIEhPUklaT05UQUxfU0xJREVTX1NFTEVDVE9SICsgJy5mdXR1cmUnICkgKS5wb3AoKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXByZXZpb3VzU2xpZGUgPSB0b0FycmF5KCBkb20ud3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCBIT1JJWk9OVEFMX1NMSURFU19TRUxFQ1RPUiArICcucGFzdCcgKSApLnBvcCgpOwoJCQkJfQoKCQkJCWlmKCBwcmV2aW91c1NsaWRlICkgewoJCQkJCXZhciB2ID0gKCBwcmV2aW91c1NsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoICdzZWN0aW9uJyApLmxlbmd0aCAtIDEgKSB8fCB1bmRlZmluZWQ7CgkJCQkJdmFyIGggPSBpbmRleGggLSAxOwoJCQkJCXNsaWRlKCBoLCB2ICk7CgkJCQl9CgkJCX0KCQl9CgoJfQoKCS8qKgoJICogVGhlIHJldmVyc2Ugb2YgI25hdmlnYXRlUHJldigpLgoJICovCglmdW5jdGlvbiBuYXZpZ2F0ZU5leHQoKSB7CgoJCWhhc05hdmlnYXRlZFJpZ2h0ID0gdHJ1ZTsKCQloYXNOYXZpZ2F0ZWREb3duID0gdHJ1ZTsKCgkJLy8gUHJpb3JpdGl6ZSByZXZlYWxpbmcgZnJhZ21lbnRzCgkJaWYoIG5leHRGcmFnbWVudCgpID09PSBmYWxzZSApIHsKCgkJCXZhciByb3V0ZXMgPSBhdmFpbGFibGVSb3V0ZXMoKTsKCgkJCS8vIFdoZW4gbG9vcGluZyBpcyBlbmFibGVkIGByb3V0ZXMuZG93bmAgaXMgYWx3YXlzIGF2YWlsYWJsZQoJCQkvLyBzbyB3ZSBuZWVkIGEgc2VwYXJhdGUgY2hlY2sgZm9yIHdoZW4gd2UndmUgcmVhY2hlZCB0aGUKCQkJLy8gZW5kIG9mIGEgc3RhY2sgYW5kIHNob3VsZCBtb3ZlIGhvcml6b250YWxseQoJCQlpZiggcm91dGVzLmRvd24gJiYgcm91dGVzLnJpZ2h0ICYmIGNvbmZpZy5sb29wICYmIFJldmVhbC5pc0xhc3RWZXJ0aWNhbFNsaWRlKCBjdXJyZW50U2xpZGUgKSApIHsKCQkJCXJvdXRlcy5kb3duID0gZmFsc2U7CgkJCX0KCgkJCWlmKCByb3V0ZXMuZG93biApIHsKCQkJCW5hdmlnYXRlRG93bigpOwoJCQl9CgkJCWVsc2UgaWYoIGNvbmZpZy5ydGwgKSB7CgkJCQluYXZpZ2F0ZUxlZnQoKTsKCQkJfQoJCQllbHNlIHsKCQkJCW5hdmlnYXRlUmlnaHQoKTsKCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhlIHRhcmdldCBlbGVtZW50IHByZXZlbnRzIHRoZSB0cmlnZ2VyaW5nIG9mCgkgKiBzd2lwZSBuYXZpZ2F0aW9uLgoJICovCglmdW5jdGlvbiBpc1N3aXBlUHJldmVudGVkKCB0YXJnZXQgKSB7CgoJCXdoaWxlKCB0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC5oYXNBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbicgKSB7CgkJCWlmKCB0YXJnZXQuaGFzQXR0cmlidXRlKCAnZGF0YS1wcmV2ZW50LXN3aXBlJyApICkgcmV0dXJuIHRydWU7CgkJCXRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0KCgoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVZFTlRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKCS8qKgoJICogQ2FsbGVkIGJ5IGFsbCBldmVudCBoYW5kbGVycyB0aGF0IGFyZSBiYXNlZCBvbiB1c2VyCgkgKiBpbnB1dC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gW2V2ZW50XQoJICovCglmdW5jdGlvbiBvblVzZXJJbnB1dCggZXZlbnQgKSB7CgoJCWlmKCBjb25maWcuYXV0b1NsaWRlU3RvcHBhYmxlICkgewoJCQlwYXVzZUF1dG9TbGlkZSgpOwoJCX0KCgl9CgoJLyoqCgkgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlcmUgaXMgbW91c2UgaW5wdXQgYXQgdGhlIGRvY3VtZW50IGxldmVsCgkgKiB0byBkZXRlcm1pbmUgaWYgdGhlIGN1cnNvciBpcyBhY3RpdmUgb3Igbm90LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvbkRvY3VtZW50Q3Vyc29yQWN0aXZlKCBldmVudCApIHsKCgkJc2hvd0N1cnNvcigpOwoKCQljbGVhclRpbWVvdXQoIGN1cnNvckluYWN0aXZlVGltZW91dCApOwoKCQljdXJzb3JJbmFjdGl2ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCBoaWRlQ3Vyc29yLCBjb25maWcuaGlkZUN1cnNvclRpbWUgKTsKCgl9CgoJLyoqCgkgKiBIYW5kbGVyIGZvciB0aGUgZG9jdW1lbnQgbGV2ZWwgJ2tleXByZXNzJyBldmVudC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25Eb2N1bWVudEtleVByZXNzKCBldmVudCApIHsKCgkJLy8gQ2hlY2sgaWYgdGhlIHByZXNzZWQga2V5IGlzIHF1ZXN0aW9uIG1hcmsKCQlpZiggZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQuY2hhckNvZGUgPT09IDYzICkgewoJCQl0b2dnbGVIZWxwKCk7CgkJfQoKCX0KCgkvKioKCSAqIEhhbmRsZXIgZm9yIHRoZSBkb2N1bWVudCBsZXZlbCAna2V5ZG93bicgZXZlbnQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uRG9jdW1lbnRLZXlEb3duKCBldmVudCApIHsKCgkJLy8gSWYgdGhlcmUncyBhIGNvbmRpdGlvbiBzcGVjaWZpZWQgYW5kIGl0IHJldHVybnMgZmFsc2UsCgkJLy8gaWdub3JlIHRoaXMgZXZlbnQKCQlpZiggdHlwZW9mIGNvbmZpZy5rZXlib2FyZENvbmRpdGlvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBjb25maWcua2V5Ym9hcmRDb25kaXRpb24oZXZlbnQpID09PSBmYWxzZSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBTaG9ydGhhbmQKCQl2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7CgoJCS8vIFJlbWVtYmVyIGlmIGF1dG8tc2xpZGluZyB3YXMgcGF1c2VkIHNvIHdlIGNhbiB0b2dnbGUgaXQKCQl2YXIgYXV0b1NsaWRlV2FzUGF1c2VkID0gYXV0b1NsaWRlUGF1c2VkOwoKCQlvblVzZXJJbnB1dCggZXZlbnQgKTsKCgkJLy8gSXMgdGhlcmUgYSBmb2N1c2VkIGVsZW1lbnQgdGhhdCBjb3VsZCBiZSB1c2luZyB0aGUga2V5Ym9hcmQ/CgkJdmFyIGFjdGl2ZUVsZW1lbnRJc0NFID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNvbnRlbnRFZGl0YWJsZSAhPT0gJ2luaGVyaXQnOwoJCXZhciBhY3RpdmVFbGVtZW50SXNJbnB1dCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lICYmIC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZSApOwoJCXZhciBhY3RpdmVFbGVtZW50SXNOb3RlcyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGFzc05hbWUgJiYgL3NwZWFrZXItbm90ZXMvaS50ZXN0KCBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsYXNzTmFtZSk7CgoJCS8vIFdoaXRlbGlzdCBzcGVjaWZpYyBtb2RpZmllZCArIGtleWNvZGUgY29tYmluYXRpb25zCgkJdmFyIHByZXZTbGlkZVNob3J0Y3V0ID0gZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gMzI7CgkJdmFyIGZpcnN0U2xpZGVTaG9ydGN1dCA9IGV2ZW50LnNoaWZ0S2V5ICYmIGtleUNvZGUgPT09IDM3OwoJCXZhciBsYXN0U2xpZGVTaG9ydGN1dCA9IGV2ZW50LnNoaWZ0S2V5ICYmIGtleUNvZGUgPT09IDM5OwoKCQkvLyBQcmV2ZW50IGFsbCBvdGhlciBldmVudHMgd2hlbiBhIG1vZGlmaWVyIGlzIHByZXNzZWQKCQl2YXIgdW51c2VkTW9kaWZpZXIgPSAJIXByZXZTbGlkZVNob3J0Y3V0ICYmICFmaXJzdFNsaWRlU2hvcnRjdXQgJiYgIWxhc3RTbGlkZVNob3J0Y3V0ICYmCgkJCQkJCQkJKCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5ICk7CgoJCS8vIERpc3JlZ2FyZCB0aGUgZXZlbnQgaWYgdGhlcmUncyBhIGZvY3VzZWQgZWxlbWVudCBvciBhCgkJLy8ga2V5Ym9hcmQgbW9kaWZpZXIga2V5IGlzIHByZXNlbnQKCQlpZiggYWN0aXZlRWxlbWVudElzQ0UgfHwgYWN0aXZlRWxlbWVudElzSW5wdXQgfHwgYWN0aXZlRWxlbWVudElzTm90ZXMgfHwgdW51c2VkTW9kaWZpZXIgKSByZXR1cm47CgoJCS8vIFdoaWxlIHBhdXNlZCBvbmx5IGFsbG93IHJlc3VtZSBrZXlib2FyZCBldmVudHM7ICdiJywgJ3YnLCAnLicKCQl2YXIgcmVzdW1lS2V5Q29kZXMgPSBbNjYsODYsMTkwLDE5MV07CgkJdmFyIGtleTsKCgkJLy8gQ3VzdG9tIGtleSBiaW5kaW5ncyBmb3IgdG9nZ2xlUGF1c2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVzdW1lCgkJaWYoIHR5cGVvZiBjb25maWcua2V5Ym9hcmQgPT09ICdvYmplY3QnICkgewoJCQlmb3IoIGtleSBpbiBjb25maWcua2V5Ym9hcmQgKSB7CgkJCQlpZiggY29uZmlnLmtleWJvYXJkW2tleV0gPT09ICd0b2dnbGVQYXVzZScgKSB7CgkJCQkJcmVzdW1lS2V5Q29kZXMucHVzaCggcGFyc2VJbnQoIGtleSwgMTAgKSApOwoJCQkJfQoJCQl9CgkJfQoKCQlpZiggaXNQYXVzZWQoKSAmJiByZXN1bWVLZXlDb2Rlcy5pbmRleE9mKCBrZXlDb2RlICkgPT09IC0xICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBVc2UgbGluZWFyIG5hdmlnYXRpb24gaWYgd2UncmUgY29uZmlndXJlZCB0byBPUiBpZgoJCS8vIHRoZSBwcmVzZW50YXRpb24gaXMgb25lLWRpbWVuc2lvbmFsCgkJdmFyIHVzZUxpbmVhck1vZGUgPSBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdsaW5lYXInIHx8ICFoYXNIb3Jpem9udGFsU2xpZGVzKCkgfHwgIWhhc1ZlcnRpY2FsU2xpZGVzKCk7CgoJCXZhciB0cmlnZ2VyZWQgPSBmYWxzZTsKCgkJLy8gMS4gVXNlciBkZWZpbmVkIGtleSBiaW5kaW5ncwoJCWlmKCB0eXBlb2YgY29uZmlnLmtleWJvYXJkID09PSAnb2JqZWN0JyApIHsKCgkJCWZvcigga2V5IGluIGNvbmZpZy5rZXlib2FyZCApIHsKCgkJCQkvLyBDaGVjayBpZiB0aGlzIGJpbmRpbmcgbWF0Y2hlcyB0aGUgcHJlc3NlZCBrZXkKCQkJCWlmKCBwYXJzZUludCgga2V5LCAxMCApID09PSBrZXlDb2RlICkgewoKCQkJCQl2YXIgdmFsdWUgPSBjb25maWcua2V5Ym9hcmRbIGtleSBdOwoKCQkJCQkvLyBDYWxsYmFjayBmdW5jdGlvbgoJCQkJCWlmKCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJCXZhbHVlLmFwcGx5KCBudWxsLCBbIGV2ZW50IF0gKTsKCQkJCQl9CgkJCQkJLy8gU3RyaW5nIHNob3J0Y3V0cyB0byByZXZlYWwuanMgQVBJCgkJCQkJZWxzZSBpZiggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgUmV2ZWFsWyB2YWx1ZSBdID09PSAnZnVuY3Rpb24nICkgewoJCQkJCQlSZXZlYWxbIHZhbHVlIF0uY2FsbCgpOwoJCQkJCX0KCgkJCQkJdHJpZ2dlcmVkID0gdHJ1ZTsKCgkJCQl9CgoJCQl9CgoJCX0KCgkJLy8gMi4gUmVnaXN0ZXJlZCBjdXN0b20ga2V5IGJpbmRpbmdzCgkJaWYoIHRyaWdnZXJlZCA9PT0gZmFsc2UgKSB7CgoJCQlmb3IoIGtleSBpbiByZWdpc3RlcmVkS2V5QmluZGluZ3MgKSB7CgoJCQkJLy8gQ2hlY2sgaWYgdGhpcyBiaW5kaW5nIG1hdGNoZXMgdGhlIHByZXNzZWQga2V5CgkJCQlpZiggcGFyc2VJbnQoIGtleSwgMTAgKSA9PT0ga2V5Q29kZSApIHsKCgkJCQkJdmFyIGFjdGlvbiA9IHJlZ2lzdGVyZWRLZXlCaW5kaW5nc1sga2V5IF0uY2FsbGJhY2s7CgoJCQkJCS8vIENhbGxiYWNrIGZ1bmN0aW9uCgkJCQkJaWYoIHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicgKSB7CgkJCQkJCWFjdGlvbi5hcHBseSggbnVsbCwgWyBldmVudCBdICk7CgkJCQkJfQoJCQkJCS8vIFN0cmluZyBzaG9ydGN1dHMgdG8gcmV2ZWFsLmpzIEFQSQoJCQkJCWVsc2UgaWYoIHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBSZXZlYWxbIGFjdGlvbiBdID09PSAnZnVuY3Rpb24nICkgewoJCQkJCQlSZXZlYWxbIGFjdGlvbiBdLmNhbGwoKTsKCQkJCQl9CgoJCQkJCXRyaWdnZXJlZCA9IHRydWU7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIDMuIFN5c3RlbSBkZWZpbmVkIGtleSBiaW5kaW5ncwoJCWlmKCB0cmlnZ2VyZWQgPT09IGZhbHNlICkgewoKCQkJLy8gQXNzdW1lIHRydWUgYW5kIHRyeSB0byBwcm92ZSBmYWxzZQoJCQl0cmlnZ2VyZWQgPSB0cnVlOwoKCQkJLy8gUCwgUEFHRSBVUAoJCQlpZigga2V5Q29kZSA9PT0gODAgfHwga2V5Q29kZSA9PT0gMzMgKSB7CgkJCQluYXZpZ2F0ZVByZXYoKTsKCQkJfQoJCQkvLyBOLCBQQUdFIERPV04KCQkJZWxzZSBpZigga2V5Q29kZSA9PT0gNzggfHwga2V5Q29kZSA9PT0gMzQgKSB7CgkJCQluYXZpZ2F0ZU5leHQoKTsKCQkJfQoJCQkvLyBILCBMRUZUCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDcyIHx8IGtleUNvZGUgPT09IDM3ICkgewoJCQkJaWYoIGZpcnN0U2xpZGVTaG9ydGN1dCApIHsKCQkJCQlzbGlkZSggMCApOwoJCQkJfQoJCQkJZWxzZSBpZiggIWlzT3ZlcnZpZXcoKSAmJiB1c2VMaW5lYXJNb2RlICkgewoJCQkJCW5hdmlnYXRlUHJldigpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJbmF2aWdhdGVMZWZ0KCk7CgkJCQl9CgkJCX0KCQkJLy8gTCwgUklHSFQKCQkJZWxzZSBpZigga2V5Q29kZSA9PT0gNzYgfHwga2V5Q29kZSA9PT0gMzkgKSB7CgkJCQlpZiggbGFzdFNsaWRlU2hvcnRjdXQgKSB7CgkJCQkJc2xpZGUoIE51bWJlci5NQVhfVkFMVUUgKTsKCQkJCX0KCQkJCWVsc2UgaWYoICFpc092ZXJ2aWV3KCkgJiYgdXNlTGluZWFyTW9kZSApIHsKCQkJCQluYXZpZ2F0ZU5leHQoKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCW5hdmlnYXRlUmlnaHQoKTsKCQkJCX0KCQkJfQoJCQkvLyBLLCBVUAoJCQllbHNlIGlmKCBrZXlDb2RlID09PSA3NSB8fCBrZXlDb2RlID09PSAzOCApIHsKCQkJCWlmKCAhaXNPdmVydmlldygpICYmIHVzZUxpbmVhck1vZGUgKSB7CgkJCQkJbmF2aWdhdGVQcmV2KCk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQluYXZpZ2F0ZVVwKCk7CgkJCQl9CgkJCX0KCQkJLy8gSiwgRE9XTgoJCQllbHNlIGlmKCBrZXlDb2RlID09PSA3NCB8fCBrZXlDb2RlID09PSA0MCApIHsKCQkJCWlmKCAhaXNPdmVydmlldygpICYmIHVzZUxpbmVhck1vZGUgKSB7CgkJCQkJbmF2aWdhdGVOZXh0KCk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQluYXZpZ2F0ZURvd24oKTsKCQkJCX0KCQkJfQoJCQkvLyBIT01FCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDM2ICkgewoJCQkJc2xpZGUoIDAgKTsKCQkJfQoJCQkvLyBFTkQKCQkJZWxzZSBpZigga2V5Q29kZSA9PT0gMzUgKSB7CgkJCQlzbGlkZSggTnVtYmVyLk1BWF9WQUxVRSApOwoJCQl9CgkJCS8vIFNQQUNFCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDMyICkgewoJCQkJaWYoIGlzT3ZlcnZpZXcoKSApIHsKCQkJCQlkZWFjdGl2YXRlT3ZlcnZpZXcoKTsKCQkJCX0KCQkJCWlmKCBldmVudC5zaGlmdEtleSApIHsKCQkJCQluYXZpZ2F0ZVByZXYoKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCW5hdmlnYXRlTmV4dCgpOwoJCQkJfQoJCQl9CgkJCS8vIFRXTy1TUE9ULCBTRU1JQ09MT04sIEIsIFYsIFBFUklPRCwgTE9HSVRFQ0ggUFJFU0VOVEVSIFRPT0xTICJCTEFDSyBTQ1JFRU4iIEJVVFRPTgoJCQllbHNlIGlmKCBrZXlDb2RlID09PSA1OCB8fCBrZXlDb2RlID09PSA1OSB8fCBrZXlDb2RlID09PSA2NiB8fCBrZXlDb2RlID09PSA4NiB8fCBrZXlDb2RlID09PSAxOTAgfHwga2V5Q29kZSA9PT0gMTkxICkgewoJCQkJdG9nZ2xlUGF1c2UoKTsKCQkJfQoJCQkvLyBGCgkJCWVsc2UgaWYoIGtleUNvZGUgPT09IDcwICkgewoJCQkJZW50ZXJGdWxsc2NyZWVuKCk7CgkJCX0KCQkJLy8gQQoJCQllbHNlIGlmKCBrZXlDb2RlID09PSA2NSApIHsKCQkJCWlmICggY29uZmlnLmF1dG9TbGlkZVN0b3BwYWJsZSApIHsKCQkJCQl0b2dnbGVBdXRvU2xpZGUoIGF1dG9TbGlkZVdhc1BhdXNlZCApOwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJdHJpZ2dlcmVkID0gZmFsc2U7CgkJCX0KCgkJfQoKCQkvLyBJZiB0aGUgaW5wdXQgcmVzdWx0ZWQgaW4gYSB0cmlnZ2VyZWQgYWN0aW9uIHdlIHNob3VsZCBwcmV2ZW50CgkJLy8gdGhlIGJyb3dzZXJzIGRlZmF1bHQgYmVoYXZpb3IKCQlpZiggdHJpZ2dlcmVkICkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCQkvLyBFU0Mgb3IgTyBrZXkKCQllbHNlIGlmICggKCBrZXlDb2RlID09PSAyNyB8fCBrZXlDb2RlID09PSA3OSApICYmIGZlYXR1cmVzLnRyYW5zZm9ybXMzZCApIHsKCQkJaWYoIGRvbS5vdmVybGF5ICkgewoJCQkJY2xvc2VPdmVybGF5KCk7CgkJCX0KCQkJZWxzZSB7CgkJCQl0b2dnbGVPdmVydmlldygpOwoJCQl9CgoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCgkJLy8gSWYgYXV0by1zbGlkaW5nIGlzIGVuYWJsZWQgd2UgbmVlZCB0byBjdWUgdXAKCQkvLyBhbm90aGVyIHRpbWVvdXQKCQljdWVBdXRvU2xpZGUoKTsKCgl9CgoJLyoqCgkgKiBIYW5kbGVyIGZvciB0aGUgJ3RvdWNoc3RhcnQnIGV2ZW50LCBlbmFibGVzIHN1cHBvcnQgZm9yCgkgKiBzd2lwZSBhbmQgcGluY2ggZ2VzdHVyZXMuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uVG91Y2hTdGFydCggZXZlbnQgKSB7CgoJCWlmKCBpc1N3aXBlUHJldmVudGVkKCBldmVudC50YXJnZXQgKSApIHJldHVybiB0cnVlOwoKCQl0b3VjaC5zdGFydFggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7CgkJdG91Y2guc3RhcnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZOwoJCXRvdWNoLnN0YXJ0Q291bnQgPSBldmVudC50b3VjaGVzLmxlbmd0aDsKCgl9CgoJLyoqCgkgKiBIYW5kbGVyIGZvciB0aGUgJ3RvdWNobW92ZScgZXZlbnQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uVG91Y2hNb3ZlKCBldmVudCApIHsKCgkJaWYoIGlzU3dpcGVQcmV2ZW50ZWQoIGV2ZW50LnRhcmdldCApICkgcmV0dXJuIHRydWU7CgoJCS8vIEVhY2ggdG91Y2ggc2hvdWxkIG9ubHkgdHJpZ2dlciBvbmUgYWN0aW9uCgkJaWYoICF0b3VjaC5jYXB0dXJlZCApIHsKCQkJb25Vc2VySW5wdXQoIGV2ZW50ICk7CgoJCQl2YXIgY3VycmVudFggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7CgkJCXZhciBjdXJyZW50WSA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTsKCgkJCS8vIFRoZXJlIHdhcyBvbmx5IG9uZSB0b3VjaCBwb2ludCwgbG9vayBmb3IgYSBzd2lwZQoJCQlpZiggZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgJiYgdG91Y2guc3RhcnRDb3VudCAhPT0gMiApIHsKCgkJCQl2YXIgZGVsdGFYID0gY3VycmVudFggLSB0b3VjaC5zdGFydFgsCgkJCQkJZGVsdGFZID0gY3VycmVudFkgLSB0b3VjaC5zdGFydFk7CgoJCQkJaWYoIGRlbHRhWCA+IHRvdWNoLnRocmVzaG9sZCAmJiBNYXRoLmFicyggZGVsdGFYICkgPiBNYXRoLmFicyggZGVsdGFZICkgKSB7CgkJCQkJdG91Y2guY2FwdHVyZWQgPSB0cnVlOwoJCQkJCWlmKCBjb25maWcubmF2aWdhdGlvbk1vZGUgPT09ICdsaW5lYXInICkgewoJCQkJCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJCQkJCW5hdmlnYXRlTmV4dCgpOwoJCQkJCQl9CgkJCQkJCWVsc2UgewoJCQkJCQkJbmF2aWdhdGVQcmV2KCk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCW5hdmlnYXRlTGVmdCgpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UgaWYoIGRlbHRhWCA8IC10b3VjaC50aHJlc2hvbGQgJiYgTWF0aC5hYnMoIGRlbHRhWCApID4gTWF0aC5hYnMoIGRlbHRhWSApICkgewoJCQkJCXRvdWNoLmNhcHR1cmVkID0gdHJ1ZTsKCQkJCQlpZiggY29uZmlnLm5hdmlnYXRpb25Nb2RlID09PSAnbGluZWFyJyApIHsKCQkJCQkJaWYoIGNvbmZpZy5ydGwgKSB7CgkJCQkJCQluYXZpZ2F0ZVByZXYoKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCW5hdmlnYXRlTmV4dCgpOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQluYXZpZ2F0ZVJpZ2h0KCk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiggZGVsdGFZID4gdG91Y2gudGhyZXNob2xkICkgewoJCQkJCXRvdWNoLmNhcHR1cmVkID0gdHJ1ZTsKCQkJCQlpZiggY29uZmlnLm5hdmlnYXRpb25Nb2RlID09PSAnbGluZWFyJyApIHsKCQkJCQkJbmF2aWdhdGVQcmV2KCk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQluYXZpZ2F0ZVVwKCk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiggZGVsdGFZIDwgLXRvdWNoLnRocmVzaG9sZCApIHsKCQkJCQl0b3VjaC5jYXB0dXJlZCA9IHRydWU7CgkJCQkJaWYoIGNvbmZpZy5uYXZpZ2F0aW9uTW9kZSA9PT0gJ2xpbmVhcicgKSB7CgkJCQkJCW5hdmlnYXRlTmV4dCgpOwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJbmF2aWdhdGVEb3duKCk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIElmIHdlJ3JlIGVtYmVkZGVkLCBvbmx5IGJsb2NrIHRvdWNoIGV2ZW50cyBpZiB0aGV5IGhhdmUKCQkJCS8vIHRyaWdnZXJlZCBhbiBhY3Rpb24KCQkJCWlmKCBjb25maWcuZW1iZWRkZWQgKSB7CgkJCQkJaWYoIHRvdWNoLmNhcHR1cmVkIHx8IGlzVmVydGljYWxTbGlkZSggY3VycmVudFNsaWRlICkgKSB7CgkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJfQoJCQkJfQoJCQkJLy8gTm90IGVtYmVkZGVkPyBCbG9jayB0aGVtIGFsbCB0byBhdm9pZCBuZWVkbGVzcyB0b3NzaW5nCgkJCQkvLyBhcm91bmQgb2YgdGhlIHZpZXdwb3J0IGluIGlPUwoJCQkJZWxzZSB7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCX0KCgkJCX0KCQl9CgkJLy8gVGhlcmUncyBhIGJ1ZyB3aXRoIHN3aXBpbmcgb24gc29tZSBBbmRyb2lkIGRldmljZXMgdW5sZXNzCgkJLy8gdGhlIGRlZmF1bHQgYWN0aW9uIGlzIGFsd2F5cyBwcmV2ZW50ZWQKCQllbHNlIGlmKCBVQS5tYXRjaCggL2FuZHJvaWQvZ2kgKSApIHsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9CgoJfQoKCS8qKgoJICogSGFuZGxlciBmb3IgdGhlICd0b3VjaGVuZCcgZXZlbnQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uVG91Y2hFbmQoIGV2ZW50ICkgewoKCQl0b3VjaC5jYXB0dXJlZCA9IGZhbHNlOwoKCX0KCgkvKioKCSAqIENvbnZlcnQgcG9pbnRlciBkb3duIHRvIHRvdWNoIHN0YXJ0LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvblBvaW50ZXJEb3duKCBldmVudCApIHsKCgkJaWYoIGV2ZW50LnBvaW50ZXJUeXBlID09PSBldmVudC5NU1BPSU5URVJfVFlQRV9UT1VDSCB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gInRvdWNoIiApIHsKCQkJZXZlbnQudG91Y2hlcyA9IFt7IGNsaWVudFg6IGV2ZW50LmNsaWVudFgsIGNsaWVudFk6IGV2ZW50LmNsaWVudFkgfV07CgkJCW9uVG91Y2hTdGFydCggZXZlbnQgKTsKCQl9CgoJfQoKCS8qKgoJICogQ29udmVydCBwb2ludGVyIG1vdmUgdG8gdG91Y2ggbW92ZS4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25Qb2ludGVyTW92ZSggZXZlbnQgKSB7CgoJCWlmKCBldmVudC5wb2ludGVyVHlwZSA9PT0gZXZlbnQuTVNQT0lOVEVSX1RZUEVfVE9VQ0ggfHwgZXZlbnQucG9pbnRlclR5cGUgPT09ICJ0b3VjaCIgKSAgewoJCQlldmVudC50b3VjaGVzID0gW3sgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9XTsKCQkJb25Ub3VjaE1vdmUoIGV2ZW50ICk7CgkJfQoKCX0KCgkvKioKCSAqIENvbnZlcnQgcG9pbnRlciB1cCB0byB0b3VjaCBlbmQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uUG9pbnRlclVwKCBldmVudCApIHsKCgkJaWYoIGV2ZW50LnBvaW50ZXJUeXBlID09PSBldmVudC5NU1BPSU5URVJfVFlQRV9UT1VDSCB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gInRvdWNoIiApICB7CgkJCWV2ZW50LnRvdWNoZXMgPSBbeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH1dOwoJCQlvblRvdWNoRW5kKCBldmVudCApOwoJCX0KCgl9CgoJLyoqCgkgKiBIYW5kbGVzIG1vdXNlIHdoZWVsIHNjcm9sbGluZywgdGhyb3R0bGVkIHRvIGF2b2lkIHNraXBwaW5nCgkgKiBtdWx0aXBsZSBzbGlkZXMuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uRG9jdW1lbnRNb3VzZVNjcm9sbCggZXZlbnQgKSB7CgoJCWlmKCBEYXRlLm5vdygpIC0gbGFzdE1vdXNlV2hlZWxTdGVwID4gNjAwICkgewoKCQkJbGFzdE1vdXNlV2hlZWxTdGVwID0gRGF0ZS5ub3coKTsKCgkJCXZhciBkZWx0YSA9IGV2ZW50LmRldGFpbCB8fCAtZXZlbnQud2hlZWxEZWx0YTsKCQkJaWYoIGRlbHRhID4gMCApIHsKCQkJCW5hdmlnYXRlTmV4dCgpOwoJCQl9CgkJCWVsc2UgaWYoIGRlbHRhIDwgMCApIHsKCQkJCW5hdmlnYXRlUHJldigpOwoJCQl9CgoJCX0KCgl9CgoJLyoqCgkgKiBDbGlja2luZyBvbiB0aGUgcHJvZ3Jlc3MgYmFyIHJlc3VsdHMgaW4gYSBuYXZpZ2F0aW9uIHRvIHRoZQoJICogY2xvc2VzdCBhcHByb3hpbWF0ZSBob3Jpem9udGFsIHNsaWRlIHVzaW5nIHRoaXMgZXF1YXRpb246CgkgKgoJICogKCBjbGlja1ggLyBwcmVzZW50YXRpb25XaWR0aCApICogbnVtYmVyT2ZTbGlkZXMKCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQKCSAqLwoJZnVuY3Rpb24gb25Qcm9ncmVzc0NsaWNrZWQoIGV2ZW50ICkgewoKCQlvblVzZXJJbnB1dCggZXZlbnQgKTsKCgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCgkJdmFyIHNsaWRlc1RvdGFsID0gdG9BcnJheSggZG9tLndyYXBwZXIucXVlcnlTZWxlY3RvckFsbCggSE9SSVpPTlRBTF9TTElERVNfU0VMRUNUT1IgKSApLmxlbmd0aDsKCQl2YXIgc2xpZGVJbmRleCA9IE1hdGguZmxvb3IoICggZXZlbnQuY2xpZW50WCAvIGRvbS53cmFwcGVyLm9mZnNldFdpZHRoICkgKiBzbGlkZXNUb3RhbCApOwoKCQlpZiggY29uZmlnLnJ0bCApIHsKCQkJc2xpZGVJbmRleCA9IHNsaWRlc1RvdGFsIC0gc2xpZGVJbmRleDsKCQl9CgoJCXNsaWRlKCBzbGlkZUluZGV4ICk7CgoJfQoKCS8qKgoJICogRXZlbnQgaGFuZGxlciBmb3IgbmF2aWdhdGlvbiBjb250cm9sIGJ1dHRvbnMuCgkgKi8KCWZ1bmN0aW9uIG9uTmF2aWdhdGVMZWZ0Q2xpY2tlZCggZXZlbnQgKSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IG9uVXNlcklucHV0KCk7IGNvbmZpZy5uYXZpZ2F0aW9uTW9kZSA9PT0gJ2xpbmVhcicgPyBuYXZpZ2F0ZVByZXYoKSA6IG5hdmlnYXRlTGVmdCgpOyB9CglmdW5jdGlvbiBvbk5hdmlnYXRlUmlnaHRDbGlja2VkKCBldmVudCApIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgb25Vc2VySW5wdXQoKTsgY29uZmlnLm5hdmlnYXRpb25Nb2RlID09PSAnbGluZWFyJyA/IG5hdmlnYXRlTmV4dCgpIDogbmF2aWdhdGVSaWdodCgpOyB9CglmdW5jdGlvbiBvbk5hdmlnYXRlVXBDbGlja2VkKCBldmVudCApIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgb25Vc2VySW5wdXQoKTsgbmF2aWdhdGVVcCgpOyB9CglmdW5jdGlvbiBvbk5hdmlnYXRlRG93bkNsaWNrZWQoIGV2ZW50ICkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBvblVzZXJJbnB1dCgpOyBuYXZpZ2F0ZURvd24oKTsgfQoJZnVuY3Rpb24gb25OYXZpZ2F0ZVByZXZDbGlja2VkKCBldmVudCApIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgb25Vc2VySW5wdXQoKTsgbmF2aWdhdGVQcmV2KCk7IH0KCWZ1bmN0aW9uIG9uTmF2aWdhdGVOZXh0Q2xpY2tlZCggZXZlbnQgKSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IG9uVXNlcklucHV0KCk7IG5hdmlnYXRlTmV4dCgpOyB9CgoJLyoqCgkgKiBIYW5kbGVyIGZvciB0aGUgd2luZG93IGxldmVsICdoYXNoY2hhbmdlJyBldmVudC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gW2V2ZW50XQoJICovCglmdW5jdGlvbiBvbldpbmRvd0hhc2hDaGFuZ2UoIGV2ZW50ICkgewoKCQlyZWFkVVJMKCk7CgoJfQoKCS8qKgoJICogSGFuZGxlciBmb3IgdGhlIHdpbmRvdyBsZXZlbCAncmVzaXplJyBldmVudC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gW2V2ZW50XQoJICovCglmdW5jdGlvbiBvbldpbmRvd1Jlc2l6ZSggZXZlbnQgKSB7CgoJCWxheW91dCgpOwoKCX0KCgkvKioKCSAqIEhhbmRsZSBmb3IgdGhlIHdpbmRvdyBsZXZlbCAndmlzaWJpbGl0eWNoYW5nZScgZXZlbnQuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IFtldmVudF0KCSAqLwoJZnVuY3Rpb24gb25QYWdlVmlzaWJpbGl0eUNoYW5nZSggZXZlbnQgKSB7CgoJCXZhciBpc0hpZGRlbiA9ICBkb2N1bWVudC53ZWJraXRIaWRkZW4gfHwKCQkJCQkJZG9jdW1lbnQubXNIaWRkZW4gfHwKCQkJCQkJZG9jdW1lbnQuaGlkZGVuOwoKCQkvLyBJZiwgYWZ0ZXIgY2xpY2tpbmcgYSBsaW5rIG9yIHNpbWlsYXIgYW5kIHdlJ3JlIGNvbWluZyBiYWNrLAoJCS8vIGZvY3VzIHRoZSBkb2N1bWVudC5ib2R5IHRvIGVuc3VyZSB3ZSBjYW4gdXNlIGtleWJvYXJkIHNob3J0Y3V0cwoJCWlmKCBpc0hpZGRlbiA9PT0gZmFsc2UgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSApIHsKCQkJLy8gTm90IGFsbCBlbGVtZW50cyBzdXBwb3J0IC5ibHVyKCkgLSBTVkdzIGFtb25nIHRoZW0uCgkJCWlmKCB0eXBlb2YgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyID09PSAnZnVuY3Rpb24nICkgewoJCQkJZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7CgkJCX0KCQkJZG9jdW1lbnQuYm9keS5mb2N1cygpOwoJCX0KCgl9CgoJLyoqCgkgKiBJbnZva2VkIHdoZW4gYSBzbGlkZSBpcyBhbmQgd2UncmUgaW4gdGhlIG92ZXJ2aWV3LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBldmVudAoJICovCglmdW5jdGlvbiBvbk92ZXJ2aWV3U2xpZGVDbGlja2VkKCBldmVudCApIHsKCgkJLy8gVE9ETyBUaGVyZSdzIGEgYnVnIGhlcmUgd2hlcmUgdGhlIGV2ZW50IGxpc3RlbmVycyBhcmUgbm90CgkJLy8gcmVtb3ZlZCBhZnRlciBkZWFjdGl2YXRpbmcgdGhlIG92ZXJ2aWV3LgoJCWlmKCBldmVudHNBcmVCb3VuZCAmJiBpc092ZXJ2aWV3KCkgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQl2YXIgZWxlbWVudCA9IGV2ZW50LnRhcmdldDsKCgkJCXdoaWxlKCBlbGVtZW50ICYmICFlbGVtZW50Lm5vZGVOYW1lLm1hdGNoKCAvc2VjdGlvbi9naSApICkgewoJCQkJZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKCQkJfQoKCQkJaWYoIGVsZW1lbnQgJiYgIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnZGlzYWJsZWQnICkgKSB7CgoJCQkJZGVhY3RpdmF0ZU92ZXJ2aWV3KCk7CgoJCQkJaWYoIGVsZW1lbnQubm9kZU5hbWUubWF0Y2goIC9zZWN0aW9uL2dpICkgKSB7CgkJCQkJdmFyIGggPSBwYXJzZUludCggZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLWluZGV4LWgnICksIDEwICksCgkJCQkJCXYgPSBwYXJzZUludCggZWxlbWVudC5nZXRBdHRyaWJ1dGUoICdkYXRhLWluZGV4LXYnICksIDEwICk7CgoJCQkJCXNsaWRlKCBoLCB2ICk7CgkJCQl9CgoJCQl9CgkJfQoKCX0KCgkvKioKCSAqIEhhbmRsZXMgY2xpY2tzIG9uIGxpbmtzIHRoYXQgYXJlIHNldCB0byBwcmV2aWV3IGluIHRoZQoJICogaWZyYW1lIG92ZXJsYXkuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IGV2ZW50CgkgKi8KCWZ1bmN0aW9uIG9uUHJldmlld0xpbmtDbGlja2VkKCBldmVudCApIHsKCgkJaWYoIGV2ZW50LmN1cnJlbnRUYXJnZXQgJiYgZXZlbnQuY3VycmVudFRhcmdldC5oYXNBdHRyaWJ1dGUoICdocmVmJyApICkgewoJCQl2YXIgdXJsID0gZXZlbnQuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoICdocmVmJyApOwoJCQlpZiggdXJsICkgewoJCQkJc2hvd1ByZXZpZXcoIHVybCApOwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX0KCgl9CgoJLyoqCgkgKiBIYW5kbGVzIGNsaWNrIG9uIHRoZSBhdXRvLXNsaWRpbmcgY29udHJvbHMgZWxlbWVudC4KCSAqCgkgKiBAcGFyYW0ge29iamVjdH0gW2V2ZW50XQoJICovCglmdW5jdGlvbiBvbkF1dG9TbGlkZVBsYXllckNsaWNrKCBldmVudCApIHsKCgkJLy8gUmVwbGF5CgkJaWYoIFJldmVhbC5pc0xhc3RTbGlkZSgpICYmIGNvbmZpZy5sb29wID09PSBmYWxzZSApIHsKCQkJc2xpZGUoIDAsIDAgKTsKCQkJcmVzdW1lQXV0b1NsaWRlKCk7CgkJfQoJCS8vIFJlc3VtZQoJCWVsc2UgaWYoIGF1dG9TbGlkZVBhdXNlZCApIHsKCQkJcmVzdW1lQXV0b1NsaWRlKCk7CgkJfQoJCS8vIFBhdXNlCgkJZWxzZSB7CgkJCXBhdXNlQXV0b1NsaWRlKCk7CgkJfQoKCX0KCgoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBMQVlCQUNLIENPTVBPTkVOVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKCgkvKioKCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgcGxheWJhY2sgY29tcG9uZW50LCB3aGljaCBkaXNwbGF5cwoJICogcGxheS9wYXVzZS9wcm9ncmVzcyBjb250cm9scy4KCSAqCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgVGhlIGNvbXBvbmVudCB3aWxsIGFwcGVuZAoJICogaXRzZWxmIHRvIHRoaXMKCSAqIEBwYXJhbSB7ZnVuY3Rpb259IHByb2dyZXNzQ2hlY2sgQSBtZXRob2Qgd2hpY2ggd2lsbCBiZQoJICogY2FsbGVkIGZyZXF1ZW50bHkgdG8gZ2V0IHRoZSBjdXJyZW50IHByb2dyZXNzIG9uIGEgcmFuZ2UKCSAqIG9mIDAtMQoJICovCglmdW5jdGlvbiBQbGF5YmFjayggY29udGFpbmVyLCBwcm9ncmVzc0NoZWNrICkgewoKCQkvLyBDb3NtZXRpY3MKCQl0aGlzLmRpYW1ldGVyID0gMTAwOwoJCXRoaXMuZGlhbWV0ZXIyID0gdGhpcy5kaWFtZXRlci8yOwoJCXRoaXMudGhpY2tuZXNzID0gNjsKCgkJLy8gRmxhZ3MgaWYgd2UgYXJlIGN1cnJlbnRseSBwbGF5aW5nCgkJdGhpcy5wbGF5aW5nID0gZmFsc2U7CgoJCS8vIEN1cnJlbnQgcHJvZ3Jlc3Mgb24gYSAwLTEgcmFuZ2UKCQl0aGlzLnByb2dyZXNzID0gMDsKCgkJLy8gVXNlZCB0byBsb29wIHRoZSBhbmltYXRpb24gc21vb3RobHkKCQl0aGlzLnByb2dyZXNzT2Zmc2V0ID0gMTsKCgkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CgkJdGhpcy5wcm9ncmVzc0NoZWNrID0gcHJvZ3Jlc3NDaGVjazsKCgkJdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnY2FudmFzJyApOwoJCXRoaXMuY2FudmFzLmNsYXNzTmFtZSA9ICdwbGF5YmFjayc7CgkJdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmRpYW1ldGVyOwoJCXRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuZGlhbWV0ZXI7CgkJdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSB0aGlzLmRpYW1ldGVyMiArICdweCc7CgkJdGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kaWFtZXRlcjIgKyAncHgnOwoJCXRoaXMuY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoICcyZCcgKTsKCgkJdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoIHRoaXMuY2FudmFzICk7CgoJCXRoaXMucmVuZGVyKCk7CgoJfQoKCS8qKgoJICogQHBhcmFtIHZhbHVlCgkgKi8KCVBsYXliYWNrLnByb3RvdHlwZS5zZXRQbGF5aW5nID0gZnVuY3Rpb24oIHZhbHVlICkgewoKCQl2YXIgd2FzUGxheWluZyA9IHRoaXMucGxheWluZzsKCgkJdGhpcy5wbGF5aW5nID0gdmFsdWU7CgoJCS8vIFN0YXJ0IHJlcGFpbnRpbmcgaWYgd2Ugd2VyZW4ndCBhbHJlYWR5CgkJaWYoICF3YXNQbGF5aW5nICYmIHRoaXMucGxheWluZyApIHsKCQkJdGhpcy5hbmltYXRlKCk7CgkJfQoJCWVsc2UgewoJCQl0aGlzLnJlbmRlcigpOwoJCX0KCgl9OwoKCVBsYXliYWNrLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24oKSB7CgoJCXZhciBwcm9ncmVzc0JlZm9yZSA9IHRoaXMucHJvZ3Jlc3M7CgoJCXRoaXMucHJvZ3Jlc3MgPSB0aGlzLnByb2dyZXNzQ2hlY2soKTsKCgkJLy8gV2hlbiB3ZSBsb29wLCBvZmZzZXQgdGhlIHByb2dyZXNzIHNvIHRoYXQgaXQgZWFzZXMKCQkvLyBzbW9vdGhseSByYXRoZXIgdGhhbiBpbW1lZGlhdGVseSByZXNldHRpbmcKCQlpZiggcHJvZ3Jlc3NCZWZvcmUgPiAwLjggJiYgdGhpcy5wcm9ncmVzcyA8IDAuMiApIHsKCQkJdGhpcy5wcm9ncmVzc09mZnNldCA9IHRoaXMucHJvZ3Jlc3M7CgkJfQoKCQl0aGlzLnJlbmRlcigpOwoKCQlpZiggdGhpcy5wbGF5aW5nICkgewoJCQlmZWF0dXJlcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVNZXRob2QuY2FsbCggd2luZG93LCB0aGlzLmFuaW1hdGUuYmluZCggdGhpcyApICk7CgkJfQoKCX07CgoJLyoqCgkgKiBSZW5kZXJzIHRoZSBjdXJyZW50IHByb2dyZXNzIGFuZCBwbGF5YmFjayBzdGF0ZS4KCSAqLwoJUGxheWJhY2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCkgewoKCQl2YXIgcHJvZ3Jlc3MgPSB0aGlzLnBsYXlpbmcgPyB0aGlzLnByb2dyZXNzIDogMCwKCQkJcmFkaXVzID0gKCB0aGlzLmRpYW1ldGVyMiApIC0gdGhpcy50aGlja25lc3MsCgkJCXggPSB0aGlzLmRpYW1ldGVyMiwKCQkJeSA9IHRoaXMuZGlhbWV0ZXIyLAoJCQlpY29uU2l6ZSA9IDI4OwoKCQkvLyBFYXNlIHRvd2FyZHMgMQoJCXRoaXMucHJvZ3Jlc3NPZmZzZXQgKz0gKCAxIC0gdGhpcy5wcm9ncmVzc09mZnNldCApICogMC4xOwoKCQl2YXIgZW5kQW5nbGUgPSAoIC0gTWF0aC5QSSAvIDIgKSArICggcHJvZ3Jlc3MgKiAoIE1hdGguUEkgKiAyICkgKTsKCQl2YXIgc3RhcnRBbmdsZSA9ICggLSBNYXRoLlBJIC8gMiApICsgKCB0aGlzLnByb2dyZXNzT2Zmc2V0ICogKCBNYXRoLlBJICogMiApICk7CgoJCXRoaXMuY29udGV4dC5zYXZlKCk7CgkJdGhpcy5jb250ZXh0LmNsZWFyUmVjdCggMCwgMCwgdGhpcy5kaWFtZXRlciwgdGhpcy5kaWFtZXRlciApOwoKCQkvLyBTb2xpZCBiYWNrZ3JvdW5kIGNvbG9yCgkJdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpOwoJCXRoaXMuY29udGV4dC5hcmMoIHgsIHksIHJhZGl1cyArIDQsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSApOwoJCXRoaXMuY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSggMCwgMCwgMCwgMC40ICknOwoJCXRoaXMuY29udGV4dC5maWxsKCk7CgoJCS8vIERyYXcgcHJvZ3Jlc3MgdHJhY2sKCQl0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCk7CgkJdGhpcy5jb250ZXh0LmFyYyggeCwgeSwgcmFkaXVzLCAwLCBNYXRoLlBJICogMiwgZmFsc2UgKTsKCQl0aGlzLmNvbnRleHQubGluZVdpZHRoID0gdGhpcy50aGlja25lc3M7CgkJdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ3JnYmEoIDI1NSwgMjU1LCAyNTUsIDAuMiApJzsKCQl0aGlzLmNvbnRleHQuc3Ryb2tlKCk7CgoJCWlmKCB0aGlzLnBsYXlpbmcgKSB7CgkJCS8vIERyYXcgcHJvZ3Jlc3Mgb24gdG9wIG9mIHRyYWNrCgkJCXRoaXMuY29udGV4dC5iZWdpblBhdGgoKTsKCQkJdGhpcy5jb250ZXh0LmFyYyggeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgZmFsc2UgKTsKCQkJdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IHRoaXMudGhpY2tuZXNzOwoJCQl0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI2ZmZic7CgkJCXRoaXMuY29udGV4dC5zdHJva2UoKTsKCQl9CgoJCXRoaXMuY29udGV4dC50cmFuc2xhdGUoIHggLSAoIGljb25TaXplIC8gMiApLCB5IC0gKCBpY29uU2l6ZSAvIDIgKSApOwoKCQkvLyBEcmF3IHBsYXkvcGF1c2UgaWNvbnMKCQlpZiggdGhpcy5wbGF5aW5nICkgewoJCQl0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gJyNmZmYnOwoJCQl0aGlzLmNvbnRleHQuZmlsbFJlY3QoIDAsIDAsIGljb25TaXplIC8gMiAtIDQsIGljb25TaXplICk7CgkJCXRoaXMuY29udGV4dC5maWxsUmVjdCggaWNvblNpemUgLyAyICsgNCwgMCwgaWNvblNpemUgLyAyIC0gNCwgaWNvblNpemUgKTsKCQl9CgkJZWxzZSB7CgkJCXRoaXMuY29udGV4dC5iZWdpblBhdGgoKTsKCQkJdGhpcy5jb250ZXh0LnRyYW5zbGF0ZSggNCwgMCApOwoJCQl0aGlzLmNvbnRleHQubW92ZVRvKCAwLCAwICk7CgkJCXRoaXMuY29udGV4dC5saW5lVG8oIGljb25TaXplIC0gNCwgaWNvblNpemUgLyAyICk7CgkJCXRoaXMuY29udGV4dC5saW5lVG8oIDAsIGljb25TaXplICk7CgkJCXRoaXMuY29udGV4dC5maWxsU3R5bGUgPSAnI2ZmZic7CgkJCXRoaXMuY29udGV4dC5maWxsKCk7CgkJfQoKCQl0aGlzLmNvbnRleHQucmVzdG9yZSgpOwoKCX07CgoJUGxheWJhY2sucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oIHR5cGUsIGxpc3RlbmVyICkgewoJCXRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSApOwoJfTsKCglQbGF5YmFjay5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24oIHR5cGUsIGxpc3RlbmVyICkgewoJCXRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSApOwoJfTsKCglQbGF5YmFjay5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewoKCQl0aGlzLnBsYXlpbmcgPSBmYWxzZTsKCgkJaWYoIHRoaXMuY2FudmFzLnBhcmVudE5vZGUgKSB7CgkJCXRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKCB0aGlzLmNhbnZhcyApOwoJCX0KCgl9OwoKCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgoKCVJldmVhbCA9IHsKCQlWRVJTSU9OOiBWRVJTSU9OLAoKCQlpbml0aWFsaXplOiBpbml0aWFsaXplLAoJCWNvbmZpZ3VyZTogY29uZmlndXJlLAoKCQlzeW5jOiBzeW5jLAoJCXN5bmNTbGlkZTogc3luY1NsaWRlLAoJCXN5bmNGcmFnbWVudHM6IHN5bmNGcmFnbWVudHMsCgoJCS8vIE5hdmlnYXRpb24gbWV0aG9kcwoJCXNsaWRlOiBzbGlkZSwKCQlsZWZ0OiBuYXZpZ2F0ZUxlZnQsCgkJcmlnaHQ6IG5hdmlnYXRlUmlnaHQsCgkJdXA6IG5hdmlnYXRlVXAsCgkJZG93bjogbmF2aWdhdGVEb3duLAoJCXByZXY6IG5hdmlnYXRlUHJldiwKCQluZXh0OiBuYXZpZ2F0ZU5leHQsCgoJCS8vIEZyYWdtZW50IG1ldGhvZHMKCQluYXZpZ2F0ZUZyYWdtZW50OiBuYXZpZ2F0ZUZyYWdtZW50LAoJCXByZXZGcmFnbWVudDogcHJldmlvdXNGcmFnbWVudCwKCQluZXh0RnJhZ21lbnQ6IG5leHRGcmFnbWVudCwKCgkJLy8gRGVwcmVjYXRlZCBhbGlhc2VzCgkJbmF2aWdhdGVUbzogc2xpZGUsCgkJbmF2aWdhdGVMZWZ0OiBuYXZpZ2F0ZUxlZnQsCgkJbmF2aWdhdGVSaWdodDogbmF2aWdhdGVSaWdodCwKCQluYXZpZ2F0ZVVwOiBuYXZpZ2F0ZVVwLAoJCW5hdmlnYXRlRG93bjogbmF2aWdhdGVEb3duLAoJCW5hdmlnYXRlUHJldjogbmF2aWdhdGVQcmV2LAoJCW5hdmlnYXRlTmV4dDogbmF2aWdhdGVOZXh0LAoKCQkvLyBGb3JjZXMgYW4gdXBkYXRlIGluIHNsaWRlIGxheW91dAoJCWxheW91dDogbGF5b3V0LAoKCQkvLyBSYW5kb21pemVzIHRoZSBvcmRlciBvZiBzbGlkZXMKCQlzaHVmZmxlOiBzaHVmZmxlLAoKCQkvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBhdmFpbGFibGUgcm91dGVzIGFzIGJvb2xlYW5zIChsZWZ0L3JpZ2h0L3RvcC9ib3R0b20pCgkJYXZhaWxhYmxlUm91dGVzOiBhdmFpbGFibGVSb3V0ZXMsCgoJCS8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGF2YWlsYWJsZSBmcmFnbWVudHMgYXMgYm9vbGVhbnMgKHByZXYvbmV4dCkKCQlhdmFpbGFibGVGcmFnbWVudHM6IGF2YWlsYWJsZUZyYWdtZW50cywKCgkJLy8gVG9nZ2xlcyBhIGhlbHAgb3ZlcmxheSB3aXRoIGtleWJvYXJkIHNob3J0Y3V0cwoJCXRvZ2dsZUhlbHA6IHRvZ2dsZUhlbHAsCgoJCS8vIFRvZ2dsZXMgdGhlIG92ZXJ2aWV3IG1vZGUgb24vb2ZmCgkJdG9nZ2xlT3ZlcnZpZXc6IHRvZ2dsZU92ZXJ2aWV3LAoKCQkvLyBUb2dnbGVzIHRoZSAiYmxhY2sgc2NyZWVuIiBtb2RlIG9uL29mZgoJCXRvZ2dsZVBhdXNlOiB0b2dnbGVQYXVzZSwKCgkJLy8gVG9nZ2xlcyB0aGUgYXV0byBzbGlkZSBtb2RlIG9uL29mZgoJCXRvZ2dsZUF1dG9TbGlkZTogdG9nZ2xlQXV0b1NsaWRlLAoKCQkvLyBTdGF0ZSBjaGVja3MKCQlpc092ZXJ2aWV3OiBpc092ZXJ2aWV3LAoJCWlzUGF1c2VkOiBpc1BhdXNlZCwKCQlpc0F1dG9TbGlkaW5nOiBpc0F1dG9TbGlkaW5nLAoJCWlzU3BlYWtlck5vdGVzOiBpc1NwZWFrZXJOb3RlcywKCgkJLy8gU2xpZGUgcHJlbG9hZGluZwoJCWxvYWRTbGlkZTogbG9hZFNsaWRlLAoJCXVubG9hZFNsaWRlOiB1bmxvYWRTbGlkZSwKCgkJLy8gQWRkcyBvciByZW1vdmVzIGFsbCBpbnRlcm5hbCBldmVudCBsaXN0ZW5lcnMgKHN1Y2ggYXMga2V5Ym9hcmQpCgkJYWRkRXZlbnRMaXN0ZW5lcnM6IGFkZEV2ZW50TGlzdGVuZXJzLAoJCXJlbW92ZUV2ZW50TGlzdGVuZXJzOiByZW1vdmVFdmVudExpc3RlbmVycywKCgkJLy8gRmFjaWxpdHkgZm9yIHBlcnNpc3RpbmcgYW5kIHJlc3RvcmluZyB0aGUgcHJlc2VudGF0aW9uIHN0YXRlCgkJZ2V0U3RhdGU6IGdldFN0YXRlLAoJCXNldFN0YXRlOiBzZXRTdGF0ZSwKCgkJLy8gUHJlc2VudGF0aW9uIHByb2dyZXNzCgkJZ2V0U2xpZGVQYXN0Q291bnQ6IGdldFNsaWRlUGFzdENvdW50LAoKCQkvLyBQcmVzZW50YXRpb24gcHJvZ3Jlc3Mgb24gcmFuZ2Ugb2YgMC0xCgkJZ2V0UHJvZ3Jlc3M6IGdldFByb2dyZXNzLAoKCQkvLyBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBjdXJyZW50LCBvciBzcGVjaWZpZWQsIHNsaWRlCgkJZ2V0SW5kaWNlczogZ2V0SW5kaWNlcywKCgkJLy8gUmV0dXJucyBhbiBBcnJheSBvZiBhbGwgc2xpZGVzCgkJZ2V0U2xpZGVzOiBnZXRTbGlkZXMsCgoJCS8vIFJldHVybnMgYW4gQXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZXMgb24KCQkvLyB0aGUgc2xpZGVzCgkJZ2V0U2xpZGVzQXR0cmlidXRlczogZ2V0U2xpZGVzQXR0cmlidXRlcywKCgkJLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNsaWRlcwoJCWdldFRvdGFsU2xpZGVzOiBnZXRUb3RhbFNsaWRlcywKCgkJLy8gUmV0dXJucyB0aGUgc2xpZGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4CgkJZ2V0U2xpZGU6IGdldFNsaWRlLAoKCQkvLyBSZXR1cm5zIHRoZSBzbGlkZSBiYWNrZ3JvdW5kIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAoJCWdldFNsaWRlQmFja2dyb3VuZDogZ2V0U2xpZGVCYWNrZ3JvdW5kLAoKCQkvLyBSZXR1cm5zIHRoZSBzcGVha2VyIG5vdGVzIHN0cmluZyBmb3IgYSBzbGlkZSwgb3IgbnVsbAoJCWdldFNsaWRlTm90ZXM6IGdldFNsaWRlTm90ZXMsCgoJCS8vIFJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgaG9yaXpvbnRhbC92ZXJ0aWNhbCBzbGlkZXMgaW4gdGhlIGRlY2sKCQlnZXRIb3Jpem9udGFsU2xpZGVzOiBnZXRIb3Jpem9udGFsU2xpZGVzLAoJCWdldFZlcnRpY2FsU2xpZGVzOiBnZXRWZXJ0aWNhbFNsaWRlcywKCgkJLy8gQ2hlY2tzIGlmIHRoZSBwcmVzZW50YXRpb24gY29udGFpbnMgdHdvIG9yIG1vcmUKCQkvLyBob3Jpem9udGFsL3ZlcnRpY2FsIHNsaWRlcwoJCWhhc0hvcml6b250YWxTbGlkZXM6IGhhc0hvcml6b250YWxTbGlkZXMsCgkJaGFzVmVydGljYWxTbGlkZXM6IGhhc1ZlcnRpY2FsU2xpZGVzLAoKCQkvLyBSZXR1cm5zIHRoZSBwcmV2aW91cyBzbGlkZSBlbGVtZW50LCBtYXkgYmUgbnVsbAoJCWdldFByZXZpb3VzU2xpZGU6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gcHJldmlvdXNTbGlkZTsKCQl9LAoKCQkvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHNsaWRlIGVsZW1lbnQKCQlnZXRDdXJyZW50U2xpZGU6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gY3VycmVudFNsaWRlOwoJCX0sCgoJCS8vIFJldHVybnMgdGhlIGN1cnJlbnQgc2NhbGUgb2YgdGhlIHByZXNlbnRhdGlvbiBjb250ZW50CgkJZ2V0U2NhbGU6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gc2NhbGU7CgkJfSwKCgkJLy8gUmV0dXJucyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9iamVjdAoJCWdldENvbmZpZzogZnVuY3Rpb24oKSB7CgkJCXJldHVybiBjb25maWc7CgkJfSwKCgkJLy8gSGVscGVyIG1ldGhvZCwgcmV0cmlldmVzIHF1ZXJ5IHN0cmluZyBhcyBhIGtleS92YWx1ZSBoYXNoCgkJZ2V0UXVlcnlIYXNoOiBmdW5jdGlvbigpIHsKCQkJdmFyIHF1ZXJ5ID0ge307CgoJCQlsb2NhdGlvbi5zZWFyY2gucmVwbGFjZSggL1tBLVowLTldKz89KFtcd1wuJS1dKikvZ2ksIGZ1bmN0aW9uKGEpIHsKCQkJCXF1ZXJ5WyBhLnNwbGl0KCAnPScgKS5zaGlmdCgpIF0gPSBhLnNwbGl0KCAnPScgKS5wb3AoKTsKCQkJfSApOwoKCQkJLy8gQmFzaWMgZGVzZXJpYWxpemF0aW9uCgkJCWZvciggdmFyIGkgaW4gcXVlcnkgKSB7CgkJCQl2YXIgdmFsdWUgPSBxdWVyeVsgaSBdOwoKCQkJCXF1ZXJ5WyBpIF0gPSBkZXNlcmlhbGl6ZSggdW5lc2NhcGUoIHZhbHVlICkgKTsKCQkJfQoKCQkJcmV0dXJuIHF1ZXJ5OwoJCX0sCgoJCS8vIFJldHVybnMgdGhlIHRvcC1sZXZlbCBET00gZWxlbWVudAoJCWdldFJldmVhbEVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gZG9tLndyYXBwZXIgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy5yZXZlYWwnICk7CgkJfSwKCgkJLy8gUmV0dXJucyBhIGhhc2ggd2l0aCBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zCgkJZ2V0UGx1Z2luczogZnVuY3Rpb24oKSB7CgkJCXJldHVybiBwbHVnaW5zOwoJCX0sCgoJCS8vIFJldHVybnMgdHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgb24gdGhlIGZpcnN0IHNsaWRlCgkJaXNGaXJzdFNsaWRlOiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuICggaW5kZXhoID09PSAwICYmIGluZGV4diA9PT0gMCApOwoJCX0sCgoJCS8vIFJldHVybnMgdHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgb24gdGhlIGxhc3Qgc2xpZGUKCQlpc0xhc3RTbGlkZTogZnVuY3Rpb24oKSB7CgkJCWlmKCBjdXJyZW50U2xpZGUgKSB7CgkJCQkvLyBEb2VzIHRoaXMgc2xpZGUgaGF2ZSBhIG5leHQgc2libGluZz8KCQkJCWlmKCBjdXJyZW50U2xpZGUubmV4dEVsZW1lbnRTaWJsaW5nICkgcmV0dXJuIGZhbHNlOwoKCQkJCS8vIElmIGl0J3MgdmVydGljYWwsIGRvZXMgaXRzIHBhcmVudCBoYXZlIGEgbmV4dCBzaWJsaW5nPwoJCQkJaWYoIGlzVmVydGljYWxTbGlkZSggY3VycmVudFNsaWRlICkgJiYgY3VycmVudFNsaWRlLnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nICkgcmV0dXJuIGZhbHNlOwoKCQkJCXJldHVybiB0cnVlOwoJCQl9CgoJCQlyZXR1cm4gZmFsc2U7CgkJfSwKCgkJLy8gUmV0dXJucyB0cnVlIGlmIHdlJ3JlIG9uIHRoZSBsYXN0IHNsaWRlIGluIHRoZSBjdXJyZW50CgkJLy8gdmVydGljYWwgc3RhY2sKCQlpc0xhc3RWZXJ0aWNhbFNsaWRlOiBmdW5jdGlvbigpIHsKCQkJaWYoIGN1cnJlbnRTbGlkZSAmJiBpc1ZlcnRpY2FsU2xpZGUoIGN1cnJlbnRTbGlkZSApICkgewoJCQkJLy8gRG9lcyB0aGlzIHNsaWRlIGhhdmUgYSBuZXh0IHNpYmxpbmc/CgkJCQlpZiggY3VycmVudFNsaWRlLm5leHRFbGVtZW50U2libGluZyApIHJldHVybiBmYWxzZTsKCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgoJCS8vIENoZWNrcyBpZiByZXZlYWwuanMgaGFzIGJlZW4gbG9hZGVkIGFuZCBpcyByZWFkeSBmb3IgdXNlCgkJaXNSZWFkeTogZnVuY3Rpb24oKSB7CgkJCXJldHVybiBsb2FkZWQ7CgkJfSwKCgkJLy8gRm9yd2FyZCBldmVudCBiaW5kaW5nIHRvIHRoZSByZXZlYWwgRE9NIGVsZW1lbnQKCQlhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiggdHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUgKSB7CgkJCWlmKCAnYWRkRXZlbnRMaXN0ZW5lcicgaW4gd2luZG93ICkgewoJCQkJUmV2ZWFsLmdldFJldmVhbEVsZW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSApOwoJCQl9CgkJfSwKCQlyZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiggdHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUgKSB7CgkJCWlmKCAnYWRkRXZlbnRMaXN0ZW5lcicgaW4gd2luZG93ICkgewoJCQkJUmV2ZWFsLmdldFJldmVhbEVsZW1lbnQoKS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSApOwoJCQl9CgkJfSwKCgkJLy8gQWRkcy9yZW1vdmVzIGEgY3VzdG9tIGtleSBiaW5kaW5nCgkJYWRkS2V5QmluZGluZzogYWRkS2V5QmluZGluZywKCQlyZW1vdmVLZXlCaW5kaW5nOiByZW1vdmVLZXlCaW5kaW5nLAoKCQkvLyBBUEkgZm9yIHJlZ2lzdGVyaW5nIGFuZCByZXRyaWV2aW5nIHBsdWdpbnMKCQlyZWdpc3RlclBsdWdpbjogcmVnaXN0ZXJQbHVnaW4sCgkJaGFzUGx1Z2luOiBoYXNQbHVnaW4sCgkJZ2V0UGx1Z2luOiBnZXRQbHVnaW4sCgoJCS8vIFByb2dyYW1tYXRpY2FsbHkgdHJpZ2dlcnMgYSBrZXlib2FyZCBldmVudAoJCXRyaWdnZXJLZXk6IGZ1bmN0aW9uKCBrZXlDb2RlICkgewoJCQlvbkRvY3VtZW50S2V5RG93biggeyBrZXlDb2RlOiBrZXlDb2RlIH0gKTsKCQl9LAoKCQkvLyBSZWdpc3RlcnMgYSBuZXcgc2hvcnRjdXQgdG8gaW5jbHVkZSBpbiB0aGUgaGVscCBvdmVybGF5CgkJcmVnaXN0ZXJLZXlib2FyZFNob3J0Y3V0OiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQkJa2V5Ym9hcmRTaG9ydGN1dHNba2V5XSA9IHZhbHVlOwoJCX0KCX07CgoJcmV0dXJuIFJldmVhbDsKCn0pKTsK></script><script>Array.prototype.slice.call(document.querySelectorAll('.slides section')).forEach(function(slide) {
if (slide.getAttribute('data-background-color')) return;
// user needs to explicitly say he wants CSS color to override otherwise we might break custom css or theme (#226)
if (!(slide.classList.contains('canvas') || slide.classList.contains('background'))) return;
var bgColor = getComputedStyle(slide).backgroundColor;
if (bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {
slide.setAttribute('data-background-color', bgColor);
slide.style.backgroundColor = 'transparent';
}
});
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
// Display presentation control arrows
controls: true,
// Help the user learn the controls by providing hints, for example by
// bouncing the down arrow when they first encounter a vertical slide
controlsTutorial: true,
// Determines where controls appear, "edges" or "bottom-right"
controlsLayout: 'bottom-right',
// Visibility rule for backwards navigation arrows; "faded", "hidden"
// or "visible"
controlsBackArrows: 'faded',
// Display a presentation progress bar
progress: true,
// Display the page number of the current slide
slideNumber: 'c/t',
// Control which views the slide number displays on
showSlideNumber: 'all',
// Add the current slide number to the URL hash so that reloading the
// page/copying the URL will return you to the same slide
hash: true,
// Push each slide change to the browser history. Implies `hash: true`
history: false,
// Enable keyboard shortcuts for navigation
keyboard: true,
// Enable the slide overview mode
overview: true,
// Disables the default reveal.js slide layout so that you can use custom CSS layout
disableLayout: false,
// Vertical centering of slides
center: true,
// Enables touch navigation on devices with touch input
touch: true,
// Loop the presentation
loop: false,
// Change the presentation direction to be RTL
rtl: false,
// See https://github.com/hakimel/reveal.js/#navigation-mode
navigationMode: 'default',
// Randomizes the order of slides each time the presentation loads
shuffle: false,
// Turns fragments on and off globally
fragments: true,
// Flags whether to include the current fragment in the URL,
// so that reloading brings you to the same fragment position
fragmentInURL: false,
// Flags if the presentation is running in an embedded mode,
// i.e. contained within a limited portion of the screen
embedded: false,
// Flags if we should show a help overlay when the questionmark
// key is pressed
help: true,
// Flags if speaker notes should be visible to all viewers
showNotes: false,
// Global override for autolaying embedded media (video/audio/iframe)
// - null: Media will only autoplay if data-autoplay is present
// - true: All media will autoplay, regardless of individual setting
// - false: No media will autoplay, regardless of individual setting
autoPlayMedia: true,
// Global override for preloading lazy-loaded iframes
// - null: Iframes with data-src AND data-preload will be loaded when within
// the viewDistance, iframes with only data-src will be loaded when visible
// - true: All iframes with data-src will be loaded when within the viewDistance
// - false: All iframes with data-src will be loaded only when visible
preloadIframes: null,
// Number of milliseconds between automatically proceeding to the
// next slide, disabled when set to 0, this value can be overwritten
// by using a data-autoslide attribute on your slides
autoSlide: 0,
// Stop auto-sliding after user input
autoSlideStoppable: true,
// Use this method for navigation when auto-sliding
autoSlideMethod: Reveal.navigateNext,
// Specify the average time in seconds that you think you will spend
// presenting each slide. This is used to show a pacing timer in the
// speaker view
defaultTiming: 120,
// Specify the total time in seconds that is available to
// present. If this is set to a nonzero value, the pacing
// timer will work out the time available for each slide,
// instead of using the defaultTiming value
totalTime: 0,
// Specify the minimum amount of time you want to allot to
// each slide, if using the totalTime calculation method. If
// the automated time allocation causes slide pacing to fall
// below this threshold, then you will see an alert in the
// speaker notes window
minimumTimePerSlide: 0,
// Enable slide navigation via mouse wheel
mouseWheel: false,
// Hide cursor if inactive
hideInactiveCursor: true,
// Time before the cursor is hidden (in ms)
hideCursorTime: 5000,
// Hides the address bar on mobile devices
hideAddressBar: true,
// Opens links in an iframe preview overlay
// Add `data-preview-link` and `data-preview-link="false"` to customise each link
// individually
previewLinks: false,
// Transition style (e.g., none, fade, slide, convex, concave, zoom)
transition: 'false',
// Transition speed (e.g., default, fast, slow)
transitionSpeed: 'fast',
// Transition style for full page slide backgrounds (e.g., none, fade, slide, convex, concave, zoom)
backgroundTransition: 'fade',
// Number of slides away from the current that are visible
viewDistance: 3,
// Number of slides away from the current that are visible on mobile
// devices. It is advisable to set this to a lower number than
// viewDistance in order to save resources.
mobileViewDistance: 3,
// Parallax background image (e.g., "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'")
parallaxBackgroundImage: '',
// Parallax background size in CSS syntax (e.g., "2100px 900px")
parallaxBackgroundSize: '',
// Number of pixels to move the parallax background per slide
// - Calculated automatically unless specified
// - Set to 0 to disable movement along an axis
parallaxBackgroundHorizontal: null,
parallaxBackgroundVertical: null,
// The display mode that will be used to show slides
display: 'block',
// The "normal" size of the presentation, aspect ratio will be preserved
// when the presentation is scaled to fit different resolutions. Can be
// specified using percentage units.
width: 960,
height: 700,
// Factor of the display size that should remain empty around the content
margin: 0.1,
// Bounds for smallest/largest possible scale to apply to content
minScale: 0.2,
maxScale: 1.5,
// PDF Export Options
// Put each fragment on a separate page
pdfSeparateFragments: true,
// For slides that do not fit on a page, max number of pages
pdfMaxPagesPerSlide: 1,
// Optional libraries used to extend on reveal.js
dependencies: [
{ src: 'node_modules/reveal.js/plugin/zoom-js/zoom.js', async: true },
{ src: 'node_modules/reveal.js/plugin/notes/notes.js', async: true }
],
});</script><script>var dom = {};
dom.slides = document.querySelector('.reveal .slides');
function getRemainingHeight(element, slideElement, height) {
height = height || 0;
if (element) {
var newHeight, oldHeight = element.style.height;
// Change the .stretch element height to 0 in order find the height of all
// the other elements
element.style.height = '0px';
// In Overview mode, the parent (.slide) height is set of 700px.
// Restore it temporarily to its natural height.
slideElement.style.height = 'auto';
newHeight = height - slideElement.offsetHeight;
// Restore the old height, just in case
element.style.height = oldHeight + 'px';
// Clear the parent (.slide) height. .removeProperty works in IE9+
slideElement.style.removeProperty('height');
return newHeight;
}
return height;
}
function layoutSlideContents(width, height) {
// Handle sizing of elements with the 'stretch' class
toArray(dom.slides.querySelectorAll('section .stretch')).forEach(function (element) {
// Determine how much vertical space we can use
var limit = 5; // hard limit
var parent = element.parentNode;
while (parent.nodeName !== 'SECTION' && limit > 0) {
parent = parent.parentNode;
limit--;
}
if (limit === 0) {
// unable to find parent, aborting!
return;
}
var remainingHeight = getRemainingHeight(element, parent, height);
// Consider the aspect ratio of media elements
if (/(img|video)/gi.test(element.nodeName)) {
var nw = element.naturalWidth || element.videoWidth, nh = element.naturalHeight || element.videoHeight;
var es = Math.min(width / nw, remainingHeight / nh);
element.style.width = (nw * es) + 'px';
element.style.height = (nh * es) + 'px';
} else {
element.style.width = width + 'px';
element.style.height = remainingHeight + 'px';
}
});
}
function toArray(o) {
return Array.prototype.slice.call(o);
}
Reveal.addEventListener('slidechanged', function () {
layoutSlideContents(960, 700)
});
Reveal.addEventListener('ready', function () {
layoutSlideContents(960, 700)
});
Reveal.addEventListener('resize', function () {
layoutSlideContents(960, 700)
});</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment