From 9319f031bacb42757b1666b7197d186bc3a30d10 Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Mon, 15 Jul 2024 07:11:50 +0800 Subject: [PATCH 1/7] WIP trigger rewrite --- .gitignore | 2 + assets/css/theme.css | 1457 +++++++++++++++++++++++++- assets/js/src/app.js | 50 + pages/snowboard/triggers.htm | 44 + partials/html/foot.htm | 2 +- partials/snowboard/sections-list.htm | 3 + winter.mix.js | 2 + 7 files changed, 1558 insertions(+), 2 deletions(-) create mode 100644 assets/js/src/app.js create mode 100644 pages/snowboard/triggers.htm diff --git a/.gitignore b/.gitignore index d2595ac..d878d47 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # NPM and Webpack node_modules mix.webpack.js +assets/js/app.js +assets/js/app.js.LICENSE.txt # OS files .DS_Store diff --git a/assets/css/theme.css b/assets/css/theme.css index 74cef82..5682916 100644 --- a/assets/css/theme.css +++ b/assets/css/theme.css @@ -1 +1,1456 @@ -*,:after,:before{border:0 solid #e5e5e5;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a3a3a3;opacity:1}input::placeholder,textarea::placeholder{color:#a3a3a3;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14,165,233,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14,165,233,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{margin-left:auto;margin-right:auto;width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.fixed{position:fixed}.left-0{left:0}.top-0{top:0}.z-20{z-index:20}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-end-1{grid-column-end:1}.col-end-2{grid-column-end:2}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-8{margin-bottom:2rem;margin-top:2rem}.-mt-2{margin-top:-.5rem}.mb-0{margin-bottom:0}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.ml-8{margin-left:2rem}.mr-2{margin-right:.5rem}.mt-10{margin-top:2.5rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.h-10{height:2.5rem}.h-20{height:5rem}.h-4{height:1rem}.h-44{height:11rem}.h-6{height:1.5rem}.h-full{height:100%}.w-10{width:2.5rem}.w-20{width:5rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-auto{width:auto}.w-full{width:100%}.max-w-screen-xl{max-width:1280px}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.flex-grow-0{flex-grow:0}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.list-disc{list-style-type:disc}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-10{gap:2.5rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(245 245 245/var(--tw-divide-opacity))}.divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(255 255 255/var(--tw-divide-opacity))}.divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.self-end{align-self:flex-end}.justify-self-end{justify-self:end}.overflow-x-auto{overflow-x:auto}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.border{border-width:1px}.border-none{border-style:none}.border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.from-amber-600{--tw-gradient-from:#d97706 var(--tw-gradient-from-position);--tw-gradient-to:rgba(217,119,6,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-blue-500{--tw-gradient-from:#0ea5e9 var(--tw-gradient-from-position);--tw-gradient-to:rgba(14,165,233,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-blue-600{--tw-gradient-from:#0284c7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(2,132,199,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-emerald-600{--tw-gradient-from:#059669 var(--tw-gradient-from-position);--tw-gradient-to:rgba(5,150,105,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-green-500{--tw-gradient-from:#22c55e var(--tw-gradient-from-position);--tw-gradient-to:rgba(34,197,94,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-500{--tw-gradient-from:#8b5cf6 var(--tw-gradient-from-position);--tw-gradient-to:rgba(139,92,246,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-amber-700{--tw-gradient-to:#b45309 var(--tw-gradient-to-position)}.to-blue-600{--tw-gradient-to:#0284c7 var(--tw-gradient-to-position)}.to-blue-700{--tw-gradient-to:#0369a1 var(--tw-gradient-to-position)}.to-emerald-700{--tw-gradient-to:#047857 var(--tw-gradient-to-position)}.to-green-600{--tw-gradient-to:#16a34a var(--tw-gradient-to-position)}.to-purple-600{--tw-gradient-to:#7c3aed var(--tw-gradient-to-position)}.bg-cover{background-size:cover}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.fill-current{fill:currentColor}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-20{padding-bottom:5rem;padding-top:5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pl-0{padding-left:0}.pr-4{padding-right:1rem}.text-center{text-align:center}.font-body{font-family:Heebo,sans-serif}.font-heading{font-family:Work Sans,sans-serif}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-heading{font-weight:800}.font-light{font-weight:200}.italic{font-style:italic}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}#account-component .row{display:block;gap:2.5rem}@media (min-width:1024px){#account-component .row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}}#account-component .row .col-md-6{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity));border-color:rgb(229 229 229/var(--tw-border-opacity));border-width:1px;height:auto;padding:2rem}@media (min-width:1024px){#account-component .row .col-md-6{height:100%}}#account-component .form-group{display:flex;flex-direction:column;gap:.5rem}#account-component .form-group .form-label,#account-component .form-group label{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity));font-size:.875rem;font-weight:700;line-height:1.25rem}#account-component .form-group .form-control{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;padding:.5rem}#account-component .form-group .form-control::-moz-placeholder{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}#account-component .form-group .form-control::placeholder{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}#account-component .form-group .form-control:focus{outline-color:#0ea5e9;outline-style:solid}#account-component .form-group+.form-group{margin-top:1rem}#account-component .btn{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:700;line-height:1.25rem;margin-top:2rem;padding:1rem 2rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}#account-component .btn:hover{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}#account-component .btn:active{--tw-scale-x:.9;--tw-scale-y:.9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#account-component .deactivate{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity));display:block;margin-top:1rem}#account-component .deactivate:hover{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}#account-component #accountDeactivateForm{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity));border-color:rgb(254 202 202/var(--tw-border-opacity));border-width:1px;margin-top:2rem;padding:2rem}#account-component #accountDeactivateForm .btn{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}#account-component #accountDeactivateForm .btn:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}#account-component #accountDeactivateForm .btn+a{margin-left:1rem}body{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity));font-family:Heebo,sans-serif}body,html{overscroll-behavior:none}h1,h2,h3,h4,h5,h6{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity));font-family:Work Sans,sans-serif;font-weight:800;margin-bottom:1.5rem}h1{font-size:2.25rem;line-height:2.5rem}h2{font-size:1.5rem;line-height:2rem}h3{font-size:1.25rem}h3,h4{line-height:1.75rem}h4{font-size:1.125rem}p{margin-bottom:1rem}p:last-child{margin-bottom:0}p+h1,p+h2,p+h3,p+h4,p+h5,p+h6{margin-top:2rem}.hero{padding:13rem 4rem 7rem;text-align:center}@media (min-width:1024px){.hero{padding-left:10rem;padding-right:10rem}}.hero-small{padding:8rem 4rem 4rem;text-align:center}@media (min-width:1024px){.hero-small{padding-left:10rem;padding-right:10rem}}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-amber-500:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.hover\:opacity-100:hover{opacity:1}.active\:scale-90:active{--tw-scale-x:.9;--tw-scale-y:.9}.active\:scale-90:active,.group:hover .group-hover\:translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:translate-x-2{--tw-translate-x:0.5rem}.group:hover .group-hover\:text-blue-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}@media (min-width:640px){.sm\:w-1\/3{width:33.333333%}}@media (min-width:1024px){.lg\:mt-0{margin-top:0}.lg\:flex{display:flex}.lg\:w-1\/4{width:25%}.lg\:w-10\/12{width:83.333333%}.lg\:w-2\/12{width:16.666667%}.lg\:w-3\/12{width:25%}.lg\:w-3\/4{width:75%}.lg\:w-60{width:15rem}.lg\:w-9\/12{width:75%}.lg\:w-full{width:100%}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}}@media (min-width:1280px){.xl\:px-0{padding-right:0}.xl\:pl-0,.xl\:px-0{padding-left:0}.xl\:pr-0{padding-right:0}} +/* +! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com +*//* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: #e5e5e5; /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -moz-tab-size: 4; /* 3 */ + -o-tab-size: 4; + tab-size: 4; /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ + font-feature-settings: normal; /* 5 */ + font-variation-settings: normal; /* 6 */ + -webkit-tap-highlight-color: transparent; /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ + font-feature-settings: normal; /* 2 */ + font-variation-settings: normal; /* 3 */ + font-size: 1em; /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-feature-settings: inherit; /* 1 */ + font-variation-settings: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + letter-spacing: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; /* 1 */ + color: #a3a3a3; /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; /* 1 */ + color: #a3a3a3; /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(14 165 233 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(14 165 233 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} +.container { + width: 100%; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 640px) { + + .container { + max-width: 640px; + } +} +@media (min-width: 768px) { + + .container { + max-width: 768px; + } +} +@media (min-width: 1024px) { + + .container { + max-width: 1024px; + } +} +@media (min-width: 1280px) { + + .container { + max-width: 1280px; + } +} +@media (min-width: 1536px) { + + .container { + max-width: 1536px; + } +} +.fixed { + position: fixed; +} +.left-0 { + left: 0px; +} +.top-0 { + top: 0px; +} +.z-20 { + z-index: 20; +} +.col-span-2 { + grid-column: span 2 / span 2; +} +.col-span-3 { + grid-column: span 3 / span 3; +} +.col-start-1 { + grid-column-start: 1; +} +.col-start-2 { + grid-column-start: 2; +} +.col-end-1 { + grid-column-end: 1; +} +.col-end-2 { + grid-column-end: 2; +} +.mx-auto { + margin-left: auto; + margin-right: auto; +} +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.my-8 { + margin-top: 2rem; + margin-bottom: 2rem; +} +.-mt-2 { + margin-top: -0.5rem; +} +.mb-0 { + margin-bottom: 0px; +} +.mb-2 { + margin-bottom: 0.5rem; +} +.mb-4 { + margin-bottom: 1rem; +} +.mb-6 { + margin-bottom: 1.5rem; +} +.mb-8 { + margin-bottom: 2rem; +} +.ml-2 { + margin-left: 0.5rem; +} +.ml-8 { + margin-left: 2rem; +} +.mr-2 { + margin-right: 0.5rem; +} +.mt-10 { + margin-top: 2.5rem; +} +.mt-16 { + margin-top: 4rem; +} +.mt-2 { + margin-top: 0.5rem; +} +.mt-4 { + margin-top: 1rem; +} +.mt-6 { + margin-top: 1.5rem; +} +.mt-8 { + margin-top: 2rem; +} +.block { + display: block; +} +.inline-block { + display: inline-block; +} +.flex { + display: flex; +} +.inline-flex { + display: inline-flex; +} +.table { + display: table; +} +.grid { + display: grid; +} +.contents { + display: contents; +} +.h-10 { + height: 2.5rem; +} +.h-20 { + height: 5rem; +} +.h-4 { + height: 1rem; +} +.h-44 { + height: 11rem; +} +.h-6 { + height: 1.5rem; +} +.h-full { + height: 100%; +} +.w-10 { + width: 2.5rem; +} +.w-20 { + width: 5rem; +} +.w-4 { + width: 1rem; +} +.w-6 { + width: 1.5rem; +} +.w-auto { + width: auto; +} +.w-full { + width: 100%; +} +.max-w-screen-xl { + max-width: 1280px; +} +.flex-none { + flex: none; +} +.flex-shrink-0 { + flex-shrink: 0; +} +.flex-grow { + flex-grow: 1; +} +.flex-grow-0 { + flex-grow: 0; +} +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.transform-gpu { + transform: translate3d(var(--tw-translate-x), var(--tw-translate-y), 0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.list-disc { + list-style-type: disc; +} +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} +.flex-row { + flex-direction: row; +} +.flex-col { + flex-direction: column; +} +.items-center { + align-items: center; +} +.justify-center { + justify-content: center; +} +.gap-10 { + gap: 2.5rem; +} +.gap-2 { + gap: 0.5rem; +} +.gap-4 { + gap: 1rem; +} +.divide-x > :not([hidden]) ~ :not([hidden]) { + --tw-divide-x-reverse: 0; + border-right-width: calc(1px * var(--tw-divide-x-reverse)); + border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); +} +.divide-gray-100 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(245 245 245 / var(--tw-divide-opacity)); +} +.divide-white > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-divide-opacity)); +} +.divide-opacity-40 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 0.4; +} +.self-end { + align-self: flex-end; +} +.justify-self-end { + justify-self: end; +} +.overflow-x-auto { + overflow-x: auto; +} +.whitespace-nowrap { + white-space: nowrap; +} +.rounded { + border-radius: 0.25rem; +} +.rounded-full { + border-radius: 9999px; +} +.rounded-lg { + border-radius: 0.5rem; +} +.rounded-tl { + border-top-left-radius: 0.25rem; +} +.rounded-tr { + border-top-right-radius: 0.25rem; +} +.border { + border-width: 1px; +} +.border-none { + border-style: none; +} +.border-amber-600 { + --tw-border-opacity: 1; + border-color: rgb(217 119 6 / var(--tw-border-opacity)); +} +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 229 229 / var(--tw-border-opacity)); +} +.border-green-200 { + --tw-border-opacity: 1; + border-color: rgb(187 247 208 / var(--tw-border-opacity)); +} +.border-red-200 { + --tw-border-opacity: 1; + border-color: rgb(254 202 202 / var(--tw-border-opacity)); +} +.border-red-600 { + --tw-border-opacity: 1; + border-color: rgb(220 38 38 / var(--tw-border-opacity)); +} +.bg-amber-600 { + --tw-bg-opacity: 1; + background-color: rgb(217 119 6 / var(--tw-bg-opacity)); +} +.bg-amber-700 { + --tw-bg-opacity: 1; + background-color: rgb(180 83 9 / var(--tw-bg-opacity)); +} +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(14 165 233 / var(--tw-bg-opacity)); +} +.bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(2 132 199 / var(--tw-bg-opacity)); +} +.bg-emerald-700 { + --tw-bg-opacity: 1; + background-color: rgb(4 120 87 / var(--tw-bg-opacity)); +} +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(245 245 245 / var(--tw-bg-opacity)); +} +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(250 250 250 / var(--tw-bg-opacity)); +} +.bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(64 64 64 / var(--tw-bg-opacity)); +} +.bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(38 38 38 / var(--tw-bg-opacity)); +} +.bg-green-50 { + --tw-bg-opacity: 1; + background-color: rgb(240 253 244 / var(--tw-bg-opacity)); +} +.bg-green-600 { + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity)); +} +.bg-purple-500 { + --tw-bg-opacity: 1; + background-color: rgb(139 92 246 / var(--tw-bg-opacity)); +} +.bg-purple-600 { + --tw-bg-opacity: 1; + background-color: rgb(124 58 237 / var(--tw-bg-opacity)); +} +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity)); +} +.bg-red-50 { + --tw-bg-opacity: 1; + background-color: rgb(254 242 242 / var(--tw-bg-opacity)); +} +.bg-red-600 { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity)); +} +.bg-gradient-to-b { + background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); +} +.from-amber-600 { + --tw-gradient-from: #d97706 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(217 119 6 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} +.from-blue-500 { + --tw-gradient-from: #0ea5e9 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(14 165 233 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} +.from-blue-600 { + --tw-gradient-from: #0284c7 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(2 132 199 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} +.from-emerald-600 { + --tw-gradient-from: #059669 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(5 150 105 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} +.from-green-500 { + --tw-gradient-from: #22c55e var(--tw-gradient-from-position); + --tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} +.from-purple-500 { + --tw-gradient-from: #8b5cf6 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(139 92 246 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} +.to-amber-700 { + --tw-gradient-to: #b45309 var(--tw-gradient-to-position); +} +.to-blue-600 { + --tw-gradient-to: #0284c7 var(--tw-gradient-to-position); +} +.to-blue-700 { + --tw-gradient-to: #0369a1 var(--tw-gradient-to-position); +} +.to-emerald-700 { + --tw-gradient-to: #047857 var(--tw-gradient-to-position); +} +.to-green-600 { + --tw-gradient-to: #16a34a var(--tw-gradient-to-position); +} +.to-purple-600 { + --tw-gradient-to: #7c3aed var(--tw-gradient-to-position); +} +.bg-cover { + background-size: cover; +} +.bg-center { + background-position: center; +} +.bg-no-repeat { + background-repeat: no-repeat; +} +.fill-current { + fill: currentColor; +} +.p-4 { + padding: 1rem; +} +.p-6 { + padding: 1.5rem; +} +.p-8 { + padding: 2rem; +} +.px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; +} +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.py-20 { + padding-top: 5rem; + padding-bottom: 5rem; +} +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} +.pl-0 { + padding-left: 0px; +} +.pr-4 { + padding-right: 1rem; +} +.text-center { + text-align: center; +} +.font-body { + font-family: 'Heebo', sans-serif; +} +.font-heading { + font-family: 'Work Sans', sans-serif; +} +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} +.font-bold { + font-weight: 700; +} +.font-heading { + font-weight: 800; +} +.font-light { + font-weight: 200; +} +.italic { + font-style: italic; +} +.text-amber-300 { + --tw-text-opacity: 1; + color: rgb(252 211 77 / var(--tw-text-opacity)); +} +.text-amber-600 { + --tw-text-opacity: 1; + color: rgb(217 119 6 / var(--tw-text-opacity)); +} +.text-blue-300 { + --tw-text-opacity: 1; + color: rgb(125 211 252 / var(--tw-text-opacity)); +} +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(2 132 199 / var(--tw-text-opacity)); +} +.text-blue-700 { + --tw-text-opacity: 1; + color: rgb(3 105 161 / var(--tw-text-opacity)); +} +.text-emerald-300 { + --tw-text-opacity: 1; + color: rgb(110 231 183 / var(--tw-text-opacity)); +} +.text-emerald-600 { + --tw-text-opacity: 1; + color: rgb(5 150 105 / var(--tw-text-opacity)); +} +.text-gray-300 { + --tw-text-opacity: 1; + color: rgb(212 212 212 / var(--tw-text-opacity)); +} +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(163 163 163 / var(--tw-text-opacity)); +} +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(115 115 115 / var(--tw-text-opacity)); +} +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(64 64 64 / var(--tw-text-opacity)); +} +.text-green-300 { + --tw-text-opacity: 1; + color: rgb(134 239 172 / var(--tw-text-opacity)); +} +.text-green-400 { + --tw-text-opacity: 1; + color: rgb(74 222 128 / var(--tw-text-opacity)); +} +.text-green-600 { + --tw-text-opacity: 1; + color: rgb(22 163 74 / var(--tw-text-opacity)); +} +.text-purple-300 { + --tw-text-opacity: 1; + color: rgb(196 181 253 / var(--tw-text-opacity)); +} +.text-purple-600 { + --tw-text-opacity: 1; + color: rgb(124 58 237 / var(--tw-text-opacity)); +} +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +.text-green-700 { + --tw-text-opacity: 1; + color: rgb(21 128 61 / var(--tw-text-opacity)); +} +.underline { + text-decoration-line: underline; +} +.opacity-60 { + opacity: 0.6; +} +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} +.ring { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +#account-component .row { + display: block; + gap: 2.5rem; +} +@media (min-width: 1024px) { + + #account-component .row { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} +#account-component .row .col-md-6 { + height: auto; + border-width: 1px; + --tw-border-opacity: 1; + border-color: rgb(229 229 229 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(250 250 250 / var(--tw-bg-opacity)); + padding: 2rem; +} +@media (min-width: 1024px) { + + #account-component .row .col-md-6 { + height: 100%; + } +} +#account-component .form-group { + display: flex; + flex-direction: column; + gap: 0.5rem; +} +#account-component .form-group .form-label, #account-component .form-group label { + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(82 82 82 / var(--tw-text-opacity)); +} +#account-component .form-group .form-control { + border-radius: 0.375rem; + border-width: 1px; + --tw-border-opacity: 1; + border-color: rgb(212 212 212 / var(--tw-border-opacity)); + padding: 0.5rem; +} +#account-component .form-group .form-control::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(212 212 212 / var(--tw-text-opacity)); +} +#account-component .form-group .form-control::placeholder { + --tw-text-opacity: 1; + color: rgb(212 212 212 / var(--tw-text-opacity)); +} +#account-component .form-group .form-control:focus { + outline-style: solid; + outline-color: #0ea5e9; +} +#account-component .form-group + .form-group { + margin-top: 1rem; +} +#account-component .btn { + margin-top: 2rem; + display: inline-flex; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + border-radius: 0.5rem; + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity)); + padding-top: 1rem; + padding-bottom: 1rem; + padding-left: 2rem; + padding-right: 2rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +#account-component .btn:hover { + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity)); +} +#account-component .btn:active { + --tw-scale-x: .9; + --tw-scale-y: .9; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +#account-component .deactivate { + margin-top: 1rem; + display: block; + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity)); +} +#account-component .deactivate:hover { + --tw-text-opacity: 1; + color: rgb(153 27 27 / var(--tw-text-opacity)); +} +#account-component #accountDeactivateForm { + margin-top: 2rem; + border-width: 1px; + --tw-border-opacity: 1; + border-color: rgb(254 202 202 / var(--tw-border-opacity)); + --tw-bg-opacity: 1; + background-color: rgb(254 242 242 / var(--tw-bg-opacity)); + padding: 2rem; +} +#account-component #accountDeactivateForm .btn { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} +#account-component #accountDeactivateForm .btn:hover { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); +} +#account-component #accountDeactivateForm .btn + a { + margin-left: 1rem; +} +/* Default font */ +body { + font-family: 'Heebo', sans-serif; + --tw-text-opacity: 1; + color: rgb(115 115 115 / var(--tw-text-opacity)); +} +/* Disable OSX scrolling bounce effect */ +html, +body { + overscroll-behavior: none; +} +/* Heading styles */ +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: 1.5rem; + font-family: 'Work Sans', sans-serif; + font-weight: 800; + --tw-text-opacity: 1; + color: rgb(64 64 64 / var(--tw-text-opacity)); +} +h1 { + font-size: 2.25rem; + line-height: 2.5rem; +} +h2 { + font-size: 1.5rem; + line-height: 2rem; +} +h3 { + font-size: 1.25rem; + line-height: 1.75rem; +} +h4 { + font-size: 1.125rem; + line-height: 1.75rem; +} +/* Paragraphs and spacing */ +p { + margin-bottom: 1rem; +} +p:last-child { + margin-bottom: 0px; +} +p + h1, +p + h2, +p + h3, +p + h4, +p + h5, +p + h6 { + margin-top: 2rem; +} +/* Hero */ +.hero { + padding-left: 4rem; + padding-right: 4rem; + padding-top: 13rem; + padding-bottom: 7rem; + text-align: center; +} +@media (min-width: 1024px) { + + .hero { + padding-left: 10rem; + padding-right: 10rem; + } +} +.hero-small { + padding-left: 4rem; + padding-right: 4rem; + padding-top: 8rem; + padding-bottom: 4rem; + text-align: center; +} +@media (min-width: 1024px) { + + .hero-small { + padding-left: 10rem; + padding-right: 10rem; + } +} +.hover\:scale-105:hover { + --tw-scale-x: 1.05; + --tw-scale-y: 1.05; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.hover\:bg-amber-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(245 158 11 / var(--tw-bg-opacity)); +} +.hover\:bg-green-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity)); +} +.hover\:bg-red-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); +} +.hover\:text-blue-900:hover { + --tw-text-opacity: 1; + color: rgb(12 74 110 / var(--tw-text-opacity)); +} +.hover\:text-gray-200:hover { + --tw-text-opacity: 1; + color: rgb(229 229 229 / var(--tw-text-opacity)); +} +.hover\:opacity-100:hover { + opacity: 1; +} +.active\:scale-90:active { + --tw-scale-x: .9; + --tw-scale-y: .9; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.group:hover .group-hover\:translate-x-2 { + --tw-translate-x: 0.5rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} +.group:hover .group-hover\:text-blue-900 { + --tw-text-opacity: 1; + color: rgb(12 74 110 / var(--tw-text-opacity)); +} +@media (min-width: 640px) { + + .sm\:w-1\/3 { + width: 33.333333%; + } +} +@media (min-width: 1024px) { + + .lg\:mt-0 { + margin-top: 0px; + } + + .lg\:flex { + display: flex; + } + + .lg\:w-1\/4 { + width: 25%; + } + + .lg\:w-10\/12 { + width: 83.333333%; + } + + .lg\:w-2\/12 { + width: 16.666667%; + } + + .lg\:w-3\/12 { + width: 25%; + } + + .lg\:w-3\/4 { + width: 75%; + } + + .lg\:w-60 { + width: 15rem; + } + + .lg\:w-9\/12 { + width: 75%; + } + + .lg\:w-full { + width: 100%; + } + + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\:flex-row { + flex-direction: row; + } +} +@media (min-width: 1280px) { + + .xl\:px-0 { + padding-left: 0px; + padding-right: 0px; + } + + .xl\:pl-0 { + padding-left: 0px; + } + + .xl\:pr-0 { + padding-right: 0px; + } +} + + +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixvRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtB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SUFBQTtFQW9FQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9iYXNlLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL2NvbXBvbmVudHMuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvdXRpbGl0aWVzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL3NlY3Rpb25zL3VzZXIuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiQHRhaWx3aW5kIGJhc2U7XG4iLCJAdGFpbHdpbmQgY29tcG9uZW50cztcbiIsIkB0YWlsd2luZCB1dGlsaXRpZXM7XG4iLCIjYWNjb3VudC1jb21wb25lbnQge1xuICAgIC5yb3cge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbGc6Z3JpZCBsZzpncmlkLWNvbHMtMiBnYXAtMTA7XG5cbiAgICAgICAgLmNvbC1tZC02IHtcbiAgICAgICAgICAgIEBhcHBseSBoLWF1dG8gbGc6aC1mdWxsIHAtOCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGJnLWdyYXktNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBmbGV4IGZsZXgtY29sIGdhcC0yO1xuXG4gICAgICAgIC5mb3JtLWxhYmVsLCBsYWJlbCB7XG4gICAgICAgICAgICBAYXBwbHkgZm9udC1ib2xkIHRleHQtc20gdGV4dC1ncmF5LTYwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICAgICAgQGFwcGx5IGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBwLTIgZm9jdXM6b3V0bGluZSBmb2N1czpvdXRsaW5lLWJsdWUtNTAwIHBsYWNlaG9sZGVyOnRleHQtZ3JheS0zMDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCArIC5mb3JtLWdyb3VwIHtcbiAgICAgICAgQGFwcGx5IG10LTQ7XG4gICAgfVxuXG4gICAgLmJ0biB7XG4gICAgICAgIEBhcHBseSBtdC04IGlubGluZS1mbGV4IGZvbnQtYm9sZCB0ZXh0LXNtIHJvdW5kZWQtbGcgdHJhbnNpdGlvbiB0cmFuc2Zvcm0gYWN0aXZlOnNjYWxlLTkwIHB5LTQgcHgtOCBiZy1ncmVlbi02MDAgdGV4dC13aGl0ZSBob3ZlcjpiZy1ncmVlbi01MDA7XG4gICAgfVxuXG4gICAgLmRlYWN0aXZhdGUge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbXQtNCB0ZXh0LXJlZC02MDAgaG92ZXI6dGV4dC1yZWQtODAwO1xuICAgIH1cblxuICAgICNhY2NvdW50RGVhY3RpdmF0ZUZvcm0ge1xuICAgICAgICBAYXBwbHkgbXQtOCBib3JkZXIgYm9yZGVyLXJlZC0yMDAgYmctcmVkLTUwIHAtODtcblxuICAgICAgICAuYnRuIHtcbiAgICAgICAgICAgIEBhcHBseSBiZy1yZWQtNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctcmVkLTUwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5idG4gKyBhIHtcbiAgICAgICAgICAgIEBhcHBseSBtbC00O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGltcG9ydCAndGFpbHdpbmRjc3MvYmFzZSc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy9jb21wb25lbnRzJztcbkBpbXBvcnQgJ3RhaWx3aW5kY3NzL3V0aWxpdGllcyc7XG5AaW1wb3J0ICcuL3NlY3Rpb25zL3VzZXIuY3NzJztcblxuLyogRGVmYXVsdCBmb250ICovXG5ib2R5IHtcbiAgICBAYXBwbHkgdGV4dC1ncmF5LTUwMCBmb250LWJvZHk7XG59XG5cbi8qIERpc2FibGUgT1NYIHNjcm9sbGluZyBib3VuY2UgZWZmZWN0ICovXG5odG1sLFxuYm9keSB7XG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogbm9uZTtcbn1cblxuLyogSGVhZGluZyBzdHlsZXMgKi9cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS03MDAgZm9udC1oZWFkaW5nIG1iLTY7XG59XG5cbmgxIHtcbiAgICBAYXBwbHkgdGV4dC00eGw7XG59XG5cbmgyIHtcbiAgICBAYXBwbHkgdGV4dC0yeGw7XG59XG5cbmgzIHtcbiAgICBAYXBwbHkgdGV4dC14bDtcbn1cblxuaDQge1xuICAgIEBhcHBseSB0ZXh0LWxnO1xufVxuXG4vKiBQYXJhZ3JhcGhzIGFuZCBzcGFjaW5nICovXG5wIHtcbiAgICBAYXBwbHkgbWItNDtcbn1cblxucDpsYXN0LWNoaWxkIHtcbiAgICBAYXBwbHkgbWItMDtcbn1cblxucCArIGgxLFxucCArIGgyLFxucCArIGgzLFxucCArIGg0LFxucCArIGg1LFxucCArIGg2IHtcbiAgICBAYXBwbHkgbXQtODtcbn1cblxuLyogSGVybyAqL1xuLmhlcm8ge1xuICAgIEBhcHBseSBweC0xNiBwdC01MiBwYi0yOCB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cblxuLmhlcm8tc21hbGwge1xuICAgIEBhcHBseSBweC0xNiBwdC0zMiBwYi0xNiB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file diff --git a/assets/js/src/app.js b/assets/js/src/app.js new file mode 100644 index 0000000..ad9be08 --- /dev/null +++ b/assets/js/src/app.js @@ -0,0 +1,50 @@ +import Snowboard from '../../../../../modules/system/assets/js/snowboard/main/Snowboard'; +import ProxyHandler from '../../../../../modules/system/assets/js/snowboard/main/ProxyHandler'; +import Request from '../../../../../modules/system/assets/js/snowboard/ajax/Request'; +import AttributeRequest from '../../../../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest'; +import AssetLoader from '../../../../../modules/system/assets/js/snowboard/extras/AssetLoader'; +import DataConfig from '../../../../../modules/system/assets/js/snowboard/extras/DataConfig'; +import StylesheetLoader from '../../../../../modules/system/assets/js/snowboard/extras/StylesheetLoader'; +import Transition from '../../../../../modules/system/assets/js/snowboard/extras/Transition'; +import Flash from '../../../../../modules/system/assets/js/snowboard/extras/Flash'; +import FlashListener from '../../../../../modules/system/assets/js/snowboard/extras/FlashListener'; +import FormValidation from '../../../../../modules/system/assets/js/snowboard/extras/FormValidation'; +import AttachLoading from '../../../../../modules/system/assets/js/snowboard/extras/AttachLoading'; +import StripeLoader from '../../../../../modules/system/assets/js/snowboard/extras/StripeLoader'; +import Trigger from '../../../../../modules/system/assets/js/snowboard/extras/Trigger'; + +((window) => { + const snowboard = new Proxy( + new Snowboard(), + ProxyHandler, + ); + + // Cover all aliases + window.snowboard = snowboard; + window.Snowboard = snowboard; + window.SnowBoard = snowboard; + + snowboard.addPlugin('request', Request); + snowboard.addPlugin('attributeRequest', AttributeRequest); + snowboard.addPlugin('assetLoader', AssetLoader); + snowboard.addPlugin('dataConfig', DataConfig); + snowboard.addPlugin('extrasStyles', StylesheetLoader); + snowboard.addPlugin('transition', Transition); + snowboard.addPlugin('flash', Flash); + snowboard.addPlugin('flashListener', FlashListener); + snowboard.addPlugin('formValidation', FormValidation); + snowboard.addPlugin('attachLoading', AttachLoading); + snowboard.addPlugin('stripeLoader', StripeLoader); + snowboard.addPlugin('trigger', Trigger); + + snowboard.on('ready', () => { + // Scan for triggers + Array + .from(document.querySelectorAll('*')) + .filter((element) => [...element.attributes].filter( + ({ name }) => name.startsWith("data-trigger-")).length > 0 + ).forEach((element) => { + snowboard.trigger(element); + }); + }); +})(window); diff --git a/pages/snowboard/triggers.htm b/pages/snowboard/triggers.htm new file mode 100644 index 0000000..8c68f42 --- /dev/null +++ b/pages/snowboard/triggers.htm @@ -0,0 +1,44 @@ +title = "Triggers | Snowboard" +url = "/snowboard/triggers" +layout = "snowboard" +== +
+
+
+
+ {% partial 'snowboard/sections-list' %} +
+ +
+

Triggers

+ +

Value

+ + +
+ +

Trigger on value

+

A message will appear when the field contains "trigger".

+ +
+
+ +
+ Triggered! +
+
+
+ +
+
+
+
diff --git a/partials/html/foot.htm b/partials/html/foot.htm index cba625d..7f49421 100644 --- a/partials/html/foot.htm +++ b/partials/html/foot.htm @@ -14,7 +14,7 @@

- {% snowboard all %} + {% scripts %} diff --git a/partials/snowboard/sections-list.htm b/partials/snowboard/sections-list.htm index f2df710..23c088f 100644 --- a/partials/snowboard/sections-list.htm +++ b/partials/snowboard/sections-list.htm @@ -12,6 +12,9 @@

Sections

HTML Data Attribute Requests + + Triggers + Extra Features diff --git a/winter.mix.js b/winter.mix.js index fab7d14..69359ef 100644 --- a/winter.mix.js +++ b/winter.mix.js @@ -9,3 +9,5 @@ mix.postCss('assets/css/base.css', 'assets/css/theme.css', [ require('tailwindcss'), require('autoprefixer') ]); + +mix.js('assets/js/src/app.js', 'assets/js/app.js'); From 28a25a3cec4855be18404e0742a016e1ae858f6f Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Mon, 15 Jul 2024 12:56:09 +0800 Subject: [PATCH 2/7] Add trigger examples --- .gitignore | 1 - assets/css/theme.css | 24 +- assets/js/app.js | 6056 ++++++++++++++++++++++++++++++++++ assets/js/src/app.js | 2 +- pages/snowboard/triggers.htm | 167 +- 5 files changed, 6232 insertions(+), 18 deletions(-) create mode 100644 assets/js/app.js diff --git a/.gitignore b/.gitignore index d878d47..0e35331 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # NPM and Webpack node_modules mix.webpack.js -assets/js/app.js assets/js/app.js.LICENSE.txt # OS files diff --git a/assets/css/theme.css b/assets/css/theme.css index 5682916..f3e202a 100644 --- a/assets/css/theme.css +++ b/assets/css/theme.css @@ -772,6 +772,9 @@ video { .rounded-lg { border-radius: 0.5rem; } +.rounded-md { + border-radius: 0.375rem; +} .rounded-tl { border-top-left-radius: 0.25rem; } @@ -868,6 +871,14 @@ video { --tw-bg-opacity: 1; background-color: rgb(220 38 38 / var(--tw-bg-opacity)); } +.bg-green-800 { + --tw-bg-opacity: 1; + background-color: rgb(22 101 52 / var(--tw-bg-opacity)); +} +.bg-red-800 { + --tw-bg-opacity: 1; + background-color: rgb(153 27 27 / var(--tw-bg-opacity)); +} .bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); } @@ -940,6 +951,9 @@ video { .p-8 { padding: 2rem; } +.p-2 { + padding: 0.5rem; +} .px-10 { padding-left: 2.5rem; padding-right: 2.5rem; @@ -1075,6 +1089,10 @@ video { --tw-text-opacity: 1; color: rgb(22 163 74 / var(--tw-text-opacity)); } +.text-green-700 { + --tw-text-opacity: 1; + color: rgb(21 128 61 / var(--tw-text-opacity)); +} .text-purple-300 { --tw-text-opacity: 1; color: rgb(196 181 253 / var(--tw-text-opacity)); @@ -1087,10 +1105,6 @@ video { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } -.text-green-700 { - --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity)); -} .underline { text-decoration-line: underline; } @@ -1453,4 +1467,4 @@ p + h6 { } -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixvRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtB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SUFBQTtFQW9FQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9iYXNlLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL2NvbXBvbmVudHMuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvdXRpbGl0aWVzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL3NlY3Rpb25zL3VzZXIuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiQHRhaWx3aW5kIGJhc2U7XG4iLCJAdGFpbHdpbmQgY29tcG9uZW50cztcbiIsIkB0YWlsd2luZCB1dGlsaXRpZXM7XG4iLCIjYWNjb3VudC1jb21wb25lbnQge1xuICAgIC5yb3cge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbGc6Z3JpZCBsZzpncmlkLWNvbHMtMiBnYXAtMTA7XG5cbiAgICAgICAgLmNvbC1tZC02IHtcbiAgICAgICAgICAgIEBhcHBseSBoLWF1dG8gbGc6aC1mdWxsIHAtOCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGJnLWdyYXktNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBmbGV4IGZsZXgtY29sIGdhcC0yO1xuXG4gICAgICAgIC5mb3JtLWxhYmVsLCBsYWJlbCB7XG4gICAgICAgICAgICBAYXBwbHkgZm9udC1ib2xkIHRleHQtc20gdGV4dC1ncmF5LTYwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICAgICAgQGFwcGx5IGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBwLTIgZm9jdXM6b3V0bGluZSBmb2N1czpvdXRsaW5lLWJsdWUtNTAwIHBsYWNlaG9sZGVyOnRleHQtZ3JheS0zMDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCArIC5mb3JtLWdyb3VwIHtcbiAgICAgICAgQGFwcGx5IG10LTQ7XG4gICAgfVxuXG4gICAgLmJ0biB7XG4gICAgICAgIEBhcHBseSBtdC04IGlubGluZS1mbGV4IGZvbnQtYm9sZCB0ZXh0LXNtIHJvdW5kZWQtbGcgdHJhbnNpdGlvbiB0cmFuc2Zvcm0gYWN0aXZlOnNjYWxlLTkwIHB5LTQgcHgtOCBiZy1ncmVlbi02MDAgdGV4dC13aGl0ZSBob3ZlcjpiZy1ncmVlbi01MDA7XG4gICAgfVxuXG4gICAgLmRlYWN0aXZhdGUge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbXQtNCB0ZXh0LXJlZC02MDAgaG92ZXI6dGV4dC1yZWQtODAwO1xuICAgIH1cblxuICAgICNhY2NvdW50RGVhY3RpdmF0ZUZvcm0ge1xuICAgICAgICBAYXBwbHkgbXQtOCBib3JkZXIgYm9yZGVyLXJlZC0yMDAgYmctcmVkLTUwIHAtODtcblxuICAgICAgICAuYnRuIHtcbiAgICAgICAgICAgIEBhcHBseSBiZy1yZWQtNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctcmVkLTUwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5idG4gKyBhIHtcbiAgICAgICAgICAgIEBhcHBseSBtbC00O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGltcG9ydCAndGFpbHdpbmRjc3MvYmFzZSc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy9jb21wb25lbnRzJztcbkBpbXBvcnQgJ3RhaWx3aW5kY3NzL3V0aWxpdGllcyc7XG5AaW1wb3J0ICcuL3NlY3Rpb25zL3VzZXIuY3NzJztcblxuLyogRGVmYXVsdCBmb250ICovXG5ib2R5IHtcbiAgICBAYXBwbHkgdGV4dC1ncmF5LTUwMCBmb250LWJvZHk7XG59XG5cbi8qIERpc2FibGUgT1NYIHNjcm9sbGluZyBib3VuY2UgZWZmZWN0ICovXG5odG1sLFxuYm9keSB7XG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogbm9uZTtcbn1cblxuLyogSGVhZGluZyBzdHlsZXMgKi9cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS03MDAgZm9udC1oZWFkaW5nIG1iLTY7XG59XG5cbmgxIHtcbiAgICBAYXBwbHkgdGV4dC00eGw7XG59XG5cbmgyIHtcbiAgICBAYXBwbHkgdGV4dC0yeGw7XG59XG5cbmgzIHtcbiAgICBAYXBwbHkgdGV4dC14bDtcbn1cblxuaDQge1xuICAgIEBhcHBseSB0ZXh0LWxnO1xufVxuXG4vKiBQYXJhZ3JhcGhzIGFuZCBzcGFjaW5nICovXG5wIHtcbiAgICBAYXBwbHkgbWItNDtcbn1cblxucDpsYXN0LWNoaWxkIHtcbiAgICBAYXBwbHkgbWItMDtcbn1cblxucCArIGgxLFxucCArIGgyLFxucCArIGgzLFxucCArIGg0LFxucCArIGg1LFxucCArIGg2IHtcbiAgICBAYXBwbHkgbXQtODtcbn1cblxuLyogSGVybyAqL1xuLmhlcm8ge1xuICAgIEBhcHBseSBweC0xNiBwdC01MiBwYi0yOCB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cblxuLmhlcm8tc21hbGwge1xuICAgIEBhcHBseSBweC0xNiBwdC0zMiBwYi0xNiB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsb0VBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFB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QUFBO0VBb0VBOztFQXBFQTtJQUFBO0VBb0VBO0FBQUE7QUFwRUE7O0VBQUE7SUFBQSxpQkFvRUE7SUFwRUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9jb21wb25lbnRzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL3V0aWxpdGllcy5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4vYXNzZXRzL2Nzcy9zZWN0aW9ucy91c2VyLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL2Jhc2UuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIkB0YWlsd2luZCBiYXNlO1xuIiwiQHRhaWx3aW5kIGNvbXBvbmVudHM7XG4iLCJAdGFpbHdpbmQgdXRpbGl0aWVzO1xuIiwiI2FjY291bnQtY29tcG9uZW50IHtcbiAgICAucm93IHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIGxnOmdyaWQgbGc6Z3JpZC1jb2xzLTIgZ2FwLTEwO1xuXG4gICAgICAgIC5jb2wtbWQtNiB7XG4gICAgICAgICAgICBAYXBwbHkgaC1hdXRvIGxnOmgtZnVsbCBwLTggYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy1ncmF5LTUwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAge1xuICAgICAgICBAYXBwbHkgZmxleCBmbGV4LWNvbCBnYXAtMjtcblxuICAgICAgICAuZm9ybS1sYWJlbCwgbGFiZWwge1xuICAgICAgICAgICAgQGFwcGx5IGZvbnQtYm9sZCB0ZXh0LXNtIHRleHQtZ3JheS02MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgICAgICAgIEBhcHBseSBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgcC0yIGZvY3VzOm91dGxpbmUgZm9jdXM6b3V0bGluZS1ibHVlLTUwMCBwbGFjZWhvbGRlcjp0ZXh0LWdyYXktMzAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAgKyAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBtdC00O1xuICAgIH1cblxuICAgIC5idG4ge1xuICAgICAgICBAYXBwbHkgbXQtOCBpbmxpbmUtZmxleCBmb250LWJvbGQgdGV4dC1zbSByb3VuZGVkLWxnIHRyYW5zaXRpb24gdHJhbnNmb3JtIGFjdGl2ZTpzY2FsZS05MCBweS00IHB4LTggYmctZ3JlZW4tNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctZ3JlZW4tNTAwO1xuICAgIH1cblxuICAgIC5kZWFjdGl2YXRlIHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIG10LTQgdGV4dC1yZWQtNjAwIGhvdmVyOnRleHQtcmVkLTgwMDtcbiAgICB9XG5cbiAgICAjYWNjb3VudERlYWN0aXZhdGVGb3JtIHtcbiAgICAgICAgQGFwcGx5IG10LTggYm9yZGVyIGJvcmRlci1yZWQtMjAwIGJnLXJlZC01MCBwLTg7XG5cbiAgICAgICAgLmJ0biB7XG4gICAgICAgICAgICBAYXBwbHkgYmctcmVkLTYwMCB0ZXh0LXdoaXRlIGhvdmVyOmJnLXJlZC01MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuYnRuICsgYSB7XG4gICAgICAgICAgICBAYXBwbHkgbWwtNDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBpbXBvcnQgJ3RhaWx3aW5kY3NzL2Jhc2UnO1xuQGltcG9ydCAndGFpbHdpbmRjc3MvY29tcG9uZW50cyc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy91dGlsaXRpZXMnO1xuQGltcG9ydCAnLi9zZWN0aW9ucy91c2VyLmNzcyc7XG5cbi8qIERlZmF1bHQgZm9udCAqL1xuYm9keSB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS01MDAgZm9udC1ib2R5O1xufVxuXG4vKiBEaXNhYmxlIE9TWCBzY3JvbGxpbmcgYm91bmNlIGVmZmVjdCAqL1xuaHRtbCxcbmJvZHkge1xuICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmU7XG59XG5cbi8qIEhlYWRpbmcgc3R5bGVzICovXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICAgIEBhcHBseSB0ZXh0LWdyYXktNzAwIGZvbnQtaGVhZGluZyBtYi02O1xufVxuXG5oMSB7XG4gICAgQGFwcGx5IHRleHQtNHhsO1xufVxuXG5oMiB7XG4gICAgQGFwcGx5IHRleHQtMnhsO1xufVxuXG5oMyB7XG4gICAgQGFwcGx5IHRleHQteGw7XG59XG5cbmg0IHtcbiAgICBAYXBwbHkgdGV4dC1sZztcbn1cblxuLyogUGFyYWdyYXBocyBhbmQgc3BhY2luZyAqL1xucCB7XG4gICAgQGFwcGx5IG1iLTQ7XG59XG5cbnA6bGFzdC1jaGlsZCB7XG4gICAgQGFwcGx5IG1iLTA7XG59XG5cbnAgKyBoMSxcbnAgKyBoMixcbnAgKyBoMyxcbnAgKyBoNCxcbnAgKyBoNSxcbnAgKyBoNiB7XG4gICAgQGFwcGx5IG10LTg7XG59XG5cbi8qIEhlcm8gKi9cbi5oZXJvIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtNTIgcGItMjggdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG5cbi5oZXJvLXNtYWxsIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtMzIgcGItMTYgdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file diff --git a/assets/js/app.js b/assets/js/app.js new file mode 100644 index 0000000..ffffed9 --- /dev/null +++ b/assets/js/app.js @@ -0,0 +1,6056 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/abstracts/PluginBase.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PluginBase) +/* harmony export */ }); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +/** + * Plugin base abstract. + * + * This class provides the base functionality for all plugins. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var PluginBase = /*#__PURE__*/function () { + /** + * Constructor. + * + * The constructor is provided the Snowboard framework instance, and should not be overwritten + * unless you absolutely know what you're doing. + * + * @param {Snowboard} snowboard + */ + function PluginBase(snowboard) { + _classCallCheck(this, PluginBase); + this.snowboard = snowboard; + } + + /** + * Plugin constructor. + * + * This method should be treated as the true constructor of a plugin, and can be overwritten. + * It will be called straight after construction. + */ + return _createClass(PluginBase, [{ + key: "construct", + value: function construct() {} + + /** + * Defines the required plugins for this specific module to work. + * + * @returns {string[]} An array of plugins required for this module to work, as strings. + */ + }, { + key: "dependencies", + value: function dependencies() { + return []; + } + + /** + * Defines the listener methods for global events. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return {}; + } + + /** + * Plugin destructor. + * + * Fired when this plugin is removed. Can be manually called if you have another scenario for + * destruction, ie. the element attached to the plugin is removed or changed. + */ + }, { + key: "destruct", + value: function destruct() { + this.detach(); + delete this.snowboard; + } + + /** + * Plugin destructor (old method name). + * + * Allows previous usage of the "destructor" method to still work. + */ + }, { + key: "destructor", + value: function destructor() { + this.destruct(); + } + }]); +}(); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js": +/*!***********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/abstracts/Singleton.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Singleton) +/* harmony export */ }); +/* harmony import */ var _PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Singleton plugin abstract. + * + * This is a special definition class that the Snowboard framework will use to interpret the current plugin as a + * "singleton". This will ensure that only one instance of the plugin class is used across the board. + * + * Singletons are initialised on the "domReady" event by default. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Singleton = /*#__PURE__*/function (_PluginBase) { + function Singleton() { + _classCallCheck(this, Singleton); + return _callSuper(this, Singleton, arguments); + } + _inherits(Singleton, _PluginBase); + return _createClass(Singleton); +}(_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/ajax/Request.js": +/*!****************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/ajax/Request.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Request) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } +function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Request plugin. + * + * This is the default AJAX handler which will run using the `fetch()` method that is default in modern browsers. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Request = /*#__PURE__*/function (_PluginBase) { + function Request() { + _classCallCheck(this, Request); + return _callSuper(this, Request, arguments); + } + _inherits(Request, _PluginBase); + return _createClass(Request, [{ + key: "construct", + value: + /** + * Constructor. + * + * The constructor accepts 2 or 3 parameters. + * + * If 2 parameters are provided, the first parameter is the handler name and the second + * parameter is the options. This assumes that this is a detached AJAX request not connected to + * an element. + * + * If 3 parameters are provided, the first parameter is an element or a selector, and the second + * and third parameters are the handler and options, respectively. + * + * @param {HTMLElement|string} element + * @param {string|Object} handler + * @param {Object} options + */ + function construct(element, handler, options) { + var _this = this; + if (typeof element === 'string') { + // Allow the element to be a handler name. + // This assumes the request is being made against no element, and the handler parameter + // will contain options. + if (this.isHandlerName(element)) { + this.element = null; + this.handler = element; + this.options = handler || {}; + } else { + var matchedElement = document.querySelector(element); + if (matchedElement === null) { + throw new Error("No element was found with the given selector: ".concat(element)); + } + this.element = matchedElement; + this.handler = handler; + this.options = options || {}; + } + } else { + this.element = element; + this.handler = handler; + this.options = options || {}; + } + this.fetchOptions = {}; + this.responseData = null; + this.responseError = null; + this.cancelled = false; + this.checkRequest(); + if (!this.snowboard.globalEvent('ajaxSetup', this)) { + this.cancelled = true; + return; + } + if (this.element) { + var event = new Event('ajaxSetup', { + cancelable: true + }); + event.request = this; + this.element.dispatchEvent(event); + if (event.defaultPrevented) { + this.cancelled = true; + return; + } + } + if (!this.doClientValidation()) { + this.cancelled = true; + return; + } + if (this.confirm) { + this.doConfirm().then(function (confirmed) { + if (confirmed) { + _this.doAjax().then(function (response) { + if (response.cancelled) { + _this.cancelled = true; + _this.complete(); + return; + } + _this.responseData = response; + _this.processUpdate(response).then(function () { + if (response.X_WINTER_SUCCESS === false) { + _this.processError(response); + } else { + _this.processResponse(response); + } + }); + }, function (error) { + _this.responseError = error; + _this.processError(error); + }); + } + }); + } else { + this.doAjax().then(function (response) { + if (response.cancelled) { + _this.cancelled = true; + _this.complete(); + return; + } + _this.responseData = response; + _this.processUpdate(response).then(function () { + if (response.X_WINTER_SUCCESS === false) { + _this.processError(response); + } else { + _this.processResponse(response); + } + }); + }, function (error) { + _this.responseError = error; + _this.processError(error); + }); + } + } + + /** + * Dependencies for this plugin. + * + * @returns {string[]} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['cookie', 'jsonParser']; + } + + /** + * Validates the element and handler given in the request. + */ + }, { + key: "checkRequest", + value: function checkRequest() { + if (this.element && this.element instanceof Element === false) { + throw new Error('The element provided must be an Element instance'); + } + if (this.handler === undefined) { + throw new Error('The AJAX handler name is not specified.'); + } + if (!this.isHandlerName(this.handler)) { + throw new Error('Invalid AJAX handler name. The correct handler name format is: "onEvent".'); + } + } + + /** + * Creates a Fetch request. + * + * This method is made available for plugins to extend or override the default fetch() settings with their own. + * + * @returns {Promise} + */ + }, { + key: "getFetch", + value: function getFetch() { + this.fetchOptions = this.options.fetchOptions !== undefined && _typeof(this.options.fetchOptions) === 'object' ? this.options.fetchOptions : { + method: 'POST', + headers: this.headers, + body: this.data, + redirect: 'follow', + mode: 'same-origin' + }; + this.snowboard.globalEvent('ajaxFetchOptions', this.fetchOptions, this); + return fetch(this.url, this.fetchOptions); + } + + /** + * Run client-side validation on the form, if available. + * + * @returns {boolean} + */ + }, { + key: "doClientValidation", + value: function doClientValidation() { + if (this.options.browserValidate === true && this.form) { + if (this.form.checkValidity() === false) { + this.form.reportValidity(); + return false; + } + } + return true; + } + + /** + * Executes the AJAX query. + * + * Returns a Promise object for when the AJAX request is completed. + * + * @returns {Promise} + */ + }, { + key: "doAjax", + value: function doAjax() { + var _this2 = this; + // Allow plugins to cancel the AJAX request before sending + if (this.snowboard.globalEvent('ajaxBeforeSend', this) === false) { + return Promise.resolve({ + cancelled: true + }); + } + var ajaxPromise = new Promise(function (resolve, reject) { + _this2.getFetch().then(function (response) { + if (!response.ok && response.status !== 406) { + if (response.headers.has('Content-Type') && response.headers.get('Content-Type').includes('/json')) { + response.json().then(function (responseData) { + if (responseData.message && responseData.exception) { + reject(_this2.renderError(responseData.message, responseData.exception, responseData.file, responseData.line, responseData.trace)); + } else { + reject(responseData); + } + }, function (error) { + reject(_this2.renderError("Unable to parse JSON response: ".concat(error))); + }); + } else { + response.text().then(function (responseText) { + reject(_this2.renderError(responseText)); + }, function (error) { + reject(_this2.renderError("Unable to process response: ".concat(error))); + }); + } + return; + } + if (response.headers.has('Content-Type') && response.headers.get('Content-Type').includes('/json')) { + response.json().then(function (responseData) { + resolve(_objectSpread(_objectSpread({}, responseData), {}, { + X_WINTER_SUCCESS: response.status !== 406, + X_WINTER_RESPONSE_CODE: response.status + })); + }, function (error) { + reject(_this2.renderError("Unable to parse JSON response: ".concat(error))); + }); + } else { + response.text().then(function (responseData) { + resolve(responseData); + }, function (error) { + reject(_this2.renderError("Unable to process response: ".concat(error))); + }); + } + }, function (responseError) { + reject(_this2.renderError("Unable to retrieve a response from the server: ".concat(responseError))); + }); + }); + this.snowboard.globalEvent('ajaxStart', ajaxPromise, this); + if (this.element) { + var event = new Event('ajaxPromise'); + event.promise = ajaxPromise; + this.element.dispatchEvent(event); + } + return ajaxPromise; + } + + /** + * Prepares for updating the partials from the AJAX response. + * + * If any partials are returned from the AJAX response, this method will also action the partial updates. + * + * Returns a Promise object which tracks when the partial update is complete. + * + * @param {Object} response + * @returns {Promise} + */ + }, { + key: "processUpdate", + value: function processUpdate(response) { + var _this3 = this; + return new Promise(function (resolve, reject) { + if (typeof _this3.options.beforeUpdate === 'function') { + if (_this3.options.beforeUpdate.apply(_this3, [response]) === false) { + resolve(); + return; + } + } + + // Extract partial information + var partials = {}; + Object.entries(response).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + key = _entry[0], + value = _entry[1]; + if (key.substr(0, 8) !== 'X_WINTER') { + partials[key] = value; + } + }); + if (Object.keys(partials).length === 0) { + if (response.X_WINTER_ASSETS) { + _this3.processAssets(response.X_WINTER_ASSETS).then(function () { + resolve(); + }, function () { + reject(); + }); + } else { + resolve(); + } + return; + } + var promises = _this3.snowboard.globalPromiseEvent('ajaxBeforeUpdate', response, _this3); + promises.then( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!response.X_WINTER_ASSETS) { + _context.next = 3; + break; + } + _context.next = 3; + return _this3.processAssets(response.X_WINTER_ASSETS); + case 3: + _this3.doUpdate(partials).then(function () { + // Allow for HTML redraw + window.requestAnimationFrame(function () { + return resolve(); + }); + }, function () { + reject(); + }); + case 4: + case "end": + return _context.stop(); + } + }, _callee); + })), function () { + resolve(); + }); + }); + } + + /** + * Updates the partials with the given content. + * + * @param {Object} partials + * @returns {Promise} + */ + }, { + key: "doUpdate", + value: function doUpdate(partials) { + var _this4 = this; + return new Promise(function (resolve) { + var affected = []; + Object.entries(partials).forEach(function (entry) { + var _entry2 = _slicedToArray(entry, 2), + partial = _entry2[0], + content = _entry2[1]; + var selector = _this4.options.update && _this4.options.update[partial] ? _this4.options.update[partial] : partial; + var mode = 'replace'; + if (selector.substr(0, 1) === '@') { + mode = 'append'; + selector = selector.substr(1); + } else if (selector.substr(0, 1) === '^') { + mode = 'prepend'; + selector = selector.substr(1); + } else if (selector.substr(0, 1) !== '#' && selector.substr(0, 1) !== '.') { + mode = 'noop'; + } + var elements = document.querySelectorAll(selector); + if (elements.length > 0) { + elements.forEach(function (element) { + switch (mode) { + case 'append': + element.innerHTML += content; + break; + case 'prepend': + element.innerHTML = content + element.innerHTML; + break; + case 'noop': + break; + case 'replace': + default: + element.innerHTML = content; + break; + } + affected.push(element); + + // Fire update event for each element that is updated + _this4.snowboard.globalEvent('ajaxUpdate', element, content, _this4); + var event = new Event('ajaxUpdate'); + event.content = content; + element.dispatchEvent(event); + }); + } + }); + _this4.snowboard.globalEvent('ajaxUpdateComplete', affected, _this4); + resolve(); + }); + } + + /** + * Processes the response data. + * + * This fires off all necessary processing functions depending on the response, ie. if there's any flash + * messages to handle, or any redirects to be undertaken. + * + * @param {Object} response + * @returns {void} + */ + }, { + key: "processResponse", + value: function processResponse(response) { + if (this.options.success && typeof this.options.success === 'function') { + if (this.options.success(this.responseData, this) === false) { + return; + } + } + + // Allow plugins to cancel any further response handling + if (this.snowboard.globalEvent('ajaxSuccess', this.responseData, this) === false) { + return; + } + + // Allow the element to cancel any further response handling + if (this.element) { + var event = new Event('ajaxDone', { + cancelable: true + }); + event.responseData = this.responseData; + event.request = this; + this.element.dispatchEvent(event); + if (event.defaultPrevented) { + return; + } + } + if (this.flash && response.X_WINTER_FLASH_MESSAGES) { + this.processFlashMessages(response.X_WINTER_FLASH_MESSAGES); + } + + // Check for a redirect from the response, or use the redirect as specified in the options. + if (this.redirect || response.X_WINTER_REDIRECT) { + this.processRedirect(this.redirect || response.X_WINTER_REDIRECT); + return; + } + this.complete(); + } + + /** + * Processes an error response from the AJAX request. + * + * This fires off all necessary processing functions depending on the error response, ie. if there's any error or + * validation messages to handle. + * + * @param {Object|Error} error + */ + }, { + key: "processError", + value: function processError(error) { + if (this.options.error && typeof this.options.error === 'function') { + if (this.options.error(this.responseError, this) === false) { + return; + } + } + + // Allow plugins to cancel any further error handling + if (this.snowboard.globalEvent('ajaxError', this.responseError, this) === false) { + return; + } + + // Allow the element to cancel any further error handling + if (this.element) { + var event = new Event('ajaxFail', { + cancelable: true + }); + event.responseError = this.responseError; + event.request = this; + this.element.dispatchEvent(event); + if (event.defaultPrevented) { + return; + } + } + if (error instanceof Error) { + this.processErrorMessage(error.message); + } else { + var skipError = false; + + // Process validation errors + if (error.X_WINTER_ERROR_FIELDS) { + skipError = this.processValidationErrors(error.X_WINTER_ERROR_FIELDS); + } + if (error.X_WINTER_ERROR_MESSAGE && !skipError) { + this.processErrorMessage(error.X_WINTER_ERROR_MESSAGE); + } + } + this.complete(); + } + + /** + * Processes a redirect response. + * + * By default, this processor will simply redirect the user in their browser. + * + * Plugins can augment this functionality from the `ajaxRedirect` event. You may also override this functionality on + * a per-request basis through the `handleRedirectResponse` callback option. If a `false` is returned from either, the + * redirect will be cancelled. + * + * @param {string} url + * @returns {void} + */ + }, { + key: "processRedirect", + value: function processRedirect(url) { + var _this5 = this; + // Run a custom per-request redirect handler. If false is returned, don't run the redirect. + if (typeof this.options.handleRedirectResponse === 'function') { + if (this.options.handleRedirectResponse.apply(this, [url]) === false) { + return; + } + } + + // Allow plugins to cancel the redirect + if (this.snowboard.globalEvent('ajaxRedirect', url, this) === false) { + return; + } + + // Indicate that the AJAX request is finished if we're still on the current page + // so that the loading indicator for redirects that just change the hash value of + // the URL instead of leaving the page will properly stop. + // @see https://github.com/octobercms/october/issues/2780 + window.addEventListener('popstate', function () { + if (_this5.element) { + var event = document.createEvent('CustomEvent'); + event.eventName = 'ajaxRedirected'; + _this5.element.dispatchEvent(event); + } + }, { + once: true + }); + window.location.assign(url); + } + + /** + * Processes an error message. + * + * By default, this processor will simply alert the user through a simple `alert()` call. + * + * Plugins can augment this functionality from the `ajaxErrorMessage` event. You may also override this functionality + * on a per-request basis through the `handleErrorMessage` callback option. If a `false` is returned from either, the + * error message handling will be cancelled. + * + * @param {string} message + * @returns {void} + */ + }, { + key: "processErrorMessage", + value: function processErrorMessage(message) { + // Run a custom per-request handler for error messages. If false is returned, do not process the error messages + // any further. + if (typeof this.options.handleErrorMessage === 'function') { + if (this.options.handleErrorMessage.apply(this, [message]) === false) { + return; + } + } + + // Allow plugins to cancel the error message being shown + if (this.snowboard.globalEvent('ajaxErrorMessage', message, this) === false) { + return; + } + + // By default, show a browser error message + window.alert(message); + } + + /** + * Processes flash messages from the response. + * + * By default, no flash message handling will occur. + * + * Plugins can augment this functionality from the `ajaxFlashMessages` event. You may also override this functionality + * on a per-request basis through the `handleFlashMessages` callback option. If a `false` is returned from either, the + * flash message handling will be cancelled. + * + * @param {Object} messages + * @returns + */ + }, { + key: "processFlashMessages", + value: function processFlashMessages(messages) { + // Run a custom per-request flash handler. If false is returned, don't show the flash message + if (typeof this.options.handleFlashMessages === 'function') { + if (this.options.handleFlashMessages.apply(this, [messages]) === false) { + return; + } + } + this.snowboard.globalEvent('ajaxFlashMessages', messages, this); + } + + /** + * Processes validation errors for fields. + * + * By default, no validation error handling will occur. + * + * Plugins can augment this functionality from the `ajaxValidationErrors` event. You may also override this functionality + * on a per-request basis through the `handleValidationErrors` callback option. If a `false` is returned from either, the + * validation error handling will be cancelled. + * + * @param {Object} fields + * @returns + */ + }, { + key: "processValidationErrors", + value: function processValidationErrors(fields) { + if (typeof this.options.handleValidationErrors === 'function') { + if (this.options.handleValidationErrors.apply(this, [this.form, fields]) === false) { + return true; + } + } + + // Allow plugins to cancel the validation errors being handled + if (this.snowboard.globalEvent('ajaxValidationErrors', this.form, fields, this) === false) { + return true; + } + return false; + } + + /** + * Processes assets returned by an AJAX request. + * + * By default, no asset processing will occur and this will return a resolved Promise. + * + * Plugins can augment this functionality from the `ajaxLoadAssets` event. This event is considered blocking, and + * allows assets to be loaded or processed before continuing with any additional functionality. + * + * @param {Object} assets + * @returns {Promise} + */ + }, { + key: "processAssets", + value: function processAssets(assets) { + return this.snowboard.globalPromiseEvent('ajaxLoadAssets', assets); + } + + /** + * Confirms the request with the user before proceeding. + * + * This is an asynchronous method. By default, it will use the browser's `confirm()` method to query the user to + * confirm the action. This method will return a Promise with a boolean value depending on whether the user confirmed + * or not. + * + * Plugins can augment this functionality from the `ajaxConfirmMessage` event. You may also override this functionality + * on a per-request basis through the `handleConfirmMessage` callback option. If a `false` is returned from either, + * the confirmation is assumed to have been denied. + * + * @returns {Promise} + */ + }, { + key: "doConfirm", + value: (function () { + var _doConfirm = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var promises, fulfilled; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof this.options.handleConfirmMessage === 'function')) { + _context2.next = 4; + break; + } + if (!(this.options.handleConfirmMessage.apply(this, [this.confirm]) === false)) { + _context2.next = 3; + break; + } + return _context2.abrupt("return", false); + case 3: + return _context2.abrupt("return", true); + case 4: + if (!(this.snowboard.listensToEvent('ajaxConfirmMessage').length === 0)) { + _context2.next = 6; + break; + } + return _context2.abrupt("return", window.confirm(this.confirm)); + case 6: + // Run custom plugin confirmations + promises = this.snowboard.globalPromiseEvent('ajaxConfirmMessage', this.confirm, this); + _context2.prev = 7; + _context2.next = 10; + return promises; + case 10: + fulfilled = _context2.sent; + if (!fulfilled) { + _context2.next = 13; + break; + } + return _context2.abrupt("return", true); + case 13: + _context2.next = 18; + break; + case 15: + _context2.prev = 15; + _context2.t0 = _context2["catch"](7); + return _context2.abrupt("return", false); + case 18: + return _context2.abrupt("return", false); + case 19: + case "end": + return _context2.stop(); + } + }, _callee2, this, [[7, 15]]); + })); + function doConfirm() { + return _doConfirm.apply(this, arguments); + } + return doConfirm; + }() + /** + * Fires off completion events for the Request. + */ + ) + }, { + key: "complete", + value: function complete() { + if (this.options.complete && typeof this.options.complete === 'function') { + this.options.complete(this.responseData, this); + } + this.snowboard.globalEvent('ajaxDone', this.responseData, this); + if (this.element) { + var event = new Event('ajaxAlways'); + event.request = this; + event.responseData = this.responseData; + event.responseError = this.responseError; + this.element.dispatchEvent(event); + } + + // Fire off the destructor + this.destruct(); + } + }, { + key: "form", + get: function get() { + if (this.options.form) { + if (typeof this.options.form === 'string') { + return document.querySelector(this.options.form); + } + return this.options.form; + } + if (!this.element) { + return null; + } + if (this.element.tagName === 'FORM') { + return this.element; + } + return this.element.closest('form'); + } + }, { + key: "context", + get: function get() { + return { + handler: this.handler, + options: this.options + }; + } + }, { + key: "headers", + get: function get() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + // Keeps compatibility with jQuery AJAX + 'X-WINTER-REQUEST-HANDLER': this.handler, + 'X-WINTER-REQUEST-PARTIALS': this.extractPartials(this.options.update || []) + }; + if (this.flash) { + headers['X-WINTER-REQUEST-FLASH'] = 1; + } + if (this.xsrfToken) { + headers['X-XSRF-TOKEN'] = this.xsrfToken; + } + return headers; + } + }, { + key: "loading", + get: function get() { + return this.options.loading || false; + } + }, { + key: "url", + get: function get() { + return this.options.url || window.location.href; + } + }, { + key: "redirect", + get: function get() { + return this.options.redirect && this.options.redirect.length ? this.options.redirect : null; + } + }, { + key: "flash", + get: function get() { + return this.options.flash || false; + } + }, { + key: "files", + get: function get() { + if (this.options.files === true) { + if (FormData === undefined) { + this.snowboard.debug('This browser does not support file uploads'); + return false; + } + return true; + } + return false; + } + }, { + key: "xsrfToken", + get: function get() { + return this.snowboard.cookie().get('XSRF-TOKEN'); + } + }, { + key: "data", + get: function get() { + var data = _typeof(this.options.data) === 'object' ? this.options.data : {}; + var formData = new FormData(this.form || undefined); + if (Object.keys(data).length > 0) { + Object.entries(data).forEach(function (entry) { + var _entry3 = _slicedToArray(entry, 2), + key = _entry3[0], + value = _entry3[1]; + formData.append(key, value); + }); + } + return formData; + } + }, { + key: "confirm", + get: function get() { + return this.options.confirm || false; + } + + /** + * Extracts partials. + * + * @param {Object} update + * @returns {string} + */ + }, { + key: "extractPartials", + value: function extractPartials(update) { + return Object.keys(update).join('&'); + } + + /** + * Renders an error with useful debug information. + * + * This method is used internally when the AJAX request could not be completed or processed correctly due to an error. + * + * @param {string} message + * @param {string} exception + * @param {string} file + * @param {Number} line + * @param {string[]} trace + * @returns {Error} + */ + }, { + key: "renderError", + value: function renderError(message, exception, file, line, trace) { + var error = new Error(message); + error.exception = exception || null; + error.file = file || null; + error.line = line || null; + error.trace = trace || []; + return error; + } + + /** + * Checks a given string to see if it is a valid AJAX handler name. + * + * @param {String} name + * @returns {Boolean} + */ + }, { + key: "isHandlerName", + value: function isHandlerName(name) { + return /^(?:\w+:{2})?on[A-Z0-9]/.test(name); + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js": +/*!**********************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AttributeRequest) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } +function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Enable Data Attributes API for AJAX requests. + * + * This is an extension of the base AJAX functionality that includes handling of HTML data attributes for processing + * AJAX requests. It is separated from the base AJAX functionality to allow developers to opt-out of data attribute + * requests if they do not intend to use them. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var AttributeRequest = /*#__PURE__*/function (_Singleton) { + function AttributeRequest() { + _classCallCheck(this, AttributeRequest); + return _callSuper(this, AttributeRequest, arguments); + } + _inherits(AttributeRequest, _Singleton); + return _createClass(AttributeRequest, [{ + key: "listens", + value: + /** + * Listeners. + * + * @returns {Object} + */ + function listens() { + return { + ready: 'ready', + ajaxSetup: 'onAjaxSetup' + }; + } + + /** + * Ready event callback. + * + * Attaches handlers to the window to listen for all request interactions. + */ + }, { + key: "ready", + value: function ready() { + this.attachHandlers(); + this.disableDefaultFormValidation(); + } + + /** + * Dependencies. + * + * @returns {string[]} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['request', 'jsonParser']; + } + + /** + * Destructor. + * + * Detaches all handlers. + */ + }, { + key: "destruct", + value: function destruct() { + this.detachHandlers(); + _get(_getPrototypeOf(AttributeRequest.prototype), "destruct", this).call(this); + } + + /** + * Attaches the necessary handlers for all request interactions. + */ + }, { + key: "attachHandlers", + value: function attachHandlers() { + var _this = this; + window.addEventListener('change', function (event) { + return _this.changeHandler(event); + }); + window.addEventListener('click', function (event) { + return _this.clickHandler(event); + }); + window.addEventListener('keydown', function (event) { + return _this.keyDownHandler(event); + }); + window.addEventListener('submit', function (event) { + return _this.submitHandler(event); + }); + } + + /** + * Disables default form validation for AJAX forms. + * + * A form that contains a `data-request` attribute to specify an AJAX call without including a `data-browser-validate` + * attribute means that the AJAX callback function will likely be handling the validation instead. + */ + }, { + key: "disableDefaultFormValidation", + value: function disableDefaultFormValidation() { + document.querySelectorAll('form[data-request]:not([data-browser-validate])').forEach(function (form) { + form.setAttribute('novalidate', true); + }); + } + + /** + * Detaches the necessary handlers for all request interactions. + */ + }, { + key: "detachHandlers", + value: function detachHandlers() { + var _this2 = this; + window.removeEventListener('change', function (event) { + return _this2.changeHandler(event); + }); + window.removeEventListener('click', function (event) { + return _this2.clickHandler(event); + }); + window.removeEventListener('keydown', function (event) { + return _this2.keyDownHandler(event); + }); + window.removeEventListener('submit', function (event) { + return _this2.submitHandler(event); + }); + } + + /** + * Handles changes to select, radio, checkbox and file inputs. + * + * @param {Event} event + */ + }, { + key: "changeHandler", + value: function changeHandler(event) { + // Check that we are changing a valid element + if (!event.target.matches('select[data-request], input[type=radio][data-request], input[type=checkbox][data-request], input[type=file][data-request]')) { + return; + } + this.processRequestOnElement(event.target); + } + + /** + * Handles clicks on hyperlinks and buttons. + * + * This event can bubble up the hierarchy to find a suitable request element. + * + * @param {Event} event + */ + }, { + key: "clickHandler", + value: function clickHandler(event) { + var currentElement = event.target; + while (currentElement && currentElement.tagName !== 'HTML') { + if (!currentElement.matches('a[data-request], button[data-request], input[type=button][data-request], input[type=submit][data-request]')) { + currentElement = currentElement.parentElement; + } else { + event.preventDefault(); + this.processRequestOnElement(currentElement); + break; + } + } + } + + /** + * Handles key presses on inputs + * + * @param {Event} event + */ + }, { + key: "keyDownHandler", + value: function keyDownHandler(event) { + // Check that we are inputting into a valid element + if (!event.target.matches('input')) { + return; + } + + // Check that the input type is valid + var validTypes = ['checkbox', 'color', 'date', 'datetime', 'datetime-local', 'email', 'image', 'month', 'number', 'password', 'radio', 'range', 'search', 'tel', 'text', 'time', 'url', 'week']; + if (validTypes.indexOf(event.target.getAttribute('type')) === -1) { + return; + } + if (event.key === 'Enter' && event.target.matches('*[data-request]')) { + this.processRequestOnElement(event.target); + event.preventDefault(); + event.stopImmediatePropagation(); + } else if (event.target.matches('*[data-track-input]')) { + this.trackInput(event.target); + } + } + + /** + * Handles form submissions. + * + * @param {Event} event + */ + }, { + key: "submitHandler", + value: function submitHandler(event) { + // Check that we are submitting a valid form + if (!event.target.matches('form[data-request]')) { + return; + } + event.preventDefault(); + this.processRequestOnElement(event.target); + } + + /** + * Processes a request on a given element, using its data attributes. + * + * @param {HTMLElement} element + */ + }, { + key: "processRequestOnElement", + value: function processRequestOnElement(element) { + var data = element.dataset; + var handler = String(data.request); + var options = { + confirm: 'requestConfirm' in data ? String(data.requestConfirm) : null, + redirect: 'requestRedirect' in data ? String(data.requestRedirect) : null, + loading: 'requestLoading' in data ? String(data.requestLoading) : null, + flash: 'requestFlash' in data, + files: 'requestFiles' in data, + browserValidate: 'requestBrowserValidate' in data, + form: 'requestForm' in data ? String(data.requestForm) : null, + url: 'requestUrl' in data ? String(data.requestUrl) : null, + update: 'requestUpdate' in data ? this.parseData(String(data.requestUpdate)) : [], + data: 'requestData' in data ? this.parseData(String(data.requestData)) : [] + }; + this.snowboard.request(element, handler, options); + } + + /** + * Sets up an AJAX request via HTML attributes. + * + * @param {Request} request + */ + }, { + key: "onAjaxSetup", + value: function onAjaxSetup(request) { + if (!request.element) { + return; + } + var fieldName = request.element.getAttribute('name'); + var data = _objectSpread(_objectSpread({}, this.getParentRequestData(request.element)), request.options.data); + if (request.element && request.element.matches('input, textarea, select, button') && !request.form && fieldName && !request.options.data[fieldName]) { + data[fieldName] = request.element.value; + } + request.options.data = data; + } + + /** + * Parses and collates all data from elements up the DOM hierarchy. + * + * @param {Element} target + * @returns {Object} + */ + }, { + key: "getParentRequestData", + value: function getParentRequestData(target) { + var _this3 = this; + var elements = []; + var data = {}; + var currentElement = target; + while (currentElement.parentElement && currentElement.parentElement.tagName !== 'HTML') { + elements.push(currentElement.parentElement); + currentElement = currentElement.parentElement; + } + elements.reverse(); + elements.forEach(function (element) { + var elementData = element.dataset; + if ('requestData' in elementData) { + data = _objectSpread(_objectSpread({}, data), _this3.parseData(elementData.requestData)); + } + }); + return data; + } + + /** + * Parses data in the Winter/October JSON format. + * + * @param {String} data + * @returns {Object} + */ + }, { + key: "parseData", + value: function parseData(data) { + var value; + if (data === undefined) { + value = ''; + } + if (_typeof(value) === 'object') { + return value; + } + try { + return this.snowboard.jsonparser().parse("{".concat(data, "}")); + } catch (e) { + throw new Error("Error parsing the data attribute on element: ".concat(e.message)); + } + } + }, { + key: "trackInput", + value: function trackInput(element) { + var _this4 = this; + var lastValue = element.dataset.lastValue; + var interval = element.dataset.trackInput || 300; + if (lastValue !== undefined && lastValue === element.value) { + return; + } + this.resetTrackInputTimer(element); + element.dataset.inputTimer = window.setTimeout(function () { + if (element.dataset.request) { + _this4.processRequestOnElement(element); + return; + } + + // Traverse up the hierarchy and find a form that sends an AJAX query + var currentElement = element; + while (currentElement.parentElement && currentElement.parentElement.tagName !== 'HTML') { + currentElement = currentElement.parentElement; + if (currentElement.tagName === 'FORM' && currentElement.dataset.request) { + _this4.processRequestOnElement(currentElement); + break; + } + } + }, interval); + } + }, { + key: "resetTrackInputTimer", + value: function resetTrackInputTimer(element) { + if (element.dataset.inputTimer) { + window.clearTimeout(element.dataset.inputTimer); + element.dataset.inputTimer = null; + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/AssetLoader.js": +/*!**********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/AssetLoader.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AssetLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } +function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Asset Loader. + * + * Provides simple asset loading functionality for Snowboard, making it easy to pre-load images or + * include JavaScript or CSS assets on the fly. + * + * By default, this loader will listen to any assets that have been requested to load in an AJAX + * response, such as responses from a component. + * + * You can also load assets manually by calling the following: + * + * ```js + * Snowboard.addPlugin('assetLoader', AssetLoader); + * Snowboard.assetLoader().processAssets(assets); + * ``` + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var AssetLoader = /*#__PURE__*/function (_Singleton) { + function AssetLoader() { + _classCallCheck(this, AssetLoader); + return _callSuper(this, AssetLoader, arguments); + } + _inherits(AssetLoader, _Singleton); + return _createClass(AssetLoader, [{ + key: "listens", + value: + /** + * Event listeners. + * + * @returns {Object} + */ + function listens() { + return { + ajaxLoadAssets: 'load' + }; + } + + /** + * Dependencies. + * + * @returns {Array} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['url']; + } + + /** + * Process and load assets. + * + * The `assets` property of this method requires an object with any of the following keys and an + * array of paths: + * + * - `js`: An array of JavaScript URLs to load + * - `css`: An array of CSS stylesheet URLs to load + * - `img`: An array of image URLs to pre-load + * + * Both `js` and `css` files will be automatically injected, however `img` files will not. + * + * This method will return a Promise that resolves when all required assets are loaded. If an + * asset fails to load, this Promise will be rejected. + * + * ESLint *REALLY* doesn't like this code, but ignore it. It's the only way it works. + * + * @param {Object} assets + * @returns {Promise} + */ + }, { + key: "load", + value: (function () { + var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(assets) { + var _iterator, _step, script, _iterator2, _step2, style, _iterator3, _step3, image; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!(assets.js && assets.js.length > 0)) { + _context.next = 24; + break; + } + _iterator = _createForOfIteratorHelper(assets.js); + _context.prev = 2; + _iterator.s(); + case 4: + if ((_step = _iterator.n()).done) { + _context.next = 16; + break; + } + script = _step.value; + _context.prev = 6; + _context.next = 9; + return this.loadScript(script); + case 9: + _context.next = 14; + break; + case 11: + _context.prev = 11; + _context.t0 = _context["catch"](6); + return _context.abrupt("return", Promise.reject(_context.t0)); + case 14: + _context.next = 4; + break; + case 16: + _context.next = 21; + break; + case 18: + _context.prev = 18; + _context.t1 = _context["catch"](2); + _iterator.e(_context.t1); + case 21: + _context.prev = 21; + _iterator.f(); + return _context.finish(21); + case 24: + if (!(assets.css && assets.css.length > 0)) { + _context.next = 48; + break; + } + _iterator2 = _createForOfIteratorHelper(assets.css); + _context.prev = 26; + _iterator2.s(); + case 28: + if ((_step2 = _iterator2.n()).done) { + _context.next = 40; + break; + } + style = _step2.value; + _context.prev = 30; + _context.next = 33; + return this.loadStyle(style); + case 33: + _context.next = 38; + break; + case 35: + _context.prev = 35; + _context.t2 = _context["catch"](30); + return _context.abrupt("return", Promise.reject(_context.t2)); + case 38: + _context.next = 28; + break; + case 40: + _context.next = 45; + break; + case 42: + _context.prev = 42; + _context.t3 = _context["catch"](26); + _iterator2.e(_context.t3); + case 45: + _context.prev = 45; + _iterator2.f(); + return _context.finish(45); + case 48: + if (!(assets.img && assets.img.length > 0)) { + _context.next = 72; + break; + } + _iterator3 = _createForOfIteratorHelper(assets.img); + _context.prev = 50; + _iterator3.s(); + case 52: + if ((_step3 = _iterator3.n()).done) { + _context.next = 64; + break; + } + image = _step3.value; + _context.prev = 54; + _context.next = 57; + return this.loadImage(image); + case 57: + _context.next = 62; + break; + case 59: + _context.prev = 59; + _context.t4 = _context["catch"](54); + return _context.abrupt("return", Promise.reject(_context.t4)); + case 62: + _context.next = 52; + break; + case 64: + _context.next = 69; + break; + case 66: + _context.prev = 66; + _context.t5 = _context["catch"](50); + _iterator3.e(_context.t5); + case 69: + _context.prev = 69; + _iterator3.f(); + return _context.finish(69); + case 72: + return _context.abrupt("return", Promise.resolve()); + case 73: + case "end": + return _context.stop(); + } + }, _callee, this, [[2, 18, 21, 24], [6, 11], [26, 42, 45, 48], [30, 35], [50, 66, 69, 72], [54, 59]]); + })); + function load(_x) { + return _load.apply(this, arguments); + } + return load; + }() + /** + * Injects and loads a JavaScript URL into the DOM. + * + * The script will be appended before the closing `` tag. + * + * @param {String} script + * @returns {Promise} + */ + ) + }, { + key: "loadScript", + value: function loadScript(script) { + var _this = this; + return new Promise(function (resolve, reject) { + // Resolve script URL + script = _this.snowboard.url().asset(script); + + // Check that script is not already loaded + var loaded = document.querySelector("script[src=\"".concat(script, "\"]")); + if (loaded) { + resolve(); + return; + } + + // Create script + var domScript = document.createElement('script'); + domScript.setAttribute('type', 'text/javascript'); + domScript.setAttribute('src', script); + domScript.addEventListener('load', function () { + _this.snowboard.globalEvent('assetLoader.loaded', 'script', script, domScript); + resolve(); + }); + domScript.addEventListener('error', function () { + _this.snowboard.globalEvent('assetLoader.error', 'script', script, domScript); + reject(new Error("Unable to load script file: \"".concat(script, "\""))); + }); + document.body.append(domScript); + }); + } + + /** + * Injects and loads a CSS stylesheet into the DOM. + * + * The stylesheet will be appended before the closing `` tag. + * + * @param {String} style + * @returns {Promise} + */ + }, { + key: "loadStyle", + value: function loadStyle(style) { + var _this2 = this; + return new Promise(function (resolve, reject) { + // Resolve style URL + style = _this2.snowboard.url().asset(style); + + // Check that stylesheet is not already loaded + var loaded = document.querySelector("link[rel=\"stylesheet\"][href=\"".concat(style, "\"]")); + if (loaded) { + resolve(); + return; + } + + // Create stylesheet + var domCss = document.createElement('link'); + domCss.setAttribute('rel', 'stylesheet'); + domCss.setAttribute('href', style); + domCss.addEventListener('load', function () { + _this2.snowboard.globalEvent('assetLoader.loaded', 'style', style, domCss); + resolve(); + }); + domCss.addEventListener('error', function () { + _this2.snowboard.globalEvent('assetLoader.error', 'style', style, domCss); + reject(new Error("Unable to load stylesheet file: \"".concat(style, "\""))); + }); + document.head.append(domCss); + }); + } + + /** + * Pre-loads an image. + * + * The image will not be injected into the DOM. + * + * @param {String} image + * @returns {Promise} + */ + }, { + key: "loadImage", + value: function loadImage(image) { + var _this3 = this; + return new Promise(function (resolve, reject) { + // Resolve script URL + image = _this3.snowboard.url().asset(image); + var img = new Image(); + img.addEventListener('load', function () { + _this3.snowboard.globalEvent('assetLoader.loaded', 'image', image, img); + resolve(); + }); + img.addEventListener('error', function () { + _this3.snowboard.globalEvent('assetLoader.error', 'image', image, img); + reject(new Error("Unable to load image file: \"".concat(image, "\""))); + }); + img.src = image; + }); + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/AttachLoading.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/AttachLoading.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AttachLoading) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Allows attaching a loading class on elements that an AJAX request is targeting. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var AttachLoading = /*#__PURE__*/function (_Singleton) { + function AttachLoading() { + _classCallCheck(this, AttachLoading); + return _callSuper(this, AttachLoading, arguments); + } + _inherits(AttachLoading, _Singleton); + return _createClass(AttachLoading, [{ + key: "dependencies", + value: + /** + * Defines dependenices. + * + * @returns {string[]} + */ + function dependencies() { + return ['request']; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ajaxStart: 'ajaxStart', + ajaxDone: 'ajaxDone' + }; + } + }, { + key: "ajaxStart", + value: function ajaxStart(promise, request) { + var _this = this; + if (!request.element) { + return; + } + if (request.element.tagName === 'FORM') { + var loadElements = request.element.querySelectorAll('[data-attach-loading]'); + if (loadElements.length > 0) { + loadElements.forEach(function (element) { + element.classList.add(_this.getLoadingClass(element)); + }); + } + } else if (request.element.dataset.attachLoading !== undefined) { + request.element.classList.add(this.getLoadingClass(request.element)); + } + } + }, { + key: "ajaxDone", + value: function ajaxDone(data, request) { + var _this2 = this; + if (!request.element) { + return; + } + if (request.element.tagName === 'FORM') { + var loadElements = request.element.querySelectorAll('[data-attach-loading]'); + if (loadElements.length > 0) { + loadElements.forEach(function (element) { + element.classList.remove(_this2.getLoadingClass(element)); + }); + } + } else if (request.element.dataset.attachLoading !== undefined) { + request.element.classList.remove(this.getLoadingClass(request.element)); + } + } + }, { + key: "getLoadingClass", + value: function getLoadingClass(element) { + return element.dataset.attachLoading !== undefined && element.dataset.attachLoading !== '' ? element.dataset.attachLoading : 'wn-loading'; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/DataConfig.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/DataConfig.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ DataConfig) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Data configuration provider. + * + * Provides a mechanism for passing configuration data through an element's data attributes. This + * is generally used for widgets or UI interactions to configure them. + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +var DataConfig = /*#__PURE__*/function (_PluginBase) { + function DataConfig() { + _classCallCheck(this, DataConfig); + return _callSuper(this, DataConfig, arguments); + } + _inherits(DataConfig, _PluginBase); + return _createClass(DataConfig, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {PluginBase} instance + * @param {HTMLElement} element + * @param {Object} localConfig + */ + function construct(instance, element, localConfig) { + if (instance instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false) { + throw new Error('You must provide a Snowboard plugin to enable data configuration'); + } + if (element instanceof HTMLElement === false) { + throw new Error('Data configuration can only be extracted from HTML elements'); + } + this.instance = instance; + this.element = element; + this.localConfig = localConfig || {}; + this.instanceConfig = {}; + this.acceptedConfigs = {}; + this.refresh(); + } + + /** + * Gets the config for this instance. + * + * If the `config` parameter is unspecified, returns the entire configuration. + * + * @param {string} config + */ + }, { + key: "get", + value: function get(config) { + if (config === undefined) { + return this.instanceConfig; + } + if (this.instanceConfig[config] !== undefined) { + return this.instanceConfig[config]; + } + return undefined; + } + + /** + * Sets the config for this instance. + * + * This allows you to override, at runtime, any configuration value as necessary. + * + * @param {string} config + * @param {any} value + * @param {boolean} persist + */ + }, { + key: "set", + value: function set(config, value, persist) { + if (config === undefined) { + throw new Error('You must provide a configuration key to set'); + } + this.instanceConfig[config] = value; + if (persist === true) { + this.element.dataset[config] = value; + this.localConfig[config] = value; + } + } + + /** + * Refreshes the configuration from the element. + * + * This will allow you to make changes to the data config on a DOM level and re-apply them + * to the config on the JavaScript side. + */ + }, { + key: "refresh", + value: function refresh() { + this.acceptedConfigs = this.getAcceptedConfigs(); + this.instanceConfig = this.processConfig(); + } + + /** + * Determines the available configurations that can be set through the data config. + * + * If an instance has an `acceptAllDataConfigs` property, set to `true`, then all data + * attributes will be available as configuration values. This can be a security concern, so + * tread carefully. + * + * Otherwise, available configurations will be determined by the keys available in an object + * returned by a `defaults()` method in the instance. + * + * @returns {string[]|boolean} + */ + }, { + key: "getAcceptedConfigs", + value: function getAcceptedConfigs() { + if (this.instance.acceptAllDataConfigs !== undefined && this.instance.acceptAllDataConfigs === true) { + return true; + } + if (this.instance.defaults !== undefined && typeof this.instance.defaults === 'function' && _typeof(this.instance.defaults()) === 'object') { + return Object.keys(this.instance.defaults()); + } + return false; + } + + /** + * Returns the default values for the instance. + * + * This will be an empty object if the instance either does not have a `defaults()` method, or + * the method itself does not return an object. + * + * @returns {object} + */ + }, { + key: "getDefaults", + value: function getDefaults() { + if (this.instance.defaults !== undefined && typeof this.instance.defaults === 'function' && _typeof(this.instance.defaults()) === 'object') { + return this.instance.defaults(); + } + return {}; + } + + /** + * Processes the configuration. + * + * Loads up the defaults, then populates it with any configuration values provided by the data + * attributes, based on the rules of the accepted configurations. + * + * This configuration object is then cached and available through `config.get()` calls. + * + * @returns {object} + */ + }, { + key: "processConfig", + value: function processConfig() { + var config = this.getDefaults(); + if (this.acceptedConfigs === false) { + return config; + } + + /* eslint-disable */ + for (var key in this.element.dataset) { + if (this.acceptedConfigs === true || this.acceptedConfigs.includes(key)) { + config[key] = this.coerceValue(this.element.dataset[key]); + } + } + for (var _key in this.localConfig) { + if (this.acceptedConfigs === true || this.acceptedConfigs.includes(_key)) { + config[_key] = this.localConfig[_key]; + } + } + /* eslint-enable */ + + return config; + } + + /** + * Coerces configuration values for JavaScript. + * + * Takes the string value returned from the data attribute and coerces it into a more suitable + * type for JavaScript processing. + * + * @param {*} value + * @returns {*} + */ + }, { + key: "coerceValue", + value: function coerceValue(value) { + var stringValue = String(value); + + // Null value + if (stringValue === 'null') { + return null; + } + + // Undefined value + if (stringValue === 'undefined') { + return undefined; + } + + // Base64 value + if (stringValue.startsWith('base64:')) { + var base64str = stringValue.replace(/^base64:/, ''); + var decoded = atob(base64str); + return this.coerceValue(decoded); + } + + // Boolean value + if (['true', 'yes'].includes(stringValue.toLowerCase())) { + return true; + } + if (['false', 'no'].includes(stringValue.toLowerCase())) { + return false; + } + + // Numeric value + if (/^[-+]?[0-9]+(\.[0-9]+)?$/.test(stringValue)) { + return Number(stringValue); + } + + // JSON value + try { + return this.snowboard.jsonParser().parse(stringValue); + } catch (e) { + return stringValue === '' ? true : stringValue; + } + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/Flash.js": +/*!****************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/Flash.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Flash) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } +function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Provides flash messages for the CMS. + * + * Flash messages will pop up at the top center of the page and will remain for 7 seconds by default. Hovering over + * the message will reset and pause the timer. Clicking on the flash message will dismiss it. + * + * Arguments: + * - "message": The content of the flash message. HTML is accepted. + * - "type": The type of flash message. This is appended as a class to the flash message itself. + * - "duration": How long the flash message will stay visible for, in seconds. Default: 7 seconds. + * + * Usage: + * Snowboard.flash('This is a flash message', 'info', 8); + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Flash = /*#__PURE__*/function (_PluginBase) { + function Flash() { + _classCallCheck(this, Flash); + return _callSuper(this, Flash, arguments); + } + _inherits(Flash, _PluginBase); + return _createClass(Flash, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {string} message + * @param {string} type + * @param {Number} duration + */ + function construct(message, type, duration) { + this.message = message; + this.type = type || 'default'; + this.duration = Number(duration || 7); + if (this.duration < 0) { + throw new Error('Flash duration must be a positive number, or zero'); + } + this.clear(); + this.timer = null; + this.flashTimer = null; + this.create(); + } + + /** + * Defines dependencies. + * + * @returns {string[]} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['transition']; + } + + /** + * Destructor. + * + * This will ensure the flash message is removed and timeout is cleared if the module is removed. + */ + }, { + key: "destruct", + value: function destruct() { + if (this.timer !== null) { + window.clearTimeout(this.timer); + } + if (this.flashTimer) { + this.flashTimer.remove(); + } + if (this.flash) { + this.flash.remove(); + this.flash = null; + this.flashTimer = null; + } + _get(_getPrototypeOf(Flash.prototype), "destruct", this).call(this); + } + + /** + * Creates the flash message. + */ + }, { + key: "create", + value: function create() { + var _this = this; + this.snowboard.globalEvent('flash.create', this); + this.flash = document.createElement('DIV'); + this.flash.innerHTML = this.message; + this.flash.classList.add('flash-message', this.type); + this.flash.removeAttribute('data-control'); + this.flash.addEventListener('click', function () { + return _this.remove(); + }); + this.flash.addEventListener('mouseover', function () { + return _this.stopTimer(); + }); + this.flash.addEventListener('mouseout', function () { + return _this.startTimer(); + }); + if (this.duration > 0) { + this.flashTimer = document.createElement('DIV'); + this.flashTimer.classList.add('flash-timer'); + this.flash.appendChild(this.flashTimer); + } else { + this.flash.classList.add('no-timer'); + } + + // Add to body + document.body.appendChild(this.flash); + this.snowboard.transition(this.flash, 'show', function () { + _this.startTimer(); + }); + } + + /** + * Removes the flash message. + */ + }, { + key: "remove", + value: function remove() { + var _this2 = this; + this.snowboard.globalEvent('flash.remove', this); + this.stopTimer(); + this.snowboard.transition(this.flash, 'hide', function () { + _this2.flash.remove(); + _this2.flash = null; + _this2.destruct(); + }); + } + + /** + * Clears all flash messages available on the page. + */ + }, { + key: "clear", + value: function clear() { + document.querySelectorAll('body > div.flash-message').forEach(function (element) { + return element.remove(); + }); + } + + /** + * Starts the timer for this flash message. + */ + }, { + key: "startTimer", + value: function startTimer() { + var _this3 = this; + if (this.duration === 0) { + return; + } + this.timerTrans = this.snowboard.transition(this.flashTimer, 'timeout', null, "".concat(this.duration, ".0s"), true); + this.timer = window.setTimeout(function () { + return _this3.remove(); + }, this.duration * 1000); + } + + /** + * Resets the timer for this flash message. + */ + }, { + key: "stopTimer", + value: function stopTimer() { + if (this.timerTrans) { + this.timerTrans.cancel(); + } + if (this.timer) { + window.clearTimeout(this.timer); + } + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/FlashListener.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/FlashListener.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ FlashListener) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Defines a default listener for flash events. + * + * Connects the Flash plugin to various events that use flash messages. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var FlashListener = /*#__PURE__*/function (_Singleton) { + function FlashListener() { + _classCallCheck(this, FlashListener); + return _callSuper(this, FlashListener, arguments); + } + _inherits(FlashListener, _Singleton); + return _createClass(FlashListener, [{ + key: "dependencies", + value: + /** + * Defines dependenices. + * + * @returns {string[]} + */ + function dependencies() { + return ['flash']; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ready: 'ready', + ajaxErrorMessage: 'ajaxErrorMessage', + ajaxFlashMessages: 'ajaxFlashMessages' + }; + } + + /** + * Do flash messages for PHP flash responses. + */ + }, { + key: "ready", + value: function ready() { + var _this = this; + document.querySelectorAll('[data-control="flash-message"]').forEach(function (element) { + _this.snowboard.flash(element.innerHTML, element.dataset.flashType, element.dataset.flashDuration); + element.remove(); + }); + } + + /** + * Shows a flash message for AJAX errors. + * + * @param {string} message + * @returns {Boolean} + */ + }, { + key: "ajaxErrorMessage", + value: function ajaxErrorMessage(message) { + this.snowboard.flash(message, 'error'); + return false; + } + + /** + * Shows flash messages returned directly from AJAX functionality. + * + * @param {Object} messages + */ + }, { + key: "ajaxFlashMessages", + value: function ajaxFlashMessages(messages) { + var _this2 = this; + Object.entries(messages).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + cssClass = _entry[0], + message = _entry[1]; + _this2.snowboard.flash(message, cssClass); + }); + return false; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/FormValidation.js": +/*!*************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/FormValidation.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ FormValidation) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Adds AJAX-driven form validation to Snowboard requests. + * + * Documentation for this feature can be found here: + * https://wintercms.com/docs/snowboard/extras#ajax-validation + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +var FormValidation = /*#__PURE__*/function (_Singleton) { + function FormValidation() { + _classCallCheck(this, FormValidation); + return _callSuper(this, FormValidation, arguments); + } + _inherits(FormValidation, _Singleton); + return _createClass(FormValidation, [{ + key: "construct", + value: + /** + * Constructor. + */ + function construct() { + this.errorBags = []; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ready: 'ready', + ajaxStart: 'clearValidation', + ajaxValidationErrors: 'doValidation' + }; + } + + /** + * Ready event handler. + */ + }, { + key: "ready", + value: function ready() { + this.collectErrorBags(document); + } + + /** + * Retrieves validation errors from an AJAX response and passes them through to the error bags. + * + * This handler returns false to cancel any further validation handling, and prevents the flash + * message that is displayed by default for field errors in AJAX requests from showing. + * + * @param {HTMLFormElement} form + * @param {Object} invalidFields + * @param {Request} request + * @returns {Boolean} + */ + }, { + key: "doValidation", + value: function doValidation(form, invalidFields, request) { + var _this = this; + if (request.element && request.element.dataset.requestValidate === undefined) { + return null; + } + if (!form) { + return null; + } + var errorBags = this.errorBags.filter(function (errorBag) { + return errorBag.form === form; + }); + errorBags.forEach(function (errorBag) { + _this.showErrorBag(errorBag, invalidFields); + }); + return false; + } + + /** + * Clears any validation errors in the given form. + * + * @param {Promise} promise + * @param {Request} request + * @returns {void} + */ + }, { + key: "clearValidation", + value: function clearValidation(promise, request) { + var _this2 = this; + if (request.element && request.element.dataset.requestValidate === undefined) { + return; + } + if (!request.form) { + return; + } + var errorBags = this.errorBags.filter(function (errorBag) { + return errorBag.form === request.form; + }); + errorBags.forEach(function (errorBag) { + _this2.hideErrorBag(errorBag); + }); + } + + /** + * Collects error bags (elements with "data-validate-error" attribute) and links them to a + * placeholder and form. + * + * The error bags will be initially hidden, and will only show when validation errors occur. + * + * @param {HTMLElement} rootNode + */ + }, { + key: "collectErrorBags", + value: function collectErrorBags(rootNode) { + var _this3 = this; + rootNode.querySelectorAll('[data-validate-error], [data-validate-for]').forEach(function (errorBag) { + var form = errorBag.closest('form[data-request-validate]'); + + // If this error bag does not reside within a validating form, remove it + if (!form) { + errorBag.parentNode.removeChild(errorBag); + return; + } + + // Find message list node, if available + var messageListElement = null; + if (errorBag.matches('[data-validate-error]')) { + messageListElement = errorBag.querySelector('[data-message]'); + } + + // Create a placeholder node + var placeholder = document.createComment(''); + + // Register error bag and replace with placeholder + var errorBagData = { + element: errorBag, + form: form, + validateFor: errorBag.dataset.validateFor ? errorBag.dataset.validateFor.split(/\s*,\s*/) : '*', + placeholder: placeholder, + messageListElement: messageListElement ? messageListElement.cloneNode(true) : null, + messageListAnchor: null, + customMessage: errorBag.dataset.validateFor ? errorBag.textContent !== '' || errorBag.childNodes.length > 0 : false + }; + + // If an message list element exists, create another placeholder to act as an anchor point + if (messageListElement) { + var messageListAnchor = document.createComment(''); + messageListElement.parentNode.replaceChild(messageListAnchor, messageListElement); + errorBagData.messageListAnchor = messageListAnchor; + } + errorBag.parentNode.replaceChild(placeholder, errorBag); + _this3.errorBags.push(errorBagData); + }); + } + + /** + * Hides an error bag, replacing the error messages with a placeholder node. + * + * @param {Object} errorBag + */ + }, { + key: "hideErrorBag", + value: function hideErrorBag(errorBag) { + if (errorBag.element.isConnected) { + errorBag.element.parentNode.replaceChild(errorBag.placeholder, errorBag.element); + } + } + + /** + * Shows an error bag with the given invalid fields. + * + * @param {Object} errorBag + * @param {Object} invalidFields + */ + }, { + key: "showErrorBag", + value: function showErrorBag(errorBag, invalidFields) { + if (!this.errorBagValidatesField(errorBag, invalidFields)) { + return; + } + if (!errorBag.element.isConnected) { + errorBag.placeholder.parentNode.replaceChild(errorBag.element, errorBag.placeholder); + } + if (errorBag.validateFor !== '*') { + if (!errorBag.customMessage) { + var firstField = Object.keys(invalidFields).filter(function (field) { + return errorBag.validateFor.includes(field); + }).shift(); + var _invalidFields$firstF = _slicedToArray(invalidFields[firstField], 1); + errorBag.element.innerHTML = _invalidFields$firstF[0]; + } + } else if (errorBag.messageListElement) { + // Remove previous error messages + errorBag.element.querySelectorAll('[data-validation-message]').forEach(function (message) { + message.parentNode.removeChild(message); + }); + Object.entries(invalidFields).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + errors = _entry[1]; + errors.forEach(function (error) { + var messageElement = errorBag.messageListElement.cloneNode(true); + messageElement.dataset.validationMessage = ''; + messageElement.innerHTML = error; + errorBag.messageListAnchor.after(messageElement); + }); + }); + } else { + var _invalidFields$Object = _slicedToArray(invalidFields[Object.keys(invalidFields).shift()], 1); + errorBag.element.innerHTML = _invalidFields$Object[0]; + } + } + + /** + * Determines if a given error bag applies for the given invalid fields. + * + * @param {Object} errorBag + * @param {Object} invalidFields + * @returns {Boolean} + */ + }, { + key: "errorBagValidatesField", + value: function errorBagValidatesField(errorBag, invalidFields) { + if (errorBag.validateFor === '*') { + return true; + } + return Object.keys(invalidFields).filter(function (field) { + return errorBag.validateFor.includes(field); + }).length > 0; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/StripeLoader.js": +/*!***********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/StripeLoader.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ StripeLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Displays a stripe at the top of the page that indicates loading. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var StripeLoader = /*#__PURE__*/function (_Singleton) { + function StripeLoader() { + _classCallCheck(this, StripeLoader); + return _callSuper(this, StripeLoader, arguments); + } + _inherits(StripeLoader, _Singleton); + return _createClass(StripeLoader, [{ + key: "dependencies", + value: + /** + * Defines dependenices. + * + * @returns {string[]} + */ + function dependencies() { + return ['request']; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ready: 'ready', + ajaxStart: 'ajaxStart' + }; + } + }, { + key: "ready", + value: function ready() { + this.counter = 0; + this.createStripe(); + } + }, { + key: "ajaxStart", + value: function ajaxStart(promise, request) { + var _this = this; + if (request.options.stripe === false) { + return; + } + this.show(); + promise.then(function () { + _this.hide(); + })["catch"](function () { + _this.hide(); + }); + } + }, { + key: "createStripe", + value: function createStripe() { + this.indicator = document.createElement('DIV'); + this.stripe = document.createElement('DIV'); + this.stripeLoaded = document.createElement('DIV'); + this.indicator.classList.add('stripe-loading-indicator', 'loaded'); + this.stripe.classList.add('stripe'); + this.stripeLoaded.classList.add('stripe-loaded'); + this.indicator.appendChild(this.stripe); + this.indicator.appendChild(this.stripeLoaded); + document.body.appendChild(this.indicator); + } + }, { + key: "show", + value: function show() { + this.counter += 1; + var newStripe = this.stripe.cloneNode(true); + this.indicator.appendChild(newStripe); + this.stripe.remove(); + this.stripe = newStripe; + if (this.counter > 1) { + return; + } + this.indicator.classList.remove('loaded'); + document.body.classList.add('wn-loading'); + } + }, { + key: "hide", + value: function hide(force) { + this.counter -= 1; + if (force === true) { + this.counter = 0; + } + if (this.counter <= 0) { + this.indicator.classList.add('loaded'); + document.body.classList.remove('wn-loading'); + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js": +/*!***************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ StylesheetLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Embeds the "extras" stylesheet into the page, if it is not loaded through the theme. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var StylesheetLoader = /*#__PURE__*/function (_Singleton) { + function StylesheetLoader() { + _classCallCheck(this, StylesheetLoader); + return _callSuper(this, StylesheetLoader, arguments); + } + _inherits(StylesheetLoader, _Singleton); + return _createClass(StylesheetLoader, [{ + key: "listens", + value: + /** + * Defines listeners. + * + * @returns {Object} + */ + function listens() { + return { + ready: 'ready' + }; + } + }, { + key: "ready", + value: function ready() { + var stylesLoaded = false; + + // Determine if stylesheet is already loaded + document.querySelectorAll('link[rel="stylesheet"]').forEach(function (css) { + if (css.href.endsWith('/modules/system/assets/css/snowboard.extras.css')) { + stylesLoaded = true; + } + }); + if (!stylesLoaded) { + var stylesheet = document.createElement('link'); + stylesheet.setAttribute('rel', 'stylesheet'); + stylesheet.setAttribute('href', this.snowboard.url().asset('/modules/system/assets/css/snowboard.extras.css')); + document.head.appendChild(stylesheet); + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/Transition.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/Transition.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Transition) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Provides transition support for elements. + * + * Transition allows CSS transitions to be controlled and callbacks to be run once completed. It works similar to Vue + * transitions with 3 stages of transition, and classes assigned to the element with the transition name suffixed with + * the stage of transition: + * + * - `in`: A class assigned to the element for the first frame of the transition, removed afterwards. This should be + * used to define the initial state of the transition. + * - `active`: A class assigned to the element for the duration of the transition. This should be used to define the + * transition itself. + * - `out`: A class assigned to the element after the first frame of the transition and kept to the end of the + * transition. This should define the end state of the transition. + * + * Usage: + * Snowboard.transition(document.element, 'transition', () => { + * console.log('Remove element after 7 seconds'); + * this.remove(); + * }, '7s'); + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Transition = /*#__PURE__*/function (_PluginBase) { + function Transition() { + _classCallCheck(this, Transition); + return _callSuper(this, Transition, arguments); + } + _inherits(Transition, _PluginBase); + return _createClass(Transition, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {HTMLElement} element The element to transition + * @param {string} transition The name of the transition, this prefixes the stages of transition. + * @param {Function} callback An optional callback to call when the transition ends. + * @param {Number} duration An optional override on the transition duration. Must be specified as 's' (secs) or 'ms' (msecs). + * @param {Boolean} trailTo If true, the "out" class will remain after the end of the transition. + */ + function construct(element, transition, callback, duration, trailTo) { + if (element instanceof HTMLElement === false) { + throw new Error('A HTMLElement must be provided for transitioning'); + } + this.element = element; + if (typeof transition !== 'string') { + throw new Error('Transition name must be specified as a string'); + } + this.transition = transition; + if (callback && typeof callback !== 'function') { + throw new Error('Callback must be a valid function'); + } + this.callback = callback; + if (duration) { + this.duration = this.parseDuration(duration); + } else { + this.duration = null; + } + this.trailTo = trailTo === true; + this.doTransition(); + } + + /** + * Maps event classes to the given transition state. + * + * @param {...any} args + * @returns {Array} + */ + }, { + key: "eventClasses", + value: function eventClasses() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + var eventClasses = { + "in": "".concat(this.transition, "-in"), + active: "".concat(this.transition, "-active"), + out: "".concat(this.transition, "-out") + }; + if (args.length === 0) { + return Object.values(eventClasses); + } + var returnClasses = []; + Object.entries(eventClasses).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + key = _entry[0], + value = _entry[1]; + if (args.indexOf(key) !== -1) { + returnClasses.push(value); + } + }); + return returnClasses; + } + + /** + * Executes the transition. + * + * @returns {void} + */ + }, { + key: "doTransition", + value: function doTransition() { + var _this = this; + // Add duration override + if (this.duration !== null) { + this.element.style.transitionDuration = this.duration; + } + this.resetClasses(); + + // Start transition - show "in" and "active" classes + this.eventClasses('in', 'active').forEach(function (eventClass) { + _this.element.classList.add(eventClass); + }); + window.requestAnimationFrame(function () { + // Ensure a transition exists + if (window.getComputedStyle(_this.element)['transition-duration'] !== '0s') { + // Listen for the transition to end + _this.element.addEventListener('transitionend', function () { + return _this.onTransitionEnd(); + }, { + once: true + }); + window.requestAnimationFrame(function () { + _this.element.classList.remove(_this.eventClasses('in')[0]); + _this.element.classList.add(_this.eventClasses('out')[0]); + }); + } else { + _this.resetClasses(); + if (_this.callback) { + _this.callback.apply(_this.element); + } + _this.destruct(); + } + }); + } + + /** + * Callback function when the transition ends. + * + * When a transition ends, the instance of the transition is automatically destructed. + * + * @returns {void} + */ + }, { + key: "onTransitionEnd", + value: function onTransitionEnd() { + var _this2 = this; + this.eventClasses('active', !this.trailTo ? 'out' : '').forEach(function (eventClass) { + _this2.element.classList.remove(eventClass); + }); + if (this.callback) { + this.callback.apply(this.element); + } + + // Remove duration override + if (this.duration !== null) { + this.element.style.transitionDuration = null; + } + this.destruct(); + } + + /** + * Cancels a transition. + * + * @returns {void} + */ + }, { + key: "cancel", + value: function cancel() { + var _this3 = this; + this.element.removeEventListener('transitionend', function () { + return _this3.onTransitionEnd; + }, { + once: true + }); + this.resetClasses(); + + // Remove duration override + if (this.duration !== null) { + this.element.style.transitionDuration = null; + } + + // Call destructor + this.destruct(); + } + + /** + * Resets the classes, removing any transition classes. + * + * @returns {void} + */ + }, { + key: "resetClasses", + value: function resetClasses() { + var _this4 = this; + this.eventClasses().forEach(function (eventClass) { + _this4.element.classList.remove(eventClass); + }); + } + + /** + * Parses a given duration and converts it to a "ms" value. + * + * @param {String} duration + * @returns {String} + */ + }, { + key: "parseDuration", + value: function parseDuration(duration) { + var parsed = /^([0-9]+(\.[0-9]+)?)(m?s)?$/.exec(duration); + var amount = Number(parsed[1]); + var unit = parsed[3] === 's' ? 'sec' : 'msec'; + return unit === 'sec' ? "".concat(amount * 1000, "ms") : "".concat(Math.floor(amount), "ms"); + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/Trigger.js": +/*!******************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/Trigger.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Trigger) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } +function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * @typedef {Object} TriggerEntity + * @property {string} trigger The selector for the trigger target element(s). + * @property {string} condition The condition that must be met for the trigger to fire. + * @property {string} action The action to perform when the trigger fires. + * @property {string} parent The parent element with which to limit the trigger scope. + * @property {HTMLElement[]} elements The target elements that this trigger applies to. + */ +/** + * @typedef {Object} TriggerElement + * @property {HTMLElement} element The target element. + * @property {string} eventName The trigger event name. + * @property {Function} event The trigger event function. + */ + +/** + * Trigger handler for HTML elements. + * + * This is a re-imagining of the Input.Trigger functionality in the original Winter CMS framework, + * initialised through the `data-trigger` attributes. + * + * In addition to remaining backwards-compatible with the original Input.Trigger functionality, this + * handler adds additional conditions and configuration for more flexible trigger usage. + * + * @see https://wintercms.com/docs/v1.2/ui/script/input-trigger + * + * @copyright 2024 Winter. + * @author Ben Thomson + */ +var Trigger = /*#__PURE__*/function (_PluginBase) { + function Trigger() { + _classCallCheck(this, Trigger); + return _callSuper(this, Trigger, arguments); + } + _inherits(Trigger, _PluginBase); + return _createClass(Trigger, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {HTMLElement} element + */ + function construct(element) { + /** + * The element this instance is attached to. + */ + this.element = element; + + /** + * @var {Map>} The triggers for this element. + */ + this.triggers = new Map(); + + /** + * @var {Set} The events that have been bound by triggers. + */ + this.events = new Set(); + this.parseTriggers(); + if (this.triggers.size > 0) { + this.resetEvents(); + this.createTriggerEvents(); + this.runEvents(); + this.snowboard.globalEvent('triggers.ready', this.element); + } + } + + /** + * Destructor. + */ + }, { + key: "destruct", + value: function destruct() { + this.resetEvents(); + _get(_getPrototypeOf(Trigger.prototype), "destruct", this).call(this); + } + + /** + * Parses the element's data attributes and determines applicable triggers. + * + * Trigger data attributes must be in the format `data-trigger-[name]-[parameter]` for multiple + * triggers, or `data-trigger-[parameter]` for single triggers. + * + * Supported parameters are: + * - `condition` or `where`: The condition that must be met for the trigger to fire. + * - `action`: The action to perform when the trigger fires. + * - `parent` or `closest-parent`: The parent element with which to limit the trigger scope. + * + * Internally, the trigger map uses the `trigger` parameter to store the trigger selector. + */ + }, { + key: "parseTriggers", + value: function parseTriggers() { + var _this = this; + var dataset = this.element.dataset; + this.triggers.clear(); + Object.keys(dataset).forEach(function (key) { + if (/-[A-Z]/.test(key)) { + throw new Error("Unable to convert camelCase to dash-style for data attribute: ".concat(key)); + } + var dashStyle = key.replace(/([A-Z])/g, function (match) { + return "-".concat(match.toLowerCase()); + }); + if (dashStyle !== 'trigger' && !dashStyle.startsWith('trigger-')) { + return; + } + var triggerParts = /([a-z0-9\-.:_]+?)(?:(?:-)(closest-parent|condition|when|action|parent))?$/i.exec(dashStyle.replace('trigger-', '').toLowerCase()); + var triggerName = null; + var triggerType = null; + if (['trigger', 'condition', 'action', 'parent', 'when', 'closest'].indexOf(triggerParts[1]) !== -1 && (triggerParts[1] !== 'closest' || triggerParts[1] === 'closest' && triggerParts[2] === 'parent')) { + // Support original trigger format + triggerName = '__original'; + triggerType = triggerParts[1] === 'closest' ? 'parent' : triggerParts[1]; + } else if (triggerParts[2] === undefined || ['closest-parent', 'condition', 'when', 'action', 'parent'].indexOf(triggerParts[2]) !== -1) { + // Parse multi-trigger format + var _triggerParts = _slicedToArray(triggerParts, 2); + triggerName = _triggerParts[1]; + switch (triggerParts[2]) { + case 'closest-parent': + case 'parent': + triggerType = 'parent'; + break; + case 'condition': + case 'when': + triggerType = 'condition'; + break; + case 'action': + triggerType = 'action'; + break; + default: + triggerType = 'trigger'; + break; + } + } + if (!_this.triggers.has(triggerName)) { + _this.triggers.set(triggerName, new Map()); + } + _this.triggers.get(triggerName).set(triggerType, dataset[key]); + + // Remove trigger data attribute after parsing + delete dataset[key]; + }); + + // Validate triggers, and remove those that do not have at least a trigger selector, a + // condition and an action, or are using invalid conditions or actions + this.triggers.forEach(function (trigger, name) { + var elements = _this.getSelectableElements(trigger); + if (!trigger.has('trigger') || !trigger.has('condition') || !trigger.has('action') || elements.length === 0 || !_this.isValidCondition(trigger) || !_this.isValidAction(trigger)) { + _this.triggers["delete"](name); + } else { + trigger.set('elements', elements); + } + }); + } + + /** + * Parses a command given as either a condition or an action. + * + * Commands are formatted as: name:parameter1,parameter2,parameter3, although we also support + * the old format of value[parameter1,parameter2,parameter3] for the `value` command only. + * + * If a parameter requires a comma within, the parameter should be wrapped in quotes. + * + * @param {string} command + * @returns {name: string, parameters: string[]} + */ + }, { + key: "parseCommand", + value: function parseCommand(command) { + // Support old-format value command (value[foo,bar]) + if (command.startsWith('value')) { + var match = command.match(/[^[\]]+(?=])/g); + var values = []; + + // Split values with commas + match.forEach(function (value) { + if (!value.includes(',')) { + values.push(value.replace(/^['"]|['"]$/g, '').trim()); + return; + } + var splitValues = value.replace(/("[^"]*")|('[^']*')/g, function (quoted) { + return quoted.replace(/,/g, '|||'); + }).split(',').map(function (splitValue) { + return splitValue.replace(/\|\|\|/g, ',').replace(/^['"]|['"]$/g, '').trim(); + }); + values.push.apply(values, _toConsumableArray(splitValues)); + }); + return { + name: 'value', + parameters: values + }; + } + if (!command.includes(':')) { + return { + name: command, + parameters: [] + }; + } + var _command$split = command.split(':', 2), + _command$split2 = _slicedToArray(_command$split, 2), + name = _command$split2[0], + parameters = _command$split2[1]; + if (!parameters.includes(',')) { + return { + name: name, + parameters: [parameters] + }; + } + var splitValues = parameters.replace(/("[^"]*")|('[^']*')/g, function (quoted) { + return quoted.replace(/,/g, '|||'); + }).split(',').map(function (splitValue) { + return splitValue.replace(/\|\|\|/g, ',').replace(/^['"]|['"]$/g, '').trim(); + }); + return { + name: name, + parameters: splitValues + }; + } + + /** + * Checks if any elements are accessible by the provided trigger. + * + * @param {TriggerEntity} trigger + * @returns {HTMLElement[]} + */ + }, { + key: "getSelectableElements", + value: function getSelectableElements(trigger) { + if (trigger.has('parent')) { + return Array.from(this.element.closest(trigger.get('parent')).querySelectorAll(trigger.get('trigger'))); + } + return Array.from(document.querySelectorAll(trigger.get('trigger'))); + } + + /** + * Determines if the provided trigger condition is valid. + * + * @param {TriggerEntity} trigger + * @returns {boolean} + */ + }, { + key: "isValidCondition", + value: function isValidCondition(trigger) { + return ['checked', 'unchecked', 'empty', 'value', 'oneof', 'allof', 'focus', 'blur'].includes(this.parseCommand(trigger.get('condition')).name.toLowerCase()); + } + + /** + * Determines if the provided trigger action is valid. + * + * @param {TriggerEntity} trigger + * @returns {boolean} + */ + }, { + key: "isValidAction", + value: function isValidAction(trigger) { + return ['show', 'hide', 'enable', 'disable', 'empty', 'value', 'class', 'attr', 'style'].includes(this.parseCommand(trigger.get('action')).name.toLowerCase()); + } + + /** + * Create trigger events on trigger and target elements. + */ + }, { + key: "createTriggerEvents", + value: function createTriggerEvents() { + var _this2 = this; + this.triggers.forEach(function (trigger) { + var _this2$parseCommand = _this2.parseCommand(trigger.get('condition')), + name = _this2$parseCommand.name, + parameters = _this2$parseCommand.parameters; + switch (name) { + case 'value': + case 'oneOf': + _this2.createValueEvent.apply(_this2, [trigger, false].concat(_toConsumableArray(parameters))); + break; + case 'allOf': + _this2.createValueEvent.apply(_this2, [trigger, true].concat(_toConsumableArray(parameters))); + break; + case 'empty': + _this2.createEmptyEvent(trigger); + break; + default: + } + }); + } + + /** + * Creates a trigger that fires when the value of the target element(s) matches one of the + * provided values. + * + * @param {TriggerEntity} trigger + * @param {...string} values + */ + }, { + key: "createValueEvent", + value: function createValueEvent(trigger, all) { + var _this3 = this; + for (var _len = arguments.length, values = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + values[_key - 2] = arguments[_key]; + } + var supportedElements = new Set(); + trigger.get('elements').forEach(function (element) { + if (element.matches('input[type=button], input[type=file], input[type=image], input[type=reset], input[type=submit]')) { + // Buttons and file inputs are unsupported + return; + } + if (element.matches('input, select, textarea')) { + supportedElements.add(element); + } + }); + var thisEvent = function thisEvent() { + var elementValues = new Set(); + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + if (element.checked) { + elementValues.add(element.value); + } + return; + } + elementValues.add(element.value); + }); + if (all) { + if (values.every(function (value) { + return elementValues.has(value); + })) { + _this3.executeAction(trigger, true); + } else { + _this3.executeAction(trigger, false); + } + return; + } + if (values.some(function (value) { + return elementValues.has(value); + })) { + _this3.executeAction(trigger, true); + } else { + _this3.executeAction(trigger, false); + } + }; + supportedElements.forEach(function (element) { + var elementEvent = function elementEvent() { + return thisEvent(); + }; + if (element.matches('input[type=checkbox], input[type=radio]')) { + _this3.events.add({ + element: element, + eventName: 'click', + event: elementEvent + }); + element.addEventListener('click', elementEvent); + return; + } + _this3.events.add({ + element: element, + eventName: 'input', + event: elementEvent + }); + element.addEventListener('input', elementEvent); + }); + } + + /** + * Creates a trigger that fires when there is no value within the target element(s). + * + * @param {TriggerEntity} trigger + */ + }, { + key: "createEmptyEvent", + value: function createEmptyEvent(trigger) { + var _this4 = this; + var supportedElements = new Set(); + trigger.get('elements').forEach(function (element) { + if (element.matches('input[type=button], input[type=image], input[type=reset], input[type=submit]')) { + // Buttons and file inputs are unsupported + return; + } + if (element.matches('input, select, textarea')) { + supportedElements.add(element); + } + }); + var thisEvent = function thisEvent() { + var elementValues = new Set(); + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + if (element.checked) { + elementValues.add(element); + } + return; + } + if (element.value.trim() !== '') { + elementValues.add(element); + } + }); + if (elementValues.size === 0) { + _this4.executeAction(trigger, true); + } else { + _this4.executeAction(trigger, false); + } + }; + supportedElements.forEach(function (element) { + var elementEvent = function elementEvent() { + return thisEvent(); + }; + if (element.matches('input[type=checkbox], input[type=radio]')) { + _this4.events.add({ + element: element, + eventName: 'click', + event: elementEvent + }); + element.addEventListener('click', elementEvent); + return; + } + _this4.events.add({ + element: element, + eventName: 'input', + event: elementEvent + }); + element.addEventListener('input', elementEvent); + }); + } + }, { + key: "runEvents", + value: function runEvents() { + this.events.forEach(function (event) { + return event.event(); + }); + } + }, { + key: "resetEvents", + value: function resetEvents() { + this.events.forEach(function (event) { + event.element.removeEventListener(event.eventName, event.event); + }); + } + }, { + key: "executeAction", + value: function executeAction(trigger, conditionMet) { + var _this$parseCommand = this.parseCommand(trigger.get('action')), + name = _this$parseCommand.name, + parameters = _this$parseCommand.parameters; + switch (name) { + case 'show': + case 'hide': + this.actionShow(trigger, name === 'show' ? conditionMet : !conditionMet); + break; + default: + } + } + }, { + key: "actionShow", + value: function actionShow(trigger, show) { + if (show && this.element.style.display === 'none') { + this.element.classList.remove('hide'); + if (!this.element.dataset.originalDisplay) { + this.element.style.display = 'block'; + } else { + this.element.style.display = this.element.dataset.originalDisplay; + } + delete this.element.dataset.originalDisplay; + this.afterAction(trigger); + } else if (this.element.style.display !== 'none') { + this.element.classList.add('hide'); + this.element.dataset.originalDisplay = getComputedStyle(this.element).display; + this.element.style.display = 'none'; + this.afterAction(trigger); + } + } + }, { + key: "afterAction", + value: function afterAction(trigger) { + this.snowboard.debug('Trigger fired', this.element, trigger); + this.snowboard.globalEvent('trigger.fired', this.element, trigger); + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js": +/*!**************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/** + * Internal proxy for Snowboard. + * + * This handler wraps the Snowboard instance that is passed to the constructor of plugin instances. + * It prevents access to the following methods: + * - `attachAbstracts`: No need to attach abstracts again. + * - `loadUtilties`: No need to load utilities again. + * - `initialise`: Snowboard is already initialised. + * - `initialiseSingletons`: Singletons are already initialised. + */ +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ + get: function get(target, prop, receiver) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (['attachAbstracts', 'loadUtilities', 'initialise', 'initialiseSingletons'].includes(prop)) { + throw new Error("You cannot use the \"".concat(prop, "\" Snowboard method within a plugin.")); + } + if (target.hasPlugin(propLower)) { + return function () { + var _Reflect$get$propLowe; + return (_Reflect$get$propLowe = Reflect.get(target, 'plugins')[propLower]).getInstance.apply(_Reflect$get$propLowe, arguments); + }; + } + } + return Reflect.get(target, prop, receiver); + }, + has: function has(target, prop) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (['attachAbstracts', 'loadUtilities', 'initialise', 'initialiseSingletons'].includes(prop)) { + return false; + } + if (target.hasPlugin(propLower)) { + return true; + } + } + return Reflect.has(target, prop); + } +}); + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/PluginLoader.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/PluginLoader.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PluginLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +/* harmony import */ var _InnerProxyHandler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./InnerProxyHandler */ "../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + + + + +/** + * Plugin loader class. + * + * This is a provider (factory) class for a single plugin and provides the link between Snowboard framework functionality + * and the underlying plugin instances. It also provides some basic mocking of plugin methods for testing. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var PluginLoader = /*#__PURE__*/function () { + /** + * Constructor. + * + * Binds the Winter framework to the instance. + * + * @param {string} name + * @param {Snowboard} snowboard + * @param {PluginBase} instance + */ + function PluginLoader(name, snowboard, instance) { + _classCallCheck(this, PluginLoader); + this.name = name; + this.snowboard = new Proxy(snowboard, _InnerProxyHandler__WEBPACK_IMPORTED_MODULE_2__["default"]); + this.instance = instance; + + // Freeze instance that has been inserted into this loader + Object.freeze(this.instance); + this.instances = []; + this.singleton = { + initialised: false + }; + // Prevent further extension of the singleton status object + Object.seal(this.singleton); + this.mocks = {}; + this.originalFunctions = {}; + + // Freeze loader itself + Object.freeze(PluginLoader.prototype); + Object.freeze(this); + } + + /** + * Determines if the current plugin has a specific method available. + * + * Returns false if the current plugin is a callback function. + * + * @param {string} methodName + * @returns {boolean} + */ + return _createClass(PluginLoader, [{ + key: "hasMethod", + value: function hasMethod(methodName) { + if (this.isFunction()) { + return false; + } + return typeof this.instance.prototype[methodName] === 'function'; + } + + /** + * Calls a prototype method for a plugin. This should generally be used for "static" calls. + * + * @param {string} methodName + * @param {...} args + * @returns {any} + */ + }, { + key: "callMethod", + value: function callMethod() { + if (this.isFunction()) { + return null; + } + for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) { + parameters[_key] = arguments[_key]; + } + var args = parameters; + var methodName = args.shift(); + return this.instance.prototype[methodName](args); + } + + /** + * Returns an instance of the current plugin. + * + * - If this is a callback function plugin, the function will be returned. + * - If this is a singleton, the single instance of the plugin will be returned. + * + * @returns {PluginBase|Function} + */ + }, { + key: "getInstance", + value: function getInstance() { + var _this = this; + for (var _len2 = arguments.length, parameters = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + parameters[_key2] = arguments[_key2]; + } + if (this.isFunction()) { + return this.instance.apply(this, parameters); + } + if (!this.dependenciesFulfilled()) { + var unmet = this.getDependencies().filter(function (item) { + return !_this.snowboard.getPluginNames().includes(item); + }); + throw new Error("The \"".concat(this.name, "\" plugin requires the following plugins: ").concat(unmet.join(', '))); + } + if (this.isSingleton()) { + if (this.instances.length === 0) { + this.initialiseSingleton.apply(this, parameters); + } + + // Apply mocked methods + if (Object.keys(this.mocks).length > 0) { + Object.entries(this.originalFunctions).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + methodName = _entry[0], + callback = _entry[1]; + _this.instances[0][methodName] = callback; + }); + Object.entries(this.mocks).forEach(function (entry) { + var _entry2 = _slicedToArray(entry, 2), + methodName = _entry2[0], + callback = _entry2[1]; + _this.instances[0][methodName] = function () { + for (var _len3 = arguments.length, params = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + params[_key3] = arguments[_key3]; + } + return callback.apply(void 0, [_this].concat(params)); + }; + }); + } + return this.instances[0]; + } + + // Apply mocked methods to prototype + if (Object.keys(this.mocks).length > 0) { + Object.entries(this.originalFunctions).forEach(function (entry) { + var _entry3 = _slicedToArray(entry, 2), + methodName = _entry3[0], + callback = _entry3[1]; + _this.instance.prototype[methodName] = callback; + }); + Object.entries(this.mocks).forEach(function (entry) { + var _entry4 = _slicedToArray(entry, 2), + methodName = _entry4[0], + callback = _entry4[1]; + _this.instance.prototype[methodName] = function () { + for (var _len4 = arguments.length, params = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + params[_key4] = arguments[_key4]; + } + return callback.apply(void 0, [_this].concat(params)); + }; + }); + } + var newInstance = _construct(this.instance, [this.snowboard].concat(parameters)); + newInstance.detach = function () { + return _this.instances.splice(_this.instances.indexOf(newInstance), 1); + }; + newInstance.construct.apply(newInstance, parameters); + this.instances.push(newInstance); + return newInstance; + } + + /** + * Gets all instances of the current plugin. + * + * If this plugin is a callback function plugin, an empty array will be returned. + * + * @returns {PluginBase[]} + */ + }, { + key: "getInstances", + value: function getInstances() { + if (this.isFunction()) { + return []; + } + return this.instances; + } + + /** + * Determines if the current plugin is a simple callback function. + * + * @returns {boolean} + */ + }, { + key: "isFunction", + value: function isFunction() { + return typeof this.instance === 'function' && this.instance.prototype instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false; + } + + /** + * Determines if the current plugin is a singleton. + * + * @returns {boolean} + */ + }, { + key: "isSingleton", + value: function isSingleton() { + return this.instance.prototype instanceof _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"] === true; + } + + /** + * Determines if a singleton has been initialised. + * + * Normal plugins will always return true. + * + * @returns {boolean} + */ + }, { + key: "isInitialised", + value: function isInitialised() { + if (!this.isSingleton()) { + return true; + } + return this.singleton.initialised; + } + + /** + * Initialises the singleton instance. + * + * @returns {void} + */ + }, { + key: "initialiseSingleton", + value: function initialiseSingleton() { + var _this2 = this; + if (!this.isSingleton()) { + return; + } + for (var _len5 = arguments.length, parameters = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + parameters[_key5] = arguments[_key5]; + } + var newInstance = _construct(this.instance, [this.snowboard].concat(parameters)); + newInstance.detach = function () { + return _this2.instances.splice(_this2.instances.indexOf(newInstance), 1); + }; + newInstance.construct.apply(newInstance, parameters); + this.instances.push(newInstance); + this.singleton.initialised = true; + } + + /** + * Gets the dependencies of the current plugin. + * + * @returns {string[]} + */ + }, { + key: "getDependencies", + value: function getDependencies() { + // Callback functions cannot have dependencies. + if (this.isFunction()) { + return []; + } + + // No dependency method specified. + if (typeof this.instance.prototype.dependencies !== 'function') { + return []; + } + return this.instance.prototype.dependencies().map(function (item) { + return item.toLowerCase(); + }); + } + + /** + * Determines if the current plugin has all its dependencies fulfilled. + * + * @returns {boolean} + */ + }, { + key: "dependenciesFulfilled", + value: function dependenciesFulfilled() { + var _this3 = this; + var dependencies = this.getDependencies(); + var fulfilled = true; + dependencies.forEach(function (plugin) { + if (!_this3.snowboard.hasPlugin(plugin)) { + fulfilled = false; + } + }); + return fulfilled; + } + + /** + * Allows a method of an instance to be mocked for testing. + * + * This mock will be applied for the life of an instance. For singletons, the mock will be applied for the life + * of the page. + * + * Mocks cannot be applied to callback function plugins. + * + * @param {string} methodName + * @param {Function} callback + */ + }, { + key: "mock", + value: function mock(methodName, callback) { + var _this4 = this; + if (this.isFunction()) { + return; + } + if (!this.instance.prototype[methodName]) { + throw new Error("Function \"".concat(methodName, "\" does not exist and cannot be mocked")); + } + this.mocks[methodName] = callback; + this.originalFunctions[methodName] = this.instance.prototype[methodName]; + if (this.isSingleton() && this.instances.length === 0) { + this.initialiseSingleton(); + + // Apply mocked method + this.instances[0][methodName] = function () { + for (var _len6 = arguments.length, parameters = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { + parameters[_key6] = arguments[_key6]; + } + return callback.apply(void 0, [_this4].concat(parameters)); + }; + } + } + + /** + * Removes a mock callback from future instances. + * + * @param {string} methodName + */ + }, { + key: "unmock", + value: function unmock(methodName) { + if (this.isFunction()) { + return; + } + if (!this.mocks[methodName]) { + return; + } + if (this.isSingleton()) { + this.instances[0][methodName] = this.originalFunctions[methodName]; + } + delete this.mocks[methodName]; + delete this.originalFunctions[methodName]; + } + }]); +}(); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/ProxyHandler.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/ProxyHandler.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ + get: function get(target, prop, receiver) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (target.hasPlugin(propLower)) { + return function () { + var _Reflect$get$propLowe; + return (_Reflect$get$propLowe = Reflect.get(target, 'plugins')[propLower]).getInstance.apply(_Reflect$get$propLowe, arguments); + }; + } + } + return Reflect.get(target, prop, receiver); + }, + has: function has(target, prop) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (target.hasPlugin(propLower)) { + return true; + } + } + return Reflect.has(target, prop); + } +}); + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/Snowboard.js": +/*!******************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/Snowboard.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Snowboard) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +/* harmony import */ var _PluginLoader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PluginLoader */ "../../modules/system/assets/js/snowboard/main/PluginLoader.js"); +/* harmony import */ var _utilities_Cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/Cookie */ "../../modules/system/assets/js/snowboard/utilities/Cookie.js"); +/* harmony import */ var _utilities_JsonParser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/JsonParser */ "../../modules/system/assets/js/snowboard/utilities/JsonParser.js"); +/* harmony import */ var _utilities_Sanitizer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities/Sanitizer */ "../../modules/system/assets/js/snowboard/utilities/Sanitizer.js"); +/* harmony import */ var _utilities_Url__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utilities/Url */ "../../modules/system/assets/js/snowboard/utilities/Url.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + + + + + + + + +/** + * Snowboard - the Winter JavaScript framework. + * + * This class represents the base of a modern take on the Winter JS framework, being fully extensible and taking advantage + * of modern JavaScript features by leveraging the Laravel Mix compilation framework. It also is coded up to remove the + * dependency of jQuery. + * + * @copyright 2021 Winter. + * @author Ben Thomson + * @link https://wintercms.com/docs/snowboard/introduction + */ +var Snowboard = /*#__PURE__*/function () { + /** + * Constructor. + * + * @param {boolean} autoSingletons Automatically load singletons when DOM is ready. Default: `true`. + * @param {boolean} debug Whether debugging logs should be shown. Default: `false`. + */ + function Snowboard(autoSingletons, debug) { + _classCallCheck(this, Snowboard); + this.debugEnabled = typeof debug === 'boolean' && debug === true; + this.autoInitSingletons = typeof autoSingletons === 'boolean' && autoSingletons === false; + this.plugins = {}; + this.listeners = {}; + this.foundBaseUrl = null; + this.readiness = { + dom: false + }; + // Seal readiness from being added to further, but allow the properties to be modified. + Object.seal(this.readiness); + this.attachAbstracts(); + + // Freeze the Snowboard class to prevent further modifications. + Object.freeze(Snowboard.prototype); + Object.freeze(this); + this.loadUtilities(); + this.initialise(); + this.debug('Snowboard framework initialised'); + } + + /** + * Attaches abstract classes as properties of the Snowboard class. + * + * This will allow Javascript functionality with no build process to still extend these abstracts by prefixing + * them with "Snowboard". + * + * ``` + * class MyClass extends Snowboard.PluginBase { + * ... + * } + * ``` + */ + return _createClass(Snowboard, [{ + key: "attachAbstracts", + value: function attachAbstracts() { + this.PluginBase = _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]; + this.Singleton = _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"]; + Object.freeze(this.PluginBase.prototype); + Object.freeze(this.PluginBase); + Object.freeze(this.Singleton.prototype); + Object.freeze(this.Singleton); + } + + /** + * Loads the default utilities. + */ + }, { + key: "loadUtilities", + value: function loadUtilities() { + this.addPlugin('cookie', _utilities_Cookie__WEBPACK_IMPORTED_MODULE_3__["default"]); + this.addPlugin('jsonParser', _utilities_JsonParser__WEBPACK_IMPORTED_MODULE_4__["default"]); + this.addPlugin('sanitizer', _utilities_Sanitizer__WEBPACK_IMPORTED_MODULE_5__["default"]); + this.addPlugin('url', _utilities_Url__WEBPACK_IMPORTED_MODULE_6__["default"]); + } + + /** + * Initialises the framework. + * + * Attaches a listener for the DOM being ready and triggers a global "ready" event for plugins to begin attaching + * themselves to the DOM. + */ + }, { + key: "initialise", + value: function initialise() { + var _this = this; + window.addEventListener('DOMContentLoaded', function () { + if (_this.autoInitSingletons) { + _this.initialiseSingletons(); + } + _this.globalEvent('ready'); + _this.readiness.dom = true; + }); + } + + /** + * Initialises an instance of every singleton. + */ + }, { + key: "initialiseSingletons", + value: function initialiseSingletons() { + Object.values(this.plugins).forEach(function (plugin) { + if (plugin.isSingleton() && plugin.dependenciesFulfilled()) { + plugin.initialiseSingleton(); + } + }); + } + + /** + * Adds a plugin to the framework. + * + * Plugins are the cornerstone for additional functionality for Snowboard. A plugin must either be an ES2015 class + * that extends the PluginBase or Singleton abstract classes, or a simple callback function. + * + * When a plugin is added, it is automatically assigned as a new magic method in the Snowboard class using the name + * parameter, and can be called via this method. This method will always be the "lowercase" version of this name. + * + * For example, if a plugin is assigned to the name "myPlugin", it can be called via `Snowboard.myplugin()`. + * + * @param {string} name + * @param {PluginBase|Function} instance + */ + }, { + key: "addPlugin", + value: function addPlugin(name, instance) { + var _this2 = this; + var lowerName = name.toLowerCase(); + if (this.hasPlugin(lowerName)) { + throw new Error("A plugin called \"".concat(name, "\" is already registered.")); + } + if (typeof instance !== 'function' && instance instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false) { + throw new Error('The provided plugin must extend the PluginBase class, or must be a callback function.'); + } + if (this[name] !== undefined || this[lowerName] !== undefined) { + throw new Error('The given name is already in use for a property or method of the Snowboard class.'); + } + this.plugins[lowerName] = new _PluginLoader__WEBPACK_IMPORTED_MODULE_2__["default"](lowerName, this, instance); + this.debug("Plugin \"".concat(name, "\" registered")); + + // Check if any singletons now have their dependencies fulfilled, and fire their "ready" handler if we're + // in a ready state. + Object.values(this.getPlugins()).forEach(function (plugin) { + if (plugin.isSingleton() && !plugin.isInitialised() && plugin.dependenciesFulfilled() && plugin.hasMethod('listens') && Object.keys(plugin.callMethod('listens')).includes('ready') && _this2.readiness.dom) { + var readyMethod = plugin.callMethod('listens').ready; + plugin.callMethod(readyMethod); + } + }); + } + + /** + * Removes a plugin. + * + * Removes a plugin from Snowboard, calling the destructor method for all active instances of the plugin. + * + * @param {string} name + * @returns {void} + */ + }, { + key: "removePlugin", + value: function removePlugin(name) { + var lowerName = name.toLowerCase(); + if (!this.hasPlugin(lowerName)) { + this.debug("Plugin \"".concat(name, "\" already removed")); + return; + } + + // Call destructors for all instances + this.plugins[lowerName].getInstances().forEach(function (instance) { + instance.destruct(); + }); + delete this.plugins[lowerName]; + delete this[lowerName]; + delete this[name]; + this.debug("Plugin \"".concat(name, "\" removed")); + } + + /** + * Determines if a plugin has been registered and is active. + * + * A plugin that is still waiting for dependencies to be registered will not be active. + * + * @param {string} name + * @returns {boolean} + */ + }, { + key: "hasPlugin", + value: function hasPlugin(name) { + var lowerName = name.toLowerCase(); + return this.plugins[lowerName] !== undefined; + } + + /** + * Returns an array of registered plugins as PluginLoader objects. + * + * @returns {PluginLoader[]} + */ + }, { + key: "getPlugins", + value: function getPlugins() { + return this.plugins; + } + + /** + * Returns an array of registered plugins, by name. + * + * @returns {string[]} + */ + }, { + key: "getPluginNames", + value: function getPluginNames() { + return Object.keys(this.plugins); + } + + /** + * Returns a PluginLoader object of a given plugin. + * + * @returns {PluginLoader} + */ + }, { + key: "getPlugin", + value: function getPlugin(name) { + var lowerName = name.toLowerCase(); + if (!this.hasPlugin(lowerName)) { + throw new Error("No plugin called \"".concat(lowerName, "\" has been registered.")); + } + return this.plugins[lowerName]; + } + + /** + * Finds all plugins that listen to the given event. + * + * This works for both normal and promise events. It does NOT check that the plugin's listener actually exists. + * + * @param {string} eventName + * @returns {string[]} The name of the plugins that are listening to this event. + */ + }, { + key: "listensToEvent", + value: function listensToEvent(eventName) { + var plugins = []; + Object.entries(this.plugins).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + name = _entry[0], + plugin = _entry[1]; + if (plugin.isFunction()) { + return; + } + if (!plugin.dependenciesFulfilled()) { + return; + } + if (!plugin.hasMethod('listens')) { + return; + } + var listeners = plugin.callMethod('listens'); + if (typeof listeners[eventName] === 'string' || typeof listeners[eventName] === 'function') { + plugins.push(name); + } + }); + return plugins; + } + + /** + * Add a simple ready listener. + * + * Synonymous with jQuery's "$(document).ready()" functionality, this allows inline scripts to + * attach themselves to Snowboard immediately but only fire when the DOM is ready. + * + * @param {Function} callback + */ + }, { + key: "ready", + value: function ready(callback) { + if (this.readiness.dom) { + callback(); + } + this.on('ready', callback); + } + + /** + * Adds a simple listener for an event. + * + * This can be used for ad-hoc scripts that don't need a full plugin. The given callback will be + * called when the event name provided fires. This works for both normal and Promise events. For + * a Promise event, your callback must return a Promise. + * + * @param {String} eventName + * @param {Function} callback + */ + }, { + key: "on", + value: function on(eventName, callback) { + if (!this.listeners[eventName]) { + this.listeners[eventName] = []; + } + if (!this.listeners[eventName].includes(callback)) { + this.listeners[eventName].push(callback); + } + } + + /** + * Removes a simple listener for an event. + * + * @param {String} eventName + * @param {Function} callback + */ + }, { + key: "off", + value: function off(eventName, callback) { + if (!this.listeners[eventName]) { + return; + } + var index = this.listeners[eventName].indexOf(callback); + if (index === -1) { + return; + } + this.listeners[eventName].splice(index, 1); + } + + /** + * Calls a global event to all registered plugins. + * + * If any plugin returns a `false`, the event is considered cancelled. + * + * @param {string} eventName + * @returns {boolean} If event was not cancelled + */ + }, { + key: "globalEvent", + value: function globalEvent(eventName) { + var _this3 = this; + for (var _len = arguments.length, parameters = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + parameters[_key - 1] = arguments[_key]; + } + this.debug.apply(this, ["Calling global event \"".concat(eventName, "\"")].concat(parameters)); + + // Find plugins listening to the event. + var listeners = this.listensToEvent(eventName); + if (listeners.length === 0) { + this.debug("No listeners found for global event \"".concat(eventName, "\"")); + return true; + } + this.debug("Listeners found for global event \"".concat(eventName, "\": ").concat(listeners.join(', '))); + var cancelled = false; + listeners.forEach(function (name) { + var plugin = _this3.getPlugin(name); + if (plugin.isFunction()) { + return; + } + if (plugin.isSingleton() && plugin.getInstances().length === 0) { + plugin.initialiseSingleton(); + } + var listenMethod = plugin.callMethod('listens')[eventName]; + + // Call event handler methods for all plugins, if they have a method specified for the event. + plugin.getInstances().forEach(function (instance) { + // If a plugin has cancelled the event, no further plugins are considered. + if (cancelled) { + return; + } + if (typeof listenMethod === 'function') { + try { + var result = listenMethod.apply(instance, parameters); + if (result === false) { + cancelled = true; + } + } catch (error) { + _this3.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); + } + } else if (typeof listenMethod === 'string') { + if (!instance[listenMethod]) { + throw new Error("Missing \"".concat(listenMethod, "\" method in \"").concat(name, "\" plugin")); + } + try { + if (instance[listenMethod].apply(instance, parameters) === false) { + cancelled = true; + _this3.debug("Global event \"".concat(eventName, "\" cancelled by \"").concat(name, "\" plugin")); + } + } catch (error) { + _this3.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); + } + } else { + _this3.error("Listen method for \"".concat(eventName, "\" event in \"").concat(name, "\" plugin is not a function or string.")); + } + }); + }); + + // Find ad-hoc listeners for this event. + if (!cancelled && this.listeners[eventName] && this.listeners[eventName].length > 0) { + this.debug("Found ".concat(this.listeners[eventName].length, " ad-hoc listener(s) for global event \"").concat(eventName, "\"")); + this.listeners[eventName].forEach(function (listener) { + // If a listener has cancelled the event, no further listeners are considered. + if (cancelled) { + return; + } + try { + if (listener.apply(void 0, parameters) === false) { + cancelled = true; + _this3.debug("Global event \"".concat(eventName, " cancelled by an ad-hoc listener.")); + } + } catch (error) { + _this3.error("Error thrown in \"".concat(eventName, "\" event by an ad-hoc listener."), error); + } + }); + } + return !cancelled; + } + + /** + * Calls a global event to all registered plugins, expecting a Promise to be returned by all. + * + * This collates all plugins responses into one large Promise that either expects all to be resolved, or one to reject. + * If no listeners are found, a resolved Promise is returned. + * + * @param {string} eventName + */ + }, { + key: "globalPromiseEvent", + value: function globalPromiseEvent(eventName) { + var _this4 = this; + for (var _len2 = arguments.length, parameters = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + parameters[_key2 - 1] = arguments[_key2]; + } + this.debug("Calling global promise event \"".concat(eventName, "\"")); + + // Find plugins listening to this event. + var listeners = this.listensToEvent(eventName); + if (listeners.length === 0) { + this.debug("No listeners found for global promise event \"".concat(eventName, "\"")); + return Promise.resolve(); + } + this.debug("Listeners found for global promise event \"".concat(eventName, "\": ").concat(listeners.join(', '))); + var promises = []; + listeners.forEach(function (name) { + var plugin = _this4.getPlugin(name); + if (plugin.isFunction()) { + return; + } + if (plugin.isSingleton() && plugin.getInstances().length === 0) { + plugin.initialiseSingleton(); + } + var listenMethod = plugin.callMethod('listens')[eventName]; + + // Call event handler methods for all plugins, if they have a method specified for the event. + plugin.getInstances().forEach(function (instance) { + if (typeof listenMethod === 'function') { + try { + var instancePromise = listenMethod.apply(instance, parameters); + if (instancePromise instanceof Promise === false) { + return; + } + promises.push(instancePromise); + } catch (error) { + _this4.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); + } + } else if (typeof listenMethod === 'string') { + if (!instance[listenMethod]) { + throw new Error("Missing \"".concat(listenMethod, "\" method in \"").concat(name, "\" plugin")); + } + try { + var _instancePromise = instance[listenMethod].apply(instance, parameters); + if (_instancePromise instanceof Promise === false) { + return; + } + promises.push(_instancePromise); + } catch (error) { + _this4.error("Error thrown in \"".concat(eventName, "\" promise event by \"").concat(name, "\" plugin."), error); + } + } else { + _this4.error("Listen method for \"".concat(eventName, "\" event in \"").concat(name, "\" plugin is not a function or string.")); + } + }); + }); + + // Find ad-hoc listeners listening to this event. + if (this.listeners[eventName] && this.listeners[eventName].length > 0) { + this.debug("Found ".concat(this.listeners[eventName].length, " ad-hoc listener(s) for global promise event \"").concat(eventName, "\"")); + this.listeners[eventName].forEach(function (listener) { + try { + var listenerPromise = listener.apply(void 0, parameters); + if (listenerPromise instanceof Promise === false) { + return; + } + promises.push(listenerPromise); + } catch (error) { + _this4.error("Error thrown in \"".concat(eventName, "\" promise event by an ad-hoc listener."), error); + } + }); + } + if (promises.length === 0) { + return Promise.resolve(); + } + return Promise.all(promises); + } + + /** + * Log a styled message in the console. + * + * Includes parameters and a stack trace. + * + * @returns {void} + */ + }, { + key: "logMessage", + value: function logMessage(color, bold, message) { + /* eslint-disable */ + console.groupCollapsed('%c[Snowboard]', "color: ".concat(color, "; font-weight: ").concat(bold ? 'bold' : 'normal', ";"), message); + for (var _len3 = arguments.length, parameters = new Array(_len3 > 3 ? _len3 - 3 : 0), _key3 = 3; _key3 < _len3; _key3++) { + parameters[_key3 - 3] = arguments[_key3]; + } + if (parameters.length) { + console.groupCollapsed("%cParameters %c(".concat(parameters.length, ")"), 'color: rgb(45, 167, 199); font-weight: bold;', 'color: rgb(88, 88, 88); font-weight: normal;'); + var index = 0; + parameters.forEach(function (param) { + index += 1; + console.log("%c".concat(index, ":"), 'color: rgb(88, 88, 88); font-weight: normal;', param); + }); + console.groupEnd(); + console.groupCollapsed('%cTrace', 'color: rgb(45, 167, 199); font-weight: bold;'); + console.trace(); + console.groupEnd(); + } else { + console.trace(); + } + console.groupEnd(); + /* eslint-enable */ + } + + /** + * Log a message. + * + * @returns {void} + */ + }, { + key: "log", + value: function log(message) { + for (var _len4 = arguments.length, parameters = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + parameters[_key4 - 1] = arguments[_key4]; + } + this.logMessage.apply(this, ['rgb(45, 167, 199)', false, message].concat(parameters)); + } + + /** + * Log a debug message. + * + * These messages are only shown when debugging is enabled. + * + * @returns {void} + */ + }, { + key: "debug", + value: function debug(message) { + if (!this.debugEnabled) { + return; + } + for (var _len5 = arguments.length, parameters = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { + parameters[_key5 - 1] = arguments[_key5]; + } + this.logMessage.apply(this, ['rgb(45, 167, 199)', false, message].concat(parameters)); + } + + /** + * Logs an error message. + * + * @returns {void} + */ + }, { + key: "error", + value: function error(message) { + for (var _len6 = arguments.length, parameters = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + parameters[_key6 - 1] = arguments[_key6]; + } + this.logMessage.apply(this, ['rgb(229, 35, 35)', true, message].concat(parameters)); + } + }]); +}(); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/Cookie.js": +/*!********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/Cookie.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Cookie) +/* harmony export */ }); +/* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! js-cookie */ "../../node_modules/js-cookie/dist/js.cookie.mjs"); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + + +/** + * Cookie utility. + * + * This utility is a thin wrapper around the "js-cookie" library. + * + * @see https://github.com/js-cookie/js-cookie + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Cookie = /*#__PURE__*/function (_Singleton) { + function Cookie() { + _classCallCheck(this, Cookie); + return _callSuper(this, Cookie, arguments); + } + _inherits(Cookie, _Singleton); + return _createClass(Cookie, [{ + key: "construct", + value: function construct() { + this.defaults = { + expires: null, + path: '/', + domain: null, + secure: false, + sameSite: 'Lax' + }; + } + + /** + * Set the default cookie parameters for all subsequent "set" and "remove" calls. + * + * @param {Object} options + */ + }, { + key: "setDefaults", + value: function setDefaults(options) { + var _this = this; + if (_typeof(options) !== 'object') { + throw new Error('Cookie defaults must be provided as an object'); + } + Object.entries(options).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + key = _entry[0], + value = _entry[1]; + if (_this.defaults[key] !== undefined) { + _this.defaults[key] = value; + } + }); + } + + /** + * Get the current default cookie parameters. + * + * @returns {Object} + */ + }, { + key: "getDefaults", + value: function getDefaults() { + var _this2 = this; + var defaults = {}; + Object.entries(this.defaults).forEach(function (entry) { + var _entry2 = _slicedToArray(entry, 2), + key = _entry2[0], + value = _entry2[1]; + if (_this2.defaults[key] !== null) { + defaults[key] = value; + } + }); + return defaults; + } + + /** + * Get a cookie by name. + * + * If `name` is undefined, returns all cookies as an Object. + * + * @param {String} name + * @returns {Object|String} + */ + }, { + key: "get", + value: function get(name) { + var _this3 = this; + if (name === undefined) { + var cookies = js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].get(); + Object.entries(cookies).forEach(function (entry) { + var _entry3 = _slicedToArray(entry, 2), + cookieName = _entry3[0], + cookieValue = _entry3[1]; + _this3.snowboard.globalEvent('cookie.get', cookieName, cookieValue, function (newValue) { + cookies[cookieName] = newValue; + }); + }); + return cookies; + } + var value = js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].get(name); + + // Allow plugins to override the gotten value + this.snowboard.globalEvent('cookie.get', name, value, function (newValue) { + value = newValue; + }); + return value; + } + + /** + * Set a cookie by name. + * + * You can specify additional cookie parameters through the "options" parameter. + * + * @param {String} name + * @param {String} value + * @param {Object} options + * @returns {String} + */ + }, { + key: "set", + value: function set(name, value, options) { + var saveValue = value; + + // Allow plugins to override the value to save + this.snowboard.globalEvent('cookie.set', name, value, function (newValue) { + saveValue = newValue; + }); + return js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].set(name, saveValue, _objectSpread(_objectSpread({}, this.getDefaults()), options)); + } + + /** + * Remove a cookie by name. + * + * You can specify the additional cookie parameters via the "options" parameter. + * + * @param {String} name + * @param {Object} options + * @returns {void} + */ + }, { + key: "remove", + value: function remove(name, options) { + js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].remove(name, _objectSpread(_objectSpread({}, this.getDefaults()), options)); + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/JsonParser.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/JsonParser.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ JsonParser) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * JSON Parser utility. + * + * This utility parses JSON-like data that does not strictly meet the JSON specifications in order to simplify development. + * It is a safe replacement for JSON.parse(JSON.stringify(eval("({" + value + "})"))) that does not require the use of eval() + * + * @author Ayumi Hamasaki + * @author Ben Thomson + * @see https://github.com/octobercms/october/pull/4527 + */ +var JsonParser = /*#__PURE__*/function (_Singleton) { + function JsonParser() { + _classCallCheck(this, JsonParser); + return _callSuper(this, JsonParser, arguments); + } + _inherits(JsonParser, _Singleton); + return _createClass(JsonParser, [{ + key: "construct", + value: function construct() { + var _this = this; + // Add to global function for backwards compatibility + window.wnJSON = function (json) { + return _this.parse(json); + }; + window.ocJSON = window.wnJSON; + } + }, { + key: "parse", + value: function parse(str) { + var jsonString = this.parseString(str); + return JSON.parse(jsonString); + } + }, { + key: "parseString", + value: function parseString(value) { + var str = value.trim(); + if (!str.length) { + throw new Error('Broken JSON object.'); + } + var result = ''; + var type = null; + var key = null; + var body = ''; + + /* + * the mistake ',' + */ + while (str && str[0] === ',') { + str = str.substr(1); + } + + /* + * string + */ + if (str[0] === '"' || str[0] === '\'') { + if (str[str.length - 1] !== str[0]) { + throw new Error('Invalid string JSON object.'); + } + body = '"'; + for (var i = 1; i < str.length; i += 1) { + if (str[i] === '\\') { + if (str[i + 1] === '\'') { + body += str[i + 1]; + } else { + body += str[i]; + body += str[i + 1]; + } + i += 1; + } else if (str[i] === str[0]) { + body += '"'; + return body; + } else if (str[i] === '"') { + body += '\\"'; + } else { + body += str[i]; + } + } + throw new Error('Invalid string JSON object.'); + } + + /* + * boolean + */ + if (str === 'true' || str === 'false') { + return str; + } + + /* + * null + */ + if (str === 'null') { + return 'null'; + } + + /* + * number + */ + var num = Number(str); + if (!Number.isNaN(num)) { + return num.toString(); + } + + /* + * object + */ + if (str[0] === '{') { + type = 'needKey'; + key = null; + result = '{'; + for (var _i = 1; _i < str.length; _i += 1) { + if (this.isBlankChar(str[_i])) { + /* eslint-disable-next-line */ + continue; + } + if (type === 'needKey' && (str[_i] === '"' || str[_i] === '\'')) { + key = this.parseKey(str, _i + 1, str[_i]); + result += "\"".concat(key, "\""); + _i += key.length; + _i += 1; + type = 'afterKey'; + } else if (type === 'needKey' && this.canBeKeyHead(str[_i])) { + key = this.parseKey(str, _i); + result += '"'; + result += key; + result += '"'; + _i += key.length - 1; + type = 'afterKey'; + } else if (type === 'afterKey' && str[_i] === ':') { + result += ':'; + type = ':'; + } else if (type === ':') { + body = this.getBody(str, _i); + _i = _i + body.originLength - 1; + result += this.parseString(body.body); + type = 'afterBody'; + } else if (type === 'afterBody' || type === 'needKey') { + var last = _i; + while (str[last] === ',' || this.isBlankChar(str[last])) { + last += 1; + } + if (str[last] === '}' && last === str.length - 1) { + while (result[result.length - 1] === ',') { + result = result.substr(0, result.length - 1); + } + result += '}'; + return result; + } + if (last !== _i && result !== '{') { + result += ','; + type = 'needKey'; + _i = last - 1; + } + } + } + throw new Error("Broken JSON object near ".concat(result)); + } + + /* + * array + */ + if (str[0] === '[') { + result = '['; + type = 'needBody'; + for (var _i2 = 1; _i2 < str.length; _i2 += 1) { + if (str[_i2] === ' ' || str[_i2] === '\n' || str[_i2] === '\t') { + /* eslint-disable-next-line */ + continue; + } else if (type === 'needBody') { + if (str[_i2] === ',') { + result += 'null,'; + /* eslint-disable-next-line */ + continue; + } + if (str[_i2] === ']' && _i2 === str.length - 1) { + if (result[result.length - 1] === ',') { + result = result.substr(0, result.length - 1); + } + result += ']'; + return result; + } + body = this.getBody(str, _i2); + _i2 = _i2 + body.originLength - 1; + result += this.parseString(body.body); + type = 'afterBody'; + } else if (type === 'afterBody') { + if (str[_i2] === ',') { + result += ','; + type = 'needBody'; + + // deal with mistake "," + while (str[_i2 + 1] === ',' || this.isBlankChar(str[_i2 + 1])) { + if (str[_i2 + 1] === ',') { + result += 'null,'; + } + _i2 += 1; + } + } else if (str[_i2] === ']' && _i2 === str.length - 1) { + result += ']'; + return result; + } + } + } + throw new Error("Broken JSON array near ".concat(result)); + } + return ''; + } + }, { + key: "getBody", + value: function getBody(str, pos) { + var body = ''; + + // parse string body + if (str[pos] === '"' || str[pos] === '\'') { + body = str[pos]; + for (var i = pos + 1; i < str.length; i += 1) { + if (str[i] === '\\') { + body += str[i]; + if (i + 1 < str.length) { + body += str[i + 1]; + } + i += 1; + } else if (str[i] === str[pos]) { + body += str[pos]; + return { + originLength: body.length, + body: body + }; + } else { + body += str[i]; + } + } + throw new Error("Broken JSON string body near ".concat(body)); + } + + // parse true / false + if (str[pos] === 't') { + if (str.indexOf('true', pos) === pos) { + return { + originLength: 'true'.length, + body: 'true' + }; + } + throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); + } + if (str[pos] === 'f') { + if (str.indexOf('f', pos) === pos) { + return { + originLength: 'false'.length, + body: 'false' + }; + } + throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); + } + + // parse null + if (str[pos] === 'n') { + if (str.indexOf('null', pos) === pos) { + return { + originLength: 'null'.length, + body: 'null' + }; + } + throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); + } + + // parse number + if (str[pos] === '-' || str[pos] === '+' || str[pos] === '.' || str[pos] >= '0' && str[pos] <= '9') { + body = ''; + for (var _i3 = pos; _i3 < str.length; _i3 += 1) { + if (str[_i3] === '-' || str[_i3] === '+' || str[_i3] === '.' || str[_i3] >= '0' && str[_i3] <= '9') { + body += str[_i3]; + } else { + return { + originLength: body.length, + body: body + }; + } + } + throw new Error("Broken JSON number body near ".concat(body)); + } + + // parse object + if (str[pos] === '{' || str[pos] === '[') { + var stack = [str[pos]]; + body = str[pos]; + for (var _i4 = pos + 1; _i4 < str.length; _i4 += 1) { + body += str[_i4]; + if (str[_i4] === '\\') { + if (_i4 + 1 < str.length) { + body += str[_i4 + 1]; + } + _i4 += 1; + } else if (str[_i4] === '"') { + if (stack[stack.length - 1] === '"') { + stack.pop(); + } else if (stack[stack.length - 1] !== '\'') { + stack.push(str[_i4]); + } + } else if (str[_i4] === '\'') { + if (stack[stack.length - 1] === '\'') { + stack.pop(); + } else if (stack[stack.length - 1] !== '"') { + stack.push(str[_i4]); + } + } else if (stack[stack.length - 1] !== '"' && stack[stack.length - 1] !== '\'') { + if (str[_i4] === '{') { + stack.push('{'); + } else if (str[_i4] === '}') { + if (stack[stack.length - 1] === '{') { + stack.pop(); + } else { + throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); + } + } else if (str[_i4] === '[') { + stack.push('['); + } else if (str[_i4] === ']') { + if (stack[stack.length - 1] === '[') { + stack.pop(); + } else { + throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); + } + } + } + if (!stack.length) { + return { + originLength: _i4 - pos, + body: body + }; + } + } + throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); + } + throw new Error("Broken JSON body near ".concat(str.substr(pos - 5 >= 0 ? pos - 5 : 0, 50))); + } + }, { + key: "parseKey", + value: function parseKey(str, pos, quote) { + var key = ''; + for (var i = pos; i < str.length; i += 1) { + if (quote && quote === str[i]) { + return key; + } + if (!quote && (str[i] === ' ' || str[i] === ':')) { + return key; + } + key += str[i]; + if (str[i] === '\\' && i + 1 < str.length) { + key += str[i + 1]; + i += 1; + } + } + throw new Error("Broken JSON syntax near ".concat(key)); + } + }, { + key: "canBeKeyHead", + value: function canBeKeyHead(ch) { + if (ch[0] === '\\') { + return false; + } + if (ch[0] >= 'a' && ch[0] <= 'z' || ch[0] >= 'A' && ch[0] <= 'Z' || ch[0] === '_') { + return true; + } + if (ch[0] >= '0' && ch[0] <= '9') { + return true; + } + if (ch[0] === '$') { + return true; + } + if (ch.charCodeAt(0) > 255) { + return true; + } + return false; + } + }, { + key: "isBlankChar", + value: function isBlankChar(ch) { + return ch === ' ' || ch === '\n' || ch === '\t'; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/Sanitizer.js": +/*!***********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/Sanitizer.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Sanitizer) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Sanitizer utility. + * + * Client-side HTML sanitizer designed mostly to prevent self-XSS attacks. + * The sanitizer utility will strip all attributes that start with `on` (usually JS event handlers as attributes, i.e. `onload` or `onerror`) or contain the `javascript:` pseudo protocol in their values. + * + * @author Ben Thomson + */ +var Sanitizer = /*#__PURE__*/function (_Singleton) { + function Sanitizer() { + _classCallCheck(this, Sanitizer); + return _callSuper(this, Sanitizer, arguments); + } + _inherits(Sanitizer, _Singleton); + return _createClass(Sanitizer, [{ + key: "construct", + value: function construct() { + var _this = this; + // Add to global function for backwards compatibility + window.wnSanitize = function (html) { + return _this.sanitize(html); + }; + window.ocSanitize = window.wnSanitize; + } + }, { + key: "sanitize", + value: function sanitize(html, bodyOnly) { + var parser = new DOMParser(); + var dom = parser.parseFromString(html, 'text/html'); + var returnBodyOnly = bodyOnly !== undefined && typeof bodyOnly === 'boolean' ? bodyOnly : true; + this.sanitizeNode(dom.getRootNode()); + return returnBodyOnly ? dom.body.innerHTML : dom.innerHTML; + } + }, { + key: "sanitizeNode", + value: function sanitizeNode(node) { + var _this2 = this; + if (node.tagName === 'SCRIPT') { + node.remove(); + return; + } + this.trimAttributes(node); + var children = Array.from(node.children); + children.forEach(function (child) { + _this2.sanitizeNode(child); + }); + } + }, { + key: "trimAttributes", + value: function trimAttributes(node) { + if (!node.attributes) { + return; + } + for (var i = 0; i < node.attributes.length; i += 1) { + var attrName = node.attributes.item(i).name; + var attrValue = node.attributes.item(i).value; + + /* + * remove attributes where the names start with "on" (for example: onload, onerror...) + * remove attributes where the value starts with the "javascript:" pseudo protocol (for example href="javascript:alert(1)") + */ + /* eslint-disable-next-line */ + if (attrName.indexOf('on') === 0 || attrValue.indexOf('javascript:') === 0) { + node.removeAttribute(attrName); + } + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/Url.js": +/*!*****************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/Url.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Url) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * URL utility. + * + * This utility provides URL functions. + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +var Url = /*#__PURE__*/function (_Singleton) { + function Url() { + _classCallCheck(this, Url); + return _callSuper(this, Url, arguments); + } + _inherits(Url, _Singleton); + return _createClass(Url, [{ + key: "construct", + value: function construct() { + this.foundBaseUrl = null; + this.foundAssetUrl = null; + this.baseUrl(); + this.assetUrl(); + } + + /** + * Gets a URL based on a relative path. + * + * If an absolute URL is provided, it will be returned unchanged. + * + * @param {string} url + * @returns {string} + */ + }, { + key: "to", + value: function to(url) { + var urlRegex = /^(?:[^:]+:\/\/)[-a-z0-9@:%._+~#=]{1,256}\b([-a-z0-9()@:%_+.~#?&//=]*)/i; + if (url.match(urlRegex)) { + return url; + } + var theUrl = url.replace(/^\/+/, ''); + return "".concat(this.baseUrl()).concat(theUrl); + } + + /** + * Gets an Asset URL based on a relative path. + * + * If an absolute URL is provided, it will be returned unchanged. + * + * @param {string} url + * @returns {string} + */ + }, { + key: "asset", + value: function asset(url) { + var urlRegex = /^(?:[^:]+:\/\/)[-a-z0-9@:%._+~#=]{1,256}\b([-a-z0-9()@:%_+.~#?&//=]*)/i; + if (url.match(urlRegex)) { + return url; + } + var theUrl = url.replace(/^\/+/, ''); + return "".concat(this.assetUrl()).concat(theUrl); + } + + /** + * Helper method to get the base URL of this install. + * + * This determines the base URL from three sources, in order: + * - If Snowboard is loaded via the `{% snowboard %}` tag, it will retrieve the base URL that + * is automatically included there. + * - If a `` tag is available, it will use the URL specified in the base tag. + * - Finally, it will take a guess from the current location. This will likely not work for sites + * that reside in subdirectories. + * + * The base URL will always contain a trailing backslash. + * + * @returns {string} + */ + }, { + key: "baseUrl", + value: function baseUrl() { + if (this.foundBaseUrl !== null) { + return this.foundBaseUrl; + } + if (document.querySelector('script[data-module="snowboard-base"]') !== null) { + this.foundBaseUrl = this.validateBaseUrl(document.querySelector('script[data-module="snowboard-base"]').dataset.baseUrl); + return this.foundBaseUrl; + } + if (document.querySelector('base') !== null) { + this.foundBaseUrl = this.validateBaseUrl(document.querySelector('base').getAttribute('href')); + return this.foundBaseUrl; + } + var urlParts = [window.location.protocol, '//', window.location.host, '/']; + this.foundBaseUrl = urlParts.join(''); + return this.foundBaseUrl; + } + + /** + * Helper method to get the asset URL of this install. + * + * This determines the base URL from three sources, in order: + * - If Snowboard is loaded via the `{% snowboard %}` tag, it will retrieve the asset URL that + * is automatically included there. + * - If a `` tag is available, it will use the URL specified in the link tag. + * - Finally, it will take a guess from the current location. This will likely not work for sites + * that reside in subdirectories. + * + * The asset URL will always contain a trailing backslash. + * + * @returns {string} + */ + }, { + key: "assetUrl", + value: function assetUrl() { + if (this.foundAssetUrl !== null) { + return this.foundAssetUrl; + } + if (document.querySelector('script[data-module="snowboard-base"]') !== null) { + this.foundAssetUrl = this.validateBaseUrl(document.querySelector('script[data-module="snowboard-base"]').dataset.assetUrl); + return this.foundAssetUrl; + } + if (document.querySelector('link[rel="asset_url"]') !== null) { + this.foundAssetUrl = this.validateBaseUrl(document.querySelector('link[rel="asset_url"]').getAttribute('href')); + return this.foundAssetUrl; + } + var urlParts = [window.location.protocol, '//', window.location.host, '/']; + this.foundAssetUrl = urlParts.join(''); + return this.foundAssetUrl; + } + + /** + * Validates the base URL, ensuring it is a HTTP/HTTPs URL. + * + * If the Snowboard script or tag on the page use a different type of URL, this will fail with + * an error. + * + * @param {string} url + * @returns {string} + */ + }, { + key: "validateBaseUrl", + value: function validateBaseUrl(url) { + var urlRegex = /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/i; + var urlParts = urlRegex.exec(url); + var protocol = urlParts[2]; + var domain = urlParts[4]; + if (protocol && ['http', 'https'].indexOf(protocol.toLowerCase()) === -1) { + throw new Error('Invalid base URL detected'); + } + if (!domain) { + throw new Error('Invalid base URL detected'); + } + return url.substr(-1) === '/' ? url : "".concat(url, "/"); + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "./assets/js/src/app.js": +/*!******************************!*\ + !*** ./assets/js/src/app.js ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_system_assets_js_snowboard_main_Snowboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/main/Snowboard */ "../../modules/system/assets/js/snowboard/main/Snowboard.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_main_ProxyHandler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/main/ProxyHandler */ "../../modules/system/assets/js/snowboard/main/ProxyHandler.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_ajax_Request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/ajax/Request */ "../../modules/system/assets/js/snowboard/ajax/Request.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_ajax_handlers_AttributeRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest */ "../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_AssetLoader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/AssetLoader */ "../../modules/system/assets/js/snowboard/extras/AssetLoader.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_DataConfig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/DataConfig */ "../../modules/system/assets/js/snowboard/extras/DataConfig.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_StylesheetLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/StylesheetLoader */ "../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Transition */ "../../modules/system/assets/js/snowboard/extras/Transition.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_Flash__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Flash */ "../../modules/system/assets/js/snowboard/extras/Flash.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_FlashListener__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/FlashListener */ "../../modules/system/assets/js/snowboard/extras/FlashListener.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_FormValidation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/FormValidation */ "../../modules/system/assets/js/snowboard/extras/FormValidation.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_AttachLoading__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/AttachLoading */ "../../modules/system/assets/js/snowboard/extras/AttachLoading.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_StripeLoader__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/StripeLoader */ "../../modules/system/assets/js/snowboard/extras/StripeLoader.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_Trigger__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Trigger */ "../../modules/system/assets/js/snowboard/extras/Trigger.js"); +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } + + + + + + + + + + + + + + +(function (window) { + var snowboard = new Proxy(new _modules_system_assets_js_snowboard_main_Snowboard__WEBPACK_IMPORTED_MODULE_0__["default"](true, true), _modules_system_assets_js_snowboard_main_ProxyHandler__WEBPACK_IMPORTED_MODULE_1__["default"]); + + // Cover all aliases + window.snowboard = snowboard; + window.Snowboard = snowboard; + window.SnowBoard = snowboard; + snowboard.addPlugin('request', _modules_system_assets_js_snowboard_ajax_Request__WEBPACK_IMPORTED_MODULE_2__["default"]); + snowboard.addPlugin('attributeRequest', _modules_system_assets_js_snowboard_ajax_handlers_AttributeRequest__WEBPACK_IMPORTED_MODULE_3__["default"]); + snowboard.addPlugin('assetLoader', _modules_system_assets_js_snowboard_extras_AssetLoader__WEBPACK_IMPORTED_MODULE_4__["default"]); + snowboard.addPlugin('dataConfig', _modules_system_assets_js_snowboard_extras_DataConfig__WEBPACK_IMPORTED_MODULE_5__["default"]); + snowboard.addPlugin('extrasStyles', _modules_system_assets_js_snowboard_extras_StylesheetLoader__WEBPACK_IMPORTED_MODULE_6__["default"]); + snowboard.addPlugin('transition', _modules_system_assets_js_snowboard_extras_Transition__WEBPACK_IMPORTED_MODULE_7__["default"]); + snowboard.addPlugin('flash', _modules_system_assets_js_snowboard_extras_Flash__WEBPACK_IMPORTED_MODULE_8__["default"]); + snowboard.addPlugin('flashListener', _modules_system_assets_js_snowboard_extras_FlashListener__WEBPACK_IMPORTED_MODULE_9__["default"]); + snowboard.addPlugin('formValidation', _modules_system_assets_js_snowboard_extras_FormValidation__WEBPACK_IMPORTED_MODULE_10__["default"]); + snowboard.addPlugin('attachLoading', _modules_system_assets_js_snowboard_extras_AttachLoading__WEBPACK_IMPORTED_MODULE_11__["default"]); + snowboard.addPlugin('stripeLoader', _modules_system_assets_js_snowboard_extras_StripeLoader__WEBPACK_IMPORTED_MODULE_12__["default"]); + snowboard.addPlugin('trigger', _modules_system_assets_js_snowboard_extras_Trigger__WEBPACK_IMPORTED_MODULE_13__["default"]); + snowboard.on('ready', function () { + // Scan for triggers + Array.from(document.querySelectorAll('*')).filter(function (element) { + return _toConsumableArray(element.attributes).filter(function (_ref) { + var name = _ref.name; + return name.startsWith("data-trigger-"); + }).length > 0; + }).forEach(function (element) { + snowboard.trigger(element); + }); + }); +})(window); + +/***/ }), + +/***/ "./assets/css/base.css": +/*!*****************************!*\ + !*** ./assets/css/base.css ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +// extracted by mini-css-extract-plugin + + +/***/ }), + +/***/ "../../node_modules/js-cookie/dist/js.cookie.mjs": +/*!*******************************************************!*\ + !*** ../../node_modules/js-cookie/dist/js.cookie.mjs ***! + \*******************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ api) +/* harmony export */ }); +/*! js-cookie v3.0.5 | MIT */ +/* eslint-disable no-var */ +function assign (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + target[key] = source[key]; + } + } + return target +} +/* eslint-enable no-var */ + +/* eslint-disable no-var */ +var defaultConverter = { + read: function (value) { + if (value[0] === '"') { + value = value.slice(1, -1); + } + return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent) + }, + write: function (value) { + return encodeURIComponent(value).replace( + /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, + decodeURIComponent + ) + } +}; +/* eslint-enable no-var */ + +/* eslint-disable no-var */ + +function init (converter, defaultAttributes) { + function set (name, value, attributes) { + if (typeof document === 'undefined') { + return + } + + attributes = assign({}, defaultAttributes, attributes); + + if (typeof attributes.expires === 'number') { + attributes.expires = new Date(Date.now() + attributes.expires * 864e5); + } + if (attributes.expires) { + attributes.expires = attributes.expires.toUTCString(); + } + + name = encodeURIComponent(name) + .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) + .replace(/[()]/g, escape); + + var stringifiedAttributes = ''; + for (var attributeName in attributes) { + if (!attributes[attributeName]) { + continue + } + + stringifiedAttributes += '; ' + attributeName; + + if (attributes[attributeName] === true) { + continue + } + + // Considers RFC 6265 section 5.2: + // ... + // 3. If the remaining unparsed-attributes contains a %x3B (";") + // character: + // Consume the characters of the unparsed-attributes up to, + // not including, the first %x3B (";") character. + // ... + stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; + } + + return (document.cookie = + name + '=' + converter.write(value, name) + stringifiedAttributes) + } + + function get (name) { + if (typeof document === 'undefined' || (arguments.length && !name)) { + return + } + + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. + var cookies = document.cookie ? document.cookie.split('; ') : []; + var jar = {}; + for (var i = 0; i < cookies.length; i++) { + var parts = cookies[i].split('='); + var value = parts.slice(1).join('='); + + try { + var found = decodeURIComponent(parts[0]); + jar[found] = converter.read(value, found); + + if (name === found) { + break + } + } catch (e) {} + } + + return name ? jar[name] : jar + } + + return Object.create( + { + set, + get, + remove: function (name, attributes) { + set( + name, + '', + assign({}, attributes, { + expires: -1 + }) + ); + }, + withAttributes: function (attributes) { + return init(this.converter, assign({}, this.attributes, attributes)) + }, + withConverter: function (converter) { + return init(assign({}, this.converter, converter), this.attributes) + } + }, + { + attributes: { value: Object.freeze(defaultAttributes) }, + converter: { value: Object.freeze(converter) } + } + ) +} + +var api = init(defaultConverter, { path: '/' }); +/* eslint-enable no-var */ + + + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "/assets/js/app": 0, +/******/ "assets/css/theme": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkwintercms_workshop_theme"] = self["webpackChunkwintercms_workshop_theme"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ __webpack_require__.O(undefined, ["assets/css/theme"], () => (__webpack_require__("./assets/js/src/app.js"))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["assets/css/theme"], () => (__webpack_require__("./assets/css/base.css"))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDM0JBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLE1BQU0scUJBQXFCO1dBQzNCO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTtXQUNBOzs7OztVRWpEQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvUGx1Z2luQmFzZS5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvU2luZ2xldG9uLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L2hhbmRsZXJzL0F0dHJpYnV0ZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Fzc2V0TG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9BdHRhY2hMb2FkaW5nLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9EYXRhQ29uZmlnLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2hMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRm9ybVZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0cmlwZUxvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3R5bGVzaGVldExvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL0lubmVyUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUGx1Z2luTG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9Db29raWUuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL0pzb25QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL1Nhbml0aXplci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC91dGlsaXRpZXMvVXJsLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9qcy9zcmMvYXBwLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy9qcy1jb29raWUvZGlzdC9qcy5jb29raWUubWpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gYmFzZSBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBwbHVnaW5zLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCB0aGUgU25vd2JvYXJkIGZyYW1ld29yayBpbnN0YW5jZSwgYW5kIHNob3VsZCBub3QgYmUgb3ZlcndyaXR0ZW5cbiAgICAgKiB1bmxlc3MgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U25vd2JvYXJkfSBzbm93Ym9hcmRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihzbm93Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRydWUgY29uc3RydWN0b3Igb2YgYSBwbHVnaW4sIGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4uXG4gICAgICogSXQgd2lsbCBiZSBjYWxsZWQgc3RyYWlnaHQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSByZXF1aXJlZCBwbHVnaW5zIGZvciB0aGlzIHNwZWNpZmljIG1vZHVsZSB0byB3b3JrLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwbHVnaW5zIHJlcXVpcmVkIGZvciB0aGlzIG1vZHVsZSB0byB3b3JrLCBhcyBzdHJpbmdzLlxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGxpc3RlbmVyIG1ldGhvZHMgZm9yIGdsb2JhbCBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEZpcmVkIHdoZW4gdGhpcyBwbHVnaW4gaXMgcmVtb3ZlZC4gQ2FuIGJlIG1hbnVhbGx5IGNhbGxlZCBpZiB5b3UgaGF2ZSBhbm90aGVyIHNjZW5hcmlvIGZvclxuICAgICAqIGRlc3RydWN0aW9uLCBpZS4gdGhlIGVsZW1lbnQgYXR0YWNoZWQgdG8gdGhlIHBsdWdpbiBpcyByZW1vdmVkIG9yIGNoYW5nZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNub3dib2FyZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3RvciAob2xkIG1ldGhvZCBuYW1lKS5cbiAgICAgKlxuICAgICAqIEFsbG93cyBwcmV2aW91cyB1c2FnZSBvZiB0aGUgXCJkZXN0cnVjdG9yXCIgbWV0aG9kIHRvIHN0aWxsIHdvcmsuXG4gICAgICovXG4gICAgZGVzdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4vUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogU2luZ2xldG9uIHBsdWdpbiBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGlzIGEgc3BlY2lhbCBkZWZpbml0aW9uIGNsYXNzIHRoYXQgdGhlIFNub3dib2FyZCBmcmFtZXdvcmsgd2lsbCB1c2UgdG8gaW50ZXJwcmV0IHRoZSBjdXJyZW50IHBsdWdpbiBhcyBhXG4gKiBcInNpbmdsZXRvblwiLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiBjbGFzcyBpcyB1c2VkIGFjcm9zcyB0aGUgYm9hcmQuXG4gKlxuICogU2luZ2xldG9ucyBhcmUgaW5pdGlhbGlzZWQgb24gdGhlIFwiZG9tUmVhZHlcIiBldmVudCBieSBkZWZhdWx0LlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBSZXF1ZXN0IHBsdWdpbi5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IEFKQVggaGFuZGxlciB3aGljaCB3aWxsIHJ1biB1c2luZyB0aGUgYGZldGNoKClgIG1ldGhvZCB0aGF0IGlzIGRlZmF1bHQgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyAyIG9yIDMgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIElmIDIgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGhhbmRsZXIgbmFtZSBhbmQgdGhlIHNlY29uZFxuICAgICAqIHBhcmFtZXRlciBpcyB0aGUgb3B0aW9ucy4gVGhpcyBhc3N1bWVzIHRoYXQgdGhpcyBpcyBhIGRldGFjaGVkIEFKQVggcmVxdWVzdCBub3QgY29ubmVjdGVkIHRvXG4gICAgICogYW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIDMgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gZWxlbWVudCBvciBhIHNlbGVjdG9yLCBhbmQgdGhlIHNlY29uZFxuICAgICAqIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIGFyZSB0aGUgaGFuZGxlciBhbmQgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IGhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdChlbGVtZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGJlIGEgaGFuZGxlciBuYW1lLlxuICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoZSByZXF1ZXN0IGlzIGJlaW5nIG1hZGUgYWdhaW5zdCBubyBlbGVtZW50LCBhbmQgdGhlIGhhbmRsZXIgcGFyYW1ldGVyXG4gICAgICAgICAgICAvLyB3aWxsIGNvbnRhaW4gb3B0aW9ucy5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGFuZGxlck5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gaGFuZGxlciB8fCB7fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGVsZW1lbnQgd2FzIGZvdW5kIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yOiAke2VsZW1lbnR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG1hdGNoZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb25zID0ge307XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdCgpO1xuICAgICAgICBpZiAoIXRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U2V0dXAnLCB0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4U2V0dXAnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRvQ2xpZW50VmFsaWRhdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maXJtKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ29uZmlybSgpLnRoZW4oKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX1NVQ0NFU1MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlKHJlc3BvbnNlKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9TVUNDRVNTID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcyBmb3IgdGhpcyBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydjb29raWUnLCAnanNvblBhcnNlciddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgZWxlbWVudCBhbmQgaGFuZGxlciBnaXZlbiBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBjaGVja1JlcXVlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGVsZW1lbnQgcHJvdmlkZWQgbXVzdCBiZSBhbiBFbGVtZW50IGluc3RhbmNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFKQVggaGFuZGxlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNIYW5kbGVyTmFtZSh0aGlzLmhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQUpBWCBoYW5kbGVyIG5hbWUuIFRoZSBjb3JyZWN0IGhhbmRsZXIgbmFtZSBmb3JtYXQgaXM6IFwib25FdmVudFwiLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZldGNoIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtYWRlIGF2YWlsYWJsZSBmb3IgcGx1Z2lucyB0byBleHRlbmQgb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmV0Y2goKSBzZXR0aW5ncyB3aXRoIHRoZWlyIG93bi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGdldEZldGNoKCkge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9ucyA9ICh0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5mZXRjaE9wdGlvbnMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgICAgICAgICBtb2RlOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEZldGNoT3B0aW9ucycsIHRoaXMuZmV0Y2hPcHRpb25zLCB0aGlzKTtcblxuICAgICAgICByZXR1cm4gZmV0Y2godGhpcy51cmwsIHRoaXMuZmV0Y2hPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBvbiB0aGUgZm9ybSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZG9DbGllbnRWYWxpZGF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJWYWxpZGF0ZSA9PT0gdHJ1ZSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY2hlY2tWYWxpZGl0eSgpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBBSkFYIHF1ZXJ5LlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB3aGVuIHRoZSBBSkFYIHJlcXVlc3QgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9BamF4KCkge1xuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgQUpBWCByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEJlZm9yZVNlbmQnLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWpheFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEZldGNoKCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vayAmJiByZXNwb25zZS5zdGF0dXMgIT09IDQwNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykuaW5jbHVkZXMoJy9qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5qc29uKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5tZXNzYWdlICYmIHJlc3BvbnNlRGF0YS5leGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5leGNlcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5maWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLnRyYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRleHQoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VUZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihyZXNwb25zZVRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHByb2Nlc3MgcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKS5pbmNsdWRlcygnL2pzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfV0lOVEVSX1NVQ0NFU1M6IHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9XSU5URVJfUkVTUE9OU0VfQ09ERTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcjogJHtyZXNwb25zZUVycm9yfWApKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhTdGFydCcsIGFqYXhQcm9taXNlLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFByb21pc2UnKTtcbiAgICAgICAgICAgIGV2ZW50LnByb21pc2UgPSBhamF4UHJvbWlzZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhamF4UHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBmb3IgdXBkYXRpbmcgdGhlIHBhcnRpYWxzIGZyb20gdGhlIEFKQVggcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBJZiBhbnkgcGFydGlhbHMgYXJlIHJldHVybmVkIGZyb20gdGhlIEFKQVggcmVzcG9uc2UsIHRoaXMgbWV0aG9kIHdpbGwgYWxzbyBhY3Rpb24gdGhlIHBhcnRpYWwgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIG9iamVjdCB3aGljaCB0cmFja3Mgd2hlbiB0aGUgcGFydGlhbCB1cGRhdGUgaXMgY29tcGxldGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBwcm9jZXNzVXBkYXRlKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJlZm9yZVVwZGF0ZS5hcHBseSh0aGlzLCBbcmVzcG9uc2VdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFeHRyYWN0IHBhcnRpYWwgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxzID0ge307XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDgpICE9PSAnWF9XSU5URVInKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcnRpYWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4QmVmb3JlVXBkYXRlJywgcmVzcG9uc2UsIHRoaXMpO1xuICAgICAgICAgICAgcHJvbWlzZXMudGhlbihcbiAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1VwZGF0ZShwYXJ0aWFscykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgSFRNTCByZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBwYXJ0aWFscyB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnRpYWxzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9VcGRhdGUocGFydGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhZmZlY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXJ0aWFscykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcGFydGlhbCwgY29udGVudF0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvciA9ICh0aGlzLm9wdGlvbnMudXBkYXRlICYmIHRoaXMub3B0aW9ucy51cGRhdGVbcGFydGlhbF0pXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5vcHRpb25zLnVwZGF0ZVtwYXJ0aWFsXVxuICAgICAgICAgICAgICAgICAgICA6IHBhcnRpYWw7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9kZSA9ICdyZXBsYWNlJztcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ2FwcGVuZCc7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpID09PSAnXicpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdwcmVwZW5kJztcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcjJyAmJiBzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ25vb3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXBwZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgKz0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJlcGVuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudCArIGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdub29wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVwbGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWQucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSB1cGRhdGUgZXZlbnQgZm9yIGVhY2ggZWxlbWVudCB0aGF0IGlzIHVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VXBkYXRlJywgZWxlbWVudCwgY29udGVudCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFVwZGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhVcGRhdGVDb21wbGV0ZScsIGFmZmVjdGVkLCB0aGlzKTtcblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIHJlc3BvbnNlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBmbGFzaFxuICAgICAqIG1lc3NhZ2VzIHRvIGhhbmRsZSwgb3IgYW55IHJlZGlyZWN0cyB0byBiZSB1bmRlcnRha2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2VzcyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2Vzcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgYW55IGZ1cnRoZXIgcmVzcG9uc2UgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U3VjY2VzcycsIHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciByZXNwb25zZSBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheERvbmUnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZURhdGEgPSB0aGlzLnJlc3BvbnNlRGF0YTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoICYmIHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NGbGFzaE1lc3NhZ2VzKHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBhIHJlZGlyZWN0IGZyb20gdGhlIHJlc3BvbnNlLCBvciB1c2UgdGhlIHJlZGlyZWN0IGFzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlZGlyZWN0KHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgZXJyb3IgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBlcnJvciBvclxuICAgICAqIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8RXJyb3J9IGVycm9yXG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvcih0aGlzLnJlc3BvbnNlRXJyb3IsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yJywgdGhpcy5yZXNwb25zZUVycm9yLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheEZhaWwnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBza2lwRXJyb3IgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX0ZJRUxEUykge1xuICAgICAgICAgICAgICAgIHNraXBFcnJvciA9IHRoaXMucHJvY2Vzc1ZhbGlkYXRpb25FcnJvcnMoZXJyb3IuWF9XSU5URVJfRVJST1JfRklFTERTKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX01FU1NBR0UgJiYgIXNraXBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5YX1dJTlRFUl9FUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSByZWRpcmVjdCByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2Vzc29yIHdpbGwgc2ltcGx5IHJlZGlyZWN0IHRoZSB1c2VyIGluIHRoZWlyIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheFJlZGlyZWN0YCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBvblxuICAgICAqIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZVJlZGlyZWN0UmVzcG9uc2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiByZWRpcmVjdCB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcm9jZXNzUmVkaXJlY3QodXJsKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCByZWRpcmVjdCBoYW5kbGVyLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgZG9uJ3QgcnVuIHRoZSByZWRpcmVjdC5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlUmVkaXJlY3RSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVSZWRpcmVjdFJlc3BvbnNlLmFwcGx5KHRoaXMsIFt1cmxdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgcmVkaXJlY3RcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4UmVkaXJlY3QnLCB1cmwsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgQUpBWCByZXF1ZXN0IGlzIGZpbmlzaGVkIGlmIHdlJ3JlIHN0aWxsIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgbG9hZGluZyBpbmRpY2F0b3IgZm9yIHJlZGlyZWN0cyB0aGF0IGp1c3QgY2hhbmdlIHRoZSBoYXNoIHZhbHVlIG9mXG4gICAgICAgIC8vIHRoZSBVUkwgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBwYWdlIHdpbGwgcHJvcGVybHkgc3RvcC5cbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2JlcmNtcy9vY3RvYmVyL2lzc3Vlcy8yNzgwXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50TmFtZSA9ICdhamF4UmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3NvciB3aWxsIHNpbXBseSBhbGVydCB0aGUgdXNlciB0aHJvdWdoIGEgc2ltcGxlIGBhbGVydCgpYCBjYWxsLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhFcnJvck1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlRXJyb3JNZXNzYWdlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogZXJyb3IgbWVzc2FnZSBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCBoYW5kbGVyIGZvciBlcnJvciBtZXNzYWdlcy4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvIG5vdCBwcm9jZXNzIHRoZSBlcnJvciBtZXNzYWdlc1xuICAgICAgICAvLyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRXJyb3JNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUVycm9yTWVzc2FnZS5hcHBseSh0aGlzLCBbbWVzc2FnZV0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIHRoZSBlcnJvciBtZXNzYWdlIGJlaW5nIHNob3duXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yTWVzc2FnZScsIG1lc3NhZ2UsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgc2hvdyBhIGJyb3dzZXIgZXJyb3IgbWVzc2FnZVxuICAgICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGZsYXNoIG1lc3NhZ2VzIGZyb20gdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgbm8gZmxhc2ggbWVzc2FnZSBoYW5kbGluZyB3aWxsIG9jY3VyLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhGbGFzaE1lc3NhZ2VzYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUZsYXNoTWVzc2FnZXNgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiBmbGFzaCBtZXNzYWdlIGhhbmRsaW5nIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2VzXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcm9jZXNzRmxhc2hNZXNzYWdlcyhtZXNzYWdlcykge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgZmxhc2ggaGFuZGxlci4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvbid0IHNob3cgdGhlIGZsYXNoIG1lc3NhZ2VcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRmxhc2hNZXNzYWdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVGbGFzaE1lc3NhZ2VzLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4Rmxhc2hNZXNzYWdlcycsIG1lc3NhZ2VzLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIG5vIHZhbGlkYXRpb24gZXJyb3IgaGFuZGxpbmcgd2lsbCBvY2N1ci5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4VmFsaWRhdGlvbkVycm9yc2AgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVWYWxpZGF0aW9uRXJyb3JzYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogdmFsaWRhdGlvbiBlcnJvciBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHNcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzKGZpZWxkcykge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZVZhbGlkYXRpb25FcnJvcnMuYXBwbHkodGhpcywgW3RoaXMuZm9ybSwgZmllbGRzXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgYmVpbmcgaGFuZGxlZFxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhWYWxpZGF0aW9uRXJyb3JzJywgdGhpcy5mb3JtLCBmaWVsZHMsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFzc2V0cyByZXR1cm5lZCBieSBhbiBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBubyBhc3NldCBwcm9jZXNzaW5nIHdpbGwgb2NjdXIgYW5kIHRoaXMgd2lsbCByZXR1cm4gYSByZXNvbHZlZCBQcm9taXNlLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhMb2FkQXNzZXRzYCBldmVudC4gVGhpcyBldmVudCBpcyBjb25zaWRlcmVkIGJsb2NraW5nLCBhbmRcbiAgICAgKiBhbGxvd3MgYXNzZXRzIHRvIGJlIGxvYWRlZCBvciBwcm9jZXNzZWQgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCBhbnkgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFzc2V0c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHByb2Nlc3NBc3NldHMoYXNzZXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5nbG9iYWxQcm9taXNlRXZlbnQoJ2FqYXhMb2FkQXNzZXRzJywgYXNzZXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maXJtcyB0aGUgcmVxdWVzdCB3aXRoIHRoZSB1c2VyIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgbWV0aG9kLiBCeSBkZWZhdWx0LCBpdCB3aWxsIHVzZSB0aGUgYnJvd3NlcidzIGBjb25maXJtKClgIG1ldGhvZCB0byBxdWVyeSB0aGUgdXNlciB0b1xuICAgICAqIGNvbmZpcm0gdGhlIGFjdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBQcm9taXNlIHdpdGggYSBib29sZWFuIHZhbHVlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB1c2VyIGNvbmZpcm1lZFxuICAgICAqIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4Q29uZmlybU1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlQ29uZmlybU1lc3NhZ2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLFxuICAgICAqIHRoZSBjb25maXJtYXRpb24gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gZGVuaWVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYXN5bmMgZG9Db25maXJtKCkge1xuICAgICAgICAvLyBBbGxvdyBmb3IgYSBjdXN0b20gaGFuZGxlciBmb3IgdGhlIGNvbmZpcm1hdGlvbiwgcGVyIHJlcXVlc3QuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlLmFwcGx5KHRoaXMsIFt0aGlzLmNvbmZpcm1dKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gcGx1Z2lucyBoYXZlIGN1c3RvbWlzZWQgdGhlIGNvbmZpcm1hdGlvbiwgdXNlIGEgc2ltcGxlIGJyb3dzZXIgY29uZmlybWF0aW9uLlxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQubGlzdGVuc1RvRXZlbnQoJ2FqYXhDb25maXJtTWVzc2FnZScpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5jb25maXJtKHRoaXMuY29uZmlybSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gY3VzdG9tIHBsdWdpbiBjb25maXJtYXRpb25zXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4Q29uZmlybU1lc3NhZ2UnLCB0aGlzLmNvbmZpcm0sIHRoaXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdWxmaWxsZWQgPSBhd2FpdCBwcm9taXNlcztcbiAgICAgICAgICAgIGlmIChmdWxmaWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIG9mZiBjb21wbGV0aW9uIGV2ZW50cyBmb3IgdGhlIFJlcXVlc3QuXG4gICAgICovXG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGxldGUgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbXBsZXRlKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheERvbmUnLCB0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhBbHdheXMnKTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VEYXRhID0gdGhpcy5yZXNwb25zZURhdGE7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZSBvZmYgdGhlIGRlc3RydWN0b3JcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIGdldCBmb3JtKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5vcHRpb25zLmZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mb3JtO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xvc2VzdCgnZm9ybScpO1xuICAgIH1cblxuICAgIGdldCBjb250ZXh0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBoZWFkZXJzKCkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLCAvLyBLZWVwcyBjb21wYXRpYmlsaXR5IHdpdGggalF1ZXJ5IEFKQVhcbiAgICAgICAgICAgICdYLVdJTlRFUi1SRVFVRVNULUhBTkRMRVInOiB0aGlzLmhhbmRsZXIsXG4gICAgICAgICAgICAnWC1XSU5URVItUkVRVUVTVC1QQVJUSUFMUyc6IHRoaXMuZXh0cmFjdFBhcnRpYWxzKHRoaXMub3B0aW9ucy51cGRhdGUgfHwgW10pLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVdJTlRFUi1SRVFVRVNULUZMQVNIJ10gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMueHNyZlRva2VuKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVhTUkYtVE9LRU4nXSA9IHRoaXMueHNyZlRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9hZGluZyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG5cbiAgICBnZXQgcmVkaXJlY3QoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5vcHRpb25zLnJlZGlyZWN0ICYmIHRoaXMub3B0aW9ucy5yZWRpcmVjdC5sZW5ndGgpID8gdGhpcy5vcHRpb25zLnJlZGlyZWN0IDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZmxhc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmxhc2ggfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVzKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbGVzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoRm9ybURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmRlYnVnKCdUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBmaWxlIHVwbG9hZHMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldCB4c3JmVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5jb29raWUoKS5nZXQoJ1hTUkYtVE9LRU4nKTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9ICh0eXBlb2YgdGhpcy5vcHRpb25zLmRhdGEgPT09ICdvYmplY3QnKSA/IHRoaXMub3B0aW9ucy5kYXRhIDoge307XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5mb3JtIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGdldCBjb25maXJtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbmZpcm0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgcGFydGlhbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXBkYXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBleHRyYWN0UGFydGlhbHModXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh1cGRhdGUpLmpvaW4oJyYnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGFuIGVycm9yIHdpdGggdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIEFKQVggcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIG9yIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVlIHRvIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhjZXB0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGluZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRyYWNlXG4gICAgICogQHJldHVybnMge0Vycm9yfVxuICAgICAqL1xuICAgIHJlbmRlckVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbiwgZmlsZSwgbGluZSwgdHJhY2UpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGVycm9yLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbiB8fCBudWxsO1xuICAgICAgICBlcnJvci5maWxlID0gZmlsZSB8fCBudWxsO1xuICAgICAgICBlcnJvci5saW5lID0gbGluZSB8fCBudWxsO1xuICAgICAgICBlcnJvci50cmFjZSA9IHRyYWNlIHx8IFtdO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGEgZ2l2ZW4gc3RyaW5nIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIEFKQVggaGFuZGxlciBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0hhbmRsZXJOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIC9eKD86XFx3Kzp7Mn0pP29uW0EtWjAtOV0vLnRlc3QobmFtZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi8uLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBFbmFibGUgRGF0YSBBdHRyaWJ1dGVzIEFQSSBmb3IgQUpBWCByZXF1ZXN0cy5cbiAqXG4gKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBBSkFYIGZ1bmN0aW9uYWxpdHkgdGhhdCBpbmNsdWRlcyBoYW5kbGluZyBvZiBIVE1MIGRhdGEgYXR0cmlidXRlcyBmb3IgcHJvY2Vzc2luZ1xuICogQUpBWCByZXF1ZXN0cy4gSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIGJhc2UgQUpBWCBmdW5jdGlvbmFsaXR5IHRvIGFsbG93IGRldmVsb3BlcnMgdG8gb3B0LW91dCBvZiBkYXRhIGF0dHJpYnV0ZVxuICogcmVxdWVzdHMgaWYgdGhleSBkbyBub3QgaW50ZW5kIHRvIHVzZSB0aGVtLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRyaWJ1dGVSZXF1ZXN0IGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTZXR1cDogJ29uQWpheFNldHVwJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkeSBldmVudCBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEF0dGFjaGVzIGhhbmRsZXJzIHRvIHRoZSB3aW5kb3cgdG8gbGlzdGVuIGZvciBhbGwgcmVxdWVzdCBpbnRlcmFjdGlvbnMuXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoSGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCcsICdqc29uUGFyc2VyJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIERldGFjaGVzIGFsbCBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5kZXRhY2hIYW5kbGVycygpO1xuXG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGF0dGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBkZWZhdWx0IGZvcm0gdmFsaWRhdGlvbiBmb3IgQUpBWCBmb3Jtcy5cbiAgICAgKlxuICAgICAqIEEgZm9ybSB0aGF0IGNvbnRhaW5zIGEgYGRhdGEtcmVxdWVzdGAgYXR0cmlidXRlIHRvIHNwZWNpZnkgYW4gQUpBWCBjYWxsIHdpdGhvdXQgaW5jbHVkaW5nIGEgYGRhdGEtYnJvd3Nlci12YWxpZGF0ZWBcbiAgICAgKiBhdHRyaWJ1dGUgbWVhbnMgdGhhdCB0aGUgQUpBWCBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGxpa2VseSBiZSBoYW5kbGluZyB0aGUgdmFsaWRhdGlvbiBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24oKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm1bZGF0YS1yZXF1ZXN0XTpub3QoW2RhdGEtYnJvd3Nlci12YWxpZGF0ZV0pJykuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ25vdmFsaWRhdGUnLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGRldGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGNoYW5nZXMgdG8gc2VsZWN0LCByYWRpbywgY2hlY2tib3ggYW5kIGZpbGUgaW5wdXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBjaGFuZ2VIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGNoYW5naW5nIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ3NlbGVjdFtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWZpbGVdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjbGlja3Mgb24gaHlwZXJsaW5rcyBhbmQgYnV0dG9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgZXZlbnQgY2FuIGJ1YmJsZSB1cCB0aGUgaGllcmFyY2h5IHRvIGZpbmQgYSBzdWl0YWJsZSByZXF1ZXN0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50RWxlbWVudC5tYXRjaGVzKFxuICAgICAgICAgICAgICAgICdhW2RhdGEtcmVxdWVzdF0sIGJ1dHRvbltkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWJ1dHRvbl1bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1zdWJtaXRdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5IHByZXNzZXMgb24gaW5wdXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGtleURvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGlucHV0dGluZyBpbnRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgdHlwZSBpcyB2YWxpZFxuICAgICAgICBjb25zdCB2YWxpZFR5cGVzID0gW1xuICAgICAgICAgICAgJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAnZGF0ZXRpbWUnLFxuICAgICAgICAgICAgJ2RhdGV0aW1lLWxvY2FsJyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICdyYWRpbycsXG4gICAgICAgICAgICAncmFuZ2UnLFxuICAgICAgICAgICAgJ3NlYXJjaCcsXG4gICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd0aW1lJyxcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICAgJ3dlZWsnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAodmFsaWRUeXBlcy5pbmRleE9mKGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtcmVxdWVzdF0nKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtdHJhY2staW5wdXRdJykpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tJbnB1dChldmVudC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzdWJtaXRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIHN1Ym1pdHRpbmcgYSB2YWxpZCBmb3JtXG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAnZm9ybVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgcmVxdWVzdCBvbiBhIGdpdmVuIGVsZW1lbnQsIHVzaW5nIGl0cyBkYXRhIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBTdHJpbmcoZGF0YS5yZXF1ZXN0KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNvbmZpcm06ICgncmVxdWVzdENvbmZpcm0nIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdENvbmZpcm0pIDogbnVsbCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiAoJ3JlcXVlc3RSZWRpcmVjdCcgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0UmVkaXJlY3QpIDogbnVsbCxcbiAgICAgICAgICAgIGxvYWRpbmc6ICgncmVxdWVzdExvYWRpbmcnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdExvYWRpbmcpIDogbnVsbCxcbiAgICAgICAgICAgIGZsYXNoOiAoJ3JlcXVlc3RGbGFzaCcgaW4gZGF0YSksXG4gICAgICAgICAgICBmaWxlczogKCdyZXF1ZXN0RmlsZXMnIGluIGRhdGEpLFxuICAgICAgICAgICAgYnJvd3NlclZhbGlkYXRlOiAoJ3JlcXVlc3RCcm93c2VyVmFsaWRhdGUnIGluIGRhdGEpLFxuICAgICAgICAgICAgZm9ybTogKCdyZXF1ZXN0Rm9ybScgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0Rm9ybSkgOiBudWxsLFxuICAgICAgICAgICAgdXJsOiAoJ3JlcXVlc3RVcmwnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdFVybCkgOiBudWxsLFxuICAgICAgICAgICAgdXBkYXRlOiAoJ3JlcXVlc3RVcGRhdGUnIGluIGRhdGEpID8gdGhpcy5wYXJzZURhdGEoU3RyaW5nKGRhdGEucmVxdWVzdFVwZGF0ZSkpIDogW10sXG4gICAgICAgICAgICBkYXRhOiAoJ3JlcXVlc3REYXRhJyBpbiBkYXRhKSA/IHRoaXMucGFyc2VEYXRhKFN0cmluZyhkYXRhLnJlcXVlc3REYXRhKSkgOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5yZXF1ZXN0KGVsZW1lbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYW4gQUpBWCByZXF1ZXN0IHZpYSBIVE1MIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKi9cbiAgICBvbkFqYXhTZXR1cChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSByZXF1ZXN0LmVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0UGFyZW50UmVxdWVzdERhdGEocmVxdWVzdC5lbGVtZW50KSxcbiAgICAgICAgICAgIC4uLnJlcXVlc3Qub3B0aW9ucy5kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24nKSAmJiAhcmVxdWVzdC5mb3JtICYmIGZpZWxkTmFtZSAmJiAhcmVxdWVzdC5vcHRpb25zLmRhdGFbZmllbGROYW1lXSkge1xuICAgICAgICAgICAgZGF0YVtmaWVsZE5hbWVdID0gcmVxdWVzdC5lbGVtZW50LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5vcHRpb25zLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhbmQgY29sbGF0ZXMgYWxsIGRhdGEgZnJvbSBlbGVtZW50cyB1cCB0aGUgRE9NIGhpZXJhcmNoeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXRQYXJlbnRSZXF1ZXN0RGF0YSh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMucmV2ZXJzZSgpO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgICAgICBpZiAoJ3JlcXVlc3REYXRhJyBpbiBlbGVtZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyc2VEYXRhKGVsZW1lbnREYXRhLnJlcXVlc3REYXRhKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgZGF0YSBpbiB0aGUgV2ludGVyL09jdG9iZXIgSlNPTiBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgcGFyc2VEYXRhKGRhdGEpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvbnBhcnNlcigpLnBhcnNlKGB7JHtkYXRhfX1gKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nIHRoZSBkYXRhIGF0dHJpYnV0ZSBvbiBlbGVtZW50OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrSW5wdXQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZSB9ID0gZWxlbWVudC5kYXRhc2V0O1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGVsZW1lbnQuZGF0YXNldC50cmFja0lucHV0IHx8IDMwMDtcblxuICAgICAgICBpZiAobGFzdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbGFzdFZhbHVlID09PSBlbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpO1xuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBoaWVyYXJjaHkgYW5kIGZpbmQgYSBmb3JtIHRoYXQgc2VuZHMgYW4gQUpBWCBxdWVyeVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBjdXJyZW50RWxlbWVudC5kYXRhc2V0LnJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIHJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQXNzZXQgTG9hZGVyLlxuICpcbiAqIFByb3ZpZGVzIHNpbXBsZSBhc3NldCBsb2FkaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIFNub3dib2FyZCwgbWFraW5nIGl0IGVhc3kgdG8gcHJlLWxvYWQgaW1hZ2VzIG9yXG4gKiBpbmNsdWRlIEphdmFTY3JpcHQgb3IgQ1NTIGFzc2V0cyBvbiB0aGUgZmx5LlxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoaXMgbG9hZGVyIHdpbGwgbGlzdGVuIHRvIGFueSBhc3NldHMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkIHRvIGxvYWQgaW4gYW4gQUpBWFxuICogcmVzcG9uc2UsIHN1Y2ggYXMgcmVzcG9uc2VzIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogWW91IGNhbiBhbHNvIGxvYWQgYXNzZXRzIG1hbnVhbGx5IGJ5IGNhbGxpbmcgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBgYGBqc1xuICogU25vd2JvYXJkLmFkZFBsdWdpbignYXNzZXRMb2FkZXInLCBBc3NldExvYWRlcik7XG4gKiBTbm93Ym9hcmQuYXNzZXRMb2FkZXIoKS5wcm9jZXNzQXNzZXRzKGFzc2V0cyk7XG4gKiBgYGBcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXNzZXRMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFqYXhMb2FkQXNzZXRzOiAnbG9hZCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYW5kIGxvYWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogVGhlIGBhc3NldHNgIHByb3BlcnR5IG9mIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGFuIG9iamVjdCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGtleXMgYW5kIGFuXG4gICAgICogYXJyYXkgb2YgcGF0aHM6XG4gICAgICpcbiAgICAgKiAtIGBqc2A6IEFuIGFycmF5IG9mIEphdmFTY3JpcHQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgY3NzYDogQW4gYXJyYXkgb2YgQ1NTIHN0eWxlc2hlZXQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgaW1nYDogQW4gYXJyYXkgb2YgaW1hZ2UgVVJMcyB0byBwcmUtbG9hZFxuICAgICAqXG4gICAgICogQm90aCBganNgIGFuZCBgY3NzYCBmaWxlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5qZWN0ZWQsIGhvd2V2ZXIgYGltZ2AgZmlsZXMgd2lsbCBub3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCByZXF1aXJlZCBhc3NldHMgYXJlIGxvYWRlZC4gSWYgYW5cbiAgICAgKiBhc3NldCBmYWlscyB0byBsb2FkLCB0aGlzIFByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEVTTGludCAqUkVBTExZKiBkb2Vzbid0IGxpa2UgdGhpcyBjb2RlLCBidXQgaWdub3JlIGl0LiBJdCdzIHRoZSBvbmx5IHdheSBpdCB3b3Jrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhc3NldHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGFzc2V0cykge1xuICAgICAgICBpZiAoYXNzZXRzLmpzICYmIGFzc2V0cy5qcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBhc3NldHMuanMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3NldHMuY3NzICYmIGFzc2V0cy5jc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBhc3NldHMuY3NzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU3R5bGUoc3R5bGUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2V0cy5pbWcgJiYgYXNzZXRzLmltZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGFzc2V0cy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbWFnZShpbWFnZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBhbmQgbG9hZHMgYSBKYXZhU2NyaXB0IFVSTCBpbnRvIHRoZSBET00uXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBjbG9zaW5nIGA8L2JvZHk+YCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NyaXB0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZFNjcmlwdChzY3JpcHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgc2NyaXB0IFVSTFxuICAgICAgICAgICAgc2NyaXB0ID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc2NyaXB0KTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBzY3JpcHQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHtzY3JpcHR9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHNjcmlwdFxuICAgICAgICAgICAgY29uc3QgZG9tU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBkb21TY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgICAgICAgICAgZG9tU2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgc2NyaXB0KTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnc2NyaXB0Jywgc2NyaXB0LCBkb21TY3JpcHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tU2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzY3JpcHQnLCBzY3JpcHQsIGRvbVNjcmlwdCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgc2NyaXB0IGZpbGU6IFwiJHtzY3JpcHR9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRvbVNjcmlwdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdHMgYW5kIGxvYWRzIGEgQ1NTIHN0eWxlc2hlZXQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogVGhlIHN0eWxlc2hlZXQgd2lsbCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhlIGNsb3NpbmcgYDwvaGVhZD5gIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHlsZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRTdHlsZShzdHlsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBzdHlsZSBVUkxcbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc3R5bGUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHN0eWxlc2hlZXQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1baHJlZj1cIiR7c3R5bGV9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHN0eWxlc2hlZXRcbiAgICAgICAgICAgIGNvbnN0IGRvbUNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgIGRvbUNzcy5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XG4gICAgICAgICAgICBkb21Dc3Muc2V0QXR0cmlidXRlKCdocmVmJywgc3R5bGUpO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmxvYWRlZCcsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIHN0eWxlc2hlZXQgZmlsZTogXCIke3N0eWxlfVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChkb21Dc3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmUtbG9hZHMgYW4gaW1hZ2UuXG4gICAgICpcbiAgICAgKiBUaGUgaW1hZ2Ugd2lsbCBub3QgYmUgaW5qZWN0ZWQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGltYWdlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZEltYWdlKGltYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHNjcmlwdCBVUkxcbiAgICAgICAgICAgIGltYWdlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoaW1hZ2UpO1xuXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBpbWFnZSBmaWxlOiBcIiR7aW1hZ2V9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5zcmMgPSBpbWFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBBbGxvd3MgYXR0YWNoaW5nIGEgbG9hZGluZyBjbGFzcyBvbiBlbGVtZW50cyB0aGF0IGFuIEFKQVggcmVxdWVzdCBpcyB0YXJnZXRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dGFjaExvYWRpbmcgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5pY2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWpheFN0YXJ0OiAnYWpheFN0YXJ0JyxcbiAgICAgICAgICAgIGFqYXhEb25lOiAnYWpheERvbmUnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFqYXhTdGFydChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgY29uc3QgbG9hZEVsZW1lbnRzID0gcmVxdWVzdC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWF0dGFjaC1sb2FkaW5nXScpO1xuICAgICAgICAgICAgaWYgKGxvYWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9hZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKHJlcXVlc3QuZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWpheERvbmUoZGF0YSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRFbGVtZW50cyA9IHJlcXVlc3QuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hdHRhY2gtbG9hZGluZ10nKTtcbiAgICAgICAgICAgIGlmIChsb2FkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxvYWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5lbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhyZXF1ZXN0LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExvYWRpbmdDbGFzcyhlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAoZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gJycpXG4gICAgICAgICAgICA/IGVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nXG4gICAgICAgICAgICA6ICd3bi1sb2FkaW5nJztcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogRGF0YSBjb25maWd1cmF0aW9uIHByb3ZpZGVyLlxuICpcbiAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBwYXNzaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSB0aHJvdWdoIGFuIGVsZW1lbnQncyBkYXRhIGF0dHJpYnV0ZXMuIFRoaXNcbiAqIGlzIGdlbmVyYWxseSB1c2VkIGZvciB3aWRnZXRzIG9yIFVJIGludGVyYWN0aW9ucyB0byBjb25maWd1cmUgdGhlbS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YUNvbmZpZyBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbG9jYWxDb25maWdcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoaW5zdGFuY2UsIGVsZW1lbnQsIGxvY2FsQ29uZmlnKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBTbm93Ym9hcmQgcGx1Z2luIHRvIGVuYWJsZSBkYXRhIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgZXh0cmFjdGVkIGZyb20gSFRNTCBlbGVtZW50cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmxvY2FsQ29uZmlnID0gbG9jYWxDb25maWcgfHwge307XG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25maWcgPSB7fTtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlnIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIGBjb25maWdgIHBhcmFtZXRlciBpcyB1bnNwZWNpZmllZCwgcmV0dXJucyB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnXG4gICAgICovXG4gICAgZ2V0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb25maWcgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUsIGF0IHJ1bnRpbWUsIGFueSBjb25maWd1cmF0aW9uIHZhbHVlIGFzIG5lY2Vzc2FyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RcbiAgICAgKi9cbiAgICBzZXQoY29uZmlnLCB2YWx1ZSwgcGVyc2lzdCkge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGNvbmZpZ3VyYXRpb24ga2V5IHRvIHNldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHBlcnNpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhc2V0W2NvbmZpZ10gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxDb25maWdbY29uZmlnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaGVzIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIG1ha2UgY2hhbmdlcyB0byB0aGUgZGF0YSBjb25maWcgb24gYSBET00gbGV2ZWwgYW5kIHJlLWFwcGx5IHRoZW1cbiAgICAgKiB0byB0aGUgY29uZmlnIG9uIHRoZSBKYXZhU2NyaXB0IHNpZGUuXG4gICAgICovXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB0aGlzLmdldEFjY2VwdGVkQ29uZmlncygpO1xuICAgICAgICB0aGlzLmluc3RhbmNlQ29uZmlnID0gdGhpcy5wcm9jZXNzQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkYXRhIGNvbmZpZy5cbiAgICAgKlxuICAgICAqIElmIGFuIGluc3RhbmNlIGhhcyBhbiBgYWNjZXB0QWxsRGF0YUNvbmZpZ3NgIHByb3BlcnR5LCBzZXQgdG8gYHRydWVgLCB0aGVuIGFsbCBkYXRhXG4gICAgICogYXR0cmlidXRlcyB3aWxsIGJlIGF2YWlsYWJsZSBhcyBjb25maWd1cmF0aW9uIHZhbHVlcy4gVGhpcyBjYW4gYmUgYSBzZWN1cml0eSBjb25jZXJuLCBzb1xuICAgICAqIHRyZWFkIGNhcmVmdWxseS5cbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSwgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUga2V5cyBhdmFpbGFibGUgaW4gYW4gb2JqZWN0XG4gICAgICogcmV0dXJuZWQgYnkgYSBgZGVmYXVsdHMoKWAgbWV0aG9kIGluIHRoZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXXxib29sZWFufVxuICAgICAqL1xuICAgIGdldEFjY2VwdGVkQ29uZmlncygpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5hY2NlcHRBbGxEYXRhQ29uZmlncyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0aGlzLmluc3RhbmNlLmFjY2VwdEFsbERhdGFDb25maWdzID09PSB0cnVlXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlZmF1bHRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnN0YW5jZSBlaXRoZXIgZG9lcyBub3QgaGF2ZSBhIGBkZWZhdWx0cygpYCBtZXRob2QsIG9yXG4gICAgICogdGhlIG1ldGhvZCBpdHNlbGYgZG9lcyBub3QgcmV0dXJuIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBMb2FkcyB1cCB0aGUgZGVmYXVsdHMsIHRoZW4gcG9wdWxhdGVzIGl0IHdpdGggYW55IGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBkYXRhXG4gICAgICogYXR0cmlidXRlcywgYmFzZWQgb24gdGhlIHJ1bGVzIG9mIHRoZSBhY2NlcHRlZCBjb25maWd1cmF0aW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgdGhlbiBjYWNoZWQgYW5kIGF2YWlsYWJsZSB0aHJvdWdoIGBjb25maWcuZ2V0KClgIGNhbGxzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBwcm9jZXNzQ29uZmlnKCkge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldERlZmF1bHRzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDb25maWdzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZWxlbWVudC5kYXRhc2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY2NlcHRlZENvbmZpZ3MgPT09IHRydWUgfHwgdGhpcy5hY2NlcHRlZENvbmZpZ3MuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5jb2VyY2VWYWx1ZSh0aGlzLmVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubG9jYWxDb25maWcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ29uZmlncyA9PT0gdHJ1ZSB8fCB0aGlzLmFjY2VwdGVkQ29uZmlncy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmxvY2FsQ29uZmlnW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29lcmNlcyBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgSmF2YVNjcmlwdC5cbiAgICAgKlxuICAgICAqIFRha2VzIHRoZSBzdHJpbmcgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YSBhdHRyaWJ1dGUgYW5kIGNvZXJjZXMgaXQgaW50byBhIG1vcmUgc3VpdGFibGVcbiAgICAgKiB0eXBlIGZvciBKYXZhU2NyaXB0IHByb2Nlc3NpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgY29lcmNlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXG4gICAgICAgIC8vIE51bGwgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5kZWZpbmVkIHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYXNlNjQgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlLnN0YXJ0c1dpdGgoJ2Jhc2U2NDonKSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0c3RyID0gc3RyaW5nVmFsdWUucmVwbGFjZSgvXmJhc2U2NDovLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihiYXNlNjRzdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29lcmNlVmFsdWUoZGVjb2RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb29sZWFuIHZhbHVlXG4gICAgICAgIGlmIChbJ3RydWUnLCAneWVzJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChbJ2ZhbHNlJywgJ25vJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE51bWVyaWMgdmFsdWVcbiAgICAgICAgaWYgKC9eWy0rXT9bMC05XSsoXFwuWzAtOV0rKT8kLy50ZXN0KHN0cmluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihzdHJpbmdWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKU09OIHZhbHVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvblBhcnNlcigpLnBhcnNlKHN0cmluZ1ZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIChzdHJpbmdWYWx1ZSA9PT0gJycpID8gdHJ1ZSA6IHN0cmluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGZsYXNoIG1lc3NhZ2VzIGZvciB0aGUgQ01TLlxuICpcbiAqIEZsYXNoIG1lc3NhZ2VzIHdpbGwgcG9wIHVwIGF0IHRoZSB0b3AgY2VudGVyIG9mIHRoZSBwYWdlIGFuZCB3aWxsIHJlbWFpbiBmb3IgNyBzZWNvbmRzIGJ5IGRlZmF1bHQuIEhvdmVyaW5nIG92ZXJcbiAqIHRoZSBtZXNzYWdlIHdpbGwgcmVzZXQgYW5kIHBhdXNlIHRoZSB0aW1lci4gQ2xpY2tpbmcgb24gdGhlIGZsYXNoIG1lc3NhZ2Ugd2lsbCBkaXNtaXNzIGl0LlxuICpcbiAqIEFyZ3VtZW50czpcbiAqICAtIFwibWVzc2FnZVwiOiBUaGUgY29udGVudCBvZiB0aGUgZmxhc2ggbWVzc2FnZS4gSFRNTCBpcyBhY2NlcHRlZC5cbiAqICAtIFwidHlwZVwiOiBUaGUgdHlwZSBvZiBmbGFzaCBtZXNzYWdlLiBUaGlzIGlzIGFwcGVuZGVkIGFzIGEgY2xhc3MgdG8gdGhlIGZsYXNoIG1lc3NhZ2UgaXRzZWxmLlxuICogIC0gXCJkdXJhdGlvblwiOiBIb3cgbG9uZyB0aGUgZmxhc2ggbWVzc2FnZSB3aWxsIHN0YXkgdmlzaWJsZSBmb3IsIGluIHNlY29uZHMuIERlZmF1bHQ6IDcgc2Vjb25kcy5cbiAqXG4gKiBVc2FnZTpcbiAqICAgICAgU25vd2JvYXJkLmZsYXNoKCdUaGlzIGlzIGEgZmxhc2ggbWVzc2FnZScsICdpbmZvJywgOCk7XG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsYXNoIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0KG1lc3NhZ2UsIHR5cGUsIGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgJ2RlZmF1bHQnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gTnVtYmVyKGR1cmF0aW9uIHx8IDcpO1xuXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFzaCBkdXJhdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBvciB6ZXJvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsndHJhbnNpdGlvbiddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBmbGFzaCBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRpbWVvdXQgaXMgY2xlYXJlZCBpZiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2hUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2gpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2guY3JlYXRlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5mbGFzaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICB0aGlzLmZsYXNoLmlubmVySFRNTCA9IHRoaXMubWVzc2FnZTtcbiAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCdmbGFzaC1tZXNzYWdlJywgdGhpcy50eXBlKTtcbiAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY29udHJvbCcpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5yZW1vdmUoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4gdGhpcy5zdG9wVGltZXIoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB0aGlzLnN0YXJ0VGltZXIoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lci5jbGFzc0xpc3QuYWRkKCdmbGFzaC10aW1lcicpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoVGltZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCduby10aW1lcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGJvZHlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdzaG93JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2gucmVtb3ZlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdoaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2ggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGZsYXNoIG1lc3NhZ2VzIGF2YWlsYWJsZSBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSA+IGRpdi5mbGFzaC1tZXNzYWdlJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5yZW1vdmUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSB0aW1lciBmb3IgdGhpcyBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YXJ0VGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbWVyVHJhbnMgPSB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2hUaW1lciwgJ3RpbWVvdXQnLCBudWxsLCBgJHt0aGlzLmR1cmF0aW9ufS4wc2AsIHRydWUpO1xuICAgICAgICB0aGlzLnRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW1vdmUoKSwgdGhpcy5kdXJhdGlvbiAqIDEwMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdGltZXIgZm9yIHRoaXMgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzdG9wVGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyVHJhbnMpIHtcbiAgICAgICAgICAgIHRoaXMudGltZXJUcmFucy5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRGVmaW5lcyBhIGRlZmF1bHQgbGlzdGVuZXIgZm9yIGZsYXNoIGV2ZW50cy5cbiAqXG4gKiBDb25uZWN0cyB0aGUgRmxhc2ggcGx1Z2luIHRvIHZhcmlvdXMgZXZlbnRzIHRoYXQgdXNlIGZsYXNoIG1lc3NhZ2VzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbGFzaExpc3RlbmVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuaWNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ2ZsYXNoJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhFcnJvck1lc3NhZ2U6ICdhamF4RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgIGFqYXhGbGFzaE1lc3NhZ2VzOiAnYWpheEZsYXNoTWVzc2FnZXMnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvIGZsYXNoIG1lc3NhZ2VzIGZvciBQSFAgZmxhc2ggcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIHJlYWR5KCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jb250cm9sPVwiZmxhc2gtbWVzc2FnZVwiXScpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5mbGFzaFR5cGUsXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmZsYXNoRHVyYXRpb24sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhIGZsYXNoIG1lc3NhZ2UgZm9yIEFKQVggZXJyb3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBhamF4RXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBmbGFzaCBtZXNzYWdlcyByZXR1cm5lZCBkaXJlY3RseSBmcm9tIEFKQVggZnVuY3Rpb25hbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlc1xuICAgICAqL1xuICAgIGFqYXhGbGFzaE1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG1lc3NhZ2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Nzc0NsYXNzLCBtZXNzYWdlXSA9IGVudHJ5O1xuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgY3NzQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQWRkcyBBSkFYLWRyaXZlbiBmb3JtIHZhbGlkYXRpb24gdG8gU25vd2JvYXJkIHJlcXVlc3RzLlxuICpcbiAqIERvY3VtZW50YXRpb24gZm9yIHRoaXMgZmVhdHVyZSBjYW4gYmUgZm91bmQgaGVyZTpcbiAqIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3Nub3dib2FyZC9leHRyYXMjYWpheC12YWxpZGF0aW9uXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1WYWxpZGF0aW9uIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZXJyb3JCYWdzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2NsZWFyVmFsaWRhdGlvbicsXG4gICAgICAgICAgICBhamF4VmFsaWRhdGlvbkVycm9yczogJ2RvVmFsaWRhdGlvbicsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZHkgZXZlbnQgaGFuZGxlci5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0RXJyb3JCYWdzKGRvY3VtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhbiBBSkFYIHJlc3BvbnNlIGFuZCBwYXNzZXMgdGhlbSB0aHJvdWdoIHRvIHRoZSBlcnJvciBiYWdzLlxuICAgICAqXG4gICAgICogVGhpcyBoYW5kbGVyIHJldHVybnMgZmFsc2UgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIHZhbGlkYXRpb24gaGFuZGxpbmcsIGFuZCBwcmV2ZW50cyB0aGUgZmxhc2hcbiAgICAgKiBtZXNzYWdlIHRoYXQgaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQgZm9yIGZpZWxkIGVycm9ycyBpbiBBSkFYIHJlcXVlc3RzIGZyb20gc2hvd2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBkb1ZhbGlkYXRpb24oZm9ybSwgaW52YWxpZEZpZWxkcywgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LnJlcXVlc3RWYWxpZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gZm9ybSk7XG4gICAgICAgIGVycm9yQmFncy5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFueSB2YWxpZGF0aW9uIGVycm9ycyBpbiB0aGUgZ2l2ZW4gZm9ybS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJvbWlzZVxuICAgICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNsZWFyVmFsaWRhdGlvbihwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50LmRhdGFzZXQucmVxdWVzdFZhbGlkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlcXVlc3QuZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gcmVxdWVzdC5mb3JtKTtcbiAgICAgICAgZXJyb3JCYWdzLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVFcnJvckJhZyhlcnJvckJhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIGVycm9yIGJhZ3MgKGVsZW1lbnRzIHdpdGggXCJkYXRhLXZhbGlkYXRlLWVycm9yXCIgYXR0cmlidXRlKSBhbmQgbGlua3MgdGhlbSB0byBhXG4gICAgICogcGxhY2Vob2xkZXIgYW5kIGZvcm0uXG4gICAgICpcbiAgICAgKiBUaGUgZXJyb3IgYmFncyB3aWxsIGJlIGluaXRpYWxseSBoaWRkZW4sIGFuZCB3aWxsIG9ubHkgc2hvdyB3aGVuIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdE5vZGVcbiAgICAgKi9cbiAgICBjb2xsZWN0RXJyb3JCYWdzKHJvb3ROb2RlKSB7XG4gICAgICAgIHJvb3ROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXSwgW2RhdGEtdmFsaWRhdGUtZm9yXScpLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZXJyb3JCYWcuY2xvc2VzdCgnZm9ybVtkYXRhLXJlcXVlc3QtdmFsaWRhdGVdJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgZXJyb3IgYmFnIGRvZXMgbm90IHJlc2lkZSB3aXRoaW4gYSB2YWxpZGF0aW5nIGZvcm0sIHJlbW92ZSBpdFxuICAgICAgICAgICAgaWYgKCFmb3JtKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlcnJvckJhZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5kIG1lc3NhZ2UgbGlzdCBub2RlLCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCBtZXNzYWdlTGlzdEVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVycm9yQmFnLm1hdGNoZXMoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXScpKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50ID0gZXJyb3JCYWcucXVlcnlTZWxlY3RvcignW2RhdGEtbWVzc2FnZV0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgbm9kZVxuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXJyb3IgYmFnIGFuZCByZXBsYWNlIHdpdGggcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yQmFnRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlcnJvckJhZyxcbiAgICAgICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9yOiAoZXJyb3JCYWcuZGF0YXNldC52YWxpZGF0ZUZvcilcbiAgICAgICAgICAgICAgICAgICAgPyBlcnJvckJhZy5kYXRhc2V0LnZhbGlkYXRlRm9yLnNwbGl0KC9cXHMqLFxccyovKVxuICAgICAgICAgICAgICAgICAgICA6ICcqJyxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQ6IChtZXNzYWdlTGlzdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZUxpc3RFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RBbmNob3I6IG51bGwsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZTogKGVycm9yQmFnLmRhdGFzZXQudmFsaWRhdGVGb3IpXG4gICAgICAgICAgICAgICAgICAgID8gKGVycm9yQmFnLnRleHRDb250ZW50ICE9PSAnJyB8fCBlcnJvckJhZy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBJZiBhbiBtZXNzYWdlIGxpc3QgZWxlbWVudCBleGlzdHMsIGNyZWF0ZSBhbm90aGVyIHBsYWNlaG9sZGVyIHRvIGFjdCBhcyBhbiBhbmNob3IgcG9pbnRcbiAgICAgICAgICAgIGlmIChtZXNzYWdlTGlzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlTGlzdEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtZXNzYWdlTGlzdEFuY2hvciwgbWVzc2FnZUxpc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlcnJvckJhZ0RhdGEubWVzc2FnZUxpc3RBbmNob3IgPSBtZXNzYWdlTGlzdEFuY2hvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocGxhY2Vob2xkZXIsIGVycm9yQmFnKTtcblxuICAgICAgICAgICAgdGhpcy5lcnJvckJhZ3MucHVzaChlcnJvckJhZ0RhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlcyBhbiBlcnJvciBiYWcsIHJlcGxhY2luZyB0aGUgZXJyb3IgbWVzc2FnZXMgd2l0aCBhIHBsYWNlaG9sZGVyIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKi9cbiAgICBoaWRlRXJyb3JCYWcoZXJyb3JCYWcpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZXJyb3JCYWcucGxhY2Vob2xkZXIsIGVycm9yQmFnLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYW4gZXJyb3IgYmFnIHdpdGggdGhlIGdpdmVuIGludmFsaWQgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKi9cbiAgICBzaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVycm9yQmFnLmVsZW1lbnQsIGVycm9yQmFnLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvckJhZy52YWxpZGF0ZUZvciAhPT0gJyonKSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yQmFnLmN1c3RvbU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZpZWxkID0gT2JqZWN0LmtleXMoaW52YWxpZEZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGVycm9yQmFnLnZhbGlkYXRlRm9yLmluY2x1ZGVzKGZpZWxkKSlcbiAgICAgICAgICAgICAgICAgICAgLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgW2Vycm9yQmFnLmVsZW1lbnQuaW5uZXJIVE1MXSA9IGludmFsaWRGaWVsZHNbZmlyc3RGaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JCYWcubWVzc2FnZUxpc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdmFsaWRhdGlvbi1tZXNzYWdlXScpLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaW52YWxpZEZpZWxkcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbLCBlcnJvcnNdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBlcnJvckJhZy5tZXNzYWdlTGlzdEVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5kYXRhc2V0LnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmlubmVySFRNTCA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICBlcnJvckJhZy5tZXNzYWdlTGlzdEFuY2hvci5hZnRlcihtZXNzYWdlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFtlcnJvckJhZy5lbGVtZW50LmlubmVySFRNTF0gPSBpbnZhbGlkRmllbGRzW09iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpLnNoaWZ0KCldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGVycm9yIGJhZyBhcHBsaWVzIGZvciB0aGUgZ2l2ZW4gaW52YWxpZCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW52YWxpZEZpZWxkc1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLnZhbGlkYXRlRm9yID09PSAnKicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZXJyb3JCYWcudmFsaWRhdGVGb3IuaW5jbHVkZXMoZmllbGQpKVxuICAgICAgICAgICAgLmxlbmd0aCA+IDA7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBEaXNwbGF5cyBhIHN0cmlwZSBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHRoYXQgaW5kaWNhdGVzIGxvYWRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0cmlwZUxvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmljZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydyZXF1ZXN0J107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2FqYXhTdGFydCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuY291bnRlciA9IDA7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVTdHJpcGUoKTtcbiAgICB9XG5cbiAgICBhamF4U3RhcnQocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5vcHRpb25zLnN0cmlwZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvdygpO1xuXG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZVN0cmlwZSgpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGVMb2FkZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICB0aGlzLmluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGluZy1pbmRpY2F0b3InLCAnbG9hZGVkJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlLmNsYXNzTGlzdC5hZGQoJ3N0cmlwZScpO1xuICAgICAgICB0aGlzLnN0cmlwZUxvYWRlZC5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGVkJyk7XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQodGhpcy5zdHJpcGUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZCh0aGlzLnN0cmlwZUxvYWRlZCk7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmluZGljYXRvcik7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jb3VudGVyICs9IDE7XG5cbiAgICAgICAgY29uc3QgbmV3U3RyaXBlID0gdGhpcy5zdHJpcGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZChuZXdTdHJpcGUpO1xuICAgICAgICB0aGlzLnN0cmlwZS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBuZXdTdHJpcGU7XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRlZCcpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3duLWxvYWRpbmcnKTtcbiAgICB9XG5cbiAgICBoaWRlKGZvcmNlKSB7XG4gICAgICAgIHRoaXMuY291bnRlciAtPSAxO1xuXG4gICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvdW50ZXIgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3duLWxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRW1iZWRzIHRoZSBcImV4dHJhc1wiIHN0eWxlc2hlZXQgaW50byB0aGUgcGFnZSwgaWYgaXQgaXMgbm90IGxvYWRlZCB0aHJvdWdoIHRoZSB0aGVtZS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3R5bGVzaGVldExvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZWFkeSgpIHtcbiAgICAgICAgbGV0IHN0eWxlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiBzdHlsZXNoZWV0IGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbcmVsPVwic3R5bGVzaGVldFwiXScpLmZvckVhY2goKGNzcykgPT4ge1xuICAgICAgICAgICAgaWYgKGNzcy5ocmVmLmVuZHNXaXRoKCcvbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2Nzcy9zbm93Ym9hcmQuZXh0cmFzLmNzcycpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFzdHlsZXNMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQuc2V0QXR0cmlidXRlKCdocmVmJywgdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoJy9tb2R1bGVzL3N5c3RlbS9hc3NldHMvY3NzL3Nub3dib2FyZC5leHRyYXMuY3NzJykpO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZXNoZWV0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBQcm92aWRlcyB0cmFuc2l0aW9uIHN1cHBvcnQgZm9yIGVsZW1lbnRzLlxuICpcbiAqIFRyYW5zaXRpb24gYWxsb3dzIENTUyB0cmFuc2l0aW9ucyB0byBiZSBjb250cm9sbGVkIGFuZCBjYWxsYmFja3MgdG8gYmUgcnVuIG9uY2UgY29tcGxldGVkLiBJdCB3b3JrcyBzaW1pbGFyIHRvIFZ1ZVxuICogdHJhbnNpdGlvbnMgd2l0aCAzIHN0YWdlcyBvZiB0cmFuc2l0aW9uLCBhbmQgY2xhc3NlcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSB0cmFuc2l0aW9uIG5hbWUgc3VmZml4ZWQgd2l0aFxuICogdGhlIHN0YWdlIG9mIHRyYW5zaXRpb246XG4gKlxuICogIC0gYGluYDogQSBjbGFzcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uLCByZW1vdmVkIGFmdGVyd2FyZHMuIFRoaXMgc2hvdWxkIGJlXG4gKiAgICAgIHVzZWQgdG8gZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICogIC0gYGFjdGl2ZWA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24gaXRzZWxmLlxuICogIC0gYG91dGA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uIGFuZCBrZXB0IHRvIHRoZSBlbmQgb2YgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24uIFRoaXMgc2hvdWxkIGRlZmluZSB0aGUgZW5kIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICpcbiAqIFVzYWdlOlxuICogICAgICBTbm93Ym9hcmQudHJhbnNpdGlvbihkb2N1bWVudC5lbGVtZW50LCAndHJhbnNpdGlvbicsICgpID0+IHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgZWxlbWVudCBhZnRlciA3IHNlY29uZHMnKTtcbiAqICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gKiAgICAgIH0sICc3cycpO1xuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFuc2l0aW9uIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHRyYW5zaXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNpdGlvbiBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpdGlvbiwgdGhpcyBwcmVmaXhlcyB0aGUgc3RhZ2VzIG9mIHRyYW5zaXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uIEFuIG9wdGlvbmFsIG92ZXJyaWRlIG9uIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uLiBNdXN0IGJlIHNwZWNpZmllZCBhcyAncycgKHNlY3MpIG9yICdtcycgKG1zZWNzKS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRyYWlsVG8gSWYgdHJ1ZSwgdGhlIFwib3V0XCIgY2xhc3Mgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCwgdHJhbnNpdGlvbiwgY2FsbGJhY2ssIGR1cmF0aW9uLCB0cmFpbFRvKSB7XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgSFRNTEVsZW1lbnQgbXVzdCBiZSBwcm92aWRlZCBmb3IgdHJhbnNpdGlvbmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2l0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMucGFyc2VEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhaWxUbyA9ICh0cmFpbFRvID09PSB0cnVlKTtcblxuICAgICAgICB0aGlzLmRvVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgZXZlbnQgY2xhc3NlcyB0byB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBldmVudENsYXNzZXMoLi4uYXJncykge1xuICAgICAgICBjb25zdCBldmVudENsYXNzZXMgPSB7XG4gICAgICAgICAgICBpbjogYCR7dGhpcy50cmFuc2l0aW9ufS1pbmAsXG4gICAgICAgICAgICBhY3RpdmU6IGAke3RoaXMudHJhbnNpdGlvbn0tYWN0aXZlYCxcbiAgICAgICAgICAgIG91dDogYCR7dGhpcy50cmFuc2l0aW9ufS1vdXRgLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXZlbnRDbGFzc2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldHVybkNsYXNzZXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRDbGFzc2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmIChhcmdzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5DbGFzc2VzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3NlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRvVHJhbnNpdGlvbigpIHtcbiAgICAgICAgLy8gQWRkIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRDbGFzc2VzKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdHJhbnNpdGlvbiAtIHNob3cgXCJpblwiIGFuZCBcImFjdGl2ZVwiIGNsYXNzZXNcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2luJywgJ2FjdGl2ZScpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBhIHRyYW5zaXRpb24gZXhpc3RzXG4gICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KVsndHJhbnNpdGlvbi1kdXJhdGlvbiddICE9PSAnMHMnKSB7XG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciB0aGUgdHJhbnNpdGlvbiB0byBlbmRcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRoaXMub25UcmFuc2l0aW9uRW5kKCksIHtcbiAgICAgICAgICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5ldmVudENsYXNzZXMoJ2luJylbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmV2ZW50Q2xhc3Nlcygnb3V0JylbMF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Q2xhc3NlcygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgdHJhbnNpdGlvbiBlbmRzLlxuICAgICAqXG4gICAgICogV2hlbiBhIHRyYW5zaXRpb24gZW5kcywgdGhlIGluc3RhbmNlIG9mIHRoZSB0cmFuc2l0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZGVzdHJ1Y3RlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG9uVHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2FjdGl2ZScsICghdGhpcy50cmFpbFRvKSA/ICdvdXQnIDogJycpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGEgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB0aGlzLm9uVHJhbnNpdGlvbkVuZCwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNldENsYXNzZXMoKTtcblxuICAgICAgICAvLyBSZW1vdmUgZHVyYXRpb24gb3ZlcnJpZGVcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBkZXN0cnVjdG9yXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNsYXNzZXMsIHJlbW92aW5nIGFueSB0cmFuc2l0aW9uIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZXNldENsYXNzZXMoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCkuZm9yRWFjaCgoZXZlbnRDbGFzcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZXZlbnRDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGdpdmVuIGR1cmF0aW9uIGFuZCBjb252ZXJ0cyBpdCB0byBhIFwibXNcIiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkdXJhdGlvblxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcGFyc2VEdXJhdGlvbihkdXJhdGlvbikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSAvXihbMC05XSsoXFwuWzAtOV0rKT8pKG0/cyk/JC8uZXhlYyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihwYXJzZWRbMV0pO1xuICAgICAgICBjb25zdCB1bml0ID0gKHBhcnNlZFszXSA9PT0gJ3MnKVxuICAgICAgICAgICAgPyAnc2VjJ1xuICAgICAgICAgICAgOiAnbXNlYyc7XG5cbiAgICAgICAgcmV0dXJuICh1bml0ID09PSAnc2VjJylcbiAgICAgICAgICAgID8gYCR7YW1vdW50ICogMTAwMH1tc2BcbiAgICAgICAgICAgIDogYCR7TWF0aC5mbG9vcihhbW91bnQpfW1zYDtcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJpZ2dlckVudGl0eVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXIgVGhlIHNlbGVjdG9yIGZvciB0aGUgdHJpZ2dlciB0YXJnZXQgZWxlbWVudChzKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgbWV0IGZvciB0aGUgdHJpZ2dlciB0byBmaXJlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgdHJpZ2dlciBmaXJlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJlbnQgVGhlIHBhcmVudCBlbGVtZW50IHdpdGggd2hpY2ggdG8gbGltaXQgdGhlIHRyaWdnZXIgc2NvcGUuXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50W119IGVsZW1lbnRzIFRoZSB0YXJnZXQgZWxlbWVudHMgdGhhdCB0aGlzIHRyaWdnZXIgYXBwbGllcyB0by5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUcmlnZ2VyRWxlbWVudFxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gZWxlbWVudCBUaGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnROYW1lIFRoZSB0cmlnZ2VyIGV2ZW50IG5hbWUuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBldmVudCBUaGUgdHJpZ2dlciBldmVudCBmdW5jdGlvbi5cbiAqL1xuXG4vKipcbiAqIFRyaWdnZXIgaGFuZGxlciBmb3IgSFRNTCBlbGVtZW50cy5cbiAqXG4gKiBUaGlzIGlzIGEgcmUtaW1hZ2luaW5nIG9mIHRoZSBJbnB1dC5UcmlnZ2VyIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIG9yaWdpbmFsIFdpbnRlciBDTVMgZnJhbWV3b3JrLFxuICogaW5pdGlhbGlzZWQgdGhyb3VnaCB0aGUgYGRhdGEtdHJpZ2dlcmAgYXR0cmlidXRlcy5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byByZW1haW5pbmcgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwgSW5wdXQuVHJpZ2dlciBmdW5jdGlvbmFsaXR5LCB0aGlzXG4gKiBoYW5kbGVyIGFkZHMgYWRkaXRpb25hbCBjb25kaXRpb25zIGFuZCBjb25maWd1cmF0aW9uIGZvciBtb3JlIGZsZXhpYmxlIHRyaWdnZXIgdXNhZ2UuXG4gKlxuICogQHNlZSBodHRwczovL3dpbnRlcmNtcy5jb20vZG9jcy92MS4yL3VpL3NjcmlwdC9pbnB1dC10cmlnZ2VyXG4gKlxuICogQGNvcHlyaWdodCAyMDI0IFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGVsZW1lbnQgdGhpcyBpbnN0YW5jZSBpcyBhdHRhY2hlZCB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB2YXIge01hcDxzdHJpbmcsIE1hcDxUcmlnZ2VyRW50aXR5Pj59IFRoZSB0cmlnZ2VycyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VycyA9IG5ldyBNYXAoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHZhciB7U2V0PFRyaWdnZXJFbGVtZW50Pn0gVGhlIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBib3VuZCBieSB0cmlnZ2Vycy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXZlbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VUcmlnZ2VycygpO1xuXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVRyaWdnZXJFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMucnVuRXZlbnRzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCd0cmlnZ2Vycy5yZWFkeScsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cnVjdG9yLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICB0aGlzLnJlc2V0RXZlbnRzKCk7XG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHRoZSBlbGVtZW50J3MgZGF0YSBhdHRyaWJ1dGVzIGFuZCBkZXRlcm1pbmVzIGFwcGxpY2FibGUgdHJpZ2dlcnMuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VyIGRhdGEgYXR0cmlidXRlcyBtdXN0IGJlIGluIHRoZSBmb3JtYXQgYGRhdGEtdHJpZ2dlci1bbmFtZV0tW3BhcmFtZXRlcl1gIGZvciBtdWx0aXBsZVxuICAgICAqIHRyaWdnZXJzLCBvciBgZGF0YS10cmlnZ2VyLVtwYXJhbWV0ZXJdYCBmb3Igc2luZ2xlIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOlxuICAgICAqICAtIGBjb25kaXRpb25gIG9yIGB3aGVyZWA6IFRoZSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHRyaWdnZXIgdG8gZmlyZS5cbiAgICAgKiAgLSBgYWN0aW9uYDogVGhlIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIHRyaWdnZXIgZmlyZXMuXG4gICAgICogIC0gYHBhcmVudGAgb3IgYGNsb3Nlc3QtcGFyZW50YDogVGhlIHBhcmVudCBlbGVtZW50IHdpdGggd2hpY2ggdG8gbGltaXQgdGhlIHRyaWdnZXIgc2NvcGUuXG4gICAgICpcbiAgICAgKiBJbnRlcm5hbGx5LCB0aGUgdHJpZ2dlciBtYXAgdXNlcyB0aGUgYHRyaWdnZXJgIHBhcmFtZXRlciB0byBzdG9yZSB0aGUgdHJpZ2dlciBzZWxlY3Rvci5cbiAgICAgKi9cbiAgICBwYXJzZVRyaWdnZXJzKCkge1xuICAgICAgICBjb25zdCB7IGRhdGFzZXQgfSA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5jbGVhcigpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFzZXQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKC8tW0EtWl0vLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgY2FtZWxDYXNlIHRvIGRhc2gtc3R5bGUgZm9yIGRhdGEgYXR0cmlidXRlOiAke2tleX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGFzaFN0eWxlID0ga2V5LnJlcGxhY2UoLyhbQS1aXSkvZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcblxuICAgICAgICAgICAgaWYgKGRhc2hTdHlsZSAhPT0gJ3RyaWdnZXInICYmICFkYXNoU3R5bGUuc3RhcnRzV2l0aCgndHJpZ2dlci0nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlclBhcnRzID0gLyhbYS16MC05XFwtLjpfXSs/KSg/Oig/Oi0pKGNsb3Nlc3QtcGFyZW50fGNvbmRpdGlvbnx3aGVufGFjdGlvbnxwYXJlbnQpKT8kL2kuZXhlYyhcbiAgICAgICAgICAgICAgICBkYXNoU3R5bGUucmVwbGFjZSgndHJpZ2dlci0nLCAnJykudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCB0cmlnZ2VyTmFtZSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdHJpZ2dlclR5cGUgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgWyd0cmlnZ2VyJywgJ2NvbmRpdGlvbicsICdhY3Rpb24nLCAncGFyZW50JywgJ3doZW4nLCAnY2xvc2VzdCddLmluZGV4T2YodHJpZ2dlclBhcnRzWzFdKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAmJiAodHJpZ2dlclBhcnRzWzFdICE9PSAnY2xvc2VzdCcgfHwgKHRyaWdnZXJQYXJ0c1sxXSA9PT0gJ2Nsb3Nlc3QnICYmIHRyaWdnZXJQYXJ0c1syXSA9PT0gJ3BhcmVudCcpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBvcmlnaW5hbCB0cmlnZ2VyIGZvcm1hdFxuICAgICAgICAgICAgICAgIHRyaWdnZXJOYW1lID0gJ19fb3JpZ2luYWwnO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gKHRyaWdnZXJQYXJ0c1sxXSA9PT0gJ2Nsb3Nlc3QnKSA/ICdwYXJlbnQnIDogdHJpZ2dlclBhcnRzWzFdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUGFydHNbMl0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IFsnY2xvc2VzdC1wYXJlbnQnLCAnY29uZGl0aW9uJywgJ3doZW4nLCAnYWN0aW9uJywgJ3BhcmVudCddLmluZGV4T2YodHJpZ2dlclBhcnRzWzJdKSAhPT0gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFBhcnNlIG11bHRpLXRyaWdnZXIgZm9ybWF0XG4gICAgICAgICAgICAgICAgWywgdHJpZ2dlck5hbWVdID0gdHJpZ2dlclBhcnRzO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJpZ2dlclBhcnRzWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3Nlc3QtcGFyZW50JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGFyZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ3BhcmVudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29uZGl0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2hlbic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdjb25kaXRpb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjdGlvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdhY3Rpb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICd0cmlnZ2VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJzLmhhcyh0cmlnZ2VyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLnNldCh0cmlnZ2VyTmFtZSwgbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcnMuZ2V0KHRyaWdnZXJOYW1lKS5zZXQodHJpZ2dlclR5cGUsIGRhdGFzZXRba2V5XSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmlnZ2VyIGRhdGEgYXR0cmlidXRlIGFmdGVyIHBhcnNpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0W2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRyaWdnZXJzLCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgZG8gbm90IGhhdmUgYXQgbGVhc3QgYSB0cmlnZ2VyIHNlbGVjdG9yLCBhXG4gICAgICAgIC8vIGNvbmRpdGlvbiBhbmQgYW4gYWN0aW9uLCBvciBhcmUgdXNpbmcgaW52YWxpZCBjb25kaXRpb25zIG9yIGFjdGlvbnNcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKHRyaWdnZXIpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRyaWdnZXIuaGFzKCd0cmlnZ2VyJylcbiAgICAgICAgICAgICAgICB8fCAhdHJpZ2dlci5oYXMoJ2NvbmRpdGlvbicpXG4gICAgICAgICAgICAgICAgfHwgIXRyaWdnZXIuaGFzKCdhY3Rpb24nKVxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIHx8ICF0aGlzLmlzVmFsaWRDb25kaXRpb24odHJpZ2dlcilcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5pc1ZhbGlkQWN0aW9uKHRyaWdnZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ2VsZW1lbnRzJywgZWxlbWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBjb21tYW5kIGdpdmVuIGFzIGVpdGhlciBhIGNvbmRpdGlvbiBvciBhbiBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBDb21tYW5kcyBhcmUgZm9ybWF0dGVkIGFzOiBuYW1lOnBhcmFtZXRlcjEscGFyYW1ldGVyMixwYXJhbWV0ZXIzLCBhbHRob3VnaCB3ZSBhbHNvIHN1cHBvcnRcbiAgICAgKiB0aGUgb2xkIGZvcm1hdCBvZiB2YWx1ZVtwYXJhbWV0ZXIxLHBhcmFtZXRlcjIscGFyYW1ldGVyM10gZm9yIHRoZSBgdmFsdWVgIGNvbW1hbmQgb25seS5cbiAgICAgKlxuICAgICAqIElmIGEgcGFyYW1ldGVyIHJlcXVpcmVzIGEgY29tbWEgd2l0aGluLCB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSB3cmFwcGVkIGluIHF1b3Rlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gICAgICogQHJldHVybnMge25hbWU6IHN0cmluZywgcGFyYW1ldGVyczogc3RyaW5nW119XG4gICAgICovXG4gICAgcGFyc2VDb21tYW5kKGNvbW1hbmQpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBvbGQtZm9ybWF0IHZhbHVlIGNvbW1hbmQgKHZhbHVlW2ZvbyxiYXJdKVxuICAgICAgICBpZiAoY29tbWFuZC5zdGFydHNXaXRoKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNvbW1hbmQubWF0Y2goL1teW1xcXV0rKD89XSkvZyk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gU3BsaXQgdmFsdWVzIHdpdGggY29tbWFzXG4gICAgICAgICAgICBtYXRjaC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRWYWx1ZXMgPSB2YWx1ZS5yZXBsYWNlKC8oXCJbXlwiXSpcIil8KCdbXiddKicpL2csIChxdW90ZWQpID0+IHF1b3RlZC5yZXBsYWNlKC8sL2csICd8fHwnKSlcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoc3BsaXRWYWx1ZSkgPT4gc3BsaXRWYWx1ZS5yZXBsYWNlKC9cXHxcXHxcXHwvZywgJywnKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS50cmltKCkpO1xuXG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goLi4uc3BsaXRWYWx1ZXMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB2YWx1ZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb21tYW5kLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogY29tbWFuZCxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbbmFtZSwgcGFyYW1ldGVyc10gPSBjb21tYW5kLnNwbGl0KCc6JywgMik7XG5cbiAgICAgICAgaWYgKCFwYXJhbWV0ZXJzLmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbcGFyYW1ldGVyc10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BsaXRWYWx1ZXMgPSBwYXJhbWV0ZXJzLnJlcGxhY2UoLyhcIlteXCJdKlwiKXwoJ1teJ10qJykvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoKHNwbGl0VmFsdWUpID0+IHNwbGl0VmFsdWUucmVwbGFjZSgvXFx8XFx8XFx8L2csICcsJykucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykudHJpbSgpKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHNwbGl0VmFsdWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbnkgZWxlbWVudHMgYXJlIGFjY2Vzc2libGUgYnkgdGhlIHByb3ZpZGVkIHRyaWdnZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX1cbiAgICAgKi9cbiAgICBnZXRTZWxlY3RhYmxlRWxlbWVudHModHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlci5oYXMoJ3BhcmVudCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQuY2xvc2VzdCh0cmlnZ2VyLmdldCgncGFyZW50JykpLnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlci5nZXQoJ3RyaWdnZXInKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0cmlnZ2VyLmdldCgndHJpZ2dlcicpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvdmlkZWQgdHJpZ2dlciBjb25kaXRpb24gaXMgdmFsaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1ZhbGlkQ29uZGl0aW9uKHRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdjaGVja2VkJyxcbiAgICAgICAgICAgICd1bmNoZWNrZWQnLFxuICAgICAgICAgICAgJ2VtcHR5JyxcbiAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAnb25lb2YnLFxuICAgICAgICAgICAgJ2FsbG9mJyxcbiAgICAgICAgICAgICdmb2N1cycsXG4gICAgICAgICAgICAnYmx1cicsXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2NvbmRpdGlvbicpKS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb3ZpZGVkIHRyaWdnZXIgYWN0aW9uIGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNWYWxpZEFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnc2hvdycsXG4gICAgICAgICAgICAnaGlkZScsXG4gICAgICAgICAgICAnZW5hYmxlJyxcbiAgICAgICAgICAgICdkaXNhYmxlJyxcbiAgICAgICAgICAgICdlbXB0eScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdhdHRyJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2FjdGlvbicpKS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB0cmlnZ2VyIGV2ZW50cyBvbiB0cmlnZ2VyIGFuZCB0YXJnZXQgZWxlbWVudHMuXG4gICAgICovXG4gICAgY3JlYXRlVHJpZ2dlckV2ZW50cygpIHtcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHBhcmFtZXRlcnMgfSA9IHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdjb25kaXRpb24nKSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdvbmVPZic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsdWVFdmVudCh0cmlnZ2VyLCBmYWxzZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FsbE9mJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWx1ZUV2ZW50KHRyaWdnZXIsIHRydWUsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRW1wdHlFdmVudCh0cmlnZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRyaWdnZXIgdGhhdCBmaXJlcyB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQocykgbWF0Y2hlcyBvbmUgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtICB7Li4uc3RyaW5nfSB2YWx1ZXNcbiAgICAgKi9cbiAgICBjcmVhdGVWYWx1ZUV2ZW50KHRyaWdnZXIsIGFsbCwgLi4udmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50cycpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1maWxlXSwgaW5wdXRbdHlwZT1pbWFnZV0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0nKSkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbnMgYW5kIGZpbGUgaW5wdXRzIGFyZSB1bnN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGhpc0V2ZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlcyA9IG5ldyBTZXQoKTtcblxuICAgICAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlcy5zb21lKCh2YWx1ZSkgPT4gZWxlbWVudFZhbHVlcy5oYXModmFsdWUpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RXZlbnQgPSAoKSA9PiB0aGlzRXZlbnQoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudE5hbWU6ICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGVsZW1lbnRFdmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lOiAnaW5wdXQnLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlbGVtZW50RXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gdGhlcmUgaXMgbm8gdmFsdWUgd2l0aGluIHRoZSB0YXJnZXQgZWxlbWVudChzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqL1xuICAgIGNyZWF0ZUVtcHR5RXZlbnQodHJpZ2dlcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRoaXNFdmVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RXZlbnQgPSAoKSA9PiB0aGlzRXZlbnQoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudE5hbWU6ICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGVsZW1lbnRFdmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lOiAnaW5wdXQnLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlbGVtZW50RXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBydW5FdmVudHMoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiBldmVudC5ldmVudCgpKTtcbiAgICB9XG5cbiAgICByZXNldEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC5ldmVudE5hbWUsIGV2ZW50LmV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCBjb25kaXRpb25NZXQpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBwYXJhbWV0ZXJzIH0gPSB0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnYWN0aW9uJykpO1xuXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnc2hvdyc6XG4gICAgICAgICAgICBjYXNlICdoaWRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvblNob3codHJpZ2dlciwgKG5hbWUgPT09ICdzaG93JykgPyBjb25kaXRpb25NZXQgOiAhY29uZGl0aW9uTWV0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhY3Rpb25TaG93KHRyaWdnZXIsIHNob3cpIHtcbiAgICAgICAgaWYgKHNob3cgJiYgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5lbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuXG4gICAgICAgICAgICB0aGlzLmFmdGVyQWN0aW9uKHRyaWdnZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsRGlzcGxheSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KS5kaXNwbGF5O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZnRlckFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmRlYnVnKCdUcmlnZ2VyIGZpcmVkJywgdGhpcy5lbGVtZW50LCB0cmlnZ2VyKTtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ3RyaWdnZXIuZmlyZWQnLCB0aGlzLmVsZW1lbnQsIHRyaWdnZXIpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogSW50ZXJuYWwgcHJveHkgZm9yIFNub3dib2FyZC5cbiAqXG4gKiBUaGlzIGhhbmRsZXIgd3JhcHMgdGhlIFNub3dib2FyZCBpbnN0YW5jZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgcGx1Z2luIGluc3RhbmNlcy5cbiAqIEl0IHByZXZlbnRzIGFjY2VzcyB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHM6XG4gKiAgLSBgYXR0YWNoQWJzdHJhY3RzYDogTm8gbmVlZCB0byBhdHRhY2ggYWJzdHJhY3RzIGFnYWluLlxuICogIC0gYGxvYWRVdGlsdGllc2A6IE5vIG5lZWQgdG8gbG9hZCB1dGlsaXRpZXMgYWdhaW4uXG4gKiAgLSBgaW5pdGlhbGlzZWA6IFNub3dib2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkLlxuICogIC0gYGluaXRpYWxpc2VTaW5nbGV0b25zYDogU2luZ2xldG9ucyBhcmUgYWxyZWFkeSBpbml0aWFsaXNlZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKFsnYXR0YWNoQWJzdHJhY3RzJywgJ2xvYWRVdGlsaXRpZXMnLCAnaW5pdGlhbGlzZScsICdpbml0aWFsaXNlU2luZ2xldG9ucyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgY2Fubm90IHVzZSB0aGUgXCIke3Byb3B9XCIgU25vd2JvYXJkIG1ldGhvZCB3aXRoaW4gYSBwbHVnaW4uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4gUmVmbGVjdC5nZXQodGFyZ2V0LCAncGx1Z2lucycpW3Byb3BMb3dlcl0uZ2V0SW5zdGFuY2UoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICB9LFxuXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChbJ2F0dGFjaEFic3RyYWN0cycsICdsb2FkVXRpbGl0aWVzJywgJ2luaXRpYWxpc2UnLCAnaW5pdGlhbGlzZVNpbmdsZXRvbnMnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbn07XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuaW1wb3J0IElubmVyUHJveHlIYW5kbGVyIGZyb20gJy4vSW5uZXJQcm94eUhhbmRsZXInO1xuXG4vKipcbiAqIFBsdWdpbiBsb2FkZXIgY2xhc3MuXG4gKlxuICogVGhpcyBpcyBhIHByb3ZpZGVyIChmYWN0b3J5KSBjbGFzcyBmb3IgYSBzaW5nbGUgcGx1Z2luIGFuZCBwcm92aWRlcyB0aGUgbGluayBiZXR3ZWVuIFNub3dib2FyZCBmcmFtZXdvcmsgZnVuY3Rpb25hbGl0eVxuICogYW5kIHRoZSB1bmRlcmx5aW5nIHBsdWdpbiBpbnN0YW5jZXMuIEl0IGFsc28gcHJvdmlkZXMgc29tZSBiYXNpYyBtb2NraW5nIG9mIHBsdWdpbiBtZXRob2RzIGZvciB0ZXN0aW5nLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5Mb2FkZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQmluZHMgdGhlIFdpbnRlciBmcmFtZXdvcmsgdG8gdGhlIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1Nub3dib2FyZH0gc25vd2JvYXJkXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHNub3dib2FyZCwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQgPSBuZXcgUHJveHkoXG4gICAgICAgICAgICBzbm93Ym9hcmQsXG4gICAgICAgICAgICBJbm5lclByb3h5SGFuZGxlcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG4gICAgICAgIC8vIEZyZWV6ZSBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhpcyBsb2FkZXJcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLmluc3RhbmNlKTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IHtcbiAgICAgICAgICAgIGluaXRpYWxpc2VkOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUHJldmVudCBmdXJ0aGVyIGV4dGVuc2lvbiBvZiB0aGUgc2luZ2xldG9uIHN0YXR1cyBvYmplY3RcbiAgICAgICAgT2JqZWN0LnNlYWwodGhpcy5zaW5nbGV0b24pO1xuXG4gICAgICAgIHRoaXMubW9ja3MgPSB7fTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgICAgIC8vIEZyZWV6ZSBsb2FkZXIgaXRzZWxmXG4gICAgICAgIE9iamVjdC5mcmVlemUoUGx1Z2luTG9hZGVyLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaGFzIGEgc3BlY2lmaWMgbWV0aG9kIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc01ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgcHJvdG90eXBlIG1ldGhvZCBmb3IgYSBwbHVnaW4uIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBiZSB1c2VkIGZvciBcInN0YXRpY1wiIGNhbGxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKiBAcGFyYW0gey4uLn0gYXJnc1xuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgY2FsbE1ldGhvZCguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gcGFyYW1ldGVycztcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGFyZ3Muc2hpZnQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0oYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBwbHVnaW4uXG4gICAgICpcbiAgICAgKiAtIElmIHRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBwbHVnaW4sIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gSWYgdGhpcyBpcyBhIHNpbmdsZXRvbiwgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luQmFzZXxGdW5jdGlvbn1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW5jZSguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICBjb25zdCB1bm1ldCA9IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKCkuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5zbm93Ym9hcmQuZ2V0UGx1Z2luTmFtZXMoKS5pbmNsdWRlcyhpdGVtKSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIiR7dGhpcy5uYW1lfVwiIHBsdWdpbiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsdWdpbnM6ICR7dW5tZXQuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXNlU2luZ2xldG9uKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kc1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubW9ja3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm9yaWdpbmFsRnVuY3Rpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5tb2NrcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9ICguLi5wYXJhbXMpID0+IGNhbGxiYWNrKHRoaXMsIC4uLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG1vY2tlZCBtZXRob2RzIHRvIHByb3RvdHlwZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5tb2NrcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5vcmlnaW5hbEZ1bmN0aW9ucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5tb2NrcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSAoLi4ucGFyYW1zKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyB0aGlzLmluc3RhbmNlKHRoaXMuc25vd2JvYXJkLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuZGV0YWNoID0gKCkgPT4gdGhpcy5pbnN0YW5jZXMuc3BsaWNlKHRoaXMuaW5zdGFuY2VzLmluZGV4T2YobmV3SW5zdGFuY2UpLCAxKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuY29uc3RydWN0KC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlcy5wdXNoKG5ld0luc3RhbmNlKTtcblxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgcGx1Z2luIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2luLCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkJhc2VbXX1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW5jZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgc2ltcGxlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdGhpcy5pbnN0YW5jZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBpcyBhIHNpbmdsZXRvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzU2luZ2xldG9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBTaW5nbGV0b24gPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHNpbmdsZXRvbiBoYXMgYmVlbiBpbml0aWFsaXNlZC5cbiAgICAgKlxuICAgICAqIE5vcm1hbCBwbHVnaW5zIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNJbml0aWFsaXNlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9uLmluaXRpYWxpc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBpbml0aWFsaXNlU2luZ2xldG9uKC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMuaW5zdGFuY2UodGhpcy5zbm93Ym9hcmQsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBuZXdJbnN0YW5jZS5kZXRhY2ggPSAoKSA9PiB0aGlzLmluc3RhbmNlcy5zcGxpY2UodGhpcy5pbnN0YW5jZXMuaW5kZXhPZihuZXdJbnN0YW5jZSksIDEpO1xuICAgICAgICBuZXdJbnN0YW5jZS5jb25zdHJ1Y3QoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpO1xuICAgICAgICB0aGlzLnNpbmdsZXRvbi5pbml0aWFsaXNlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXREZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9ucyBjYW5ub3QgaGF2ZSBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gZGVwZW5kZW5jeSBtZXRob2Qgc3BlY2lmaWVkLlxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlLmRlcGVuZGVuY2llcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlLmRlcGVuZGVuY2llcygpLm1hcCgoaXRlbSkgPT4gaXRlbS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBoYXMgYWxsIGl0cyBkZXBlbmRlbmNpZXMgZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSB0aGlzLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIGxldCBmdWxmaWxsZWQgPSB0cnVlO1xuICAgICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc25vd2JvYXJkLmhhc1BsdWdpbihwbHVnaW4pKSB7XG4gICAgICAgICAgICAgICAgZnVsZmlsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmdWxmaWxsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIHRvIGJlIG1vY2tlZCBmb3IgdGVzdGluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbW9jayB3aWxsIGJlIGFwcGxpZWQgZm9yIHRoZSBsaWZlIG9mIGFuIGluc3RhbmNlLiBGb3Igc2luZ2xldG9ucywgdGhlIG1vY2sgd2lsbCBiZSBhcHBsaWVkIGZvciB0aGUgbGlmZVxuICAgICAqIG9mIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogTW9ja3MgY2Fubm90IGJlIGFwcGxpZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBtb2NrKG1ldGhvZE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiBcIiR7bWV0aG9kTmFtZX1cIiBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIG1vY2tlZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2Nrc1ttZXRob2ROYW1lXSA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zW21ldGhvZE5hbWVdID0gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGV0b24oKSAmJiB0aGlzLmluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9ICguLi5wYXJhbWV0ZXJzKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBtb2NrIGNhbGxiYWNrIGZyb20gZnV0dXJlIGluc3RhbmNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICovXG4gICAgdW5tb2NrKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1vY2tzW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9IHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy5tb2Nrc1ttZXRob2ROYW1lXTtcbiAgICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV07XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBSZWZsZWN0LmdldCh0YXJnZXQsICdwbHVnaW5zJylbcHJvcExvd2VyXS5nZXRJbnN0YW5jZSguLi5wYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbn07XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuaW1wb3J0IFBsdWdpbkxvYWRlciBmcm9tICcuL1BsdWdpbkxvYWRlcic7XG5cbmltcG9ydCBDb29raWUgZnJvbSAnLi4vdXRpbGl0aWVzL0Nvb2tpZSc7XG5pbXBvcnQgSnNvblBhcnNlciBmcm9tICcuLi91dGlsaXRpZXMvSnNvblBhcnNlcic7XG5pbXBvcnQgU2FuaXRpemVyIGZyb20gJy4uL3V0aWxpdGllcy9TYW5pdGl6ZXInO1xuaW1wb3J0IFVybCBmcm9tICcuLi91dGlsaXRpZXMvVXJsJztcblxuLyoqXG4gKiBTbm93Ym9hcmQgLSB0aGUgV2ludGVyIEphdmFTY3JpcHQgZnJhbWV3b3JrLlxuICpcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgYmFzZSBvZiBhIG1vZGVybiB0YWtlIG9uIHRoZSBXaW50ZXIgSlMgZnJhbWV3b3JrLCBiZWluZyBmdWxseSBleHRlbnNpYmxlIGFuZCB0YWtpbmcgYWR2YW50YWdlXG4gKiBvZiBtb2Rlcm4gSmF2YVNjcmlwdCBmZWF0dXJlcyBieSBsZXZlcmFnaW5nIHRoZSBMYXJhdmVsIE1peCBjb21waWxhdGlvbiBmcmFtZXdvcmsuIEl0IGFsc28gaXMgY29kZWQgdXAgdG8gcmVtb3ZlIHRoZVxuICogZGVwZW5kZW5jeSBvZiBqUXVlcnkuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKiBAbGluayBodHRwczovL3dpbnRlcmNtcy5jb20vZG9jcy9zbm93Ym9hcmQvaW50cm9kdWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNub3dib2FyZCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGF1dG9TaW5nbGV0b25zIEF1dG9tYXRpY2FsbHkgbG9hZCBzaW5nbGV0b25zIHdoZW4gRE9NIGlzIHJlYWR5LiBEZWZhdWx0OiBgdHJ1ZWAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZWJ1ZyBXaGV0aGVyIGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSBzaG93bi4gRGVmYXVsdDogYGZhbHNlYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhdXRvU2luZ2xldG9ucywgZGVidWcpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSAodHlwZW9mIGRlYnVnID09PSAnYm9vbGVhbicgJiYgZGVidWcgPT09IHRydWUpO1xuICAgICAgICB0aGlzLmF1dG9Jbml0U2luZ2xldG9ucyA9ICh0eXBlb2YgYXV0b1NpbmdsZXRvbnMgPT09ICdib29sZWFuJyAmJiBhdXRvU2luZ2xldG9ucyA9PT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB7fTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLnJlYWRpbmVzcyA9IHtcbiAgICAgICAgICAgIGRvbTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIC8vIFNlYWwgcmVhZGluZXNzIGZyb20gYmVpbmcgYWRkZWQgdG8gZnVydGhlciwgYnV0IGFsbG93IHRoZSBwcm9wZXJ0aWVzIHRvIGJlIG1vZGlmaWVkLlxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzLnJlYWRpbmVzcyk7XG4gICAgICAgIHRoaXMuYXR0YWNoQWJzdHJhY3RzKCk7XG5cbiAgICAgICAgLy8gRnJlZXplIHRoZSBTbm93Ym9hcmQgY2xhc3MgdG8gcHJldmVudCBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gICAgICAgIE9iamVjdC5mcmVlemUoU25vd2JvYXJkLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG5cbiAgICAgICAgdGhpcy5sb2FkVXRpbGl0aWVzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZSgpO1xuXG4gICAgICAgIHRoaXMuZGVidWcoJ1Nub3dib2FyZCBmcmFtZXdvcmsgaW5pdGlhbGlzZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhYnN0cmFjdCBjbGFzc2VzIGFzIHByb3BlcnRpZXMgb2YgdGhlIFNub3dib2FyZCBjbGFzcy5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbGxvdyBKYXZhc2NyaXB0IGZ1bmN0aW9uYWxpdHkgd2l0aCBubyBidWlsZCBwcm9jZXNzIHRvIHN0aWxsIGV4dGVuZCB0aGVzZSBhYnN0cmFjdHMgYnkgcHJlZml4aW5nXG4gICAgICogdGhlbSB3aXRoIFwiU25vd2JvYXJkXCIuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjbGFzcyBNeUNsYXNzIGV4dGVuZHMgU25vd2JvYXJkLlBsdWdpbkJhc2Uge1xuICAgICAqICAgICAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXR0YWNoQWJzdHJhY3RzKCkge1xuICAgICAgICB0aGlzLlBsdWdpbkJhc2UgPSBQbHVnaW5CYXNlO1xuICAgICAgICB0aGlzLlNpbmdsZXRvbiA9IFNpbmdsZXRvbjtcblxuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuUGx1Z2luQmFzZS5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuUGx1Z2luQmFzZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5TaW5nbGV0b24ucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlNpbmdsZXRvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGRlZmF1bHQgdXRpbGl0aWVzLlxuICAgICAqL1xuICAgIGxvYWRVdGlsaXRpZXMoKSB7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCdjb29raWUnLCBDb29raWUpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignanNvblBhcnNlcicsIEpzb25QYXJzZXIpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignc2FuaXRpemVyJywgU2FuaXRpemVyKTtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ3VybCcsIFVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgdGhlIGZyYW1ld29yay5cbiAgICAgKlxuICAgICAqIEF0dGFjaGVzIGEgbGlzdGVuZXIgZm9yIHRoZSBET00gYmVpbmcgcmVhZHkgYW5kIHRyaWdnZXJzIGEgZ2xvYmFsIFwicmVhZHlcIiBldmVudCBmb3IgcGx1Z2lucyB0byBiZWdpbiBhdHRhY2hpbmdcbiAgICAgKiB0aGVtc2VsdmVzIHRvIHRoZSBET00uXG4gICAgICovXG4gICAgaW5pdGlhbGlzZSgpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvSW5pdFNpbmdsZXRvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpc2VTaW5nbGV0b25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdsb2JhbEV2ZW50KCdyZWFkeScpO1xuICAgICAgICAgICAgdGhpcy5yZWFkaW5lc3MuZG9tID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYW4gaW5zdGFuY2Ugb2YgZXZlcnkgc2luZ2xldG9uLlxuICAgICAqL1xuICAgIGluaXRpYWxpc2VTaW5nbGV0b25zKCkge1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMucGx1Z2lucykuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHBsdWdpbiB0byB0aGUgZnJhbWV3b3JrLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBhcmUgdGhlIGNvcm5lcnN0b25lIGZvciBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgZm9yIFNub3dib2FyZC4gQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYW4gRVMyMDE1IGNsYXNzXG4gICAgICogdGhhdCBleHRlbmRzIHRoZSBQbHVnaW5CYXNlIG9yIFNpbmdsZXRvbiBhYnN0cmFjdCBjbGFzc2VzLCBvciBhIHNpbXBsZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFdoZW4gYSBwbHVnaW4gaXMgYWRkZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgYXMgYSBuZXcgbWFnaWMgbWV0aG9kIGluIHRoZSBTbm93Ym9hcmQgY2xhc3MgdXNpbmcgdGhlIG5hbWVcbiAgICAgKiBwYXJhbWV0ZXIsIGFuZCBjYW4gYmUgY2FsbGVkIHZpYSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgYmUgdGhlIFwibG93ZXJjYXNlXCIgdmVyc2lvbiBvZiB0aGlzIG5hbWUuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYSBwbHVnaW4gaXMgYXNzaWduZWQgdG8gdGhlIG5hbWUgXCJteVBsdWdpblwiLCBpdCBjYW4gYmUgY2FsbGVkIHZpYSBgU25vd2JvYXJkLm15cGx1Z2luKClgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1BsdWdpbkJhc2V8RnVuY3Rpb259IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUGx1Z2luKG5hbWUsIGluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAodGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHBsdWdpbiBjYWxsZWQgXCIke25hbWV9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZSAhPT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBwbHVnaW4gbXVzdCBleHRlbmQgdGhlIFBsdWdpbkJhc2UgY2xhc3MsIG9yIG11c3QgYmUgYSBjYWxsYmFjayBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzW25hbWVdICE9PSB1bmRlZmluZWQgfHwgdGhpc1tsb3dlck5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIGEgcHJvcGVydHkgb3IgbWV0aG9kIG9mIHRoZSBTbm93Ym9hcmQgY2xhc3MuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXSA9IG5ldyBQbHVnaW5Mb2FkZXIobG93ZXJOYW1lLCB0aGlzLCBpbnN0YW5jZSk7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIHJlZ2lzdGVyZWRgKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgc2luZ2xldG9ucyBub3cgaGF2ZSB0aGVpciBkZXBlbmRlbmNpZXMgZnVsZmlsbGVkLCBhbmQgZmlyZSB0aGVpciBcInJlYWR5XCIgaGFuZGxlciBpZiB3ZSdyZVxuICAgICAgICAvLyBpbiBhIHJlYWR5IHN0YXRlLlxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZ2V0UGx1Z2lucygpKS5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwbHVnaW4uaXNTaW5nbGV0b24oKVxuICAgICAgICAgICAgICAgICYmICFwbHVnaW4uaXNJbml0aWFsaXNlZCgpXG4gICAgICAgICAgICAgICAgJiYgcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpXG4gICAgICAgICAgICAgICAgJiYgcGx1Z2luLmhhc01ldGhvZCgnbGlzdGVucycpXG4gICAgICAgICAgICAgICAgJiYgT2JqZWN0LmtleXMocGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKSkuaW5jbHVkZXMoJ3JlYWR5JylcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnJlYWRpbmVzcy5kb21cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5TWV0aG9kID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKS5yZWFkeTtcbiAgICAgICAgICAgICAgICBwbHVnaW4uY2FsbE1ldGhvZChyZWFkeU1ldGhvZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBSZW1vdmVzIGEgcGx1Z2luIGZyb20gU25vd2JvYXJkLCBjYWxsaW5nIHRoZSBkZXN0cnVjdG9yIG1ldGhvZCBmb3IgYWxsIGFjdGl2ZSBpbnN0YW5jZXMgb2YgdGhlIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlUGx1Z2luKG5hbWUpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIGFscmVhZHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBkZXN0cnVjdG9ycyBmb3IgYWxsIGluc3RhbmNlc1xuICAgICAgICB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXS5nZXRJbnN0YW5jZXMoKS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2UuZGVzdHJ1Y3QoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpc1tsb3dlck5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTtcblxuICAgICAgICB0aGlzLmRlYnVnKGBQbHVnaW4gXCIke25hbWV9XCIgcmVtb3ZlZGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZCBhbmQgaXMgYWN0aXZlLlxuICAgICAqXG4gICAgICogQSBwbHVnaW4gdGhhdCBpcyBzdGlsbCB3YWl0aW5nIGZvciBkZXBlbmRlbmNpZXMgdG8gYmUgcmVnaXN0ZXJlZCB3aWxsIG5vdCBiZSBhY3RpdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1BsdWdpbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICByZXR1cm4gKHRoaXMucGx1Z2luc1tsb3dlck5hbWVdICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBwbHVnaW5zIGFzIFBsdWdpbkxvYWRlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkxvYWRlcltdfVxuICAgICAqL1xuICAgIGdldFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiByZWdpc3RlcmVkIHBsdWdpbnMsIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0UGx1Z2luTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBQbHVnaW5Mb2FkZXIgb2JqZWN0IG9mIGEgZ2l2ZW4gcGx1Z2luLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkxvYWRlcn1cbiAgICAgKi9cbiAgICBnZXRQbHVnaW4obmFtZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1BsdWdpbihsb3dlck5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBsdWdpbiBjYWxsZWQgXCIke2xvd2VyTmFtZX1cIiBoYXMgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBwbHVnaW5zIHRoYXQgbGlzdGVuIHRvIHRoZSBnaXZlbiBldmVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgd29ya3MgZm9yIGJvdGggbm9ybWFsIGFuZCBwcm9taXNlIGV2ZW50cy4gSXQgZG9lcyBOT1QgY2hlY2sgdGhhdCB0aGUgcGx1Z2luJ3MgbGlzdGVuZXIgYWN0dWFsbHkgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbnMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICovXG4gICAgbGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbXTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnBsdWdpbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbmFtZSwgcGx1Z2luXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwbHVnaW4uaGFzTWV0aG9kKCdsaXN0ZW5zJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzW2V2ZW50TmFtZV0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBsaXN0ZW5lcnNbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBsdWdpbnMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBsdWdpbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc2ltcGxlIHJlYWR5IGxpc3RlbmVyLlxuICAgICAqXG4gICAgICogU3lub255bW91cyB3aXRoIGpRdWVyeSdzIFwiJChkb2N1bWVudCkucmVhZHkoKVwiIGZ1bmN0aW9uYWxpdHksIHRoaXMgYWxsb3dzIGlubGluZSBzY3JpcHRzIHRvXG4gICAgICogYXR0YWNoIHRoZW1zZWx2ZXMgdG8gU25vd2JvYXJkIGltbWVkaWF0ZWx5IGJ1dCBvbmx5IGZpcmUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICByZWFkeShjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5yZWFkaW5lc3MuZG9tKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbigncmVhZHknLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhZC1ob2Mgc2NyaXB0cyB0aGF0IGRvbid0IG5lZWQgYSBmdWxsIHBsdWdpbi4gVGhlIGdpdmVuIGNhbGxiYWNrIHdpbGwgYmVcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgbmFtZSBwcm92aWRlZCBmaXJlcy4gVGhpcyB3b3JrcyBmb3IgYm90aCBub3JtYWwgYW5kIFByb21pc2UgZXZlbnRzLiBGb3JcbiAgICAgKiBhIFByb21pc2UgZXZlbnQsIHlvdXIgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBQcm9taXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgb24oZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5pbmNsdWRlcyhjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc2ltcGxlIGxpc3RlbmVyIGZvciBhbiBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG9mZihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBnbG9iYWwgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIElmIGFueSBwbHVnaW4gcmV0dXJucyBhIGBmYWxzZWAsIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgZXZlbnQgd2FzIG5vdCBjYW5jZWxsZWRcbiAgICAgKi9cbiAgICBnbG9iYWxFdmVudChldmVudE5hbWUsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgQ2FsbGluZyBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cImAsIC4uLnBhcmFtZXRlcnMpO1xuXG4gICAgICAgIC8vIEZpbmQgcGx1Z2lucyBsaXN0ZW5pbmcgdG8gdGhlIGV2ZW50LlxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbnNUb0V2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBObyBsaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKGBMaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiOiAke2xpc3RlbmVycy5qb2luKCcsICcpfWApO1xuXG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5nZXRQbHVnaW4obmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc1NpbmdsZXRvbigpICYmIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5NZXRob2QgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpW2V2ZW50TmFtZV07XG5cbiAgICAgICAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlciBtZXRob2RzIGZvciBhbGwgcGx1Z2lucywgaWYgdGhleSBoYXZlIGEgbWV0aG9kIHNwZWNpZmllZCBmb3IgdGhlIGV2ZW50LlxuICAgICAgICAgICAgcGx1Z2luLmdldEluc3RhbmNlcygpLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBwbHVnaW4gaGFzIGNhbmNlbGxlZCB0aGUgZXZlbnQsIG5vIGZ1cnRoZXIgcGx1Z2lucyBhcmUgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbGlzdGVuTWV0aG9kLmFwcGx5KGluc3RhbmNlLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCIke2xpc3Rlbk1ldGhvZH1cIiBtZXRob2QgaW4gXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlW2xpc3Rlbk1ldGhvZF0oLi4ucGFyYW1ldGVycykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBHbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cIiBjYW5jZWxsZWQgYnkgXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBMaXN0ZW4gbWV0aG9kIGZvciBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGluIFwiJHtuYW1lfVwiIHBsdWdpbiBpcyBub3QgYSBmdW5jdGlvbiBvciBzdHJpbmcuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYWQtaG9jIGxpc3RlbmVycyBmb3IgdGhpcyBldmVudC5cbiAgICAgICAgaWYgKCFjYW5jZWxsZWQgJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSAmJiB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZvdW5kICR7dGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGh9IGFkLWhvYyBsaXN0ZW5lcihzKSBmb3IgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgbGlzdGVuZXIgaGFzIGNhbmNlbGxlZCB0aGUgZXZlbnQsIG5vIGZ1cnRoZXIgbGlzdGVuZXJzIGFyZSBjb25zaWRlcmVkLlxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciguLi5wYXJhbWV0ZXJzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBHbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX0gY2FuY2VsbGVkIGJ5IGFuIGFkLWhvYyBsaXN0ZW5lci5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhY2FuY2VsbGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgZ2xvYmFsIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMsIGV4cGVjdGluZyBhIFByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgYWxsLlxuICAgICAqXG4gICAgICogVGhpcyBjb2xsYXRlcyBhbGwgcGx1Z2lucyByZXNwb25zZXMgaW50byBvbmUgbGFyZ2UgUHJvbWlzZSB0aGF0IGVpdGhlciBleHBlY3RzIGFsbCB0byBiZSByZXNvbHZlZCwgb3Igb25lIHRvIHJlamVjdC5cbiAgICAgKiBJZiBubyBsaXN0ZW5lcnMgYXJlIGZvdW5kLCBhIHJlc29sdmVkIFByb21pc2UgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICovXG4gICAgZ2xvYmFsUHJvbWlzZUV2ZW50KGV2ZW50TmFtZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmRlYnVnKGBDYWxsaW5nIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAvLyBGaW5kIHBsdWdpbnMgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYE5vIGxpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoYExpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cIjogJHtsaXN0ZW5lcnMuam9pbignLCAnKX1gKTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmdldFBsdWdpbihuYW1lKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmdldEluc3RhbmNlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3Rlbk1ldGhvZCA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJylbZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyIG1ldGhvZHMgZm9yIGFsbCBwbHVnaW5zLCBpZiB0aGV5IGhhdmUgYSBtZXRob2Qgc3BlY2lmaWVkIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAgICBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VQcm9taXNlID0gbGlzdGVuTWV0aG9kLmFwcGx5KGluc3RhbmNlLCBwYXJhbWV0ZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGluc3RhbmNlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwiJHtsaXN0ZW5NZXRob2R9XCIgbWV0aG9kIGluIFwiJHtuYW1lfVwiIHBsdWdpbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlUHJvbWlzZSA9IGluc3RhbmNlW2xpc3Rlbk1ldGhvZF0oLi4ucGFyYW1ldGVycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZVByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbnN0YW5jZVByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgcHJvbWlzZSBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBMaXN0ZW4gbWV0aG9kIGZvciBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGluIFwiJHtuYW1lfVwiIHBsdWdpbiBpcyBub3QgYSBmdW5jdGlvbiBvciBzdHJpbmcuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYWQtaG9jIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gdGhpcyBldmVudC5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBGb3VuZCAke3RoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RofSBhZC1ob2MgbGlzdGVuZXIocykgZm9yIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyUHJvbWlzZSA9IGxpc3RlbmVyKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gobGlzdGVuZXJQcm9taXNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIHByb21pc2UgZXZlbnQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgc3R5bGVkIG1lc3NhZ2UgaW4gdGhlIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBJbmNsdWRlcyBwYXJhbWV0ZXJzIGFuZCBhIHN0YWNrIHRyYWNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbG9nTWVzc2FnZShjb2xvciwgYm9sZCwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAgICAgJyVjW1Nub3dib2FyZF0nLFxuICAgICAgICAgICAgYGNvbG9yOiAke2NvbG9yfTsgZm9udC13ZWlnaHQ6ICR7KGJvbGQpID8gJ2JvbGQnIDogJ25vcm1hbCd9O2AsXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgICAgICAgICBgJWNQYXJhbWV0ZXJzICVjKCR7cGFyYW1ldGVycy5sZW5ndGh9KWAsXG4gICAgICAgICAgICAgICAgJ2NvbG9yOiByZ2IoNDUsIDE2NywgMTk5KTsgZm9udC13ZWlnaHQ6IGJvbGQ7JyxcbiAgICAgICAgICAgICAgICAnY29sb3I6IHJnYig4OCwgODgsIDg4KTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAlYyR7aW5kZXh9OmAsICdjb2xvcjogcmdiKDg4LCA4OCwgODgpOyBmb250LXdlaWdodDogbm9ybWFsOycsIHBhcmFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKCclY1RyYWNlJywgJ2NvbG9yOiByZ2IoNDUsIDE2NywgMTk5KTsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGxvZyhtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDQ1LCAxNjcsIDE5OSknLCBmYWxzZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgZGVidWcgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFRoZXNlIG1lc3NhZ2VzIGFyZSBvbmx5IHNob3duIHdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkZWJ1ZyhtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICghdGhpcy5kZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDQ1LCAxNjcsIDE5OSknLCBmYWxzZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZXJyb3IobWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UoJ3JnYigyMjksIDM1LCAzNSknLCB0cnVlLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUNvb2tpZSBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBDb29raWUgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBcImpzLWNvb2tpZVwiIGxpYnJhcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vanMtY29va2llL2pzLWNvb2tpZVxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZSBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgICAgICAgZXhwaXJlczogbnVsbCxcbiAgICAgICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgICAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgICAgIHNlY3VyZTogZmFsc2UsXG4gICAgICAgICAgICBzYW1lU2l0ZTogJ0xheCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGNvb2tpZSBwYXJhbWV0ZXJzIGZvciBhbGwgc3Vic2VxdWVudCBcInNldFwiIGFuZCBcInJlbW92ZVwiIGNhbGxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBzZXREZWZhdWx0cyhvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29va2llIGRlZmF1bHRzIG11c3QgYmUgcHJvdmlkZWQgYXMgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb29raWUgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0ge307XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5kZWZhdWx0cykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0c1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29va2llIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBJZiBgbmFtZWAgaXMgdW5kZWZpbmVkLCByZXR1cm5zIGFsbCBjb29raWVzIGFzIGFuIE9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IEJhc2VDb29raWUuZ2V0KCk7XG5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGNvb2tpZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2Nvb2tpZU5hbWUsIGNvb2tpZVZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Nvb2tpZS5nZXQnLCBjb29raWVOYW1lLCBjb29raWVWYWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZXNbY29va2llTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29va2llcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IEJhc2VDb29raWUuZ2V0KG5hbWUpO1xuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gb3ZlcnJpZGUgdGhlIGdvdHRlbiB2YWx1ZVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLmdldCcsIG5hbWUsIHZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvb2tpZSBwYXJhbWV0ZXJzIHRocm91Z2ggdGhlIFwib3B0aW9uc1wiIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHNldChuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgc2F2ZVZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBvdmVycmlkZSB0aGUgdmFsdWUgdG8gc2F2ZVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLnNldCcsIG5hbWUsIHZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHNhdmVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQmFzZUNvb2tpZS5zZXQobmFtZSwgc2F2ZVZhbHVlLCB7XG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRzKCksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgYWRkaXRpb25hbCBjb29raWUgcGFyYW1ldGVycyB2aWEgdGhlIFwib3B0aW9uc1wiIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmUobmFtZSwgb3B0aW9ucykge1xuICAgICAgICBCYXNlQ29va2llLnJlbW92ZShuYW1lLCB7XG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRzKCksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEpTT04gUGFyc2VyIHV0aWxpdHkuXG4gKlxuICogVGhpcyB1dGlsaXR5IHBhcnNlcyBKU09OLWxpa2UgZGF0YSB0aGF0IGRvZXMgbm90IHN0cmljdGx5IG1lZXQgdGhlIEpTT04gc3BlY2lmaWNhdGlvbnMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgZGV2ZWxvcG1lbnQuXG4gKiBJdCBpcyBhIHNhZmUgcmVwbGFjZW1lbnQgZm9yIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZhbChcIih7XCIgKyB2YWx1ZSArIFwifSlcIikpKSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdGhlIHVzZSBvZiBldmFsKClcbiAqXG4gKiBAYXV0aG9yIEF5dW1pIEhhbWFzYWtpXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2JlcmNtcy9vY3RvYmVyL3B1bGwvNDUyN1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKc29uUGFyc2VyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIC8vIEFkZCB0byBnbG9iYWwgZnVuY3Rpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHdpbmRvdy53bkpTT04gPSAoanNvbikgPT4gdGhpcy5wYXJzZShqc29uKTtcbiAgICAgICAgd2luZG93Lm9jSlNPTiA9IHdpbmRvdy53bkpTT047XG4gICAgfVxuXG4gICAgcGFyc2Uoc3RyKSB7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB0aGlzLnBhcnNlU3RyaW5nKHN0cik7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuICAgIH1cblxuICAgIHBhcnNlU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGxldCBzdHIgPSB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgaWYgKCFzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb2tlbiBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgbGV0IHR5cGUgPSBudWxsO1xuICAgICAgICBsZXQga2V5ID0gbnVsbDtcbiAgICAgICAgbGV0IGJvZHkgPSAnJztcblxuICAgICAgICAvKlxuICAgICAgICAqIHRoZSBtaXN0YWtlICcsJ1xuICAgICAgICAqL1xuICAgICAgICB3aGlsZSAoc3RyICYmIHN0clswXSA9PT0gJywnKSB7XG4gICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBzdHJpbmdcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ1wiJyB8fCBzdHJbMF0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSAhPT0gc3RyWzBdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZyBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYm9keSA9ICdcIic7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2kgKyAxXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gc3RyWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSAnXFxcXFwiJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcgSlNPTiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIGJvb2xlYW5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0ciA9PT0gJ3RydWUnIHx8IHN0ciA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogbnVsbFxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIG51bWJlclxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIoc3RyKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bS50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBvYmplY3RcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ3snKSB7XG4gICAgICAgICAgICB0eXBlID0gJ25lZWRLZXknO1xuICAgICAgICAgICAga2V5ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdCA9ICd7JztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0JsYW5rQ2hhcihzdHJbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICduZWVkS2V5JyAmJiAoc3RyW2ldID09PSAnXCInIHx8IHN0cltpXSA9PT0gJ1xcJycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VLZXkoc3RyLCBpICsgMSwgc3RyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGBcIiR7a2V5fVwiYDtcbiAgICAgICAgICAgICAgICAgICAgaSArPSBrZXkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJLZXknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25lZWRLZXknICYmIHRoaXMuY2FuQmVLZXlIZWFkKHN0cltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZUtleShzdHIsIGkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0ga2V5Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJLZXknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FmdGVyS2V5JyAmJiBzdHJbaV0gPT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzonO1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJzonO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmdldEJvZHkoc3RyLCBpKTtcblxuICAgICAgICAgICAgICAgICAgICBpID0gaSArIGJvZHkub3JpZ2luTGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMucGFyc2VTdHJpbmcoYm9keS5ib2R5KTtcblxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyQm9keSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYWZ0ZXJCb2R5JyB8fCB0eXBlID09PSAnbmVlZEtleScpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RyW2xhc3RdID09PSAnLCcgfHwgdGhpcy5pc0JsYW5rQ2hhcihzdHJbbGFzdF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltsYXN0XSA9PT0gJ30nICYmIGxhc3QgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ30nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAhPT0gaSAmJiByZXN1bHQgIT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnbmVlZEtleSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gbGFzdCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gb2JqZWN0IG5lYXIgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIGFycmF5XG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHJbMF0gPT09ICdbJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gJ1snO1xuICAgICAgICAgICAgdHlwZSA9ICduZWVkQm9keSc7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcgJyB8fCBzdHJbaV0gPT09ICdcXG4nIHx8IHN0cltpXSA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25lZWRCb2R5Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbnVsbCwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXScgJiYgaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuZ2V0Qm9keShzdHIsIGkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGkgPSBpICsgYm9keS5vcmlnaW5MZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5wYXJzZVN0cmluZyhib2R5LmJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJCb2R5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhZnRlckJvZHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnbmVlZEJvZHknO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggbWlzdGFrZSBcIixcIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cltpICsgMV0gPT09ICcsJyB8fCB0aGlzLmlzQmxhbmtDaGFyKHN0cltpICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpICsgMV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ251bGwsJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ10nICYmIGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ10nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBhcnJheSBuZWFyICR7cmVzdWx0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGdldEJvZHkoc3RyLCBwb3MpIHtcbiAgICAgICAgbGV0IGJvZHkgPSAnJztcblxuICAgICAgICAvLyBwYXJzZSBzdHJpbmcgYm9keVxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICdcIicgfHwgc3RyW3Bvc10gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICBib2R5ID0gc3RyW3Bvc107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwb3MgKyAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBzdHJbcG9zXSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltwb3NdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIHN0cmluZyBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgdHJ1ZSAvIGZhbHNlXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ3QnKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ3RydWUnLCBwb3MpID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6ICd0cnVlJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvb2xlYW4gYm9keSBuZWFyICR7c3RyLnN1YnN0cigwLCBwb3MgKyAxMCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnZicpIHtcbiAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZignZicsIHBvcykgPT09IHBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogJ2ZhbHNlJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICdmYWxzZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgbnVsbFxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICduJykge1xuICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCdudWxsJywgcG9zKSA9PT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiAnbnVsbCcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAnbnVsbCcsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgbnVtYmVyXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJy0nIHx8IHN0cltwb3NdID09PSAnKycgfHwgc3RyW3Bvc10gPT09ICcuJyB8fCAoc3RyW3Bvc10gPj0gJzAnICYmIHN0cltwb3NdIDw9ICc5JykpIHtcbiAgICAgICAgICAgIGJvZHkgPSAnJztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICctJyB8fCBzdHJbaV0gPT09ICcrJyB8fCBzdHJbaV0gPT09ICcuJyB8fCAoc3RyW2ldID49ICcwJyAmJiBzdHJbaV0gPD0gJzknKSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIG51bWJlciBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2Ugb2JqZWN0XG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ3snIHx8IHN0cltwb3NdID09PSAnWycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gW1xuICAgICAgICAgICAgICAgIHN0cltwb3NdLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGJvZHkgPSBzdHJbcG9zXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvcyArIDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0cltpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXCInICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goJ3snKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICd9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgnWycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OICR7KHN0cltwb3NdID09PSAneycgPyAnb2JqZWN0JyA6ICdhcnJheScpfSBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6IGkgLSBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9keSBuZWFyICR7c3RyLnN1YnN0cigocG9zIC0gNSA+PSAwKSA/IHBvcyAtIDUgOiAwLCA1MCl9YCk7XG4gICAgfVxuXG4gICAgcGFyc2VLZXkoc3RyLCBwb3MsIHF1b3RlKSB7XG4gICAgICAgIGxldCBrZXkgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAocXVvdGUgJiYgcXVvdGUgPT09IHN0cltpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXF1b3RlICYmIChzdHJbaV0gPT09ICcgJyB8fCBzdHJbaV0gPT09ICc6JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBrZXkgKz0gc3RyW2ldO1xuXG4gICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcgJiYgaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAga2V5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBzeW50YXggbmVhciAke2tleX1gKTtcbiAgICB9XG5cbiAgICBjYW5CZUtleUhlYWQoY2gpIHtcbiAgICAgICAgaWYgKGNoWzBdID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNoWzBdID49ICdhJyAmJiBjaFswXSA8PSAneicpIHx8IChjaFswXSA+PSAnQScgJiYgY2hbMF0gPD0gJ1onKSB8fCBjaFswXSA9PT0gJ18nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hbMF0gPj0gJzAnICYmIGNoWzBdIDw9ICc5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoWzBdID09PSAnJCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaC5jaGFyQ29kZUF0KDApID4gMjU1KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0JsYW5rQ2hhcihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICdcXHQnO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogU2FuaXRpemVyIHV0aWxpdHkuXG4gKlxuICogQ2xpZW50LXNpZGUgSFRNTCBzYW5pdGl6ZXIgZGVzaWduZWQgbW9zdGx5IHRvIHByZXZlbnQgc2VsZi1YU1MgYXR0YWNrcy5cbiAqIFRoZSBzYW5pdGl6ZXIgdXRpbGl0eSB3aWxsIHN0cmlwIGFsbCBhdHRyaWJ1dGVzIHRoYXQgc3RhcnQgd2l0aCBgb25gICh1c3VhbGx5IEpTIGV2ZW50IGhhbmRsZXJzIGFzIGF0dHJpYnV0ZXMsIGkuZS4gYG9ubG9hZGAgb3IgYG9uZXJyb3JgKSBvciBjb250YWluIHRoZSBgamF2YXNjcmlwdDpgIHBzZXVkbyBwcm90b2NvbCBpbiB0aGVpciB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2FuaXRpemVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIC8vIEFkZCB0byBnbG9iYWwgZnVuY3Rpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHdpbmRvdy53blNhbml0aXplID0gKGh0bWwpID0+IHRoaXMuc2FuaXRpemUoaHRtbCk7XG4gICAgICAgIHdpbmRvdy5vY1Nhbml0aXplID0gd2luZG93LnduU2FuaXRpemU7XG4gICAgfVxuXG4gICAgc2FuaXRpemUoaHRtbCwgYm9keU9ubHkpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3QgcmV0dXJuQm9keU9ubHkgPSAoYm9keU9ubHkgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgYm9keU9ubHkgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgID8gYm9keU9ubHlcbiAgICAgICAgICAgIDogdHJ1ZTtcblxuICAgICAgICB0aGlzLnNhbml0aXplTm9kZShkb20uZ2V0Um9vdE5vZGUoKSk7XG5cbiAgICAgICAgcmV0dXJuIChyZXR1cm5Cb2R5T25seSkgPyBkb20uYm9keS5pbm5lckhUTUwgOiBkb20uaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIHNhbml0aXplTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnRhZ05hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmltQXR0cmlidXRlcyhub2RlKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20obm9kZS5jaGlsZHJlbik7XG5cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2FuaXRpemVOb2RlKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJpbUF0dHJpYnV0ZXMobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gbm9kZS5hdHRyaWJ1dGVzLml0ZW0oaSkubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IG5vZGUuYXR0cmlidXRlcy5pdGVtKGkpLnZhbHVlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgKiByZW1vdmUgYXR0cmlidXRlcyB3aGVyZSB0aGUgbmFtZXMgc3RhcnQgd2l0aCBcIm9uXCIgKGZvciBleGFtcGxlOiBvbmxvYWQsIG9uZXJyb3IuLi4pXG4gICAgICAgICAgICAqIHJlbW92ZSBhdHRyaWJ1dGVzIHdoZXJlIHRoZSB2YWx1ZSBzdGFydHMgd2l0aCB0aGUgXCJqYXZhc2NyaXB0OlwiIHBzZXVkbyBwcm90b2NvbCAoZm9yIGV4YW1wbGUgaHJlZj1cImphdmFzY3JpcHQ6YWxlcnQoMSlcIilcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgIGlmIChhdHRyTmFtZS5pbmRleE9mKCdvbicpID09PSAwIHx8IGF0dHJWYWx1ZS5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBVUkwgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgcHJvdmlkZXMgVVJMIGZ1bmN0aW9ucy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXJsIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXNlVXJsKCk7XG4gICAgICAgIHRoaXMuYXNzZXRVcmwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgVVJMIGJhc2VkIG9uIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKlxuICAgICAqIElmIGFuIGFic29sdXRlIFVSTCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB0byh1cmwpIHtcbiAgICAgICAgY29uc3QgdXJsUmVnZXggPSAvXig/OlteOl0rOlxcL1xcLylbLWEtejAtOUA6JS5fK34jPV17MSwyNTZ9XFxiKFstYS16MC05KClAOiVfKy5+Iz8mLy89XSopL2k7XG5cbiAgICAgICAgaWYgKHVybC5tYXRjaCh1cmxSZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aGVVcmwgPSB1cmwucmVwbGFjZSgvXlxcLysvLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYmFzZVVybCgpfSR7dGhlVXJsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBBc3NldCBVUkwgYmFzZWQgb24gYSByZWxhdGl2ZSBwYXRoLlxuICAgICAqXG4gICAgICogSWYgYW4gYWJzb2x1dGUgVVJMIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzc2V0KHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKD86W146XSs6XFwvXFwvKVstYS16MC05QDolLl8rfiM9XXsxLDI1Nn1cXGIoWy1hLXowLTkoKUA6JV8rLn4jPyYvLz1dKikvaTtcblxuICAgICAgICBpZiAodXJsLm1hdGNoKHVybFJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRoZVVybCA9IHVybC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5hc3NldFVybCgpfSR7dGhlVXJsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGJhc2UgVVJMIG9mIHRoaXMgaW5zdGFsbC5cbiAgICAgKlxuICAgICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgYmFzZSBVUkwgZnJvbSB0aHJlZSBzb3VyY2VzLCBpbiBvcmRlcjpcbiAgICAgKiAgLSBJZiBTbm93Ym9hcmQgaXMgbG9hZGVkIHZpYSB0aGUgYHslIHNub3dib2FyZCAlfWAgdGFnLCBpdCB3aWxsIHJldHJpZXZlIHRoZSBiYXNlIFVSTCB0aGF0XG4gICAgICogaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCB0aGVyZS5cbiAgICAgKiAgLSBJZiBhIGA8YmFzZT5gIHRhZyBpcyBhdmFpbGFibGUsIGl0IHdpbGwgdXNlIHRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBiYXNlIHRhZy5cbiAgICAgKiAgLSBGaW5hbGx5LCBpdCB3aWxsIHRha2UgYSBndWVzcyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIHdpbGwgbGlrZWx5IG5vdCB3b3JrIGZvciBzaXRlc1xuICAgICAqIHRoYXQgcmVzaWRlIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgICAqXG4gICAgICogVGhlIGJhc2UgVVJMIHdpbGwgYWx3YXlzIGNvbnRhaW4gYSB0cmFpbGluZyBiYWNrc2xhc2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGJhc2VVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvdW5kQmFzZVVybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKS5kYXRhc2V0LmJhc2VVcmwpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJykuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSBbXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsXG4gICAgICAgICAgICAnLy8nLFxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgICAgICAnLycsXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdXJsUGFydHMuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBhc3NldCBVUkwgb2YgdGhpcyBpbnN0YWxsLlxuICAgICAqXG4gICAgICogVGhpcyBkZXRlcm1pbmVzIHRoZSBiYXNlIFVSTCBmcm9tIHRocmVlIHNvdXJjZXMsIGluIG9yZGVyOlxuICAgICAqICAtIElmIFNub3dib2FyZCBpcyBsb2FkZWQgdmlhIHRoZSBgeyUgc25vd2JvYXJkICV9YCB0YWcsIGl0IHdpbGwgcmV0cmlldmUgdGhlIGFzc2V0IFVSTCB0aGF0XG4gICAgICogaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCB0aGVyZS5cbiAgICAgKiAgLSBJZiBhIGA8bGluayByZWw9XCJhc3NldF91cmxcIiBocmVmPVwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiPmAgdGFnIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCB1c2UgdGhlIFVSTCBzcGVjaWZpZWQgaW4gdGhlIGxpbmsgdGFnLlxuICAgICAqICAtIEZpbmFsbHksIGl0IHdpbGwgdGFrZSBhIGd1ZXNzIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgd2lsbCBsaWtlbHkgbm90IHdvcmsgZm9yIHNpdGVzXG4gICAgICogdGhhdCByZXNpZGUgaW4gc3ViZGlyZWN0b3JpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYXNzZXQgVVJMIHdpbGwgYWx3YXlzIGNvbnRhaW4gYSB0cmFpbGluZyBiYWNrc2xhc2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzc2V0VXJsKCkge1xuICAgICAgICBpZiAodGhpcy5mb3VuZEFzc2V0VXJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykuZGF0YXNldC5hc3NldFVybCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiYXNzZXRfdXJsXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiYXNzZXRfdXJsXCJdJykuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gW1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgICAgICAgJy8vJyxcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LFxuICAgICAgICAgICAgJy8nLFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSB1cmxQYXJ0cy5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgYmFzZSBVUkwsIGVuc3VyaW5nIGl0IGlzIGEgSFRUUC9IVFRQcyBVUkwuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgU25vd2JvYXJkIHNjcmlwdCBvciA8YmFzZT4gdGFnIG9uIHRoZSBwYWdlIHVzZSBhIGRpZmZlcmVudCB0eXBlIG9mIFVSTCwgdGhpcyB3aWxsIGZhaWwgd2l0aFxuICAgICAqIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdmFsaWRhdGVCYXNlVXJsKHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIyguKikpPy9pO1xuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IHVybFJlZ2V4LmV4ZWModXJsKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB1cmxQYXJ0c1syXTtcbiAgICAgICAgY29uc3QgZG9tYWluID0gdXJsUGFydHNbNF07XG5cbiAgICAgICAgaWYgKHByb3RvY29sICYmIFsnaHR0cCcsICdodHRwcyddLmluZGV4T2YocHJvdG9jb2wudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZSBVUkwgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvbWFpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhc2UgVVJMIGRldGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHVybC5zdWJzdHIoLTEpID09PSAnLycpXG4gICAgICAgICAgICA/IHVybFxuICAgICAgICAgICAgOiBgJHt1cmx9L2A7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNub3dib2FyZCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkJztcbmltcG9ydCBQcm94eUhhbmRsZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Byb3h5SGFuZGxlcic7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdCc7XG5pbXBvcnQgQXR0cmlidXRlUmVxdWVzdCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvaGFuZGxlcnMvQXR0cmlidXRlUmVxdWVzdCc7XG5pbXBvcnQgQXNzZXRMb2FkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvQXNzZXRMb2FkZXInO1xuaW1wb3J0IERhdGFDb25maWcgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRGF0YUNvbmZpZyc7XG5pbXBvcnQgU3R5bGVzaGVldExvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHlsZXNoZWV0TG9hZGVyJztcbmltcG9ydCBUcmFuc2l0aW9uIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyYW5zaXRpb24nO1xuaW1wb3J0IEZsYXNoIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoJztcbmltcG9ydCBGbGFzaExpc3RlbmVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoTGlzdGVuZXInO1xuaW1wb3J0IEZvcm1WYWxpZGF0aW9uIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Zvcm1WYWxpZGF0aW9uJztcbmltcG9ydCBBdHRhY2hMb2FkaW5nIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0F0dGFjaExvYWRpbmcnO1xuaW1wb3J0IFN0cmlwZUxvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHJpcGVMb2FkZXInO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlcic7XG5cbigod2luZG93KSA9PiB7XG4gICAgY29uc3Qgc25vd2JvYXJkID0gbmV3IFByb3h5KFxuICAgICAgICBuZXcgU25vd2JvYXJkKHRydWUsIHRydWUpLFxuICAgICAgICBQcm94eUhhbmRsZXIsXG4gICAgKTtcblxuICAgIC8vIENvdmVyIGFsbCBhbGlhc2VzXG4gICAgd2luZG93LnNub3dib2FyZCA9IHNub3dib2FyZDtcbiAgICB3aW5kb3cuU25vd2JvYXJkID0gc25vd2JvYXJkO1xuICAgIHdpbmRvdy5Tbm93Qm9hcmQgPSBzbm93Ym9hcmQ7XG5cbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdyZXF1ZXN0JywgUmVxdWVzdCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignYXR0cmlidXRlUmVxdWVzdCcsIEF0dHJpYnV0ZVJlcXVlc3QpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2Fzc2V0TG9hZGVyJywgQXNzZXRMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2RhdGFDb25maWcnLCBEYXRhQ29uZmlnKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdleHRyYXNTdHlsZXMnLCBTdHlsZXNoZWV0TG9hZGVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCd0cmFuc2l0aW9uJywgVHJhbnNpdGlvbik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZmxhc2gnLCBGbGFzaCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZmxhc2hMaXN0ZW5lcicsIEZsYXNoTGlzdGVuZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2Zvcm1WYWxpZGF0aW9uJywgRm9ybVZhbGlkYXRpb24pO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2F0dGFjaExvYWRpbmcnLCBBdHRhY2hMb2FkaW5nKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdzdHJpcGVMb2FkZXInLCBTdHJpcGVMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3RyaWdnZXInLCBUcmlnZ2VyKTtcblxuICAgIHNub3dib2FyZC5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICAgIC8vIFNjYW4gZm9yIHRyaWdnZXJzXG4gICAgICAgIEFycmF5XG4gICAgICAgICAgICAuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG4gICAgICAgICAgICAuZmlsdGVyKChlbGVtZW50KSA9PiBbLi4uZWxlbWVudC5hdHRyaWJ1dGVzXS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lLnN0YXJ0c1dpdGgoXCJkYXRhLXRyaWdnZXItXCIpKS5sZW5ndGggPiAwXG4gICAgICAgICAgICApLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzbm93Ym9hcmQudHJpZ2dlcihlbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xufSkod2luZG93KTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8qISBqcy1jb29raWUgdjMuMC41IHwgTUlUICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbmZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbnZhciBkZWZhdWx0Q29udmVydGVyID0ge1xuICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWVbMF0gPT09ICdcIicpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKCVbXFxkQS1GXXsyfSkrL2dpLCBkZWNvZGVVUklDb21wb25lbnQpXG4gIH0sXG4gIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKS5yZXBsYWNlKFxuICAgICAgLyUoMlszNDZCRl18M1tBQy1GXXw0MHw1W0JERV18NjB8N1tCQ0RdKS9nLFxuICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgKVxuICB9XG59O1xuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbmZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgZnVuY3Rpb24gc2V0IChuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlNSk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVzLmV4cGlyZXMpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgIH1cblxuICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSlcbiAgICAgIC5yZXBsYWNlKC8lKDJbMzQ2Ql18NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICAgIC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XG5cbiAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgZm9yICh2YXIgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc7ICcgKyBhdHRyaWJ1dGVOYW1lO1xuXG4gICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAvLyAuLi5cbiAgICAgIC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAvLyBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLFxuICAgICAgLy8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgICAvLyAuLi5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnPScgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnNwbGl0KCc7JylbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgbmFtZSArICc9JyArIGNvbnZlcnRlci53cml0ZSh2YWx1ZSwgbmFtZSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gIH1cblxuICBmdW5jdGlvbiBnZXQgKG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCAoYXJndW1lbnRzLmxlbmd0aCAmJiAhbmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRvIHByZXZlbnQgdGhlIGZvciBsb29wIGluIHRoZSBmaXJzdCBwbGFjZSBhc3NpZ24gYW4gZW1wdHkgYXJyYXlcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICB2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdO1xuICAgIHZhciBqYXIgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYXJ0cyA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcbiAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJz0nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZvdW5kID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzBdKTtcbiAgICAgICAgamFyW2ZvdW5kXSA9IGNvbnZlcnRlci5yZWFkKHZhbHVlLCBmb3VuZCk7XG5cbiAgICAgICAgaWYgKG5hbWUgPT09IGZvdW5kKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZSA/IGphcltuYW1lXSA6IGphclxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoXG4gICAge1xuICAgICAgc2V0LFxuICAgICAgZ2V0LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlcykge1xuICAgICAgICBzZXQoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBhc3NpZ24oe30sIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IC0xXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGluaXQodGhpcy5jb252ZXJ0ZXIsIGFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKSlcbiAgICAgIH0sXG4gICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgIHJldHVybiBpbml0KGFzc2lnbih7fSwgdGhpcy5jb252ZXJ0ZXIsIGNvbnZlcnRlciksIHRoaXMuYXR0cmlidXRlcylcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoZGVmYXVsdEF0dHJpYnV0ZXMpIH0sXG4gICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgfVxuICApXG59XG5cbnZhciBhcGkgPSBpbml0KGRlZmF1bHRDb252ZXJ0ZXIsIHsgcGF0aDogJy8nIH0pO1xuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuZXhwb3J0IHsgYXBpIGFzIGRlZmF1bHQgfTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwidmFyIGRlZmVycmVkID0gW107XG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8gPSAocmVzdWx0LCBjaHVua0lkcywgZm4sIHByaW9yaXR5KSA9PiB7XG5cdGlmKGNodW5rSWRzKSB7XG5cdFx0cHJpb3JpdHkgPSBwcmlvcml0eSB8fCAwO1xuXHRcdGZvcih2YXIgaSA9IGRlZmVycmVkLmxlbmd0aDsgaSA+IDAgJiYgZGVmZXJyZWRbaSAtIDFdWzJdID4gcHJpb3JpdHk7IGktLSkgZGVmZXJyZWRbaV0gPSBkZWZlcnJlZFtpIC0gMV07XG5cdFx0ZGVmZXJyZWRbaV0gPSBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV07XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhciBub3RGdWxmaWxsZWQgPSBJbmZpbml0eTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV0gPSBkZWZlcnJlZFtpXTtcblx0XHR2YXIgZnVsZmlsbGVkID0gdHJ1ZTtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGNodW5rSWRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRpZiAoKHByaW9yaXR5ICYgMSA9PT0gMCB8fCBub3RGdWxmaWxsZWQgPj0gcHJpb3JpdHkpICYmIE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uTykuZXZlcnkoKGtleSkgPT4gKF9fd2VicGFja19yZXF1aXJlX18uT1trZXldKGNodW5rSWRzW2pdKSkpKSB7XG5cdFx0XHRcdGNodW5rSWRzLnNwbGljZShqLS0sIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZnVsZmlsbGVkID0gZmFsc2U7XG5cdFx0XHRcdGlmKHByaW9yaXR5IDwgbm90RnVsZmlsbGVkKSBub3RGdWxmaWxsZWQgPSBwcmlvcml0eTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYoZnVsZmlsbGVkKSB7XG5cdFx0XHRkZWZlcnJlZC5zcGxpY2UoaS0tLCAxKVxuXHRcdFx0dmFyIHIgPSBmbigpO1xuXHRcdFx0aWYgKHIgIT09IHVuZGVmaW5lZCkgcmVzdWx0ID0gcjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIi9hc3NldHMvanMvYXBwXCI6IDAsXG5cdFwiYXNzZXRzL2Nzcy90aGVtZVwiOiAwXG59O1xuXG4vLyBubyBjaHVuayBvbiBkZW1hbmQgbG9hZGluZ1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8uaiA9IChjaHVua0lkKSA9PiAoaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID09PSAwKTtcblxuLy8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG52YXIgd2VicGFja0pzb25wQ2FsbGJhY2sgPSAocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24sIGRhdGEpID0+IHtcblx0dmFyIFtjaHVua0lkcywgbW9yZU1vZHVsZXMsIHJ1bnRpbWVdID0gZGF0YTtcblx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG5cdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuXHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwO1xuXHRpZihjaHVua0lkcy5zb21lKChpZCkgPT4gKGluc3RhbGxlZENodW5rc1tpZF0gIT09IDApKSkge1xuXHRcdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYocnVudGltZSkgdmFyIHJlc3VsdCA9IHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdH1cblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHR9XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLk8ocmVzdWx0KTtcbn1cblxudmFyIGNodW5rTG9hZGluZ0dsb2JhbCA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmt3aW50ZXJjbXNfd29ya3Nob3BfdGhlbWVcIl0gPSBzZWxmW1wid2VicGFja0NodW5rd2ludGVyY21zX3dvcmtzaG9wX3RoZW1lXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGRlcGVuZHMgb24gb3RoZXIgbG9hZGVkIGNodW5rcyBhbmQgZXhlY3V0aW9uIG5lZWQgdG8gYmUgZGVsYXllZFxuX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgW1wiYXNzZXRzL2Nzcy90aGVtZVwiXSwgKCkgPT4gKF9fd2VicGFja19yZXF1aXJlX18oXCIuL2Fzc2V0cy9qcy9zcmMvYXBwLmpzXCIpKSlcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgW1wiYXNzZXRzL2Nzcy90aGVtZVwiXSwgKCkgPT4gKF9fd2VicGFja19yZXF1aXJlX18oXCIuL2Fzc2V0cy9jc3MvYmFzZS5jc3NcIikpKVxuX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcbiIsIiJdLCJuYW1lcyI6WyJQbHVnaW5CYXNlIiwic25vd2JvYXJkIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJjb25zdHJ1Y3QiLCJkZXBlbmRlbmNpZXMiLCJsaXN0ZW5zIiwiZGVzdHJ1Y3QiLCJkZXRhY2giLCJkZXN0cnVjdG9yIiwiZGVmYXVsdCIsIlNpbmdsZXRvbiIsIl9QbHVnaW5CYXNlIiwiX2NhbGxTdXBlciIsImFyZ3VtZW50cyIsIl9pbmhlcml0cyIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJlIiwidCIsInIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJuIiwiaGFzT3duUHJvcGVydHkiLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJpIiwiU3ltYm9sIiwiYSIsIml0ZXJhdG9yIiwiYyIsImFzeW5jSXRlcmF0b3IiLCJ1IiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ3cmFwIiwiR2VuZXJhdG9yIiwiY3JlYXRlIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsInR5cGUiLCJhcmciLCJjYWxsIiwiaCIsImwiLCJmIiwicyIsInkiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwicCIsImQiLCJnZXRQcm90b3R5cGVPZiIsInYiLCJ2YWx1ZXMiLCJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiaW52b2tlIiwiX3R5cGVvZiIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiRXJyb3IiLCJkb25lIiwibWV0aG9kIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJUeXBlRXJyb3IiLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwibGVuZ3RoIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwicmV2ZXJzZSIsInBvcCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiX3NsaWNlZFRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJpc0FycmF5Iiwib3duS2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIl9vYmplY3RTcHJlYWQiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwiX2RlZmluZVByb3BlcnRpZXMiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsIl9nZXRQcm90b3R5cGVPZiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiUmVmZXJlbmNlRXJyb3IiLCJCb29sZWFuIiwidmFsdWVPZiIsImJpbmQiLCJfc2V0UHJvdG90eXBlT2YiLCJSZXF1ZXN0IiwiZWxlbWVudCIsImhhbmRsZXIiLCJvcHRpb25zIiwiX3RoaXMiLCJpc0hhbmRsZXJOYW1lIiwibWF0Y2hlZEVsZW1lbnQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJjb25jYXQiLCJmZXRjaE9wdGlvbnMiLCJyZXNwb25zZURhdGEiLCJyZXNwb25zZUVycm9yIiwiY2FuY2VsbGVkIiwiY2hlY2tSZXF1ZXN0IiwiZ2xvYmFsRXZlbnQiLCJldmVudCIsIkV2ZW50IiwiY2FuY2VsYWJsZSIsInJlcXVlc3QiLCJkaXNwYXRjaEV2ZW50IiwiZGVmYXVsdFByZXZlbnRlZCIsImRvQ2xpZW50VmFsaWRhdGlvbiIsImNvbmZpcm0iLCJkb0NvbmZpcm0iLCJjb25maXJtZWQiLCJkb0FqYXgiLCJyZXNwb25zZSIsInByb2Nlc3NVcGRhdGUiLCJYX1dJTlRFUl9TVUNDRVNTIiwicHJvY2Vzc0Vycm9yIiwicHJvY2Vzc1Jlc3BvbnNlIiwiZXJyb3IiLCJFbGVtZW50IiwidW5kZWZpbmVkIiwiZ2V0RmV0Y2giLCJoZWFkZXJzIiwiYm9keSIsImRhdGEiLCJyZWRpcmVjdCIsIm1vZGUiLCJmZXRjaCIsInVybCIsImJyb3dzZXJWYWxpZGF0ZSIsImZvcm0iLCJjaGVja1ZhbGlkaXR5IiwicmVwb3J0VmFsaWRpdHkiLCJfdGhpczIiLCJhamF4UHJvbWlzZSIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwiaGFzIiwiZ2V0IiwiaW5jbHVkZXMiLCJqc29uIiwibWVzc2FnZSIsImV4Y2VwdGlvbiIsInJlbmRlckVycm9yIiwiZmlsZSIsImxpbmUiLCJ0cmFjZSIsInRleHQiLCJyZXNwb25zZVRleHQiLCJYX1dJTlRFUl9SRVNQT05TRV9DT0RFIiwicHJvbWlzZSIsIl90aGlzMyIsImJlZm9yZVVwZGF0ZSIsInBhcnRpYWxzIiwiZW50cmllcyIsImVudHJ5IiwiX2VudHJ5Iiwic3Vic3RyIiwiWF9XSU5URVJfQVNTRVRTIiwicHJvY2Vzc0Fzc2V0cyIsInByb21pc2VzIiwiZ2xvYmFsUHJvbWlzZUV2ZW50IiwiX2NhbGxlZSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJkb1VwZGF0ZSIsIndpbmRvdyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIl90aGlzNCIsImFmZmVjdGVkIiwiX2VudHJ5MiIsInBhcnRpYWwiLCJjb250ZW50Iiwic2VsZWN0b3IiLCJ1cGRhdGUiLCJlbGVtZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpbm5lckhUTUwiLCJzdWNjZXNzIiwiZmxhc2giLCJYX1dJTlRFUl9GTEFTSF9NRVNTQUdFUyIsInByb2Nlc3NGbGFzaE1lc3NhZ2VzIiwiWF9XSU5URVJfUkVESVJFQ1QiLCJwcm9jZXNzUmVkaXJlY3QiLCJwcm9jZXNzRXJyb3JNZXNzYWdlIiwic2tpcEVycm9yIiwiWF9XSU5URVJfRVJST1JfRklFTERTIiwicHJvY2Vzc1ZhbGlkYXRpb25FcnJvcnMiLCJYX1dJTlRFUl9FUlJPUl9NRVNTQUdFIiwiX3RoaXM1IiwiaGFuZGxlUmVkaXJlY3RSZXNwb25zZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJjcmVhdGVFdmVudCIsImV2ZW50TmFtZSIsIm9uY2UiLCJsb2NhdGlvbiIsImFzc2lnbiIsImhhbmRsZUVycm9yTWVzc2FnZSIsImFsZXJ0IiwibWVzc2FnZXMiLCJoYW5kbGVGbGFzaE1lc3NhZ2VzIiwiZmllbGRzIiwiaGFuZGxlVmFsaWRhdGlvbkVycm9ycyIsImFzc2V0cyIsIl9kb0NvbmZpcm0iLCJfY2FsbGVlMiIsImZ1bGZpbGxlZCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImhhbmRsZUNvbmZpcm1NZXNzYWdlIiwibGlzdGVuc1RvRXZlbnQiLCJ0MCIsInRhZ05hbWUiLCJjbG9zZXN0IiwiZXh0cmFjdFBhcnRpYWxzIiwieHNyZlRva2VuIiwibG9hZGluZyIsImhyZWYiLCJmaWxlcyIsIkZvcm1EYXRhIiwiZGVidWciLCJjb29raWUiLCJmb3JtRGF0YSIsIl9lbnRyeTMiLCJhcHBlbmQiLCJqb2luIiwiQXR0cmlidXRlUmVxdWVzdCIsIl9TaW5nbGV0b24iLCJyZWFkeSIsImFqYXhTZXR1cCIsImF0dGFjaEhhbmRsZXJzIiwiZGlzYWJsZURlZmF1bHRGb3JtVmFsaWRhdGlvbiIsImRldGFjaEhhbmRsZXJzIiwiX2dldCIsImNoYW5nZUhhbmRsZXIiLCJjbGlja0hhbmRsZXIiLCJrZXlEb3duSGFuZGxlciIsInN1Ym1pdEhhbmRsZXIiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidGFyZ2V0IiwibWF0Y2hlcyIsInByb2Nlc3NSZXF1ZXN0T25FbGVtZW50IiwiY3VycmVudEVsZW1lbnQiLCJwYXJlbnRFbGVtZW50IiwicHJldmVudERlZmF1bHQiLCJ2YWxpZFR5cGVzIiwiaW5kZXhPZiIsImdldEF0dHJpYnV0ZSIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInRyYWNrSW5wdXQiLCJkYXRhc2V0IiwicmVxdWVzdENvbmZpcm0iLCJyZXF1ZXN0UmVkaXJlY3QiLCJyZXF1ZXN0TG9hZGluZyIsInJlcXVlc3RGb3JtIiwicmVxdWVzdFVybCIsInBhcnNlRGF0YSIsInJlcXVlc3RVcGRhdGUiLCJyZXF1ZXN0RGF0YSIsIm9uQWpheFNldHVwIiwiZmllbGROYW1lIiwiZ2V0UGFyZW50UmVxdWVzdERhdGEiLCJlbGVtZW50RGF0YSIsImpzb25wYXJzZXIiLCJwYXJzZSIsImxhc3RWYWx1ZSIsImludGVydmFsIiwicmVzZXRUcmFja0lucHV0VGltZXIiLCJpbnB1dFRpbWVyIiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX24iLCJGIiwiQXNzZXRMb2FkZXIiLCJhamF4TG9hZEFzc2V0cyIsIl9sb2FkIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJzY3JpcHQiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwic3R5bGUiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiaW1hZ2UiLCJqcyIsImxvYWRTY3JpcHQiLCJ0MSIsImNzcyIsImxvYWRTdHlsZSIsInQyIiwidDMiLCJpbWciLCJsb2FkSW1hZ2UiLCJ0NCIsInQ1IiwibG9hZCIsIl94IiwiYXNzZXQiLCJsb2FkZWQiLCJkb21TY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiZG9tQ3NzIiwiaGVhZCIsIkltYWdlIiwic3JjIiwiQXR0YWNoTG9hZGluZyIsImFqYXhTdGFydCIsImFqYXhEb25lIiwibG9hZEVsZW1lbnRzIiwiY2xhc3NMaXN0IiwiYWRkIiwiZ2V0TG9hZGluZ0NsYXNzIiwiYXR0YWNoTG9hZGluZyIsInJlbW92ZSIsIkRhdGFDb25maWciLCJpbnN0YW5jZSIsImxvY2FsQ29uZmlnIiwiSFRNTEVsZW1lbnQiLCJpbnN0YW5jZUNvbmZpZyIsImFjY2VwdGVkQ29uZmlncyIsInJlZnJlc2giLCJjb25maWciLCJzZXQiLCJwZXJzaXN0IiwiZ2V0QWNjZXB0ZWRDb25maWdzIiwicHJvY2Vzc0NvbmZpZyIsImFjY2VwdEFsbERhdGFDb25maWdzIiwiZGVmYXVsdHMiLCJnZXREZWZhdWx0cyIsImNvZXJjZVZhbHVlIiwic3RyaW5nVmFsdWUiLCJzdGFydHNXaXRoIiwiYmFzZTY0c3RyIiwicmVwbGFjZSIsImRlY29kZWQiLCJhdG9iIiwidG9Mb3dlckNhc2UiLCJqc29uUGFyc2VyIiwiRmxhc2giLCJkdXJhdGlvbiIsImNsZWFyIiwidGltZXIiLCJmbGFzaFRpbWVyIiwicmVtb3ZlQXR0cmlidXRlIiwic3RvcFRpbWVyIiwic3RhcnRUaW1lciIsImFwcGVuZENoaWxkIiwidHJhbnNpdGlvbiIsInRpbWVyVHJhbnMiLCJjYW5jZWwiLCJGbGFzaExpc3RlbmVyIiwiYWpheEVycm9yTWVzc2FnZSIsImFqYXhGbGFzaE1lc3NhZ2VzIiwiZmxhc2hUeXBlIiwiZmxhc2hEdXJhdGlvbiIsImNzc0NsYXNzIiwiRm9ybVZhbGlkYXRpb24iLCJlcnJvckJhZ3MiLCJhamF4VmFsaWRhdGlvbkVycm9ycyIsImNvbGxlY3RFcnJvckJhZ3MiLCJkb1ZhbGlkYXRpb24iLCJpbnZhbGlkRmllbGRzIiwicmVxdWVzdFZhbGlkYXRlIiwiZXJyb3JCYWciLCJzaG93RXJyb3JCYWciLCJjbGVhclZhbGlkYXRpb24iLCJoaWRlRXJyb3JCYWciLCJyb290Tm9kZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIm1lc3NhZ2VMaXN0RWxlbWVudCIsInBsYWNlaG9sZGVyIiwiY3JlYXRlQ29tbWVudCIsImVycm9yQmFnRGF0YSIsInZhbGlkYXRlRm9yIiwic3BsaXQiLCJjbG9uZU5vZGUiLCJtZXNzYWdlTGlzdEFuY2hvciIsImN1c3RvbU1lc3NhZ2UiLCJ0ZXh0Q29udGVudCIsImNoaWxkTm9kZXMiLCJyZXBsYWNlQ2hpbGQiLCJpc0Nvbm5lY3RlZCIsImVycm9yQmFnVmFsaWRhdGVzRmllbGQiLCJmaXJzdEZpZWxkIiwiZmllbGQiLCJzaGlmdCIsIl9pbnZhbGlkRmllbGRzJGZpcnN0RiIsImVycm9ycyIsIm1lc3NhZ2VFbGVtZW50IiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJhZnRlciIsIl9pbnZhbGlkRmllbGRzJE9iamVjdCIsIlN0cmlwZUxvYWRlciIsImNvdW50ZXIiLCJjcmVhdGVTdHJpcGUiLCJzdHJpcGUiLCJzaG93IiwiaGlkZSIsImluZGljYXRvciIsInN0cmlwZUxvYWRlZCIsIm5ld1N0cmlwZSIsImZvcmNlIiwiU3R5bGVzaGVldExvYWRlciIsInN0eWxlc0xvYWRlZCIsImVuZHNXaXRoIiwic3R5bGVzaGVldCIsIlRyYW5zaXRpb24iLCJjYWxsYmFjayIsInRyYWlsVG8iLCJwYXJzZUR1cmF0aW9uIiwiZG9UcmFuc2l0aW9uIiwiZXZlbnRDbGFzc2VzIiwiX2xlbiIsImFyZ3MiLCJfa2V5IiwiYWN0aXZlIiwib3V0IiwicmV0dXJuQ2xhc3NlcyIsInRyYW5zaXRpb25EdXJhdGlvbiIsInJlc2V0Q2xhc3NlcyIsImV2ZW50Q2xhc3MiLCJnZXRDb21wdXRlZFN0eWxlIiwib25UcmFuc2l0aW9uRW5kIiwicGFyc2VkIiwiZXhlYyIsImFtb3VudCIsInVuaXQiLCJNYXRoIiwiZmxvb3IiLCJUcmlnZ2VyIiwidHJpZ2dlcnMiLCJNYXAiLCJldmVudHMiLCJTZXQiLCJwYXJzZVRyaWdnZXJzIiwic2l6ZSIsInJlc2V0RXZlbnRzIiwiY3JlYXRlVHJpZ2dlckV2ZW50cyIsInJ1bkV2ZW50cyIsImRhc2hTdHlsZSIsIm1hdGNoIiwidHJpZ2dlclBhcnRzIiwidHJpZ2dlck5hbWUiLCJ0cmlnZ2VyVHlwZSIsIl90cmlnZ2VyUGFydHMiLCJ0cmlnZ2VyIiwiZ2V0U2VsZWN0YWJsZUVsZW1lbnRzIiwiaXNWYWxpZENvbmRpdGlvbiIsImlzVmFsaWRBY3Rpb24iLCJwYXJzZUNvbW1hbmQiLCJjb21tYW5kIiwidHJpbSIsInNwbGl0VmFsdWVzIiwicXVvdGVkIiwibWFwIiwic3BsaXRWYWx1ZSIsIl90b0NvbnN1bWFibGVBcnJheSIsInBhcmFtZXRlcnMiLCJfY29tbWFuZCRzcGxpdCIsIl9jb21tYW5kJHNwbGl0MiIsIl90aGlzMiRwYXJzZUNvbW1hbmQiLCJjcmVhdGVWYWx1ZUV2ZW50IiwiY3JlYXRlRW1wdHlFdmVudCIsImFsbCIsInN1cHBvcnRlZEVsZW1lbnRzIiwidGhpc0V2ZW50IiwiZWxlbWVudFZhbHVlcyIsImNoZWNrZWQiLCJldmVyeSIsImV4ZWN1dGVBY3Rpb24iLCJzb21lIiwiZWxlbWVudEV2ZW50IiwiY29uZGl0aW9uTWV0IiwiX3RoaXMkcGFyc2VDb21tYW5kIiwiYWN0aW9uU2hvdyIsImRpc3BsYXkiLCJvcmlnaW5hbERpc3BsYXkiLCJhZnRlckFjdGlvbiIsInByb3AiLCJyZWNlaXZlciIsInByb3BMb3dlciIsImhhc1BsdWdpbiIsIl9SZWZsZWN0JGdldCRwcm9wTG93ZSIsImdldEluc3RhbmNlIiwiSW5uZXJQcm94eUhhbmRsZXIiLCJQbHVnaW5Mb2FkZXIiLCJQcm94eSIsImZyZWV6ZSIsImluc3RhbmNlcyIsInNpbmdsZXRvbiIsImluaXRpYWxpc2VkIiwic2VhbCIsIm1vY2tzIiwib3JpZ2luYWxGdW5jdGlvbnMiLCJoYXNNZXRob2QiLCJtZXRob2ROYW1lIiwiaXNGdW5jdGlvbiIsImNhbGxNZXRob2QiLCJfbGVuMiIsIl9rZXkyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwidW5tZXQiLCJnZXREZXBlbmRlbmNpZXMiLCJpdGVtIiwiZ2V0UGx1Z2luTmFtZXMiLCJpc1NpbmdsZXRvbiIsImluaXRpYWxpc2VTaW5nbGV0b24iLCJfbGVuMyIsInBhcmFtcyIsIl9rZXkzIiwiX2VudHJ5NCIsIl9sZW40IiwiX2tleTQiLCJuZXdJbnN0YW5jZSIsIl9jb25zdHJ1Y3QiLCJzcGxpY2UiLCJnZXRJbnN0YW5jZXMiLCJpc0luaXRpYWxpc2VkIiwiX2xlbjUiLCJfa2V5NSIsInBsdWdpbiIsIm1vY2siLCJfbGVuNiIsIl9rZXk2IiwidW5tb2NrIiwiQ29va2llIiwiSnNvblBhcnNlciIsIlNhbml0aXplciIsIlVybCIsIlNub3dib2FyZCIsImF1dG9TaW5nbGV0b25zIiwiZGVidWdFbmFibGVkIiwiYXV0b0luaXRTaW5nbGV0b25zIiwicGx1Z2lucyIsImxpc3RlbmVycyIsImZvdW5kQmFzZVVybCIsInJlYWRpbmVzcyIsImRvbSIsImF0dGFjaEFic3RyYWN0cyIsImxvYWRVdGlsaXRpZXMiLCJpbml0aWFsaXNlIiwiYWRkUGx1Z2luIiwiaW5pdGlhbGlzZVNpbmdsZXRvbnMiLCJsb3dlck5hbWUiLCJnZXRQbHVnaW5zIiwicmVhZHlNZXRob2QiLCJyZW1vdmVQbHVnaW4iLCJnZXRQbHVnaW4iLCJvbiIsIm9mZiIsImluZGV4IiwibGlzdGVuTWV0aG9kIiwicmVzdWx0IiwibGlzdGVuZXIiLCJpbnN0YW5jZVByb21pc2UiLCJsaXN0ZW5lclByb21pc2UiLCJsb2dNZXNzYWdlIiwiY29sb3IiLCJib2xkIiwiY29uc29sZSIsImdyb3VwQ29sbGFwc2VkIiwicGFyYW0iLCJsb2ciLCJncm91cEVuZCIsIkJhc2VDb29raWUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsInNhbWVTaXRlIiwic2V0RGVmYXVsdHMiLCJjb29raWVzIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlIiwibmV3VmFsdWUiLCJzYXZlVmFsdWUiLCJ3bkpTT04iLCJvY0pTT04iLCJzdHIiLCJqc29uU3RyaW5nIiwicGFyc2VTdHJpbmciLCJKU09OIiwibnVtIiwiaXNCbGFua0NoYXIiLCJwYXJzZUtleSIsImNhbkJlS2V5SGVhZCIsImdldEJvZHkiLCJvcmlnaW5MZW5ndGgiLCJsYXN0IiwicG9zIiwic3RhY2siLCJxdW90ZSIsImNoIiwiY2hhckNvZGVBdCIsInduU2FuaXRpemUiLCJodG1sIiwic2FuaXRpemUiLCJvY1Nhbml0aXplIiwiYm9keU9ubHkiLCJwYXJzZXIiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJyZXR1cm5Cb2R5T25seSIsInNhbml0aXplTm9kZSIsImdldFJvb3ROb2RlIiwibm9kZSIsInRyaW1BdHRyaWJ1dGVzIiwiY2hpbGRyZW4iLCJjaGlsZCIsImF0dHJpYnV0ZXMiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImZvdW5kQXNzZXRVcmwiLCJiYXNlVXJsIiwiYXNzZXRVcmwiLCJ0byIsInVybFJlZ2V4IiwidGhlVXJsIiwidmFsaWRhdGVCYXNlVXJsIiwidXJsUGFydHMiLCJwcm90b2NvbCIsImhvc3QiLCJQcm94eUhhbmRsZXIiLCJTbm93Qm9hcmQiLCJfcmVmIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/assets/js/src/app.js b/assets/js/src/app.js index ad9be08..238d7f5 100644 --- a/assets/js/src/app.js +++ b/assets/js/src/app.js @@ -15,7 +15,7 @@ import Trigger from '../../../../../modules/system/assets/js/snowboard/extras/Tr ((window) => { const snowboard = new Proxy( - new Snowboard(), + new Snowboard(true, true), ProxyHandler, ); diff --git a/pages/snowboard/triggers.htm b/pages/snowboard/triggers.htm index 8c68f42..18f362b 100644 --- a/pages/snowboard/triggers.htm +++ b/pages/snowboard/triggers.htm @@ -12,12 +12,12 @@

Triggers

-

Value

+

Value / OneOf / AllOf

- +
-

Trigger on value

+

Trigger on single value

A message will appear when the field contains "trigger".

@@ -27,17 +27,162 @@

Trigger on value

type="text" name="field" placeholder="Field" - data-trigger-show=".message" - data-trigger-show-parent="#trigger-single-value" - data-trigger-show-when="value['trigger,test','two'][blah,blahs2]" - data-trigger-show-action="show" > -
- Triggered! -
+
+
+ Triggered! +
+
+ + + +
+ +

Trigger on one of multiple values

+

A message will appear when the field contains one of the following values: "pizza", "burger", "hot dog".

+ +
+
+ +
+
+ Yum yum! +
+
+ + + +
+ +

Trigger on all of multiple values

+

A message will when all checkboxes are ticked - each one being a number, and trigger expecting all numbers to be available. This + demonstrates triggers using multiple inputs to determine the success of a condition.

+ +
+
+ + + + + + + + +
+ +
+ Surprise! +
+
+ + + +
+ +

Trigger on all of multiple values (text boxes)

+

Same trigger test as above, but uses the combined values of a set of text boxes. This will trigger when the text boxes + contain "1", "2" and "3", in any order.

+ +
+
+ +
+
+ +
+
+ +
+
+ Surprise! +
+
+ + +
+ +

Empty

+ + +
+ +

Trigger when empty

+

A message will appear when the field below is empty.

+ +
+
+ +
+
+ Oi, you!
- + From 4cddc921b3ce6a9aad63f5dce052f40a58971150 Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Mon, 15 Jul 2024 16:27:05 +0800 Subject: [PATCH 3/7] Additional examples --- assets/css/theme.css | 20 ++-- assets/js/app.js | 182 ++++++++++++++++++++++++++--------- pages/snowboard/triggers.htm | 90 +++++++++++++++++ 3 files changed, 236 insertions(+), 56 deletions(-) diff --git a/assets/css/theme.css b/assets/css/theme.css index f3e202a..8ceb553 100644 --- a/assets/css/theme.css +++ b/assets/css/theme.css @@ -851,6 +851,10 @@ video { --tw-bg-opacity: 1; background-color: rgb(22 163 74 / var(--tw-bg-opacity)); } +.bg-green-800 { + --tw-bg-opacity: 1; + background-color: rgb(22 101 52 / var(--tw-bg-opacity)); +} .bg-purple-500 { --tw-bg-opacity: 1; background-color: rgb(139 92 246 / var(--tw-bg-opacity)); @@ -871,10 +875,6 @@ video { --tw-bg-opacity: 1; background-color: rgb(220 38 38 / var(--tw-bg-opacity)); } -.bg-green-800 { - --tw-bg-opacity: 1; - background-color: rgb(22 101 52 / var(--tw-bg-opacity)); -} .bg-red-800 { --tw-bg-opacity: 1; background-color: rgb(153 27 27 / var(--tw-bg-opacity)); @@ -942,6 +942,9 @@ video { .fill-current { fill: currentColor; } +.p-2 { + padding: 0.5rem; +} .p-4 { padding: 1rem; } @@ -951,9 +954,6 @@ video { .p-8 { padding: 2rem; } -.p-2 { - padding: 0.5rem; -} .px-10 { padding-left: 2.5rem; padding-right: 2.5rem; @@ -1089,10 +1089,6 @@ video { --tw-text-opacity: 1; color: rgb(22 163 74 / var(--tw-text-opacity)); } -.text-green-700 { - --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity)); -} .text-purple-300 { --tw-text-opacity: 1; color: rgb(196 181 253 / var(--tw-text-opacity)); @@ -1467,4 +1463,4 @@ p + h6 { } -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsb0VBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFB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QUFBO0VBb0VBOztFQXBFQTtJQUFBO0VBb0VBO0FBQUE7QUFwRUE7O0VBQUE7SUFBQSxpQkFvRUE7SUFwRUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9jb21wb25lbnRzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL3V0aWxpdGllcy5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4vYXNzZXRzL2Nzcy9zZWN0aW9ucy91c2VyLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL2Jhc2UuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIkB0YWlsd2luZCBiYXNlO1xuIiwiQHRhaWx3aW5kIGNvbXBvbmVudHM7XG4iLCJAdGFpbHdpbmQgdXRpbGl0aWVzO1xuIiwiI2FjY291bnQtY29tcG9uZW50IHtcbiAgICAucm93IHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIGxnOmdyaWQgbGc6Z3JpZC1jb2xzLTIgZ2FwLTEwO1xuXG4gICAgICAgIC5jb2wtbWQtNiB7XG4gICAgICAgICAgICBAYXBwbHkgaC1hdXRvIGxnOmgtZnVsbCBwLTggYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy1ncmF5LTUwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAge1xuICAgICAgICBAYXBwbHkgZmxleCBmbGV4LWNvbCBnYXAtMjtcblxuICAgICAgICAuZm9ybS1sYWJlbCwgbGFiZWwge1xuICAgICAgICAgICAgQGFwcGx5IGZvbnQtYm9sZCB0ZXh0LXNtIHRleHQtZ3JheS02MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgICAgICAgIEBhcHBseSBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgcC0yIGZvY3VzOm91dGxpbmUgZm9jdXM6b3V0bGluZS1ibHVlLTUwMCBwbGFjZWhvbGRlcjp0ZXh0LWdyYXktMzAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAgKyAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBtdC00O1xuICAgIH1cblxuICAgIC5idG4ge1xuICAgICAgICBAYXBwbHkgbXQtOCBpbmxpbmUtZmxleCBmb250LWJvbGQgdGV4dC1zbSByb3VuZGVkLWxnIHRyYW5zaXRpb24gdHJhbnNmb3JtIGFjdGl2ZTpzY2FsZS05MCBweS00IHB4LTggYmctZ3JlZW4tNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctZ3JlZW4tNTAwO1xuICAgIH1cblxuICAgIC5kZWFjdGl2YXRlIHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIG10LTQgdGV4dC1yZWQtNjAwIGhvdmVyOnRleHQtcmVkLTgwMDtcbiAgICB9XG5cbiAgICAjYWNjb3VudERlYWN0aXZhdGVGb3JtIHtcbiAgICAgICAgQGFwcGx5IG10LTggYm9yZGVyIGJvcmRlci1yZWQtMjAwIGJnLXJlZC01MCBwLTg7XG5cbiAgICAgICAgLmJ0biB7XG4gICAgICAgICAgICBAYXBwbHkgYmctcmVkLTYwMCB0ZXh0LXdoaXRlIGhvdmVyOmJnLXJlZC01MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuYnRuICsgYSB7XG4gICAgICAgICAgICBAYXBwbHkgbWwtNDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBpbXBvcnQgJ3RhaWx3aW5kY3NzL2Jhc2UnO1xuQGltcG9ydCAndGFpbHdpbmRjc3MvY29tcG9uZW50cyc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy91dGlsaXRpZXMnO1xuQGltcG9ydCAnLi9zZWN0aW9ucy91c2VyLmNzcyc7XG5cbi8qIERlZmF1bHQgZm9udCAqL1xuYm9keSB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS01MDAgZm9udC1ib2R5O1xufVxuXG4vKiBEaXNhYmxlIE9TWCBzY3JvbGxpbmcgYm91bmNlIGVmZmVjdCAqL1xuaHRtbCxcbmJvZHkge1xuICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmU7XG59XG5cbi8qIEhlYWRpbmcgc3R5bGVzICovXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICAgIEBhcHBseSB0ZXh0LWdyYXktNzAwIGZvbnQtaGVhZGluZyBtYi02O1xufVxuXG5oMSB7XG4gICAgQGFwcGx5IHRleHQtNHhsO1xufVxuXG5oMiB7XG4gICAgQGFwcGx5IHRleHQtMnhsO1xufVxuXG5oMyB7XG4gICAgQGFwcGx5IHRleHQteGw7XG59XG5cbmg0IHtcbiAgICBAYXBwbHkgdGV4dC1sZztcbn1cblxuLyogUGFyYWdyYXBocyBhbmQgc3BhY2luZyAqL1xucCB7XG4gICAgQGFwcGx5IG1iLTQ7XG59XG5cbnA6bGFzdC1jaGlsZCB7XG4gICAgQGFwcGx5IG1iLTA7XG59XG5cbnAgKyBoMSxcbnAgKyBoMixcbnAgKyBoMyxcbnAgKyBoNCxcbnAgKyBoNSxcbnAgKyBoNiB7XG4gICAgQGFwcGx5IG10LTg7XG59XG5cbi8qIEhlcm8gKi9cbi5oZXJvIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtNTIgcGItMjggdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG5cbi5oZXJvLXNtYWxsIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtMzIgcGItMTYgdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsb0VBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFB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QUE7QUFwRUE7O0VBQUE7SUFBQSxpQkFvRUE7SUFwRUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9jb21wb25lbnRzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL3V0aWxpdGllcy5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4vYXNzZXRzL2Nzcy9zZWN0aW9ucy91c2VyLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL2Jhc2UuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIkB0YWlsd2luZCBiYXNlO1xuIiwiQHRhaWx3aW5kIGNvbXBvbmVudHM7XG4iLCJAdGFpbHdpbmQgdXRpbGl0aWVzO1xuIiwiI2FjY291bnQtY29tcG9uZW50IHtcbiAgICAucm93IHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIGxnOmdyaWQgbGc6Z3JpZC1jb2xzLTIgZ2FwLTEwO1xuXG4gICAgICAgIC5jb2wtbWQtNiB7XG4gICAgICAgICAgICBAYXBwbHkgaC1hdXRvIGxnOmgtZnVsbCBwLTggYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy1ncmF5LTUwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAge1xuICAgICAgICBAYXBwbHkgZmxleCBmbGV4LWNvbCBnYXAtMjtcblxuICAgICAgICAuZm9ybS1sYWJlbCwgbGFiZWwge1xuICAgICAgICAgICAgQGFwcGx5IGZvbnQtYm9sZCB0ZXh0LXNtIHRleHQtZ3JheS02MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgICAgICAgIEBhcHBseSBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgcC0yIGZvY3VzOm91dGxpbmUgZm9jdXM6b3V0bGluZS1ibHVlLTUwMCBwbGFjZWhvbGRlcjp0ZXh0LWdyYXktMzAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAgKyAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBtdC00O1xuICAgIH1cblxuICAgIC5idG4ge1xuICAgICAgICBAYXBwbHkgbXQtOCBpbmxpbmUtZmxleCBmb250LWJvbGQgdGV4dC1zbSByb3VuZGVkLWxnIHRyYW5zaXRpb24gdHJhbnNmb3JtIGFjdGl2ZTpzY2FsZS05MCBweS00IHB4LTggYmctZ3JlZW4tNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctZ3JlZW4tNTAwO1xuICAgIH1cblxuICAgIC5kZWFjdGl2YXRlIHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIG10LTQgdGV4dC1yZWQtNjAwIGhvdmVyOnRleHQtcmVkLTgwMDtcbiAgICB9XG5cbiAgICAjYWNjb3VudERlYWN0aXZhdGVGb3JtIHtcbiAgICAgICAgQGFwcGx5IG10LTggYm9yZGVyIGJvcmRlci1yZWQtMjAwIGJnLXJlZC01MCBwLTg7XG5cbiAgICAgICAgLmJ0biB7XG4gICAgICAgICAgICBAYXBwbHkgYmctcmVkLTYwMCB0ZXh0LXdoaXRlIGhvdmVyOmJnLXJlZC01MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuYnRuICsgYSB7XG4gICAgICAgICAgICBAYXBwbHkgbWwtNDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBpbXBvcnQgJ3RhaWx3aW5kY3NzL2Jhc2UnO1xuQGltcG9ydCAndGFpbHdpbmRjc3MvY29tcG9uZW50cyc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy91dGlsaXRpZXMnO1xuQGltcG9ydCAnLi9zZWN0aW9ucy91c2VyLmNzcyc7XG5cbi8qIERlZmF1bHQgZm9udCAqL1xuYm9keSB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS01MDAgZm9udC1ib2R5O1xufVxuXG4vKiBEaXNhYmxlIE9TWCBzY3JvbGxpbmcgYm91bmNlIGVmZmVjdCAqL1xuaHRtbCxcbmJvZHkge1xuICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmU7XG59XG5cbi8qIEhlYWRpbmcgc3R5bGVzICovXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICAgIEBhcHBseSB0ZXh0LWdyYXktNzAwIGZvbnQtaGVhZGluZyBtYi02O1xufVxuXG5oMSB7XG4gICAgQGFwcGx5IHRleHQtNHhsO1xufVxuXG5oMiB7XG4gICAgQGFwcGx5IHRleHQtMnhsO1xufVxuXG5oMyB7XG4gICAgQGFwcGx5IHRleHQteGw7XG59XG5cbmg0IHtcbiAgICBAYXBwbHkgdGV4dC1sZztcbn1cblxuLyogUGFyYWdyYXBocyBhbmQgc3BhY2luZyAqL1xucCB7XG4gICAgQGFwcGx5IG1iLTQ7XG59XG5cbnA6bGFzdC1jaGlsZCB7XG4gICAgQGFwcGx5IG1iLTA7XG59XG5cbnAgKyBoMSxcbnAgKyBoMixcbnAgKyBoMyxcbnAgKyBoNCxcbnAgKyBoNSxcbnAgKyBoNiB7XG4gICAgQGFwcGx5IG10LTg7XG59XG5cbi8qIEhlcm8gKi9cbi5oZXJvIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtNTIgcGItMjggdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG5cbi5oZXJvLXNtYWxsIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtMzIgcGItMTYgdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file diff --git a/assets/js/app.js b/assets/js/app.js index ffffed9..b6f2f2c 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -3240,13 +3240,15 @@ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf * @property {string} trigger The selector for the trigger target element(s). * @property {string} condition The condition that must be met for the trigger to fire. * @property {string} action The action to perform when the trigger fires. - * @property {string} parent The parent element with which to limit the trigger scope. + * @property {string|undefined} parent The parent element with which to limit the trigger scope. + * @property {string|number} priority The priority of the trigger event. * @property {HTMLElement[]} elements The target elements that this trigger applies to. */ /** * @typedef {Object} TriggerElement * @property {HTMLElement} element The target element. * @property {string} eventName The trigger event name. + * @property {int} priority The trigger event priority. * @property {Function} event The trigger event function. */ @@ -3285,14 +3287,19 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { this.element = element; /** - * @var {Map>} The triggers for this element. + * @type {Map>} The triggers for this element. */ this.triggers = new Map(); /** - * @var {Set} The events that have been bound by triggers. + * @type {Map>} A map of elements that trigger events. */ - this.events = new Set(); + this.events = new Map(); + + /** + * @type {Map>} A map of elements and their event connectors. + */ + this.connectors = new Map(); this.parseTriggers(); if (this.triggers.size > 0) { this.resetEvents(); @@ -3341,14 +3348,14 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { if (dashStyle !== 'trigger' && !dashStyle.startsWith('trigger-')) { return; } - var triggerParts = /([a-z0-9\-.:_]+?)(?:(?:-)(closest-parent|condition|when|action|parent))?$/i.exec(dashStyle.replace('trigger-', '').toLowerCase()); + var triggerParts = /([a-z0-9\-.:_]+?)(?:(?:-)(closest-parent|condition|when|action|parent|priority))?$/i.exec(dashStyle.replace('trigger-', '').toLowerCase()); var triggerName = null; var triggerType = null; if (['trigger', 'condition', 'action', 'parent', 'when', 'closest'].indexOf(triggerParts[1]) !== -1 && (triggerParts[1] !== 'closest' || triggerParts[1] === 'closest' && triggerParts[2] === 'parent')) { // Support original trigger format triggerName = '__original'; triggerType = triggerParts[1] === 'closest' ? 'parent' : triggerParts[1]; - } else if (triggerParts[2] === undefined || ['closest-parent', 'condition', 'when', 'action', 'parent'].indexOf(triggerParts[2]) !== -1) { + } else if (triggerParts[2] === undefined || ['closest-parent', 'condition', 'when', 'action', 'parent', 'priority'].indexOf(triggerParts[2]) !== -1) { // Parse multi-trigger format var _triggerParts = _slicedToArray(triggerParts, 2); triggerName = _triggerParts[1]; @@ -3364,6 +3371,9 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { case 'action': triggerType = 'action'; break; + case 'priority': + triggerType = 'priority'; + break; default: triggerType = 'trigger'; break; @@ -3386,6 +3396,9 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { _this.triggers["delete"](name); } else { trigger.set('elements', elements); + if (!trigger.has('priority')) { + trigger.set('priority', 100); + } } }); } @@ -3457,7 +3470,7 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { /** * Checks if any elements are accessible by the provided trigger. * - * @param {TriggerEntity} trigger + * @param {Map} trigger * @returns {HTMLElement[]} */ }, { @@ -3490,7 +3503,7 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { }, { key: "isValidAction", value: function isValidAction(trigger) { - return ['show', 'hide', 'enable', 'disable', 'empty', 'value', 'class', 'attr', 'style'].includes(this.parseCommand(trigger.get('action')).name.toLowerCase()); + return ['show', 'hide', 'enable', 'disable', 'empty', 'value', 'check', 'uncheck', 'class', 'attr', 'style'].includes(this.parseCommand(trigger.get('action')).name.toLowerCase()); } /** @@ -3501,20 +3514,25 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { value: function createTriggerEvents() { var _this2 = this; this.triggers.forEach(function (trigger) { + var _parameters$; var _this2$parseCommand = _this2.parseCommand(trigger.get('condition')), name = _this2$parseCommand.name, parameters = _this2$parseCommand.parameters; - switch (name) { + switch (name.toLowerCase()) { case 'value': - case 'oneOf': + case 'oneof': _this2.createValueEvent.apply(_this2, [trigger, false].concat(_toConsumableArray(parameters))); break; - case 'allOf': + case 'allof': _this2.createValueEvent.apply(_this2, [trigger, true].concat(_toConsumableArray(parameters))); break; case 'empty': _this2.createEmptyEvent(trigger); break; + case 'checked': + case 'unchecked': + _this2.createCheckedEvent(trigger, name === 'checked', (_parameters$ = parameters[0]) !== null && _parameters$ !== void 0 ? _parameters$ : undefined); + break; default: } }); @@ -3574,24 +3592,15 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { } }; supportedElements.forEach(function (element) { - var elementEvent = function elementEvent() { - return thisEvent(); - }; if (element.matches('input[type=checkbox], input[type=radio]')) { - _this3.events.add({ - element: element, - eventName: 'click', - event: elementEvent + _this3.addEvent(element, trigger, 'click', function () { + return thisEvent(); }); - element.addEventListener('click', elementEvent); return; } - _this3.events.add({ - element: element, - eventName: 'input', - event: elementEvent + _this3.addEvent(element, trigger, 'input', function () { + return thisEvent(); }); - element.addEventListener('input', elementEvent); }); } @@ -3634,39 +3643,124 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { } }; supportedElements.forEach(function (element) { - var elementEvent = function elementEvent() { - return thisEvent(); - }; if (element.matches('input[type=checkbox], input[type=radio]')) { - _this4.events.add({ - element: element, - eventName: 'click', - event: elementEvent + _this4.addEvent(element, trigger, 'click', function () { + return thisEvent(); }); - element.addEventListener('click', elementEvent); return; } - _this4.events.add({ - element: element, - eventName: 'input', - event: elementEvent + _this4.addEvent(element, trigger, 'input', function () { + return thisEvent(); }); - element.addEventListener('input', elementEvent); }); } + + /** + * Creates a trigger that fires when a target element is checked/unchecked. + * + * @param {TriggerEntity} trigger + * @param {boolean} checked If the element should be checked or unchecked. + * @param {number|undefined} atLeast The minimum number of elements that must be checked. + * Defaults to 1 if undefined. + */ + }, { + key: "createCheckedEvent", + value: function createCheckedEvent(trigger, checked) { + var _this5 = this; + var atLeast = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + var supportedElements = new Set(); + trigger.get('elements').forEach(function (element) { + // Only supports checkboxes and radio buttons + if (element.matches('input[type=radio], input[type=checkbox]')) { + supportedElements.add(element); + } + }); + var thisEvent = function thisEvent() { + var elementValues = new Set(); + supportedElements.forEach(function (element) { + if (checked === element.checked) { + elementValues.add(element); + } + }); + var atLeastCount = atLeast ? Number(atLeast) : 1; + if (elementValues.size >= atLeastCount) { + _this5.executeAction(trigger, true); + } else { + _this5.executeAction(trigger, false); + } + }; + supportedElements.forEach(function (element) { + _this5.addEvent(element, trigger, 'click', function () { + return thisEvent(); + }); + }); + } + + /** + * Adds an event to an element. + * + * This registers the event in the `events` map for later usage and removal, and adds a + * connector to the element for the event, so that we may enable prioritisation and control over + * the firing of the events. + * + * @param {HTMLElement} element + * @param {TriggerEntity} trigger + * @param {string} eventName + * @param {Function} callback + */ + }, { + key: "addEvent", + value: function addEvent(element, trigger, eventName, callback) { + var _this6 = this; + if (!this.events.has(element)) { + this.events.set(element, new Set()); + } + var event = { + element: element, + eventName: eventName, + priority: Number(trigger.get('priority')), + event: callback + }; + this.events.get(element).add(event); + if (!this.connectors.has(element)) { + this.connectors.set(element, new Map()); + } + if (!this.connectors.get(element).has(eventName)) { + this.connectors.get(element).set(eventName, function () { + var events = []; + _this6.events.get(element).forEach(function (elementEvent) { + if (elementEvent.eventName === eventName) { + events.push(elementEvent); + } + }); + events.sort(function (a, b) { + return a.priority - b.priority; + }).forEach(function (elementEvent) { + elementEvent.event(); + }); + }); + element.addEventListener(eventName, this.connectors.get(element).get(eventName)); + } + } }, { key: "runEvents", value: function runEvents() { - this.events.forEach(function (event) { - return event.event(); + this.connectors.forEach(function (elementConnectors) { + elementConnectors.forEach(function (connector) { + connector(); + }); }); } }, { key: "resetEvents", value: function resetEvents() { - this.events.forEach(function (event) { - event.element.removeEventListener(event.eventName, event.event); + this.connectors.forEach(function (elementConnectors, element) { + elementConnectors.forEach(function (connector, event) { + element.removeEventListener(event, connector); + }); }); + this.connectors.clear(); + this.events.clear(); } }, { key: "executeAction", @@ -3685,7 +3779,7 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { }, { key: "actionShow", value: function actionShow(trigger, show) { - if (show && this.element.style.display === 'none') { + if (show && getComputedStyle(this.element).display === 'none') { this.element.classList.remove('hide'); if (!this.element.dataset.originalDisplay) { this.element.style.display = 'block'; @@ -3694,7 +3788,7 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { } delete this.element.dataset.originalDisplay; this.afterAction(trigger); - } else if (this.element.style.display !== 'none') { + } else if (!show && getComputedStyle(this.element).display !== 'none') { this.element.classList.add('hide'); this.element.dataset.originalDisplay = getComputedStyle(this.element).display; this.element.style.display = 'none'; @@ -6053,4 +6147,4 @@ var api = init(defaultConverter, { path: '/' }); /******/ /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL2Fzc2V0cy9qcy9hcHAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEEsSUFRcUJBLFVBQVU7RUFDM0I7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJLFNBQUFBLFdBQVlDLFNBQVMsRUFBRTtJQUFBQyxlQUFBLE9BQUFGLFVBQUE7SUFDbkIsSUFBSSxDQUFDQyxTQUFTLEdBQUdBLFNBQVM7RUFDOUI7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEksT0FBQUUsWUFBQSxDQUFBSCxVQUFBO0lBQUFJLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUFDLFVBQUEsRUFBWSxDQUNaOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBRixHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBRSxhQUFBLEVBQWU7TUFDWCxPQUFPLEVBQUU7SUFDYjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQUgsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQUcsUUFBQSxFQUFVO01BQ04sT0FBTyxDQUFDLENBQUM7SUFDYjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBSixHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBSSxTQUFBLEVBQVc7TUFDUCxJQUFJLENBQUNDLE1BQU0sQ0FBQyxDQUFDO01BQ2IsT0FBTyxJQUFJLENBQUNULFNBQVM7SUFDekI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFHLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFNLFdBQUEsRUFBYTtNQUNULElBQUksQ0FBQ0YsUUFBUSxDQUFDLENBQUM7SUFDbkI7RUFBQztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xFaUM7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQSxJQVdxQkksU0FBUywwQkFBQUMsV0FBQTtFQUFBLFNBQUFELFVBQUE7SUFBQVgsZUFBQSxPQUFBVyxTQUFBO0lBQUEsT0FBQUUsVUFBQSxPQUFBRixTQUFBLEVBQUFHLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUFKLFNBQUEsRUFBQUMsV0FBQTtFQUFBLE9BQUFYLFlBQUEsQ0FBQVUsU0FBQTtBQUFBLEVBQVNiLG1EQUFVOzs7Ozs7Ozs7Ozs7Ozs7OytDQ1pqRCxxSkFBQWtCLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLENBQUEsU0FBQUMsQ0FBQSxFQUFBRCxDQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLEVBQUFDLENBQUEsR0FBQUgsQ0FBQSxDQUFBSSxjQUFBLEVBQUFDLENBQUEsR0FBQUosTUFBQSxDQUFBSyxjQUFBLGNBQUFQLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLElBQUFELENBQUEsQ0FBQUQsQ0FBQSxJQUFBRSxDQUFBLENBQUFoQixLQUFBLEtBQUF1QixDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxhQUFBLHVCQUFBQyxDQUFBLEdBQUFOLENBQUEsQ0FBQU8sV0FBQSw4QkFBQUMsT0FBQWhCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFDLE1BQUEsQ0FBQUssY0FBQSxDQUFBUCxDQUFBLEVBQUFELENBQUEsSUFBQWQsS0FBQSxFQUFBZ0IsQ0FBQSxFQUFBZ0IsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsU0FBQW5CLENBQUEsQ0FBQUQsQ0FBQSxXQUFBaUIsTUFBQSxtQkFBQWhCLENBQUEsSUFBQWdCLE1BQUEsWUFBQUEsT0FBQWhCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFELENBQUEsQ0FBQUQsQ0FBQSxJQUFBRSxDQUFBLGdCQUFBbUIsS0FBQXBCLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsUUFBQUksQ0FBQSxHQUFBVCxDQUFBLElBQUFBLENBQUEsQ0FBQUksU0FBQSxZQUFBa0IsU0FBQSxHQUFBdEIsQ0FBQSxHQUFBc0IsU0FBQSxFQUFBWCxDQUFBLEdBQUFSLE1BQUEsQ0FBQW9CLE1BQUEsQ0FBQWQsQ0FBQSxDQUFBTCxTQUFBLEdBQUFTLENBQUEsT0FBQVcsT0FBQSxDQUFBbkIsQ0FBQSxnQkFBQUUsQ0FBQSxDQUFBSSxDQUFBLGVBQUF6QixLQUFBLEVBQUF1QyxnQkFBQSxDQUFBeEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFXLENBQUEsTUFBQUYsQ0FBQSxhQUFBZSxTQUFBekIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsbUJBQUF5QixJQUFBLFlBQUFDLEdBQUEsRUFBQTNCLENBQUEsQ0FBQTRCLElBQUEsQ0FBQTdCLENBQUEsRUFBQUUsQ0FBQSxjQUFBRCxDQUFBLGFBQUEwQixJQUFBLFdBQUFDLEdBQUEsRUFBQTNCLENBQUEsUUFBQUQsQ0FBQSxDQUFBcUIsSUFBQSxHQUFBQSxJQUFBLE1BQUFTLENBQUEscUJBQUFDLENBQUEscUJBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFDLENBQUEsZ0JBQUFaLFVBQUEsY0FBQWEsa0JBQUEsY0FBQUMsMkJBQUEsU0FBQUMsQ0FBQSxPQUFBcEIsTUFBQSxDQUFBb0IsQ0FBQSxFQUFBMUIsQ0FBQSxxQ0FBQTJCLENBQUEsR0FBQW5DLE1BQUEsQ0FBQW9DLGNBQUEsRUFBQUMsQ0FBQSxHQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUEsQ0FBQSxDQUFBRyxNQUFBLFFBQUFELENBQUEsSUFBQUEsQ0FBQSxLQUFBdEMsQ0FBQSxJQUFBRyxDQUFBLENBQUF3QixJQUFBLENBQUFXLENBQUEsRUFBQTdCLENBQUEsTUFBQTBCLENBQUEsR0FBQUcsQ0FBQSxPQUFBRSxDQUFBLEdBQUFOLDBCQUFBLENBQUFoQyxTQUFBLEdBQUFrQixTQUFBLENBQUFsQixTQUFBLEdBQUFELE1BQUEsQ0FBQW9CLE1BQUEsQ0FBQWMsQ0FBQSxZQUFBTSxzQkFBQTFDLENBQUEsZ0NBQUEyQyxPQUFBLFdBQUE1QyxDQUFBLElBQUFpQixNQUFBLENBQUFoQixDQUFBLEVBQUFELENBQUEsWUFBQUMsQ0FBQSxnQkFBQTRDLE9BQUEsQ0FBQTdDLENBQUEsRUFBQUMsQ0FBQSxzQkFBQTZDLGNBQUE3QyxDQUFBLEVBQUFELENBQUEsYUFBQStDLE9BQUE3QyxDQUFBLEVBQUFLLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsR0FBQWEsUUFBQSxDQUFBekIsQ0FBQSxDQUFBQyxDQUFBLEdBQUFELENBQUEsRUFBQU0sQ0FBQSxtQkFBQU0sQ0FBQSxDQUFBYyxJQUFBLFFBQUFaLENBQUEsR0FBQUYsQ0FBQSxDQUFBZSxHQUFBLEVBQUFFLENBQUEsR0FBQWYsQ0FBQSxDQUFBN0IsS0FBQSxTQUFBNEMsQ0FBQSxnQkFBQWtCLE9BQUEsQ0FBQWxCLENBQUEsS0FBQXpCLENBQUEsQ0FBQXdCLElBQUEsQ0FBQUMsQ0FBQSxlQUFBOUIsQ0FBQSxDQUFBaUQsT0FBQSxDQUFBbkIsQ0FBQSxDQUFBb0IsT0FBQSxFQUFBQyxJQUFBLFdBQUFsRCxDQUFBLElBQUE4QyxNQUFBLFNBQUE5QyxDQUFBLEVBQUFRLENBQUEsRUFBQUUsQ0FBQSxnQkFBQVYsQ0FBQSxJQUFBOEMsTUFBQSxVQUFBOUMsQ0FBQSxFQUFBUSxDQUFBLEVBQUFFLENBQUEsUUFBQVgsQ0FBQSxDQUFBaUQsT0FBQSxDQUFBbkIsQ0FBQSxFQUFBcUIsSUFBQSxXQUFBbEQsQ0FBQSxJQUFBYyxDQUFBLENBQUE3QixLQUFBLEdBQUFlLENBQUEsRUFBQVEsQ0FBQSxDQUFBTSxDQUFBLGdCQUFBZCxDQUFBLFdBQUE4QyxNQUFBLFVBQUE5QyxDQUFBLEVBQUFRLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLENBQUFFLENBQUEsQ0FBQWUsR0FBQSxTQUFBMUIsQ0FBQSxFQUFBSyxDQUFBLG9CQUFBckIsS0FBQSxXQUFBQSxNQUFBZSxDQUFBLEVBQUFJLENBQUEsYUFBQStDLDJCQUFBLGVBQUFwRCxDQUFBLFdBQUFBLENBQUEsRUFBQUUsQ0FBQSxJQUFBNkMsTUFBQSxDQUFBOUMsQ0FBQSxFQUFBSSxDQUFBLEVBQUFMLENBQUEsRUFBQUUsQ0FBQSxnQkFBQUEsQ0FBQSxHQUFBQSxDQUFBLEdBQUFBLENBQUEsQ0FBQWlELElBQUEsQ0FBQUMsMEJBQUEsRUFBQUEsMEJBQUEsSUFBQUEsMEJBQUEscUJBQUEzQixpQkFBQXpCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLFFBQUFFLENBQUEsR0FBQXVCLENBQUEsbUJBQUFyQixDQUFBLEVBQUFFLENBQUEsUUFBQUosQ0FBQSxLQUFBeUIsQ0FBQSxRQUFBcUIsS0FBQSxzQ0FBQTlDLENBQUEsS0FBQTBCLENBQUEsb0JBQUF4QixDQUFBLFFBQUFFLENBQUEsV0FBQXpCLEtBQUEsRUFBQWUsQ0FBQSxFQUFBcUQsSUFBQSxlQUFBakQsQ0FBQSxDQUFBa0QsTUFBQSxHQUFBOUMsQ0FBQSxFQUFBSixDQUFBLENBQUF1QixHQUFBLEdBQUFqQixDQUFBLFVBQUFFLENBQUEsR0FBQVIsQ0FBQSxDQUFBbUQsUUFBQSxNQUFBM0MsQ0FBQSxRQUFBRSxDQUFBLEdBQUEwQyxtQkFBQSxDQUFBNUMsQ0FBQSxFQUFBUixDQUFBLE9BQUFVLENBQUEsUUFBQUEsQ0FBQSxLQUFBbUIsQ0FBQSxtQkFBQW5CLENBQUEscUJBQUFWLENBQUEsQ0FBQWtELE1BQUEsRUFBQWxELENBQUEsQ0FBQXFELElBQUEsR0FBQXJELENBQUEsQ0FBQXNELEtBQUEsR0FBQXRELENBQUEsQ0FBQXVCLEdBQUEsc0JBQUF2QixDQUFBLENBQUFrRCxNQUFBLFFBQUFoRCxDQUFBLEtBQUF1QixDQUFBLFFBQUF2QixDQUFBLEdBQUEwQixDQUFBLEVBQUE1QixDQUFBLENBQUF1QixHQUFBLEVBQUF2QixDQUFBLENBQUF1RCxpQkFBQSxDQUFBdkQsQ0FBQSxDQUFBdUIsR0FBQSx1QkFBQXZCLENBQUEsQ0FBQWtELE1BQUEsSUFBQWxELENBQUEsQ0FBQXdELE1BQUEsV0FBQXhELENBQUEsQ0FBQXVCLEdBQUEsR0FBQXJCLENBQUEsR0FBQXlCLENBQUEsTUFBQUssQ0FBQSxHQUFBWCxRQUFBLENBQUExQixDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxvQkFBQWdDLENBQUEsQ0FBQVYsSUFBQSxRQUFBcEIsQ0FBQSxHQUFBRixDQUFBLENBQUFpRCxJQUFBLEdBQUFyQixDQUFBLEdBQUFGLENBQUEsRUFBQU0sQ0FBQSxDQUFBVCxHQUFBLEtBQUFNLENBQUEscUJBQUFoRCxLQUFBLEVBQUFtRCxDQUFBLENBQUFULEdBQUEsRUFBQTBCLElBQUEsRUFBQWpELENBQUEsQ0FBQWlELElBQUEsa0JBQUFqQixDQUFBLENBQUFWLElBQUEsS0FBQXBCLENBQUEsR0FBQTBCLENBQUEsRUFBQTVCLENBQUEsQ0FBQWtELE1BQUEsWUFBQWxELENBQUEsQ0FBQXVCLEdBQUEsR0FBQVMsQ0FBQSxDQUFBVCxHQUFBLG1CQUFBNkIsb0JBQUF6RCxDQUFBLEVBQUFFLENBQUEsUUFBQUcsQ0FBQSxHQUFBSCxDQUFBLENBQUFxRCxNQUFBLEVBQUFoRCxDQUFBLEdBQUFQLENBQUEsQ0FBQVksUUFBQSxDQUFBUCxDQUFBLE9BQUFFLENBQUEsS0FBQU4sQ0FBQSxTQUFBQyxDQUFBLENBQUFzRCxRQUFBLHFCQUFBbkQsQ0FBQSxJQUFBTCxDQUFBLENBQUFZLFFBQUEsZUFBQVYsQ0FBQSxDQUFBcUQsTUFBQSxhQUFBckQsQ0FBQSxDQUFBMEIsR0FBQSxHQUFBM0IsQ0FBQSxFQUFBd0QsbUJBQUEsQ0FBQXpELENBQUEsRUFBQUUsQ0FBQSxlQUFBQSxDQUFBLENBQUFxRCxNQUFBLGtCQUFBbEQsQ0FBQSxLQUFBSCxDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEwQixHQUFBLE9BQUFrQyxTQUFBLHVDQUFBekQsQ0FBQSxpQkFBQTZCLENBQUEsTUFBQXpCLENBQUEsR0FBQWlCLFFBQUEsQ0FBQW5CLENBQUEsRUFBQVAsQ0FBQSxDQUFBWSxRQUFBLEVBQUFWLENBQUEsQ0FBQTBCLEdBQUEsbUJBQUFuQixDQUFBLENBQUFrQixJQUFBLFNBQUF6QixDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEwQixHQUFBLEdBQUFuQixDQUFBLENBQUFtQixHQUFBLEVBQUExQixDQUFBLENBQUFzRCxRQUFBLFNBQUF0QixDQUFBLE1BQUF2QixDQUFBLEdBQUFGLENBQUEsQ0FBQW1CLEdBQUEsU0FBQWpCLENBQUEsR0FBQUEsQ0FBQSxDQUFBMkMsSUFBQSxJQUFBcEQsQ0FBQSxDQUFBRixDQUFBLENBQUErRCxVQUFBLElBQUFwRCxDQUFBLENBQUF6QixLQUFBLEVBQUFnQixDQUFBLENBQUE4RCxJQUFBLEdBQUFoRSxDQUFBLENBQUFpRSxPQUFBLGVBQUEvRCxDQUFBLENBQUFxRCxNQUFBLEtBQUFyRCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEwQixHQUFBLEdBQUEzQixDQUFBLEdBQUFDLENBQUEsQ0FBQXNELFFBQUEsU0FBQXRCLENBQUEsSUFBQXZCLENBQUEsSUFBQVQsQ0FBQSxDQUFBcUQsTUFBQSxZQUFBckQsQ0FBQSxDQUFBMEIsR0FBQSxPQUFBa0MsU0FBQSxzQ0FBQTVELENBQUEsQ0FBQXNELFFBQUEsU0FBQXRCLENBQUEsY0FBQWdDLGFBQUFqRSxDQUFBLFFBQUFELENBQUEsS0FBQW1FLE1BQUEsRUFBQWxFLENBQUEsWUFBQUEsQ0FBQSxLQUFBRCxDQUFBLENBQUFvRSxRQUFBLEdBQUFuRSxDQUFBLFdBQUFBLENBQUEsS0FBQUQsQ0FBQSxDQUFBcUUsVUFBQSxHQUFBcEUsQ0FBQSxLQUFBRCxDQUFBLENBQUFzRSxRQUFBLEdBQUFyRSxDQUFBLFdBQUFzRSxVQUFBLENBQUFDLElBQUEsQ0FBQXhFLENBQUEsY0FBQXlFLGNBQUF4RSxDQUFBLFFBQUFELENBQUEsR0FBQUMsQ0FBQSxDQUFBeUUsVUFBQSxRQUFBMUUsQ0FBQSxDQUFBMkIsSUFBQSxvQkFBQTNCLENBQUEsQ0FBQTRCLEdBQUEsRUFBQTNCLENBQUEsQ0FBQXlFLFVBQUEsR0FBQTFFLENBQUEsYUFBQXdCLFFBQUF2QixDQUFBLFNBQUFzRSxVQUFBLE1BQUFKLE1BQUEsYUFBQWxFLENBQUEsQ0FBQTJDLE9BQUEsQ0FBQXNCLFlBQUEsY0FBQVMsS0FBQSxpQkFBQWxDLE9BQUF6QyxDQUFBLFFBQUFBLENBQUEsV0FBQUEsQ0FBQSxRQUFBRSxDQUFBLEdBQUFGLENBQUEsQ0FBQVcsQ0FBQSxPQUFBVCxDQUFBLFNBQUFBLENBQUEsQ0FBQTJCLElBQUEsQ0FBQTdCLENBQUEsNEJBQUFBLENBQUEsQ0FBQWdFLElBQUEsU0FBQWhFLENBQUEsT0FBQTRFLEtBQUEsQ0FBQTVFLENBQUEsQ0FBQTZFLE1BQUEsU0FBQXRFLENBQUEsT0FBQUUsQ0FBQSxZQUFBdUQsS0FBQSxhQUFBekQsQ0FBQSxHQUFBUCxDQUFBLENBQUE2RSxNQUFBLE9BQUF4RSxDQUFBLENBQUF3QixJQUFBLENBQUE3QixDQUFBLEVBQUFPLENBQUEsVUFBQXlELElBQUEsQ0FBQTlFLEtBQUEsR0FBQWMsQ0FBQSxDQUFBTyxDQUFBLEdBQUF5RCxJQUFBLENBQUFWLElBQUEsT0FBQVUsSUFBQSxTQUFBQSxJQUFBLENBQUE5RSxLQUFBLEdBQUFlLENBQUEsRUFBQStELElBQUEsQ0FBQVYsSUFBQSxPQUFBVSxJQUFBLFlBQUF2RCxDQUFBLENBQUF1RCxJQUFBLEdBQUF2RCxDQUFBLGdCQUFBcUQsU0FBQSxDQUFBZCxPQUFBLENBQUFoRCxDQUFBLGtDQUFBbUMsaUJBQUEsQ0FBQS9CLFNBQUEsR0FBQWdDLDBCQUFBLEVBQUE3QixDQUFBLENBQUFtQyxDQUFBLG1CQUFBeEQsS0FBQSxFQUFBa0QsMEJBQUEsRUFBQWpCLFlBQUEsU0FBQVosQ0FBQSxDQUFBNkIsMEJBQUEsbUJBQUFsRCxLQUFBLEVBQUFpRCxpQkFBQSxFQUFBaEIsWUFBQSxTQUFBZ0IsaUJBQUEsQ0FBQTJDLFdBQUEsR0FBQTdELE1BQUEsQ0FBQW1CLDBCQUFBLEVBQUFyQixDQUFBLHdCQUFBZixDQUFBLENBQUErRSxtQkFBQSxhQUFBOUUsQ0FBQSxRQUFBRCxDQUFBLHdCQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQStFLFdBQUEsV0FBQWhGLENBQUEsS0FBQUEsQ0FBQSxLQUFBbUMsaUJBQUEsNkJBQUFuQyxDQUFBLENBQUE4RSxXQUFBLElBQUE5RSxDQUFBLENBQUFpRixJQUFBLE9BQUFqRixDQUFBLENBQUFrRixJQUFBLGFBQUFqRixDQUFBLFdBQUFFLE1BQUEsQ0FBQWdGLGNBQUEsR0FBQWhGLE1BQUEsQ0FBQWdGLGNBQUEsQ0FBQWxGLENBQUEsRUFBQW1DLDBCQUFBLEtBQUFuQyxDQUFBLENBQUFtRixTQUFBLEdBQUFoRCwwQkFBQSxFQUFBbkIsTUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLHlCQUFBZCxDQUFBLENBQUFHLFNBQUEsR0FBQUQsTUFBQSxDQUFBb0IsTUFBQSxDQUFBbUIsQ0FBQSxHQUFBekMsQ0FBQSxLQUFBRCxDQUFBLENBQUFxRixLQUFBLGFBQUFwRixDQUFBLGFBQUFpRCxPQUFBLEVBQUFqRCxDQUFBLE9BQUEwQyxxQkFBQSxDQUFBRyxhQUFBLENBQUExQyxTQUFBLEdBQUFhLE1BQUEsQ0FBQTZCLGFBQUEsQ0FBQTFDLFNBQUEsRUFBQVMsQ0FBQSxpQ0FBQWIsQ0FBQSxDQUFBOEMsYUFBQSxHQUFBQSxhQUFBLEVBQUE5QyxDQUFBLENBQUFzRixLQUFBLGFBQUFyRixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsZUFBQUEsQ0FBQSxLQUFBQSxDQUFBLEdBQUE4RSxPQUFBLE9BQUE1RSxDQUFBLE9BQUFtQyxhQUFBLENBQUF6QixJQUFBLENBQUFwQixDQUFBLEVBQUFDLENBQUEsRUFBQUcsQ0FBQSxFQUFBRSxDQUFBLEdBQUFFLENBQUEsVUFBQVQsQ0FBQSxDQUFBK0UsbUJBQUEsQ0FBQTdFLENBQUEsSUFBQVMsQ0FBQSxHQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFiLElBQUEsV0FBQWxELENBQUEsV0FBQUEsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBZixLQUFBLEdBQUF5QixDQUFBLENBQUFxRCxJQUFBLFdBQUFyQixxQkFBQSxDQUFBRCxDQUFBLEdBQUF6QixNQUFBLENBQUF5QixDQUFBLEVBQUEzQixDQUFBLGdCQUFBRSxNQUFBLENBQUF5QixDQUFBLEVBQUEvQixDQUFBLGlDQUFBTSxNQUFBLENBQUF5QixDQUFBLDZEQUFBMUMsQ0FBQSxDQUFBd0YsSUFBQSxhQUFBdkYsQ0FBQSxRQUFBRCxDQUFBLEdBQUFHLE1BQUEsQ0FBQUYsQ0FBQSxHQUFBQyxDQUFBLGdCQUFBRyxDQUFBLElBQUFMLENBQUEsRUFBQUUsQ0FBQSxDQUFBc0UsSUFBQSxDQUFBbkUsQ0FBQSxVQUFBSCxDQUFBLENBQUF1RixPQUFBLGFBQUF6QixLQUFBLFdBQUE5RCxDQUFBLENBQUEyRSxNQUFBLFNBQUE1RSxDQUFBLEdBQUFDLENBQUEsQ0FBQXdGLEdBQUEsUUFBQXpGLENBQUEsSUFBQUQsQ0FBQSxTQUFBZ0UsSUFBQSxDQUFBOUUsS0FBQSxHQUFBZSxDQUFBLEVBQUErRCxJQUFBLENBQUFWLElBQUEsT0FBQVUsSUFBQSxXQUFBQSxJQUFBLENBQUFWLElBQUEsT0FBQVUsSUFBQSxRQUFBaEUsQ0FBQSxDQUFBeUMsTUFBQSxHQUFBQSxNQUFBLEVBQUFqQixPQUFBLENBQUFwQixTQUFBLEtBQUE0RSxXQUFBLEVBQUF4RCxPQUFBLEVBQUFtRCxLQUFBLFdBQUFBLE1BQUEzRSxDQUFBLGFBQUEyRixJQUFBLFdBQUEzQixJQUFBLFdBQUFOLElBQUEsUUFBQUMsS0FBQSxHQUFBMUQsQ0FBQSxPQUFBcUQsSUFBQSxZQUFBRSxRQUFBLGNBQUFELE1BQUEsZ0JBQUEzQixHQUFBLEdBQUEzQixDQUFBLE9BQUFzRSxVQUFBLENBQUEzQixPQUFBLENBQUE2QixhQUFBLElBQUF6RSxDQUFBLFdBQUFFLENBQUEsa0JBQUFBLENBQUEsQ0FBQTBGLE1BQUEsT0FBQXZGLENBQUEsQ0FBQXdCLElBQUEsT0FBQTNCLENBQUEsTUFBQTBFLEtBQUEsRUFBQTFFLENBQUEsQ0FBQTJGLEtBQUEsY0FBQTNGLENBQUEsSUFBQUQsQ0FBQSxNQUFBNkYsSUFBQSxXQUFBQSxLQUFBLFNBQUF4QyxJQUFBLFdBQUFyRCxDQUFBLFFBQUFzRSxVQUFBLElBQUFHLFVBQUEsa0JBQUF6RSxDQUFBLENBQUEwQixJQUFBLFFBQUExQixDQUFBLENBQUEyQixHQUFBLGNBQUFtRSxJQUFBLEtBQUFuQyxpQkFBQSxXQUFBQSxrQkFBQTVELENBQUEsYUFBQXNELElBQUEsUUFBQXRELENBQUEsTUFBQUUsQ0FBQSxrQkFBQThGLE9BQUEzRixDQUFBLEVBQUFFLENBQUEsV0FBQUksQ0FBQSxDQUFBZ0IsSUFBQSxZQUFBaEIsQ0FBQSxDQUFBaUIsR0FBQSxHQUFBNUIsQ0FBQSxFQUFBRSxDQUFBLENBQUE4RCxJQUFBLEdBQUEzRCxDQUFBLEVBQUFFLENBQUEsS0FBQUwsQ0FBQSxDQUFBcUQsTUFBQSxXQUFBckQsQ0FBQSxDQUFBMEIsR0FBQSxHQUFBM0IsQ0FBQSxLQUFBTSxDQUFBLGFBQUFBLENBQUEsUUFBQWdFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBdEUsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQThELFVBQUEsQ0FBQWhFLENBQUEsR0FBQUksQ0FBQSxHQUFBRixDQUFBLENBQUFpRSxVQUFBLGlCQUFBakUsQ0FBQSxDQUFBMEQsTUFBQSxTQUFBNkIsTUFBQSxhQUFBdkYsQ0FBQSxDQUFBMEQsTUFBQSxTQUFBd0IsSUFBQSxRQUFBOUUsQ0FBQSxHQUFBUixDQUFBLENBQUF3QixJQUFBLENBQUFwQixDQUFBLGVBQUFNLENBQUEsR0FBQVYsQ0FBQSxDQUFBd0IsSUFBQSxDQUFBcEIsQ0FBQSxxQkFBQUksQ0FBQSxJQUFBRSxDQUFBLGFBQUE0RSxJQUFBLEdBQUFsRixDQUFBLENBQUEyRCxRQUFBLFNBQUE0QixNQUFBLENBQUF2RixDQUFBLENBQUEyRCxRQUFBLGdCQUFBdUIsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBNEQsVUFBQSxTQUFBMkIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBNEQsVUFBQSxjQUFBeEQsQ0FBQSxhQUFBOEUsSUFBQSxHQUFBbEYsQ0FBQSxDQUFBMkQsUUFBQSxTQUFBNEIsTUFBQSxDQUFBdkYsQ0FBQSxDQUFBMkQsUUFBQSxxQkFBQXJELENBQUEsUUFBQXNDLEtBQUEscURBQUFzQyxJQUFBLEdBQUFsRixDQUFBLENBQUE0RCxVQUFBLFNBQUEyQixNQUFBLENBQUF2RixDQUFBLENBQUE0RCxVQUFBLFlBQUFSLE1BQUEsV0FBQUEsT0FBQTVELENBQUEsRUFBQUQsQ0FBQSxhQUFBRSxDQUFBLFFBQUFxRSxVQUFBLENBQUFNLE1BQUEsTUFBQTNFLENBQUEsU0FBQUEsQ0FBQSxRQUFBSyxDQUFBLFFBQUFnRSxVQUFBLENBQUFyRSxDQUFBLE9BQUFLLENBQUEsQ0FBQTRELE1BQUEsU0FBQXdCLElBQUEsSUFBQXRGLENBQUEsQ0FBQXdCLElBQUEsQ0FBQXRCLENBQUEsd0JBQUFvRixJQUFBLEdBQUFwRixDQUFBLENBQUE4RCxVQUFBLFFBQUE1RCxDQUFBLEdBQUFGLENBQUEsYUFBQUUsQ0FBQSxpQkFBQVIsQ0FBQSxtQkFBQUEsQ0FBQSxLQUFBUSxDQUFBLENBQUEwRCxNQUFBLElBQUFuRSxDQUFBLElBQUFBLENBQUEsSUFBQVMsQ0FBQSxDQUFBNEQsVUFBQSxLQUFBNUQsQ0FBQSxjQUFBRSxDQUFBLEdBQUFGLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUUsVUFBQSxjQUFBL0QsQ0FBQSxDQUFBZ0IsSUFBQSxHQUFBMUIsQ0FBQSxFQUFBVSxDQUFBLENBQUFpQixHQUFBLEdBQUE1QixDQUFBLEVBQUFTLENBQUEsU0FBQThDLE1BQUEsZ0JBQUFTLElBQUEsR0FBQXZELENBQUEsQ0FBQTRELFVBQUEsRUFBQW5DLENBQUEsU0FBQStELFFBQUEsQ0FBQXRGLENBQUEsTUFBQXNGLFFBQUEsV0FBQUEsU0FBQWhHLENBQUEsRUFBQUQsQ0FBQSxvQkFBQUMsQ0FBQSxDQUFBMEIsSUFBQSxRQUFBMUIsQ0FBQSxDQUFBMkIsR0FBQSxxQkFBQTNCLENBQUEsQ0FBQTBCLElBQUEsbUJBQUExQixDQUFBLENBQUEwQixJQUFBLFFBQUFxQyxJQUFBLEdBQUEvRCxDQUFBLENBQUEyQixHQUFBLGdCQUFBM0IsQ0FBQSxDQUFBMEIsSUFBQSxTQUFBb0UsSUFBQSxRQUFBbkUsR0FBQSxHQUFBM0IsQ0FBQSxDQUFBMkIsR0FBQSxPQUFBMkIsTUFBQSxrQkFBQVMsSUFBQSx5QkFBQS9ELENBQUEsQ0FBQTBCLElBQUEsSUFBQTNCLENBQUEsVUFBQWdFLElBQUEsR0FBQWhFLENBQUEsR0FBQWtDLENBQUEsS0FBQWdFLE1BQUEsV0FBQUEsT0FBQWpHLENBQUEsYUFBQUQsQ0FBQSxRQUFBdUUsVUFBQSxDQUFBTSxNQUFBLE1BQUE3RSxDQUFBLFNBQUFBLENBQUEsUUFBQUUsQ0FBQSxRQUFBcUUsVUFBQSxDQUFBdkUsQ0FBQSxPQUFBRSxDQUFBLENBQUFtRSxVQUFBLEtBQUFwRSxDQUFBLGNBQUFnRyxRQUFBLENBQUEvRixDQUFBLENBQUF3RSxVQUFBLEVBQUF4RSxDQUFBLENBQUFvRSxRQUFBLEdBQUFHLGFBQUEsQ0FBQXZFLENBQUEsR0FBQWdDLENBQUEseUJBQUFpRSxPQUFBbEcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF1RSxVQUFBLENBQUFNLE1BQUEsTUFBQTdFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFxRSxVQUFBLENBQUF2RSxDQUFBLE9BQUFFLENBQUEsQ0FBQWlFLE1BQUEsS0FBQWxFLENBQUEsUUFBQUksQ0FBQSxHQUFBSCxDQUFBLENBQUF3RSxVQUFBLGtCQUFBckUsQ0FBQSxDQUFBc0IsSUFBQSxRQUFBcEIsQ0FBQSxHQUFBRixDQUFBLENBQUF1QixHQUFBLEVBQUE2QyxhQUFBLENBQUF2RSxDQUFBLFlBQUFLLENBQUEsWUFBQThDLEtBQUEsOEJBQUErQyxhQUFBLFdBQUFBLGNBQUFwRyxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxnQkFBQW1ELFFBQUEsS0FBQTVDLFFBQUEsRUFBQTZCLE1BQUEsQ0FBQXpDLENBQUEsR0FBQStELFVBQUEsRUFBQTdELENBQUEsRUFBQStELE9BQUEsRUFBQTVELENBQUEsb0JBQUFrRCxNQUFBLFVBQUEzQixHQUFBLEdBQUEzQixDQUFBLEdBQUFpQyxDQUFBLE9BQUFsQyxDQUFBO0FBQUEsU0FBQXFHLG1CQUFBaEcsQ0FBQSxFQUFBSixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxFQUFBSyxDQUFBLEVBQUFJLENBQUEsRUFBQUUsQ0FBQSxjQUFBSixDQUFBLEdBQUFKLENBQUEsQ0FBQU0sQ0FBQSxFQUFBRSxDQUFBLEdBQUFFLENBQUEsR0FBQU4sQ0FBQSxDQUFBdkIsS0FBQSxXQUFBbUIsQ0FBQSxnQkFBQUwsQ0FBQSxDQUFBSyxDQUFBLEtBQUFJLENBQUEsQ0FBQTZDLElBQUEsR0FBQXJELENBQUEsQ0FBQWMsQ0FBQSxJQUFBd0UsT0FBQSxDQUFBdEMsT0FBQSxDQUFBbEMsQ0FBQSxFQUFBb0MsSUFBQSxDQUFBakQsQ0FBQSxFQUFBSyxDQUFBO0FBQUEsU0FBQStGLGtCQUFBakcsQ0FBQSw2QkFBQUosQ0FBQSxTQUFBRCxDQUFBLEdBQUFILFNBQUEsYUFBQTBGLE9BQUEsV0FBQXJGLENBQUEsRUFBQUssQ0FBQSxRQUFBSSxDQUFBLEdBQUFOLENBQUEsQ0FBQWtHLEtBQUEsQ0FBQXRHLENBQUEsRUFBQUQsQ0FBQSxZQUFBd0csTUFBQW5HLENBQUEsSUFBQWdHLGtCQUFBLENBQUExRixDQUFBLEVBQUFULENBQUEsRUFBQUssQ0FBQSxFQUFBaUcsS0FBQSxFQUFBQyxNQUFBLFVBQUFwRyxDQUFBLGNBQUFvRyxPQUFBcEcsQ0FBQSxJQUFBZ0csa0JBQUEsQ0FBQTFGLENBQUEsRUFBQVQsQ0FBQSxFQUFBSyxDQUFBLEVBQUFpRyxLQUFBLEVBQUFDLE1BQUEsV0FBQXBHLENBQUEsS0FBQW1HLEtBQUE7QUFBQSxTQUFBRSxlQUFBeEcsQ0FBQSxFQUFBRixDQUFBLFdBQUEyRyxlQUFBLENBQUF6RyxDQUFBLEtBQUEwRyxxQkFBQSxDQUFBMUcsQ0FBQSxFQUFBRixDQUFBLEtBQUE2RywyQkFBQSxDQUFBM0csQ0FBQSxFQUFBRixDQUFBLEtBQUE4RyxnQkFBQTtBQUFBLFNBQUFBLGlCQUFBLGNBQUFoRCxTQUFBO0FBQUEsU0FBQStDLDRCQUFBM0csQ0FBQSxFQUFBUyxDQUFBLFFBQUFULENBQUEsMkJBQUFBLENBQUEsU0FBQTZHLGlCQUFBLENBQUE3RyxDQUFBLEVBQUFTLENBQUEsT0FBQVYsQ0FBQSxNQUFBK0csUUFBQSxDQUFBbkYsSUFBQSxDQUFBM0IsQ0FBQSxFQUFBMkYsS0FBQSw2QkFBQTVGLENBQUEsSUFBQUMsQ0FBQSxDQUFBOEUsV0FBQSxLQUFBL0UsQ0FBQSxHQUFBQyxDQUFBLENBQUE4RSxXQUFBLENBQUFDLElBQUEsYUFBQWhGLENBQUEsY0FBQUEsQ0FBQSxHQUFBZ0gsS0FBQSxDQUFBQyxJQUFBLENBQUFoSCxDQUFBLG9CQUFBRCxDQUFBLCtDQUFBa0gsSUFBQSxDQUFBbEgsQ0FBQSxJQUFBOEcsaUJBQUEsQ0FBQTdHLENBQUEsRUFBQVMsQ0FBQTtBQUFBLFNBQUFvRyxrQkFBQTdHLENBQUEsRUFBQVMsQ0FBQSxhQUFBQSxDQUFBLElBQUFBLENBQUEsR0FBQVQsQ0FBQSxDQUFBMkUsTUFBQSxNQUFBbEUsQ0FBQSxHQUFBVCxDQUFBLENBQUEyRSxNQUFBLFlBQUE3RSxDQUFBLE1BQUFLLENBQUEsR0FBQTRHLEtBQUEsQ0FBQXRHLENBQUEsR0FBQVgsQ0FBQSxHQUFBVyxDQUFBLEVBQUFYLENBQUEsSUFBQUssQ0FBQSxDQUFBTCxDQUFBLElBQUFFLENBQUEsQ0FBQUYsQ0FBQSxVQUFBSyxDQUFBO0FBQUEsU0FBQXVHLHNCQUFBMUcsQ0FBQSxFQUFBNkIsQ0FBQSxRQUFBOUIsQ0FBQSxXQUFBQyxDQUFBLGdDQUFBUSxNQUFBLElBQUFSLENBQUEsQ0FBQVEsTUFBQSxDQUFBRSxRQUFBLEtBQUFWLENBQUEsNEJBQUFELENBQUEsUUFBQUQsQ0FBQSxFQUFBSyxDQUFBLEVBQUFJLENBQUEsRUFBQU0sQ0FBQSxFQUFBSixDQUFBLE9BQUFxQixDQUFBLE9BQUF6QixDQUFBLGlCQUFBRSxDQUFBLElBQUFSLENBQUEsR0FBQUEsQ0FBQSxDQUFBNEIsSUFBQSxDQUFBM0IsQ0FBQSxHQUFBOEQsSUFBQSxRQUFBakMsQ0FBQSxRQUFBNUIsTUFBQSxDQUFBRixDQUFBLE1BQUFBLENBQUEsVUFBQStCLENBQUEsdUJBQUFBLENBQUEsSUFBQWhDLENBQUEsR0FBQVMsQ0FBQSxDQUFBb0IsSUFBQSxDQUFBNUIsQ0FBQSxHQUFBcUQsSUFBQSxNQUFBM0MsQ0FBQSxDQUFBNkQsSUFBQSxDQUFBeEUsQ0FBQSxDQUFBZCxLQUFBLEdBQUF5QixDQUFBLENBQUFrRSxNQUFBLEtBQUE5QyxDQUFBLEdBQUFDLENBQUEsaUJBQUE5QixDQUFBLElBQUFLLENBQUEsT0FBQUYsQ0FBQSxHQUFBSCxDQUFBLHlCQUFBOEIsQ0FBQSxZQUFBL0IsQ0FBQSxlQUFBYyxDQUFBLEdBQUFkLENBQUEsY0FBQUUsTUFBQSxDQUFBWSxDQUFBLE1BQUFBLENBQUEsMkJBQUFSLENBQUEsUUFBQUYsQ0FBQSxhQUFBTSxDQUFBO0FBQUEsU0FBQWdHLGdCQUFBekcsQ0FBQSxRQUFBK0csS0FBQSxDQUFBRyxPQUFBLENBQUFsSCxDQUFBLFVBQUFBLENBQUE7QUFBQSxTQUFBbUgsUUFBQXJILENBQUEsRUFBQUUsQ0FBQSxRQUFBRCxDQUFBLEdBQUFFLE1BQUEsQ0FBQXFGLElBQUEsQ0FBQXhGLENBQUEsT0FBQUcsTUFBQSxDQUFBbUgscUJBQUEsUUFBQS9HLENBQUEsR0FBQUosTUFBQSxDQUFBbUgscUJBQUEsQ0FBQXRILENBQUEsR0FBQUUsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQWdILE1BQUEsV0FBQXJILENBQUEsV0FBQUMsTUFBQSxDQUFBcUgsd0JBQUEsQ0FBQXhILENBQUEsRUFBQUUsQ0FBQSxFQUFBZ0IsVUFBQSxPQUFBakIsQ0FBQSxDQUFBdUUsSUFBQSxDQUFBK0IsS0FBQSxDQUFBdEcsQ0FBQSxFQUFBTSxDQUFBLFlBQUFOLENBQUE7QUFBQSxTQUFBd0gsY0FBQXpILENBQUEsYUFBQUUsQ0FBQSxNQUFBQSxDQUFBLEdBQUFMLFNBQUEsQ0FBQWdGLE1BQUEsRUFBQTNFLENBQUEsVUFBQUQsQ0FBQSxXQUFBSixTQUFBLENBQUFLLENBQUEsSUFBQUwsU0FBQSxDQUFBSyxDQUFBLFFBQUFBLENBQUEsT0FBQW1ILE9BQUEsQ0FBQWxILE1BQUEsQ0FBQUYsQ0FBQSxPQUFBMkMsT0FBQSxXQUFBMUMsQ0FBQSxJQUFBd0gsZUFBQSxDQUFBMUgsQ0FBQSxFQUFBRSxDQUFBLEVBQUFELENBQUEsQ0FBQUMsQ0FBQSxTQUFBQyxNQUFBLENBQUF3SCx5QkFBQSxHQUFBeEgsTUFBQSxDQUFBeUgsZ0JBQUEsQ0FBQTVILENBQUEsRUFBQUcsTUFBQSxDQUFBd0gseUJBQUEsQ0FBQTFILENBQUEsS0FBQW9ILE9BQUEsQ0FBQWxILE1BQUEsQ0FBQUYsQ0FBQSxHQUFBMkMsT0FBQSxXQUFBMUMsQ0FBQSxJQUFBQyxNQUFBLENBQUFLLGNBQUEsQ0FBQVIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFDLE1BQUEsQ0FBQXFILHdCQUFBLENBQUF2SCxDQUFBLEVBQUFDLENBQUEsaUJBQUFGLENBQUE7QUFBQSxTQUFBMEgsZ0JBQUExSCxDQUFBLEVBQUFFLENBQUEsRUFBQUQsQ0FBQSxZQUFBQyxDQUFBLEdBQUEySCxjQUFBLENBQUEzSCxDQUFBLE1BQUFGLENBQUEsR0FBQUcsTUFBQSxDQUFBSyxjQUFBLENBQUFSLENBQUEsRUFBQUUsQ0FBQSxJQUFBaEIsS0FBQSxFQUFBZSxDQUFBLEVBQUFpQixVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxVQUFBcEIsQ0FBQSxDQUFBRSxDQUFBLElBQUFELENBQUEsRUFBQUQsQ0FBQTtBQUFBLFNBQUFnRCxRQUFBekMsQ0FBQSxzQ0FBQXlDLE9BQUEsd0JBQUF0QyxNQUFBLHVCQUFBQSxNQUFBLENBQUFFLFFBQUEsYUFBQUwsQ0FBQSxrQkFBQUEsQ0FBQSxnQkFBQUEsQ0FBQSxXQUFBQSxDQUFBLHlCQUFBRyxNQUFBLElBQUFILENBQUEsQ0FBQXlFLFdBQUEsS0FBQXRFLE1BQUEsSUFBQUgsQ0FBQSxLQUFBRyxNQUFBLENBQUFOLFNBQUEscUJBQUFHLENBQUEsS0FBQXlDLE9BQUEsQ0FBQXpDLENBQUE7QUFBQSxTQUFBeEIsZ0JBQUE0QixDQUFBLEVBQUFOLENBQUEsVUFBQU0sQ0FBQSxZQUFBTixDQUFBLGFBQUF5RCxTQUFBO0FBQUEsU0FBQWdFLGtCQUFBOUgsQ0FBQSxFQUFBRSxDQUFBLGFBQUFELENBQUEsTUFBQUEsQ0FBQSxHQUFBQyxDQUFBLENBQUEyRSxNQUFBLEVBQUE1RSxDQUFBLFVBQUFNLENBQUEsR0FBQUwsQ0FBQSxDQUFBRCxDQUFBLEdBQUFNLENBQUEsQ0FBQVcsVUFBQSxHQUFBWCxDQUFBLENBQUFXLFVBQUEsUUFBQVgsQ0FBQSxDQUFBWSxZQUFBLGtCQUFBWixDQUFBLEtBQUFBLENBQUEsQ0FBQWEsUUFBQSxRQUFBakIsTUFBQSxDQUFBSyxjQUFBLENBQUFSLENBQUEsRUFBQTZILGNBQUEsQ0FBQXRILENBQUEsQ0FBQXRCLEdBQUEsR0FBQXNCLENBQUE7QUFBQSxTQUFBdkIsYUFBQWdCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRCxDQUFBLFdBQUFDLENBQUEsSUFBQTRILGlCQUFBLENBQUE5SCxDQUFBLENBQUFJLFNBQUEsRUFBQUYsQ0FBQSxHQUFBRCxDQUFBLElBQUE2SCxpQkFBQSxDQUFBOUgsQ0FBQSxFQUFBQyxDQUFBLEdBQUFFLE1BQUEsQ0FBQUssY0FBQSxDQUFBUixDQUFBLGlCQUFBb0IsUUFBQSxTQUFBcEIsQ0FBQTtBQUFBLFNBQUE2SCxlQUFBNUgsQ0FBQSxRQUFBUSxDQUFBLEdBQUFzSCxZQUFBLENBQUE5SCxDQUFBLGdDQUFBK0MsT0FBQSxDQUFBdkMsQ0FBQSxJQUFBQSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBc0gsYUFBQTlILENBQUEsRUFBQUMsQ0FBQSxvQkFBQThDLE9BQUEsQ0FBQS9DLENBQUEsTUFBQUEsQ0FBQSxTQUFBQSxDQUFBLE1BQUFELENBQUEsR0FBQUMsQ0FBQSxDQUFBUyxNQUFBLENBQUFzSCxXQUFBLGtCQUFBaEksQ0FBQSxRQUFBUyxDQUFBLEdBQUFULENBQUEsQ0FBQTZCLElBQUEsQ0FBQTVCLENBQUEsRUFBQUMsQ0FBQSxnQ0FBQThDLE9BQUEsQ0FBQXZDLENBQUEsVUFBQUEsQ0FBQSxZQUFBcUQsU0FBQSx5RUFBQTVELENBQUEsR0FBQStILE1BQUEsR0FBQUMsTUFBQSxFQUFBakksQ0FBQTtBQUFBLFNBQUFMLFdBQUFLLENBQUEsRUFBQU0sQ0FBQSxFQUFBUCxDQUFBLFdBQUFPLENBQUEsR0FBQTRILGVBQUEsQ0FBQTVILENBQUEsR0FBQTZILDBCQUFBLENBQUFuSSxDQUFBLEVBQUFvSSx5QkFBQSxLQUFBQyxPQUFBLENBQUFuSixTQUFBLENBQUFvQixDQUFBLEVBQUFQLENBQUEsUUFBQW1JLGVBQUEsQ0FBQWxJLENBQUEsRUFBQStFLFdBQUEsSUFBQXpFLENBQUEsQ0FBQWdHLEtBQUEsQ0FBQXRHLENBQUEsRUFBQUQsQ0FBQTtBQUFBLFNBQUFvSSwyQkFBQW5JLENBQUEsRUFBQUQsQ0FBQSxRQUFBQSxDQUFBLGlCQUFBZ0QsT0FBQSxDQUFBaEQsQ0FBQSwwQkFBQUEsQ0FBQSxVQUFBQSxDQUFBLGlCQUFBQSxDQUFBLFlBQUE4RCxTQUFBLHFFQUFBeUUsc0JBQUEsQ0FBQXRJLENBQUE7QUFBQSxTQUFBc0ksdUJBQUF2SSxDQUFBLG1CQUFBQSxDQUFBLFlBQUF3SSxjQUFBLHNFQUFBeEksQ0FBQTtBQUFBLFNBQUFxSSwwQkFBQSxjQUFBcEksQ0FBQSxJQUFBd0ksT0FBQSxDQUFBckksU0FBQSxDQUFBc0ksT0FBQSxDQUFBN0csSUFBQSxDQUFBeUcsT0FBQSxDQUFBbkosU0FBQSxDQUFBc0osT0FBQSxpQ0FBQXhJLENBQUEsYUFBQW9JLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUFwSSxDQUFBO0FBQUEsU0FBQWtJLGdCQUFBbEksQ0FBQSxXQUFBa0ksZUFBQSxHQUFBaEksTUFBQSxDQUFBZ0YsY0FBQSxHQUFBaEYsTUFBQSxDQUFBb0MsY0FBQSxDQUFBb0csSUFBQSxlQUFBMUksQ0FBQSxXQUFBQSxDQUFBLENBQUFtRixTQUFBLElBQUFqRixNQUFBLENBQUFvQyxjQUFBLENBQUF0QyxDQUFBLE1BQUFrSSxlQUFBLENBQUFsSSxDQUFBO0FBQUEsU0FBQUgsVUFBQUcsQ0FBQSxFQUFBRCxDQUFBLDZCQUFBQSxDQUFBLGFBQUFBLENBQUEsWUFBQThELFNBQUEsd0RBQUE3RCxDQUFBLENBQUFHLFNBQUEsR0FBQUQsTUFBQSxDQUFBb0IsTUFBQSxDQUFBdkIsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFNBQUEsSUFBQTRFLFdBQUEsSUFBQTlGLEtBQUEsRUFBQWUsQ0FBQSxFQUFBbUIsUUFBQSxNQUFBRCxZQUFBLFdBQUFoQixNQUFBLENBQUFLLGNBQUEsQ0FBQVAsQ0FBQSxpQkFBQW1CLFFBQUEsU0FBQXBCLENBQUEsSUFBQTRJLGVBQUEsQ0FBQTNJLENBQUEsRUFBQUQsQ0FBQTtBQUFBLFNBQUE0SSxnQkFBQTNJLENBQUEsRUFBQUQsQ0FBQSxXQUFBNEksZUFBQSxHQUFBekksTUFBQSxDQUFBZ0YsY0FBQSxHQUFBaEYsTUFBQSxDQUFBZ0YsY0FBQSxDQUFBd0QsSUFBQSxlQUFBMUksQ0FBQSxFQUFBRCxDQUFBLFdBQUFDLENBQUEsQ0FBQW1GLFNBQUEsR0FBQXBGLENBQUEsRUFBQUMsQ0FBQSxLQUFBMkksZUFBQSxDQUFBM0ksQ0FBQSxFQUFBRCxDQUFBO0FBRGlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEEsSUFRcUI2SSxPQUFPLDBCQUFBbEosV0FBQTtFQUFBLFNBQUFrSixRQUFBO0lBQUE5SixlQUFBLE9BQUE4SixPQUFBO0lBQUEsT0FBQWpKLFVBQUEsT0FBQWlKLE9BQUEsRUFBQWhKLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUErSSxPQUFBLEVBQUFsSixXQUFBO0VBQUEsT0FBQVgsWUFBQSxDQUFBNkosT0FBQTtJQUFBNUosR0FBQTtJQUFBQyxLQUFBO0lBQ3hCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0ksU0FBQUMsVUFBVTJKLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxPQUFPLEVBQUU7TUFBQSxJQUFBQyxLQUFBO01BQ2pDLElBQUksT0FBT0gsT0FBTyxLQUFLLFFBQVEsRUFBRTtRQUM3QjtRQUNBO1FBQ0E7UUFDQSxJQUFJLElBQUksQ0FBQ0ksYUFBYSxDQUFDSixPQUFPLENBQUMsRUFBRTtVQUM3QixJQUFJLENBQUNBLE9BQU8sR0FBRyxJQUFJO1VBQ25CLElBQUksQ0FBQ0MsT0FBTyxHQUFHRCxPQUFPO1VBQ3RCLElBQUksQ0FBQ0UsT0FBTyxHQUFHRCxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsTUFBTTtVQUNILElBQU1JLGNBQWMsR0FBR0MsUUFBUSxDQUFDQyxhQUFhLENBQUNQLE9BQU8sQ0FBQztVQUN0RCxJQUFJSyxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE1BQU0sSUFBSTlGLEtBQUssa0RBQUFpRyxNQUFBLENBQWtEUixPQUFPLENBQUUsQ0FBQztVQUMvRTtVQUNBLElBQUksQ0FBQ0EsT0FBTyxHQUFHSyxjQUFjO1VBQzdCLElBQUksQ0FBQ0osT0FBTyxHQUFHQSxPQUFPO1VBQ3RCLElBQUksQ0FBQ0MsT0FBTyxHQUFHQSxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2hDO01BQ0osQ0FBQyxNQUFNO1FBQ0gsSUFBSSxDQUFDRixPQUFPLEdBQUdBLE9BQU87UUFDdEIsSUFBSSxDQUFDQyxPQUFPLEdBQUdBLE9BQU87UUFDdEIsSUFBSSxDQUFDQyxPQUFPLEdBQUdBLE9BQU8sSUFBSSxDQUFDLENBQUM7TUFDaEM7TUFFQSxJQUFJLENBQUNPLFlBQVksR0FBRyxDQUFDLENBQUM7TUFDdEIsSUFBSSxDQUFDQyxZQUFZLEdBQUcsSUFBSTtNQUN4QixJQUFJLENBQUNDLGFBQWEsR0FBRyxJQUFJO01BQ3pCLElBQUksQ0FBQ0MsU0FBUyxHQUFHLEtBQUs7TUFFdEIsSUFBSSxDQUFDQyxZQUFZLENBQUMsQ0FBQztNQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDN0ssU0FBUyxDQUFDOEssV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtRQUNoRCxJQUFJLENBQUNGLFNBQVMsR0FBRyxJQUFJO1FBQ3JCO01BQ0o7TUFDQSxJQUFJLElBQUksQ0FBQ1osT0FBTyxFQUFFO1FBQ2QsSUFBTWUsS0FBSyxHQUFHLElBQUlDLEtBQUssQ0FBQyxXQUFXLEVBQUU7VUFBRUMsVUFBVSxFQUFFO1FBQUssQ0FBQyxDQUFDO1FBQzFERixLQUFLLENBQUNHLE9BQU8sR0FBRyxJQUFJO1FBQ3BCLElBQUksQ0FBQ2xCLE9BQU8sQ0FBQ21CLGFBQWEsQ0FBQ0osS0FBSyxDQUFDO1FBRWpDLElBQUlBLEtBQUssQ0FBQ0ssZ0JBQWdCLEVBQUU7VUFDeEIsSUFBSSxDQUFDUixTQUFTLEdBQUcsSUFBSTtVQUNyQjtRQUNKO01BQ0o7TUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDUyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUU7UUFDNUIsSUFBSSxDQUFDVCxTQUFTLEdBQUcsSUFBSTtRQUNyQjtNQUNKO01BRUEsSUFBSSxJQUFJLENBQUNVLE9BQU8sRUFBRTtRQUNkLElBQUksQ0FBQ0MsU0FBUyxDQUFDLENBQUMsQ0FBQ2xILElBQUksQ0FBQyxVQUFDbUgsU0FBUyxFQUFLO1VBQ2pDLElBQUlBLFNBQVMsRUFBRTtZQUNYckIsS0FBSSxDQUFDc0IsTUFBTSxDQUFDLENBQUMsQ0FBQ3BILElBQUksQ0FDZCxVQUFDcUgsUUFBUSxFQUFLO2NBQ1YsSUFBSUEsUUFBUSxDQUFDZCxTQUFTLEVBQUU7Z0JBQ3BCVCxLQUFJLENBQUNTLFNBQVMsR0FBRyxJQUFJO2dCQUNyQlQsS0FBSSxDQUFDaEQsUUFBUSxDQUFDLENBQUM7Z0JBQ2Y7Y0FDSjtjQUNBZ0QsS0FBSSxDQUFDTyxZQUFZLEdBQUdnQixRQUFRO2NBQzVCdkIsS0FBSSxDQUFDd0IsYUFBYSxDQUFDRCxRQUFRLENBQUMsQ0FBQ3JILElBQUksQ0FDN0IsWUFBTTtnQkFDRixJQUFJcUgsUUFBUSxDQUFDRSxnQkFBZ0IsS0FBSyxLQUFLLEVBQUU7a0JBQ3JDekIsS0FBSSxDQUFDMEIsWUFBWSxDQUFDSCxRQUFRLENBQUM7Z0JBQy9CLENBQUMsTUFBTTtrQkFDSHZCLEtBQUksQ0FBQzJCLGVBQWUsQ0FBQ0osUUFBUSxDQUFDO2dCQUNsQztjQUNKLENBQ0osQ0FBQztZQUNMLENBQUMsRUFDRCxVQUFDSyxLQUFLLEVBQUs7Y0FDUDVCLEtBQUksQ0FBQ1EsYUFBYSxHQUFHb0IsS0FBSztjQUMxQjVCLEtBQUksQ0FBQzBCLFlBQVksQ0FBQ0UsS0FBSyxDQUFDO1lBQzVCLENBQ0osQ0FBQztVQUNMO1FBQ0osQ0FBQyxDQUFDO01BQ04sQ0FBQyxNQUFNO1FBQ0gsSUFBSSxDQUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDcEgsSUFBSSxDQUNkLFVBQUNxSCxRQUFRLEVBQUs7VUFDVixJQUFJQSxRQUFRLENBQUNkLFNBQVMsRUFBRTtZQUNwQlQsS0FBSSxDQUFDUyxTQUFTLEdBQUcsSUFBSTtZQUNyQlQsS0FBSSxDQUFDaEQsUUFBUSxDQUFDLENBQUM7WUFDZjtVQUNKO1VBQ0FnRCxLQUFJLENBQUNPLFlBQVksR0FBR2dCLFFBQVE7VUFDNUJ2QixLQUFJLENBQUN3QixhQUFhLENBQUNELFFBQVEsQ0FBQyxDQUFDckgsSUFBSSxDQUM3QixZQUFNO1lBQ0YsSUFBSXFILFFBQVEsQ0FBQ0UsZ0JBQWdCLEtBQUssS0FBSyxFQUFFO2NBQ3JDekIsS0FBSSxDQUFDMEIsWUFBWSxDQUFDSCxRQUFRLENBQUM7WUFDL0IsQ0FBQyxNQUFNO2NBQ0h2QixLQUFJLENBQUMyQixlQUFlLENBQUNKLFFBQVEsQ0FBQztZQUNsQztVQUNKLENBQ0osQ0FBQztRQUNMLENBQUMsRUFDRCxVQUFDSyxLQUFLLEVBQUs7VUFDUDVCLEtBQUksQ0FBQ1EsYUFBYSxHQUFHb0IsS0FBSztVQUMxQjVCLEtBQUksQ0FBQzBCLFlBQVksQ0FBQ0UsS0FBSyxDQUFDO1FBQzVCLENBQ0osQ0FBQztNQUNMO0lBQ0o7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUE1TCxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBRSxhQUFBLEVBQWU7TUFDWCxPQUFPLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQztJQUNuQzs7SUFFQTtBQUNKO0FBQ0E7RUFGSTtJQUFBSCxHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBeUssYUFBQSxFQUFlO01BQ1gsSUFBSSxJQUFJLENBQUNiLE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sWUFBWWdDLE9BQU8sS0FBSyxLQUFLLEVBQUU7UUFDM0QsTUFBTSxJQUFJekgsS0FBSyxDQUFDLGtEQUFrRCxDQUFDO01BQ3ZFO01BRUEsSUFBSSxJQUFJLENBQUMwRixPQUFPLEtBQUtnQyxTQUFTLEVBQUU7UUFDNUIsTUFBTSxJQUFJMUgsS0FBSyxDQUFDLHlDQUF5QyxDQUFDO01BQzlEO01BRUEsSUFBSSxDQUFDLElBQUksQ0FBQzZGLGFBQWEsQ0FBQyxJQUFJLENBQUNILE9BQU8sQ0FBQyxFQUFFO1FBQ25DLE1BQU0sSUFBSTFGLEtBQUssQ0FBQywyRUFBMkUsQ0FBQztNQUNoRztJQUNKOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkk7SUFBQXBFLEdBQUE7SUFBQUMsS0FBQSxFQU9BLFNBQUE4TCxTQUFBLEVBQVc7TUFDUCxJQUFJLENBQUN6QixZQUFZLEdBQUksSUFBSSxDQUFDUCxPQUFPLENBQUNPLFlBQVksS0FBS3dCLFNBQVMsSUFBSS9ILE9BQUEsQ0FBTyxJQUFJLENBQUNnRyxPQUFPLENBQUNPLFlBQVksTUFBSyxRQUFRLEdBQ3ZHLElBQUksQ0FBQ1AsT0FBTyxDQUFDTyxZQUFZLEdBQ3pCO1FBQ0VoRyxNQUFNLEVBQUUsTUFBTTtRQUNkMEgsT0FBTyxFQUFFLElBQUksQ0FBQ0EsT0FBTztRQUNyQkMsSUFBSSxFQUFFLElBQUksQ0FBQ0MsSUFBSTtRQUNmQyxRQUFRLEVBQUUsUUFBUTtRQUNsQkMsSUFBSSxFQUFFO01BQ1YsQ0FBQztNQUVMLElBQUksQ0FBQ3ZNLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUNMLFlBQVksRUFBRSxJQUFJLENBQUM7TUFFdkUsT0FBTytCLEtBQUssQ0FBQyxJQUFJLENBQUNDLEdBQUcsRUFBRSxJQUFJLENBQUNoQyxZQUFZLENBQUM7SUFDN0M7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUF0SyxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBaUwsbUJBQUEsRUFBcUI7TUFDakIsSUFBSSxJQUFJLENBQUNuQixPQUFPLENBQUN3QyxlQUFlLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQ0MsSUFBSSxFQUFFO1FBQ3BELElBQUksSUFBSSxDQUFDQSxJQUFJLENBQUNDLGFBQWEsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO1VBQ3JDLElBQUksQ0FBQ0QsSUFBSSxDQUFDRSxjQUFjLENBQUMsQ0FBQztVQUMxQixPQUFPLEtBQUs7UUFDaEI7TUFDSjtNQUVBLE9BQU8sSUFBSTtJQUNmOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkk7SUFBQTFNLEdBQUE7SUFBQUMsS0FBQSxFQU9BLFNBQUFxTCxPQUFBLEVBQVM7TUFBQSxJQUFBcUIsTUFBQTtNQUNMO01BQ0EsSUFBSSxJQUFJLENBQUM5TSxTQUFTLENBQUM4SyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQzlELE9BQU9yRSxPQUFPLENBQUN0QyxPQUFPLENBQUM7VUFDbkJ5RyxTQUFTLEVBQUU7UUFDZixDQUFDLENBQUM7TUFDTjtNQUVBLElBQU1tQyxXQUFXLEdBQUcsSUFBSXRHLE9BQU8sQ0FBQyxVQUFDdEMsT0FBTyxFQUFFNkksTUFBTSxFQUFLO1FBQ2pERixNQUFJLENBQUNaLFFBQVEsQ0FBQyxDQUFDLENBQUM3SCxJQUFJLENBQ2hCLFVBQUNxSCxRQUFRLEVBQUs7VUFDVixJQUFJLENBQUNBLFFBQVEsQ0FBQ3VCLEVBQUUsSUFBSXZCLFFBQVEsQ0FBQ3dCLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsSUFBSXhCLFFBQVEsQ0FBQ1MsT0FBTyxDQUFDZ0IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJekIsUUFBUSxDQUFDUyxPQUFPLENBQUNpQixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUNDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtjQUNoRzNCLFFBQVEsQ0FBQzRCLElBQUksQ0FBQyxDQUFDLENBQUNqSixJQUFJLENBQ2hCLFVBQUNxRyxZQUFZLEVBQUs7Z0JBQ2QsSUFBSUEsWUFBWSxDQUFDNkMsT0FBTyxJQUFJN0MsWUFBWSxDQUFDOEMsU0FBUyxFQUFFO2tCQUNoRFIsTUFBTSxDQUFDRixNQUFJLENBQUNXLFdBQVcsQ0FDbkIvQyxZQUFZLENBQUM2QyxPQUFPLEVBQ3BCN0MsWUFBWSxDQUFDOEMsU0FBUyxFQUN0QjlDLFlBQVksQ0FBQ2dELElBQUksRUFDakJoRCxZQUFZLENBQUNpRCxJQUFJLEVBQ2pCakQsWUFBWSxDQUFDa0QsS0FDakIsQ0FBQyxDQUFDO2dCQUNOLENBQUMsTUFBTTtrQkFDSFosTUFBTSxDQUFDdEMsWUFBWSxDQUFDO2dCQUN4QjtjQUNKLENBQUMsRUFDRCxVQUFDcUIsS0FBSyxFQUFLO2dCQUNQaUIsTUFBTSxDQUFDRixNQUFJLENBQUNXLFdBQVcsbUNBQUFqRCxNQUFBLENBQW1DdUIsS0FBSyxDQUFFLENBQUMsQ0FBQztjQUN2RSxDQUNKLENBQUM7WUFDTCxDQUFDLE1BQU07Y0FDSEwsUUFBUSxDQUFDbUMsSUFBSSxDQUFDLENBQUMsQ0FBQ3hKLElBQUksQ0FDaEIsVUFBQ3lKLFlBQVksRUFBSztnQkFDZGQsTUFBTSxDQUFDRixNQUFJLENBQUNXLFdBQVcsQ0FBQ0ssWUFBWSxDQUFDLENBQUM7Y0FDMUMsQ0FBQyxFQUNELFVBQUMvQixLQUFLLEVBQUs7Z0JBQ1BpQixNQUFNLENBQUNGLE1BQUksQ0FBQ1csV0FBVyxnQ0FBQWpELE1BQUEsQ0FBZ0N1QixLQUFLLENBQUUsQ0FBQyxDQUFDO2NBQ3BFLENBQ0osQ0FBQztZQUNMO1lBQ0E7VUFDSjtVQUVBLElBQUlMLFFBQVEsQ0FBQ1MsT0FBTyxDQUFDZ0IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJekIsUUFBUSxDQUFDUyxPQUFPLENBQUNpQixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUNDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoRzNCLFFBQVEsQ0FBQzRCLElBQUksQ0FBQyxDQUFDLENBQUNqSixJQUFJLENBQ2hCLFVBQUNxRyxZQUFZLEVBQUs7Y0FDZHZHLE9BQU8sQ0FBQXdFLGFBQUEsQ0FBQUEsYUFBQSxLQUNBK0IsWUFBWTtnQkFDZmtCLGdCQUFnQixFQUFFRixRQUFRLENBQUN3QixNQUFNLEtBQUssR0FBRztnQkFDekNhLHNCQUFzQixFQUFFckMsUUFBUSxDQUFDd0I7Y0FBTSxFQUMxQyxDQUFDO1lBQ04sQ0FBQyxFQUNELFVBQUNuQixLQUFLLEVBQUs7Y0FDUGlCLE1BQU0sQ0FBQ0YsTUFBSSxDQUFDVyxXQUFXLG1DQUFBakQsTUFBQSxDQUFtQ3VCLEtBQUssQ0FBRSxDQUFDLENBQUM7WUFDdkUsQ0FDSixDQUFDO1VBQ0wsQ0FBQyxNQUFNO1lBQ0hMLFFBQVEsQ0FBQ21DLElBQUksQ0FBQyxDQUFDLENBQUN4SixJQUFJLENBQ2hCLFVBQUNxRyxZQUFZLEVBQUs7Y0FDZHZHLE9BQU8sQ0FBQ3VHLFlBQVksQ0FBQztZQUN6QixDQUFDLEVBQ0QsVUFBQ3FCLEtBQUssRUFBSztjQUNQaUIsTUFBTSxDQUFDRixNQUFJLENBQUNXLFdBQVcsZ0NBQUFqRCxNQUFBLENBQWdDdUIsS0FBSyxDQUFFLENBQUMsQ0FBQztZQUNwRSxDQUNKLENBQUM7VUFDTDtRQUNKLENBQUMsRUFDRCxVQUFDcEIsYUFBYSxFQUFLO1VBQ2ZxQyxNQUFNLENBQUNGLE1BQUksQ0FBQ1csV0FBVyxtREFBQWpELE1BQUEsQ0FBbURHLGFBQWEsQ0FBRSxDQUFDLENBQUM7UUFDL0YsQ0FDSixDQUFDO01BQ0wsQ0FBQyxDQUFDO01BRUYsSUFBSSxDQUFDM0ssU0FBUyxDQUFDOEssV0FBVyxDQUFDLFdBQVcsRUFBRWlDLFdBQVcsRUFBRSxJQUFJLENBQUM7TUFFMUQsSUFBSSxJQUFJLENBQUMvQyxPQUFPLEVBQUU7UUFDZCxJQUFNZSxLQUFLLEdBQUcsSUFBSUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUN0Q0QsS0FBSyxDQUFDaUQsT0FBTyxHQUFHakIsV0FBVztRQUMzQixJQUFJLENBQUMvQyxPQUFPLENBQUNtQixhQUFhLENBQUNKLEtBQUssQ0FBQztNQUNyQztNQUVBLE9BQU9nQyxXQUFXO0lBQ3RCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBVEk7SUFBQTVNLEdBQUE7SUFBQUMsS0FBQSxFQVVBLFNBQUF1TCxjQUFjRCxRQUFRLEVBQUU7TUFBQSxJQUFBdUMsTUFBQTtNQUNwQixPQUFPLElBQUl4SCxPQUFPLENBQUMsVUFBQ3RDLE9BQU8sRUFBRTZJLE1BQU0sRUFBSztRQUNwQyxJQUFJLE9BQU9pQixNQUFJLENBQUMvRCxPQUFPLENBQUNnRSxZQUFZLEtBQUssVUFBVSxFQUFFO1VBQ2pELElBQUlELE1BQUksQ0FBQy9ELE9BQU8sQ0FBQ2dFLFlBQVksQ0FBQ3pHLEtBQUssQ0FBQ3dHLE1BQUksRUFBRSxDQUFDdkMsUUFBUSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFDN0R2SCxPQUFPLENBQUMsQ0FBQztZQUNUO1VBQ0o7UUFDSjs7UUFFQTtRQUNBLElBQU1nSyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ25COU0sTUFBTSxDQUFDK00sT0FBTyxDQUFDMUMsUUFBUSxDQUFDLENBQUM1SCxPQUFPLENBQUMsVUFBQ3VLLEtBQUssRUFBSztVQUN4QyxJQUFBQyxNQUFBLEdBQUExRyxjQUFBLENBQXFCeUcsS0FBSztZQUFuQmxPLEdBQUcsR0FBQW1PLE1BQUE7WUFBRWxPLEtBQUssR0FBQWtPLE1BQUE7VUFFakIsSUFBSW5PLEdBQUcsQ0FBQ29PLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFO1lBQ2pDSixRQUFRLENBQUNoTyxHQUFHLENBQUMsR0FBR0MsS0FBSztVQUN6QjtRQUNKLENBQUMsQ0FBQztRQUVGLElBQUlpQixNQUFNLENBQUNxRixJQUFJLENBQUN5SCxRQUFRLENBQUMsQ0FBQ3BJLE1BQU0sS0FBSyxDQUFDLEVBQUU7VUFDcEMsSUFBSTJGLFFBQVEsQ0FBQzhDLGVBQWUsRUFBRTtZQUMxQlAsTUFBSSxDQUFDUSxhQUFhLENBQUMvQyxRQUFRLENBQUM4QyxlQUFlLENBQUMsQ0FBQ25LLElBQUksQ0FDN0MsWUFBTTtjQUNGRixPQUFPLENBQUMsQ0FBQztZQUNiLENBQUMsRUFDRCxZQUFNO2NBQ0Y2SSxNQUFNLENBQUMsQ0FBQztZQUNaLENBQ0osQ0FBQztVQUNMLENBQUMsTUFBTTtZQUNIN0ksT0FBTyxDQUFDLENBQUM7VUFDYjtVQUNBO1FBQ0o7UUFFQSxJQUFNdUssUUFBUSxHQUFHVCxNQUFJLENBQUNqTyxTQUFTLENBQUMyTyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRWpELFFBQVEsRUFBRXVDLE1BQUksQ0FBQztRQUN0RlMsUUFBUSxDQUFDckssSUFBSSxlQUFBbUQsaUJBQUEsZUFBQXZHLG1CQUFBLEdBQUFtRixJQUFBLENBQ1QsU0FBQXdJLFFBQUE7VUFBQSxPQUFBM04sbUJBQUEsR0FBQXNCLElBQUEsVUFBQXNNLFNBQUFDLFFBQUE7WUFBQSxrQkFBQUEsUUFBQSxDQUFBakksSUFBQSxHQUFBaUksUUFBQSxDQUFBNUosSUFBQTtjQUFBO2dCQUFBLEtBQ1F3RyxRQUFRLENBQUM4QyxlQUFlO2tCQUFBTSxRQUFBLENBQUE1SixJQUFBO2tCQUFBO2dCQUFBO2dCQUFBNEosUUFBQSxDQUFBNUosSUFBQTtnQkFBQSxPQUNsQitJLE1BQUksQ0FBQ1EsYUFBYSxDQUFDL0MsUUFBUSxDQUFDOEMsZUFBZSxDQUFDO2NBQUE7Z0JBR3REUCxNQUFJLENBQUNjLFFBQVEsQ0FBQ1osUUFBUSxDQUFDLENBQUM5SixJQUFJLENBQ3hCLFlBQU07a0JBQ0Y7a0JBQ0EySyxNQUFNLENBQUNDLHFCQUFxQixDQUFDO29CQUFBLE9BQU05SyxPQUFPLENBQUMsQ0FBQztrQkFBQSxFQUFDO2dCQUNqRCxDQUFDLEVBQ0QsWUFBTTtrQkFDRjZJLE1BQU0sQ0FBQyxDQUFDO2dCQUNaLENBQ0osQ0FBQztjQUFDO2NBQUE7Z0JBQUEsT0FBQThCLFFBQUEsQ0FBQTlILElBQUE7WUFBQTtVQUFBLEdBQUE0SCxPQUFBO1FBQUEsQ0FDTCxJQUNELFlBQU07VUFDRnpLLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FDSixDQUFDO01BQ0wsQ0FBQyxDQUFDO0lBQ047O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEk7SUFBQWhFLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUEyTyxTQUFTWixRQUFRLEVBQUU7TUFBQSxJQUFBZSxNQUFBO01BQ2YsT0FBTyxJQUFJekksT0FBTyxDQUFDLFVBQUN0QyxPQUFPLEVBQUs7UUFDNUIsSUFBTWdMLFFBQVEsR0FBRyxFQUFFO1FBRW5COU4sTUFBTSxDQUFDK00sT0FBTyxDQUFDRCxRQUFRLENBQUMsQ0FBQ3JLLE9BQU8sQ0FBQyxVQUFDdUssS0FBSyxFQUFLO1VBQ3hDLElBQUFlLE9BQUEsR0FBQXhILGNBQUEsQ0FBMkJ5RyxLQUFLO1lBQXpCZ0IsT0FBTyxHQUFBRCxPQUFBO1lBQUVFLE9BQU8sR0FBQUYsT0FBQTtVQUV2QixJQUFJRyxRQUFRLEdBQUlMLE1BQUksQ0FBQ2hGLE9BQU8sQ0FBQ3NGLE1BQU0sSUFBSU4sTUFBSSxDQUFDaEYsT0FBTyxDQUFDc0YsTUFBTSxDQUFDSCxPQUFPLENBQUMsR0FDN0RILE1BQUksQ0FBQ2hGLE9BQU8sQ0FBQ3NGLE1BQU0sQ0FBQ0gsT0FBTyxDQUFDLEdBQzVCQSxPQUFPO1VBRWIsSUFBSTlDLElBQUksR0FBRyxTQUFTO1VBRXBCLElBQUlnRCxRQUFRLENBQUNoQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUMvQmhDLElBQUksR0FBRyxRQUFRO1lBQ2ZnRCxRQUFRLEdBQUdBLFFBQVEsQ0FBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUM7VUFDakMsQ0FBQyxNQUFNLElBQUlnQixRQUFRLENBQUNoQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUN0Q2hDLElBQUksR0FBRyxTQUFTO1lBQ2hCZ0QsUUFBUSxHQUFHQSxRQUFRLENBQUNoQixNQUFNLENBQUMsQ0FBQyxDQUFDO1VBQ2pDLENBQUMsTUFBTSxJQUFJZ0IsUUFBUSxDQUFDaEIsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUlnQixRQUFRLENBQUNoQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUN2RWhDLElBQUksR0FBRyxNQUFNO1VBQ2pCO1VBRUEsSUFBTWtELFFBQVEsR0FBR25GLFFBQVEsQ0FBQ29GLGdCQUFnQixDQUFDSCxRQUFRLENBQUM7VUFDcEQsSUFBSUUsUUFBUSxDQUFDMUosTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQjBKLFFBQVEsQ0FBQzNMLE9BQU8sQ0FBQyxVQUFDa0csT0FBTyxFQUFLO2NBQzFCLFFBQVF1QyxJQUFJO2dCQUNSLEtBQUssUUFBUTtrQkFDVHZDLE9BQU8sQ0FBQzJGLFNBQVMsSUFBSUwsT0FBTztrQkFDNUI7Z0JBQ0osS0FBSyxTQUFTO2tCQUNWdEYsT0FBTyxDQUFDMkYsU0FBUyxHQUFHTCxPQUFPLEdBQUd0RixPQUFPLENBQUMyRixTQUFTO2tCQUMvQztnQkFDSixLQUFLLE1BQU07a0JBQ1A7Z0JBQ0osS0FBSyxTQUFTO2dCQUNkO2tCQUNJM0YsT0FBTyxDQUFDMkYsU0FBUyxHQUFHTCxPQUFPO2tCQUMzQjtjQUNSO2NBRUFILFFBQVEsQ0FBQ3pKLElBQUksQ0FBQ3NFLE9BQU8sQ0FBQzs7Y0FFdEI7Y0FDQWtGLE1BQUksQ0FBQ2xQLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxZQUFZLEVBQUVkLE9BQU8sRUFBRXNGLE9BQU8sRUFBRUosTUFBSSxDQUFDO2NBQ2hFLElBQU1uRSxLQUFLLEdBQUcsSUFBSUMsS0FBSyxDQUFDLFlBQVksQ0FBQztjQUNyQ0QsS0FBSyxDQUFDdUUsT0FBTyxHQUFHQSxPQUFPO2NBQ3ZCdEYsT0FBTyxDQUFDbUIsYUFBYSxDQUFDSixLQUFLLENBQUM7WUFDaEMsQ0FBQyxDQUFDO1VBQ047UUFDSixDQUFDLENBQUM7UUFFRm1FLE1BQUksQ0FBQ2xQLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRXFFLFFBQVEsRUFBRUQsTUFBSSxDQUFDO1FBRWhFL0ssT0FBTyxDQUFDLENBQUM7TUFDYixDQUFDLENBQUM7SUFDTjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFSSTtJQUFBaEUsR0FBQTtJQUFBQyxLQUFBLEVBU0EsU0FBQTBMLGdCQUFnQkosUUFBUSxFQUFFO01BQ3RCLElBQUksSUFBSSxDQUFDeEIsT0FBTyxDQUFDMEYsT0FBTyxJQUFJLE9BQU8sSUFBSSxDQUFDMUYsT0FBTyxDQUFDMEYsT0FBTyxLQUFLLFVBQVUsRUFBRTtRQUNwRSxJQUFJLElBQUksQ0FBQzFGLE9BQU8sQ0FBQzBGLE9BQU8sQ0FBQyxJQUFJLENBQUNsRixZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1VBQ3pEO1FBQ0o7TUFDSjs7TUFFQTtNQUNBLElBQUksSUFBSSxDQUFDMUssU0FBUyxDQUFDOEssV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUNKLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDOUU7TUFDSjs7TUFFQTtNQUNBLElBQUksSUFBSSxDQUFDVixPQUFPLEVBQUU7UUFDZCxJQUFNZSxLQUFLLEdBQUcsSUFBSUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtVQUFFQyxVQUFVLEVBQUU7UUFBSyxDQUFDLENBQUM7UUFDekRGLEtBQUssQ0FBQ0wsWUFBWSxHQUFHLElBQUksQ0FBQ0EsWUFBWTtRQUN0Q0ssS0FBSyxDQUFDRyxPQUFPLEdBQUcsSUFBSTtRQUNwQixJQUFJLENBQUNsQixPQUFPLENBQUNtQixhQUFhLENBQUNKLEtBQUssQ0FBQztRQUVqQyxJQUFJQSxLQUFLLENBQUNLLGdCQUFnQixFQUFFO1VBQ3hCO1FBQ0o7TUFDSjtNQUVBLElBQUksSUFBSSxDQUFDeUUsS0FBSyxJQUFJbkUsUUFBUSxDQUFDb0UsdUJBQXVCLEVBQUU7UUFDaEQsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQ3JFLFFBQVEsQ0FBQ29FLHVCQUF1QixDQUFDO01BQy9EOztNQUVBO01BQ0EsSUFBSSxJQUFJLENBQUN4RCxRQUFRLElBQUlaLFFBQVEsQ0FBQ3NFLGlCQUFpQixFQUFFO1FBQzdDLElBQUksQ0FBQ0MsZUFBZSxDQUFDLElBQUksQ0FBQzNELFFBQVEsSUFBSVosUUFBUSxDQUFDc0UsaUJBQWlCLENBQUM7UUFDakU7TUFDSjtNQUVBLElBQUksQ0FBQzdJLFFBQVEsQ0FBQyxDQUFDO0lBQ25COztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQSTtJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBUUEsU0FBQXlMLGFBQWFFLEtBQUssRUFBRTtNQUNoQixJQUFJLElBQUksQ0FBQzdCLE9BQU8sQ0FBQzZCLEtBQUssSUFBSSxPQUFPLElBQUksQ0FBQzdCLE9BQU8sQ0FBQzZCLEtBQUssS0FBSyxVQUFVLEVBQUU7UUFDaEUsSUFBSSxJQUFJLENBQUM3QixPQUFPLENBQUM2QixLQUFLLENBQUMsSUFBSSxDQUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtVQUN4RDtRQUNKO01BQ0o7O01BRUE7TUFDQSxJQUFJLElBQUksQ0FBQzNLLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDSCxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQzdFO01BQ0o7O01BRUE7TUFDQSxJQUFJLElBQUksQ0FBQ1gsT0FBTyxFQUFFO1FBQ2QsSUFBTWUsS0FBSyxHQUFHLElBQUlDLEtBQUssQ0FBQyxVQUFVLEVBQUU7VUFBRUMsVUFBVSxFQUFFO1FBQUssQ0FBQyxDQUFDO1FBQ3pERixLQUFLLENBQUNKLGFBQWEsR0FBRyxJQUFJLENBQUNBLGFBQWE7UUFDeENJLEtBQUssQ0FBQ0csT0FBTyxHQUFHLElBQUk7UUFDcEIsSUFBSSxDQUFDbEIsT0FBTyxDQUFDbUIsYUFBYSxDQUFDSixLQUFLLENBQUM7UUFFakMsSUFBSUEsS0FBSyxDQUFDSyxnQkFBZ0IsRUFBRTtVQUN4QjtRQUNKO01BQ0o7TUFFQSxJQUFJVyxLQUFLLFlBQVl4SCxLQUFLLEVBQUU7UUFDeEIsSUFBSSxDQUFDMkwsbUJBQW1CLENBQUNuRSxLQUFLLENBQUN3QixPQUFPLENBQUM7TUFDM0MsQ0FBQyxNQUFNO1FBQ0gsSUFBSTRDLFNBQVMsR0FBRyxLQUFLOztRQUVyQjtRQUNBLElBQUlwRSxLQUFLLENBQUNxRSxxQkFBcUIsRUFBRTtVQUM3QkQsU0FBUyxHQUFHLElBQUksQ0FBQ0UsdUJBQXVCLENBQUN0RSxLQUFLLENBQUNxRSxxQkFBcUIsQ0FBQztRQUN6RTtRQUVBLElBQUlyRSxLQUFLLENBQUN1RSxzQkFBc0IsSUFBSSxDQUFDSCxTQUFTLEVBQUU7VUFDNUMsSUFBSSxDQUFDRCxtQkFBbUIsQ0FBQ25FLEtBQUssQ0FBQ3VFLHNCQUFzQixDQUFDO1FBQzFEO01BQ0o7TUFFQSxJQUFJLENBQUNuSixRQUFRLENBQUMsQ0FBQztJQUNuQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFYSTtJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBWUEsU0FBQTZQLGdCQUFnQnhELEdBQUcsRUFBRTtNQUFBLElBQUE4RCxNQUFBO01BQ2pCO01BQ0EsSUFBSSxPQUFPLElBQUksQ0FBQ3JHLE9BQU8sQ0FBQ3NHLHNCQUFzQixLQUFLLFVBQVUsRUFBRTtRQUMzRCxJQUFJLElBQUksQ0FBQ3RHLE9BQU8sQ0FBQ3NHLHNCQUFzQixDQUFDL0ksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDZ0YsR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7VUFDbEU7UUFDSjtNQUNKOztNQUVBO01BQ0EsSUFBSSxJQUFJLENBQUN6TSxTQUFTLENBQUM4SyxXQUFXLENBQUMsY0FBYyxFQUFFMkIsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUNqRTtNQUNKOztNQUVBO01BQ0E7TUFDQTtNQUNBO01BQ0F1QyxNQUFNLENBQUN5QixnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsWUFBTTtRQUN0QyxJQUFJRixNQUFJLENBQUN2RyxPQUFPLEVBQUU7VUFDZCxJQUFNZSxLQUFLLEdBQUdULFFBQVEsQ0FBQ29HLFdBQVcsQ0FBQyxhQUFhLENBQUM7VUFDakQzRixLQUFLLENBQUM0RixTQUFTLEdBQUcsZ0JBQWdCO1VBQ2xDSixNQUFJLENBQUN2RyxPQUFPLENBQUNtQixhQUFhLENBQUNKLEtBQUssQ0FBQztRQUNyQztNQUNKLENBQUMsRUFBRTtRQUNDNkYsSUFBSSxFQUFFO01BQ1YsQ0FBQyxDQUFDO01BRUY1QixNQUFNLENBQUM2QixRQUFRLENBQUNDLE1BQU0sQ0FBQ3JFLEdBQUcsQ0FBQztJQUMvQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFYSTtJQUFBdE0sR0FBQTtJQUFBQyxLQUFBLEVBWUEsU0FBQThQLG9CQUFvQjNDLE9BQU8sRUFBRTtNQUN6QjtNQUNBO01BQ0EsSUFBSSxPQUFPLElBQUksQ0FBQ3JELE9BQU8sQ0FBQzZHLGtCQUFrQixLQUFLLFVBQVUsRUFBRTtRQUN2RCxJQUFJLElBQUksQ0FBQzdHLE9BQU8sQ0FBQzZHLGtCQUFrQixDQUFDdEosS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDOEYsT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7VUFDbEU7UUFDSjtNQUNKOztNQUVBO01BQ0EsSUFBSSxJQUFJLENBQUN2TixTQUFTLENBQUM4SyxXQUFXLENBQUMsa0JBQWtCLEVBQUV5QyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ3pFO01BQ0o7O01BRUE7TUFDQXlCLE1BQU0sQ0FBQ2dDLEtBQUssQ0FBQ3pELE9BQU8sQ0FBQztJQUN6Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFYSTtJQUFBcE4sR0FBQTtJQUFBQyxLQUFBLEVBWUEsU0FBQTJQLHFCQUFxQmtCLFFBQVEsRUFBRTtNQUMzQjtNQUNBLElBQUksT0FBTyxJQUFJLENBQUMvRyxPQUFPLENBQUNnSCxtQkFBbUIsS0FBSyxVQUFVLEVBQUU7UUFDeEQsSUFBSSxJQUFJLENBQUNoSCxPQUFPLENBQUNnSCxtQkFBbUIsQ0FBQ3pKLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQ3dKLFFBQVEsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO1VBQ3BFO1FBQ0o7TUFDSjtNQUVBLElBQUksQ0FBQ2pSLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRW1HLFFBQVEsRUFBRSxJQUFJLENBQUM7SUFDbkU7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBWEk7SUFBQTlRLEdBQUE7SUFBQUMsS0FBQSxFQVlBLFNBQUFpUSx3QkFBd0JjLE1BQU0sRUFBRTtNQUM1QixJQUFJLE9BQU8sSUFBSSxDQUFDakgsT0FBTyxDQUFDa0gsc0JBQXNCLEtBQUssVUFBVSxFQUFFO1FBQzNELElBQUksSUFBSSxDQUFDbEgsT0FBTyxDQUFDa0gsc0JBQXNCLENBQUMzSixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDa0YsSUFBSSxFQUFFd0UsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7VUFDaEYsT0FBTyxJQUFJO1FBQ2Y7TUFDSjs7TUFFQTtNQUNBLElBQUksSUFBSSxDQUFDblIsU0FBUyxDQUFDOEssV0FBVyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQzZCLElBQUksRUFBRXdFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDdkYsT0FBTyxJQUFJO01BQ2Y7TUFFQSxPQUFPLEtBQUs7SUFDaEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVZJO0lBQUFoUixHQUFBO0lBQUFDLEtBQUEsRUFXQSxTQUFBcU8sY0FBYzRDLE1BQU0sRUFBRTtNQUNsQixPQUFPLElBQUksQ0FBQ3JSLFNBQVMsQ0FBQzJPLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFMEMsTUFBTSxDQUFDO0lBQ3RFOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBWkk7SUFBQWxSLEdBQUE7SUFBQUMsS0FBQTtNQUFBLElBQUFrUixVQUFBLEdBQUE5SixpQkFBQSxlQUFBdkcsbUJBQUEsR0FBQW1GLElBQUEsQ0FhQSxTQUFBbUwsU0FBQTtRQUFBLElBQUE3QyxRQUFBLEVBQUE4QyxTQUFBO1FBQUEsT0FBQXZRLG1CQUFBLEdBQUFzQixJQUFBLFVBQUFrUCxVQUFBQyxTQUFBO1VBQUEsa0JBQUFBLFNBQUEsQ0FBQTdLLElBQUEsR0FBQTZLLFNBQUEsQ0FBQXhNLElBQUE7WUFBQTtjQUFBLE1BRVEsT0FBTyxJQUFJLENBQUNnRixPQUFPLENBQUN5SCxvQkFBb0IsS0FBSyxVQUFVO2dCQUFBRCxTQUFBLENBQUF4TSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxNQUNuRCxJQUFJLENBQUNnRixPQUFPLENBQUN5SCxvQkFBb0IsQ0FBQ2xLLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM2RCxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUs7Z0JBQUFvRyxTQUFBLENBQUF4TSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBd00sU0FBQSxDQUFBM00sTUFBQSxXQUNoRSxLQUFLO1lBQUE7Y0FBQSxPQUFBMk0sU0FBQSxDQUFBM00sTUFBQSxXQUdULElBQUk7WUFBQTtjQUFBLE1BSVgsSUFBSSxDQUFDL0UsU0FBUyxDQUFDNFIsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUM3TCxNQUFNLEtBQUssQ0FBQztnQkFBQTJMLFNBQUEsQ0FBQXhNLElBQUE7Z0JBQUE7Y0FBQTtjQUFBLE9BQUF3TSxTQUFBLENBQUEzTSxNQUFBLFdBQ3pEaUssTUFBTSxDQUFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQ0EsT0FBTyxDQUFDO1lBQUE7Y0FHdkM7Y0FDTW9ELFFBQVEsR0FBRyxJQUFJLENBQUMxTyxTQUFTLENBQUMyTyxrQkFBa0IsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUNyRCxPQUFPLEVBQUUsSUFBSSxDQUFDO2NBQUFvRyxTQUFBLENBQUE3SyxJQUFBO2NBQUE2SyxTQUFBLENBQUF4TSxJQUFBO2NBQUEsT0FHaEV3SixRQUFRO1lBQUE7Y0FBMUI4QyxTQUFTLEdBQUFFLFNBQUEsQ0FBQTlNLElBQUE7Y0FBQSxLQUNYNE0sU0FBUztnQkFBQUUsU0FBQSxDQUFBeE0sSUFBQTtnQkFBQTtjQUFBO2NBQUEsT0FBQXdNLFNBQUEsQ0FBQTNNLE1BQUEsV0FDRixJQUFJO1lBQUE7Y0FBQTJNLFNBQUEsQ0FBQXhNLElBQUE7Y0FBQTtZQUFBO2NBQUF3TSxTQUFBLENBQUE3SyxJQUFBO2NBQUE2SyxTQUFBLENBQUFHLEVBQUEsR0FBQUgsU0FBQTtjQUFBLE9BQUFBLFNBQUEsQ0FBQTNNLE1BQUEsV0FHUixLQUFLO1lBQUE7Y0FBQSxPQUFBMk0sU0FBQSxDQUFBM00sTUFBQSxXQUdULEtBQUs7WUFBQTtZQUFBO2NBQUEsT0FBQTJNLFNBQUEsQ0FBQTFLLElBQUE7VUFBQTtRQUFBLEdBQUF1SyxRQUFBO01BQUEsQ0FDZjtNQUFBLFNBQUFoRyxVQUFBO1FBQUEsT0FBQStGLFVBQUEsQ0FBQTdKLEtBQUEsT0FBQTFHLFNBQUE7TUFBQTtNQUFBLE9BQUF3SyxTQUFBO0lBQUE7SUFFRDtBQUNKO0FBQ0E7SUFGSTtFQUFBO0lBQUFwTCxHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBK0csU0FBQSxFQUFXO01BQ1AsSUFBSSxJQUFJLENBQUMrQyxPQUFPLENBQUMvQyxRQUFRLElBQUksT0FBTyxJQUFJLENBQUMrQyxPQUFPLENBQUMvQyxRQUFRLEtBQUssVUFBVSxFQUFFO1FBQ3RFLElBQUksQ0FBQytDLE9BQU8sQ0FBQy9DLFFBQVEsQ0FBQyxJQUFJLENBQUN1RCxZQUFZLEVBQUUsSUFBSSxDQUFDO01BQ2xEO01BQ0EsSUFBSSxDQUFDMUssU0FBUyxDQUFDOEssV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUNKLFlBQVksRUFBRSxJQUFJLENBQUM7TUFFL0QsSUFBSSxJQUFJLENBQUNWLE9BQU8sRUFBRTtRQUNkLElBQU1lLEtBQUssR0FBRyxJQUFJQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3JDRCxLQUFLLENBQUNHLE9BQU8sR0FBRyxJQUFJO1FBQ3BCSCxLQUFLLENBQUNMLFlBQVksR0FBRyxJQUFJLENBQUNBLFlBQVk7UUFDdENLLEtBQUssQ0FBQ0osYUFBYSxHQUFHLElBQUksQ0FBQ0EsYUFBYTtRQUN4QyxJQUFJLENBQUNYLE9BQU8sQ0FBQ21CLGFBQWEsQ0FBQ0osS0FBSyxDQUFDO01BQ3JDOztNQUVBO01BQ0EsSUFBSSxDQUFDdkssUUFBUSxDQUFDLENBQUM7SUFDbkI7RUFBQztJQUFBTCxHQUFBO0lBQUFpTixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFXO01BQ1AsSUFBSSxJQUFJLENBQUNsRCxPQUFPLENBQUN5QyxJQUFJLEVBQUU7UUFDbkIsSUFBSSxPQUFPLElBQUksQ0FBQ3pDLE9BQU8sQ0FBQ3lDLElBQUksS0FBSyxRQUFRLEVBQUU7VUFDdkMsT0FBT3JDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLElBQUksQ0FBQ0wsT0FBTyxDQUFDeUMsSUFBSSxDQUFDO1FBQ3BEO1FBQ0EsT0FBTyxJQUFJLENBQUN6QyxPQUFPLENBQUN5QyxJQUFJO01BQzVCO01BQ0EsSUFBSSxDQUFDLElBQUksQ0FBQzNDLE9BQU8sRUFBRTtRQUNmLE9BQU8sSUFBSTtNQUNmO01BQ0EsSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQzhILE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDakMsT0FBTyxJQUFJLENBQUM5SCxPQUFPO01BQ3ZCO01BRUEsT0FBTyxJQUFJLENBQUNBLE9BQU8sQ0FBQytILE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDdkM7RUFBQztJQUFBNVIsR0FBQTtJQUFBaU4sR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBYztNQUNWLE9BQU87UUFDSG5ELE9BQU8sRUFBRSxJQUFJLENBQUNBLE9BQU87UUFDckJDLE9BQU8sRUFBRSxJQUFJLENBQUNBO01BQ2xCLENBQUM7SUFDTDtFQUFDO0lBQUEvSixHQUFBO0lBQUFpTixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFjO01BQ1YsSUFBTWpCLE9BQU8sR0FBRztRQUNaLGtCQUFrQixFQUFFLGdCQUFnQjtRQUFFO1FBQ3RDLDBCQUEwQixFQUFFLElBQUksQ0FBQ2xDLE9BQU87UUFDeEMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDK0gsZUFBZSxDQUFDLElBQUksQ0FBQzlILE9BQU8sQ0FBQ3NGLE1BQU0sSUFBSSxFQUFFO01BQy9FLENBQUM7TUFFRCxJQUFJLElBQUksQ0FBQ0ssS0FBSyxFQUFFO1FBQ1oxRCxPQUFPLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDO01BQ3pDO01BRUEsSUFBSSxJQUFJLENBQUM4RixTQUFTLEVBQUU7UUFDaEI5RixPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDOEYsU0FBUztNQUM1QztNQUVBLE9BQU85RixPQUFPO0lBQ2xCO0VBQUM7SUFBQWhNLEdBQUE7SUFBQWlOLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQWM7TUFDVixPQUFPLElBQUksQ0FBQ2xELE9BQU8sQ0FBQ2dJLE9BQU8sSUFBSSxLQUFLO0lBQ3hDO0VBQUM7SUFBQS9SLEdBQUE7SUFBQWlOLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQVU7TUFDTixPQUFPLElBQUksQ0FBQ2xELE9BQU8sQ0FBQ3VDLEdBQUcsSUFBSXVDLE1BQU0sQ0FBQzZCLFFBQVEsQ0FBQ3NCLElBQUk7SUFDbkQ7RUFBQztJQUFBaFMsR0FBQTtJQUFBaU4sR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBZTtNQUNYLE9BQVEsSUFBSSxDQUFDbEQsT0FBTyxDQUFDb0MsUUFBUSxJQUFJLElBQUksQ0FBQ3BDLE9BQU8sQ0FBQ29DLFFBQVEsQ0FBQ3ZHLE1BQU0sR0FBSSxJQUFJLENBQUNtRSxPQUFPLENBQUNvQyxRQUFRLEdBQUcsSUFBSTtJQUNqRztFQUFDO0lBQUFuTSxHQUFBO0lBQUFpTixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFZO01BQ1IsT0FBTyxJQUFJLENBQUNsRCxPQUFPLENBQUMyRixLQUFLLElBQUksS0FBSztJQUN0QztFQUFDO0lBQUExUCxHQUFBO0lBQUFpTixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFZO01BQ1IsSUFBSSxJQUFJLENBQUNsRCxPQUFPLENBQUNrSSxLQUFLLEtBQUssSUFBSSxFQUFFO1FBQzdCLElBQUlDLFFBQVEsS0FBS3BHLFNBQVMsRUFBRTtVQUN4QixJQUFJLENBQUNqTSxTQUFTLENBQUNzUyxLQUFLLENBQUMsNENBQTRDLENBQUM7VUFDbEUsT0FBTyxLQUFLO1FBQ2hCO1FBRUEsT0FBTyxJQUFJO01BQ2Y7TUFFQSxPQUFPLEtBQUs7SUFDaEI7RUFBQztJQUFBblMsR0FBQTtJQUFBaU4sR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBZ0I7TUFDWixPQUFPLElBQUksQ0FBQ3BOLFNBQVMsQ0FBQ3VTLE1BQU0sQ0FBQyxDQUFDLENBQUNuRixHQUFHLENBQUMsWUFBWSxDQUFDO0lBQ3BEO0VBQUM7SUFBQWpOLEdBQUE7SUFBQWlOLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQVc7TUFDUCxJQUFNZixJQUFJLEdBQUluSSxPQUFBLENBQU8sSUFBSSxDQUFDZ0csT0FBTyxDQUFDbUMsSUFBSSxNQUFLLFFBQVEsR0FBSSxJQUFJLENBQUNuQyxPQUFPLENBQUNtQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO01BRTdFLElBQU1tRyxRQUFRLEdBQUcsSUFBSUgsUUFBUSxDQUFDLElBQUksQ0FBQzFGLElBQUksSUFBSVYsU0FBUyxDQUFDO01BQ3JELElBQUk1SyxNQUFNLENBQUNxRixJQUFJLENBQUMyRixJQUFJLENBQUMsQ0FBQ3RHLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDOUIxRSxNQUFNLENBQUMrTSxPQUFPLENBQUMvQixJQUFJLENBQUMsQ0FBQ3ZJLE9BQU8sQ0FBQyxVQUFDdUssS0FBSyxFQUFLO1VBQ3BDLElBQUFvRSxPQUFBLEdBQUE3SyxjQUFBLENBQXFCeUcsS0FBSztZQUFuQmxPLEdBQUcsR0FBQXNTLE9BQUE7WUFBRXJTLEtBQUssR0FBQXFTLE9BQUE7VUFDakJELFFBQVEsQ0FBQ0UsTUFBTSxDQUFDdlMsR0FBRyxFQUFFQyxLQUFLLENBQUM7UUFDL0IsQ0FBQyxDQUFDO01BQ047TUFFQSxPQUFPb1MsUUFBUTtJQUNuQjtFQUFDO0lBQUFyUyxHQUFBO0lBQUFpTixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFjO01BQ1YsT0FBTyxJQUFJLENBQUNsRCxPQUFPLENBQUNvQixPQUFPLElBQUksS0FBSztJQUN4Qzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBbkwsR0FBQTtJQUFBQyxLQUFBLEVBTUEsU0FBQTRSLGdCQUFnQnhDLE1BQU0sRUFBRTtNQUNwQixPQUFPbk8sTUFBTSxDQUFDcUYsSUFBSSxDQUFDOEksTUFBTSxDQUFDLENBQUNtRCxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ3hDOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVhJO0lBQUF4UyxHQUFBO0lBQUFDLEtBQUEsRUFZQSxTQUFBcU4sWUFBWUYsT0FBTyxFQUFFQyxTQUFTLEVBQUVFLElBQUksRUFBRUMsSUFBSSxFQUFFQyxLQUFLLEVBQUU7TUFDL0MsSUFBTTdCLEtBQUssR0FBRyxJQUFJeEgsS0FBSyxDQUFDZ0osT0FBTyxDQUFDO01BQ2hDeEIsS0FBSyxDQUFDeUIsU0FBUyxHQUFHQSxTQUFTLElBQUksSUFBSTtNQUNuQ3pCLEtBQUssQ0FBQzJCLElBQUksR0FBR0EsSUFBSSxJQUFJLElBQUk7TUFDekIzQixLQUFLLENBQUM0QixJQUFJLEdBQUdBLElBQUksSUFBSSxJQUFJO01BQ3pCNUIsS0FBSyxDQUFDNkIsS0FBSyxHQUFHQSxLQUFLLElBQUksRUFBRTtNQUN6QixPQUFPN0IsS0FBSztJQUNoQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBNUwsR0FBQTtJQUFBQyxLQUFBLEVBTUEsU0FBQWdLLGNBQWNqRSxJQUFJLEVBQUU7TUFDaEIsT0FBTyx5QkFBeUIsQ0FBQ2tDLElBQUksQ0FBQ2xDLElBQUksQ0FBQztJQUMvQztFQUFDO0FBQUEsRUF6MEJnQ3BHLDZEQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkc7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEEsSUFVcUI2UyxnQkFBZ0IsMEJBQUFDLFVBQUE7RUFBQSxTQUFBRCxpQkFBQTtJQUFBM1MsZUFBQSxPQUFBMlMsZ0JBQUE7SUFBQSxPQUFBOVIsVUFBQSxPQUFBOFIsZ0JBQUEsRUFBQTdSLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUE0UixnQkFBQSxFQUFBQyxVQUFBO0VBQUEsT0FBQTNTLFlBQUEsQ0FBQTBTLGdCQUFBO0lBQUF6UyxHQUFBO0lBQUFDLEtBQUE7SUFDakM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtJQUNJLFNBQUFHLFFBQUEsRUFBVTtNQUNOLE9BQU87UUFDSHVTLEtBQUssRUFBRSxPQUFPO1FBQ2RDLFNBQVMsRUFBRTtNQUNmLENBQUM7SUFDTDs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQTVTLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUEwUyxNQUFBLEVBQVE7TUFDSixJQUFJLENBQUNFLGNBQWMsQ0FBQyxDQUFDO01BQ3JCLElBQUksQ0FBQ0MsNEJBQTRCLENBQUMsQ0FBQztJQUN2Qzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQTlTLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFFLGFBQUEsRUFBZTtNQUNYLE9BQU8sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO0lBQ3BDOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBSCxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBSSxTQUFBLEVBQVc7TUFDUCxJQUFJLENBQUMwUyxjQUFjLENBQUMsQ0FBQztNQUVyQkMsSUFBQSxDQUFBOUosZUFBQSxDQUFBdUosZ0JBQUEsQ0FBQXRSLFNBQUEscUJBQUF5QixJQUFBO0lBQ0o7O0lBRUE7QUFDSjtBQUNBO0VBRkk7SUFBQTVDLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUE0UyxlQUFBLEVBQWlCO01BQUEsSUFBQTdJLEtBQUE7TUFDYjZFLE1BQU0sQ0FBQ3lCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFDMUYsS0FBSztRQUFBLE9BQUtaLEtBQUksQ0FBQ2lKLGFBQWEsQ0FBQ3JJLEtBQUssQ0FBQztNQUFBLEVBQUM7TUFDdkVpRSxNQUFNLENBQUN5QixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsVUFBQzFGLEtBQUs7UUFBQSxPQUFLWixLQUFJLENBQUNrSixZQUFZLENBQUN0SSxLQUFLLENBQUM7TUFBQSxFQUFDO01BQ3JFaUUsTUFBTSxDQUFDeUIsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQUMxRixLQUFLO1FBQUEsT0FBS1osS0FBSSxDQUFDbUosY0FBYyxDQUFDdkksS0FBSyxDQUFDO01BQUEsRUFBQztNQUN6RWlFLE1BQU0sQ0FBQ3lCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFDMUYsS0FBSztRQUFBLE9BQUtaLEtBQUksQ0FBQ29KLGFBQWEsQ0FBQ3hJLEtBQUssQ0FBQztNQUFBLEVBQUM7SUFDM0U7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEk7SUFBQTVLLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUE2Uyw2QkFBQSxFQUErQjtNQUMzQjNJLFFBQVEsQ0FBQ29GLGdCQUFnQixDQUFDLGlEQUFpRCxDQUFDLENBQUM1TCxPQUFPLENBQUMsVUFBQzZJLElBQUksRUFBSztRQUMzRkEsSUFBSSxDQUFDNkcsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7TUFDekMsQ0FBQyxDQUFDO0lBQ047O0lBRUE7QUFDSjtBQUNBO0VBRkk7SUFBQXJULEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUE4UyxlQUFBLEVBQWlCO01BQUEsSUFBQXBHLE1BQUE7TUFDYmtDLE1BQU0sQ0FBQ3lFLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxVQUFDMUksS0FBSztRQUFBLE9BQUsrQixNQUFJLENBQUNzRyxhQUFhLENBQUNySSxLQUFLLENBQUM7TUFBQSxFQUFDO01BQzFFaUUsTUFBTSxDQUFDeUUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQUMxSSxLQUFLO1FBQUEsT0FBSytCLE1BQUksQ0FBQ3VHLFlBQVksQ0FBQ3RJLEtBQUssQ0FBQztNQUFBLEVBQUM7TUFDeEVpRSxNQUFNLENBQUN5RSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsVUFBQzFJLEtBQUs7UUFBQSxPQUFLK0IsTUFBSSxDQUFDd0csY0FBYyxDQUFDdkksS0FBSyxDQUFDO01BQUEsRUFBQztNQUM1RWlFLE1BQU0sQ0FBQ3lFLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxVQUFDMUksS0FBSztRQUFBLE9BQUsrQixNQUFJLENBQUN5RyxhQUFhLENBQUN4SSxLQUFLLENBQUM7TUFBQSxFQUFDO0lBQzlFOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBNUssR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQWdULGNBQWNySSxLQUFLLEVBQUU7TUFDakI7TUFDQSxJQUFJLENBQUNBLEtBQUssQ0FBQzJJLE1BQU0sQ0FBQ0MsT0FBTyxDQUNyQiwySEFDSixDQUFDLEVBQUU7UUFDQztNQUNKO01BRUEsSUFBSSxDQUFDQyx1QkFBdUIsQ0FBQzdJLEtBQUssQ0FBQzJJLE1BQU0sQ0FBQztJQUM5Qzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUF2VCxHQUFBO0lBQUFDLEtBQUEsRUFPQSxTQUFBaVQsYUFBYXRJLEtBQUssRUFBRTtNQUNoQixJQUFJOEksY0FBYyxHQUFHOUksS0FBSyxDQUFDMkksTUFBTTtNQUVqQyxPQUFPRyxjQUFjLElBQUlBLGNBQWMsQ0FBQy9CLE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDeEQsSUFBSSxDQUFDK0IsY0FBYyxDQUFDRixPQUFPLENBQ3ZCLDJHQUNKLENBQUMsRUFBRTtVQUNDRSxjQUFjLEdBQUdBLGNBQWMsQ0FBQ0MsYUFBYTtRQUNqRCxDQUFDLE1BQU07VUFDSC9JLEtBQUssQ0FBQ2dKLGNBQWMsQ0FBQyxDQUFDO1VBQ3RCLElBQUksQ0FBQ0gsdUJBQXVCLENBQUNDLGNBQWMsQ0FBQztVQUM1QztRQUNKO01BQ0o7SUFDSjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQTFULEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFrVCxlQUFldkksS0FBSyxFQUFFO01BQ2xCO01BQ0EsSUFBSSxDQUFDQSxLQUFLLENBQUMySSxNQUFNLENBQUNDLE9BQU8sQ0FDckIsT0FDSixDQUFDLEVBQUU7UUFDQztNQUNKOztNQUVBO01BQ0EsSUFBTUssVUFBVSxHQUFHLENBQ2YsVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sVUFBVSxFQUNWLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLENBQ1Q7TUFDRCxJQUFJQSxVQUFVLENBQUNDLE9BQU8sQ0FBQ2xKLEtBQUssQ0FBQzJJLE1BQU0sQ0FBQ1EsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDOUQ7TUFDSjtNQUVBLElBQUluSixLQUFLLENBQUM1SyxHQUFHLEtBQUssT0FBTyxJQUFJNEssS0FBSyxDQUFDMkksTUFBTSxDQUFDQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUNsRSxJQUFJLENBQUNDLHVCQUF1QixDQUFDN0ksS0FBSyxDQUFDMkksTUFBTSxDQUFDO1FBQzFDM0ksS0FBSyxDQUFDZ0osY0FBYyxDQUFDLENBQUM7UUFDdEJoSixLQUFLLENBQUNvSix3QkFBd0IsQ0FBQyxDQUFDO01BQ3BDLENBQUMsTUFBTSxJQUFJcEosS0FBSyxDQUFDMkksTUFBTSxDQUFDQyxPQUFPLENBQUMscUJBQXFCLENBQUMsRUFBRTtRQUNwRCxJQUFJLENBQUNTLFVBQVUsQ0FBQ3JKLEtBQUssQ0FBQzJJLE1BQU0sQ0FBQztNQUNqQztJQUNKOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBdlQsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQW1ULGNBQWN4SSxLQUFLLEVBQUU7TUFDakI7TUFDQSxJQUFJLENBQUNBLEtBQUssQ0FBQzJJLE1BQU0sQ0FBQ0MsT0FBTyxDQUNyQixvQkFDSixDQUFDLEVBQUU7UUFDQztNQUNKO01BRUE1SSxLQUFLLENBQUNnSixjQUFjLENBQUMsQ0FBQztNQUV0QixJQUFJLENBQUNILHVCQUF1QixDQUFDN0ksS0FBSyxDQUFDMkksTUFBTSxDQUFDO0lBQzlDOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBdlQsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQXdULHdCQUF3QjVKLE9BQU8sRUFBRTtNQUM3QixJQUFNcUMsSUFBSSxHQUFHckMsT0FBTyxDQUFDcUssT0FBTztNQUU1QixJQUFNcEssT0FBTyxHQUFHZCxNQUFNLENBQUNrRCxJQUFJLENBQUNuQixPQUFPLENBQUM7TUFDcEMsSUFBTWhCLE9BQU8sR0FBRztRQUNab0IsT0FBTyxFQUFHLGdCQUFnQixJQUFJZSxJQUFJLEdBQUlsRCxNQUFNLENBQUNrRCxJQUFJLENBQUNpSSxjQUFjLENBQUMsR0FBRyxJQUFJO1FBQ3hFaEksUUFBUSxFQUFHLGlCQUFpQixJQUFJRCxJQUFJLEdBQUlsRCxNQUFNLENBQUNrRCxJQUFJLENBQUNrSSxlQUFlLENBQUMsR0FBRyxJQUFJO1FBQzNFckMsT0FBTyxFQUFHLGdCQUFnQixJQUFJN0YsSUFBSSxHQUFJbEQsTUFBTSxDQUFDa0QsSUFBSSxDQUFDbUksY0FBYyxDQUFDLEdBQUcsSUFBSTtRQUN4RTNFLEtBQUssRUFBRyxjQUFjLElBQUl4RCxJQUFLO1FBQy9CK0YsS0FBSyxFQUFHLGNBQWMsSUFBSS9GLElBQUs7UUFDL0JLLGVBQWUsRUFBRyx3QkFBd0IsSUFBSUwsSUFBSztRQUNuRE0sSUFBSSxFQUFHLGFBQWEsSUFBSU4sSUFBSSxHQUFJbEQsTUFBTSxDQUFDa0QsSUFBSSxDQUFDb0ksV0FBVyxDQUFDLEdBQUcsSUFBSTtRQUMvRGhJLEdBQUcsRUFBRyxZQUFZLElBQUlKLElBQUksR0FBSWxELE1BQU0sQ0FBQ2tELElBQUksQ0FBQ3FJLFVBQVUsQ0FBQyxHQUFHLElBQUk7UUFDNURsRixNQUFNLEVBQUcsZUFBZSxJQUFJbkQsSUFBSSxHQUFJLElBQUksQ0FBQ3NJLFNBQVMsQ0FBQ3hMLE1BQU0sQ0FBQ2tELElBQUksQ0FBQ3VJLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRTtRQUNuRnZJLElBQUksRUFBRyxhQUFhLElBQUlBLElBQUksR0FBSSxJQUFJLENBQUNzSSxTQUFTLENBQUN4TCxNQUFNLENBQUNrRCxJQUFJLENBQUN3SSxXQUFXLENBQUMsQ0FBQyxHQUFHO01BQy9FLENBQUM7TUFFRCxJQUFJLENBQUM3VSxTQUFTLENBQUNrTCxPQUFPLENBQUNsQixPQUFPLEVBQUVDLE9BQU8sRUFBRUMsT0FBTyxDQUFDO0lBQ3JEOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBL0osR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQTBVLFlBQVk1SixPQUFPLEVBQUU7TUFDakIsSUFBSSxDQUFDQSxPQUFPLENBQUNsQixPQUFPLEVBQUU7UUFDbEI7TUFDSjtNQUVBLElBQU0rSyxTQUFTLEdBQUc3SixPQUFPLENBQUNsQixPQUFPLENBQUNrSyxZQUFZLENBQUMsTUFBTSxDQUFDO01BRXRELElBQU03SCxJQUFJLEdBQUExRCxhQUFBLENBQUFBLGFBQUEsS0FDSCxJQUFJLENBQUNxTSxvQkFBb0IsQ0FBQzlKLE9BQU8sQ0FBQ2xCLE9BQU8sQ0FBQyxHQUMxQ2tCLE9BQU8sQ0FBQ2hCLE9BQU8sQ0FBQ21DLElBQUksQ0FDMUI7TUFFRCxJQUFJbkIsT0FBTyxDQUFDbEIsT0FBTyxJQUFJa0IsT0FBTyxDQUFDbEIsT0FBTyxDQUFDMkosT0FBTyxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQ3pJLE9BQU8sQ0FBQ3lCLElBQUksSUFBSW9JLFNBQVMsSUFBSSxDQUFDN0osT0FBTyxDQUFDaEIsT0FBTyxDQUFDbUMsSUFBSSxDQUFDMEksU0FBUyxDQUFDLEVBQUU7UUFDakoxSSxJQUFJLENBQUMwSSxTQUFTLENBQUMsR0FBRzdKLE9BQU8sQ0FBQ2xCLE9BQU8sQ0FBQzVKLEtBQUs7TUFDM0M7TUFFQThLLE9BQU8sQ0FBQ2hCLE9BQU8sQ0FBQ21DLElBQUksR0FBR0EsSUFBSTtJQUMvQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBbE0sR0FBQTtJQUFBQyxLQUFBLEVBTUEsU0FBQTRVLHFCQUFxQnRCLE1BQU0sRUFBRTtNQUFBLElBQUF6RixNQUFBO01BQ3pCLElBQU13QixRQUFRLEdBQUcsRUFBRTtNQUNuQixJQUFJcEQsSUFBSSxHQUFHLENBQUMsQ0FBQztNQUNiLElBQUl3SCxjQUFjLEdBQUdILE1BQU07TUFFM0IsT0FBT0csY0FBYyxDQUFDQyxhQUFhLElBQUlELGNBQWMsQ0FBQ0MsYUFBYSxDQUFDaEMsT0FBTyxLQUFLLE1BQU0sRUFBRTtRQUNwRnJDLFFBQVEsQ0FBQy9KLElBQUksQ0FBQ21PLGNBQWMsQ0FBQ0MsYUFBYSxDQUFDO1FBQzNDRCxjQUFjLEdBQUdBLGNBQWMsQ0FBQ0MsYUFBYTtNQUNqRDtNQUVBckUsUUFBUSxDQUFDOUksT0FBTyxDQUFDLENBQUM7TUFFbEI4SSxRQUFRLENBQUMzTCxPQUFPLENBQUMsVUFBQ2tHLE9BQU8sRUFBSztRQUMxQixJQUFNaUwsV0FBVyxHQUFHakwsT0FBTyxDQUFDcUssT0FBTztRQUVuQyxJQUFJLGFBQWEsSUFBSVksV0FBVyxFQUFFO1VBQzlCNUksSUFBSSxHQUFBMUQsYUFBQSxDQUFBQSxhQUFBLEtBQ0cwRCxJQUFJLEdBQ0o0QixNQUFJLENBQUMwRyxTQUFTLENBQUNNLFdBQVcsQ0FBQ0osV0FBVyxDQUFDLENBQzdDO1FBQ0w7TUFDSixDQUFDLENBQUM7TUFFRixPQUFPeEksSUFBSTtJQUNmOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUFsTSxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBdVUsVUFBVXRJLElBQUksRUFBRTtNQUNaLElBQUlqTSxLQUFLO01BRVQsSUFBSWlNLElBQUksS0FBS0osU0FBUyxFQUFFO1FBQ3BCN0wsS0FBSyxHQUFHLEVBQUU7TUFDZDtNQUNBLElBQUk4RCxPQUFBLENBQU85RCxLQUFLLE1BQUssUUFBUSxFQUFFO1FBQzNCLE9BQU9BLEtBQUs7TUFDaEI7TUFFQSxJQUFJO1FBQ0EsT0FBTyxJQUFJLENBQUNKLFNBQVMsQ0FBQ2tWLFVBQVUsQ0FBQyxDQUFDLENBQUNDLEtBQUssS0FBQTNLLE1BQUEsQ0FBSzZCLElBQUksTUFBRyxDQUFDO01BQ3pELENBQUMsQ0FBQyxPQUFPbkwsQ0FBQyxFQUFFO1FBQ1IsTUFBTSxJQUFJcUQsS0FBSyxpREFBQWlHLE1BQUEsQ0FBaUR0SixDQUFDLENBQUNxTSxPQUFPLENBQUUsQ0FBQztNQUNoRjtJQUNKO0VBQUM7SUFBQXBOLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFnVSxXQUFXcEssT0FBTyxFQUFFO01BQUEsSUFBQWtGLE1BQUE7TUFDaEIsSUFBUWtHLFNBQVMsR0FBS3BMLE9BQU8sQ0FBQ3FLLE9BQU8sQ0FBN0JlLFNBQVM7TUFDakIsSUFBTUMsUUFBUSxHQUFHckwsT0FBTyxDQUFDcUssT0FBTyxDQUFDRCxVQUFVLElBQUksR0FBRztNQUVsRCxJQUFJZ0IsU0FBUyxLQUFLbkosU0FBUyxJQUFJbUosU0FBUyxLQUFLcEwsT0FBTyxDQUFDNUosS0FBSyxFQUFFO1FBQ3hEO01BQ0o7TUFFQSxJQUFJLENBQUNrVixvQkFBb0IsQ0FBQ3RMLE9BQU8sQ0FBQztNQUVsQ0EsT0FBTyxDQUFDcUssT0FBTyxDQUFDa0IsVUFBVSxHQUFHdkcsTUFBTSxDQUFDd0csVUFBVSxDQUFDLFlBQU07UUFDakQsSUFBSXhMLE9BQU8sQ0FBQ3FLLE9BQU8sQ0FBQ25KLE9BQU8sRUFBRTtVQUN6QmdFLE1BQUksQ0FBQzBFLHVCQUF1QixDQUFDNUosT0FBTyxDQUFDO1VBQ3JDO1FBQ0o7O1FBRUE7UUFDQSxJQUFJNkosY0FBYyxHQUFHN0osT0FBTztRQUM1QixPQUFPNkosY0FBYyxDQUFDQyxhQUFhLElBQUlELGNBQWMsQ0FBQ0MsYUFBYSxDQUFDaEMsT0FBTyxLQUFLLE1BQU0sRUFBRTtVQUNwRitCLGNBQWMsR0FBR0EsY0FBYyxDQUFDQyxhQUFhO1VBRTdDLElBQUlELGNBQWMsQ0FBQy9CLE9BQU8sS0FBSyxNQUFNLElBQUkrQixjQUFjLENBQUNRLE9BQU8sQ0FBQ25KLE9BQU8sRUFBRTtZQUNyRWdFLE1BQUksQ0FBQzBFLHVCQUF1QixDQUFDQyxjQUFjLENBQUM7WUFDNUM7VUFDSjtRQUNKO01BQ0osQ0FBQyxFQUFFd0IsUUFBUSxDQUFDO0lBQ2hCO0VBQUM7SUFBQWxWLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFrVixxQkFBcUJ0TCxPQUFPLEVBQUU7TUFDMUIsSUFBSUEsT0FBTyxDQUFDcUssT0FBTyxDQUFDa0IsVUFBVSxFQUFFO1FBQzVCdkcsTUFBTSxDQUFDeUcsWUFBWSxDQUFDekwsT0FBTyxDQUFDcUssT0FBTyxDQUFDa0IsVUFBVSxDQUFDO1FBQy9DdkwsT0FBTyxDQUFDcUssT0FBTyxDQUFDa0IsVUFBVSxHQUFHLElBQUk7TUFDckM7SUFDSjtFQUFDO0FBQUEsRUE3VHlDM1UsNERBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7OytDQ1h2RCxxSkFBQUssbUJBQUEsWUFBQUEsb0JBQUEsV0FBQUMsQ0FBQSxTQUFBQyxDQUFBLEVBQUFELENBQUEsT0FBQUUsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLFNBQUEsRUFBQUMsQ0FBQSxHQUFBSCxDQUFBLENBQUFJLGNBQUEsRUFBQUMsQ0FBQSxHQUFBSixNQUFBLENBQUFLLGNBQUEsY0FBQVAsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsSUFBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsQ0FBQWhCLEtBQUEsS0FBQXVCLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLGFBQUEsdUJBQUFDLENBQUEsR0FBQU4sQ0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBaEIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUMsTUFBQSxDQUFBSyxjQUFBLENBQUFQLENBQUEsRUFBQUQsQ0FBQSxJQUFBZCxLQUFBLEVBQUFnQixDQUFBLEVBQUFnQixVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxTQUFBbkIsQ0FBQSxDQUFBRCxDQUFBLFdBQUFpQixNQUFBLG1CQUFBaEIsQ0FBQSxJQUFBZ0IsTUFBQSxZQUFBQSxPQUFBaEIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUQsQ0FBQSxDQUFBRCxDQUFBLElBQUFFLENBQUEsZ0JBQUFtQixLQUFBcEIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsRUFBQUcsQ0FBQSxRQUFBSSxDQUFBLEdBQUFULENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxTQUFBLFlBQUFrQixTQUFBLEdBQUF0QixDQUFBLEdBQUFzQixTQUFBLEVBQUFYLENBQUEsR0FBQVIsTUFBQSxDQUFBb0IsTUFBQSxDQUFBZCxDQUFBLENBQUFMLFNBQUEsR0FBQVMsQ0FBQSxPQUFBVyxPQUFBLENBQUFuQixDQUFBLGdCQUFBRSxDQUFBLENBQUFJLENBQUEsZUFBQXpCLEtBQUEsRUFBQXVDLGdCQUFBLENBQUF4QixDQUFBLEVBQUFDLENBQUEsRUFBQVcsQ0FBQSxNQUFBRixDQUFBLGFBQUFlLFNBQUF6QixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxtQkFBQXlCLElBQUEsWUFBQUMsR0FBQSxFQUFBM0IsQ0FBQSxDQUFBNEIsSUFBQSxDQUFBN0IsQ0FBQSxFQUFBRSxDQUFBLGNBQUFELENBQUEsYUFBQTBCLElBQUEsV0FBQUMsR0FBQSxFQUFBM0IsQ0FBQSxRQUFBRCxDQUFBLENBQUFxQixJQUFBLEdBQUFBLElBQUEsTUFBQVMsQ0FBQSxxQkFBQUMsQ0FBQSxxQkFBQUMsQ0FBQSxnQkFBQUMsQ0FBQSxnQkFBQUMsQ0FBQSxnQkFBQVosVUFBQSxjQUFBYSxrQkFBQSxjQUFBQywyQkFBQSxTQUFBQyxDQUFBLE9BQUFwQixNQUFBLENBQUFvQixDQUFBLEVBQUExQixDQUFBLHFDQUFBMkIsQ0FBQSxHQUFBbkMsTUFBQSxDQUFBb0MsY0FBQSxFQUFBQyxDQUFBLEdBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBQSxDQUFBLENBQUFHLE1BQUEsUUFBQUQsQ0FBQSxJQUFBQSxDQUFBLEtBQUF0QyxDQUFBLElBQUFHLENBQUEsQ0FBQXdCLElBQUEsQ0FBQVcsQ0FBQSxFQUFBN0IsQ0FBQSxNQUFBMEIsQ0FBQSxHQUFBRyxDQUFBLE9BQUFFLENBQUEsR0FBQU4sMEJBQUEsQ0FBQWhDLFNBQUEsR0FBQWtCLFNBQUEsQ0FBQWxCLFNBQUEsR0FBQUQsTUFBQSxDQUFBb0IsTUFBQSxDQUFBYyxDQUFBLFlBQUFNLHNCQUFBMUMsQ0FBQSxnQ0FBQTJDLE9BQUEsV0FBQTVDLENBQUEsSUFBQWlCLE1BQUEsQ0FBQWhCLENBQUEsRUFBQUQsQ0FBQSxZQUFBQyxDQUFBLGdCQUFBNEMsT0FBQSxDQUFBN0MsQ0FBQSxFQUFBQyxDQUFBLHNCQUFBNkMsY0FBQTdDLENBQUEsRUFBQUQsQ0FBQSxhQUFBK0MsT0FBQTdDLENBQUEsRUFBQUssQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUUsQ0FBQSxHQUFBYSxRQUFBLENBQUF6QixDQUFBLENBQUFDLENBQUEsR0FBQUQsQ0FBQSxFQUFBTSxDQUFBLG1CQUFBTSxDQUFBLENBQUFjLElBQUEsUUFBQVosQ0FBQSxHQUFBRixDQUFBLENBQUFlLEdBQUEsRUFBQUUsQ0FBQSxHQUFBZixDQUFBLENBQUE3QixLQUFBLFNBQUE0QyxDQUFBLGdCQUFBa0IsT0FBQSxDQUFBbEIsQ0FBQSxLQUFBekIsQ0FBQSxDQUFBd0IsSUFBQSxDQUFBQyxDQUFBLGVBQUE5QixDQUFBLENBQUFpRCxPQUFBLENBQUFuQixDQUFBLENBQUFvQixPQUFBLEVBQUFDLElBQUEsV0FBQWxELENBQUEsSUFBQThDLE1BQUEsU0FBQTlDLENBQUEsRUFBQVEsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBVixDQUFBLElBQUE4QyxNQUFBLFVBQUE5QyxDQUFBLEVBQUFRLENBQUEsRUFBQUUsQ0FBQSxRQUFBWCxDQUFBLENBQUFpRCxPQUFBLENBQUFuQixDQUFBLEVBQUFxQixJQUFBLFdBQUFsRCxDQUFBLElBQUFjLENBQUEsQ0FBQTdCLEtBQUEsR0FBQWUsQ0FBQSxFQUFBUSxDQUFBLENBQUFNLENBQUEsZ0JBQUFkLENBQUEsV0FBQThDLE1BQUEsVUFBQTlDLENBQUEsRUFBQVEsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsQ0FBQUUsQ0FBQSxDQUFBZSxHQUFBLFNBQUExQixDQUFBLEVBQUFLLENBQUEsb0JBQUFyQixLQUFBLFdBQUFBLE1BQUFlLENBQUEsRUFBQUksQ0FBQSxhQUFBK0MsMkJBQUEsZUFBQXBELENBQUEsV0FBQUEsQ0FBQSxFQUFBRSxDQUFBLElBQUE2QyxNQUFBLENBQUE5QyxDQUFBLEVBQUFJLENBQUEsRUFBQUwsQ0FBQSxFQUFBRSxDQUFBLGdCQUFBQSxDQUFBLEdBQUFBLENBQUEsR0FBQUEsQ0FBQSxDQUFBaUQsSUFBQSxDQUFBQywwQkFBQSxFQUFBQSwwQkFBQSxJQUFBQSwwQkFBQSxxQkFBQTNCLGlCQUFBekIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFHLENBQUEsUUFBQUUsQ0FBQSxHQUFBdUIsQ0FBQSxtQkFBQXJCLENBQUEsRUFBQUUsQ0FBQSxRQUFBSixDQUFBLEtBQUF5QixDQUFBLFFBQUFxQixLQUFBLHNDQUFBOUMsQ0FBQSxLQUFBMEIsQ0FBQSxvQkFBQXhCLENBQUEsUUFBQUUsQ0FBQSxXQUFBekIsS0FBQSxFQUFBZSxDQUFBLEVBQUFxRCxJQUFBLGVBQUFqRCxDQUFBLENBQUFrRCxNQUFBLEdBQUE5QyxDQUFBLEVBQUFKLENBQUEsQ0FBQXVCLEdBQUEsR0FBQWpCLENBQUEsVUFBQUUsQ0FBQSxHQUFBUixDQUFBLENBQUFtRCxRQUFBLE1BQUEzQyxDQUFBLFFBQUFFLENBQUEsR0FBQTBDLG1CQUFBLENBQUE1QyxDQUFBLEVBQUFSLENBQUEsT0FBQVUsQ0FBQSxRQUFBQSxDQUFBLEtBQUFtQixDQUFBLG1CQUFBbkIsQ0FBQSxxQkFBQVYsQ0FBQSxDQUFBa0QsTUFBQSxFQUFBbEQsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBckQsQ0FBQSxDQUFBc0QsS0FBQSxHQUFBdEQsQ0FBQSxDQUFBdUIsR0FBQSxzQkFBQXZCLENBQUEsQ0FBQWtELE1BQUEsUUFBQWhELENBQUEsS0FBQXVCLENBQUEsUUFBQXZCLENBQUEsR0FBQTBCLENBQUEsRUFBQTVCLENBQUEsQ0FBQXVCLEdBQUEsRUFBQXZCLENBQUEsQ0FBQXVELGlCQUFBLENBQUF2RCxDQUFBLENBQUF1QixHQUFBLHVCQUFBdkIsQ0FBQSxDQUFBa0QsTUFBQSxJQUFBbEQsQ0FBQSxDQUFBd0QsTUFBQSxXQUFBeEQsQ0FBQSxDQUFBdUIsR0FBQSxHQUFBckIsQ0FBQSxHQUFBeUIsQ0FBQSxNQUFBSyxDQUFBLEdBQUFYLFFBQUEsQ0FBQTFCLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLG9CQUFBZ0MsQ0FBQSxDQUFBVixJQUFBLFFBQUFwQixDQUFBLEdBQUFGLENBQUEsQ0FBQWlELElBQUEsR0FBQXJCLENBQUEsR0FBQUYsQ0FBQSxFQUFBTSxDQUFBLENBQUFULEdBQUEsS0FBQU0sQ0FBQSxxQkFBQWhELEtBQUEsRUFBQW1ELENBQUEsQ0FBQVQsR0FBQSxFQUFBMEIsSUFBQSxFQUFBakQsQ0FBQSxDQUFBaUQsSUFBQSxrQkFBQWpCLENBQUEsQ0FBQVYsSUFBQSxLQUFBcEIsQ0FBQSxHQUFBMEIsQ0FBQSxFQUFBNUIsQ0FBQSxDQUFBa0QsTUFBQSxZQUFBbEQsQ0FBQSxDQUFBdUIsR0FBQSxHQUFBUyxDQUFBLENBQUFULEdBQUEsbUJBQUE2QixvQkFBQXpELENBQUEsRUFBQUUsQ0FBQSxRQUFBRyxDQUFBLEdBQUFILENBQUEsQ0FBQXFELE1BQUEsRUFBQWhELENBQUEsR0FBQVAsQ0FBQSxDQUFBWSxRQUFBLENBQUFQLENBQUEsT0FBQUUsQ0FBQSxLQUFBTixDQUFBLFNBQUFDLENBQUEsQ0FBQXNELFFBQUEscUJBQUFuRCxDQUFBLElBQUFMLENBQUEsQ0FBQVksUUFBQSxlQUFBVixDQUFBLENBQUFxRCxNQUFBLGFBQUFyRCxDQUFBLENBQUEwQixHQUFBLEdBQUEzQixDQUFBLEVBQUF3RCxtQkFBQSxDQUFBekQsQ0FBQSxFQUFBRSxDQUFBLGVBQUFBLENBQUEsQ0FBQXFELE1BQUEsa0JBQUFsRCxDQUFBLEtBQUFILENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTBCLEdBQUEsT0FBQWtDLFNBQUEsdUNBQUF6RCxDQUFBLGlCQUFBNkIsQ0FBQSxNQUFBekIsQ0FBQSxHQUFBaUIsUUFBQSxDQUFBbkIsQ0FBQSxFQUFBUCxDQUFBLENBQUFZLFFBQUEsRUFBQVYsQ0FBQSxDQUFBMEIsR0FBQSxtQkFBQW5CLENBQUEsQ0FBQWtCLElBQUEsU0FBQXpCLENBQUEsQ0FBQXFELE1BQUEsWUFBQXJELENBQUEsQ0FBQTBCLEdBQUEsR0FBQW5CLENBQUEsQ0FBQW1CLEdBQUEsRUFBQTFCLENBQUEsQ0FBQXNELFFBQUEsU0FBQXRCLENBQUEsTUFBQXZCLENBQUEsR0FBQUYsQ0FBQSxDQUFBbUIsR0FBQSxTQUFBakIsQ0FBQSxHQUFBQSxDQUFBLENBQUEyQyxJQUFBLElBQUFwRCxDQUFBLENBQUFGLENBQUEsQ0FBQStELFVBQUEsSUFBQXBELENBQUEsQ0FBQXpCLEtBQUEsRUFBQWdCLENBQUEsQ0FBQThELElBQUEsR0FBQWhFLENBQUEsQ0FBQWlFLE9BQUEsZUFBQS9ELENBQUEsQ0FBQXFELE1BQUEsS0FBQXJELENBQUEsQ0FBQXFELE1BQUEsV0FBQXJELENBQUEsQ0FBQTBCLEdBQUEsR0FBQTNCLENBQUEsR0FBQUMsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBdEIsQ0FBQSxJQUFBdkIsQ0FBQSxJQUFBVCxDQUFBLENBQUFxRCxNQUFBLFlBQUFyRCxDQUFBLENBQUEwQixHQUFBLE9BQUFrQyxTQUFBLHNDQUFBNUQsQ0FBQSxDQUFBc0QsUUFBQSxTQUFBdEIsQ0FBQSxjQUFBZ0MsYUFBQWpFLENBQUEsUUFBQUQsQ0FBQSxLQUFBbUUsTUFBQSxFQUFBbEUsQ0FBQSxZQUFBQSxDQUFBLEtBQUFELENBQUEsQ0FBQW9FLFFBQUEsR0FBQW5FLENBQUEsV0FBQUEsQ0FBQSxLQUFBRCxDQUFBLENBQUFxRSxVQUFBLEdBQUFwRSxDQUFBLEtBQUFELENBQUEsQ0FBQXNFLFFBQUEsR0FBQXJFLENBQUEsV0FBQXNFLFVBQUEsQ0FBQUMsSUFBQSxDQUFBeEUsQ0FBQSxjQUFBeUUsY0FBQXhFLENBQUEsUUFBQUQsQ0FBQSxHQUFBQyxDQUFBLENBQUF5RSxVQUFBLFFBQUExRSxDQUFBLENBQUEyQixJQUFBLG9CQUFBM0IsQ0FBQSxDQUFBNEIsR0FBQSxFQUFBM0IsQ0FBQSxDQUFBeUUsVUFBQSxHQUFBMUUsQ0FBQSxhQUFBd0IsUUFBQXZCLENBQUEsU0FBQXNFLFVBQUEsTUFBQUosTUFBQSxhQUFBbEUsQ0FBQSxDQUFBMkMsT0FBQSxDQUFBc0IsWUFBQSxjQUFBUyxLQUFBLGlCQUFBbEMsT0FBQXpDLENBQUEsUUFBQUEsQ0FBQSxXQUFBQSxDQUFBLFFBQUFFLENBQUEsR0FBQUYsQ0FBQSxDQUFBVyxDQUFBLE9BQUFULENBQUEsU0FBQUEsQ0FBQSxDQUFBMkIsSUFBQSxDQUFBN0IsQ0FBQSw0QkFBQUEsQ0FBQSxDQUFBZ0UsSUFBQSxTQUFBaEUsQ0FBQSxPQUFBNEUsS0FBQSxDQUFBNUUsQ0FBQSxDQUFBNkUsTUFBQSxTQUFBdEUsQ0FBQSxPQUFBRSxDQUFBLFlBQUF1RCxLQUFBLGFBQUF6RCxDQUFBLEdBQUFQLENBQUEsQ0FBQTZFLE1BQUEsT0FBQXhFLENBQUEsQ0FBQXdCLElBQUEsQ0FBQTdCLENBQUEsRUFBQU8sQ0FBQSxVQUFBeUQsSUFBQSxDQUFBOUUsS0FBQSxHQUFBYyxDQUFBLENBQUFPLENBQUEsR0FBQXlELElBQUEsQ0FBQVYsSUFBQSxPQUFBVSxJQUFBLFNBQUFBLElBQUEsQ0FBQTlFLEtBQUEsR0FBQWUsQ0FBQSxFQUFBK0QsSUFBQSxDQUFBVixJQUFBLE9BQUFVLElBQUEsWUFBQXZELENBQUEsQ0FBQXVELElBQUEsR0FBQXZELENBQUEsZ0JBQUFxRCxTQUFBLENBQUFkLE9BQUEsQ0FBQWhELENBQUEsa0NBQUFtQyxpQkFBQSxDQUFBL0IsU0FBQSxHQUFBZ0MsMEJBQUEsRUFBQTdCLENBQUEsQ0FBQW1DLENBQUEsbUJBQUF4RCxLQUFBLEVBQUFrRCwwQkFBQSxFQUFBakIsWUFBQSxTQUFBWixDQUFBLENBQUE2QiwwQkFBQSxtQkFBQWxELEtBQUEsRUFBQWlELGlCQUFBLEVBQUFoQixZQUFBLFNBQUFnQixpQkFBQSxDQUFBMkMsV0FBQSxHQUFBN0QsTUFBQSxDQUFBbUIsMEJBQUEsRUFBQXJCLENBQUEsd0JBQUFmLENBQUEsQ0FBQStFLG1CQUFBLGFBQUE5RSxDQUFBLFFBQUFELENBQUEsd0JBQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBK0UsV0FBQSxXQUFBaEYsQ0FBQSxLQUFBQSxDQUFBLEtBQUFtQyxpQkFBQSw2QkFBQW5DLENBQUEsQ0FBQThFLFdBQUEsSUFBQTlFLENBQUEsQ0FBQWlGLElBQUEsT0FBQWpGLENBQUEsQ0FBQWtGLElBQUEsYUFBQWpGLENBQUEsV0FBQUUsTUFBQSxDQUFBZ0YsY0FBQSxHQUFBaEYsTUFBQSxDQUFBZ0YsY0FBQSxDQUFBbEYsQ0FBQSxFQUFBbUMsMEJBQUEsS0FBQW5DLENBQUEsQ0FBQW1GLFNBQUEsR0FBQWhELDBCQUFBLEVBQUFuQixNQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEseUJBQUFkLENBQUEsQ0FBQUcsU0FBQSxHQUFBRCxNQUFBLENBQUFvQixNQUFBLENBQUFtQixDQUFBLEdBQUF6QyxDQUFBLEtBQUFELENBQUEsQ0FBQXFGLEtBQUEsYUFBQXBGLENBQUEsYUFBQWlELE9BQUEsRUFBQWpELENBQUEsT0FBQTBDLHFCQUFBLENBQUFHLGFBQUEsQ0FBQTFDLFNBQUEsR0FBQWEsTUFBQSxDQUFBNkIsYUFBQSxDQUFBMUMsU0FBQSxFQUFBUyxDQUFBLGlDQUFBYixDQUFBLENBQUE4QyxhQUFBLEdBQUFBLGFBQUEsRUFBQTlDLENBQUEsQ0FBQXNGLEtBQUEsYUFBQXJGLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxlQUFBQSxDQUFBLEtBQUFBLENBQUEsR0FBQThFLE9BQUEsT0FBQTVFLENBQUEsT0FBQW1DLGFBQUEsQ0FBQXpCLElBQUEsQ0FBQXBCLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFFLENBQUEsR0FBQUUsQ0FBQSxVQUFBVCxDQUFBLENBQUErRSxtQkFBQSxDQUFBN0UsQ0FBQSxJQUFBUyxDQUFBLEdBQUFBLENBQUEsQ0FBQXFELElBQUEsR0FBQWIsSUFBQSxXQUFBbEQsQ0FBQSxXQUFBQSxDQUFBLENBQUFxRCxJQUFBLEdBQUFyRCxDQUFBLENBQUFmLEtBQUEsR0FBQXlCLENBQUEsQ0FBQXFELElBQUEsV0FBQXJCLHFCQUFBLENBQUFELENBQUEsR0FBQXpCLE1BQUEsQ0FBQXlCLENBQUEsRUFBQTNCLENBQUEsZ0JBQUFFLE1BQUEsQ0FBQXlCLENBQUEsRUFBQS9CLENBQUEsaUNBQUFNLE1BQUEsQ0FBQXlCLENBQUEsNkRBQUExQyxDQUFBLENBQUF3RixJQUFBLGFBQUF2RixDQUFBLFFBQUFELENBQUEsR0FBQUcsTUFBQSxDQUFBRixDQUFBLEdBQUFDLENBQUEsZ0JBQUFHLENBQUEsSUFBQUwsQ0FBQSxFQUFBRSxDQUFBLENBQUFzRSxJQUFBLENBQUFuRSxDQUFBLFVBQUFILENBQUEsQ0FBQXVGLE9BQUEsYUFBQXpCLEtBQUEsV0FBQTlELENBQUEsQ0FBQTJFLE1BQUEsU0FBQTVFLENBQUEsR0FBQUMsQ0FBQSxDQUFBd0YsR0FBQSxRQUFBekYsQ0FBQSxJQUFBRCxDQUFBLFNBQUFnRSxJQUFBLENBQUE5RSxLQUFBLEdBQUFlLENBQUEsRUFBQStELElBQUEsQ0FBQVYsSUFBQSxPQUFBVSxJQUFBLFdBQUFBLElBQUEsQ0FBQVYsSUFBQSxPQUFBVSxJQUFBLFFBQUFoRSxDQUFBLENBQUF5QyxNQUFBLEdBQUFBLE1BQUEsRUFBQWpCLE9BQUEsQ0FBQXBCLFNBQUEsS0FBQTRFLFdBQUEsRUFBQXhELE9BQUEsRUFBQW1ELEtBQUEsV0FBQUEsTUFBQTNFLENBQUEsYUFBQTJGLElBQUEsV0FBQTNCLElBQUEsV0FBQU4sSUFBQSxRQUFBQyxLQUFBLEdBQUExRCxDQUFBLE9BQUFxRCxJQUFBLFlBQUFFLFFBQUEsY0FBQUQsTUFBQSxnQkFBQTNCLEdBQUEsR0FBQTNCLENBQUEsT0FBQXNFLFVBQUEsQ0FBQTNCLE9BQUEsQ0FBQTZCLGFBQUEsSUFBQXpFLENBQUEsV0FBQUUsQ0FBQSxrQkFBQUEsQ0FBQSxDQUFBMEYsTUFBQSxPQUFBdkYsQ0FBQSxDQUFBd0IsSUFBQSxPQUFBM0IsQ0FBQSxNQUFBMEUsS0FBQSxFQUFBMUUsQ0FBQSxDQUFBMkYsS0FBQSxjQUFBM0YsQ0FBQSxJQUFBRCxDQUFBLE1BQUE2RixJQUFBLFdBQUFBLEtBQUEsU0FBQXhDLElBQUEsV0FBQXJELENBQUEsUUFBQXNFLFVBQUEsSUFBQUcsVUFBQSxrQkFBQXpFLENBQUEsQ0FBQTBCLElBQUEsUUFBQTFCLENBQUEsQ0FBQTJCLEdBQUEsY0FBQW1FLElBQUEsS0FBQW5DLGlCQUFBLFdBQUFBLGtCQUFBNUQsQ0FBQSxhQUFBc0QsSUFBQSxRQUFBdEQsQ0FBQSxNQUFBRSxDQUFBLGtCQUFBOEYsT0FBQTNGLENBQUEsRUFBQUUsQ0FBQSxXQUFBSSxDQUFBLENBQUFnQixJQUFBLFlBQUFoQixDQUFBLENBQUFpQixHQUFBLEdBQUE1QixDQUFBLEVBQUFFLENBQUEsQ0FBQThELElBQUEsR0FBQTNELENBQUEsRUFBQUUsQ0FBQSxLQUFBTCxDQUFBLENBQUFxRCxNQUFBLFdBQUFyRCxDQUFBLENBQUEwQixHQUFBLEdBQUEzQixDQUFBLEtBQUFNLENBQUEsYUFBQUEsQ0FBQSxRQUFBZ0UsVUFBQSxDQUFBTSxNQUFBLE1BQUF0RSxDQUFBLFNBQUFBLENBQUEsUUFBQUUsQ0FBQSxRQUFBOEQsVUFBQSxDQUFBaEUsQ0FBQSxHQUFBSSxDQUFBLEdBQUFGLENBQUEsQ0FBQWlFLFVBQUEsaUJBQUFqRSxDQUFBLENBQUEwRCxNQUFBLFNBQUE2QixNQUFBLGFBQUF2RixDQUFBLENBQUEwRCxNQUFBLFNBQUF3QixJQUFBLFFBQUE5RSxDQUFBLEdBQUFSLENBQUEsQ0FBQXdCLElBQUEsQ0FBQXBCLENBQUEsZUFBQU0sQ0FBQSxHQUFBVixDQUFBLENBQUF3QixJQUFBLENBQUFwQixDQUFBLHFCQUFBSSxDQUFBLElBQUFFLENBQUEsYUFBQTRFLElBQUEsR0FBQWxGLENBQUEsQ0FBQTJELFFBQUEsU0FBQTRCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTJELFFBQUEsZ0JBQUF1QixJQUFBLEdBQUFsRixDQUFBLENBQUE0RCxVQUFBLFNBQUEyQixNQUFBLENBQUF2RixDQUFBLENBQUE0RCxVQUFBLGNBQUF4RCxDQUFBLGFBQUE4RSxJQUFBLEdBQUFsRixDQUFBLENBQUEyRCxRQUFBLFNBQUE0QixNQUFBLENBQUF2RixDQUFBLENBQUEyRCxRQUFBLHFCQUFBckQsQ0FBQSxRQUFBc0MsS0FBQSxxREFBQXNDLElBQUEsR0FBQWxGLENBQUEsQ0FBQTRELFVBQUEsU0FBQTJCLE1BQUEsQ0FBQXZGLENBQUEsQ0FBQTRELFVBQUEsWUFBQVIsTUFBQSxXQUFBQSxPQUFBNUQsQ0FBQSxFQUFBRCxDQUFBLGFBQUFFLENBQUEsUUFBQXFFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBM0UsQ0FBQSxTQUFBQSxDQUFBLFFBQUFLLENBQUEsUUFBQWdFLFVBQUEsQ0FBQXJFLENBQUEsT0FBQUssQ0FBQSxDQUFBNEQsTUFBQSxTQUFBd0IsSUFBQSxJQUFBdEYsQ0FBQSxDQUFBd0IsSUFBQSxDQUFBdEIsQ0FBQSx3QkFBQW9GLElBQUEsR0FBQXBGLENBQUEsQ0FBQThELFVBQUEsUUFBQTVELENBQUEsR0FBQUYsQ0FBQSxhQUFBRSxDQUFBLGlCQUFBUixDQUFBLG1CQUFBQSxDQUFBLEtBQUFRLENBQUEsQ0FBQTBELE1BQUEsSUFBQW5FLENBQUEsSUFBQUEsQ0FBQSxJQUFBUyxDQUFBLENBQUE0RCxVQUFBLEtBQUE1RCxDQUFBLGNBQUFFLENBQUEsR0FBQUYsQ0FBQSxHQUFBQSxDQUFBLENBQUFpRSxVQUFBLGNBQUEvRCxDQUFBLENBQUFnQixJQUFBLEdBQUExQixDQUFBLEVBQUFVLENBQUEsQ0FBQWlCLEdBQUEsR0FBQTVCLENBQUEsRUFBQVMsQ0FBQSxTQUFBOEMsTUFBQSxnQkFBQVMsSUFBQSxHQUFBdkQsQ0FBQSxDQUFBNEQsVUFBQSxFQUFBbkMsQ0FBQSxTQUFBK0QsUUFBQSxDQUFBdEYsQ0FBQSxNQUFBc0YsUUFBQSxXQUFBQSxTQUFBaEcsQ0FBQSxFQUFBRCxDQUFBLG9CQUFBQyxDQUFBLENBQUEwQixJQUFBLFFBQUExQixDQUFBLENBQUEyQixHQUFBLHFCQUFBM0IsQ0FBQSxDQUFBMEIsSUFBQSxtQkFBQTFCLENBQUEsQ0FBQTBCLElBQUEsUUFBQXFDLElBQUEsR0FBQS9ELENBQUEsQ0FBQTJCLEdBQUEsZ0JBQUEzQixDQUFBLENBQUEwQixJQUFBLFNBQUFvRSxJQUFBLFFBQUFuRSxHQUFBLEdBQUEzQixDQUFBLENBQUEyQixHQUFBLE9BQUEyQixNQUFBLGtCQUFBUyxJQUFBLHlCQUFBL0QsQ0FBQSxDQUFBMEIsSUFBQSxJQUFBM0IsQ0FBQSxVQUFBZ0UsSUFBQSxHQUFBaEUsQ0FBQSxHQUFBa0MsQ0FBQSxLQUFBZ0UsTUFBQSxXQUFBQSxPQUFBakcsQ0FBQSxhQUFBRCxDQUFBLFFBQUF1RSxVQUFBLENBQUFNLE1BQUEsTUFBQTdFLENBQUEsU0FBQUEsQ0FBQSxRQUFBRSxDQUFBLFFBQUFxRSxVQUFBLENBQUF2RSxDQUFBLE9BQUFFLENBQUEsQ0FBQW1FLFVBQUEsS0FBQXBFLENBQUEsY0FBQWdHLFFBQUEsQ0FBQS9GLENBQUEsQ0FBQXdFLFVBQUEsRUFBQXhFLENBQUEsQ0FBQW9FLFFBQUEsR0FBQUcsYUFBQSxDQUFBdkUsQ0FBQSxHQUFBZ0MsQ0FBQSx5QkFBQWlFLE9BQUFsRyxDQUFBLGFBQUFELENBQUEsUUFBQXVFLFVBQUEsQ0FBQU0sTUFBQSxNQUFBN0UsQ0FBQSxTQUFBQSxDQUFBLFFBQUFFLENBQUEsUUFBQXFFLFVBQUEsQ0FBQXZFLENBQUEsT0FBQUUsQ0FBQSxDQUFBaUUsTUFBQSxLQUFBbEUsQ0FBQSxRQUFBSSxDQUFBLEdBQUFILENBQUEsQ0FBQXdFLFVBQUEsa0JBQUFyRSxDQUFBLENBQUFzQixJQUFBLFFBQUFwQixDQUFBLEdBQUFGLENBQUEsQ0FBQXVCLEdBQUEsRUFBQTZDLGFBQUEsQ0FBQXZFLENBQUEsWUFBQUssQ0FBQSxZQUFBOEMsS0FBQSw4QkFBQStDLGFBQUEsV0FBQUEsY0FBQXBHLENBQUEsRUFBQUUsQ0FBQSxFQUFBRyxDQUFBLGdCQUFBbUQsUUFBQSxLQUFBNUMsUUFBQSxFQUFBNkIsTUFBQSxDQUFBekMsQ0FBQSxHQUFBK0QsVUFBQSxFQUFBN0QsQ0FBQSxFQUFBK0QsT0FBQSxFQUFBNUQsQ0FBQSxvQkFBQWtELE1BQUEsVUFBQTNCLEdBQUEsR0FBQTNCLENBQUEsR0FBQWlDLENBQUEsT0FBQWxDLENBQUE7QUFBQSxTQUFBd1UsMkJBQUF0VSxDQUFBLEVBQUFGLENBQUEsUUFBQUMsQ0FBQSx5QkFBQVMsTUFBQSxJQUFBUixDQUFBLENBQUFRLE1BQUEsQ0FBQUUsUUFBQSxLQUFBVixDQUFBLHFCQUFBRCxDQUFBLFFBQUFnSCxLQUFBLENBQUFHLE9BQUEsQ0FBQWxILENBQUEsTUFBQUQsQ0FBQSxHQUFBNEcsMkJBQUEsQ0FBQTNHLENBQUEsTUFBQUYsQ0FBQSxJQUFBRSxDQUFBLHVCQUFBQSxDQUFBLENBQUEyRSxNQUFBLElBQUE1RSxDQUFBLEtBQUFDLENBQUEsR0FBQUQsQ0FBQSxPQUFBd1UsRUFBQSxNQUFBQyxDQUFBLFlBQUFBLEVBQUEsZUFBQXpTLENBQUEsRUFBQXlTLENBQUEsRUFBQXJVLENBQUEsV0FBQUEsRUFBQSxXQUFBb1UsRUFBQSxJQUFBdlUsQ0FBQSxDQUFBMkUsTUFBQSxLQUFBdkIsSUFBQSxXQUFBQSxJQUFBLE1BQUFwRSxLQUFBLEVBQUFnQixDQUFBLENBQUF1VSxFQUFBLFVBQUF6VSxDQUFBLFdBQUFBLEVBQUFFLENBQUEsVUFBQUEsQ0FBQSxLQUFBOEIsQ0FBQSxFQUFBMFMsQ0FBQSxnQkFBQTVRLFNBQUEsaUpBQUF2RCxDQUFBLEVBQUFJLENBQUEsT0FBQUksQ0FBQSxnQkFBQWtCLENBQUEsV0FBQUEsRUFBQSxJQUFBaEMsQ0FBQSxHQUFBQSxDQUFBLENBQUE0QixJQUFBLENBQUEzQixDQUFBLE1BQUFHLENBQUEsV0FBQUEsRUFBQSxRQUFBSCxDQUFBLEdBQUFELENBQUEsQ0FBQStELElBQUEsV0FBQXJELENBQUEsR0FBQVQsQ0FBQSxDQUFBb0QsSUFBQSxFQUFBcEQsQ0FBQSxLQUFBRixDQUFBLFdBQUFBLEVBQUFFLENBQUEsSUFBQWEsQ0FBQSxPQUFBUixDQUFBLEdBQUFMLENBQUEsS0FBQThCLENBQUEsV0FBQUEsRUFBQSxVQUFBckIsQ0FBQSxZQUFBVixDQUFBLGNBQUFBLENBQUEsOEJBQUFjLENBQUEsUUFBQVIsQ0FBQTtBQUFBLFNBQUFzRyw0QkFBQTNHLENBQUEsRUFBQVMsQ0FBQSxRQUFBVCxDQUFBLDJCQUFBQSxDQUFBLFNBQUE2RyxpQkFBQSxDQUFBN0csQ0FBQSxFQUFBUyxDQUFBLE9BQUFWLENBQUEsTUFBQStHLFFBQUEsQ0FBQW5GLElBQUEsQ0FBQTNCLENBQUEsRUFBQTJGLEtBQUEsNkJBQUE1RixDQUFBLElBQUFDLENBQUEsQ0FBQThFLFdBQUEsS0FBQS9FLENBQUEsR0FBQUMsQ0FBQSxDQUFBOEUsV0FBQSxDQUFBQyxJQUFBLGFBQUFoRixDQUFBLGNBQUFBLENBQUEsR0FBQWdILEtBQUEsQ0FBQUMsSUFBQSxDQUFBaEgsQ0FBQSxvQkFBQUQsQ0FBQSwrQ0FBQWtILElBQUEsQ0FBQWxILENBQUEsSUFBQThHLGlCQUFBLENBQUE3RyxDQUFBLEVBQUFTLENBQUE7QUFBQSxTQUFBb0csa0JBQUE3RyxDQUFBLEVBQUFTLENBQUEsYUFBQUEsQ0FBQSxJQUFBQSxDQUFBLEdBQUFULENBQUEsQ0FBQTJFLE1BQUEsTUFBQWxFLENBQUEsR0FBQVQsQ0FBQSxDQUFBMkUsTUFBQSxZQUFBN0UsQ0FBQSxNQUFBSyxDQUFBLEdBQUE0RyxLQUFBLENBQUF0RyxDQUFBLEdBQUFYLENBQUEsR0FBQVcsQ0FBQSxFQUFBWCxDQUFBLElBQUFLLENBQUEsQ0FBQUwsQ0FBQSxJQUFBRSxDQUFBLENBQUFGLENBQUEsVUFBQUssQ0FBQTtBQUFBLFNBQUFnRyxtQkFBQWhHLENBQUEsRUFBQUosQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsRUFBQUssQ0FBQSxFQUFBSSxDQUFBLEVBQUFFLENBQUEsY0FBQUosQ0FBQSxHQUFBSixDQUFBLENBQUFNLENBQUEsRUFBQUUsQ0FBQSxHQUFBRSxDQUFBLEdBQUFOLENBQUEsQ0FBQXZCLEtBQUEsV0FBQW1CLENBQUEsZ0JBQUFMLENBQUEsQ0FBQUssQ0FBQSxLQUFBSSxDQUFBLENBQUE2QyxJQUFBLEdBQUFyRCxDQUFBLENBQUFjLENBQUEsSUFBQXdFLE9BQUEsQ0FBQXRDLE9BQUEsQ0FBQWxDLENBQUEsRUFBQW9DLElBQUEsQ0FBQWpELENBQUEsRUFBQUssQ0FBQTtBQUFBLFNBQUErRixrQkFBQWpHLENBQUEsNkJBQUFKLENBQUEsU0FBQUQsQ0FBQSxHQUFBSCxTQUFBLGFBQUEwRixPQUFBLFdBQUFyRixDQUFBLEVBQUFLLENBQUEsUUFBQUksQ0FBQSxHQUFBTixDQUFBLENBQUFrRyxLQUFBLENBQUF0RyxDQUFBLEVBQUFELENBQUEsWUFBQXdHLE1BQUFuRyxDQUFBLElBQUFnRyxrQkFBQSxDQUFBMUYsQ0FBQSxFQUFBVCxDQUFBLEVBQUFLLENBQUEsRUFBQWlHLEtBQUEsRUFBQUMsTUFBQSxVQUFBcEcsQ0FBQSxjQUFBb0csT0FBQXBHLENBQUEsSUFBQWdHLGtCQUFBLENBQUExRixDQUFBLEVBQUFULENBQUEsRUFBQUssQ0FBQSxFQUFBaUcsS0FBQSxFQUFBQyxNQUFBLFdBQUFwRyxDQUFBLEtBQUFtRyxLQUFBO0FBQUEsU0FBQXpILGdCQUFBNEIsQ0FBQSxFQUFBTixDQUFBLFVBQUFNLENBQUEsWUFBQU4sQ0FBQSxhQUFBeUQsU0FBQTtBQUFBLFNBQUFnRSxrQkFBQTlILENBQUEsRUFBQUUsQ0FBQSxhQUFBRCxDQUFBLE1BQUFBLENBQUEsR0FBQUMsQ0FBQSxDQUFBMkUsTUFBQSxFQUFBNUUsQ0FBQSxVQUFBTSxDQUFBLEdBQUFMLENBQUEsQ0FBQUQsQ0FBQSxHQUFBTSxDQUFBLENBQUFXLFVBQUEsR0FBQVgsQ0FBQSxDQUFBVyxVQUFBLFFBQUFYLENBQUEsQ0FBQVksWUFBQSxrQkFBQVosQ0FBQSxLQUFBQSxDQUFBLENBQUFhLFFBQUEsUUFBQWpCLE1BQUEsQ0FBQUssY0FBQSxDQUFBUixDQUFBLEVBQUE2SCxjQUFBLENBQUF0SCxDQUFBLENBQUF0QixHQUFBLEdBQUFzQixDQUFBO0FBQUEsU0FBQXZCLGFBQUFnQixDQUFBLEVBQUFFLENBQUEsRUFBQUQsQ0FBQSxXQUFBQyxDQUFBLElBQUE0SCxpQkFBQSxDQUFBOUgsQ0FBQSxDQUFBSSxTQUFBLEVBQUFGLENBQUEsR0FBQUQsQ0FBQSxJQUFBNkgsaUJBQUEsQ0FBQTlILENBQUEsRUFBQUMsQ0FBQSxHQUFBRSxNQUFBLENBQUFLLGNBQUEsQ0FBQVIsQ0FBQSxpQkFBQW9CLFFBQUEsU0FBQXBCLENBQUE7QUFBQSxTQUFBNkgsZUFBQTVILENBQUEsUUFBQVEsQ0FBQSxHQUFBc0gsWUFBQSxDQUFBOUgsQ0FBQSxnQ0FBQStDLE9BQUEsQ0FBQXZDLENBQUEsSUFBQUEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQXNILGFBQUE5SCxDQUFBLEVBQUFDLENBQUEsb0JBQUE4QyxPQUFBLENBQUEvQyxDQUFBLE1BQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBRCxDQUFBLEdBQUFDLENBQUEsQ0FBQVMsTUFBQSxDQUFBc0gsV0FBQSxrQkFBQWhJLENBQUEsUUFBQVMsQ0FBQSxHQUFBVCxDQUFBLENBQUE2QixJQUFBLENBQUE1QixDQUFBLEVBQUFDLENBQUEsZ0NBQUE4QyxPQUFBLENBQUF2QyxDQUFBLFVBQUFBLENBQUEsWUFBQXFELFNBQUEseUVBQUE1RCxDQUFBLEdBQUErSCxNQUFBLEdBQUFDLE1BQUEsRUFBQWpJLENBQUE7QUFBQSxTQUFBTCxXQUFBSyxDQUFBLEVBQUFNLENBQUEsRUFBQVAsQ0FBQSxXQUFBTyxDQUFBLEdBQUE0SCxlQUFBLENBQUE1SCxDQUFBLEdBQUE2SCwwQkFBQSxDQUFBbkksQ0FBQSxFQUFBb0kseUJBQUEsS0FBQUMsT0FBQSxDQUFBbkosU0FBQSxDQUFBb0IsQ0FBQSxFQUFBUCxDQUFBLFFBQUFtSSxlQUFBLENBQUFsSSxDQUFBLEVBQUErRSxXQUFBLElBQUF6RSxDQUFBLENBQUFnRyxLQUFBLENBQUF0RyxDQUFBLEVBQUFELENBQUE7QUFBQSxTQUFBb0ksMkJBQUFuSSxDQUFBLEVBQUFELENBQUEsUUFBQUEsQ0FBQSxpQkFBQWdELE9BQUEsQ0FBQWhELENBQUEsMEJBQUFBLENBQUEsVUFBQUEsQ0FBQSxpQkFBQUEsQ0FBQSxZQUFBOEQsU0FBQSxxRUFBQXlFLHNCQUFBLENBQUF0SSxDQUFBO0FBQUEsU0FBQXNJLHVCQUFBdkksQ0FBQSxtQkFBQUEsQ0FBQSxZQUFBd0ksY0FBQSxzRUFBQXhJLENBQUE7QUFBQSxTQUFBcUksMEJBQUEsY0FBQXBJLENBQUEsSUFBQXdJLE9BQUEsQ0FBQXJJLFNBQUEsQ0FBQXNJLE9BQUEsQ0FBQTdHLElBQUEsQ0FBQXlHLE9BQUEsQ0FBQW5KLFNBQUEsQ0FBQXNKLE9BQUEsaUNBQUF4SSxDQUFBLGFBQUFvSSx5QkFBQSxZQUFBQSwwQkFBQSxhQUFBcEksQ0FBQTtBQUFBLFNBQUFrSSxnQkFBQWxJLENBQUEsV0FBQWtJLGVBQUEsR0FBQWhJLE1BQUEsQ0FBQWdGLGNBQUEsR0FBQWhGLE1BQUEsQ0FBQW9DLGNBQUEsQ0FBQW9HLElBQUEsZUFBQTFJLENBQUEsV0FBQUEsQ0FBQSxDQUFBbUYsU0FBQSxJQUFBakYsTUFBQSxDQUFBb0MsY0FBQSxDQUFBdEMsQ0FBQSxNQUFBa0ksZUFBQSxDQUFBbEksQ0FBQTtBQUFBLFNBQUFILFVBQUFHLENBQUEsRUFBQUQsQ0FBQSw2QkFBQUEsQ0FBQSxhQUFBQSxDQUFBLFlBQUE4RCxTQUFBLHdEQUFBN0QsQ0FBQSxDQUFBRyxTQUFBLEdBQUFELE1BQUEsQ0FBQW9CLE1BQUEsQ0FBQXZCLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxTQUFBLElBQUE0RSxXQUFBLElBQUE5RixLQUFBLEVBQUFlLENBQUEsRUFBQW1CLFFBQUEsTUFBQUQsWUFBQSxXQUFBaEIsTUFBQSxDQUFBSyxjQUFBLENBQUFQLENBQUEsaUJBQUFtQixRQUFBLFNBQUFwQixDQUFBLElBQUE0SSxlQUFBLENBQUEzSSxDQUFBLEVBQUFELENBQUE7QUFBQSxTQUFBNEksZ0JBQUEzSSxDQUFBLEVBQUFELENBQUEsV0FBQTRJLGVBQUEsR0FBQXpJLE1BQUEsQ0FBQWdGLGNBQUEsR0FBQWhGLE1BQUEsQ0FBQWdGLGNBQUEsQ0FBQXdELElBQUEsZUFBQTFJLENBQUEsRUFBQUQsQ0FBQSxXQUFBQyxDQUFBLENBQUFtRixTQUFBLEdBQUFwRixDQUFBLEVBQUFDLENBQUEsS0FBQTJJLGVBQUEsQ0FBQTNJLENBQUEsRUFBQUQsQ0FBQTtBQUQrQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsQkEsSUFtQnFCMlUsV0FBVywwQkFBQWhELFVBQUE7RUFBQSxTQUFBZ0QsWUFBQTtJQUFBNVYsZUFBQSxPQUFBNFYsV0FBQTtJQUFBLE9BQUEvVSxVQUFBLE9BQUErVSxXQUFBLEVBQUE5VSxTQUFBO0VBQUE7RUFBQUMsU0FBQSxDQUFBNlUsV0FBQSxFQUFBaEQsVUFBQTtFQUFBLE9BQUEzUyxZQUFBLENBQUEyVixXQUFBO0lBQUExVixHQUFBO0lBQUFDLEtBQUE7SUFDNUI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtJQUNJLFNBQUFHLFFBQUEsRUFBVTtNQUNOLE9BQU87UUFDSHVWLGNBQWMsRUFBRTtNQUNwQixDQUFDO0lBQ0w7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUEzVixHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBRSxhQUFBLEVBQWU7TUFDWCxPQUFPLENBQ0gsS0FBSyxDQUNSO0lBQ0w7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQW5CSTtJQUFBSCxHQUFBO0lBQUFDLEtBQUE7TUFBQSxJQUFBMlYsS0FBQSxHQUFBdk8saUJBQUEsZUFBQXZHLG1CQUFBLEdBQUFtRixJQUFBLENBb0JBLFNBQUF3SSxRQUFXeUMsTUFBTTtRQUFBLElBQUEyRSxTQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxFQUFBQyxVQUFBLEVBQUFDLE1BQUEsRUFBQUMsS0FBQSxFQUFBQyxVQUFBLEVBQUFDLE1BQUEsRUFBQUMsS0FBQTtRQUFBLE9BQUF2VixtQkFBQSxHQUFBc0IsSUFBQSxVQUFBc00sU0FBQUMsUUFBQTtVQUFBLGtCQUFBQSxRQUFBLENBQUFqSSxJQUFBLEdBQUFpSSxRQUFBLENBQUE1SixJQUFBO1lBQUE7Y0FBQSxNQUNUbU0sTUFBTSxDQUFDb0YsRUFBRSxJQUFJcEYsTUFBTSxDQUFDb0YsRUFBRSxDQUFDMVEsTUFBTSxHQUFHLENBQUM7Z0JBQUErSSxRQUFBLENBQUE1SixJQUFBO2dCQUFBO2NBQUE7Y0FBQThRLFNBQUEsR0FBQU4sMEJBQUEsQ0FDWnJFLE1BQU0sQ0FBQ29GLEVBQUU7Y0FBQTNILFFBQUEsQ0FBQWpJLElBQUE7Y0FBQW1QLFNBQUEsQ0FBQTdTLENBQUE7WUFBQTtjQUFBLEtBQUE4UyxLQUFBLEdBQUFELFNBQUEsQ0FBQXpVLENBQUEsSUFBQWlELElBQUE7Z0JBQUFzSyxRQUFBLENBQUE1SixJQUFBO2dCQUFBO2NBQUE7Y0FBbkJnUixNQUFNLEdBQUFELEtBQUEsQ0FBQTdWLEtBQUE7Y0FBQTBPLFFBQUEsQ0FBQWpJLElBQUE7Y0FBQWlJLFFBQUEsQ0FBQTVKLElBQUE7Y0FBQSxPQUVILElBQUksQ0FBQ3dSLFVBQVUsQ0FBQ1IsTUFBTSxDQUFDO1lBQUE7Y0FBQXBILFFBQUEsQ0FBQTVKLElBQUE7Y0FBQTtZQUFBO2NBQUE0SixRQUFBLENBQUFqSSxJQUFBO2NBQUFpSSxRQUFBLENBQUErQyxFQUFBLEdBQUEvQyxRQUFBO2NBQUEsT0FBQUEsUUFBQSxDQUFBL0osTUFBQSxXQUV0QjBCLE9BQU8sQ0FBQ3VHLE1BQU0sQ0FBQThCLFFBQUEsQ0FBQStDLEVBQU0sQ0FBQztZQUFBO2NBQUEvQyxRQUFBLENBQUE1SixJQUFBO2NBQUE7WUFBQTtjQUFBNEosUUFBQSxDQUFBNUosSUFBQTtjQUFBO1lBQUE7Y0FBQTRKLFFBQUEsQ0FBQWpJLElBQUE7Y0FBQWlJLFFBQUEsQ0FBQTZILEVBQUEsR0FBQTdILFFBQUE7Y0FBQWtILFNBQUEsQ0FBQTlVLENBQUEsQ0FBQTROLFFBQUEsQ0FBQTZILEVBQUE7WUFBQTtjQUFBN0gsUUFBQSxDQUFBakksSUFBQTtjQUFBbVAsU0FBQSxDQUFBOVMsQ0FBQTtjQUFBLE9BQUE0TCxRQUFBLENBQUExSCxNQUFBO1lBQUE7Y0FBQSxNQUtwQ2lLLE1BQU0sQ0FBQ3VGLEdBQUcsSUFBSXZGLE1BQU0sQ0FBQ3VGLEdBQUcsQ0FBQzdRLE1BQU0sR0FBRyxDQUFDO2dCQUFBK0ksUUFBQSxDQUFBNUosSUFBQTtnQkFBQTtjQUFBO2NBQUFpUixVQUFBLEdBQUFULDBCQUFBLENBQ2ZyRSxNQUFNLENBQUN1RixHQUFHO2NBQUE5SCxRQUFBLENBQUFqSSxJQUFBO2NBQUFzUCxVQUFBLENBQUFoVCxDQUFBO1lBQUE7Y0FBQSxLQUFBaVQsTUFBQSxHQUFBRCxVQUFBLENBQUE1VSxDQUFBLElBQUFpRCxJQUFBO2dCQUFBc0ssUUFBQSxDQUFBNUosSUFBQTtnQkFBQTtjQUFBO2NBQW5CbVIsS0FBSyxHQUFBRCxNQUFBLENBQUFoVyxLQUFBO2NBQUEwTyxRQUFBLENBQUFqSSxJQUFBO2NBQUFpSSxRQUFBLENBQUE1SixJQUFBO2NBQUEsT0FFRixJQUFJLENBQUMyUixTQUFTLENBQUNSLEtBQUssQ0FBQztZQUFBO2NBQUF2SCxRQUFBLENBQUE1SixJQUFBO2NBQUE7WUFBQTtjQUFBNEosUUFBQSxDQUFBakksSUFBQTtjQUFBaUksUUFBQSxDQUFBZ0ksRUFBQSxHQUFBaEksUUFBQTtjQUFBLE9BQUFBLFFBQUEsQ0FBQS9KLE1BQUEsV0FFcEIwQixPQUFPLENBQUN1RyxNQUFNLENBQUE4QixRQUFBLENBQUFnSSxFQUFNLENBQUM7WUFBQTtjQUFBaEksUUFBQSxDQUFBNUosSUFBQTtjQUFBO1lBQUE7Y0FBQTRKLFFBQUEsQ0FBQTVKLElBQUE7Y0FBQTtZQUFBO2NBQUE0SixRQUFBLENBQUFqSSxJQUFBO2NBQUFpSSxRQUFBLENBQUFpSSxFQUFBLEdBQUFqSSxRQUFBO2NBQUFxSCxVQUFBLENBQUFqVixDQUFBLENBQUE0TixRQUFBLENBQUFpSSxFQUFBO1lBQUE7Y0FBQWpJLFFBQUEsQ0FBQWpJLElBQUE7Y0FBQXNQLFVBQUEsQ0FBQWpULENBQUE7Y0FBQSxPQUFBNEwsUUFBQSxDQUFBMUgsTUFBQTtZQUFBO2NBQUEsTUFLcENpSyxNQUFNLENBQUMyRixHQUFHLElBQUkzRixNQUFNLENBQUMyRixHQUFHLENBQUNqUixNQUFNLEdBQUcsQ0FBQztnQkFBQStJLFFBQUEsQ0FBQTVKLElBQUE7Z0JBQUE7Y0FBQTtjQUFBb1IsVUFBQSxHQUFBWiwwQkFBQSxDQUNmckUsTUFBTSxDQUFDMkYsR0FBRztjQUFBbEksUUFBQSxDQUFBakksSUFBQTtjQUFBeVAsVUFBQSxDQUFBblQsQ0FBQTtZQUFBO2NBQUEsS0FBQW9ULE1BQUEsR0FBQUQsVUFBQSxDQUFBL1UsQ0FBQSxJQUFBaUQsSUFBQTtnQkFBQXNLLFFBQUEsQ0FBQTVKLElBQUE7Z0JBQUE7Y0FBQTtjQUFuQnNSLEtBQUssR0FBQUQsTUFBQSxDQUFBblcsS0FBQTtjQUFBME8sUUFBQSxDQUFBakksSUFBQTtjQUFBaUksUUFBQSxDQUFBNUosSUFBQTtjQUFBLE9BRUYsSUFBSSxDQUFDK1IsU0FBUyxDQUFDVCxLQUFLLENBQUM7WUFBQTtjQUFBMUgsUUFBQSxDQUFBNUosSUFBQTtjQUFBO1lBQUE7Y0FBQTRKLFFBQUEsQ0FBQWpJLElBQUE7Y0FBQWlJLFFBQUEsQ0FBQW9JLEVBQUEsR0FBQXBJLFFBQUE7Y0FBQSxPQUFBQSxRQUFBLENBQUEvSixNQUFBLFdBRXBCMEIsT0FBTyxDQUFDdUcsTUFBTSxDQUFBOEIsUUFBQSxDQUFBb0ksRUFBTSxDQUFDO1lBQUE7Y0FBQXBJLFFBQUEsQ0FBQTVKLElBQUE7Y0FBQTtZQUFBO2NBQUE0SixRQUFBLENBQUE1SixJQUFBO2NBQUE7WUFBQTtjQUFBNEosUUFBQSxDQUFBakksSUFBQTtjQUFBaUksUUFBQSxDQUFBcUksRUFBQSxHQUFBckksUUFBQTtjQUFBd0gsVUFBQSxDQUFBcFYsQ0FBQSxDQUFBNE4sUUFBQSxDQUFBcUksRUFBQTtZQUFBO2NBQUFySSxRQUFBLENBQUFqSSxJQUFBO2NBQUF5UCxVQUFBLENBQUFwVCxDQUFBO2NBQUEsT0FBQTRMLFFBQUEsQ0FBQTFILE1BQUE7WUFBQTtjQUFBLE9BQUEwSCxRQUFBLENBQUEvSixNQUFBLFdBS2pDMEIsT0FBTyxDQUFDdEMsT0FBTyxDQUFDLENBQUM7WUFBQTtZQUFBO2NBQUEsT0FBQTJLLFFBQUEsQ0FBQTlILElBQUE7VUFBQTtRQUFBLEdBQUE0SCxPQUFBO01BQUEsQ0FDM0I7TUFBQSxTQUFBd0ksS0FBQUMsRUFBQTtRQUFBLE9BQUF0QixLQUFBLENBQUF0TyxLQUFBLE9BQUExRyxTQUFBO01BQUE7TUFBQSxPQUFBcVcsSUFBQTtJQUFBO0lBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQVBJO0VBQUE7SUFBQWpYLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUFzVyxXQUFXUixNQUFNLEVBQUU7TUFBQSxJQUFBL0wsS0FBQTtNQUNmLE9BQU8sSUFBSTFELE9BQU8sQ0FBQyxVQUFDdEMsT0FBTyxFQUFFNkksTUFBTSxFQUFLO1FBQ3BDO1FBQ0FrSixNQUFNLEdBQUcvTCxLQUFJLENBQUNuSyxTQUFTLENBQUN5TSxHQUFHLENBQUMsQ0FBQyxDQUFDNkssS0FBSyxDQUFDcEIsTUFBTSxDQUFDOztRQUUzQztRQUNBLElBQU1xQixNQUFNLEdBQUdqTixRQUFRLENBQUNDLGFBQWEsaUJBQUFDLE1BQUEsQ0FBZ0IwTCxNQUFNLFFBQUksQ0FBQztRQUNoRSxJQUFJcUIsTUFBTSxFQUFFO1VBQ1JwVCxPQUFPLENBQUMsQ0FBQztVQUNUO1FBQ0o7O1FBRUE7UUFDQSxJQUFNcVQsU0FBUyxHQUFHbE4sUUFBUSxDQUFDbU4sYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUNsREQsU0FBUyxDQUFDaEUsWUFBWSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQztRQUNqRGdFLFNBQVMsQ0FBQ2hFLFlBQVksQ0FBQyxLQUFLLEVBQUUwQyxNQUFNLENBQUM7UUFDckNzQixTQUFTLENBQUMvRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsWUFBTTtVQUNyQ3RHLEtBQUksQ0FBQ25LLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQUVvTCxNQUFNLEVBQUVzQixTQUFTLENBQUM7VUFDN0VyVCxPQUFPLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQztRQUNGcVQsU0FBUyxDQUFDL0csZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFlBQU07VUFDdEN0RyxLQUFJLENBQUNuSyxTQUFTLENBQUM4SyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFb0wsTUFBTSxFQUFFc0IsU0FBUyxDQUFDO1VBQzVFeEssTUFBTSxDQUFDLElBQUl6SSxLQUFLLGtDQUFBaUcsTUFBQSxDQUFpQzBMLE1BQU0sT0FBRyxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDO1FBQ0Y1TCxRQUFRLENBQUM4QixJQUFJLENBQUNzRyxNQUFNLENBQUM4RSxTQUFTLENBQUM7TUFDbkMsQ0FBQyxDQUFDO0lBQ047O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBJO0lBQUFyWCxHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBeVcsVUFBVVIsS0FBSyxFQUFFO01BQUEsSUFBQXZKLE1BQUE7TUFDYixPQUFPLElBQUlyRyxPQUFPLENBQUMsVUFBQ3RDLE9BQU8sRUFBRTZJLE1BQU0sRUFBSztRQUNwQztRQUNBcUosS0FBSyxHQUFHdkosTUFBSSxDQUFDOU0sU0FBUyxDQUFDeU0sR0FBRyxDQUFDLENBQUMsQ0FBQzZLLEtBQUssQ0FBQ2pCLEtBQUssQ0FBQzs7UUFFekM7UUFDQSxJQUFNa0IsTUFBTSxHQUFHak4sUUFBUSxDQUFDQyxhQUFhLG9DQUFBQyxNQUFBLENBQWlDNkwsS0FBSyxRQUFJLENBQUM7UUFDaEYsSUFBSWtCLE1BQU0sRUFBRTtVQUNScFQsT0FBTyxDQUFDLENBQUM7VUFDVDtRQUNKOztRQUVBO1FBQ0EsSUFBTXVULE1BQU0sR0FBR3BOLFFBQVEsQ0FBQ21OLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDN0NDLE1BQU0sQ0FBQ2xFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQ3hDa0UsTUFBTSxDQUFDbEUsWUFBWSxDQUFDLE1BQU0sRUFBRTZDLEtBQUssQ0FBQztRQUNsQ3FCLE1BQU0sQ0FBQ2pILGdCQUFnQixDQUFDLE1BQU0sRUFBRSxZQUFNO1VBQ2xDM0QsTUFBSSxDQUFDOU0sU0FBUyxDQUFDOEssV0FBVyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sRUFBRXVMLEtBQUssRUFBRXFCLE1BQU0sQ0FBQztVQUN4RXZULE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0Z1VCxNQUFNLENBQUNqSCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsWUFBTTtVQUNuQzNELE1BQUksQ0FBQzlNLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUV1TCxLQUFLLEVBQUVxQixNQUFNLENBQUM7VUFDdkUxSyxNQUFNLENBQUMsSUFBSXpJLEtBQUssc0NBQUFpRyxNQUFBLENBQXFDNkwsS0FBSyxPQUFHLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUM7UUFDRi9MLFFBQVEsQ0FBQ3FOLElBQUksQ0FBQ2pGLE1BQU0sQ0FBQ2dGLE1BQU0sQ0FBQztNQUNoQyxDQUFDLENBQUM7SUFDTjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEk7SUFBQXZYLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUE2VyxVQUFVVCxLQUFLLEVBQUU7TUFBQSxJQUFBdkksTUFBQTtNQUNiLE9BQU8sSUFBSXhILE9BQU8sQ0FBQyxVQUFDdEMsT0FBTyxFQUFFNkksTUFBTSxFQUFLO1FBQ3BDO1FBQ0F3SixLQUFLLEdBQUd2SSxNQUFJLENBQUNqTyxTQUFTLENBQUN5TSxHQUFHLENBQUMsQ0FBQyxDQUFDNkssS0FBSyxDQUFDZCxLQUFLLENBQUM7UUFFekMsSUFBTVEsR0FBRyxHQUFHLElBQUlZLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCWixHQUFHLENBQUN2RyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsWUFBTTtVQUMvQnhDLE1BQUksQ0FBQ2pPLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLEVBQUUwTCxLQUFLLEVBQUVRLEdBQUcsQ0FBQztVQUNyRTdTLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0Y2UyxHQUFHLENBQUN2RyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsWUFBTTtVQUNoQ3hDLE1BQUksQ0FBQ2pPLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUwTCxLQUFLLEVBQUVRLEdBQUcsQ0FBQztVQUNwRWhLLE1BQU0sQ0FBQyxJQUFJekksS0FBSyxpQ0FBQWlHLE1BQUEsQ0FBZ0NnTSxLQUFLLE9BQUcsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQztRQUNGUSxHQUFHLENBQUNhLEdBQUcsR0FBR3JCLEtBQUs7TUFDbkIsQ0FBQyxDQUFDO0lBQ047RUFBQztBQUFBLEVBN0tvQzVWLDREQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JCSDs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEEsSUFNcUJrWCxhQUFhLDBCQUFBakYsVUFBQTtFQUFBLFNBQUFpRixjQUFBO0lBQUE3WCxlQUFBLE9BQUE2WCxhQUFBO0lBQUEsT0FBQWhYLFVBQUEsT0FBQWdYLGFBQUEsRUFBQS9XLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUE4VyxhQUFBLEVBQUFqRixVQUFBO0VBQUEsT0FBQTNTLFlBQUEsQ0FBQTRYLGFBQUE7SUFBQTNYLEdBQUE7SUFBQUMsS0FBQTtJQUM5QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0lBQ0ksU0FBQUUsYUFBQSxFQUFlO01BQ1gsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUN0Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQUgsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQUcsUUFBQSxFQUFVO01BQ04sT0FBTztRQUNId1gsU0FBUyxFQUFFLFdBQVc7UUFDdEJDLFFBQVEsRUFBRTtNQUNkLENBQUM7SUFDTDtFQUFDO0lBQUE3WCxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBMlgsVUFBVS9KLE9BQU8sRUFBRTlDLE9BQU8sRUFBRTtNQUFBLElBQUFmLEtBQUE7TUFDeEIsSUFBSSxDQUFDZSxPQUFPLENBQUNsQixPQUFPLEVBQUU7UUFDbEI7TUFDSjtNQUVBLElBQUlrQixPQUFPLENBQUNsQixPQUFPLENBQUM4SCxPQUFPLEtBQUssTUFBTSxFQUFFO1FBQ3BDLElBQU1tRyxZQUFZLEdBQUcvTSxPQUFPLENBQUNsQixPQUFPLENBQUMwRixnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQztRQUM5RSxJQUFJdUksWUFBWSxDQUFDbFMsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUN6QmtTLFlBQVksQ0FBQ25VLE9BQU8sQ0FBQyxVQUFDa0csT0FBTyxFQUFLO1lBQzlCQSxPQUFPLENBQUNrTyxTQUFTLENBQUNDLEdBQUcsQ0FBQ2hPLEtBQUksQ0FBQ2lPLGVBQWUsQ0FBQ3BPLE9BQU8sQ0FBQyxDQUFDO1VBQ3hELENBQUMsQ0FBQztRQUNOO01BQ0osQ0FBQyxNQUFNLElBQUlrQixPQUFPLENBQUNsQixPQUFPLENBQUNxSyxPQUFPLENBQUNnRSxhQUFhLEtBQUtwTSxTQUFTLEVBQUU7UUFDNURmLE9BQU8sQ0FBQ2xCLE9BQU8sQ0FBQ2tPLFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLElBQUksQ0FBQ0MsZUFBZSxDQUFDbE4sT0FBTyxDQUFDbEIsT0FBTyxDQUFDLENBQUM7TUFDeEU7SUFDSjtFQUFDO0lBQUE3SixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBNFgsU0FBUzNMLElBQUksRUFBRW5CLE9BQU8sRUFBRTtNQUFBLElBQUE0QixNQUFBO01BQ3BCLElBQUksQ0FBQzVCLE9BQU8sQ0FBQ2xCLE9BQU8sRUFBRTtRQUNsQjtNQUNKO01BRUEsSUFBSWtCLE9BQU8sQ0FBQ2xCLE9BQU8sQ0FBQzhILE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDcEMsSUFBTW1HLFlBQVksR0FBRy9NLE9BQU8sQ0FBQ2xCLE9BQU8sQ0FBQzBGLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDO1FBQzlFLElBQUl1SSxZQUFZLENBQUNsUyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ3pCa1MsWUFBWSxDQUFDblUsT0FBTyxDQUFDLFVBQUNrRyxPQUFPLEVBQUs7WUFDOUJBLE9BQU8sQ0FBQ2tPLFNBQVMsQ0FBQ0ksTUFBTSxDQUFDeEwsTUFBSSxDQUFDc0wsZUFBZSxDQUFDcE8sT0FBTyxDQUFDLENBQUM7VUFDM0QsQ0FBQyxDQUFDO1FBQ047TUFDSixDQUFDLE1BQU0sSUFBSWtCLE9BQU8sQ0FBQ2xCLE9BQU8sQ0FBQ3FLLE9BQU8sQ0FBQ2dFLGFBQWEsS0FBS3BNLFNBQVMsRUFBRTtRQUM1RGYsT0FBTyxDQUFDbEIsT0FBTyxDQUFDa08sU0FBUyxDQUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDRixlQUFlLENBQUNsTixPQUFPLENBQUNsQixPQUFPLENBQUMsQ0FBQztNQUMzRTtJQUNKO0VBQUM7SUFBQTdKLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFnWSxnQkFBZ0JwTyxPQUFPLEVBQUU7TUFDckIsT0FBUUEsT0FBTyxDQUFDcUssT0FBTyxDQUFDZ0UsYUFBYSxLQUFLcE0sU0FBUyxJQUFJakMsT0FBTyxDQUFDcUssT0FBTyxDQUFDZ0UsYUFBYSxLQUFLLEVBQUUsR0FDckZyTyxPQUFPLENBQUNxSyxPQUFPLENBQUNnRSxhQUFhLEdBQzdCLFlBQVk7SUFDdEI7RUFBQztBQUFBLEVBNURzQ3pYLDREQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JIOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQSxJQVNxQjJYLFVBQVUsMEJBQUExWCxXQUFBO0VBQUEsU0FBQTBYLFdBQUE7SUFBQXRZLGVBQUEsT0FBQXNZLFVBQUE7SUFBQSxPQUFBelgsVUFBQSxPQUFBeVgsVUFBQSxFQUFBeFgsU0FBQTtFQUFBO0VBQUFDLFNBQUEsQ0FBQXVYLFVBQUEsRUFBQTFYLFdBQUE7RUFBQSxPQUFBWCxZQUFBLENBQUFxWSxVQUFBO0lBQUFwWSxHQUFBO0lBQUFDLEtBQUE7SUFDM0I7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDSSxTQUFBQyxVQUFVbVksUUFBUSxFQUFFeE8sT0FBTyxFQUFFeU8sV0FBVyxFQUFFO01BQ3RDLElBQUlELFFBQVEsWUFBWXpZLDZEQUFVLEtBQUssS0FBSyxFQUFFO1FBQzFDLE1BQU0sSUFBSXdFLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQztNQUN2RjtNQUNBLElBQUl5RixPQUFPLFlBQVkwTyxXQUFXLEtBQUssS0FBSyxFQUFFO1FBQzFDLE1BQU0sSUFBSW5VLEtBQUssQ0FBQyw2REFBNkQsQ0FBQztNQUNsRjtNQUVBLElBQUksQ0FBQ2lVLFFBQVEsR0FBR0EsUUFBUTtNQUN4QixJQUFJLENBQUN4TyxPQUFPLEdBQUdBLE9BQU87TUFDdEIsSUFBSSxDQUFDeU8sV0FBVyxHQUFHQSxXQUFXLElBQUksQ0FBQyxDQUFDO01BQ3BDLElBQUksQ0FBQ0UsY0FBYyxHQUFHLENBQUMsQ0FBQztNQUN4QixJQUFJLENBQUNDLGVBQWUsR0FBRyxDQUFDLENBQUM7TUFDekIsSUFBSSxDQUFDQyxPQUFPLENBQUMsQ0FBQztJQUNsQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUExWSxHQUFBO0lBQUFDLEtBQUEsRUFPQSxTQUFBZ04sSUFBSTBMLE1BQU0sRUFBRTtNQUNSLElBQUlBLE1BQU0sS0FBSzdNLFNBQVMsRUFBRTtRQUN0QixPQUFPLElBQUksQ0FBQzBNLGNBQWM7TUFDOUI7TUFFQSxJQUFJLElBQUksQ0FBQ0EsY0FBYyxDQUFDRyxNQUFNLENBQUMsS0FBSzdNLFNBQVMsRUFBRTtRQUMzQyxPQUFPLElBQUksQ0FBQzBNLGNBQWMsQ0FBQ0csTUFBTSxDQUFDO01BQ3RDO01BRUEsT0FBTzdNLFNBQVM7SUFDcEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkk7SUFBQTlMLEdBQUE7SUFBQUMsS0FBQSxFQVNBLFNBQUEyWSxJQUFJRCxNQUFNLEVBQUUxWSxLQUFLLEVBQUU0WSxPQUFPLEVBQUU7TUFDeEIsSUFBSUYsTUFBTSxLQUFLN00sU0FBUyxFQUFFO1FBQ3RCLE1BQU0sSUFBSTFILEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQztNQUNsRTtNQUVBLElBQUksQ0FBQ29VLGNBQWMsQ0FBQ0csTUFBTSxDQUFDLEdBQUcxWSxLQUFLO01BRW5DLElBQUk0WSxPQUFPLEtBQUssSUFBSSxFQUFFO1FBQ2xCLElBQUksQ0FBQ2hQLE9BQU8sQ0FBQ3FLLE9BQU8sQ0FBQ3lFLE1BQU0sQ0FBQyxHQUFHMVksS0FBSztRQUNwQyxJQUFJLENBQUNxWSxXQUFXLENBQUNLLE1BQU0sQ0FBQyxHQUFHMVksS0FBSztNQUNwQztJQUNKOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUFELEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUF5WSxRQUFBLEVBQVU7TUFDTixJQUFJLENBQUNELGVBQWUsR0FBRyxJQUFJLENBQUNLLGtCQUFrQixDQUFDLENBQUM7TUFDaEQsSUFBSSxDQUFDTixjQUFjLEdBQUcsSUFBSSxDQUFDTyxhQUFhLENBQUMsQ0FBQztJQUM5Qzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFYSTtJQUFBL1ksR0FBQTtJQUFBQyxLQUFBLEVBWUEsU0FBQTZZLG1CQUFBLEVBQXFCO01BQ2pCLElBQ0ksSUFBSSxDQUFDVCxRQUFRLENBQUNXLG9CQUFvQixLQUFLbE4sU0FBUyxJQUM3QyxJQUFJLENBQUN1TSxRQUFRLENBQUNXLG9CQUFvQixLQUFLLElBQUksRUFDaEQ7UUFDRSxPQUFPLElBQUk7TUFDZjtNQUVBLElBQ0ksSUFBSSxDQUFDWCxRQUFRLENBQUNZLFFBQVEsS0FBS25OLFNBQVMsSUFDakMsT0FBTyxJQUFJLENBQUN1TSxRQUFRLENBQUNZLFFBQVEsS0FBSyxVQUFVLElBQzVDbFYsT0FBQSxDQUFPLElBQUksQ0FBQ3NVLFFBQVEsQ0FBQ1ksUUFBUSxDQUFDLENBQUMsTUFBSyxRQUFRLEVBQ2pEO1FBQ0UsT0FBTy9YLE1BQU0sQ0FBQ3FGLElBQUksQ0FBQyxJQUFJLENBQUM4UixRQUFRLENBQUNZLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDaEQ7TUFFQSxPQUFPLEtBQUs7SUFDaEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBJO0lBQUFqWixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBaVosWUFBQSxFQUFjO01BQ1YsSUFDSSxJQUFJLENBQUNiLFFBQVEsQ0FBQ1ksUUFBUSxLQUFLbk4sU0FBUyxJQUNqQyxPQUFPLElBQUksQ0FBQ3VNLFFBQVEsQ0FBQ1ksUUFBUSxLQUFLLFVBQVUsSUFDNUNsVixPQUFBLENBQU8sSUFBSSxDQUFDc1UsUUFBUSxDQUFDWSxRQUFRLENBQUMsQ0FBQyxNQUFLLFFBQVEsRUFDakQ7UUFDRSxPQUFPLElBQUksQ0FBQ1osUUFBUSxDQUFDWSxRQUFRLENBQUMsQ0FBQztNQUNuQztNQUVBLE9BQU8sQ0FBQyxDQUFDO0lBQ2I7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFUSTtJQUFBalosR0FBQTtJQUFBQyxLQUFBLEVBVUEsU0FBQThZLGNBQUEsRUFBZ0I7TUFDWixJQUFNSixNQUFNLEdBQUcsSUFBSSxDQUFDTyxXQUFXLENBQUMsQ0FBQztNQUVqQyxJQUFJLElBQUksQ0FBQ1QsZUFBZSxLQUFLLEtBQUssRUFBRTtRQUNoQyxPQUFPRSxNQUFNO01BQ2pCOztNQUVBO01BQ0EsS0FBSyxJQUFNM1ksR0FBRyxJQUFJLElBQUksQ0FBQzZKLE9BQU8sQ0FBQ3FLLE9BQU8sRUFBRTtRQUNwQyxJQUFJLElBQUksQ0FBQ3VFLGVBQWUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDQSxlQUFlLENBQUN2TCxRQUFRLENBQUNsTixHQUFHLENBQUMsRUFBRTtVQUNyRTJZLE1BQU0sQ0FBQzNZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQ21aLFdBQVcsQ0FBQyxJQUFJLENBQUN0UCxPQUFPLENBQUNxSyxPQUFPLENBQUNsVSxHQUFHLENBQUMsQ0FBQztRQUM3RDtNQUNKO01BRUEsS0FBSyxJQUFNQSxJQUFHLElBQUksSUFBSSxDQUFDc1ksV0FBVyxFQUFFO1FBQ2hDLElBQUksSUFBSSxDQUFDRyxlQUFlLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQ0EsZUFBZSxDQUFDdkwsUUFBUSxDQUFDbE4sSUFBRyxDQUFDLEVBQUU7VUFDckUyWSxNQUFNLENBQUMzWSxJQUFHLENBQUMsR0FBRyxJQUFJLENBQUNzWSxXQUFXLENBQUN0WSxJQUFHLENBQUM7UUFDdkM7TUFDSjtNQUNBOztNQUVBLE9BQU8yWSxNQUFNO0lBQ2pCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVJJO0lBQUEzWSxHQUFBO0lBQUFDLEtBQUEsRUFTQSxTQUFBa1osWUFBWWxaLEtBQUssRUFBRTtNQUNmLElBQU1tWixXQUFXLEdBQUdwUSxNQUFNLENBQUMvSSxLQUFLLENBQUM7O01BRWpDO01BQ0EsSUFBSW1aLFdBQVcsS0FBSyxNQUFNLEVBQUU7UUFDeEIsT0FBTyxJQUFJO01BQ2Y7O01BRUE7TUFDQSxJQUFJQSxXQUFXLEtBQUssV0FBVyxFQUFFO1FBQzdCLE9BQU90TixTQUFTO01BQ3BCOztNQUVBO01BQ0EsSUFBSXNOLFdBQVcsQ0FBQ0MsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQ25DLElBQU1DLFNBQVMsR0FBR0YsV0FBVyxDQUFDRyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUNyRCxJQUFNQyxPQUFPLEdBQUdDLElBQUksQ0FBQ0gsU0FBUyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDSCxXQUFXLENBQUNLLE9BQU8sQ0FBQztNQUNwQzs7TUFFQTtNQUNBLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUN0TSxRQUFRLENBQUNrTSxXQUFXLENBQUNNLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNyRCxPQUFPLElBQUk7TUFDZjtNQUNBLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUN4TSxRQUFRLENBQUNrTSxXQUFXLENBQUNNLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNyRCxPQUFPLEtBQUs7TUFDaEI7O01BRUE7TUFDQSxJQUFJLDBCQUEwQixDQUFDeFIsSUFBSSxDQUFDa1IsV0FBVyxDQUFDLEVBQUU7UUFDOUMsT0FBT25RLE1BQU0sQ0FBQ21RLFdBQVcsQ0FBQztNQUM5Qjs7TUFFQTtNQUNBLElBQUk7UUFDQSxPQUFPLElBQUksQ0FBQ3ZaLFNBQVMsQ0FBQzhaLFVBQVUsQ0FBQyxDQUFDLENBQUMzRSxLQUFLLENBQUNvRSxXQUFXLENBQUM7TUFDekQsQ0FBQyxDQUFDLE9BQU9yWSxDQUFDLEVBQUU7UUFDUixPQUFRcVksV0FBVyxLQUFLLEVBQUUsR0FBSSxJQUFJLEdBQUdBLFdBQVc7TUFDcEQ7SUFDSjtFQUFDO0FBQUEsRUFqTm1DeFosNkRBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNYRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQSxJQWlCcUJnYSxLQUFLLDBCQUFBbFosV0FBQTtFQUFBLFNBQUFrWixNQUFBO0lBQUE5WixlQUFBLE9BQUE4WixLQUFBO0lBQUEsT0FBQWpaLFVBQUEsT0FBQWlaLEtBQUEsRUFBQWhaLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUErWSxLQUFBLEVBQUFsWixXQUFBO0VBQUEsT0FBQVgsWUFBQSxDQUFBNlosS0FBQTtJQUFBNVosR0FBQTtJQUFBQyxLQUFBO0lBQ3RCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0ksU0FBQUMsVUFBVWtOLE9BQU8sRUFBRTFLLElBQUksRUFBRW1YLFFBQVEsRUFBRTtNQUMvQixJQUFJLENBQUN6TSxPQUFPLEdBQUdBLE9BQU87TUFDdEIsSUFBSSxDQUFDMUssSUFBSSxHQUFHQSxJQUFJLElBQUksU0FBUztNQUM3QixJQUFJLENBQUNtWCxRQUFRLEdBQUc1USxNQUFNLENBQUM0USxRQUFRLElBQUksQ0FBQyxDQUFDO01BRXJDLElBQUksSUFBSSxDQUFDQSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ25CLE1BQU0sSUFBSXpWLEtBQUssQ0FBQyxtREFBbUQsQ0FBQztNQUN4RTtNQUVBLElBQUksQ0FBQzBWLEtBQUssQ0FBQyxDQUFDO01BQ1osSUFBSSxDQUFDQyxLQUFLLEdBQUcsSUFBSTtNQUNqQixJQUFJLENBQUNDLFVBQVUsR0FBRyxJQUFJO01BQ3RCLElBQUksQ0FBQzFYLE1BQU0sQ0FBQyxDQUFDO0lBQ2pCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBdEMsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQUUsYUFBQSxFQUFlO01BQ1gsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUN6Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQUgsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQUksU0FBQSxFQUFXO01BQ1AsSUFBSSxJQUFJLENBQUMwWixLQUFLLEtBQUssSUFBSSxFQUFFO1FBQ3JCbEwsTUFBTSxDQUFDeUcsWUFBWSxDQUFDLElBQUksQ0FBQ3lFLEtBQUssQ0FBQztNQUNuQztNQUVBLElBQUksSUFBSSxDQUFDQyxVQUFVLEVBQUU7UUFDakIsSUFBSSxDQUFDQSxVQUFVLENBQUM3QixNQUFNLENBQUMsQ0FBQztNQUM1QjtNQUVBLElBQUksSUFBSSxDQUFDekksS0FBSyxFQUFFO1FBQ1osSUFBSSxDQUFDQSxLQUFLLENBQUN5SSxNQUFNLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUN6SSxLQUFLLEdBQUcsSUFBSTtRQUNqQixJQUFJLENBQUNzSyxVQUFVLEdBQUcsSUFBSTtNQUMxQjtNQUVBaEgsSUFBQSxDQUFBOUosZUFBQSxDQUFBMFEsS0FBQSxDQUFBelksU0FBQSxxQkFBQXlCLElBQUE7SUFDSjs7SUFFQTtBQUNKO0FBQ0E7RUFGSTtJQUFBNUMsR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQXFDLE9BQUEsRUFBUztNQUFBLElBQUEwSCxLQUFBO01BQ0wsSUFBSSxDQUFDbkssU0FBUyxDQUFDOEssV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUM7TUFFaEQsSUFBSSxDQUFDK0UsS0FBSyxHQUFHdkYsUUFBUSxDQUFDbU4sYUFBYSxDQUFDLEtBQUssQ0FBQztNQUMxQyxJQUFJLENBQUM1SCxLQUFLLENBQUNGLFNBQVMsR0FBRyxJQUFJLENBQUNwQyxPQUFPO01BQ25DLElBQUksQ0FBQ3NDLEtBQUssQ0FBQ3FJLFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUN0VixJQUFJLENBQUM7TUFDcEQsSUFBSSxDQUFDZ04sS0FBSyxDQUFDdUssZUFBZSxDQUFDLGNBQWMsQ0FBQztNQUMxQyxJQUFJLENBQUN2SyxLQUFLLENBQUNZLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtRQUFBLE9BQU10RyxLQUFJLENBQUNtTyxNQUFNLENBQUMsQ0FBQztNQUFBLEVBQUM7TUFDekQsSUFBSSxDQUFDekksS0FBSyxDQUFDWSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7UUFBQSxPQUFNdEcsS0FBSSxDQUFDa1EsU0FBUyxDQUFDLENBQUM7TUFBQSxFQUFDO01BQ2hFLElBQUksQ0FBQ3hLLEtBQUssQ0FBQ1ksZ0JBQWdCLENBQUMsVUFBVSxFQUFFO1FBQUEsT0FBTXRHLEtBQUksQ0FBQ21RLFVBQVUsQ0FBQyxDQUFDO01BQUEsRUFBQztNQUVoRSxJQUFJLElBQUksQ0FBQ04sUUFBUSxHQUFHLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUNHLFVBQVUsR0FBRzdQLFFBQVEsQ0FBQ21OLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDL0MsSUFBSSxDQUFDMEMsVUFBVSxDQUFDakMsU0FBUyxDQUFDQyxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQ3RJLEtBQUssQ0FBQzBLLFdBQVcsQ0FBQyxJQUFJLENBQUNKLFVBQVUsQ0FBQztNQUMzQyxDQUFDLE1BQU07UUFDSCxJQUFJLENBQUN0SyxLQUFLLENBQUNxSSxTQUFTLENBQUNDLEdBQUcsQ0FBQyxVQUFVLENBQUM7TUFDeEM7O01BRUE7TUFDQTdOLFFBQVEsQ0FBQzhCLElBQUksQ0FBQ21PLFdBQVcsQ0FBQyxJQUFJLENBQUMxSyxLQUFLLENBQUM7TUFFckMsSUFBSSxDQUFDN1AsU0FBUyxDQUFDd2EsVUFBVSxDQUFDLElBQUksQ0FBQzNLLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBTTtRQUNoRDFGLEtBQUksQ0FBQ21RLFVBQVUsQ0FBQyxDQUFDO01BQ3JCLENBQUMsQ0FBQztJQUNOOztJQUVBO0FBQ0o7QUFDQTtFQUZJO0lBQUFuYSxHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBa1ksT0FBQSxFQUFTO01BQUEsSUFBQXhMLE1BQUE7TUFDTCxJQUFJLENBQUM5TSxTQUFTLENBQUM4SyxXQUFXLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQztNQUVoRCxJQUFJLENBQUN1UCxTQUFTLENBQUMsQ0FBQztNQUVoQixJQUFJLENBQUNyYSxTQUFTLENBQUN3YSxVQUFVLENBQUMsSUFBSSxDQUFDM0ssS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFNO1FBQ2hEL0MsTUFBSSxDQUFDK0MsS0FBSyxDQUFDeUksTUFBTSxDQUFDLENBQUM7UUFDbkJ4TCxNQUFJLENBQUMrQyxLQUFLLEdBQUcsSUFBSTtRQUNqQi9DLE1BQUksQ0FBQ3RNLFFBQVEsQ0FBQyxDQUFDO01BQ25CLENBQUMsQ0FBQztJQUNOOztJQUVBO0FBQ0o7QUFDQTtFQUZJO0lBQUFMLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUE2WixNQUFBLEVBQVE7TUFDSjNQLFFBQVEsQ0FBQ29GLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLENBQUM1TCxPQUFPLENBQUMsVUFBQ2tHLE9BQU87UUFBQSxPQUFLQSxPQUFPLENBQUNzTyxNQUFNLENBQUMsQ0FBQztNQUFBLEVBQUM7SUFDaEc7O0lBRUE7QUFDSjtBQUNBO0VBRkk7SUFBQW5ZLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUFrYSxXQUFBLEVBQWE7TUFBQSxJQUFBck0sTUFBQTtNQUNULElBQUksSUFBSSxDQUFDK0wsUUFBUSxLQUFLLENBQUMsRUFBRTtRQUNyQjtNQUNKO01BRUEsSUFBSSxDQUFDUyxVQUFVLEdBQUcsSUFBSSxDQUFDemEsU0FBUyxDQUFDd2EsVUFBVSxDQUFDLElBQUksQ0FBQ0wsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEtBQUEzUCxNQUFBLENBQUssSUFBSSxDQUFDd1AsUUFBUSxVQUFPLElBQUksQ0FBQztNQUMxRyxJQUFJLENBQUNFLEtBQUssR0FBR2xMLE1BQU0sQ0FBQ3dHLFVBQVUsQ0FBQztRQUFBLE9BQU12SCxNQUFJLENBQUNxSyxNQUFNLENBQUMsQ0FBQztNQUFBLEdBQUUsSUFBSSxDQUFDMEIsUUFBUSxHQUFHLElBQUksQ0FBQztJQUM3RTs7SUFFQTtBQUNKO0FBQ0E7RUFGSTtJQUFBN1osR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQWlhLFVBQUEsRUFBWTtNQUNSLElBQUksSUFBSSxDQUFDSSxVQUFVLEVBQUU7UUFDakIsSUFBSSxDQUFDQSxVQUFVLENBQUNDLE1BQU0sQ0FBQyxDQUFDO01BQzVCO01BQ0EsSUFBSSxJQUFJLENBQUNSLEtBQUssRUFBRTtRQUNabEwsTUFBTSxDQUFDeUcsWUFBWSxDQUFDLElBQUksQ0FBQ3lFLEtBQUssQ0FBQztNQUNuQztJQUNKO0VBQUM7QUFBQSxFQWpJOEJuYSw2REFBVTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQkU7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQSxJQVFxQjRhLGFBQWEsMEJBQUE5SCxVQUFBO0VBQUEsU0FBQThILGNBQUE7SUFBQTFhLGVBQUEsT0FBQTBhLGFBQUE7SUFBQSxPQUFBN1osVUFBQSxPQUFBNlosYUFBQSxFQUFBNVosU0FBQTtFQUFBO0VBQUFDLFNBQUEsQ0FBQTJaLGFBQUEsRUFBQTlILFVBQUE7RUFBQSxPQUFBM1MsWUFBQSxDQUFBeWEsYUFBQTtJQUFBeGEsR0FBQTtJQUFBQyxLQUFBO0lBQzlCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7SUFDSSxTQUFBRSxhQUFBLEVBQWU7TUFDWCxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ3BCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBSCxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBRyxRQUFBLEVBQVU7TUFDTixPQUFPO1FBQ0h1UyxLQUFLLEVBQUUsT0FBTztRQUNkOEgsZ0JBQWdCLEVBQUUsa0JBQWtCO1FBQ3BDQyxpQkFBaUIsRUFBRTtNQUN2QixDQUFDO0lBQ0w7O0lBRUE7QUFDSjtBQUNBO0VBRkk7SUFBQTFhLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUEwUyxNQUFBLEVBQVE7TUFBQSxJQUFBM0ksS0FBQTtNQUNKRyxRQUFRLENBQUNvRixnQkFBZ0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDNUwsT0FBTyxDQUFDLFVBQUNrRyxPQUFPLEVBQUs7UUFDN0VHLEtBQUksQ0FBQ25LLFNBQVMsQ0FBQzZQLEtBQUssQ0FDaEI3RixPQUFPLENBQUMyRixTQUFTLEVBQ2pCM0YsT0FBTyxDQUFDcUssT0FBTyxDQUFDeUcsU0FBUyxFQUN6QjlRLE9BQU8sQ0FBQ3FLLE9BQU8sQ0FBQzBHLGFBQ3BCLENBQUM7UUFFRC9RLE9BQU8sQ0FBQ3NPLE1BQU0sQ0FBQyxDQUFDO01BQ3BCLENBQUMsQ0FBQztJQUNOOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUFuWSxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBd2EsaUJBQWlCck4sT0FBTyxFQUFFO01BQ3RCLElBQUksQ0FBQ3ZOLFNBQVMsQ0FBQzZQLEtBQUssQ0FBQ3RDLE9BQU8sRUFBRSxPQUFPLENBQUM7TUFDdEMsT0FBTyxLQUFLO0lBQ2hCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBcE4sR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQXlhLGtCQUFrQjVKLFFBQVEsRUFBRTtNQUFBLElBQUFuRSxNQUFBO01BQ3hCekwsTUFBTSxDQUFDK00sT0FBTyxDQUFDNkMsUUFBUSxDQUFDLENBQUNuTixPQUFPLENBQUMsVUFBQ3VLLEtBQUssRUFBSztRQUN4QyxJQUFBQyxNQUFBLEdBQUExRyxjQUFBLENBQTRCeUcsS0FBSztVQUExQjJNLFFBQVEsR0FBQTFNLE1BQUE7VUFBRWYsT0FBTyxHQUFBZSxNQUFBO1FBQ3hCeEIsTUFBSSxDQUFDOU0sU0FBUyxDQUFDNlAsS0FBSyxDQUFDdEMsT0FBTyxFQUFFeU4sUUFBUSxDQUFDO01BQzNDLENBQUMsQ0FBQztNQUNGLE9BQU8sS0FBSztJQUNoQjtFQUFDO0FBQUEsRUE1RHNDcGEsNERBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkw7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBLElBU3FCcWEsY0FBYywwQkFBQXBJLFVBQUE7RUFBQSxTQUFBb0ksZUFBQTtJQUFBaGIsZUFBQSxPQUFBZ2IsY0FBQTtJQUFBLE9BQUFuYSxVQUFBLE9BQUFtYSxjQUFBLEVBQUFsYSxTQUFBO0VBQUE7RUFBQUMsU0FBQSxDQUFBaWEsY0FBQSxFQUFBcEksVUFBQTtFQUFBLE9BQUEzUyxZQUFBLENBQUErYSxjQUFBO0lBQUE5YSxHQUFBO0lBQUFDLEtBQUE7SUFDL0I7QUFDSjtBQUNBO0lBQ0ksU0FBQUMsVUFBQSxFQUFZO01BQ1IsSUFBSSxDQUFDNmEsU0FBUyxHQUFHLEVBQUU7SUFDdkI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUEvYSxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBRyxRQUFBLEVBQVU7TUFDTixPQUFPO1FBQ0h1UyxLQUFLLEVBQUUsT0FBTztRQUNkaUYsU0FBUyxFQUFFLGlCQUFpQjtRQUM1Qm9ELG9CQUFvQixFQUFFO01BQzFCLENBQUM7SUFDTDs7SUFFQTtBQUNKO0FBQ0E7RUFGSTtJQUFBaGIsR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQTBTLE1BQUEsRUFBUTtNQUNKLElBQUksQ0FBQ3NJLGdCQUFnQixDQUFDOVEsUUFBUSxDQUFDO0lBQ25DOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFWSTtJQUFBbkssR0FBQTtJQUFBQyxLQUFBLEVBV0EsU0FBQWliLGFBQWExTyxJQUFJLEVBQUUyTyxhQUFhLEVBQUVwUSxPQUFPLEVBQUU7TUFBQSxJQUFBZixLQUFBO01BQ3ZDLElBQUllLE9BQU8sQ0FBQ2xCLE9BQU8sSUFBSWtCLE9BQU8sQ0FBQ2xCLE9BQU8sQ0FBQ3FLLE9BQU8sQ0FBQ2tILGVBQWUsS0FBS3RQLFNBQVMsRUFBRTtRQUMxRSxPQUFPLElBQUk7TUFDZjtNQUNBLElBQUksQ0FBQ1UsSUFBSSxFQUFFO1FBQ1AsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFNdU8sU0FBUyxHQUFHLElBQUksQ0FBQ0EsU0FBUyxDQUFDelMsTUFBTSxDQUFDLFVBQUMrUyxRQUFRO1FBQUEsT0FBS0EsUUFBUSxDQUFDN08sSUFBSSxLQUFLQSxJQUFJO01BQUEsRUFBQztNQUM3RXVPLFNBQVMsQ0FBQ3BYLE9BQU8sQ0FBQyxVQUFDMFgsUUFBUSxFQUFLO1FBQzVCclIsS0FBSSxDQUFDc1IsWUFBWSxDQUFDRCxRQUFRLEVBQUVGLGFBQWEsQ0FBQztNQUM5QyxDQUFDLENBQUM7TUFFRixPQUFPLEtBQUs7SUFDaEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOSTtJQUFBbmIsR0FBQTtJQUFBQyxLQUFBLEVBT0EsU0FBQXNiLGdCQUFnQjFOLE9BQU8sRUFBRTlDLE9BQU8sRUFBRTtNQUFBLElBQUE0QixNQUFBO01BQzlCLElBQUk1QixPQUFPLENBQUNsQixPQUFPLElBQUlrQixPQUFPLENBQUNsQixPQUFPLENBQUNxSyxPQUFPLENBQUNrSCxlQUFlLEtBQUt0UCxTQUFTLEVBQUU7UUFDMUU7TUFDSjtNQUNBLElBQUksQ0FBQ2YsT0FBTyxDQUFDeUIsSUFBSSxFQUFFO1FBQ2Y7TUFDSjtNQUVBLElBQU11TyxTQUFTLEdBQUcsSUFBSSxDQUFDQSxTQUFTLENBQUN6UyxNQUFNLENBQUMsVUFBQytTLFFBQVE7UUFBQSxPQUFLQSxRQUFRLENBQUM3TyxJQUFJLEtBQUt6QixPQUFPLENBQUN5QixJQUFJO01BQUEsRUFBQztNQUNyRnVPLFNBQVMsQ0FBQ3BYLE9BQU8sQ0FBQyxVQUFDMFgsUUFBUSxFQUFLO1FBQzVCMU8sTUFBSSxDQUFDNk8sWUFBWSxDQUFDSCxRQUFRLENBQUM7TUFDL0IsQ0FBQyxDQUFDO0lBQ047O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBJO0lBQUFyYixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBZ2IsaUJBQWlCUSxRQUFRLEVBQUU7TUFBQSxJQUFBM04sTUFBQTtNQUN2QjJOLFFBQVEsQ0FBQ2xNLGdCQUFnQixDQUFDLDRDQUE0QyxDQUFDLENBQUM1TCxPQUFPLENBQUMsVUFBQzBYLFFBQVEsRUFBSztRQUMxRixJQUFNN08sSUFBSSxHQUFHNk8sUUFBUSxDQUFDekosT0FBTyxDQUFDLDZCQUE2QixDQUFDOztRQUU1RDtRQUNBLElBQUksQ0FBQ3BGLElBQUksRUFBRTtVQUNQNk8sUUFBUSxDQUFDSyxVQUFVLENBQUNDLFdBQVcsQ0FBQ04sUUFBUSxDQUFDO1VBQ3pDO1FBQ0o7O1FBRUE7UUFDQSxJQUFJTyxrQkFBa0IsR0FBRyxJQUFJO1FBQzdCLElBQUlQLFFBQVEsQ0FBQzdILE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO1VBQzNDb0ksa0JBQWtCLEdBQUdQLFFBQVEsQ0FBQ2pSLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRTs7UUFFQTtRQUNBLElBQU15UixXQUFXLEdBQUcxUixRQUFRLENBQUMyUixhQUFhLENBQUMsRUFBRSxDQUFDOztRQUU5QztRQUNBLElBQU1DLFlBQVksR0FBRztVQUNqQmxTLE9BQU8sRUFBRXdSLFFBQVE7VUFDakI3TyxJQUFJLEVBQUpBLElBQUk7VUFDSndQLFdBQVcsRUFBR1gsUUFBUSxDQUFDbkgsT0FBTyxDQUFDOEgsV0FBVyxHQUNwQ1gsUUFBUSxDQUFDbkgsT0FBTyxDQUFDOEgsV0FBVyxDQUFDQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQzdDLEdBQUc7VUFDVEosV0FBVyxFQUFYQSxXQUFXO1VBQ1hELGtCQUFrQixFQUFHQSxrQkFBa0IsR0FDakNBLGtCQUFrQixDQUFDTSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQ2xDLElBQUk7VUFDVkMsaUJBQWlCLEVBQUUsSUFBSTtVQUN2QkMsYUFBYSxFQUFHZixRQUFRLENBQUNuSCxPQUFPLENBQUM4SCxXQUFXLEdBQ3JDWCxRQUFRLENBQUNnQixXQUFXLEtBQUssRUFBRSxJQUFJaEIsUUFBUSxDQUFDaUIsVUFBVSxDQUFDMVcsTUFBTSxHQUFHLENBQUMsR0FDOUQ7UUFDVixDQUFDOztRQUVEO1FBQ0EsSUFBSWdXLGtCQUFrQixFQUFFO1VBQ3BCLElBQU1PLGlCQUFpQixHQUFHaFMsUUFBUSxDQUFDMlIsYUFBYSxDQUFDLEVBQUUsQ0FBQztVQUNwREYsa0JBQWtCLENBQUNGLFVBQVUsQ0FBQ2EsWUFBWSxDQUFDSixpQkFBaUIsRUFBRVAsa0JBQWtCLENBQUM7VUFDakZHLFlBQVksQ0FBQ0ksaUJBQWlCLEdBQUdBLGlCQUFpQjtRQUN0RDtRQUVBZCxRQUFRLENBQUNLLFVBQVUsQ0FBQ2EsWUFBWSxDQUFDVixXQUFXLEVBQUVSLFFBQVEsQ0FBQztRQUV2RHZOLE1BQUksQ0FBQ2lOLFNBQVMsQ0FBQ3hWLElBQUksQ0FBQ3dXLFlBQVksQ0FBQztNQUNyQyxDQUFDLENBQUM7SUFDTjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQS9iLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUF1YixhQUFhSCxRQUFRLEVBQUU7TUFDbkIsSUFBSUEsUUFBUSxDQUFDeFIsT0FBTyxDQUFDMlMsV0FBVyxFQUFFO1FBQzlCbkIsUUFBUSxDQUFDeFIsT0FBTyxDQUFDNlIsVUFBVSxDQUFDYSxZQUFZLENBQUNsQixRQUFRLENBQUNRLFdBQVcsRUFBRVIsUUFBUSxDQUFDeFIsT0FBTyxDQUFDO01BQ3BGO0lBQ0o7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEk7SUFBQTdKLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUFxYixhQUFhRCxRQUFRLEVBQUVGLGFBQWEsRUFBRTtNQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDc0Isc0JBQXNCLENBQUNwQixRQUFRLEVBQUVGLGFBQWEsQ0FBQyxFQUFFO1FBQ3ZEO01BQ0o7TUFFQSxJQUFJLENBQUNFLFFBQVEsQ0FBQ3hSLE9BQU8sQ0FBQzJTLFdBQVcsRUFBRTtRQUMvQm5CLFFBQVEsQ0FBQ1EsV0FBVyxDQUFDSCxVQUFVLENBQUNhLFlBQVksQ0FBQ2xCLFFBQVEsQ0FBQ3hSLE9BQU8sRUFBRXdSLFFBQVEsQ0FBQ1EsV0FBVyxDQUFDO01BQ3hGO01BRUEsSUFBSVIsUUFBUSxDQUFDVyxXQUFXLEtBQUssR0FBRyxFQUFFO1FBQzlCLElBQUksQ0FBQ1gsUUFBUSxDQUFDZSxhQUFhLEVBQUU7VUFDekIsSUFBTU0sVUFBVSxHQUFHeGIsTUFBTSxDQUFDcUYsSUFBSSxDQUFDNFUsYUFBYSxDQUFDLENBQ3hDN1MsTUFBTSxDQUFDLFVBQUNxVSxLQUFLO1lBQUEsT0FBS3RCLFFBQVEsQ0FBQ1csV0FBVyxDQUFDOU8sUUFBUSxDQUFDeVAsS0FBSyxDQUFDO1VBQUEsRUFBQyxDQUN2REMsS0FBSyxDQUFDLENBQUM7VUFBQyxJQUFBQyxxQkFBQSxHQUFBcFYsY0FBQSxDQUNrQjBULGFBQWEsQ0FBQ3VCLFVBQVUsQ0FBQztVQUF2RHJCLFFBQVEsQ0FBQ3hSLE9BQU8sQ0FBQzJGLFNBQVMsR0FBQXFOLHFCQUFBO1FBQy9CO01BQ0osQ0FBQyxNQUFNLElBQUl4QixRQUFRLENBQUNPLGtCQUFrQixFQUFFO1FBQ3BDO1FBQ0FQLFFBQVEsQ0FBQ3hSLE9BQU8sQ0FBQzBGLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLENBQUM1TCxPQUFPLENBQUMsVUFBQ3lKLE9BQU8sRUFBSztVQUNoRkEsT0FBTyxDQUFDc08sVUFBVSxDQUFDQyxXQUFXLENBQUN2TyxPQUFPLENBQUM7UUFDM0MsQ0FBQyxDQUFDO1FBRUZsTSxNQUFNLENBQUMrTSxPQUFPLENBQUNrTixhQUFhLENBQUMsQ0FBQ3hYLE9BQU8sQ0FBQyxVQUFDdUssS0FBSyxFQUFLO1VBQzdDLElBQUFDLE1BQUEsR0FBQTFHLGNBQUEsQ0FBbUJ5RyxLQUFLO1lBQWY0TyxNQUFNLEdBQUEzTyxNQUFBO1VBRWYyTyxNQUFNLENBQUNuWixPQUFPLENBQUMsVUFBQ2lJLEtBQUssRUFBSztZQUN0QixJQUFNbVIsY0FBYyxHQUFHMUIsUUFBUSxDQUFDTyxrQkFBa0IsQ0FBQ00sU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsRWEsY0FBYyxDQUFDN0ksT0FBTyxDQUFDOEksaUJBQWlCLEdBQUcsRUFBRTtZQUM3Q0QsY0FBYyxDQUFDdk4sU0FBUyxHQUFHNUQsS0FBSztZQUNoQ3lQLFFBQVEsQ0FBQ2MsaUJBQWlCLENBQUNjLEtBQUssQ0FBQ0YsY0FBYyxDQUFDO1VBQ3BELENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQztNQUNOLENBQUMsTUFBTTtRQUFBLElBQUFHLHFCQUFBLEdBQUF6VixjQUFBLENBQzRCMFQsYUFBYSxDQUFDamEsTUFBTSxDQUFDcUYsSUFBSSxDQUFDNFUsYUFBYSxDQUFDLENBQUN5QixLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQS9FdkIsUUFBUSxDQUFDeFIsT0FBTyxDQUFDMkYsU0FBUyxHQUFBME4scUJBQUE7TUFDL0I7SUFDSjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUFsZCxHQUFBO0lBQUFDLEtBQUEsRUFPQSxTQUFBd2MsdUJBQXVCcEIsUUFBUSxFQUFFRixhQUFhLEVBQUU7TUFDNUMsSUFBSUUsUUFBUSxDQUFDVyxXQUFXLEtBQUssR0FBRyxFQUFFO1FBQzlCLE9BQU8sSUFBSTtNQUNmO01BRUEsT0FBTzlhLE1BQU0sQ0FBQ3FGLElBQUksQ0FBQzRVLGFBQWEsQ0FBQyxDQUM1QjdTLE1BQU0sQ0FBQyxVQUFDcVUsS0FBSztRQUFBLE9BQUt0QixRQUFRLENBQUNXLFdBQVcsQ0FBQzlPLFFBQVEsQ0FBQ3lQLEtBQUssQ0FBQztNQUFBLEVBQUMsQ0FDdkQvVyxNQUFNLEdBQUcsQ0FBQztJQUNuQjtFQUFDO0FBQUEsRUExTXVDbkYsNERBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWE47O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBLElBTXFCMGMsWUFBWSwwQkFBQXpLLFVBQUE7RUFBQSxTQUFBeUssYUFBQTtJQUFBcmQsZUFBQSxPQUFBcWQsWUFBQTtJQUFBLE9BQUF4YyxVQUFBLE9BQUF3YyxZQUFBLEVBQUF2YyxTQUFBO0VBQUE7RUFBQUMsU0FBQSxDQUFBc2MsWUFBQSxFQUFBekssVUFBQTtFQUFBLE9BQUEzUyxZQUFBLENBQUFvZCxZQUFBO0lBQUFuZCxHQUFBO0lBQUFDLEtBQUE7SUFDN0I7QUFDSjtBQUNBO0FBQ0E7QUFDQTtJQUNJLFNBQUFFLGFBQUEsRUFBZTtNQUNYLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDdEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFILEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFHLFFBQUEsRUFBVTtNQUNOLE9BQU87UUFDSHVTLEtBQUssRUFBRSxPQUFPO1FBQ2RpRixTQUFTLEVBQUU7TUFDZixDQUFDO0lBQ0w7RUFBQztJQUFBNVgsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQTBTLE1BQUEsRUFBUTtNQUNKLElBQUksQ0FBQ3lLLE9BQU8sR0FBRyxDQUFDO01BRWhCLElBQUksQ0FBQ0MsWUFBWSxDQUFDLENBQUM7SUFDdkI7RUFBQztJQUFBcmQsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQTJYLFVBQVUvSixPQUFPLEVBQUU5QyxPQUFPLEVBQUU7TUFBQSxJQUFBZixLQUFBO01BQ3hCLElBQUllLE9BQU8sQ0FBQ2hCLE9BQU8sQ0FBQ3VULE1BQU0sS0FBSyxLQUFLLEVBQUU7UUFDbEM7TUFDSjtNQUVBLElBQUksQ0FBQ0MsSUFBSSxDQUFDLENBQUM7TUFFWDFQLE9BQU8sQ0FBQzNKLElBQUksQ0FBQyxZQUFNO1FBQ2Y4RixLQUFJLENBQUN3VCxJQUFJLENBQUMsQ0FBQztNQUNmLENBQUMsQ0FBQyxTQUFNLENBQUMsWUFBTTtRQUNYeFQsS0FBSSxDQUFDd1QsSUFBSSxDQUFDLENBQUM7TUFDZixDQUFDLENBQUM7SUFDTjtFQUFDO0lBQUF4ZCxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBb2QsYUFBQSxFQUFlO01BQ1gsSUFBSSxDQUFDSSxTQUFTLEdBQUd0VCxRQUFRLENBQUNtTixhQUFhLENBQUMsS0FBSyxDQUFDO01BQzlDLElBQUksQ0FBQ2dHLE1BQU0sR0FBR25ULFFBQVEsQ0FBQ21OLGFBQWEsQ0FBQyxLQUFLLENBQUM7TUFDM0MsSUFBSSxDQUFDb0csWUFBWSxHQUFHdlQsUUFBUSxDQUFDbU4sYUFBYSxDQUFDLEtBQUssQ0FBQztNQUVqRCxJQUFJLENBQUNtRyxTQUFTLENBQUMxRixTQUFTLENBQUNDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxRQUFRLENBQUM7TUFDbEUsSUFBSSxDQUFDc0YsTUFBTSxDQUFDdkYsU0FBUyxDQUFDQyxHQUFHLENBQUMsUUFBUSxDQUFDO01BQ25DLElBQUksQ0FBQzBGLFlBQVksQ0FBQzNGLFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLGVBQWUsQ0FBQztNQUVoRCxJQUFJLENBQUN5RixTQUFTLENBQUNyRCxXQUFXLENBQUMsSUFBSSxDQUFDa0QsTUFBTSxDQUFDO01BQ3ZDLElBQUksQ0FBQ0csU0FBUyxDQUFDckQsV0FBVyxDQUFDLElBQUksQ0FBQ3NELFlBQVksQ0FBQztNQUU3Q3ZULFFBQVEsQ0FBQzhCLElBQUksQ0FBQ21PLFdBQVcsQ0FBQyxJQUFJLENBQUNxRCxTQUFTLENBQUM7SUFDN0M7RUFBQztJQUFBemQsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQXNkLEtBQUEsRUFBTztNQUNILElBQUksQ0FBQ0gsT0FBTyxJQUFJLENBQUM7TUFFakIsSUFBTU8sU0FBUyxHQUFHLElBQUksQ0FBQ0wsTUFBTSxDQUFDcEIsU0FBUyxDQUFDLElBQUksQ0FBQztNQUM3QyxJQUFJLENBQUN1QixTQUFTLENBQUNyRCxXQUFXLENBQUN1RCxTQUFTLENBQUM7TUFDckMsSUFBSSxDQUFDTCxNQUFNLENBQUNuRixNQUFNLENBQUMsQ0FBQztNQUNwQixJQUFJLENBQUNtRixNQUFNLEdBQUdLLFNBQVM7TUFFdkIsSUFBSSxJQUFJLENBQUNQLE9BQU8sR0FBRyxDQUFDLEVBQUU7UUFDbEI7TUFDSjtNQUVBLElBQUksQ0FBQ0ssU0FBUyxDQUFDMUYsU0FBUyxDQUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDO01BQ3pDaE8sUUFBUSxDQUFDOEIsSUFBSSxDQUFDOEwsU0FBUyxDQUFDQyxHQUFHLENBQUMsWUFBWSxDQUFDO0lBQzdDO0VBQUM7SUFBQWhZLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUF1ZCxLQUFLSSxLQUFLLEVBQUU7TUFDUixJQUFJLENBQUNSLE9BQU8sSUFBSSxDQUFDO01BRWpCLElBQUlRLEtBQUssS0FBSyxJQUFJLEVBQUU7UUFDaEIsSUFBSSxDQUFDUixPQUFPLEdBQUcsQ0FBQztNQUNwQjtNQUVBLElBQUksSUFBSSxDQUFDQSxPQUFPLElBQUksQ0FBQyxFQUFFO1FBQ25CLElBQUksQ0FBQ0ssU0FBUyxDQUFDMUYsU0FBUyxDQUFDQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3RDN04sUUFBUSxDQUFDOEIsSUFBSSxDQUFDOEwsU0FBUyxDQUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDO01BQ2hEO0lBQ0o7RUFBQztBQUFBLEVBcEZxQzFYLDREQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JKOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQSxJQU1xQm9kLGdCQUFnQiwwQkFBQW5MLFVBQUE7RUFBQSxTQUFBbUwsaUJBQUE7SUFBQS9kLGVBQUEsT0FBQStkLGdCQUFBO0lBQUEsT0FBQWxkLFVBQUEsT0FBQWtkLGdCQUFBLEVBQUFqZCxTQUFBO0VBQUE7RUFBQUMsU0FBQSxDQUFBZ2QsZ0JBQUEsRUFBQW5MLFVBQUE7RUFBQSxPQUFBM1MsWUFBQSxDQUFBOGQsZ0JBQUE7SUFBQTdkLEdBQUE7SUFBQUMsS0FBQTtJQUNqQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0lBQ0ksU0FBQUcsUUFBQSxFQUFVO01BQ04sT0FBTztRQUNIdVMsS0FBSyxFQUFFO01BQ1gsQ0FBQztJQUNMO0VBQUM7SUFBQTNTLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUEwUyxNQUFBLEVBQVE7TUFDSixJQUFJbUwsWUFBWSxHQUFHLEtBQUs7O01BRXhCO01BQ0EzVCxRQUFRLENBQUNvRixnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDNUwsT0FBTyxDQUFDLFVBQUM4UyxHQUFHLEVBQUs7UUFDakUsSUFBSUEsR0FBRyxDQUFDekUsSUFBSSxDQUFDK0wsUUFBUSxDQUFDLGlEQUFpRCxDQUFDLEVBQUU7VUFDdEVELFlBQVksR0FBRyxJQUFJO1FBQ3ZCO01BQ0osQ0FBQyxDQUFDO01BRUYsSUFBSSxDQUFDQSxZQUFZLEVBQUU7UUFDZixJQUFNRSxVQUFVLEdBQUc3VCxRQUFRLENBQUNtTixhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ2pEMEcsVUFBVSxDQUFDM0ssWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUM7UUFDNUMySyxVQUFVLENBQUMzSyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQ3hULFNBQVMsQ0FBQ3lNLEdBQUcsQ0FBQyxDQUFDLENBQUM2SyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUM5R2hOLFFBQVEsQ0FBQ3FOLElBQUksQ0FBQzRDLFdBQVcsQ0FBQzRELFVBQVUsQ0FBQztNQUN6QztJQUNKO0VBQUM7QUFBQSxFQTVCeUN2ZCw0REFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSTjs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXRCQSxJQXVCcUJ3ZCxVQUFVLDBCQUFBdmQsV0FBQTtFQUFBLFNBQUF1ZCxXQUFBO0lBQUFuZSxlQUFBLE9BQUFtZSxVQUFBO0lBQUEsT0FBQXRkLFVBQUEsT0FBQXNkLFVBQUEsRUFBQXJkLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUFvZCxVQUFBLEVBQUF2ZCxXQUFBO0VBQUEsT0FBQVgsWUFBQSxDQUFBa2UsVUFBQTtJQUFBamUsR0FBQTtJQUFBQyxLQUFBO0lBQzNCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNJLFNBQUFDLFVBQVUySixPQUFPLEVBQUV3USxVQUFVLEVBQUU2RCxRQUFRLEVBQUVyRSxRQUFRLEVBQUVzRSxPQUFPLEVBQUU7TUFDeEQsSUFBSXRVLE9BQU8sWUFBWTBPLFdBQVcsS0FBSyxLQUFLLEVBQUU7UUFDMUMsTUFBTSxJQUFJblUsS0FBSyxDQUFDLGtEQUFrRCxDQUFDO01BQ3ZFO01BQ0EsSUFBSSxDQUFDeUYsT0FBTyxHQUFHQSxPQUFPO01BRXRCLElBQUksT0FBT3dRLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDaEMsTUFBTSxJQUFJalcsS0FBSyxDQUFDLCtDQUErQyxDQUFDO01BQ3BFO01BQ0EsSUFBSSxDQUFDaVcsVUFBVSxHQUFHQSxVQUFVO01BRTVCLElBQUk2RCxRQUFRLElBQUksT0FBT0EsUUFBUSxLQUFLLFVBQVUsRUFBRTtRQUM1QyxNQUFNLElBQUk5WixLQUFLLENBQUMsbUNBQW1DLENBQUM7TUFDeEQ7TUFDQSxJQUFJLENBQUM4WixRQUFRLEdBQUdBLFFBQVE7TUFFeEIsSUFBSXJFLFFBQVEsRUFBRTtRQUNWLElBQUksQ0FBQ0EsUUFBUSxHQUFHLElBQUksQ0FBQ3VFLGFBQWEsQ0FBQ3ZFLFFBQVEsQ0FBQztNQUNoRCxDQUFDLE1BQU07UUFDSCxJQUFJLENBQUNBLFFBQVEsR0FBRyxJQUFJO01BQ3hCO01BRUEsSUFBSSxDQUFDc0UsT0FBTyxHQUFJQSxPQUFPLEtBQUssSUFBSztNQUVqQyxJQUFJLENBQUNFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUFyZSxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBcWUsYUFBQSxFQUFzQjtNQUFBLFNBQUFDLElBQUEsR0FBQTNkLFNBQUEsQ0FBQWdGLE1BQUEsRUFBTjRZLElBQUksT0FBQXhXLEtBQUEsQ0FBQXVXLElBQUEsR0FBQUUsSUFBQSxNQUFBQSxJQUFBLEdBQUFGLElBQUEsRUFBQUUsSUFBQTtRQUFKRCxJQUFJLENBQUFDLElBQUEsSUFBQTdkLFNBQUEsQ0FBQTZkLElBQUE7TUFBQTtNQUNoQixJQUFNSCxZQUFZLEdBQUc7UUFDakIsU0FBQWpVLE1BQUEsQ0FBTyxJQUFJLENBQUNnUSxVQUFVLFFBQUs7UUFDM0JxRSxNQUFNLEtBQUFyVSxNQUFBLENBQUssSUFBSSxDQUFDZ1EsVUFBVSxZQUFTO1FBQ25Dc0UsR0FBRyxLQUFBdFUsTUFBQSxDQUFLLElBQUksQ0FBQ2dRLFVBQVU7TUFDM0IsQ0FBQztNQUVELElBQUltRSxJQUFJLENBQUM1WSxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ25CLE9BQU8xRSxNQUFNLENBQUNzQyxNQUFNLENBQUM4YSxZQUFZLENBQUM7TUFDdEM7TUFFQSxJQUFNTSxhQUFhLEdBQUcsRUFBRTtNQUN4QjFkLE1BQU0sQ0FBQytNLE9BQU8sQ0FBQ3FRLFlBQVksQ0FBQyxDQUFDM2EsT0FBTyxDQUFDLFVBQUN1SyxLQUFLLEVBQUs7UUFDNUMsSUFBQUMsTUFBQSxHQUFBMUcsY0FBQSxDQUFxQnlHLEtBQUs7VUFBbkJsTyxHQUFHLEdBQUFtTyxNQUFBO1VBQUVsTyxLQUFLLEdBQUFrTyxNQUFBO1FBRWpCLElBQUlxUSxJQUFJLENBQUMxSyxPQUFPLENBQUM5VCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtVQUMxQjRlLGFBQWEsQ0FBQ3JaLElBQUksQ0FBQ3RGLEtBQUssQ0FBQztRQUM3QjtNQUNKLENBQUMsQ0FBQztNQUVGLE9BQU8yZSxhQUFhO0lBQ3hCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBNWUsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQW9lLGFBQUEsRUFBZTtNQUFBLElBQUFyVSxLQUFBO01BQ1g7TUFDQSxJQUFJLElBQUksQ0FBQzZQLFFBQVEsS0FBSyxJQUFJLEVBQUU7UUFDeEIsSUFBSSxDQUFDaFEsT0FBTyxDQUFDcU0sS0FBSyxDQUFDMkksa0JBQWtCLEdBQUcsSUFBSSxDQUFDaEYsUUFBUTtNQUN6RDtNQUVBLElBQUksQ0FBQ2lGLFlBQVksQ0FBQyxDQUFDOztNQUVuQjtNQUNBLElBQUksQ0FBQ1IsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQzNhLE9BQU8sQ0FBQyxVQUFDb2IsVUFBVSxFQUFLO1FBQ3REL1UsS0FBSSxDQUFDSCxPQUFPLENBQUNrTyxTQUFTLENBQUNDLEdBQUcsQ0FBQytHLFVBQVUsQ0FBQztNQUMxQyxDQUFDLENBQUM7TUFFRmxRLE1BQU0sQ0FBQ0MscUJBQXFCLENBQUMsWUFBTTtRQUMvQjtRQUNBLElBQUlELE1BQU0sQ0FBQ21RLGdCQUFnQixDQUFDaFYsS0FBSSxDQUFDSCxPQUFPLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLElBQUksRUFBRTtVQUN2RTtVQUNBRyxLQUFJLENBQUNILE9BQU8sQ0FBQ3lHLGdCQUFnQixDQUFDLGVBQWUsRUFBRTtZQUFBLE9BQU10RyxLQUFJLENBQUNpVixlQUFlLENBQUMsQ0FBQztVQUFBLEdBQUU7WUFDekV4TyxJQUFJLEVBQUU7VUFDVixDQUFDLENBQUM7VUFDRjVCLE1BQU0sQ0FBQ0MscUJBQXFCLENBQUMsWUFBTTtZQUMvQjlFLEtBQUksQ0FBQ0gsT0FBTyxDQUFDa08sU0FBUyxDQUFDSSxNQUFNLENBQUNuTyxLQUFJLENBQUNzVSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekR0VSxLQUFJLENBQUNILE9BQU8sQ0FBQ2tPLFNBQVMsQ0FBQ0MsR0FBRyxDQUFDaE8sS0FBSSxDQUFDc1UsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQzNELENBQUMsQ0FBQztRQUNOLENBQUMsTUFBTTtVQUNIdFUsS0FBSSxDQUFDOFUsWUFBWSxDQUFDLENBQUM7VUFFbkIsSUFBSTlVLEtBQUksQ0FBQ2tVLFFBQVEsRUFBRTtZQUNmbFUsS0FBSSxDQUFDa1UsUUFBUSxDQUFDNVcsS0FBSyxDQUFDMEMsS0FBSSxDQUFDSCxPQUFPLENBQUM7VUFDckM7VUFFQUcsS0FBSSxDQUFDM0osUUFBUSxDQUFDLENBQUM7UUFDbkI7TUFDSixDQUFDLENBQUM7SUFDTjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUFMLEdBQUE7SUFBQUMsS0FBQSxFQU9BLFNBQUFnZixnQkFBQSxFQUFrQjtNQUFBLElBQUF0UyxNQUFBO01BQ2QsSUFBSSxDQUFDMlIsWUFBWSxDQUFDLFFBQVEsRUFBRyxDQUFDLElBQUksQ0FBQ0gsT0FBTyxHQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQ3hhLE9BQU8sQ0FBQyxVQUFDb2IsVUFBVSxFQUFLO1FBQzlFcFMsTUFBSSxDQUFDOUMsT0FBTyxDQUFDa08sU0FBUyxDQUFDSSxNQUFNLENBQUM0RyxVQUFVLENBQUM7TUFDN0MsQ0FBQyxDQUFDO01BRUYsSUFBSSxJQUFJLENBQUNiLFFBQVEsRUFBRTtRQUNmLElBQUksQ0FBQ0EsUUFBUSxDQUFDNVcsS0FBSyxDQUFDLElBQUksQ0FBQ3VDLE9BQU8sQ0FBQztNQUNyQzs7TUFFQTtNQUNBLElBQUksSUFBSSxDQUFDZ1EsUUFBUSxLQUFLLElBQUksRUFBRTtRQUN4QixJQUFJLENBQUNoUSxPQUFPLENBQUNxTSxLQUFLLENBQUMySSxrQkFBa0IsR0FBRyxJQUFJO01BQ2hEO01BRUEsSUFBSSxDQUFDeGUsUUFBUSxDQUFDLENBQUM7SUFDbkI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFMLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFzYSxPQUFBLEVBQVM7TUFBQSxJQUFBek0sTUFBQTtNQUNMLElBQUksQ0FBQ2pFLE9BQU8sQ0FBQ3lKLG1CQUFtQixDQUFDLGVBQWUsRUFBRTtRQUFBLE9BQU14RixNQUFJLENBQUNtUixlQUFlO01BQUEsR0FBRTtRQUMxRXhPLElBQUksRUFBRTtNQUNWLENBQUMsQ0FBQztNQUVGLElBQUksQ0FBQ3FPLFlBQVksQ0FBQyxDQUFDOztNQUVuQjtNQUNBLElBQUksSUFBSSxDQUFDakYsUUFBUSxLQUFLLElBQUksRUFBRTtRQUN4QixJQUFJLENBQUNoUSxPQUFPLENBQUNxTSxLQUFLLENBQUMySSxrQkFBa0IsR0FBRyxJQUFJO01BQ2hEOztNQUVBO01BQ0EsSUFBSSxDQUFDeGUsUUFBUSxDQUFDLENBQUM7SUFDbkI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFMLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUE2ZSxhQUFBLEVBQWU7TUFBQSxJQUFBL1AsTUFBQTtNQUNYLElBQUksQ0FBQ3VQLFlBQVksQ0FBQyxDQUFDLENBQUMzYSxPQUFPLENBQUMsVUFBQ29iLFVBQVUsRUFBSztRQUN4Q2hRLE1BQUksQ0FBQ2xGLE9BQU8sQ0FBQ2tPLFNBQVMsQ0FBQ0ksTUFBTSxDQUFDNEcsVUFBVSxDQUFDO01BQzdDLENBQUMsQ0FBQztJQUNOOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUEvZSxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBbWUsY0FBY3ZFLFFBQVEsRUFBRTtNQUNwQixJQUFNcUYsTUFBTSxHQUFHLDZCQUE2QixDQUFDQyxJQUFJLENBQUN0RixRQUFRLENBQUM7TUFDM0QsSUFBTXVGLE1BQU0sR0FBR25XLE1BQU0sQ0FBQ2lXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNoQyxJQUFNRyxJQUFJLEdBQUlILE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQ3pCLEtBQUssR0FDTCxNQUFNO01BRVosT0FBUUcsSUFBSSxLQUFLLEtBQUssTUFBQWhWLE1BQUEsQ0FDYitVLE1BQU0sR0FBRyxJQUFJLGFBQUEvVSxNQUFBLENBQ2JpVixJQUFJLENBQUNDLEtBQUssQ0FBQ0gsTUFBTSxDQUFDLE9BQUk7SUFDbkM7RUFBQztBQUFBLEVBbkxtQ3hmLDZEQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYkEsSUFjcUI0ZixPQUFPLDBCQUFBOWUsV0FBQTtFQUFBLFNBQUE4ZSxRQUFBO0lBQUExZixlQUFBLE9BQUEwZixPQUFBO0lBQUEsT0FBQTdlLFVBQUEsT0FBQTZlLE9BQUEsRUFBQTVlLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUEyZSxPQUFBLEVBQUE5ZSxXQUFBO0VBQUEsT0FBQVgsWUFBQSxDQUFBeWYsT0FBQTtJQUFBeGYsR0FBQTtJQUFBQyxLQUFBO0lBQ3hCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7SUFDSSxTQUFBQyxVQUFVMkosT0FBTyxFQUFFO01BQ2Y7QUFDUjtBQUNBO01BQ1EsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU87O01BRXRCO0FBQ1I7QUFDQTtNQUNRLElBQUksQ0FBQzRWLFFBQVEsR0FBRyxJQUFJQyxHQUFHLENBQUMsQ0FBQzs7TUFFekI7QUFDUjtBQUNBO01BQ1EsSUFBSSxDQUFDQyxNQUFNLEdBQUcsSUFBSUMsR0FBRyxDQUFDLENBQUM7TUFFdkIsSUFBSSxDQUFDQyxhQUFhLENBQUMsQ0FBQztNQUVwQixJQUFJLElBQUksQ0FBQ0osUUFBUSxDQUFDSyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQ0MsV0FBVyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQ0MsU0FBUyxDQUFDLENBQUM7UUFFaEIsSUFBSSxDQUFDcGdCLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUNkLE9BQU8sQ0FBQztNQUM5RDtJQUNKOztJQUVBO0FBQ0o7QUFDQTtFQUZJO0lBQUE3SixHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBSSxTQUFBLEVBQVc7TUFDUCxJQUFJLENBQUMwZixXQUFXLENBQUMsQ0FBQztNQUNsQi9NLElBQUEsQ0FBQTlKLGVBQUEsQ0FBQXNXLE9BQUEsQ0FBQXJlLFNBQUEscUJBQUF5QixJQUFBO0lBQ0o7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFaSTtJQUFBNUMsR0FBQTtJQUFBQyxLQUFBLEVBYUEsU0FBQTRmLGNBQUEsRUFBZ0I7TUFBQSxJQUFBN1YsS0FBQTtNQUNaLElBQVFrSyxPQUFPLEdBQUssSUFBSSxDQUFDckssT0FBTyxDQUF4QnFLLE9BQU87TUFDZixJQUFJLENBQUN1TCxRQUFRLENBQUMzRixLQUFLLENBQUMsQ0FBQztNQUVyQjVZLE1BQU0sQ0FBQ3FGLElBQUksQ0FBQzJOLE9BQU8sQ0FBQyxDQUFDdlEsT0FBTyxDQUFDLFVBQUMzRCxHQUFHLEVBQUs7UUFDbEMsSUFBSSxRQUFRLENBQUNrSSxJQUFJLENBQUNsSSxHQUFHLENBQUMsRUFBRTtVQUNwQixNQUFNLElBQUlvRSxLQUFLLGtFQUFBaUcsTUFBQSxDQUFrRXJLLEdBQUcsQ0FBRSxDQUFDO1FBQzNGO1FBRUEsSUFBTWtnQixTQUFTLEdBQUdsZ0IsR0FBRyxDQUFDdVosT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFDNEcsS0FBSztVQUFBLFdBQUE5VixNQUFBLENBQVM4VixLQUFLLENBQUN6RyxXQUFXLENBQUMsQ0FBQztRQUFBLENBQUUsQ0FBQztRQUUvRSxJQUFJd0csU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFDQSxTQUFTLENBQUM3RyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7VUFDOUQ7UUFDSjtRQUVBLElBQU0rRyxZQUFZLEdBQUcsNEVBQTRFLENBQUNqQixJQUFJLENBQ2xHZSxTQUFTLENBQUMzRyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDRyxXQUFXLENBQUMsQ0FDbEQsQ0FBQztRQUVELElBQUkyRyxXQUFXLEdBQUcsSUFBSTtRQUN0QixJQUFJQyxXQUFXLEdBQUcsSUFBSTtRQUV0QixJQUNJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQ3hNLE9BQU8sQ0FBQ3NNLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUMzRkEsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsSUFBS0EsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsSUFBSUEsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVMsQ0FBQyxFQUN2RztVQUNFO1VBQ0FDLFdBQVcsR0FBRyxZQUFZO1VBQzFCQyxXQUFXLEdBQUlGLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUksUUFBUSxHQUFHQSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzlFLENBQUMsTUFBTSxJQUNIQSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUt0VSxTQUFTLElBQzFCLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUNnSSxPQUFPLENBQUNzTSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDaEc7VUFDRTtVQUFBLElBQUFHLGFBQUEsR0FBQTlZLGNBQUEsQ0FDa0IyWSxZQUFZO1VBQTNCQyxXQUFXLEdBQUFFLGFBQUE7VUFDZCxRQUFRSCxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEtBQUssZ0JBQWdCO1lBQ3JCLEtBQUssUUFBUTtjQUNURSxXQUFXLEdBQUcsUUFBUTtjQUN0QjtZQUNKLEtBQUssV0FBVztZQUNoQixLQUFLLE1BQU07Y0FDUEEsV0FBVyxHQUFHLFdBQVc7Y0FDekI7WUFDSixLQUFLLFFBQVE7Y0FDVEEsV0FBVyxHQUFHLFFBQVE7Y0FDdEI7WUFDSjtjQUNJQSxXQUFXLEdBQUcsU0FBUztjQUN2QjtVQUNSO1FBQ0o7UUFFQSxJQUFJLENBQUN0VyxLQUFJLENBQUN5VixRQUFRLENBQUN6UyxHQUFHLENBQUNxVCxXQUFXLENBQUMsRUFBRTtVQUNqQ3JXLEtBQUksQ0FBQ3lWLFFBQVEsQ0FBQzdHLEdBQUcsQ0FBQ3lILFdBQVcsRUFBRSxJQUFJWCxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDO1FBQ0ExVixLQUFJLENBQUN5VixRQUFRLENBQUN4UyxHQUFHLENBQUNvVCxXQUFXLENBQUMsQ0FBQ3pILEdBQUcsQ0FBQzBILFdBQVcsRUFBRXBNLE9BQU8sQ0FBQ2xVLEdBQUcsQ0FBQyxDQUFDOztRQUU3RDtRQUNBLE9BQU9rVSxPQUFPLENBQUNsVSxHQUFHLENBQUM7TUFDdkIsQ0FBQyxDQUFDOztNQUVGO01BQ0E7TUFDQSxJQUFJLENBQUN5ZixRQUFRLENBQUM5YixPQUFPLENBQUMsVUFBQzZjLE9BQU8sRUFBRXhhLElBQUksRUFBSztRQUNyQyxJQUFNc0osUUFBUSxHQUFHdEYsS0FBSSxDQUFDeVcscUJBQXFCLENBQUNELE9BQU8sQ0FBQztRQUVwRCxJQUNJLENBQUNBLE9BQU8sQ0FBQ3hULEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFDcEIsQ0FBQ3dULE9BQU8sQ0FBQ3hULEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFDekIsQ0FBQ3dULE9BQU8sQ0FBQ3hULEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFDdEJzQyxRQUFRLENBQUMxSixNQUFNLEtBQUssQ0FBQyxJQUNyQixDQUFDb0UsS0FBSSxDQUFDMFcsZ0JBQWdCLENBQUNGLE9BQU8sQ0FBQyxJQUMvQixDQUFDeFcsS0FBSSxDQUFDMlcsYUFBYSxDQUFDSCxPQUFPLENBQUMsRUFDakM7VUFDRXhXLEtBQUksQ0FBQ3lWLFFBQVEsVUFBTyxDQUFDelosSUFBSSxDQUFDO1FBQzlCLENBQUMsTUFBTTtVQUNId2EsT0FBTyxDQUFDNUgsR0FBRyxDQUFDLFVBQVUsRUFBRXRKLFFBQVEsQ0FBQztRQUNyQztNQUNKLENBQUMsQ0FBQztJQUNOOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFWSTtJQUFBdFAsR0FBQTtJQUFBQyxLQUFBLEVBV0EsU0FBQTJnQixhQUFhQyxPQUFPLEVBQUU7TUFDbEI7TUFDQSxJQUFJQSxPQUFPLENBQUN4SCxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDN0IsSUFBTThHLEtBQUssR0FBR1UsT0FBTyxDQUFDVixLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzVDLElBQU0zYyxNQUFNLEdBQUcsRUFBRTs7UUFFakI7UUFDQTJjLEtBQUssQ0FBQ3hjLE9BQU8sQ0FBQyxVQUFDMUQsS0FBSyxFQUFLO1VBQ3JCLElBQUksQ0FBQ0EsS0FBSyxDQUFDaU4sUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCMUosTUFBTSxDQUFDK0IsSUFBSSxDQUFDdEYsS0FBSyxDQUFDc1osT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQ3VILElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckQ7VUFDSjtVQUVBLElBQU1DLFdBQVcsR0FBRzlnQixLQUFLLENBQUNzWixPQUFPLENBQUMsc0JBQXNCLEVBQUUsVUFBQ3lILE1BQU07WUFBQSxPQUFLQSxNQUFNLENBQUN6SCxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztVQUFBLEVBQUMsQ0FDN0YwQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQ1ZnRixHQUFHLENBQUMsVUFBQ0MsVUFBVTtZQUFBLE9BQUtBLFVBQVUsQ0FBQzNILE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUNBLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUN1SCxJQUFJLENBQUMsQ0FBQztVQUFBLEVBQUM7VUFFL0Z0ZCxNQUFNLENBQUMrQixJQUFJLENBQUErQixLQUFBLENBQVg5RCxNQUFNLEVBQUEyZCxrQkFBQSxDQUFTSixXQUFXLEVBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBRUYsT0FBTztVQUNIL2EsSUFBSSxFQUFFLE9BQU87VUFDYm9iLFVBQVUsRUFBRTVkO1FBQ2hCLENBQUM7TUFDTDtNQUVBLElBQUksQ0FBQ3FkLE9BQU8sQ0FBQzNULFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN4QixPQUFPO1VBQ0hsSCxJQUFJLEVBQUU2YSxPQUFPO1VBQ2JPLFVBQVUsRUFBRTtRQUNoQixDQUFDO01BQ0w7TUFFQSxJQUFBQyxjQUFBLEdBQTJCUixPQUFPLENBQUM1RSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUFBcUYsZUFBQSxHQUFBN1osY0FBQSxDQUFBNFosY0FBQTtRQUF6Q3JiLElBQUksR0FBQXNiLGVBQUE7UUFBRUYsVUFBVSxHQUFBRSxlQUFBO01BRXZCLElBQUksQ0FBQ0YsVUFBVSxDQUFDbFUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLE9BQU87VUFDSGxILElBQUksRUFBSkEsSUFBSTtVQUNKb2IsVUFBVSxFQUFFLENBQUNBLFVBQVU7UUFDM0IsQ0FBQztNQUNMO01BRUEsSUFBTUwsV0FBVyxHQUFHSyxVQUFVLENBQUM3SCxPQUFPLENBQUMsc0JBQXNCLEVBQUUsVUFBQ3lILE1BQU07UUFBQSxPQUFLQSxNQUFNLENBQUN6SCxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztNQUFBLEVBQUMsQ0FDbEcwQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQ1ZnRixHQUFHLENBQUMsVUFBQ0MsVUFBVTtRQUFBLE9BQUtBLFVBQVUsQ0FBQzNILE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUNBLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUN1SCxJQUFJLENBQUMsQ0FBQztNQUFBLEVBQUM7TUFFL0YsT0FBTztRQUNIOWEsSUFBSSxFQUFKQSxJQUFJO1FBQ0pvYixVQUFVLEVBQUVMO01BQ2hCLENBQUM7SUFDTDs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMSTtJQUFBL2dCLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUF3Z0Isc0JBQXNCRCxPQUFPLEVBQUU7TUFDM0IsSUFBSUEsT0FBTyxDQUFDeFQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU9oRixLQUFLLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUM0QixPQUFPLENBQUMrSCxPQUFPLENBQUM0TyxPQUFPLENBQUN2VCxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQ3NDLGdCQUFnQixDQUFDaVIsT0FBTyxDQUFDdlQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7TUFDM0c7TUFFQSxPQUFPakYsS0FBSyxDQUFDQyxJQUFJLENBQUNrQyxRQUFRLENBQUNvRixnQkFBZ0IsQ0FBQ2lSLE9BQU8sQ0FBQ3ZULEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3hFOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUFqTixHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBeWdCLGlCQUFpQkYsT0FBTyxFQUFFO01BQ3RCLE9BQU8sQ0FDSCxTQUFTLEVBQ1QsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLEVBQ1AsT0FBTyxFQUNQLE9BQU8sRUFDUCxPQUFPLEVBQ1AsTUFBTSxDQUNULENBQUN0VCxRQUFRLENBQUMsSUFBSSxDQUFDMFQsWUFBWSxDQUFDSixPQUFPLENBQUN2VCxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQ2pILElBQUksQ0FBQzBULFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDOUU7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEk7SUFBQTFaLEdBQUE7SUFBQUMsS0FBQSxFQU1BLFNBQUEwZ0IsY0FBY0gsT0FBTyxFQUFFO01BQ25CLE9BQU8sQ0FDSCxNQUFNLEVBQ04sTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sRUFDUCxPQUFPLEVBQ1AsTUFBTSxFQUNOLE9BQU8sQ0FDVixDQUFDdFQsUUFBUSxDQUFDLElBQUksQ0FBQzBULFlBQVksQ0FBQ0osT0FBTyxDQUFDdlQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUNqSCxJQUFJLENBQUMwVCxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNFOztJQUVBO0FBQ0o7QUFDQTtFQUZJO0lBQUExWixHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBK2Ysb0JBQUEsRUFBc0I7TUFBQSxJQUFBclQsTUFBQTtNQUNsQixJQUFJLENBQUM4UyxRQUFRLENBQUM5YixPQUFPLENBQUMsVUFBQzZjLE9BQU8sRUFBSztRQUMvQixJQUFBZSxtQkFBQSxHQUE2QjVVLE1BQUksQ0FBQ2lVLFlBQVksQ0FBQ0osT0FBTyxDQUFDdlQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1VBQWhFakgsSUFBSSxHQUFBdWIsbUJBQUEsQ0FBSnZiLElBQUk7VUFBRW9iLFVBQVUsR0FBQUcsbUJBQUEsQ0FBVkgsVUFBVTtRQUV4QixRQUFRcGIsSUFBSTtVQUNSLEtBQUssT0FBTztVQUNaLEtBQUssT0FBTztZQUNSMkcsTUFBSSxDQUFDNlUsZ0JBQWdCLENBQUFsYSxLQUFBLENBQXJCcUYsTUFBSSxHQUFrQjZULE9BQU8sRUFBRSxLQUFLLEVBQUFuVyxNQUFBLENBQUE4VyxrQkFBQSxDQUFLQyxVQUFVLEdBQUM7WUFDcEQ7VUFDSixLQUFLLE9BQU87WUFDUnpVLE1BQUksQ0FBQzZVLGdCQUFnQixDQUFBbGEsS0FBQSxDQUFyQnFGLE1BQUksR0FBa0I2VCxPQUFPLEVBQUUsSUFBSSxFQUFBblcsTUFBQSxDQUFBOFcsa0JBQUEsQ0FBS0MsVUFBVSxHQUFDO1lBQ25EO1VBQ0osS0FBSyxPQUFPO1lBQ1J6VSxNQUFJLENBQUM4VSxnQkFBZ0IsQ0FBQ2pCLE9BQU8sQ0FBQztZQUM5QjtVQUNKO1FBQ0o7TUFDSixDQUFDLENBQUM7SUFDTjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUF4Z0IsR0FBQTtJQUFBQyxLQUFBLEVBT0EsU0FBQXVoQixpQkFBaUJoQixPQUFPLEVBQUVrQixHQUFHLEVBQWE7TUFBQSxJQUFBNVQsTUFBQTtNQUFBLFNBQUF5USxJQUFBLEdBQUEzZCxTQUFBLENBQUFnRixNQUFBLEVBQVJwQyxNQUFNLE9BQUF3RSxLQUFBLENBQUF1VyxJQUFBLE9BQUFBLElBQUEsV0FBQUUsSUFBQSxNQUFBQSxJQUFBLEdBQUFGLElBQUEsRUFBQUUsSUFBQTtRQUFOamIsTUFBTSxDQUFBaWIsSUFBQSxRQUFBN2QsU0FBQSxDQUFBNmQsSUFBQTtNQUFBO01BQ3BDLElBQU1rRCxpQkFBaUIsR0FBRyxJQUFJL0IsR0FBRyxDQUFDLENBQUM7TUFFbkNZLE9BQU8sQ0FBQ3ZULEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQ3RKLE9BQU8sQ0FBQyxVQUFDa0csT0FBTyxFQUFLO1FBQ3pDLElBQUlBLE9BQU8sQ0FBQzJKLE9BQU8sQ0FBQyxnR0FBZ0csQ0FBQyxFQUFFO1VBQ25IO1VBQ0E7UUFDSjtRQUVBLElBQUkzSixPQUFPLENBQUMySixPQUFPLENBQUMseUJBQXlCLENBQUMsRUFBRTtVQUM1Q21PLGlCQUFpQixDQUFDM0osR0FBRyxDQUFDbk8sT0FBTyxDQUFDO1FBQ2xDO01BQ0osQ0FBQyxDQUFDO01BRUYsSUFBTStYLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFBLEVBQVM7UUFDcEIsSUFBTUMsYUFBYSxHQUFHLElBQUlqQyxHQUFHLENBQUMsQ0FBQztRQUUvQitCLGlCQUFpQixDQUFDaGUsT0FBTyxDQUFDLFVBQUNrRyxPQUFPLEVBQUs7VUFDbkMsSUFBSUEsT0FBTyxDQUFDMkosT0FBTyxDQUFDLHlDQUF5QyxDQUFDLEVBQUU7WUFDNUQsSUFBSTNKLE9BQU8sQ0FBQ2lZLE9BQU8sRUFBRTtjQUNqQkQsYUFBYSxDQUFDN0osR0FBRyxDQUFDbk8sT0FBTyxDQUFDNUosS0FBSyxDQUFDO1lBQ3BDO1lBQ0E7VUFDSjtVQUVBNGhCLGFBQWEsQ0FBQzdKLEdBQUcsQ0FBQ25PLE9BQU8sQ0FBQzVKLEtBQUssQ0FBQztRQUNwQyxDQUFDLENBQUM7UUFFRixJQUFJeWhCLEdBQUcsRUFBRTtVQUNMLElBQUlsZSxNQUFNLENBQUN1ZSxLQUFLLENBQUMsVUFBQzloQixLQUFLO1lBQUEsT0FBSzRoQixhQUFhLENBQUM3VSxHQUFHLENBQUMvTSxLQUFLLENBQUM7VUFBQSxFQUFDLEVBQUU7WUFDbkQ2TixNQUFJLENBQUNrVSxhQUFhLENBQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDO1VBQ3JDLENBQUMsTUFBTTtZQUNIMVMsTUFBSSxDQUFDa1UsYUFBYSxDQUFDeEIsT0FBTyxFQUFFLEtBQUssQ0FBQztVQUN0QztVQUNBO1FBQ0o7UUFFQSxJQUFJaGQsTUFBTSxDQUFDeWUsSUFBSSxDQUFDLFVBQUNoaUIsS0FBSztVQUFBLE9BQUs0aEIsYUFBYSxDQUFDN1UsR0FBRyxDQUFDL00sS0FBSyxDQUFDO1FBQUEsRUFBQyxFQUFFO1VBQ2xENk4sTUFBSSxDQUFDa1UsYUFBYSxDQUFDeEIsT0FBTyxFQUFFLElBQUksQ0FBQztRQUNyQyxDQUFDLE1BQU07VUFDSDFTLE1BQUksQ0FBQ2tVLGFBQWEsQ0FBQ3hCLE9BQU8sRUFBRSxLQUFLLENBQUM7UUFDdEM7TUFDSixDQUFDO01BRURtQixpQkFBaUIsQ0FBQ2hlLE9BQU8sQ0FBQyxVQUFDa0csT0FBTyxFQUFLO1FBQ25DLElBQU1xWSxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBQTtVQUFBLE9BQVNOLFNBQVMsQ0FBQyxDQUFDO1FBQUE7UUFFdEMsSUFBSS9YLE9BQU8sQ0FBQzJKLE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFO1VBQzVEMUYsTUFBSSxDQUFDNlIsTUFBTSxDQUFDM0gsR0FBRyxDQUFDO1lBQ1puTyxPQUFPLEVBQVBBLE9BQU87WUFDUDJHLFNBQVMsRUFBRSxPQUFPO1lBQ2xCNUYsS0FBSyxFQUFFc1g7VUFDWCxDQUFDLENBQUM7VUFDRnJZLE9BQU8sQ0FBQ3lHLGdCQUFnQixDQUFDLE9BQU8sRUFBRTRSLFlBQVksQ0FBQztVQUMvQztRQUNKO1FBRUFwVSxNQUFJLENBQUM2UixNQUFNLENBQUMzSCxHQUFHLENBQUM7VUFDWm5PLE9BQU8sRUFBUEEsT0FBTztVQUNQMkcsU0FBUyxFQUFFLE9BQU87VUFDbEI1RixLQUFLLEVBQUVzWDtRQUNYLENBQUMsQ0FBQztRQUNGclksT0FBTyxDQUFDeUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFNFIsWUFBWSxDQUFDO01BQ25ELENBQUMsQ0FBQztJQUNOOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBbGlCLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUF3aEIsaUJBQWlCakIsT0FBTyxFQUFFO01BQUEsSUFBQXpSLE1BQUE7TUFDdEIsSUFBTTRTLGlCQUFpQixHQUFHLElBQUkvQixHQUFHLENBQUMsQ0FBQztNQUVuQ1ksT0FBTyxDQUFDdlQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDdEosT0FBTyxDQUFDLFVBQUNrRyxPQUFPLEVBQUs7UUFDekMsSUFBSUEsT0FBTyxDQUFDMkosT0FBTyxDQUFDLDhFQUE4RSxDQUFDLEVBQUU7VUFDakc7VUFDQTtRQUNKO1FBRUEsSUFBSTNKLE9BQU8sQ0FBQzJKLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO1VBQzVDbU8saUJBQWlCLENBQUMzSixHQUFHLENBQUNuTyxPQUFPLENBQUM7UUFDbEM7TUFDSixDQUFDLENBQUM7TUFFRixJQUFNK1gsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUEsRUFBUztRQUNwQixJQUFNQyxhQUFhLEdBQUcsSUFBSWpDLEdBQUcsQ0FBQyxDQUFDO1FBRS9CK0IsaUJBQWlCLENBQUNoZSxPQUFPLENBQUMsVUFBQ2tHLE9BQU8sRUFBSztVQUNuQyxJQUFJQSxPQUFPLENBQUMySixPQUFPLENBQUMseUNBQXlDLENBQUMsRUFBRTtZQUM1RCxJQUFJM0osT0FBTyxDQUFDaVksT0FBTyxFQUFFO2NBQ2pCRCxhQUFhLENBQUM3SixHQUFHLENBQUNuTyxPQUFPLENBQUM7WUFDOUI7WUFDQTtVQUNKO1VBRUEsSUFBSUEsT0FBTyxDQUFDNUosS0FBSyxDQUFDNmdCLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzdCZSxhQUFhLENBQUM3SixHQUFHLENBQUNuTyxPQUFPLENBQUM7VUFDOUI7UUFDSixDQUFDLENBQUM7UUFFRixJQUFJZ1ksYUFBYSxDQUFDL0IsSUFBSSxLQUFLLENBQUMsRUFBRTtVQUMxQi9RLE1BQUksQ0FBQ2lULGFBQWEsQ0FBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUM7UUFDckMsQ0FBQyxNQUFNO1VBQ0h6UixNQUFJLENBQUNpVCxhQUFhLENBQUN4QixPQUFPLEVBQUUsS0FBSyxDQUFDO1FBQ3RDO01BQ0osQ0FBQztNQUVEbUIsaUJBQWlCLENBQUNoZSxPQUFPLENBQUMsVUFBQ2tHLE9BQU8sRUFBSztRQUNuQyxJQUFNcVksWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUE7VUFBQSxPQUFTTixTQUFTLENBQUMsQ0FBQztRQUFBO1FBRXRDLElBQUkvWCxPQUFPLENBQUMySixPQUFPLENBQUMseUNBQXlDLENBQUMsRUFBRTtVQUM1RHpFLE1BQUksQ0FBQzRRLE1BQU0sQ0FBQzNILEdBQUcsQ0FBQztZQUNabk8sT0FBTyxFQUFQQSxPQUFPO1lBQ1AyRyxTQUFTLEVBQUUsT0FBTztZQUNsQjVGLEtBQUssRUFBRXNYO1VBQ1gsQ0FBQyxDQUFDO1VBQ0ZyWSxPQUFPLENBQUN5RyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU0UixZQUFZLENBQUM7VUFDL0M7UUFDSjtRQUVBblQsTUFBSSxDQUFDNFEsTUFBTSxDQUFDM0gsR0FBRyxDQUFDO1VBQ1puTyxPQUFPLEVBQVBBLE9BQU87VUFDUDJHLFNBQVMsRUFBRSxPQUFPO1VBQ2xCNUYsS0FBSyxFQUFFc1g7UUFDWCxDQUFDLENBQUM7UUFDRnJZLE9BQU8sQ0FBQ3lHLGdCQUFnQixDQUFDLE9BQU8sRUFBRTRSLFlBQVksQ0FBQztNQUNuRCxDQUFDLENBQUM7SUFDTjtFQUFDO0lBQUFsaUIsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQWdnQixVQUFBLEVBQVk7TUFDUixJQUFJLENBQUNOLE1BQU0sQ0FBQ2hjLE9BQU8sQ0FBQyxVQUFDaUgsS0FBSztRQUFBLE9BQUtBLEtBQUssQ0FBQ0EsS0FBSyxDQUFDLENBQUM7TUFBQSxFQUFDO0lBQ2pEO0VBQUM7SUFBQTVLLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUE4ZixZQUFBLEVBQWM7TUFDVixJQUFJLENBQUNKLE1BQU0sQ0FBQ2hjLE9BQU8sQ0FBQyxVQUFDaUgsS0FBSyxFQUFLO1FBQzNCQSxLQUFLLENBQUNmLE9BQU8sQ0FBQ3lKLG1CQUFtQixDQUFDMUksS0FBSyxDQUFDNEYsU0FBUyxFQUFFNUYsS0FBSyxDQUFDQSxLQUFLLENBQUM7TUFDbkUsQ0FBQyxDQUFDO0lBQ047RUFBQztJQUFBNUssR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQStoQixjQUFjeEIsT0FBTyxFQUFFMkIsWUFBWSxFQUFFO01BQ2pDLElBQUFDLGtCQUFBLEdBQTZCLElBQUksQ0FBQ3hCLFlBQVksQ0FBQ0osT0FBTyxDQUFDdlQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQTdEakgsSUFBSSxHQUFBb2Msa0JBQUEsQ0FBSnBjLElBQUk7UUFBRW9iLFVBQVUsR0FBQWdCLGtCQUFBLENBQVZoQixVQUFVO01BRXhCLFFBQVFwYixJQUFJO1FBQ1IsS0FBSyxNQUFNO1FBQ1gsS0FBSyxNQUFNO1VBQ1AsSUFBSSxDQUFDcWMsVUFBVSxDQUFDN0IsT0FBTyxFQUFHeGEsSUFBSSxLQUFLLE1BQU0sR0FBSW1jLFlBQVksR0FBRyxDQUFDQSxZQUFZLENBQUM7VUFDMUU7UUFDSjtNQUNKO0lBQ0o7RUFBQztJQUFBbmlCLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFvaUIsV0FBVzdCLE9BQU8sRUFBRWpELElBQUksRUFBRTtNQUN0QixJQUFJQSxJQUFJLElBQUksSUFBSSxDQUFDMVQsT0FBTyxDQUFDcU0sS0FBSyxDQUFDb00sT0FBTyxLQUFLLE1BQU0sRUFBRTtRQUMvQyxJQUFJLENBQUN6WSxPQUFPLENBQUNrTyxTQUFTLENBQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQ3RPLE9BQU8sQ0FBQ3FLLE9BQU8sQ0FBQ3FPLGVBQWUsRUFBRTtVQUN2QyxJQUFJLENBQUMxWSxPQUFPLENBQUNxTSxLQUFLLENBQUNvTSxPQUFPLEdBQUcsT0FBTztRQUN4QyxDQUFDLE1BQU07VUFDSCxJQUFJLENBQUN6WSxPQUFPLENBQUNxTSxLQUFLLENBQUNvTSxPQUFPLEdBQUcsSUFBSSxDQUFDelksT0FBTyxDQUFDcUssT0FBTyxDQUFDcU8sZUFBZTtRQUNyRTtRQUVBLE9BQU8sSUFBSSxDQUFDMVksT0FBTyxDQUFDcUssT0FBTyxDQUFDcU8sZUFBZTtRQUUzQyxJQUFJLENBQUNDLFdBQVcsQ0FBQ2hDLE9BQU8sQ0FBQztNQUM3QixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMzVyxPQUFPLENBQUNxTSxLQUFLLENBQUNvTSxPQUFPLEtBQUssTUFBTSxFQUFFO1FBQzlDLElBQUksQ0FBQ3pZLE9BQU8sQ0FBQ2tPLFNBQVMsQ0FBQ0MsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUVsQyxJQUFJLENBQUNuTyxPQUFPLENBQUNxSyxPQUFPLENBQUNxTyxlQUFlLEdBQUd2RCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUNuVixPQUFPLENBQUMsQ0FBQ3lZLE9BQU87UUFDN0UsSUFBSSxDQUFDelksT0FBTyxDQUFDcU0sS0FBSyxDQUFDb00sT0FBTyxHQUFHLE1BQU07UUFFbkMsSUFBSSxDQUFDRSxXQUFXLENBQUNoQyxPQUFPLENBQUM7TUFDN0I7SUFDSjtFQUFDO0lBQUF4Z0IsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQXVpQixZQUFZaEMsT0FBTyxFQUFFO01BQ2pCLElBQUksQ0FBQzNnQixTQUFTLENBQUNzUyxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQ3RJLE9BQU8sRUFBRTJXLE9BQU8sQ0FBQztNQUM1RCxJQUFJLENBQUMzZ0IsU0FBUyxDQUFDOEssV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUNkLE9BQU8sRUFBRTJXLE9BQU8sQ0FBQztJQUN0RTtFQUFDO0FBQUEsRUE1Y2dDNWdCLDZEQUFVOzs7Ozs7Ozs7Ozs7Ozs7QUMvQi9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWU7RUFDWHFOLEdBQUcsV0FBQUEsSUFBQ3NHLE1BQU0sRUFBRWtQLElBQUksRUFBRUMsUUFBUSxFQUFFO0lBQ3hCLElBQUksT0FBT0QsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUMxQixJQUFNRSxTQUFTLEdBQUdGLElBQUksQ0FBQy9JLFdBQVcsQ0FBQyxDQUFDO01BRXBDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixDQUFDLENBQUN4TSxRQUFRLENBQUN1VixJQUFJLENBQUMsRUFBRTtRQUMzRixNQUFNLElBQUlyZSxLQUFLLHlCQUFBaUcsTUFBQSxDQUF3Qm9ZLElBQUkseUNBQXFDLENBQUM7TUFDckY7TUFFQSxJQUFJbFAsTUFBTSxDQUFDcVAsU0FBUyxDQUFDRCxTQUFTLENBQUMsRUFBRTtRQUM3QixPQUFPO1VBQUEsSUFBQUUscUJBQUE7VUFBQSxPQUFlLENBQUFBLHFCQUFBLEdBQUF4WixPQUFPLENBQUM0RCxHQUFHLENBQUNzRyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUNvUCxTQUFTLENBQUMsRUFBQ0csV0FBVyxDQUFBeGIsS0FBQSxDQUFBdWIscUJBQUEsRUFBQWppQixTQUFVLENBQUM7UUFBQTtNQUMxRjtJQUNKO0lBRUEsT0FBT3lJLE9BQU8sQ0FBQzRELEdBQUcsQ0FBQ3NHLE1BQU0sRUFBRWtQLElBQUksRUFBRUMsUUFBUSxDQUFDO0VBQzlDLENBQUM7RUFFRDFWLEdBQUcsV0FBQUEsSUFBQ3VHLE1BQU0sRUFBRWtQLElBQUksRUFBRTtJQUNkLElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUMxQixJQUFNRSxTQUFTLEdBQUdGLElBQUksQ0FBQy9JLFdBQVcsQ0FBQyxDQUFDO01BRXBDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixDQUFDLENBQUN4TSxRQUFRLENBQUN1VixJQUFJLENBQUMsRUFBRTtRQUMzRixPQUFPLEtBQUs7TUFDaEI7TUFFQSxJQUFJbFAsTUFBTSxDQUFDcVAsU0FBUyxDQUFDRCxTQUFTLENBQUMsRUFBRTtRQUM3QixPQUFPLElBQUk7TUFDZjtJQUNKO0lBRUEsT0FBT3RaLE9BQU8sQ0FBQzJELEdBQUcsQ0FBQ3VHLE1BQU0sRUFBRWtQLElBQUksQ0FBQztFQUNwQztBQUNKLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUNnRDtBQUNGO0FBQ0s7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBLElBU3FCTyxZQUFZO0VBQzdCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJLFNBQUFBLGFBQVloZCxJQUFJLEVBQUVuRyxTQUFTLEVBQUV3WSxRQUFRLEVBQUU7SUFBQXZZLGVBQUEsT0FBQWtqQixZQUFBO0lBQ25DLElBQUksQ0FBQ2hkLElBQUksR0FBR0EsSUFBSTtJQUNoQixJQUFJLENBQUNuRyxTQUFTLEdBQUcsSUFBSW9qQixLQUFLLENBQ3RCcGpCLFNBQVMsRUFDVGtqQiwwREFDSixDQUFDO0lBQ0QsSUFBSSxDQUFDMUssUUFBUSxHQUFHQSxRQUFROztJQUV4QjtJQUNBblgsTUFBTSxDQUFDZ2lCLE1BQU0sQ0FBQyxJQUFJLENBQUM3SyxRQUFRLENBQUM7SUFFNUIsSUFBSSxDQUFDOEssU0FBUyxHQUFHLEVBQUU7SUFDbkIsSUFBSSxDQUFDQyxTQUFTLEdBQUc7TUFDYkMsV0FBVyxFQUFFO0lBQ2pCLENBQUM7SUFDRDtJQUNBbmlCLE1BQU0sQ0FBQ29pQixJQUFJLENBQUMsSUFBSSxDQUFDRixTQUFTLENBQUM7SUFFM0IsSUFBSSxDQUFDRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7O0lBRTNCO0lBQ0F0aUIsTUFBTSxDQUFDZ2lCLE1BQU0sQ0FBQ0YsWUFBWSxDQUFDN2hCLFNBQVMsQ0FBQztJQUNyQ0QsTUFBTSxDQUFDZ2lCLE1BQU0sQ0FBQyxJQUFJLENBQUM7RUFDdkI7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBJLE9BQUFuakIsWUFBQSxDQUFBaWpCLFlBQUE7SUFBQWhqQixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBd2pCLFVBQVVDLFVBQVUsRUFBRTtNQUNsQixJQUFJLElBQUksQ0FBQ0MsVUFBVSxDQUFDLENBQUMsRUFBRTtRQUNuQixPQUFPLEtBQUs7TUFDaEI7TUFFQSxPQUFRLE9BQU8sSUFBSSxDQUFDdEwsUUFBUSxDQUFDbFgsU0FBUyxDQUFDdWlCLFVBQVUsQ0FBQyxLQUFLLFVBQVU7SUFDckU7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOSTtJQUFBMWpCLEdBQUE7SUFBQUMsS0FBQSxFQU9BLFNBQUEyakIsV0FBQSxFQUEwQjtNQUN0QixJQUFJLElBQUksQ0FBQ0QsVUFBVSxDQUFDLENBQUMsRUFBRTtRQUNuQixPQUFPLElBQUk7TUFDZjtNQUFDLFNBQUFwRixJQUFBLEdBQUEzZCxTQUFBLENBQUFnRixNQUFBLEVBSFN3YixVQUFVLE9BQUFwWixLQUFBLENBQUF1VyxJQUFBLEdBQUFFLElBQUEsTUFBQUEsSUFBQSxHQUFBRixJQUFBLEVBQUFFLElBQUE7UUFBVjJDLFVBQVUsQ0FBQTNDLElBQUEsSUFBQTdkLFNBQUEsQ0FBQTZkLElBQUE7TUFBQTtNQUtwQixJQUFNRCxJQUFJLEdBQUc0QyxVQUFVO01BQ3ZCLElBQU1zQyxVQUFVLEdBQUdsRixJQUFJLENBQUM1QixLQUFLLENBQUMsQ0FBQztNQUUvQixPQUFPLElBQUksQ0FBQ3ZFLFFBQVEsQ0FBQ2xYLFNBQVMsQ0FBQ3VpQixVQUFVLENBQUMsQ0FBQ2xGLElBQUksQ0FBQztJQUNwRDs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEk7SUFBQXhlLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUE2aUIsWUFBQSxFQUEyQjtNQUFBLElBQUE5WSxLQUFBO01BQUEsU0FBQTZaLEtBQUEsR0FBQWpqQixTQUFBLENBQUFnRixNQUFBLEVBQVp3YixVQUFVLE9BQUFwWixLQUFBLENBQUE2YixLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7UUFBVjFDLFVBQVUsQ0FBQTBDLEtBQUEsSUFBQWxqQixTQUFBLENBQUFrakIsS0FBQTtNQUFBO01BQ3JCLElBQUksSUFBSSxDQUFDSCxVQUFVLENBQUMsQ0FBQyxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDdEwsUUFBUSxDQUFBL1EsS0FBQSxDQUFiLElBQUksRUFBYThaLFVBQVUsQ0FBQztNQUN2QztNQUNBLElBQUksQ0FBQyxJQUFJLENBQUMyQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUU7UUFDL0IsSUFBTUMsS0FBSyxHQUFHLElBQUksQ0FBQ0MsZUFBZSxDQUFDLENBQUMsQ0FBQzNiLE1BQU0sQ0FBQyxVQUFDNGIsSUFBSTtVQUFBLE9BQUssQ0FBQ2xhLEtBQUksQ0FBQ25LLFNBQVMsQ0FBQ3NrQixjQUFjLENBQUMsQ0FBQyxDQUFDalgsUUFBUSxDQUFDZ1gsSUFBSSxDQUFDO1FBQUEsRUFBQztRQUN0RyxNQUFNLElBQUk5ZixLQUFLLFVBQUFpRyxNQUFBLENBQVMsSUFBSSxDQUFDckUsSUFBSSxnREFBQXFFLE1BQUEsQ0FBNEMyWixLQUFLLENBQUN4UixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQztNQUNwRztNQUNBLElBQUksSUFBSSxDQUFDNFIsV0FBVyxDQUFDLENBQUMsRUFBRTtRQUNwQixJQUFJLElBQUksQ0FBQ2pCLFNBQVMsQ0FBQ3ZkLE1BQU0sS0FBSyxDQUFDLEVBQUU7VUFDN0IsSUFBSSxDQUFDeWUsbUJBQW1CLENBQUEvYyxLQUFBLENBQXhCLElBQUksRUFBd0I4WixVQUFVLENBQUM7UUFDM0M7O1FBRUE7UUFDQSxJQUFJbGdCLE1BQU0sQ0FBQ3FGLElBQUksQ0FBQyxJQUFJLENBQUNnZCxLQUFLLENBQUMsQ0FBQzNkLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDcEMxRSxNQUFNLENBQUMrTSxPQUFPLENBQUMsSUFBSSxDQUFDdVYsaUJBQWlCLENBQUMsQ0FBQzdmLE9BQU8sQ0FBQyxVQUFDdUssS0FBSyxFQUFLO1lBQ3RELElBQUFDLE1BQUEsR0FBQTFHLGNBQUEsQ0FBK0J5RyxLQUFLO2NBQTdCd1YsVUFBVSxHQUFBdlYsTUFBQTtjQUFFK1AsUUFBUSxHQUFBL1AsTUFBQTtZQUMzQm5FLEtBQUksQ0FBQ21aLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ08sVUFBVSxDQUFDLEdBQUd4RixRQUFRO1VBQzVDLENBQUMsQ0FBQztVQUNGaGQsTUFBTSxDQUFDK00sT0FBTyxDQUFDLElBQUksQ0FBQ3NWLEtBQUssQ0FBQyxDQUFDNWYsT0FBTyxDQUFDLFVBQUN1SyxLQUFLLEVBQUs7WUFDMUMsSUFBQWUsT0FBQSxHQUFBeEgsY0FBQSxDQUErQnlHLEtBQUs7Y0FBN0J3VixVQUFVLEdBQUF6VSxPQUFBO2NBQUVpUCxRQUFRLEdBQUFqUCxPQUFBO1lBQzNCakYsS0FBSSxDQUFDbVosU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDTyxVQUFVLENBQUMsR0FBRztjQUFBLFNBQUFZLEtBQUEsR0FBQTFqQixTQUFBLENBQUFnRixNQUFBLEVBQUkyZSxNQUFNLE9BQUF2YyxLQUFBLENBQUFzYyxLQUFBLEdBQUFFLEtBQUEsTUFBQUEsS0FBQSxHQUFBRixLQUFBLEVBQUFFLEtBQUE7Z0JBQU5ELE1BQU0sQ0FBQUMsS0FBQSxJQUFBNWpCLFNBQUEsQ0FBQTRqQixLQUFBO2NBQUE7Y0FBQSxPQUFLdEcsUUFBUSxDQUFBNVcsS0FBQSxVQUFDMEMsS0FBSSxFQUFBSyxNQUFBLENBQUtrYSxNQUFNLEVBQUM7WUFBQTtVQUM1RSxDQUFDLENBQUM7UUFDTjtRQUVBLE9BQU8sSUFBSSxDQUFDcEIsU0FBUyxDQUFDLENBQUMsQ0FBQztNQUM1Qjs7TUFFQTtNQUNBLElBQUlqaUIsTUFBTSxDQUFDcUYsSUFBSSxDQUFDLElBQUksQ0FBQ2dkLEtBQUssQ0FBQyxDQUFDM2QsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNwQzFFLE1BQU0sQ0FBQytNLE9BQU8sQ0FBQyxJQUFJLENBQUN1VixpQkFBaUIsQ0FBQyxDQUFDN2YsT0FBTyxDQUFDLFVBQUN1SyxLQUFLLEVBQUs7VUFDdEQsSUFBQW9FLE9BQUEsR0FBQTdLLGNBQUEsQ0FBK0J5RyxLQUFLO1lBQTdCd1YsVUFBVSxHQUFBcFIsT0FBQTtZQUFFNEwsUUFBUSxHQUFBNUwsT0FBQTtVQUMzQnRJLEtBQUksQ0FBQ3FPLFFBQVEsQ0FBQ2xYLFNBQVMsQ0FBQ3VpQixVQUFVLENBQUMsR0FBR3hGLFFBQVE7UUFDbEQsQ0FBQyxDQUFDO1FBQ0ZoZCxNQUFNLENBQUMrTSxPQUFPLENBQUMsSUFBSSxDQUFDc1YsS0FBSyxDQUFDLENBQUM1ZixPQUFPLENBQUMsVUFBQ3VLLEtBQUssRUFBSztVQUMxQyxJQUFBdVcsT0FBQSxHQUFBaGQsY0FBQSxDQUErQnlHLEtBQUs7WUFBN0J3VixVQUFVLEdBQUFlLE9BQUE7WUFBRXZHLFFBQVEsR0FBQXVHLE9BQUE7VUFDM0J6YSxLQUFJLENBQUNxTyxRQUFRLENBQUNsWCxTQUFTLENBQUN1aUIsVUFBVSxDQUFDLEdBQUc7WUFBQSxTQUFBZ0IsS0FBQSxHQUFBOWpCLFNBQUEsQ0FBQWdGLE1BQUEsRUFBSTJlLE1BQU0sT0FBQXZjLEtBQUEsQ0FBQTBjLEtBQUEsR0FBQUMsS0FBQSxNQUFBQSxLQUFBLEdBQUFELEtBQUEsRUFBQUMsS0FBQTtjQUFOSixNQUFNLENBQUFJLEtBQUEsSUFBQS9qQixTQUFBLENBQUErakIsS0FBQTtZQUFBO1lBQUEsT0FBS3pHLFFBQVEsQ0FBQTVXLEtBQUEsVUFBQzBDLEtBQUksRUFBQUssTUFBQSxDQUFLa2EsTUFBTSxFQUFDO1VBQUE7UUFDbEYsQ0FBQyxDQUFDO01BQ047TUFFQSxJQUFNSyxXQUFXLEdBQUFDLFVBQUEsQ0FBTyxJQUFJLENBQUN4TSxRQUFRLEdBQUMsSUFBSSxDQUFDeFksU0FBUyxFQUFBd0ssTUFBQSxDQUFLK1csVUFBVSxFQUFDO01BQ3BFd0QsV0FBVyxDQUFDdGtCLE1BQU0sR0FBRztRQUFBLE9BQU0wSixLQUFJLENBQUNtWixTQUFTLENBQUMyQixNQUFNLENBQUM5YSxLQUFJLENBQUNtWixTQUFTLENBQUNyUCxPQUFPLENBQUM4USxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7TUFBQTtNQUN4RkEsV0FBVyxDQUFDMWtCLFNBQVMsQ0FBQW9ILEtBQUEsQ0FBckJzZCxXQUFXLEVBQWN4RCxVQUFVLENBQUM7TUFDcEMsSUFBSSxDQUFDK0IsU0FBUyxDQUFDNWQsSUFBSSxDQUFDcWYsV0FBVyxDQUFDO01BRWhDLE9BQU9BLFdBQVc7SUFDdEI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOSTtJQUFBNWtCLEdBQUE7SUFBQUMsS0FBQSxFQU9BLFNBQUE4a0IsYUFBQSxFQUFlO01BQ1gsSUFBSSxJQUFJLENBQUNwQixVQUFVLENBQUMsQ0FBQyxFQUFFO1FBQ25CLE9BQU8sRUFBRTtNQUNiO01BRUEsT0FBTyxJQUFJLENBQUNSLFNBQVM7SUFDekI7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFuakIsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQTBqQixXQUFBLEVBQWE7TUFDVCxPQUFRLE9BQU8sSUFBSSxDQUFDdEwsUUFBUSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUNBLFFBQVEsQ0FBQ2xYLFNBQVMsWUFBWXZCLDZEQUFVLEtBQUssS0FBSztJQUMxRzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQUksR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQW1rQixZQUFBLEVBQWM7TUFDVixPQUFPLElBQUksQ0FBQy9MLFFBQVEsQ0FBQ2xYLFNBQVMsWUFBWVYsNERBQVMsS0FBSyxJQUFJO0lBQ2hFOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkk7SUFBQVQsR0FBQTtJQUFBQyxLQUFBLEVBT0EsU0FBQStrQixjQUFBLEVBQWdCO01BQ1osSUFBSSxDQUFDLElBQUksQ0FBQ1osV0FBVyxDQUFDLENBQUMsRUFBRTtRQUNyQixPQUFPLElBQUk7TUFDZjtNQUVBLE9BQU8sSUFBSSxDQUFDaEIsU0FBUyxDQUFDQyxXQUFXO0lBQ3JDOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBcmpCLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFva0Isb0JBQUEsRUFBbUM7TUFBQSxJQUFBMVgsTUFBQTtNQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDeVgsV0FBVyxDQUFDLENBQUMsRUFBRTtRQUNyQjtNQUNKO01BQUMsU0FBQWEsS0FBQSxHQUFBcmtCLFNBQUEsQ0FBQWdGLE1BQUEsRUFIa0J3YixVQUFVLE9BQUFwWixLQUFBLENBQUFpZCxLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7UUFBVjlELFVBQVUsQ0FBQThELEtBQUEsSUFBQXRrQixTQUFBLENBQUFza0IsS0FBQTtNQUFBO01BSzdCLElBQU1OLFdBQVcsR0FBQUMsVUFBQSxDQUFPLElBQUksQ0FBQ3hNLFFBQVEsR0FBQyxJQUFJLENBQUN4WSxTQUFTLEVBQUF3SyxNQUFBLENBQUsrVyxVQUFVLEVBQUM7TUFDcEV3RCxXQUFXLENBQUN0a0IsTUFBTSxHQUFHO1FBQUEsT0FBTXFNLE1BQUksQ0FBQ3dXLFNBQVMsQ0FBQzJCLE1BQU0sQ0FBQ25ZLE1BQUksQ0FBQ3dXLFNBQVMsQ0FBQ3JQLE9BQU8sQ0FBQzhRLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUFBO01BQ3hGQSxXQUFXLENBQUMxa0IsU0FBUyxDQUFBb0gsS0FBQSxDQUFyQnNkLFdBQVcsRUFBY3hELFVBQVUsQ0FBQztNQUNwQyxJQUFJLENBQUMrQixTQUFTLENBQUM1ZCxJQUFJLENBQUNxZixXQUFXLENBQUM7TUFDaEMsSUFBSSxDQUFDeEIsU0FBUyxDQUFDQyxXQUFXLEdBQUcsSUFBSTtJQUNyQzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQXJqQixHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBZ2tCLGdCQUFBLEVBQWtCO01BQ2Q7TUFDQSxJQUFJLElBQUksQ0FBQ04sVUFBVSxDQUFDLENBQUMsRUFBRTtRQUNuQixPQUFPLEVBQUU7TUFDYjs7TUFFQTtNQUNBLElBQUksT0FBTyxJQUFJLENBQUN0TCxRQUFRLENBQUNsWCxTQUFTLENBQUNoQixZQUFZLEtBQUssVUFBVSxFQUFFO1FBQzVELE9BQU8sRUFBRTtNQUNiO01BRUEsT0FBTyxJQUFJLENBQUNrWSxRQUFRLENBQUNsWCxTQUFTLENBQUNoQixZQUFZLENBQUMsQ0FBQyxDQUFDOGdCLEdBQUcsQ0FBQyxVQUFDaUQsSUFBSTtRQUFBLE9BQUtBLElBQUksQ0FBQ3hLLFdBQVcsQ0FBQyxDQUFDO01BQUEsRUFBQztJQUNuRjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQTFaLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUE4akIsc0JBQUEsRUFBd0I7TUFBQSxJQUFBalcsTUFBQTtNQUNwQixJQUFNM04sWUFBWSxHQUFHLElBQUksQ0FBQzhqQixlQUFlLENBQUMsQ0FBQztNQUUzQyxJQUFJNVMsU0FBUyxHQUFHLElBQUk7TUFDcEJsUixZQUFZLENBQUN3RCxPQUFPLENBQUMsVUFBQ3doQixNQUFNLEVBQUs7UUFDN0IsSUFBSSxDQUFDclgsTUFBSSxDQUFDak8sU0FBUyxDQUFDK2lCLFNBQVMsQ0FBQ3VDLE1BQU0sQ0FBQyxFQUFFO1VBQ25DOVQsU0FBUyxHQUFHLEtBQUs7UUFDckI7TUFDSixDQUFDLENBQUM7TUFFRixPQUFPQSxTQUFTO0lBQ3BCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFWSTtJQUFBclIsR0FBQTtJQUFBQyxLQUFBLEVBV0EsU0FBQW1sQixLQUFLMUIsVUFBVSxFQUFFeEYsUUFBUSxFQUFFO01BQUEsSUFBQW5QLE1BQUE7TUFDdkIsSUFBSSxJQUFJLENBQUM0VSxVQUFVLENBQUMsQ0FBQyxFQUFFO1FBQ25CO01BQ0o7TUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDdEwsUUFBUSxDQUFDbFgsU0FBUyxDQUFDdWlCLFVBQVUsQ0FBQyxFQUFFO1FBQ3RDLE1BQU0sSUFBSXRmLEtBQUssZUFBQWlHLE1BQUEsQ0FBY3FaLFVBQVUsMkNBQXVDLENBQUM7TUFDbkY7TUFFQSxJQUFJLENBQUNILEtBQUssQ0FBQ0csVUFBVSxDQUFDLEdBQUd4RixRQUFRO01BQ2pDLElBQUksQ0FBQ3NGLGlCQUFpQixDQUFDRSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUNyTCxRQUFRLENBQUNsWCxTQUFTLENBQUN1aUIsVUFBVSxDQUFDO01BRXhFLElBQUksSUFBSSxDQUFDVSxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQ2pCLFNBQVMsQ0FBQ3ZkLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbkQsSUFBSSxDQUFDeWUsbUJBQW1CLENBQUMsQ0FBQzs7UUFFMUI7UUFDQSxJQUFJLENBQUNsQixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUNPLFVBQVUsQ0FBQyxHQUFHO1VBQUEsU0FBQTJCLEtBQUEsR0FBQXprQixTQUFBLENBQUFnRixNQUFBLEVBQUl3YixVQUFVLE9BQUFwWixLQUFBLENBQUFxZCxLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7WUFBVmxFLFVBQVUsQ0FBQWtFLEtBQUEsSUFBQTFrQixTQUFBLENBQUEwa0IsS0FBQTtVQUFBO1VBQUEsT0FBS3BILFFBQVEsQ0FBQTVXLEtBQUEsVUFBQ3lILE1BQUksRUFBQTFFLE1BQUEsQ0FBSytXLFVBQVUsRUFBQztRQUFBO01BQ3BGO0lBQ0o7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFwaEIsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQXNsQixPQUFPN0IsVUFBVSxFQUFFO01BQ2YsSUFBSSxJQUFJLENBQUNDLFVBQVUsQ0FBQyxDQUFDLEVBQUU7UUFDbkI7TUFDSjtNQUNBLElBQUksQ0FBQyxJQUFJLENBQUNKLEtBQUssQ0FBQ0csVUFBVSxDQUFDLEVBQUU7UUFDekI7TUFDSjtNQUVBLElBQUksSUFBSSxDQUFDVSxXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLElBQUksQ0FBQ2pCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ08sVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDRixpQkFBaUIsQ0FBQ0UsVUFBVSxDQUFDO01BQ3RFO01BRUEsT0FBTyxJQUFJLENBQUNILEtBQUssQ0FBQ0csVUFBVSxDQUFDO01BQzdCLE9BQU8sSUFBSSxDQUFDRixpQkFBaUIsQ0FBQ0UsVUFBVSxDQUFDO0lBQzdDO0VBQUM7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0FDblNMLGlFQUFlO0VBQ1h6VyxHQUFHLFdBQUFBLElBQUNzRyxNQUFNLEVBQUVrUCxJQUFJLEVBQUVDLFFBQVEsRUFBRTtJQUN4QixJQUFJLE9BQU9ELElBQUksS0FBSyxRQUFRLEVBQUU7TUFDMUIsSUFBTUUsU0FBUyxHQUFHRixJQUFJLENBQUMvSSxXQUFXLENBQUMsQ0FBQztNQUVwQyxJQUFJbkcsTUFBTSxDQUFDcVAsU0FBUyxDQUFDRCxTQUFTLENBQUMsRUFBRTtRQUM3QixPQUFPO1VBQUEsSUFBQUUscUJBQUE7VUFBQSxPQUFlLENBQUFBLHFCQUFBLEdBQUF4WixPQUFPLENBQUM0RCxHQUFHLENBQUNzRyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUNvUCxTQUFTLENBQUMsRUFBQ0csV0FBVyxDQUFBeGIsS0FBQSxDQUFBdWIscUJBQUEsRUFBQWppQixTQUFVLENBQUM7UUFBQTtNQUMxRjtJQUNKO0lBRUEsT0FBT3lJLE9BQU8sQ0FBQzRELEdBQUcsQ0FBQ3NHLE1BQU0sRUFBRWtQLElBQUksRUFBRUMsUUFBUSxDQUFDO0VBQzlDLENBQUM7RUFFRDFWLEdBQUcsV0FBQUEsSUFBQ3VHLE1BQU0sRUFBRWtQLElBQUksRUFBRTtJQUNkLElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUMxQixJQUFNRSxTQUFTLEdBQUdGLElBQUksQ0FBQy9JLFdBQVcsQ0FBQyxDQUFDO01BRXBDLElBQUluRyxNQUFNLENBQUNxUCxTQUFTLENBQUNELFNBQVMsQ0FBQyxFQUFFO1FBQzdCLE9BQU8sSUFBSTtNQUNmO0lBQ0o7SUFFQSxPQUFPdFosT0FBTyxDQUFDMkQsR0FBRyxDQUFDdUcsTUFBTSxFQUFFa1AsSUFBSSxDQUFDO0VBQ3BDO0FBQ0osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEJnRDtBQUNGO0FBQ0w7QUFFRDtBQUNRO0FBQ0Y7QUFDWjs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBLElBV3FCbUQsU0FBUztFQUMxQjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSSxTQUFBQSxVQUFZQyxjQUFjLEVBQUUxVCxLQUFLLEVBQUU7SUFBQXJTLGVBQUEsT0FBQThsQixTQUFBO0lBQy9CLElBQUksQ0FBQ0UsWUFBWSxHQUFJLE9BQU8zVCxLQUFLLEtBQUssU0FBUyxJQUFJQSxLQUFLLEtBQUssSUFBSztJQUNsRSxJQUFJLENBQUM0VCxrQkFBa0IsR0FBSSxPQUFPRixjQUFjLEtBQUssU0FBUyxJQUFJQSxjQUFjLEtBQUssS0FBTTtJQUMzRixJQUFJLENBQUNHLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUk7SUFDeEIsSUFBSSxDQUFDQyxTQUFTLEdBQUc7TUFDYkMsR0FBRyxFQUFFO0lBQ1QsQ0FBQztJQUNEO0lBQ0FsbEIsTUFBTSxDQUFDb2lCLElBQUksQ0FBQyxJQUFJLENBQUM2QyxTQUFTLENBQUM7SUFDM0IsSUFBSSxDQUFDRSxlQUFlLENBQUMsQ0FBQzs7SUFFdEI7SUFDQW5sQixNQUFNLENBQUNnaUIsTUFBTSxDQUFDMEMsU0FBUyxDQUFDemtCLFNBQVMsQ0FBQztJQUNsQ0QsTUFBTSxDQUFDZ2lCLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFFbkIsSUFBSSxDQUFDb0QsYUFBYSxDQUFDLENBQUM7SUFDcEIsSUFBSSxDQUFDQyxVQUFVLENBQUMsQ0FBQztJQUVqQixJQUFJLENBQUNwVSxLQUFLLENBQUMsaUNBQWlDLENBQUM7RUFDakQ7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBWEksT0FBQXBTLFlBQUEsQ0FBQTZsQixTQUFBO0lBQUE1bEIsR0FBQTtJQUFBQyxLQUFBLEVBWUEsU0FBQW9tQixnQkFBQSxFQUFrQjtNQUNkLElBQUksQ0FBQ3ptQixVQUFVLEdBQUdBLDZEQUFVO01BQzVCLElBQUksQ0FBQ2EsU0FBUyxHQUFHQSw0REFBUztNQUUxQlMsTUFBTSxDQUFDZ2lCLE1BQU0sQ0FBQyxJQUFJLENBQUN0akIsVUFBVSxDQUFDdUIsU0FBUyxDQUFDO01BQ3hDRCxNQUFNLENBQUNnaUIsTUFBTSxDQUFDLElBQUksQ0FBQ3RqQixVQUFVLENBQUM7TUFDOUJzQixNQUFNLENBQUNnaUIsTUFBTSxDQUFDLElBQUksQ0FBQ3ppQixTQUFTLENBQUNVLFNBQVMsQ0FBQztNQUN2Q0QsTUFBTSxDQUFDZ2lCLE1BQU0sQ0FBQyxJQUFJLENBQUN6aUIsU0FBUyxDQUFDO0lBQ2pDOztJQUVBO0FBQ0o7QUFDQTtFQUZJO0lBQUFULEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUFxbUIsY0FBQSxFQUFnQjtNQUNaLElBQUksQ0FBQ0UsU0FBUyxDQUFDLFFBQVEsRUFBRWhCLHlEQUFNLENBQUM7TUFDaEMsSUFBSSxDQUFDZ0IsU0FBUyxDQUFDLFlBQVksRUFBRWYsNkRBQVUsQ0FBQztNQUN4QyxJQUFJLENBQUNlLFNBQVMsQ0FBQyxXQUFXLEVBQUVkLDREQUFTLENBQUM7TUFDdEMsSUFBSSxDQUFDYyxTQUFTLENBQUMsS0FBSyxFQUFFYixzREFBRyxDQUFDO0lBQzlCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUEzbEIsR0FBQTtJQUFBQyxLQUFBLEVBTUEsU0FBQXNtQixXQUFBLEVBQWE7TUFBQSxJQUFBdmMsS0FBQTtNQUNUNkUsTUFBTSxDQUFDeUIsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsWUFBTTtRQUM5QyxJQUFJdEcsS0FBSSxDQUFDK2Isa0JBQWtCLEVBQUU7VUFDekIvYixLQUFJLENBQUN5YyxvQkFBb0IsQ0FBQyxDQUFDO1FBQy9CO1FBQ0F6YyxLQUFJLENBQUNXLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDekJYLEtBQUksQ0FBQ21jLFNBQVMsQ0FBQ0MsR0FBRyxHQUFHLElBQUk7TUFDN0IsQ0FBQyxDQUFDO0lBQ047O0lBRUE7QUFDSjtBQUNBO0VBRkk7SUFBQXBtQixHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBd21CLHFCQUFBLEVBQXVCO01BQ25CdmxCLE1BQU0sQ0FBQ3NDLE1BQU0sQ0FBQyxJQUFJLENBQUN3aUIsT0FBTyxDQUFDLENBQUNyaUIsT0FBTyxDQUFDLFVBQUN3aEIsTUFBTSxFQUFLO1FBQzVDLElBQUlBLE1BQU0sQ0FBQ2YsV0FBVyxDQUFDLENBQUMsSUFBSWUsTUFBTSxDQUFDcEIscUJBQXFCLENBQUMsQ0FBQyxFQUFFO1VBQ3hEb0IsTUFBTSxDQUFDZCxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hDO01BQ0osQ0FBQyxDQUFDO0lBQ047O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQWJJO0lBQUFya0IsR0FBQTtJQUFBQyxLQUFBLEVBY0EsU0FBQXVtQixVQUFVeGdCLElBQUksRUFBRXFTLFFBQVEsRUFBRTtNQUFBLElBQUExTCxNQUFBO01BQ3RCLElBQU0rWixTQUFTLEdBQUcxZ0IsSUFBSSxDQUFDMFQsV0FBVyxDQUFDLENBQUM7TUFFcEMsSUFBSSxJQUFJLENBQUNrSixTQUFTLENBQUM4RCxTQUFTLENBQUMsRUFBRTtRQUMzQixNQUFNLElBQUl0aUIsS0FBSyxzQkFBQWlHLE1BQUEsQ0FBcUJyRSxJQUFJLDhCQUEwQixDQUFDO01BQ3ZFO01BRUEsSUFBSSxPQUFPcVMsUUFBUSxLQUFLLFVBQVUsSUFBSUEsUUFBUSxZQUFZelksNkRBQVUsS0FBSyxLQUFLLEVBQUU7UUFDNUUsTUFBTSxJQUFJd0UsS0FBSyxDQUFDLHVGQUF1RixDQUFDO01BQzVHO01BRUEsSUFBSSxJQUFJLENBQUM0QixJQUFJLENBQUMsS0FBSzhGLFNBQVMsSUFBSSxJQUFJLENBQUM0YSxTQUFTLENBQUMsS0FBSzVhLFNBQVMsRUFBRTtRQUMzRCxNQUFNLElBQUkxSCxLQUFLLENBQUMsbUZBQW1GLENBQUM7TUFDeEc7TUFFQSxJQUFJLENBQUM0aEIsT0FBTyxDQUFDVSxTQUFTLENBQUMsR0FBRyxJQUFJMUQscURBQVksQ0FBQzBELFNBQVMsRUFBRSxJQUFJLEVBQUVyTyxRQUFRLENBQUM7TUFFckUsSUFBSSxDQUFDbEcsS0FBSyxhQUFBOUgsTUFBQSxDQUFZckUsSUFBSSxrQkFBYyxDQUFDOztNQUV6QztNQUNBO01BQ0E5RSxNQUFNLENBQUNzQyxNQUFNLENBQUMsSUFBSSxDQUFDbWpCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ2hqQixPQUFPLENBQUMsVUFBQ3doQixNQUFNLEVBQUs7UUFDakQsSUFDSUEsTUFBTSxDQUFDZixXQUFXLENBQUMsQ0FBQyxJQUNqQixDQUFDZSxNQUFNLENBQUNILGFBQWEsQ0FBQyxDQUFDLElBQ3ZCRyxNQUFNLENBQUNwQixxQkFBcUIsQ0FBQyxDQUFDLElBQzlCb0IsTUFBTSxDQUFDMUIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUMzQnZpQixNQUFNLENBQUNxRixJQUFJLENBQUM0ZSxNQUFNLENBQUN2QixVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzFXLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFDM0RQLE1BQUksQ0FBQ3daLFNBQVMsQ0FBQ0MsR0FBRyxFQUN2QjtVQUNFLElBQU1RLFdBQVcsR0FBR3pCLE1BQU0sQ0FBQ3ZCLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQ2pSLEtBQUs7VUFDdER3UyxNQUFNLENBQUN2QixVQUFVLENBQUNnRCxXQUFXLENBQUM7UUFDbEM7TUFDSixDQUFDLENBQUM7SUFDTjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEk7SUFBQTVtQixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBNG1CLGFBQWE3Z0IsSUFBSSxFQUFFO01BQ2YsSUFBTTBnQixTQUFTLEdBQUcxZ0IsSUFBSSxDQUFDMFQsV0FBVyxDQUFDLENBQUM7TUFFcEMsSUFBSSxDQUFDLElBQUksQ0FBQ2tKLFNBQVMsQ0FBQzhELFNBQVMsQ0FBQyxFQUFFO1FBQzVCLElBQUksQ0FBQ3ZVLEtBQUssYUFBQTlILE1BQUEsQ0FBWXJFLElBQUksdUJBQW1CLENBQUM7UUFDOUM7TUFDSjs7TUFFQTtNQUNBLElBQUksQ0FBQ2dnQixPQUFPLENBQUNVLFNBQVMsQ0FBQyxDQUFDM0IsWUFBWSxDQUFDLENBQUMsQ0FBQ3BoQixPQUFPLENBQUMsVUFBQzBVLFFBQVEsRUFBSztRQUN6REEsUUFBUSxDQUFDaFksUUFBUSxDQUFDLENBQUM7TUFDdkIsQ0FBQyxDQUFDO01BRUYsT0FBTyxJQUFJLENBQUMybEIsT0FBTyxDQUFDVSxTQUFTLENBQUM7TUFDOUIsT0FBTyxJQUFJLENBQUNBLFNBQVMsQ0FBQztNQUN0QixPQUFPLElBQUksQ0FBQzFnQixJQUFJLENBQUM7TUFFakIsSUFBSSxDQUFDbU0sS0FBSyxhQUFBOUgsTUFBQSxDQUFZckUsSUFBSSxlQUFXLENBQUM7SUFDMUM7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBJO0lBQUFoRyxHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBMmlCLFVBQVU1YyxJQUFJLEVBQUU7TUFDWixJQUFNMGdCLFNBQVMsR0FBRzFnQixJQUFJLENBQUMwVCxXQUFXLENBQUMsQ0FBQztNQUVwQyxPQUFRLElBQUksQ0FBQ3NNLE9BQU8sQ0FBQ1UsU0FBUyxDQUFDLEtBQUs1YSxTQUFTO0lBQ2pEOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBOUwsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQTBtQixXQUFBLEVBQWE7TUFDVCxPQUFPLElBQUksQ0FBQ1gsT0FBTztJQUN2Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQWhtQixHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBa2tCLGVBQUEsRUFBaUI7TUFDYixPQUFPampCLE1BQU0sQ0FBQ3FGLElBQUksQ0FBQyxJQUFJLENBQUN5ZixPQUFPLENBQUM7SUFDcEM7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFobUIsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQTZtQixVQUFVOWdCLElBQUksRUFBRTtNQUNaLElBQU0wZ0IsU0FBUyxHQUFHMWdCLElBQUksQ0FBQzBULFdBQVcsQ0FBQyxDQUFDO01BRXBDLElBQUksQ0FBQyxJQUFJLENBQUNrSixTQUFTLENBQUM4RCxTQUFTLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUl0aUIsS0FBSyx1QkFBQWlHLE1BQUEsQ0FBc0JxYyxTQUFTLDRCQUF3QixDQUFDO01BQzNFO01BRUEsT0FBTyxJQUFJLENBQUNWLE9BQU8sQ0FBQ1UsU0FBUyxDQUFDO0lBQ2xDOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQSTtJQUFBMW1CLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUF3UixlQUFlakIsU0FBUyxFQUFFO01BQ3RCLElBQU13VixPQUFPLEdBQUcsRUFBRTtNQUVsQjlrQixNQUFNLENBQUMrTSxPQUFPLENBQUMsSUFBSSxDQUFDK1gsT0FBTyxDQUFDLENBQUNyaUIsT0FBTyxDQUFDLFVBQUN1SyxLQUFLLEVBQUs7UUFDNUMsSUFBQUMsTUFBQSxHQUFBMUcsY0FBQSxDQUF1QnlHLEtBQUs7VUFBckJsSSxJQUFJLEdBQUFtSSxNQUFBO1VBQUVnWCxNQUFNLEdBQUFoWCxNQUFBO1FBRW5CLElBQUlnWCxNQUFNLENBQUN4QixVQUFVLENBQUMsQ0FBQyxFQUFFO1VBQ3JCO1FBQ0o7UUFDQSxJQUFJLENBQUN3QixNQUFNLENBQUNwQixxQkFBcUIsQ0FBQyxDQUFDLEVBQUU7VUFDakM7UUFDSjtRQUNBLElBQUksQ0FBQ29CLE1BQU0sQ0FBQzFCLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtVQUM5QjtRQUNKO1FBRUEsSUFBTXdDLFNBQVMsR0FBR2QsTUFBTSxDQUFDdkIsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUU5QyxJQUFJLE9BQU9xQyxTQUFTLENBQUN6VixTQUFTLENBQUMsS0FBSyxRQUFRLElBQUksT0FBT3lWLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtVQUN4RndWLE9BQU8sQ0FBQ3pnQixJQUFJLENBQUNTLElBQUksQ0FBQztRQUN0QjtNQUNKLENBQUMsQ0FBQztNQUVGLE9BQU9nZ0IsT0FBTztJQUNsQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEk7SUFBQWhtQixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBMFMsTUFBTXVMLFFBQVEsRUFBRTtNQUNaLElBQUksSUFBSSxDQUFDaUksU0FBUyxDQUFDQyxHQUFHLEVBQUU7UUFDcEJsSSxRQUFRLENBQUMsQ0FBQztNQUNkO01BRUEsSUFBSSxDQUFDNkksRUFBRSxDQUFDLE9BQU8sRUFBRTdJLFFBQVEsQ0FBQztJQUM5Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRJO0lBQUFsZSxHQUFBO0lBQUFDLEtBQUEsRUFVQSxTQUFBOG1CLEdBQUd2VyxTQUFTLEVBQUUwTixRQUFRLEVBQUU7TUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQytILFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxFQUFFO1FBQzVCLElBQUksQ0FBQ3lWLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxHQUFHLEVBQUU7TUFDbEM7TUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDeVYsU0FBUyxDQUFDelYsU0FBUyxDQUFDLENBQUN0RCxRQUFRLENBQUNnUixRQUFRLENBQUMsRUFBRTtRQUMvQyxJQUFJLENBQUMrSCxTQUFTLENBQUN6VixTQUFTLENBQUMsQ0FBQ2pMLElBQUksQ0FBQzJZLFFBQVEsQ0FBQztNQUM1QztJQUNKOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxJO0lBQUFsZSxHQUFBO0lBQUFDLEtBQUEsRUFNQSxTQUFBK21CLElBQUl4VyxTQUFTLEVBQUUwTixRQUFRLEVBQUU7TUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQytILFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxFQUFFO1FBQzVCO01BQ0o7TUFFQSxJQUFNeVcsS0FBSyxHQUFHLElBQUksQ0FBQ2hCLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxDQUFDc0QsT0FBTyxDQUFDb0ssUUFBUSxDQUFDO01BQ3pELElBQUkrSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDZDtNQUNKO01BRUEsSUFBSSxDQUFDaEIsU0FBUyxDQUFDelYsU0FBUyxDQUFDLENBQUNzVSxNQUFNLENBQUNtQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzlDOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQSTtJQUFBam5CLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUEwSyxZQUFZNkYsU0FBUyxFQUFpQjtNQUFBLElBQUExQyxNQUFBO01BQUEsU0FBQXlRLElBQUEsR0FBQTNkLFNBQUEsQ0FBQWdGLE1BQUEsRUFBWndiLFVBQVUsT0FBQXBaLEtBQUEsQ0FBQXVXLElBQUEsT0FBQUEsSUFBQSxXQUFBRSxJQUFBLE1BQUFBLElBQUEsR0FBQUYsSUFBQSxFQUFBRSxJQUFBO1FBQVYyQyxVQUFVLENBQUEzQyxJQUFBLFFBQUE3ZCxTQUFBLENBQUE2ZCxJQUFBO01BQUE7TUFDaEMsSUFBSSxDQUFDdE0sS0FBSyxDQUFBN0ssS0FBQSxDQUFWLElBQUksNkJBQUErQyxNQUFBLENBQWdDbUcsU0FBUyxTQUFBbkcsTUFBQSxDQUFRK1csVUFBVSxFQUFDOztNQUVoRTtNQUNBLElBQU02RSxTQUFTLEdBQUcsSUFBSSxDQUFDeFUsY0FBYyxDQUFDakIsU0FBUyxDQUFDO01BQ2hELElBQUl5VixTQUFTLENBQUNyZ0IsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN4QixJQUFJLENBQUN1TSxLQUFLLDBDQUFBOUgsTUFBQSxDQUF5Q21HLFNBQVMsT0FBRyxDQUFDO1FBQ2hFLE9BQU8sSUFBSTtNQUNmO01BQ0EsSUFBSSxDQUFDMkIsS0FBSyx1Q0FBQTlILE1BQUEsQ0FBc0NtRyxTQUFTLFVBQUFuRyxNQUFBLENBQU00YixTQUFTLENBQUN6VCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQztNQUV0RixJQUFJL0gsU0FBUyxHQUFHLEtBQUs7TUFFckJ3YixTQUFTLENBQUN0aUIsT0FBTyxDQUFDLFVBQUNxQyxJQUFJLEVBQUs7UUFDeEIsSUFBTW1mLE1BQU0sR0FBR3JYLE1BQUksQ0FBQ2daLFNBQVMsQ0FBQzlnQixJQUFJLENBQUM7UUFFbkMsSUFBSW1mLE1BQU0sQ0FBQ3hCLFVBQVUsQ0FBQyxDQUFDLEVBQUU7VUFDckI7UUFDSjtRQUNBLElBQUl3QixNQUFNLENBQUNmLFdBQVcsQ0FBQyxDQUFDLElBQUllLE1BQU0sQ0FBQ0osWUFBWSxDQUFDLENBQUMsQ0FBQ25mLE1BQU0sS0FBSyxDQUFDLEVBQUU7VUFDNUR1ZixNQUFNLENBQUNkLG1CQUFtQixDQUFDLENBQUM7UUFDaEM7UUFFQSxJQUFNNkMsWUFBWSxHQUFHL0IsTUFBTSxDQUFDdkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDcFQsU0FBUyxDQUFDOztRQUU1RDtRQUNBMlUsTUFBTSxDQUFDSixZQUFZLENBQUMsQ0FBQyxDQUFDcGhCLE9BQU8sQ0FBQyxVQUFDMFUsUUFBUSxFQUFLO1VBQ3hDO1VBQ0EsSUFBSTVOLFNBQVMsRUFBRTtZQUNYO1VBQ0o7VUFFQSxJQUFJLE9BQU95YyxZQUFZLEtBQUssVUFBVSxFQUFFO1lBQ3BDLElBQUk7Y0FDQSxJQUFNQyxNQUFNLEdBQUdELFlBQVksQ0FBQzVmLEtBQUssQ0FBQytRLFFBQVEsRUFBRStJLFVBQVUsQ0FBQztjQUN2RCxJQUFJK0YsTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDbEIxYyxTQUFTLEdBQUcsSUFBSTtjQUNwQjtZQUNKLENBQUMsQ0FBQyxPQUFPbUIsS0FBSyxFQUFFO2NBQ1prQyxNQUFJLENBQUNsQyxLQUFLLHNCQUFBdkIsTUFBQSxDQUNjbUcsU0FBUyxvQkFBQW5HLE1BQUEsQ0FBZXJFLElBQUksaUJBQ2hENEYsS0FDSixDQUFDO1lBQ0w7VUFDSixDQUFDLE1BQU0sSUFBSSxPQUFPc2IsWUFBWSxLQUFLLFFBQVEsRUFBRTtZQUN6QyxJQUFJLENBQUM3TyxRQUFRLENBQUM2TyxZQUFZLENBQUMsRUFBRTtjQUN6QixNQUFNLElBQUk5aUIsS0FBSyxjQUFBaUcsTUFBQSxDQUFhNmMsWUFBWSxxQkFBQTdjLE1BQUEsQ0FBZ0JyRSxJQUFJLGNBQVUsQ0FBQztZQUMzRTtZQUVBLElBQUk7Y0FDQSxJQUFJcVMsUUFBUSxDQUFDNk8sWUFBWSxDQUFDLENBQUE1ZixLQUFBLENBQXRCK1EsUUFBUSxFQUFrQitJLFVBQVUsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDakQzVyxTQUFTLEdBQUcsSUFBSTtnQkFDaEJxRCxNQUFJLENBQUNxRSxLQUFLLG1CQUFBOUgsTUFBQSxDQUFrQm1HLFNBQVMsd0JBQUFuRyxNQUFBLENBQW1CckUsSUFBSSxjQUFVLENBQUM7Y0FDM0U7WUFDSixDQUFDLENBQUMsT0FBTzRGLEtBQUssRUFBRTtjQUNaa0MsTUFBSSxDQUFDbEMsS0FBSyxzQkFBQXZCLE1BQUEsQ0FDY21HLFNBQVMsb0JBQUFuRyxNQUFBLENBQWVyRSxJQUFJLGlCQUNoRDRGLEtBQ0osQ0FBQztZQUNMO1VBQ0osQ0FBQyxNQUFNO1lBQ0hrQyxNQUFJLENBQUNsQyxLQUFLLHdCQUFBdkIsTUFBQSxDQUF1Qm1HLFNBQVMsb0JBQUFuRyxNQUFBLENBQWVyRSxJQUFJLDJDQUF1QyxDQUFDO1VBQ3pHO1FBQ0osQ0FBQyxDQUFDO01BQ04sQ0FBQyxDQUFDOztNQUVGO01BQ0EsSUFBSSxDQUFDeUUsU0FBUyxJQUFJLElBQUksQ0FBQ3diLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQ3lWLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxDQUFDNUssTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNqRixJQUFJLENBQUN1TSxLQUFLLFVBQUE5SCxNQUFBLENBQVUsSUFBSSxDQUFDNGIsU0FBUyxDQUFDelYsU0FBUyxDQUFDLENBQUM1SyxNQUFNLDZDQUFBeUUsTUFBQSxDQUF5Q21HLFNBQVMsT0FBRyxDQUFDO1FBRTFHLElBQUksQ0FBQ3lWLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxDQUFDN00sT0FBTyxDQUFDLFVBQUN5akIsUUFBUSxFQUFLO1VBQzVDO1VBQ0EsSUFBSTNjLFNBQVMsRUFBRTtZQUNYO1VBQ0o7VUFFQSxJQUFJO1lBQ0EsSUFBSTJjLFFBQVEsQ0FBQTlmLEtBQUEsU0FBSThaLFVBQVUsQ0FBQyxLQUFLLEtBQUssRUFBRTtjQUNuQzNXLFNBQVMsR0FBRyxJQUFJO2NBQ2hCcUQsTUFBSSxDQUFDcUUsS0FBSyxtQkFBQTlILE1BQUEsQ0FBa0JtRyxTQUFTLHNDQUFtQyxDQUFDO1lBQzdFO1VBQ0osQ0FBQyxDQUFDLE9BQU81RSxLQUFLLEVBQUU7WUFDWmtDLE1BQUksQ0FBQ2xDLEtBQUssc0JBQUF2QixNQUFBLENBQ2NtRyxTQUFTLHNDQUM3QjVFLEtBQ0osQ0FBQztVQUNMO1FBQ0osQ0FBQyxDQUFDO01BQ047TUFFQSxPQUFPLENBQUNuQixTQUFTO0lBQ3JCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQSTtJQUFBekssR0FBQTtJQUFBQyxLQUFBLEVBUUEsU0FBQXVPLG1CQUFtQmdDLFNBQVMsRUFBaUI7TUFBQSxJQUFBekIsTUFBQTtNQUFBLFNBQUE4VSxLQUFBLEdBQUFqakIsU0FBQSxDQUFBZ0YsTUFBQSxFQUFad2IsVUFBVSxPQUFBcFosS0FBQSxDQUFBNmIsS0FBQSxPQUFBQSxLQUFBLFdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7UUFBVjFDLFVBQVUsQ0FBQTBDLEtBQUEsUUFBQWxqQixTQUFBLENBQUFrakIsS0FBQTtNQUFBO01BQ3ZDLElBQUksQ0FBQzNSLEtBQUssbUNBQUE5SCxNQUFBLENBQWtDbUcsU0FBUyxPQUFHLENBQUM7O01BRXpEO01BQ0EsSUFBTXlWLFNBQVMsR0FBRyxJQUFJLENBQUN4VSxjQUFjLENBQUNqQixTQUFTLENBQUM7TUFDaEQsSUFBSXlWLFNBQVMsQ0FBQ3JnQixNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQ3VNLEtBQUssa0RBQUE5SCxNQUFBLENBQWlEbUcsU0FBUyxPQUFHLENBQUM7UUFDeEUsT0FBT2xLLE9BQU8sQ0FBQ3RDLE9BQU8sQ0FBQyxDQUFDO01BQzVCO01BQ0EsSUFBSSxDQUFDbU8sS0FBSywrQ0FBQTlILE1BQUEsQ0FBOENtRyxTQUFTLFVBQUFuRyxNQUFBLENBQU00YixTQUFTLENBQUN6VCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQztNQUU5RixJQUFNakUsUUFBUSxHQUFHLEVBQUU7TUFFbkIwWCxTQUFTLENBQUN0aUIsT0FBTyxDQUFDLFVBQUNxQyxJQUFJLEVBQUs7UUFDeEIsSUFBTW1mLE1BQU0sR0FBR3BXLE1BQUksQ0FBQytYLFNBQVMsQ0FBQzlnQixJQUFJLENBQUM7UUFFbkMsSUFBSW1mLE1BQU0sQ0FBQ3hCLFVBQVUsQ0FBQyxDQUFDLEVBQUU7VUFDckI7UUFDSjtRQUNBLElBQUl3QixNQUFNLENBQUNmLFdBQVcsQ0FBQyxDQUFDLElBQUllLE1BQU0sQ0FBQ0osWUFBWSxDQUFDLENBQUMsQ0FBQ25mLE1BQU0sS0FBSyxDQUFDLEVBQUU7VUFDNUR1ZixNQUFNLENBQUNkLG1CQUFtQixDQUFDLENBQUM7UUFDaEM7UUFFQSxJQUFNNkMsWUFBWSxHQUFHL0IsTUFBTSxDQUFDdkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDcFQsU0FBUyxDQUFDOztRQUU1RDtRQUNBMlUsTUFBTSxDQUFDSixZQUFZLENBQUMsQ0FBQyxDQUFDcGhCLE9BQU8sQ0FBQyxVQUFDMFUsUUFBUSxFQUFLO1VBQ3hDLElBQUksT0FBTzZPLFlBQVksS0FBSyxVQUFVLEVBQUU7WUFDcEMsSUFBSTtjQUNBLElBQU1HLGVBQWUsR0FBR0gsWUFBWSxDQUFDNWYsS0FBSyxDQUFDK1EsUUFBUSxFQUFFK0ksVUFBVSxDQUFDO2NBRWhFLElBQUlpRyxlQUFlLFlBQVkvZ0IsT0FBTyxLQUFLLEtBQUssRUFBRTtnQkFDOUM7Y0FDSjtjQUVBaUksUUFBUSxDQUFDaEosSUFBSSxDQUFDOGhCLGVBQWUsQ0FBQztZQUNsQyxDQUFDLENBQUMsT0FBT3piLEtBQUssRUFBRTtjQUNabUQsTUFBSSxDQUFDbkQsS0FBSyxzQkFBQXZCLE1BQUEsQ0FDY21HLFNBQVMsb0JBQUFuRyxNQUFBLENBQWVyRSxJQUFJLGlCQUNoRDRGLEtBQ0osQ0FBQztZQUNMO1VBQ0osQ0FBQyxNQUFNLElBQUksT0FBT3NiLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDekMsSUFBSSxDQUFDN08sUUFBUSxDQUFDNk8sWUFBWSxDQUFDLEVBQUU7Y0FDekIsTUFBTSxJQUFJOWlCLEtBQUssY0FBQWlHLE1BQUEsQ0FBYTZjLFlBQVkscUJBQUE3YyxNQUFBLENBQWdCckUsSUFBSSxjQUFVLENBQUM7WUFDM0U7WUFFQSxJQUFJO2NBQ0EsSUFBTXFoQixnQkFBZSxHQUFHaFAsUUFBUSxDQUFDNk8sWUFBWSxDQUFDLENBQUE1ZixLQUFBLENBQXRCK1EsUUFBUSxFQUFrQitJLFVBQVUsQ0FBQztjQUU3RCxJQUFJaUcsZ0JBQWUsWUFBWS9nQixPQUFPLEtBQUssS0FBSyxFQUFFO2dCQUM5QztjQUNKO2NBRUFpSSxRQUFRLENBQUNoSixJQUFJLENBQUM4aEIsZ0JBQWUsQ0FBQztZQUNsQyxDQUFDLENBQUMsT0FBT3piLEtBQUssRUFBRTtjQUNabUQsTUFBSSxDQUFDbkQsS0FBSyxzQkFBQXZCLE1BQUEsQ0FDY21HLFNBQVMsNEJBQUFuRyxNQUFBLENBQXVCckUsSUFBSSxpQkFDeEQ0RixLQUNKLENBQUM7WUFDTDtVQUNKLENBQUMsTUFBTTtZQUNIbUQsTUFBSSxDQUFDbkQsS0FBSyx3QkFBQXZCLE1BQUEsQ0FBdUJtRyxTQUFTLG9CQUFBbkcsTUFBQSxDQUFlckUsSUFBSSwyQ0FBdUMsQ0FBQztVQUN6RztRQUNKLENBQUMsQ0FBQztNQUNOLENBQUMsQ0FBQzs7TUFFRjtNQUNBLElBQUksSUFBSSxDQUFDaWdCLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQ3lWLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxDQUFDNUssTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNuRSxJQUFJLENBQUN1TSxLQUFLLFVBQUE5SCxNQUFBLENBQVUsSUFBSSxDQUFDNGIsU0FBUyxDQUFDelYsU0FBUyxDQUFDLENBQUM1SyxNQUFNLHFEQUFBeUUsTUFBQSxDQUFpRG1HLFNBQVMsT0FBRyxDQUFDO1FBRWxILElBQUksQ0FBQ3lWLFNBQVMsQ0FBQ3pWLFNBQVMsQ0FBQyxDQUFDN00sT0FBTyxDQUFDLFVBQUN5akIsUUFBUSxFQUFLO1VBQzVDLElBQUk7WUFDQSxJQUFNRSxlQUFlLEdBQUdGLFFBQVEsQ0FBQTlmLEtBQUEsU0FBSThaLFVBQVUsQ0FBQztZQUMvQyxJQUFJa0csZUFBZSxZQUFZaGhCLE9BQU8sS0FBSyxLQUFLLEVBQUU7Y0FDOUM7WUFDSjtZQUVBaUksUUFBUSxDQUFDaEosSUFBSSxDQUFDK2hCLGVBQWUsQ0FBQztVQUNsQyxDQUFDLENBQUMsT0FBTzFiLEtBQUssRUFBRTtZQUNabUQsTUFBSSxDQUFDbkQsS0FBSyxzQkFBQXZCLE1BQUEsQ0FDY21HLFNBQVMsOENBQzdCNUUsS0FDSixDQUFDO1VBQ0w7UUFDSixDQUFDLENBQUM7TUFDTjtNQUVBLElBQUkyQyxRQUFRLENBQUMzSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLE9BQU9VLE9BQU8sQ0FBQ3RDLE9BQU8sQ0FBQyxDQUFDO01BQzVCO01BRUEsT0FBT3NDLE9BQU8sQ0FBQ29iLEdBQUcsQ0FBQ25ULFFBQVEsQ0FBQztJQUNoQzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUF2TyxHQUFBO0lBQUFDLEtBQUEsRUFPQSxTQUFBc25CLFdBQVdDLEtBQUssRUFBRUMsSUFBSSxFQUFFcmEsT0FBTyxFQUFpQjtNQUM1QztNQUNBc2EsT0FBTyxDQUFDQyxjQUFjLENBQ2xCLGVBQWUsWUFBQXRkLE1BQUEsQ0FDTG1kLEtBQUsscUJBQUFuZCxNQUFBLENBQW1Cb2QsSUFBSSxHQUFJLE1BQU0sR0FBRyxRQUFRLFFBQzNEcmEsT0FDSixDQUFDO01BQUMsU0FBQWtYLEtBQUEsR0FBQTFqQixTQUFBLENBQUFnRixNQUFBLEVBTjhCd2IsVUFBVSxPQUFBcFosS0FBQSxDQUFBc2MsS0FBQSxPQUFBQSxLQUFBLFdBQUFFLEtBQUEsTUFBQUEsS0FBQSxHQUFBRixLQUFBLEVBQUFFLEtBQUE7UUFBVnBELFVBQVUsQ0FBQW9ELEtBQUEsUUFBQTVqQixTQUFBLENBQUE0akIsS0FBQTtNQUFBO01BTzFDLElBQUlwRCxVQUFVLENBQUN4YixNQUFNLEVBQUU7UUFDbkI4aEIsT0FBTyxDQUFDQyxjQUFjLG9CQUFBdGQsTUFBQSxDQUNDK1csVUFBVSxDQUFDeGIsTUFBTSxRQUNwQyw4Q0FBOEMsRUFDOUMsOENBQ0osQ0FBQztRQUNELElBQUlxaEIsS0FBSyxHQUFHLENBQUM7UUFDYjdGLFVBQVUsQ0FBQ3pkLE9BQU8sQ0FBQyxVQUFDaWtCLEtBQUssRUFBSztVQUMxQlgsS0FBSyxJQUFJLENBQUM7VUFDVlMsT0FBTyxDQUFDRyxHQUFHLE1BQUF4ZCxNQUFBLENBQU00YyxLQUFLLFFBQUssOENBQThDLEVBQUVXLEtBQUssQ0FBQztRQUNyRixDQUFDLENBQUM7UUFDRkYsT0FBTyxDQUFDSSxRQUFRLENBQUMsQ0FBQztRQUVsQkosT0FBTyxDQUFDQyxjQUFjLENBQUMsU0FBUyxFQUFFLDhDQUE4QyxDQUFDO1FBQ2pGRCxPQUFPLENBQUNqYSxLQUFLLENBQUMsQ0FBQztRQUNmaWEsT0FBTyxDQUFDSSxRQUFRLENBQUMsQ0FBQztNQUN0QixDQUFDLE1BQU07UUFDSEosT0FBTyxDQUFDamEsS0FBSyxDQUFDLENBQUM7TUFDbkI7TUFDQWlhLE9BQU8sQ0FBQ0ksUUFBUSxDQUFDLENBQUM7TUFDbEI7SUFDSjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBSkk7SUFBQTluQixHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBNG5CLElBQUl6YSxPQUFPLEVBQWlCO01BQUEsU0FBQXNYLEtBQUEsR0FBQTlqQixTQUFBLENBQUFnRixNQUFBLEVBQVp3YixVQUFVLE9BQUFwWixLQUFBLENBQUEwYyxLQUFBLE9BQUFBLEtBQUEsV0FBQUMsS0FBQSxNQUFBQSxLQUFBLEdBQUFELEtBQUEsRUFBQUMsS0FBQTtRQUFWdkQsVUFBVSxDQUFBdUQsS0FBQSxRQUFBL2pCLFNBQUEsQ0FBQStqQixLQUFBO01BQUE7TUFDdEIsSUFBSSxDQUFDNEMsVUFBVSxDQUFBamdCLEtBQUEsQ0FBZixJQUFJLEdBQVksbUJBQW1CLEVBQUUsS0FBSyxFQUFFOEYsT0FBTyxFQUFBL0MsTUFBQSxDQUFLK1csVUFBVSxFQUFDO0lBQ3ZFOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkk7SUFBQXBoQixHQUFBO0lBQUFDLEtBQUEsRUFPQSxTQUFBa1MsTUFBTS9FLE9BQU8sRUFBaUI7TUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQzBZLFlBQVksRUFBRTtRQUNwQjtNQUNKO01BQUMsU0FBQWIsS0FBQSxHQUFBcmtCLFNBQUEsQ0FBQWdGLE1BQUEsRUFIYXdiLFVBQVUsT0FBQXBaLEtBQUEsQ0FBQWlkLEtBQUEsT0FBQUEsS0FBQSxXQUFBQyxLQUFBLE1BQUFBLEtBQUEsR0FBQUQsS0FBQSxFQUFBQyxLQUFBO1FBQVY5RCxVQUFVLENBQUE4RCxLQUFBLFFBQUF0a0IsU0FBQSxDQUFBc2tCLEtBQUE7TUFBQTtNQUt4QixJQUFJLENBQUNxQyxVQUFVLENBQUFqZ0IsS0FBQSxDQUFmLElBQUksR0FBWSxtQkFBbUIsRUFBRSxLQUFLLEVBQUU4RixPQUFPLEVBQUEvQyxNQUFBLENBQUsrVyxVQUFVLEVBQUM7SUFDdkU7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUpJO0lBQUFwaEIsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQTJMLE1BQU13QixPQUFPLEVBQWlCO01BQUEsU0FBQWlZLEtBQUEsR0FBQXprQixTQUFBLENBQUFnRixNQUFBLEVBQVp3YixVQUFVLE9BQUFwWixLQUFBLENBQUFxZCxLQUFBLE9BQUFBLEtBQUEsV0FBQUMsS0FBQSxNQUFBQSxLQUFBLEdBQUFELEtBQUEsRUFBQUMsS0FBQTtRQUFWbEUsVUFBVSxDQUFBa0UsS0FBQSxRQUFBMWtCLFNBQUEsQ0FBQTBrQixLQUFBO01BQUE7TUFDeEIsSUFBSSxDQUFDaUMsVUFBVSxDQUFBamdCLEtBQUEsQ0FBZixJQUFJLEdBQVksa0JBQWtCLEVBQUUsSUFBSSxFQUFFOEYsT0FBTyxFQUFBL0MsTUFBQSxDQUFLK1csVUFBVSxFQUFDO0lBQ3JFO0VBQUM7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbmxCOEI7QUFDWTs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkEsSUFTcUJvRSxNQUFNLDBCQUFBOVMsVUFBQTtFQUFBLFNBQUE4UyxPQUFBO0lBQUExbEIsZUFBQSxPQUFBMGxCLE1BQUE7SUFBQSxPQUFBN2tCLFVBQUEsT0FBQTZrQixNQUFBLEVBQUE1a0IsU0FBQTtFQUFBO0VBQUFDLFNBQUEsQ0FBQTJrQixNQUFBLEVBQUE5UyxVQUFBO0VBQUEsT0FBQTNTLFlBQUEsQ0FBQXlsQixNQUFBO0lBQUF4bEIsR0FBQTtJQUFBQyxLQUFBLEVBQ3ZCLFNBQUFDLFVBQUEsRUFBWTtNQUNSLElBQUksQ0FBQytZLFFBQVEsR0FBRztRQUNaK08sT0FBTyxFQUFFLElBQUk7UUFDYkMsSUFBSSxFQUFFLEdBQUc7UUFDVEMsTUFBTSxFQUFFLElBQUk7UUFDWkMsTUFBTSxFQUFFLEtBQUs7UUFDYkMsUUFBUSxFQUFFO01BQ2QsQ0FBQztJQUNMOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBcG9CLEdBQUE7SUFBQUMsS0FBQSxFQUtBLFNBQUFvb0IsWUFBWXRlLE9BQU8sRUFBRTtNQUFBLElBQUFDLEtBQUE7TUFDakIsSUFBSWpHLE9BQUEsQ0FBT2dHLE9BQU8sTUFBSyxRQUFRLEVBQUU7UUFDN0IsTUFBTSxJQUFJM0YsS0FBSyxDQUFDLCtDQUErQyxDQUFDO01BQ3BFO01BRUFsRCxNQUFNLENBQUMrTSxPQUFPLENBQUNsRSxPQUFPLENBQUMsQ0FBQ3BHLE9BQU8sQ0FBQyxVQUFDdUssS0FBSyxFQUFLO1FBQ3ZDLElBQUFDLE1BQUEsR0FBQTFHLGNBQUEsQ0FBcUJ5RyxLQUFLO1VBQW5CbE8sR0FBRyxHQUFBbU8sTUFBQTtVQUFFbE8sS0FBSyxHQUFBa08sTUFBQTtRQUVqQixJQUFJbkUsS0FBSSxDQUFDaVAsUUFBUSxDQUFDalosR0FBRyxDQUFDLEtBQUs4TCxTQUFTLEVBQUU7VUFDbEM5QixLQUFJLENBQUNpUCxRQUFRLENBQUNqWixHQUFHLENBQUMsR0FBR0MsS0FBSztRQUM5QjtNQUNKLENBQUMsQ0FBQztJQUNOOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFKSTtJQUFBRCxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBaVosWUFBQSxFQUFjO01BQUEsSUFBQXZNLE1BQUE7TUFDVixJQUFNc00sUUFBUSxHQUFHLENBQUMsQ0FBQztNQUVuQi9YLE1BQU0sQ0FBQytNLE9BQU8sQ0FBQyxJQUFJLENBQUNnTCxRQUFRLENBQUMsQ0FBQ3RWLE9BQU8sQ0FBQyxVQUFDdUssS0FBSyxFQUFLO1FBQzdDLElBQUFlLE9BQUEsR0FBQXhILGNBQUEsQ0FBcUJ5RyxLQUFLO1VBQW5CbE8sR0FBRyxHQUFBaVAsT0FBQTtVQUFFaFAsS0FBSyxHQUFBZ1AsT0FBQTtRQUVqQixJQUFJdEMsTUFBSSxDQUFDc00sUUFBUSxDQUFDalosR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1VBQzdCaVosUUFBUSxDQUFDalosR0FBRyxDQUFDLEdBQUdDLEtBQUs7UUFDekI7TUFDSixDQUFDLENBQUM7TUFFRixPQUFPZ1osUUFBUTtJQUNuQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEk7SUFBQWpaLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUFnTixJQUFJakgsSUFBSSxFQUFFO01BQUEsSUFBQThILE1BQUE7TUFDTixJQUFJOUgsSUFBSSxLQUFLOEYsU0FBUyxFQUFFO1FBQ3BCLElBQU13YyxPQUFPLEdBQUdQLGlEQUFVLENBQUM5YSxHQUFHLENBQUMsQ0FBQztRQUVoQy9MLE1BQU0sQ0FBQytNLE9BQU8sQ0FBQ3FhLE9BQU8sQ0FBQyxDQUFDM2tCLE9BQU8sQ0FBQyxVQUFDdUssS0FBSyxFQUFLO1VBQ3ZDLElBQUFvRSxPQUFBLEdBQUE3SyxjQUFBLENBQWtDeUcsS0FBSztZQUFoQ3FhLFVBQVUsR0FBQWpXLE9BQUE7WUFBRWtXLFdBQVcsR0FBQWxXLE9BQUE7VUFFOUJ4RSxNQUFJLENBQUNqTyxTQUFTLENBQUM4SyxXQUFXLENBQUMsWUFBWSxFQUFFNGQsVUFBVSxFQUFFQyxXQUFXLEVBQUUsVUFBQ0MsUUFBUSxFQUFLO1lBQzVFSCxPQUFPLENBQUNDLFVBQVUsQ0FBQyxHQUFHRSxRQUFRO1VBQ2xDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVGLE9BQU9ILE9BQU87TUFDbEI7TUFFQSxJQUFJcm9CLEtBQUssR0FBRzhuQixpREFBVSxDQUFDOWEsR0FBRyxDQUFDakgsSUFBSSxDQUFDOztNQUVoQztNQUNBLElBQUksQ0FBQ25HLFNBQVMsQ0FBQzhLLFdBQVcsQ0FBQyxZQUFZLEVBQUUzRSxJQUFJLEVBQUUvRixLQUFLLEVBQUUsVUFBQ3dvQixRQUFRLEVBQUs7UUFDaEV4b0IsS0FBSyxHQUFHd29CLFFBQVE7TUFDcEIsQ0FBQyxDQUFDO01BRUYsT0FBT3hvQixLQUFLO0lBQ2hCOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBVEk7SUFBQUQsR0FBQTtJQUFBQyxLQUFBLEVBVUEsU0FBQTJZLElBQUk1UyxJQUFJLEVBQUUvRixLQUFLLEVBQUU4SixPQUFPLEVBQUU7TUFDdEIsSUFBSTJlLFNBQVMsR0FBR3pvQixLQUFLOztNQUVyQjtNQUNBLElBQUksQ0FBQ0osU0FBUyxDQUFDOEssV0FBVyxDQUFDLFlBQVksRUFBRTNFLElBQUksRUFBRS9GLEtBQUssRUFBRSxVQUFDd29CLFFBQVEsRUFBSztRQUNoRUMsU0FBUyxHQUFHRCxRQUFRO01BQ3hCLENBQUMsQ0FBQztNQUVGLE9BQU9WLGlEQUFVLENBQUNuUCxHQUFHLENBQUM1UyxJQUFJLEVBQUUwaUIsU0FBUyxFQUFBbGdCLGFBQUEsQ0FBQUEsYUFBQSxLQUM5QixJQUFJLENBQUMwUSxXQUFXLENBQUMsQ0FBQyxHQUNsQm5QLE9BQU8sQ0FDYixDQUFDO0lBQ047O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkk7SUFBQS9KLEdBQUE7SUFBQUMsS0FBQSxFQVNBLFNBQUFrWSxPQUFPblMsSUFBSSxFQUFFK0QsT0FBTyxFQUFFO01BQ2xCZ2UsaURBQVUsQ0FBQzVQLE1BQU0sQ0FBQ25TLElBQUksRUFBQXdDLGFBQUEsQ0FBQUEsYUFBQSxLQUNmLElBQUksQ0FBQzBRLFdBQVcsQ0FBQyxDQUFDLEdBQ2xCblAsT0FBTyxDQUNiLENBQUM7SUFDTjtFQUFDO0FBQUEsRUF4SCtCdEosNERBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWkU7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEEsSUFVcUJnbEIsVUFBVSwwQkFBQS9TLFVBQUE7RUFBQSxTQUFBK1MsV0FBQTtJQUFBM2xCLGVBQUEsT0FBQTJsQixVQUFBO0lBQUEsT0FBQTlrQixVQUFBLE9BQUE4a0IsVUFBQSxFQUFBN2tCLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUE0a0IsVUFBQSxFQUFBL1MsVUFBQTtFQUFBLE9BQUEzUyxZQUFBLENBQUEwbEIsVUFBQTtJQUFBemxCLEdBQUE7SUFBQUMsS0FBQSxFQUMzQixTQUFBQyxVQUFBLEVBQVk7TUFBQSxJQUFBOEosS0FBQTtNQUNSO01BQ0E2RSxNQUFNLENBQUM4WixNQUFNLEdBQUcsVUFBQ3hiLElBQUk7UUFBQSxPQUFLbkQsS0FBSSxDQUFDZ0wsS0FBSyxDQUFDN0gsSUFBSSxDQUFDO01BQUE7TUFDMUMwQixNQUFNLENBQUMrWixNQUFNLEdBQUcvWixNQUFNLENBQUM4WixNQUFNO0lBQ2pDO0VBQUM7SUFBQTNvQixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBK1UsTUFBTTZULEdBQUcsRUFBRTtNQUNQLElBQU1DLFVBQVUsR0FBRyxJQUFJLENBQUNDLFdBQVcsQ0FBQ0YsR0FBRyxDQUFDO01BQ3hDLE9BQU9HLElBQUksQ0FBQ2hVLEtBQUssQ0FBQzhULFVBQVUsQ0FBQztJQUNqQztFQUFDO0lBQUE5b0IsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQThvQixZQUFZOW9CLEtBQUssRUFBRTtNQUNmLElBQUk0b0IsR0FBRyxHQUFHNW9CLEtBQUssQ0FBQzZnQixJQUFJLENBQUMsQ0FBQztNQUV0QixJQUFJLENBQUMrSCxHQUFHLENBQUNqakIsTUFBTSxFQUFFO1FBQ2IsTUFBTSxJQUFJeEIsS0FBSyxDQUFDLHFCQUFxQixDQUFDO01BQzFDO01BRUEsSUFBSStpQixNQUFNLEdBQUcsRUFBRTtNQUNmLElBQUl6a0IsSUFBSSxHQUFHLElBQUk7TUFDZixJQUFJMUMsR0FBRyxHQUFHLElBQUk7TUFDZCxJQUFJaU0sSUFBSSxHQUFHLEVBQUU7O01BRWI7QUFDUjtBQUNBO01BQ1EsT0FBTzRjLEdBQUcsSUFBSUEsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUMxQkEsR0FBRyxHQUFHQSxHQUFHLENBQUN6YSxNQUFNLENBQUMsQ0FBQyxDQUFDO01BQ3ZCOztNQUVBO0FBQ1I7QUFDQTtNQUNRLElBQUl5YSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ25DLElBQUlBLEdBQUcsQ0FBQ0EsR0FBRyxDQUFDampCLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBS2lqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7VUFDaEMsTUFBTSxJQUFJemtCLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztRQUNsRDtRQUVBNkgsSUFBSSxHQUFHLEdBQUc7UUFDVixLQUFLLElBQUl6SyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdxbkIsR0FBRyxDQUFDampCLE1BQU0sRUFBRXBFLENBQUMsSUFBSSxDQUFDLEVBQUU7VUFDcEMsSUFBSXFuQixHQUFHLENBQUNybkIsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUlxbkIsR0FBRyxDQUFDcm5CLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7Y0FDckJ5SyxJQUFJLElBQUk0YyxHQUFHLENBQUNybkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixDQUFDLE1BQU07Y0FDSHlLLElBQUksSUFBSTRjLEdBQUcsQ0FBQ3JuQixDQUFDLENBQUM7Y0FDZHlLLElBQUksSUFBSTRjLEdBQUcsQ0FBQ3JuQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCO1lBQ0FBLENBQUMsSUFBSSxDQUFDO1VBQ1YsQ0FBQyxNQUFNLElBQUlxbkIsR0FBRyxDQUFDcm5CLENBQUMsQ0FBQyxLQUFLcW5CLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQjVjLElBQUksSUFBSSxHQUFHO1lBQ1gsT0FBT0EsSUFBSTtVQUNmLENBQUMsTUFBTSxJQUFJNGMsR0FBRyxDQUFDcm5CLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUN2QnlLLElBQUksSUFBSSxLQUFLO1VBQ2pCLENBQUMsTUFBTTtZQUNIQSxJQUFJLElBQUk0YyxHQUFHLENBQUNybkIsQ0FBQyxDQUFDO1VBQ2xCO1FBQ0o7UUFFQSxNQUFNLElBQUk0QyxLQUFLLENBQUMsNkJBQTZCLENBQUM7TUFDbEQ7O01BRUE7QUFDUjtBQUNBO01BQ1EsSUFBSXlrQixHQUFHLEtBQUssTUFBTSxJQUFJQSxHQUFHLEtBQUssT0FBTyxFQUFFO1FBQ25DLE9BQU9BLEdBQUc7TUFDZDs7TUFFQTtBQUNSO0FBQ0E7TUFDUSxJQUFJQSxHQUFHLEtBQUssTUFBTSxFQUFFO1FBQ2hCLE9BQU8sTUFBTTtNQUNqQjs7TUFFQTtBQUNSO0FBQ0E7TUFDUSxJQUFNSSxHQUFHLEdBQUdoZ0IsTUFBTSxDQUFDNGYsR0FBRyxDQUFDO01BQ3ZCLElBQUksQ0FBQzVmLE1BQU0sQ0FBQ3RELEtBQUssQ0FBQ3NqQixHQUFHLENBQUMsRUFBRTtRQUNwQixPQUFPQSxHQUFHLENBQUNsaEIsUUFBUSxDQUFDLENBQUM7TUFDekI7O01BRUE7QUFDUjtBQUNBO01BQ1EsSUFBSThnQixHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ2hCbm1CLElBQUksR0FBRyxTQUFTO1FBQ2hCMUMsR0FBRyxHQUFHLElBQUk7UUFDVm1uQixNQUFNLEdBQUcsR0FBRztRQUVaLEtBQUssSUFBSTNsQixFQUFDLEdBQUcsQ0FBQyxFQUFFQSxFQUFDLEdBQUdxbkIsR0FBRyxDQUFDampCLE1BQU0sRUFBRXBFLEVBQUMsSUFBSSxDQUFDLEVBQUU7VUFDcEMsSUFBSSxJQUFJLENBQUMwbkIsV0FBVyxDQUFDTCxHQUFHLENBQUNybkIsRUFBQyxDQUFDLENBQUMsRUFBRTtZQUMxQjtZQUNBO1VBQ0o7VUFDQSxJQUFJa0IsSUFBSSxLQUFLLFNBQVMsS0FBS21tQixHQUFHLENBQUNybkIsRUFBQyxDQUFDLEtBQUssR0FBRyxJQUFJcW5CLEdBQUcsQ0FBQ3JuQixFQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRTtZQUMzRHhCLEdBQUcsR0FBRyxJQUFJLENBQUNtcEIsUUFBUSxDQUFDTixHQUFHLEVBQUVybkIsRUFBQyxHQUFHLENBQUMsRUFBRXFuQixHQUFHLENBQUNybkIsRUFBQyxDQUFDLENBQUM7WUFDdkMybEIsTUFBTSxTQUFBOWMsTUFBQSxDQUFRckssR0FBRyxPQUFHO1lBQ3BCd0IsRUFBQyxJQUFJeEIsR0FBRyxDQUFDNEYsTUFBTTtZQUNmcEUsRUFBQyxJQUFJLENBQUM7WUFDTmtCLElBQUksR0FBRyxVQUFVO1VBQ3JCLENBQUMsTUFBTSxJQUFJQSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQzBtQixZQUFZLENBQUNQLEdBQUcsQ0FBQ3JuQixFQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hEeEIsR0FBRyxHQUFHLElBQUksQ0FBQ21wQixRQUFRLENBQUNOLEdBQUcsRUFBRXJuQixFQUFDLENBQUM7WUFDM0IybEIsTUFBTSxJQUFJLEdBQUc7WUFDYkEsTUFBTSxJQUFJbm5CLEdBQUc7WUFDYm1uQixNQUFNLElBQUksR0FBRztZQUNiM2xCLEVBQUMsSUFBSXhCLEdBQUcsQ0FBQzRGLE1BQU0sR0FBRyxDQUFDO1lBQ25CbEQsSUFBSSxHQUFHLFVBQVU7VUFDckIsQ0FBQyxNQUFNLElBQUlBLElBQUksS0FBSyxVQUFVLElBQUltbUIsR0FBRyxDQUFDcm5CLEVBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUM5QzJsQixNQUFNLElBQUksR0FBRztZQUNiemtCLElBQUksR0FBRyxHQUFHO1VBQ2QsQ0FBQyxNQUFNLElBQUlBLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDckJ1SixJQUFJLEdBQUcsSUFBSSxDQUFDb2QsT0FBTyxDQUFDUixHQUFHLEVBQUVybkIsRUFBQyxDQUFDO1lBRTNCQSxFQUFDLEdBQUdBLEVBQUMsR0FBR3lLLElBQUksQ0FBQ3FkLFlBQVksR0FBRyxDQUFDO1lBQzdCbkMsTUFBTSxJQUFJLElBQUksQ0FBQzRCLFdBQVcsQ0FBQzljLElBQUksQ0FBQ0EsSUFBSSxDQUFDO1lBRXJDdkosSUFBSSxHQUFHLFdBQVc7VUFDdEIsQ0FBQyxNQUFNLElBQUlBLElBQUksS0FBSyxXQUFXLElBQUlBLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDbkQsSUFBSTZtQixJQUFJLEdBQUcvbkIsRUFBQztZQUNaLE9BQU9xbkIsR0FBRyxDQUFDVSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDTCxXQUFXLENBQUNMLEdBQUcsQ0FBQ1UsSUFBSSxDQUFDLENBQUMsRUFBRTtjQUNyREEsSUFBSSxJQUFJLENBQUM7WUFDYjtZQUNBLElBQUlWLEdBQUcsQ0FBQ1UsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJQSxJQUFJLEtBQUtWLEdBQUcsQ0FBQ2pqQixNQUFNLEdBQUcsQ0FBQyxFQUFFO2NBQzlDLE9BQU91aEIsTUFBTSxDQUFDQSxNQUFNLENBQUN2aEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtnQkFDdEN1aEIsTUFBTSxHQUFHQSxNQUFNLENBQUMvWSxNQUFNLENBQUMsQ0FBQyxFQUFFK1ksTUFBTSxDQUFDdmhCLE1BQU0sR0FBRyxDQUFDLENBQUM7Y0FDaEQ7Y0FDQXVoQixNQUFNLElBQUksR0FBRztjQUNiLE9BQU9BLE1BQU07WUFDakI7WUFDQSxJQUFJb0MsSUFBSSxLQUFLL25CLEVBQUMsSUFBSTJsQixNQUFNLEtBQUssR0FBRyxFQUFFO2NBQzlCQSxNQUFNLElBQUksR0FBRztjQUNiemtCLElBQUksR0FBRyxTQUFTO2NBQ2hCbEIsRUFBQyxHQUFHK25CLElBQUksR0FBRyxDQUFDO1lBQ2hCO1VBQ0o7UUFDSjtRQUVBLE1BQU0sSUFBSW5sQixLQUFLLDRCQUFBaUcsTUFBQSxDQUE0QjhjLE1BQU0sQ0FBRSxDQUFDO01BQ3hEOztNQUVBO0FBQ1I7QUFDQTtNQUNRLElBQUkwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ2hCMUIsTUFBTSxHQUFHLEdBQUc7UUFDWnprQixJQUFJLEdBQUcsVUFBVTtRQUNqQixLQUFLLElBQUlsQixHQUFDLEdBQUcsQ0FBQyxFQUFFQSxHQUFDLEdBQUdxbkIsR0FBRyxDQUFDampCLE1BQU0sRUFBRXBFLEdBQUMsSUFBSSxDQUFDLEVBQUU7VUFDcEMsSUFBSXFuQixHQUFHLENBQUNybkIsR0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJcW5CLEdBQUcsQ0FBQ3JuQixHQUFDLENBQUMsS0FBSyxJQUFJLElBQUlxbkIsR0FBRyxDQUFDcm5CLEdBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN0RDtZQUNBO1VBQ0osQ0FBQyxNQUFNLElBQUlrQixJQUFJLEtBQUssVUFBVSxFQUFFO1lBQzVCLElBQUltbUIsR0FBRyxDQUFDcm5CLEdBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtjQUNoQjJsQixNQUFNLElBQUksT0FBTztjQUNqQjtjQUNBO1lBQ0o7WUFDQSxJQUFJMEIsR0FBRyxDQUFDcm5CLEdBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSUEsR0FBQyxLQUFLcW5CLEdBQUcsQ0FBQ2pqQixNQUFNLEdBQUcsQ0FBQyxFQUFFO2NBQ3hDLElBQUl1aEIsTUFBTSxDQUFDQSxNQUFNLENBQUN2aEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtnQkFDbkN1aEIsTUFBTSxHQUFHQSxNQUFNLENBQUMvWSxNQUFNLENBQUMsQ0FBQyxFQUFFK1ksTUFBTSxDQUFDdmhCLE1BQU0sR0FBRyxDQUFDLENBQUM7Y0FDaEQ7Y0FDQXVoQixNQUFNLElBQUksR0FBRztjQUNiLE9BQU9BLE1BQU07WUFDakI7WUFFQWxiLElBQUksR0FBRyxJQUFJLENBQUNvZCxPQUFPLENBQUNSLEdBQUcsRUFBRXJuQixHQUFDLENBQUM7WUFFM0JBLEdBQUMsR0FBR0EsR0FBQyxHQUFHeUssSUFBSSxDQUFDcWQsWUFBWSxHQUFHLENBQUM7WUFDN0JuQyxNQUFNLElBQUksSUFBSSxDQUFDNEIsV0FBVyxDQUFDOWMsSUFBSSxDQUFDQSxJQUFJLENBQUM7WUFFckN2SixJQUFJLEdBQUcsV0FBVztVQUN0QixDQUFDLE1BQU0sSUFBSUEsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUM3QixJQUFJbW1CLEdBQUcsQ0FBQ3JuQixHQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Y0FDaEIybEIsTUFBTSxJQUFJLEdBQUc7Y0FDYnprQixJQUFJLEdBQUcsVUFBVTs7Y0FFakI7Y0FDQSxPQUFPbW1CLEdBQUcsQ0FBQ3JuQixHQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQzBuQixXQUFXLENBQUNMLEdBQUcsQ0FBQ3JuQixHQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkQsSUFBSXFuQixHQUFHLENBQUNybkIsR0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtrQkFDcEIybEIsTUFBTSxJQUFJLE9BQU87Z0JBQ3JCO2dCQUNBM2xCLEdBQUMsSUFBSSxDQUFDO2NBQ1Y7WUFDSixDQUFDLE1BQU0sSUFBSXFuQixHQUFHLENBQUNybkIsR0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJQSxHQUFDLEtBQUtxbkIsR0FBRyxDQUFDampCLE1BQU0sR0FBRyxDQUFDLEVBQUU7Y0FDL0N1aEIsTUFBTSxJQUFJLEdBQUc7Y0FDYixPQUFPQSxNQUFNO1lBQ2pCO1VBQ0o7UUFDSjtRQUVBLE1BQU0sSUFBSS9pQixLQUFLLDJCQUFBaUcsTUFBQSxDQUEyQjhjLE1BQU0sQ0FBRSxDQUFDO01BQ3ZEO01BRUEsT0FBTyxFQUFFO0lBQ2I7RUFBQztJQUFBbm5CLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFvcEIsUUFBUVIsR0FBRyxFQUFFVyxHQUFHLEVBQUU7TUFDZCxJQUFJdmQsSUFBSSxHQUFHLEVBQUU7O01BRWI7TUFDQSxJQUFJNGMsR0FBRyxDQUFDVyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUlYLEdBQUcsQ0FBQ1csR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3ZDdmQsSUFBSSxHQUFHNGMsR0FBRyxDQUFDVyxHQUFHLENBQUM7UUFFZixLQUFLLElBQUlob0IsQ0FBQyxHQUFHZ29CLEdBQUcsR0FBRyxDQUFDLEVBQUVob0IsQ0FBQyxHQUFHcW5CLEdBQUcsQ0FBQ2pqQixNQUFNLEVBQUVwRSxDQUFDLElBQUksQ0FBQyxFQUFFO1VBQzFDLElBQUlxbkIsR0FBRyxDQUFDcm5CLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNqQnlLLElBQUksSUFBSTRjLEdBQUcsQ0FBQ3JuQixDQUFDLENBQUM7WUFDZCxJQUFJQSxDQUFDLEdBQUcsQ0FBQyxHQUFHcW5CLEdBQUcsQ0FBQ2pqQixNQUFNLEVBQUU7Y0FDcEJxRyxJQUFJLElBQUk0YyxHQUFHLENBQUNybkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QjtZQUNBQSxDQUFDLElBQUksQ0FBQztVQUNWLENBQUMsTUFBTSxJQUFJcW5CLEdBQUcsQ0FBQ3JuQixDQUFDLENBQUMsS0FBS3FuQixHQUFHLENBQUNXLEdBQUcsQ0FBQyxFQUFFO1lBQzVCdmQsSUFBSSxJQUFJNGMsR0FBRyxDQUFDVyxHQUFHLENBQUM7WUFDaEIsT0FBTztjQUNIRixZQUFZLEVBQUVyZCxJQUFJLENBQUNyRyxNQUFNO2NBQ3pCcUcsSUFBSSxFQUFKQTtZQUNKLENBQUM7VUFDTCxDQUFDLE1BQU07WUFDSEEsSUFBSSxJQUFJNGMsR0FBRyxDQUFDcm5CLENBQUMsQ0FBQztVQUNsQjtRQUNKO1FBRUEsTUFBTSxJQUFJNEMsS0FBSyxpQ0FBQWlHLE1BQUEsQ0FBaUM0QixJQUFJLENBQUUsQ0FBQztNQUMzRDs7TUFFQTtNQUNBLElBQUk0YyxHQUFHLENBQUNXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUNsQixJQUFJWCxHQUFHLENBQUMvVSxPQUFPLENBQUMsTUFBTSxFQUFFMFYsR0FBRyxDQUFDLEtBQUtBLEdBQUcsRUFBRTtVQUNsQyxPQUFPO1lBQ0hGLFlBQVksRUFBRSxNQUFNLENBQUMxakIsTUFBTTtZQUMzQnFHLElBQUksRUFBRTtVQUNWLENBQUM7UUFDTDtRQUVBLE1BQU0sSUFBSTdILEtBQUssa0NBQUFpRyxNQUFBLENBQWtDd2UsR0FBRyxDQUFDemEsTUFBTSxDQUFDLENBQUMsRUFBRW9iLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBRSxDQUFDO01BQy9FO01BQ0EsSUFBSVgsR0FBRyxDQUFDVyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDbEIsSUFBSVgsR0FBRyxDQUFDL1UsT0FBTyxDQUFDLEdBQUcsRUFBRTBWLEdBQUcsQ0FBQyxLQUFLQSxHQUFHLEVBQUU7VUFDL0IsT0FBTztZQUNIRixZQUFZLEVBQUUsT0FBTyxDQUFDMWpCLE1BQU07WUFDNUJxRyxJQUFJLEVBQUU7VUFDVixDQUFDO1FBQ0w7UUFFQSxNQUFNLElBQUk3SCxLQUFLLGtDQUFBaUcsTUFBQSxDQUFrQ3dlLEdBQUcsQ0FBQ3phLE1BQU0sQ0FBQyxDQUFDLEVBQUVvYixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUUsQ0FBQztNQUMvRTs7TUFFQTtNQUNBLElBQUlYLEdBQUcsQ0FBQ1csR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ2xCLElBQUlYLEdBQUcsQ0FBQy9VLE9BQU8sQ0FBQyxNQUFNLEVBQUUwVixHQUFHLENBQUMsS0FBS0EsR0FBRyxFQUFFO1VBQ2xDLE9BQU87WUFDSEYsWUFBWSxFQUFFLE1BQU0sQ0FBQzFqQixNQUFNO1lBQzNCcUcsSUFBSSxFQUFFO1VBQ1YsQ0FBQztRQUNMO1FBRUEsTUFBTSxJQUFJN0gsS0FBSyxrQ0FBQWlHLE1BQUEsQ0FBa0N3ZSxHQUFHLENBQUN6YSxNQUFNLENBQUMsQ0FBQyxFQUFFb2IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFFLENBQUM7TUFDL0U7O01BRUE7TUFDQSxJQUFJWCxHQUFHLENBQUNXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSVgsR0FBRyxDQUFDVyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUlYLEdBQUcsQ0FBQ1csR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFLWCxHQUFHLENBQUNXLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSVgsR0FBRyxDQUFDVyxHQUFHLENBQUMsSUFBSSxHQUFJLEVBQUU7UUFDbEd2ZCxJQUFJLEdBQUcsRUFBRTtRQUVULEtBQUssSUFBSXpLLEdBQUMsR0FBR2dvQixHQUFHLEVBQUVob0IsR0FBQyxHQUFHcW5CLEdBQUcsQ0FBQ2pqQixNQUFNLEVBQUVwRSxHQUFDLElBQUksQ0FBQyxFQUFFO1VBQ3RDLElBQUlxbkIsR0FBRyxDQUFDcm5CLEdBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSXFuQixHQUFHLENBQUNybkIsR0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJcW5CLEdBQUcsQ0FBQ3JuQixHQUFDLENBQUMsS0FBSyxHQUFHLElBQUtxbkIsR0FBRyxDQUFDcm5CLEdBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSXFuQixHQUFHLENBQUNybkIsR0FBQyxDQUFDLElBQUksR0FBSSxFQUFFO1lBQ3hGeUssSUFBSSxJQUFJNGMsR0FBRyxDQUFDcm5CLEdBQUMsQ0FBQztVQUNsQixDQUFDLE1BQU07WUFDSCxPQUFPO2NBQ0g4bkIsWUFBWSxFQUFFcmQsSUFBSSxDQUFDckcsTUFBTTtjQUN6QnFHLElBQUksRUFBSkE7WUFDSixDQUFDO1VBQ0w7UUFDSjtRQUVBLE1BQU0sSUFBSTdILEtBQUssaUNBQUFpRyxNQUFBLENBQWlDNEIsSUFBSSxDQUFFLENBQUM7TUFDM0Q7O01BRUE7TUFDQSxJQUFJNGMsR0FBRyxDQUFDVyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUlYLEdBQUcsQ0FBQ1csR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ3RDLElBQU1DLEtBQUssR0FBRyxDQUNWWixHQUFHLENBQUNXLEdBQUcsQ0FBQyxDQUNYO1FBQ0R2ZCxJQUFJLEdBQUc0YyxHQUFHLENBQUNXLEdBQUcsQ0FBQztRQUVmLEtBQUssSUFBSWhvQixHQUFDLEdBQUdnb0IsR0FBRyxHQUFHLENBQUMsRUFBRWhvQixHQUFDLEdBQUdxbkIsR0FBRyxDQUFDampCLE1BQU0sRUFBRXBFLEdBQUMsSUFBSSxDQUFDLEVBQUU7VUFDMUN5SyxJQUFJLElBQUk0YyxHQUFHLENBQUNybkIsR0FBQyxDQUFDO1VBQ2QsSUFBSXFuQixHQUFHLENBQUNybkIsR0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUlBLEdBQUMsR0FBRyxDQUFDLEdBQUdxbkIsR0FBRyxDQUFDampCLE1BQU0sRUFBRTtjQUNwQnFHLElBQUksSUFBSTRjLEdBQUcsQ0FBQ3JuQixHQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCO1lBQ0FBLEdBQUMsSUFBSSxDQUFDO1VBQ1YsQ0FBQyxNQUFNLElBQUlxbkIsR0FBRyxDQUFDcm5CLEdBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUN2QixJQUFJaW9CLEtBQUssQ0FBQ0EsS0FBSyxDQUFDN2pCLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Y0FDakM2akIsS0FBSyxDQUFDaGpCLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxNQUFNLElBQUlnakIsS0FBSyxDQUFDQSxLQUFLLENBQUM3akIsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtjQUN6QzZqQixLQUFLLENBQUNsa0IsSUFBSSxDQUFDc2pCLEdBQUcsQ0FBQ3JuQixHQUFDLENBQUMsQ0FBQztZQUN0QjtVQUNKLENBQUMsTUFBTSxJQUFJcW5CLEdBQUcsQ0FBQ3JuQixHQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDeEIsSUFBSWlvQixLQUFLLENBQUNBLEtBQUssQ0FBQzdqQixNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO2NBQ2xDNmpCLEtBQUssQ0FBQ2hqQixHQUFHLENBQUMsQ0FBQztZQUNmLENBQUMsTUFBTSxJQUFJZ2pCLEtBQUssQ0FBQ0EsS0FBSyxDQUFDN2pCLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Y0FDeEM2akIsS0FBSyxDQUFDbGtCLElBQUksQ0FBQ3NqQixHQUFHLENBQUNybkIsR0FBQyxDQUFDLENBQUM7WUFDdEI7VUFDSixDQUFDLE1BQU0sSUFBSWlvQixLQUFLLENBQUNBLEtBQUssQ0FBQzdqQixNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJNmpCLEtBQUssQ0FBQ0EsS0FBSyxDQUFDN2pCLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDNUUsSUFBSWlqQixHQUFHLENBQUNybkIsR0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2NBQ2hCaW9CLEtBQUssQ0FBQ2xrQixJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUMsTUFBTSxJQUFJc2pCLEdBQUcsQ0FBQ3JuQixHQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Y0FDdkIsSUFBSWlvQixLQUFLLENBQUNBLEtBQUssQ0FBQzdqQixNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUNqQzZqQixLQUFLLENBQUNoakIsR0FBRyxDQUFDLENBQUM7Y0FDZixDQUFDLE1BQU07Z0JBQ0gsTUFBTSxJQUFJckMsS0FBSyxnQkFBQWlHLE1BQUEsQ0FBaUJ3ZSxHQUFHLENBQUNXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxRQUFRLEdBQUcsT0FBTyxpQkFBQW5mLE1BQUEsQ0FBZTRCLElBQUksQ0FBRSxDQUFDO2NBQy9GO1lBQ0osQ0FBQyxNQUFNLElBQUk0YyxHQUFHLENBQUNybkIsR0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2NBQ3ZCaW9CLEtBQUssQ0FBQ2xrQixJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUMsTUFBTSxJQUFJc2pCLEdBQUcsQ0FBQ3JuQixHQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Y0FDdkIsSUFBSWlvQixLQUFLLENBQUNBLEtBQUssQ0FBQzdqQixNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUNqQzZqQixLQUFLLENBQUNoakIsR0FBRyxDQUFDLENBQUM7Y0FDZixDQUFDLE1BQU07Z0JBQ0gsTUFBTSxJQUFJckMsS0FBSyxnQkFBQWlHLE1BQUEsQ0FBaUJ3ZSxHQUFHLENBQUNXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxRQUFRLEdBQUcsT0FBTyxpQkFBQW5mLE1BQUEsQ0FBZTRCLElBQUksQ0FBRSxDQUFDO2NBQy9GO1lBQ0o7VUFDSjtVQUNBLElBQUksQ0FBQ3dkLEtBQUssQ0FBQzdqQixNQUFNLEVBQUU7WUFDZixPQUFPO2NBQ0gwakIsWUFBWSxFQUFFOW5CLEdBQUMsR0FBR2dvQixHQUFHO2NBQ3JCdmQsSUFBSSxFQUFKQTtZQUNKLENBQUM7VUFDTDtRQUNKO1FBRUEsTUFBTSxJQUFJN0gsS0FBSyxnQkFBQWlHLE1BQUEsQ0FBaUJ3ZSxHQUFHLENBQUNXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxRQUFRLEdBQUcsT0FBTyxpQkFBQW5mLE1BQUEsQ0FBZTRCLElBQUksQ0FBRSxDQUFDO01BQy9GO01BRUEsTUFBTSxJQUFJN0gsS0FBSywwQkFBQWlHLE1BQUEsQ0FBMEJ3ZSxHQUFHLENBQUN6YSxNQUFNLENBQUVvYixHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBSUEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUUsQ0FBQztJQUM1RjtFQUFDO0lBQUF4cEIsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQWtwQixTQUFTTixHQUFHLEVBQUVXLEdBQUcsRUFBRUUsS0FBSyxFQUFFO01BQ3RCLElBQUkxcEIsR0FBRyxHQUFHLEVBQUU7TUFFWixLQUFLLElBQUl3QixDQUFDLEdBQUdnb0IsR0FBRyxFQUFFaG9CLENBQUMsR0FBR3FuQixHQUFHLENBQUNqakIsTUFBTSxFQUFFcEUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QyxJQUFJa29CLEtBQUssSUFBSUEsS0FBSyxLQUFLYixHQUFHLENBQUNybkIsQ0FBQyxDQUFDLEVBQUU7VUFDM0IsT0FBT3hCLEdBQUc7UUFDZDtRQUNBLElBQUksQ0FBQzBwQixLQUFLLEtBQUtiLEdBQUcsQ0FBQ3JuQixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUlxbkIsR0FBRyxDQUFDcm5CLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO1VBQzlDLE9BQU94QixHQUFHO1FBQ2Q7UUFFQUEsR0FBRyxJQUFJNm9CLEdBQUcsQ0FBQ3JuQixDQUFDLENBQUM7UUFFYixJQUFJcW5CLEdBQUcsQ0FBQ3JuQixDQUFDLENBQUMsS0FBSyxJQUFJLElBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUdxbkIsR0FBRyxDQUFDampCLE1BQU0sRUFBRTtVQUN2QzVGLEdBQUcsSUFBSTZvQixHQUFHLENBQUNybkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztVQUNqQkEsQ0FBQyxJQUFJLENBQUM7UUFDVjtNQUNKO01BRUEsTUFBTSxJQUFJNEMsS0FBSyw0QkFBQWlHLE1BQUEsQ0FBNEJySyxHQUFHLENBQUUsQ0FBQztJQUNyRDtFQUFDO0lBQUFBLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFtcEIsYUFBYU8sRUFBRSxFQUFFO01BQ2IsSUFBSUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNoQixPQUFPLEtBQUs7TUFDaEI7TUFDQSxJQUFLQSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJQSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFNQSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJQSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBSSxJQUFJQSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ25GLE9BQU8sSUFBSTtNQUNmO01BQ0EsSUFBSUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUM5QixPQUFPLElBQUk7TUFDZjtNQUNBLElBQUlBLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDZixPQUFPLElBQUk7TUFDZjtNQUNBLElBQUlBLEVBQUUsQ0FBQ0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRTtRQUN4QixPQUFPLElBQUk7TUFDZjtNQUVBLE9BQU8sS0FBSztJQUNoQjtFQUFDO0lBQUE1cEIsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQWlwQixZQUFZUyxFQUFFLEVBQUU7TUFDWixPQUFPQSxFQUFFLEtBQUssR0FBRyxJQUFJQSxFQUFFLEtBQUssSUFBSSxJQUFJQSxFQUFFLEtBQUssSUFBSTtJQUNuRDtFQUFDO0FBQUEsRUE3WG1DbHBCLDREQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1pGOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEEsSUFRcUJpbEIsU0FBUywwQkFBQWhULFVBQUE7RUFBQSxTQUFBZ1QsVUFBQTtJQUFBNWxCLGVBQUEsT0FBQTRsQixTQUFBO0lBQUEsT0FBQS9rQixVQUFBLE9BQUEra0IsU0FBQSxFQUFBOWtCLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUE2a0IsU0FBQSxFQUFBaFQsVUFBQTtFQUFBLE9BQUEzUyxZQUFBLENBQUEybEIsU0FBQTtJQUFBMWxCLEdBQUE7SUFBQUMsS0FBQSxFQUMxQixTQUFBQyxVQUFBLEVBQVk7TUFBQSxJQUFBOEosS0FBQTtNQUNSO01BQ0E2RSxNQUFNLENBQUNnYixVQUFVLEdBQUcsVUFBQ0MsSUFBSTtRQUFBLE9BQUs5ZixLQUFJLENBQUMrZixRQUFRLENBQUNELElBQUksQ0FBQztNQUFBO01BQ2pEamIsTUFBTSxDQUFDbWIsVUFBVSxHQUFHbmIsTUFBTSxDQUFDZ2IsVUFBVTtJQUN6QztFQUFDO0lBQUE3cEIsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQThwQixTQUFTRCxJQUFJLEVBQUVHLFFBQVEsRUFBRTtNQUNyQixJQUFNQyxNQUFNLEdBQUcsSUFBSUMsU0FBUyxDQUFDLENBQUM7TUFDOUIsSUFBTS9ELEdBQUcsR0FBRzhELE1BQU0sQ0FBQ0UsZUFBZSxDQUFDTixJQUFJLEVBQUUsV0FBVyxDQUFDO01BQ3JELElBQU1PLGNBQWMsR0FBSUosUUFBUSxLQUFLbmUsU0FBUyxJQUFJLE9BQU9tZSxRQUFRLEtBQUssU0FBUyxHQUN6RUEsUUFBUSxHQUNSLElBQUk7TUFFVixJQUFJLENBQUNLLFlBQVksQ0FBQ2xFLEdBQUcsQ0FBQ21FLFdBQVcsQ0FBQyxDQUFDLENBQUM7TUFFcEMsT0FBUUYsY0FBYyxHQUFJakUsR0FBRyxDQUFDbmEsSUFBSSxDQUFDdUQsU0FBUyxHQUFHNFcsR0FBRyxDQUFDNVcsU0FBUztJQUNoRTtFQUFDO0lBQUF4UCxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBcXFCLGFBQWFFLElBQUksRUFBRTtNQUFBLElBQUE3ZCxNQUFBO01BQ2YsSUFBSTZkLElBQUksQ0FBQzdZLE9BQU8sS0FBSyxRQUFRLEVBQUU7UUFDM0I2WSxJQUFJLENBQUNyUyxNQUFNLENBQUMsQ0FBQztRQUNiO01BQ0o7TUFFQSxJQUFJLENBQUNzUyxjQUFjLENBQUNELElBQUksQ0FBQztNQUV6QixJQUFNRSxRQUFRLEdBQUcxaUIsS0FBSyxDQUFDQyxJQUFJLENBQUN1aUIsSUFBSSxDQUFDRSxRQUFRLENBQUM7TUFFMUNBLFFBQVEsQ0FBQy9tQixPQUFPLENBQUMsVUFBQ2duQixLQUFLLEVBQUs7UUFDeEJoZSxNQUFJLENBQUMyZCxZQUFZLENBQUNLLEtBQUssQ0FBQztNQUM1QixDQUFDLENBQUM7SUFDTjtFQUFDO0lBQUEzcUIsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQXdxQixlQUFlRCxJQUFJLEVBQUU7TUFDakIsSUFBSSxDQUFDQSxJQUFJLENBQUNJLFVBQVUsRUFBRTtRQUNsQjtNQUNKO01BRUEsS0FBSyxJQUFJcHBCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2dwQixJQUFJLENBQUNJLFVBQVUsQ0FBQ2hsQixNQUFNLEVBQUVwRSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2hELElBQU1xcEIsUUFBUSxHQUFHTCxJQUFJLENBQUNJLFVBQVUsQ0FBQzFHLElBQUksQ0FBQzFpQixDQUFDLENBQUMsQ0FBQ3dFLElBQUk7UUFDN0MsSUFBTThrQixTQUFTLEdBQUdOLElBQUksQ0FBQ0ksVUFBVSxDQUFDMUcsSUFBSSxDQUFDMWlCLENBQUMsQ0FBQyxDQUFDdkIsS0FBSzs7UUFFL0M7QUFDWjtBQUNBO0FBQ0E7UUFDWTtRQUNBLElBQUk0cUIsUUFBUSxDQUFDL1csT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSWdYLFNBQVMsQ0FBQ2hYLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7VUFDeEUwVyxJQUFJLENBQUN2USxlQUFlLENBQUM0USxRQUFRLENBQUM7UUFDbEM7TUFDSjtJQUNKO0VBQUM7QUFBQSxFQXBEa0NwcUIsNERBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkQ7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQSxJQVFxQmtsQixHQUFHLDBCQUFBalQsVUFBQTtFQUFBLFNBQUFpVCxJQUFBO0lBQUE3bEIsZUFBQSxPQUFBNmxCLEdBQUE7SUFBQSxPQUFBaGxCLFVBQUEsT0FBQWdsQixHQUFBLEVBQUEva0IsU0FBQTtFQUFBO0VBQUFDLFNBQUEsQ0FBQThrQixHQUFBLEVBQUFqVCxVQUFBO0VBQUEsT0FBQTNTLFlBQUEsQ0FBQTRsQixHQUFBO0lBQUEzbEIsR0FBQTtJQUFBQyxLQUFBLEVBQ3BCLFNBQUFDLFVBQUEsRUFBWTtNQUNSLElBQUksQ0FBQ2dtQixZQUFZLEdBQUcsSUFBSTtNQUN4QixJQUFJLENBQUM2RSxhQUFhLEdBQUcsSUFBSTtNQUN6QixJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDO01BQ2QsSUFBSSxDQUFDQyxRQUFRLENBQUMsQ0FBQztJQUNuQjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEk7SUFBQWpyQixHQUFBO0lBQUFDLEtBQUEsRUFRQSxTQUFBaXJCLEdBQUc1ZSxHQUFHLEVBQUU7TUFDSixJQUFNNmUsUUFBUSxHQUFHLHdFQUF3RTtNQUV6RixJQUFJN2UsR0FBRyxDQUFDNlQsS0FBSyxDQUFDZ0wsUUFBUSxDQUFDLEVBQUU7UUFDckIsT0FBTzdlLEdBQUc7TUFDZDtNQUVBLElBQU04ZSxNQUFNLEdBQUc5ZSxHQUFHLENBQUNpTixPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztNQUV0QyxVQUFBbFAsTUFBQSxDQUFVLElBQUksQ0FBQzJnQixPQUFPLENBQUMsQ0FBQyxFQUFBM2dCLE1BQUEsQ0FBRytnQixNQUFNO0lBQ3JDOztJQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQSTtJQUFBcHJCLEdBQUE7SUFBQUMsS0FBQSxFQVFBLFNBQUFrWCxNQUFNN0ssR0FBRyxFQUFFO01BQ1AsSUFBTTZlLFFBQVEsR0FBRyx3RUFBd0U7TUFFekYsSUFBSTdlLEdBQUcsQ0FBQzZULEtBQUssQ0FBQ2dMLFFBQVEsQ0FBQyxFQUFFO1FBQ3JCLE9BQU83ZSxHQUFHO01BQ2Q7TUFFQSxJQUFNOGUsTUFBTSxHQUFHOWUsR0FBRyxDQUFDaU4sT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7TUFFdEMsVUFBQWxQLE1BQUEsQ0FBVSxJQUFJLENBQUM0Z0IsUUFBUSxDQUFDLENBQUMsRUFBQTVnQixNQUFBLENBQUcrZ0IsTUFBTTtJQUN0Qzs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBYkk7SUFBQXByQixHQUFBO0lBQUFDLEtBQUEsRUFjQSxTQUFBK3FCLFFBQUEsRUFBVTtNQUNOLElBQUksSUFBSSxDQUFDOUUsWUFBWSxLQUFLLElBQUksRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQ0EsWUFBWTtNQUM1QjtNQUVBLElBQUkvYixRQUFRLENBQUNDLGFBQWEsQ0FBQyxzQ0FBc0MsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN6RSxJQUFJLENBQUM4YixZQUFZLEdBQUcsSUFBSSxDQUFDbUYsZUFBZSxDQUFDbGhCLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM4SixPQUFPLENBQUM4VyxPQUFPLENBQUM7UUFDeEgsT0FBTyxJQUFJLENBQUM5RSxZQUFZO01BQzVCO01BRUEsSUFBSS9iLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN6QyxJQUFJLENBQUM4YixZQUFZLEdBQUcsSUFBSSxDQUFDbUYsZUFBZSxDQUFDbGhCLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDMkosWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdGLE9BQU8sSUFBSSxDQUFDbVMsWUFBWTtNQUM1QjtNQUVBLElBQU1vRixRQUFRLEdBQUcsQ0FDYnpjLE1BQU0sQ0FBQzZCLFFBQVEsQ0FBQzZhLFFBQVEsRUFDeEIsSUFBSSxFQUNKMWMsTUFBTSxDQUFDNkIsUUFBUSxDQUFDOGEsSUFBSSxFQUNwQixHQUFHLENBQ047TUFDRCxJQUFJLENBQUN0RixZQUFZLEdBQUdvRixRQUFRLENBQUM5WSxJQUFJLENBQUMsRUFBRSxDQUFDO01BRXJDLE9BQU8sSUFBSSxDQUFDMFQsWUFBWTtJQUM1Qjs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBYkk7SUFBQWxtQixHQUFBO0lBQUFDLEtBQUEsRUFjQSxTQUFBZ3JCLFNBQUEsRUFBVztNQUNQLElBQUksSUFBSSxDQUFDRixhQUFhLEtBQUssSUFBSSxFQUFFO1FBQzdCLE9BQU8sSUFBSSxDQUFDQSxhQUFhO01BQzdCO01BRUEsSUFBSTVnQixRQUFRLENBQUNDLGFBQWEsQ0FBQyxzQ0FBc0MsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN6RSxJQUFJLENBQUMyZ0IsYUFBYSxHQUFHLElBQUksQ0FBQ00sZUFBZSxDQUFDbGhCLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM4SixPQUFPLENBQUMrVyxRQUFRLENBQUM7UUFDMUgsT0FBTyxJQUFJLENBQUNGLGFBQWE7TUFDN0I7TUFFQSxJQUFJNWdCLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEtBQUssSUFBSSxFQUFFO1FBQzFELElBQUksQ0FBQzJnQixhQUFhLEdBQUcsSUFBSSxDQUFDTSxlQUFlLENBQUNsaEIsUUFBUSxDQUFDQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQzJKLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRyxPQUFPLElBQUksQ0FBQ2dYLGFBQWE7TUFDN0I7TUFFQSxJQUFNTyxRQUFRLEdBQUcsQ0FDYnpjLE1BQU0sQ0FBQzZCLFFBQVEsQ0FBQzZhLFFBQVEsRUFDeEIsSUFBSSxFQUNKMWMsTUFBTSxDQUFDNkIsUUFBUSxDQUFDOGEsSUFBSSxFQUNwQixHQUFHLENBQ047TUFDRCxJQUFJLENBQUNULGFBQWEsR0FBR08sUUFBUSxDQUFDOVksSUFBSSxDQUFDLEVBQUUsQ0FBQztNQUV0QyxPQUFPLElBQUksQ0FBQ3VZLGFBQWE7SUFDN0I7O0lBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkk7SUFBQS9xQixHQUFBO0lBQUFDLEtBQUEsRUFTQSxTQUFBb3JCLGdCQUFnQi9lLEdBQUcsRUFBRTtNQUNqQixJQUFNNmUsUUFBUSxHQUFHLDhEQUE4RDtNQUMvRSxJQUFNRyxRQUFRLEdBQUdILFFBQVEsQ0FBQ2hNLElBQUksQ0FBQzdTLEdBQUcsQ0FBQztNQUNuQyxJQUFNaWYsUUFBUSxHQUFHRCxRQUFRLENBQUMsQ0FBQyxDQUFDO01BQzVCLElBQU1wRCxNQUFNLEdBQUdvRCxRQUFRLENBQUMsQ0FBQyxDQUFDO01BRTFCLElBQUlDLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQ3pYLE9BQU8sQ0FBQ3lYLFFBQVEsQ0FBQzdSLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUN0RSxNQUFNLElBQUl0VixLQUFLLENBQUMsMkJBQTJCLENBQUM7TUFDaEQ7TUFDQSxJQUFJLENBQUM4akIsTUFBTSxFQUFFO1FBQ1QsTUFBTSxJQUFJOWpCLEtBQUssQ0FBQywyQkFBMkIsQ0FBQztNQUNoRDtNQUVBLE9BQVFrSSxHQUFHLENBQUM4QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQ3hCOUIsR0FBRyxNQUFBakMsTUFBQSxDQUNBaUMsR0FBRyxNQUFHO0lBQ25CO0VBQUM7QUFBQSxFQXpKNEI3TCw0REFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWK0M7QUFDTTtBQUNWO0FBQzJCO0FBQ2pCO0FBQ0Y7QUFDWTtBQUNaO0FBQ1Y7QUFDZ0I7QUFDRTtBQUNGO0FBQ0Y7QUFDVjtBQUV2RixDQUFDLFVBQUNvTyxNQUFNLEVBQUs7RUFDVCxJQUFNaFAsU0FBUyxHQUFHLElBQUlvakIsS0FBSyxDQUN2QixJQUFJMkMsMEZBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQ3pCNkYsNkZBQ0osQ0FBQzs7RUFFRDtFQUNBNWMsTUFBTSxDQUFDaFAsU0FBUyxHQUFHQSxTQUFTO0VBQzVCZ1AsTUFBTSxDQUFDK1csU0FBUyxHQUFHL2xCLFNBQVM7RUFDNUJnUCxNQUFNLENBQUM2YyxTQUFTLEdBQUc3ckIsU0FBUztFQUU1QkEsU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxTQUFTLEVBQUU1Yyx3RkFBTyxDQUFDO0VBQ3ZDL0osU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRS9ULDBHQUFnQixDQUFDO0VBQ3pENVMsU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxhQUFhLEVBQUU5USw4RkFBVyxDQUFDO0VBQy9DN1YsU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxZQUFZLEVBQUVwTyw2RkFBVSxDQUFDO0VBQzdDdlksU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxjQUFjLEVBQUUzSSxtR0FBZ0IsQ0FBQztFQUNyRGhlLFNBQVMsQ0FBQzJtQixTQUFTLENBQUMsWUFBWSxFQUFFdkksNkZBQVUsQ0FBQztFQUM3Q3BlLFNBQVMsQ0FBQzJtQixTQUFTLENBQUMsT0FBTyxFQUFFNU0sd0ZBQUssQ0FBQztFQUNuQy9aLFNBQVMsQ0FBQzJtQixTQUFTLENBQUMsZUFBZSxFQUFFaE0sZ0dBQWEsQ0FBQztFQUNuRDNhLFNBQVMsQ0FBQzJtQixTQUFTLENBQUMsZ0JBQWdCLEVBQUUxTCxrR0FBYyxDQUFDO0VBQ3JEamIsU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxlQUFlLEVBQUU3TyxpR0FBYSxDQUFDO0VBQ25EOVgsU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxjQUFjLEVBQUVySixnR0FBWSxDQUFDO0VBQ2pEdGQsU0FBUyxDQUFDMm1CLFNBQVMsQ0FBQyxTQUFTLEVBQUVoSCwyRkFBTyxDQUFDO0VBRXZDM2YsU0FBUyxDQUFDa25CLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBTTtJQUN4QjtJQUNBL2UsS0FBSyxDQUNBQyxJQUFJLENBQUNrQyxRQUFRLENBQUNvRixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNwQ2pILE1BQU0sQ0FBQyxVQUFDdUIsT0FBTztNQUFBLE9BQUtzWCxrQkFBQSxDQUFJdFgsT0FBTyxDQUFDK2dCLFVBQVUsRUFBRXRpQixNQUFNLENBQy9DLFVBQUFxakIsSUFBQTtRQUFBLElBQUczbEIsSUFBSSxHQUFBMmxCLElBQUEsQ0FBSjNsQixJQUFJO1FBQUEsT0FBT0EsSUFBSSxDQUFDcVQsVUFBVSxDQUFDLGVBQWUsQ0FBQztNQUFBLEVBQUMsQ0FBQ3pULE1BQU0sR0FBRyxDQUFDO0lBQUEsQ0FDOUQsQ0FBQyxDQUFDakMsT0FBTyxDQUFDLFVBQUNrRyxPQUFPLEVBQUs7TUFDbkJoSyxTQUFTLENBQUMyZ0IsT0FBTyxDQUFDM1csT0FBTyxDQUFDO0lBQzlCLENBQUMsQ0FBQztFQUNWLENBQUMsQ0FBQztBQUNOLENBQUMsRUFBRWdGLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUNqRFY7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsRUFBRTtBQUN0QyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBLHVFQUF1RTtBQUN2RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBLDZDQUE2QztBQUM3QyxPQUFPO0FBQ1A7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSxLQUFLO0FBQ0w7QUFDQSxvQkFBb0IseUNBQXlDO0FBQzdELG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DLFdBQVc7QUFDOUM7O0FBRTBCOzs7Ozs7O1VDckkxQjtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDekJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsK0JBQStCLHdDQUF3QztXQUN2RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLGtCQUFrQixxQkFBcUI7V0FDdkM7V0FDQTtXQUNBLEtBQUs7V0FDTDtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDM0JBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLE1BQU0scUJBQXFCO1dBQzNCO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTtXQUNBOzs7OztVRWpEQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvUGx1Z2luQmFzZS5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvU2luZ2xldG9uLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L2hhbmRsZXJzL0F0dHJpYnV0ZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Fzc2V0TG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9BdHRhY2hMb2FkaW5nLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9EYXRhQ29uZmlnLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2hMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRm9ybVZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0cmlwZUxvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3R5bGVzaGVldExvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL0lubmVyUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUGx1Z2luTG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9Db29raWUuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL0pzb25QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL1Nhbml0aXplci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC91dGlsaXRpZXMvVXJsLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9qcy9zcmMvYXBwLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy9qcy1jb29raWUvZGlzdC9qcy5jb29raWUubWpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gYmFzZSBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBwbHVnaW5zLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCB0aGUgU25vd2JvYXJkIGZyYW1ld29yayBpbnN0YW5jZSwgYW5kIHNob3VsZCBub3QgYmUgb3ZlcndyaXR0ZW5cbiAgICAgKiB1bmxlc3MgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U25vd2JvYXJkfSBzbm93Ym9hcmRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihzbm93Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRydWUgY29uc3RydWN0b3Igb2YgYSBwbHVnaW4sIGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4uXG4gICAgICogSXQgd2lsbCBiZSBjYWxsZWQgc3RyYWlnaHQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSByZXF1aXJlZCBwbHVnaW5zIGZvciB0aGlzIHNwZWNpZmljIG1vZHVsZSB0byB3b3JrLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwbHVnaW5zIHJlcXVpcmVkIGZvciB0aGlzIG1vZHVsZSB0byB3b3JrLCBhcyBzdHJpbmdzLlxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGxpc3RlbmVyIG1ldGhvZHMgZm9yIGdsb2JhbCBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEZpcmVkIHdoZW4gdGhpcyBwbHVnaW4gaXMgcmVtb3ZlZC4gQ2FuIGJlIG1hbnVhbGx5IGNhbGxlZCBpZiB5b3UgaGF2ZSBhbm90aGVyIHNjZW5hcmlvIGZvclxuICAgICAqIGRlc3RydWN0aW9uLCBpZS4gdGhlIGVsZW1lbnQgYXR0YWNoZWQgdG8gdGhlIHBsdWdpbiBpcyByZW1vdmVkIG9yIGNoYW5nZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNub3dib2FyZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3RvciAob2xkIG1ldGhvZCBuYW1lKS5cbiAgICAgKlxuICAgICAqIEFsbG93cyBwcmV2aW91cyB1c2FnZSBvZiB0aGUgXCJkZXN0cnVjdG9yXCIgbWV0aG9kIHRvIHN0aWxsIHdvcmsuXG4gICAgICovXG4gICAgZGVzdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4vUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogU2luZ2xldG9uIHBsdWdpbiBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGlzIGEgc3BlY2lhbCBkZWZpbml0aW9uIGNsYXNzIHRoYXQgdGhlIFNub3dib2FyZCBmcmFtZXdvcmsgd2lsbCB1c2UgdG8gaW50ZXJwcmV0IHRoZSBjdXJyZW50IHBsdWdpbiBhcyBhXG4gKiBcInNpbmdsZXRvblwiLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiBjbGFzcyBpcyB1c2VkIGFjcm9zcyB0aGUgYm9hcmQuXG4gKlxuICogU2luZ2xldG9ucyBhcmUgaW5pdGlhbGlzZWQgb24gdGhlIFwiZG9tUmVhZHlcIiBldmVudCBieSBkZWZhdWx0LlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBSZXF1ZXN0IHBsdWdpbi5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IEFKQVggaGFuZGxlciB3aGljaCB3aWxsIHJ1biB1c2luZyB0aGUgYGZldGNoKClgIG1ldGhvZCB0aGF0IGlzIGRlZmF1bHQgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyAyIG9yIDMgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIElmIDIgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGhhbmRsZXIgbmFtZSBhbmQgdGhlIHNlY29uZFxuICAgICAqIHBhcmFtZXRlciBpcyB0aGUgb3B0aW9ucy4gVGhpcyBhc3N1bWVzIHRoYXQgdGhpcyBpcyBhIGRldGFjaGVkIEFKQVggcmVxdWVzdCBub3QgY29ubmVjdGVkIHRvXG4gICAgICogYW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIDMgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gZWxlbWVudCBvciBhIHNlbGVjdG9yLCBhbmQgdGhlIHNlY29uZFxuICAgICAqIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIGFyZSB0aGUgaGFuZGxlciBhbmQgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IGhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdChlbGVtZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGJlIGEgaGFuZGxlciBuYW1lLlxuICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoZSByZXF1ZXN0IGlzIGJlaW5nIG1hZGUgYWdhaW5zdCBubyBlbGVtZW50LCBhbmQgdGhlIGhhbmRsZXIgcGFyYW1ldGVyXG4gICAgICAgICAgICAvLyB3aWxsIGNvbnRhaW4gb3B0aW9ucy5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGFuZGxlck5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gaGFuZGxlciB8fCB7fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGVsZW1lbnQgd2FzIGZvdW5kIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yOiAke2VsZW1lbnR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG1hdGNoZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb25zID0ge307XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdCgpO1xuICAgICAgICBpZiAoIXRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U2V0dXAnLCB0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4U2V0dXAnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRvQ2xpZW50VmFsaWRhdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maXJtKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ29uZmlybSgpLnRoZW4oKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX1NVQ0NFU1MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlKHJlc3BvbnNlKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9TVUNDRVNTID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcyBmb3IgdGhpcyBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydjb29raWUnLCAnanNvblBhcnNlciddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgZWxlbWVudCBhbmQgaGFuZGxlciBnaXZlbiBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBjaGVja1JlcXVlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGVsZW1lbnQgcHJvdmlkZWQgbXVzdCBiZSBhbiBFbGVtZW50IGluc3RhbmNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFKQVggaGFuZGxlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNIYW5kbGVyTmFtZSh0aGlzLmhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQUpBWCBoYW5kbGVyIG5hbWUuIFRoZSBjb3JyZWN0IGhhbmRsZXIgbmFtZSBmb3JtYXQgaXM6IFwib25FdmVudFwiLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZldGNoIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtYWRlIGF2YWlsYWJsZSBmb3IgcGx1Z2lucyB0byBleHRlbmQgb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmV0Y2goKSBzZXR0aW5ncyB3aXRoIHRoZWlyIG93bi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGdldEZldGNoKCkge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9ucyA9ICh0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5mZXRjaE9wdGlvbnMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgICAgICAgICBtb2RlOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEZldGNoT3B0aW9ucycsIHRoaXMuZmV0Y2hPcHRpb25zLCB0aGlzKTtcblxuICAgICAgICByZXR1cm4gZmV0Y2godGhpcy51cmwsIHRoaXMuZmV0Y2hPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBvbiB0aGUgZm9ybSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZG9DbGllbnRWYWxpZGF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJWYWxpZGF0ZSA9PT0gdHJ1ZSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY2hlY2tWYWxpZGl0eSgpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBBSkFYIHF1ZXJ5LlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB3aGVuIHRoZSBBSkFYIHJlcXVlc3QgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9BamF4KCkge1xuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgQUpBWCByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEJlZm9yZVNlbmQnLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWpheFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEZldGNoKCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vayAmJiByZXNwb25zZS5zdGF0dXMgIT09IDQwNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykuaW5jbHVkZXMoJy9qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5qc29uKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5tZXNzYWdlICYmIHJlc3BvbnNlRGF0YS5leGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5leGNlcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5maWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLnRyYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRleHQoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VUZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihyZXNwb25zZVRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHByb2Nlc3MgcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKS5pbmNsdWRlcygnL2pzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfV0lOVEVSX1NVQ0NFU1M6IHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9XSU5URVJfUkVTUE9OU0VfQ09ERTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcjogJHtyZXNwb25zZUVycm9yfWApKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhTdGFydCcsIGFqYXhQcm9taXNlLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFByb21pc2UnKTtcbiAgICAgICAgICAgIGV2ZW50LnByb21pc2UgPSBhamF4UHJvbWlzZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhamF4UHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBmb3IgdXBkYXRpbmcgdGhlIHBhcnRpYWxzIGZyb20gdGhlIEFKQVggcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBJZiBhbnkgcGFydGlhbHMgYXJlIHJldHVybmVkIGZyb20gdGhlIEFKQVggcmVzcG9uc2UsIHRoaXMgbWV0aG9kIHdpbGwgYWxzbyBhY3Rpb24gdGhlIHBhcnRpYWwgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIG9iamVjdCB3aGljaCB0cmFja3Mgd2hlbiB0aGUgcGFydGlhbCB1cGRhdGUgaXMgY29tcGxldGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBwcm9jZXNzVXBkYXRlKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJlZm9yZVVwZGF0ZS5hcHBseSh0aGlzLCBbcmVzcG9uc2VdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFeHRyYWN0IHBhcnRpYWwgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxzID0ge307XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDgpICE9PSAnWF9XSU5URVInKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcnRpYWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4QmVmb3JlVXBkYXRlJywgcmVzcG9uc2UsIHRoaXMpO1xuICAgICAgICAgICAgcHJvbWlzZXMudGhlbihcbiAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1VwZGF0ZShwYXJ0aWFscykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgSFRNTCByZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBwYXJ0aWFscyB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnRpYWxzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9VcGRhdGUocGFydGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhZmZlY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXJ0aWFscykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcGFydGlhbCwgY29udGVudF0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvciA9ICh0aGlzLm9wdGlvbnMudXBkYXRlICYmIHRoaXMub3B0aW9ucy51cGRhdGVbcGFydGlhbF0pXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5vcHRpb25zLnVwZGF0ZVtwYXJ0aWFsXVxuICAgICAgICAgICAgICAgICAgICA6IHBhcnRpYWw7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9kZSA9ICdyZXBsYWNlJztcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ2FwcGVuZCc7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpID09PSAnXicpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdwcmVwZW5kJztcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcjJyAmJiBzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ25vb3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXBwZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgKz0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJlcGVuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudCArIGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdub29wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVwbGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWQucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSB1cGRhdGUgZXZlbnQgZm9yIGVhY2ggZWxlbWVudCB0aGF0IGlzIHVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VXBkYXRlJywgZWxlbWVudCwgY29udGVudCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFVwZGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhVcGRhdGVDb21wbGV0ZScsIGFmZmVjdGVkLCB0aGlzKTtcblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIHJlc3BvbnNlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBmbGFzaFxuICAgICAqIG1lc3NhZ2VzIHRvIGhhbmRsZSwgb3IgYW55IHJlZGlyZWN0cyB0byBiZSB1bmRlcnRha2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2VzcyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2Vzcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgYW55IGZ1cnRoZXIgcmVzcG9uc2UgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U3VjY2VzcycsIHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciByZXNwb25zZSBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheERvbmUnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZURhdGEgPSB0aGlzLnJlc3BvbnNlRGF0YTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoICYmIHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NGbGFzaE1lc3NhZ2VzKHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBhIHJlZGlyZWN0IGZyb20gdGhlIHJlc3BvbnNlLCBvciB1c2UgdGhlIHJlZGlyZWN0IGFzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlZGlyZWN0KHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgZXJyb3IgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBlcnJvciBvclxuICAgICAqIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8RXJyb3J9IGVycm9yXG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvcih0aGlzLnJlc3BvbnNlRXJyb3IsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yJywgdGhpcy5yZXNwb25zZUVycm9yLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheEZhaWwnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBza2lwRXJyb3IgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX0ZJRUxEUykge1xuICAgICAgICAgICAgICAgIHNraXBFcnJvciA9IHRoaXMucHJvY2Vzc1ZhbGlkYXRpb25FcnJvcnMoZXJyb3IuWF9XSU5URVJfRVJST1JfRklFTERTKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX01FU1NBR0UgJiYgIXNraXBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5YX1dJTlRFUl9FUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSByZWRpcmVjdCByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2Vzc29yIHdpbGwgc2ltcGx5IHJlZGlyZWN0IHRoZSB1c2VyIGluIHRoZWlyIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheFJlZGlyZWN0YCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBvblxuICAgICAqIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZVJlZGlyZWN0UmVzcG9uc2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiByZWRpcmVjdCB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcm9jZXNzUmVkaXJlY3QodXJsKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCByZWRpcmVjdCBoYW5kbGVyLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgZG9uJ3QgcnVuIHRoZSByZWRpcmVjdC5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlUmVkaXJlY3RSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVSZWRpcmVjdFJlc3BvbnNlLmFwcGx5KHRoaXMsIFt1cmxdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgcmVkaXJlY3RcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4UmVkaXJlY3QnLCB1cmwsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgQUpBWCByZXF1ZXN0IGlzIGZpbmlzaGVkIGlmIHdlJ3JlIHN0aWxsIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgbG9hZGluZyBpbmRpY2F0b3IgZm9yIHJlZGlyZWN0cyB0aGF0IGp1c3QgY2hhbmdlIHRoZSBoYXNoIHZhbHVlIG9mXG4gICAgICAgIC8vIHRoZSBVUkwgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBwYWdlIHdpbGwgcHJvcGVybHkgc3RvcC5cbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2JlcmNtcy9vY3RvYmVyL2lzc3Vlcy8yNzgwXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50TmFtZSA9ICdhamF4UmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3NvciB3aWxsIHNpbXBseSBhbGVydCB0aGUgdXNlciB0aHJvdWdoIGEgc2ltcGxlIGBhbGVydCgpYCBjYWxsLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhFcnJvck1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlRXJyb3JNZXNzYWdlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogZXJyb3IgbWVzc2FnZSBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCBoYW5kbGVyIGZvciBlcnJvciBtZXNzYWdlcy4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvIG5vdCBwcm9jZXNzIHRoZSBlcnJvciBtZXNzYWdlc1xuICAgICAgICAvLyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRXJyb3JNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUVycm9yTWVzc2FnZS5hcHBseSh0aGlzLCBbbWVzc2FnZV0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIHRoZSBlcnJvciBtZXNzYWdlIGJlaW5nIHNob3duXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yTWVzc2FnZScsIG1lc3NhZ2UsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgc2hvdyBhIGJyb3dzZXIgZXJyb3IgbWVzc2FnZVxuICAgICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGZsYXNoIG1lc3NhZ2VzIGZyb20gdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgbm8gZmxhc2ggbWVzc2FnZSBoYW5kbGluZyB3aWxsIG9jY3VyLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhGbGFzaE1lc3NhZ2VzYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUZsYXNoTWVzc2FnZXNgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiBmbGFzaCBtZXNzYWdlIGhhbmRsaW5nIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2VzXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcm9jZXNzRmxhc2hNZXNzYWdlcyhtZXNzYWdlcykge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgZmxhc2ggaGFuZGxlci4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvbid0IHNob3cgdGhlIGZsYXNoIG1lc3NhZ2VcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRmxhc2hNZXNzYWdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVGbGFzaE1lc3NhZ2VzLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4Rmxhc2hNZXNzYWdlcycsIG1lc3NhZ2VzLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIG5vIHZhbGlkYXRpb24gZXJyb3IgaGFuZGxpbmcgd2lsbCBvY2N1ci5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4VmFsaWRhdGlvbkVycm9yc2AgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVWYWxpZGF0aW9uRXJyb3JzYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogdmFsaWRhdGlvbiBlcnJvciBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHNcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzKGZpZWxkcykge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZVZhbGlkYXRpb25FcnJvcnMuYXBwbHkodGhpcywgW3RoaXMuZm9ybSwgZmllbGRzXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgYmVpbmcgaGFuZGxlZFxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhWYWxpZGF0aW9uRXJyb3JzJywgdGhpcy5mb3JtLCBmaWVsZHMsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFzc2V0cyByZXR1cm5lZCBieSBhbiBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBubyBhc3NldCBwcm9jZXNzaW5nIHdpbGwgb2NjdXIgYW5kIHRoaXMgd2lsbCByZXR1cm4gYSByZXNvbHZlZCBQcm9taXNlLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhMb2FkQXNzZXRzYCBldmVudC4gVGhpcyBldmVudCBpcyBjb25zaWRlcmVkIGJsb2NraW5nLCBhbmRcbiAgICAgKiBhbGxvd3MgYXNzZXRzIHRvIGJlIGxvYWRlZCBvciBwcm9jZXNzZWQgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCBhbnkgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFzc2V0c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHByb2Nlc3NBc3NldHMoYXNzZXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5nbG9iYWxQcm9taXNlRXZlbnQoJ2FqYXhMb2FkQXNzZXRzJywgYXNzZXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maXJtcyB0aGUgcmVxdWVzdCB3aXRoIHRoZSB1c2VyIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgbWV0aG9kLiBCeSBkZWZhdWx0LCBpdCB3aWxsIHVzZSB0aGUgYnJvd3NlcidzIGBjb25maXJtKClgIG1ldGhvZCB0byBxdWVyeSB0aGUgdXNlciB0b1xuICAgICAqIGNvbmZpcm0gdGhlIGFjdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBQcm9taXNlIHdpdGggYSBib29sZWFuIHZhbHVlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB1c2VyIGNvbmZpcm1lZFxuICAgICAqIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4Q29uZmlybU1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlQ29uZmlybU1lc3NhZ2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLFxuICAgICAqIHRoZSBjb25maXJtYXRpb24gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gZGVuaWVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYXN5bmMgZG9Db25maXJtKCkge1xuICAgICAgICAvLyBBbGxvdyBmb3IgYSBjdXN0b20gaGFuZGxlciBmb3IgdGhlIGNvbmZpcm1hdGlvbiwgcGVyIHJlcXVlc3QuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlLmFwcGx5KHRoaXMsIFt0aGlzLmNvbmZpcm1dKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gcGx1Z2lucyBoYXZlIGN1c3RvbWlzZWQgdGhlIGNvbmZpcm1hdGlvbiwgdXNlIGEgc2ltcGxlIGJyb3dzZXIgY29uZmlybWF0aW9uLlxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQubGlzdGVuc1RvRXZlbnQoJ2FqYXhDb25maXJtTWVzc2FnZScpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5jb25maXJtKHRoaXMuY29uZmlybSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gY3VzdG9tIHBsdWdpbiBjb25maXJtYXRpb25zXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4Q29uZmlybU1lc3NhZ2UnLCB0aGlzLmNvbmZpcm0sIHRoaXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdWxmaWxsZWQgPSBhd2FpdCBwcm9taXNlcztcbiAgICAgICAgICAgIGlmIChmdWxmaWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIG9mZiBjb21wbGV0aW9uIGV2ZW50cyBmb3IgdGhlIFJlcXVlc3QuXG4gICAgICovXG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGxldGUgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbXBsZXRlKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheERvbmUnLCB0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhBbHdheXMnKTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VEYXRhID0gdGhpcy5yZXNwb25zZURhdGE7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZSBvZmYgdGhlIGRlc3RydWN0b3JcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIGdldCBmb3JtKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5vcHRpb25zLmZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mb3JtO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xvc2VzdCgnZm9ybScpO1xuICAgIH1cblxuICAgIGdldCBjb250ZXh0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBoZWFkZXJzKCkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLCAvLyBLZWVwcyBjb21wYXRpYmlsaXR5IHdpdGggalF1ZXJ5IEFKQVhcbiAgICAgICAgICAgICdYLVdJTlRFUi1SRVFVRVNULUhBTkRMRVInOiB0aGlzLmhhbmRsZXIsXG4gICAgICAgICAgICAnWC1XSU5URVItUkVRVUVTVC1QQVJUSUFMUyc6IHRoaXMuZXh0cmFjdFBhcnRpYWxzKHRoaXMub3B0aW9ucy51cGRhdGUgfHwgW10pLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVdJTlRFUi1SRVFVRVNULUZMQVNIJ10gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMueHNyZlRva2VuKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVhTUkYtVE9LRU4nXSA9IHRoaXMueHNyZlRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9hZGluZyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG5cbiAgICBnZXQgcmVkaXJlY3QoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5vcHRpb25zLnJlZGlyZWN0ICYmIHRoaXMub3B0aW9ucy5yZWRpcmVjdC5sZW5ndGgpID8gdGhpcy5vcHRpb25zLnJlZGlyZWN0IDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZmxhc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmxhc2ggfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVzKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbGVzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoRm9ybURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmRlYnVnKCdUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBmaWxlIHVwbG9hZHMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldCB4c3JmVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5jb29raWUoKS5nZXQoJ1hTUkYtVE9LRU4nKTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9ICh0eXBlb2YgdGhpcy5vcHRpb25zLmRhdGEgPT09ICdvYmplY3QnKSA/IHRoaXMub3B0aW9ucy5kYXRhIDoge307XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5mb3JtIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGdldCBjb25maXJtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbmZpcm0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgcGFydGlhbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXBkYXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBleHRyYWN0UGFydGlhbHModXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh1cGRhdGUpLmpvaW4oJyYnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGFuIGVycm9yIHdpdGggdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIEFKQVggcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIG9yIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVlIHRvIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhjZXB0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGluZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRyYWNlXG4gICAgICogQHJldHVybnMge0Vycm9yfVxuICAgICAqL1xuICAgIHJlbmRlckVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbiwgZmlsZSwgbGluZSwgdHJhY2UpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGVycm9yLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbiB8fCBudWxsO1xuICAgICAgICBlcnJvci5maWxlID0gZmlsZSB8fCBudWxsO1xuICAgICAgICBlcnJvci5saW5lID0gbGluZSB8fCBudWxsO1xuICAgICAgICBlcnJvci50cmFjZSA9IHRyYWNlIHx8IFtdO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGEgZ2l2ZW4gc3RyaW5nIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIEFKQVggaGFuZGxlciBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0hhbmRsZXJOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIC9eKD86XFx3Kzp7Mn0pP29uW0EtWjAtOV0vLnRlc3QobmFtZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi8uLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBFbmFibGUgRGF0YSBBdHRyaWJ1dGVzIEFQSSBmb3IgQUpBWCByZXF1ZXN0cy5cbiAqXG4gKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBBSkFYIGZ1bmN0aW9uYWxpdHkgdGhhdCBpbmNsdWRlcyBoYW5kbGluZyBvZiBIVE1MIGRhdGEgYXR0cmlidXRlcyBmb3IgcHJvY2Vzc2luZ1xuICogQUpBWCByZXF1ZXN0cy4gSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIGJhc2UgQUpBWCBmdW5jdGlvbmFsaXR5IHRvIGFsbG93IGRldmVsb3BlcnMgdG8gb3B0LW91dCBvZiBkYXRhIGF0dHJpYnV0ZVxuICogcmVxdWVzdHMgaWYgdGhleSBkbyBub3QgaW50ZW5kIHRvIHVzZSB0aGVtLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRyaWJ1dGVSZXF1ZXN0IGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTZXR1cDogJ29uQWpheFNldHVwJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkeSBldmVudCBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEF0dGFjaGVzIGhhbmRsZXJzIHRvIHRoZSB3aW5kb3cgdG8gbGlzdGVuIGZvciBhbGwgcmVxdWVzdCBpbnRlcmFjdGlvbnMuXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoSGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCcsICdqc29uUGFyc2VyJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIERldGFjaGVzIGFsbCBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5kZXRhY2hIYW5kbGVycygpO1xuXG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGF0dGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBkZWZhdWx0IGZvcm0gdmFsaWRhdGlvbiBmb3IgQUpBWCBmb3Jtcy5cbiAgICAgKlxuICAgICAqIEEgZm9ybSB0aGF0IGNvbnRhaW5zIGEgYGRhdGEtcmVxdWVzdGAgYXR0cmlidXRlIHRvIHNwZWNpZnkgYW4gQUpBWCBjYWxsIHdpdGhvdXQgaW5jbHVkaW5nIGEgYGRhdGEtYnJvd3Nlci12YWxpZGF0ZWBcbiAgICAgKiBhdHRyaWJ1dGUgbWVhbnMgdGhhdCB0aGUgQUpBWCBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGxpa2VseSBiZSBoYW5kbGluZyB0aGUgdmFsaWRhdGlvbiBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24oKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm1bZGF0YS1yZXF1ZXN0XTpub3QoW2RhdGEtYnJvd3Nlci12YWxpZGF0ZV0pJykuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ25vdmFsaWRhdGUnLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGRldGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGNoYW5nZXMgdG8gc2VsZWN0LCByYWRpbywgY2hlY2tib3ggYW5kIGZpbGUgaW5wdXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBjaGFuZ2VIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGNoYW5naW5nIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ3NlbGVjdFtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWZpbGVdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjbGlja3Mgb24gaHlwZXJsaW5rcyBhbmQgYnV0dG9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgZXZlbnQgY2FuIGJ1YmJsZSB1cCB0aGUgaGllcmFyY2h5IHRvIGZpbmQgYSBzdWl0YWJsZSByZXF1ZXN0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50RWxlbWVudC5tYXRjaGVzKFxuICAgICAgICAgICAgICAgICdhW2RhdGEtcmVxdWVzdF0sIGJ1dHRvbltkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWJ1dHRvbl1bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1zdWJtaXRdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5IHByZXNzZXMgb24gaW5wdXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGtleURvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGlucHV0dGluZyBpbnRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgdHlwZSBpcyB2YWxpZFxuICAgICAgICBjb25zdCB2YWxpZFR5cGVzID0gW1xuICAgICAgICAgICAgJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAnZGF0ZXRpbWUnLFxuICAgICAgICAgICAgJ2RhdGV0aW1lLWxvY2FsJyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICdyYWRpbycsXG4gICAgICAgICAgICAncmFuZ2UnLFxuICAgICAgICAgICAgJ3NlYXJjaCcsXG4gICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd0aW1lJyxcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICAgJ3dlZWsnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAodmFsaWRUeXBlcy5pbmRleE9mKGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtcmVxdWVzdF0nKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtdHJhY2staW5wdXRdJykpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tJbnB1dChldmVudC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzdWJtaXRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIHN1Ym1pdHRpbmcgYSB2YWxpZCBmb3JtXG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAnZm9ybVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgcmVxdWVzdCBvbiBhIGdpdmVuIGVsZW1lbnQsIHVzaW5nIGl0cyBkYXRhIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBTdHJpbmcoZGF0YS5yZXF1ZXN0KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNvbmZpcm06ICgncmVxdWVzdENvbmZpcm0nIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdENvbmZpcm0pIDogbnVsbCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiAoJ3JlcXVlc3RSZWRpcmVjdCcgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0UmVkaXJlY3QpIDogbnVsbCxcbiAgICAgICAgICAgIGxvYWRpbmc6ICgncmVxdWVzdExvYWRpbmcnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdExvYWRpbmcpIDogbnVsbCxcbiAgICAgICAgICAgIGZsYXNoOiAoJ3JlcXVlc3RGbGFzaCcgaW4gZGF0YSksXG4gICAgICAgICAgICBmaWxlczogKCdyZXF1ZXN0RmlsZXMnIGluIGRhdGEpLFxuICAgICAgICAgICAgYnJvd3NlclZhbGlkYXRlOiAoJ3JlcXVlc3RCcm93c2VyVmFsaWRhdGUnIGluIGRhdGEpLFxuICAgICAgICAgICAgZm9ybTogKCdyZXF1ZXN0Rm9ybScgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0Rm9ybSkgOiBudWxsLFxuICAgICAgICAgICAgdXJsOiAoJ3JlcXVlc3RVcmwnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdFVybCkgOiBudWxsLFxuICAgICAgICAgICAgdXBkYXRlOiAoJ3JlcXVlc3RVcGRhdGUnIGluIGRhdGEpID8gdGhpcy5wYXJzZURhdGEoU3RyaW5nKGRhdGEucmVxdWVzdFVwZGF0ZSkpIDogW10sXG4gICAgICAgICAgICBkYXRhOiAoJ3JlcXVlc3REYXRhJyBpbiBkYXRhKSA/IHRoaXMucGFyc2VEYXRhKFN0cmluZyhkYXRhLnJlcXVlc3REYXRhKSkgOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5yZXF1ZXN0KGVsZW1lbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYW4gQUpBWCByZXF1ZXN0IHZpYSBIVE1MIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKi9cbiAgICBvbkFqYXhTZXR1cChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSByZXF1ZXN0LmVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0UGFyZW50UmVxdWVzdERhdGEocmVxdWVzdC5lbGVtZW50KSxcbiAgICAgICAgICAgIC4uLnJlcXVlc3Qub3B0aW9ucy5kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24nKSAmJiAhcmVxdWVzdC5mb3JtICYmIGZpZWxkTmFtZSAmJiAhcmVxdWVzdC5vcHRpb25zLmRhdGFbZmllbGROYW1lXSkge1xuICAgICAgICAgICAgZGF0YVtmaWVsZE5hbWVdID0gcmVxdWVzdC5lbGVtZW50LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5vcHRpb25zLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhbmQgY29sbGF0ZXMgYWxsIGRhdGEgZnJvbSBlbGVtZW50cyB1cCB0aGUgRE9NIGhpZXJhcmNoeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXRQYXJlbnRSZXF1ZXN0RGF0YSh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMucmV2ZXJzZSgpO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgICAgICBpZiAoJ3JlcXVlc3REYXRhJyBpbiBlbGVtZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyc2VEYXRhKGVsZW1lbnREYXRhLnJlcXVlc3REYXRhKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgZGF0YSBpbiB0aGUgV2ludGVyL09jdG9iZXIgSlNPTiBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgcGFyc2VEYXRhKGRhdGEpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvbnBhcnNlcigpLnBhcnNlKGB7JHtkYXRhfX1gKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nIHRoZSBkYXRhIGF0dHJpYnV0ZSBvbiBlbGVtZW50OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrSW5wdXQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZSB9ID0gZWxlbWVudC5kYXRhc2V0O1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGVsZW1lbnQuZGF0YXNldC50cmFja0lucHV0IHx8IDMwMDtcblxuICAgICAgICBpZiAobGFzdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbGFzdFZhbHVlID09PSBlbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpO1xuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBoaWVyYXJjaHkgYW5kIGZpbmQgYSBmb3JtIHRoYXQgc2VuZHMgYW4gQUpBWCBxdWVyeVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBjdXJyZW50RWxlbWVudC5kYXRhc2V0LnJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIHJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQXNzZXQgTG9hZGVyLlxuICpcbiAqIFByb3ZpZGVzIHNpbXBsZSBhc3NldCBsb2FkaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIFNub3dib2FyZCwgbWFraW5nIGl0IGVhc3kgdG8gcHJlLWxvYWQgaW1hZ2VzIG9yXG4gKiBpbmNsdWRlIEphdmFTY3JpcHQgb3IgQ1NTIGFzc2V0cyBvbiB0aGUgZmx5LlxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoaXMgbG9hZGVyIHdpbGwgbGlzdGVuIHRvIGFueSBhc3NldHMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkIHRvIGxvYWQgaW4gYW4gQUpBWFxuICogcmVzcG9uc2UsIHN1Y2ggYXMgcmVzcG9uc2VzIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogWW91IGNhbiBhbHNvIGxvYWQgYXNzZXRzIG1hbnVhbGx5IGJ5IGNhbGxpbmcgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBgYGBqc1xuICogU25vd2JvYXJkLmFkZFBsdWdpbignYXNzZXRMb2FkZXInLCBBc3NldExvYWRlcik7XG4gKiBTbm93Ym9hcmQuYXNzZXRMb2FkZXIoKS5wcm9jZXNzQXNzZXRzKGFzc2V0cyk7XG4gKiBgYGBcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXNzZXRMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFqYXhMb2FkQXNzZXRzOiAnbG9hZCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYW5kIGxvYWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogVGhlIGBhc3NldHNgIHByb3BlcnR5IG9mIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGFuIG9iamVjdCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGtleXMgYW5kIGFuXG4gICAgICogYXJyYXkgb2YgcGF0aHM6XG4gICAgICpcbiAgICAgKiAtIGBqc2A6IEFuIGFycmF5IG9mIEphdmFTY3JpcHQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgY3NzYDogQW4gYXJyYXkgb2YgQ1NTIHN0eWxlc2hlZXQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgaW1nYDogQW4gYXJyYXkgb2YgaW1hZ2UgVVJMcyB0byBwcmUtbG9hZFxuICAgICAqXG4gICAgICogQm90aCBganNgIGFuZCBgY3NzYCBmaWxlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5qZWN0ZWQsIGhvd2V2ZXIgYGltZ2AgZmlsZXMgd2lsbCBub3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCByZXF1aXJlZCBhc3NldHMgYXJlIGxvYWRlZC4gSWYgYW5cbiAgICAgKiBhc3NldCBmYWlscyB0byBsb2FkLCB0aGlzIFByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEVTTGludCAqUkVBTExZKiBkb2Vzbid0IGxpa2UgdGhpcyBjb2RlLCBidXQgaWdub3JlIGl0LiBJdCdzIHRoZSBvbmx5IHdheSBpdCB3b3Jrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhc3NldHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGFzc2V0cykge1xuICAgICAgICBpZiAoYXNzZXRzLmpzICYmIGFzc2V0cy5qcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBhc3NldHMuanMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3NldHMuY3NzICYmIGFzc2V0cy5jc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBhc3NldHMuY3NzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU3R5bGUoc3R5bGUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2V0cy5pbWcgJiYgYXNzZXRzLmltZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGFzc2V0cy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbWFnZShpbWFnZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBhbmQgbG9hZHMgYSBKYXZhU2NyaXB0IFVSTCBpbnRvIHRoZSBET00uXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBjbG9zaW5nIGA8L2JvZHk+YCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NyaXB0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZFNjcmlwdChzY3JpcHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgc2NyaXB0IFVSTFxuICAgICAgICAgICAgc2NyaXB0ID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc2NyaXB0KTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBzY3JpcHQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHtzY3JpcHR9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHNjcmlwdFxuICAgICAgICAgICAgY29uc3QgZG9tU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBkb21TY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgICAgICAgICAgZG9tU2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgc2NyaXB0KTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnc2NyaXB0Jywgc2NyaXB0LCBkb21TY3JpcHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tU2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzY3JpcHQnLCBzY3JpcHQsIGRvbVNjcmlwdCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgc2NyaXB0IGZpbGU6IFwiJHtzY3JpcHR9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRvbVNjcmlwdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdHMgYW5kIGxvYWRzIGEgQ1NTIHN0eWxlc2hlZXQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogVGhlIHN0eWxlc2hlZXQgd2lsbCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhlIGNsb3NpbmcgYDwvaGVhZD5gIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHlsZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRTdHlsZShzdHlsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBzdHlsZSBVUkxcbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc3R5bGUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHN0eWxlc2hlZXQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1baHJlZj1cIiR7c3R5bGV9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHN0eWxlc2hlZXRcbiAgICAgICAgICAgIGNvbnN0IGRvbUNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgIGRvbUNzcy5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XG4gICAgICAgICAgICBkb21Dc3Muc2V0QXR0cmlidXRlKCdocmVmJywgc3R5bGUpO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmxvYWRlZCcsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIHN0eWxlc2hlZXQgZmlsZTogXCIke3N0eWxlfVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChkb21Dc3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmUtbG9hZHMgYW4gaW1hZ2UuXG4gICAgICpcbiAgICAgKiBUaGUgaW1hZ2Ugd2lsbCBub3QgYmUgaW5qZWN0ZWQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGltYWdlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZEltYWdlKGltYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHNjcmlwdCBVUkxcbiAgICAgICAgICAgIGltYWdlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoaW1hZ2UpO1xuXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBpbWFnZSBmaWxlOiBcIiR7aW1hZ2V9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5zcmMgPSBpbWFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBBbGxvd3MgYXR0YWNoaW5nIGEgbG9hZGluZyBjbGFzcyBvbiBlbGVtZW50cyB0aGF0IGFuIEFKQVggcmVxdWVzdCBpcyB0YXJnZXRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dGFjaExvYWRpbmcgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5pY2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWpheFN0YXJ0OiAnYWpheFN0YXJ0JyxcbiAgICAgICAgICAgIGFqYXhEb25lOiAnYWpheERvbmUnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFqYXhTdGFydChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgY29uc3QgbG9hZEVsZW1lbnRzID0gcmVxdWVzdC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWF0dGFjaC1sb2FkaW5nXScpO1xuICAgICAgICAgICAgaWYgKGxvYWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9hZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKHJlcXVlc3QuZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWpheERvbmUoZGF0YSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRFbGVtZW50cyA9IHJlcXVlc3QuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hdHRhY2gtbG9hZGluZ10nKTtcbiAgICAgICAgICAgIGlmIChsb2FkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxvYWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5lbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhyZXF1ZXN0LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExvYWRpbmdDbGFzcyhlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAoZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gJycpXG4gICAgICAgICAgICA/IGVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nXG4gICAgICAgICAgICA6ICd3bi1sb2FkaW5nJztcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogRGF0YSBjb25maWd1cmF0aW9uIHByb3ZpZGVyLlxuICpcbiAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBwYXNzaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSB0aHJvdWdoIGFuIGVsZW1lbnQncyBkYXRhIGF0dHJpYnV0ZXMuIFRoaXNcbiAqIGlzIGdlbmVyYWxseSB1c2VkIGZvciB3aWRnZXRzIG9yIFVJIGludGVyYWN0aW9ucyB0byBjb25maWd1cmUgdGhlbS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YUNvbmZpZyBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbG9jYWxDb25maWdcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoaW5zdGFuY2UsIGVsZW1lbnQsIGxvY2FsQ29uZmlnKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBTbm93Ym9hcmQgcGx1Z2luIHRvIGVuYWJsZSBkYXRhIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgZXh0cmFjdGVkIGZyb20gSFRNTCBlbGVtZW50cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmxvY2FsQ29uZmlnID0gbG9jYWxDb25maWcgfHwge307XG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25maWcgPSB7fTtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlnIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIGBjb25maWdgIHBhcmFtZXRlciBpcyB1bnNwZWNpZmllZCwgcmV0dXJucyB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnXG4gICAgICovXG4gICAgZ2V0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb25maWcgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUsIGF0IHJ1bnRpbWUsIGFueSBjb25maWd1cmF0aW9uIHZhbHVlIGFzIG5lY2Vzc2FyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RcbiAgICAgKi9cbiAgICBzZXQoY29uZmlnLCB2YWx1ZSwgcGVyc2lzdCkge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGNvbmZpZ3VyYXRpb24ga2V5IHRvIHNldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHBlcnNpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhc2V0W2NvbmZpZ10gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxDb25maWdbY29uZmlnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaGVzIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIG1ha2UgY2hhbmdlcyB0byB0aGUgZGF0YSBjb25maWcgb24gYSBET00gbGV2ZWwgYW5kIHJlLWFwcGx5IHRoZW1cbiAgICAgKiB0byB0aGUgY29uZmlnIG9uIHRoZSBKYXZhU2NyaXB0IHNpZGUuXG4gICAgICovXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB0aGlzLmdldEFjY2VwdGVkQ29uZmlncygpO1xuICAgICAgICB0aGlzLmluc3RhbmNlQ29uZmlnID0gdGhpcy5wcm9jZXNzQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkYXRhIGNvbmZpZy5cbiAgICAgKlxuICAgICAqIElmIGFuIGluc3RhbmNlIGhhcyBhbiBgYWNjZXB0QWxsRGF0YUNvbmZpZ3NgIHByb3BlcnR5LCBzZXQgdG8gYHRydWVgLCB0aGVuIGFsbCBkYXRhXG4gICAgICogYXR0cmlidXRlcyB3aWxsIGJlIGF2YWlsYWJsZSBhcyBjb25maWd1cmF0aW9uIHZhbHVlcy4gVGhpcyBjYW4gYmUgYSBzZWN1cml0eSBjb25jZXJuLCBzb1xuICAgICAqIHRyZWFkIGNhcmVmdWxseS5cbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSwgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUga2V5cyBhdmFpbGFibGUgaW4gYW4gb2JqZWN0XG4gICAgICogcmV0dXJuZWQgYnkgYSBgZGVmYXVsdHMoKWAgbWV0aG9kIGluIHRoZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXXxib29sZWFufVxuICAgICAqL1xuICAgIGdldEFjY2VwdGVkQ29uZmlncygpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5hY2NlcHRBbGxEYXRhQ29uZmlncyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0aGlzLmluc3RhbmNlLmFjY2VwdEFsbERhdGFDb25maWdzID09PSB0cnVlXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlZmF1bHRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnN0YW5jZSBlaXRoZXIgZG9lcyBub3QgaGF2ZSBhIGBkZWZhdWx0cygpYCBtZXRob2QsIG9yXG4gICAgICogdGhlIG1ldGhvZCBpdHNlbGYgZG9lcyBub3QgcmV0dXJuIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBMb2FkcyB1cCB0aGUgZGVmYXVsdHMsIHRoZW4gcG9wdWxhdGVzIGl0IHdpdGggYW55IGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBkYXRhXG4gICAgICogYXR0cmlidXRlcywgYmFzZWQgb24gdGhlIHJ1bGVzIG9mIHRoZSBhY2NlcHRlZCBjb25maWd1cmF0aW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgdGhlbiBjYWNoZWQgYW5kIGF2YWlsYWJsZSB0aHJvdWdoIGBjb25maWcuZ2V0KClgIGNhbGxzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBwcm9jZXNzQ29uZmlnKCkge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldERlZmF1bHRzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDb25maWdzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZWxlbWVudC5kYXRhc2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY2NlcHRlZENvbmZpZ3MgPT09IHRydWUgfHwgdGhpcy5hY2NlcHRlZENvbmZpZ3MuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5jb2VyY2VWYWx1ZSh0aGlzLmVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubG9jYWxDb25maWcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ29uZmlncyA9PT0gdHJ1ZSB8fCB0aGlzLmFjY2VwdGVkQ29uZmlncy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmxvY2FsQ29uZmlnW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29lcmNlcyBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgSmF2YVNjcmlwdC5cbiAgICAgKlxuICAgICAqIFRha2VzIHRoZSBzdHJpbmcgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YSBhdHRyaWJ1dGUgYW5kIGNvZXJjZXMgaXQgaW50byBhIG1vcmUgc3VpdGFibGVcbiAgICAgKiB0eXBlIGZvciBKYXZhU2NyaXB0IHByb2Nlc3NpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgY29lcmNlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXG4gICAgICAgIC8vIE51bGwgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5kZWZpbmVkIHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYXNlNjQgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlLnN0YXJ0c1dpdGgoJ2Jhc2U2NDonKSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0c3RyID0gc3RyaW5nVmFsdWUucmVwbGFjZSgvXmJhc2U2NDovLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihiYXNlNjRzdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29lcmNlVmFsdWUoZGVjb2RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb29sZWFuIHZhbHVlXG4gICAgICAgIGlmIChbJ3RydWUnLCAneWVzJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChbJ2ZhbHNlJywgJ25vJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE51bWVyaWMgdmFsdWVcbiAgICAgICAgaWYgKC9eWy0rXT9bMC05XSsoXFwuWzAtOV0rKT8kLy50ZXN0KHN0cmluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihzdHJpbmdWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKU09OIHZhbHVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvblBhcnNlcigpLnBhcnNlKHN0cmluZ1ZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIChzdHJpbmdWYWx1ZSA9PT0gJycpID8gdHJ1ZSA6IHN0cmluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGZsYXNoIG1lc3NhZ2VzIGZvciB0aGUgQ01TLlxuICpcbiAqIEZsYXNoIG1lc3NhZ2VzIHdpbGwgcG9wIHVwIGF0IHRoZSB0b3AgY2VudGVyIG9mIHRoZSBwYWdlIGFuZCB3aWxsIHJlbWFpbiBmb3IgNyBzZWNvbmRzIGJ5IGRlZmF1bHQuIEhvdmVyaW5nIG92ZXJcbiAqIHRoZSBtZXNzYWdlIHdpbGwgcmVzZXQgYW5kIHBhdXNlIHRoZSB0aW1lci4gQ2xpY2tpbmcgb24gdGhlIGZsYXNoIG1lc3NhZ2Ugd2lsbCBkaXNtaXNzIGl0LlxuICpcbiAqIEFyZ3VtZW50czpcbiAqICAtIFwibWVzc2FnZVwiOiBUaGUgY29udGVudCBvZiB0aGUgZmxhc2ggbWVzc2FnZS4gSFRNTCBpcyBhY2NlcHRlZC5cbiAqICAtIFwidHlwZVwiOiBUaGUgdHlwZSBvZiBmbGFzaCBtZXNzYWdlLiBUaGlzIGlzIGFwcGVuZGVkIGFzIGEgY2xhc3MgdG8gdGhlIGZsYXNoIG1lc3NhZ2UgaXRzZWxmLlxuICogIC0gXCJkdXJhdGlvblwiOiBIb3cgbG9uZyB0aGUgZmxhc2ggbWVzc2FnZSB3aWxsIHN0YXkgdmlzaWJsZSBmb3IsIGluIHNlY29uZHMuIERlZmF1bHQ6IDcgc2Vjb25kcy5cbiAqXG4gKiBVc2FnZTpcbiAqICAgICAgU25vd2JvYXJkLmZsYXNoKCdUaGlzIGlzIGEgZmxhc2ggbWVzc2FnZScsICdpbmZvJywgOCk7XG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsYXNoIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0KG1lc3NhZ2UsIHR5cGUsIGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgJ2RlZmF1bHQnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gTnVtYmVyKGR1cmF0aW9uIHx8IDcpO1xuXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFzaCBkdXJhdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBvciB6ZXJvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsndHJhbnNpdGlvbiddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBmbGFzaCBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRpbWVvdXQgaXMgY2xlYXJlZCBpZiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2hUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2gpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2guY3JlYXRlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5mbGFzaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICB0aGlzLmZsYXNoLmlubmVySFRNTCA9IHRoaXMubWVzc2FnZTtcbiAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCdmbGFzaC1tZXNzYWdlJywgdGhpcy50eXBlKTtcbiAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY29udHJvbCcpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5yZW1vdmUoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4gdGhpcy5zdG9wVGltZXIoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB0aGlzLnN0YXJ0VGltZXIoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lci5jbGFzc0xpc3QuYWRkKCdmbGFzaC10aW1lcicpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoVGltZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCduby10aW1lcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGJvZHlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdzaG93JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2gucmVtb3ZlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdoaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2ggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGZsYXNoIG1lc3NhZ2VzIGF2YWlsYWJsZSBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSA+IGRpdi5mbGFzaC1tZXNzYWdlJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5yZW1vdmUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSB0aW1lciBmb3IgdGhpcyBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YXJ0VGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbWVyVHJhbnMgPSB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2hUaW1lciwgJ3RpbWVvdXQnLCBudWxsLCBgJHt0aGlzLmR1cmF0aW9ufS4wc2AsIHRydWUpO1xuICAgICAgICB0aGlzLnRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW1vdmUoKSwgdGhpcy5kdXJhdGlvbiAqIDEwMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdGltZXIgZm9yIHRoaXMgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzdG9wVGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyVHJhbnMpIHtcbiAgICAgICAgICAgIHRoaXMudGltZXJUcmFucy5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRGVmaW5lcyBhIGRlZmF1bHQgbGlzdGVuZXIgZm9yIGZsYXNoIGV2ZW50cy5cbiAqXG4gKiBDb25uZWN0cyB0aGUgRmxhc2ggcGx1Z2luIHRvIHZhcmlvdXMgZXZlbnRzIHRoYXQgdXNlIGZsYXNoIG1lc3NhZ2VzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbGFzaExpc3RlbmVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuaWNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ2ZsYXNoJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhFcnJvck1lc3NhZ2U6ICdhamF4RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgIGFqYXhGbGFzaE1lc3NhZ2VzOiAnYWpheEZsYXNoTWVzc2FnZXMnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvIGZsYXNoIG1lc3NhZ2VzIGZvciBQSFAgZmxhc2ggcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIHJlYWR5KCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jb250cm9sPVwiZmxhc2gtbWVzc2FnZVwiXScpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5mbGFzaFR5cGUsXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmZsYXNoRHVyYXRpb24sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhIGZsYXNoIG1lc3NhZ2UgZm9yIEFKQVggZXJyb3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBhamF4RXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBmbGFzaCBtZXNzYWdlcyByZXR1cm5lZCBkaXJlY3RseSBmcm9tIEFKQVggZnVuY3Rpb25hbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlc1xuICAgICAqL1xuICAgIGFqYXhGbGFzaE1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG1lc3NhZ2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Nzc0NsYXNzLCBtZXNzYWdlXSA9IGVudHJ5O1xuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgY3NzQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQWRkcyBBSkFYLWRyaXZlbiBmb3JtIHZhbGlkYXRpb24gdG8gU25vd2JvYXJkIHJlcXVlc3RzLlxuICpcbiAqIERvY3VtZW50YXRpb24gZm9yIHRoaXMgZmVhdHVyZSBjYW4gYmUgZm91bmQgaGVyZTpcbiAqIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3Nub3dib2FyZC9leHRyYXMjYWpheC12YWxpZGF0aW9uXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1WYWxpZGF0aW9uIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZXJyb3JCYWdzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2NsZWFyVmFsaWRhdGlvbicsXG4gICAgICAgICAgICBhamF4VmFsaWRhdGlvbkVycm9yczogJ2RvVmFsaWRhdGlvbicsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZHkgZXZlbnQgaGFuZGxlci5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0RXJyb3JCYWdzKGRvY3VtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhbiBBSkFYIHJlc3BvbnNlIGFuZCBwYXNzZXMgdGhlbSB0aHJvdWdoIHRvIHRoZSBlcnJvciBiYWdzLlxuICAgICAqXG4gICAgICogVGhpcyBoYW5kbGVyIHJldHVybnMgZmFsc2UgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIHZhbGlkYXRpb24gaGFuZGxpbmcsIGFuZCBwcmV2ZW50cyB0aGUgZmxhc2hcbiAgICAgKiBtZXNzYWdlIHRoYXQgaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQgZm9yIGZpZWxkIGVycm9ycyBpbiBBSkFYIHJlcXVlc3RzIGZyb20gc2hvd2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBkb1ZhbGlkYXRpb24oZm9ybSwgaW52YWxpZEZpZWxkcywgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LnJlcXVlc3RWYWxpZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gZm9ybSk7XG4gICAgICAgIGVycm9yQmFncy5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFueSB2YWxpZGF0aW9uIGVycm9ycyBpbiB0aGUgZ2l2ZW4gZm9ybS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJvbWlzZVxuICAgICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNsZWFyVmFsaWRhdGlvbihwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50LmRhdGFzZXQucmVxdWVzdFZhbGlkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlcXVlc3QuZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gcmVxdWVzdC5mb3JtKTtcbiAgICAgICAgZXJyb3JCYWdzLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVFcnJvckJhZyhlcnJvckJhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIGVycm9yIGJhZ3MgKGVsZW1lbnRzIHdpdGggXCJkYXRhLXZhbGlkYXRlLWVycm9yXCIgYXR0cmlidXRlKSBhbmQgbGlua3MgdGhlbSB0byBhXG4gICAgICogcGxhY2Vob2xkZXIgYW5kIGZvcm0uXG4gICAgICpcbiAgICAgKiBUaGUgZXJyb3IgYmFncyB3aWxsIGJlIGluaXRpYWxseSBoaWRkZW4sIGFuZCB3aWxsIG9ubHkgc2hvdyB3aGVuIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdE5vZGVcbiAgICAgKi9cbiAgICBjb2xsZWN0RXJyb3JCYWdzKHJvb3ROb2RlKSB7XG4gICAgICAgIHJvb3ROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXSwgW2RhdGEtdmFsaWRhdGUtZm9yXScpLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZXJyb3JCYWcuY2xvc2VzdCgnZm9ybVtkYXRhLXJlcXVlc3QtdmFsaWRhdGVdJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgZXJyb3IgYmFnIGRvZXMgbm90IHJlc2lkZSB3aXRoaW4gYSB2YWxpZGF0aW5nIGZvcm0sIHJlbW92ZSBpdFxuICAgICAgICAgICAgaWYgKCFmb3JtKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlcnJvckJhZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5kIG1lc3NhZ2UgbGlzdCBub2RlLCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCBtZXNzYWdlTGlzdEVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVycm9yQmFnLm1hdGNoZXMoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXScpKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50ID0gZXJyb3JCYWcucXVlcnlTZWxlY3RvcignW2RhdGEtbWVzc2FnZV0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgbm9kZVxuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXJyb3IgYmFnIGFuZCByZXBsYWNlIHdpdGggcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yQmFnRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlcnJvckJhZyxcbiAgICAgICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9yOiAoZXJyb3JCYWcuZGF0YXNldC52YWxpZGF0ZUZvcilcbiAgICAgICAgICAgICAgICAgICAgPyBlcnJvckJhZy5kYXRhc2V0LnZhbGlkYXRlRm9yLnNwbGl0KC9cXHMqLFxccyovKVxuICAgICAgICAgICAgICAgICAgICA6ICcqJyxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQ6IChtZXNzYWdlTGlzdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZUxpc3RFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RBbmNob3I6IG51bGwsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZTogKGVycm9yQmFnLmRhdGFzZXQudmFsaWRhdGVGb3IpXG4gICAgICAgICAgICAgICAgICAgID8gKGVycm9yQmFnLnRleHRDb250ZW50ICE9PSAnJyB8fCBlcnJvckJhZy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBJZiBhbiBtZXNzYWdlIGxpc3QgZWxlbWVudCBleGlzdHMsIGNyZWF0ZSBhbm90aGVyIHBsYWNlaG9sZGVyIHRvIGFjdCBhcyBhbiBhbmNob3IgcG9pbnRcbiAgICAgICAgICAgIGlmIChtZXNzYWdlTGlzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlTGlzdEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtZXNzYWdlTGlzdEFuY2hvciwgbWVzc2FnZUxpc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlcnJvckJhZ0RhdGEubWVzc2FnZUxpc3RBbmNob3IgPSBtZXNzYWdlTGlzdEFuY2hvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocGxhY2Vob2xkZXIsIGVycm9yQmFnKTtcblxuICAgICAgICAgICAgdGhpcy5lcnJvckJhZ3MucHVzaChlcnJvckJhZ0RhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlcyBhbiBlcnJvciBiYWcsIHJlcGxhY2luZyB0aGUgZXJyb3IgbWVzc2FnZXMgd2l0aCBhIHBsYWNlaG9sZGVyIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKi9cbiAgICBoaWRlRXJyb3JCYWcoZXJyb3JCYWcpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZXJyb3JCYWcucGxhY2Vob2xkZXIsIGVycm9yQmFnLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYW4gZXJyb3IgYmFnIHdpdGggdGhlIGdpdmVuIGludmFsaWQgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKi9cbiAgICBzaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVycm9yQmFnLmVsZW1lbnQsIGVycm9yQmFnLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvckJhZy52YWxpZGF0ZUZvciAhPT0gJyonKSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yQmFnLmN1c3RvbU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZpZWxkID0gT2JqZWN0LmtleXMoaW52YWxpZEZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGVycm9yQmFnLnZhbGlkYXRlRm9yLmluY2x1ZGVzKGZpZWxkKSlcbiAgICAgICAgICAgICAgICAgICAgLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgW2Vycm9yQmFnLmVsZW1lbnQuaW5uZXJIVE1MXSA9IGludmFsaWRGaWVsZHNbZmlyc3RGaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JCYWcubWVzc2FnZUxpc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdmFsaWRhdGlvbi1tZXNzYWdlXScpLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaW52YWxpZEZpZWxkcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbLCBlcnJvcnNdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBlcnJvckJhZy5tZXNzYWdlTGlzdEVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5kYXRhc2V0LnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmlubmVySFRNTCA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICBlcnJvckJhZy5tZXNzYWdlTGlzdEFuY2hvci5hZnRlcihtZXNzYWdlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFtlcnJvckJhZy5lbGVtZW50LmlubmVySFRNTF0gPSBpbnZhbGlkRmllbGRzW09iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpLnNoaWZ0KCldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGVycm9yIGJhZyBhcHBsaWVzIGZvciB0aGUgZ2l2ZW4gaW52YWxpZCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW52YWxpZEZpZWxkc1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLnZhbGlkYXRlRm9yID09PSAnKicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZXJyb3JCYWcudmFsaWRhdGVGb3IuaW5jbHVkZXMoZmllbGQpKVxuICAgICAgICAgICAgLmxlbmd0aCA+IDA7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBEaXNwbGF5cyBhIHN0cmlwZSBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHRoYXQgaW5kaWNhdGVzIGxvYWRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0cmlwZUxvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmljZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydyZXF1ZXN0J107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2FqYXhTdGFydCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuY291bnRlciA9IDA7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVTdHJpcGUoKTtcbiAgICB9XG5cbiAgICBhamF4U3RhcnQocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5vcHRpb25zLnN0cmlwZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvdygpO1xuXG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZVN0cmlwZSgpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGVMb2FkZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICB0aGlzLmluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGluZy1pbmRpY2F0b3InLCAnbG9hZGVkJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlLmNsYXNzTGlzdC5hZGQoJ3N0cmlwZScpO1xuICAgICAgICB0aGlzLnN0cmlwZUxvYWRlZC5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGVkJyk7XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQodGhpcy5zdHJpcGUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZCh0aGlzLnN0cmlwZUxvYWRlZCk7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmluZGljYXRvcik7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jb3VudGVyICs9IDE7XG5cbiAgICAgICAgY29uc3QgbmV3U3RyaXBlID0gdGhpcy5zdHJpcGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZChuZXdTdHJpcGUpO1xuICAgICAgICB0aGlzLnN0cmlwZS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBuZXdTdHJpcGU7XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRlZCcpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3duLWxvYWRpbmcnKTtcbiAgICB9XG5cbiAgICBoaWRlKGZvcmNlKSB7XG4gICAgICAgIHRoaXMuY291bnRlciAtPSAxO1xuXG4gICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvdW50ZXIgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3duLWxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRW1iZWRzIHRoZSBcImV4dHJhc1wiIHN0eWxlc2hlZXQgaW50byB0aGUgcGFnZSwgaWYgaXQgaXMgbm90IGxvYWRlZCB0aHJvdWdoIHRoZSB0aGVtZS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3R5bGVzaGVldExvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZWFkeSgpIHtcbiAgICAgICAgbGV0IHN0eWxlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiBzdHlsZXNoZWV0IGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbcmVsPVwic3R5bGVzaGVldFwiXScpLmZvckVhY2goKGNzcykgPT4ge1xuICAgICAgICAgICAgaWYgKGNzcy5ocmVmLmVuZHNXaXRoKCcvbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2Nzcy9zbm93Ym9hcmQuZXh0cmFzLmNzcycpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFzdHlsZXNMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQuc2V0QXR0cmlidXRlKCdocmVmJywgdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoJy9tb2R1bGVzL3N5c3RlbS9hc3NldHMvY3NzL3Nub3dib2FyZC5leHRyYXMuY3NzJykpO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZXNoZWV0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBQcm92aWRlcyB0cmFuc2l0aW9uIHN1cHBvcnQgZm9yIGVsZW1lbnRzLlxuICpcbiAqIFRyYW5zaXRpb24gYWxsb3dzIENTUyB0cmFuc2l0aW9ucyB0byBiZSBjb250cm9sbGVkIGFuZCBjYWxsYmFja3MgdG8gYmUgcnVuIG9uY2UgY29tcGxldGVkLiBJdCB3b3JrcyBzaW1pbGFyIHRvIFZ1ZVxuICogdHJhbnNpdGlvbnMgd2l0aCAzIHN0YWdlcyBvZiB0cmFuc2l0aW9uLCBhbmQgY2xhc3NlcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSB0cmFuc2l0aW9uIG5hbWUgc3VmZml4ZWQgd2l0aFxuICogdGhlIHN0YWdlIG9mIHRyYW5zaXRpb246XG4gKlxuICogIC0gYGluYDogQSBjbGFzcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uLCByZW1vdmVkIGFmdGVyd2FyZHMuIFRoaXMgc2hvdWxkIGJlXG4gKiAgICAgIHVzZWQgdG8gZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICogIC0gYGFjdGl2ZWA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24gaXRzZWxmLlxuICogIC0gYG91dGA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uIGFuZCBrZXB0IHRvIHRoZSBlbmQgb2YgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24uIFRoaXMgc2hvdWxkIGRlZmluZSB0aGUgZW5kIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICpcbiAqIFVzYWdlOlxuICogICAgICBTbm93Ym9hcmQudHJhbnNpdGlvbihkb2N1bWVudC5lbGVtZW50LCAndHJhbnNpdGlvbicsICgpID0+IHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgZWxlbWVudCBhZnRlciA3IHNlY29uZHMnKTtcbiAqICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gKiAgICAgIH0sICc3cycpO1xuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFuc2l0aW9uIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHRyYW5zaXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNpdGlvbiBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpdGlvbiwgdGhpcyBwcmVmaXhlcyB0aGUgc3RhZ2VzIG9mIHRyYW5zaXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uIEFuIG9wdGlvbmFsIG92ZXJyaWRlIG9uIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uLiBNdXN0IGJlIHNwZWNpZmllZCBhcyAncycgKHNlY3MpIG9yICdtcycgKG1zZWNzKS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRyYWlsVG8gSWYgdHJ1ZSwgdGhlIFwib3V0XCIgY2xhc3Mgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCwgdHJhbnNpdGlvbiwgY2FsbGJhY2ssIGR1cmF0aW9uLCB0cmFpbFRvKSB7XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgSFRNTEVsZW1lbnQgbXVzdCBiZSBwcm92aWRlZCBmb3IgdHJhbnNpdGlvbmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2l0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMucGFyc2VEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhaWxUbyA9ICh0cmFpbFRvID09PSB0cnVlKTtcblxuICAgICAgICB0aGlzLmRvVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgZXZlbnQgY2xhc3NlcyB0byB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBldmVudENsYXNzZXMoLi4uYXJncykge1xuICAgICAgICBjb25zdCBldmVudENsYXNzZXMgPSB7XG4gICAgICAgICAgICBpbjogYCR7dGhpcy50cmFuc2l0aW9ufS1pbmAsXG4gICAgICAgICAgICBhY3RpdmU6IGAke3RoaXMudHJhbnNpdGlvbn0tYWN0aXZlYCxcbiAgICAgICAgICAgIG91dDogYCR7dGhpcy50cmFuc2l0aW9ufS1vdXRgLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXZlbnRDbGFzc2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldHVybkNsYXNzZXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRDbGFzc2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmIChhcmdzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5DbGFzc2VzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3NlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRvVHJhbnNpdGlvbigpIHtcbiAgICAgICAgLy8gQWRkIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRDbGFzc2VzKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdHJhbnNpdGlvbiAtIHNob3cgXCJpblwiIGFuZCBcImFjdGl2ZVwiIGNsYXNzZXNcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2luJywgJ2FjdGl2ZScpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBhIHRyYW5zaXRpb24gZXhpc3RzXG4gICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KVsndHJhbnNpdGlvbi1kdXJhdGlvbiddICE9PSAnMHMnKSB7XG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciB0aGUgdHJhbnNpdGlvbiB0byBlbmRcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRoaXMub25UcmFuc2l0aW9uRW5kKCksIHtcbiAgICAgICAgICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5ldmVudENsYXNzZXMoJ2luJylbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmV2ZW50Q2xhc3Nlcygnb3V0JylbMF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Q2xhc3NlcygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgdHJhbnNpdGlvbiBlbmRzLlxuICAgICAqXG4gICAgICogV2hlbiBhIHRyYW5zaXRpb24gZW5kcywgdGhlIGluc3RhbmNlIG9mIHRoZSB0cmFuc2l0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZGVzdHJ1Y3RlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG9uVHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2FjdGl2ZScsICghdGhpcy50cmFpbFRvKSA/ICdvdXQnIDogJycpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGEgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB0aGlzLm9uVHJhbnNpdGlvbkVuZCwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNldENsYXNzZXMoKTtcblxuICAgICAgICAvLyBSZW1vdmUgZHVyYXRpb24gb3ZlcnJpZGVcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBkZXN0cnVjdG9yXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNsYXNzZXMsIHJlbW92aW5nIGFueSB0cmFuc2l0aW9uIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZXNldENsYXNzZXMoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCkuZm9yRWFjaCgoZXZlbnRDbGFzcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZXZlbnRDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGdpdmVuIGR1cmF0aW9uIGFuZCBjb252ZXJ0cyBpdCB0byBhIFwibXNcIiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkdXJhdGlvblxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcGFyc2VEdXJhdGlvbihkdXJhdGlvbikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSAvXihbMC05XSsoXFwuWzAtOV0rKT8pKG0/cyk/JC8uZXhlYyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihwYXJzZWRbMV0pO1xuICAgICAgICBjb25zdCB1bml0ID0gKHBhcnNlZFszXSA9PT0gJ3MnKVxuICAgICAgICAgICAgPyAnc2VjJ1xuICAgICAgICAgICAgOiAnbXNlYyc7XG5cbiAgICAgICAgcmV0dXJuICh1bml0ID09PSAnc2VjJylcbiAgICAgICAgICAgID8gYCR7YW1vdW50ICogMTAwMH1tc2BcbiAgICAgICAgICAgIDogYCR7TWF0aC5mbG9vcihhbW91bnQpfW1zYDtcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJpZ2dlckVudGl0eVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXIgVGhlIHNlbGVjdG9yIGZvciB0aGUgdHJpZ2dlciB0YXJnZXQgZWxlbWVudChzKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgbWV0IGZvciB0aGUgdHJpZ2dlciB0byBmaXJlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgdHJpZ2dlciBmaXJlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJlbnQgVGhlIHBhcmVudCBlbGVtZW50IHdpdGggd2hpY2ggdG8gbGltaXQgdGhlIHRyaWdnZXIgc2NvcGUuXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50W119IGVsZW1lbnRzIFRoZSB0YXJnZXQgZWxlbWVudHMgdGhhdCB0aGlzIHRyaWdnZXIgYXBwbGllcyB0by5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUcmlnZ2VyRWxlbWVudFxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gZWxlbWVudCBUaGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnROYW1lIFRoZSB0cmlnZ2VyIGV2ZW50IG5hbWUuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBldmVudCBUaGUgdHJpZ2dlciBldmVudCBmdW5jdGlvbi5cbiAqL1xuXG4vKipcbiAqIFRyaWdnZXIgaGFuZGxlciBmb3IgSFRNTCBlbGVtZW50cy5cbiAqXG4gKiBUaGlzIGlzIGEgcmUtaW1hZ2luaW5nIG9mIHRoZSBJbnB1dC5UcmlnZ2VyIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIG9yaWdpbmFsIFdpbnRlciBDTVMgZnJhbWV3b3JrLFxuICogaW5pdGlhbGlzZWQgdGhyb3VnaCB0aGUgYGRhdGEtdHJpZ2dlcmAgYXR0cmlidXRlcy5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byByZW1haW5pbmcgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwgSW5wdXQuVHJpZ2dlciBmdW5jdGlvbmFsaXR5LCB0aGlzXG4gKiBoYW5kbGVyIGFkZHMgYWRkaXRpb25hbCBjb25kaXRpb25zIGFuZCBjb25maWd1cmF0aW9uIGZvciBtb3JlIGZsZXhpYmxlIHRyaWdnZXIgdXNhZ2UuXG4gKlxuICogQHNlZSBodHRwczovL3dpbnRlcmNtcy5jb20vZG9jcy92MS4yL3VpL3NjcmlwdC9pbnB1dC10cmlnZ2VyXG4gKlxuICogQGNvcHlyaWdodCAyMDI0IFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGVsZW1lbnQgdGhpcyBpbnN0YW5jZSBpcyBhdHRhY2hlZCB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB2YXIge01hcDxzdHJpbmcsIE1hcDxUcmlnZ2VyRW50aXR5Pj59IFRoZSB0cmlnZ2VycyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VycyA9IG5ldyBNYXAoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHZhciB7U2V0PFRyaWdnZXJFbGVtZW50Pn0gVGhlIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBib3VuZCBieSB0cmlnZ2Vycy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXZlbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VUcmlnZ2VycygpO1xuXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVRyaWdnZXJFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMucnVuRXZlbnRzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCd0cmlnZ2Vycy5yZWFkeScsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cnVjdG9yLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICB0aGlzLnJlc2V0RXZlbnRzKCk7XG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHRoZSBlbGVtZW50J3MgZGF0YSBhdHRyaWJ1dGVzIGFuZCBkZXRlcm1pbmVzIGFwcGxpY2FibGUgdHJpZ2dlcnMuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VyIGRhdGEgYXR0cmlidXRlcyBtdXN0IGJlIGluIHRoZSBmb3JtYXQgYGRhdGEtdHJpZ2dlci1bbmFtZV0tW3BhcmFtZXRlcl1gIGZvciBtdWx0aXBsZVxuICAgICAqIHRyaWdnZXJzLCBvciBgZGF0YS10cmlnZ2VyLVtwYXJhbWV0ZXJdYCBmb3Igc2luZ2xlIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOlxuICAgICAqICAtIGBjb25kaXRpb25gIG9yIGB3aGVyZWA6IFRoZSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHRyaWdnZXIgdG8gZmlyZS5cbiAgICAgKiAgLSBgYWN0aW9uYDogVGhlIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIHRyaWdnZXIgZmlyZXMuXG4gICAgICogIC0gYHBhcmVudGAgb3IgYGNsb3Nlc3QtcGFyZW50YDogVGhlIHBhcmVudCBlbGVtZW50IHdpdGggd2hpY2ggdG8gbGltaXQgdGhlIHRyaWdnZXIgc2NvcGUuXG4gICAgICpcbiAgICAgKiBJbnRlcm5hbGx5LCB0aGUgdHJpZ2dlciBtYXAgdXNlcyB0aGUgYHRyaWdnZXJgIHBhcmFtZXRlciB0byBzdG9yZSB0aGUgdHJpZ2dlciBzZWxlY3Rvci5cbiAgICAgKi9cbiAgICBwYXJzZVRyaWdnZXJzKCkge1xuICAgICAgICBjb25zdCB7IGRhdGFzZXQgfSA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5jbGVhcigpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFzZXQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKC8tW0EtWl0vLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgY2FtZWxDYXNlIHRvIGRhc2gtc3R5bGUgZm9yIGRhdGEgYXR0cmlidXRlOiAke2tleX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGFzaFN0eWxlID0ga2V5LnJlcGxhY2UoLyhbQS1aXSkvZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcblxuICAgICAgICAgICAgaWYgKGRhc2hTdHlsZSAhPT0gJ3RyaWdnZXInICYmICFkYXNoU3R5bGUuc3RhcnRzV2l0aCgndHJpZ2dlci0nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlclBhcnRzID0gLyhbYS16MC05XFwtLjpfXSs/KSg/Oig/Oi0pKGNsb3Nlc3QtcGFyZW50fGNvbmRpdGlvbnx3aGVufGFjdGlvbnxwYXJlbnQpKT8kL2kuZXhlYyhcbiAgICAgICAgICAgICAgICBkYXNoU3R5bGUucmVwbGFjZSgndHJpZ2dlci0nLCAnJykudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCB0cmlnZ2VyTmFtZSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdHJpZ2dlclR5cGUgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgWyd0cmlnZ2VyJywgJ2NvbmRpdGlvbicsICdhY3Rpb24nLCAncGFyZW50JywgJ3doZW4nLCAnY2xvc2VzdCddLmluZGV4T2YodHJpZ2dlclBhcnRzWzFdKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAmJiAodHJpZ2dlclBhcnRzWzFdICE9PSAnY2xvc2VzdCcgfHwgKHRyaWdnZXJQYXJ0c1sxXSA9PT0gJ2Nsb3Nlc3QnICYmIHRyaWdnZXJQYXJ0c1syXSA9PT0gJ3BhcmVudCcpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBvcmlnaW5hbCB0cmlnZ2VyIGZvcm1hdFxuICAgICAgICAgICAgICAgIHRyaWdnZXJOYW1lID0gJ19fb3JpZ2luYWwnO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gKHRyaWdnZXJQYXJ0c1sxXSA9PT0gJ2Nsb3Nlc3QnKSA/ICdwYXJlbnQnIDogdHJpZ2dlclBhcnRzWzFdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUGFydHNbMl0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IFsnY2xvc2VzdC1wYXJlbnQnLCAnY29uZGl0aW9uJywgJ3doZW4nLCAnYWN0aW9uJywgJ3BhcmVudCddLmluZGV4T2YodHJpZ2dlclBhcnRzWzJdKSAhPT0gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFBhcnNlIG11bHRpLXRyaWdnZXIgZm9ybWF0XG4gICAgICAgICAgICAgICAgWywgdHJpZ2dlck5hbWVdID0gdHJpZ2dlclBhcnRzO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJpZ2dlclBhcnRzWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3Nlc3QtcGFyZW50JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGFyZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ3BhcmVudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29uZGl0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2hlbic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdjb25kaXRpb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjdGlvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdhY3Rpb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICd0cmlnZ2VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJzLmhhcyh0cmlnZ2VyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLnNldCh0cmlnZ2VyTmFtZSwgbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcnMuZ2V0KHRyaWdnZXJOYW1lKS5zZXQodHJpZ2dlclR5cGUsIGRhdGFzZXRba2V5XSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmlnZ2VyIGRhdGEgYXR0cmlidXRlIGFmdGVyIHBhcnNpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0W2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRyaWdnZXJzLCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgZG8gbm90IGhhdmUgYXQgbGVhc3QgYSB0cmlnZ2VyIHNlbGVjdG9yLCBhXG4gICAgICAgIC8vIGNvbmRpdGlvbiBhbmQgYW4gYWN0aW9uLCBvciBhcmUgdXNpbmcgaW52YWxpZCBjb25kaXRpb25zIG9yIGFjdGlvbnNcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKHRyaWdnZXIpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRyaWdnZXIuaGFzKCd0cmlnZ2VyJylcbiAgICAgICAgICAgICAgICB8fCAhdHJpZ2dlci5oYXMoJ2NvbmRpdGlvbicpXG4gICAgICAgICAgICAgICAgfHwgIXRyaWdnZXIuaGFzKCdhY3Rpb24nKVxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIHx8ICF0aGlzLmlzVmFsaWRDb25kaXRpb24odHJpZ2dlcilcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5pc1ZhbGlkQWN0aW9uKHRyaWdnZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ2VsZW1lbnRzJywgZWxlbWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBjb21tYW5kIGdpdmVuIGFzIGVpdGhlciBhIGNvbmRpdGlvbiBvciBhbiBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBDb21tYW5kcyBhcmUgZm9ybWF0dGVkIGFzOiBuYW1lOnBhcmFtZXRlcjEscGFyYW1ldGVyMixwYXJhbWV0ZXIzLCBhbHRob3VnaCB3ZSBhbHNvIHN1cHBvcnRcbiAgICAgKiB0aGUgb2xkIGZvcm1hdCBvZiB2YWx1ZVtwYXJhbWV0ZXIxLHBhcmFtZXRlcjIscGFyYW1ldGVyM10gZm9yIHRoZSBgdmFsdWVgIGNvbW1hbmQgb25seS5cbiAgICAgKlxuICAgICAqIElmIGEgcGFyYW1ldGVyIHJlcXVpcmVzIGEgY29tbWEgd2l0aGluLCB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSB3cmFwcGVkIGluIHF1b3Rlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gICAgICogQHJldHVybnMge25hbWU6IHN0cmluZywgcGFyYW1ldGVyczogc3RyaW5nW119XG4gICAgICovXG4gICAgcGFyc2VDb21tYW5kKGNvbW1hbmQpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBvbGQtZm9ybWF0IHZhbHVlIGNvbW1hbmQgKHZhbHVlW2ZvbyxiYXJdKVxuICAgICAgICBpZiAoY29tbWFuZC5zdGFydHNXaXRoKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNvbW1hbmQubWF0Y2goL1teW1xcXV0rKD89XSkvZyk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gU3BsaXQgdmFsdWVzIHdpdGggY29tbWFzXG4gICAgICAgICAgICBtYXRjaC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRWYWx1ZXMgPSB2YWx1ZS5yZXBsYWNlKC8oXCJbXlwiXSpcIil8KCdbXiddKicpL2csIChxdW90ZWQpID0+IHF1b3RlZC5yZXBsYWNlKC8sL2csICd8fHwnKSlcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoc3BsaXRWYWx1ZSkgPT4gc3BsaXRWYWx1ZS5yZXBsYWNlKC9cXHxcXHxcXHwvZywgJywnKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS50cmltKCkpO1xuXG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goLi4uc3BsaXRWYWx1ZXMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB2YWx1ZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb21tYW5kLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogY29tbWFuZCxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbbmFtZSwgcGFyYW1ldGVyc10gPSBjb21tYW5kLnNwbGl0KCc6JywgMik7XG5cbiAgICAgICAgaWYgKCFwYXJhbWV0ZXJzLmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbcGFyYW1ldGVyc10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BsaXRWYWx1ZXMgPSBwYXJhbWV0ZXJzLnJlcGxhY2UoLyhcIlteXCJdKlwiKXwoJ1teJ10qJykvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoKHNwbGl0VmFsdWUpID0+IHNwbGl0VmFsdWUucmVwbGFjZSgvXFx8XFx8XFx8L2csICcsJykucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykudHJpbSgpKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHNwbGl0VmFsdWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbnkgZWxlbWVudHMgYXJlIGFjY2Vzc2libGUgYnkgdGhlIHByb3ZpZGVkIHRyaWdnZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX1cbiAgICAgKi9cbiAgICBnZXRTZWxlY3RhYmxlRWxlbWVudHModHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlci5oYXMoJ3BhcmVudCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQuY2xvc2VzdCh0cmlnZ2VyLmdldCgncGFyZW50JykpLnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlci5nZXQoJ3RyaWdnZXInKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0cmlnZ2VyLmdldCgndHJpZ2dlcicpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvdmlkZWQgdHJpZ2dlciBjb25kaXRpb24gaXMgdmFsaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1ZhbGlkQ29uZGl0aW9uKHRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdjaGVja2VkJyxcbiAgICAgICAgICAgICd1bmNoZWNrZWQnLFxuICAgICAgICAgICAgJ2VtcHR5JyxcbiAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAnb25lb2YnLFxuICAgICAgICAgICAgJ2FsbG9mJyxcbiAgICAgICAgICAgICdmb2N1cycsXG4gICAgICAgICAgICAnYmx1cicsXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2NvbmRpdGlvbicpKS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb3ZpZGVkIHRyaWdnZXIgYWN0aW9uIGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNWYWxpZEFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnc2hvdycsXG4gICAgICAgICAgICAnaGlkZScsXG4gICAgICAgICAgICAnZW5hYmxlJyxcbiAgICAgICAgICAgICdkaXNhYmxlJyxcbiAgICAgICAgICAgICdlbXB0eScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdhdHRyJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2FjdGlvbicpKS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB0cmlnZ2VyIGV2ZW50cyBvbiB0cmlnZ2VyIGFuZCB0YXJnZXQgZWxlbWVudHMuXG4gICAgICovXG4gICAgY3JlYXRlVHJpZ2dlckV2ZW50cygpIHtcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHBhcmFtZXRlcnMgfSA9IHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdjb25kaXRpb24nKSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdvbmVPZic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsdWVFdmVudCh0cmlnZ2VyLCBmYWxzZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FsbE9mJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWx1ZUV2ZW50KHRyaWdnZXIsIHRydWUsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRW1wdHlFdmVudCh0cmlnZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRyaWdnZXIgdGhhdCBmaXJlcyB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQocykgbWF0Y2hlcyBvbmUgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtICB7Li4uc3RyaW5nfSB2YWx1ZXNcbiAgICAgKi9cbiAgICBjcmVhdGVWYWx1ZUV2ZW50KHRyaWdnZXIsIGFsbCwgLi4udmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50cycpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1maWxlXSwgaW5wdXRbdHlwZT1pbWFnZV0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0nKSkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbnMgYW5kIGZpbGUgaW5wdXRzIGFyZSB1bnN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGhpc0V2ZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlcyA9IG5ldyBTZXQoKTtcblxuICAgICAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlcy5zb21lKCh2YWx1ZSkgPT4gZWxlbWVudFZhbHVlcy5oYXModmFsdWUpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RXZlbnQgPSAoKSA9PiB0aGlzRXZlbnQoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudE5hbWU6ICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGVsZW1lbnRFdmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lOiAnaW5wdXQnLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlbGVtZW50RXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gdGhlcmUgaXMgbm8gdmFsdWUgd2l0aGluIHRoZSB0YXJnZXQgZWxlbWVudChzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqL1xuICAgIGNyZWF0ZUVtcHR5RXZlbnQodHJpZ2dlcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRoaXNFdmVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RXZlbnQgPSAoKSA9PiB0aGlzRXZlbnQoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudE5hbWU6ICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGVsZW1lbnRFdmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lOiAnaW5wdXQnLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBlbGVtZW50RXZlbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlbGVtZW50RXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBydW5FdmVudHMoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiBldmVudC5ldmVudCgpKTtcbiAgICB9XG5cbiAgICByZXNldEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC5ldmVudE5hbWUsIGV2ZW50LmV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCBjb25kaXRpb25NZXQpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBwYXJhbWV0ZXJzIH0gPSB0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnYWN0aW9uJykpO1xuXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnc2hvdyc6XG4gICAgICAgICAgICBjYXNlICdoaWRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvblNob3codHJpZ2dlciwgKG5hbWUgPT09ICdzaG93JykgPyBjb25kaXRpb25NZXQgOiAhY29uZGl0aW9uTWV0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhY3Rpb25TaG93KHRyaWdnZXIsIHNob3cpIHtcbiAgICAgICAgaWYgKHNob3cgJiYgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5lbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuXG4gICAgICAgICAgICB0aGlzLmFmdGVyQWN0aW9uKHRyaWdnZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsRGlzcGxheSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KS5kaXNwbGF5O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZnRlckFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmRlYnVnKCdUcmlnZ2VyIGZpcmVkJywgdGhpcy5lbGVtZW50LCB0cmlnZ2VyKTtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ3RyaWdnZXIuZmlyZWQnLCB0aGlzLmVsZW1lbnQsIHRyaWdnZXIpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogSW50ZXJuYWwgcHJveHkgZm9yIFNub3dib2FyZC5cbiAqXG4gKiBUaGlzIGhhbmRsZXIgd3JhcHMgdGhlIFNub3dib2FyZCBpbnN0YW5jZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgcGx1Z2luIGluc3RhbmNlcy5cbiAqIEl0IHByZXZlbnRzIGFjY2VzcyB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHM6XG4gKiAgLSBgYXR0YWNoQWJzdHJhY3RzYDogTm8gbmVlZCB0byBhdHRhY2ggYWJzdHJhY3RzIGFnYWluLlxuICogIC0gYGxvYWRVdGlsdGllc2A6IE5vIG5lZWQgdG8gbG9hZCB1dGlsaXRpZXMgYWdhaW4uXG4gKiAgLSBgaW5pdGlhbGlzZWA6IFNub3dib2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkLlxuICogIC0gYGluaXRpYWxpc2VTaW5nbGV0b25zYDogU2luZ2xldG9ucyBhcmUgYWxyZWFkeSBpbml0aWFsaXNlZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKFsnYXR0YWNoQWJzdHJhY3RzJywgJ2xvYWRVdGlsaXRpZXMnLCAnaW5pdGlhbGlzZScsICdpbml0aWFsaXNlU2luZ2xldG9ucyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgY2Fubm90IHVzZSB0aGUgXCIke3Byb3B9XCIgU25vd2JvYXJkIG1ldGhvZCB3aXRoaW4gYSBwbHVnaW4uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4gUmVmbGVjdC5nZXQodGFyZ2V0LCAncGx1Z2lucycpW3Byb3BMb3dlcl0uZ2V0SW5zdGFuY2UoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICB9LFxuXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChbJ2F0dGFjaEFic3RyYWN0cycsICdsb2FkVXRpbGl0aWVzJywgJ2luaXRpYWxpc2UnLCAnaW5pdGlhbGlzZVNpbmdsZXRvbnMnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbn07XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuaW1wb3J0IElubmVyUHJveHlIYW5kbGVyIGZyb20gJy4vSW5uZXJQcm94eUhhbmRsZXInO1xuXG4vKipcbiAqIFBsdWdpbiBsb2FkZXIgY2xhc3MuXG4gKlxuICogVGhpcyBpcyBhIHByb3ZpZGVyIChmYWN0b3J5KSBjbGFzcyBmb3IgYSBzaW5nbGUgcGx1Z2luIGFuZCBwcm92aWRlcyB0aGUgbGluayBiZXR3ZWVuIFNub3dib2FyZCBmcmFtZXdvcmsgZnVuY3Rpb25hbGl0eVxuICogYW5kIHRoZSB1bmRlcmx5aW5nIHBsdWdpbiBpbnN0YW5jZXMuIEl0IGFsc28gcHJvdmlkZXMgc29tZSBiYXNpYyBtb2NraW5nIG9mIHBsdWdpbiBtZXRob2RzIGZvciB0ZXN0aW5nLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5Mb2FkZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQmluZHMgdGhlIFdpbnRlciBmcmFtZXdvcmsgdG8gdGhlIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1Nub3dib2FyZH0gc25vd2JvYXJkXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHNub3dib2FyZCwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQgPSBuZXcgUHJveHkoXG4gICAgICAgICAgICBzbm93Ym9hcmQsXG4gICAgICAgICAgICBJbm5lclByb3h5SGFuZGxlcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG4gICAgICAgIC8vIEZyZWV6ZSBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhpcyBsb2FkZXJcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLmluc3RhbmNlKTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IHtcbiAgICAgICAgICAgIGluaXRpYWxpc2VkOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUHJldmVudCBmdXJ0aGVyIGV4dGVuc2lvbiBvZiB0aGUgc2luZ2xldG9uIHN0YXR1cyBvYmplY3RcbiAgICAgICAgT2JqZWN0LnNlYWwodGhpcy5zaW5nbGV0b24pO1xuXG4gICAgICAgIHRoaXMubW9ja3MgPSB7fTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgICAgIC8vIEZyZWV6ZSBsb2FkZXIgaXRzZWxmXG4gICAgICAgIE9iamVjdC5mcmVlemUoUGx1Z2luTG9hZGVyLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaGFzIGEgc3BlY2lmaWMgbWV0aG9kIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc01ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgcHJvdG90eXBlIG1ldGhvZCBmb3IgYSBwbHVnaW4uIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBiZSB1c2VkIGZvciBcInN0YXRpY1wiIGNhbGxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKiBAcGFyYW0gey4uLn0gYXJnc1xuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgY2FsbE1ldGhvZCguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gcGFyYW1ldGVycztcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGFyZ3Muc2hpZnQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0oYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBwbHVnaW4uXG4gICAgICpcbiAgICAgKiAtIElmIHRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBwbHVnaW4sIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gSWYgdGhpcyBpcyBhIHNpbmdsZXRvbiwgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luQmFzZXxGdW5jdGlvbn1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW5jZSguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICBjb25zdCB1bm1ldCA9IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKCkuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5zbm93Ym9hcmQuZ2V0UGx1Z2luTmFtZXMoKS5pbmNsdWRlcyhpdGVtKSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIiR7dGhpcy5uYW1lfVwiIHBsdWdpbiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsdWdpbnM6ICR7dW5tZXQuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXNlU2luZ2xldG9uKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kc1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubW9ja3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm9yaWdpbmFsRnVuY3Rpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5tb2NrcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9ICguLi5wYXJhbXMpID0+IGNhbGxiYWNrKHRoaXMsIC4uLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG1vY2tlZCBtZXRob2RzIHRvIHByb3RvdHlwZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5tb2NrcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5vcmlnaW5hbEZ1bmN0aW9ucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5tb2NrcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSAoLi4ucGFyYW1zKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyB0aGlzLmluc3RhbmNlKHRoaXMuc25vd2JvYXJkLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuZGV0YWNoID0gKCkgPT4gdGhpcy5pbnN0YW5jZXMuc3BsaWNlKHRoaXMuaW5zdGFuY2VzLmluZGV4T2YobmV3SW5zdGFuY2UpLCAxKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuY29uc3RydWN0KC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlcy5wdXNoKG5ld0luc3RhbmNlKTtcblxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgcGx1Z2luIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2luLCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkJhc2VbXX1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW5jZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgc2ltcGxlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdGhpcy5pbnN0YW5jZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBpcyBhIHNpbmdsZXRvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzU2luZ2xldG9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBTaW5nbGV0b24gPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHNpbmdsZXRvbiBoYXMgYmVlbiBpbml0aWFsaXNlZC5cbiAgICAgKlxuICAgICAqIE5vcm1hbCBwbHVnaW5zIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNJbml0aWFsaXNlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9uLmluaXRpYWxpc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBpbml0aWFsaXNlU2luZ2xldG9uKC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMuaW5zdGFuY2UodGhpcy5zbm93Ym9hcmQsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBuZXdJbnN0YW5jZS5kZXRhY2ggPSAoKSA9PiB0aGlzLmluc3RhbmNlcy5zcGxpY2UodGhpcy5pbnN0YW5jZXMuaW5kZXhPZihuZXdJbnN0YW5jZSksIDEpO1xuICAgICAgICBuZXdJbnN0YW5jZS5jb25zdHJ1Y3QoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpO1xuICAgICAgICB0aGlzLnNpbmdsZXRvbi5pbml0aWFsaXNlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXREZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9ucyBjYW5ub3QgaGF2ZSBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gZGVwZW5kZW5jeSBtZXRob2Qgc3BlY2lmaWVkLlxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlLmRlcGVuZGVuY2llcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlLmRlcGVuZGVuY2llcygpLm1hcCgoaXRlbSkgPT4gaXRlbS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBoYXMgYWxsIGl0cyBkZXBlbmRlbmNpZXMgZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSB0aGlzLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIGxldCBmdWxmaWxsZWQgPSB0cnVlO1xuICAgICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc25vd2JvYXJkLmhhc1BsdWdpbihwbHVnaW4pKSB7XG4gICAgICAgICAgICAgICAgZnVsZmlsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmdWxmaWxsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIHRvIGJlIG1vY2tlZCBmb3IgdGVzdGluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbW9jayB3aWxsIGJlIGFwcGxpZWQgZm9yIHRoZSBsaWZlIG9mIGFuIGluc3RhbmNlLiBGb3Igc2luZ2xldG9ucywgdGhlIG1vY2sgd2lsbCBiZSBhcHBsaWVkIGZvciB0aGUgbGlmZVxuICAgICAqIG9mIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogTW9ja3MgY2Fubm90IGJlIGFwcGxpZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBtb2NrKG1ldGhvZE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiBcIiR7bWV0aG9kTmFtZX1cIiBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIG1vY2tlZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2Nrc1ttZXRob2ROYW1lXSA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zW21ldGhvZE5hbWVdID0gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGV0b24oKSAmJiB0aGlzLmluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9ICguLi5wYXJhbWV0ZXJzKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBtb2NrIGNhbGxiYWNrIGZyb20gZnV0dXJlIGluc3RhbmNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICovXG4gICAgdW5tb2NrKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1vY2tzW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9IHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy5tb2Nrc1ttZXRob2ROYW1lXTtcbiAgICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV07XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBSZWZsZWN0LmdldCh0YXJnZXQsICdwbHVnaW5zJylbcHJvcExvd2VyXS5nZXRJbnN0YW5jZSguLi5wYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbn07XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuaW1wb3J0IFBsdWdpbkxvYWRlciBmcm9tICcuL1BsdWdpbkxvYWRlcic7XG5cbmltcG9ydCBDb29raWUgZnJvbSAnLi4vdXRpbGl0aWVzL0Nvb2tpZSc7XG5pbXBvcnQgSnNvblBhcnNlciBmcm9tICcuLi91dGlsaXRpZXMvSnNvblBhcnNlcic7XG5pbXBvcnQgU2FuaXRpemVyIGZyb20gJy4uL3V0aWxpdGllcy9TYW5pdGl6ZXInO1xuaW1wb3J0IFVybCBmcm9tICcuLi91dGlsaXRpZXMvVXJsJztcblxuLyoqXG4gKiBTbm93Ym9hcmQgLSB0aGUgV2ludGVyIEphdmFTY3JpcHQgZnJhbWV3b3JrLlxuICpcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgYmFzZSBvZiBhIG1vZGVybiB0YWtlIG9uIHRoZSBXaW50ZXIgSlMgZnJhbWV3b3JrLCBiZWluZyBmdWxseSBleHRlbnNpYmxlIGFuZCB0YWtpbmcgYWR2YW50YWdlXG4gKiBvZiBtb2Rlcm4gSmF2YVNjcmlwdCBmZWF0dXJlcyBieSBsZXZlcmFnaW5nIHRoZSBMYXJhdmVsIE1peCBjb21waWxhdGlvbiBmcmFtZXdvcmsuIEl0IGFsc28gaXMgY29kZWQgdXAgdG8gcmVtb3ZlIHRoZVxuICogZGVwZW5kZW5jeSBvZiBqUXVlcnkuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKiBAbGluayBodHRwczovL3dpbnRlcmNtcy5jb20vZG9jcy9zbm93Ym9hcmQvaW50cm9kdWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNub3dib2FyZCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGF1dG9TaW5nbGV0b25zIEF1dG9tYXRpY2FsbHkgbG9hZCBzaW5nbGV0b25zIHdoZW4gRE9NIGlzIHJlYWR5LiBEZWZhdWx0OiBgdHJ1ZWAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZWJ1ZyBXaGV0aGVyIGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSBzaG93bi4gRGVmYXVsdDogYGZhbHNlYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhdXRvU2luZ2xldG9ucywgZGVidWcpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSAodHlwZW9mIGRlYnVnID09PSAnYm9vbGVhbicgJiYgZGVidWcgPT09IHRydWUpO1xuICAgICAgICB0aGlzLmF1dG9Jbml0U2luZ2xldG9ucyA9ICh0eXBlb2YgYXV0b1NpbmdsZXRvbnMgPT09ICdib29sZWFuJyAmJiBhdXRvU2luZ2xldG9ucyA9PT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB7fTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLnJlYWRpbmVzcyA9IHtcbiAgICAgICAgICAgIGRvbTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIC8vIFNlYWwgcmVhZGluZXNzIGZyb20gYmVpbmcgYWRkZWQgdG8gZnVydGhlciwgYnV0IGFsbG93IHRoZSBwcm9wZXJ0aWVzIHRvIGJlIG1vZGlmaWVkLlxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzLnJlYWRpbmVzcyk7XG4gICAgICAgIHRoaXMuYXR0YWNoQWJzdHJhY3RzKCk7XG5cbiAgICAgICAgLy8gRnJlZXplIHRoZSBTbm93Ym9hcmQgY2xhc3MgdG8gcHJldmVudCBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gICAgICAgIE9iamVjdC5mcmVlemUoU25vd2JvYXJkLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG5cbiAgICAgICAgdGhpcy5sb2FkVXRpbGl0aWVzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZSgpO1xuXG4gICAgICAgIHRoaXMuZGVidWcoJ1Nub3dib2FyZCBmcmFtZXdvcmsgaW5pdGlhbGlzZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhYnN0cmFjdCBjbGFzc2VzIGFzIHByb3BlcnRpZXMgb2YgdGhlIFNub3dib2FyZCBjbGFzcy5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbGxvdyBKYXZhc2NyaXB0IGZ1bmN0aW9uYWxpdHkgd2l0aCBubyBidWlsZCBwcm9jZXNzIHRvIHN0aWxsIGV4dGVuZCB0aGVzZSBhYnN0cmFjdHMgYnkgcHJlZml4aW5nXG4gICAgICogdGhlbSB3aXRoIFwiU25vd2JvYXJkXCIuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjbGFzcyBNeUNsYXNzIGV4dGVuZHMgU25vd2JvYXJkLlBsdWdpbkJhc2Uge1xuICAgICAqICAgICAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXR0YWNoQWJzdHJhY3RzKCkge1xuICAgICAgICB0aGlzLlBsdWdpbkJhc2UgPSBQbHVnaW5CYXNlO1xuICAgICAgICB0aGlzLlNpbmdsZXRvbiA9IFNpbmdsZXRvbjtcblxuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuUGx1Z2luQmFzZS5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuUGx1Z2luQmFzZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5TaW5nbGV0b24ucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlNpbmdsZXRvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGRlZmF1bHQgdXRpbGl0aWVzLlxuICAgICAqL1xuICAgIGxvYWRVdGlsaXRpZXMoKSB7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCdjb29raWUnLCBDb29raWUpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignanNvblBhcnNlcicsIEpzb25QYXJzZXIpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignc2FuaXRpemVyJywgU2FuaXRpemVyKTtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ3VybCcsIFVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgdGhlIGZyYW1ld29yay5cbiAgICAgKlxuICAgICAqIEF0dGFjaGVzIGEgbGlzdGVuZXIgZm9yIHRoZSBET00gYmVpbmcgcmVhZHkgYW5kIHRyaWdnZXJzIGEgZ2xvYmFsIFwicmVhZHlcIiBldmVudCBmb3IgcGx1Z2lucyB0byBiZWdpbiBhdHRhY2hpbmdcbiAgICAgKiB0aGVtc2VsdmVzIHRvIHRoZSBET00uXG4gICAgICovXG4gICAgaW5pdGlhbGlzZSgpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvSW5pdFNpbmdsZXRvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpc2VTaW5nbGV0b25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdsb2JhbEV2ZW50KCdyZWFkeScpO1xuICAgICAgICAgICAgdGhpcy5yZWFkaW5lc3MuZG9tID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYW4gaW5zdGFuY2Ugb2YgZXZlcnkgc2luZ2xldG9uLlxuICAgICAqL1xuICAgIGluaXRpYWxpc2VTaW5nbGV0b25zKCkge1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMucGx1Z2lucykuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHBsdWdpbiB0byB0aGUgZnJhbWV3b3JrLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBhcmUgdGhlIGNvcm5lcnN0b25lIGZvciBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgZm9yIFNub3dib2FyZC4gQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYW4gRVMyMDE1IGNsYXNzXG4gICAgICogdGhhdCBleHRlbmRzIHRoZSBQbHVnaW5CYXNlIG9yIFNpbmdsZXRvbiBhYnN0cmFjdCBjbGFzc2VzLCBvciBhIHNpbXBsZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFdoZW4gYSBwbHVnaW4gaXMgYWRkZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgYXMgYSBuZXcgbWFnaWMgbWV0aG9kIGluIHRoZSBTbm93Ym9hcmQgY2xhc3MgdXNpbmcgdGhlIG5hbWVcbiAgICAgKiBwYXJhbWV0ZXIsIGFuZCBjYW4gYmUgY2FsbGVkIHZpYSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgYmUgdGhlIFwibG93ZXJjYXNlXCIgdmVyc2lvbiBvZiB0aGlzIG5hbWUuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYSBwbHVnaW4gaXMgYXNzaWduZWQgdG8gdGhlIG5hbWUgXCJteVBsdWdpblwiLCBpdCBjYW4gYmUgY2FsbGVkIHZpYSBgU25vd2JvYXJkLm15cGx1Z2luKClgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1BsdWdpbkJhc2V8RnVuY3Rpb259IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUGx1Z2luKG5hbWUsIGluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAodGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHBsdWdpbiBjYWxsZWQgXCIke25hbWV9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZSAhPT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBwbHVnaW4gbXVzdCBleHRlbmQgdGhlIFBsdWdpbkJhc2UgY2xhc3MsIG9yIG11c3QgYmUgYSBjYWxsYmFjayBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzW25hbWVdICE9PSB1bmRlZmluZWQgfHwgdGhpc1tsb3dlck5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIGEgcHJvcGVydHkgb3IgbWV0aG9kIG9mIHRoZSBTbm93Ym9hcmQgY2xhc3MuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXSA9IG5ldyBQbHVnaW5Mb2FkZXIobG93ZXJOYW1lLCB0aGlzLCBpbnN0YW5jZSk7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIHJlZ2lzdGVyZWRgKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgc2luZ2xldG9ucyBub3cgaGF2ZSB0aGVpciBkZXBlbmRlbmNpZXMgZnVsZmlsbGVkLCBhbmQgZmlyZSB0aGVpciBcInJlYWR5XCIgaGFuZGxlciBpZiB3ZSdyZVxuICAgICAgICAvLyBpbiBhIHJlYWR5IHN0YXRlLlxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZ2V0UGx1Z2lucygpKS5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwbHVnaW4uaXNTaW5nbGV0b24oKVxuICAgICAgICAgICAgICAgICYmICFwbHVnaW4uaXNJbml0aWFsaXNlZCgpXG4gICAgICAgICAgICAgICAgJiYgcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpXG4gICAgICAgICAgICAgICAgJiYgcGx1Z2luLmhhc01ldGhvZCgnbGlzdGVucycpXG4gICAgICAgICAgICAgICAgJiYgT2JqZWN0LmtleXMocGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKSkuaW5jbHVkZXMoJ3JlYWR5JylcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnJlYWRpbmVzcy5kb21cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5TWV0aG9kID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKS5yZWFkeTtcbiAgICAgICAgICAgICAgICBwbHVnaW4uY2FsbE1ldGhvZChyZWFkeU1ldGhvZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBSZW1vdmVzIGEgcGx1Z2luIGZyb20gU25vd2JvYXJkLCBjYWxsaW5nIHRoZSBkZXN0cnVjdG9yIG1ldGhvZCBmb3IgYWxsIGFjdGl2ZSBpbnN0YW5jZXMgb2YgdGhlIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlUGx1Z2luKG5hbWUpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIGFscmVhZHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBkZXN0cnVjdG9ycyBmb3IgYWxsIGluc3RhbmNlc1xuICAgICAgICB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXS5nZXRJbnN0YW5jZXMoKS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2UuZGVzdHJ1Y3QoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpc1tsb3dlck5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTtcblxuICAgICAgICB0aGlzLmRlYnVnKGBQbHVnaW4gXCIke25hbWV9XCIgcmVtb3ZlZGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZCBhbmQgaXMgYWN0aXZlLlxuICAgICAqXG4gICAgICogQSBwbHVnaW4gdGhhdCBpcyBzdGlsbCB3YWl0aW5nIGZvciBkZXBlbmRlbmNpZXMgdG8gYmUgcmVnaXN0ZXJlZCB3aWxsIG5vdCBiZSBhY3RpdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1BsdWdpbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICByZXR1cm4gKHRoaXMucGx1Z2luc1tsb3dlck5hbWVdICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBwbHVnaW5zIGFzIFBsdWdpbkxvYWRlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkxvYWRlcltdfVxuICAgICAqL1xuICAgIGdldFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiByZWdpc3RlcmVkIHBsdWdpbnMsIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0UGx1Z2luTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBQbHVnaW5Mb2FkZXIgb2JqZWN0IG9mIGEgZ2l2ZW4gcGx1Z2luLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkxvYWRlcn1cbiAgICAgKi9cbiAgICBnZXRQbHVnaW4obmFtZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1BsdWdpbihsb3dlck5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBsdWdpbiBjYWxsZWQgXCIke2xvd2VyTmFtZX1cIiBoYXMgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBwbHVnaW5zIHRoYXQgbGlzdGVuIHRvIHRoZSBnaXZlbiBldmVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgd29ya3MgZm9yIGJvdGggbm9ybWFsIGFuZCBwcm9taXNlIGV2ZW50cy4gSXQgZG9lcyBOT1QgY2hlY2sgdGhhdCB0aGUgcGx1Z2luJ3MgbGlzdGVuZXIgYWN0dWFsbHkgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbnMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICovXG4gICAgbGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbXTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnBsdWdpbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbmFtZSwgcGx1Z2luXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwbHVnaW4uaGFzTWV0aG9kKCdsaXN0ZW5zJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzW2V2ZW50TmFtZV0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBsaXN0ZW5lcnNbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBsdWdpbnMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBsdWdpbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc2ltcGxlIHJlYWR5IGxpc3RlbmVyLlxuICAgICAqXG4gICAgICogU3lub255bW91cyB3aXRoIGpRdWVyeSdzIFwiJChkb2N1bWVudCkucmVhZHkoKVwiIGZ1bmN0aW9uYWxpdHksIHRoaXMgYWxsb3dzIGlubGluZSBzY3JpcHRzIHRvXG4gICAgICogYXR0YWNoIHRoZW1zZWx2ZXMgdG8gU25vd2JvYXJkIGltbWVkaWF0ZWx5IGJ1dCBvbmx5IGZpcmUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICByZWFkeShjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5yZWFkaW5lc3MuZG9tKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbigncmVhZHknLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhZC1ob2Mgc2NyaXB0cyB0aGF0IGRvbid0IG5lZWQgYSBmdWxsIHBsdWdpbi4gVGhlIGdpdmVuIGNhbGxiYWNrIHdpbGwgYmVcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgbmFtZSBwcm92aWRlZCBmaXJlcy4gVGhpcyB3b3JrcyBmb3IgYm90aCBub3JtYWwgYW5kIFByb21pc2UgZXZlbnRzLiBGb3JcbiAgICAgKiBhIFByb21pc2UgZXZlbnQsIHlvdXIgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBQcm9taXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgb24oZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5pbmNsdWRlcyhjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc2ltcGxlIGxpc3RlbmVyIGZvciBhbiBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG9mZihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBnbG9iYWwgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIElmIGFueSBwbHVnaW4gcmV0dXJucyBhIGBmYWxzZWAsIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgZXZlbnQgd2FzIG5vdCBjYW5jZWxsZWRcbiAgICAgKi9cbiAgICBnbG9iYWxFdmVudChldmVudE5hbWUsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgQ2FsbGluZyBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cImAsIC4uLnBhcmFtZXRlcnMpO1xuXG4gICAgICAgIC8vIEZpbmQgcGx1Z2lucyBsaXN0ZW5pbmcgdG8gdGhlIGV2ZW50LlxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbnNUb0V2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBObyBsaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKGBMaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiOiAke2xpc3RlbmVycy5qb2luKCcsICcpfWApO1xuXG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5nZXRQbHVnaW4obmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc1NpbmdsZXRvbigpICYmIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5NZXRob2QgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpW2V2ZW50TmFtZV07XG5cbiAgICAgICAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlciBtZXRob2RzIGZvciBhbGwgcGx1Z2lucywgaWYgdGhleSBoYXZlIGEgbWV0aG9kIHNwZWNpZmllZCBmb3IgdGhlIGV2ZW50LlxuICAgICAgICAgICAgcGx1Z2luLmdldEluc3RhbmNlcygpLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBwbHVnaW4gaGFzIGNhbmNlbGxlZCB0aGUgZXZlbnQsIG5vIGZ1cnRoZXIgcGx1Z2lucyBhcmUgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbGlzdGVuTWV0aG9kLmFwcGx5KGluc3RhbmNlLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCIke2xpc3Rlbk1ldGhvZH1cIiBtZXRob2QgaW4gXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlW2xpc3Rlbk1ldGhvZF0oLi4ucGFyYW1ldGVycykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBHbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cIiBjYW5jZWxsZWQgYnkgXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBMaXN0ZW4gbWV0aG9kIGZvciBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGluIFwiJHtuYW1lfVwiIHBsdWdpbiBpcyBub3QgYSBmdW5jdGlvbiBvciBzdHJpbmcuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYWQtaG9jIGxpc3RlbmVycyBmb3IgdGhpcyBldmVudC5cbiAgICAgICAgaWYgKCFjYW5jZWxsZWQgJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSAmJiB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZvdW5kICR7dGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGh9IGFkLWhvYyBsaXN0ZW5lcihzKSBmb3IgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgbGlzdGVuZXIgaGFzIGNhbmNlbGxlZCB0aGUgZXZlbnQsIG5vIGZ1cnRoZXIgbGlzdGVuZXJzIGFyZSBjb25zaWRlcmVkLlxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciguLi5wYXJhbWV0ZXJzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBHbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX0gY2FuY2VsbGVkIGJ5IGFuIGFkLWhvYyBsaXN0ZW5lci5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhY2FuY2VsbGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgZ2xvYmFsIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMsIGV4cGVjdGluZyBhIFByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgYWxsLlxuICAgICAqXG4gICAgICogVGhpcyBjb2xsYXRlcyBhbGwgcGx1Z2lucyByZXNwb25zZXMgaW50byBvbmUgbGFyZ2UgUHJvbWlzZSB0aGF0IGVpdGhlciBleHBlY3RzIGFsbCB0byBiZSByZXNvbHZlZCwgb3Igb25lIHRvIHJlamVjdC5cbiAgICAgKiBJZiBubyBsaXN0ZW5lcnMgYXJlIGZvdW5kLCBhIHJlc29sdmVkIFByb21pc2UgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICovXG4gICAgZ2xvYmFsUHJvbWlzZUV2ZW50KGV2ZW50TmFtZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmRlYnVnKGBDYWxsaW5nIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAvLyBGaW5kIHBsdWdpbnMgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYE5vIGxpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoYExpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cIjogJHtsaXN0ZW5lcnMuam9pbignLCAnKX1gKTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmdldFBsdWdpbihuYW1lKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmdldEluc3RhbmNlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3Rlbk1ldGhvZCA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJylbZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyIG1ldGhvZHMgZm9yIGFsbCBwbHVnaW5zLCBpZiB0aGV5IGhhdmUgYSBtZXRob2Qgc3BlY2lmaWVkIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAgICBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VQcm9taXNlID0gbGlzdGVuTWV0aG9kLmFwcGx5KGluc3RhbmNlLCBwYXJhbWV0ZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGluc3RhbmNlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwiJHtsaXN0ZW5NZXRob2R9XCIgbWV0aG9kIGluIFwiJHtuYW1lfVwiIHBsdWdpbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlUHJvbWlzZSA9IGluc3RhbmNlW2xpc3Rlbk1ldGhvZF0oLi4ucGFyYW1ldGVycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZVByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbnN0YW5jZVByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgcHJvbWlzZSBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBMaXN0ZW4gbWV0aG9kIGZvciBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGluIFwiJHtuYW1lfVwiIHBsdWdpbiBpcyBub3QgYSBmdW5jdGlvbiBvciBzdHJpbmcuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYWQtaG9jIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gdGhpcyBldmVudC5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBGb3VuZCAke3RoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RofSBhZC1ob2MgbGlzdGVuZXIocykgZm9yIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyUHJvbWlzZSA9IGxpc3RlbmVyKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gobGlzdGVuZXJQcm9taXNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIHByb21pc2UgZXZlbnQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgc3R5bGVkIG1lc3NhZ2UgaW4gdGhlIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBJbmNsdWRlcyBwYXJhbWV0ZXJzIGFuZCBhIHN0YWNrIHRyYWNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbG9nTWVzc2FnZShjb2xvciwgYm9sZCwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAgICAgJyVjW1Nub3dib2FyZF0nLFxuICAgICAgICAgICAgYGNvbG9yOiAke2NvbG9yfTsgZm9udC13ZWlnaHQ6ICR7KGJvbGQpID8gJ2JvbGQnIDogJ25vcm1hbCd9O2AsXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgICAgICAgICBgJWNQYXJhbWV0ZXJzICVjKCR7cGFyYW1ldGVycy5sZW5ndGh9KWAsXG4gICAgICAgICAgICAgICAgJ2NvbG9yOiByZ2IoNDUsIDE2NywgMTk5KTsgZm9udC13ZWlnaHQ6IGJvbGQ7JyxcbiAgICAgICAgICAgICAgICAnY29sb3I6IHJnYig4OCwgODgsIDg4KTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAlYyR7aW5kZXh9OmAsICdjb2xvcjogcmdiKDg4LCA4OCwgODgpOyBmb250LXdlaWdodDogbm9ybWFsOycsIHBhcmFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKCclY1RyYWNlJywgJ2NvbG9yOiByZ2IoNDUsIDE2NywgMTk5KTsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGxvZyhtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDQ1LCAxNjcsIDE5OSknLCBmYWxzZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgZGVidWcgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFRoZXNlIG1lc3NhZ2VzIGFyZSBvbmx5IHNob3duIHdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkZWJ1ZyhtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICghdGhpcy5kZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDQ1LCAxNjcsIDE5OSknLCBmYWxzZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZXJyb3IobWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UoJ3JnYigyMjksIDM1LCAzNSknLCB0cnVlLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUNvb2tpZSBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBDb29raWUgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBcImpzLWNvb2tpZVwiIGxpYnJhcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vanMtY29va2llL2pzLWNvb2tpZVxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZSBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgICAgICAgZXhwaXJlczogbnVsbCxcbiAgICAgICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgICAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgICAgIHNlY3VyZTogZmFsc2UsXG4gICAgICAgICAgICBzYW1lU2l0ZTogJ0xheCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGNvb2tpZSBwYXJhbWV0ZXJzIGZvciBhbGwgc3Vic2VxdWVudCBcInNldFwiIGFuZCBcInJlbW92ZVwiIGNhbGxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBzZXREZWZhdWx0cyhvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29va2llIGRlZmF1bHRzIG11c3QgYmUgcHJvdmlkZWQgYXMgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb29raWUgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0ge307XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5kZWZhdWx0cykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0c1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29va2llIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBJZiBgbmFtZWAgaXMgdW5kZWZpbmVkLCByZXR1cm5zIGFsbCBjb29raWVzIGFzIGFuIE9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IEJhc2VDb29raWUuZ2V0KCk7XG5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGNvb2tpZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2Nvb2tpZU5hbWUsIGNvb2tpZVZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Nvb2tpZS5nZXQnLCBjb29raWVOYW1lLCBjb29raWVWYWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZXNbY29va2llTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29va2llcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IEJhc2VDb29raWUuZ2V0KG5hbWUpO1xuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gb3ZlcnJpZGUgdGhlIGdvdHRlbiB2YWx1ZVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLmdldCcsIG5hbWUsIHZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvb2tpZSBwYXJhbWV0ZXJzIHRocm91Z2ggdGhlIFwib3B0aW9uc1wiIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHNldChuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgc2F2ZVZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBvdmVycmlkZSB0aGUgdmFsdWUgdG8gc2F2ZVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLnNldCcsIG5hbWUsIHZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHNhdmVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQmFzZUNvb2tpZS5zZXQobmFtZSwgc2F2ZVZhbHVlLCB7XG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRzKCksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgYWRkaXRpb25hbCBjb29raWUgcGFyYW1ldGVycyB2aWEgdGhlIFwib3B0aW9uc1wiIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmUobmFtZSwgb3B0aW9ucykge1xuICAgICAgICBCYXNlQ29va2llLnJlbW92ZShuYW1lLCB7XG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRzKCksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEpTT04gUGFyc2VyIHV0aWxpdHkuXG4gKlxuICogVGhpcyB1dGlsaXR5IHBhcnNlcyBKU09OLWxpa2UgZGF0YSB0aGF0IGRvZXMgbm90IHN0cmljdGx5IG1lZXQgdGhlIEpTT04gc3BlY2lmaWNhdGlvbnMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgZGV2ZWxvcG1lbnQuXG4gKiBJdCBpcyBhIHNhZmUgcmVwbGFjZW1lbnQgZm9yIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZhbChcIih7XCIgKyB2YWx1ZSArIFwifSlcIikpKSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdGhlIHVzZSBvZiBldmFsKClcbiAqXG4gKiBAYXV0aG9yIEF5dW1pIEhhbWFzYWtpXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2JlcmNtcy9vY3RvYmVyL3B1bGwvNDUyN1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKc29uUGFyc2VyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIC8vIEFkZCB0byBnbG9iYWwgZnVuY3Rpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHdpbmRvdy53bkpTT04gPSAoanNvbikgPT4gdGhpcy5wYXJzZShqc29uKTtcbiAgICAgICAgd2luZG93Lm9jSlNPTiA9IHdpbmRvdy53bkpTT047XG4gICAgfVxuXG4gICAgcGFyc2Uoc3RyKSB7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB0aGlzLnBhcnNlU3RyaW5nKHN0cik7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuICAgIH1cblxuICAgIHBhcnNlU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGxldCBzdHIgPSB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgaWYgKCFzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb2tlbiBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgbGV0IHR5cGUgPSBudWxsO1xuICAgICAgICBsZXQga2V5ID0gbnVsbDtcbiAgICAgICAgbGV0IGJvZHkgPSAnJztcblxuICAgICAgICAvKlxuICAgICAgICAqIHRoZSBtaXN0YWtlICcsJ1xuICAgICAgICAqL1xuICAgICAgICB3aGlsZSAoc3RyICYmIHN0clswXSA9PT0gJywnKSB7XG4gICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBzdHJpbmdcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ1wiJyB8fCBzdHJbMF0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSAhPT0gc3RyWzBdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZyBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYm9keSA9ICdcIic7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2kgKyAxXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gc3RyWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSAnXFxcXFwiJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcgSlNPTiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIGJvb2xlYW5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0ciA9PT0gJ3RydWUnIHx8IHN0ciA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogbnVsbFxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIG51bWJlclxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIoc3RyKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bS50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBvYmplY3RcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ3snKSB7XG4gICAgICAgICAgICB0eXBlID0gJ25lZWRLZXknO1xuICAgICAgICAgICAga2V5ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdCA9ICd7JztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0JsYW5rQ2hhcihzdHJbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICduZWVkS2V5JyAmJiAoc3RyW2ldID09PSAnXCInIHx8IHN0cltpXSA9PT0gJ1xcJycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VLZXkoc3RyLCBpICsgMSwgc3RyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGBcIiR7a2V5fVwiYDtcbiAgICAgICAgICAgICAgICAgICAgaSArPSBrZXkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJLZXknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25lZWRLZXknICYmIHRoaXMuY2FuQmVLZXlIZWFkKHN0cltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZUtleShzdHIsIGkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0ga2V5Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJLZXknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FmdGVyS2V5JyAmJiBzdHJbaV0gPT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzonO1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJzonO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmdldEJvZHkoc3RyLCBpKTtcblxuICAgICAgICAgICAgICAgICAgICBpID0gaSArIGJvZHkub3JpZ2luTGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMucGFyc2VTdHJpbmcoYm9keS5ib2R5KTtcblxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyQm9keSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYWZ0ZXJCb2R5JyB8fCB0eXBlID09PSAnbmVlZEtleScpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RyW2xhc3RdID09PSAnLCcgfHwgdGhpcy5pc0JsYW5rQ2hhcihzdHJbbGFzdF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltsYXN0XSA9PT0gJ30nICYmIGxhc3QgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ30nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAhPT0gaSAmJiByZXN1bHQgIT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnbmVlZEtleSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gbGFzdCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gb2JqZWN0IG5lYXIgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIGFycmF5XG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHJbMF0gPT09ICdbJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gJ1snO1xuICAgICAgICAgICAgdHlwZSA9ICduZWVkQm9keSc7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcgJyB8fCBzdHJbaV0gPT09ICdcXG4nIHx8IHN0cltpXSA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25lZWRCb2R5Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbnVsbCwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXScgJiYgaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuZ2V0Qm9keShzdHIsIGkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGkgPSBpICsgYm9keS5vcmlnaW5MZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5wYXJzZVN0cmluZyhib2R5LmJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJCb2R5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhZnRlckJvZHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnbmVlZEJvZHknO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggbWlzdGFrZSBcIixcIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cltpICsgMV0gPT09ICcsJyB8fCB0aGlzLmlzQmxhbmtDaGFyKHN0cltpICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpICsgMV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ251bGwsJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ10nICYmIGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ10nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBhcnJheSBuZWFyICR7cmVzdWx0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGdldEJvZHkoc3RyLCBwb3MpIHtcbiAgICAgICAgbGV0IGJvZHkgPSAnJztcblxuICAgICAgICAvLyBwYXJzZSBzdHJpbmcgYm9keVxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICdcIicgfHwgc3RyW3Bvc10gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICBib2R5ID0gc3RyW3Bvc107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwb3MgKyAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBzdHJbcG9zXSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltwb3NdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIHN0cmluZyBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgdHJ1ZSAvIGZhbHNlXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ3QnKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ3RydWUnLCBwb3MpID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6ICd0cnVlJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvb2xlYW4gYm9keSBuZWFyICR7c3RyLnN1YnN0cigwLCBwb3MgKyAxMCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnZicpIHtcbiAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZignZicsIHBvcykgPT09IHBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogJ2ZhbHNlJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICdmYWxzZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgbnVsbFxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICduJykge1xuICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCdudWxsJywgcG9zKSA9PT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiAnbnVsbCcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAnbnVsbCcsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgbnVtYmVyXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJy0nIHx8IHN0cltwb3NdID09PSAnKycgfHwgc3RyW3Bvc10gPT09ICcuJyB8fCAoc3RyW3Bvc10gPj0gJzAnICYmIHN0cltwb3NdIDw9ICc5JykpIHtcbiAgICAgICAgICAgIGJvZHkgPSAnJztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICctJyB8fCBzdHJbaV0gPT09ICcrJyB8fCBzdHJbaV0gPT09ICcuJyB8fCAoc3RyW2ldID49ICcwJyAmJiBzdHJbaV0gPD0gJzknKSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIG51bWJlciBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2Ugb2JqZWN0XG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ3snIHx8IHN0cltwb3NdID09PSAnWycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gW1xuICAgICAgICAgICAgICAgIHN0cltwb3NdLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGJvZHkgPSBzdHJbcG9zXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvcyArIDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0cltpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXCInICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goJ3snKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICd9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgnWycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OICR7KHN0cltwb3NdID09PSAneycgPyAnb2JqZWN0JyA6ICdhcnJheScpfSBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6IGkgLSBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9keSBuZWFyICR7c3RyLnN1YnN0cigocG9zIC0gNSA+PSAwKSA/IHBvcyAtIDUgOiAwLCA1MCl9YCk7XG4gICAgfVxuXG4gICAgcGFyc2VLZXkoc3RyLCBwb3MsIHF1b3RlKSB7XG4gICAgICAgIGxldCBrZXkgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAocXVvdGUgJiYgcXVvdGUgPT09IHN0cltpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXF1b3RlICYmIChzdHJbaV0gPT09ICcgJyB8fCBzdHJbaV0gPT09ICc6JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBrZXkgKz0gc3RyW2ldO1xuXG4gICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcgJiYgaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAga2V5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBzeW50YXggbmVhciAke2tleX1gKTtcbiAgICB9XG5cbiAgICBjYW5CZUtleUhlYWQoY2gpIHtcbiAgICAgICAgaWYgKGNoWzBdID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNoWzBdID49ICdhJyAmJiBjaFswXSA8PSAneicpIHx8IChjaFswXSA+PSAnQScgJiYgY2hbMF0gPD0gJ1onKSB8fCBjaFswXSA9PT0gJ18nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hbMF0gPj0gJzAnICYmIGNoWzBdIDw9ICc5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoWzBdID09PSAnJCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaC5jaGFyQ29kZUF0KDApID4gMjU1KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0JsYW5rQ2hhcihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICdcXHQnO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogU2FuaXRpemVyIHV0aWxpdHkuXG4gKlxuICogQ2xpZW50LXNpZGUgSFRNTCBzYW5pdGl6ZXIgZGVzaWduZWQgbW9zdGx5IHRvIHByZXZlbnQgc2VsZi1YU1MgYXR0YWNrcy5cbiAqIFRoZSBzYW5pdGl6ZXIgdXRpbGl0eSB3aWxsIHN0cmlwIGFsbCBhdHRyaWJ1dGVzIHRoYXQgc3RhcnQgd2l0aCBgb25gICh1c3VhbGx5IEpTIGV2ZW50IGhhbmRsZXJzIGFzIGF0dHJpYnV0ZXMsIGkuZS4gYG9ubG9hZGAgb3IgYG9uZXJyb3JgKSBvciBjb250YWluIHRoZSBgamF2YXNjcmlwdDpgIHBzZXVkbyBwcm90b2NvbCBpbiB0aGVpciB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2FuaXRpemVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIC8vIEFkZCB0byBnbG9iYWwgZnVuY3Rpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHdpbmRvdy53blNhbml0aXplID0gKGh0bWwpID0+IHRoaXMuc2FuaXRpemUoaHRtbCk7XG4gICAgICAgIHdpbmRvdy5vY1Nhbml0aXplID0gd2luZG93LnduU2FuaXRpemU7XG4gICAgfVxuXG4gICAgc2FuaXRpemUoaHRtbCwgYm9keU9ubHkpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3QgcmV0dXJuQm9keU9ubHkgPSAoYm9keU9ubHkgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgYm9keU9ubHkgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgID8gYm9keU9ubHlcbiAgICAgICAgICAgIDogdHJ1ZTtcblxuICAgICAgICB0aGlzLnNhbml0aXplTm9kZShkb20uZ2V0Um9vdE5vZGUoKSk7XG5cbiAgICAgICAgcmV0dXJuIChyZXR1cm5Cb2R5T25seSkgPyBkb20uYm9keS5pbm5lckhUTUwgOiBkb20uaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIHNhbml0aXplTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnRhZ05hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmltQXR0cmlidXRlcyhub2RlKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20obm9kZS5jaGlsZHJlbik7XG5cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2FuaXRpemVOb2RlKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJpbUF0dHJpYnV0ZXMobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gbm9kZS5hdHRyaWJ1dGVzLml0ZW0oaSkubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IG5vZGUuYXR0cmlidXRlcy5pdGVtKGkpLnZhbHVlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgKiByZW1vdmUgYXR0cmlidXRlcyB3aGVyZSB0aGUgbmFtZXMgc3RhcnQgd2l0aCBcIm9uXCIgKGZvciBleGFtcGxlOiBvbmxvYWQsIG9uZXJyb3IuLi4pXG4gICAgICAgICAgICAqIHJlbW92ZSBhdHRyaWJ1dGVzIHdoZXJlIHRoZSB2YWx1ZSBzdGFydHMgd2l0aCB0aGUgXCJqYXZhc2NyaXB0OlwiIHBzZXVkbyBwcm90b2NvbCAoZm9yIGV4YW1wbGUgaHJlZj1cImphdmFzY3JpcHQ6YWxlcnQoMSlcIilcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgIGlmIChhdHRyTmFtZS5pbmRleE9mKCdvbicpID09PSAwIHx8IGF0dHJWYWx1ZS5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBVUkwgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgcHJvdmlkZXMgVVJMIGZ1bmN0aW9ucy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXJsIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXNlVXJsKCk7XG4gICAgICAgIHRoaXMuYXNzZXRVcmwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgVVJMIGJhc2VkIG9uIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKlxuICAgICAqIElmIGFuIGFic29sdXRlIFVSTCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB0byh1cmwpIHtcbiAgICAgICAgY29uc3QgdXJsUmVnZXggPSAvXig/OlteOl0rOlxcL1xcLylbLWEtejAtOUA6JS5fK34jPV17MSwyNTZ9XFxiKFstYS16MC05KClAOiVfKy5+Iz8mLy89XSopL2k7XG5cbiAgICAgICAgaWYgKHVybC5tYXRjaCh1cmxSZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aGVVcmwgPSB1cmwucmVwbGFjZSgvXlxcLysvLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYmFzZVVybCgpfSR7dGhlVXJsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBBc3NldCBVUkwgYmFzZWQgb24gYSByZWxhdGl2ZSBwYXRoLlxuICAgICAqXG4gICAgICogSWYgYW4gYWJzb2x1dGUgVVJMIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzc2V0KHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKD86W146XSs6XFwvXFwvKVstYS16MC05QDolLl8rfiM9XXsxLDI1Nn1cXGIoWy1hLXowLTkoKUA6JV8rLn4jPyYvLz1dKikvaTtcblxuICAgICAgICBpZiAodXJsLm1hdGNoKHVybFJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRoZVVybCA9IHVybC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5hc3NldFVybCgpfSR7dGhlVXJsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGJhc2UgVVJMIG9mIHRoaXMgaW5zdGFsbC5cbiAgICAgKlxuICAgICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgYmFzZSBVUkwgZnJvbSB0aHJlZSBzb3VyY2VzLCBpbiBvcmRlcjpcbiAgICAgKiAgLSBJZiBTbm93Ym9hcmQgaXMgbG9hZGVkIHZpYSB0aGUgYHslIHNub3dib2FyZCAlfWAgdGFnLCBpdCB3aWxsIHJldHJpZXZlIHRoZSBiYXNlIFVSTCB0aGF0XG4gICAgICogaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCB0aGVyZS5cbiAgICAgKiAgLSBJZiBhIGA8YmFzZT5gIHRhZyBpcyBhdmFpbGFibGUsIGl0IHdpbGwgdXNlIHRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBiYXNlIHRhZy5cbiAgICAgKiAgLSBGaW5hbGx5LCBpdCB3aWxsIHRha2UgYSBndWVzcyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIHdpbGwgbGlrZWx5IG5vdCB3b3JrIGZvciBzaXRlc1xuICAgICAqIHRoYXQgcmVzaWRlIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgICAqXG4gICAgICogVGhlIGJhc2UgVVJMIHdpbGwgYWx3YXlzIGNvbnRhaW4gYSB0cmFpbGluZyBiYWNrc2xhc2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGJhc2VVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvdW5kQmFzZVVybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKS5kYXRhc2V0LmJhc2VVcmwpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJykuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSBbXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsXG4gICAgICAgICAgICAnLy8nLFxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgICAgICAnLycsXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdXJsUGFydHMuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBhc3NldCBVUkwgb2YgdGhpcyBpbnN0YWxsLlxuICAgICAqXG4gICAgICogVGhpcyBkZXRlcm1pbmVzIHRoZSBiYXNlIFVSTCBmcm9tIHRocmVlIHNvdXJjZXMsIGluIG9yZGVyOlxuICAgICAqICAtIElmIFNub3dib2FyZCBpcyBsb2FkZWQgdmlhIHRoZSBgeyUgc25vd2JvYXJkICV9YCB0YWcsIGl0IHdpbGwgcmV0cmlldmUgdGhlIGFzc2V0IFVSTCB0aGF0XG4gICAgICogaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCB0aGVyZS5cbiAgICAgKiAgLSBJZiBhIGA8bGluayByZWw9XCJhc3NldF91cmxcIiBocmVmPVwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiPmAgdGFnIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCB1c2UgdGhlIFVSTCBzcGVjaWZpZWQgaW4gdGhlIGxpbmsgdGFnLlxuICAgICAqICAtIEZpbmFsbHksIGl0IHdpbGwgdGFrZSBhIGd1ZXNzIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgd2lsbCBsaWtlbHkgbm90IHdvcmsgZm9yIHNpdGVzXG4gICAgICogdGhhdCByZXNpZGUgaW4gc3ViZGlyZWN0b3JpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYXNzZXQgVVJMIHdpbGwgYWx3YXlzIGNvbnRhaW4gYSB0cmFpbGluZyBiYWNrc2xhc2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzc2V0VXJsKCkge1xuICAgICAgICBpZiAodGhpcy5mb3VuZEFzc2V0VXJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykuZGF0YXNldC5hc3NldFVybCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiYXNzZXRfdXJsXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiYXNzZXRfdXJsXCJdJykuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gW1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgICAgICAgJy8vJyxcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LFxuICAgICAgICAgICAgJy8nLFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSB1cmxQYXJ0cy5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgYmFzZSBVUkwsIGVuc3VyaW5nIGl0IGlzIGEgSFRUUC9IVFRQcyBVUkwuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgU25vd2JvYXJkIHNjcmlwdCBvciA8YmFzZT4gdGFnIG9uIHRoZSBwYWdlIHVzZSBhIGRpZmZlcmVudCB0eXBlIG9mIFVSTCwgdGhpcyB3aWxsIGZhaWwgd2l0aFxuICAgICAqIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdmFsaWRhdGVCYXNlVXJsKHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIyguKikpPy9pO1xuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IHVybFJlZ2V4LmV4ZWModXJsKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB1cmxQYXJ0c1syXTtcbiAgICAgICAgY29uc3QgZG9tYWluID0gdXJsUGFydHNbNF07XG5cbiAgICAgICAgaWYgKHByb3RvY29sICYmIFsnaHR0cCcsICdodHRwcyddLmluZGV4T2YocHJvdG9jb2wudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZSBVUkwgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvbWFpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhc2UgVVJMIGRldGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHVybC5zdWJzdHIoLTEpID09PSAnLycpXG4gICAgICAgICAgICA/IHVybFxuICAgICAgICAgICAgOiBgJHt1cmx9L2A7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNub3dib2FyZCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkJztcbmltcG9ydCBQcm94eUhhbmRsZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Byb3h5SGFuZGxlcic7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdCc7XG5pbXBvcnQgQXR0cmlidXRlUmVxdWVzdCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvaGFuZGxlcnMvQXR0cmlidXRlUmVxdWVzdCc7XG5pbXBvcnQgQXNzZXRMb2FkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvQXNzZXRMb2FkZXInO1xuaW1wb3J0IERhdGFDb25maWcgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRGF0YUNvbmZpZyc7XG5pbXBvcnQgU3R5bGVzaGVldExvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHlsZXNoZWV0TG9hZGVyJztcbmltcG9ydCBUcmFuc2l0aW9uIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyYW5zaXRpb24nO1xuaW1wb3J0IEZsYXNoIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoJztcbmltcG9ydCBGbGFzaExpc3RlbmVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoTGlzdGVuZXInO1xuaW1wb3J0IEZvcm1WYWxpZGF0aW9uIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Zvcm1WYWxpZGF0aW9uJztcbmltcG9ydCBBdHRhY2hMb2FkaW5nIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0F0dGFjaExvYWRpbmcnO1xuaW1wb3J0IFN0cmlwZUxvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHJpcGVMb2FkZXInO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlcic7XG5cbigod2luZG93KSA9PiB7XG4gICAgY29uc3Qgc25vd2JvYXJkID0gbmV3IFByb3h5KFxuICAgICAgICBuZXcgU25vd2JvYXJkKHRydWUsIHRydWUpLFxuICAgICAgICBQcm94eUhhbmRsZXIsXG4gICAgKTtcblxuICAgIC8vIENvdmVyIGFsbCBhbGlhc2VzXG4gICAgd2luZG93LnNub3dib2FyZCA9IHNub3dib2FyZDtcbiAgICB3aW5kb3cuU25vd2JvYXJkID0gc25vd2JvYXJkO1xuICAgIHdpbmRvdy5Tbm93Qm9hcmQgPSBzbm93Ym9hcmQ7XG5cbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdyZXF1ZXN0JywgUmVxdWVzdCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignYXR0cmlidXRlUmVxdWVzdCcsIEF0dHJpYnV0ZVJlcXVlc3QpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2Fzc2V0TG9hZGVyJywgQXNzZXRMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2RhdGFDb25maWcnLCBEYXRhQ29uZmlnKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdleHRyYXNTdHlsZXMnLCBTdHlsZXNoZWV0TG9hZGVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCd0cmFuc2l0aW9uJywgVHJhbnNpdGlvbik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZmxhc2gnLCBGbGFzaCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZmxhc2hMaXN0ZW5lcicsIEZsYXNoTGlzdGVuZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2Zvcm1WYWxpZGF0aW9uJywgRm9ybVZhbGlkYXRpb24pO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2F0dGFjaExvYWRpbmcnLCBBdHRhY2hMb2FkaW5nKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdzdHJpcGVMb2FkZXInLCBTdHJpcGVMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3RyaWdnZXInLCBUcmlnZ2VyKTtcblxuICAgIHNub3dib2FyZC5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICAgIC8vIFNjYW4gZm9yIHRyaWdnZXJzXG4gICAgICAgIEFycmF5XG4gICAgICAgICAgICAuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG4gICAgICAgICAgICAuZmlsdGVyKChlbGVtZW50KSA9PiBbLi4uZWxlbWVudC5hdHRyaWJ1dGVzXS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lLnN0YXJ0c1dpdGgoXCJkYXRhLXRyaWdnZXItXCIpKS5sZW5ndGggPiAwXG4gICAgICAgICAgICApLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzbm93Ym9hcmQudHJpZ2dlcihlbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xufSkod2luZG93KTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8qISBqcy1jb29raWUgdjMuMC41IHwgTUlUICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbmZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbnZhciBkZWZhdWx0Q29udmVydGVyID0ge1xuICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWVbMF0gPT09ICdcIicpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKCVbXFxkQS1GXXsyfSkrL2dpLCBkZWNvZGVVUklDb21wb25lbnQpXG4gIH0sXG4gIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKS5yZXBsYWNlKFxuICAgICAgLyUoMlszNDZCRl18M1tBQy1GXXw0MHw1W0JERV18NjB8N1tCQ0RdKS9nLFxuICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgKVxuICB9XG59O1xuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbmZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgZnVuY3Rpb24gc2V0IChuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlNSk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVzLmV4cGlyZXMpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgIH1cblxuICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSlcbiAgICAgIC5yZXBsYWNlKC8lKDJbMzQ2Ql18NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICAgIC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XG5cbiAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgZm9yICh2YXIgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc7ICcgKyBhdHRyaWJ1dGVOYW1lO1xuXG4gICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAvLyAuLi5cbiAgICAgIC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAvLyBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLFxuICAgICAgLy8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgICAvLyAuLi5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnPScgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnNwbGl0KCc7JylbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgbmFtZSArICc9JyArIGNvbnZlcnRlci53cml0ZSh2YWx1ZSwgbmFtZSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gIH1cblxuICBmdW5jdGlvbiBnZXQgKG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCAoYXJndW1lbnRzLmxlbmd0aCAmJiAhbmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRvIHByZXZlbnQgdGhlIGZvciBsb29wIGluIHRoZSBmaXJzdCBwbGFjZSBhc3NpZ24gYW4gZW1wdHkgYXJyYXlcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICB2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdO1xuICAgIHZhciBqYXIgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYXJ0cyA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcbiAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJz0nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZvdW5kID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzBdKTtcbiAgICAgICAgamFyW2ZvdW5kXSA9IGNvbnZlcnRlci5yZWFkKHZhbHVlLCBmb3VuZCk7XG5cbiAgICAgICAgaWYgKG5hbWUgPT09IGZvdW5kKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZSA/IGphcltuYW1lXSA6IGphclxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoXG4gICAge1xuICAgICAgc2V0LFxuICAgICAgZ2V0LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlcykge1xuICAgICAgICBzZXQoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBhc3NpZ24oe30sIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IC0xXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGluaXQodGhpcy5jb252ZXJ0ZXIsIGFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKSlcbiAgICAgIH0sXG4gICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgIHJldHVybiBpbml0KGFzc2lnbih7fSwgdGhpcy5jb252ZXJ0ZXIsIGNvbnZlcnRlciksIHRoaXMuYXR0cmlidXRlcylcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoZGVmYXVsdEF0dHJpYnV0ZXMpIH0sXG4gICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgfVxuICApXG59XG5cbnZhciBhcGkgPSBpbml0KGRlZmF1bHRDb252ZXJ0ZXIsIHsgcGF0aDogJy8nIH0pO1xuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuZXhwb3J0IHsgYXBpIGFzIGRlZmF1bHQgfTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwidmFyIGRlZmVycmVkID0gW107XG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8gPSAocmVzdWx0LCBjaHVua0lkcywgZm4sIHByaW9yaXR5KSA9PiB7XG5cdGlmKGNodW5rSWRzKSB7XG5cdFx0cHJpb3JpdHkgPSBwcmlvcml0eSB8fCAwO1xuXHRcdGZvcih2YXIgaSA9IGRlZmVycmVkLmxlbmd0aDsgaSA+IDAgJiYgZGVmZXJyZWRbaSAtIDFdWzJdID4gcHJpb3JpdHk7IGktLSkgZGVmZXJyZWRbaV0gPSBkZWZlcnJlZFtpIC0gMV07XG5cdFx0ZGVmZXJyZWRbaV0gPSBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV07XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhciBub3RGdWxmaWxsZWQgPSBJbmZpbml0eTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV0gPSBkZWZlcnJlZFtpXTtcblx0XHR2YXIgZnVsZmlsbGVkID0gdHJ1ZTtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGNodW5rSWRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRpZiAoKHByaW9yaXR5ICYgMSA9PT0gMCB8fCBub3RGdWxmaWxsZWQgPj0gcHJpb3JpdHkpICYmIE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uTykuZXZlcnkoKGtleSkgPT4gKF9fd2VicGFja19yZXF1aXJlX18uT1trZXldKGNodW5rSWRzW2pdKSkpKSB7XG5cdFx0XHRcdGNodW5rSWRzLnNwbGljZShqLS0sIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZnVsZmlsbGVkID0gZmFsc2U7XG5cdFx0XHRcdGlmKHByaW9yaXR5IDwgbm90RnVsZmlsbGVkKSBub3RGdWxmaWxsZWQgPSBwcmlvcml0eTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYoZnVsZmlsbGVkKSB7XG5cdFx0XHRkZWZlcnJlZC5zcGxpY2UoaS0tLCAxKVxuXHRcdFx0dmFyIHIgPSBmbigpO1xuXHRcdFx0aWYgKHIgIT09IHVuZGVmaW5lZCkgcmVzdWx0ID0gcjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIi9hc3NldHMvanMvYXBwXCI6IDAsXG5cdFwiYXNzZXRzL2Nzcy90aGVtZVwiOiAwXG59O1xuXG4vLyBubyBjaHVuayBvbiBkZW1hbmQgbG9hZGluZ1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8uaiA9IChjaHVua0lkKSA9PiAoaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID09PSAwKTtcblxuLy8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG52YXIgd2VicGFja0pzb25wQ2FsbGJhY2sgPSAocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24sIGRhdGEpID0+IHtcblx0dmFyIFtjaHVua0lkcywgbW9yZU1vZHVsZXMsIHJ1bnRpbWVdID0gZGF0YTtcblx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG5cdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuXHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwO1xuXHRpZihjaHVua0lkcy5zb21lKChpZCkgPT4gKGluc3RhbGxlZENodW5rc1tpZF0gIT09IDApKSkge1xuXHRcdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYocnVudGltZSkgdmFyIHJlc3VsdCA9IHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdH1cblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHR9XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLk8ocmVzdWx0KTtcbn1cblxudmFyIGNodW5rTG9hZGluZ0dsb2JhbCA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmt3aW50ZXJjbXNfd29ya3Nob3BfdGhlbWVcIl0gPSBzZWxmW1wid2VicGFja0NodW5rd2ludGVyY21zX3dvcmtzaG9wX3RoZW1lXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGRlcGVuZHMgb24gb3RoZXIgbG9hZGVkIGNodW5rcyBhbmQgZXhlY3V0aW9uIG5lZWQgdG8gYmUgZGVsYXllZFxuX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgW1wiYXNzZXRzL2Nzcy90aGVtZVwiXSwgKCkgPT4gKF9fd2VicGFja19yZXF1aXJlX18oXCIuL2Fzc2V0cy9qcy9zcmMvYXBwLmpzXCIpKSlcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgW1wiYXNzZXRzL2Nzcy90aGVtZVwiXSwgKCkgPT4gKF9fd2VicGFja19yZXF1aXJlX18oXCIuL2Fzc2V0cy9jc3MvYmFzZS5jc3NcIikpKVxuX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcbiIsIiJdLCJuYW1lcyI6WyJQbHVnaW5CYXNlIiwic25vd2JvYXJkIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJjb25zdHJ1Y3QiLCJkZXBlbmRlbmNpZXMiLCJsaXN0ZW5zIiwiZGVzdHJ1Y3QiLCJkZXRhY2giLCJkZXN0cnVjdG9yIiwiZGVmYXVsdCIsIlNpbmdsZXRvbiIsIl9QbHVnaW5CYXNlIiwiX2NhbGxTdXBlciIsImFyZ3VtZW50cyIsIl9pbmhlcml0cyIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJlIiwidCIsInIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJuIiwiaGFzT3duUHJvcGVydHkiLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJpIiwiU3ltYm9sIiwiYSIsIml0ZXJhdG9yIiwiYyIsImFzeW5jSXRlcmF0b3IiLCJ1IiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ3cmFwIiwiR2VuZXJhdG9yIiwiY3JlYXRlIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsInR5cGUiLCJhcmciLCJjYWxsIiwiaCIsImwiLCJmIiwicyIsInkiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwicCIsImQiLCJnZXRQcm90b3R5cGVPZiIsInYiLCJ2YWx1ZXMiLCJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiaW52b2tlIiwiX3R5cGVvZiIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiRXJyb3IiLCJkb25lIiwibWV0aG9kIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJUeXBlRXJyb3IiLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwibGVuZ3RoIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwicmV2ZXJzZSIsInBvcCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiX3NsaWNlZFRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJpc0FycmF5Iiwib3duS2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIl9vYmplY3RTcHJlYWQiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwiX2RlZmluZVByb3BlcnRpZXMiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsIl9nZXRQcm90b3R5cGVPZiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiUmVmZXJlbmNlRXJyb3IiLCJCb29sZWFuIiwidmFsdWVPZiIsImJpbmQiLCJfc2V0UHJvdG90eXBlT2YiLCJSZXF1ZXN0IiwiZWxlbWVudCIsImhhbmRsZXIiLCJvcHRpb25zIiwiX3RoaXMiLCJpc0hhbmRsZXJOYW1lIiwibWF0Y2hlZEVsZW1lbnQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJjb25jYXQiLCJmZXRjaE9wdGlvbnMiLCJyZXNwb25zZURhdGEiLCJyZXNwb25zZUVycm9yIiwiY2FuY2VsbGVkIiwiY2hlY2tSZXF1ZXN0IiwiZ2xvYmFsRXZlbnQiLCJldmVudCIsIkV2ZW50IiwiY2FuY2VsYWJsZSIsInJlcXVlc3QiLCJkaXNwYXRjaEV2ZW50IiwiZGVmYXVsdFByZXZlbnRlZCIsImRvQ2xpZW50VmFsaWRhdGlvbiIsImNvbmZpcm0iLCJkb0NvbmZpcm0iLCJjb25maXJtZWQiLCJkb0FqYXgiLCJyZXNwb25zZSIsInByb2Nlc3NVcGRhdGUiLCJYX1dJTlRFUl9TVUNDRVNTIiwicHJvY2Vzc0Vycm9yIiwicHJvY2Vzc1Jlc3BvbnNlIiwiZXJyb3IiLCJFbGVtZW50IiwidW5kZWZpbmVkIiwiZ2V0RmV0Y2giLCJoZWFkZXJzIiwiYm9keSIsImRhdGEiLCJyZWRpcmVjdCIsIm1vZGUiLCJmZXRjaCIsInVybCIsImJyb3dzZXJWYWxpZGF0ZSIsImZvcm0iLCJjaGVja1ZhbGlkaXR5IiwicmVwb3J0VmFsaWRpdHkiLCJfdGhpczIiLCJhamF4UHJvbWlzZSIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwiaGFzIiwiZ2V0IiwiaW5jbHVkZXMiLCJqc29uIiwibWVzc2FnZSIsImV4Y2VwdGlvbiIsInJlbmRlckVycm9yIiwiZmlsZSIsImxpbmUiLCJ0cmFjZSIsInRleHQiLCJyZXNwb25zZVRleHQiLCJYX1dJTlRFUl9SRVNQT05TRV9DT0RFIiwicHJvbWlzZSIsIl90aGlzMyIsImJlZm9yZVVwZGF0ZSIsInBhcnRpYWxzIiwiZW50cmllcyIsImVudHJ5IiwiX2VudHJ5Iiwic3Vic3RyIiwiWF9XSU5URVJfQVNTRVRTIiwicHJvY2Vzc0Fzc2V0cyIsInByb21pc2VzIiwiZ2xvYmFsUHJvbWlzZUV2ZW50IiwiX2NhbGxlZSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJkb1VwZGF0ZSIsIndpbmRvdyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIl90aGlzNCIsImFmZmVjdGVkIiwiX2VudHJ5MiIsInBhcnRpYWwiLCJjb250ZW50Iiwic2VsZWN0b3IiLCJ1cGRhdGUiLCJlbGVtZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpbm5lckhUTUwiLCJzdWNjZXNzIiwiZmxhc2giLCJYX1dJTlRFUl9GTEFTSF9NRVNTQUdFUyIsInByb2Nlc3NGbGFzaE1lc3NhZ2VzIiwiWF9XSU5URVJfUkVESVJFQ1QiLCJwcm9jZXNzUmVkaXJlY3QiLCJwcm9jZXNzRXJyb3JNZXNzYWdlIiwic2tpcEVycm9yIiwiWF9XSU5URVJfRVJST1JfRklFTERTIiwicHJvY2Vzc1ZhbGlkYXRpb25FcnJvcnMiLCJYX1dJTlRFUl9FUlJPUl9NRVNTQUdFIiwiX3RoaXM1IiwiaGFuZGxlUmVkaXJlY3RSZXNwb25zZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJjcmVhdGVFdmVudCIsImV2ZW50TmFtZSIsIm9uY2UiLCJsb2NhdGlvbiIsImFzc2lnbiIsImhhbmRsZUVycm9yTWVzc2FnZSIsImFsZXJ0IiwibWVzc2FnZXMiLCJoYW5kbGVGbGFzaE1lc3NhZ2VzIiwiZmllbGRzIiwiaGFuZGxlVmFsaWRhdGlvbkVycm9ycyIsImFzc2V0cyIsIl9kb0NvbmZpcm0iLCJfY2FsbGVlMiIsImZ1bGZpbGxlZCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImhhbmRsZUNvbmZpcm1NZXNzYWdlIiwibGlzdGVuc1RvRXZlbnQiLCJ0MCIsInRhZ05hbWUiLCJjbG9zZXN0IiwiZXh0cmFjdFBhcnRpYWxzIiwieHNyZlRva2VuIiwibG9hZGluZyIsImhyZWYiLCJmaWxlcyIsIkZvcm1EYXRhIiwiZGVidWciLCJjb29raWUiLCJmb3JtRGF0YSIsIl9lbnRyeTMiLCJhcHBlbmQiLCJqb2luIiwiQXR0cmlidXRlUmVxdWVzdCIsIl9TaW5nbGV0b24iLCJyZWFkeSIsImFqYXhTZXR1cCIsImF0dGFjaEhhbmRsZXJzIiwiZGlzYWJsZURlZmF1bHRGb3JtVmFsaWRhdGlvbiIsImRldGFjaEhhbmRsZXJzIiwiX2dldCIsImNoYW5nZUhhbmRsZXIiLCJjbGlja0hhbmRsZXIiLCJrZXlEb3duSGFuZGxlciIsInN1Ym1pdEhhbmRsZXIiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidGFyZ2V0IiwibWF0Y2hlcyIsInByb2Nlc3NSZXF1ZXN0T25FbGVtZW50IiwiY3VycmVudEVsZW1lbnQiLCJwYXJlbnRFbGVtZW50IiwicHJldmVudERlZmF1bHQiLCJ2YWxpZFR5cGVzIiwiaW5kZXhPZiIsImdldEF0dHJpYnV0ZSIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInRyYWNrSW5wdXQiLCJkYXRhc2V0IiwicmVxdWVzdENvbmZpcm0iLCJyZXF1ZXN0UmVkaXJlY3QiLCJyZXF1ZXN0TG9hZGluZyIsInJlcXVlc3RGb3JtIiwicmVxdWVzdFVybCIsInBhcnNlRGF0YSIsInJlcXVlc3RVcGRhdGUiLCJyZXF1ZXN0RGF0YSIsIm9uQWpheFNldHVwIiwiZmllbGROYW1lIiwiZ2V0UGFyZW50UmVxdWVzdERhdGEiLCJlbGVtZW50RGF0YSIsImpzb25wYXJzZXIiLCJwYXJzZSIsImxhc3RWYWx1ZSIsImludGVydmFsIiwicmVzZXRUcmFja0lucHV0VGltZXIiLCJpbnB1dFRpbWVyIiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX24iLCJGIiwiQXNzZXRMb2FkZXIiLCJhamF4TG9hZEFzc2V0cyIsIl9sb2FkIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJzY3JpcHQiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwic3R5bGUiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiaW1hZ2UiLCJqcyIsImxvYWRTY3JpcHQiLCJ0MSIsImNzcyIsImxvYWRTdHlsZSIsInQyIiwidDMiLCJpbWciLCJsb2FkSW1hZ2UiLCJ0NCIsInQ1IiwibG9hZCIsIl94IiwiYXNzZXQiLCJsb2FkZWQiLCJkb21TY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiZG9tQ3NzIiwiaGVhZCIsIkltYWdlIiwic3JjIiwiQXR0YWNoTG9hZGluZyIsImFqYXhTdGFydCIsImFqYXhEb25lIiwibG9hZEVsZW1lbnRzIiwiY2xhc3NMaXN0IiwiYWRkIiwiZ2V0TG9hZGluZ0NsYXNzIiwiYXR0YWNoTG9hZGluZyIsInJlbW92ZSIsIkRhdGFDb25maWciLCJpbnN0YW5jZSIsImxvY2FsQ29uZmlnIiwiSFRNTEVsZW1lbnQiLCJpbnN0YW5jZUNvbmZpZyIsImFjY2VwdGVkQ29uZmlncyIsInJlZnJlc2giLCJjb25maWciLCJzZXQiLCJwZXJzaXN0IiwiZ2V0QWNjZXB0ZWRDb25maWdzIiwicHJvY2Vzc0NvbmZpZyIsImFjY2VwdEFsbERhdGFDb25maWdzIiwiZGVmYXVsdHMiLCJnZXREZWZhdWx0cyIsImNvZXJjZVZhbHVlIiwic3RyaW5nVmFsdWUiLCJzdGFydHNXaXRoIiwiYmFzZTY0c3RyIiwicmVwbGFjZSIsImRlY29kZWQiLCJhdG9iIiwidG9Mb3dlckNhc2UiLCJqc29uUGFyc2VyIiwiRmxhc2giLCJkdXJhdGlvbiIsImNsZWFyIiwidGltZXIiLCJmbGFzaFRpbWVyIiwicmVtb3ZlQXR0cmlidXRlIiwic3RvcFRpbWVyIiwic3RhcnRUaW1lciIsImFwcGVuZENoaWxkIiwidHJhbnNpdGlvbiIsInRpbWVyVHJhbnMiLCJjYW5jZWwiLCJGbGFzaExpc3RlbmVyIiwiYWpheEVycm9yTWVzc2FnZSIsImFqYXhGbGFzaE1lc3NhZ2VzIiwiZmxhc2hUeXBlIiwiZmxhc2hEdXJhdGlvbiIsImNzc0NsYXNzIiwiRm9ybVZhbGlkYXRpb24iLCJlcnJvckJhZ3MiLCJhamF4VmFsaWRhdGlvbkVycm9ycyIsImNvbGxlY3RFcnJvckJhZ3MiLCJkb1ZhbGlkYXRpb24iLCJpbnZhbGlkRmllbGRzIiwicmVxdWVzdFZhbGlkYXRlIiwiZXJyb3JCYWciLCJzaG93RXJyb3JCYWciLCJjbGVhclZhbGlkYXRpb24iLCJoaWRlRXJyb3JCYWciLCJyb290Tm9kZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIm1lc3NhZ2VMaXN0RWxlbWVudCIsInBsYWNlaG9sZGVyIiwiY3JlYXRlQ29tbWVudCIsImVycm9yQmFnRGF0YSIsInZhbGlkYXRlRm9yIiwic3BsaXQiLCJjbG9uZU5vZGUiLCJtZXNzYWdlTGlzdEFuY2hvciIsImN1c3RvbU1lc3NhZ2UiLCJ0ZXh0Q29udGVudCIsImNoaWxkTm9kZXMiLCJyZXBsYWNlQ2hpbGQiLCJpc0Nvbm5lY3RlZCIsImVycm9yQmFnVmFsaWRhdGVzRmllbGQiLCJmaXJzdEZpZWxkIiwiZmllbGQiLCJzaGlmdCIsIl9pbnZhbGlkRmllbGRzJGZpcnN0RiIsImVycm9ycyIsIm1lc3NhZ2VFbGVtZW50IiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJhZnRlciIsIl9pbnZhbGlkRmllbGRzJE9iamVjdCIsIlN0cmlwZUxvYWRlciIsImNvdW50ZXIiLCJjcmVhdGVTdHJpcGUiLCJzdHJpcGUiLCJzaG93IiwiaGlkZSIsImluZGljYXRvciIsInN0cmlwZUxvYWRlZCIsIm5ld1N0cmlwZSIsImZvcmNlIiwiU3R5bGVzaGVldExvYWRlciIsInN0eWxlc0xvYWRlZCIsImVuZHNXaXRoIiwic3R5bGVzaGVldCIsIlRyYW5zaXRpb24iLCJjYWxsYmFjayIsInRyYWlsVG8iLCJwYXJzZUR1cmF0aW9uIiwiZG9UcmFuc2l0aW9uIiwiZXZlbnRDbGFzc2VzIiwiX2xlbiIsImFyZ3MiLCJfa2V5IiwiYWN0aXZlIiwib3V0IiwicmV0dXJuQ2xhc3NlcyIsInRyYW5zaXRpb25EdXJhdGlvbiIsInJlc2V0Q2xhc3NlcyIsImV2ZW50Q2xhc3MiLCJnZXRDb21wdXRlZFN0eWxlIiwib25UcmFuc2l0aW9uRW5kIiwicGFyc2VkIiwiZXhlYyIsImFtb3VudCIsInVuaXQiLCJNYXRoIiwiZmxvb3IiLCJUcmlnZ2VyIiwidHJpZ2dlcnMiLCJNYXAiLCJldmVudHMiLCJTZXQiLCJwYXJzZVRyaWdnZXJzIiwic2l6ZSIsInJlc2V0RXZlbnRzIiwiY3JlYXRlVHJpZ2dlckV2ZW50cyIsInJ1bkV2ZW50cyIsImRhc2hTdHlsZSIsIm1hdGNoIiwidHJpZ2dlclBhcnRzIiwidHJpZ2dlck5hbWUiLCJ0cmlnZ2VyVHlwZSIsIl90cmlnZ2VyUGFydHMiLCJ0cmlnZ2VyIiwiZ2V0U2VsZWN0YWJsZUVsZW1lbnRzIiwiaXNWYWxpZENvbmRpdGlvbiIsImlzVmFsaWRBY3Rpb24iLCJwYXJzZUNvbW1hbmQiLCJjb21tYW5kIiwidHJpbSIsInNwbGl0VmFsdWVzIiwicXVvdGVkIiwibWFwIiwic3BsaXRWYWx1ZSIsIl90b0NvbnN1bWFibGVBcnJheSIsInBhcmFtZXRlcnMiLCJfY29tbWFuZCRzcGxpdCIsIl9jb21tYW5kJHNwbGl0MiIsIl90aGlzMiRwYXJzZUNvbW1hbmQiLCJjcmVhdGVWYWx1ZUV2ZW50IiwiY3JlYXRlRW1wdHlFdmVudCIsImFsbCIsInN1cHBvcnRlZEVsZW1lbnRzIiwidGhpc0V2ZW50IiwiZWxlbWVudFZhbHVlcyIsImNoZWNrZWQiLCJldmVyeSIsImV4ZWN1dGVBY3Rpb24iLCJzb21lIiwiZWxlbWVudEV2ZW50IiwiY29uZGl0aW9uTWV0IiwiX3RoaXMkcGFyc2VDb21tYW5kIiwiYWN0aW9uU2hvdyIsImRpc3BsYXkiLCJvcmlnaW5hbERpc3BsYXkiLCJhZnRlckFjdGlvbiIsInByb3AiLCJyZWNlaXZlciIsInByb3BMb3dlciIsImhhc1BsdWdpbiIsIl9SZWZsZWN0JGdldCRwcm9wTG93ZSIsImdldEluc3RhbmNlIiwiSW5uZXJQcm94eUhhbmRsZXIiLCJQbHVnaW5Mb2FkZXIiLCJQcm94eSIsImZyZWV6ZSIsImluc3RhbmNlcyIsInNpbmdsZXRvbiIsImluaXRpYWxpc2VkIiwic2VhbCIsIm1vY2tzIiwib3JpZ2luYWxGdW5jdGlvbnMiLCJoYXNNZXRob2QiLCJtZXRob2ROYW1lIiwiaXNGdW5jdGlvbiIsImNhbGxNZXRob2QiLCJfbGVuMiIsIl9rZXkyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwidW5tZXQiLCJnZXREZXBlbmRlbmNpZXMiLCJpdGVtIiwiZ2V0UGx1Z2luTmFtZXMiLCJpc1NpbmdsZXRvbiIsImluaXRpYWxpc2VTaW5nbGV0b24iLCJfbGVuMyIsInBhcmFtcyIsIl9rZXkzIiwiX2VudHJ5NCIsIl9sZW40IiwiX2tleTQiLCJuZXdJbnN0YW5jZSIsIl9jb25zdHJ1Y3QiLCJzcGxpY2UiLCJnZXRJbnN0YW5jZXMiLCJpc0luaXRpYWxpc2VkIiwiX2xlbjUiLCJfa2V5NSIsInBsdWdpbiIsIm1vY2siLCJfbGVuNiIsIl9rZXk2IiwidW5tb2NrIiwiQ29va2llIiwiSnNvblBhcnNlciIsIlNhbml0aXplciIsIlVybCIsIlNub3dib2FyZCIsImF1dG9TaW5nbGV0b25zIiwiZGVidWdFbmFibGVkIiwiYXV0b0luaXRTaW5nbGV0b25zIiwicGx1Z2lucyIsImxpc3RlbmVycyIsImZvdW5kQmFzZVVybCIsInJlYWRpbmVzcyIsImRvbSIsImF0dGFjaEFic3RyYWN0cyIsImxvYWRVdGlsaXRpZXMiLCJpbml0aWFsaXNlIiwiYWRkUGx1Z2luIiwiaW5pdGlhbGlzZVNpbmdsZXRvbnMiLCJsb3dlck5hbWUiLCJnZXRQbHVnaW5zIiwicmVhZHlNZXRob2QiLCJyZW1vdmVQbHVnaW4iLCJnZXRQbHVnaW4iLCJvbiIsIm9mZiIsImluZGV4IiwibGlzdGVuTWV0aG9kIiwicmVzdWx0IiwibGlzdGVuZXIiLCJpbnN0YW5jZVByb21pc2UiLCJsaXN0ZW5lclByb21pc2UiLCJsb2dNZXNzYWdlIiwiY29sb3IiLCJib2xkIiwiY29uc29sZSIsImdyb3VwQ29sbGFwc2VkIiwicGFyYW0iLCJsb2ciLCJncm91cEVuZCIsIkJhc2VDb29raWUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsInNhbWVTaXRlIiwic2V0RGVmYXVsdHMiLCJjb29raWVzIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlIiwibmV3VmFsdWUiLCJzYXZlVmFsdWUiLCJ3bkpTT04iLCJvY0pTT04iLCJzdHIiLCJqc29uU3RyaW5nIiwicGFyc2VTdHJpbmciLCJKU09OIiwibnVtIiwiaXNCbGFua0NoYXIiLCJwYXJzZUtleSIsImNhbkJlS2V5SGVhZCIsImdldEJvZHkiLCJvcmlnaW5MZW5ndGgiLCJsYXN0IiwicG9zIiwic3RhY2siLCJxdW90ZSIsImNoIiwiY2hhckNvZGVBdCIsInduU2FuaXRpemUiLCJodG1sIiwic2FuaXRpemUiLCJvY1Nhbml0aXplIiwiYm9keU9ubHkiLCJwYXJzZXIiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJyZXR1cm5Cb2R5T25seSIsInNhbml0aXplTm9kZSIsImdldFJvb3ROb2RlIiwibm9kZSIsInRyaW1BdHRyaWJ1dGVzIiwiY2hpbGRyZW4iLCJjaGlsZCIsImF0dHJpYnV0ZXMiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImZvdW5kQXNzZXRVcmwiLCJiYXNlVXJsIiwiYXNzZXRVcmwiLCJ0byIsInVybFJlZ2V4IiwidGhlVXJsIiwidmFsaWRhdGVCYXNlVXJsIiwidXJsUGFydHMiLCJwcm90b2NvbCIsImhvc3QiLCJQcm94eUhhbmRsZXIiLCJTbm93Qm9hcmQiLCJfcmVmIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOzs7OztXQ3pCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLCtCQUErQix3Q0FBd0M7V0FDdkU7V0FDQTtXQUNBO1dBQ0E7V0FDQSxpQkFBaUIscUJBQXFCO1dBQ3RDO1dBQ0E7V0FDQSxrQkFBa0IscUJBQXFCO1dBQ3ZDO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOzs7OztXQzNCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7V0NOQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxNQUFNLHFCQUFxQjtXQUMzQjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTs7Ozs7VUVqREE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWJzdHJhY3RzL1BsdWdpbkJhc2UuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWJzdHJhY3RzL1NpbmdsZXRvbi5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWpheC9oYW5kbGVycy9BdHRyaWJ1dGVSZXF1ZXN0LmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9Bc3NldExvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvQXR0YWNoTG9hZGluZy5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRGF0YUNvbmZpZy5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2guanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoTGlzdGVuZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Zvcm1WYWxpZGF0aW9uLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHJpcGVMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0eWxlc2hlZXRMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyaWdnZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvbWFpbi9Jbm5lclByb3h5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1BsdWdpbkxvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Byb3h5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Nub3dib2FyZC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC91dGlsaXRpZXMvQ29va2llLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9Kc29uUGFyc2VyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9TYW5pdGl6ZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL1VybC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvanMvc3JjL2FwcC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL2Jhc2UuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLm1qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svcnVudGltZS9jaHVuayBsb2FkZWQiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGx1Z2luIGJhc2UgYWJzdHJhY3QuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgcGx1Z2lucy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgdGhlIFNub3dib2FyZCBmcmFtZXdvcmsgaW5zdGFuY2UsIGFuZCBzaG91bGQgbm90IGJlIG92ZXJ3cml0dGVuXG4gICAgICogdW5sZXNzIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Nub3dib2FyZH0gc25vd2JvYXJkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc25vd2JvYXJkKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkID0gc25vd2JvYXJkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsdWdpbiBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSB0cnVlIGNvbnN0cnVjdG9yIG9mIGEgcGx1Z2luLCBhbmQgY2FuIGJlIG92ZXJ3cml0dGVuLlxuICAgICAqIEl0IHdpbGwgYmUgY2FsbGVkIHN0cmFpZ2h0IGFmdGVyIGNvbnN0cnVjdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcmVxdWlyZWQgcGx1Z2lucyBmb3IgdGhpcyBzcGVjaWZpYyBtb2R1bGUgdG8gd29yay5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgcGx1Z2lucyByZXF1aXJlZCBmb3IgdGhpcyBtb2R1bGUgdG8gd29yaywgYXMgc3RyaW5ncy5cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBsaXN0ZW5lciBtZXRob2RzIGZvciBnbG9iYWwgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGRlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBGaXJlZCB3aGVuIHRoaXMgcGx1Z2luIGlzIHJlbW92ZWQuIENhbiBiZSBtYW51YWxseSBjYWxsZWQgaWYgeW91IGhhdmUgYW5vdGhlciBzY2VuYXJpbyBmb3JcbiAgICAgKiBkZXN0cnVjdGlvbiwgaWUuIHRoZSBlbGVtZW50IGF0dGFjaGVkIHRvIHRoZSBwbHVnaW4gaXMgcmVtb3ZlZCBvciBjaGFuZ2VkLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICB0aGlzLmRldGFjaCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5zbm93Ym9hcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGRlc3RydWN0b3IgKG9sZCBtZXRob2QgbmFtZSkuXG4gICAgICpcbiAgICAgKiBBbGxvd3MgcHJldmlvdXMgdXNhZ2Ugb2YgdGhlIFwiZGVzdHJ1Y3RvclwiIG1ldGhvZCB0byBzdGlsbCB3b3JrLlxuICAgICAqL1xuICAgIGRlc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFNpbmdsZXRvbiBwbHVnaW4gYWJzdHJhY3QuXG4gKlxuICogVGhpcyBpcyBhIHNwZWNpYWwgZGVmaW5pdGlvbiBjbGFzcyB0aGF0IHRoZSBTbm93Ym9hcmQgZnJhbWV3b3JrIHdpbGwgdXNlIHRvIGludGVycHJldCB0aGUgY3VycmVudCBwbHVnaW4gYXMgYVxuICogXCJzaW5nbGV0b25cIi4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBwbHVnaW4gY2xhc3MgaXMgdXNlZCBhY3Jvc3MgdGhlIGJvYXJkLlxuICpcbiAqIFNpbmdsZXRvbnMgYXJlIGluaXRpYWxpc2VkIG9uIHRoZSBcImRvbVJlYWR5XCIgZXZlbnQgYnkgZGVmYXVsdC5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2luZ2xldG9uIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogUmVxdWVzdCBwbHVnaW4uXG4gKlxuICogVGhpcyBpcyB0aGUgZGVmYXVsdCBBSkFYIGhhbmRsZXIgd2hpY2ggd2lsbCBydW4gdXNpbmcgdGhlIGBmZXRjaCgpYCBtZXRob2QgdGhhdCBpcyBkZWZhdWx0IGluIG1vZGVybiBicm93c2Vycy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVxdWVzdCBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgMiBvciAzIHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBJZiAyIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBoYW5kbGVyIG5hbWUgYW5kIHRoZSBzZWNvbmRcbiAgICAgKiBwYXJhbWV0ZXIgaXMgdGhlIG9wdGlvbnMuIFRoaXMgYXNzdW1lcyB0aGF0IHRoaXMgaXMgYSBkZXRhY2hlZCBBSkFYIHJlcXVlc3Qgbm90IGNvbm5lY3RlZCB0b1xuICAgICAqIGFuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiAzIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGFuIGVsZW1lbnQgb3IgYSBzZWxlY3RvciwgYW5kIHRoZSBzZWNvbmRcbiAgICAgKiBhbmQgdGhpcmQgcGFyYW1ldGVycyBhcmUgdGhlIGhhbmRsZXIgYW5kIG9wdGlvbnMsIHJlc3BlY3RpdmVseS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8c3RyaW5nfSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBoYW5kbGVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBBbGxvdyB0aGUgZWxlbWVudCB0byBiZSBhIGhhbmRsZXIgbmFtZS5cbiAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGUgcmVxdWVzdCBpcyBiZWluZyBtYWRlIGFnYWluc3Qgbm8gZWxlbWVudCwgYW5kIHRoZSBoYW5kbGVyIHBhcmFtZXRlclxuICAgICAgICAgICAgLy8gd2lsbCBjb250YWluIG9wdGlvbnMuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0hhbmRsZXJOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IGhhbmRsZXIgfHwge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBlbGVtZW50IHdhcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvcjogJHtlbGVtZW50fWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBtYXRjaGVkRWxlbWVudDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZldGNoT3B0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzcG9uc2VFcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jaGVja1JlcXVlc3QoKTtcbiAgICAgICAgaWYgKCF0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFNldHVwJywgdGhpcykpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFNldHVwJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kb0NsaWVudFZhbGlkYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgICAgICAgdGhpcy5kb0NvbmZpcm0oKS50aGVuKChjb25maXJtZWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9BamF4KCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NVcGRhdGUocmVzcG9uc2UpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9TVUNDRVNTID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZG9BamF4KCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfU1VDQ0VTUyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbmNpZXMgZm9yIHRoaXMgcGx1Z2luLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsnY29va2llJywgJ2pzb25QYXJzZXInXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhlIGVsZW1lbnQgYW5kIGhhbmRsZXIgZ2l2ZW4gaW4gdGhlIHJlcXVlc3QuXG4gICAgICovXG4gICAgY2hlY2tSZXF1ZXN0KCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBlbGVtZW50IHByb3ZpZGVkIG11c3QgYmUgYW4gRWxlbWVudCBpbnN0YW5jZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBSkFYIGhhbmRsZXIgbmFtZSBpcyBub3Qgc3BlY2lmaWVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSGFuZGxlck5hbWUodGhpcy5oYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFKQVggaGFuZGxlciBuYW1lLiBUaGUgY29ycmVjdCBoYW5kbGVyIG5hbWUgZm9ybWF0IGlzOiBcIm9uRXZlbnRcIi4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGZXRjaCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbWFkZSBhdmFpbGFibGUgZm9yIHBsdWdpbnMgdG8gZXh0ZW5kIG9yIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZldGNoKCkgc2V0dGluZ3Mgd2l0aCB0aGVpciBvd24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBnZXRGZXRjaCgpIHtcbiAgICAgICAgdGhpcy5mZXRjaE9wdGlvbnMgPSAodGhpcy5vcHRpb25zLmZldGNoT3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgID8gdGhpcy5vcHRpb25zLmZldGNoT3B0aW9uc1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICAgICAgbW9kZTogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhGZXRjaE9wdGlvbnMnLCB0aGlzLmZldGNoT3B0aW9ucywgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKHRoaXMudXJsLCB0aGlzLmZldGNoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gb24gdGhlIGZvcm0sIGlmIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGRvQ2xpZW50VmFsaWRhdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5icm93c2VyVmFsaWRhdGUgPT09IHRydWUgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNoZWNrVmFsaWRpdHkoKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgQUpBWCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIG9iamVjdCBmb3Igd2hlbiB0aGUgQUpBWCByZXF1ZXN0IGlzIGNvbXBsZXRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGRvQWpheCgpIHtcbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgdGhlIEFKQVggcmVxdWVzdCBiZWZvcmUgc2VuZGluZ1xuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhCZWZvcmVTZW5kJywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFqYXhQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRGZXRjaCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2sgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSA0MDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpLmluY2x1ZGVzKCcvanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEubWVzc2FnZSAmJiByZXNwb25zZURhdGEuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEuZXhjZXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS50cmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBKU09OIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS50ZXh0KCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlVGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IocmVzcG9uc2VUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykuaW5jbHVkZXMoJy9qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmpzb24oKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXNwb25zZURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYX1dJTlRFUl9TVUNDRVNTOiByZXNwb25zZS5zdGF0dXMgIT09IDQwNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfV0lOVEVSX1JFU1BPTlNFX0NPREU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBKU09OIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRleHQoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKGBVbmFibGUgdG8gcHJvY2VzcyByZXNwb25zZTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChyZXNwb25zZUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKGBVbmFibGUgdG8gcmV0cmlldmUgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXI6ICR7cmVzcG9uc2VFcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U3RhcnQnLCBhamF4UHJvbWlzZSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhQcm9taXNlJyk7XG4gICAgICAgICAgICBldmVudC5wcm9taXNlID0gYWpheFByb21pc2U7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWpheFByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgZm9yIHVwZGF0aW5nIHRoZSBwYXJ0aWFscyBmcm9tIHRoZSBBSkFYIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogSWYgYW55IHBhcnRpYWxzIGFyZSByZXR1cm5lZCBmcm9tIHRoZSBBSkFYIHJlc3BvbnNlLCB0aGlzIG1ldGhvZCB3aWxsIGFsc28gYWN0aW9uIHRoZSBwYXJ0aWFsIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSBvYmplY3Qgd2hpY2ggdHJhY2tzIHdoZW4gdGhlIHBhcnRpYWwgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgcHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUuYXBwbHkodGhpcywgW3Jlc3BvbnNlXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXh0cmFjdCBwYXJ0aWFsIGluZm9ybWF0aW9uXG4gICAgICAgICAgICBjb25zdCBwYXJ0aWFscyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCA4KSAhPT0gJ1hfV0lOVEVSJykge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJ0aWFscykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX0FTU0VUUykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBc3NldHMocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMuc25vd2JvYXJkLmdsb2JhbFByb21pc2VFdmVudCgnYWpheEJlZm9yZVVwZGF0ZScsIHJlc3BvbnNlLCB0aGlzKTtcbiAgICAgICAgICAgIHByb21pc2VzLnRoZW4oXG4gICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NBc3NldHMocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9VcGRhdGUocGFydGlhbHMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgZm9yIEhUTUwgcmVkcmF3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcGFydGlhbHMgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0aWFsc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGRvVXBkYXRlKHBhcnRpYWxzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWZmZWN0ZWQgPSBbXTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocGFydGlhbHMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3BhcnRpYWwsIGNvbnRlbnRdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0b3IgPSAodGhpcy5vcHRpb25zLnVwZGF0ZSAmJiB0aGlzLm9wdGlvbnMudXBkYXRlW3BhcnRpYWxdKVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMub3B0aW9ucy51cGRhdGVbcGFydGlhbF1cbiAgICAgICAgICAgICAgICAgICAgOiBwYXJ0aWFsO1xuXG4gICAgICAgICAgICAgICAgbGV0IG1vZGUgPSAncmVwbGFjZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdhcHBlbmQnO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnN1YnN0cigwLCAxKSA9PT0gJ14nKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGUgPSAncHJlcGVuZCc7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpICE9PSAnIycgJiYgc2VsZWN0b3Iuc3Vic3RyKDAsIDEpICE9PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdub29wJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FwcGVuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MICs9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ByZXBlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQgKyBlbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9vcCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFmZmVjdGVkLnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmUgdXBkYXRlIGV2ZW50IGZvciBlYWNoIGVsZW1lbnQgdGhhdCBpcyB1cGRhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFVwZGF0ZScsIGVsZW1lbnQsIGNvbnRlbnQsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhVcGRhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VXBkYXRlQ29tcGxldGUnLCBhZmZlY3RlZCwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSByZXNwb25zZSBkYXRhLlxuICAgICAqXG4gICAgICogVGhpcyBmaXJlcyBvZmYgYWxsIG5lY2Vzc2FyeSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHJlc3BvbnNlLCBpZS4gaWYgdGhlcmUncyBhbnkgZmxhc2hcbiAgICAgKiBtZXNzYWdlcyB0byBoYW5kbGUsIG9yIGFueSByZWRpcmVjdHMgdG8gYmUgdW5kZXJ0YWtlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByb2Nlc3NSZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN1Y2Nlc3MgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5zdWNjZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN1Y2Nlc3ModGhpcy5yZXNwb25zZURhdGEsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIHJlc3BvbnNlIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFN1Y2Nlc3MnLCB0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyB0aGUgZWxlbWVudCB0byBjYW5jZWwgYW55IGZ1cnRoZXIgcmVzcG9uc2UgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhEb25lJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VEYXRhID0gdGhpcy5yZXNwb25zZURhdGE7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mbGFzaCAmJiByZXNwb25zZS5YX1dJTlRFUl9GTEFTSF9NRVNTQUdFUykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRmxhc2hNZXNzYWdlcyhyZXNwb25zZS5YX1dJTlRFUl9GTEFTSF9NRVNTQUdFUyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgYSByZWRpcmVjdCBmcm9tIHRoZSByZXNwb25zZSwgb3IgdXNlIHRoZSByZWRpcmVjdCBhcyBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbnMuXG4gICAgICAgIGlmICh0aGlzLnJlZGlyZWN0IHx8IHJlc3BvbnNlLlhfV0lOVEVSX1JFRElSRUNUKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZWRpcmVjdCh0aGlzLnJlZGlyZWN0IHx8IHJlc3BvbnNlLlhfV0lOVEVSX1JFRElSRUNUKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYW4gZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgQUpBWCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhpcyBmaXJlcyBvZmYgYWxsIG5lY2Vzc2FyeSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIGVycm9yIHJlc3BvbnNlLCBpZS4gaWYgdGhlcmUncyBhbnkgZXJyb3Igb3JcbiAgICAgKiB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fEVycm9yfSBlcnJvclxuICAgICAqL1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVycm9yICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IodGhpcy5yZXNwb25zZUVycm9yLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCBhbnkgZnVydGhlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhFcnJvcicsIHRoaXMucmVzcG9uc2VFcnJvciwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyB0aGUgZWxlbWVudCB0byBjYW5jZWwgYW55IGZ1cnRoZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhGYWlsJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VFcnJvciA9IHRoaXMucmVzcG9uc2VFcnJvcjtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvck1lc3NhZ2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2tpcEVycm9yID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAgICAgIGlmIChlcnJvci5YX1dJTlRFUl9FUlJPUl9GSUVMRFMpIHtcbiAgICAgICAgICAgICAgICBza2lwRXJyb3IgPSB0aGlzLnByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzKGVycm9yLlhfV0lOVEVSX0VSUk9SX0ZJRUxEUyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnJvci5YX1dJTlRFUl9FUlJPUl9NRVNTQUdFICYmICFza2lwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvck1lc3NhZ2UoZXJyb3IuWF9XSU5URVJfRVJST1JfTUVTU0FHRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgcmVkaXJlY3QgcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3NvciB3aWxsIHNpbXBseSByZWRpcmVjdCB0aGUgdXNlciBpbiB0aGVpciBicm93c2VyLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhSZWRpcmVjdGAgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgb25cbiAgICAgKiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVSZWRpcmVjdFJlc3BvbnNlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogcmVkaXJlY3Qgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc1JlZGlyZWN0KHVybCkge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgcmVkaXJlY3QgaGFuZGxlci4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvbid0IHJ1biB0aGUgcmVkaXJlY3QuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZVJlZGlyZWN0UmVzcG9uc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlUmVkaXJlY3RSZXNwb25zZS5hcHBseSh0aGlzLCBbdXJsXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgdGhlIHJlZGlyZWN0XG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFJlZGlyZWN0JywgdXJsLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIEFKQVggcmVxdWVzdCBpcyBmaW5pc2hlZCBpZiB3ZSdyZSBzdGlsbCBvbiB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIGZvciByZWRpcmVjdHMgdGhhdCBqdXN0IGNoYW5nZSB0aGUgaGFzaCB2YWx1ZSBvZlxuICAgICAgICAvLyB0aGUgVVJMIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgcGFnZSB3aWxsIHByb3Blcmx5IHN0b3AuXG4gICAgICAgIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL29jdG9iZXJjbXMvb2N0b2Jlci9pc3N1ZXMvMjc4MFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudE5hbWUgPSAnYWpheFJlZGlyZWN0ZWQnO1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgdGhpcyBwcm9jZXNzb3Igd2lsbCBzaW1wbHkgYWxlcnQgdGhlIHVzZXIgdGhyb3VnaCBhIHNpbXBsZSBgYWxlcnQoKWAgY2FsbC5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4RXJyb3JNZXNzYWdlYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUVycm9yTWVzc2FnZWAgY2FsbGJhY2sgb3B0aW9uLiBJZiBhIGBmYWxzZWAgaXMgcmV0dXJuZWQgZnJvbSBlaXRoZXIsIHRoZVxuICAgICAqIGVycm9yIG1lc3NhZ2UgaGFuZGxpbmcgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByb2Nlc3NFcnJvck1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgaGFuZGxlciBmb3IgZXJyb3IgbWVzc2FnZXMuIElmIGZhbHNlIGlzIHJldHVybmVkLCBkbyBub3QgcHJvY2VzcyB0aGUgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgLy8gYW55IGZ1cnRoZXIuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUVycm9yTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVFcnJvck1lc3NhZ2UuYXBwbHkodGhpcywgW21lc3NhZ2VdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgZXJyb3IgbWVzc2FnZSBiZWluZyBzaG93blxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhFcnJvck1lc3NhZ2UnLCBtZXNzYWdlLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIHNob3cgYSBicm93c2VyIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBmbGFzaCBtZXNzYWdlcyBmcm9tIHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIG5vIGZsYXNoIG1lc3NhZ2UgaGFuZGxpbmcgd2lsbCBvY2N1ci5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4Rmxhc2hNZXNzYWdlc2AgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVGbGFzaE1lc3NhZ2VzYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogZmxhc2ggbWVzc2FnZSBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlc1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJvY2Vzc0ZsYXNoTWVzc2FnZXMobWVzc2FnZXMpIHtcbiAgICAgICAgLy8gUnVuIGEgY3VzdG9tIHBlci1yZXF1ZXN0IGZsYXNoIGhhbmRsZXIuIElmIGZhbHNlIGlzIHJldHVybmVkLCBkb24ndCBzaG93IHRoZSBmbGFzaCBtZXNzYWdlXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUZsYXNoTWVzc2FnZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlRmxhc2hNZXNzYWdlcy5hcHBseSh0aGlzLCBbbWVzc2FnZXNdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEZsYXNoTWVzc2FnZXMnLCBtZXNzYWdlcywgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHZhbGlkYXRpb24gZXJyb3JzIGZvciBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBubyB2YWxpZGF0aW9uIGVycm9yIGhhbmRsaW5nIHdpbGwgb2NjdXIuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheFZhbGlkYXRpb25FcnJvcnNgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlVmFsaWRhdGlvbkVycm9yc2AgY2FsbGJhY2sgb3B0aW9uLiBJZiBhIGBmYWxzZWAgaXMgcmV0dXJuZWQgZnJvbSBlaXRoZXIsIHRoZVxuICAgICAqIHZhbGlkYXRpb24gZXJyb3IgaGFuZGxpbmcgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcm9jZXNzVmFsaWRhdGlvbkVycm9ycyhmaWVsZHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlVmFsaWRhdGlvbkVycm9ycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JzLmFwcGx5KHRoaXMsIFt0aGlzLmZvcm0sIGZpZWxkc10pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgdGhlIHZhbGlkYXRpb24gZXJyb3JzIGJlaW5nIGhhbmRsZWRcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VmFsaWRhdGlvbkVycm9ycycsIHRoaXMuZm9ybSwgZmllbGRzLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhc3NldHMgcmV0dXJuZWQgYnkgYW4gQUpBWCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgbm8gYXNzZXQgcHJvY2Vzc2luZyB3aWxsIG9jY3VyIGFuZCB0aGlzIHdpbGwgcmV0dXJuIGEgcmVzb2x2ZWQgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4TG9hZEFzc2V0c2AgZXZlbnQuIFRoaXMgZXZlbnQgaXMgY29uc2lkZXJlZCBibG9ja2luZywgYW5kXG4gICAgICogYWxsb3dzIGFzc2V0cyB0byBiZSBsb2FkZWQgb3IgcHJvY2Vzc2VkIGJlZm9yZSBjb250aW51aW5nIHdpdGggYW55IGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhc3NldHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBwcm9jZXNzQXNzZXRzKGFzc2V0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4TG9hZEFzc2V0cycsIGFzc2V0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlybXMgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgdXNlciBiZWZvcmUgcHJvY2VlZGluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIG1ldGhvZC4gQnkgZGVmYXVsdCwgaXQgd2lsbCB1c2UgdGhlIGJyb3dzZXIncyBgY29uZmlybSgpYCBtZXRob2QgdG8gcXVlcnkgdGhlIHVzZXIgdG9cbiAgICAgKiBjb25maXJtIHRoZSBhY3Rpb24uIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgUHJvbWlzZSB3aXRoIGEgYm9vbGVhbiB2YWx1ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdXNlciBjb25maXJtZWRcbiAgICAgKiBvciBub3QuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheENvbmZpcm1NZXNzYWdlYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUNvbmZpcm1NZXNzYWdlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlcixcbiAgICAgKiB0aGUgY29uZmlybWF0aW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIGRlbmllZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFzeW5jIGRvQ29uZmlybSgpIHtcbiAgICAgICAgLy8gQWxsb3cgZm9yIGEgY3VzdG9tIGhhbmRsZXIgZm9yIHRoZSBjb25maXJtYXRpb24sIHBlciByZXF1ZXN0LlxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVDb25maXJtTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVDb25maXJtTWVzc2FnZS5hcHBseSh0aGlzLCBbdGhpcy5jb25maXJtXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIHBsdWdpbnMgaGF2ZSBjdXN0b21pc2VkIHRoZSBjb25maXJtYXRpb24sIHVzZSBhIHNpbXBsZSBicm93c2VyIGNvbmZpcm1hdGlvbi5cbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmxpc3RlbnNUb0V2ZW50KCdhamF4Q29uZmlybU1lc3NhZ2UnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuY29uZmlybSh0aGlzLmNvbmZpcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIGN1c3RvbSBwbHVnaW4gY29uZmlybWF0aW9uc1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMuc25vd2JvYXJkLmdsb2JhbFByb21pc2VFdmVudCgnYWpheENvbmZpcm1NZXNzYWdlJywgdGhpcy5jb25maXJtLCB0aGlzKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZnVsZmlsbGVkID0gYXdhaXQgcHJvbWlzZXM7XG4gICAgICAgICAgICBpZiAoZnVsZmlsbGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyBvZmYgY29tcGxldGlvbiBldmVudHMgZm9yIHRoZSBSZXF1ZXN0LlxuICAgICAqL1xuICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBsZXRlICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb21wbGV0ZSh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhEb25lJywgdGhpcy5yZXNwb25zZURhdGEsIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4QWx3YXlzJyk7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIGV2ZW50LnJlc3BvbnNlRGF0YSA9IHRoaXMucmVzcG9uc2VEYXRhO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VFcnJvciA9IHRoaXMucmVzcG9uc2VFcnJvcjtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcmUgb2ZmIHRoZSBkZXN0cnVjdG9yXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICBnZXQgZm9ybSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5mb3JtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMub3B0aW9ucy5mb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZm9ybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICB9XG5cbiAgICBnZXQgY29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlcixcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgaGVhZGVycygpIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywgLy8gS2VlcHMgY29tcGF0aWJpbGl0eSB3aXRoIGpRdWVyeSBBSkFYXG4gICAgICAgICAgICAnWC1XSU5URVItUkVRVUVTVC1IQU5ETEVSJzogdGhpcy5oYW5kbGVyLFxuICAgICAgICAgICAgJ1gtV0lOVEVSLVJFUVVFU1QtUEFSVElBTFMnOiB0aGlzLmV4dHJhY3RQYXJ0aWFscyh0aGlzLm9wdGlvbnMudXBkYXRlIHx8IFtdKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5mbGFzaCkge1xuICAgICAgICAgICAgaGVhZGVyc1snWC1XSU5URVItUkVRVUVTVC1GTEFTSCddID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnhzcmZUb2tlbikge1xuICAgICAgICAgICAgaGVhZGVyc1snWC1YU1JGLVRPS0VOJ10gPSB0aGlzLnhzcmZUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH1cblxuICAgIGdldCBsb2FkaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvYWRpbmcgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy51cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuXG4gICAgZ2V0IHJlZGlyZWN0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5yZWRpcmVjdCAmJiB0aGlzLm9wdGlvbnMucmVkaXJlY3QubGVuZ3RoKSA/IHRoaXMub3B0aW9ucy5yZWRpcmVjdCA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGZsYXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZsYXNoIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBmaWxlcygpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWxlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKEZvcm1EYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5kZWJ1ZygnVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgZmlsZSB1cGxvYWRzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgeHNyZlRva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuY29va2llKCkuZ2V0KCdYU1JGLVRPS0VOJyk7XG4gICAgfVxuXG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAodHlwZW9mIHRoaXMub3B0aW9ucy5kYXRhID09PSAnb2JqZWN0JykgPyB0aGlzLm9wdGlvbnMuZGF0YSA6IHt9O1xuXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKHRoaXMuZm9ybSB8fCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb25maXJtIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHBhcnRpYWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHVwZGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZXh0cmFjdFBhcnRpYWxzKHVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModXBkYXRlKS5qb2luKCcmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhbiBlcnJvciB3aXRoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBBSkFYIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZCBvciBwcm9jZXNzZWQgY29ycmVjdGx5IGR1ZSB0byBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4Y2VwdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpbmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0cmFjZVxuICAgICAqIEByZXR1cm5zIHtFcnJvcn1cbiAgICAgKi9cbiAgICByZW5kZXJFcnJvcihtZXNzYWdlLCBleGNlcHRpb24sIGZpbGUsIGxpbmUsIHRyYWNlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5leGNlcHRpb24gPSBleGNlcHRpb24gfHwgbnVsbDtcbiAgICAgICAgZXJyb3IuZmlsZSA9IGZpbGUgfHwgbnVsbDtcbiAgICAgICAgZXJyb3IubGluZSA9IGxpbmUgfHwgbnVsbDtcbiAgICAgICAgZXJyb3IudHJhY2UgPSB0cmFjZSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBhIGdpdmVuIHN0cmluZyB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCBBSkFYIGhhbmRsZXIgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNIYW5kbGVyTmFtZShuYW1lKSB7XG4gICAgICAgIHJldHVybiAvXig/Olxcdys6ezJ9KT9vbltBLVowLTldLy50ZXN0KG5hbWUpO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRW5hYmxlIERhdGEgQXR0cmlidXRlcyBBUEkgZm9yIEFKQVggcmVxdWVzdHMuXG4gKlxuICogVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGJhc2UgQUpBWCBmdW5jdGlvbmFsaXR5IHRoYXQgaW5jbHVkZXMgaGFuZGxpbmcgb2YgSFRNTCBkYXRhIGF0dHJpYnV0ZXMgZm9yIHByb2Nlc3NpbmdcbiAqIEFKQVggcmVxdWVzdHMuIEl0IGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBiYXNlIEFKQVggZnVuY3Rpb25hbGl0eSB0byBhbGxvdyBkZXZlbG9wZXJzIHRvIG9wdC1vdXQgb2YgZGF0YSBhdHRyaWJ1dGVcbiAqIHJlcXVlc3RzIGlmIHRoZXkgZG8gbm90IGludGVuZCB0byB1c2UgdGhlbS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXR0cmlidXRlUmVxdWVzdCBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogTGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4U2V0dXA6ICdvbkFqYXhTZXR1cCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZHkgZXZlbnQgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBBdHRhY2hlcyBoYW5kbGVycyB0byB0aGUgd2luZG93IHRvIGxpc3RlbiBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIHJlYWR5KCkge1xuICAgICAgICB0aGlzLmF0dGFjaEhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZURlZmF1bHRGb3JtVmFsaWRhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3JlcXVlc3QnLCAnanNvblBhcnNlciddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBEZXRhY2hlcyBhbGwgaGFuZGxlcnMuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoSGFuZGxlcnMoKTtcblxuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBuZWNlc3NhcnkgaGFuZGxlcnMgZm9yIGFsbCByZXF1ZXN0IGludGVyYWN0aW9ucy5cbiAgICAgKi9cbiAgICBhdHRhY2hIYW5kbGVycygpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4gdGhpcy5jaGFuZ2VIYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMua2V5RG93bkhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChldmVudCkgPT4gdGhpcy5zdWJtaXRIYW5kbGVyKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgZGVmYXVsdCBmb3JtIHZhbGlkYXRpb24gZm9yIEFKQVggZm9ybXMuXG4gICAgICpcbiAgICAgKiBBIGZvcm0gdGhhdCBjb250YWlucyBhIGBkYXRhLXJlcXVlc3RgIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGFuIEFKQVggY2FsbCB3aXRob3V0IGluY2x1ZGluZyBhIGBkYXRhLWJyb3dzZXItdmFsaWRhdGVgXG4gICAgICogYXR0cmlidXRlIG1lYW5zIHRoYXQgdGhlIEFKQVggY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBsaWtlbHkgYmUgaGFuZGxpbmcgdGhlIHZhbGlkYXRpb24gaW5zdGVhZC5cbiAgICAgKi9cbiAgICBkaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uKCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdmb3JtW2RhdGEtcmVxdWVzdF06bm90KFtkYXRhLWJyb3dzZXItdmFsaWRhdGVdKScpLmZvckVhY2goKGZvcm0pID0+IHtcbiAgICAgICAgICAgIGZvcm0uc2V0QXR0cmlidXRlKCdub3ZhbGlkYXRlJywgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGFjaGVzIHRoZSBuZWNlc3NhcnkgaGFuZGxlcnMgZm9yIGFsbCByZXF1ZXN0IGludGVyYWN0aW9ucy5cbiAgICAgKi9cbiAgICBkZXRhY2hIYW5kbGVycygpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4gdGhpcy5jaGFuZ2VIYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMua2V5RG93bkhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChldmVudCkgPT4gdGhpcy5zdWJtaXRIYW5kbGVyKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjaGFuZ2VzIHRvIHNlbGVjdCwgcmFkaW8sIGNoZWNrYm94IGFuZCBmaWxlIGlucHV0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgY2hhbmdlSGFuZGxlcihldmVudCkge1xuICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBjaGFuZ2luZyBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhcbiAgICAgICAgICAgICdzZWxlY3RbZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1yYWRpb11bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1jaGVja2JveF1bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1maWxlXVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgY2xpY2tzIG9uIGh5cGVybGlua3MgYW5kIGJ1dHRvbnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGV2ZW50IGNhbiBidWJibGUgdXAgdGhlIGhpZXJhcmNoeSB0byBmaW5kIGEgc3VpdGFibGUgcmVxdWVzdCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBjbGlja0hhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC50YWdOYW1lICE9PSAnSFRNTCcpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudEVsZW1lbnQubWF0Y2hlcyhcbiAgICAgICAgICAgICAgICAnYVtkYXRhLXJlcXVlc3RdLCBidXR0b25bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1idXR0b25dW2RhdGEtcmVxdWVzdF0sIGlucHV0W3R5cGU9c3VibWl0XVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGtleSBwcmVzc2VzIG9uIGlucHV0c1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBrZXlEb3duSGFuZGxlcihldmVudCkge1xuICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBpbnB1dHRpbmcgaW50byBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhcbiAgICAgICAgICAgICdpbnB1dCcsXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IHR5cGUgaXMgdmFsaWRcbiAgICAgICAgY29uc3QgdmFsaWRUeXBlcyA9IFtcbiAgICAgICAgICAgICdjaGVja2JveCcsXG4gICAgICAgICAgICAnY29sb3InLFxuICAgICAgICAgICAgJ2RhdGUnLFxuICAgICAgICAgICAgJ2RhdGV0aW1lJyxcbiAgICAgICAgICAgICdkYXRldGltZS1sb2NhbCcsXG4gICAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICAgJ2ltYWdlJyxcbiAgICAgICAgICAgICdtb250aCcsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdwYXNzd29yZCcsXG4gICAgICAgICAgICAncmFkaW8nLFxuICAgICAgICAgICAgJ3JhbmdlJyxcbiAgICAgICAgICAgICdzZWFyY2gnLFxuICAgICAgICAgICAgJ3RlbCcsXG4gICAgICAgICAgICAndGV4dCcsXG4gICAgICAgICAgICAndGltZScsXG4gICAgICAgICAgICAndXJsJyxcbiAgICAgICAgICAgICd3ZWVrJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHZhbGlkVHlwZXMuaW5kZXhPZihldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCd0eXBlJykpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiBldmVudC50YXJnZXQubWF0Y2hlcygnKltkYXRhLXJlcXVlc3RdJykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygnKltkYXRhLXRyYWNrLWlucHV0XScpKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrSW5wdXQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgZm9ybSBzdWJtaXNzaW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgc3VibWl0SGFuZGxlcihldmVudCkge1xuICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBzdWJtaXR0aW5nIGEgdmFsaWQgZm9ybVxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ2Zvcm1bZGF0YS1yZXF1ZXN0XScsXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIHJlcXVlc3Qgb24gYSBnaXZlbiBlbGVtZW50LCB1c2luZyBpdHMgZGF0YSBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqL1xuICAgIHByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQuZGF0YXNldDtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gU3RyaW5nKGRhdGEucmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjb25maXJtOiAoJ3JlcXVlc3RDb25maXJtJyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RDb25maXJtKSA6IG51bGwsXG4gICAgICAgICAgICByZWRpcmVjdDogKCdyZXF1ZXN0UmVkaXJlY3QnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdFJlZGlyZWN0KSA6IG51bGwsXG4gICAgICAgICAgICBsb2FkaW5nOiAoJ3JlcXVlc3RMb2FkaW5nJyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RMb2FkaW5nKSA6IG51bGwsXG4gICAgICAgICAgICBmbGFzaDogKCdyZXF1ZXN0Rmxhc2gnIGluIGRhdGEpLFxuICAgICAgICAgICAgZmlsZXM6ICgncmVxdWVzdEZpbGVzJyBpbiBkYXRhKSxcbiAgICAgICAgICAgIGJyb3dzZXJWYWxpZGF0ZTogKCdyZXF1ZXN0QnJvd3NlclZhbGlkYXRlJyBpbiBkYXRhKSxcbiAgICAgICAgICAgIGZvcm06ICgncmVxdWVzdEZvcm0nIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdEZvcm0pIDogbnVsbCxcbiAgICAgICAgICAgIHVybDogKCdyZXF1ZXN0VXJsJyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RVcmwpIDogbnVsbCxcbiAgICAgICAgICAgIHVwZGF0ZTogKCdyZXF1ZXN0VXBkYXRlJyBpbiBkYXRhKSA/IHRoaXMucGFyc2VEYXRhKFN0cmluZyhkYXRhLnJlcXVlc3RVcGRhdGUpKSA6IFtdLFxuICAgICAgICAgICAgZGF0YTogKCdyZXF1ZXN0RGF0YScgaW4gZGF0YSkgPyB0aGlzLnBhcnNlRGF0YShTdHJpbmcoZGF0YS5yZXF1ZXN0RGF0YSkpIDogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQucmVxdWVzdChlbGVtZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIGFuIEFKQVggcmVxdWVzdCB2aWEgSFRNTCBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXF1ZXN0XG4gICAgICovXG4gICAgb25BamF4U2V0dXAocmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gcmVxdWVzdC5lbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmdldFBhcmVudFJlcXVlc3REYXRhKHJlcXVlc3QuZWxlbWVudCksXG4gICAgICAgICAgICAuLi5yZXF1ZXN0Lm9wdGlvbnMuZGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgYnV0dG9uJykgJiYgIXJlcXVlc3QuZm9ybSAmJiBmaWVsZE5hbWUgJiYgIXJlcXVlc3Qub3B0aW9ucy5kYXRhW2ZpZWxkTmFtZV0pIHtcbiAgICAgICAgICAgIGRhdGFbZmllbGROYW1lXSA9IHJlcXVlc3QuZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3Qub3B0aW9ucy5kYXRhID0gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYW5kIGNvbGxhdGVzIGFsbCBkYXRhIGZyb20gZWxlbWVudHMgdXAgdGhlIERPTSBoaWVyYXJjaHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0UGFyZW50UmVxdWVzdERhdGEodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW107XG4gICAgICAgIGxldCBkYXRhID0ge307XG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IHRhcmdldDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzLnJldmVyc2UoKTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YSA9IGVsZW1lbnQuZGF0YXNldDtcblxuICAgICAgICAgICAgaWYgKCdyZXF1ZXN0RGF0YScgaW4gZWxlbWVudERhdGEpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnBhcnNlRGF0YShlbGVtZW50RGF0YS5yZXF1ZXN0RGF0YSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGRhdGEgaW4gdGhlIFdpbnRlci9PY3RvYmVyIEpTT04gZm9ybWF0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHBhcnNlRGF0YShkYXRhKSB7XG4gICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc25vd2JvYXJkLmpzb25wYXJzZXIoKS5wYXJzZShgeyR7ZGF0YX19YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyB0aGUgZGF0YSBhdHRyaWJ1dGUgb24gZWxlbWVudDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0lucHV0KGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyBsYXN0VmFsdWUgfSA9IGVsZW1lbnQuZGF0YXNldDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBlbGVtZW50LmRhdGFzZXQudHJhY2tJbnB1dCB8fCAzMDA7XG5cbiAgICAgICAgaWYgKGxhc3RWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGxhc3RWYWx1ZSA9PT0gZWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFRyYWNrSW5wdXRUaW1lcihlbGVtZW50KTtcblxuICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGFzZXQucmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgaGllcmFyY2h5IGFuZCBmaW5kIGEgZm9ybSB0aGF0IHNlbmRzIGFuIEFKQVggcXVlcnlcbiAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC50YWdOYW1lID09PSAnRk9STScgJiYgY3VycmVudEVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGludGVydmFsKTtcbiAgICB9XG5cbiAgICByZXNldFRyYWNrSW5wdXRUaW1lcihlbGVtZW50KSB7XG4gICAgICAgIGlmIChlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lcik7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEFzc2V0IExvYWRlci5cbiAqXG4gKiBQcm92aWRlcyBzaW1wbGUgYXNzZXQgbG9hZGluZyBmdW5jdGlvbmFsaXR5IGZvciBTbm93Ym9hcmQsIG1ha2luZyBpdCBlYXN5IHRvIHByZS1sb2FkIGltYWdlcyBvclxuICogaW5jbHVkZSBKYXZhU2NyaXB0IG9yIENTUyBhc3NldHMgb24gdGhlIGZseS5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGlzIGxvYWRlciB3aWxsIGxpc3RlbiB0byBhbnkgYXNzZXRzIHRoYXQgaGF2ZSBiZWVuIHJlcXVlc3RlZCB0byBsb2FkIGluIGFuIEFKQVhcbiAqIHJlc3BvbnNlLCBzdWNoIGFzIHJlc3BvbnNlcyBmcm9tIGEgY29tcG9uZW50LlxuICpcbiAqIFlvdSBjYW4gYWxzbyBsb2FkIGFzc2V0cyBtYW51YWxseSBieSBjYWxsaW5nIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogYGBganNcbiAqIFNub3dib2FyZC5hZGRQbHVnaW4oJ2Fzc2V0TG9hZGVyJywgQXNzZXRMb2FkZXIpO1xuICogU25vd2JvYXJkLmFzc2V0TG9hZGVyKCkucHJvY2Vzc0Fzc2V0cyhhc3NldHMpO1xuICogYGBgXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFzc2V0TG9hZGVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBFdmVudCBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhamF4TG9hZEFzc2V0czogJ2xvYWQnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAndXJsJyxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGFuZCBsb2FkIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIFRoZSBgYXNzZXRzYCBwcm9wZXJ0eSBvZiB0aGlzIG1ldGhvZCByZXF1aXJlcyBhbiBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyBrZXlzIGFuZCBhblxuICAgICAqIGFycmF5IG9mIHBhdGhzOlxuICAgICAqXG4gICAgICogLSBganNgOiBBbiBhcnJheSBvZiBKYXZhU2NyaXB0IFVSTHMgdG8gbG9hZFxuICAgICAqIC0gYGNzc2A6IEFuIGFycmF5IG9mIENTUyBzdHlsZXNoZWV0IFVSTHMgdG8gbG9hZFxuICAgICAqIC0gYGltZ2A6IEFuIGFycmF5IG9mIGltYWdlIFVSTHMgdG8gcHJlLWxvYWRcbiAgICAgKlxuICAgICAqIEJvdGggYGpzYCBhbmQgYGNzc2AgZmlsZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluamVjdGVkLCBob3dldmVyIGBpbWdgIGZpbGVzIHdpbGwgbm90LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgcmVxdWlyZWQgYXNzZXRzIGFyZSBsb2FkZWQuIElmIGFuXG4gICAgICogYXNzZXQgZmFpbHMgdG8gbG9hZCwgdGhpcyBQcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFU0xpbnQgKlJFQUxMWSogZG9lc24ndCBsaWtlIHRoaXMgY29kZSwgYnV0IGlnbm9yZSBpdC4gSXQncyB0aGUgb25seSB3YXkgaXQgd29ya3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXNzZXRzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYXN5bmMgbG9hZChhc3NldHMpIHtcbiAgICAgICAgaWYgKGFzc2V0cy5qcyAmJiBhc3NldHMuanMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2YgYXNzZXRzLmpzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU2NyaXB0KHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXNzZXRzLmNzcyAmJiBhc3NldHMuY3NzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgYXNzZXRzLmNzcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN0eWxlKHN0eWxlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3NldHMuaW1nICYmIGFzc2V0cy5pbWcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpbWFnZSBvZiBhc3NldHMuaW1nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW1hZ2UoaW1hZ2UpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdHMgYW5kIGxvYWRzIGEgSmF2YVNjcmlwdCBVUkwgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogVGhlIHNjcmlwdCB3aWxsIGJlIGFwcGVuZGVkIGJlZm9yZSB0aGUgY2xvc2luZyBgPC9ib2R5PmAgdGFnLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHNjcmlwdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRTY3JpcHQoc2NyaXB0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHNjcmlwdCBVUkxcbiAgICAgICAgICAgIHNjcmlwdCA9IHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KHNjcmlwdCk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2NyaXB0IGlzIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7c2NyaXB0fVwiXWApO1xuICAgICAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBzY3JpcHRcbiAgICAgICAgICAgIGNvbnN0IGRvbVNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgZG9tU2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHNjcmlwdCk7XG4gICAgICAgICAgICBkb21TY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIubG9hZGVkJywgJ3NjcmlwdCcsIHNjcmlwdCwgZG9tU2NyaXB0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnc2NyaXB0Jywgc2NyaXB0LCBkb21TY3JpcHQpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIHNjcmlwdCBmaWxlOiBcIiR7c2NyaXB0fVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChkb21TY3JpcHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmplY3RzIGFuZCBsb2FkcyBhIENTUyBzdHlsZXNoZWV0IGludG8gdGhlIERPTS5cbiAgICAgKlxuICAgICAqIFRoZSBzdHlsZXNoZWV0IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBjbG9zaW5nIGA8L2hlYWQ+YCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBsb2FkU3R5bGUoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgc3R5bGUgVVJMXG4gICAgICAgICAgICBzdHlsZSA9IHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KHN0eWxlKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBzdHlsZXNoZWV0IGlzIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdW2hyZWY9XCIke3N0eWxlfVwiXWApO1xuICAgICAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBzdHlsZXNoZWV0XG4gICAgICAgICAgICBjb25zdCBkb21Dc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBkb21Dc3Muc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpO1xuICAgICAgICAgICAgZG9tQ3NzLnNldEF0dHJpYnV0ZSgnaHJlZicsIHN0eWxlKTtcbiAgICAgICAgICAgIGRvbUNzcy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnc3R5bGUnLCBzdHlsZSwgZG9tQ3NzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvbUNzcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnc3R5bGUnLCBzdHlsZSwgZG9tQ3NzKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBzdHlsZXNoZWV0IGZpbGU6IFwiJHtzdHlsZX1cImApKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZG9tQ3NzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlLWxvYWRzIGFuIGltYWdlLlxuICAgICAqXG4gICAgICogVGhlIGltYWdlIHdpbGwgbm90IGJlIGluamVjdGVkIGludG8gdGhlIERPTS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbWFnZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRJbWFnZShpbWFnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBzY3JpcHQgVVJMXG4gICAgICAgICAgICBpbWFnZSA9IHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KGltYWdlKTtcblxuICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIubG9hZGVkJywgJ2ltYWdlJywgaW1hZ2UsIGltZyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmVycm9yJywgJ2ltYWdlJywgaW1hZ2UsIGltZyk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgaW1hZ2UgZmlsZTogXCIke2ltYWdlfVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbWcuc3JjID0gaW1hZ2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQWxsb3dzIGF0dGFjaGluZyBhIGxvYWRpbmcgY2xhc3Mgb24gZWxlbWVudHMgdGhhdCBhbiBBSkFYIHJlcXVlc3QgaXMgdGFyZ2V0aW5nLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRhY2hMb2FkaW5nIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuaWNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3JlcXVlc3QnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2FqYXhTdGFydCcsXG4gICAgICAgICAgICBhamF4RG9uZTogJ2FqYXhEb25lJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhamF4U3RhcnQocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRFbGVtZW50cyA9IHJlcXVlc3QuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hdHRhY2gtbG9hZGluZ10nKTtcbiAgICAgICAgICAgIGlmIChsb2FkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxvYWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmdldExvYWRpbmdDbGFzcyhlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5lbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmdldExvYWRpbmdDbGFzcyhyZXF1ZXN0LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFqYXhEb25lKGRhdGEsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgICAgICBjb25zdCBsb2FkRWxlbWVudHMgPSByZXF1ZXN0LmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXR0YWNoLWxvYWRpbmddJyk7XG4gICAgICAgICAgICBpZiAobG9hZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2FkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5nZXRMb2FkaW5nQ2xhc3MoZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5nZXRMb2FkaW5nQ2xhc3MocmVxdWVzdC5lbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMb2FkaW5nQ2xhc3MoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gKGVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09ICcnKVxuICAgICAgICAgICAgPyBlbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZ1xuICAgICAgICAgICAgOiAnd24tbG9hZGluZyc7XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIERhdGEgY29uZmlndXJhdGlvbiBwcm92aWRlci5cbiAqXG4gKiBQcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgcGFzc2luZyBjb25maWd1cmF0aW9uIGRhdGEgdGhyb3VnaCBhbiBlbGVtZW50J3MgZGF0YSBhdHRyaWJ1dGVzLiBUaGlzXG4gKiBpcyBnZW5lcmFsbHkgdXNlZCBmb3Igd2lkZ2V0cyBvciBVSSBpbnRlcmFjdGlvbnMgdG8gY29uZmlndXJlIHRoZW0uXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFDb25maWcgZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGx1Z2luQmFzZX0gaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxvY2FsQ29uZmlnXG4gICAgICovXG4gICAgY29uc3RydWN0KGluc3RhbmNlLCBlbGVtZW50LCBsb2NhbENvbmZpZykge1xuICAgICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBQbHVnaW5CYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGEgU25vd2JvYXJkIHBsdWdpbiB0byBlbmFibGUgZGF0YSBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGV4dHJhY3RlZCBmcm9tIEhUTUwgZWxlbWVudHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5sb2NhbENvbmZpZyA9IGxvY2FsQ29uZmlnIHx8IHt9O1xuICAgICAgICB0aGlzLmluc3RhbmNlQ29uZmlnID0ge307XG4gICAgICAgIHRoaXMuYWNjZXB0ZWRDb25maWdzID0ge307XG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBgY29uZmlnYCBwYXJhbWV0ZXIgaXMgdW5zcGVjaWZpZWQsIHJldHVybnMgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ1xuICAgICAqL1xuICAgIGdldChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlQ29uZmlnW2NvbmZpZ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29uZmlnIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogVGhpcyBhbGxvd3MgeW91IHRvIG92ZXJyaWRlLCBhdCBydW50aW1lLCBhbnkgY29uZmlndXJhdGlvbiB2YWx1ZSBhcyBuZWNlc3NhcnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBwZXJzaXN0XG4gICAgICovXG4gICAgc2V0KGNvbmZpZywgdmFsdWUsIHBlcnNpc3QpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBjb25maWd1cmF0aW9uIGtleSB0byBzZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChwZXJzaXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YXNldFtjb25maWddID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxvY2FsQ29uZmlnW2NvbmZpZ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZnJlc2hlcyB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGFsbG93IHlvdSB0byBtYWtlIGNoYW5nZXMgdG8gdGhlIGRhdGEgY29uZmlnIG9uIGEgRE9NIGxldmVsIGFuZCByZS1hcHBseSB0aGVtXG4gICAgICogdG8gdGhlIGNvbmZpZyBvbiB0aGUgSmF2YVNjcmlwdCBzaWRlLlxuICAgICAqL1xuICAgIHJlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuYWNjZXB0ZWRDb25maWdzID0gdGhpcy5nZXRBY2NlcHRlZENvbmZpZ3MoKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbmZpZyA9IHRoaXMucHJvY2Vzc0NvbmZpZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIGF2YWlsYWJsZSBjb25maWd1cmF0aW9ucyB0aGF0IGNhbiBiZSBzZXQgdGhyb3VnaCB0aGUgZGF0YSBjb25maWcuXG4gICAgICpcbiAgICAgKiBJZiBhbiBpbnN0YW5jZSBoYXMgYW4gYGFjY2VwdEFsbERhdGFDb25maWdzYCBwcm9wZXJ0eSwgc2V0IHRvIGB0cnVlYCwgdGhlbiBhbGwgZGF0YVxuICAgICAqIGF0dHJpYnV0ZXMgd2lsbCBiZSBhdmFpbGFibGUgYXMgY29uZmlndXJhdGlvbiB2YWx1ZXMuIFRoaXMgY2FuIGJlIGEgc2VjdXJpdHkgY29uY2Vybiwgc29cbiAgICAgKiB0cmVhZCBjYXJlZnVsbHkuXG4gICAgICpcbiAgICAgKiBPdGhlcndpc2UsIGF2YWlsYWJsZSBjb25maWd1cmF0aW9ucyB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGtleXMgYXZhaWxhYmxlIGluIGFuIG9iamVjdFxuICAgICAqIHJldHVybmVkIGJ5IGEgYGRlZmF1bHRzKClgIG1ldGhvZCBpbiB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW118Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBY2NlcHRlZENvbmZpZ3MoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuYWNjZXB0QWxsRGF0YUNvbmZpZ3MgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgJiYgdGhpcy5pbnN0YW5jZS5hY2NlcHRBbGxEYXRhQ29uZmlncyA9PT0gdHJ1ZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKSA9PT0gJ29iamVjdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGJlIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgaW5zdGFuY2UgZWl0aGVyIGRvZXMgbm90IGhhdmUgYSBgZGVmYXVsdHMoKWAgbWV0aG9kLCBvclxuICAgICAqIHRoZSBtZXRob2QgaXRzZWxmIGRvZXMgbm90IHJldHVybiBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgICAqL1xuICAgIGdldERlZmF1bHRzKCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlZmF1bHRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogTG9hZHMgdXAgdGhlIGRlZmF1bHRzLCB0aGVuIHBvcHVsYXRlcyBpdCB3aXRoIGFueSBjb25maWd1cmF0aW9uIHZhbHVlcyBwcm92aWRlZCBieSB0aGUgZGF0YVxuICAgICAqIGF0dHJpYnV0ZXMsIGJhc2VkIG9uIHRoZSBydWxlcyBvZiB0aGUgYWNjZXB0ZWQgY29uZmlndXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHRoZW4gY2FjaGVkIGFuZCBhdmFpbGFibGUgdGhyb3VnaCBgY29uZmlnLmdldCgpYCBjYWxscy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgcHJvY2Vzc0NvbmZpZygpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXREZWZhdWx0cygpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ29uZmlncyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmVsZW1lbnQuZGF0YXNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDb25maWdzID09PSB0cnVlIHx8IHRoaXMuYWNjZXB0ZWRDb25maWdzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHRoaXMuY29lcmNlVmFsdWUodGhpcy5lbGVtZW50LmRhdGFzZXRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmxvY2FsQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY2NlcHRlZENvbmZpZ3MgPT09IHRydWUgfHwgdGhpcy5hY2NlcHRlZENvbmZpZ3MuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5sb2NhbENvbmZpZ1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvZXJjZXMgY29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIEphdmFTY3JpcHQuXG4gICAgICpcbiAgICAgKiBUYWtlcyB0aGUgc3RyaW5nIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGRhdGEgYXR0cmlidXRlIGFuZCBjb2VyY2VzIGl0IGludG8gYSBtb3JlIHN1aXRhYmxlXG4gICAgICogdHlwZSBmb3IgSmF2YVNjcmlwdCBwcm9jZXNzaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIGNvZXJjZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKHZhbHVlKTtcblxuICAgICAgICAvLyBOdWxsIHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuZGVmaW5lZCB2YWx1ZVxuICAgICAgICBpZiAoc3RyaW5nVmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFzZTY0IHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZS5zdGFydHNXaXRoKCdiYXNlNjQ6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2U2NHN0ciA9IHN0cmluZ1ZhbHVlLnJlcGxhY2UoL15iYXNlNjQ6LywgJycpO1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGF0b2IoYmFzZTY0c3RyKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvZXJjZVZhbHVlKGRlY29kZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm9vbGVhbiB2YWx1ZVxuICAgICAgICBpZiAoWyd0cnVlJywgJ3llcyddLmluY2x1ZGVzKHN0cmluZ1ZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoWydmYWxzZScsICdubyddLmluY2x1ZGVzKHN0cmluZ1ZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOdW1lcmljIHZhbHVlXG4gICAgICAgIGlmICgvXlstK10/WzAtOV0rKFxcLlswLTldKyk/JC8udGVzdChzdHJpbmdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoc3RyaW5nVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSlNPTiB2YWx1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc25vd2JvYXJkLmpzb25QYXJzZXIoKS5wYXJzZShzdHJpbmdWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoc3RyaW5nVmFsdWUgPT09ICcnKSA/IHRydWUgOiBzdHJpbmdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBQcm92aWRlcyBmbGFzaCBtZXNzYWdlcyBmb3IgdGhlIENNUy5cbiAqXG4gKiBGbGFzaCBtZXNzYWdlcyB3aWxsIHBvcCB1cCBhdCB0aGUgdG9wIGNlbnRlciBvZiB0aGUgcGFnZSBhbmQgd2lsbCByZW1haW4gZm9yIDcgc2Vjb25kcyBieSBkZWZhdWx0LiBIb3ZlcmluZyBvdmVyXG4gKiB0aGUgbWVzc2FnZSB3aWxsIHJlc2V0IGFuZCBwYXVzZSB0aGUgdGltZXIuIENsaWNraW5nIG9uIHRoZSBmbGFzaCBtZXNzYWdlIHdpbGwgZGlzbWlzcyBpdC5cbiAqXG4gKiBBcmd1bWVudHM6XG4gKiAgLSBcIm1lc3NhZ2VcIjogVGhlIGNvbnRlbnQgb2YgdGhlIGZsYXNoIG1lc3NhZ2UuIEhUTUwgaXMgYWNjZXB0ZWQuXG4gKiAgLSBcInR5cGVcIjogVGhlIHR5cGUgb2YgZmxhc2ggbWVzc2FnZS4gVGhpcyBpcyBhcHBlbmRlZCBhcyBhIGNsYXNzIHRvIHRoZSBmbGFzaCBtZXNzYWdlIGl0c2VsZi5cbiAqICAtIFwiZHVyYXRpb25cIjogSG93IGxvbmcgdGhlIGZsYXNoIG1lc3NhZ2Ugd2lsbCBzdGF5IHZpc2libGUgZm9yLCBpbiBzZWNvbmRzLiBEZWZhdWx0OiA3IHNlY29uZHMuXG4gKlxuICogVXNhZ2U6XG4gKiAgICAgIFNub3dib2FyZC5mbGFzaCgnVGhpcyBpcyBhIGZsYXNoIG1lc3NhZ2UnLCAnaW5mbycsIDgpO1xuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbGFzaCBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkdXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdChtZXNzYWdlLCB0eXBlLCBkdXJhdGlvbikge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICdkZWZhdWx0JztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IE51bWJlcihkdXJhdGlvbiB8fCA3KTtcblxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmxhc2ggZHVyYXRpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciwgb3IgemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbGFzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3RyYW5zaXRpb24nXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGVuc3VyZSB0aGUgZmxhc2ggbWVzc2FnZSBpcyByZW1vdmVkIGFuZCB0aW1lb3V0IGlzIGNsZWFyZWQgaWYgdGhlIG1vZHVsZSBpcyByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICBpZiAodGhpcy50aW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lci5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoKSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2ZsYXNoLmNyZWF0ZScsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZmxhc2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5mbGFzaC5pbm5lckhUTUwgPSB0aGlzLm1lc3NhZ2U7XG4gICAgICAgIHRoaXMuZmxhc2guY2xhc3NMaXN0LmFkZCgnZmxhc2gtbWVzc2FnZScsIHRoaXMudHlwZSk7XG4gICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWNvbnRyb2wnKTtcbiAgICAgICAgdGhpcy5mbGFzaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMucmVtb3ZlKCkpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHRoaXMuc3RvcFRpbWVyKCkpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4gdGhpcy5zdGFydFRpbWVyKCkpO1xuXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIuY2xhc3NMaXN0LmFkZCgnZmxhc2gtdGltZXInKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2guYXBwZW5kQ2hpbGQodGhpcy5mbGFzaFRpbWVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2guY2xhc3NMaXN0LmFkZCgnbm8tdGltZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0byBib2R5XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5mbGFzaCk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQudHJhbnNpdGlvbih0aGlzLmZsYXNoLCAnc2hvdycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2ZsYXNoLnJlbW92ZScsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQudHJhbnNpdGlvbih0aGlzLmZsYXNoLCAnaGlkZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBmbGFzaCBtZXNzYWdlcyBhdmFpbGFibGUgb24gdGhlIHBhZ2UuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgPiBkaXYuZmxhc2gtbWVzc2FnZScpLmZvckVhY2goKGVsZW1lbnQpID0+IGVsZW1lbnQucmVtb3ZlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgdGltZXIgZm9yIHRoaXMgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzdGFydFRpbWVyKCkge1xuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aW1lclRyYW5zID0gdGhpcy5zbm93Ym9hcmQudHJhbnNpdGlvbih0aGlzLmZsYXNoVGltZXIsICd0aW1lb3V0JywgbnVsbCwgYCR7dGhpcy5kdXJhdGlvbn0uMHNgLCB0cnVlKTtcbiAgICAgICAgdGhpcy50aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMucmVtb3ZlKCksIHRoaXMuZHVyYXRpb24gKiAxMDAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHRpbWVyIGZvciB0aGlzIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgc3RvcFRpbWVyKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lclRyYW5zKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVyVHJhbnMuY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIERlZmluZXMgYSBkZWZhdWx0IGxpc3RlbmVyIGZvciBmbGFzaCBldmVudHMuXG4gKlxuICogQ29ubmVjdHMgdGhlIEZsYXNoIHBsdWdpbiB0byB2YXJpb3VzIGV2ZW50cyB0aGF0IHVzZSBmbGFzaCBtZXNzYWdlcy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxhc2hMaXN0ZW5lciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmljZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydmbGFzaCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4RXJyb3JNZXNzYWdlOiAnYWpheEVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICBhamF4Rmxhc2hNZXNzYWdlczogJ2FqYXhGbGFzaE1lc3NhZ2VzJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEbyBmbGFzaCBtZXNzYWdlcyBmb3IgUEhQIGZsYXNoIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY29udHJvbD1cImZsYXNoLW1lc3NhZ2VcIl0nKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNub3dib2FyZC5mbGFzaChcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCxcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuZmxhc2hUeXBlLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5mbGFzaER1cmF0aW9uLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYSBmbGFzaCBtZXNzYWdlIGZvciBBSkFYIGVycm9ycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgYWpheEVycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKG1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgZmxhc2ggbWVzc2FnZXMgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSBBSkFYIGZ1bmN0aW9uYWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZXNcbiAgICAgKi9cbiAgICBhamF4Rmxhc2hNZXNzYWdlcyhtZXNzYWdlcykge1xuICAgICAgICBPYmplY3QuZW50cmllcyhtZXNzYWdlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtjc3NDbGFzcywgbWVzc2FnZV0gPSBlbnRyeTtcbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKG1lc3NhZ2UsIGNzc0NsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEFkZHMgQUpBWC1kcml2ZW4gZm9ybSB2YWxpZGF0aW9uIHRvIFNub3dib2FyZCByZXF1ZXN0cy5cbiAqXG4gKiBEb2N1bWVudGF0aW9uIGZvciB0aGlzIGZlYXR1cmUgY2FuIGJlIGZvdW5kIGhlcmU6XG4gKiBodHRwczovL3dpbnRlcmNtcy5jb20vZG9jcy9zbm93Ym9hcmQvZXh0cmFzI2FqYXgtdmFsaWRhdGlvblxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMiBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtVmFsaWRhdGlvbiBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICB0aGlzLmVycm9yQmFncyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4U3RhcnQ6ICdjbGVhclZhbGlkYXRpb24nLFxuICAgICAgICAgICAgYWpheFZhbGlkYXRpb25FcnJvcnM6ICdkb1ZhbGlkYXRpb24nLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWR5IGV2ZW50IGhhbmRsZXIuXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuY29sbGVjdEVycm9yQmFncyhkb2N1bWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYW4gQUpBWCByZXNwb25zZSBhbmQgcGFzc2VzIHRoZW0gdGhyb3VnaCB0byB0aGUgZXJyb3IgYmFncy5cbiAgICAgKlxuICAgICAqIFRoaXMgaGFuZGxlciByZXR1cm5zIGZhbHNlIHRvIGNhbmNlbCBhbnkgZnVydGhlciB2YWxpZGF0aW9uIGhhbmRsaW5nLCBhbmQgcHJldmVudHMgdGhlIGZsYXNoXG4gICAgICogbWVzc2FnZSB0aGF0IGlzIGRpc3BsYXllZCBieSBkZWZhdWx0IGZvciBmaWVsZCBlcnJvcnMgaW4gQUpBWCByZXF1ZXN0cyBmcm9tIHNob3dpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnZhbGlkRmllbGRzXG4gICAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXF1ZXN0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgZG9WYWxpZGF0aW9uKGZvcm0sIGludmFsaWRGaWVsZHMsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudCAmJiByZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVycm9yQmFncyA9IHRoaXMuZXJyb3JCYWdzLmZpbHRlcigoZXJyb3JCYWcpID0+IGVycm9yQmFnLmZvcm0gPT09IGZvcm0pO1xuICAgICAgICBlcnJvckJhZ3MuZm9yRWFjaCgoZXJyb3JCYWcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yQmFnKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbnkgdmFsaWRhdGlvbiBlcnJvcnMgaW4gdGhlIGdpdmVuIGZvcm0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb21pc2V9IHByb21pc2VcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjbGVhclZhbGlkYXRpb24ocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LnJlcXVlc3RWYWxpZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXF1ZXN0LmZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVycm9yQmFncyA9IHRoaXMuZXJyb3JCYWdzLmZpbHRlcigoZXJyb3JCYWcpID0+IGVycm9yQmFnLmZvcm0gPT09IHJlcXVlc3QuZm9ybSk7XG4gICAgICAgIGVycm9yQmFncy5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlRXJyb3JCYWcoZXJyb3JCYWcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBlcnJvciBiYWdzIChlbGVtZW50cyB3aXRoIFwiZGF0YS12YWxpZGF0ZS1lcnJvclwiIGF0dHJpYnV0ZSkgYW5kIGxpbmtzIHRoZW0gdG8gYVxuICAgICAqIHBsYWNlaG9sZGVyIGFuZCBmb3JtLlxuICAgICAqXG4gICAgICogVGhlIGVycm9yIGJhZ3Mgd2lsbCBiZSBpbml0aWFsbHkgaGlkZGVuLCBhbmQgd2lsbCBvbmx5IHNob3cgd2hlbiB2YWxpZGF0aW9uIGVycm9ycyBvY2N1ci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvb3ROb2RlXG4gICAgICovXG4gICAgY29sbGVjdEVycm9yQmFncyhyb290Tm9kZSkge1xuICAgICAgICByb290Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS12YWxpZGF0ZS1lcnJvcl0sIFtkYXRhLXZhbGlkYXRlLWZvcl0nKS5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGVycm9yQmFnLmNsb3Nlc3QoJ2Zvcm1bZGF0YS1yZXF1ZXN0LXZhbGlkYXRlXScpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVycm9yIGJhZyBkb2VzIG5vdCByZXNpZGUgd2l0aGluIGEgdmFsaWRhdGluZyBmb3JtLCByZW1vdmUgaXRcbiAgICAgICAgICAgIGlmICghZm9ybSkge1xuICAgICAgICAgICAgICAgIGVycm9yQmFnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZXJyb3JCYWcpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluZCBtZXNzYWdlIGxpc3Qgbm9kZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBsZXQgbWVzc2FnZUxpc3RFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChlcnJvckJhZy5tYXRjaGVzKCdbZGF0YS12YWxpZGF0ZS1lcnJvcl0nKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudCA9IGVycm9yQmFnLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1lc3NhZ2VdJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIHBsYWNlaG9sZGVyIG5vZGVcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnJyk7XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGVycm9yIGJhZyBhbmQgcmVwbGFjZSB3aXRoIHBsYWNlaG9sZGVyXG4gICAgICAgICAgICBjb25zdCBlcnJvckJhZ0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogZXJyb3JCYWcsXG4gICAgICAgICAgICAgICAgZm9ybSxcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcjogKGVycm9yQmFnLmRhdGFzZXQudmFsaWRhdGVGb3IpXG4gICAgICAgICAgICAgICAgICAgID8gZXJyb3JCYWcuZGF0YXNldC52YWxpZGF0ZUZvci5zcGxpdCgvXFxzKixcXHMqLylcbiAgICAgICAgICAgICAgICAgICAgOiAnKicsXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50OiAobWVzc2FnZUxpc3RFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VMaXN0RWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0QW5jaG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2U6IChlcnJvckJhZy5kYXRhc2V0LnZhbGlkYXRlRm9yKVxuICAgICAgICAgICAgICAgICAgICA/IChlcnJvckJhZy50ZXh0Q29udGVudCAhPT0gJycgfHwgZXJyb3JCYWcuY2hpbGROb2Rlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gSWYgYW4gbWVzc2FnZSBsaXN0IGVsZW1lbnQgZXhpc3RzLCBjcmVhdGUgYW5vdGhlciBwbGFjZWhvbGRlciB0byBhY3QgYXMgYW4gYW5jaG9yIHBvaW50XG4gICAgICAgICAgICBpZiAobWVzc2FnZUxpc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUxpc3RBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobWVzc2FnZUxpc3RBbmNob3IsIG1lc3NhZ2VMaXN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZXJyb3JCYWdEYXRhLm1lc3NhZ2VMaXN0QW5jaG9yID0gbWVzc2FnZUxpc3RBbmNob3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yQmFnLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHBsYWNlaG9sZGVyLCBlcnJvckJhZyk7XG5cbiAgICAgICAgICAgIHRoaXMuZXJyb3JCYWdzLnB1c2goZXJyb3JCYWdEYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgYW4gZXJyb3IgYmFnLCByZXBsYWNpbmcgdGhlIGVycm9yIG1lc3NhZ2VzIHdpdGggYSBwbGFjZWhvbGRlciBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICovXG4gICAgaGlkZUVycm9yQmFnKGVycm9yQmFnKSB7XG4gICAgICAgIGlmIChlcnJvckJhZy5lbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICBlcnJvckJhZy5lbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVycm9yQmFnLnBsYWNlaG9sZGVyLCBlcnJvckJhZy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIGFuIGVycm9yIGJhZyB3aXRoIHRoZSBnaXZlbiBpbnZhbGlkIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlcnJvckJhZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnZhbGlkRmllbGRzXG4gICAgICovXG4gICAgc2hvd0Vycm9yQmFnKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKSB7XG4gICAgICAgIGlmICghdGhpcy5lcnJvckJhZ1ZhbGlkYXRlc0ZpZWxkKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlcnJvckJhZy5lbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICBlcnJvckJhZy5wbGFjZWhvbGRlci5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlcnJvckJhZy5lbGVtZW50LCBlcnJvckJhZy5wbGFjZWhvbGRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JCYWcudmFsaWRhdGVGb3IgIT09ICcqJykge1xuICAgICAgICAgICAgaWYgKCFlcnJvckJhZy5jdXN0b21NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RGaWVsZCA9IE9iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiBlcnJvckJhZy52YWxpZGF0ZUZvci5pbmNsdWRlcyhmaWVsZCkpXG4gICAgICAgICAgICAgICAgICAgIC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIFtlcnJvckJhZy5lbGVtZW50LmlubmVySFRNTF0gPSBpbnZhbGlkRmllbGRzW2ZpcnN0RmllbGRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yQmFnLm1lc3NhZ2VMaXN0RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHByZXZpb3VzIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICBlcnJvckJhZy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXZhbGlkYXRpb24tbWVzc2FnZV0nKS5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGludmFsaWRGaWVsZHMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgWywgZXJyb3JzXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZXJyb3JCYWcubWVzc2FnZUxpc3RFbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuZGF0YXNldC52YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5pbm5lckhUTUwgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JCYWcubWVzc2FnZUxpc3RBbmNob3IuYWZ0ZXIobWVzc2FnZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBbZXJyb3JCYWcuZWxlbWVudC5pbm5lckhUTUxdID0gaW52YWxpZEZpZWxkc1tPYmplY3Qua2V5cyhpbnZhbGlkRmllbGRzKS5zaGlmdCgpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBnaXZlbiBlcnJvciBiYWcgYXBwbGllcyBmb3IgdGhlIGdpdmVuIGludmFsaWQgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBlcnJvckJhZ1ZhbGlkYXRlc0ZpZWxkKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKSB7XG4gICAgICAgIGlmIChlcnJvckJhZy52YWxpZGF0ZUZvciA9PT0gJyonKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpbnZhbGlkRmllbGRzKVxuICAgICAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGVycm9yQmFnLnZhbGlkYXRlRm9yLmluY2x1ZGVzKGZpZWxkKSlcbiAgICAgICAgICAgIC5sZW5ndGggPiAwO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRGlzcGxheXMgYSBzdHJpcGUgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSB0aGF0IGluZGljYXRlcyBsb2FkaW5nLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdHJpcGVMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5pY2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4U3RhcnQ6ICdhamF4U3RhcnQnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlYWR5KCkge1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlU3RyaXBlKCk7XG4gICAgfVxuXG4gICAgYWpheFN0YXJ0KHByb21pc2UsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHJlcXVlc3Qub3B0aW9ucy5zdHJpcGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3coKTtcblxuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVTdHJpcGUoKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlTG9hZGVkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnc3RyaXBlLWxvYWRpbmctaW5kaWNhdG9yJywgJ2xvYWRlZCcpO1xuICAgICAgICB0aGlzLnN0cmlwZS5jbGFzc0xpc3QuYWRkKCdzdHJpcGUnKTtcbiAgICAgICAgdGhpcy5zdHJpcGVMb2FkZWQuY2xhc3NMaXN0LmFkZCgnc3RyaXBlLWxvYWRlZCcpO1xuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmFwcGVuZENoaWxkKHRoaXMuc3RyaXBlKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQodGhpcy5zdHJpcGVMb2FkZWQpO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5pbmRpY2F0b3IpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY291bnRlciArPSAxO1xuXG4gICAgICAgIGNvbnN0IG5ld1N0cmlwZSA9IHRoaXMuc3RyaXBlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQobmV3U3RyaXBlKTtcbiAgICAgICAgdGhpcy5zdHJpcGUucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuc3RyaXBlID0gbmV3U3RyaXBlO1xuXG4gICAgICAgIGlmICh0aGlzLmNvdW50ZXIgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkZWQnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd3bi1sb2FkaW5nJyk7XG4gICAgfVxuXG4gICAgaGlkZShmb3JjZSkge1xuICAgICAgICB0aGlzLmNvdW50ZXIgLT0gMTtcblxuICAgICAgICBpZiAoZm9yY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRlciA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb3VudGVyIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd3bi1sb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEVtYmVkcyB0aGUgXCJleHRyYXNcIiBzdHlsZXNoZWV0IGludG8gdGhlIHBhZ2UsIGlmIGl0IGlzIG5vdCBsb2FkZWQgdGhyb3VnaCB0aGUgdGhlbWUuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0eWxlc2hlZXRMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIGxldCBzdHlsZXNMb2FkZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgc3R5bGVzaGVldCBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nKS5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgICAgICAgIGlmIChjc3MuaHJlZi5lbmRzV2l0aCgnL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9jc3Mvc25vd2JvYXJkLmV4dHJhcy5jc3MnKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlc0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghc3R5bGVzTG9hZGVkKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZXNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgc3R5bGVzaGVldC5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XG4gICAgICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgnaHJlZicsIHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KCcvbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2Nzcy9zbm93Ym9hcmQuZXh0cmFzLmNzcycpKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVzaGVldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBlbGVtZW50cy5cbiAqXG4gKiBUcmFuc2l0aW9uIGFsbG93cyBDU1MgdHJhbnNpdGlvbnMgdG8gYmUgY29udHJvbGxlZCBhbmQgY2FsbGJhY2tzIHRvIGJlIHJ1biBvbmNlIGNvbXBsZXRlZC4gSXQgd29ya3Mgc2ltaWxhciB0byBWdWVcbiAqIHRyYW5zaXRpb25zIHdpdGggMyBzdGFnZXMgb2YgdHJhbnNpdGlvbiwgYW5kIGNsYXNzZXMgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgd2l0aCB0aGUgdHJhbnNpdGlvbiBuYW1lIHN1ZmZpeGVkIHdpdGhcbiAqIHRoZSBzdGFnZSBvZiB0cmFuc2l0aW9uOlxuICpcbiAqICAtIGBpbmA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgdHJhbnNpdGlvbiwgcmVtb3ZlZCBhZnRlcndhcmRzLiBUaGlzIHNob3VsZCBiZVxuICogICAgICB1c2VkIHRvIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgdHJhbnNpdGlvbi5cbiAqICAtIGBhY3RpdmVgOiBBIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gZGVmaW5lIHRoZVxuICogICAgICB0cmFuc2l0aW9uIGl0c2VsZi5cbiAqICAtIGBvdXRgOiBBIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgdHJhbnNpdGlvbiBhbmQga2VwdCB0byB0aGUgZW5kIG9mIHRoZVxuICogICAgICB0cmFuc2l0aW9uLiBUaGlzIHNob3VsZCBkZWZpbmUgdGhlIGVuZCBzdGF0ZSBvZiB0aGUgdHJhbnNpdGlvbi5cbiAqXG4gKiBVc2FnZTpcbiAqICAgICAgU25vd2JvYXJkLnRyYW5zaXRpb24oZG9jdW1lbnQuZWxlbWVudCwgJ3RyYW5zaXRpb24nLCAoKSA9PiB7XG4gKiAgICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlIGVsZW1lbnQgYWZ0ZXIgNyBzZWNvbmRzJyk7XG4gKiAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICogICAgICB9LCAnN3MnKTtcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhbnNpdGlvbiBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byB0cmFuc2l0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zaXRpb24gVGhlIG5hbWUgb2YgdGhlIHRyYW5zaXRpb24sIHRoaXMgcHJlZml4ZXMgdGhlIHN0YWdlcyBvZiB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgdHJhbnNpdGlvbiBlbmRzLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkdXJhdGlvbiBBbiBvcHRpb25hbCBvdmVycmlkZSBvbiB0aGUgdHJhbnNpdGlvbiBkdXJhdGlvbi4gTXVzdCBiZSBzcGVjaWZpZWQgYXMgJ3MnIChzZWNzKSBvciAnbXMnIChtc2VjcykuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0cmFpbFRvIElmIHRydWUsIHRoZSBcIm91dFwiIGNsYXNzIHdpbGwgcmVtYWluIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICovXG4gICAgY29uc3RydWN0KGVsZW1lbnQsIHRyYW5zaXRpb24sIGNhbGxiYWNrLCBkdXJhdGlvbiwgdHJhaWxUbykge1xuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIEhUTUxFbGVtZW50IG11c3QgYmUgcHJvdmlkZWQgZm9yIHRyYW5zaXRpb25pbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNpdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNpdGlvbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gdHJhbnNpdGlvbjtcblxuICAgICAgICBpZiAoY2FsbGJhY2sgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIG11c3QgYmUgYSB2YWxpZCBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLnBhcnNlRHVyYXRpb24oZHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYWlsVG8gPSAodHJhaWxUbyA9PT0gdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5kb1RyYW5zaXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGV2ZW50IGNsYXNzZXMgdG8gdGhlIGdpdmVuIHRyYW5zaXRpb24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZXZlbnRDbGFzc2VzKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDbGFzc2VzID0ge1xuICAgICAgICAgICAgaW46IGAke3RoaXMudHJhbnNpdGlvbn0taW5gLFxuICAgICAgICAgICAgYWN0aXZlOiBgJHt0aGlzLnRyYW5zaXRpb259LWFjdGl2ZWAsXG4gICAgICAgICAgICBvdXQ6IGAke3RoaXMudHJhbnNpdGlvbn0tb3V0YCxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50Q2xhc3Nlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXR1cm5DbGFzc2VzID0gW107XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50Q2xhc3NlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAoYXJncy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuQ2xhc3Nlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJldHVybkNsYXNzZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkb1RyYW5zaXRpb24oKSB7XG4gICAgICAgIC8vIEFkZCBkdXJhdGlvbiBvdmVycmlkZVxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IHRoaXMuZHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0Q2xhc3NlcygpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRyYW5zaXRpb24gLSBzaG93IFwiaW5cIiBhbmQgXCJhY3RpdmVcIiBjbGFzc2VzXG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCdpbicsICdhY3RpdmUnKS5mb3JFYWNoKChldmVudENsYXNzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChldmVudENsYXNzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgYSB0cmFuc2l0aW9uIGV4aXN0c1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudClbJ3RyYW5zaXRpb24tZHVyYXRpb24nXSAhPT0gJzBzJykge1xuICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgdGhlIHRyYW5zaXRpb24gdG8gZW5kXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB0aGlzLm9uVHJhbnNpdGlvbkVuZCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZXZlbnRDbGFzc2VzKCdpbicpWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5ldmVudENsYXNzZXMoJ291dCcpWzBdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldENsYXNzZXMoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2suYXBwbHkodGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIHRyYW5zaXRpb24gZW5kcy5cbiAgICAgKlxuICAgICAqIFdoZW4gYSB0cmFuc2l0aW9uIGVuZHMsIHRoZSBpbnN0YW5jZSBvZiB0aGUgdHJhbnNpdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGRlc3RydWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBvblRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCdhY3RpdmUnLCAoIXRoaXMudHJhaWxUbykgPyAnb3V0JyA6ICcnKS5mb3JFYWNoKChldmVudENsYXNzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShldmVudENsYXNzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2suYXBwbHkodGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBkdXJhdGlvbiBvdmVycmlkZVxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyBhIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4gdGhpcy5vblRyYW5zaXRpb25FbmQsIHtcbiAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzZXRDbGFzc2VzKCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgZGVzdHJ1Y3RvclxuICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBjbGFzc2VzLCByZW1vdmluZyBhbnkgdHJhbnNpdGlvbiBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVzZXRDbGFzc2VzKCkge1xuICAgICAgICB0aGlzLmV2ZW50Q2xhc3NlcygpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBnaXZlbiBkdXJhdGlvbiBhbmQgY29udmVydHMgaXQgdG8gYSBcIm1zXCIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZHVyYXRpb25cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHBhcnNlRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gL14oWzAtOV0rKFxcLlswLTldKyk/KShtP3MpPyQvLmV4ZWMoZHVyYXRpb24pO1xuICAgICAgICBjb25zdCBhbW91bnQgPSBOdW1iZXIocGFyc2VkWzFdKTtcbiAgICAgICAgY29uc3QgdW5pdCA9IChwYXJzZWRbM10gPT09ICdzJylcbiAgICAgICAgICAgID8gJ3NlYydcbiAgICAgICAgICAgIDogJ21zZWMnO1xuXG4gICAgICAgIHJldHVybiAodW5pdCA9PT0gJ3NlYycpXG4gICAgICAgICAgICA/IGAke2Ftb3VudCAqIDEwMDB9bXNgXG4gICAgICAgICAgICA6IGAke01hdGguZmxvb3IoYW1vdW50KX1tc2A7XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRyaWdnZXJFbnRpdHlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyIFRoZSBzZWxlY3RvciBmb3IgdGhlIHRyaWdnZXIgdGFyZ2V0IGVsZW1lbnQocykuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uZGl0aW9uIFRoZSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHRyaWdnZXIgdG8gZmlyZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gVGhlIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIHRyaWdnZXIgZmlyZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ3x1bmRlZmluZWR9IHBhcmVudCBUaGUgcGFyZW50IGVsZW1lbnQgd2l0aCB3aGljaCB0byBsaW1pdCB0aGUgdHJpZ2dlciBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bWJlcn0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSB0cmlnZ2VyIGV2ZW50LlxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudFtdfSBlbGVtZW50cyBUaGUgdGFyZ2V0IGVsZW1lbnRzIHRoYXQgdGhpcyB0cmlnZ2VyIGFwcGxpZXMgdG8uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJpZ2dlckVsZW1lbnRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgdHJpZ2dlciBldmVudCBuYW1lLlxuICogQHByb3BlcnR5IHtpbnR9IHByaW9yaXR5IFRoZSB0cmlnZ2VyIGV2ZW50IHByaW9yaXR5LlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZXZlbnQgVGhlIHRyaWdnZXIgZXZlbnQgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBUcmlnZ2VyIGhhbmRsZXIgZm9yIEhUTUwgZWxlbWVudHMuXG4gKlxuICogVGhpcyBpcyBhIHJlLWltYWdpbmluZyBvZiB0aGUgSW5wdXQuVHJpZ2dlciBmdW5jdGlvbmFsaXR5IGluIHRoZSBvcmlnaW5hbCBXaW50ZXIgQ01TIGZyYW1ld29yayxcbiAqIGluaXRpYWxpc2VkIHRocm91Z2ggdGhlIGBkYXRhLXRyaWdnZXJgIGF0dHJpYnV0ZXMuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gcmVtYWluaW5nIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsIElucHV0LlRyaWdnZXIgZnVuY3Rpb25hbGl0eSwgdGhpc1xuICogaGFuZGxlciBhZGRzIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBhbmQgY29uZmlndXJhdGlvbiBmb3IgbW9yZSBmbGV4aWJsZSB0cmlnZ2VyIHVzYWdlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly93aW50ZXJjbXMuY29tL2RvY3MvdjEuMi91aS9zY3JpcHQvaW5wdXQtdHJpZ2dlclxuICpcbiAqIEBjb3B5cmlnaHQgMjAyNCBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmlnZ2VyIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3RydWN0KGVsZW1lbnQpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBlbGVtZW50IHRoaXMgaW5zdGFuY2UgaXMgYXR0YWNoZWQgdG8uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPFRyaWdnZXJFbnRpdHk+Pn0gVGhlIHRyaWdnZXJzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyaWdnZXJzID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxUcmlnZ2VyRWxlbWVudD4+fSBBIG1hcCBvZiBlbGVtZW50cyB0aGF0IHRyaWdnZXIgZXZlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ldmVudHMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtNYXA8RWxlbWVudCwgTWFwPHN0cmluZywgRnVuY3Rpb24+Pn0gQSBtYXAgb2YgZWxlbWVudHMgYW5kIHRoZWlyIGV2ZW50IGNvbm5lY3RvcnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbm5lY3RvcnMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgdGhpcy5wYXJzZVRyaWdnZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVHJpZ2dlckV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5ydW5FdmVudHMoKTtcblxuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ3RyaWdnZXJzLnJlYWR5JywgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMucmVzZXRFdmVudHMoKTtcbiAgICAgICAgc3VwZXIuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdGhlIGVsZW1lbnQncyBkYXRhIGF0dHJpYnV0ZXMgYW5kIGRldGVybWluZXMgYXBwbGljYWJsZSB0cmlnZ2Vycy5cbiAgICAgKlxuICAgICAqIFRyaWdnZXIgZGF0YSBhdHRyaWJ1dGVzIG11c3QgYmUgaW4gdGhlIGZvcm1hdCBgZGF0YS10cmlnZ2VyLVtuYW1lXS1bcGFyYW1ldGVyXWAgZm9yIG11bHRpcGxlXG4gICAgICogdHJpZ2dlcnMsIG9yIGBkYXRhLXRyaWdnZXItW3BhcmFtZXRlcl1gIGZvciBzaW5nbGUgdHJpZ2dlcnMuXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmU6XG4gICAgICogIC0gYGNvbmRpdGlvbmAgb3IgYHdoZXJlYDogVGhlIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgbWV0IGZvciB0aGUgdHJpZ2dlciB0byBmaXJlLlxuICAgICAqICAtIGBhY3Rpb25gOiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgdHJpZ2dlciBmaXJlcy5cbiAgICAgKiAgLSBgcGFyZW50YCBvciBgY2xvc2VzdC1wYXJlbnRgOiBUaGUgcGFyZW50IGVsZW1lbnQgd2l0aCB3aGljaCB0byBsaW1pdCB0aGUgdHJpZ2dlciBzY29wZS5cbiAgICAgKlxuICAgICAqIEludGVybmFsbHksIHRoZSB0cmlnZ2VyIG1hcCB1c2VzIHRoZSBgdHJpZ2dlcmAgcGFyYW1ldGVyIHRvIHN0b3JlIHRoZSB0cmlnZ2VyIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIHBhcnNlVHJpZ2dlcnMoKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YXNldCB9ID0gdGhpcy5lbGVtZW50O1xuICAgICAgICB0aGlzLnRyaWdnZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZGF0YXNldCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoLy1bQS1aXS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29udmVydCBjYW1lbENhc2UgdG8gZGFzaC1zdHlsZSBmb3IgZGF0YSBhdHRyaWJ1dGU6ICR7a2V5fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXNoU3R5bGUgPSBrZXkucmVwbGFjZSgvKFtBLVpdKS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuXG4gICAgICAgICAgICBpZiAoZGFzaFN0eWxlICE9PSAndHJpZ2dlcicgJiYgIWRhc2hTdHlsZS5zdGFydHNXaXRoKCd0cmlnZ2VyLScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyUGFydHMgPSAvKFthLXowLTlcXC0uOl9dKz8pKD86KD86LSkoY2xvc2VzdC1wYXJlbnR8Y29uZGl0aW9ufHdoZW58YWN0aW9ufHBhcmVudHxwcmlvcml0eSkpPyQvaS5leGVjKFxuICAgICAgICAgICAgICAgIGRhc2hTdHlsZS5yZXBsYWNlKCd0cmlnZ2VyLScsICcnKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IHRyaWdnZXJOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyVHlwZSA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBbJ3RyaWdnZXInLCAnY29uZGl0aW9uJywgJ2FjdGlvbicsICdwYXJlbnQnLCAnd2hlbicsICdjbG9zZXN0J10uaW5kZXhPZih0cmlnZ2VyUGFydHNbMV0pICE9PSAtMVxuICAgICAgICAgICAgICAgICYmICh0cmlnZ2VyUGFydHNbMV0gIT09ICdjbG9zZXN0JyB8fCAodHJpZ2dlclBhcnRzWzFdID09PSAnY2xvc2VzdCcgJiYgdHJpZ2dlclBhcnRzWzJdID09PSAncGFyZW50JykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IG9yaWdpbmFsIHRyaWdnZXIgZm9ybWF0XG4gICAgICAgICAgICAgICAgdHJpZ2dlck5hbWUgPSAnX19vcmlnaW5hbCc7XG4gICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAodHJpZ2dlclBhcnRzWzFdID09PSAnY2xvc2VzdCcpID8gJ3BhcmVudCcgOiB0cmlnZ2VyUGFydHNbMV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRyaWdnZXJQYXJ0c1syXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgWydjbG9zZXN0LXBhcmVudCcsICdjb25kaXRpb24nLCAnd2hlbicsICdhY3Rpb24nLCAncGFyZW50JywgJ3ByaW9yaXR5J10uaW5kZXhPZih0cmlnZ2VyUGFydHNbMl0pICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgbXVsdGktdHJpZ2dlciBmb3JtYXRcbiAgICAgICAgICAgICAgICBbLCB0cmlnZ2VyTmFtZV0gPSB0cmlnZ2VyUGFydHM7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cmlnZ2VyUGFydHNbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2VzdC1wYXJlbnQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXJlbnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAncGFyZW50JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjb25kaXRpb24nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd3aGVuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ2NvbmRpdGlvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ2FjdGlvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJpb3JpdHknOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAncHJpb3JpdHknO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICd0cmlnZ2VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJzLmhhcyh0cmlnZ2VyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLnNldCh0cmlnZ2VyTmFtZSwgbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcnMuZ2V0KHRyaWdnZXJOYW1lKS5zZXQodHJpZ2dlclR5cGUsIGRhdGFzZXRba2V5XSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmlnZ2VyIGRhdGEgYXR0cmlidXRlIGFmdGVyIHBhcnNpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0W2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRyaWdnZXJzLCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgZG8gbm90IGhhdmUgYXQgbGVhc3QgYSB0cmlnZ2VyIHNlbGVjdG9yLCBhXG4gICAgICAgIC8vIGNvbmRpdGlvbiBhbmQgYW4gYWN0aW9uLCBvciBhcmUgdXNpbmcgaW52YWxpZCBjb25kaXRpb25zIG9yIGFjdGlvbnNcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKHRyaWdnZXIpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRyaWdnZXIuaGFzKCd0cmlnZ2VyJylcbiAgICAgICAgICAgICAgICB8fCAhdHJpZ2dlci5oYXMoJ2NvbmRpdGlvbicpXG4gICAgICAgICAgICAgICAgfHwgIXRyaWdnZXIuaGFzKCdhY3Rpb24nKVxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIHx8ICF0aGlzLmlzVmFsaWRDb25kaXRpb24odHJpZ2dlcilcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5pc1ZhbGlkQWN0aW9uKHRyaWdnZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ2VsZW1lbnRzJywgZWxlbWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlci5oYXMoJ3ByaW9yaXR5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ3ByaW9yaXR5JywgMTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGNvbW1hbmQgZ2l2ZW4gYXMgZWl0aGVyIGEgY29uZGl0aW9uIG9yIGFuIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIENvbW1hbmRzIGFyZSBmb3JtYXR0ZWQgYXM6IG5hbWU6cGFyYW1ldGVyMSxwYXJhbWV0ZXIyLHBhcmFtZXRlcjMsIGFsdGhvdWdoIHdlIGFsc28gc3VwcG9ydFxuICAgICAqIHRoZSBvbGQgZm9ybWF0IG9mIHZhbHVlW3BhcmFtZXRlcjEscGFyYW1ldGVyMixwYXJhbWV0ZXIzXSBmb3IgdGhlIGB2YWx1ZWAgY29tbWFuZCBvbmx5LlxuICAgICAqXG4gICAgICogSWYgYSBwYXJhbWV0ZXIgcmVxdWlyZXMgYSBjb21tYSB3aXRoaW4sIHRoZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcXVvdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRcbiAgICAgKiBAcmV0dXJucyB7bmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJzOiBzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBwYXJzZUNvbW1hbmQoY29tbWFuZCkge1xuICAgICAgICAvLyBTdXBwb3J0IG9sZC1mb3JtYXQgdmFsdWUgY29tbWFuZCAodmFsdWVbZm9vLGJhcl0pXG4gICAgICAgIGlmIChjb21tYW5kLnN0YXJ0c1dpdGgoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tbWFuZC5tYXRjaCgvW15bXFxdXSsoPz1dKS9nKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBTcGxpdCB2YWx1ZXMgd2l0aCBjb21tYXNcbiAgICAgICAgICAgIG1hdGNoLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFZhbHVlcyA9IHZhbHVlLnJlcGxhY2UoLyhcIlteXCJdKlwiKXwoJ1teJ10qJykvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChzcGxpdFZhbHVlKSA9PiBzcGxpdFZhbHVlLnJlcGxhY2UoL1xcfFxcfFxcfC9nLCAnLCcpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpLnRyaW0oKSk7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCguLi5zcGxpdFZhbHVlcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHZhbHVlcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbW1hbmQuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjb21tYW5kLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtuYW1lLCBwYXJhbWV0ZXJzXSA9IGNvbW1hbmQuc3BsaXQoJzonLCAyKTtcblxuICAgICAgICBpZiAoIXBhcmFtZXRlcnMuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtwYXJhbWV0ZXJzXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdFZhbHVlcyA9IHBhcmFtZXRlcnMucmVwbGFjZSgvKFwiW15cIl0qXCIpfCgnW14nXSonKS9nLCAocXVvdGVkKSA9PiBxdW90ZWQucmVwbGFjZSgvLC9nLCAnfHx8JykpXG4gICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcCgoc3BsaXRWYWx1ZSkgPT4gc3BsaXRWYWx1ZS5yZXBsYWNlKC9cXHxcXHxcXHwvZywgJywnKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS50cmltKCkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogc3BsaXRWYWx1ZXMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFueSBlbGVtZW50cyBhcmUgYWNjZXNzaWJsZSBieSB0aGUgcHJvdmlkZWQgdHJpZ2dlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWFwPFRyaWdnZXJFbnRpdHk+fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50W119XG4gICAgICovXG4gICAgZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKHRyaWdnZXIpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIuaGFzKCdwYXJlbnQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbGVtZW50LmNsb3Nlc3QodHJpZ2dlci5nZXQoJ3BhcmVudCcpKS5xdWVyeVNlbGVjdG9yQWxsKHRyaWdnZXIuZ2V0KCd0cmlnZ2VyJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlci5nZXQoJ3RyaWdnZXInKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb3ZpZGVkIHRyaWdnZXIgY29uZGl0aW9uIGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNWYWxpZENvbmRpdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnY2hlY2tlZCcsXG4gICAgICAgICAgICAndW5jaGVja2VkJyxcbiAgICAgICAgICAgICdlbXB0eScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ29uZW9mJyxcbiAgICAgICAgICAgICdhbGxvZicsXG4gICAgICAgICAgICAnZm9jdXMnLFxuICAgICAgICAgICAgJ2JsdXInLFxuICAgICAgICBdLmluY2x1ZGVzKHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdjb25kaXRpb24nKSkubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm92aWRlZCB0cmlnZ2VyIGFjdGlvbiBpcyB2YWxpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzVmFsaWRBY3Rpb24odHJpZ2dlcikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3Nob3cnLFxuICAgICAgICAgICAgJ2hpZGUnLFxuICAgICAgICAgICAgJ2VuYWJsZScsXG4gICAgICAgICAgICAnZGlzYWJsZScsXG4gICAgICAgICAgICAnZW1wdHknLFxuICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICdjaGVjaycsXG4gICAgICAgICAgICAndW5jaGVjaycsXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ2F0dHInLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnYWN0aW9uJykpLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRyaWdnZXIgZXZlbnRzIG9uIHRyaWdnZXIgYW5kIHRhcmdldCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBjcmVhdGVUcmlnZ2VyRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgcGFyYW1ldGVycyB9ID0gdGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2NvbmRpdGlvbicpKTtcblxuICAgICAgICAgICAgc3dpdGNoIChuYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnb25lb2YnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlRXZlbnQodHJpZ2dlciwgZmFsc2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhbGxvZic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsdWVFdmVudCh0cmlnZ2VyLCB0cnVlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZW1wdHknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVtcHR5RXZlbnQodHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3VuY2hlY2tlZCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hlY2tlZEV2ZW50KHRyaWdnZXIsIChuYW1lID09PSAnY2hlY2tlZCcpLCBwYXJhbWV0ZXJzWzBdID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0cmlnZ2VyIHRoYXQgZmlyZXMgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHRhcmdldCBlbGVtZW50KHMpIG1hdGNoZXMgb25lIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEBwYXJhbSAgey4uLnN0cmluZ30gdmFsdWVzXG4gICAgICovXG4gICAgY3JlYXRlVmFsdWVFdmVudCh0cmlnZ2VyLCBhbGwsIC4uLnZhbHVlcykge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9ZmlsZV0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRoaXNFdmVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlcy5hZGQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFsbCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiBlbGVtZW50VmFsdWVzLmhhcyh2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24odHJpZ2dlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZXMuc29tZSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24odHJpZ2dlciwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdjbGljaycsICgpID0+IHRoaXNFdmVudCgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2lucHV0JywgKCkgPT4gdGhpc0V2ZW50KCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gdGhlcmUgaXMgbm8gdmFsdWUgd2l0aGluIHRoZSB0YXJnZXQgZWxlbWVudChzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqL1xuICAgIGNyZWF0ZUVtcHR5RXZlbnQodHJpZ2dlcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRoaXNFdmVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2NsaWNrJywgKCkgPT4gdGhpc0V2ZW50KCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnaW5wdXQnLCAoKSA9PiB0aGlzRXZlbnQoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0cmlnZ2VyIHRoYXQgZmlyZXMgd2hlbiBhIHRhcmdldCBlbGVtZW50IGlzIGNoZWNrZWQvdW5jaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjaGVja2VkIElmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBjaGVja2VkIG9yIHVuY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGF0TGVhc3QgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgbXVzdCBiZSBjaGVja2VkLlxuICAgICAqICBEZWZhdWx0cyB0byAxIGlmIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBjcmVhdGVDaGVja2VkRXZlbnQodHJpZ2dlciwgY2hlY2tlZCwgYXRMZWFzdCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnRzIGNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9cmFkaW9dLCBpbnB1dFt0eXBlPWNoZWNrYm94XScpKSB7XG4gICAgICAgICAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0aGlzRXZlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWVzID0gbmV3IFNldCgpO1xuXG4gICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQgPT09IGVsZW1lbnQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgYXRMZWFzdENvdW50ID0gYXRMZWFzdCA/IE51bWJlcihhdExlYXN0KSA6IDE7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50VmFsdWVzLnNpemUgPj0gYXRMZWFzdENvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24odHJpZ2dlciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2NsaWNrJywgKCkgPT4gdGhpc0V2ZW50KCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGV2ZW50IHRvIGFuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHJlZ2lzdGVycyB0aGUgZXZlbnQgaW4gdGhlIGBldmVudHNgIG1hcCBmb3IgbGF0ZXIgdXNhZ2UgYW5kIHJlbW92YWwsIGFuZCBhZGRzIGFcbiAgICAgKiBjb25uZWN0b3IgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBldmVudCwgc28gdGhhdCB3ZSBtYXkgZW5hYmxlIHByaW9yaXRpc2F0aW9uIGFuZCBjb250cm9sIG92ZXJcbiAgICAgKiB0aGUgZmlyaW5nIG9mIHRoZSBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRzLmhhcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc2V0KGVsZW1lbnQsIG5ldyBTZXQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBldmVudE5hbWUsXG4gICAgICAgICAgICBwcmlvcml0eTogTnVtYmVyKHRyaWdnZXIuZ2V0KCdwcmlvcml0eScpKSxcbiAgICAgICAgICAgIGV2ZW50OiBjYWxsYmFjayxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5nZXQoZWxlbWVudCkuYWRkKGV2ZW50KTtcblxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdG9ycy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9ycy5zZXQoZWxlbWVudCwgbmV3IE1hcCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuc2V0KGV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZ2V0KGVsZW1lbnQpLmZvckVhY2goKGVsZW1lbnRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEV2ZW50LmV2ZW50TmFtZSA9PT0gZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaChlbGVtZW50RXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoZWxlbWVudEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RXZlbnQuZXZlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdGhpcy5jb25uZWN0b3JzLmdldChlbGVtZW50KS5nZXQoZXZlbnROYW1lKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBydW5FdmVudHMoKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5mb3JFYWNoKChlbGVtZW50Q29ubmVjdG9ycykgPT4ge1xuICAgICAgICAgICAgZWxlbWVudENvbm5lY3RvcnMuZm9yRWFjaCgoY29ubmVjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdG9yKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVzZXRFdmVudHMoKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5mb3JFYWNoKChlbGVtZW50Q29ubmVjdG9ycywgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudENvbm5lY3RvcnMuZm9yRWFjaCgoY29ubmVjdG9yLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgY29ubmVjdG9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbm5lY3RvcnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5ldmVudHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBleGVjdXRlQWN0aW9uKHRyaWdnZXIsIGNvbmRpdGlvbk1ldCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIHBhcmFtZXRlcnMgfSA9IHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdhY3Rpb24nKSk7XG5cbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdzaG93JzpcbiAgICAgICAgICAgIGNhc2UgJ2hpZGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uU2hvdyh0cmlnZ2VyLCAobmFtZSA9PT0gJ3Nob3cnKSA/IGNvbmRpdGlvbk1ldCA6ICFjb25kaXRpb25NZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFjdGlvblNob3codHJpZ2dlciwgc2hvdykge1xuICAgICAgICBpZiAoc2hvdyAmJiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCkuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsRGlzcGxheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXk7XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3cgJiYgZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5ID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFmdGVyQWN0aW9uKHRyaWdnZXIpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZGVidWcoJ1RyaWdnZXIgZmlyZWQnLCB0aGlzLmVsZW1lbnQsIHRyaWdnZXIpO1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgndHJpZ2dlci5maXJlZCcsIHRoaXMuZWxlbWVudCwgdHJpZ2dlcik7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBJbnRlcm5hbCBwcm94eSBmb3IgU25vd2JvYXJkLlxuICpcbiAqIFRoaXMgaGFuZGxlciB3cmFwcyB0aGUgU25vd2JvYXJkIGluc3RhbmNlIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBwbHVnaW4gaW5zdGFuY2VzLlxuICogSXQgcHJldmVudHMgYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kczpcbiAqICAtIGBhdHRhY2hBYnN0cmFjdHNgOiBObyBuZWVkIHRvIGF0dGFjaCBhYnN0cmFjdHMgYWdhaW4uXG4gKiAgLSBgbG9hZFV0aWx0aWVzYDogTm8gbmVlZCB0byBsb2FkIHV0aWxpdGllcyBhZ2Fpbi5cbiAqICAtIGBpbml0aWFsaXNlYDogU25vd2JvYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQuXG4gKiAgLSBgaW5pdGlhbGlzZVNpbmdsZXRvbnNgOiBTaW5nbGV0b25zIGFyZSBhbHJlYWR5IGluaXRpYWxpc2VkLlxuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoWydhdHRhY2hBYnN0cmFjdHMnLCAnbG9hZFV0aWxpdGllcycsICdpbml0aWFsaXNlJywgJ2luaXRpYWxpc2VTaW5nbGV0b25zJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBjYW5ub3QgdXNlIHRoZSBcIiR7cHJvcH1cIiBTbm93Ym9hcmQgbWV0aG9kIHdpdGhpbiBhIHBsdWdpbi5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBSZWZsZWN0LmdldCh0YXJnZXQsICdwbHVnaW5zJylbcHJvcExvd2VyXS5nZXRJbnN0YW5jZSguLi5wYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKFsnYXR0YWNoQWJzdHJhY3RzJywgJ2xvYWRVdGlsaXRpZXMnLCAnaW5pdGlhbGlzZScsICdpbml0aWFsaXNlU2luZ2xldG9ucyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxufTtcbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcbmltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5pbXBvcnQgSW5uZXJQcm94eUhhbmRsZXIgZnJvbSAnLi9Jbm5lclByb3h5SGFuZGxlcic7XG5cbi8qKlxuICogUGx1Z2luIGxvYWRlciBjbGFzcy5cbiAqXG4gKiBUaGlzIGlzIGEgcHJvdmlkZXIgKGZhY3RvcnkpIGNsYXNzIGZvciBhIHNpbmdsZSBwbHVnaW4gYW5kIHByb3ZpZGVzIHRoZSBsaW5rIGJldHdlZW4gU25vd2JvYXJkIGZyYW1ld29yayBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgdGhlIHVuZGVybHlpbmcgcGx1Z2luIGluc3RhbmNlcy4gSXQgYWxzbyBwcm92aWRlcyBzb21lIGJhc2ljIG1vY2tpbmcgb2YgcGx1Z2luIG1ldGhvZHMgZm9yIHRlc3RpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkxvYWRlciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBCaW5kcyB0aGUgV2ludGVyIGZyYW1ld29yayB0byB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7U25vd2JvYXJkfSBzbm93Ym9hcmRcbiAgICAgKiBAcGFyYW0ge1BsdWdpbkJhc2V9IGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSwgc25vd2JvYXJkLCBpbnN0YW5jZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNub3dib2FyZCA9IG5ldyBQcm94eShcbiAgICAgICAgICAgIHNub3dib2FyZCxcbiAgICAgICAgICAgIElubmVyUHJveHlIYW5kbGVyLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgICAgICAgLy8gRnJlZXplIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGlzIGxvYWRlclxuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuaW5zdGFuY2UpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzID0gW107XG4gICAgICAgIHRoaXMuc2luZ2xldG9uID0ge1xuICAgICAgICAgICAgaW5pdGlhbGlzZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICAvLyBQcmV2ZW50IGZ1cnRoZXIgZXh0ZW5zaW9uIG9mIHRoZSBzaW5nbGV0b24gc3RhdHVzIG9iamVjdFxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzLnNpbmdsZXRvbik7XG5cbiAgICAgICAgdGhpcy5tb2NrcyA9IHt9O1xuICAgICAgICB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zID0ge307XG5cbiAgICAgICAgLy8gRnJlZXplIGxvYWRlciBpdHNlbGZcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShQbHVnaW5Mb2FkZXIucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBoYXMgYSBzcGVjaWZpYyBtZXRob2QgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgY3VycmVudCBwbHVnaW4gaXMgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzTWV0aG9kKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHR5cGVvZiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBwcm90b3R5cGUgbWV0aG9kIGZvciBhIHBsdWdpbi4gVGhpcyBzaG91bGQgZ2VuZXJhbGx5IGJlIHVzZWQgZm9yIFwic3RhdGljXCIgY2FsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqIEBwYXJhbSB7Li4ufSBhcmdzXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBjYWxsTWV0aG9kKC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYXJncy5zaGlmdCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXShhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIC0gSWYgdGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHBsdWdpbiwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogLSBJZiB0aGlzIGlzIGEgc2luZ2xldG9uLCB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBwbHVnaW4gd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5CYXNlfEZ1bmN0aW9ufVxuICAgICAqL1xuICAgIGdldEluc3RhbmNlKC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVubWV0ID0gdGhpcy5nZXREZXBlbmRlbmNpZXMoKS5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLnNub3dib2FyZC5nZXRQbHVnaW5OYW1lcygpLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFwiJHt0aGlzLm5hbWV9XCIgcGx1Z2luIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGx1Z2luczogJHt1bm1ldC5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpc2VTaW5nbGV0b24oLi4ucGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IG1vY2tlZCBtZXRob2RzXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5tb2NrcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMub3JpZ2luYWxGdW5jdGlvbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm1vY2tzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gKC4uLnBhcmFtcykgPT4gY2FsbGJhY2sodGhpcywgLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgbW9ja2VkIG1ldGhvZHMgdG8gcHJvdG90eXBlXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm1vY2tzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm9yaWdpbmFsRnVuY3Rpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm1vY2tzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9ICguLi5wYXJhbXMpID0+IGNhbGxiYWNrKHRoaXMsIC4uLnBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMuaW5zdGFuY2UodGhpcy5zbm93Ym9hcmQsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBuZXdJbnN0YW5jZS5kZXRhY2ggPSAoKSA9PiB0aGlzLmluc3RhbmNlcy5zcGxpY2UodGhpcy5pbnN0YW5jZXMuaW5kZXhPZihuZXdJbnN0YW5jZSksIDEpO1xuICAgICAgICBuZXdJbnN0YW5jZS5jb25zdHJ1Y3QoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpO1xuXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgcGx1Z2luLlxuICAgICAqXG4gICAgICogSWYgdGhpcyBwbHVnaW4gaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBwbHVnaW4sIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luQmFzZVtdfVxuICAgICAqL1xuICAgIGdldEluc3RhbmNlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaXMgYSBzaW1wbGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0Z1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB0aGlzLmluc3RhbmNlID09PSAnZnVuY3Rpb24nICYmIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlIGluc3RhbmNlb2YgUGx1Z2luQmFzZSA9PT0gZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgc2luZ2xldG9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTaW5nbGV0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFNpbmdsZXRvbiA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgc2luZ2xldG9uIGhhcyBiZWVuIGluaXRpYWxpc2VkLlxuICAgICAqXG4gICAgICogTm9ybWFsIHBsdWdpbnMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0luaXRpYWxpc2VkKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24uaW5pdGlhbGlzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGluaXRpYWxpc2VTaW5nbGV0b24oLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAoIXRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgdGhpcy5pbnN0YW5jZSh0aGlzLnNub3dib2FyZCwgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIG5ld0luc3RhbmNlLmRldGFjaCA9ICgpID0+IHRoaXMuaW5zdGFuY2VzLnNwbGljZSh0aGlzLmluc3RhbmNlcy5pbmRleE9mKG5ld0luc3RhbmNlKSwgMSk7XG4gICAgICAgIG5ld0luc3RhbmNlLmNvbnN0cnVjdCguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChuZXdJbnN0YW5jZSk7XG4gICAgICAgIHRoaXMuc2luZ2xldG9uLmluaXRpYWxpc2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGN1cnJlbnQgcGx1Z2luLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldERlcGVuZGVuY2llcygpIHtcbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb25zIGNhbm5vdCBoYXZlIGRlcGVuZGVuY2llcy5cbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBkZXBlbmRlbmN5IG1ldGhvZCBzcGVjaWZpZWQuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUuZGVwZW5kZW5jaWVzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUuZGVwZW5kZW5jaWVzKCkubWFwKChpdGVtKSA9PiBpdGVtLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGhhcyBhbGwgaXRzIGRlcGVuZGVuY2llcyBmdWxmaWxsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgICAgICAgbGV0IGZ1bGZpbGxlZCA9IHRydWU7XG4gICAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zbm93Ym9hcmQuaGFzUGx1Z2luKHBsdWdpbikpIHtcbiAgICAgICAgICAgICAgICBmdWxmaWxsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgYSBtZXRob2Qgb2YgYW4gaW5zdGFuY2UgdG8gYmUgbW9ja2VkIGZvciB0ZXN0aW5nLlxuICAgICAqXG4gICAgICogVGhpcyBtb2NrIHdpbGwgYmUgYXBwbGllZCBmb3IgdGhlIGxpZmUgb2YgYW4gaW5zdGFuY2UuIEZvciBzaW5nbGV0b25zLCB0aGUgbW9jayB3aWxsIGJlIGFwcGxpZWQgZm9yIHRoZSBsaWZlXG4gICAgICogb2YgdGhlIHBhZ2UuXG4gICAgICpcbiAgICAgKiBNb2NrcyBjYW5ub3QgYmUgYXBwbGllZCB0byBjYWxsYmFjayBmdW5jdGlvbiBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG1vY2sobWV0aG9kTmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uIFwiJHttZXRob2ROYW1lfVwiIGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgbW9ja2VkYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vY2tzW21ldGhvZE5hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV0gPSB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXTtcblxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpICYmIHRoaXMuaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IG1vY2tlZCBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gKC4uLnBhcmFtZXRlcnMpID0+IGNhbGxiYWNrKHRoaXMsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIG1vY2sgY2FsbGJhY2sgZnJvbSBmdXR1cmUgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKi9cbiAgICB1bm1vY2sobWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubW9ja3NbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gdGhpcy5vcmlnaW5hbEZ1bmN0aW9uc1ttZXRob2ROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm1vY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpcy5vcmlnaW5hbEZ1bmN0aW9uc1ttZXRob2ROYW1lXTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IFJlZmxlY3QuZ2V0KHRhcmdldCwgJ3BsdWdpbnMnKVtwcm9wTG93ZXJdLmdldEluc3RhbmNlKC4uLnBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfSxcblxuICAgIGhhcyh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxufTtcbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcbmltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5pbXBvcnQgUGx1Z2luTG9hZGVyIGZyb20gJy4vUGx1Z2luTG9hZGVyJztcblxuaW1wb3J0IENvb2tpZSBmcm9tICcuLi91dGlsaXRpZXMvQ29va2llJztcbmltcG9ydCBKc29uUGFyc2VyIGZyb20gJy4uL3V0aWxpdGllcy9Kc29uUGFyc2VyJztcbmltcG9ydCBTYW5pdGl6ZXIgZnJvbSAnLi4vdXRpbGl0aWVzL1Nhbml0aXplcic7XG5pbXBvcnQgVXJsIGZyb20gJy4uL3V0aWxpdGllcy9VcmwnO1xuXG4vKipcbiAqIFNub3dib2FyZCAtIHRoZSBXaW50ZXIgSmF2YVNjcmlwdCBmcmFtZXdvcmsuXG4gKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBiYXNlIG9mIGEgbW9kZXJuIHRha2Ugb24gdGhlIFdpbnRlciBKUyBmcmFtZXdvcmssIGJlaW5nIGZ1bGx5IGV4dGVuc2libGUgYW5kIHRha2luZyBhZHZhbnRhZ2VcbiAqIG9mIG1vZGVybiBKYXZhU2NyaXB0IGZlYXR1cmVzIGJ5IGxldmVyYWdpbmcgdGhlIExhcmF2ZWwgTWl4IGNvbXBpbGF0aW9uIGZyYW1ld29yay4gSXQgYWxzbyBpcyBjb2RlZCB1cCB0byByZW1vdmUgdGhlXG4gKiBkZXBlbmRlbmN5IG9mIGpRdWVyeS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqIEBsaW5rIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3Nub3dib2FyZC9pbnRyb2R1Y3Rpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU25vd2JvYXJkIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXV0b1NpbmdsZXRvbnMgQXV0b21hdGljYWxseSBsb2FkIHNpbmdsZXRvbnMgd2hlbiBET00gaXMgcmVhZHkuIERlZmF1bHQ6IGB0cnVlYC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlYnVnIFdoZXRoZXIgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHNob3duLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGF1dG9TaW5nbGV0b25zLCBkZWJ1Zykge1xuICAgICAgICB0aGlzLmRlYnVnRW5hYmxlZCA9ICh0eXBlb2YgZGVidWcgPT09ICdib29sZWFuJyAmJiBkZWJ1ZyA9PT0gdHJ1ZSk7XG4gICAgICAgIHRoaXMuYXV0b0luaXRTaW5nbGV0b25zID0gKHR5cGVvZiBhdXRvU2luZ2xldG9ucyA9PT0gJ2Jvb2xlYW4nICYmIGF1dG9TaW5nbGV0b25zID09PSBmYWxzZSk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHt9O1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVhZGluZXNzID0ge1xuICAgICAgICAgICAgZG9tOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU2VhbCByZWFkaW5lc3MgZnJvbSBiZWluZyBhZGRlZCB0byBmdXJ0aGVyLCBidXQgYWxsb3cgdGhlIHByb3BlcnRpZXMgdG8gYmUgbW9kaWZpZWQuXG4gICAgICAgIE9iamVjdC5zZWFsKHRoaXMucmVhZGluZXNzKTtcbiAgICAgICAgdGhpcy5hdHRhY2hBYnN0cmFjdHMoKTtcblxuICAgICAgICAvLyBGcmVlemUgdGhlIFNub3dib2FyZCBjbGFzcyB0byBwcmV2ZW50IGZ1cnRoZXIgbW9kaWZpY2F0aW9ucy5cbiAgICAgICAgT2JqZWN0LmZyZWV6ZShTbm93Ym9hcmQucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcblxuICAgICAgICB0aGlzLmxvYWRVdGlsaXRpZXMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXNlKCk7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZygnU25vd2JvYXJkIGZyYW1ld29yayBpbml0aWFsaXNlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGFic3RyYWN0IGNsYXNzZXMgYXMgcHJvcGVydGllcyBvZiB0aGUgU25vd2JvYXJkIGNsYXNzLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGFsbG93IEphdmFzY3JpcHQgZnVuY3Rpb25hbGl0eSB3aXRoIG5vIGJ1aWxkIHByb2Nlc3MgdG8gc3RpbGwgZXh0ZW5kIHRoZXNlIGFic3RyYWN0cyBieSBwcmVmaXhpbmdcbiAgICAgKiB0aGVtIHdpdGggXCJTbm93Ym9hcmRcIi5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGNsYXNzIE15Q2xhc3MgZXh0ZW5kcyBTbm93Ym9hcmQuUGx1Z2luQmFzZSB7XG4gICAgICogICAgIC4uLlxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhdHRhY2hBYnN0cmFjdHMoKSB7XG4gICAgICAgIHRoaXMuUGx1Z2luQmFzZSA9IFBsdWdpbkJhc2U7XG4gICAgICAgIHRoaXMuU2luZ2xldG9uID0gU2luZ2xldG9uO1xuXG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5QbHVnaW5CYXNlLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5QbHVnaW5CYXNlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlNpbmdsZXRvbi5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuU2luZ2xldG9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgZGVmYXVsdCB1dGlsaXRpZXMuXG4gICAgICovXG4gICAgbG9hZFV0aWxpdGllcygpIHtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ2Nvb2tpZScsIENvb2tpZSk7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCdqc29uUGFyc2VyJywgSnNvblBhcnNlcik7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCdzYW5pdGl6ZXInLCBTYW5pdGl6ZXIpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbigndXJsJywgVXJsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlcyB0aGUgZnJhbWV3b3JrLlxuICAgICAqXG4gICAgICogQXR0YWNoZXMgYSBsaXN0ZW5lciBmb3IgdGhlIERPTSBiZWluZyByZWFkeSBhbmQgdHJpZ2dlcnMgYSBnbG9iYWwgXCJyZWFkeVwiIGV2ZW50IGZvciBwbHVnaW5zIHRvIGJlZ2luIGF0dGFjaGluZ1xuICAgICAqIHRoZW1zZWx2ZXMgdG8gdGhlIERPTS5cbiAgICAgKi9cbiAgICBpbml0aWFsaXNlKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9Jbml0U2luZ2xldG9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzZVNpbmdsZXRvbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRXZlbnQoJ3JlYWR5Jyk7XG4gICAgICAgICAgICB0aGlzLnJlYWRpbmVzcy5kb20gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlcyBhbiBpbnN0YW5jZSBvZiBldmVyeSBzaW5nbGV0b24uXG4gICAgICovXG4gICAgaW5pdGlhbGlzZVNpbmdsZXRvbnMoKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5wbHVnaW5zKS5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNTaW5nbGV0b24oKSAmJiBwbHVnaW4uZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcGx1Z2luIHRvIHRoZSBmcmFtZXdvcmsuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGFyZSB0aGUgY29ybmVyc3RvbmUgZm9yIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBmb3IgU25vd2JvYXJkLiBBIHBsdWdpbiBtdXN0IGVpdGhlciBiZSBhbiBFUzIwMTUgY2xhc3NcbiAgICAgKiB0aGF0IGV4dGVuZHMgdGhlIFBsdWdpbkJhc2Ugb3IgU2luZ2xldG9uIGFic3RyYWN0IGNsYXNzZXMsIG9yIGEgc2ltcGxlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogV2hlbiBhIHBsdWdpbiBpcyBhZGRlZCwgaXQgaXMgYXV0b21hdGljYWxseSBhc3NpZ25lZCBhcyBhIG5ldyBtYWdpYyBtZXRob2QgaW4gdGhlIFNub3dib2FyZCBjbGFzcyB1c2luZyB0aGUgbmFtZVxuICAgICAqIHBhcmFtZXRlciwgYW5kIGNhbiBiZSBjYWxsZWQgdmlhIHRoaXMgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSB0aGUgXCJsb3dlcmNhc2VcIiB2ZXJzaW9uIG9mIHRoaXMgbmFtZS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBpZiBhIHBsdWdpbiBpcyBhc3NpZ25lZCB0byB0aGUgbmFtZSBcIm15UGx1Z2luXCIsIGl0IGNhbiBiZSBjYWxsZWQgdmlhIGBTbm93Ym9hcmQubXlwbHVnaW4oKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7UGx1Z2luQmFzZXxGdW5jdGlvbn0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRQbHVnaW4obmFtZSwgaW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihsb3dlck5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgcGx1Z2luIGNhbGxlZCBcIiR7bmFtZX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlICE9PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlIGluc3RhbmNlb2YgUGx1Z2luQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIHBsdWdpbiBtdXN0IGV4dGVuZCB0aGUgUGx1Z2luQmFzZSBjbGFzcywgb3IgbXVzdCBiZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXNbbmFtZV0gIT09IHVuZGVmaW5lZCB8fCB0aGlzW2xvd2VyTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBmb3IgYSBwcm9wZXJ0eSBvciBtZXRob2Qgb2YgdGhlIFNub3dib2FyZCBjbGFzcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdID0gbmV3IFBsdWdpbkxvYWRlcihsb3dlck5hbWUsIHRoaXMsIGluc3RhbmNlKTtcblxuICAgICAgICB0aGlzLmRlYnVnKGBQbHVnaW4gXCIke25hbWV9XCIgcmVnaXN0ZXJlZGApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFueSBzaW5nbGV0b25zIG5vdyBoYXZlIHRoZWlyIGRlcGVuZGVuY2llcyBmdWxmaWxsZWQsIGFuZCBmaXJlIHRoZWlyIFwicmVhZHlcIiBoYW5kbGVyIGlmIHdlJ3JlXG4gICAgICAgIC8vIGluIGEgcmVhZHkgc3RhdGUuXG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5nZXRQbHVnaW5zKCkpLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBsdWdpbi5pc1NpbmdsZXRvbigpXG4gICAgICAgICAgICAgICAgJiYgIXBsdWdpbi5pc0luaXRpYWxpc2VkKClcbiAgICAgICAgICAgICAgICAmJiBwbHVnaW4uZGVwZW5kZW5jaWVzRnVsZmlsbGVkKClcbiAgICAgICAgICAgICAgICAmJiBwbHVnaW4uaGFzTWV0aG9kKCdsaXN0ZW5zJylcbiAgICAgICAgICAgICAgICAmJiBPYmplY3Qua2V5cyhwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpKS5pbmNsdWRlcygncmVhZHknKVxuICAgICAgICAgICAgICAgICYmIHRoaXMucmVhZGluZXNzLmRvbVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZHlNZXRob2QgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpLnJlYWR5O1xuICAgICAgICAgICAgICAgIHBsdWdpbi5jYWxsTWV0aG9kKHJlYWR5TWV0aG9kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIFJlbW92ZXMgYSBwbHVnaW4gZnJvbSBTbm93Ym9hcmQsIGNhbGxpbmcgdGhlIGRlc3RydWN0b3IgbWV0aG9kIGZvciBhbGwgYWN0aXZlIGluc3RhbmNlcyBvZiB0aGUgcGx1Z2luLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmVQbHVnaW4obmFtZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1BsdWdpbihsb3dlck5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBQbHVnaW4gXCIke25hbWV9XCIgYWxyZWFkeSByZW1vdmVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGRlc3RydWN0b3JzIGZvciBhbGwgaW5zdGFuY2VzXG4gICAgICAgIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdLmdldEluc3RhbmNlcygpLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICBpbnN0YW5jZS5kZXN0cnVjdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZWxldGUgdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzW2xvd2VyTmFtZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFBsdWdpbiBcIiR7bmFtZX1cIiByZW1vdmVkYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHBsdWdpbiBoYXMgYmVlbiByZWdpc3RlcmVkIGFuZCBpcyBhY3RpdmUuXG4gICAgICpcbiAgICAgKiBBIHBsdWdpbiB0aGF0IGlzIHN0aWxsIHdhaXRpbmcgZm9yIGRlcGVuZGVuY2llcyB0byBiZSByZWdpc3RlcmVkIHdpbGwgbm90IGJlIGFjdGl2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzUGx1Z2luKG5hbWUpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHJldHVybiAodGhpcy5wbHVnaW5zW2xvd2VyTmFtZV0gIT09IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiByZWdpc3RlcmVkIHBsdWdpbnMgYXMgUGx1Z2luTG9hZGVyIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luTG9hZGVyW119XG4gICAgICovXG4gICAgZ2V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2lucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZ2lzdGVyZWQgcGx1Z2lucywgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXRQbHVnaW5OYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFBsdWdpbkxvYWRlciBvYmplY3Qgb2YgYSBnaXZlbiBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luTG9hZGVyfVxuICAgICAqL1xuICAgIGdldFBsdWdpbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKGxvd2VyTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGx1Z2luIGNhbGxlZCBcIiR7bG93ZXJOYW1lfVwiIGhhcyBiZWVuIHJlZ2lzdGVyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgYWxsIHBsdWdpbnMgdGhhdCBsaXN0ZW4gdG8gdGhlIGdpdmVuIGV2ZW50LlxuICAgICAqXG4gICAgICogVGhpcyB3b3JrcyBmb3IgYm90aCBub3JtYWwgYW5kIHByb21pc2UgZXZlbnRzLiBJdCBkb2VzIE5PVCBjaGVjayB0aGF0IHRoZSBwbHVnaW4ncyBsaXN0ZW5lciBhY3R1YWxseSBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2lucyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBldmVudC5cbiAgICAgKi9cbiAgICBsaXN0ZW5zVG9FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IFtdO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucGx1Z2lucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtuYW1lLCBwbHVnaW5dID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwbHVnaW4uZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBsdWdpbi5oYXNNZXRob2QoJ2xpc3RlbnMnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnNbZXZlbnROYW1lXSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGxpc3RlbmVyc1tldmVudE5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2lucy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGx1Z2lucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzaW1wbGUgcmVhZHkgbGlzdGVuZXIuXG4gICAgICpcbiAgICAgKiBTeW5vbnltb3VzIHdpdGggalF1ZXJ5J3MgXCIkKGRvY3VtZW50KS5yZWFkeSgpXCIgZnVuY3Rpb25hbGl0eSwgdGhpcyBhbGxvd3MgaW5saW5lIHNjcmlwdHMgdG9cbiAgICAgKiBhdHRhY2ggdGhlbXNlbHZlcyB0byBTbm93Ym9hcmQgaW1tZWRpYXRlbHkgYnV0IG9ubHkgZmlyZSB3aGVuIHRoZSBET00gaXMgcmVhZHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHJlYWR5KGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRpbmVzcy5kb20pIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uKCdyZWFkeScsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGxpc3RlbmVyIGZvciBhbiBldmVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFkLWhvYyBzY3JpcHRzIHRoYXQgZG9uJ3QgbmVlZCBhIGZ1bGwgcGx1Z2luLiBUaGUgZ2l2ZW4gY2FsbGJhY2sgd2lsbCBiZVxuICAgICAqIGNhbGxlZCB3aGVuIHRoZSBldmVudCBuYW1lIHByb3ZpZGVkIGZpcmVzLiBUaGlzIHdvcmtzIGZvciBib3RoIG5vcm1hbCBhbmQgUHJvbWlzZSBldmVudHMuIEZvclxuICAgICAqIGEgUHJvbWlzZSBldmVudCwgeW91ciBjYWxsYmFjayBtdXN0IHJldHVybiBhIFByb21pc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmluY2x1ZGVzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBzaW1wbGUgbGlzdGVuZXIgZm9yIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgb2ZmKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIGdsb2JhbCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogSWYgYW55IHBsdWdpbiByZXR1cm5zIGEgYGZhbHNlYCwgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBJZiBldmVudCB3YXMgbm90IGNhbmNlbGxlZFxuICAgICAqL1xuICAgIGdsb2JhbEV2ZW50KGV2ZW50TmFtZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmRlYnVnKGBDYWxsaW5nIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCwgLi4ucGFyYW1ldGVycyk7XG5cbiAgICAgICAgLy8gRmluZCBwbHVnaW5zIGxpc3RlbmluZyB0byB0aGUgZXZlbnQuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYE5vIGxpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoYExpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCI6ICR7bGlzdGVuZXJzLmpvaW4oJywgJyl9YCk7XG5cbiAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmdldFBsdWdpbihuYW1lKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmdldEluc3RhbmNlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3Rlbk1ldGhvZCA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJylbZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyIG1ldGhvZHMgZm9yIGFsbCBwbHVnaW5zLCBpZiB0aGV5IGhhdmUgYSBtZXRob2Qgc3BlY2lmaWVkIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAgICBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIHBsdWdpbiBoYXMgY2FuY2VsbGVkIHRoZSBldmVudCwgbm8gZnVydGhlciBwbHVnaW5zIGFyZSBjb25zaWRlcmVkLlxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBsaXN0ZW5NZXRob2QuYXBwbHkoaW5zdGFuY2UsIHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlW2xpc3Rlbk1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcIiR7bGlzdGVuTWV0aG9kfVwiIG1ldGhvZCBpbiBcIiR7bmFtZX1cIiBwbHVnaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSguLi5wYXJhbWV0ZXJzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiIGNhbmNlbGxlZCBieSBcIiR7bmFtZX1cIiBwbHVnaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYExpc3RlbiBtZXRob2QgZm9yIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgaW4gXCIke25hbWV9XCIgcGx1Z2luIGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHN0cmluZy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmluZCBhZC1ob2MgbGlzdGVuZXJzIGZvciB0aGlzIGV2ZW50LlxuICAgICAgICBpZiAoIWNhbmNlbGxlZCAmJiB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdICYmIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgRm91bmQgJHt0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aH0gYWQtaG9jIGxpc3RlbmVyKHMpIGZvciBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBsaXN0ZW5lciBoYXMgY2FuY2VsbGVkIHRoZSBldmVudCwgbm8gZnVydGhlciBsaXN0ZW5lcnMgYXJlIGNvbnNpZGVyZWQuXG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKC4uLnBhcmFtZXRlcnMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfSBjYW5jZWxsZWQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBhbiBhZC1ob2MgbGlzdGVuZXIuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICFjYW5jZWxsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBnbG9iYWwgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucywgZXhwZWN0aW5nIGEgUHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSBhbGwuXG4gICAgICpcbiAgICAgKiBUaGlzIGNvbGxhdGVzIGFsbCBwbHVnaW5zIHJlc3BvbnNlcyBpbnRvIG9uZSBsYXJnZSBQcm9taXNlIHRoYXQgZWl0aGVyIGV4cGVjdHMgYWxsIHRvIGJlIHJlc29sdmVkLCBvciBvbmUgdG8gcmVqZWN0LlxuICAgICAqIElmIG5vIGxpc3RlbmVycyBhcmUgZm91bmQsIGEgcmVzb2x2ZWQgUHJvbWlzZSBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICAgKi9cbiAgICBnbG9iYWxQcm9taXNlRXZlbnQoZXZlbnROYW1lLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYENhbGxpbmcgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuXG4gICAgICAgIC8vIEZpbmQgcGx1Z2lucyBsaXN0ZW5pbmcgdG8gdGhpcyBldmVudC5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5zVG9FdmVudChldmVudE5hbWUpO1xuICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgTm8gbGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWJ1ZyhgTGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiOiAke2xpc3RlbmVycy5qb2luKCcsICcpfWApO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuZ2V0UGx1Z2luKG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNTaW5nbGV0b24oKSAmJiBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlzdGVuTWV0aG9kID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKVtldmVudE5hbWVdO1xuXG4gICAgICAgICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXIgbWV0aG9kcyBmb3IgYWxsIHBsdWdpbnMsIGlmIHRoZXkgaGF2ZSBhIG1ldGhvZCBzcGVjaWZpZWQgZm9yIHRoZSBldmVudC5cbiAgICAgICAgICAgIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZVByb21pc2UgPSBsaXN0ZW5NZXRob2QuYXBwbHkoaW5zdGFuY2UsIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW5zdGFuY2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCIke2xpc3Rlbk1ldGhvZH1cIiBtZXRob2QgaW4gXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VQcm9taXNlID0gaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSguLi5wYXJhbWV0ZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGluc3RhbmNlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBwcm9taXNlIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYExpc3RlbiBtZXRob2QgZm9yIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgaW4gXCIke25hbWV9XCIgcGx1Z2luIGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHN0cmluZy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmluZCBhZC1ob2MgbGlzdGVuZXJzIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50LlxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSAmJiB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZvdW5kICR7dGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGh9IGFkLWhvYyBsaXN0ZW5lcihzKSBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJQcm9taXNlID0gbGlzdGVuZXIoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lclByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChsaXN0ZW5lclByb21pc2UpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgcHJvbWlzZSBldmVudCBieSBhbiBhZC1ob2MgbGlzdGVuZXIuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2cgYSBzdHlsZWQgbWVzc2FnZSBpbiB0aGUgY29uc29sZS5cbiAgICAgKlxuICAgICAqIEluY2x1ZGVzIHBhcmFtZXRlcnMgYW5kIGEgc3RhY2sgdHJhY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBsb2dNZXNzYWdlKGNvbG9yLCBib2xkLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICAgICAnJWNbU25vd2JvYXJkXScsXG4gICAgICAgICAgICBgY29sb3I6ICR7Y29sb3J9OyBmb250LXdlaWdodDogJHsoYm9sZCkgPyAnYm9sZCcgOiAnbm9ybWFsJ307YCxcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAgICAgICAgIGAlY1BhcmFtZXRlcnMgJWMoJHtwYXJhbWV0ZXJzLmxlbmd0aH0pYCxcbiAgICAgICAgICAgICAgICAnY29sb3I6IHJnYig0NSwgMTY3LCAxOTkpOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICAgICAgICdjb2xvcjogcmdiKDg4LCA4OCwgODgpOyBmb250LXdlaWdodDogbm9ybWFsOydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgcGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCVjJHtpbmRleH06YCwgJ2NvbG9yOiByZ2IoODgsIDg4LCA4OCk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7JywgcGFyYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoJyVjVHJhY2UnLCAnY29sb3I6IHJnYig0NSwgMTY3LCAxOTkpOyBmb250LXdlaWdodDogYm9sZDsnKTtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2cgYSBtZXNzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbG9nKG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKCdyZ2IoNDUsIDE2NywgMTk5KScsIGZhbHNlLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2cgYSBkZWJ1ZyBtZXNzYWdlLlxuICAgICAqXG4gICAgICogVGhlc2UgbWVzc2FnZXMgYXJlIG9ubHkgc2hvd24gd2hlbiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRlYnVnKG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlYnVnRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKCdyZ2IoNDUsIDE2NywgMTk5KScsIGZhbHNlLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBlcnJvcihtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDIyOSwgMzUsIDM1KScsIHRydWUsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlQ29va2llIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIENvb2tpZSB1dGlsaXR5LlxuICpcbiAqIFRoaXMgdXRpbGl0eSBpcyBhIHRoaW4gd3JhcHBlciBhcm91bmQgdGhlIFwianMtY29va2llXCIgbGlicmFyeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcy1jb29raWUvanMtY29va2llXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29va2llIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICBleHBpcmVzOiBudWxsLFxuICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICAgICAgc2VjdXJlOiBmYWxzZSxcbiAgICAgICAgICAgIHNhbWVTaXRlOiAnTGF4JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgY29va2llIHBhcmFtZXRlcnMgZm9yIGFsbCBzdWJzZXF1ZW50IFwic2V0XCIgYW5kIFwicmVtb3ZlXCIgY2FsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIHNldERlZmF1bHRzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb29raWUgZGVmYXVsdHMgbXVzdCBiZSBwcm92aWRlZCBhcyBhbiBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0c1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGNvb2tpZSBwYXJhbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0cygpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB7fTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmRlZmF1bHRzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzW2tleV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIElmIGBuYW1lYCBpcyB1bmRlZmluZWQsIHJldHVybnMgYWxsIGNvb2tpZXMgYXMgYW4gT2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fFN0cmluZ31cbiAgICAgKi9cbiAgICBnZXQobmFtZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjb29raWVzID0gQmFzZUNvb2tpZS5nZXQoKTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoY29va2llcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbY29va2llTmFtZSwgY29va2llVmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLmdldCcsIGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29va2llc1tjb29raWVOYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb29raWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gQmFzZUNvb2tpZS5nZXQobmFtZSk7XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBvdmVycmlkZSB0aGUgZ290dGVuIHZhbHVlXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdjb29raWUuZ2V0JywgbmFtZSwgdmFsdWUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIGNvb2tpZSBieSBuYW1lLlxuICAgICAqXG4gICAgICogWW91IGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgY29va2llIHBhcmFtZXRlcnMgdGhyb3VnaCB0aGUgXCJvcHRpb25zXCIgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgc2V0KG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBzYXZlVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZSB0byBzYXZlXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdjb29raWUuc2V0JywgbmFtZSwgdmFsdWUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgc2F2ZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBCYXNlQ29va2llLnNldChuYW1lLCBzYXZlVmFsdWUsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdHMoKSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGNvb2tpZSBieSBuYW1lLlxuICAgICAqXG4gICAgICogWW91IGNhbiBzcGVjaWZ5IHRoZSBhZGRpdGlvbmFsIGNvb2tpZSBwYXJhbWV0ZXJzIHZpYSB0aGUgXCJvcHRpb25zXCIgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZShuYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIEJhc2VDb29raWUucmVtb3ZlKG5hbWUsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdHMoKSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogSlNPTiBQYXJzZXIgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgcGFyc2VzIEpTT04tbGlrZSBkYXRhIHRoYXQgZG9lcyBub3Qgc3RyaWN0bHkgbWVldCB0aGUgSlNPTiBzcGVjaWZpY2F0aW9ucyBpbiBvcmRlciB0byBzaW1wbGlmeSBkZXZlbG9wbWVudC5cbiAqIEl0IGlzIGEgc2FmZSByZXBsYWNlbWVudCBmb3IgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShldmFsKFwiKHtcIiArIHZhbHVlICsgXCJ9KVwiKSkpIHRoYXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgdXNlIG9mIGV2YWwoKVxuICpcbiAqIEBhdXRob3IgQXl1bWkgSGFtYXNha2lcbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vY3RvYmVyY21zL29jdG9iZXIvcHVsbC80NTI3XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpzb25QYXJzZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgLy8gQWRkIHRvIGdsb2JhbCBmdW5jdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgd2luZG93LnduSlNPTiA9IChqc29uKSA9PiB0aGlzLnBhcnNlKGpzb24pO1xuICAgICAgICB3aW5kb3cub2NKU09OID0gd2luZG93LnduSlNPTjtcbiAgICB9XG5cbiAgICBwYXJzZShzdHIpIHtcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IHRoaXMucGFyc2VTdHJpbmcoc3RyKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZyk7XG4gICAgfVxuXG4gICAgcGFyc2VTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgbGV0IHN0ciA9IHZhbHVlLnRyaW0oKTtcblxuICAgICAgICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJva2VuIEpTT04gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBsZXQgdHlwZSA9IG51bGw7XG4gICAgICAgIGxldCBrZXkgPSBudWxsO1xuICAgICAgICBsZXQgYm9keSA9ICcnO1xuXG4gICAgICAgIC8qXG4gICAgICAgICogdGhlIG1pc3Rha2UgJywnXG4gICAgICAgICovXG4gICAgICAgIHdoaWxlIChzdHIgJiYgc3RyWzBdID09PSAnLCcpIHtcbiAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIHN0cmluZ1xuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyWzBdID09PSAnXCInIHx8IHN0clswXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdICE9PSBzdHJbMF0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nIEpTT04gb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBib2R5ID0gJ1wiJztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaSArIDFdID09PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBzdHJbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSAnXCInO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICdcXFxcXCInO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZyBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogYm9vbGVhblxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyID09PSAndHJ1ZScgfHwgc3RyID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBudWxsXG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHIgPT09ICdudWxsJykge1xuICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogbnVtYmVyXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihzdHIpO1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIG9iamVjdFxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyWzBdID09PSAneycpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnbmVlZEtleSc7XG4gICAgICAgICAgICBrZXkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0ID0gJ3snO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQmxhbmtDaGFyKHN0cltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ25lZWRLZXknICYmIChzdHJbaV0gPT09ICdcIicgfHwgc3RyW2ldID09PSAnXFwnJykpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZUtleShzdHIsIGkgKyAxLCBzdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYFwiJHtrZXl9XCJgO1xuICAgICAgICAgICAgICAgICAgICBpICs9IGtleS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlcktleSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmVlZEtleScgJiYgdGhpcy5jYW5CZUtleUhlYWQoc3RyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlS2V5KHN0ciwgaSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXCInO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0ga2V5O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgaSArPSBrZXkubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlcktleSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYWZ0ZXJLZXknICYmIHN0cltpXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnOic7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnOic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuZ2V0Qm9keShzdHIsIGkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGkgPSBpICsgYm9keS5vcmlnaW5MZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5wYXJzZVN0cmluZyhib2R5LmJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJCb2R5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhZnRlckJvZHknIHx8IHR5cGUgPT09ICduZWVkS2V5Jykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdHJbbGFzdF0gPT09ICcsJyB8fCB0aGlzLmlzQmxhbmtDaGFyKHN0cltsYXN0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2xhc3RdID09PSAnfScgJiYgbGFzdCA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnfSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ICE9PSBpICYmIHJlc3VsdCAhPT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICduZWVkS2V5JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBsYXN0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBvYmplY3QgbmVhciAke3Jlc3VsdH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogYXJyYXlcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAnWyc7XG4gICAgICAgICAgICB0eXBlID0gJ25lZWRCb2R5JztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJyAnIHx8IHN0cltpXSA9PT0gJ1xcbicgfHwgc3RyW2ldID09PSAnXFx0Jykge1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmVlZEJvZHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdudWxsLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICddJyAmJiBpID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICddJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5nZXRCb2R5KHN0ciwgaSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyBib2R5Lm9yaWdpbkxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnBhcnNlU3RyaW5nKGJvZHkuYm9keSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlckJvZHknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FmdGVyQm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICduZWVkQm9keSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBtaXN0YWtlIFwiLFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RyW2kgKyAxXSA9PT0gJywnIHx8IHRoaXMuaXNCbGFua0NoYXIoc3RyW2kgKyAxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2kgKyAxXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbnVsbCwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXScgJiYgaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGFycmF5IG5lYXIgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZ2V0Qm9keShzdHIsIHBvcykge1xuICAgICAgICBsZXQgYm9keSA9ICcnO1xuXG4gICAgICAgIC8vIHBhcnNlIHN0cmluZyBib2R5XG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ1wiJyB8fCBzdHJbcG9zXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgIGJvZHkgPSBzdHJbcG9zXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvcyArIDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IHN0cltwb3NdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW3Bvc107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6IGJvZHkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gc3RyaW5nIGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSB0cnVlIC8gZmFsc2VcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAndCcpIHtcbiAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZigndHJ1ZScsIHBvcykgPT09IHBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogJ3RydWUnLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogJ3RydWUnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9vbGVhbiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKDAsIHBvcyArIDEwKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICdmJykge1xuICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCdmJywgcG9zKSA9PT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiAnZmFsc2UnLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogJ2ZhbHNlJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvb2xlYW4gYm9keSBuZWFyICR7c3RyLnN1YnN0cigwLCBwb3MgKyAxMCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBudWxsXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ24nKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ251bGwnLCBwb3MpID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6ICdudWxsJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICdudWxsJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvb2xlYW4gYm9keSBuZWFyICR7c3RyLnN1YnN0cigwLCBwb3MgKyAxMCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBudW1iZXJcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnLScgfHwgc3RyW3Bvc10gPT09ICcrJyB8fCBzdHJbcG9zXSA9PT0gJy4nIHx8IChzdHJbcG9zXSA+PSAnMCcgJiYgc3RyW3Bvc10gPD0gJzknKSkge1xuICAgICAgICAgICAgYm9keSA9ICcnO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJy0nIHx8IHN0cltpXSA9PT0gJysnIHx8IHN0cltpXSA9PT0gJy4nIHx8IChzdHJbaV0gPj0gJzAnICYmIHN0cltpXSA8PSAnOScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6IGJvZHkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gbnVtYmVyIGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBvYmplY3RcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAneycgfHwgc3RyW3Bvc10gPT09ICdbJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBbXG4gICAgICAgICAgICAgICAgc3RyW3Bvc10sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgYm9keSA9IHN0cltwb3NdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcG9zICsgMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0cltpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcIicgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgneycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OICR7KHN0cltwb3NdID09PSAneycgPyAnb2JqZWN0JyA6ICdhcnJheScpfSBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCdbJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gJHsoc3RyW3Bvc10gPT09ICd7JyA/ICdvYmplY3QnIDogJ2FycmF5Jyl9IGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogaSAtIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OICR7KHN0cltwb3NdID09PSAneycgPyAnb2JqZWN0JyA6ICdhcnJheScpfSBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKChwb3MgLSA1ID49IDApID8gcG9zIC0gNSA6IDAsIDUwKX1gKTtcbiAgICB9XG5cbiAgICBwYXJzZUtleShzdHIsIHBvcywgcXVvdGUpIHtcbiAgICAgICAgbGV0IGtleSA9ICcnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChxdW90ZSAmJiBxdW90ZSA9PT0gc3RyW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcXVvdGUgJiYgKHN0cltpXSA9PT0gJyAnIHx8IHN0cltpXSA9PT0gJzonKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGtleSArPSBzdHJbaV07XG5cbiAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJyAmJiBpICsgMSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBrZXkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIHN5bnRheCBuZWFyICR7a2V5fWApO1xuICAgIH1cblxuICAgIGNhbkJlS2V5SGVhZChjaCkge1xuICAgICAgICBpZiAoY2hbMF0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY2hbMF0gPj0gJ2EnICYmIGNoWzBdIDw9ICd6JykgfHwgKGNoWzBdID49ICdBJyAmJiBjaFswXSA8PSAnWicpIHx8IGNoWzBdID09PSAnXycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaFswXSA+PSAnMCcgJiYgY2hbMF0gPD0gJzknKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hbMF0gPT09ICckJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoLmNoYXJDb2RlQXQoMCkgPiAyNTUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzQmxhbmtDaGFyKGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA9PT0gJyAnIHx8IGNoID09PSAnXFxuJyB8fCBjaCA9PT0gJ1xcdCc7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBTYW5pdGl6ZXIgdXRpbGl0eS5cbiAqXG4gKiBDbGllbnQtc2lkZSBIVE1MIHNhbml0aXplciBkZXNpZ25lZCBtb3N0bHkgdG8gcHJldmVudCBzZWxmLVhTUyBhdHRhY2tzLlxuICogVGhlIHNhbml0aXplciB1dGlsaXR5IHdpbGwgc3RyaXAgYWxsIGF0dHJpYnV0ZXMgdGhhdCBzdGFydCB3aXRoIGBvbmAgKHVzdWFsbHkgSlMgZXZlbnQgaGFuZGxlcnMgYXMgYXR0cmlidXRlcywgaS5lLiBgb25sb2FkYCBvciBgb25lcnJvcmApIG9yIGNvbnRhaW4gdGhlIGBqYXZhc2NyaXB0OmAgcHNldWRvIHByb3RvY29sIGluIHRoZWlyIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTYW5pdGl6ZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgLy8gQWRkIHRvIGdsb2JhbCBmdW5jdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgd2luZG93LnduU2FuaXRpemUgPSAoaHRtbCkgPT4gdGhpcy5zYW5pdGl6ZShodG1sKTtcbiAgICAgICAgd2luZG93Lm9jU2FuaXRpemUgPSB3aW5kb3cud25TYW5pdGl6ZTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZShodG1sLCBib2R5T25seSkge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIGNvbnN0IGRvbSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICBjb25zdCByZXR1cm5Cb2R5T25seSA9IChib2R5T25seSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBib2R5T25seSA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgPyBib2R5T25seVxuICAgICAgICAgICAgOiB0cnVlO1xuXG4gICAgICAgIHRoaXMuc2FuaXRpemVOb2RlKGRvbS5nZXRSb290Tm9kZSgpKTtcblxuICAgICAgICByZXR1cm4gKHJldHVybkJvZHlPbmx5KSA/IGRvbS5ib2R5LmlubmVySFRNTCA6IGRvbS5pbm5lckhUTUw7XG4gICAgfVxuXG4gICAgc2FuaXRpemVOb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaW1BdHRyaWJ1dGVzKG5vZGUpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShub2RlLmNoaWxkcmVuKTtcblxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZU5vZGUoY2hpbGQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cmltQXR0cmlidXRlcyhub2RlKSB7XG4gICAgICAgIGlmICghbm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSBub2RlLmF0dHJpYnV0ZXMuaXRlbShpKS5uYW1lO1xuICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gbm9kZS5hdHRyaWJ1dGVzLml0ZW0oaSkudmFsdWU7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAqIHJlbW92ZSBhdHRyaWJ1dGVzIHdoZXJlIHRoZSBuYW1lcyBzdGFydCB3aXRoIFwib25cIiAoZm9yIGV4YW1wbGU6IG9ubG9hZCwgb25lcnJvci4uLilcbiAgICAgICAgICAgICogcmVtb3ZlIGF0dHJpYnV0ZXMgd2hlcmUgdGhlIHZhbHVlIHN0YXJ0cyB3aXRoIHRoZSBcImphdmFzY3JpcHQ6XCIgcHNldWRvIHByb3RvY29sIChmb3IgZXhhbXBsZSBocmVmPVwiamF2YXNjcmlwdDphbGVydCgxKVwiKVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgaWYgKGF0dHJOYW1lLmluZGV4T2YoJ29uJykgPT09IDAgfHwgYXR0clZhbHVlLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIFVSTCB1dGlsaXR5LlxuICpcbiAqIFRoaXMgdXRpbGl0eSBwcm92aWRlcyBVUkwgZnVuY3Rpb25zLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMiBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcmwgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLmJhc2VVcmwoKTtcbiAgICAgICAgdGhpcy5hc3NldFVybCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBVUkwgYmFzZWQgb24gYSByZWxhdGl2ZSBwYXRoLlxuICAgICAqXG4gICAgICogSWYgYW4gYWJzb2x1dGUgVVJMIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRvKHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKD86W146XSs6XFwvXFwvKVstYS16MC05QDolLl8rfiM9XXsxLDI1Nn1cXGIoWy1hLXowLTkoKUA6JV8rLn4jPyYvLz1dKikvaTtcblxuICAgICAgICBpZiAodXJsLm1hdGNoKHVybFJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRoZVVybCA9IHVybC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5iYXNlVXJsKCl9JHt0aGVVcmx9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIEFzc2V0IFVSTCBiYXNlZCBvbiBhIHJlbGF0aXZlIHBhdGguXG4gICAgICpcbiAgICAgKiBJZiBhbiBhYnNvbHV0ZSBVUkwgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYXNzZXQodXJsKSB7XG4gICAgICAgIGNvbnN0IHVybFJlZ2V4ID0gL14oPzpbXjpdKzpcXC9cXC8pWy1hLXowLTlAOiUuXyt+Iz1dezEsMjU2fVxcYihbLWEtejAtOSgpQDolXysufiM/Ji8vPV0qKS9pO1xuXG4gICAgICAgIGlmICh1cmwubWF0Y2godXJsUmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhlVXJsID0gdXJsLnJlcGxhY2UoL15cXC8rLywgJycpO1xuXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmFzc2V0VXJsKCl9JHt0aGVVcmx9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgYmFzZSBVUkwgb2YgdGhpcyBpbnN0YWxsLlxuICAgICAqXG4gICAgICogVGhpcyBkZXRlcm1pbmVzIHRoZSBiYXNlIFVSTCBmcm9tIHRocmVlIHNvdXJjZXMsIGluIG9yZGVyOlxuICAgICAqICAtIElmIFNub3dib2FyZCBpcyBsb2FkZWQgdmlhIHRoZSBgeyUgc25vd2JvYXJkICV9YCB0YWcsIGl0IHdpbGwgcmV0cmlldmUgdGhlIGJhc2UgVVJMIHRoYXRcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIHRoZXJlLlxuICAgICAqICAtIElmIGEgYDxiYXNlPmAgdGFnIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCB1c2UgdGhlIFVSTCBzcGVjaWZpZWQgaW4gdGhlIGJhc2UgdGFnLlxuICAgICAqICAtIEZpbmFsbHksIGl0IHdpbGwgdGFrZSBhIGd1ZXNzIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgd2lsbCBsaWtlbHkgbm90IHdvcmsgZm9yIHNpdGVzXG4gICAgICogdGhhdCByZXNpZGUgaW4gc3ViZGlyZWN0b3JpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYmFzZSBVUkwgd2lsbCBhbHdheXMgY29udGFpbiBhIHRyYWlsaW5nIGJhY2tzbGFzaC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYmFzZVVybCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm91bmRCYXNlVXJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpLmRhdGFzZXQuYmFzZVVybCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IFtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCxcbiAgICAgICAgICAgICcvLycsXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdCxcbiAgICAgICAgICAgICcvJyxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSB1cmxQYXJ0cy5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGFzc2V0IFVSTCBvZiB0aGlzIGluc3RhbGwuXG4gICAgICpcbiAgICAgKiBUaGlzIGRldGVybWluZXMgdGhlIGJhc2UgVVJMIGZyb20gdGhyZWUgc291cmNlcywgaW4gb3JkZXI6XG4gICAgICogIC0gSWYgU25vd2JvYXJkIGlzIGxvYWRlZCB2aWEgdGhlIGB7JSBzbm93Ym9hcmQgJX1gIHRhZywgaXQgd2lsbCByZXRyaWV2ZSB0aGUgYXNzZXQgVVJMIHRoYXRcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIHRoZXJlLlxuICAgICAqICAtIElmIGEgYDxsaW5rIHJlbD1cImFzc2V0X3VybFwiIGhyZWY9XCJodHRwczovL2V4YW1wbGUuY29tXCI+YCB0YWcgaXMgYXZhaWxhYmxlLCBpdCB3aWxsIHVzZSB0aGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgbGluayB0YWcuXG4gICAgICogIC0gRmluYWxseSwgaXQgd2lsbCB0YWtlIGEgZ3Vlc3MgZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyB3aWxsIGxpa2VseSBub3Qgd29yayBmb3Igc2l0ZXNcbiAgICAgKiB0aGF0IHJlc2lkZSBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBhc3NldCBVUkwgd2lsbCBhbHdheXMgY29udGFpbiBhIHRyYWlsaW5nIGJhY2tzbGFzaC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYXNzZXRVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvdW5kQXNzZXRVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKS5kYXRhc2V0LmFzc2V0VXJsKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJhc3NldF91cmxcIl0nKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJhc3NldF91cmxcIl0nKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSBbXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsXG4gICAgICAgICAgICAnLy8nLFxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgICAgICAnLycsXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHVybFBhcnRzLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoZSBiYXNlIFVSTCwgZW5zdXJpbmcgaXQgaXMgYSBIVFRQL0hUVFBzIFVSTC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBTbm93Ym9hcmQgc2NyaXB0IG9yIDxiYXNlPiB0YWcgb24gdGhlIHBhZ2UgdXNlIGEgZGlmZmVyZW50IHR5cGUgb2YgVVJMLCB0aGlzIHdpbGwgZmFpbCB3aXRoXG4gICAgICogYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB2YWxpZGF0ZUJhc2VVcmwodXJsKSB7XG4gICAgICAgIGNvbnN0IHVybFJlZ2V4ID0gL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/L2k7XG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gdXJsUmVnZXguZXhlYyh1cmwpO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybFBhcnRzWzJdO1xuICAgICAgICBjb25zdCBkb21haW4gPSB1cmxQYXJ0c1s0XTtcblxuICAgICAgICBpZiAocHJvdG9jb2wgJiYgWydodHRwJywgJ2h0dHBzJ10uaW5kZXhPZihwcm90b2NvbC50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiYXNlIFVSTCBkZXRlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZG9tYWluKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZSBVUkwgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAodXJsLnN1YnN0cigtMSkgPT09ICcvJylcbiAgICAgICAgICAgID8gdXJsXG4gICAgICAgICAgICA6IGAke3VybH0vYDtcbiAgICB9XG59XG4iLCJpbXBvcnQgU25vd2JvYXJkIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvbWFpbi9Tbm93Ym9hcmQnO1xuaW1wb3J0IFByb3h5SGFuZGxlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUHJveHlIYW5kbGVyJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWpheC9SZXF1ZXN0JztcbmltcG9ydCBBdHRyaWJ1dGVSZXF1ZXN0IGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWpheC9oYW5kbGVycy9BdHRyaWJ1dGVSZXF1ZXN0JztcbmltcG9ydCBBc3NldExvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9Bc3NldExvYWRlcic7XG5pbXBvcnQgRGF0YUNvbmZpZyBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9EYXRhQ29uZmlnJztcbmltcG9ydCBTdHlsZXNoZWV0TG9hZGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0eWxlc2hlZXRMb2FkZXInO1xuaW1wb3J0IFRyYW5zaXRpb24gZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJhbnNpdGlvbic7XG5pbXBvcnQgRmxhc2ggZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2gnO1xuaW1wb3J0IEZsYXNoTGlzdGVuZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2hMaXN0ZW5lcic7XG5pbXBvcnQgRm9ybVZhbGlkYXRpb24gZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRm9ybVZhbGlkYXRpb24nO1xuaW1wb3J0IEF0dGFjaExvYWRpbmcgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvQXR0YWNoTG9hZGluZyc7XG5pbXBvcnQgU3RyaXBlTG9hZGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0cmlwZUxvYWRlcic7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9UcmlnZ2VyJztcblxuKCh3aW5kb3cpID0+IHtcbiAgICBjb25zdCBzbm93Ym9hcmQgPSBuZXcgUHJveHkoXG4gICAgICAgIG5ldyBTbm93Ym9hcmQodHJ1ZSwgdHJ1ZSksXG4gICAgICAgIFByb3h5SGFuZGxlcixcbiAgICApO1xuXG4gICAgLy8gQ292ZXIgYWxsIGFsaWFzZXNcbiAgICB3aW5kb3cuc25vd2JvYXJkID0gc25vd2JvYXJkO1xuICAgIHdpbmRvdy5Tbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgd2luZG93LlNub3dCb2FyZCA9IHNub3dib2FyZDtcblxuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3JlcXVlc3QnLCBSZXF1ZXN0KTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdhdHRyaWJ1dGVSZXF1ZXN0JywgQXR0cmlidXRlUmVxdWVzdCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignYXNzZXRMb2FkZXInLCBBc3NldExvYWRlcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZGF0YUNvbmZpZycsIERhdGFDb25maWcpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2V4dHJhc1N0eWxlcycsIFN0eWxlc2hlZXRMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3RyYW5zaXRpb24nLCBUcmFuc2l0aW9uKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdmbGFzaCcsIEZsYXNoKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdmbGFzaExpc3RlbmVyJywgRmxhc2hMaXN0ZW5lcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZm9ybVZhbGlkYXRpb24nLCBGb3JtVmFsaWRhdGlvbik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignYXR0YWNoTG9hZGluZycsIEF0dGFjaExvYWRpbmcpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3N0cmlwZUxvYWRlcicsIFN0cmlwZUxvYWRlcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbigndHJpZ2dlcicsIFRyaWdnZXIpO1xuXG4gICAgc25vd2JvYXJkLm9uKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgLy8gU2NhbiBmb3IgdHJpZ2dlcnNcbiAgICAgICAgQXJyYXlcbiAgICAgICAgICAgIC5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IFsuLi5lbGVtZW50LmF0dHJpYnV0ZXNdLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoeyBuYW1lIH0pID0+IG5hbWUuc3RhcnRzV2l0aChcImRhdGEtdHJpZ2dlci1cIikpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHNub3dib2FyZC50cmlnZ2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59KSh3aW5kb3cpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiLyohIGpzLWNvb2tpZSB2My4wLjUgfCBNSVQgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuZnVuY3Rpb24gYXNzaWduICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRcbn1cbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xudmFyIGRlZmF1bHRDb252ZXJ0ZXIgPSB7XG4gIHJlYWQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgfSxcbiAgd3JpdGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAvJSgyWzM0NkJGXXwzW0FDLUZdfDQwfDVbQkRFXXw2MHw3W0JDRF0pL2csXG4gICAgICBkZWNvZGVVUklDb21wb25lbnRcbiAgICApXG4gIH1cbn07XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxuZnVuY3Rpb24gaW5pdCAoY29udmVydGVyLCBkZWZhdWx0QXR0cmlidXRlcykge1xuICBmdW5jdGlvbiBzZXQgKG5hbWUsIHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe30sIGRlZmF1bHRBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgYXR0cmlidXRlcy5leHBpcmVzID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIGF0dHJpYnV0ZXMuZXhwaXJlcyAqIDg2NGU1KTtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgYXR0cmlidXRlcy5leHBpcmVzID0gYXR0cmlidXRlcy5leHBpcmVzLnRvVVRDU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKVxuICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgLnJlcGxhY2UoL1soKV0vZywgZXNjYXBlKTtcblxuICAgIHZhciBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgPSAnJztcbiAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJzsgJyArIGF0dHJpYnV0ZU5hbWU7XG5cbiAgICAgIGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnNpZGVycyBSRkMgNjI2NSBzZWN0aW9uIDUuMjpcbiAgICAgIC8vIC4uLlxuICAgICAgLy8gMy4gIElmIHRoZSByZW1haW5pbmcgdW5wYXJzZWQtYXR0cmlidXRlcyBjb250YWlucyBhICV4M0IgKFwiO1wiKVxuICAgICAgLy8gICAgIGNoYXJhY3RlcjpcbiAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAvLyBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpIGNoYXJhY3Rlci5cbiAgICAgIC8vIC4uLlxuICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGRvY3VtZW50LmNvb2tpZSA9XG4gICAgICBuYW1lICsgJz0nICsgY29udmVydGVyLndyaXRlKHZhbHVlLCBuYW1lKSArIHN0cmluZ2lmaWVkQXR0cmlidXRlcylcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldCAobmFtZSkge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFuYW1lKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxuICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLlxuICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgdmFyIGphciA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgdmFyIHZhbHVlID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZm91bmQgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICBqYXJbZm91bmRdID0gY29udmVydGVyLnJlYWQodmFsdWUsIGZvdW5kKTtcblxuICAgICAgICBpZiAobmFtZSA9PT0gZm91bmQpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lID8gamFyW25hbWVdIDogamFyXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICB7XG4gICAgICBzZXQsXG4gICAgICBnZXQsXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIChuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHNldChcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgZXhwaXJlczogLTFcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHdpdGhBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgfSxcbiAgICAgIHdpdGhDb252ZXJ0ZXI6IGZ1bmN0aW9uIChjb252ZXJ0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgYXR0cmlidXRlczogeyB2YWx1ZTogT2JqZWN0LmZyZWV6ZShkZWZhdWx0QXR0cmlidXRlcykgfSxcbiAgICAgIGNvbnZlcnRlcjogeyB2YWx1ZTogT2JqZWN0LmZyZWV6ZShjb252ZXJ0ZXIpIH1cbiAgICB9XG4gIClcbn1cblxudmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG5leHBvcnQgeyBhcGkgYXMgZGVmYXVsdCB9O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwiL2Fzc2V0cy9qcy9hcHBcIjogMCxcblx0XCJhc3NldHMvY3NzL3RoZW1lXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGlmKGNodW5rSWRzLnNvbWUoKGlkKSA9PiAoaW5zdGFsbGVkQ2h1bmtzW2lkXSAhPT0gMCkpKSB7XG5cdFx0Zm9yKG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0fVxuXHRpZihwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbikgcGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24oZGF0YSk7XG5cdGZvcig7aSA8IGNodW5rSWRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y2h1bmtJZCA9IGNodW5rSWRzW2ldO1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpICYmIGluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKCk7XG5cdFx0fVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9IDA7XG5cdH1cblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uTyhyZXN1bHQpO1xufVxuXG52YXIgY2h1bmtMb2FkaW5nR2xvYmFsID0gc2VsZltcIndlYnBhY2tDaHVua3dpbnRlcmNtc193b3Jrc2hvcF90aGVtZVwiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmt3aW50ZXJjbXNfd29ya3Nob3BfdGhlbWVcIl0gfHwgW107XG5jaHVua0xvYWRpbmdHbG9iYWwuZm9yRWFjaCh3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIDApKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gd2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCBjaHVua0xvYWRpbmdHbG9iYWwucHVzaC5iaW5kKGNodW5rTG9hZGluZ0dsb2JhbCkpOyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgZGVwZW5kcyBvbiBvdGhlciBsb2FkZWQgY2h1bmtzIGFuZCBleGVjdXRpb24gbmVlZCB0byBiZSBkZWxheWVkXG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8odW5kZWZpbmVkLCBbXCJhc3NldHMvY3NzL3RoZW1lXCJdLCAoKSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vYXNzZXRzL2pzL3NyYy9hcHAuanNcIikpKVxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8odW5kZWZpbmVkLCBbXCJhc3NldHMvY3NzL3RoZW1lXCJdLCAoKSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vYXNzZXRzL2Nzcy9iYXNlLmNzc1wiKSkpXG5fX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKF9fd2VicGFja19leHBvcnRzX18pO1xuIiwiIl0sIm5hbWVzIjpbIlBsdWdpbkJhc2UiLCJzbm93Ym9hcmQiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsImNvbnN0cnVjdCIsImRlcGVuZGVuY2llcyIsImxpc3RlbnMiLCJkZXN0cnVjdCIsImRldGFjaCIsImRlc3RydWN0b3IiLCJkZWZhdWx0IiwiU2luZ2xldG9uIiwiX1BsdWdpbkJhc2UiLCJfY2FsbFN1cGVyIiwiYXJndW1lbnRzIiwiX2luaGVyaXRzIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsImUiLCJ0IiwiciIsIk9iamVjdCIsInByb3RvdHlwZSIsIm4iLCJoYXNPd25Qcm9wZXJ0eSIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImkiLCJTeW1ib2wiLCJhIiwiaXRlcmF0b3IiLCJjIiwiYXN5bmNJdGVyYXRvciIsInUiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIndyYXAiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwidHlwZSIsImFyZyIsImNhbGwiLCJoIiwibCIsImYiLCJzIiwieSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJwIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJpbnZva2UiLCJfdHlwZW9mIiwicmVzb2x2ZSIsIl9fYXdhaXQiLCJ0aGVuIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJFcnJvciIsImRvbmUiLCJtZXRob2QiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsIlR5cGVFcnJvciIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXNOYU4iLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJoYW5kbGUiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJfYXN5bmNUb0dlbmVyYXRvciIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJfc2xpY2VkVG9BcnJheSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwiQXJyYXkiLCJmcm9tIiwidGVzdCIsImlzQXJyYXkiLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiX29iamVjdFNwcmVhZCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJfZGVmaW5lUHJvcGVydGllcyIsIl90b1ByaW1pdGl2ZSIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwiX2dldFByb3RvdHlwZU9mIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJSZWZlcmVuY2VFcnJvciIsIkJvb2xlYW4iLCJ2YWx1ZU9mIiwiYmluZCIsIl9zZXRQcm90b3R5cGVPZiIsIlJlcXVlc3QiLCJlbGVtZW50IiwiaGFuZGxlciIsIm9wdGlvbnMiLCJfdGhpcyIsImlzSGFuZGxlck5hbWUiLCJtYXRjaGVkRWxlbWVudCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImNvbmNhdCIsImZldGNoT3B0aW9ucyIsInJlc3BvbnNlRGF0YSIsInJlc3BvbnNlRXJyb3IiLCJjYW5jZWxsZWQiLCJjaGVja1JlcXVlc3QiLCJnbG9iYWxFdmVudCIsImV2ZW50IiwiRXZlbnQiLCJjYW5jZWxhYmxlIiwicmVxdWVzdCIsImRpc3BhdGNoRXZlbnQiLCJkZWZhdWx0UHJldmVudGVkIiwiZG9DbGllbnRWYWxpZGF0aW9uIiwiY29uZmlybSIsImRvQ29uZmlybSIsImNvbmZpcm1lZCIsImRvQWpheCIsInJlc3BvbnNlIiwicHJvY2Vzc1VwZGF0ZSIsIlhfV0lOVEVSX1NVQ0NFU1MiLCJwcm9jZXNzRXJyb3IiLCJwcm9jZXNzUmVzcG9uc2UiLCJlcnJvciIsIkVsZW1lbnQiLCJ1bmRlZmluZWQiLCJnZXRGZXRjaCIsImhlYWRlcnMiLCJib2R5IiwiZGF0YSIsInJlZGlyZWN0IiwibW9kZSIsImZldGNoIiwidXJsIiwiYnJvd3NlclZhbGlkYXRlIiwiZm9ybSIsImNoZWNrVmFsaWRpdHkiLCJyZXBvcnRWYWxpZGl0eSIsIl90aGlzMiIsImFqYXhQcm9taXNlIiwicmVqZWN0Iiwib2siLCJzdGF0dXMiLCJoYXMiLCJnZXQiLCJpbmNsdWRlcyIsImpzb24iLCJtZXNzYWdlIiwiZXhjZXB0aW9uIiwicmVuZGVyRXJyb3IiLCJmaWxlIiwibGluZSIsInRyYWNlIiwidGV4dCIsInJlc3BvbnNlVGV4dCIsIlhfV0lOVEVSX1JFU1BPTlNFX0NPREUiLCJwcm9taXNlIiwiX3RoaXMzIiwiYmVmb3JlVXBkYXRlIiwicGFydGlhbHMiLCJlbnRyaWVzIiwiZW50cnkiLCJfZW50cnkiLCJzdWJzdHIiLCJYX1dJTlRFUl9BU1NFVFMiLCJwcm9jZXNzQXNzZXRzIiwicHJvbWlzZXMiLCJnbG9iYWxQcm9taXNlRXZlbnQiLCJfY2FsbGVlIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImRvVXBkYXRlIiwid2luZG93IiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiX3RoaXM0IiwiYWZmZWN0ZWQiLCJfZW50cnkyIiwicGFydGlhbCIsImNvbnRlbnQiLCJzZWxlY3RvciIsInVwZGF0ZSIsImVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsImlubmVySFRNTCIsInN1Y2Nlc3MiLCJmbGFzaCIsIlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTIiwicHJvY2Vzc0ZsYXNoTWVzc2FnZXMiLCJYX1dJTlRFUl9SRURJUkVDVCIsInByb2Nlc3NSZWRpcmVjdCIsInByb2Nlc3NFcnJvck1lc3NhZ2UiLCJza2lwRXJyb3IiLCJYX1dJTlRFUl9FUlJPUl9GSUVMRFMiLCJwcm9jZXNzVmFsaWRhdGlvbkVycm9ycyIsIlhfV0lOVEVSX0VSUk9SX01FU1NBR0UiLCJfdGhpczUiLCJoYW5kbGVSZWRpcmVjdFJlc3BvbnNlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNyZWF0ZUV2ZW50IiwiZXZlbnROYW1lIiwib25jZSIsImxvY2F0aW9uIiwiYXNzaWduIiwiaGFuZGxlRXJyb3JNZXNzYWdlIiwiYWxlcnQiLCJtZXNzYWdlcyIsImhhbmRsZUZsYXNoTWVzc2FnZXMiLCJmaWVsZHMiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3JzIiwiYXNzZXRzIiwiX2RvQ29uZmlybSIsIl9jYWxsZWUyIiwiZnVsZmlsbGVkIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiaGFuZGxlQ29uZmlybU1lc3NhZ2UiLCJsaXN0ZW5zVG9FdmVudCIsInQwIiwidGFnTmFtZSIsImNsb3Nlc3QiLCJleHRyYWN0UGFydGlhbHMiLCJ4c3JmVG9rZW4iLCJsb2FkaW5nIiwiaHJlZiIsImZpbGVzIiwiRm9ybURhdGEiLCJkZWJ1ZyIsImNvb2tpZSIsImZvcm1EYXRhIiwiX2VudHJ5MyIsImFwcGVuZCIsImpvaW4iLCJBdHRyaWJ1dGVSZXF1ZXN0IiwiX1NpbmdsZXRvbiIsInJlYWR5IiwiYWpheFNldHVwIiwiYXR0YWNoSGFuZGxlcnMiLCJkaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uIiwiZGV0YWNoSGFuZGxlcnMiLCJfZ2V0IiwiY2hhbmdlSGFuZGxlciIsImNsaWNrSGFuZGxlciIsImtleURvd25IYW5kbGVyIiwic3VibWl0SGFuZGxlciIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ0YXJnZXQiLCJtYXRjaGVzIiwicHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQiLCJjdXJyZW50RWxlbWVudCIsInBhcmVudEVsZW1lbnQiLCJwcmV2ZW50RGVmYXVsdCIsInZhbGlkVHlwZXMiLCJpbmRleE9mIiwiZ2V0QXR0cmlidXRlIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwidHJhY2tJbnB1dCIsImRhdGFzZXQiLCJyZXF1ZXN0Q29uZmlybSIsInJlcXVlc3RSZWRpcmVjdCIsInJlcXVlc3RMb2FkaW5nIiwicmVxdWVzdEZvcm0iLCJyZXF1ZXN0VXJsIiwicGFyc2VEYXRhIiwicmVxdWVzdFVwZGF0ZSIsInJlcXVlc3REYXRhIiwib25BamF4U2V0dXAiLCJmaWVsZE5hbWUiLCJnZXRQYXJlbnRSZXF1ZXN0RGF0YSIsImVsZW1lbnREYXRhIiwianNvbnBhcnNlciIsInBhcnNlIiwibGFzdFZhbHVlIiwiaW50ZXJ2YWwiLCJyZXNldFRyYWNrSW5wdXRUaW1lciIsImlucHV0VGltZXIiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfbiIsIkYiLCJBc3NldExvYWRlciIsImFqYXhMb2FkQXNzZXRzIiwiX2xvYWQiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInNjcmlwdCIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJzdHlsZSIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJpbWFnZSIsImpzIiwibG9hZFNjcmlwdCIsInQxIiwiY3NzIiwibG9hZFN0eWxlIiwidDIiLCJ0MyIsImltZyIsImxvYWRJbWFnZSIsInQ0IiwidDUiLCJsb2FkIiwiX3giLCJhc3NldCIsImxvYWRlZCIsImRvbVNjcmlwdCIsImNyZWF0ZUVsZW1lbnQiLCJkb21Dc3MiLCJoZWFkIiwiSW1hZ2UiLCJzcmMiLCJBdHRhY2hMb2FkaW5nIiwiYWpheFN0YXJ0IiwiYWpheERvbmUiLCJsb2FkRWxlbWVudHMiLCJjbGFzc0xpc3QiLCJhZGQiLCJnZXRMb2FkaW5nQ2xhc3MiLCJhdHRhY2hMb2FkaW5nIiwicmVtb3ZlIiwiRGF0YUNvbmZpZyIsImluc3RhbmNlIiwibG9jYWxDb25maWciLCJIVE1MRWxlbWVudCIsImluc3RhbmNlQ29uZmlnIiwiYWNjZXB0ZWRDb25maWdzIiwicmVmcmVzaCIsImNvbmZpZyIsInNldCIsInBlcnNpc3QiLCJnZXRBY2NlcHRlZENvbmZpZ3MiLCJwcm9jZXNzQ29uZmlnIiwiYWNjZXB0QWxsRGF0YUNvbmZpZ3MiLCJkZWZhdWx0cyIsImdldERlZmF1bHRzIiwiY29lcmNlVmFsdWUiLCJzdHJpbmdWYWx1ZSIsInN0YXJ0c1dpdGgiLCJiYXNlNjRzdHIiLCJyZXBsYWNlIiwiZGVjb2RlZCIsImF0b2IiLCJ0b0xvd2VyQ2FzZSIsImpzb25QYXJzZXIiLCJGbGFzaCIsImR1cmF0aW9uIiwiY2xlYXIiLCJ0aW1lciIsImZsYXNoVGltZXIiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzdG9wVGltZXIiLCJzdGFydFRpbWVyIiwiYXBwZW5kQ2hpbGQiLCJ0cmFuc2l0aW9uIiwidGltZXJUcmFucyIsImNhbmNlbCIsIkZsYXNoTGlzdGVuZXIiLCJhamF4RXJyb3JNZXNzYWdlIiwiYWpheEZsYXNoTWVzc2FnZXMiLCJmbGFzaFR5cGUiLCJmbGFzaER1cmF0aW9uIiwiY3NzQ2xhc3MiLCJGb3JtVmFsaWRhdGlvbiIsImVycm9yQmFncyIsImFqYXhWYWxpZGF0aW9uRXJyb3JzIiwiY29sbGVjdEVycm9yQmFncyIsImRvVmFsaWRhdGlvbiIsImludmFsaWRGaWVsZHMiLCJyZXF1ZXN0VmFsaWRhdGUiLCJlcnJvckJhZyIsInNob3dFcnJvckJhZyIsImNsZWFyVmFsaWRhdGlvbiIsImhpZGVFcnJvckJhZyIsInJvb3ROb2RlIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwibWVzc2FnZUxpc3RFbGVtZW50IiwicGxhY2Vob2xkZXIiLCJjcmVhdGVDb21tZW50IiwiZXJyb3JCYWdEYXRhIiwidmFsaWRhdGVGb3IiLCJzcGxpdCIsImNsb25lTm9kZSIsIm1lc3NhZ2VMaXN0QW5jaG9yIiwiY3VzdG9tTWVzc2FnZSIsInRleHRDb250ZW50IiwiY2hpbGROb2RlcyIsInJlcGxhY2VDaGlsZCIsImlzQ29ubmVjdGVkIiwiZXJyb3JCYWdWYWxpZGF0ZXNGaWVsZCIsImZpcnN0RmllbGQiLCJmaWVsZCIsInNoaWZ0IiwiX2ludmFsaWRGaWVsZHMkZmlyc3RGIiwiZXJyb3JzIiwibWVzc2FnZUVsZW1lbnQiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsImFmdGVyIiwiX2ludmFsaWRGaWVsZHMkT2JqZWN0IiwiU3RyaXBlTG9hZGVyIiwiY291bnRlciIsImNyZWF0ZVN0cmlwZSIsInN0cmlwZSIsInNob3ciLCJoaWRlIiwiaW5kaWNhdG9yIiwic3RyaXBlTG9hZGVkIiwibmV3U3RyaXBlIiwiZm9yY2UiLCJTdHlsZXNoZWV0TG9hZGVyIiwic3R5bGVzTG9hZGVkIiwiZW5kc1dpdGgiLCJzdHlsZXNoZWV0IiwiVHJhbnNpdGlvbiIsImNhbGxiYWNrIiwidHJhaWxUbyIsInBhcnNlRHVyYXRpb24iLCJkb1RyYW5zaXRpb24iLCJldmVudENsYXNzZXMiLCJfbGVuIiwiYXJncyIsIl9rZXkiLCJhY3RpdmUiLCJvdXQiLCJyZXR1cm5DbGFzc2VzIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwicmVzZXRDbGFzc2VzIiwiZXZlbnRDbGFzcyIsImdldENvbXB1dGVkU3R5bGUiLCJvblRyYW5zaXRpb25FbmQiLCJwYXJzZWQiLCJleGVjIiwiYW1vdW50IiwidW5pdCIsIk1hdGgiLCJmbG9vciIsIlRyaWdnZXIiLCJ0cmlnZ2VycyIsIk1hcCIsImV2ZW50cyIsImNvbm5lY3RvcnMiLCJwYXJzZVRyaWdnZXJzIiwic2l6ZSIsInJlc2V0RXZlbnRzIiwiY3JlYXRlVHJpZ2dlckV2ZW50cyIsInJ1bkV2ZW50cyIsImRhc2hTdHlsZSIsIm1hdGNoIiwidHJpZ2dlclBhcnRzIiwidHJpZ2dlck5hbWUiLCJ0cmlnZ2VyVHlwZSIsIl90cmlnZ2VyUGFydHMiLCJ0cmlnZ2VyIiwiZ2V0U2VsZWN0YWJsZUVsZW1lbnRzIiwiaXNWYWxpZENvbmRpdGlvbiIsImlzVmFsaWRBY3Rpb24iLCJwYXJzZUNvbW1hbmQiLCJjb21tYW5kIiwidHJpbSIsInNwbGl0VmFsdWVzIiwicXVvdGVkIiwibWFwIiwic3BsaXRWYWx1ZSIsIl90b0NvbnN1bWFibGVBcnJheSIsInBhcmFtZXRlcnMiLCJfY29tbWFuZCRzcGxpdCIsIl9jb21tYW5kJHNwbGl0MiIsIl9wYXJhbWV0ZXJzJCIsIl90aGlzMiRwYXJzZUNvbW1hbmQiLCJjcmVhdGVWYWx1ZUV2ZW50IiwiY3JlYXRlRW1wdHlFdmVudCIsImNyZWF0ZUNoZWNrZWRFdmVudCIsImFsbCIsInN1cHBvcnRlZEVsZW1lbnRzIiwiU2V0IiwidGhpc0V2ZW50IiwiZWxlbWVudFZhbHVlcyIsImNoZWNrZWQiLCJldmVyeSIsImV4ZWN1dGVBY3Rpb24iLCJzb21lIiwiYWRkRXZlbnQiLCJhdExlYXN0IiwiYXRMZWFzdENvdW50IiwiX3RoaXM2IiwicHJpb3JpdHkiLCJlbGVtZW50RXZlbnQiLCJzb3J0IiwiYiIsImVsZW1lbnRDb25uZWN0b3JzIiwiY29ubmVjdG9yIiwiY29uZGl0aW9uTWV0IiwiX3RoaXMkcGFyc2VDb21tYW5kIiwiYWN0aW9uU2hvdyIsImRpc3BsYXkiLCJvcmlnaW5hbERpc3BsYXkiLCJhZnRlckFjdGlvbiIsInByb3AiLCJyZWNlaXZlciIsInByb3BMb3dlciIsImhhc1BsdWdpbiIsIl9SZWZsZWN0JGdldCRwcm9wTG93ZSIsImdldEluc3RhbmNlIiwiSW5uZXJQcm94eUhhbmRsZXIiLCJQbHVnaW5Mb2FkZXIiLCJQcm94eSIsImZyZWV6ZSIsImluc3RhbmNlcyIsInNpbmdsZXRvbiIsImluaXRpYWxpc2VkIiwic2VhbCIsIm1vY2tzIiwib3JpZ2luYWxGdW5jdGlvbnMiLCJoYXNNZXRob2QiLCJtZXRob2ROYW1lIiwiaXNGdW5jdGlvbiIsImNhbGxNZXRob2QiLCJfbGVuMiIsIl9rZXkyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwidW5tZXQiLCJnZXREZXBlbmRlbmNpZXMiLCJpdGVtIiwiZ2V0UGx1Z2luTmFtZXMiLCJpc1NpbmdsZXRvbiIsImluaXRpYWxpc2VTaW5nbGV0b24iLCJfbGVuMyIsInBhcmFtcyIsIl9rZXkzIiwiX2VudHJ5NCIsIl9sZW40IiwiX2tleTQiLCJuZXdJbnN0YW5jZSIsIl9jb25zdHJ1Y3QiLCJzcGxpY2UiLCJnZXRJbnN0YW5jZXMiLCJpc0luaXRpYWxpc2VkIiwiX2xlbjUiLCJfa2V5NSIsInBsdWdpbiIsIm1vY2siLCJfbGVuNiIsIl9rZXk2IiwidW5tb2NrIiwiQ29va2llIiwiSnNvblBhcnNlciIsIlNhbml0aXplciIsIlVybCIsIlNub3dib2FyZCIsImF1dG9TaW5nbGV0b25zIiwiZGVidWdFbmFibGVkIiwiYXV0b0luaXRTaW5nbGV0b25zIiwicGx1Z2lucyIsImxpc3RlbmVycyIsImZvdW5kQmFzZVVybCIsInJlYWRpbmVzcyIsImRvbSIsImF0dGFjaEFic3RyYWN0cyIsImxvYWRVdGlsaXRpZXMiLCJpbml0aWFsaXNlIiwiYWRkUGx1Z2luIiwiaW5pdGlhbGlzZVNpbmdsZXRvbnMiLCJsb3dlck5hbWUiLCJnZXRQbHVnaW5zIiwicmVhZHlNZXRob2QiLCJyZW1vdmVQbHVnaW4iLCJnZXRQbHVnaW4iLCJvbiIsIm9mZiIsImluZGV4IiwibGlzdGVuTWV0aG9kIiwicmVzdWx0IiwibGlzdGVuZXIiLCJpbnN0YW5jZVByb21pc2UiLCJsaXN0ZW5lclByb21pc2UiLCJsb2dNZXNzYWdlIiwiY29sb3IiLCJib2xkIiwiY29uc29sZSIsImdyb3VwQ29sbGFwc2VkIiwicGFyYW0iLCJsb2ciLCJncm91cEVuZCIsIkJhc2VDb29raWUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsInNhbWVTaXRlIiwic2V0RGVmYXVsdHMiLCJjb29raWVzIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlIiwibmV3VmFsdWUiLCJzYXZlVmFsdWUiLCJ3bkpTT04iLCJvY0pTT04iLCJzdHIiLCJqc29uU3RyaW5nIiwicGFyc2VTdHJpbmciLCJKU09OIiwibnVtIiwiaXNCbGFua0NoYXIiLCJwYXJzZUtleSIsImNhbkJlS2V5SGVhZCIsImdldEJvZHkiLCJvcmlnaW5MZW5ndGgiLCJsYXN0IiwicG9zIiwic3RhY2siLCJxdW90ZSIsImNoIiwiY2hhckNvZGVBdCIsInduU2FuaXRpemUiLCJodG1sIiwic2FuaXRpemUiLCJvY1Nhbml0aXplIiwiYm9keU9ubHkiLCJwYXJzZXIiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJyZXR1cm5Cb2R5T25seSIsInNhbml0aXplTm9kZSIsImdldFJvb3ROb2RlIiwibm9kZSIsInRyaW1BdHRyaWJ1dGVzIiwiY2hpbGRyZW4iLCJjaGlsZCIsImF0dHJpYnV0ZXMiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImZvdW5kQXNzZXRVcmwiLCJiYXNlVXJsIiwiYXNzZXRVcmwiLCJ0byIsInVybFJlZ2V4IiwidGhlVXJsIiwidmFsaWRhdGVCYXNlVXJsIiwidXJsUGFydHMiLCJwcm90b2NvbCIsImhvc3QiLCJQcm94eUhhbmRsZXIiLCJTbm93Qm9hcmQiLCJfcmVmIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/pages/snowboard/triggers.htm b/pages/snowboard/triggers.htm index 18f362b..e3084b7 100644 --- a/pages/snowboard/triggers.htm +++ b/pages/snowboard/triggers.htm @@ -54,6 +54,7 @@

Trigger on one of multiple values

type="text" name="field" placeholder="Field" + value="pizza" >
Trigger on all of multiple values (text boxes)
+ +
+ +

Trigger on select value

+

Triggers when you correctly identify the actor who played John Wick. Also tests multiple triggers.

+ +
+
+ +
+
+ Wrong +
+
+ Correct +
+
+ +

Empty

@@ -182,6 +229,49 @@

Trigger when empty

Oi, you! + + + +
+ +

Trigger when empty (checkboxes)

+

A message will appear when none of the checkboxes are ticked.

+ +
+
+ + + + + + + + +
+
+ This is a no-check zone +
+
From fdc338cfad3ff7c800553e64371e4d1ab99a2420 Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Mon, 15 Jul 2024 20:04:33 +0800 Subject: [PATCH 4/7] Fix a whole lot of flex-grow mispellings lol --- pages/blog/category.htm | 2 +- pages/blog/index.htm | 2 +- pages/blog/post.htm | 2 +- pages/cms/icons.htm | 2 +- pages/cms/index.htm | 2 +- pages/cms/layout-component.htm | 2 +- pages/snowboard/attr-requests.htm | 2 +- pages/snowboard/extras.htm | 2 +- pages/snowboard/index.htm | 2 +- pages/snowboard/js-requests.htm | 2 +- pages/snowboard/triggers.htm | 2 +- pages/snowboard/utilities.htm | 2 +- pages/snowman/car-view.htm | 2 +- pages/snowman/cars-list.htm | 2 +- pages/snowman/index.htm | 2 +- partials/ui/link-button.htm | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pages/blog/category.htm b/pages/blog/category.htm index e3ecb87..bad5a24 100644 --- a/pages/blog/category.htm +++ b/pages/blog/category.htm @@ -19,7 +19,7 @@
-
+
{% partial 'blog/category-list' %}
diff --git a/pages/blog/index.htm b/pages/blog/index.htm index e077515..c4ea28a 100644 --- a/pages/blog/index.htm +++ b/pages/blog/index.htm @@ -10,7 +10,7 @@
-
+
{% partial 'blog/category-list' %}
diff --git a/pages/blog/post.htm b/pages/blog/post.htm index 856cbe6..c0d4db4 100644 --- a/pages/blog/post.htm +++ b/pages/blog/post.htm @@ -16,7 +16,7 @@
-
+
{{ post.content | md }}
diff --git a/pages/cms/icons.htm b/pages/cms/icons.htm index 7a9dacf..0497bca 100644 --- a/pages/cms/icons.htm +++ b/pages/cms/icons.htm @@ -10,7 +10,7 @@
-
+
{% partial 'cms/sections-list' %}
diff --git a/pages/cms/index.htm b/pages/cms/index.htm index a6cc310..73592e6 100644 --- a/pages/cms/index.htm +++ b/pages/cms/index.htm @@ -5,7 +5,7 @@
-
+
{% partial 'cms/sections-list' %}
diff --git a/pages/cms/layout-component.htm b/pages/cms/layout-component.htm index 362cfcb..d1e89d9 100644 --- a/pages/cms/layout-component.htm +++ b/pages/cms/layout-component.htm @@ -5,7 +5,7 @@
-
+
{% partial 'cms/sections-list' %}
diff --git a/pages/snowboard/attr-requests.htm b/pages/snowboard/attr-requests.htm index b295488..f80be01 100644 --- a/pages/snowboard/attr-requests.htm +++ b/pages/snowboard/attr-requests.htm @@ -71,7 +71,7 @@
-
+
{% partial 'snowboard/sections-list' %}
diff --git a/pages/snowboard/extras.htm b/pages/snowboard/extras.htm index 11b7bc8..f94b967 100644 --- a/pages/snowboard/extras.htm +++ b/pages/snowboard/extras.htm @@ -25,7 +25,7 @@
-
+
{% partial 'snowboard/sections-list' %}
diff --git a/pages/snowboard/index.htm b/pages/snowboard/index.htm index 4174484..a176156 100644 --- a/pages/snowboard/index.htm +++ b/pages/snowboard/index.htm @@ -5,7 +5,7 @@
-
+
{% partial 'snowboard/sections-list' %}
diff --git a/pages/snowboard/js-requests.htm b/pages/snowboard/js-requests.htm index 5ac4efb..b0d8cf3 100644 --- a/pages/snowboard/js-requests.htm +++ b/pages/snowboard/js-requests.htm @@ -62,7 +62,7 @@
-
+
{% partial 'snowboard/sections-list' %}
diff --git a/pages/snowboard/triggers.htm b/pages/snowboard/triggers.htm index e3084b7..5d81646 100644 --- a/pages/snowboard/triggers.htm +++ b/pages/snowboard/triggers.htm @@ -5,7 +5,7 @@
-
+
{% partial 'snowboard/sections-list' %}
diff --git a/pages/snowboard/utilities.htm b/pages/snowboard/utilities.htm index ccb32d0..b2e4c1e 100644 --- a/pages/snowboard/utilities.htm +++ b/pages/snowboard/utilities.htm @@ -5,7 +5,7 @@
-
+
{% partial 'snowboard/sections-list' %}
diff --git a/pages/snowman/car-view.htm b/pages/snowman/car-view.htm index 3e9ce79..bf678fe 100644 --- a/pages/snowman/car-view.htm +++ b/pages/snowman/car-view.htm @@ -5,7 +5,7 @@
-
+
{% partial 'snowman/sections-list' %}
diff --git a/pages/snowman/cars-list.htm b/pages/snowman/cars-list.htm index 1fed6db..f1db1df 100644 --- a/pages/snowman/cars-list.htm +++ b/pages/snowman/cars-list.htm @@ -5,7 +5,7 @@
- - + + + +
+ +

Trigger on empty select value

+

Triggers when a dropdown is using an empty value.

+ +
+
+ +
+
+ Select an option +
+
+ + +
+ +

Checked / Unchecked

+ + +
+ +

Trigger on checked

+

Triggers when the checkbox is checked.

+ +
+
+ + +
+
+ Brrrrrr! +
+
+ + + +
+ +

Trigger on unchecked

+

Triggers when the checkbox is unchecked.

+ +
+
+ + +
+
+ Let's go! +
+
+
From ba6fcaf41d199f6501171a5c755cb1f6e5671070 Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Tue, 16 Jul 2024 14:17:27 +0800 Subject: [PATCH 6/7] More tests --- assets/css/theme.css | 13 +- assets/js/app.js | 548 +++++++++++++++++++++++------------ pages/snowboard/triggers.htm | 59 +++- 3 files changed, 428 insertions(+), 192 deletions(-) diff --git a/assets/css/theme.css b/assets/css/theme.css index 8ceb553..8d0a1ff 100644 --- a/assets/css/theme.css +++ b/assets/css/theme.css @@ -823,6 +823,10 @@ video { --tw-bg-opacity: 1; background-color: rgb(2 132 199 / var(--tw-bg-opacity)); } +.bg-blue-800 { + --tw-bg-opacity: 1; + background-color: rgb(7 89 133 / var(--tw-bg-opacity)); +} .bg-emerald-700 { --tw-bg-opacity: 1; background-color: rgb(4 120 87 / var(--tw-bg-opacity)); @@ -879,6 +883,10 @@ video { --tw-bg-opacity: 1; background-color: rgb(153 27 27 / var(--tw-bg-opacity)); } +.bg-red-700 { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); +} .bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); } @@ -1382,6 +1390,9 @@ p + h6 { --tw-scale-y: .9; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } +.disabled\:opacity-50:disabled { + opacity: 0.5; +} .group:hover .group-hover\:translate-x-2 { --tw-translate-x: 0.5rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); @@ -1463,4 +1474,4 @@ p + h6 { } -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsb0VBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFB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QUE7QUFwRUE7O0VBQUE7SUFBQSxpQkFvRUE7SUFwRUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9jb21wb25lbnRzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL3V0aWxpdGllcy5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4vYXNzZXRzL2Nzcy9zZWN0aW9ucy91c2VyLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL2Jhc2UuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIkB0YWlsd2luZCBiYXNlO1xuIiwiQHRhaWx3aW5kIGNvbXBvbmVudHM7XG4iLCJAdGFpbHdpbmQgdXRpbGl0aWVzO1xuIiwiI2FjY291bnQtY29tcG9uZW50IHtcbiAgICAucm93IHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIGxnOmdyaWQgbGc6Z3JpZC1jb2xzLTIgZ2FwLTEwO1xuXG4gICAgICAgIC5jb2wtbWQtNiB7XG4gICAgICAgICAgICBAYXBwbHkgaC1hdXRvIGxnOmgtZnVsbCBwLTggYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy1ncmF5LTUwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAge1xuICAgICAgICBAYXBwbHkgZmxleCBmbGV4LWNvbCBnYXAtMjtcblxuICAgICAgICAuZm9ybS1sYWJlbCwgbGFiZWwge1xuICAgICAgICAgICAgQGFwcGx5IGZvbnQtYm9sZCB0ZXh0LXNtIHRleHQtZ3JheS02MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgICAgICAgIEBhcHBseSBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgcC0yIGZvY3VzOm91dGxpbmUgZm9jdXM6b3V0bGluZS1ibHVlLTUwMCBwbGFjZWhvbGRlcjp0ZXh0LWdyYXktMzAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmZvcm0tZ3JvdXAgKyAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBtdC00O1xuICAgIH1cblxuICAgIC5idG4ge1xuICAgICAgICBAYXBwbHkgbXQtOCBpbmxpbmUtZmxleCBmb250LWJvbGQgdGV4dC1zbSByb3VuZGVkLWxnIHRyYW5zaXRpb24gdHJhbnNmb3JtIGFjdGl2ZTpzY2FsZS05MCBweS00IHB4LTggYmctZ3JlZW4tNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctZ3JlZW4tNTAwO1xuICAgIH1cblxuICAgIC5kZWFjdGl2YXRlIHtcbiAgICAgICAgQGFwcGx5IGJsb2NrIG10LTQgdGV4dC1yZWQtNjAwIGhvdmVyOnRleHQtcmVkLTgwMDtcbiAgICB9XG5cbiAgICAjYWNjb3VudERlYWN0aXZhdGVGb3JtIHtcbiAgICAgICAgQGFwcGx5IG10LTggYm9yZGVyIGJvcmRlci1yZWQtMjAwIGJnLXJlZC01MCBwLTg7XG5cbiAgICAgICAgLmJ0biB7XG4gICAgICAgICAgICBAYXBwbHkgYmctcmVkLTYwMCB0ZXh0LXdoaXRlIGhvdmVyOmJnLXJlZC01MDA7XG4gICAgICAgIH1cblxuICAgICAgICAuYnRuICsgYSB7XG4gICAgICAgICAgICBAYXBwbHkgbWwtNDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBpbXBvcnQgJ3RhaWx3aW5kY3NzL2Jhc2UnO1xuQGltcG9ydCAndGFpbHdpbmRjc3MvY29tcG9uZW50cyc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy91dGlsaXRpZXMnO1xuQGltcG9ydCAnLi9zZWN0aW9ucy91c2VyLmNzcyc7XG5cbi8qIERlZmF1bHQgZm9udCAqL1xuYm9keSB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS01MDAgZm9udC1ib2R5O1xufVxuXG4vKiBEaXNhYmxlIE9TWCBzY3JvbGxpbmcgYm91bmNlIGVmZmVjdCAqL1xuaHRtbCxcbmJvZHkge1xuICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmU7XG59XG5cbi8qIEhlYWRpbmcgc3R5bGVzICovXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICAgIEBhcHBseSB0ZXh0LWdyYXktNzAwIGZvbnQtaGVhZGluZyBtYi02O1xufVxuXG5oMSB7XG4gICAgQGFwcGx5IHRleHQtNHhsO1xufVxuXG5oMiB7XG4gICAgQGFwcGx5IHRleHQtMnhsO1xufVxuXG5oMyB7XG4gICAgQGFwcGx5IHRleHQteGw7XG59XG5cbmg0IHtcbiAgICBAYXBwbHkgdGV4dC1sZztcbn1cblxuLyogUGFyYWdyYXBocyBhbmQgc3BhY2luZyAqL1xucCB7XG4gICAgQGFwcGx5IG1iLTQ7XG59XG5cbnA6bGFzdC1jaGlsZCB7XG4gICAgQGFwcGx5IG1iLTA7XG59XG5cbnAgKyBoMSxcbnAgKyBoMixcbnAgKyBoMyxcbnAgKyBoNCxcbnAgKyBoNSxcbnAgKyBoNiB7XG4gICAgQGFwcGx5IG10LTg7XG59XG5cbi8qIEhlcm8gKi9cbi5oZXJvIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtNTIgcGItMjggdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG5cbi5oZXJvLXNtYWxsIHtcbiAgICBAYXBwbHkgcHgtMTYgcHQtMzIgcGItMTYgdGV4dC1jZW50ZXIgbGc6cHgtNDA7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsb0VBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFB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RUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7QUFBQTtBQXBFQTs7RUFBQTtJQUFBLGlCQW9FQTtJQXBFQTtFQW9FQTs7RUFwRUE7SUFBQTtFQW9FQTs7RUFwRUE7SUFBQTtFQW9FQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9iYXNlLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL2NvbXBvbmVudHMuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvdXRpbGl0aWVzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL3NlY3Rpb25zL3VzZXIuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiQHRhaWx3aW5kIGJhc2U7XG4iLCJAdGFpbHdpbmQgY29tcG9uZW50cztcbiIsIkB0YWlsd2luZCB1dGlsaXRpZXM7XG4iLCIjYWNjb3VudC1jb21wb25lbnQge1xuICAgIC5yb3cge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbGc6Z3JpZCBsZzpncmlkLWNvbHMtMiBnYXAtMTA7XG5cbiAgICAgICAgLmNvbC1tZC02IHtcbiAgICAgICAgICAgIEBhcHBseSBoLWF1dG8gbGc6aC1mdWxsIHAtOCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGJnLWdyYXktNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBmbGV4IGZsZXgtY29sIGdhcC0yO1xuXG4gICAgICAgIC5mb3JtLWxhYmVsLCBsYWJlbCB7XG4gICAgICAgICAgICBAYXBwbHkgZm9udC1ib2xkIHRleHQtc20gdGV4dC1ncmF5LTYwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICAgICAgQGFwcGx5IGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBwLTIgZm9jdXM6b3V0bGluZSBmb2N1czpvdXRsaW5lLWJsdWUtNTAwIHBsYWNlaG9sZGVyOnRleHQtZ3JheS0zMDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCArIC5mb3JtLWdyb3VwIHtcbiAgICAgICAgQGFwcGx5IG10LTQ7XG4gICAgfVxuXG4gICAgLmJ0biB7XG4gICAgICAgIEBhcHBseSBtdC04IGlubGluZS1mbGV4IGZvbnQtYm9sZCB0ZXh0LXNtIHJvdW5kZWQtbGcgdHJhbnNpdGlvbiB0cmFuc2Zvcm0gYWN0aXZlOnNjYWxlLTkwIHB5LTQgcHgtOCBiZy1ncmVlbi02MDAgdGV4dC13aGl0ZSBob3ZlcjpiZy1ncmVlbi01MDA7XG4gICAgfVxuXG4gICAgLmRlYWN0aXZhdGUge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbXQtNCB0ZXh0LXJlZC02MDAgaG92ZXI6dGV4dC1yZWQtODAwO1xuICAgIH1cblxuICAgICNhY2NvdW50RGVhY3RpdmF0ZUZvcm0ge1xuICAgICAgICBAYXBwbHkgbXQtOCBib3JkZXIgYm9yZGVyLXJlZC0yMDAgYmctcmVkLTUwIHAtODtcblxuICAgICAgICAuYnRuIHtcbiAgICAgICAgICAgIEBhcHBseSBiZy1yZWQtNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctcmVkLTUwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5idG4gKyBhIHtcbiAgICAgICAgICAgIEBhcHBseSBtbC00O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGltcG9ydCAndGFpbHdpbmRjc3MvYmFzZSc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy9jb21wb25lbnRzJztcbkBpbXBvcnQgJ3RhaWx3aW5kY3NzL3V0aWxpdGllcyc7XG5AaW1wb3J0ICcuL3NlY3Rpb25zL3VzZXIuY3NzJztcblxuLyogRGVmYXVsdCBmb250ICovXG5ib2R5IHtcbiAgICBAYXBwbHkgdGV4dC1ncmF5LTUwMCBmb250LWJvZHk7XG59XG5cbi8qIERpc2FibGUgT1NYIHNjcm9sbGluZyBib3VuY2UgZWZmZWN0ICovXG5odG1sLFxuYm9keSB7XG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogbm9uZTtcbn1cblxuLyogSGVhZGluZyBzdHlsZXMgKi9cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS03MDAgZm9udC1oZWFkaW5nIG1iLTY7XG59XG5cbmgxIHtcbiAgICBAYXBwbHkgdGV4dC00eGw7XG59XG5cbmgyIHtcbiAgICBAYXBwbHkgdGV4dC0yeGw7XG59XG5cbmgzIHtcbiAgICBAYXBwbHkgdGV4dC14bDtcbn1cblxuaDQge1xuICAgIEBhcHBseSB0ZXh0LWxnO1xufVxuXG4vKiBQYXJhZ3JhcGhzIGFuZCBzcGFjaW5nICovXG5wIHtcbiAgICBAYXBwbHkgbWItNDtcbn1cblxucDpsYXN0LWNoaWxkIHtcbiAgICBAYXBwbHkgbWItMDtcbn1cblxucCArIGgxLFxucCArIGgyLFxucCArIGgzLFxucCArIGg0LFxucCArIGg1LFxucCArIGg2IHtcbiAgICBAYXBwbHkgbXQtODtcbn1cblxuLyogSGVybyAqL1xuLmhlcm8ge1xuICAgIEBhcHBseSBweC0xNiBwdC01MiBwYi0yOCB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cblxuLmhlcm8tc21hbGwge1xuICAgIEBhcHBseSBweC0xNiBwdC0zMiBwYi0xNiB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file diff --git a/assets/js/app.js b/assets/js/app.js index b6f2f2c..f3abc59 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -3243,6 +3243,8 @@ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf * @property {string|undefined} parent The parent element with which to limit the trigger scope. * @property {string|number} priority The priority of the trigger event. * @property {HTMLElement[]} elements The target elements that this trigger applies to. + * @property {Function[]} conditionCallbacks The condition callbacks for this trigger. + * @property {Map>} elementEvents The events registered on the target elements. */ /** * @typedef {Object} TriggerElement @@ -3287,7 +3289,7 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { this.element = element; /** - * @type {Map>} The triggers for this element. + * @type {Map} The triggers for this element. */ this.triggers = new Map(); @@ -3327,8 +3329,9 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { * * Supported parameters are: * - `condition` or `where`: The condition that must be met for the trigger to fire. - * - `action`: The action to perform when the trigger fires. - * - `parent` or `closest-parent`: The parent element with which to limit the trigger scope. + * - `action` or `do`: The action to perform when the trigger fires. + * - `closest-parent` or `parent`: The parent element with which to limit the trigger scope. + * - `priority`: The priority in which to consider the trigger. * * Internally, the trigger map uses the `trigger` parameter to store the trigger selector. */ @@ -3348,14 +3351,14 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { if (dashStyle !== 'trigger' && !dashStyle.startsWith('trigger-')) { return; } - var triggerParts = /([a-z0-9\-.:_]+?)(?:(?:-)(closest-parent|condition|when|action|parent|priority))?$/i.exec(dashStyle.replace('trigger-', '').toLowerCase()); + var triggerParts = /([a-z0-9\-.:_]+?)(?:(?:-)(closest-parent|condition|when|action|parent|priority|do))?$/i.exec(dashStyle.replace('trigger-', '').toLowerCase()); var triggerName = null; var triggerType = null; if (['trigger', 'condition', 'action', 'parent', 'when', 'closest'].indexOf(triggerParts[1]) !== -1 && (triggerParts[1] !== 'closest' || triggerParts[1] === 'closest' && triggerParts[2] === 'parent')) { // Support original trigger format triggerName = '__original'; triggerType = triggerParts[1] === 'closest' ? 'parent' : triggerParts[1]; - } else if (triggerParts[2] === undefined || ['closest-parent', 'condition', 'when', 'action', 'parent', 'priority'].indexOf(triggerParts[2]) !== -1) { + } else if (triggerParts[2] === undefined || ['closest-parent', 'condition', 'when', 'action', 'parent', 'priority', 'do'].indexOf(triggerParts[2]) !== -1) { // Parse multi-trigger format var _triggerParts = _slicedToArray(triggerParts, 2); triggerName = _triggerParts[1]; @@ -3369,6 +3372,7 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { triggerType = 'condition'; break; case 'action': + case 'do': triggerType = 'action'; break; case 'priority': @@ -3392,7 +3396,7 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { // condition and an action, or are using invalid conditions or actions this.triggers.forEach(function (trigger, name) { var elements = _this.getSelectableElements(trigger); - if (!trigger.has('trigger') || !trigger.has('condition') || !trigger.has('action') || elements.length === 0 || !_this.isValidCondition(trigger) || !_this.isValidAction(trigger)) { + if (!trigger.has('trigger') || !trigger.has('condition') || !trigger.has('action') || elements.length === 0 || !_this.hasValidConditions(trigger) || !_this.hasValidActions(trigger)) { _this.triggers["delete"](name); } else { trigger.set('elements', elements); @@ -3411,14 +3415,19 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { * * If a parameter requires a comma within, the parameter should be wrapped in quotes. * + * Multiple commands can be separated by a pipe character `|`. + * * @param {string} command - * @returns {name: string, parameters: string[]} + * @param {string} allowMultiple + * @returns {{name: string, parameters: string[]}[]} */ }, { key: "parseCommand", value: function parseCommand(command) { + var _this2 = this; + var allowMultiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; // Support old-format value command (value[foo,bar]) - if (command.startsWith('value')) { + if (command.startsWith('value') && command.includes('[')) { var match = command.match(/[^[\]]+(?=])/g); var values = []; @@ -3428,43 +3437,57 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { values.push(value.replace(/^['"]|['"]$/g, '').trim()); return; } - var splitValues = value.replace(/("[^"]*")|('[^']*')/g, function (quoted) { + var splitValues = value.replace(/('.*?(? 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { values[_key - 2] = arguments[_key]; } @@ -3562,7 +3677,13 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { supportedElements.add(element); } }); - var thisEvent = function thisEvent() { + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + _this5.addEvent(element, trigger, 'click'); + } + _this5.addEvent(element, trigger, 'input'); + }); + return function () { var elementValues = new Set(); supportedElements.forEach(function (element) { if (element.matches('input[type=checkbox], input[type=radio]')) { @@ -3574,34 +3695,14 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { elementValues.add(element.value); }); if (all) { - if (values.every(function (value) { + return values.every(function (value) { return elementValues.has(value); - })) { - _this3.executeAction(trigger, true); - } else { - _this3.executeAction(trigger, false); - } - return; - } - if (values.some(function (value) { - return elementValues.has(value); - })) { - _this3.executeAction(trigger, true); - } else { - _this3.executeAction(trigger, false); - } - }; - supportedElements.forEach(function (element) { - if (element.matches('input[type=checkbox], input[type=radio]')) { - _this3.addEvent(element, trigger, 'click', function () { - return thisEvent(); }); - return; } - _this3.addEvent(element, trigger, 'input', function () { - return thisEvent(); + return values.some(function (value) { + return elementValues.has(value); }); - }); + }; } /** @@ -3610,9 +3711,9 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { * @param {TriggerEntity} trigger */ }, { - key: "createEmptyEvent", - value: function createEmptyEvent(trigger) { - var _this4 = this; + key: "createEmptyCondition", + value: function createEmptyCondition(trigger) { + var _this6 = this; var supportedElements = new Set(); trigger.get('elements').forEach(function (element) { if (element.matches('input[type=button], input[type=image], input[type=reset], input[type=submit]')) { @@ -3623,7 +3724,14 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { supportedElements.add(element); } }); - var thisEvent = function thisEvent() { + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + _this6.addEvent(element, trigger, 'click'); + return; + } + _this6.addEvent(element, trigger, 'input'); + }); + return function () { var elementValues = new Set(); supportedElements.forEach(function (element) { if (element.matches('input[type=checkbox], input[type=radio]')) { @@ -3636,38 +3744,24 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { elementValues.add(element); } }); - if (elementValues.size === 0) { - _this4.executeAction(trigger, true); - } else { - _this4.executeAction(trigger, false); - } + return elementValues.size === 0; }; - supportedElements.forEach(function (element) { - if (element.matches('input[type=checkbox], input[type=radio]')) { - _this4.addEvent(element, trigger, 'click', function () { - return thisEvent(); - }); - return; - } - _this4.addEvent(element, trigger, 'input', function () { - return thisEvent(); - }); - }); } /** - * Creates a trigger that fires when a target element is checked/unchecked. + * Creates a trigger that fires when a target element(s) is checked/unchecked. * * @param {TriggerEntity} trigger * @param {boolean} checked If the element should be checked or unchecked. - * @param {number|undefined} atLeast The minimum number of elements that must be checked. - * Defaults to 1 if undefined. + * @param {string|number|undefined} atLeast The minimum number of elements that must be checked. + * Defaults to 1 if undefined. If specified as `all`, all elements must be checked. */ }, { - key: "createCheckedEvent", - value: function createCheckedEvent(trigger, checked) { - var _this5 = this; + key: "createCheckedCondition", + value: function createCheckedCondition(trigger, checked) { + var _this7 = this; var atLeast = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + var atMost = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; var supportedElements = new Set(); trigger.get('elements').forEach(function (element) { // Only supports checkboxes and radio buttons @@ -3675,73 +3769,30 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { supportedElements.add(element); } }); - var thisEvent = function thisEvent() { + supportedElements.forEach(function (element) { + _this7.addEvent(element, trigger, 'click'); + }); + return function () { var elementValues = new Set(); supportedElements.forEach(function (element) { if (checked === element.checked) { elementValues.add(element); } }); - var atLeastCount = atLeast ? Number(atLeast) : 1; - if (elementValues.size >= atLeastCount) { - _this5.executeAction(trigger, true); - } else { - _this5.executeAction(trigger, false); + if (atLeast === 'all') { + return elementValues.size === supportedElements.size; } + var atLeastCount = atLeast !== undefined && Math.floor(atLeast) > 0 ? Math.floor(atLeast) : 1; + var atMostCount = atLeast !== undefined && Math.floor(atMost) > 1 ? Math.floor(atMost) : supportedElements.size; + return elementValues.size >= atLeastCount && elementValues.size <= atMostCount; }; - supportedElements.forEach(function (element) { - _this5.addEvent(element, trigger, 'click', function () { - return thisEvent(); - }); - }); } /** - * Adds an event to an element. - * - * This registers the event in the `events` map for later usage and removal, and adds a - * connector to the element for the event, so that we may enable prioritisation and control over - * the firing of the events. + * Manually runs all registered triggers. * - * @param {HTMLElement} element - * @param {TriggerEntity} trigger - * @param {string} eventName - * @param {Function} callback + * This can be used to update the state of the triggers. */ - }, { - key: "addEvent", - value: function addEvent(element, trigger, eventName, callback) { - var _this6 = this; - if (!this.events.has(element)) { - this.events.set(element, new Set()); - } - var event = { - element: element, - eventName: eventName, - priority: Number(trigger.get('priority')), - event: callback - }; - this.events.get(element).add(event); - if (!this.connectors.has(element)) { - this.connectors.set(element, new Map()); - } - if (!this.connectors.get(element).has(eventName)) { - this.connectors.get(element).set(eventName, function () { - var events = []; - _this6.events.get(element).forEach(function (elementEvent) { - if (elementEvent.eventName === eventName) { - events.push(elementEvent); - } - }); - events.sort(function (a, b) { - return a.priority - b.priority; - }).forEach(function (elementEvent) { - elementEvent.event(); - }); - }); - element.addEventListener(eventName, this.connectors.get(element).get(eventName)); - } - } }, { key: "runEvents", value: function runEvents() { @@ -3751,6 +3802,12 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { }); }); } + + /** + * Clears all registered events. + * + * This will disable all triggers and their event listeners on the target elements. + */ }, { key: "resetEvents", value: function resetEvents() { @@ -3762,44 +3819,163 @@ var Trigger = /*#__PURE__*/function (_PluginBase) { this.connectors.clear(); this.events.clear(); } + + /** + * Executes actions based on the trigger condition. + * + * Actions should be binary, and show one state when the condition is met, and another when it + * is not. The second parameter is used to determine if the conditions of the trigger have been + * met. If a trigger has multiple conditions, ALL conditions must be met. + * + * @param {TriggerEntity} trigger + * @param {boolean} conditionMet + */ }, { - key: "executeAction", - value: function executeAction(trigger, conditionMet) { - var _this$parseCommand = this.parseCommand(trigger.get('action')), - name = _this$parseCommand.name, - parameters = _this$parseCommand.parameters; - switch (name) { - case 'show': - case 'hide': - this.actionShow(trigger, name === 'show' ? conditionMet : !conditionMet); - break; - default: - } + key: "executeActions", + value: function executeActions(trigger, conditionMet) { + var _this8 = this; + this.parseCommand(trigger.get('action')).forEach(function (action) { + switch (action.name) { + case 'show': + case 'hide': + _this8.actionShow(trigger, action.parameters[0] ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element], action.name === 'show' ? conditionMet : !conditionMet); + break; + case 'enable': + case 'disable': + _this8.actionEnable(trigger, action.parameters[0] ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element], action.name === 'enable' ? conditionMet : !conditionMet); + break; + case 'empty': + if (conditionMet) { + _this8.actionValue(trigger, conditionMet, action.parameters[0] ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element], ''); + } + break; + case 'value': + case 'valueOf': + _this8.actionValue.apply(_this8, [trigger, conditionMet, action.name === 'valueOf' ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element]].concat(_toConsumableArray(action.parameters.length > 0 && action.name === 'valueOf' ? action.parameters.slice(1) : action.parameters))); + break; + case 'class': + case 'classOf': + _this8.actionClass.apply(_this8, [trigger, conditionMet, action.name === 'classOf' ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element]].concat(_toConsumableArray(action.name === 'classOf' ? action.parameters.slice(1) : action.parameters))); + default: + } + }); } + + /** + * Shows or hides a trigger element. + * + * This action will toggle the `hide` class on the element, and set the `display` style to + * `none` when hidden, and the original display value when shown. + * + * @param {TriggerEntity} trigger + * @param {HTMLElement[]} elements + * @param {boolean} show + */ }, { key: "actionShow", - value: function actionShow(trigger, show) { - if (show && getComputedStyle(this.element).display === 'none') { - this.element.classList.remove('hide'); - if (!this.element.dataset.originalDisplay) { - this.element.style.display = 'block'; - } else { - this.element.style.display = this.element.dataset.originalDisplay; + value: function actionShow(trigger, elements, show) { + var _this9 = this; + elements.forEach(function (element) { + if (show && getComputedStyle(element).display === 'none') { + element.classList.remove('hide'); + if (!element.dataset.originalDisplay) { + element.style.display = 'block'; + } else { + element.style.display = element.dataset.originalDisplay; + } + delete element.dataset.originalDisplay; + _this9.afterAction(trigger, element); + } else if (!show && getComputedStyle(element).display !== 'none') { + element.classList.add('hide'); + element.dataset.originalDisplay = getComputedStyle(element).display; + element.style.display = 'none'; + _this9.afterAction(trigger, element); + } + }); + } + + /** + * Enables or disables a trigger element. + * + * This action will toggle the `control-disabled` class on the element, and set the `disabled` + * property to `true` when disabled, and `false` when enabled. + * + * @param {TriggerEntity} trigger + * @param {HTMLElement[]} elements + * @param {boolean} enable + */ + }, { + key: "actionEnable", + value: function actionEnable(trigger, elements, enable) { + var _this10 = this; + elements.forEach(function (element) { + element.classList[enable ? 'remove' : 'add']('control-disabled'); + if (element.disabled !== undefined) { + element.disabled = !enable; } - delete this.element.dataset.originalDisplay; - this.afterAction(trigger); - } else if (!show && getComputedStyle(this.element).display !== 'none') { - this.element.classList.add('hide'); - this.element.dataset.originalDisplay = getComputedStyle(this.element).display; - this.element.style.display = 'none'; - this.afterAction(trigger); + _this10.afterAction(trigger, element); + }); + } + + /** + * Sets the value of either the trigger element or a child element(s) within. + * + * This is a one-way action if the unmet value is not defined. + */ + }, { + key: "actionValue", + value: function actionValue(trigger, conditionMet, elements, value) { + var _this11 = this; + var unmetValue = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; + if (!conditionMet && unmetValue === undefined) { + return; } + var newValue = conditionMet ? value : unmetValue; + elements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + element.checked = element.value === newValue; + return; + } + if (element.matches('input, select, textarea')) { + element.value = newValue; + return; + } + element.textContent = newValue; + _this11.afterAction(trigger); + }); + } + + /** + * Adds or removes the class from the trigger element or a child element(s) within. + * + * This will simply remove the class if the unmet class is not defined. Otherwise, the classes + * will be toggled. + */ + }, { + key: "actionClass", + value: function actionClass(trigger, conditionMet, elements, cssClass) { + var _this12 = this; + var unmetCssClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; + elements.forEach(function (element) { + if (conditionMet) { + element.classList.add(cssClass); + if (unmetCssClass) { + element.classList.remove(unmetCssClass); + } + } else { + element.classList.remove(cssClass); + if (unmetCssClass) { + element.classList.add(unmetCssClass); + } + } + _this12.afterAction(trigger); + }); } }, { key: "afterAction", - value: function afterAction(trigger) { - this.snowboard.debug('Trigger fired', this.element, trigger); - this.snowboard.globalEvent('trigger.fired', this.element, trigger); + value: function afterAction(trigger, element) { + this.snowboard.debug('Trigger fired', element, trigger); + this.snowboard.globalEvent('trigger.fired', element, trigger); } }]); }(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); @@ -6147,4 +6323,4 @@ var api = init(defaultConverter, { path: '/' }); /******/ /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOzs7OztXQ3pCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLCtCQUErQix3Q0FBd0M7V0FDdkU7V0FDQTtXQUNBO1dBQ0E7V0FDQSxpQkFBaUIscUJBQXFCO1dBQ3RDO1dBQ0E7V0FDQSxrQkFBa0IscUJBQXFCO1dBQ3ZDO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOzs7OztXQzNCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7V0NOQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxNQUFNLHFCQUFxQjtXQUMzQjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTs7Ozs7VUVqREE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWJzdHJhY3RzL1BsdWdpbkJhc2UuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWJzdHJhY3RzL1NpbmdsZXRvbi5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWpheC9oYW5kbGVycy9BdHRyaWJ1dGVSZXF1ZXN0LmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9Bc3NldExvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvQXR0YWNoTG9hZGluZy5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRGF0YUNvbmZpZy5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2guanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoTGlzdGVuZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Zvcm1WYWxpZGF0aW9uLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHJpcGVMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0eWxlc2hlZXRMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyaWdnZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvbWFpbi9Jbm5lclByb3h5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1BsdWdpbkxvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Byb3h5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Nub3dib2FyZC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC91dGlsaXRpZXMvQ29va2llLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9Kc29uUGFyc2VyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9TYW5pdGl6ZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL1VybC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvanMvc3JjL2FwcC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL2Jhc2UuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLm1qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svcnVudGltZS9jaHVuayBsb2FkZWQiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGx1Z2luIGJhc2UgYWJzdHJhY3QuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgcGx1Z2lucy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgdGhlIFNub3dib2FyZCBmcmFtZXdvcmsgaW5zdGFuY2UsIGFuZCBzaG91bGQgbm90IGJlIG92ZXJ3cml0dGVuXG4gICAgICogdW5sZXNzIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Nub3dib2FyZH0gc25vd2JvYXJkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc25vd2JvYXJkKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkID0gc25vd2JvYXJkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsdWdpbiBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSB0cnVlIGNvbnN0cnVjdG9yIG9mIGEgcGx1Z2luLCBhbmQgY2FuIGJlIG92ZXJ3cml0dGVuLlxuICAgICAqIEl0IHdpbGwgYmUgY2FsbGVkIHN0cmFpZ2h0IGFmdGVyIGNvbnN0cnVjdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcmVxdWlyZWQgcGx1Z2lucyBmb3IgdGhpcyBzcGVjaWZpYyBtb2R1bGUgdG8gd29yay5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgcGx1Z2lucyByZXF1aXJlZCBmb3IgdGhpcyBtb2R1bGUgdG8gd29yaywgYXMgc3RyaW5ncy5cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBsaXN0ZW5lciBtZXRob2RzIGZvciBnbG9iYWwgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGRlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBGaXJlZCB3aGVuIHRoaXMgcGx1Z2luIGlzIHJlbW92ZWQuIENhbiBiZSBtYW51YWxseSBjYWxsZWQgaWYgeW91IGhhdmUgYW5vdGhlciBzY2VuYXJpbyBmb3JcbiAgICAgKiBkZXN0cnVjdGlvbiwgaWUuIHRoZSBlbGVtZW50IGF0dGFjaGVkIHRvIHRoZSBwbHVnaW4gaXMgcmVtb3ZlZCBvciBjaGFuZ2VkLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICB0aGlzLmRldGFjaCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5zbm93Ym9hcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGRlc3RydWN0b3IgKG9sZCBtZXRob2QgbmFtZSkuXG4gICAgICpcbiAgICAgKiBBbGxvd3MgcHJldmlvdXMgdXNhZ2Ugb2YgdGhlIFwiZGVzdHJ1Y3RvclwiIG1ldGhvZCB0byBzdGlsbCB3b3JrLlxuICAgICAqL1xuICAgIGRlc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFNpbmdsZXRvbiBwbHVnaW4gYWJzdHJhY3QuXG4gKlxuICogVGhpcyBpcyBhIHNwZWNpYWwgZGVmaW5pdGlvbiBjbGFzcyB0aGF0IHRoZSBTbm93Ym9hcmQgZnJhbWV3b3JrIHdpbGwgdXNlIHRvIGludGVycHJldCB0aGUgY3VycmVudCBwbHVnaW4gYXMgYVxuICogXCJzaW5nbGV0b25cIi4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBwbHVnaW4gY2xhc3MgaXMgdXNlZCBhY3Jvc3MgdGhlIGJvYXJkLlxuICpcbiAqIFNpbmdsZXRvbnMgYXJlIGluaXRpYWxpc2VkIG9uIHRoZSBcImRvbVJlYWR5XCIgZXZlbnQgYnkgZGVmYXVsdC5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2luZ2xldG9uIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogUmVxdWVzdCBwbHVnaW4uXG4gKlxuICogVGhpcyBpcyB0aGUgZGVmYXVsdCBBSkFYIGhhbmRsZXIgd2hpY2ggd2lsbCBydW4gdXNpbmcgdGhlIGBmZXRjaCgpYCBtZXRob2QgdGhhdCBpcyBkZWZhdWx0IGluIG1vZGVybiBicm93c2Vycy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVxdWVzdCBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgMiBvciAzIHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBJZiAyIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBoYW5kbGVyIG5hbWUgYW5kIHRoZSBzZWNvbmRcbiAgICAgKiBwYXJhbWV0ZXIgaXMgdGhlIG9wdGlvbnMuIFRoaXMgYXNzdW1lcyB0aGF0IHRoaXMgaXMgYSBkZXRhY2hlZCBBSkFYIHJlcXVlc3Qgbm90IGNvbm5lY3RlZCB0b1xuICAgICAqIGFuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiAzIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGFuIGVsZW1lbnQgb3IgYSBzZWxlY3RvciwgYW5kIHRoZSBzZWNvbmRcbiAgICAgKiBhbmQgdGhpcmQgcGFyYW1ldGVycyBhcmUgdGhlIGhhbmRsZXIgYW5kIG9wdGlvbnMsIHJlc3BlY3RpdmVseS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8c3RyaW5nfSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBoYW5kbGVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBBbGxvdyB0aGUgZWxlbWVudCB0byBiZSBhIGhhbmRsZXIgbmFtZS5cbiAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGUgcmVxdWVzdCBpcyBiZWluZyBtYWRlIGFnYWluc3Qgbm8gZWxlbWVudCwgYW5kIHRoZSBoYW5kbGVyIHBhcmFtZXRlclxuICAgICAgICAgICAgLy8gd2lsbCBjb250YWluIG9wdGlvbnMuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0hhbmRsZXJOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IGhhbmRsZXIgfHwge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBlbGVtZW50IHdhcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvcjogJHtlbGVtZW50fWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBtYXRjaGVkRWxlbWVudDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZldGNoT3B0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzcG9uc2VFcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jaGVja1JlcXVlc3QoKTtcbiAgICAgICAgaWYgKCF0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFNldHVwJywgdGhpcykpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFNldHVwJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kb0NsaWVudFZhbGlkYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgICAgICAgdGhpcy5kb0NvbmZpcm0oKS50aGVuKChjb25maXJtZWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9BamF4KCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NVcGRhdGUocmVzcG9uc2UpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9TVUNDRVNTID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZG9BamF4KCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfU1VDQ0VTUyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbmNpZXMgZm9yIHRoaXMgcGx1Z2luLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsnY29va2llJywgJ2pzb25QYXJzZXInXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhlIGVsZW1lbnQgYW5kIGhhbmRsZXIgZ2l2ZW4gaW4gdGhlIHJlcXVlc3QuXG4gICAgICovXG4gICAgY2hlY2tSZXF1ZXN0KCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBlbGVtZW50IHByb3ZpZGVkIG11c3QgYmUgYW4gRWxlbWVudCBpbnN0YW5jZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBSkFYIGhhbmRsZXIgbmFtZSBpcyBub3Qgc3BlY2lmaWVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSGFuZGxlck5hbWUodGhpcy5oYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFKQVggaGFuZGxlciBuYW1lLiBUaGUgY29ycmVjdCBoYW5kbGVyIG5hbWUgZm9ybWF0IGlzOiBcIm9uRXZlbnRcIi4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGZXRjaCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbWFkZSBhdmFpbGFibGUgZm9yIHBsdWdpbnMgdG8gZXh0ZW5kIG9yIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZldGNoKCkgc2V0dGluZ3Mgd2l0aCB0aGVpciBvd24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBnZXRGZXRjaCgpIHtcbiAgICAgICAgdGhpcy5mZXRjaE9wdGlvbnMgPSAodGhpcy5vcHRpb25zLmZldGNoT3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgID8gdGhpcy5vcHRpb25zLmZldGNoT3B0aW9uc1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICAgICAgbW9kZTogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhGZXRjaE9wdGlvbnMnLCB0aGlzLmZldGNoT3B0aW9ucywgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKHRoaXMudXJsLCB0aGlzLmZldGNoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gb24gdGhlIGZvcm0sIGlmIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGRvQ2xpZW50VmFsaWRhdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5icm93c2VyVmFsaWRhdGUgPT09IHRydWUgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNoZWNrVmFsaWRpdHkoKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgQUpBWCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIG9iamVjdCBmb3Igd2hlbiB0aGUgQUpBWCByZXF1ZXN0IGlzIGNvbXBsZXRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGRvQWpheCgpIHtcbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgdGhlIEFKQVggcmVxdWVzdCBiZWZvcmUgc2VuZGluZ1xuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhCZWZvcmVTZW5kJywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFqYXhQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRGZXRjaCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2sgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSA0MDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpLmluY2x1ZGVzKCcvanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZURhdGEubWVzc2FnZSAmJiByZXNwb25zZURhdGEuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEuZXhjZXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS50cmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBKU09OIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS50ZXh0KCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlVGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IocmVzcG9uc2VUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykuaW5jbHVkZXMoJy9qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmpzb24oKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXNwb25zZURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYX1dJTlRFUl9TVUNDRVNTOiByZXNwb25zZS5zdGF0dXMgIT09IDQwNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfV0lOVEVSX1JFU1BPTlNFX0NPREU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBKU09OIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRleHQoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKGBVbmFibGUgdG8gcHJvY2VzcyByZXNwb25zZTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChyZXNwb25zZUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKGBVbmFibGUgdG8gcmV0cmlldmUgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXI6ICR7cmVzcG9uc2VFcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U3RhcnQnLCBhamF4UHJvbWlzZSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhQcm9taXNlJyk7XG4gICAgICAgICAgICBldmVudC5wcm9taXNlID0gYWpheFByb21pc2U7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWpheFByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgZm9yIHVwZGF0aW5nIHRoZSBwYXJ0aWFscyBmcm9tIHRoZSBBSkFYIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogSWYgYW55IHBhcnRpYWxzIGFyZSByZXR1cm5lZCBmcm9tIHRoZSBBSkFYIHJlc3BvbnNlLCB0aGlzIG1ldGhvZCB3aWxsIGFsc28gYWN0aW9uIHRoZSBwYXJ0aWFsIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSBvYmplY3Qgd2hpY2ggdHJhY2tzIHdoZW4gdGhlIHBhcnRpYWwgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgcHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUuYXBwbHkodGhpcywgW3Jlc3BvbnNlXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXh0cmFjdCBwYXJ0aWFsIGluZm9ybWF0aW9uXG4gICAgICAgICAgICBjb25zdCBwYXJ0aWFscyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCA4KSAhPT0gJ1hfV0lOVEVSJykge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJ0aWFscykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX0FTU0VUUykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBc3NldHMocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMuc25vd2JvYXJkLmdsb2JhbFByb21pc2VFdmVudCgnYWpheEJlZm9yZVVwZGF0ZScsIHJlc3BvbnNlLCB0aGlzKTtcbiAgICAgICAgICAgIHByb21pc2VzLnRoZW4oXG4gICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NBc3NldHMocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9VcGRhdGUocGFydGlhbHMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgZm9yIEhUTUwgcmVkcmF3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcGFydGlhbHMgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0aWFsc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGRvVXBkYXRlKHBhcnRpYWxzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWZmZWN0ZWQgPSBbXTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocGFydGlhbHMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3BhcnRpYWwsIGNvbnRlbnRdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0b3IgPSAodGhpcy5vcHRpb25zLnVwZGF0ZSAmJiB0aGlzLm9wdGlvbnMudXBkYXRlW3BhcnRpYWxdKVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMub3B0aW9ucy51cGRhdGVbcGFydGlhbF1cbiAgICAgICAgICAgICAgICAgICAgOiBwYXJ0aWFsO1xuXG4gICAgICAgICAgICAgICAgbGV0IG1vZGUgPSAncmVwbGFjZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdhcHBlbmQnO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnN1YnN0cigwLCAxKSA9PT0gJ14nKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGUgPSAncHJlcGVuZCc7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpICE9PSAnIycgJiYgc2VsZWN0b3Iuc3Vic3RyKDAsIDEpICE9PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdub29wJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FwcGVuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MICs9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ByZXBlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQgKyBlbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9vcCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFmZmVjdGVkLnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmUgdXBkYXRlIGV2ZW50IGZvciBlYWNoIGVsZW1lbnQgdGhhdCBpcyB1cGRhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFVwZGF0ZScsIGVsZW1lbnQsIGNvbnRlbnQsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhVcGRhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VXBkYXRlQ29tcGxldGUnLCBhZmZlY3RlZCwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSByZXNwb25zZSBkYXRhLlxuICAgICAqXG4gICAgICogVGhpcyBmaXJlcyBvZmYgYWxsIG5lY2Vzc2FyeSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHJlc3BvbnNlLCBpZS4gaWYgdGhlcmUncyBhbnkgZmxhc2hcbiAgICAgKiBtZXNzYWdlcyB0byBoYW5kbGUsIG9yIGFueSByZWRpcmVjdHMgdG8gYmUgdW5kZXJ0YWtlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByb2Nlc3NSZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN1Y2Nlc3MgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5zdWNjZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN1Y2Nlc3ModGhpcy5yZXNwb25zZURhdGEsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIHJlc3BvbnNlIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFN1Y2Nlc3MnLCB0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyB0aGUgZWxlbWVudCB0byBjYW5jZWwgYW55IGZ1cnRoZXIgcmVzcG9uc2UgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhEb25lJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VEYXRhID0gdGhpcy5yZXNwb25zZURhdGE7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mbGFzaCAmJiByZXNwb25zZS5YX1dJTlRFUl9GTEFTSF9NRVNTQUdFUykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRmxhc2hNZXNzYWdlcyhyZXNwb25zZS5YX1dJTlRFUl9GTEFTSF9NRVNTQUdFUyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgYSByZWRpcmVjdCBmcm9tIHRoZSByZXNwb25zZSwgb3IgdXNlIHRoZSByZWRpcmVjdCBhcyBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbnMuXG4gICAgICAgIGlmICh0aGlzLnJlZGlyZWN0IHx8IHJlc3BvbnNlLlhfV0lOVEVSX1JFRElSRUNUKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZWRpcmVjdCh0aGlzLnJlZGlyZWN0IHx8IHJlc3BvbnNlLlhfV0lOVEVSX1JFRElSRUNUKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYW4gZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgQUpBWCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhpcyBmaXJlcyBvZmYgYWxsIG5lY2Vzc2FyeSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIGVycm9yIHJlc3BvbnNlLCBpZS4gaWYgdGhlcmUncyBhbnkgZXJyb3Igb3JcbiAgICAgKiB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fEVycm9yfSBlcnJvclxuICAgICAqL1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVycm9yICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IodGhpcy5yZXNwb25zZUVycm9yLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCBhbnkgZnVydGhlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhFcnJvcicsIHRoaXMucmVzcG9uc2VFcnJvciwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyB0aGUgZWxlbWVudCB0byBjYW5jZWwgYW55IGZ1cnRoZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhGYWlsJywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VFcnJvciA9IHRoaXMucmVzcG9uc2VFcnJvcjtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvck1lc3NhZ2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2tpcEVycm9yID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAgICAgIGlmIChlcnJvci5YX1dJTlRFUl9FUlJPUl9GSUVMRFMpIHtcbiAgICAgICAgICAgICAgICBza2lwRXJyb3IgPSB0aGlzLnByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzKGVycm9yLlhfV0lOVEVSX0VSUk9SX0ZJRUxEUyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnJvci5YX1dJTlRFUl9FUlJPUl9NRVNTQUdFICYmICFza2lwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvck1lc3NhZ2UoZXJyb3IuWF9XSU5URVJfRVJST1JfTUVTU0FHRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgcmVkaXJlY3QgcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3NvciB3aWxsIHNpbXBseSByZWRpcmVjdCB0aGUgdXNlciBpbiB0aGVpciBicm93c2VyLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhSZWRpcmVjdGAgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgb25cbiAgICAgKiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVSZWRpcmVjdFJlc3BvbnNlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogcmVkaXJlY3Qgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc1JlZGlyZWN0KHVybCkge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgcmVkaXJlY3QgaGFuZGxlci4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvbid0IHJ1biB0aGUgcmVkaXJlY3QuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZVJlZGlyZWN0UmVzcG9uc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlUmVkaXJlY3RSZXNwb25zZS5hcHBseSh0aGlzLCBbdXJsXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgdGhlIHJlZGlyZWN0XG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFJlZGlyZWN0JywgdXJsLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIEFKQVggcmVxdWVzdCBpcyBmaW5pc2hlZCBpZiB3ZSdyZSBzdGlsbCBvbiB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIGZvciByZWRpcmVjdHMgdGhhdCBqdXN0IGNoYW5nZSB0aGUgaGFzaCB2YWx1ZSBvZlxuICAgICAgICAvLyB0aGUgVVJMIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgcGFnZSB3aWxsIHByb3Blcmx5IHN0b3AuXG4gICAgICAgIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL29jdG9iZXJjbXMvb2N0b2Jlci9pc3N1ZXMvMjc4MFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudE5hbWUgPSAnYWpheFJlZGlyZWN0ZWQnO1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgdGhpcyBwcm9jZXNzb3Igd2lsbCBzaW1wbHkgYWxlcnQgdGhlIHVzZXIgdGhyb3VnaCBhIHNpbXBsZSBgYWxlcnQoKWAgY2FsbC5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4RXJyb3JNZXNzYWdlYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUVycm9yTWVzc2FnZWAgY2FsbGJhY2sgb3B0aW9uLiBJZiBhIGBmYWxzZWAgaXMgcmV0dXJuZWQgZnJvbSBlaXRoZXIsIHRoZVxuICAgICAqIGVycm9yIG1lc3NhZ2UgaGFuZGxpbmcgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByb2Nlc3NFcnJvck1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgaGFuZGxlciBmb3IgZXJyb3IgbWVzc2FnZXMuIElmIGZhbHNlIGlzIHJldHVybmVkLCBkbyBub3QgcHJvY2VzcyB0aGUgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgLy8gYW55IGZ1cnRoZXIuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUVycm9yTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVFcnJvck1lc3NhZ2UuYXBwbHkodGhpcywgW21lc3NhZ2VdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgZXJyb3IgbWVzc2FnZSBiZWluZyBzaG93blxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhFcnJvck1lc3NhZ2UnLCBtZXNzYWdlLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIHNob3cgYSBicm93c2VyIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBmbGFzaCBtZXNzYWdlcyBmcm9tIHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIG5vIGZsYXNoIG1lc3NhZ2UgaGFuZGxpbmcgd2lsbCBvY2N1ci5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4Rmxhc2hNZXNzYWdlc2AgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVGbGFzaE1lc3NhZ2VzYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogZmxhc2ggbWVzc2FnZSBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlc1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJvY2Vzc0ZsYXNoTWVzc2FnZXMobWVzc2FnZXMpIHtcbiAgICAgICAgLy8gUnVuIGEgY3VzdG9tIHBlci1yZXF1ZXN0IGZsYXNoIGhhbmRsZXIuIElmIGZhbHNlIGlzIHJldHVybmVkLCBkb24ndCBzaG93IHRoZSBmbGFzaCBtZXNzYWdlXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUZsYXNoTWVzc2FnZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlRmxhc2hNZXNzYWdlcy5hcHBseSh0aGlzLCBbbWVzc2FnZXNdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEZsYXNoTWVzc2FnZXMnLCBtZXNzYWdlcywgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHZhbGlkYXRpb24gZXJyb3JzIGZvciBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBubyB2YWxpZGF0aW9uIGVycm9yIGhhbmRsaW5nIHdpbGwgb2NjdXIuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheFZhbGlkYXRpb25FcnJvcnNgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlVmFsaWRhdGlvbkVycm9yc2AgY2FsbGJhY2sgb3B0aW9uLiBJZiBhIGBmYWxzZWAgaXMgcmV0dXJuZWQgZnJvbSBlaXRoZXIsIHRoZVxuICAgICAqIHZhbGlkYXRpb24gZXJyb3IgaGFuZGxpbmcgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcm9jZXNzVmFsaWRhdGlvbkVycm9ycyhmaWVsZHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlVmFsaWRhdGlvbkVycm9ycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JzLmFwcGx5KHRoaXMsIFt0aGlzLmZvcm0sIGZpZWxkc10pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgdGhlIHZhbGlkYXRpb24gZXJyb3JzIGJlaW5nIGhhbmRsZWRcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VmFsaWRhdGlvbkVycm9ycycsIHRoaXMuZm9ybSwgZmllbGRzLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhc3NldHMgcmV0dXJuZWQgYnkgYW4gQUpBWCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgbm8gYXNzZXQgcHJvY2Vzc2luZyB3aWxsIG9jY3VyIGFuZCB0aGlzIHdpbGwgcmV0dXJuIGEgcmVzb2x2ZWQgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4TG9hZEFzc2V0c2AgZXZlbnQuIFRoaXMgZXZlbnQgaXMgY29uc2lkZXJlZCBibG9ja2luZywgYW5kXG4gICAgICogYWxsb3dzIGFzc2V0cyB0byBiZSBsb2FkZWQgb3IgcHJvY2Vzc2VkIGJlZm9yZSBjb250aW51aW5nIHdpdGggYW55IGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhc3NldHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBwcm9jZXNzQXNzZXRzKGFzc2V0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4TG9hZEFzc2V0cycsIGFzc2V0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlybXMgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgdXNlciBiZWZvcmUgcHJvY2VlZGluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIG1ldGhvZC4gQnkgZGVmYXVsdCwgaXQgd2lsbCB1c2UgdGhlIGJyb3dzZXIncyBgY29uZmlybSgpYCBtZXRob2QgdG8gcXVlcnkgdGhlIHVzZXIgdG9cbiAgICAgKiBjb25maXJtIHRoZSBhY3Rpb24uIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgUHJvbWlzZSB3aXRoIGEgYm9vbGVhbiB2YWx1ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdXNlciBjb25maXJtZWRcbiAgICAgKiBvciBub3QuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheENvbmZpcm1NZXNzYWdlYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUNvbmZpcm1NZXNzYWdlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlcixcbiAgICAgKiB0aGUgY29uZmlybWF0aW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIGRlbmllZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFzeW5jIGRvQ29uZmlybSgpIHtcbiAgICAgICAgLy8gQWxsb3cgZm9yIGEgY3VzdG9tIGhhbmRsZXIgZm9yIHRoZSBjb25maXJtYXRpb24sIHBlciByZXF1ZXN0LlxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVDb25maXJtTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVDb25maXJtTWVzc2FnZS5hcHBseSh0aGlzLCBbdGhpcy5jb25maXJtXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIHBsdWdpbnMgaGF2ZSBjdXN0b21pc2VkIHRoZSBjb25maXJtYXRpb24sIHVzZSBhIHNpbXBsZSBicm93c2VyIGNvbmZpcm1hdGlvbi5cbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmxpc3RlbnNUb0V2ZW50KCdhamF4Q29uZmlybU1lc3NhZ2UnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuY29uZmlybSh0aGlzLmNvbmZpcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIGN1c3RvbSBwbHVnaW4gY29uZmlybWF0aW9uc1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMuc25vd2JvYXJkLmdsb2JhbFByb21pc2VFdmVudCgnYWpheENvbmZpcm1NZXNzYWdlJywgdGhpcy5jb25maXJtLCB0aGlzKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZnVsZmlsbGVkID0gYXdhaXQgcHJvbWlzZXM7XG4gICAgICAgICAgICBpZiAoZnVsZmlsbGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyBvZmYgY29tcGxldGlvbiBldmVudHMgZm9yIHRoZSBSZXF1ZXN0LlxuICAgICAqL1xuICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBsZXRlICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb21wbGV0ZSh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhEb25lJywgdGhpcy5yZXNwb25zZURhdGEsIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4QWx3YXlzJyk7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIGV2ZW50LnJlc3BvbnNlRGF0YSA9IHRoaXMucmVzcG9uc2VEYXRhO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VFcnJvciA9IHRoaXMucmVzcG9uc2VFcnJvcjtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcmUgb2ZmIHRoZSBkZXN0cnVjdG9yXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICBnZXQgZm9ybSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5mb3JtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMub3B0aW9ucy5mb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZm9ybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICB9XG5cbiAgICBnZXQgY29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlcixcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgaGVhZGVycygpIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywgLy8gS2VlcHMgY29tcGF0aWJpbGl0eSB3aXRoIGpRdWVyeSBBSkFYXG4gICAgICAgICAgICAnWC1XSU5URVItUkVRVUVTVC1IQU5ETEVSJzogdGhpcy5oYW5kbGVyLFxuICAgICAgICAgICAgJ1gtV0lOVEVSLVJFUVVFU1QtUEFSVElBTFMnOiB0aGlzLmV4dHJhY3RQYXJ0aWFscyh0aGlzLm9wdGlvbnMudXBkYXRlIHx8IFtdKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5mbGFzaCkge1xuICAgICAgICAgICAgaGVhZGVyc1snWC1XSU5URVItUkVRVUVTVC1GTEFTSCddID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnhzcmZUb2tlbikge1xuICAgICAgICAgICAgaGVhZGVyc1snWC1YU1JGLVRPS0VOJ10gPSB0aGlzLnhzcmZUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH1cblxuICAgIGdldCBsb2FkaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvYWRpbmcgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy51cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuXG4gICAgZ2V0IHJlZGlyZWN0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5yZWRpcmVjdCAmJiB0aGlzLm9wdGlvbnMucmVkaXJlY3QubGVuZ3RoKSA/IHRoaXMub3B0aW9ucy5yZWRpcmVjdCA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGZsYXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZsYXNoIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBmaWxlcygpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWxlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKEZvcm1EYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5kZWJ1ZygnVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgZmlsZSB1cGxvYWRzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgeHNyZlRva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuY29va2llKCkuZ2V0KCdYU1JGLVRPS0VOJyk7XG4gICAgfVxuXG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAodHlwZW9mIHRoaXMub3B0aW9ucy5kYXRhID09PSAnb2JqZWN0JykgPyB0aGlzLm9wdGlvbnMuZGF0YSA6IHt9O1xuXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKHRoaXMuZm9ybSB8fCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb25maXJtIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHBhcnRpYWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHVwZGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZXh0cmFjdFBhcnRpYWxzKHVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModXBkYXRlKS5qb2luKCcmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhbiBlcnJvciB3aXRoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBBSkFYIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZCBvciBwcm9jZXNzZWQgY29ycmVjdGx5IGR1ZSB0byBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4Y2VwdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpbmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0cmFjZVxuICAgICAqIEByZXR1cm5zIHtFcnJvcn1cbiAgICAgKi9cbiAgICByZW5kZXJFcnJvcihtZXNzYWdlLCBleGNlcHRpb24sIGZpbGUsIGxpbmUsIHRyYWNlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5leGNlcHRpb24gPSBleGNlcHRpb24gfHwgbnVsbDtcbiAgICAgICAgZXJyb3IuZmlsZSA9IGZpbGUgfHwgbnVsbDtcbiAgICAgICAgZXJyb3IubGluZSA9IGxpbmUgfHwgbnVsbDtcbiAgICAgICAgZXJyb3IudHJhY2UgPSB0cmFjZSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBhIGdpdmVuIHN0cmluZyB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCBBSkFYIGhhbmRsZXIgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNIYW5kbGVyTmFtZShuYW1lKSB7XG4gICAgICAgIHJldHVybiAvXig/Olxcdys6ezJ9KT9vbltBLVowLTldLy50ZXN0KG5hbWUpO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRW5hYmxlIERhdGEgQXR0cmlidXRlcyBBUEkgZm9yIEFKQVggcmVxdWVzdHMuXG4gKlxuICogVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGJhc2UgQUpBWCBmdW5jdGlvbmFsaXR5IHRoYXQgaW5jbHVkZXMgaGFuZGxpbmcgb2YgSFRNTCBkYXRhIGF0dHJpYnV0ZXMgZm9yIHByb2Nlc3NpbmdcbiAqIEFKQVggcmVxdWVzdHMuIEl0IGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBiYXNlIEFKQVggZnVuY3Rpb25hbGl0eSB0byBhbGxvdyBkZXZlbG9wZXJzIHRvIG9wdC1vdXQgb2YgZGF0YSBhdHRyaWJ1dGVcbiAqIHJlcXVlc3RzIGlmIHRoZXkgZG8gbm90IGludGVuZCB0byB1c2UgdGhlbS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXR0cmlidXRlUmVxdWVzdCBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogTGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4U2V0dXA6ICdvbkFqYXhTZXR1cCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZHkgZXZlbnQgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBBdHRhY2hlcyBoYW5kbGVycyB0byB0aGUgd2luZG93IHRvIGxpc3RlbiBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIHJlYWR5KCkge1xuICAgICAgICB0aGlzLmF0dGFjaEhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZURlZmF1bHRGb3JtVmFsaWRhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3JlcXVlc3QnLCAnanNvblBhcnNlciddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBEZXRhY2hlcyBhbGwgaGFuZGxlcnMuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoSGFuZGxlcnMoKTtcblxuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBuZWNlc3NhcnkgaGFuZGxlcnMgZm9yIGFsbCByZXF1ZXN0IGludGVyYWN0aW9ucy5cbiAgICAgKi9cbiAgICBhdHRhY2hIYW5kbGVycygpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4gdGhpcy5jaGFuZ2VIYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMua2V5RG93bkhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChldmVudCkgPT4gdGhpcy5zdWJtaXRIYW5kbGVyKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgZGVmYXVsdCBmb3JtIHZhbGlkYXRpb24gZm9yIEFKQVggZm9ybXMuXG4gICAgICpcbiAgICAgKiBBIGZvcm0gdGhhdCBjb250YWlucyBhIGBkYXRhLXJlcXVlc3RgIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGFuIEFKQVggY2FsbCB3aXRob3V0IGluY2x1ZGluZyBhIGBkYXRhLWJyb3dzZXItdmFsaWRhdGVgXG4gICAgICogYXR0cmlidXRlIG1lYW5zIHRoYXQgdGhlIEFKQVggY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBsaWtlbHkgYmUgaGFuZGxpbmcgdGhlIHZhbGlkYXRpb24gaW5zdGVhZC5cbiAgICAgKi9cbiAgICBkaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uKCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdmb3JtW2RhdGEtcmVxdWVzdF06bm90KFtkYXRhLWJyb3dzZXItdmFsaWRhdGVdKScpLmZvckVhY2goKGZvcm0pID0+IHtcbiAgICAgICAgICAgIGZvcm0uc2V0QXR0cmlidXRlKCdub3ZhbGlkYXRlJywgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGFjaGVzIHRoZSBuZWNlc3NhcnkgaGFuZGxlcnMgZm9yIGFsbCByZXF1ZXN0IGludGVyYWN0aW9ucy5cbiAgICAgKi9cbiAgICBkZXRhY2hIYW5kbGVycygpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4gdGhpcy5jaGFuZ2VIYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMua2V5RG93bkhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChldmVudCkgPT4gdGhpcy5zdWJtaXRIYW5kbGVyKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjaGFuZ2VzIHRvIHNlbGVjdCwgcmFkaW8sIGNoZWNrYm94IGFuZCBmaWxlIGlucHV0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgY2hhbmdlSGFuZGxlcihldmVudCkge1xuICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBjaGFuZ2luZyBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhcbiAgICAgICAgICAgICdzZWxlY3RbZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1yYWRpb11bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1jaGVja2JveF1bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1maWxlXVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgY2xpY2tzIG9uIGh5cGVybGlua3MgYW5kIGJ1dHRvbnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGV2ZW50IGNhbiBidWJibGUgdXAgdGhlIGhpZXJhcmNoeSB0byBmaW5kIGEgc3VpdGFibGUgcmVxdWVzdCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBjbGlja0hhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC50YWdOYW1lICE9PSAnSFRNTCcpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudEVsZW1lbnQubWF0Y2hlcyhcbiAgICAgICAgICAgICAgICAnYVtkYXRhLXJlcXVlc3RdLCBidXR0b25bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1idXR0b25dW2RhdGEtcmVxdWVzdF0sIGlucHV0W3R5cGU9c3VibWl0XVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGtleSBwcmVzc2VzIG9uIGlucHV0c1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBrZXlEb3duSGFuZGxlcihldmVudCkge1xuICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBpbnB1dHRpbmcgaW50byBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhcbiAgICAgICAgICAgICdpbnB1dCcsXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IHR5cGUgaXMgdmFsaWRcbiAgICAgICAgY29uc3QgdmFsaWRUeXBlcyA9IFtcbiAgICAgICAgICAgICdjaGVja2JveCcsXG4gICAgICAgICAgICAnY29sb3InLFxuICAgICAgICAgICAgJ2RhdGUnLFxuICAgICAgICAgICAgJ2RhdGV0aW1lJyxcbiAgICAgICAgICAgICdkYXRldGltZS1sb2NhbCcsXG4gICAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICAgJ2ltYWdlJyxcbiAgICAgICAgICAgICdtb250aCcsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdwYXNzd29yZCcsXG4gICAgICAgICAgICAncmFkaW8nLFxuICAgICAgICAgICAgJ3JhbmdlJyxcbiAgICAgICAgICAgICdzZWFyY2gnLFxuICAgICAgICAgICAgJ3RlbCcsXG4gICAgICAgICAgICAndGV4dCcsXG4gICAgICAgICAgICAndGltZScsXG4gICAgICAgICAgICAndXJsJyxcbiAgICAgICAgICAgICd3ZWVrJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHZhbGlkVHlwZXMuaW5kZXhPZihldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCd0eXBlJykpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiBldmVudC50YXJnZXQubWF0Y2hlcygnKltkYXRhLXJlcXVlc3RdJykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygnKltkYXRhLXRyYWNrLWlucHV0XScpKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrSW5wdXQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgZm9ybSBzdWJtaXNzaW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgc3VibWl0SGFuZGxlcihldmVudCkge1xuICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBzdWJtaXR0aW5nIGEgdmFsaWQgZm9ybVxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ2Zvcm1bZGF0YS1yZXF1ZXN0XScsXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIHJlcXVlc3Qgb24gYSBnaXZlbiBlbGVtZW50LCB1c2luZyBpdHMgZGF0YSBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqL1xuICAgIHByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQuZGF0YXNldDtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gU3RyaW5nKGRhdGEucmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjb25maXJtOiAoJ3JlcXVlc3RDb25maXJtJyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RDb25maXJtKSA6IG51bGwsXG4gICAgICAgICAgICByZWRpcmVjdDogKCdyZXF1ZXN0UmVkaXJlY3QnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdFJlZGlyZWN0KSA6IG51bGwsXG4gICAgICAgICAgICBsb2FkaW5nOiAoJ3JlcXVlc3RMb2FkaW5nJyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RMb2FkaW5nKSA6IG51bGwsXG4gICAgICAgICAgICBmbGFzaDogKCdyZXF1ZXN0Rmxhc2gnIGluIGRhdGEpLFxuICAgICAgICAgICAgZmlsZXM6ICgncmVxdWVzdEZpbGVzJyBpbiBkYXRhKSxcbiAgICAgICAgICAgIGJyb3dzZXJWYWxpZGF0ZTogKCdyZXF1ZXN0QnJvd3NlclZhbGlkYXRlJyBpbiBkYXRhKSxcbiAgICAgICAgICAgIGZvcm06ICgncmVxdWVzdEZvcm0nIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdEZvcm0pIDogbnVsbCxcbiAgICAgICAgICAgIHVybDogKCdyZXF1ZXN0VXJsJyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RVcmwpIDogbnVsbCxcbiAgICAgICAgICAgIHVwZGF0ZTogKCdyZXF1ZXN0VXBkYXRlJyBpbiBkYXRhKSA/IHRoaXMucGFyc2VEYXRhKFN0cmluZyhkYXRhLnJlcXVlc3RVcGRhdGUpKSA6IFtdLFxuICAgICAgICAgICAgZGF0YTogKCdyZXF1ZXN0RGF0YScgaW4gZGF0YSkgPyB0aGlzLnBhcnNlRGF0YShTdHJpbmcoZGF0YS5yZXF1ZXN0RGF0YSkpIDogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQucmVxdWVzdChlbGVtZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIGFuIEFKQVggcmVxdWVzdCB2aWEgSFRNTCBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXF1ZXN0XG4gICAgICovXG4gICAgb25BamF4U2V0dXAocmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gcmVxdWVzdC5lbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmdldFBhcmVudFJlcXVlc3REYXRhKHJlcXVlc3QuZWxlbWVudCksXG4gICAgICAgICAgICAuLi5yZXF1ZXN0Lm9wdGlvbnMuZGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgYnV0dG9uJykgJiYgIXJlcXVlc3QuZm9ybSAmJiBmaWVsZE5hbWUgJiYgIXJlcXVlc3Qub3B0aW9ucy5kYXRhW2ZpZWxkTmFtZV0pIHtcbiAgICAgICAgICAgIGRhdGFbZmllbGROYW1lXSA9IHJlcXVlc3QuZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3Qub3B0aW9ucy5kYXRhID0gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYW5kIGNvbGxhdGVzIGFsbCBkYXRhIGZyb20gZWxlbWVudHMgdXAgdGhlIERPTSBoaWVyYXJjaHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0UGFyZW50UmVxdWVzdERhdGEodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW107XG4gICAgICAgIGxldCBkYXRhID0ge307XG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IHRhcmdldDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzLnJldmVyc2UoKTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YSA9IGVsZW1lbnQuZGF0YXNldDtcblxuICAgICAgICAgICAgaWYgKCdyZXF1ZXN0RGF0YScgaW4gZWxlbWVudERhdGEpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnBhcnNlRGF0YShlbGVtZW50RGF0YS5yZXF1ZXN0RGF0YSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGRhdGEgaW4gdGhlIFdpbnRlci9PY3RvYmVyIEpTT04gZm9ybWF0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHBhcnNlRGF0YShkYXRhKSB7XG4gICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc25vd2JvYXJkLmpzb25wYXJzZXIoKS5wYXJzZShgeyR7ZGF0YX19YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyB0aGUgZGF0YSBhdHRyaWJ1dGUgb24gZWxlbWVudDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0lucHV0KGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyBsYXN0VmFsdWUgfSA9IGVsZW1lbnQuZGF0YXNldDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBlbGVtZW50LmRhdGFzZXQudHJhY2tJbnB1dCB8fCAzMDA7XG5cbiAgICAgICAgaWYgKGxhc3RWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGxhc3RWYWx1ZSA9PT0gZWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFRyYWNrSW5wdXRUaW1lcihlbGVtZW50KTtcblxuICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGFzZXQucmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgaGllcmFyY2h5IGFuZCBmaW5kIGEgZm9ybSB0aGF0IHNlbmRzIGFuIEFKQVggcXVlcnlcbiAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC50YWdOYW1lID09PSAnRk9STScgJiYgY3VycmVudEVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGludGVydmFsKTtcbiAgICB9XG5cbiAgICByZXNldFRyYWNrSW5wdXRUaW1lcihlbGVtZW50KSB7XG4gICAgICAgIGlmIChlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lcik7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5wdXRUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEFzc2V0IExvYWRlci5cbiAqXG4gKiBQcm92aWRlcyBzaW1wbGUgYXNzZXQgbG9hZGluZyBmdW5jdGlvbmFsaXR5IGZvciBTbm93Ym9hcmQsIG1ha2luZyBpdCBlYXN5IHRvIHByZS1sb2FkIGltYWdlcyBvclxuICogaW5jbHVkZSBKYXZhU2NyaXB0IG9yIENTUyBhc3NldHMgb24gdGhlIGZseS5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGlzIGxvYWRlciB3aWxsIGxpc3RlbiB0byBhbnkgYXNzZXRzIHRoYXQgaGF2ZSBiZWVuIHJlcXVlc3RlZCB0byBsb2FkIGluIGFuIEFKQVhcbiAqIHJlc3BvbnNlLCBzdWNoIGFzIHJlc3BvbnNlcyBmcm9tIGEgY29tcG9uZW50LlxuICpcbiAqIFlvdSBjYW4gYWxzbyBsb2FkIGFzc2V0cyBtYW51YWxseSBieSBjYWxsaW5nIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogYGBganNcbiAqIFNub3dib2FyZC5hZGRQbHVnaW4oJ2Fzc2V0TG9hZGVyJywgQXNzZXRMb2FkZXIpO1xuICogU25vd2JvYXJkLmFzc2V0TG9hZGVyKCkucHJvY2Vzc0Fzc2V0cyhhc3NldHMpO1xuICogYGBgXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFzc2V0TG9hZGVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBFdmVudCBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhamF4TG9hZEFzc2V0czogJ2xvYWQnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAndXJsJyxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGFuZCBsb2FkIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIFRoZSBgYXNzZXRzYCBwcm9wZXJ0eSBvZiB0aGlzIG1ldGhvZCByZXF1aXJlcyBhbiBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyBrZXlzIGFuZCBhblxuICAgICAqIGFycmF5IG9mIHBhdGhzOlxuICAgICAqXG4gICAgICogLSBganNgOiBBbiBhcnJheSBvZiBKYXZhU2NyaXB0IFVSTHMgdG8gbG9hZFxuICAgICAqIC0gYGNzc2A6IEFuIGFycmF5IG9mIENTUyBzdHlsZXNoZWV0IFVSTHMgdG8gbG9hZFxuICAgICAqIC0gYGltZ2A6IEFuIGFycmF5IG9mIGltYWdlIFVSTHMgdG8gcHJlLWxvYWRcbiAgICAgKlxuICAgICAqIEJvdGggYGpzYCBhbmQgYGNzc2AgZmlsZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluamVjdGVkLCBob3dldmVyIGBpbWdgIGZpbGVzIHdpbGwgbm90LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgcmVxdWlyZWQgYXNzZXRzIGFyZSBsb2FkZWQuIElmIGFuXG4gICAgICogYXNzZXQgZmFpbHMgdG8gbG9hZCwgdGhpcyBQcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFU0xpbnQgKlJFQUxMWSogZG9lc24ndCBsaWtlIHRoaXMgY29kZSwgYnV0IGlnbm9yZSBpdC4gSXQncyB0aGUgb25seSB3YXkgaXQgd29ya3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXNzZXRzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYXN5bmMgbG9hZChhc3NldHMpIHtcbiAgICAgICAgaWYgKGFzc2V0cy5qcyAmJiBhc3NldHMuanMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2YgYXNzZXRzLmpzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU2NyaXB0KHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXNzZXRzLmNzcyAmJiBhc3NldHMuY3NzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgYXNzZXRzLmNzcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN0eWxlKHN0eWxlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3NldHMuaW1nICYmIGFzc2V0cy5pbWcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpbWFnZSBvZiBhc3NldHMuaW1nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW1hZ2UoaW1hZ2UpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdHMgYW5kIGxvYWRzIGEgSmF2YVNjcmlwdCBVUkwgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogVGhlIHNjcmlwdCB3aWxsIGJlIGFwcGVuZGVkIGJlZm9yZSB0aGUgY2xvc2luZyBgPC9ib2R5PmAgdGFnLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHNjcmlwdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRTY3JpcHQoc2NyaXB0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHNjcmlwdCBVUkxcbiAgICAgICAgICAgIHNjcmlwdCA9IHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KHNjcmlwdCk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2NyaXB0IGlzIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7c2NyaXB0fVwiXWApO1xuICAgICAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBzY3JpcHRcbiAgICAgICAgICAgIGNvbnN0IGRvbVNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgZG9tU2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHNjcmlwdCk7XG4gICAgICAgICAgICBkb21TY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIubG9hZGVkJywgJ3NjcmlwdCcsIHNjcmlwdCwgZG9tU2NyaXB0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnc2NyaXB0Jywgc2NyaXB0LCBkb21TY3JpcHQpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIHNjcmlwdCBmaWxlOiBcIiR7c2NyaXB0fVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChkb21TY3JpcHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmplY3RzIGFuZCBsb2FkcyBhIENTUyBzdHlsZXNoZWV0IGludG8gdGhlIERPTS5cbiAgICAgKlxuICAgICAqIFRoZSBzdHlsZXNoZWV0IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBjbG9zaW5nIGA8L2hlYWQ+YCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBsb2FkU3R5bGUoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgc3R5bGUgVVJMXG4gICAgICAgICAgICBzdHlsZSA9IHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KHN0eWxlKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBzdHlsZXNoZWV0IGlzIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdW2hyZWY9XCIke3N0eWxlfVwiXWApO1xuICAgICAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBzdHlsZXNoZWV0XG4gICAgICAgICAgICBjb25zdCBkb21Dc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBkb21Dc3Muc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpO1xuICAgICAgICAgICAgZG9tQ3NzLnNldEF0dHJpYnV0ZSgnaHJlZicsIHN0eWxlKTtcbiAgICAgICAgICAgIGRvbUNzcy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnc3R5bGUnLCBzdHlsZSwgZG9tQ3NzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvbUNzcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnc3R5bGUnLCBzdHlsZSwgZG9tQ3NzKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBzdHlsZXNoZWV0IGZpbGU6IFwiJHtzdHlsZX1cImApKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZG9tQ3NzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlLWxvYWRzIGFuIGltYWdlLlxuICAgICAqXG4gICAgICogVGhlIGltYWdlIHdpbGwgbm90IGJlIGluamVjdGVkIGludG8gdGhlIERPTS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbWFnZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRJbWFnZShpbWFnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBzY3JpcHQgVVJMXG4gICAgICAgICAgICBpbWFnZSA9IHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KGltYWdlKTtcblxuICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIubG9hZGVkJywgJ2ltYWdlJywgaW1hZ2UsIGltZyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmVycm9yJywgJ2ltYWdlJywgaW1hZ2UsIGltZyk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgaW1hZ2UgZmlsZTogXCIke2ltYWdlfVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbWcuc3JjID0gaW1hZ2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQWxsb3dzIGF0dGFjaGluZyBhIGxvYWRpbmcgY2xhc3Mgb24gZWxlbWVudHMgdGhhdCBhbiBBSkFYIHJlcXVlc3QgaXMgdGFyZ2V0aW5nLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRhY2hMb2FkaW5nIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuaWNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3JlcXVlc3QnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2FqYXhTdGFydCcsXG4gICAgICAgICAgICBhamF4RG9uZTogJ2FqYXhEb25lJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhamF4U3RhcnQocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRFbGVtZW50cyA9IHJlcXVlc3QuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hdHRhY2gtbG9hZGluZ10nKTtcbiAgICAgICAgICAgIGlmIChsb2FkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxvYWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmdldExvYWRpbmdDbGFzcyhlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5lbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmdldExvYWRpbmdDbGFzcyhyZXF1ZXN0LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFqYXhEb25lKGRhdGEsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgICAgICBjb25zdCBsb2FkRWxlbWVudHMgPSByZXF1ZXN0LmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXR0YWNoLWxvYWRpbmddJyk7XG4gICAgICAgICAgICBpZiAobG9hZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2FkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5nZXRMb2FkaW5nQ2xhc3MoZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5nZXRMb2FkaW5nQ2xhc3MocmVxdWVzdC5lbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMb2FkaW5nQ2xhc3MoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gKGVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09ICcnKVxuICAgICAgICAgICAgPyBlbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZ1xuICAgICAgICAgICAgOiAnd24tbG9hZGluZyc7XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIERhdGEgY29uZmlndXJhdGlvbiBwcm92aWRlci5cbiAqXG4gKiBQcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgcGFzc2luZyBjb25maWd1cmF0aW9uIGRhdGEgdGhyb3VnaCBhbiBlbGVtZW50J3MgZGF0YSBhdHRyaWJ1dGVzLiBUaGlzXG4gKiBpcyBnZW5lcmFsbHkgdXNlZCBmb3Igd2lkZ2V0cyBvciBVSSBpbnRlcmFjdGlvbnMgdG8gY29uZmlndXJlIHRoZW0uXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFDb25maWcgZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGx1Z2luQmFzZX0gaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxvY2FsQ29uZmlnXG4gICAgICovXG4gICAgY29uc3RydWN0KGluc3RhbmNlLCBlbGVtZW50LCBsb2NhbENvbmZpZykge1xuICAgICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBQbHVnaW5CYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGEgU25vd2JvYXJkIHBsdWdpbiB0byBlbmFibGUgZGF0YSBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YSBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGV4dHJhY3RlZCBmcm9tIEhUTUwgZWxlbWVudHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5sb2NhbENvbmZpZyA9IGxvY2FsQ29uZmlnIHx8IHt9O1xuICAgICAgICB0aGlzLmluc3RhbmNlQ29uZmlnID0ge307XG4gICAgICAgIHRoaXMuYWNjZXB0ZWRDb25maWdzID0ge307XG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBgY29uZmlnYCBwYXJhbWV0ZXIgaXMgdW5zcGVjaWZpZWQsIHJldHVybnMgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ1xuICAgICAqL1xuICAgIGdldChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlQ29uZmlnW2NvbmZpZ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29uZmlnIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogVGhpcyBhbGxvd3MgeW91IHRvIG92ZXJyaWRlLCBhdCBydW50aW1lLCBhbnkgY29uZmlndXJhdGlvbiB2YWx1ZSBhcyBuZWNlc3NhcnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBwZXJzaXN0XG4gICAgICovXG4gICAgc2V0KGNvbmZpZywgdmFsdWUsIHBlcnNpc3QpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBjb25maWd1cmF0aW9uIGtleSB0byBzZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChwZXJzaXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YXNldFtjb25maWddID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxvY2FsQ29uZmlnW2NvbmZpZ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZnJlc2hlcyB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGFsbG93IHlvdSB0byBtYWtlIGNoYW5nZXMgdG8gdGhlIGRhdGEgY29uZmlnIG9uIGEgRE9NIGxldmVsIGFuZCByZS1hcHBseSB0aGVtXG4gICAgICogdG8gdGhlIGNvbmZpZyBvbiB0aGUgSmF2YVNjcmlwdCBzaWRlLlxuICAgICAqL1xuICAgIHJlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuYWNjZXB0ZWRDb25maWdzID0gdGhpcy5nZXRBY2NlcHRlZENvbmZpZ3MoKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbmZpZyA9IHRoaXMucHJvY2Vzc0NvbmZpZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIGF2YWlsYWJsZSBjb25maWd1cmF0aW9ucyB0aGF0IGNhbiBiZSBzZXQgdGhyb3VnaCB0aGUgZGF0YSBjb25maWcuXG4gICAgICpcbiAgICAgKiBJZiBhbiBpbnN0YW5jZSBoYXMgYW4gYGFjY2VwdEFsbERhdGFDb25maWdzYCBwcm9wZXJ0eSwgc2V0IHRvIGB0cnVlYCwgdGhlbiBhbGwgZGF0YVxuICAgICAqIGF0dHJpYnV0ZXMgd2lsbCBiZSBhdmFpbGFibGUgYXMgY29uZmlndXJhdGlvbiB2YWx1ZXMuIFRoaXMgY2FuIGJlIGEgc2VjdXJpdHkgY29uY2Vybiwgc29cbiAgICAgKiB0cmVhZCBjYXJlZnVsbHkuXG4gICAgICpcbiAgICAgKiBPdGhlcndpc2UsIGF2YWlsYWJsZSBjb25maWd1cmF0aW9ucyB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGtleXMgYXZhaWxhYmxlIGluIGFuIG9iamVjdFxuICAgICAqIHJldHVybmVkIGJ5IGEgYGRlZmF1bHRzKClgIG1ldGhvZCBpbiB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW118Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBY2NlcHRlZENvbmZpZ3MoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuYWNjZXB0QWxsRGF0YUNvbmZpZ3MgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgJiYgdGhpcy5pbnN0YW5jZS5hY2NlcHRBbGxEYXRhQ29uZmlncyA9PT0gdHJ1ZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKSA9PT0gJ29iamVjdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGJlIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgaW5zdGFuY2UgZWl0aGVyIGRvZXMgbm90IGhhdmUgYSBgZGVmYXVsdHMoKWAgbWV0aG9kLCBvclxuICAgICAqIHRoZSBtZXRob2QgaXRzZWxmIGRvZXMgbm90IHJldHVybiBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgICAqL1xuICAgIGdldERlZmF1bHRzKCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlZmF1bHRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogTG9hZHMgdXAgdGhlIGRlZmF1bHRzLCB0aGVuIHBvcHVsYXRlcyBpdCB3aXRoIGFueSBjb25maWd1cmF0aW9uIHZhbHVlcyBwcm92aWRlZCBieSB0aGUgZGF0YVxuICAgICAqIGF0dHJpYnV0ZXMsIGJhc2VkIG9uIHRoZSBydWxlcyBvZiB0aGUgYWNjZXB0ZWQgY29uZmlndXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHRoZW4gY2FjaGVkIGFuZCBhdmFpbGFibGUgdGhyb3VnaCBgY29uZmlnLmdldCgpYCBjYWxscy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgcHJvY2Vzc0NvbmZpZygpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXREZWZhdWx0cygpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ29uZmlncyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmVsZW1lbnQuZGF0YXNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDb25maWdzID09PSB0cnVlIHx8IHRoaXMuYWNjZXB0ZWRDb25maWdzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHRoaXMuY29lcmNlVmFsdWUodGhpcy5lbGVtZW50LmRhdGFzZXRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmxvY2FsQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY2NlcHRlZENvbmZpZ3MgPT09IHRydWUgfHwgdGhpcy5hY2NlcHRlZENvbmZpZ3MuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5sb2NhbENvbmZpZ1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvZXJjZXMgY29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIEphdmFTY3JpcHQuXG4gICAgICpcbiAgICAgKiBUYWtlcyB0aGUgc3RyaW5nIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGRhdGEgYXR0cmlidXRlIGFuZCBjb2VyY2VzIGl0IGludG8gYSBtb3JlIHN1aXRhYmxlXG4gICAgICogdHlwZSBmb3IgSmF2YVNjcmlwdCBwcm9jZXNzaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIGNvZXJjZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKHZhbHVlKTtcblxuICAgICAgICAvLyBOdWxsIHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuZGVmaW5lZCB2YWx1ZVxuICAgICAgICBpZiAoc3RyaW5nVmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFzZTY0IHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZS5zdGFydHNXaXRoKCdiYXNlNjQ6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2U2NHN0ciA9IHN0cmluZ1ZhbHVlLnJlcGxhY2UoL15iYXNlNjQ6LywgJycpO1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGF0b2IoYmFzZTY0c3RyKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvZXJjZVZhbHVlKGRlY29kZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm9vbGVhbiB2YWx1ZVxuICAgICAgICBpZiAoWyd0cnVlJywgJ3llcyddLmluY2x1ZGVzKHN0cmluZ1ZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoWydmYWxzZScsICdubyddLmluY2x1ZGVzKHN0cmluZ1ZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOdW1lcmljIHZhbHVlXG4gICAgICAgIGlmICgvXlstK10/WzAtOV0rKFxcLlswLTldKyk/JC8udGVzdChzdHJpbmdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoc3RyaW5nVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSlNPTiB2YWx1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc25vd2JvYXJkLmpzb25QYXJzZXIoKS5wYXJzZShzdHJpbmdWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoc3RyaW5nVmFsdWUgPT09ICcnKSA/IHRydWUgOiBzdHJpbmdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBQcm92aWRlcyBmbGFzaCBtZXNzYWdlcyBmb3IgdGhlIENNUy5cbiAqXG4gKiBGbGFzaCBtZXNzYWdlcyB3aWxsIHBvcCB1cCBhdCB0aGUgdG9wIGNlbnRlciBvZiB0aGUgcGFnZSBhbmQgd2lsbCByZW1haW4gZm9yIDcgc2Vjb25kcyBieSBkZWZhdWx0LiBIb3ZlcmluZyBvdmVyXG4gKiB0aGUgbWVzc2FnZSB3aWxsIHJlc2V0IGFuZCBwYXVzZSB0aGUgdGltZXIuIENsaWNraW5nIG9uIHRoZSBmbGFzaCBtZXNzYWdlIHdpbGwgZGlzbWlzcyBpdC5cbiAqXG4gKiBBcmd1bWVudHM6XG4gKiAgLSBcIm1lc3NhZ2VcIjogVGhlIGNvbnRlbnQgb2YgdGhlIGZsYXNoIG1lc3NhZ2UuIEhUTUwgaXMgYWNjZXB0ZWQuXG4gKiAgLSBcInR5cGVcIjogVGhlIHR5cGUgb2YgZmxhc2ggbWVzc2FnZS4gVGhpcyBpcyBhcHBlbmRlZCBhcyBhIGNsYXNzIHRvIHRoZSBmbGFzaCBtZXNzYWdlIGl0c2VsZi5cbiAqICAtIFwiZHVyYXRpb25cIjogSG93IGxvbmcgdGhlIGZsYXNoIG1lc3NhZ2Ugd2lsbCBzdGF5IHZpc2libGUgZm9yLCBpbiBzZWNvbmRzLiBEZWZhdWx0OiA3IHNlY29uZHMuXG4gKlxuICogVXNhZ2U6XG4gKiAgICAgIFNub3dib2FyZC5mbGFzaCgnVGhpcyBpcyBhIGZsYXNoIG1lc3NhZ2UnLCAnaW5mbycsIDgpO1xuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbGFzaCBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkdXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdChtZXNzYWdlLCB0eXBlLCBkdXJhdGlvbikge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICdkZWZhdWx0JztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IE51bWJlcihkdXJhdGlvbiB8fCA3KTtcblxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmxhc2ggZHVyYXRpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciwgb3IgemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbGFzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3RyYW5zaXRpb24nXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGVuc3VyZSB0aGUgZmxhc2ggbWVzc2FnZSBpcyByZW1vdmVkIGFuZCB0aW1lb3V0IGlzIGNsZWFyZWQgaWYgdGhlIG1vZHVsZSBpcyByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICBpZiAodGhpcy50aW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lci5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoKSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2ZsYXNoLmNyZWF0ZScsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZmxhc2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5mbGFzaC5pbm5lckhUTUwgPSB0aGlzLm1lc3NhZ2U7XG4gICAgICAgIHRoaXMuZmxhc2guY2xhc3NMaXN0LmFkZCgnZmxhc2gtbWVzc2FnZScsIHRoaXMudHlwZSk7XG4gICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWNvbnRyb2wnKTtcbiAgICAgICAgdGhpcy5mbGFzaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMucmVtb3ZlKCkpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHRoaXMuc3RvcFRpbWVyKCkpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4gdGhpcy5zdGFydFRpbWVyKCkpO1xuXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIuY2xhc3NMaXN0LmFkZCgnZmxhc2gtdGltZXInKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2guYXBwZW5kQ2hpbGQodGhpcy5mbGFzaFRpbWVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2guY2xhc3NMaXN0LmFkZCgnbm8tdGltZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0byBib2R5XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5mbGFzaCk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQudHJhbnNpdGlvbih0aGlzLmZsYXNoLCAnc2hvdycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2ZsYXNoLnJlbW92ZScsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc3RvcFRpbWVyKCk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQudHJhbnNpdGlvbih0aGlzLmZsYXNoLCAnaGlkZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBmbGFzaCBtZXNzYWdlcyBhdmFpbGFibGUgb24gdGhlIHBhZ2UuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgPiBkaXYuZmxhc2gtbWVzc2FnZScpLmZvckVhY2goKGVsZW1lbnQpID0+IGVsZW1lbnQucmVtb3ZlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgdGltZXIgZm9yIHRoaXMgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzdGFydFRpbWVyKCkge1xuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aW1lclRyYW5zID0gdGhpcy5zbm93Ym9hcmQudHJhbnNpdGlvbih0aGlzLmZsYXNoVGltZXIsICd0aW1lb3V0JywgbnVsbCwgYCR7dGhpcy5kdXJhdGlvbn0uMHNgLCB0cnVlKTtcbiAgICAgICAgdGhpcy50aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMucmVtb3ZlKCksIHRoaXMuZHVyYXRpb24gKiAxMDAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHRpbWVyIGZvciB0aGlzIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgc3RvcFRpbWVyKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lclRyYW5zKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVyVHJhbnMuY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIERlZmluZXMgYSBkZWZhdWx0IGxpc3RlbmVyIGZvciBmbGFzaCBldmVudHMuXG4gKlxuICogQ29ubmVjdHMgdGhlIEZsYXNoIHBsdWdpbiB0byB2YXJpb3VzIGV2ZW50cyB0aGF0IHVzZSBmbGFzaCBtZXNzYWdlcy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxhc2hMaXN0ZW5lciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmljZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydmbGFzaCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4RXJyb3JNZXNzYWdlOiAnYWpheEVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICBhamF4Rmxhc2hNZXNzYWdlczogJ2FqYXhGbGFzaE1lc3NhZ2VzJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEbyBmbGFzaCBtZXNzYWdlcyBmb3IgUEhQIGZsYXNoIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY29udHJvbD1cImZsYXNoLW1lc3NhZ2VcIl0nKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNub3dib2FyZC5mbGFzaChcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCxcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuZmxhc2hUeXBlLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5mbGFzaER1cmF0aW9uLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYSBmbGFzaCBtZXNzYWdlIGZvciBBSkFYIGVycm9ycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgYWpheEVycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKG1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgZmxhc2ggbWVzc2FnZXMgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSBBSkFYIGZ1bmN0aW9uYWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZXNcbiAgICAgKi9cbiAgICBhamF4Rmxhc2hNZXNzYWdlcyhtZXNzYWdlcykge1xuICAgICAgICBPYmplY3QuZW50cmllcyhtZXNzYWdlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtjc3NDbGFzcywgbWVzc2FnZV0gPSBlbnRyeTtcbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKG1lc3NhZ2UsIGNzc0NsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEFkZHMgQUpBWC1kcml2ZW4gZm9ybSB2YWxpZGF0aW9uIHRvIFNub3dib2FyZCByZXF1ZXN0cy5cbiAqXG4gKiBEb2N1bWVudGF0aW9uIGZvciB0aGlzIGZlYXR1cmUgY2FuIGJlIGZvdW5kIGhlcmU6XG4gKiBodHRwczovL3dpbnRlcmNtcy5jb20vZG9jcy9zbm93Ym9hcmQvZXh0cmFzI2FqYXgtdmFsaWRhdGlvblxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMiBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtVmFsaWRhdGlvbiBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICB0aGlzLmVycm9yQmFncyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4U3RhcnQ6ICdjbGVhclZhbGlkYXRpb24nLFxuICAgICAgICAgICAgYWpheFZhbGlkYXRpb25FcnJvcnM6ICdkb1ZhbGlkYXRpb24nLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWR5IGV2ZW50IGhhbmRsZXIuXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuY29sbGVjdEVycm9yQmFncyhkb2N1bWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYW4gQUpBWCByZXNwb25zZSBhbmQgcGFzc2VzIHRoZW0gdGhyb3VnaCB0byB0aGUgZXJyb3IgYmFncy5cbiAgICAgKlxuICAgICAqIFRoaXMgaGFuZGxlciByZXR1cm5zIGZhbHNlIHRvIGNhbmNlbCBhbnkgZnVydGhlciB2YWxpZGF0aW9uIGhhbmRsaW5nLCBhbmQgcHJldmVudHMgdGhlIGZsYXNoXG4gICAgICogbWVzc2FnZSB0aGF0IGlzIGRpc3BsYXllZCBieSBkZWZhdWx0IGZvciBmaWVsZCBlcnJvcnMgaW4gQUpBWCByZXF1ZXN0cyBmcm9tIHNob3dpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnZhbGlkRmllbGRzXG4gICAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXF1ZXN0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgZG9WYWxpZGF0aW9uKGZvcm0sIGludmFsaWRGaWVsZHMsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudCAmJiByZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVycm9yQmFncyA9IHRoaXMuZXJyb3JCYWdzLmZpbHRlcigoZXJyb3JCYWcpID0+IGVycm9yQmFnLmZvcm0gPT09IGZvcm0pO1xuICAgICAgICBlcnJvckJhZ3MuZm9yRWFjaCgoZXJyb3JCYWcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yQmFnKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbnkgdmFsaWRhdGlvbiBlcnJvcnMgaW4gdGhlIGdpdmVuIGZvcm0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb21pc2V9IHByb21pc2VcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjbGVhclZhbGlkYXRpb24ocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LnJlcXVlc3RWYWxpZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXF1ZXN0LmZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVycm9yQmFncyA9IHRoaXMuZXJyb3JCYWdzLmZpbHRlcigoZXJyb3JCYWcpID0+IGVycm9yQmFnLmZvcm0gPT09IHJlcXVlc3QuZm9ybSk7XG4gICAgICAgIGVycm9yQmFncy5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlRXJyb3JCYWcoZXJyb3JCYWcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBlcnJvciBiYWdzIChlbGVtZW50cyB3aXRoIFwiZGF0YS12YWxpZGF0ZS1lcnJvclwiIGF0dHJpYnV0ZSkgYW5kIGxpbmtzIHRoZW0gdG8gYVxuICAgICAqIHBsYWNlaG9sZGVyIGFuZCBmb3JtLlxuICAgICAqXG4gICAgICogVGhlIGVycm9yIGJhZ3Mgd2lsbCBiZSBpbml0aWFsbHkgaGlkZGVuLCBhbmQgd2lsbCBvbmx5IHNob3cgd2hlbiB2YWxpZGF0aW9uIGVycm9ycyBvY2N1ci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvb3ROb2RlXG4gICAgICovXG4gICAgY29sbGVjdEVycm9yQmFncyhyb290Tm9kZSkge1xuICAgICAgICByb290Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS12YWxpZGF0ZS1lcnJvcl0sIFtkYXRhLXZhbGlkYXRlLWZvcl0nKS5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGVycm9yQmFnLmNsb3Nlc3QoJ2Zvcm1bZGF0YS1yZXF1ZXN0LXZhbGlkYXRlXScpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVycm9yIGJhZyBkb2VzIG5vdCByZXNpZGUgd2l0aGluIGEgdmFsaWRhdGluZyBmb3JtLCByZW1vdmUgaXRcbiAgICAgICAgICAgIGlmICghZm9ybSkge1xuICAgICAgICAgICAgICAgIGVycm9yQmFnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZXJyb3JCYWcpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluZCBtZXNzYWdlIGxpc3Qgbm9kZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBsZXQgbWVzc2FnZUxpc3RFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChlcnJvckJhZy5tYXRjaGVzKCdbZGF0YS12YWxpZGF0ZS1lcnJvcl0nKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudCA9IGVycm9yQmFnLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1lc3NhZ2VdJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIHBsYWNlaG9sZGVyIG5vZGVcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnJyk7XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGVycm9yIGJhZyBhbmQgcmVwbGFjZSB3aXRoIHBsYWNlaG9sZGVyXG4gICAgICAgICAgICBjb25zdCBlcnJvckJhZ0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogZXJyb3JCYWcsXG4gICAgICAgICAgICAgICAgZm9ybSxcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcjogKGVycm9yQmFnLmRhdGFzZXQudmFsaWRhdGVGb3IpXG4gICAgICAgICAgICAgICAgICAgID8gZXJyb3JCYWcuZGF0YXNldC52YWxpZGF0ZUZvci5zcGxpdCgvXFxzKixcXHMqLylcbiAgICAgICAgICAgICAgICAgICAgOiAnKicsXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50OiAobWVzc2FnZUxpc3RFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VMaXN0RWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0QW5jaG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2U6IChlcnJvckJhZy5kYXRhc2V0LnZhbGlkYXRlRm9yKVxuICAgICAgICAgICAgICAgICAgICA/IChlcnJvckJhZy50ZXh0Q29udGVudCAhPT0gJycgfHwgZXJyb3JCYWcuY2hpbGROb2Rlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gSWYgYW4gbWVzc2FnZSBsaXN0IGVsZW1lbnQgZXhpc3RzLCBjcmVhdGUgYW5vdGhlciBwbGFjZWhvbGRlciB0byBhY3QgYXMgYW4gYW5jaG9yIHBvaW50XG4gICAgICAgICAgICBpZiAobWVzc2FnZUxpc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUxpc3RBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobWVzc2FnZUxpc3RBbmNob3IsIG1lc3NhZ2VMaXN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZXJyb3JCYWdEYXRhLm1lc3NhZ2VMaXN0QW5jaG9yID0gbWVzc2FnZUxpc3RBbmNob3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yQmFnLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHBsYWNlaG9sZGVyLCBlcnJvckJhZyk7XG5cbiAgICAgICAgICAgIHRoaXMuZXJyb3JCYWdzLnB1c2goZXJyb3JCYWdEYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgYW4gZXJyb3IgYmFnLCByZXBsYWNpbmcgdGhlIGVycm9yIG1lc3NhZ2VzIHdpdGggYSBwbGFjZWhvbGRlciBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICovXG4gICAgaGlkZUVycm9yQmFnKGVycm9yQmFnKSB7XG4gICAgICAgIGlmIChlcnJvckJhZy5lbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICBlcnJvckJhZy5lbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVycm9yQmFnLnBsYWNlaG9sZGVyLCBlcnJvckJhZy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIGFuIGVycm9yIGJhZyB3aXRoIHRoZSBnaXZlbiBpbnZhbGlkIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlcnJvckJhZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnZhbGlkRmllbGRzXG4gICAgICovXG4gICAgc2hvd0Vycm9yQmFnKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKSB7XG4gICAgICAgIGlmICghdGhpcy5lcnJvckJhZ1ZhbGlkYXRlc0ZpZWxkKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlcnJvckJhZy5lbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICBlcnJvckJhZy5wbGFjZWhvbGRlci5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlcnJvckJhZy5lbGVtZW50LCBlcnJvckJhZy5wbGFjZWhvbGRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JCYWcudmFsaWRhdGVGb3IgIT09ICcqJykge1xuICAgICAgICAgICAgaWYgKCFlcnJvckJhZy5jdXN0b21NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RGaWVsZCA9IE9iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiBlcnJvckJhZy52YWxpZGF0ZUZvci5pbmNsdWRlcyhmaWVsZCkpXG4gICAgICAgICAgICAgICAgICAgIC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIFtlcnJvckJhZy5lbGVtZW50LmlubmVySFRNTF0gPSBpbnZhbGlkRmllbGRzW2ZpcnN0RmllbGRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yQmFnLm1lc3NhZ2VMaXN0RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHByZXZpb3VzIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICBlcnJvckJhZy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXZhbGlkYXRpb24tbWVzc2FnZV0nKS5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGludmFsaWRGaWVsZHMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgWywgZXJyb3JzXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZXJyb3JCYWcubWVzc2FnZUxpc3RFbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuZGF0YXNldC52YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5pbm5lckhUTUwgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JCYWcubWVzc2FnZUxpc3RBbmNob3IuYWZ0ZXIobWVzc2FnZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBbZXJyb3JCYWcuZWxlbWVudC5pbm5lckhUTUxdID0gaW52YWxpZEZpZWxkc1tPYmplY3Qua2V5cyhpbnZhbGlkRmllbGRzKS5zaGlmdCgpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBnaXZlbiBlcnJvciBiYWcgYXBwbGllcyBmb3IgdGhlIGdpdmVuIGludmFsaWQgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBlcnJvckJhZ1ZhbGlkYXRlc0ZpZWxkKGVycm9yQmFnLCBpbnZhbGlkRmllbGRzKSB7XG4gICAgICAgIGlmIChlcnJvckJhZy52YWxpZGF0ZUZvciA9PT0gJyonKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpbnZhbGlkRmllbGRzKVxuICAgICAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGVycm9yQmFnLnZhbGlkYXRlRm9yLmluY2x1ZGVzKGZpZWxkKSlcbiAgICAgICAgICAgIC5sZW5ndGggPiAwO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRGlzcGxheXMgYSBzdHJpcGUgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSB0aGF0IGluZGljYXRlcyBsb2FkaW5nLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdHJpcGVMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5pY2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgICAgICBhamF4U3RhcnQ6ICdhamF4U3RhcnQnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlYWR5KCkge1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlU3RyaXBlKCk7XG4gICAgfVxuXG4gICAgYWpheFN0YXJ0KHByb21pc2UsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHJlcXVlc3Qub3B0aW9ucy5zdHJpcGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3coKTtcblxuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVTdHJpcGUoKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlTG9hZGVkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnc3RyaXBlLWxvYWRpbmctaW5kaWNhdG9yJywgJ2xvYWRlZCcpO1xuICAgICAgICB0aGlzLnN0cmlwZS5jbGFzc0xpc3QuYWRkKCdzdHJpcGUnKTtcbiAgICAgICAgdGhpcy5zdHJpcGVMb2FkZWQuY2xhc3NMaXN0LmFkZCgnc3RyaXBlLWxvYWRlZCcpO1xuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmFwcGVuZENoaWxkKHRoaXMuc3RyaXBlKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQodGhpcy5zdHJpcGVMb2FkZWQpO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5pbmRpY2F0b3IpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY291bnRlciArPSAxO1xuXG4gICAgICAgIGNvbnN0IG5ld1N0cmlwZSA9IHRoaXMuc3RyaXBlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQobmV3U3RyaXBlKTtcbiAgICAgICAgdGhpcy5zdHJpcGUucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuc3RyaXBlID0gbmV3U3RyaXBlO1xuXG4gICAgICAgIGlmICh0aGlzLmNvdW50ZXIgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkZWQnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd3bi1sb2FkaW5nJyk7XG4gICAgfVxuXG4gICAgaGlkZShmb3JjZSkge1xuICAgICAgICB0aGlzLmNvdW50ZXIgLT0gMTtcblxuICAgICAgICBpZiAoZm9yY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRlciA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb3VudGVyIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd3bi1sb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEVtYmVkcyB0aGUgXCJleHRyYXNcIiBzdHlsZXNoZWV0IGludG8gdGhlIHBhZ2UsIGlmIGl0IGlzIG5vdCBsb2FkZWQgdGhyb3VnaCB0aGUgdGhlbWUuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0eWxlc2hlZXRMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZHk6ICdyZWFkeScsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIGxldCBzdHlsZXNMb2FkZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgc3R5bGVzaGVldCBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nKS5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgICAgICAgIGlmIChjc3MuaHJlZi5lbmRzV2l0aCgnL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9jc3Mvc25vd2JvYXJkLmV4dHJhcy5jc3MnKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlc0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghc3R5bGVzTG9hZGVkKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZXNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgc3R5bGVzaGVldC5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XG4gICAgICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgnaHJlZicsIHRoaXMuc25vd2JvYXJkLnVybCgpLmFzc2V0KCcvbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2Nzcy9zbm93Ym9hcmQuZXh0cmFzLmNzcycpKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVzaGVldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBlbGVtZW50cy5cbiAqXG4gKiBUcmFuc2l0aW9uIGFsbG93cyBDU1MgdHJhbnNpdGlvbnMgdG8gYmUgY29udHJvbGxlZCBhbmQgY2FsbGJhY2tzIHRvIGJlIHJ1biBvbmNlIGNvbXBsZXRlZC4gSXQgd29ya3Mgc2ltaWxhciB0byBWdWVcbiAqIHRyYW5zaXRpb25zIHdpdGggMyBzdGFnZXMgb2YgdHJhbnNpdGlvbiwgYW5kIGNsYXNzZXMgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgd2l0aCB0aGUgdHJhbnNpdGlvbiBuYW1lIHN1ZmZpeGVkIHdpdGhcbiAqIHRoZSBzdGFnZSBvZiB0cmFuc2l0aW9uOlxuICpcbiAqICAtIGBpbmA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgdHJhbnNpdGlvbiwgcmVtb3ZlZCBhZnRlcndhcmRzLiBUaGlzIHNob3VsZCBiZVxuICogICAgICB1c2VkIHRvIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgdHJhbnNpdGlvbi5cbiAqICAtIGBhY3RpdmVgOiBBIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gZGVmaW5lIHRoZVxuICogICAgICB0cmFuc2l0aW9uIGl0c2VsZi5cbiAqICAtIGBvdXRgOiBBIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgdHJhbnNpdGlvbiBhbmQga2VwdCB0byB0aGUgZW5kIG9mIHRoZVxuICogICAgICB0cmFuc2l0aW9uLiBUaGlzIHNob3VsZCBkZWZpbmUgdGhlIGVuZCBzdGF0ZSBvZiB0aGUgdHJhbnNpdGlvbi5cbiAqXG4gKiBVc2FnZTpcbiAqICAgICAgU25vd2JvYXJkLnRyYW5zaXRpb24oZG9jdW1lbnQuZWxlbWVudCwgJ3RyYW5zaXRpb24nLCAoKSA9PiB7XG4gKiAgICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlIGVsZW1lbnQgYWZ0ZXIgNyBzZWNvbmRzJyk7XG4gKiAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICogICAgICB9LCAnN3MnKTtcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhbnNpdGlvbiBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byB0cmFuc2l0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zaXRpb24gVGhlIG5hbWUgb2YgdGhlIHRyYW5zaXRpb24sIHRoaXMgcHJlZml4ZXMgdGhlIHN0YWdlcyBvZiB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgdHJhbnNpdGlvbiBlbmRzLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkdXJhdGlvbiBBbiBvcHRpb25hbCBvdmVycmlkZSBvbiB0aGUgdHJhbnNpdGlvbiBkdXJhdGlvbi4gTXVzdCBiZSBzcGVjaWZpZWQgYXMgJ3MnIChzZWNzKSBvciAnbXMnIChtc2VjcykuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0cmFpbFRvIElmIHRydWUsIHRoZSBcIm91dFwiIGNsYXNzIHdpbGwgcmVtYWluIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICovXG4gICAgY29uc3RydWN0KGVsZW1lbnQsIHRyYW5zaXRpb24sIGNhbGxiYWNrLCBkdXJhdGlvbiwgdHJhaWxUbykge1xuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIEhUTUxFbGVtZW50IG11c3QgYmUgcHJvdmlkZWQgZm9yIHRyYW5zaXRpb25pbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNpdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNpdGlvbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gdHJhbnNpdGlvbjtcblxuICAgICAgICBpZiAoY2FsbGJhY2sgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIG11c3QgYmUgYSB2YWxpZCBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLnBhcnNlRHVyYXRpb24oZHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYWlsVG8gPSAodHJhaWxUbyA9PT0gdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5kb1RyYW5zaXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGV2ZW50IGNsYXNzZXMgdG8gdGhlIGdpdmVuIHRyYW5zaXRpb24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZXZlbnRDbGFzc2VzKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDbGFzc2VzID0ge1xuICAgICAgICAgICAgaW46IGAke3RoaXMudHJhbnNpdGlvbn0taW5gLFxuICAgICAgICAgICAgYWN0aXZlOiBgJHt0aGlzLnRyYW5zaXRpb259LWFjdGl2ZWAsXG4gICAgICAgICAgICBvdXQ6IGAke3RoaXMudHJhbnNpdGlvbn0tb3V0YCxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50Q2xhc3Nlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXR1cm5DbGFzc2VzID0gW107XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50Q2xhc3NlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAoYXJncy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuQ2xhc3Nlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJldHVybkNsYXNzZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkb1RyYW5zaXRpb24oKSB7XG4gICAgICAgIC8vIEFkZCBkdXJhdGlvbiBvdmVycmlkZVxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IHRoaXMuZHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0Q2xhc3NlcygpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRyYW5zaXRpb24gLSBzaG93IFwiaW5cIiBhbmQgXCJhY3RpdmVcIiBjbGFzc2VzXG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCdpbicsICdhY3RpdmUnKS5mb3JFYWNoKChldmVudENsYXNzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChldmVudENsYXNzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgYSB0cmFuc2l0aW9uIGV4aXN0c1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudClbJ3RyYW5zaXRpb24tZHVyYXRpb24nXSAhPT0gJzBzJykge1xuICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgdGhlIHRyYW5zaXRpb24gdG8gZW5kXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB0aGlzLm9uVHJhbnNpdGlvbkVuZCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZXZlbnRDbGFzc2VzKCdpbicpWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5ldmVudENsYXNzZXMoJ291dCcpWzBdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldENsYXNzZXMoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2suYXBwbHkodGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIHRyYW5zaXRpb24gZW5kcy5cbiAgICAgKlxuICAgICAqIFdoZW4gYSB0cmFuc2l0aW9uIGVuZHMsIHRoZSBpbnN0YW5jZSBvZiB0aGUgdHJhbnNpdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGRlc3RydWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBvblRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCdhY3RpdmUnLCAoIXRoaXMudHJhaWxUbykgPyAnb3V0JyA6ICcnKS5mb3JFYWNoKChldmVudENsYXNzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShldmVudENsYXNzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2suYXBwbHkodGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBkdXJhdGlvbiBvdmVycmlkZVxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyBhIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4gdGhpcy5vblRyYW5zaXRpb25FbmQsIHtcbiAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzZXRDbGFzc2VzKCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgZGVzdHJ1Y3RvclxuICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBjbGFzc2VzLCByZW1vdmluZyBhbnkgdHJhbnNpdGlvbiBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVzZXRDbGFzc2VzKCkge1xuICAgICAgICB0aGlzLmV2ZW50Q2xhc3NlcygpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBnaXZlbiBkdXJhdGlvbiBhbmQgY29udmVydHMgaXQgdG8gYSBcIm1zXCIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZHVyYXRpb25cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHBhcnNlRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gL14oWzAtOV0rKFxcLlswLTldKyk/KShtP3MpPyQvLmV4ZWMoZHVyYXRpb24pO1xuICAgICAgICBjb25zdCBhbW91bnQgPSBOdW1iZXIocGFyc2VkWzFdKTtcbiAgICAgICAgY29uc3QgdW5pdCA9IChwYXJzZWRbM10gPT09ICdzJylcbiAgICAgICAgICAgID8gJ3NlYydcbiAgICAgICAgICAgIDogJ21zZWMnO1xuXG4gICAgICAgIHJldHVybiAodW5pdCA9PT0gJ3NlYycpXG4gICAgICAgICAgICA/IGAke2Ftb3VudCAqIDEwMDB9bXNgXG4gICAgICAgICAgICA6IGAke01hdGguZmxvb3IoYW1vdW50KX1tc2A7XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRyaWdnZXJFbnRpdHlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyIFRoZSBzZWxlY3RvciBmb3IgdGhlIHRyaWdnZXIgdGFyZ2V0IGVsZW1lbnQocykuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uZGl0aW9uIFRoZSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHRyaWdnZXIgdG8gZmlyZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gVGhlIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIHRyaWdnZXIgZmlyZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ3x1bmRlZmluZWR9IHBhcmVudCBUaGUgcGFyZW50IGVsZW1lbnQgd2l0aCB3aGljaCB0byBsaW1pdCB0aGUgdHJpZ2dlciBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bWJlcn0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSB0cmlnZ2VyIGV2ZW50LlxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudFtdfSBlbGVtZW50cyBUaGUgdGFyZ2V0IGVsZW1lbnRzIHRoYXQgdGhpcyB0cmlnZ2VyIGFwcGxpZXMgdG8uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJpZ2dlckVsZW1lbnRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgdHJpZ2dlciBldmVudCBuYW1lLlxuICogQHByb3BlcnR5IHtpbnR9IHByaW9yaXR5IFRoZSB0cmlnZ2VyIGV2ZW50IHByaW9yaXR5LlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZXZlbnQgVGhlIHRyaWdnZXIgZXZlbnQgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBUcmlnZ2VyIGhhbmRsZXIgZm9yIEhUTUwgZWxlbWVudHMuXG4gKlxuICogVGhpcyBpcyBhIHJlLWltYWdpbmluZyBvZiB0aGUgSW5wdXQuVHJpZ2dlciBmdW5jdGlvbmFsaXR5IGluIHRoZSBvcmlnaW5hbCBXaW50ZXIgQ01TIGZyYW1ld29yayxcbiAqIGluaXRpYWxpc2VkIHRocm91Z2ggdGhlIGBkYXRhLXRyaWdnZXJgIGF0dHJpYnV0ZXMuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gcmVtYWluaW5nIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsIElucHV0LlRyaWdnZXIgZnVuY3Rpb25hbGl0eSwgdGhpc1xuICogaGFuZGxlciBhZGRzIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBhbmQgY29uZmlndXJhdGlvbiBmb3IgbW9yZSBmbGV4aWJsZSB0cmlnZ2VyIHVzYWdlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly93aW50ZXJjbXMuY29tL2RvY3MvdjEuMi91aS9zY3JpcHQvaW5wdXQtdHJpZ2dlclxuICpcbiAqIEBjb3B5cmlnaHQgMjAyNCBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmlnZ2VyIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3RydWN0KGVsZW1lbnQpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBlbGVtZW50IHRoaXMgaW5zdGFuY2UgaXMgYXR0YWNoZWQgdG8uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPFRyaWdnZXJFbnRpdHk+Pn0gVGhlIHRyaWdnZXJzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyaWdnZXJzID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxUcmlnZ2VyRWxlbWVudD4+fSBBIG1hcCBvZiBlbGVtZW50cyB0aGF0IHRyaWdnZXIgZXZlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ldmVudHMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtNYXA8RWxlbWVudCwgTWFwPHN0cmluZywgRnVuY3Rpb24+Pn0gQSBtYXAgb2YgZWxlbWVudHMgYW5kIHRoZWlyIGV2ZW50IGNvbm5lY3RvcnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbm5lY3RvcnMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgdGhpcy5wYXJzZVRyaWdnZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVHJpZ2dlckV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5ydW5FdmVudHMoKTtcblxuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ3RyaWdnZXJzLnJlYWR5JywgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMucmVzZXRFdmVudHMoKTtcbiAgICAgICAgc3VwZXIuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdGhlIGVsZW1lbnQncyBkYXRhIGF0dHJpYnV0ZXMgYW5kIGRldGVybWluZXMgYXBwbGljYWJsZSB0cmlnZ2Vycy5cbiAgICAgKlxuICAgICAqIFRyaWdnZXIgZGF0YSBhdHRyaWJ1dGVzIG11c3QgYmUgaW4gdGhlIGZvcm1hdCBgZGF0YS10cmlnZ2VyLVtuYW1lXS1bcGFyYW1ldGVyXWAgZm9yIG11bHRpcGxlXG4gICAgICogdHJpZ2dlcnMsIG9yIGBkYXRhLXRyaWdnZXItW3BhcmFtZXRlcl1gIGZvciBzaW5nbGUgdHJpZ2dlcnMuXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmU6XG4gICAgICogIC0gYGNvbmRpdGlvbmAgb3IgYHdoZXJlYDogVGhlIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgbWV0IGZvciB0aGUgdHJpZ2dlciB0byBmaXJlLlxuICAgICAqICAtIGBhY3Rpb25gOiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgdHJpZ2dlciBmaXJlcy5cbiAgICAgKiAgLSBgcGFyZW50YCBvciBgY2xvc2VzdC1wYXJlbnRgOiBUaGUgcGFyZW50IGVsZW1lbnQgd2l0aCB3aGljaCB0byBsaW1pdCB0aGUgdHJpZ2dlciBzY29wZS5cbiAgICAgKlxuICAgICAqIEludGVybmFsbHksIHRoZSB0cmlnZ2VyIG1hcCB1c2VzIHRoZSBgdHJpZ2dlcmAgcGFyYW1ldGVyIHRvIHN0b3JlIHRoZSB0cmlnZ2VyIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIHBhcnNlVHJpZ2dlcnMoKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YXNldCB9ID0gdGhpcy5lbGVtZW50O1xuICAgICAgICB0aGlzLnRyaWdnZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZGF0YXNldCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoLy1bQS1aXS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29udmVydCBjYW1lbENhc2UgdG8gZGFzaC1zdHlsZSBmb3IgZGF0YSBhdHRyaWJ1dGU6ICR7a2V5fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXNoU3R5bGUgPSBrZXkucmVwbGFjZSgvKFtBLVpdKS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuXG4gICAgICAgICAgICBpZiAoZGFzaFN0eWxlICE9PSAndHJpZ2dlcicgJiYgIWRhc2hTdHlsZS5zdGFydHNXaXRoKCd0cmlnZ2VyLScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyUGFydHMgPSAvKFthLXowLTlcXC0uOl9dKz8pKD86KD86LSkoY2xvc2VzdC1wYXJlbnR8Y29uZGl0aW9ufHdoZW58YWN0aW9ufHBhcmVudHxwcmlvcml0eSkpPyQvaS5leGVjKFxuICAgICAgICAgICAgICAgIGRhc2hTdHlsZS5yZXBsYWNlKCd0cmlnZ2VyLScsICcnKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IHRyaWdnZXJOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyVHlwZSA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBbJ3RyaWdnZXInLCAnY29uZGl0aW9uJywgJ2FjdGlvbicsICdwYXJlbnQnLCAnd2hlbicsICdjbG9zZXN0J10uaW5kZXhPZih0cmlnZ2VyUGFydHNbMV0pICE9PSAtMVxuICAgICAgICAgICAgICAgICYmICh0cmlnZ2VyUGFydHNbMV0gIT09ICdjbG9zZXN0JyB8fCAodHJpZ2dlclBhcnRzWzFdID09PSAnY2xvc2VzdCcgJiYgdHJpZ2dlclBhcnRzWzJdID09PSAncGFyZW50JykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IG9yaWdpbmFsIHRyaWdnZXIgZm9ybWF0XG4gICAgICAgICAgICAgICAgdHJpZ2dlck5hbWUgPSAnX19vcmlnaW5hbCc7XG4gICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAodHJpZ2dlclBhcnRzWzFdID09PSAnY2xvc2VzdCcpID8gJ3BhcmVudCcgOiB0cmlnZ2VyUGFydHNbMV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRyaWdnZXJQYXJ0c1syXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgWydjbG9zZXN0LXBhcmVudCcsICdjb25kaXRpb24nLCAnd2hlbicsICdhY3Rpb24nLCAncGFyZW50JywgJ3ByaW9yaXR5J10uaW5kZXhPZih0cmlnZ2VyUGFydHNbMl0pICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgbXVsdGktdHJpZ2dlciBmb3JtYXRcbiAgICAgICAgICAgICAgICBbLCB0cmlnZ2VyTmFtZV0gPSB0cmlnZ2VyUGFydHM7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cmlnZ2VyUGFydHNbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2VzdC1wYXJlbnQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXJlbnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAncGFyZW50JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjb25kaXRpb24nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd3aGVuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ2NvbmRpdGlvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ2FjdGlvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJpb3JpdHknOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAncHJpb3JpdHknO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICd0cmlnZ2VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJzLmhhcyh0cmlnZ2VyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLnNldCh0cmlnZ2VyTmFtZSwgbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcnMuZ2V0KHRyaWdnZXJOYW1lKS5zZXQodHJpZ2dlclR5cGUsIGRhdGFzZXRba2V5XSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmlnZ2VyIGRhdGEgYXR0cmlidXRlIGFmdGVyIHBhcnNpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0W2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRyaWdnZXJzLCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgZG8gbm90IGhhdmUgYXQgbGVhc3QgYSB0cmlnZ2VyIHNlbGVjdG9yLCBhXG4gICAgICAgIC8vIGNvbmRpdGlvbiBhbmQgYW4gYWN0aW9uLCBvciBhcmUgdXNpbmcgaW52YWxpZCBjb25kaXRpb25zIG9yIGFjdGlvbnNcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKHRyaWdnZXIpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRyaWdnZXIuaGFzKCd0cmlnZ2VyJylcbiAgICAgICAgICAgICAgICB8fCAhdHJpZ2dlci5oYXMoJ2NvbmRpdGlvbicpXG4gICAgICAgICAgICAgICAgfHwgIXRyaWdnZXIuaGFzKCdhY3Rpb24nKVxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIHx8ICF0aGlzLmlzVmFsaWRDb25kaXRpb24odHJpZ2dlcilcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5pc1ZhbGlkQWN0aW9uKHRyaWdnZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ2VsZW1lbnRzJywgZWxlbWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlci5oYXMoJ3ByaW9yaXR5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ3ByaW9yaXR5JywgMTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGNvbW1hbmQgZ2l2ZW4gYXMgZWl0aGVyIGEgY29uZGl0aW9uIG9yIGFuIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIENvbW1hbmRzIGFyZSBmb3JtYXR0ZWQgYXM6IG5hbWU6cGFyYW1ldGVyMSxwYXJhbWV0ZXIyLHBhcmFtZXRlcjMsIGFsdGhvdWdoIHdlIGFsc28gc3VwcG9ydFxuICAgICAqIHRoZSBvbGQgZm9ybWF0IG9mIHZhbHVlW3BhcmFtZXRlcjEscGFyYW1ldGVyMixwYXJhbWV0ZXIzXSBmb3IgdGhlIGB2YWx1ZWAgY29tbWFuZCBvbmx5LlxuICAgICAqXG4gICAgICogSWYgYSBwYXJhbWV0ZXIgcmVxdWlyZXMgYSBjb21tYSB3aXRoaW4sIHRoZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcXVvdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRcbiAgICAgKiBAcmV0dXJucyB7bmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJzOiBzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBwYXJzZUNvbW1hbmQoY29tbWFuZCkge1xuICAgICAgICAvLyBTdXBwb3J0IG9sZC1mb3JtYXQgdmFsdWUgY29tbWFuZCAodmFsdWVbZm9vLGJhcl0pXG4gICAgICAgIGlmIChjb21tYW5kLnN0YXJ0c1dpdGgoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tbWFuZC5tYXRjaCgvW15bXFxdXSsoPz1dKS9nKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBTcGxpdCB2YWx1ZXMgd2l0aCBjb21tYXNcbiAgICAgICAgICAgIG1hdGNoLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFZhbHVlcyA9IHZhbHVlLnJlcGxhY2UoLyhcIlteXCJdKlwiKXwoJ1teJ10qJykvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChzcGxpdFZhbHVlKSA9PiBzcGxpdFZhbHVlLnJlcGxhY2UoL1xcfFxcfFxcfC9nLCAnLCcpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpLnRyaW0oKSk7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCguLi5zcGxpdFZhbHVlcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHZhbHVlcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbW1hbmQuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjb21tYW5kLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtuYW1lLCBwYXJhbWV0ZXJzXSA9IGNvbW1hbmQuc3BsaXQoJzonLCAyKTtcblxuICAgICAgICBpZiAoIXBhcmFtZXRlcnMuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtwYXJhbWV0ZXJzXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdFZhbHVlcyA9IHBhcmFtZXRlcnMucmVwbGFjZSgvKFwiW15cIl0qXCIpfCgnW14nXSonKS9nLCAocXVvdGVkKSA9PiBxdW90ZWQucmVwbGFjZSgvLC9nLCAnfHx8JykpXG4gICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcCgoc3BsaXRWYWx1ZSkgPT4gc3BsaXRWYWx1ZS5yZXBsYWNlKC9cXHxcXHxcXHwvZywgJywnKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS50cmltKCkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogc3BsaXRWYWx1ZXMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFueSBlbGVtZW50cyBhcmUgYWNjZXNzaWJsZSBieSB0aGUgcHJvdmlkZWQgdHJpZ2dlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWFwPFRyaWdnZXJFbnRpdHk+fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50W119XG4gICAgICovXG4gICAgZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKHRyaWdnZXIpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIuaGFzKCdwYXJlbnQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbGVtZW50LmNsb3Nlc3QodHJpZ2dlci5nZXQoJ3BhcmVudCcpKS5xdWVyeVNlbGVjdG9yQWxsKHRyaWdnZXIuZ2V0KCd0cmlnZ2VyJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlci5nZXQoJ3RyaWdnZXInKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb3ZpZGVkIHRyaWdnZXIgY29uZGl0aW9uIGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNWYWxpZENvbmRpdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnY2hlY2tlZCcsXG4gICAgICAgICAgICAndW5jaGVja2VkJyxcbiAgICAgICAgICAgICdlbXB0eScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ29uZW9mJyxcbiAgICAgICAgICAgICdhbGxvZicsXG4gICAgICAgICAgICAnZm9jdXMnLFxuICAgICAgICAgICAgJ2JsdXInLFxuICAgICAgICBdLmluY2x1ZGVzKHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdjb25kaXRpb24nKSkubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm92aWRlZCB0cmlnZ2VyIGFjdGlvbiBpcyB2YWxpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzVmFsaWRBY3Rpb24odHJpZ2dlcikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3Nob3cnLFxuICAgICAgICAgICAgJ2hpZGUnLFxuICAgICAgICAgICAgJ2VuYWJsZScsXG4gICAgICAgICAgICAnZGlzYWJsZScsXG4gICAgICAgICAgICAnZW1wdHknLFxuICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICdjaGVjaycsXG4gICAgICAgICAgICAndW5jaGVjaycsXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ2F0dHInLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnYWN0aW9uJykpLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRyaWdnZXIgZXZlbnRzIG9uIHRyaWdnZXIgYW5kIHRhcmdldCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBjcmVhdGVUcmlnZ2VyRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgcGFyYW1ldGVycyB9ID0gdGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2NvbmRpdGlvbicpKTtcblxuICAgICAgICAgICAgc3dpdGNoIChuYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnb25lb2YnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlRXZlbnQodHJpZ2dlciwgZmFsc2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhbGxvZic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsdWVFdmVudCh0cmlnZ2VyLCB0cnVlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZW1wdHknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVtcHR5RXZlbnQodHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3VuY2hlY2tlZCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hlY2tlZEV2ZW50KHRyaWdnZXIsIChuYW1lID09PSAnY2hlY2tlZCcpLCBwYXJhbWV0ZXJzWzBdID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0cmlnZ2VyIHRoYXQgZmlyZXMgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHRhcmdldCBlbGVtZW50KHMpIG1hdGNoZXMgb25lIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEBwYXJhbSAgey4uLnN0cmluZ30gdmFsdWVzXG4gICAgICovXG4gICAgY3JlYXRlVmFsdWVFdmVudCh0cmlnZ2VyLCBhbGwsIC4uLnZhbHVlcykge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9ZmlsZV0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRoaXNFdmVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlcy5hZGQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFsbCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiBlbGVtZW50VmFsdWVzLmhhcyh2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24odHJpZ2dlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZXMuc29tZSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24odHJpZ2dlciwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdjbGljaycsICgpID0+IHRoaXNFdmVudCgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2lucHV0JywgKCkgPT4gdGhpc0V2ZW50KCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gdGhlcmUgaXMgbm8gdmFsdWUgd2l0aGluIHRoZSB0YXJnZXQgZWxlbWVudChzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqL1xuICAgIGNyZWF0ZUVtcHR5RXZlbnQodHJpZ2dlcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRoaXNFdmVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0cmlnZ2VyLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2NsaWNrJywgKCkgPT4gdGhpc0V2ZW50KCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnaW5wdXQnLCAoKSA9PiB0aGlzRXZlbnQoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0cmlnZ2VyIHRoYXQgZmlyZXMgd2hlbiBhIHRhcmdldCBlbGVtZW50IGlzIGNoZWNrZWQvdW5jaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjaGVja2VkIElmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBjaGVja2VkIG9yIHVuY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGF0TGVhc3QgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgbXVzdCBiZSBjaGVja2VkLlxuICAgICAqICBEZWZhdWx0cyB0byAxIGlmIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBjcmVhdGVDaGVja2VkRXZlbnQodHJpZ2dlciwgY2hlY2tlZCwgYXRMZWFzdCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnRzIGNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9cmFkaW9dLCBpbnB1dFt0eXBlPWNoZWNrYm94XScpKSB7XG4gICAgICAgICAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0aGlzRXZlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWVzID0gbmV3IFNldCgpO1xuXG4gICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQgPT09IGVsZW1lbnQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgYXRMZWFzdENvdW50ID0gYXRMZWFzdCA/IE51bWJlcihhdExlYXN0KSA6IDE7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50VmFsdWVzLnNpemUgPj0gYXRMZWFzdENvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHRyaWdnZXIsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24odHJpZ2dlciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2NsaWNrJywgKCkgPT4gdGhpc0V2ZW50KCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGV2ZW50IHRvIGFuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHJlZ2lzdGVycyB0aGUgZXZlbnQgaW4gdGhlIGBldmVudHNgIG1hcCBmb3IgbGF0ZXIgdXNhZ2UgYW5kIHJlbW92YWwsIGFuZCBhZGRzIGFcbiAgICAgKiBjb25uZWN0b3IgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBldmVudCwgc28gdGhhdCB3ZSBtYXkgZW5hYmxlIHByaW9yaXRpc2F0aW9uIGFuZCBjb250cm9sIG92ZXJcbiAgICAgKiB0aGUgZmlyaW5nIG9mIHRoZSBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRzLmhhcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc2V0KGVsZW1lbnQsIG5ldyBTZXQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBldmVudE5hbWUsXG4gICAgICAgICAgICBwcmlvcml0eTogTnVtYmVyKHRyaWdnZXIuZ2V0KCdwcmlvcml0eScpKSxcbiAgICAgICAgICAgIGV2ZW50OiBjYWxsYmFjayxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5nZXQoZWxlbWVudCkuYWRkKGV2ZW50KTtcblxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdG9ycy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9ycy5zZXQoZWxlbWVudCwgbmV3IE1hcCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuc2V0KGV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZ2V0KGVsZW1lbnQpLmZvckVhY2goKGVsZW1lbnRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEV2ZW50LmV2ZW50TmFtZSA9PT0gZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaChlbGVtZW50RXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoZWxlbWVudEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RXZlbnQuZXZlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdGhpcy5jb25uZWN0b3JzLmdldChlbGVtZW50KS5nZXQoZXZlbnROYW1lKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBydW5FdmVudHMoKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5mb3JFYWNoKChlbGVtZW50Q29ubmVjdG9ycykgPT4ge1xuICAgICAgICAgICAgZWxlbWVudENvbm5lY3RvcnMuZm9yRWFjaCgoY29ubmVjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdG9yKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVzZXRFdmVudHMoKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5mb3JFYWNoKChlbGVtZW50Q29ubmVjdG9ycywgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudENvbm5lY3RvcnMuZm9yRWFjaCgoY29ubmVjdG9yLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgY29ubmVjdG9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbm5lY3RvcnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5ldmVudHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBleGVjdXRlQWN0aW9uKHRyaWdnZXIsIGNvbmRpdGlvbk1ldCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIHBhcmFtZXRlcnMgfSA9IHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdhY3Rpb24nKSk7XG5cbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdzaG93JzpcbiAgICAgICAgICAgIGNhc2UgJ2hpZGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uU2hvdyh0cmlnZ2VyLCAobmFtZSA9PT0gJ3Nob3cnKSA/IGNvbmRpdGlvbk1ldCA6ICFjb25kaXRpb25NZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFjdGlvblNob3codHJpZ2dlciwgc2hvdykge1xuICAgICAgICBpZiAoc2hvdyAmJiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCkuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsRGlzcGxheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXk7XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3cgJiYgZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5ID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFmdGVyQWN0aW9uKHRyaWdnZXIpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZGVidWcoJ1RyaWdnZXIgZmlyZWQnLCB0aGlzLmVsZW1lbnQsIHRyaWdnZXIpO1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgndHJpZ2dlci5maXJlZCcsIHRoaXMuZWxlbWVudCwgdHJpZ2dlcik7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBJbnRlcm5hbCBwcm94eSBmb3IgU25vd2JvYXJkLlxuICpcbiAqIFRoaXMgaGFuZGxlciB3cmFwcyB0aGUgU25vd2JvYXJkIGluc3RhbmNlIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBwbHVnaW4gaW5zdGFuY2VzLlxuICogSXQgcHJldmVudHMgYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kczpcbiAqICAtIGBhdHRhY2hBYnN0cmFjdHNgOiBObyBuZWVkIHRvIGF0dGFjaCBhYnN0cmFjdHMgYWdhaW4uXG4gKiAgLSBgbG9hZFV0aWx0aWVzYDogTm8gbmVlZCB0byBsb2FkIHV0aWxpdGllcyBhZ2Fpbi5cbiAqICAtIGBpbml0aWFsaXNlYDogU25vd2JvYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQuXG4gKiAgLSBgaW5pdGlhbGlzZVNpbmdsZXRvbnNgOiBTaW5nbGV0b25zIGFyZSBhbHJlYWR5IGluaXRpYWxpc2VkLlxuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoWydhdHRhY2hBYnN0cmFjdHMnLCAnbG9hZFV0aWxpdGllcycsICdpbml0aWFsaXNlJywgJ2luaXRpYWxpc2VTaW5nbGV0b25zJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBjYW5ub3QgdXNlIHRoZSBcIiR7cHJvcH1cIiBTbm93Ym9hcmQgbWV0aG9kIHdpdGhpbiBhIHBsdWdpbi5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBSZWZsZWN0LmdldCh0YXJnZXQsICdwbHVnaW5zJylbcHJvcExvd2VyXS5nZXRJbnN0YW5jZSguLi5wYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKFsnYXR0YWNoQWJzdHJhY3RzJywgJ2xvYWRVdGlsaXRpZXMnLCAnaW5pdGlhbGlzZScsICdpbml0aWFsaXNlU2luZ2xldG9ucyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxufTtcbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcbmltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5pbXBvcnQgSW5uZXJQcm94eUhhbmRsZXIgZnJvbSAnLi9Jbm5lclByb3h5SGFuZGxlcic7XG5cbi8qKlxuICogUGx1Z2luIGxvYWRlciBjbGFzcy5cbiAqXG4gKiBUaGlzIGlzIGEgcHJvdmlkZXIgKGZhY3RvcnkpIGNsYXNzIGZvciBhIHNpbmdsZSBwbHVnaW4gYW5kIHByb3ZpZGVzIHRoZSBsaW5rIGJldHdlZW4gU25vd2JvYXJkIGZyYW1ld29yayBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgdGhlIHVuZGVybHlpbmcgcGx1Z2luIGluc3RhbmNlcy4gSXQgYWxzbyBwcm92aWRlcyBzb21lIGJhc2ljIG1vY2tpbmcgb2YgcGx1Z2luIG1ldGhvZHMgZm9yIHRlc3RpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkxvYWRlciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBCaW5kcyB0aGUgV2ludGVyIGZyYW1ld29yayB0byB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7U25vd2JvYXJkfSBzbm93Ym9hcmRcbiAgICAgKiBAcGFyYW0ge1BsdWdpbkJhc2V9IGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSwgc25vd2JvYXJkLCBpbnN0YW5jZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNub3dib2FyZCA9IG5ldyBQcm94eShcbiAgICAgICAgICAgIHNub3dib2FyZCxcbiAgICAgICAgICAgIElubmVyUHJveHlIYW5kbGVyLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgICAgICAgLy8gRnJlZXplIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGlzIGxvYWRlclxuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuaW5zdGFuY2UpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzID0gW107XG4gICAgICAgIHRoaXMuc2luZ2xldG9uID0ge1xuICAgICAgICAgICAgaW5pdGlhbGlzZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICAvLyBQcmV2ZW50IGZ1cnRoZXIgZXh0ZW5zaW9uIG9mIHRoZSBzaW5nbGV0b24gc3RhdHVzIG9iamVjdFxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzLnNpbmdsZXRvbik7XG5cbiAgICAgICAgdGhpcy5tb2NrcyA9IHt9O1xuICAgICAgICB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zID0ge307XG5cbiAgICAgICAgLy8gRnJlZXplIGxvYWRlciBpdHNlbGZcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShQbHVnaW5Mb2FkZXIucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBoYXMgYSBzcGVjaWZpYyBtZXRob2QgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgY3VycmVudCBwbHVnaW4gaXMgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzTWV0aG9kKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHR5cGVvZiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBwcm90b3R5cGUgbWV0aG9kIGZvciBhIHBsdWdpbi4gVGhpcyBzaG91bGQgZ2VuZXJhbGx5IGJlIHVzZWQgZm9yIFwic3RhdGljXCIgY2FsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqIEBwYXJhbSB7Li4ufSBhcmdzXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBjYWxsTWV0aG9kKC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYXJncy5zaGlmdCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXShhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIC0gSWYgdGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHBsdWdpbiwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogLSBJZiB0aGlzIGlzIGEgc2luZ2xldG9uLCB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBwbHVnaW4gd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5CYXNlfEZ1bmN0aW9ufVxuICAgICAqL1xuICAgIGdldEluc3RhbmNlKC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVubWV0ID0gdGhpcy5nZXREZXBlbmRlbmNpZXMoKS5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLnNub3dib2FyZC5nZXRQbHVnaW5OYW1lcygpLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFwiJHt0aGlzLm5hbWV9XCIgcGx1Z2luIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGx1Z2luczogJHt1bm1ldC5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpc2VTaW5nbGV0b24oLi4ucGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IG1vY2tlZCBtZXRob2RzXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5tb2NrcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMub3JpZ2luYWxGdW5jdGlvbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm1vY2tzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gKC4uLnBhcmFtcykgPT4gY2FsbGJhY2sodGhpcywgLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgbW9ja2VkIG1ldGhvZHMgdG8gcHJvdG90eXBlXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm1vY2tzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm9yaWdpbmFsRnVuY3Rpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm1vY2tzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9ICguLi5wYXJhbXMpID0+IGNhbGxiYWNrKHRoaXMsIC4uLnBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMuaW5zdGFuY2UodGhpcy5zbm93Ym9hcmQsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBuZXdJbnN0YW5jZS5kZXRhY2ggPSAoKSA9PiB0aGlzLmluc3RhbmNlcy5zcGxpY2UodGhpcy5pbnN0YW5jZXMuaW5kZXhPZihuZXdJbnN0YW5jZSksIDEpO1xuICAgICAgICBuZXdJbnN0YW5jZS5jb25zdHJ1Y3QoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpO1xuXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgcGx1Z2luLlxuICAgICAqXG4gICAgICogSWYgdGhpcyBwbHVnaW4gaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBwbHVnaW4sIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luQmFzZVtdfVxuICAgICAqL1xuICAgIGdldEluc3RhbmNlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaXMgYSBzaW1wbGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0Z1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB0aGlzLmluc3RhbmNlID09PSAnZnVuY3Rpb24nICYmIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlIGluc3RhbmNlb2YgUGx1Z2luQmFzZSA9PT0gZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgc2luZ2xldG9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTaW5nbGV0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFNpbmdsZXRvbiA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgc2luZ2xldG9uIGhhcyBiZWVuIGluaXRpYWxpc2VkLlxuICAgICAqXG4gICAgICogTm9ybWFsIHBsdWdpbnMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0luaXRpYWxpc2VkKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24uaW5pdGlhbGlzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGluaXRpYWxpc2VTaW5nbGV0b24oLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAoIXRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgdGhpcy5pbnN0YW5jZSh0aGlzLnNub3dib2FyZCwgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIG5ld0luc3RhbmNlLmRldGFjaCA9ICgpID0+IHRoaXMuaW5zdGFuY2VzLnNwbGljZSh0aGlzLmluc3RhbmNlcy5pbmRleE9mKG5ld0luc3RhbmNlKSwgMSk7XG4gICAgICAgIG5ld0luc3RhbmNlLmNvbnN0cnVjdCguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChuZXdJbnN0YW5jZSk7XG4gICAgICAgIHRoaXMuc2luZ2xldG9uLmluaXRpYWxpc2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGN1cnJlbnQgcGx1Z2luLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldERlcGVuZGVuY2llcygpIHtcbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb25zIGNhbm5vdCBoYXZlIGRlcGVuZGVuY2llcy5cbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBkZXBlbmRlbmN5IG1ldGhvZCBzcGVjaWZpZWQuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUuZGVwZW5kZW5jaWVzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUuZGVwZW5kZW5jaWVzKCkubWFwKChpdGVtKSA9PiBpdGVtLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGhhcyBhbGwgaXRzIGRlcGVuZGVuY2llcyBmdWxmaWxsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgICAgICAgbGV0IGZ1bGZpbGxlZCA9IHRydWU7XG4gICAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zbm93Ym9hcmQuaGFzUGx1Z2luKHBsdWdpbikpIHtcbiAgICAgICAgICAgICAgICBmdWxmaWxsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgYSBtZXRob2Qgb2YgYW4gaW5zdGFuY2UgdG8gYmUgbW9ja2VkIGZvciB0ZXN0aW5nLlxuICAgICAqXG4gICAgICogVGhpcyBtb2NrIHdpbGwgYmUgYXBwbGllZCBmb3IgdGhlIGxpZmUgb2YgYW4gaW5zdGFuY2UuIEZvciBzaW5nbGV0b25zLCB0aGUgbW9jayB3aWxsIGJlIGFwcGxpZWQgZm9yIHRoZSBsaWZlXG4gICAgICogb2YgdGhlIHBhZ2UuXG4gICAgICpcbiAgICAgKiBNb2NrcyBjYW5ub3QgYmUgYXBwbGllZCB0byBjYWxsYmFjayBmdW5jdGlvbiBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG1vY2sobWV0aG9kTmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uIFwiJHttZXRob2ROYW1lfVwiIGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgbW9ja2VkYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vY2tzW21ldGhvZE5hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV0gPSB0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXTtcblxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpICYmIHRoaXMuaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IG1vY2tlZCBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gKC4uLnBhcmFtZXRlcnMpID0+IGNhbGxiYWNrKHRoaXMsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIG1vY2sgY2FsbGJhY2sgZnJvbSBmdXR1cmUgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKi9cbiAgICB1bm1vY2sobWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubW9ja3NbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gdGhpcy5vcmlnaW5hbEZ1bmN0aW9uc1ttZXRob2ROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm1vY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpcy5vcmlnaW5hbEZ1bmN0aW9uc1ttZXRob2ROYW1lXTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IFJlZmxlY3QuZ2V0KHRhcmdldCwgJ3BsdWdpbnMnKVtwcm9wTG93ZXJdLmdldEluc3RhbmNlKC4uLnBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfSxcblxuICAgIGhhcyh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxufTtcbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcbmltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5pbXBvcnQgUGx1Z2luTG9hZGVyIGZyb20gJy4vUGx1Z2luTG9hZGVyJztcblxuaW1wb3J0IENvb2tpZSBmcm9tICcuLi91dGlsaXRpZXMvQ29va2llJztcbmltcG9ydCBKc29uUGFyc2VyIGZyb20gJy4uL3V0aWxpdGllcy9Kc29uUGFyc2VyJztcbmltcG9ydCBTYW5pdGl6ZXIgZnJvbSAnLi4vdXRpbGl0aWVzL1Nhbml0aXplcic7XG5pbXBvcnQgVXJsIGZyb20gJy4uL3V0aWxpdGllcy9VcmwnO1xuXG4vKipcbiAqIFNub3dib2FyZCAtIHRoZSBXaW50ZXIgSmF2YVNjcmlwdCBmcmFtZXdvcmsuXG4gKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBiYXNlIG9mIGEgbW9kZXJuIHRha2Ugb24gdGhlIFdpbnRlciBKUyBmcmFtZXdvcmssIGJlaW5nIGZ1bGx5IGV4dGVuc2libGUgYW5kIHRha2luZyBhZHZhbnRhZ2VcbiAqIG9mIG1vZGVybiBKYXZhU2NyaXB0IGZlYXR1cmVzIGJ5IGxldmVyYWdpbmcgdGhlIExhcmF2ZWwgTWl4IGNvbXBpbGF0aW9uIGZyYW1ld29yay4gSXQgYWxzbyBpcyBjb2RlZCB1cCB0byByZW1vdmUgdGhlXG4gKiBkZXBlbmRlbmN5IG9mIGpRdWVyeS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqIEBsaW5rIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3Nub3dib2FyZC9pbnRyb2R1Y3Rpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU25vd2JvYXJkIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXV0b1NpbmdsZXRvbnMgQXV0b21hdGljYWxseSBsb2FkIHNpbmdsZXRvbnMgd2hlbiBET00gaXMgcmVhZHkuIERlZmF1bHQ6IGB0cnVlYC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlYnVnIFdoZXRoZXIgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHNob3duLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGF1dG9TaW5nbGV0b25zLCBkZWJ1Zykge1xuICAgICAgICB0aGlzLmRlYnVnRW5hYmxlZCA9ICh0eXBlb2YgZGVidWcgPT09ICdib29sZWFuJyAmJiBkZWJ1ZyA9PT0gdHJ1ZSk7XG4gICAgICAgIHRoaXMuYXV0b0luaXRTaW5nbGV0b25zID0gKHR5cGVvZiBhdXRvU2luZ2xldG9ucyA9PT0gJ2Jvb2xlYW4nICYmIGF1dG9TaW5nbGV0b25zID09PSBmYWxzZSk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHt9O1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVhZGluZXNzID0ge1xuICAgICAgICAgICAgZG9tOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU2VhbCByZWFkaW5lc3MgZnJvbSBiZWluZyBhZGRlZCB0byBmdXJ0aGVyLCBidXQgYWxsb3cgdGhlIHByb3BlcnRpZXMgdG8gYmUgbW9kaWZpZWQuXG4gICAgICAgIE9iamVjdC5zZWFsKHRoaXMucmVhZGluZXNzKTtcbiAgICAgICAgdGhpcy5hdHRhY2hBYnN0cmFjdHMoKTtcblxuICAgICAgICAvLyBGcmVlemUgdGhlIFNub3dib2FyZCBjbGFzcyB0byBwcmV2ZW50IGZ1cnRoZXIgbW9kaWZpY2F0aW9ucy5cbiAgICAgICAgT2JqZWN0LmZyZWV6ZShTbm93Ym9hcmQucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcblxuICAgICAgICB0aGlzLmxvYWRVdGlsaXRpZXMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXNlKCk7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZygnU25vd2JvYXJkIGZyYW1ld29yayBpbml0aWFsaXNlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGFic3RyYWN0IGNsYXNzZXMgYXMgcHJvcGVydGllcyBvZiB0aGUgU25vd2JvYXJkIGNsYXNzLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGFsbG93IEphdmFzY3JpcHQgZnVuY3Rpb25hbGl0eSB3aXRoIG5vIGJ1aWxkIHByb2Nlc3MgdG8gc3RpbGwgZXh0ZW5kIHRoZXNlIGFic3RyYWN0cyBieSBwcmVmaXhpbmdcbiAgICAgKiB0aGVtIHdpdGggXCJTbm93Ym9hcmRcIi5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGNsYXNzIE15Q2xhc3MgZXh0ZW5kcyBTbm93Ym9hcmQuUGx1Z2luQmFzZSB7XG4gICAgICogICAgIC4uLlxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhdHRhY2hBYnN0cmFjdHMoKSB7XG4gICAgICAgIHRoaXMuUGx1Z2luQmFzZSA9IFBsdWdpbkJhc2U7XG4gICAgICAgIHRoaXMuU2luZ2xldG9uID0gU2luZ2xldG9uO1xuXG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5QbHVnaW5CYXNlLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5QbHVnaW5CYXNlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlNpbmdsZXRvbi5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuU2luZ2xldG9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgZGVmYXVsdCB1dGlsaXRpZXMuXG4gICAgICovXG4gICAgbG9hZFV0aWxpdGllcygpIHtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ2Nvb2tpZScsIENvb2tpZSk7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCdqc29uUGFyc2VyJywgSnNvblBhcnNlcik7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCdzYW5pdGl6ZXInLCBTYW5pdGl6ZXIpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbigndXJsJywgVXJsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlcyB0aGUgZnJhbWV3b3JrLlxuICAgICAqXG4gICAgICogQXR0YWNoZXMgYSBsaXN0ZW5lciBmb3IgdGhlIERPTSBiZWluZyByZWFkeSBhbmQgdHJpZ2dlcnMgYSBnbG9iYWwgXCJyZWFkeVwiIGV2ZW50IGZvciBwbHVnaW5zIHRvIGJlZ2luIGF0dGFjaGluZ1xuICAgICAqIHRoZW1zZWx2ZXMgdG8gdGhlIERPTS5cbiAgICAgKi9cbiAgICBpbml0aWFsaXNlKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9Jbml0U2luZ2xldG9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzZVNpbmdsZXRvbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRXZlbnQoJ3JlYWR5Jyk7XG4gICAgICAgICAgICB0aGlzLnJlYWRpbmVzcy5kb20gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlcyBhbiBpbnN0YW5jZSBvZiBldmVyeSBzaW5nbGV0b24uXG4gICAgICovXG4gICAgaW5pdGlhbGlzZVNpbmdsZXRvbnMoKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5wbHVnaW5zKS5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNTaW5nbGV0b24oKSAmJiBwbHVnaW4uZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcGx1Z2luIHRvIHRoZSBmcmFtZXdvcmsuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGFyZSB0aGUgY29ybmVyc3RvbmUgZm9yIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBmb3IgU25vd2JvYXJkLiBBIHBsdWdpbiBtdXN0IGVpdGhlciBiZSBhbiBFUzIwMTUgY2xhc3NcbiAgICAgKiB0aGF0IGV4dGVuZHMgdGhlIFBsdWdpbkJhc2Ugb3IgU2luZ2xldG9uIGFic3RyYWN0IGNsYXNzZXMsIG9yIGEgc2ltcGxlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogV2hlbiBhIHBsdWdpbiBpcyBhZGRlZCwgaXQgaXMgYXV0b21hdGljYWxseSBhc3NpZ25lZCBhcyBhIG5ldyBtYWdpYyBtZXRob2QgaW4gdGhlIFNub3dib2FyZCBjbGFzcyB1c2luZyB0aGUgbmFtZVxuICAgICAqIHBhcmFtZXRlciwgYW5kIGNhbiBiZSBjYWxsZWQgdmlhIHRoaXMgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSB0aGUgXCJsb3dlcmNhc2VcIiB2ZXJzaW9uIG9mIHRoaXMgbmFtZS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBpZiBhIHBsdWdpbiBpcyBhc3NpZ25lZCB0byB0aGUgbmFtZSBcIm15UGx1Z2luXCIsIGl0IGNhbiBiZSBjYWxsZWQgdmlhIGBTbm93Ym9hcmQubXlwbHVnaW4oKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7UGx1Z2luQmFzZXxGdW5jdGlvbn0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRQbHVnaW4obmFtZSwgaW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihsb3dlck5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgcGx1Z2luIGNhbGxlZCBcIiR7bmFtZX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlICE9PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlIGluc3RhbmNlb2YgUGx1Z2luQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIHBsdWdpbiBtdXN0IGV4dGVuZCB0aGUgUGx1Z2luQmFzZSBjbGFzcywgb3IgbXVzdCBiZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXNbbmFtZV0gIT09IHVuZGVmaW5lZCB8fCB0aGlzW2xvd2VyTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBmb3IgYSBwcm9wZXJ0eSBvciBtZXRob2Qgb2YgdGhlIFNub3dib2FyZCBjbGFzcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdID0gbmV3IFBsdWdpbkxvYWRlcihsb3dlck5hbWUsIHRoaXMsIGluc3RhbmNlKTtcblxuICAgICAgICB0aGlzLmRlYnVnKGBQbHVnaW4gXCIke25hbWV9XCIgcmVnaXN0ZXJlZGApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFueSBzaW5nbGV0b25zIG5vdyBoYXZlIHRoZWlyIGRlcGVuZGVuY2llcyBmdWxmaWxsZWQsIGFuZCBmaXJlIHRoZWlyIFwicmVhZHlcIiBoYW5kbGVyIGlmIHdlJ3JlXG4gICAgICAgIC8vIGluIGEgcmVhZHkgc3RhdGUuXG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5nZXRQbHVnaW5zKCkpLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBsdWdpbi5pc1NpbmdsZXRvbigpXG4gICAgICAgICAgICAgICAgJiYgIXBsdWdpbi5pc0luaXRpYWxpc2VkKClcbiAgICAgICAgICAgICAgICAmJiBwbHVnaW4uZGVwZW5kZW5jaWVzRnVsZmlsbGVkKClcbiAgICAgICAgICAgICAgICAmJiBwbHVnaW4uaGFzTWV0aG9kKCdsaXN0ZW5zJylcbiAgICAgICAgICAgICAgICAmJiBPYmplY3Qua2V5cyhwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpKS5pbmNsdWRlcygncmVhZHknKVxuICAgICAgICAgICAgICAgICYmIHRoaXMucmVhZGluZXNzLmRvbVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZHlNZXRob2QgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpLnJlYWR5O1xuICAgICAgICAgICAgICAgIHBsdWdpbi5jYWxsTWV0aG9kKHJlYWR5TWV0aG9kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIFJlbW92ZXMgYSBwbHVnaW4gZnJvbSBTbm93Ym9hcmQsIGNhbGxpbmcgdGhlIGRlc3RydWN0b3IgbWV0aG9kIGZvciBhbGwgYWN0aXZlIGluc3RhbmNlcyBvZiB0aGUgcGx1Z2luLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmVQbHVnaW4obmFtZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1BsdWdpbihsb3dlck5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBQbHVnaW4gXCIke25hbWV9XCIgYWxyZWFkeSByZW1vdmVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGRlc3RydWN0b3JzIGZvciBhbGwgaW5zdGFuY2VzXG4gICAgICAgIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdLmdldEluc3RhbmNlcygpLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICBpbnN0YW5jZS5kZXN0cnVjdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZWxldGUgdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzW2xvd2VyTmFtZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFBsdWdpbiBcIiR7bmFtZX1cIiByZW1vdmVkYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHBsdWdpbiBoYXMgYmVlbiByZWdpc3RlcmVkIGFuZCBpcyBhY3RpdmUuXG4gICAgICpcbiAgICAgKiBBIHBsdWdpbiB0aGF0IGlzIHN0aWxsIHdhaXRpbmcgZm9yIGRlcGVuZGVuY2llcyB0byBiZSByZWdpc3RlcmVkIHdpbGwgbm90IGJlIGFjdGl2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzUGx1Z2luKG5hbWUpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHJldHVybiAodGhpcy5wbHVnaW5zW2xvd2VyTmFtZV0gIT09IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiByZWdpc3RlcmVkIHBsdWdpbnMgYXMgUGx1Z2luTG9hZGVyIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luTG9hZGVyW119XG4gICAgICovXG4gICAgZ2V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2lucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZ2lzdGVyZWQgcGx1Z2lucywgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXRQbHVnaW5OYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFBsdWdpbkxvYWRlciBvYmplY3Qgb2YgYSBnaXZlbiBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luTG9hZGVyfVxuICAgICAqL1xuICAgIGdldFBsdWdpbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKGxvd2VyTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGx1Z2luIGNhbGxlZCBcIiR7bG93ZXJOYW1lfVwiIGhhcyBiZWVuIHJlZ2lzdGVyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgYWxsIHBsdWdpbnMgdGhhdCBsaXN0ZW4gdG8gdGhlIGdpdmVuIGV2ZW50LlxuICAgICAqXG4gICAgICogVGhpcyB3b3JrcyBmb3IgYm90aCBub3JtYWwgYW5kIHByb21pc2UgZXZlbnRzLiBJdCBkb2VzIE5PVCBjaGVjayB0aGF0IHRoZSBwbHVnaW4ncyBsaXN0ZW5lciBhY3R1YWxseSBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2lucyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBldmVudC5cbiAgICAgKi9cbiAgICBsaXN0ZW5zVG9FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IFtdO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucGx1Z2lucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtuYW1lLCBwbHVnaW5dID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwbHVnaW4uZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBsdWdpbi5oYXNNZXRob2QoJ2xpc3RlbnMnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnNbZXZlbnROYW1lXSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGxpc3RlbmVyc1tldmVudE5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2lucy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGx1Z2lucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzaW1wbGUgcmVhZHkgbGlzdGVuZXIuXG4gICAgICpcbiAgICAgKiBTeW5vbnltb3VzIHdpdGggalF1ZXJ5J3MgXCIkKGRvY3VtZW50KS5yZWFkeSgpXCIgZnVuY3Rpb25hbGl0eSwgdGhpcyBhbGxvd3MgaW5saW5lIHNjcmlwdHMgdG9cbiAgICAgKiBhdHRhY2ggdGhlbXNlbHZlcyB0byBTbm93Ym9hcmQgaW1tZWRpYXRlbHkgYnV0IG9ubHkgZmlyZSB3aGVuIHRoZSBET00gaXMgcmVhZHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHJlYWR5KGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRpbmVzcy5kb20pIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uKCdyZWFkeScsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGxpc3RlbmVyIGZvciBhbiBldmVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFkLWhvYyBzY3JpcHRzIHRoYXQgZG9uJ3QgbmVlZCBhIGZ1bGwgcGx1Z2luLiBUaGUgZ2l2ZW4gY2FsbGJhY2sgd2lsbCBiZVxuICAgICAqIGNhbGxlZCB3aGVuIHRoZSBldmVudCBuYW1lIHByb3ZpZGVkIGZpcmVzLiBUaGlzIHdvcmtzIGZvciBib3RoIG5vcm1hbCBhbmQgUHJvbWlzZSBldmVudHMuIEZvclxuICAgICAqIGEgUHJvbWlzZSBldmVudCwgeW91ciBjYWxsYmFjayBtdXN0IHJldHVybiBhIFByb21pc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmluY2x1ZGVzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBzaW1wbGUgbGlzdGVuZXIgZm9yIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgb2ZmKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIGdsb2JhbCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogSWYgYW55IHBsdWdpbiByZXR1cm5zIGEgYGZhbHNlYCwgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBJZiBldmVudCB3YXMgbm90IGNhbmNlbGxlZFxuICAgICAqL1xuICAgIGdsb2JhbEV2ZW50KGV2ZW50TmFtZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmRlYnVnKGBDYWxsaW5nIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCwgLi4ucGFyYW1ldGVycyk7XG5cbiAgICAgICAgLy8gRmluZCBwbHVnaW5zIGxpc3RlbmluZyB0byB0aGUgZXZlbnQuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYE5vIGxpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoYExpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCI6ICR7bGlzdGVuZXJzLmpvaW4oJywgJyl9YCk7XG5cbiAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmdldFBsdWdpbihuYW1lKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmdldEluc3RhbmNlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3Rlbk1ldGhvZCA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJylbZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyIG1ldGhvZHMgZm9yIGFsbCBwbHVnaW5zLCBpZiB0aGV5IGhhdmUgYSBtZXRob2Qgc3BlY2lmaWVkIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAgICBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIHBsdWdpbiBoYXMgY2FuY2VsbGVkIHRoZSBldmVudCwgbm8gZnVydGhlciBwbHVnaW5zIGFyZSBjb25zaWRlcmVkLlxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBsaXN0ZW5NZXRob2QuYXBwbHkoaW5zdGFuY2UsIHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlW2xpc3Rlbk1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcIiR7bGlzdGVuTWV0aG9kfVwiIG1ldGhvZCBpbiBcIiR7bmFtZX1cIiBwbHVnaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSguLi5wYXJhbWV0ZXJzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiIGNhbmNlbGxlZCBieSBcIiR7bmFtZX1cIiBwbHVnaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYExpc3RlbiBtZXRob2QgZm9yIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgaW4gXCIke25hbWV9XCIgcGx1Z2luIGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHN0cmluZy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmluZCBhZC1ob2MgbGlzdGVuZXJzIGZvciB0aGlzIGV2ZW50LlxuICAgICAgICBpZiAoIWNhbmNlbGxlZCAmJiB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdICYmIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgRm91bmQgJHt0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aH0gYWQtaG9jIGxpc3RlbmVyKHMpIGZvciBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBsaXN0ZW5lciBoYXMgY2FuY2VsbGVkIHRoZSBldmVudCwgbm8gZnVydGhlciBsaXN0ZW5lcnMgYXJlIGNvbnNpZGVyZWQuXG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKC4uLnBhcmFtZXRlcnMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfSBjYW5jZWxsZWQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBhbiBhZC1ob2MgbGlzdGVuZXIuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICFjYW5jZWxsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBnbG9iYWwgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucywgZXhwZWN0aW5nIGEgUHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSBhbGwuXG4gICAgICpcbiAgICAgKiBUaGlzIGNvbGxhdGVzIGFsbCBwbHVnaW5zIHJlc3BvbnNlcyBpbnRvIG9uZSBsYXJnZSBQcm9taXNlIHRoYXQgZWl0aGVyIGV4cGVjdHMgYWxsIHRvIGJlIHJlc29sdmVkLCBvciBvbmUgdG8gcmVqZWN0LlxuICAgICAqIElmIG5vIGxpc3RlbmVycyBhcmUgZm91bmQsIGEgcmVzb2x2ZWQgUHJvbWlzZSBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICAgKi9cbiAgICBnbG9iYWxQcm9taXNlRXZlbnQoZXZlbnROYW1lLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYENhbGxpbmcgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuXG4gICAgICAgIC8vIEZpbmQgcGx1Z2lucyBsaXN0ZW5pbmcgdG8gdGhpcyBldmVudC5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5zVG9FdmVudChldmVudE5hbWUpO1xuICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgTm8gbGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWJ1ZyhgTGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiOiAke2xpc3RlbmVycy5qb2luKCcsICcpfWApO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuZ2V0UGx1Z2luKG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNTaW5nbGV0b24oKSAmJiBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlzdGVuTWV0aG9kID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKVtldmVudE5hbWVdO1xuXG4gICAgICAgICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXIgbWV0aG9kcyBmb3IgYWxsIHBsdWdpbnMsIGlmIHRoZXkgaGF2ZSBhIG1ldGhvZCBzcGVjaWZpZWQgZm9yIHRoZSBldmVudC5cbiAgICAgICAgICAgIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZVByb21pc2UgPSBsaXN0ZW5NZXRob2QuYXBwbHkoaW5zdGFuY2UsIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW5zdGFuY2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCIke2xpc3Rlbk1ldGhvZH1cIiBtZXRob2QgaW4gXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VQcm9taXNlID0gaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSguLi5wYXJhbWV0ZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGluc3RhbmNlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBwcm9taXNlIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYExpc3RlbiBtZXRob2QgZm9yIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgaW4gXCIke25hbWV9XCIgcGx1Z2luIGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHN0cmluZy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmluZCBhZC1ob2MgbGlzdGVuZXJzIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50LlxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSAmJiB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZvdW5kICR7dGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGh9IGFkLWhvYyBsaXN0ZW5lcihzKSBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJQcm9taXNlID0gbGlzdGVuZXIoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lclByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChsaXN0ZW5lclByb21pc2UpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgcHJvbWlzZSBldmVudCBieSBhbiBhZC1ob2MgbGlzdGVuZXIuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2cgYSBzdHlsZWQgbWVzc2FnZSBpbiB0aGUgY29uc29sZS5cbiAgICAgKlxuICAgICAqIEluY2x1ZGVzIHBhcmFtZXRlcnMgYW5kIGEgc3RhY2sgdHJhY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBsb2dNZXNzYWdlKGNvbG9yLCBib2xkLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICAgICAnJWNbU25vd2JvYXJkXScsXG4gICAgICAgICAgICBgY29sb3I6ICR7Y29sb3J9OyBmb250LXdlaWdodDogJHsoYm9sZCkgPyAnYm9sZCcgOiAnbm9ybWFsJ307YCxcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAgICAgICAgIGAlY1BhcmFtZXRlcnMgJWMoJHtwYXJhbWV0ZXJzLmxlbmd0aH0pYCxcbiAgICAgICAgICAgICAgICAnY29sb3I6IHJnYig0NSwgMTY3LCAxOTkpOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICAgICAgICdjb2xvcjogcmdiKDg4LCA4OCwgODgpOyBmb250LXdlaWdodDogbm9ybWFsOydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgcGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCVjJHtpbmRleH06YCwgJ2NvbG9yOiByZ2IoODgsIDg4LCA4OCk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7JywgcGFyYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoJyVjVHJhY2UnLCAnY29sb3I6IHJnYig0NSwgMTY3LCAxOTkpOyBmb250LXdlaWdodDogYm9sZDsnKTtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2cgYSBtZXNzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbG9nKG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKCdyZ2IoNDUsIDE2NywgMTk5KScsIGZhbHNlLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2cgYSBkZWJ1ZyBtZXNzYWdlLlxuICAgICAqXG4gICAgICogVGhlc2UgbWVzc2FnZXMgYXJlIG9ubHkgc2hvd24gd2hlbiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRlYnVnKG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlYnVnRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKCdyZ2IoNDUsIDE2NywgMTk5KScsIGZhbHNlLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBlcnJvcihtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDIyOSwgMzUsIDM1KScsIHRydWUsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlQ29va2llIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIENvb2tpZSB1dGlsaXR5LlxuICpcbiAqIFRoaXMgdXRpbGl0eSBpcyBhIHRoaW4gd3JhcHBlciBhcm91bmQgdGhlIFwianMtY29va2llXCIgbGlicmFyeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcy1jb29raWUvanMtY29va2llXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29va2llIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICBleHBpcmVzOiBudWxsLFxuICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICAgICAgc2VjdXJlOiBmYWxzZSxcbiAgICAgICAgICAgIHNhbWVTaXRlOiAnTGF4JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgY29va2llIHBhcmFtZXRlcnMgZm9yIGFsbCBzdWJzZXF1ZW50IFwic2V0XCIgYW5kIFwicmVtb3ZlXCIgY2FsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIHNldERlZmF1bHRzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb29raWUgZGVmYXVsdHMgbXVzdCBiZSBwcm92aWRlZCBhcyBhbiBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0c1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGNvb2tpZSBwYXJhbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0cygpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB7fTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmRlZmF1bHRzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzW2tleV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIElmIGBuYW1lYCBpcyB1bmRlZmluZWQsIHJldHVybnMgYWxsIGNvb2tpZXMgYXMgYW4gT2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fFN0cmluZ31cbiAgICAgKi9cbiAgICBnZXQobmFtZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjb29raWVzID0gQmFzZUNvb2tpZS5nZXQoKTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoY29va2llcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbY29va2llTmFtZSwgY29va2llVmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLmdldCcsIGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29va2llc1tjb29raWVOYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb29raWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gQmFzZUNvb2tpZS5nZXQobmFtZSk7XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBvdmVycmlkZSB0aGUgZ290dGVuIHZhbHVlXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdjb29raWUuZ2V0JywgbmFtZSwgdmFsdWUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIGNvb2tpZSBieSBuYW1lLlxuICAgICAqXG4gICAgICogWW91IGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgY29va2llIHBhcmFtZXRlcnMgdGhyb3VnaCB0aGUgXCJvcHRpb25zXCIgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgc2V0KG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBzYXZlVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZSB0byBzYXZlXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdjb29raWUuc2V0JywgbmFtZSwgdmFsdWUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgc2F2ZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBCYXNlQ29va2llLnNldChuYW1lLCBzYXZlVmFsdWUsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdHMoKSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGNvb2tpZSBieSBuYW1lLlxuICAgICAqXG4gICAgICogWW91IGNhbiBzcGVjaWZ5IHRoZSBhZGRpdGlvbmFsIGNvb2tpZSBwYXJhbWV0ZXJzIHZpYSB0aGUgXCJvcHRpb25zXCIgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZShuYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIEJhc2VDb29raWUucmVtb3ZlKG5hbWUsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdHMoKSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogSlNPTiBQYXJzZXIgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgcGFyc2VzIEpTT04tbGlrZSBkYXRhIHRoYXQgZG9lcyBub3Qgc3RyaWN0bHkgbWVldCB0aGUgSlNPTiBzcGVjaWZpY2F0aW9ucyBpbiBvcmRlciB0byBzaW1wbGlmeSBkZXZlbG9wbWVudC5cbiAqIEl0IGlzIGEgc2FmZSByZXBsYWNlbWVudCBmb3IgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShldmFsKFwiKHtcIiArIHZhbHVlICsgXCJ9KVwiKSkpIHRoYXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgdXNlIG9mIGV2YWwoKVxuICpcbiAqIEBhdXRob3IgQXl1bWkgSGFtYXNha2lcbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vY3RvYmVyY21zL29jdG9iZXIvcHVsbC80NTI3XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpzb25QYXJzZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgLy8gQWRkIHRvIGdsb2JhbCBmdW5jdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgd2luZG93LnduSlNPTiA9IChqc29uKSA9PiB0aGlzLnBhcnNlKGpzb24pO1xuICAgICAgICB3aW5kb3cub2NKU09OID0gd2luZG93LnduSlNPTjtcbiAgICB9XG5cbiAgICBwYXJzZShzdHIpIHtcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IHRoaXMucGFyc2VTdHJpbmcoc3RyKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZyk7XG4gICAgfVxuXG4gICAgcGFyc2VTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgbGV0IHN0ciA9IHZhbHVlLnRyaW0oKTtcblxuICAgICAgICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJva2VuIEpTT04gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBsZXQgdHlwZSA9IG51bGw7XG4gICAgICAgIGxldCBrZXkgPSBudWxsO1xuICAgICAgICBsZXQgYm9keSA9ICcnO1xuXG4gICAgICAgIC8qXG4gICAgICAgICogdGhlIG1pc3Rha2UgJywnXG4gICAgICAgICovXG4gICAgICAgIHdoaWxlIChzdHIgJiYgc3RyWzBdID09PSAnLCcpIHtcbiAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIHN0cmluZ1xuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyWzBdID09PSAnXCInIHx8IHN0clswXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdICE9PSBzdHJbMF0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nIEpTT04gb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBib2R5ID0gJ1wiJztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaSArIDFdID09PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBzdHJbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSAnXCInO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICdcXFxcXCInO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZyBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogYm9vbGVhblxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyID09PSAndHJ1ZScgfHwgc3RyID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBudWxsXG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHIgPT09ICdudWxsJykge1xuICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogbnVtYmVyXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihzdHIpO1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIG9iamVjdFxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyWzBdID09PSAneycpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnbmVlZEtleSc7XG4gICAgICAgICAgICBrZXkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0ID0gJ3snO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQmxhbmtDaGFyKHN0cltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ25lZWRLZXknICYmIChzdHJbaV0gPT09ICdcIicgfHwgc3RyW2ldID09PSAnXFwnJykpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZUtleShzdHIsIGkgKyAxLCBzdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYFwiJHtrZXl9XCJgO1xuICAgICAgICAgICAgICAgICAgICBpICs9IGtleS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlcktleSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmVlZEtleScgJiYgdGhpcy5jYW5CZUtleUhlYWQoc3RyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlS2V5KHN0ciwgaSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXCInO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0ga2V5O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgaSArPSBrZXkubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlcktleSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYWZ0ZXJLZXknICYmIHN0cltpXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnOic7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnOic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuZ2V0Qm9keShzdHIsIGkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGkgPSBpICsgYm9keS5vcmlnaW5MZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5wYXJzZVN0cmluZyhib2R5LmJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJCb2R5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhZnRlckJvZHknIHx8IHR5cGUgPT09ICduZWVkS2V5Jykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdHJbbGFzdF0gPT09ICcsJyB8fCB0aGlzLmlzQmxhbmtDaGFyKHN0cltsYXN0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2xhc3RdID09PSAnfScgJiYgbGFzdCA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnfSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ICE9PSBpICYmIHJlc3VsdCAhPT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICduZWVkS2V5JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBsYXN0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBvYmplY3QgbmVhciAke3Jlc3VsdH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogYXJyYXlcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAnWyc7XG4gICAgICAgICAgICB0eXBlID0gJ25lZWRCb2R5JztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJyAnIHx8IHN0cltpXSA9PT0gJ1xcbicgfHwgc3RyW2ldID09PSAnXFx0Jykge1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmVlZEJvZHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdudWxsLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICddJyAmJiBpID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICddJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5nZXRCb2R5KHN0ciwgaSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyBib2R5Lm9yaWdpbkxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnBhcnNlU3RyaW5nKGJvZHkuYm9keSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlckJvZHknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FmdGVyQm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICduZWVkQm9keSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBtaXN0YWtlIFwiLFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RyW2kgKyAxXSA9PT0gJywnIHx8IHRoaXMuaXNCbGFua0NoYXIoc3RyW2kgKyAxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2kgKyAxXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbnVsbCwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXScgJiYgaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGFycmF5IG5lYXIgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZ2V0Qm9keShzdHIsIHBvcykge1xuICAgICAgICBsZXQgYm9keSA9ICcnO1xuXG4gICAgICAgIC8vIHBhcnNlIHN0cmluZyBib2R5XG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ1wiJyB8fCBzdHJbcG9zXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgIGJvZHkgPSBzdHJbcG9zXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvcyArIDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IHN0cltwb3NdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW3Bvc107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6IGJvZHkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gc3RyaW5nIGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSB0cnVlIC8gZmFsc2VcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAndCcpIHtcbiAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZigndHJ1ZScsIHBvcykgPT09IHBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogJ3RydWUnLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogJ3RydWUnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9vbGVhbiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKDAsIHBvcyArIDEwKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICdmJykge1xuICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCdmJywgcG9zKSA9PT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiAnZmFsc2UnLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogJ2ZhbHNlJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvb2xlYW4gYm9keSBuZWFyICR7c3RyLnN1YnN0cigwLCBwb3MgKyAxMCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBudWxsXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ24nKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ251bGwnLCBwb3MpID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6ICdudWxsJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICdudWxsJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvb2xlYW4gYm9keSBuZWFyICR7c3RyLnN1YnN0cigwLCBwb3MgKyAxMCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBudW1iZXJcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnLScgfHwgc3RyW3Bvc10gPT09ICcrJyB8fCBzdHJbcG9zXSA9PT0gJy4nIHx8IChzdHJbcG9zXSA+PSAnMCcgJiYgc3RyW3Bvc10gPD0gJzknKSkge1xuICAgICAgICAgICAgYm9keSA9ICcnO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJy0nIHx8IHN0cltpXSA9PT0gJysnIHx8IHN0cltpXSA9PT0gJy4nIHx8IChzdHJbaV0gPj0gJzAnICYmIHN0cltpXSA8PSAnOScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6IGJvZHkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gbnVtYmVyIGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBvYmplY3RcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAneycgfHwgc3RyW3Bvc10gPT09ICdbJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBbXG4gICAgICAgICAgICAgICAgc3RyW3Bvc10sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgYm9keSA9IHN0cltwb3NdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcG9zICsgMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0cltpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcIicgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gIT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgneycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OICR7KHN0cltwb3NdID09PSAneycgPyAnb2JqZWN0JyA6ICdhcnJheScpfSBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCdbJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gJHsoc3RyW3Bvc10gPT09ICd7JyA/ICdvYmplY3QnIDogJ2FycmF5Jyl9IGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogaSAtIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OICR7KHN0cltwb3NdID09PSAneycgPyAnb2JqZWN0JyA6ICdhcnJheScpfSBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKChwb3MgLSA1ID49IDApID8gcG9zIC0gNSA6IDAsIDUwKX1gKTtcbiAgICB9XG5cbiAgICBwYXJzZUtleShzdHIsIHBvcywgcXVvdGUpIHtcbiAgICAgICAgbGV0IGtleSA9ICcnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChxdW90ZSAmJiBxdW90ZSA9PT0gc3RyW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcXVvdGUgJiYgKHN0cltpXSA9PT0gJyAnIHx8IHN0cltpXSA9PT0gJzonKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGtleSArPSBzdHJbaV07XG5cbiAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJyAmJiBpICsgMSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBrZXkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIHN5bnRheCBuZWFyICR7a2V5fWApO1xuICAgIH1cblxuICAgIGNhbkJlS2V5SGVhZChjaCkge1xuICAgICAgICBpZiAoY2hbMF0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY2hbMF0gPj0gJ2EnICYmIGNoWzBdIDw9ICd6JykgfHwgKGNoWzBdID49ICdBJyAmJiBjaFswXSA8PSAnWicpIHx8IGNoWzBdID09PSAnXycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaFswXSA+PSAnMCcgJiYgY2hbMF0gPD0gJzknKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hbMF0gPT09ICckJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoLmNoYXJDb2RlQXQoMCkgPiAyNTUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzQmxhbmtDaGFyKGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA9PT0gJyAnIHx8IGNoID09PSAnXFxuJyB8fCBjaCA9PT0gJ1xcdCc7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBTYW5pdGl6ZXIgdXRpbGl0eS5cbiAqXG4gKiBDbGllbnQtc2lkZSBIVE1MIHNhbml0aXplciBkZXNpZ25lZCBtb3N0bHkgdG8gcHJldmVudCBzZWxmLVhTUyBhdHRhY2tzLlxuICogVGhlIHNhbml0aXplciB1dGlsaXR5IHdpbGwgc3RyaXAgYWxsIGF0dHJpYnV0ZXMgdGhhdCBzdGFydCB3aXRoIGBvbmAgKHVzdWFsbHkgSlMgZXZlbnQgaGFuZGxlcnMgYXMgYXR0cmlidXRlcywgaS5lLiBgb25sb2FkYCBvciBgb25lcnJvcmApIG9yIGNvbnRhaW4gdGhlIGBqYXZhc2NyaXB0OmAgcHNldWRvIHByb3RvY29sIGluIHRoZWlyIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTYW5pdGl6ZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgLy8gQWRkIHRvIGdsb2JhbCBmdW5jdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgd2luZG93LnduU2FuaXRpemUgPSAoaHRtbCkgPT4gdGhpcy5zYW5pdGl6ZShodG1sKTtcbiAgICAgICAgd2luZG93Lm9jU2FuaXRpemUgPSB3aW5kb3cud25TYW5pdGl6ZTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZShodG1sLCBib2R5T25seSkge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIGNvbnN0IGRvbSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICBjb25zdCByZXR1cm5Cb2R5T25seSA9IChib2R5T25seSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBib2R5T25seSA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgPyBib2R5T25seVxuICAgICAgICAgICAgOiB0cnVlO1xuXG4gICAgICAgIHRoaXMuc2FuaXRpemVOb2RlKGRvbS5nZXRSb290Tm9kZSgpKTtcblxuICAgICAgICByZXR1cm4gKHJldHVybkJvZHlPbmx5KSA/IGRvbS5ib2R5LmlubmVySFRNTCA6IGRvbS5pbm5lckhUTUw7XG4gICAgfVxuXG4gICAgc2FuaXRpemVOb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaW1BdHRyaWJ1dGVzKG5vZGUpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShub2RlLmNoaWxkcmVuKTtcblxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZU5vZGUoY2hpbGQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cmltQXR0cmlidXRlcyhub2RlKSB7XG4gICAgICAgIGlmICghbm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSBub2RlLmF0dHJpYnV0ZXMuaXRlbShpKS5uYW1lO1xuICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gbm9kZS5hdHRyaWJ1dGVzLml0ZW0oaSkudmFsdWU7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAqIHJlbW92ZSBhdHRyaWJ1dGVzIHdoZXJlIHRoZSBuYW1lcyBzdGFydCB3aXRoIFwib25cIiAoZm9yIGV4YW1wbGU6IG9ubG9hZCwgb25lcnJvci4uLilcbiAgICAgICAgICAgICogcmVtb3ZlIGF0dHJpYnV0ZXMgd2hlcmUgdGhlIHZhbHVlIHN0YXJ0cyB3aXRoIHRoZSBcImphdmFzY3JpcHQ6XCIgcHNldWRvIHByb3RvY29sIChmb3IgZXhhbXBsZSBocmVmPVwiamF2YXNjcmlwdDphbGVydCgxKVwiKVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgaWYgKGF0dHJOYW1lLmluZGV4T2YoJ29uJykgPT09IDAgfHwgYXR0clZhbHVlLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIFVSTCB1dGlsaXR5LlxuICpcbiAqIFRoaXMgdXRpbGl0eSBwcm92aWRlcyBVUkwgZnVuY3Rpb25zLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMiBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcmwgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLmJhc2VVcmwoKTtcbiAgICAgICAgdGhpcy5hc3NldFVybCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBVUkwgYmFzZWQgb24gYSByZWxhdGl2ZSBwYXRoLlxuICAgICAqXG4gICAgICogSWYgYW4gYWJzb2x1dGUgVVJMIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRvKHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKD86W146XSs6XFwvXFwvKVstYS16MC05QDolLl8rfiM9XXsxLDI1Nn1cXGIoWy1hLXowLTkoKUA6JV8rLn4jPyYvLz1dKikvaTtcblxuICAgICAgICBpZiAodXJsLm1hdGNoKHVybFJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRoZVVybCA9IHVybC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5iYXNlVXJsKCl9JHt0aGVVcmx9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIEFzc2V0IFVSTCBiYXNlZCBvbiBhIHJlbGF0aXZlIHBhdGguXG4gICAgICpcbiAgICAgKiBJZiBhbiBhYnNvbHV0ZSBVUkwgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYXNzZXQodXJsKSB7XG4gICAgICAgIGNvbnN0IHVybFJlZ2V4ID0gL14oPzpbXjpdKzpcXC9cXC8pWy1hLXowLTlAOiUuXyt+Iz1dezEsMjU2fVxcYihbLWEtejAtOSgpQDolXysufiM/Ji8vPV0qKS9pO1xuXG4gICAgICAgIGlmICh1cmwubWF0Y2godXJsUmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhlVXJsID0gdXJsLnJlcGxhY2UoL15cXC8rLywgJycpO1xuXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmFzc2V0VXJsKCl9JHt0aGVVcmx9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgYmFzZSBVUkwgb2YgdGhpcyBpbnN0YWxsLlxuICAgICAqXG4gICAgICogVGhpcyBkZXRlcm1pbmVzIHRoZSBiYXNlIFVSTCBmcm9tIHRocmVlIHNvdXJjZXMsIGluIG9yZGVyOlxuICAgICAqICAtIElmIFNub3dib2FyZCBpcyBsb2FkZWQgdmlhIHRoZSBgeyUgc25vd2JvYXJkICV9YCB0YWcsIGl0IHdpbGwgcmV0cmlldmUgdGhlIGJhc2UgVVJMIHRoYXRcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIHRoZXJlLlxuICAgICAqICAtIElmIGEgYDxiYXNlPmAgdGFnIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCB1c2UgdGhlIFVSTCBzcGVjaWZpZWQgaW4gdGhlIGJhc2UgdGFnLlxuICAgICAqICAtIEZpbmFsbHksIGl0IHdpbGwgdGFrZSBhIGd1ZXNzIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgd2lsbCBsaWtlbHkgbm90IHdvcmsgZm9yIHNpdGVzXG4gICAgICogdGhhdCByZXNpZGUgaW4gc3ViZGlyZWN0b3JpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYmFzZSBVUkwgd2lsbCBhbHdheXMgY29udGFpbiBhIHRyYWlsaW5nIGJhY2tzbGFzaC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYmFzZVVybCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm91bmRCYXNlVXJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpLmRhdGFzZXQuYmFzZVVybCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IFtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCxcbiAgICAgICAgICAgICcvLycsXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdCxcbiAgICAgICAgICAgICcvJyxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSB1cmxQYXJ0cy5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEJhc2VVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGFzc2V0IFVSTCBvZiB0aGlzIGluc3RhbGwuXG4gICAgICpcbiAgICAgKiBUaGlzIGRldGVybWluZXMgdGhlIGJhc2UgVVJMIGZyb20gdGhyZWUgc291cmNlcywgaW4gb3JkZXI6XG4gICAgICogIC0gSWYgU25vd2JvYXJkIGlzIGxvYWRlZCB2aWEgdGhlIGB7JSBzbm93Ym9hcmQgJX1gIHRhZywgaXQgd2lsbCByZXRyaWV2ZSB0aGUgYXNzZXQgVVJMIHRoYXRcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIHRoZXJlLlxuICAgICAqICAtIElmIGEgYDxsaW5rIHJlbD1cImFzc2V0X3VybFwiIGhyZWY9XCJodHRwczovL2V4YW1wbGUuY29tXCI+YCB0YWcgaXMgYXZhaWxhYmxlLCBpdCB3aWxsIHVzZSB0aGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgbGluayB0YWcuXG4gICAgICogIC0gRmluYWxseSwgaXQgd2lsbCB0YWtlIGEgZ3Vlc3MgZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyB3aWxsIGxpa2VseSBub3Qgd29yayBmb3Igc2l0ZXNcbiAgICAgKiB0aGF0IHJlc2lkZSBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBhc3NldCBVUkwgd2lsbCBhbHdheXMgY29udGFpbiBhIHRyYWlsaW5nIGJhY2tzbGFzaC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYXNzZXRVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvdW5kQXNzZXRVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKS5kYXRhc2V0LmFzc2V0VXJsKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJhc3NldF91cmxcIl0nKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJhc3NldF91cmxcIl0nKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSBbXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsXG4gICAgICAgICAgICAnLy8nLFxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgICAgICAnLycsXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHVybFBhcnRzLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoZSBiYXNlIFVSTCwgZW5zdXJpbmcgaXQgaXMgYSBIVFRQL0hUVFBzIFVSTC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBTbm93Ym9hcmQgc2NyaXB0IG9yIDxiYXNlPiB0YWcgb24gdGhlIHBhZ2UgdXNlIGEgZGlmZmVyZW50IHR5cGUgb2YgVVJMLCB0aGlzIHdpbGwgZmFpbCB3aXRoXG4gICAgICogYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB2YWxpZGF0ZUJhc2VVcmwodXJsKSB7XG4gICAgICAgIGNvbnN0IHVybFJlZ2V4ID0gL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/L2k7XG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gdXJsUmVnZXguZXhlYyh1cmwpO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybFBhcnRzWzJdO1xuICAgICAgICBjb25zdCBkb21haW4gPSB1cmxQYXJ0c1s0XTtcblxuICAgICAgICBpZiAocHJvdG9jb2wgJiYgWydodHRwJywgJ2h0dHBzJ10uaW5kZXhPZihwcm90b2NvbC50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiYXNlIFVSTCBkZXRlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZG9tYWluKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZSBVUkwgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAodXJsLnN1YnN0cigtMSkgPT09ICcvJylcbiAgICAgICAgICAgID8gdXJsXG4gICAgICAgICAgICA6IGAke3VybH0vYDtcbiAgICB9XG59XG4iLCJpbXBvcnQgU25vd2JvYXJkIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvbWFpbi9Tbm93Ym9hcmQnO1xuaW1wb3J0IFByb3h5SGFuZGxlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUHJveHlIYW5kbGVyJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWpheC9SZXF1ZXN0JztcbmltcG9ydCBBdHRyaWJ1dGVSZXF1ZXN0IGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvYWpheC9oYW5kbGVycy9BdHRyaWJ1dGVSZXF1ZXN0JztcbmltcG9ydCBBc3NldExvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9Bc3NldExvYWRlcic7XG5pbXBvcnQgRGF0YUNvbmZpZyBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9EYXRhQ29uZmlnJztcbmltcG9ydCBTdHlsZXNoZWV0TG9hZGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0eWxlc2hlZXRMb2FkZXInO1xuaW1wb3J0IFRyYW5zaXRpb24gZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJhbnNpdGlvbic7XG5pbXBvcnQgRmxhc2ggZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2gnO1xuaW1wb3J0IEZsYXNoTGlzdGVuZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2hMaXN0ZW5lcic7XG5pbXBvcnQgRm9ybVZhbGlkYXRpb24gZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRm9ybVZhbGlkYXRpb24nO1xuaW1wb3J0IEF0dGFjaExvYWRpbmcgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvQXR0YWNoTG9hZGluZyc7XG5pbXBvcnQgU3RyaXBlTG9hZGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0cmlwZUxvYWRlcic7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9UcmlnZ2VyJztcblxuKCh3aW5kb3cpID0+IHtcbiAgICBjb25zdCBzbm93Ym9hcmQgPSBuZXcgUHJveHkoXG4gICAgICAgIG5ldyBTbm93Ym9hcmQodHJ1ZSwgdHJ1ZSksXG4gICAgICAgIFByb3h5SGFuZGxlcixcbiAgICApO1xuXG4gICAgLy8gQ292ZXIgYWxsIGFsaWFzZXNcbiAgICB3aW5kb3cuc25vd2JvYXJkID0gc25vd2JvYXJkO1xuICAgIHdpbmRvdy5Tbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgd2luZG93LlNub3dCb2FyZCA9IHNub3dib2FyZDtcblxuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3JlcXVlc3QnLCBSZXF1ZXN0KTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdhdHRyaWJ1dGVSZXF1ZXN0JywgQXR0cmlidXRlUmVxdWVzdCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignYXNzZXRMb2FkZXInLCBBc3NldExvYWRlcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZGF0YUNvbmZpZycsIERhdGFDb25maWcpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2V4dHJhc1N0eWxlcycsIFN0eWxlc2hlZXRMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3RyYW5zaXRpb24nLCBUcmFuc2l0aW9uKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdmbGFzaCcsIEZsYXNoKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdmbGFzaExpc3RlbmVyJywgRmxhc2hMaXN0ZW5lcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZm9ybVZhbGlkYXRpb24nLCBGb3JtVmFsaWRhdGlvbik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignYXR0YWNoTG9hZGluZycsIEF0dGFjaExvYWRpbmcpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3N0cmlwZUxvYWRlcicsIFN0cmlwZUxvYWRlcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbigndHJpZ2dlcicsIFRyaWdnZXIpO1xuXG4gICAgc25vd2JvYXJkLm9uKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgLy8gU2NhbiBmb3IgdHJpZ2dlcnNcbiAgICAgICAgQXJyYXlcbiAgICAgICAgICAgIC5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IFsuLi5lbGVtZW50LmF0dHJpYnV0ZXNdLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoeyBuYW1lIH0pID0+IG5hbWUuc3RhcnRzV2l0aChcImRhdGEtdHJpZ2dlci1cIikpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHNub3dib2FyZC50cmlnZ2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59KSh3aW5kb3cpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiLyohIGpzLWNvb2tpZSB2My4wLjUgfCBNSVQgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuZnVuY3Rpb24gYXNzaWduICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRcbn1cbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xudmFyIGRlZmF1bHRDb252ZXJ0ZXIgPSB7XG4gIHJlYWQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgfSxcbiAgd3JpdGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAvJSgyWzM0NkJGXXwzW0FDLUZdfDQwfDVbQkRFXXw2MHw3W0JDRF0pL2csXG4gICAgICBkZWNvZGVVUklDb21wb25lbnRcbiAgICApXG4gIH1cbn07XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxuZnVuY3Rpb24gaW5pdCAoY29udmVydGVyLCBkZWZhdWx0QXR0cmlidXRlcykge1xuICBmdW5jdGlvbiBzZXQgKG5hbWUsIHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe30sIGRlZmF1bHRBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgYXR0cmlidXRlcy5leHBpcmVzID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIGF0dHJpYnV0ZXMuZXhwaXJlcyAqIDg2NGU1KTtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgYXR0cmlidXRlcy5leHBpcmVzID0gYXR0cmlidXRlcy5leHBpcmVzLnRvVVRDU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKVxuICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgLnJlcGxhY2UoL1soKV0vZywgZXNjYXBlKTtcblxuICAgIHZhciBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgPSAnJztcbiAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJzsgJyArIGF0dHJpYnV0ZU5hbWU7XG5cbiAgICAgIGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnNpZGVycyBSRkMgNjI2NSBzZWN0aW9uIDUuMjpcbiAgICAgIC8vIC4uLlxuICAgICAgLy8gMy4gIElmIHRoZSByZW1haW5pbmcgdW5wYXJzZWQtYXR0cmlidXRlcyBjb250YWlucyBhICV4M0IgKFwiO1wiKVxuICAgICAgLy8gICAgIGNoYXJhY3RlcjpcbiAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAvLyBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpIGNoYXJhY3Rlci5cbiAgICAgIC8vIC4uLlxuICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGRvY3VtZW50LmNvb2tpZSA9XG4gICAgICBuYW1lICsgJz0nICsgY29udmVydGVyLndyaXRlKHZhbHVlLCBuYW1lKSArIHN0cmluZ2lmaWVkQXR0cmlidXRlcylcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldCAobmFtZSkge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFuYW1lKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxuICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLlxuICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgdmFyIGphciA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgdmFyIHZhbHVlID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZm91bmQgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICBqYXJbZm91bmRdID0gY29udmVydGVyLnJlYWQodmFsdWUsIGZvdW5kKTtcblxuICAgICAgICBpZiAobmFtZSA9PT0gZm91bmQpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lID8gamFyW25hbWVdIDogamFyXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICB7XG4gICAgICBzZXQsXG4gICAgICBnZXQsXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIChuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHNldChcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgZXhwaXJlczogLTFcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHdpdGhBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgfSxcbiAgICAgIHdpdGhDb252ZXJ0ZXI6IGZ1bmN0aW9uIChjb252ZXJ0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgYXR0cmlidXRlczogeyB2YWx1ZTogT2JqZWN0LmZyZWV6ZShkZWZhdWx0QXR0cmlidXRlcykgfSxcbiAgICAgIGNvbnZlcnRlcjogeyB2YWx1ZTogT2JqZWN0LmZyZWV6ZShjb252ZXJ0ZXIpIH1cbiAgICB9XG4gIClcbn1cblxudmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG5leHBvcnQgeyBhcGkgYXMgZGVmYXVsdCB9O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwiL2Fzc2V0cy9qcy9hcHBcIjogMCxcblx0XCJhc3NldHMvY3NzL3RoZW1lXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGlmKGNodW5rSWRzLnNvbWUoKGlkKSA9PiAoaW5zdGFsbGVkQ2h1bmtzW2lkXSAhPT0gMCkpKSB7XG5cdFx0Zm9yKG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0fVxuXHRpZihwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbikgcGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24oZGF0YSk7XG5cdGZvcig7aSA8IGNodW5rSWRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y2h1bmtJZCA9IGNodW5rSWRzW2ldO1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpICYmIGluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKCk7XG5cdFx0fVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9IDA7XG5cdH1cblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uTyhyZXN1bHQpO1xufVxuXG52YXIgY2h1bmtMb2FkaW5nR2xvYmFsID0gc2VsZltcIndlYnBhY2tDaHVua3dpbnRlcmNtc193b3Jrc2hvcF90aGVtZVwiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmt3aW50ZXJjbXNfd29ya3Nob3BfdGhlbWVcIl0gfHwgW107XG5jaHVua0xvYWRpbmdHbG9iYWwuZm9yRWFjaCh3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIDApKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gd2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCBjaHVua0xvYWRpbmdHbG9iYWwucHVzaC5iaW5kKGNodW5rTG9hZGluZ0dsb2JhbCkpOyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgZGVwZW5kcyBvbiBvdGhlciBsb2FkZWQgY2h1bmtzIGFuZCBleGVjdXRpb24gbmVlZCB0byBiZSBkZWxheWVkXG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8odW5kZWZpbmVkLCBbXCJhc3NldHMvY3NzL3RoZW1lXCJdLCAoKSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vYXNzZXRzL2pzL3NyYy9hcHAuanNcIikpKVxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8odW5kZWZpbmVkLCBbXCJhc3NldHMvY3NzL3RoZW1lXCJdLCAoKSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vYXNzZXRzL2Nzcy9iYXNlLmNzc1wiKSkpXG5fX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKF9fd2VicGFja19leHBvcnRzX18pO1xuIiwiIl0sIm5hbWVzIjpbIlBsdWdpbkJhc2UiLCJzbm93Ym9hcmQiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsImNvbnN0cnVjdCIsImRlcGVuZGVuY2llcyIsImxpc3RlbnMiLCJkZXN0cnVjdCIsImRldGFjaCIsImRlc3RydWN0b3IiLCJkZWZhdWx0IiwiU2luZ2xldG9uIiwiX1BsdWdpbkJhc2UiLCJfY2FsbFN1cGVyIiwiYXJndW1lbnRzIiwiX2luaGVyaXRzIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsImUiLCJ0IiwiciIsIk9iamVjdCIsInByb3RvdHlwZSIsIm4iLCJoYXNPd25Qcm9wZXJ0eSIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImkiLCJTeW1ib2wiLCJhIiwiaXRlcmF0b3IiLCJjIiwiYXN5bmNJdGVyYXRvciIsInUiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIndyYXAiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwidHlwZSIsImFyZyIsImNhbGwiLCJoIiwibCIsImYiLCJzIiwieSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJwIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJpbnZva2UiLCJfdHlwZW9mIiwicmVzb2x2ZSIsIl9fYXdhaXQiLCJ0aGVuIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJFcnJvciIsImRvbmUiLCJtZXRob2QiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsIlR5cGVFcnJvciIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXNOYU4iLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJoYW5kbGUiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJfYXN5bmNUb0dlbmVyYXRvciIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJfc2xpY2VkVG9BcnJheSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwiQXJyYXkiLCJmcm9tIiwidGVzdCIsImlzQXJyYXkiLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiX29iamVjdFNwcmVhZCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJfZGVmaW5lUHJvcGVydGllcyIsIl90b1ByaW1pdGl2ZSIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwiX2dldFByb3RvdHlwZU9mIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJSZWZlcmVuY2VFcnJvciIsIkJvb2xlYW4iLCJ2YWx1ZU9mIiwiYmluZCIsIl9zZXRQcm90b3R5cGVPZiIsIlJlcXVlc3QiLCJlbGVtZW50IiwiaGFuZGxlciIsIm9wdGlvbnMiLCJfdGhpcyIsImlzSGFuZGxlck5hbWUiLCJtYXRjaGVkRWxlbWVudCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImNvbmNhdCIsImZldGNoT3B0aW9ucyIsInJlc3BvbnNlRGF0YSIsInJlc3BvbnNlRXJyb3IiLCJjYW5jZWxsZWQiLCJjaGVja1JlcXVlc3QiLCJnbG9iYWxFdmVudCIsImV2ZW50IiwiRXZlbnQiLCJjYW5jZWxhYmxlIiwicmVxdWVzdCIsImRpc3BhdGNoRXZlbnQiLCJkZWZhdWx0UHJldmVudGVkIiwiZG9DbGllbnRWYWxpZGF0aW9uIiwiY29uZmlybSIsImRvQ29uZmlybSIsImNvbmZpcm1lZCIsImRvQWpheCIsInJlc3BvbnNlIiwicHJvY2Vzc1VwZGF0ZSIsIlhfV0lOVEVSX1NVQ0NFU1MiLCJwcm9jZXNzRXJyb3IiLCJwcm9jZXNzUmVzcG9uc2UiLCJlcnJvciIsIkVsZW1lbnQiLCJ1bmRlZmluZWQiLCJnZXRGZXRjaCIsImhlYWRlcnMiLCJib2R5IiwiZGF0YSIsInJlZGlyZWN0IiwibW9kZSIsImZldGNoIiwidXJsIiwiYnJvd3NlclZhbGlkYXRlIiwiZm9ybSIsImNoZWNrVmFsaWRpdHkiLCJyZXBvcnRWYWxpZGl0eSIsIl90aGlzMiIsImFqYXhQcm9taXNlIiwicmVqZWN0Iiwib2siLCJzdGF0dXMiLCJoYXMiLCJnZXQiLCJpbmNsdWRlcyIsImpzb24iLCJtZXNzYWdlIiwiZXhjZXB0aW9uIiwicmVuZGVyRXJyb3IiLCJmaWxlIiwibGluZSIsInRyYWNlIiwidGV4dCIsInJlc3BvbnNlVGV4dCIsIlhfV0lOVEVSX1JFU1BPTlNFX0NPREUiLCJwcm9taXNlIiwiX3RoaXMzIiwiYmVmb3JlVXBkYXRlIiwicGFydGlhbHMiLCJlbnRyaWVzIiwiZW50cnkiLCJfZW50cnkiLCJzdWJzdHIiLCJYX1dJTlRFUl9BU1NFVFMiLCJwcm9jZXNzQXNzZXRzIiwicHJvbWlzZXMiLCJnbG9iYWxQcm9taXNlRXZlbnQiLCJfY2FsbGVlIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImRvVXBkYXRlIiwid2luZG93IiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiX3RoaXM0IiwiYWZmZWN0ZWQiLCJfZW50cnkyIiwicGFydGlhbCIsImNvbnRlbnQiLCJzZWxlY3RvciIsInVwZGF0ZSIsImVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsImlubmVySFRNTCIsInN1Y2Nlc3MiLCJmbGFzaCIsIlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTIiwicHJvY2Vzc0ZsYXNoTWVzc2FnZXMiLCJYX1dJTlRFUl9SRURJUkVDVCIsInByb2Nlc3NSZWRpcmVjdCIsInByb2Nlc3NFcnJvck1lc3NhZ2UiLCJza2lwRXJyb3IiLCJYX1dJTlRFUl9FUlJPUl9GSUVMRFMiLCJwcm9jZXNzVmFsaWRhdGlvbkVycm9ycyIsIlhfV0lOVEVSX0VSUk9SX01FU1NBR0UiLCJfdGhpczUiLCJoYW5kbGVSZWRpcmVjdFJlc3BvbnNlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNyZWF0ZUV2ZW50IiwiZXZlbnROYW1lIiwib25jZSIsImxvY2F0aW9uIiwiYXNzaWduIiwiaGFuZGxlRXJyb3JNZXNzYWdlIiwiYWxlcnQiLCJtZXNzYWdlcyIsImhhbmRsZUZsYXNoTWVzc2FnZXMiLCJmaWVsZHMiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3JzIiwiYXNzZXRzIiwiX2RvQ29uZmlybSIsIl9jYWxsZWUyIiwiZnVsZmlsbGVkIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiaGFuZGxlQ29uZmlybU1lc3NhZ2UiLCJsaXN0ZW5zVG9FdmVudCIsInQwIiwidGFnTmFtZSIsImNsb3Nlc3QiLCJleHRyYWN0UGFydGlhbHMiLCJ4c3JmVG9rZW4iLCJsb2FkaW5nIiwiaHJlZiIsImZpbGVzIiwiRm9ybURhdGEiLCJkZWJ1ZyIsImNvb2tpZSIsImZvcm1EYXRhIiwiX2VudHJ5MyIsImFwcGVuZCIsImpvaW4iLCJBdHRyaWJ1dGVSZXF1ZXN0IiwiX1NpbmdsZXRvbiIsInJlYWR5IiwiYWpheFNldHVwIiwiYXR0YWNoSGFuZGxlcnMiLCJkaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uIiwiZGV0YWNoSGFuZGxlcnMiLCJfZ2V0IiwiY2hhbmdlSGFuZGxlciIsImNsaWNrSGFuZGxlciIsImtleURvd25IYW5kbGVyIiwic3VibWl0SGFuZGxlciIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ0YXJnZXQiLCJtYXRjaGVzIiwicHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQiLCJjdXJyZW50RWxlbWVudCIsInBhcmVudEVsZW1lbnQiLCJwcmV2ZW50RGVmYXVsdCIsInZhbGlkVHlwZXMiLCJpbmRleE9mIiwiZ2V0QXR0cmlidXRlIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwidHJhY2tJbnB1dCIsImRhdGFzZXQiLCJyZXF1ZXN0Q29uZmlybSIsInJlcXVlc3RSZWRpcmVjdCIsInJlcXVlc3RMb2FkaW5nIiwicmVxdWVzdEZvcm0iLCJyZXF1ZXN0VXJsIiwicGFyc2VEYXRhIiwicmVxdWVzdFVwZGF0ZSIsInJlcXVlc3REYXRhIiwib25BamF4U2V0dXAiLCJmaWVsZE5hbWUiLCJnZXRQYXJlbnRSZXF1ZXN0RGF0YSIsImVsZW1lbnREYXRhIiwianNvbnBhcnNlciIsInBhcnNlIiwibGFzdFZhbHVlIiwiaW50ZXJ2YWwiLCJyZXNldFRyYWNrSW5wdXRUaW1lciIsImlucHV0VGltZXIiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfbiIsIkYiLCJBc3NldExvYWRlciIsImFqYXhMb2FkQXNzZXRzIiwiX2xvYWQiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInNjcmlwdCIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJzdHlsZSIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJpbWFnZSIsImpzIiwibG9hZFNjcmlwdCIsInQxIiwiY3NzIiwibG9hZFN0eWxlIiwidDIiLCJ0MyIsImltZyIsImxvYWRJbWFnZSIsInQ0IiwidDUiLCJsb2FkIiwiX3giLCJhc3NldCIsImxvYWRlZCIsImRvbVNjcmlwdCIsImNyZWF0ZUVsZW1lbnQiLCJkb21Dc3MiLCJoZWFkIiwiSW1hZ2UiLCJzcmMiLCJBdHRhY2hMb2FkaW5nIiwiYWpheFN0YXJ0IiwiYWpheERvbmUiLCJsb2FkRWxlbWVudHMiLCJjbGFzc0xpc3QiLCJhZGQiLCJnZXRMb2FkaW5nQ2xhc3MiLCJhdHRhY2hMb2FkaW5nIiwicmVtb3ZlIiwiRGF0YUNvbmZpZyIsImluc3RhbmNlIiwibG9jYWxDb25maWciLCJIVE1MRWxlbWVudCIsImluc3RhbmNlQ29uZmlnIiwiYWNjZXB0ZWRDb25maWdzIiwicmVmcmVzaCIsImNvbmZpZyIsInNldCIsInBlcnNpc3QiLCJnZXRBY2NlcHRlZENvbmZpZ3MiLCJwcm9jZXNzQ29uZmlnIiwiYWNjZXB0QWxsRGF0YUNvbmZpZ3MiLCJkZWZhdWx0cyIsImdldERlZmF1bHRzIiwiY29lcmNlVmFsdWUiLCJzdHJpbmdWYWx1ZSIsInN0YXJ0c1dpdGgiLCJiYXNlNjRzdHIiLCJyZXBsYWNlIiwiZGVjb2RlZCIsImF0b2IiLCJ0b0xvd2VyQ2FzZSIsImpzb25QYXJzZXIiLCJGbGFzaCIsImR1cmF0aW9uIiwiY2xlYXIiLCJ0aW1lciIsImZsYXNoVGltZXIiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzdG9wVGltZXIiLCJzdGFydFRpbWVyIiwiYXBwZW5kQ2hpbGQiLCJ0cmFuc2l0aW9uIiwidGltZXJUcmFucyIsImNhbmNlbCIsIkZsYXNoTGlzdGVuZXIiLCJhamF4RXJyb3JNZXNzYWdlIiwiYWpheEZsYXNoTWVzc2FnZXMiLCJmbGFzaFR5cGUiLCJmbGFzaER1cmF0aW9uIiwiY3NzQ2xhc3MiLCJGb3JtVmFsaWRhdGlvbiIsImVycm9yQmFncyIsImFqYXhWYWxpZGF0aW9uRXJyb3JzIiwiY29sbGVjdEVycm9yQmFncyIsImRvVmFsaWRhdGlvbiIsImludmFsaWRGaWVsZHMiLCJyZXF1ZXN0VmFsaWRhdGUiLCJlcnJvckJhZyIsInNob3dFcnJvckJhZyIsImNsZWFyVmFsaWRhdGlvbiIsImhpZGVFcnJvckJhZyIsInJvb3ROb2RlIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwibWVzc2FnZUxpc3RFbGVtZW50IiwicGxhY2Vob2xkZXIiLCJjcmVhdGVDb21tZW50IiwiZXJyb3JCYWdEYXRhIiwidmFsaWRhdGVGb3IiLCJzcGxpdCIsImNsb25lTm9kZSIsIm1lc3NhZ2VMaXN0QW5jaG9yIiwiY3VzdG9tTWVzc2FnZSIsInRleHRDb250ZW50IiwiY2hpbGROb2RlcyIsInJlcGxhY2VDaGlsZCIsImlzQ29ubmVjdGVkIiwiZXJyb3JCYWdWYWxpZGF0ZXNGaWVsZCIsImZpcnN0RmllbGQiLCJmaWVsZCIsInNoaWZ0IiwiX2ludmFsaWRGaWVsZHMkZmlyc3RGIiwiZXJyb3JzIiwibWVzc2FnZUVsZW1lbnQiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsImFmdGVyIiwiX2ludmFsaWRGaWVsZHMkT2JqZWN0IiwiU3RyaXBlTG9hZGVyIiwiY291bnRlciIsImNyZWF0ZVN0cmlwZSIsInN0cmlwZSIsInNob3ciLCJoaWRlIiwiaW5kaWNhdG9yIiwic3RyaXBlTG9hZGVkIiwibmV3U3RyaXBlIiwiZm9yY2UiLCJTdHlsZXNoZWV0TG9hZGVyIiwic3R5bGVzTG9hZGVkIiwiZW5kc1dpdGgiLCJzdHlsZXNoZWV0IiwiVHJhbnNpdGlvbiIsImNhbGxiYWNrIiwidHJhaWxUbyIsInBhcnNlRHVyYXRpb24iLCJkb1RyYW5zaXRpb24iLCJldmVudENsYXNzZXMiLCJfbGVuIiwiYXJncyIsIl9rZXkiLCJhY3RpdmUiLCJvdXQiLCJyZXR1cm5DbGFzc2VzIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwicmVzZXRDbGFzc2VzIiwiZXZlbnRDbGFzcyIsImdldENvbXB1dGVkU3R5bGUiLCJvblRyYW5zaXRpb25FbmQiLCJwYXJzZWQiLCJleGVjIiwiYW1vdW50IiwidW5pdCIsIk1hdGgiLCJmbG9vciIsIlRyaWdnZXIiLCJ0cmlnZ2VycyIsIk1hcCIsImV2ZW50cyIsImNvbm5lY3RvcnMiLCJwYXJzZVRyaWdnZXJzIiwic2l6ZSIsInJlc2V0RXZlbnRzIiwiY3JlYXRlVHJpZ2dlckV2ZW50cyIsInJ1bkV2ZW50cyIsImRhc2hTdHlsZSIsIm1hdGNoIiwidHJpZ2dlclBhcnRzIiwidHJpZ2dlck5hbWUiLCJ0cmlnZ2VyVHlwZSIsIl90cmlnZ2VyUGFydHMiLCJ0cmlnZ2VyIiwiZ2V0U2VsZWN0YWJsZUVsZW1lbnRzIiwiaXNWYWxpZENvbmRpdGlvbiIsImlzVmFsaWRBY3Rpb24iLCJwYXJzZUNvbW1hbmQiLCJjb21tYW5kIiwidHJpbSIsInNwbGl0VmFsdWVzIiwicXVvdGVkIiwibWFwIiwic3BsaXRWYWx1ZSIsIl90b0NvbnN1bWFibGVBcnJheSIsInBhcmFtZXRlcnMiLCJfY29tbWFuZCRzcGxpdCIsIl9jb21tYW5kJHNwbGl0MiIsIl9wYXJhbWV0ZXJzJCIsIl90aGlzMiRwYXJzZUNvbW1hbmQiLCJjcmVhdGVWYWx1ZUV2ZW50IiwiY3JlYXRlRW1wdHlFdmVudCIsImNyZWF0ZUNoZWNrZWRFdmVudCIsImFsbCIsInN1cHBvcnRlZEVsZW1lbnRzIiwiU2V0IiwidGhpc0V2ZW50IiwiZWxlbWVudFZhbHVlcyIsImNoZWNrZWQiLCJldmVyeSIsImV4ZWN1dGVBY3Rpb24iLCJzb21lIiwiYWRkRXZlbnQiLCJhdExlYXN0IiwiYXRMZWFzdENvdW50IiwiX3RoaXM2IiwicHJpb3JpdHkiLCJlbGVtZW50RXZlbnQiLCJzb3J0IiwiYiIsImVsZW1lbnRDb25uZWN0b3JzIiwiY29ubmVjdG9yIiwiY29uZGl0aW9uTWV0IiwiX3RoaXMkcGFyc2VDb21tYW5kIiwiYWN0aW9uU2hvdyIsImRpc3BsYXkiLCJvcmlnaW5hbERpc3BsYXkiLCJhZnRlckFjdGlvbiIsInByb3AiLCJyZWNlaXZlciIsInByb3BMb3dlciIsImhhc1BsdWdpbiIsIl9SZWZsZWN0JGdldCRwcm9wTG93ZSIsImdldEluc3RhbmNlIiwiSW5uZXJQcm94eUhhbmRsZXIiLCJQbHVnaW5Mb2FkZXIiLCJQcm94eSIsImZyZWV6ZSIsImluc3RhbmNlcyIsInNpbmdsZXRvbiIsImluaXRpYWxpc2VkIiwic2VhbCIsIm1vY2tzIiwib3JpZ2luYWxGdW5jdGlvbnMiLCJoYXNNZXRob2QiLCJtZXRob2ROYW1lIiwiaXNGdW5jdGlvbiIsImNhbGxNZXRob2QiLCJfbGVuMiIsIl9rZXkyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwidW5tZXQiLCJnZXREZXBlbmRlbmNpZXMiLCJpdGVtIiwiZ2V0UGx1Z2luTmFtZXMiLCJpc1NpbmdsZXRvbiIsImluaXRpYWxpc2VTaW5nbGV0b24iLCJfbGVuMyIsInBhcmFtcyIsIl9rZXkzIiwiX2VudHJ5NCIsIl9sZW40IiwiX2tleTQiLCJuZXdJbnN0YW5jZSIsIl9jb25zdHJ1Y3QiLCJzcGxpY2UiLCJnZXRJbnN0YW5jZXMiLCJpc0luaXRpYWxpc2VkIiwiX2xlbjUiLCJfa2V5NSIsInBsdWdpbiIsIm1vY2siLCJfbGVuNiIsIl9rZXk2IiwidW5tb2NrIiwiQ29va2llIiwiSnNvblBhcnNlciIsIlNhbml0aXplciIsIlVybCIsIlNub3dib2FyZCIsImF1dG9TaW5nbGV0b25zIiwiZGVidWdFbmFibGVkIiwiYXV0b0luaXRTaW5nbGV0b25zIiwicGx1Z2lucyIsImxpc3RlbmVycyIsImZvdW5kQmFzZVVybCIsInJlYWRpbmVzcyIsImRvbSIsImF0dGFjaEFic3RyYWN0cyIsImxvYWRVdGlsaXRpZXMiLCJpbml0aWFsaXNlIiwiYWRkUGx1Z2luIiwiaW5pdGlhbGlzZVNpbmdsZXRvbnMiLCJsb3dlck5hbWUiLCJnZXRQbHVnaW5zIiwicmVhZHlNZXRob2QiLCJyZW1vdmVQbHVnaW4iLCJnZXRQbHVnaW4iLCJvbiIsIm9mZiIsImluZGV4IiwibGlzdGVuTWV0aG9kIiwicmVzdWx0IiwibGlzdGVuZXIiLCJpbnN0YW5jZVByb21pc2UiLCJsaXN0ZW5lclByb21pc2UiLCJsb2dNZXNzYWdlIiwiY29sb3IiLCJib2xkIiwiY29uc29sZSIsImdyb3VwQ29sbGFwc2VkIiwicGFyYW0iLCJsb2ciLCJncm91cEVuZCIsIkJhc2VDb29raWUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsInNhbWVTaXRlIiwic2V0RGVmYXVsdHMiLCJjb29raWVzIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlIiwibmV3VmFsdWUiLCJzYXZlVmFsdWUiLCJ3bkpTT04iLCJvY0pTT04iLCJzdHIiLCJqc29uU3RyaW5nIiwicGFyc2VTdHJpbmciLCJKU09OIiwibnVtIiwiaXNCbGFua0NoYXIiLCJwYXJzZUtleSIsImNhbkJlS2V5SGVhZCIsImdldEJvZHkiLCJvcmlnaW5MZW5ndGgiLCJsYXN0IiwicG9zIiwic3RhY2siLCJxdW90ZSIsImNoIiwiY2hhckNvZGVBdCIsInduU2FuaXRpemUiLCJodG1sIiwic2FuaXRpemUiLCJvY1Nhbml0aXplIiwiYm9keU9ubHkiLCJwYXJzZXIiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJyZXR1cm5Cb2R5T25seSIsInNhbml0aXplTm9kZSIsImdldFJvb3ROb2RlIiwibm9kZSIsInRyaW1BdHRyaWJ1dGVzIiwiY2hpbGRyZW4iLCJjaGlsZCIsImF0dHJpYnV0ZXMiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImZvdW5kQXNzZXRVcmwiLCJiYXNlVXJsIiwiYXNzZXRVcmwiLCJ0byIsInVybFJlZ2V4IiwidGhlVXJsIiwidmFsaWRhdGVCYXNlVXJsIiwidXJsUGFydHMiLCJwcm90b2NvbCIsImhvc3QiLCJQcm94eUhhbmRsZXIiLCJTbm93Qm9hcmQiLCJfcmVmIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLE1BQU0scUJBQXFCO1dBQzNCO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTtXQUNBOzs7OztVRWpEQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvUGx1Z2luQmFzZS5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvU2luZ2xldG9uLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L2hhbmRsZXJzL0F0dHJpYnV0ZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Fzc2V0TG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9BdHRhY2hMb2FkaW5nLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9EYXRhQ29uZmlnLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2hMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRm9ybVZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0cmlwZUxvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3R5bGVzaGVldExvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL0lubmVyUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUGx1Z2luTG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9Db29raWUuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL0pzb25QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL1Nhbml0aXplci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC91dGlsaXRpZXMvVXJsLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9qcy9zcmMvYXBwLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy9qcy1jb29raWUvZGlzdC9qcy5jb29raWUubWpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gYmFzZSBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBwbHVnaW5zLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCB0aGUgU25vd2JvYXJkIGZyYW1ld29yayBpbnN0YW5jZSwgYW5kIHNob3VsZCBub3QgYmUgb3ZlcndyaXR0ZW5cbiAgICAgKiB1bmxlc3MgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U25vd2JvYXJkfSBzbm93Ym9hcmRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihzbm93Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRydWUgY29uc3RydWN0b3Igb2YgYSBwbHVnaW4sIGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4uXG4gICAgICogSXQgd2lsbCBiZSBjYWxsZWQgc3RyYWlnaHQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSByZXF1aXJlZCBwbHVnaW5zIGZvciB0aGlzIHNwZWNpZmljIG1vZHVsZSB0byB3b3JrLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwbHVnaW5zIHJlcXVpcmVkIGZvciB0aGlzIG1vZHVsZSB0byB3b3JrLCBhcyBzdHJpbmdzLlxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGxpc3RlbmVyIG1ldGhvZHMgZm9yIGdsb2JhbCBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEZpcmVkIHdoZW4gdGhpcyBwbHVnaW4gaXMgcmVtb3ZlZC4gQ2FuIGJlIG1hbnVhbGx5IGNhbGxlZCBpZiB5b3UgaGF2ZSBhbm90aGVyIHNjZW5hcmlvIGZvclxuICAgICAqIGRlc3RydWN0aW9uLCBpZS4gdGhlIGVsZW1lbnQgYXR0YWNoZWQgdG8gdGhlIHBsdWdpbiBpcyByZW1vdmVkIG9yIGNoYW5nZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNub3dib2FyZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3RvciAob2xkIG1ldGhvZCBuYW1lKS5cbiAgICAgKlxuICAgICAqIEFsbG93cyBwcmV2aW91cyB1c2FnZSBvZiB0aGUgXCJkZXN0cnVjdG9yXCIgbWV0aG9kIHRvIHN0aWxsIHdvcmsuXG4gICAgICovXG4gICAgZGVzdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4vUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogU2luZ2xldG9uIHBsdWdpbiBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGlzIGEgc3BlY2lhbCBkZWZpbml0aW9uIGNsYXNzIHRoYXQgdGhlIFNub3dib2FyZCBmcmFtZXdvcmsgd2lsbCB1c2UgdG8gaW50ZXJwcmV0IHRoZSBjdXJyZW50IHBsdWdpbiBhcyBhXG4gKiBcInNpbmdsZXRvblwiLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiBjbGFzcyBpcyB1c2VkIGFjcm9zcyB0aGUgYm9hcmQuXG4gKlxuICogU2luZ2xldG9ucyBhcmUgaW5pdGlhbGlzZWQgb24gdGhlIFwiZG9tUmVhZHlcIiBldmVudCBieSBkZWZhdWx0LlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBSZXF1ZXN0IHBsdWdpbi5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IEFKQVggaGFuZGxlciB3aGljaCB3aWxsIHJ1biB1c2luZyB0aGUgYGZldGNoKClgIG1ldGhvZCB0aGF0IGlzIGRlZmF1bHQgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyAyIG9yIDMgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIElmIDIgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGhhbmRsZXIgbmFtZSBhbmQgdGhlIHNlY29uZFxuICAgICAqIHBhcmFtZXRlciBpcyB0aGUgb3B0aW9ucy4gVGhpcyBhc3N1bWVzIHRoYXQgdGhpcyBpcyBhIGRldGFjaGVkIEFKQVggcmVxdWVzdCBub3QgY29ubmVjdGVkIHRvXG4gICAgICogYW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIDMgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gZWxlbWVudCBvciBhIHNlbGVjdG9yLCBhbmQgdGhlIHNlY29uZFxuICAgICAqIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIGFyZSB0aGUgaGFuZGxlciBhbmQgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IGhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdChlbGVtZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGJlIGEgaGFuZGxlciBuYW1lLlxuICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoZSByZXF1ZXN0IGlzIGJlaW5nIG1hZGUgYWdhaW5zdCBubyBlbGVtZW50LCBhbmQgdGhlIGhhbmRsZXIgcGFyYW1ldGVyXG4gICAgICAgICAgICAvLyB3aWxsIGNvbnRhaW4gb3B0aW9ucy5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGFuZGxlck5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gaGFuZGxlciB8fCB7fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGVsZW1lbnQgd2FzIGZvdW5kIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yOiAke2VsZW1lbnR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG1hdGNoZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb25zID0ge307XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdCgpO1xuICAgICAgICBpZiAoIXRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U2V0dXAnLCB0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4U2V0dXAnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRvQ2xpZW50VmFsaWRhdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maXJtKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ29uZmlybSgpLnRoZW4oKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX1NVQ0NFU1MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlKHJlc3BvbnNlKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9TVUNDRVNTID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcyBmb3IgdGhpcyBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydjb29raWUnLCAnanNvblBhcnNlciddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgZWxlbWVudCBhbmQgaGFuZGxlciBnaXZlbiBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBjaGVja1JlcXVlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGVsZW1lbnQgcHJvdmlkZWQgbXVzdCBiZSBhbiBFbGVtZW50IGluc3RhbmNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFKQVggaGFuZGxlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNIYW5kbGVyTmFtZSh0aGlzLmhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQUpBWCBoYW5kbGVyIG5hbWUuIFRoZSBjb3JyZWN0IGhhbmRsZXIgbmFtZSBmb3JtYXQgaXM6IFwib25FdmVudFwiLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZldGNoIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtYWRlIGF2YWlsYWJsZSBmb3IgcGx1Z2lucyB0byBleHRlbmQgb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmV0Y2goKSBzZXR0aW5ncyB3aXRoIHRoZWlyIG93bi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGdldEZldGNoKCkge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9ucyA9ICh0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5mZXRjaE9wdGlvbnMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgICAgICAgICBtb2RlOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEZldGNoT3B0aW9ucycsIHRoaXMuZmV0Y2hPcHRpb25zLCB0aGlzKTtcblxuICAgICAgICByZXR1cm4gZmV0Y2godGhpcy51cmwsIHRoaXMuZmV0Y2hPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBvbiB0aGUgZm9ybSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZG9DbGllbnRWYWxpZGF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJWYWxpZGF0ZSA9PT0gdHJ1ZSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY2hlY2tWYWxpZGl0eSgpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBBSkFYIHF1ZXJ5LlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB3aGVuIHRoZSBBSkFYIHJlcXVlc3QgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9BamF4KCkge1xuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgQUpBWCByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEJlZm9yZVNlbmQnLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWpheFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEZldGNoKCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vayAmJiByZXNwb25zZS5zdGF0dXMgIT09IDQwNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykuaW5jbHVkZXMoJy9qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5qc29uKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5tZXNzYWdlICYmIHJlc3BvbnNlRGF0YS5leGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5leGNlcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5maWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLnRyYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRleHQoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VUZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihyZXNwb25zZVRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHByb2Nlc3MgcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKS5pbmNsdWRlcygnL2pzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfV0lOVEVSX1NVQ0NFU1M6IHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9XSU5URVJfUkVTUE9OU0VfQ09ERTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcjogJHtyZXNwb25zZUVycm9yfWApKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhTdGFydCcsIGFqYXhQcm9taXNlLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFByb21pc2UnKTtcbiAgICAgICAgICAgIGV2ZW50LnByb21pc2UgPSBhamF4UHJvbWlzZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhamF4UHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBmb3IgdXBkYXRpbmcgdGhlIHBhcnRpYWxzIGZyb20gdGhlIEFKQVggcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBJZiBhbnkgcGFydGlhbHMgYXJlIHJldHVybmVkIGZyb20gdGhlIEFKQVggcmVzcG9uc2UsIHRoaXMgbWV0aG9kIHdpbGwgYWxzbyBhY3Rpb24gdGhlIHBhcnRpYWwgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIG9iamVjdCB3aGljaCB0cmFja3Mgd2hlbiB0aGUgcGFydGlhbCB1cGRhdGUgaXMgY29tcGxldGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBwcm9jZXNzVXBkYXRlKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJlZm9yZVVwZGF0ZS5hcHBseSh0aGlzLCBbcmVzcG9uc2VdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFeHRyYWN0IHBhcnRpYWwgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxzID0ge307XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDgpICE9PSAnWF9XSU5URVInKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcnRpYWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4QmVmb3JlVXBkYXRlJywgcmVzcG9uc2UsIHRoaXMpO1xuICAgICAgICAgICAgcHJvbWlzZXMudGhlbihcbiAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1VwZGF0ZShwYXJ0aWFscykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgSFRNTCByZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBwYXJ0aWFscyB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnRpYWxzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9VcGRhdGUocGFydGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhZmZlY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXJ0aWFscykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcGFydGlhbCwgY29udGVudF0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvciA9ICh0aGlzLm9wdGlvbnMudXBkYXRlICYmIHRoaXMub3B0aW9ucy51cGRhdGVbcGFydGlhbF0pXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5vcHRpb25zLnVwZGF0ZVtwYXJ0aWFsXVxuICAgICAgICAgICAgICAgICAgICA6IHBhcnRpYWw7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9kZSA9ICdyZXBsYWNlJztcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ2FwcGVuZCc7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpID09PSAnXicpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdwcmVwZW5kJztcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcjJyAmJiBzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ25vb3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXBwZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgKz0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJlcGVuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudCArIGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdub29wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVwbGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWQucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSB1cGRhdGUgZXZlbnQgZm9yIGVhY2ggZWxlbWVudCB0aGF0IGlzIHVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VXBkYXRlJywgZWxlbWVudCwgY29udGVudCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFVwZGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhVcGRhdGVDb21wbGV0ZScsIGFmZmVjdGVkLCB0aGlzKTtcblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIHJlc3BvbnNlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBmbGFzaFxuICAgICAqIG1lc3NhZ2VzIHRvIGhhbmRsZSwgb3IgYW55IHJlZGlyZWN0cyB0byBiZSB1bmRlcnRha2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2VzcyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2Vzcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgYW55IGZ1cnRoZXIgcmVzcG9uc2UgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U3VjY2VzcycsIHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciByZXNwb25zZSBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheERvbmUnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZURhdGEgPSB0aGlzLnJlc3BvbnNlRGF0YTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoICYmIHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NGbGFzaE1lc3NhZ2VzKHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBhIHJlZGlyZWN0IGZyb20gdGhlIHJlc3BvbnNlLCBvciB1c2UgdGhlIHJlZGlyZWN0IGFzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlZGlyZWN0KHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgZXJyb3IgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBlcnJvciBvclxuICAgICAqIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8RXJyb3J9IGVycm9yXG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvcih0aGlzLnJlc3BvbnNlRXJyb3IsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yJywgdGhpcy5yZXNwb25zZUVycm9yLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheEZhaWwnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBza2lwRXJyb3IgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX0ZJRUxEUykge1xuICAgICAgICAgICAgICAgIHNraXBFcnJvciA9IHRoaXMucHJvY2Vzc1ZhbGlkYXRpb25FcnJvcnMoZXJyb3IuWF9XSU5URVJfRVJST1JfRklFTERTKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX01FU1NBR0UgJiYgIXNraXBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5YX1dJTlRFUl9FUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSByZWRpcmVjdCByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2Vzc29yIHdpbGwgc2ltcGx5IHJlZGlyZWN0IHRoZSB1c2VyIGluIHRoZWlyIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheFJlZGlyZWN0YCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBvblxuICAgICAqIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZVJlZGlyZWN0UmVzcG9uc2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiByZWRpcmVjdCB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcm9jZXNzUmVkaXJlY3QodXJsKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCByZWRpcmVjdCBoYW5kbGVyLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgZG9uJ3QgcnVuIHRoZSByZWRpcmVjdC5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlUmVkaXJlY3RSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVSZWRpcmVjdFJlc3BvbnNlLmFwcGx5KHRoaXMsIFt1cmxdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgcmVkaXJlY3RcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4UmVkaXJlY3QnLCB1cmwsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgQUpBWCByZXF1ZXN0IGlzIGZpbmlzaGVkIGlmIHdlJ3JlIHN0aWxsIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgbG9hZGluZyBpbmRpY2F0b3IgZm9yIHJlZGlyZWN0cyB0aGF0IGp1c3QgY2hhbmdlIHRoZSBoYXNoIHZhbHVlIG9mXG4gICAgICAgIC8vIHRoZSBVUkwgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBwYWdlIHdpbGwgcHJvcGVybHkgc3RvcC5cbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2JlcmNtcy9vY3RvYmVyL2lzc3Vlcy8yNzgwXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50TmFtZSA9ICdhamF4UmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3NvciB3aWxsIHNpbXBseSBhbGVydCB0aGUgdXNlciB0aHJvdWdoIGEgc2ltcGxlIGBhbGVydCgpYCBjYWxsLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhFcnJvck1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlRXJyb3JNZXNzYWdlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogZXJyb3IgbWVzc2FnZSBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCBoYW5kbGVyIGZvciBlcnJvciBtZXNzYWdlcy4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvIG5vdCBwcm9jZXNzIHRoZSBlcnJvciBtZXNzYWdlc1xuICAgICAgICAvLyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRXJyb3JNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUVycm9yTWVzc2FnZS5hcHBseSh0aGlzLCBbbWVzc2FnZV0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIHRoZSBlcnJvciBtZXNzYWdlIGJlaW5nIHNob3duXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yTWVzc2FnZScsIG1lc3NhZ2UsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgc2hvdyBhIGJyb3dzZXIgZXJyb3IgbWVzc2FnZVxuICAgICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGZsYXNoIG1lc3NhZ2VzIGZyb20gdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgbm8gZmxhc2ggbWVzc2FnZSBoYW5kbGluZyB3aWxsIG9jY3VyLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhGbGFzaE1lc3NhZ2VzYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUZsYXNoTWVzc2FnZXNgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiBmbGFzaCBtZXNzYWdlIGhhbmRsaW5nIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2VzXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcm9jZXNzRmxhc2hNZXNzYWdlcyhtZXNzYWdlcykge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgZmxhc2ggaGFuZGxlci4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvbid0IHNob3cgdGhlIGZsYXNoIG1lc3NhZ2VcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRmxhc2hNZXNzYWdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVGbGFzaE1lc3NhZ2VzLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4Rmxhc2hNZXNzYWdlcycsIG1lc3NhZ2VzLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIG5vIHZhbGlkYXRpb24gZXJyb3IgaGFuZGxpbmcgd2lsbCBvY2N1ci5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4VmFsaWRhdGlvbkVycm9yc2AgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVWYWxpZGF0aW9uRXJyb3JzYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogdmFsaWRhdGlvbiBlcnJvciBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHNcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzKGZpZWxkcykge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZVZhbGlkYXRpb25FcnJvcnMuYXBwbHkodGhpcywgW3RoaXMuZm9ybSwgZmllbGRzXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgYmVpbmcgaGFuZGxlZFxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhWYWxpZGF0aW9uRXJyb3JzJywgdGhpcy5mb3JtLCBmaWVsZHMsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFzc2V0cyByZXR1cm5lZCBieSBhbiBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBubyBhc3NldCBwcm9jZXNzaW5nIHdpbGwgb2NjdXIgYW5kIHRoaXMgd2lsbCByZXR1cm4gYSByZXNvbHZlZCBQcm9taXNlLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhMb2FkQXNzZXRzYCBldmVudC4gVGhpcyBldmVudCBpcyBjb25zaWRlcmVkIGJsb2NraW5nLCBhbmRcbiAgICAgKiBhbGxvd3MgYXNzZXRzIHRvIGJlIGxvYWRlZCBvciBwcm9jZXNzZWQgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCBhbnkgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFzc2V0c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHByb2Nlc3NBc3NldHMoYXNzZXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5nbG9iYWxQcm9taXNlRXZlbnQoJ2FqYXhMb2FkQXNzZXRzJywgYXNzZXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maXJtcyB0aGUgcmVxdWVzdCB3aXRoIHRoZSB1c2VyIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgbWV0aG9kLiBCeSBkZWZhdWx0LCBpdCB3aWxsIHVzZSB0aGUgYnJvd3NlcidzIGBjb25maXJtKClgIG1ldGhvZCB0byBxdWVyeSB0aGUgdXNlciB0b1xuICAgICAqIGNvbmZpcm0gdGhlIGFjdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBQcm9taXNlIHdpdGggYSBib29sZWFuIHZhbHVlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB1c2VyIGNvbmZpcm1lZFxuICAgICAqIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4Q29uZmlybU1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlQ29uZmlybU1lc3NhZ2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLFxuICAgICAqIHRoZSBjb25maXJtYXRpb24gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gZGVuaWVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYXN5bmMgZG9Db25maXJtKCkge1xuICAgICAgICAvLyBBbGxvdyBmb3IgYSBjdXN0b20gaGFuZGxlciBmb3IgdGhlIGNvbmZpcm1hdGlvbiwgcGVyIHJlcXVlc3QuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlLmFwcGx5KHRoaXMsIFt0aGlzLmNvbmZpcm1dKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gcGx1Z2lucyBoYXZlIGN1c3RvbWlzZWQgdGhlIGNvbmZpcm1hdGlvbiwgdXNlIGEgc2ltcGxlIGJyb3dzZXIgY29uZmlybWF0aW9uLlxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQubGlzdGVuc1RvRXZlbnQoJ2FqYXhDb25maXJtTWVzc2FnZScpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5jb25maXJtKHRoaXMuY29uZmlybSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gY3VzdG9tIHBsdWdpbiBjb25maXJtYXRpb25zXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4Q29uZmlybU1lc3NhZ2UnLCB0aGlzLmNvbmZpcm0sIHRoaXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdWxmaWxsZWQgPSBhd2FpdCBwcm9taXNlcztcbiAgICAgICAgICAgIGlmIChmdWxmaWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIG9mZiBjb21wbGV0aW9uIGV2ZW50cyBmb3IgdGhlIFJlcXVlc3QuXG4gICAgICovXG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGxldGUgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbXBsZXRlKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheERvbmUnLCB0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhBbHdheXMnKTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VEYXRhID0gdGhpcy5yZXNwb25zZURhdGE7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZSBvZmYgdGhlIGRlc3RydWN0b3JcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIGdldCBmb3JtKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5vcHRpb25zLmZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mb3JtO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xvc2VzdCgnZm9ybScpO1xuICAgIH1cblxuICAgIGdldCBjb250ZXh0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBoZWFkZXJzKCkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLCAvLyBLZWVwcyBjb21wYXRpYmlsaXR5IHdpdGggalF1ZXJ5IEFKQVhcbiAgICAgICAgICAgICdYLVdJTlRFUi1SRVFVRVNULUhBTkRMRVInOiB0aGlzLmhhbmRsZXIsXG4gICAgICAgICAgICAnWC1XSU5URVItUkVRVUVTVC1QQVJUSUFMUyc6IHRoaXMuZXh0cmFjdFBhcnRpYWxzKHRoaXMub3B0aW9ucy51cGRhdGUgfHwgW10pLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVdJTlRFUi1SRVFVRVNULUZMQVNIJ10gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMueHNyZlRva2VuKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVhTUkYtVE9LRU4nXSA9IHRoaXMueHNyZlRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9hZGluZyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG5cbiAgICBnZXQgcmVkaXJlY3QoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5vcHRpb25zLnJlZGlyZWN0ICYmIHRoaXMub3B0aW9ucy5yZWRpcmVjdC5sZW5ndGgpID8gdGhpcy5vcHRpb25zLnJlZGlyZWN0IDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZmxhc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmxhc2ggfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVzKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbGVzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoRm9ybURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmRlYnVnKCdUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBmaWxlIHVwbG9hZHMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldCB4c3JmVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5jb29raWUoKS5nZXQoJ1hTUkYtVE9LRU4nKTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9ICh0eXBlb2YgdGhpcy5vcHRpb25zLmRhdGEgPT09ICdvYmplY3QnKSA/IHRoaXMub3B0aW9ucy5kYXRhIDoge307XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5mb3JtIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGdldCBjb25maXJtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbmZpcm0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgcGFydGlhbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXBkYXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBleHRyYWN0UGFydGlhbHModXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh1cGRhdGUpLmpvaW4oJyYnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGFuIGVycm9yIHdpdGggdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIEFKQVggcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIG9yIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVlIHRvIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhjZXB0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGluZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRyYWNlXG4gICAgICogQHJldHVybnMge0Vycm9yfVxuICAgICAqL1xuICAgIHJlbmRlckVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbiwgZmlsZSwgbGluZSwgdHJhY2UpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGVycm9yLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbiB8fCBudWxsO1xuICAgICAgICBlcnJvci5maWxlID0gZmlsZSB8fCBudWxsO1xuICAgICAgICBlcnJvci5saW5lID0gbGluZSB8fCBudWxsO1xuICAgICAgICBlcnJvci50cmFjZSA9IHRyYWNlIHx8IFtdO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGEgZ2l2ZW4gc3RyaW5nIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIEFKQVggaGFuZGxlciBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0hhbmRsZXJOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIC9eKD86XFx3Kzp7Mn0pP29uW0EtWjAtOV0vLnRlc3QobmFtZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi8uLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBFbmFibGUgRGF0YSBBdHRyaWJ1dGVzIEFQSSBmb3IgQUpBWCByZXF1ZXN0cy5cbiAqXG4gKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBBSkFYIGZ1bmN0aW9uYWxpdHkgdGhhdCBpbmNsdWRlcyBoYW5kbGluZyBvZiBIVE1MIGRhdGEgYXR0cmlidXRlcyBmb3IgcHJvY2Vzc2luZ1xuICogQUpBWCByZXF1ZXN0cy4gSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIGJhc2UgQUpBWCBmdW5jdGlvbmFsaXR5IHRvIGFsbG93IGRldmVsb3BlcnMgdG8gb3B0LW91dCBvZiBkYXRhIGF0dHJpYnV0ZVxuICogcmVxdWVzdHMgaWYgdGhleSBkbyBub3QgaW50ZW5kIHRvIHVzZSB0aGVtLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRyaWJ1dGVSZXF1ZXN0IGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTZXR1cDogJ29uQWpheFNldHVwJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkeSBldmVudCBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEF0dGFjaGVzIGhhbmRsZXJzIHRvIHRoZSB3aW5kb3cgdG8gbGlzdGVuIGZvciBhbGwgcmVxdWVzdCBpbnRlcmFjdGlvbnMuXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoSGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCcsICdqc29uUGFyc2VyJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIERldGFjaGVzIGFsbCBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5kZXRhY2hIYW5kbGVycygpO1xuXG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGF0dGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBkZWZhdWx0IGZvcm0gdmFsaWRhdGlvbiBmb3IgQUpBWCBmb3Jtcy5cbiAgICAgKlxuICAgICAqIEEgZm9ybSB0aGF0IGNvbnRhaW5zIGEgYGRhdGEtcmVxdWVzdGAgYXR0cmlidXRlIHRvIHNwZWNpZnkgYW4gQUpBWCBjYWxsIHdpdGhvdXQgaW5jbHVkaW5nIGEgYGRhdGEtYnJvd3Nlci12YWxpZGF0ZWBcbiAgICAgKiBhdHRyaWJ1dGUgbWVhbnMgdGhhdCB0aGUgQUpBWCBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGxpa2VseSBiZSBoYW5kbGluZyB0aGUgdmFsaWRhdGlvbiBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24oKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm1bZGF0YS1yZXF1ZXN0XTpub3QoW2RhdGEtYnJvd3Nlci12YWxpZGF0ZV0pJykuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ25vdmFsaWRhdGUnLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGRldGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGNoYW5nZXMgdG8gc2VsZWN0LCByYWRpbywgY2hlY2tib3ggYW5kIGZpbGUgaW5wdXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBjaGFuZ2VIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGNoYW5naW5nIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ3NlbGVjdFtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWZpbGVdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjbGlja3Mgb24gaHlwZXJsaW5rcyBhbmQgYnV0dG9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgZXZlbnQgY2FuIGJ1YmJsZSB1cCB0aGUgaGllcmFyY2h5IHRvIGZpbmQgYSBzdWl0YWJsZSByZXF1ZXN0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50RWxlbWVudC5tYXRjaGVzKFxuICAgICAgICAgICAgICAgICdhW2RhdGEtcmVxdWVzdF0sIGJ1dHRvbltkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWJ1dHRvbl1bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1zdWJtaXRdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5IHByZXNzZXMgb24gaW5wdXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGtleURvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGlucHV0dGluZyBpbnRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgdHlwZSBpcyB2YWxpZFxuICAgICAgICBjb25zdCB2YWxpZFR5cGVzID0gW1xuICAgICAgICAgICAgJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAnZGF0ZXRpbWUnLFxuICAgICAgICAgICAgJ2RhdGV0aW1lLWxvY2FsJyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICdyYWRpbycsXG4gICAgICAgICAgICAncmFuZ2UnLFxuICAgICAgICAgICAgJ3NlYXJjaCcsXG4gICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd0aW1lJyxcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICAgJ3dlZWsnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAodmFsaWRUeXBlcy5pbmRleE9mKGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtcmVxdWVzdF0nKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtdHJhY2staW5wdXRdJykpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tJbnB1dChldmVudC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzdWJtaXRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIHN1Ym1pdHRpbmcgYSB2YWxpZCBmb3JtXG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAnZm9ybVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgcmVxdWVzdCBvbiBhIGdpdmVuIGVsZW1lbnQsIHVzaW5nIGl0cyBkYXRhIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBTdHJpbmcoZGF0YS5yZXF1ZXN0KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNvbmZpcm06ICgncmVxdWVzdENvbmZpcm0nIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdENvbmZpcm0pIDogbnVsbCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiAoJ3JlcXVlc3RSZWRpcmVjdCcgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0UmVkaXJlY3QpIDogbnVsbCxcbiAgICAgICAgICAgIGxvYWRpbmc6ICgncmVxdWVzdExvYWRpbmcnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdExvYWRpbmcpIDogbnVsbCxcbiAgICAgICAgICAgIGZsYXNoOiAoJ3JlcXVlc3RGbGFzaCcgaW4gZGF0YSksXG4gICAgICAgICAgICBmaWxlczogKCdyZXF1ZXN0RmlsZXMnIGluIGRhdGEpLFxuICAgICAgICAgICAgYnJvd3NlclZhbGlkYXRlOiAoJ3JlcXVlc3RCcm93c2VyVmFsaWRhdGUnIGluIGRhdGEpLFxuICAgICAgICAgICAgZm9ybTogKCdyZXF1ZXN0Rm9ybScgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0Rm9ybSkgOiBudWxsLFxuICAgICAgICAgICAgdXJsOiAoJ3JlcXVlc3RVcmwnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdFVybCkgOiBudWxsLFxuICAgICAgICAgICAgdXBkYXRlOiAoJ3JlcXVlc3RVcGRhdGUnIGluIGRhdGEpID8gdGhpcy5wYXJzZURhdGEoU3RyaW5nKGRhdGEucmVxdWVzdFVwZGF0ZSkpIDogW10sXG4gICAgICAgICAgICBkYXRhOiAoJ3JlcXVlc3REYXRhJyBpbiBkYXRhKSA/IHRoaXMucGFyc2VEYXRhKFN0cmluZyhkYXRhLnJlcXVlc3REYXRhKSkgOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5yZXF1ZXN0KGVsZW1lbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYW4gQUpBWCByZXF1ZXN0IHZpYSBIVE1MIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKi9cbiAgICBvbkFqYXhTZXR1cChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSByZXF1ZXN0LmVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0UGFyZW50UmVxdWVzdERhdGEocmVxdWVzdC5lbGVtZW50KSxcbiAgICAgICAgICAgIC4uLnJlcXVlc3Qub3B0aW9ucy5kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24nKSAmJiAhcmVxdWVzdC5mb3JtICYmIGZpZWxkTmFtZSAmJiAhcmVxdWVzdC5vcHRpb25zLmRhdGFbZmllbGROYW1lXSkge1xuICAgICAgICAgICAgZGF0YVtmaWVsZE5hbWVdID0gcmVxdWVzdC5lbGVtZW50LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5vcHRpb25zLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhbmQgY29sbGF0ZXMgYWxsIGRhdGEgZnJvbSBlbGVtZW50cyB1cCB0aGUgRE9NIGhpZXJhcmNoeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXRQYXJlbnRSZXF1ZXN0RGF0YSh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMucmV2ZXJzZSgpO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgICAgICBpZiAoJ3JlcXVlc3REYXRhJyBpbiBlbGVtZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyc2VEYXRhKGVsZW1lbnREYXRhLnJlcXVlc3REYXRhKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgZGF0YSBpbiB0aGUgV2ludGVyL09jdG9iZXIgSlNPTiBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgcGFyc2VEYXRhKGRhdGEpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvbnBhcnNlcigpLnBhcnNlKGB7JHtkYXRhfX1gKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nIHRoZSBkYXRhIGF0dHJpYnV0ZSBvbiBlbGVtZW50OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrSW5wdXQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZSB9ID0gZWxlbWVudC5kYXRhc2V0O1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGVsZW1lbnQuZGF0YXNldC50cmFja0lucHV0IHx8IDMwMDtcblxuICAgICAgICBpZiAobGFzdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbGFzdFZhbHVlID09PSBlbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpO1xuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBoaWVyYXJjaHkgYW5kIGZpbmQgYSBmb3JtIHRoYXQgc2VuZHMgYW4gQUpBWCBxdWVyeVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBjdXJyZW50RWxlbWVudC5kYXRhc2V0LnJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIHJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQXNzZXQgTG9hZGVyLlxuICpcbiAqIFByb3ZpZGVzIHNpbXBsZSBhc3NldCBsb2FkaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIFNub3dib2FyZCwgbWFraW5nIGl0IGVhc3kgdG8gcHJlLWxvYWQgaW1hZ2VzIG9yXG4gKiBpbmNsdWRlIEphdmFTY3JpcHQgb3IgQ1NTIGFzc2V0cyBvbiB0aGUgZmx5LlxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoaXMgbG9hZGVyIHdpbGwgbGlzdGVuIHRvIGFueSBhc3NldHMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkIHRvIGxvYWQgaW4gYW4gQUpBWFxuICogcmVzcG9uc2UsIHN1Y2ggYXMgcmVzcG9uc2VzIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogWW91IGNhbiBhbHNvIGxvYWQgYXNzZXRzIG1hbnVhbGx5IGJ5IGNhbGxpbmcgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBgYGBqc1xuICogU25vd2JvYXJkLmFkZFBsdWdpbignYXNzZXRMb2FkZXInLCBBc3NldExvYWRlcik7XG4gKiBTbm93Ym9hcmQuYXNzZXRMb2FkZXIoKS5wcm9jZXNzQXNzZXRzKGFzc2V0cyk7XG4gKiBgYGBcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXNzZXRMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFqYXhMb2FkQXNzZXRzOiAnbG9hZCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYW5kIGxvYWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogVGhlIGBhc3NldHNgIHByb3BlcnR5IG9mIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGFuIG9iamVjdCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGtleXMgYW5kIGFuXG4gICAgICogYXJyYXkgb2YgcGF0aHM6XG4gICAgICpcbiAgICAgKiAtIGBqc2A6IEFuIGFycmF5IG9mIEphdmFTY3JpcHQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgY3NzYDogQW4gYXJyYXkgb2YgQ1NTIHN0eWxlc2hlZXQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgaW1nYDogQW4gYXJyYXkgb2YgaW1hZ2UgVVJMcyB0byBwcmUtbG9hZFxuICAgICAqXG4gICAgICogQm90aCBganNgIGFuZCBgY3NzYCBmaWxlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5qZWN0ZWQsIGhvd2V2ZXIgYGltZ2AgZmlsZXMgd2lsbCBub3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCByZXF1aXJlZCBhc3NldHMgYXJlIGxvYWRlZC4gSWYgYW5cbiAgICAgKiBhc3NldCBmYWlscyB0byBsb2FkLCB0aGlzIFByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEVTTGludCAqUkVBTExZKiBkb2Vzbid0IGxpa2UgdGhpcyBjb2RlLCBidXQgaWdub3JlIGl0LiBJdCdzIHRoZSBvbmx5IHdheSBpdCB3b3Jrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhc3NldHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGFzc2V0cykge1xuICAgICAgICBpZiAoYXNzZXRzLmpzICYmIGFzc2V0cy5qcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBhc3NldHMuanMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3NldHMuY3NzICYmIGFzc2V0cy5jc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBhc3NldHMuY3NzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU3R5bGUoc3R5bGUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2V0cy5pbWcgJiYgYXNzZXRzLmltZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGFzc2V0cy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbWFnZShpbWFnZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBhbmQgbG9hZHMgYSBKYXZhU2NyaXB0IFVSTCBpbnRvIHRoZSBET00uXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBjbG9zaW5nIGA8L2JvZHk+YCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NyaXB0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZFNjcmlwdChzY3JpcHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgc2NyaXB0IFVSTFxuICAgICAgICAgICAgc2NyaXB0ID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc2NyaXB0KTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBzY3JpcHQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHtzY3JpcHR9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHNjcmlwdFxuICAgICAgICAgICAgY29uc3QgZG9tU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBkb21TY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgICAgICAgICAgZG9tU2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgc2NyaXB0KTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnc2NyaXB0Jywgc2NyaXB0LCBkb21TY3JpcHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tU2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzY3JpcHQnLCBzY3JpcHQsIGRvbVNjcmlwdCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgc2NyaXB0IGZpbGU6IFwiJHtzY3JpcHR9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRvbVNjcmlwdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdHMgYW5kIGxvYWRzIGEgQ1NTIHN0eWxlc2hlZXQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogVGhlIHN0eWxlc2hlZXQgd2lsbCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhlIGNsb3NpbmcgYDwvaGVhZD5gIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHlsZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRTdHlsZShzdHlsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBzdHlsZSBVUkxcbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc3R5bGUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHN0eWxlc2hlZXQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1baHJlZj1cIiR7c3R5bGV9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHN0eWxlc2hlZXRcbiAgICAgICAgICAgIGNvbnN0IGRvbUNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgIGRvbUNzcy5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XG4gICAgICAgICAgICBkb21Dc3Muc2V0QXR0cmlidXRlKCdocmVmJywgc3R5bGUpO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmxvYWRlZCcsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIHN0eWxlc2hlZXQgZmlsZTogXCIke3N0eWxlfVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChkb21Dc3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmUtbG9hZHMgYW4gaW1hZ2UuXG4gICAgICpcbiAgICAgKiBUaGUgaW1hZ2Ugd2lsbCBub3QgYmUgaW5qZWN0ZWQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGltYWdlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZEltYWdlKGltYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHNjcmlwdCBVUkxcbiAgICAgICAgICAgIGltYWdlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoaW1hZ2UpO1xuXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBpbWFnZSBmaWxlOiBcIiR7aW1hZ2V9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5zcmMgPSBpbWFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBBbGxvd3MgYXR0YWNoaW5nIGEgbG9hZGluZyBjbGFzcyBvbiBlbGVtZW50cyB0aGF0IGFuIEFKQVggcmVxdWVzdCBpcyB0YXJnZXRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dGFjaExvYWRpbmcgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5pY2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWpheFN0YXJ0OiAnYWpheFN0YXJ0JyxcbiAgICAgICAgICAgIGFqYXhEb25lOiAnYWpheERvbmUnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFqYXhTdGFydChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgY29uc3QgbG9hZEVsZW1lbnRzID0gcmVxdWVzdC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWF0dGFjaC1sb2FkaW5nXScpO1xuICAgICAgICAgICAgaWYgKGxvYWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9hZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKHJlcXVlc3QuZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWpheERvbmUoZGF0YSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRFbGVtZW50cyA9IHJlcXVlc3QuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hdHRhY2gtbG9hZGluZ10nKTtcbiAgICAgICAgICAgIGlmIChsb2FkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxvYWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5lbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhyZXF1ZXN0LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExvYWRpbmdDbGFzcyhlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAoZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gJycpXG4gICAgICAgICAgICA/IGVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nXG4gICAgICAgICAgICA6ICd3bi1sb2FkaW5nJztcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogRGF0YSBjb25maWd1cmF0aW9uIHByb3ZpZGVyLlxuICpcbiAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBwYXNzaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSB0aHJvdWdoIGFuIGVsZW1lbnQncyBkYXRhIGF0dHJpYnV0ZXMuIFRoaXNcbiAqIGlzIGdlbmVyYWxseSB1c2VkIGZvciB3aWRnZXRzIG9yIFVJIGludGVyYWN0aW9ucyB0byBjb25maWd1cmUgdGhlbS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YUNvbmZpZyBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbG9jYWxDb25maWdcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoaW5zdGFuY2UsIGVsZW1lbnQsIGxvY2FsQ29uZmlnKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBTbm93Ym9hcmQgcGx1Z2luIHRvIGVuYWJsZSBkYXRhIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgZXh0cmFjdGVkIGZyb20gSFRNTCBlbGVtZW50cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmxvY2FsQ29uZmlnID0gbG9jYWxDb25maWcgfHwge307XG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25maWcgPSB7fTtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlnIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIGBjb25maWdgIHBhcmFtZXRlciBpcyB1bnNwZWNpZmllZCwgcmV0dXJucyB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnXG4gICAgICovXG4gICAgZ2V0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb25maWcgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUsIGF0IHJ1bnRpbWUsIGFueSBjb25maWd1cmF0aW9uIHZhbHVlIGFzIG5lY2Vzc2FyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RcbiAgICAgKi9cbiAgICBzZXQoY29uZmlnLCB2YWx1ZSwgcGVyc2lzdCkge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGNvbmZpZ3VyYXRpb24ga2V5IHRvIHNldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHBlcnNpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhc2V0W2NvbmZpZ10gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxDb25maWdbY29uZmlnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaGVzIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIG1ha2UgY2hhbmdlcyB0byB0aGUgZGF0YSBjb25maWcgb24gYSBET00gbGV2ZWwgYW5kIHJlLWFwcGx5IHRoZW1cbiAgICAgKiB0byB0aGUgY29uZmlnIG9uIHRoZSBKYXZhU2NyaXB0IHNpZGUuXG4gICAgICovXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB0aGlzLmdldEFjY2VwdGVkQ29uZmlncygpO1xuICAgICAgICB0aGlzLmluc3RhbmNlQ29uZmlnID0gdGhpcy5wcm9jZXNzQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkYXRhIGNvbmZpZy5cbiAgICAgKlxuICAgICAqIElmIGFuIGluc3RhbmNlIGhhcyBhbiBgYWNjZXB0QWxsRGF0YUNvbmZpZ3NgIHByb3BlcnR5LCBzZXQgdG8gYHRydWVgLCB0aGVuIGFsbCBkYXRhXG4gICAgICogYXR0cmlidXRlcyB3aWxsIGJlIGF2YWlsYWJsZSBhcyBjb25maWd1cmF0aW9uIHZhbHVlcy4gVGhpcyBjYW4gYmUgYSBzZWN1cml0eSBjb25jZXJuLCBzb1xuICAgICAqIHRyZWFkIGNhcmVmdWxseS5cbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSwgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUga2V5cyBhdmFpbGFibGUgaW4gYW4gb2JqZWN0XG4gICAgICogcmV0dXJuZWQgYnkgYSBgZGVmYXVsdHMoKWAgbWV0aG9kIGluIHRoZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXXxib29sZWFufVxuICAgICAqL1xuICAgIGdldEFjY2VwdGVkQ29uZmlncygpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5hY2NlcHRBbGxEYXRhQ29uZmlncyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0aGlzLmluc3RhbmNlLmFjY2VwdEFsbERhdGFDb25maWdzID09PSB0cnVlXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlZmF1bHRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnN0YW5jZSBlaXRoZXIgZG9lcyBub3QgaGF2ZSBhIGBkZWZhdWx0cygpYCBtZXRob2QsIG9yXG4gICAgICogdGhlIG1ldGhvZCBpdHNlbGYgZG9lcyBub3QgcmV0dXJuIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBMb2FkcyB1cCB0aGUgZGVmYXVsdHMsIHRoZW4gcG9wdWxhdGVzIGl0IHdpdGggYW55IGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBkYXRhXG4gICAgICogYXR0cmlidXRlcywgYmFzZWQgb24gdGhlIHJ1bGVzIG9mIHRoZSBhY2NlcHRlZCBjb25maWd1cmF0aW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgdGhlbiBjYWNoZWQgYW5kIGF2YWlsYWJsZSB0aHJvdWdoIGBjb25maWcuZ2V0KClgIGNhbGxzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBwcm9jZXNzQ29uZmlnKCkge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldERlZmF1bHRzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDb25maWdzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZWxlbWVudC5kYXRhc2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY2NlcHRlZENvbmZpZ3MgPT09IHRydWUgfHwgdGhpcy5hY2NlcHRlZENvbmZpZ3MuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5jb2VyY2VWYWx1ZSh0aGlzLmVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubG9jYWxDb25maWcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ29uZmlncyA9PT0gdHJ1ZSB8fCB0aGlzLmFjY2VwdGVkQ29uZmlncy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmxvY2FsQ29uZmlnW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29lcmNlcyBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgSmF2YVNjcmlwdC5cbiAgICAgKlxuICAgICAqIFRha2VzIHRoZSBzdHJpbmcgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YSBhdHRyaWJ1dGUgYW5kIGNvZXJjZXMgaXQgaW50byBhIG1vcmUgc3VpdGFibGVcbiAgICAgKiB0eXBlIGZvciBKYXZhU2NyaXB0IHByb2Nlc3NpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgY29lcmNlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXG4gICAgICAgIC8vIE51bGwgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5kZWZpbmVkIHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYXNlNjQgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlLnN0YXJ0c1dpdGgoJ2Jhc2U2NDonKSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0c3RyID0gc3RyaW5nVmFsdWUucmVwbGFjZSgvXmJhc2U2NDovLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihiYXNlNjRzdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29lcmNlVmFsdWUoZGVjb2RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb29sZWFuIHZhbHVlXG4gICAgICAgIGlmIChbJ3RydWUnLCAneWVzJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChbJ2ZhbHNlJywgJ25vJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE51bWVyaWMgdmFsdWVcbiAgICAgICAgaWYgKC9eWy0rXT9bMC05XSsoXFwuWzAtOV0rKT8kLy50ZXN0KHN0cmluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihzdHJpbmdWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKU09OIHZhbHVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvblBhcnNlcigpLnBhcnNlKHN0cmluZ1ZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIChzdHJpbmdWYWx1ZSA9PT0gJycpID8gdHJ1ZSA6IHN0cmluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGZsYXNoIG1lc3NhZ2VzIGZvciB0aGUgQ01TLlxuICpcbiAqIEZsYXNoIG1lc3NhZ2VzIHdpbGwgcG9wIHVwIGF0IHRoZSB0b3AgY2VudGVyIG9mIHRoZSBwYWdlIGFuZCB3aWxsIHJlbWFpbiBmb3IgNyBzZWNvbmRzIGJ5IGRlZmF1bHQuIEhvdmVyaW5nIG92ZXJcbiAqIHRoZSBtZXNzYWdlIHdpbGwgcmVzZXQgYW5kIHBhdXNlIHRoZSB0aW1lci4gQ2xpY2tpbmcgb24gdGhlIGZsYXNoIG1lc3NhZ2Ugd2lsbCBkaXNtaXNzIGl0LlxuICpcbiAqIEFyZ3VtZW50czpcbiAqICAtIFwibWVzc2FnZVwiOiBUaGUgY29udGVudCBvZiB0aGUgZmxhc2ggbWVzc2FnZS4gSFRNTCBpcyBhY2NlcHRlZC5cbiAqICAtIFwidHlwZVwiOiBUaGUgdHlwZSBvZiBmbGFzaCBtZXNzYWdlLiBUaGlzIGlzIGFwcGVuZGVkIGFzIGEgY2xhc3MgdG8gdGhlIGZsYXNoIG1lc3NhZ2UgaXRzZWxmLlxuICogIC0gXCJkdXJhdGlvblwiOiBIb3cgbG9uZyB0aGUgZmxhc2ggbWVzc2FnZSB3aWxsIHN0YXkgdmlzaWJsZSBmb3IsIGluIHNlY29uZHMuIERlZmF1bHQ6IDcgc2Vjb25kcy5cbiAqXG4gKiBVc2FnZTpcbiAqICAgICAgU25vd2JvYXJkLmZsYXNoKCdUaGlzIGlzIGEgZmxhc2ggbWVzc2FnZScsICdpbmZvJywgOCk7XG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsYXNoIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0KG1lc3NhZ2UsIHR5cGUsIGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgJ2RlZmF1bHQnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gTnVtYmVyKGR1cmF0aW9uIHx8IDcpO1xuXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFzaCBkdXJhdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBvciB6ZXJvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsndHJhbnNpdGlvbiddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBmbGFzaCBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRpbWVvdXQgaXMgY2xlYXJlZCBpZiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2hUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2gpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2guY3JlYXRlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5mbGFzaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICB0aGlzLmZsYXNoLmlubmVySFRNTCA9IHRoaXMubWVzc2FnZTtcbiAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCdmbGFzaC1tZXNzYWdlJywgdGhpcy50eXBlKTtcbiAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY29udHJvbCcpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5yZW1vdmUoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4gdGhpcy5zdG9wVGltZXIoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB0aGlzLnN0YXJ0VGltZXIoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lci5jbGFzc0xpc3QuYWRkKCdmbGFzaC10aW1lcicpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoVGltZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCduby10aW1lcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGJvZHlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdzaG93JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2gucmVtb3ZlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdoaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2ggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGZsYXNoIG1lc3NhZ2VzIGF2YWlsYWJsZSBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSA+IGRpdi5mbGFzaC1tZXNzYWdlJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5yZW1vdmUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSB0aW1lciBmb3IgdGhpcyBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YXJ0VGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbWVyVHJhbnMgPSB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2hUaW1lciwgJ3RpbWVvdXQnLCBudWxsLCBgJHt0aGlzLmR1cmF0aW9ufS4wc2AsIHRydWUpO1xuICAgICAgICB0aGlzLnRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW1vdmUoKSwgdGhpcy5kdXJhdGlvbiAqIDEwMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdGltZXIgZm9yIHRoaXMgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzdG9wVGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyVHJhbnMpIHtcbiAgICAgICAgICAgIHRoaXMudGltZXJUcmFucy5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRGVmaW5lcyBhIGRlZmF1bHQgbGlzdGVuZXIgZm9yIGZsYXNoIGV2ZW50cy5cbiAqXG4gKiBDb25uZWN0cyB0aGUgRmxhc2ggcGx1Z2luIHRvIHZhcmlvdXMgZXZlbnRzIHRoYXQgdXNlIGZsYXNoIG1lc3NhZ2VzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbGFzaExpc3RlbmVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuaWNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ2ZsYXNoJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhFcnJvck1lc3NhZ2U6ICdhamF4RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgIGFqYXhGbGFzaE1lc3NhZ2VzOiAnYWpheEZsYXNoTWVzc2FnZXMnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvIGZsYXNoIG1lc3NhZ2VzIGZvciBQSFAgZmxhc2ggcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIHJlYWR5KCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jb250cm9sPVwiZmxhc2gtbWVzc2FnZVwiXScpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5mbGFzaFR5cGUsXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmZsYXNoRHVyYXRpb24sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhIGZsYXNoIG1lc3NhZ2UgZm9yIEFKQVggZXJyb3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBhamF4RXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBmbGFzaCBtZXNzYWdlcyByZXR1cm5lZCBkaXJlY3RseSBmcm9tIEFKQVggZnVuY3Rpb25hbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlc1xuICAgICAqL1xuICAgIGFqYXhGbGFzaE1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG1lc3NhZ2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Nzc0NsYXNzLCBtZXNzYWdlXSA9IGVudHJ5O1xuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgY3NzQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQWRkcyBBSkFYLWRyaXZlbiBmb3JtIHZhbGlkYXRpb24gdG8gU25vd2JvYXJkIHJlcXVlc3RzLlxuICpcbiAqIERvY3VtZW50YXRpb24gZm9yIHRoaXMgZmVhdHVyZSBjYW4gYmUgZm91bmQgaGVyZTpcbiAqIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3Nub3dib2FyZC9leHRyYXMjYWpheC12YWxpZGF0aW9uXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1WYWxpZGF0aW9uIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZXJyb3JCYWdzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2NsZWFyVmFsaWRhdGlvbicsXG4gICAgICAgICAgICBhamF4VmFsaWRhdGlvbkVycm9yczogJ2RvVmFsaWRhdGlvbicsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZHkgZXZlbnQgaGFuZGxlci5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0RXJyb3JCYWdzKGRvY3VtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhbiBBSkFYIHJlc3BvbnNlIGFuZCBwYXNzZXMgdGhlbSB0aHJvdWdoIHRvIHRoZSBlcnJvciBiYWdzLlxuICAgICAqXG4gICAgICogVGhpcyBoYW5kbGVyIHJldHVybnMgZmFsc2UgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIHZhbGlkYXRpb24gaGFuZGxpbmcsIGFuZCBwcmV2ZW50cyB0aGUgZmxhc2hcbiAgICAgKiBtZXNzYWdlIHRoYXQgaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQgZm9yIGZpZWxkIGVycm9ycyBpbiBBSkFYIHJlcXVlc3RzIGZyb20gc2hvd2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBkb1ZhbGlkYXRpb24oZm9ybSwgaW52YWxpZEZpZWxkcywgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LnJlcXVlc3RWYWxpZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gZm9ybSk7XG4gICAgICAgIGVycm9yQmFncy5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFueSB2YWxpZGF0aW9uIGVycm9ycyBpbiB0aGUgZ2l2ZW4gZm9ybS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJvbWlzZVxuICAgICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNsZWFyVmFsaWRhdGlvbihwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50LmRhdGFzZXQucmVxdWVzdFZhbGlkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlcXVlc3QuZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gcmVxdWVzdC5mb3JtKTtcbiAgICAgICAgZXJyb3JCYWdzLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVFcnJvckJhZyhlcnJvckJhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIGVycm9yIGJhZ3MgKGVsZW1lbnRzIHdpdGggXCJkYXRhLXZhbGlkYXRlLWVycm9yXCIgYXR0cmlidXRlKSBhbmQgbGlua3MgdGhlbSB0byBhXG4gICAgICogcGxhY2Vob2xkZXIgYW5kIGZvcm0uXG4gICAgICpcbiAgICAgKiBUaGUgZXJyb3IgYmFncyB3aWxsIGJlIGluaXRpYWxseSBoaWRkZW4sIGFuZCB3aWxsIG9ubHkgc2hvdyB3aGVuIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdE5vZGVcbiAgICAgKi9cbiAgICBjb2xsZWN0RXJyb3JCYWdzKHJvb3ROb2RlKSB7XG4gICAgICAgIHJvb3ROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXSwgW2RhdGEtdmFsaWRhdGUtZm9yXScpLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZXJyb3JCYWcuY2xvc2VzdCgnZm9ybVtkYXRhLXJlcXVlc3QtdmFsaWRhdGVdJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgZXJyb3IgYmFnIGRvZXMgbm90IHJlc2lkZSB3aXRoaW4gYSB2YWxpZGF0aW5nIGZvcm0sIHJlbW92ZSBpdFxuICAgICAgICAgICAgaWYgKCFmb3JtKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlcnJvckJhZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5kIG1lc3NhZ2UgbGlzdCBub2RlLCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCBtZXNzYWdlTGlzdEVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVycm9yQmFnLm1hdGNoZXMoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXScpKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50ID0gZXJyb3JCYWcucXVlcnlTZWxlY3RvcignW2RhdGEtbWVzc2FnZV0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgbm9kZVxuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXJyb3IgYmFnIGFuZCByZXBsYWNlIHdpdGggcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yQmFnRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlcnJvckJhZyxcbiAgICAgICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9yOiAoZXJyb3JCYWcuZGF0YXNldC52YWxpZGF0ZUZvcilcbiAgICAgICAgICAgICAgICAgICAgPyBlcnJvckJhZy5kYXRhc2V0LnZhbGlkYXRlRm9yLnNwbGl0KC9cXHMqLFxccyovKVxuICAgICAgICAgICAgICAgICAgICA6ICcqJyxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQ6IChtZXNzYWdlTGlzdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZUxpc3RFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RBbmNob3I6IG51bGwsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZTogKGVycm9yQmFnLmRhdGFzZXQudmFsaWRhdGVGb3IpXG4gICAgICAgICAgICAgICAgICAgID8gKGVycm9yQmFnLnRleHRDb250ZW50ICE9PSAnJyB8fCBlcnJvckJhZy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBJZiBhbiBtZXNzYWdlIGxpc3QgZWxlbWVudCBleGlzdHMsIGNyZWF0ZSBhbm90aGVyIHBsYWNlaG9sZGVyIHRvIGFjdCBhcyBhbiBhbmNob3IgcG9pbnRcbiAgICAgICAgICAgIGlmIChtZXNzYWdlTGlzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlTGlzdEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtZXNzYWdlTGlzdEFuY2hvciwgbWVzc2FnZUxpc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlcnJvckJhZ0RhdGEubWVzc2FnZUxpc3RBbmNob3IgPSBtZXNzYWdlTGlzdEFuY2hvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocGxhY2Vob2xkZXIsIGVycm9yQmFnKTtcblxuICAgICAgICAgICAgdGhpcy5lcnJvckJhZ3MucHVzaChlcnJvckJhZ0RhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlcyBhbiBlcnJvciBiYWcsIHJlcGxhY2luZyB0aGUgZXJyb3IgbWVzc2FnZXMgd2l0aCBhIHBsYWNlaG9sZGVyIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKi9cbiAgICBoaWRlRXJyb3JCYWcoZXJyb3JCYWcpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZXJyb3JCYWcucGxhY2Vob2xkZXIsIGVycm9yQmFnLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYW4gZXJyb3IgYmFnIHdpdGggdGhlIGdpdmVuIGludmFsaWQgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKi9cbiAgICBzaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVycm9yQmFnLmVsZW1lbnQsIGVycm9yQmFnLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvckJhZy52YWxpZGF0ZUZvciAhPT0gJyonKSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yQmFnLmN1c3RvbU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZpZWxkID0gT2JqZWN0LmtleXMoaW52YWxpZEZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGVycm9yQmFnLnZhbGlkYXRlRm9yLmluY2x1ZGVzKGZpZWxkKSlcbiAgICAgICAgICAgICAgICAgICAgLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgW2Vycm9yQmFnLmVsZW1lbnQuaW5uZXJIVE1MXSA9IGludmFsaWRGaWVsZHNbZmlyc3RGaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JCYWcubWVzc2FnZUxpc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdmFsaWRhdGlvbi1tZXNzYWdlXScpLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaW52YWxpZEZpZWxkcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbLCBlcnJvcnNdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBlcnJvckJhZy5tZXNzYWdlTGlzdEVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5kYXRhc2V0LnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmlubmVySFRNTCA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICBlcnJvckJhZy5tZXNzYWdlTGlzdEFuY2hvci5hZnRlcihtZXNzYWdlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFtlcnJvckJhZy5lbGVtZW50LmlubmVySFRNTF0gPSBpbnZhbGlkRmllbGRzW09iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpLnNoaWZ0KCldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGVycm9yIGJhZyBhcHBsaWVzIGZvciB0aGUgZ2l2ZW4gaW52YWxpZCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW52YWxpZEZpZWxkc1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLnZhbGlkYXRlRm9yID09PSAnKicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZXJyb3JCYWcudmFsaWRhdGVGb3IuaW5jbHVkZXMoZmllbGQpKVxuICAgICAgICAgICAgLmxlbmd0aCA+IDA7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBEaXNwbGF5cyBhIHN0cmlwZSBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHRoYXQgaW5kaWNhdGVzIGxvYWRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0cmlwZUxvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmljZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydyZXF1ZXN0J107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2FqYXhTdGFydCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuY291bnRlciA9IDA7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVTdHJpcGUoKTtcbiAgICB9XG5cbiAgICBhamF4U3RhcnQocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5vcHRpb25zLnN0cmlwZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvdygpO1xuXG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZVN0cmlwZSgpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGVMb2FkZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICB0aGlzLmluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGluZy1pbmRpY2F0b3InLCAnbG9hZGVkJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlLmNsYXNzTGlzdC5hZGQoJ3N0cmlwZScpO1xuICAgICAgICB0aGlzLnN0cmlwZUxvYWRlZC5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGVkJyk7XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQodGhpcy5zdHJpcGUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZCh0aGlzLnN0cmlwZUxvYWRlZCk7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmluZGljYXRvcik7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jb3VudGVyICs9IDE7XG5cbiAgICAgICAgY29uc3QgbmV3U3RyaXBlID0gdGhpcy5zdHJpcGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZChuZXdTdHJpcGUpO1xuICAgICAgICB0aGlzLnN0cmlwZS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBuZXdTdHJpcGU7XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRlZCcpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3duLWxvYWRpbmcnKTtcbiAgICB9XG5cbiAgICBoaWRlKGZvcmNlKSB7XG4gICAgICAgIHRoaXMuY291bnRlciAtPSAxO1xuXG4gICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvdW50ZXIgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3duLWxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRW1iZWRzIHRoZSBcImV4dHJhc1wiIHN0eWxlc2hlZXQgaW50byB0aGUgcGFnZSwgaWYgaXQgaXMgbm90IGxvYWRlZCB0aHJvdWdoIHRoZSB0aGVtZS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3R5bGVzaGVldExvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZWFkeSgpIHtcbiAgICAgICAgbGV0IHN0eWxlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiBzdHlsZXNoZWV0IGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbcmVsPVwic3R5bGVzaGVldFwiXScpLmZvckVhY2goKGNzcykgPT4ge1xuICAgICAgICAgICAgaWYgKGNzcy5ocmVmLmVuZHNXaXRoKCcvbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2Nzcy9zbm93Ym9hcmQuZXh0cmFzLmNzcycpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFzdHlsZXNMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQuc2V0QXR0cmlidXRlKCdocmVmJywgdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoJy9tb2R1bGVzL3N5c3RlbS9hc3NldHMvY3NzL3Nub3dib2FyZC5leHRyYXMuY3NzJykpO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZXNoZWV0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBQcm92aWRlcyB0cmFuc2l0aW9uIHN1cHBvcnQgZm9yIGVsZW1lbnRzLlxuICpcbiAqIFRyYW5zaXRpb24gYWxsb3dzIENTUyB0cmFuc2l0aW9ucyB0byBiZSBjb250cm9sbGVkIGFuZCBjYWxsYmFja3MgdG8gYmUgcnVuIG9uY2UgY29tcGxldGVkLiBJdCB3b3JrcyBzaW1pbGFyIHRvIFZ1ZVxuICogdHJhbnNpdGlvbnMgd2l0aCAzIHN0YWdlcyBvZiB0cmFuc2l0aW9uLCBhbmQgY2xhc3NlcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSB0cmFuc2l0aW9uIG5hbWUgc3VmZml4ZWQgd2l0aFxuICogdGhlIHN0YWdlIG9mIHRyYW5zaXRpb246XG4gKlxuICogIC0gYGluYDogQSBjbGFzcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uLCByZW1vdmVkIGFmdGVyd2FyZHMuIFRoaXMgc2hvdWxkIGJlXG4gKiAgICAgIHVzZWQgdG8gZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICogIC0gYGFjdGl2ZWA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24gaXRzZWxmLlxuICogIC0gYG91dGA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uIGFuZCBrZXB0IHRvIHRoZSBlbmQgb2YgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24uIFRoaXMgc2hvdWxkIGRlZmluZSB0aGUgZW5kIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICpcbiAqIFVzYWdlOlxuICogICAgICBTbm93Ym9hcmQudHJhbnNpdGlvbihkb2N1bWVudC5lbGVtZW50LCAndHJhbnNpdGlvbicsICgpID0+IHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgZWxlbWVudCBhZnRlciA3IHNlY29uZHMnKTtcbiAqICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gKiAgICAgIH0sICc3cycpO1xuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFuc2l0aW9uIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHRyYW5zaXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNpdGlvbiBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpdGlvbiwgdGhpcyBwcmVmaXhlcyB0aGUgc3RhZ2VzIG9mIHRyYW5zaXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uIEFuIG9wdGlvbmFsIG92ZXJyaWRlIG9uIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uLiBNdXN0IGJlIHNwZWNpZmllZCBhcyAncycgKHNlY3MpIG9yICdtcycgKG1zZWNzKS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRyYWlsVG8gSWYgdHJ1ZSwgdGhlIFwib3V0XCIgY2xhc3Mgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCwgdHJhbnNpdGlvbiwgY2FsbGJhY2ssIGR1cmF0aW9uLCB0cmFpbFRvKSB7XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgSFRNTEVsZW1lbnQgbXVzdCBiZSBwcm92aWRlZCBmb3IgdHJhbnNpdGlvbmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2l0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMucGFyc2VEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhaWxUbyA9ICh0cmFpbFRvID09PSB0cnVlKTtcblxuICAgICAgICB0aGlzLmRvVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgZXZlbnQgY2xhc3NlcyB0byB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBldmVudENsYXNzZXMoLi4uYXJncykge1xuICAgICAgICBjb25zdCBldmVudENsYXNzZXMgPSB7XG4gICAgICAgICAgICBpbjogYCR7dGhpcy50cmFuc2l0aW9ufS1pbmAsXG4gICAgICAgICAgICBhY3RpdmU6IGAke3RoaXMudHJhbnNpdGlvbn0tYWN0aXZlYCxcbiAgICAgICAgICAgIG91dDogYCR7dGhpcy50cmFuc2l0aW9ufS1vdXRgLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXZlbnRDbGFzc2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldHVybkNsYXNzZXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRDbGFzc2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmIChhcmdzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5DbGFzc2VzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3NlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRvVHJhbnNpdGlvbigpIHtcbiAgICAgICAgLy8gQWRkIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRDbGFzc2VzKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdHJhbnNpdGlvbiAtIHNob3cgXCJpblwiIGFuZCBcImFjdGl2ZVwiIGNsYXNzZXNcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2luJywgJ2FjdGl2ZScpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBhIHRyYW5zaXRpb24gZXhpc3RzXG4gICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KVsndHJhbnNpdGlvbi1kdXJhdGlvbiddICE9PSAnMHMnKSB7XG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciB0aGUgdHJhbnNpdGlvbiB0byBlbmRcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRoaXMub25UcmFuc2l0aW9uRW5kKCksIHtcbiAgICAgICAgICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5ldmVudENsYXNzZXMoJ2luJylbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmV2ZW50Q2xhc3Nlcygnb3V0JylbMF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Q2xhc3NlcygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgdHJhbnNpdGlvbiBlbmRzLlxuICAgICAqXG4gICAgICogV2hlbiBhIHRyYW5zaXRpb24gZW5kcywgdGhlIGluc3RhbmNlIG9mIHRoZSB0cmFuc2l0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZGVzdHJ1Y3RlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG9uVHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2FjdGl2ZScsICghdGhpcy50cmFpbFRvKSA/ICdvdXQnIDogJycpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGEgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB0aGlzLm9uVHJhbnNpdGlvbkVuZCwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNldENsYXNzZXMoKTtcblxuICAgICAgICAvLyBSZW1vdmUgZHVyYXRpb24gb3ZlcnJpZGVcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBkZXN0cnVjdG9yXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNsYXNzZXMsIHJlbW92aW5nIGFueSB0cmFuc2l0aW9uIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZXNldENsYXNzZXMoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCkuZm9yRWFjaCgoZXZlbnRDbGFzcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZXZlbnRDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGdpdmVuIGR1cmF0aW9uIGFuZCBjb252ZXJ0cyBpdCB0byBhIFwibXNcIiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkdXJhdGlvblxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcGFyc2VEdXJhdGlvbihkdXJhdGlvbikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSAvXihbMC05XSsoXFwuWzAtOV0rKT8pKG0/cyk/JC8uZXhlYyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihwYXJzZWRbMV0pO1xuICAgICAgICBjb25zdCB1bml0ID0gKHBhcnNlZFszXSA9PT0gJ3MnKVxuICAgICAgICAgICAgPyAnc2VjJ1xuICAgICAgICAgICAgOiAnbXNlYyc7XG5cbiAgICAgICAgcmV0dXJuICh1bml0ID09PSAnc2VjJylcbiAgICAgICAgICAgID8gYCR7YW1vdW50ICogMTAwMH1tc2BcbiAgICAgICAgICAgIDogYCR7TWF0aC5mbG9vcihhbW91bnQpfW1zYDtcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJpZ2dlckVudGl0eVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXIgVGhlIHNlbGVjdG9yIGZvciB0aGUgdHJpZ2dlciB0YXJnZXQgZWxlbWVudChzKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgbWV0IGZvciB0aGUgdHJpZ2dlciB0byBmaXJlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgdHJpZ2dlciBmaXJlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHVuZGVmaW5lZH0gcGFyZW50IFRoZSBwYXJlbnQgZWxlbWVudCB3aXRoIHdoaWNoIHRvIGxpbWl0IHRoZSB0cmlnZ2VyIHNjb3BlLlxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIHRyaWdnZXIgZXZlbnQuXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50W119IGVsZW1lbnRzIFRoZSB0YXJnZXQgZWxlbWVudHMgdGhhdCB0aGlzIHRyaWdnZXIgYXBwbGllcyB0by5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25bXX0gY29uZGl0aW9uQ2FsbGJhY2tzIFRoZSBjb25kaXRpb24gY2FsbGJhY2tzIGZvciB0aGlzIHRyaWdnZXIuXG4gKiBAcHJvcGVydHkge01hcDxIVE1MRWxlbWVudCwgU2V0PHN0cmluZz4+fSBlbGVtZW50RXZlbnRzIFRoZSBldmVudHMgcmVnaXN0ZXJlZCBvbiB0aGUgdGFyZ2V0IGVsZW1lbnRzLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRyaWdnZXJFbGVtZW50XG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIHRyaWdnZXIgZXZlbnQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW50fSBwcmlvcml0eSBUaGUgdHJpZ2dlciBldmVudCBwcmlvcml0eS5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGV2ZW50IFRoZSB0cmlnZ2VyIGV2ZW50IGZ1bmN0aW9uLlxuICovXG5cbi8qKlxuICogVHJpZ2dlciBoYW5kbGVyIGZvciBIVE1MIGVsZW1lbnRzLlxuICpcbiAqIFRoaXMgaXMgYSByZS1pbWFnaW5pbmcgb2YgdGhlIElucHV0LlRyaWdnZXIgZnVuY3Rpb25hbGl0eSBpbiB0aGUgb3JpZ2luYWwgV2ludGVyIENNUyBmcmFtZXdvcmssXG4gKiBpbml0aWFsaXNlZCB0aHJvdWdoIHRoZSBgZGF0YS10cmlnZ2VyYCBhdHRyaWJ1dGVzLlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIHJlbWFpbmluZyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbCBJbnB1dC5UcmlnZ2VyIGZ1bmN0aW9uYWxpdHksIHRoaXNcbiAqIGhhbmRsZXIgYWRkcyBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZmxleGlibGUgdHJpZ2dlciB1c2FnZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3YxLjIvdWkvc2NyaXB0L2lucHV0LXRyaWdnZXJcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjQgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJpZ2dlciBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdChlbGVtZW50KSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZWxlbWVudCB0aGlzIGluc3RhbmNlIGlzIGF0dGFjaGVkIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge01hcDxzdHJpbmcsIFRyaWdnZXJFbnRpdHk+fSBUaGUgdHJpZ2dlcnMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJpZ2dlcnMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtNYXA8RWxlbWVudCwgU2V0PFRyaWdnZXJFbGVtZW50Pj59IEEgbWFwIG9mIGVsZW1lbnRzIHRoYXQgdHJpZ2dlciBldmVudHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV2ZW50cyA9IG5ldyBNYXAoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge01hcDxFbGVtZW50LCBNYXA8c3RyaW5nLCBGdW5jdGlvbj4+fSBBIG1hcCBvZiBlbGVtZW50cyBhbmQgdGhlaXIgZXZlbnQgY29ubmVjdG9ycy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29ubmVjdG9ycyA9IG5ldyBNYXAoKTtcblxuICAgICAgICB0aGlzLnBhcnNlVHJpZ2dlcnMoKTtcblxuICAgICAgICBpZiAodGhpcy50cmlnZ2Vycy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldEV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVUcmlnZ2VyRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLnJ1bkV2ZW50cygpO1xuXG4gICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgndHJpZ2dlcnMucmVhZHknLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEV2ZW50cygpO1xuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB0aGUgZWxlbWVudCdzIGRhdGEgYXR0cmlidXRlcyBhbmQgZGV0ZXJtaW5lcyBhcHBsaWNhYmxlIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogVHJpZ2dlciBkYXRhIGF0dHJpYnV0ZXMgbXVzdCBiZSBpbiB0aGUgZm9ybWF0IGBkYXRhLXRyaWdnZXItW25hbWVdLVtwYXJhbWV0ZXJdYCBmb3IgbXVsdGlwbGVcbiAgICAgKiB0cmlnZ2Vycywgb3IgYGRhdGEtdHJpZ2dlci1bcGFyYW1ldGVyXWAgZm9yIHNpbmdsZSB0cmlnZ2Vycy5cbiAgICAgKlxuICAgICAqIFN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZTpcbiAgICAgKiAgLSBgY29uZGl0aW9uYCBvciBgd2hlcmVgOiBUaGUgY29uZGl0aW9uIHRoYXQgbXVzdCBiZSBtZXQgZm9yIHRoZSB0cmlnZ2VyIHRvIGZpcmUuXG4gICAgICogIC0gYGFjdGlvbmAgb3IgYGRvYDogVGhlIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIHRyaWdnZXIgZmlyZXMuXG4gICAgICogIC0gYGNsb3Nlc3QtcGFyZW50YCBvciBgcGFyZW50YDogVGhlIHBhcmVudCBlbGVtZW50IHdpdGggd2hpY2ggdG8gbGltaXQgdGhlIHRyaWdnZXIgc2NvcGUuXG4gICAgICogIC0gYHByaW9yaXR5YDogVGhlIHByaW9yaXR5IGluIHdoaWNoIHRvIGNvbnNpZGVyIHRoZSB0cmlnZ2VyLlxuICAgICAqXG4gICAgICogSW50ZXJuYWxseSwgdGhlIHRyaWdnZXIgbWFwIHVzZXMgdGhlIGB0cmlnZ2VyYCBwYXJhbWV0ZXIgdG8gc3RvcmUgdGhlIHRyaWdnZXIgc2VsZWN0b3IuXG4gICAgICovXG4gICAgcGFyc2VUcmlnZ2VycygpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhc2V0IH0gPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIHRoaXMudHJpZ2dlcnMuY2xlYXIoKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhkYXRhc2V0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICgvLVtBLVpdLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0IGNhbWVsQ2FzZSB0byBkYXNoLXN0eWxlIGZvciBkYXRhIGF0dHJpYnV0ZTogJHtrZXl9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhc2hTdHlsZSA9IGtleS5yZXBsYWNlKC8oW0EtWl0pL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG5cbiAgICAgICAgICAgIGlmIChkYXNoU3R5bGUgIT09ICd0cmlnZ2VyJyAmJiAhZGFzaFN0eWxlLnN0YXJ0c1dpdGgoJ3RyaWdnZXItJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJQYXJ0cyA9IC8oW2EtejAtOVxcLS46X10rPykoPzooPzotKShjbG9zZXN0LXBhcmVudHxjb25kaXRpb258d2hlbnxhY3Rpb258cGFyZW50fHByaW9yaXR5fGRvKSk/JC9pLmV4ZWMoXG4gICAgICAgICAgICAgICAgZGFzaFN0eWxlLnJlcGxhY2UoJ3RyaWdnZXItJywgJycpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgdHJpZ2dlck5hbWUgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJUeXBlID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIFsndHJpZ2dlcicsICdjb25kaXRpb24nLCAnYWN0aW9uJywgJ3BhcmVudCcsICd3aGVuJywgJ2Nsb3Nlc3QnXS5pbmRleE9mKHRyaWdnZXJQYXJ0c1sxXSkgIT09IC0xXG4gICAgICAgICAgICAgICAgJiYgKHRyaWdnZXJQYXJ0c1sxXSAhPT0gJ2Nsb3Nlc3QnIHx8ICh0cmlnZ2VyUGFydHNbMV0gPT09ICdjbG9zZXN0JyAmJiB0cmlnZ2VyUGFydHNbMl0gPT09ICdwYXJlbnQnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgb3JpZ2luYWwgdHJpZ2dlciBmb3JtYXRcbiAgICAgICAgICAgICAgICB0cmlnZ2VyTmFtZSA9ICdfX29yaWdpbmFsJztcbiAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICh0cmlnZ2VyUGFydHNbMV0gPT09ICdjbG9zZXN0JykgPyAncGFyZW50JyA6IHRyaWdnZXJQYXJ0c1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdHJpZ2dlclBhcnRzWzJdID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBbJ2Nsb3Nlc3QtcGFyZW50JywgJ2NvbmRpdGlvbicsICd3aGVuJywgJ2FjdGlvbicsICdwYXJlbnQnLCAncHJpb3JpdHknLCAnZG8nXS5pbmRleE9mKHRyaWdnZXJQYXJ0c1syXSkgIT09IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSBtdWx0aS10cmlnZ2VyIGZvcm1hdFxuICAgICAgICAgICAgICAgIFssIHRyaWdnZXJOYW1lXSA9IHRyaWdnZXJQYXJ0cztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRyaWdnZXJQYXJ0c1syXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZXN0LXBhcmVudCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmVudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdwYXJlbnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbmRpdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3doZW4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAnY29uZGl0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdhY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdhY3Rpb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ByaW9yaXR5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ3ByaW9yaXR5JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAndHJpZ2dlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy50cmlnZ2Vycy5oYXModHJpZ2dlck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2Vycy5zZXQodHJpZ2dlck5hbWUsIG5ldyBNYXAoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJzLmdldCh0cmlnZ2VyTmFtZSkuc2V0KHRyaWdnZXJUeXBlLCBkYXRhc2V0W2tleV0pO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdHJpZ2dlciBkYXRhIGF0dHJpYnV0ZSBhZnRlciBwYXJzaW5nXG4gICAgICAgICAgICBkZWxldGUgZGF0YXNldFtrZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0cmlnZ2VycywgYW5kIHJlbW92ZSB0aG9zZSB0aGF0IGRvIG5vdCBoYXZlIGF0IGxlYXN0IGEgdHJpZ2dlciBzZWxlY3RvciwgYVxuICAgICAgICAvLyBjb25kaXRpb24gYW5kIGFuIGFjdGlvbiwgb3IgYXJlIHVzaW5nIGludmFsaWQgY29uZGl0aW9ucyBvciBhY3Rpb25zXG4gICAgICAgIHRoaXMudHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlciwgbmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmdldFNlbGVjdGFibGVFbGVtZW50cyh0cmlnZ2VyKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0cmlnZ2VyLmhhcygndHJpZ2dlcicpXG4gICAgICAgICAgICAgICAgfHwgIXRyaWdnZXIuaGFzKCdjb25kaXRpb24nKVxuICAgICAgICAgICAgICAgIHx8ICF0cmlnZ2VyLmhhcygnYWN0aW9uJylcbiAgICAgICAgICAgICAgICB8fCBlbGVtZW50cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5oYXNWYWxpZENvbmRpdGlvbnModHJpZ2dlcilcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5oYXNWYWxpZEFjdGlvbnModHJpZ2dlcilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcnMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyLnNldCgnZWxlbWVudHMnLCBlbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKCF0cmlnZ2VyLmhhcygncHJpb3JpdHknKSkge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLnNldCgncHJpb3JpdHknLCAxMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgY29tbWFuZCBnaXZlbiBhcyBlaXRoZXIgYSBjb25kaXRpb24gb3IgYW4gYWN0aW9uLlxuICAgICAqXG4gICAgICogQ29tbWFuZHMgYXJlIGZvcm1hdHRlZCBhczogbmFtZTpwYXJhbWV0ZXIxLHBhcmFtZXRlcjIscGFyYW1ldGVyMywgYWx0aG91Z2ggd2UgYWxzbyBzdXBwb3J0XG4gICAgICogdGhlIG9sZCBmb3JtYXQgb2YgdmFsdWVbcGFyYW1ldGVyMSxwYXJhbWV0ZXIyLHBhcmFtZXRlcjNdIGZvciB0aGUgYHZhbHVlYCBjb21tYW5kIG9ubHkuXG4gICAgICpcbiAgICAgKiBJZiBhIHBhcmFtZXRlciByZXF1aXJlcyBhIGNvbW1hIHdpdGhpbiwgdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgd3JhcHBlZCBpbiBxdW90ZXMuXG4gICAgICpcbiAgICAgKiBNdWx0aXBsZSBjb21tYW5kcyBjYW4gYmUgc2VwYXJhdGVkIGJ5IGEgcGlwZSBjaGFyYWN0ZXIgYHxgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWxsb3dNdWx0aXBsZVxuICAgICAqIEByZXR1cm5zIHt7bmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJzOiBzdHJpbmdbXX1bXX1cbiAgICAgKi9cbiAgICBwYXJzZUNvbW1hbmQoY29tbWFuZCwgYWxsb3dNdWx0aXBsZSA9IHRydWUpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBvbGQtZm9ybWF0IHZhbHVlIGNvbW1hbmQgKHZhbHVlW2ZvbyxiYXJdKVxuICAgICAgICBpZiAoY29tbWFuZC5zdGFydHNXaXRoKCd2YWx1ZScpICYmIGNvbW1hbmQuaW5jbHVkZXMoJ1snKSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjb21tYW5kLm1hdGNoKC9bXltcXF1dKyg/PV0pL2cpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFNwbGl0IHZhbHVlcyB3aXRoIGNvbW1hc1xuICAgICAgICAgICAgbWF0Y2guZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykudHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0VmFsdWVzID0gdmFsdWUucmVwbGFjZSgvKCcuKj8oPzwhXFxcXCknKXwoXCIuKj8oPzwhXFxcXClcIikvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChzcGxpdFZhbHVlKSA9PiBzcGxpdFZhbHVlLnJlcGxhY2UoL1xcfFxcfFxcfC9nLCAnLCcpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpLnRyaW0oKSk7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCguLi5zcGxpdFZhbHVlcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB2YWx1ZXMsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBjb21tYW5kc1xuICAgICAgICBpZiAoY29tbWFuZC5pbmNsdWRlcygnfCcpICYmIGFsbG93TXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0Q29tbWFuZHMgPSBjb21tYW5kLnJlcGxhY2UoLygnLio/KD88IVxcXFwpJyl8KFwiLio/KD88IVxcXFwpXCIpL2csIChxdW90ZWQpID0+IHF1b3RlZC5yZXBsYWNlKC9cXHwvZywgJ3x8fCcpKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgLm1hcCgoc3BsaXRWYWx1ZSkgPT4gc3BsaXRWYWx1ZS5yZXBsYWNlKC9cXHxcXHxcXHwvZywgJ3wnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gW107XG4gICAgICAgICAgICBzcGxpdENvbW1hbmRzLmZvckVhY2goKHNwbGl0Q29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goLi4udGhpcy5wYXJzZUNvbW1hbmQoc3BsaXRDb21tYW5kLCBmYWxzZSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb21tYW5kcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWFuZC5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgICAgICBuYW1lOiBjb21tYW5kLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbbmFtZSwgcGFyYW1ldGVyc10gPSBjb21tYW5kLnNwbGl0KCc6JywgMik7XG5cbiAgICAgICAgaWYgKCFwYXJhbWV0ZXJzLmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW3BhcmFtZXRlcnNdLFxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdFZhbHVlcyA9IHBhcmFtZXRlcnMucmVwbGFjZSgvKCcuKj8oPzwhXFxcXCknKXwoXCIuKj8oPzwhXFxcXClcIikvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoKHNwbGl0VmFsdWUpID0+IHNwbGl0VmFsdWUucmVwbGFjZSgvXFx8XFx8XFx8L2csICcsJykucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykucmVwbGFjZSgvXFxcXChbJ1wiXSkvLCAnJDEnKS50cmltKCkpO1xuXG4gICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHNwbGl0VmFsdWVzLFxuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW55IGVsZW1lbnRzIGFyZSBhY2Nlc3NpYmxlIGJ5IHRoZSBwcm92aWRlZCB0cmlnZ2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNYXA8VHJpZ2dlckVudGl0eT59IHRyaWdnZXJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX1cbiAgICAgKi9cbiAgICBnZXRTZWxlY3RhYmxlRWxlbWVudHModHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlci5oYXMoJ3BhcmVudCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQuY2xvc2VzdCh0cmlnZ2VyLmdldCgncGFyZW50JykpLnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlci5nZXQoJ3RyaWdnZXInKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0cmlnZ2VyLmdldCgndHJpZ2dlcicpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvdmlkZWQgdHJpZ2dlciBjb25kaXRpb24ocykgYXJlIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzVmFsaWRDb25kaXRpb25zKHRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdjb25kaXRpb24nKSkuZXZlcnkoKGNvbmRpdGlvbikgPT4gW1xuICAgICAgICAgICAgJ2NoZWNrZWQnLFxuICAgICAgICAgICAgJ3VuY2hlY2tlZCcsXG4gICAgICAgICAgICAnZW1wdHknLFxuICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICdvbmVvZicsXG4gICAgICAgICAgICAnYWxsb2YnLFxuICAgICAgICAgICAgJ2ZvY3VzJyxcbiAgICAgICAgICAgICdibHVyJyxcbiAgICAgICAgICAgICdhdHRyJyxcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgIF0uaW5jbHVkZXMoY29uZGl0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb3ZpZGVkIHRyaWdnZXIgYWN0aW9uKHMpIGFyZSB2YWxpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1ZhbGlkQWN0aW9ucyh0cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnYWN0aW9uJykpLmV2ZXJ5KChhY3Rpb24pID0+IFtcbiAgICAgICAgICAgICdzaG93JyxcbiAgICAgICAgICAgICdoaWRlJyxcbiAgICAgICAgICAgICdlbmFibGUnLFxuICAgICAgICAgICAgJ2Rpc2FibGUnLFxuICAgICAgICAgICAgJ2VtcHR5JyxcbiAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAndmFsdWVPZicsXG4gICAgICAgICAgICAnY2hlY2snLFxuICAgICAgICAgICAgJ3VuY2hlY2snLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdjbGFzc09mJyxcbiAgICAgICAgICAgICdhdHRyJyxcbiAgICAgICAgICAgICdhdHRyT2YnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzdHlsZU9mJyxcbiAgICAgICAgXS5pbmNsdWRlcyhhY3Rpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRyaWdnZXIgZXZlbnRzIG9uIHRyaWdnZXIgYW5kIHRhcmdldCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBjcmVhdGVUcmlnZ2VyRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXIpID0+IHtcbiAgICAgICAgICAgIC8vIENvbGxlY3QgY29uZGl0aW9ucyBhbmQgY2hlY2sgdGhlbSBhcyBhIGdyb3VwLlxuICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ2NvbmRpdGlvbkNhbGxiYWNrcycsIFtdKTtcbiAgICAgICAgICAgIHRyaWdnZXIuc2V0KCdlbGVtZW50RXZlbnRzJywgbmV3IE1hcCgpKTtcblxuICAgICAgICAgICAgdGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2NvbmRpdGlvbicpKS5mb3JFYWNoKChjb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvbmVvZic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLmdldCgnY29uZGl0aW9uQ2FsbGJhY2tzJykucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlQ29uZGl0aW9uKHRyaWdnZXIsIGZhbHNlLCAuLi5jb25kaXRpb24ucGFyYW1ldGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FsbG9mJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsdWVDb25kaXRpb24odHJpZ2dlciwgdHJ1ZSwgLi4uY29uZGl0aW9uLnBhcmFtZXRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLmdldCgnY29uZGl0aW9uQ2FsbGJhY2tzJykucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVtcHR5Q29uZGl0aW9uKHRyaWdnZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjaGVja2VkJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndW5jaGVja2VkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hlY2tlZENvbmRpdGlvbih0cmlnZ2VyLCAoY29uZGl0aW9uLm5hbWUgPT09ICdjaGVja2VkJyksIC4uLmNvbmRpdGlvbi5wYXJhbWV0ZXJzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBldmVudCB0byBhbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyByZWdpc3RlcnMgdGhlIGV2ZW50IGluIHRoZSBgZWxlbWVudEV2ZW50c2AgbWFwIGZvciBsYXRlciB1c2FnZSBhbmQgcmVtb3ZhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICovXG4gICAgYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgZXZlbnROYW1lKSB7XG4gICAgICAgIGlmICghdHJpZ2dlci5nZXQoJ2VsZW1lbnRFdmVudHMnKS5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50RXZlbnRzJykuc2V0KGVsZW1lbnQsIG5ldyBTZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmlnZ2VyLmdldCgnZWxlbWVudEV2ZW50cycpLmdldChlbGVtZW50KS5hZGQoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgdHJpZ2dlci5nZXQoJ2VsZW1lbnRFdmVudHMnKS5nZXQoZWxlbWVudCkuYWRkKGV2ZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgRE9NIGV2ZW50IGxpc3RlbmVycyBmb3IgdGFyZ2V0ZWQgZWxlbWVudHMgb2YgYWxsIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogQWRkcyBhIGNvbm5lY3RvciB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGV2ZW50cywgc28gdGhhdCB3ZSBtYXkgZW5hYmxlIHByaW9yaXRpc2F0aW9uIGFuZFxuICAgICAqIGNvbnRyb2wgb3ZlciB0aGUgZmlyaW5nIG9mIHRoZSBldmVudHMsIGFuZCB0aGVuIHJlZ2lzdGVycyBET00gZXZlbnQgbGlzdGVuZXJzIGZvciB0aGVcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKi9cbiAgICByZWdpc3RlckV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgICBjb25zdCBjb25uZWN0b3JzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlcikgPT4ge1xuICAgICAgICAgICAgdHJpZ2dlci5nZXQoJ2VsZW1lbnRFdmVudHMnKS5mb3JFYWNoKChldmVudHMsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXZlbnRzLmhhcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5zZXQoZWxlbWVudCwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBldmVudHMuZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29ubmVjdG9ycy5oYXMoeyBlbGVtZW50LCBldmVudE5hbWUgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvcnMuYWRkKHsgZWxlbWVudCwgZXZlbnROYW1lIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IE51bWJlcih0cmlnZ2VyLmdldCgncHJpb3JpdHknKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5ldmVyeSgoY29uZGl0aW9uKSA9PiBjb25kaXRpb24oKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZ2V0KGVsZW1lbnQpLmFkZChldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29ubmVjdG9ycy5mb3JFYWNoKCh7IGVsZW1lbnQsIGV2ZW50TmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29ubmVjdG9ycy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RvcnMuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jb25uZWN0b3JzLmdldChlbGVtZW50KS5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuc2V0KGV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5nZXQoZWxlbWVudCkuZm9yRWFjaCgoZWxlbWVudEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEV2ZW50LmV2ZW50TmFtZSA9PT0gZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnB1c2goZWxlbWVudEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoZWxlbWVudEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEV2ZW50LmV2ZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuZ2V0KGV2ZW50TmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSB0YXJnZXQgZWxlbWVudChzKSBtYXRjaGVzIG9uZSBvZiB0aGVcbiAgICAgKiBwcm92aWRlZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHZhbHVlc1xuICAgICAqL1xuICAgIGNyZWF0ZVZhbHVlQ29uZGl0aW9uKHRyaWdnZXIsIGFsbCwgLi4udmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50cycpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1maWxlXSwgaW5wdXRbdHlwZT1pbWFnZV0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0nKSkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbnMgYW5kIGZpbGUgaW5wdXRzIGFyZSB1bnN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdjbGljaycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdpbnB1dCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlcyA9IG5ldyBTZXQoKTtcblxuICAgICAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuc29tZSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRyaWdnZXIgdGhhdCBmaXJlcyB3aGVuIHRoZXJlIGlzIG5vIHZhbHVlIHdpdGhpbiB0aGUgdGFyZ2V0IGVsZW1lbnQocykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKi9cbiAgICBjcmVhdGVFbXB0eUNvbmRpdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50cycpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1pbWFnZV0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0nKSkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbnMgYW5kIGZpbGUgaW5wdXRzIGFyZSB1bnN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdjbGljaycpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnaW5wdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZXMuc2l6ZSA9PT0gMDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gYSB0YXJnZXQgZWxlbWVudChzKSBpcyBjaGVja2VkL3VuY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tlZCBJZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciB1bmNoZWNrZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHVuZGVmaW5lZH0gYXRMZWFzdCBUaGUgbWluaW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBtdXN0IGJlIGNoZWNrZWQuXG4gICAgICogIERlZmF1bHRzIHRvIDEgaWYgdW5kZWZpbmVkLiBJZiBzcGVjaWZpZWQgYXMgYGFsbGAsIGFsbCBlbGVtZW50cyBtdXN0IGJlIGNoZWNrZWQuXG4gICAgICovXG4gICAgY3JlYXRlQ2hlY2tlZENvbmRpdGlvbih0cmlnZ2VyLCBjaGVja2VkLCBhdExlYXN0ID0gdW5kZWZpbmVkLCBhdE1vc3QgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkRWxlbWVudHMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgdHJpZ2dlci5nZXQoJ2VsZW1lbnRzJykuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0cyBjaGVja2JveGVzIGFuZCByYWRpbyBidXR0b25zXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPXJhZGlvXSwgaW5wdXRbdHlwZT1jaGVja2JveF0nKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnY2xpY2snKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCA9PT0gZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYXRMZWFzdCA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlcy5zaXplID09PSBzdXBwb3J0ZWRFbGVtZW50cy5zaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBhdExlYXN0Q291bnQgPSAoYXRMZWFzdCAhPT0gdW5kZWZpbmVkICYmIE1hdGguZmxvb3IoYXRMZWFzdCkgPiAwKVxuICAgICAgICAgICAgICAgID8gTWF0aC5mbG9vcihhdExlYXN0KVxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgICAgIGNvbnN0IGF0TW9zdENvdW50ID0gKGF0TGVhc3QgIT09IHVuZGVmaW5lZCAmJiBNYXRoLmZsb29yKGF0TW9zdCkgPiAxKVxuICAgICAgICAgICAgICAgID8gTWF0aC5mbG9vcihhdE1vc3QpXG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0ZWRFbGVtZW50cy5zaXplO1xuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlcy5zaXplID49IGF0TGVhc3RDb3VudCAmJiBlbGVtZW50VmFsdWVzLnNpemUgPD0gYXRNb3N0Q291bnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgcnVucyBhbGwgcmVnaXN0ZXJlZCB0cmlnZ2Vycy5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgdHJpZ2dlcnMuXG4gICAgICovXG4gICAgcnVuRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmNvbm5lY3RvcnMuZm9yRWFjaCgoZWxlbWVudENvbm5lY3RvcnMpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRDb25uZWN0b3JzLmZvckVhY2goKGNvbm5lY3RvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbm5lY3RvcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgcmVnaXN0ZXJlZCBldmVudHMuXG4gICAgICpcbiAgICAgKiBUaGlzICB3aWxsIGRpc2FibGUgYWxsIHRyaWdnZXJzIGFuZCB0aGVpciBldmVudCBsaXN0ZW5lcnMgb24gdGhlIHRhcmdldCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICByZXNldEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0b3JzLmZvckVhY2goKGVsZW1lbnRDb25uZWN0b3JzLCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50Q29ubmVjdG9ycy5mb3JFYWNoKChjb25uZWN0b3IsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBjb25uZWN0b3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5jbGVhcigpO1xuICAgICAgICB0aGlzLmV2ZW50cy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGFjdGlvbnMgYmFzZWQgb24gdGhlIHRyaWdnZXIgY29uZGl0aW9uLlxuICAgICAqXG4gICAgICogQWN0aW9ucyBzaG91bGQgYmUgYmluYXJ5LCBhbmQgc2hvdyBvbmUgc3RhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGlzIG1ldCwgYW5kIGFub3RoZXIgd2hlbiBpdFxuICAgICAqIGlzIG5vdC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbmRpdGlvbnMgb2YgdGhlIHRyaWdnZXIgaGF2ZSBiZWVuXG4gICAgICogbWV0LiBJZiBhIHRyaWdnZXIgaGFzIG11bHRpcGxlIGNvbmRpdGlvbnMsIEFMTCBjb25kaXRpb25zIG11c3QgYmUgbWV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjb25kaXRpb25NZXRcbiAgICAgKi9cbiAgICBleGVjdXRlQWN0aW9ucyh0cmlnZ2VyLCBjb25kaXRpb25NZXQpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2FjdGlvbicpKS5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzaG93JzpcbiAgICAgICAgICAgICAgICBjYXNlICdoaWRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25TaG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24ucGFyYW1ldGVyc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYWN0aW9uLnBhcmFtZXRlcnNbMF0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW3RoaXMuZWxlbWVudF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uLm5hbWUgPT09ICdzaG93JykgPyBjb25kaXRpb25NZXQgOiAhY29uZGl0aW9uTWV0LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbmFibGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2FibGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkVuYWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uLnBhcmFtZXRlcnNbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0aGlzLmVsZW1lbnRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5uYW1lID09PSAnZW5hYmxlJykgPyBjb25kaXRpb25NZXQgOiAhY29uZGl0aW9uTWV0LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25NZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYWN0aW9uLnBhcmFtZXRlcnNbMF0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0aGlzLmVsZW1lbnRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAndmFsdWVPZic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uTWV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5uYW1lID09PSAndmFsdWVPZicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0aGlzLmVsZW1lbnRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGFjdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiYgYWN0aW9uLm5hbWUgPT09ICd2YWx1ZU9mJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFjdGlvbi5wYXJhbWV0ZXJzLnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhY3Rpb24ucGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NsYXNzT2YnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbk1ldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24ubmFtZSA9PT0gJ2NsYXNzT2YnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChhY3Rpb24ucGFyYW1ldGVyc1swXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbdGhpcy5lbGVtZW50XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhY3Rpb24ubmFtZSA9PT0gJ2NsYXNzT2YnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWN0aW9uLnBhcmFtZXRlcnMuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFjdGlvbi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIG9yIGhpZGVzIGEgdHJpZ2dlciBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBhY3Rpb24gd2lsbCB0b2dnbGUgdGhlIGBoaWRlYCBjbGFzcyBvbiB0aGUgZWxlbWVudCwgYW5kIHNldCB0aGUgYGRpc3BsYXlgIHN0eWxlIHRvXG4gICAgICogYG5vbmVgIHdoZW4gaGlkZGVuLCBhbmQgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgd2hlbiBzaG93bi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gZWxlbWVudHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dcbiAgICAgKi9cbiAgICBhY3Rpb25TaG93KHRyaWdnZXIsIGVsZW1lbnRzLCBzaG93KSB7XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChzaG93ICYmIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3cgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXkgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIHRyaWdnZXIgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgYWN0aW9uIHdpbGwgdG9nZ2xlIHRoZSBgY29udHJvbC1kaXNhYmxlZGAgY2xhc3Mgb24gdGhlIGVsZW1lbnQsIGFuZCBzZXQgdGhlIGBkaXNhYmxlZGBcbiAgICAgKiBwcm9wZXJ0eSB0byBgdHJ1ZWAgd2hlbiBkaXNhYmxlZCwgYW5kIGBmYWxzZWAgd2hlbiBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBlbGVtZW50c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlXG4gICAgICovXG4gICAgYWN0aW9uRW5hYmxlKHRyaWdnZXIsIGVsZW1lbnRzLCBlbmFibGUpIHtcbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3RbKGVuYWJsZSkgPyAncmVtb3ZlJyA6ICdhZGQnXSgnY29udHJvbC1kaXNhYmxlZCcpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kaXNhYmxlZCA9ICFlbmFibGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlciwgZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGVpdGhlciB0aGUgdHJpZ2dlciBlbGVtZW50IG9yIGEgY2hpbGQgZWxlbWVudChzKSB3aXRoaW4uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgb25lLXdheSBhY3Rpb24gaWYgdGhlIHVubWV0IHZhbHVlIGlzIG5vdCBkZWZpbmVkLlxuICAgICAqL1xuICAgIGFjdGlvblZhbHVlKHRyaWdnZXIsIGNvbmRpdGlvbk1ldCwgZWxlbWVudHMsIHZhbHVlLCB1bm1ldFZhbHVlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uTWV0ICYmIHVubWV0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAoY29uZGl0aW9uTWV0KSA/IHZhbHVlIDogdW5tZXRWYWx1ZTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IChlbGVtZW50LnZhbHVlID09PSBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG5ld1ZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLmFmdGVyQWN0aW9uKHRyaWdnZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG9yIHJlbW92ZXMgdGhlIGNsYXNzIGZyb20gdGhlIHRyaWdnZXIgZWxlbWVudCBvciBhIGNoaWxkIGVsZW1lbnQocykgd2l0aGluLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIHNpbXBseSByZW1vdmUgdGhlIGNsYXNzIGlmIHRoZSB1bm1ldCBjbGFzcyBpcyBub3QgZGVmaW5lZC4gT3RoZXJ3aXNlLCB0aGUgY2xhc3Nlc1xuICAgICAqIHdpbGwgYmUgdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBhY3Rpb25DbGFzcyh0cmlnZ2VyLCBjb25kaXRpb25NZXQsIGVsZW1lbnRzLCBjc3NDbGFzcywgdW5tZXRDc3NDbGFzcyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uTWV0KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICBpZiAodW5tZXRDc3NDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodW5tZXRDc3NDbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY3NzQ2xhc3MpO1xuICAgICAgICAgICAgICAgIGlmICh1bm1ldENzc0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh1bm1ldENzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFmdGVyQWN0aW9uKHRyaWdnZXIsIGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZGVidWcoJ1RyaWdnZXIgZmlyZWQnLCBlbGVtZW50LCB0cmlnZ2VyKTtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ3RyaWdnZXIuZmlyZWQnLCBlbGVtZW50LCB0cmlnZ2VyKTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEludGVybmFsIHByb3h5IGZvciBTbm93Ym9hcmQuXG4gKlxuICogVGhpcyBoYW5kbGVyIHdyYXBzIHRoZSBTbm93Ym9hcmQgaW5zdGFuY2UgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHBsdWdpbiBpbnN0YW5jZXMuXG4gKiBJdCBwcmV2ZW50cyBhY2Nlc3MgdG8gdGhlIGZvbGxvd2luZyBtZXRob2RzOlxuICogIC0gYGF0dGFjaEFic3RyYWN0c2A6IE5vIG5lZWQgdG8gYXR0YWNoIGFic3RyYWN0cyBhZ2Fpbi5cbiAqICAtIGBsb2FkVXRpbHRpZXNgOiBObyBuZWVkIHRvIGxvYWQgdXRpbGl0aWVzIGFnYWluLlxuICogIC0gYGluaXRpYWxpc2VgOiBTbm93Ym9hcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZC5cbiAqICAtIGBpbml0aWFsaXNlU2luZ2xldG9uc2A6IFNpbmdsZXRvbnMgYXJlIGFscmVhZHkgaW5pdGlhbGlzZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChbJ2F0dGFjaEFic3RyYWN0cycsICdsb2FkVXRpbGl0aWVzJywgJ2luaXRpYWxpc2UnLCAnaW5pdGlhbGlzZVNpbmdsZXRvbnMnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IGNhbm5vdCB1c2UgdGhlIFwiJHtwcm9wfVwiIFNub3dib2FyZCBtZXRob2Qgd2l0aGluIGEgcGx1Z2luLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IFJlZmxlY3QuZ2V0KHRhcmdldCwgJ3BsdWdpbnMnKVtwcm9wTG93ZXJdLmdldEluc3RhbmNlKC4uLnBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfSxcblxuICAgIGhhcyh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoWydhdHRhY2hBYnN0cmFjdHMnLCAnbG9hZFV0aWxpdGllcycsICdpbml0aWFsaXNlJywgJ2luaXRpYWxpc2VTaW5nbGV0b25zJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcbmltcG9ydCBJbm5lclByb3h5SGFuZGxlciBmcm9tICcuL0lubmVyUHJveHlIYW5kbGVyJztcblxuLyoqXG4gKiBQbHVnaW4gbG9hZGVyIGNsYXNzLlxuICpcbiAqIFRoaXMgaXMgYSBwcm92aWRlciAoZmFjdG9yeSkgY2xhc3MgZm9yIGEgc2luZ2xlIHBsdWdpbiBhbmQgcHJvdmlkZXMgdGhlIGxpbmsgYmV0d2VlbiBTbm93Ym9hcmQgZnJhbWV3b3JrIGZ1bmN0aW9uYWxpdHlcbiAqIGFuZCB0aGUgdW5kZXJseWluZyBwbHVnaW4gaW5zdGFuY2VzLiBJdCBhbHNvIHByb3ZpZGVzIHNvbWUgYmFzaWMgbW9ja2luZyBvZiBwbHVnaW4gbWV0aG9kcyBmb3IgdGVzdGluZy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luTG9hZGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEJpbmRzIHRoZSBXaW50ZXIgZnJhbWV3b3JrIHRvIHRoZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtTbm93Ym9hcmR9IHNub3dib2FyZFxuICAgICAqIEBwYXJhbSB7UGx1Z2luQmFzZX0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzbm93Ym9hcmQsIGluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkID0gbmV3IFByb3h5KFxuICAgICAgICAgICAgc25vd2JvYXJkLFxuICAgICAgICAgICAgSW5uZXJQcm94eUhhbmRsZXIsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgICAvLyBGcmVlemUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoaXMgbG9hZGVyXG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5pbnN0YW5jZSk7XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zaW5nbGV0b24gPSB7XG4gICAgICAgICAgICBpbml0aWFsaXNlZDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIC8vIFByZXZlbnQgZnVydGhlciBleHRlbnNpb24gb2YgdGhlIHNpbmdsZXRvbiBzdGF0dXMgb2JqZWN0XG4gICAgICAgIE9iamVjdC5zZWFsKHRoaXMuc2luZ2xldG9uKTtcblxuICAgICAgICB0aGlzLm1vY2tzID0ge307XG4gICAgICAgIHRoaXMub3JpZ2luYWxGdW5jdGlvbnMgPSB7fTtcblxuICAgICAgICAvLyBGcmVlemUgbG9hZGVyIGl0c2VsZlxuICAgICAgICBPYmplY3QuZnJlZXplKFBsdWdpbkxvYWRlci5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGhhcyBhIHNwZWNpZmljIG1ldGhvZCBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNNZXRob2QobWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAodHlwZW9mIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdID09PSAnZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIHByb3RvdHlwZSBtZXRob2QgZm9yIGEgcGx1Z2luLiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgYmUgdXNlZCBmb3IgXCJzdGF0aWNcIiBjYWxscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICogQHBhcmFtIHsuLi59IGFyZ3NcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGNhbGxNZXRob2QoLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdKGFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGN1cnJlbnQgcGx1Z2luLlxuICAgICAqXG4gICAgICogLSBJZiB0aGlzIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2luLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiAtIElmIHRoaXMgaXMgYSBzaW5nbGV0b24sIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkJhc2V8RnVuY3Rpb259XG4gICAgICovXG4gICAgZ2V0SW5zdGFuY2UoLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSkge1xuICAgICAgICAgICAgY29uc3QgdW5tZXQgPSB0aGlzLmdldERlcGVuZGVuY2llcygpLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuc25vd2JvYXJkLmdldFBsdWdpbk5hbWVzKCkuaW5jbHVkZXMoaXRlbSkpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCIke3RoaXMubmFtZX1cIiBwbHVnaW4gcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbHVnaW5zOiAke3VubWV0LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzZVNpbmdsZXRvbiguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXBwbHkgbW9ja2VkIG1ldGhvZHNcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm1vY2tzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5vcmlnaW5hbEZ1bmN0aW9ucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubW9ja3MpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSAoLi4ucGFyYW1zKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXNbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kcyB0byBwcm90b3R5cGVcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubW9ja3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMub3JpZ2luYWxGdW5jdGlvbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubW9ja3MpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdID0gKC4uLnBhcmFtcykgPT4gY2FsbGJhY2sodGhpcywgLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgdGhpcy5pbnN0YW5jZSh0aGlzLnNub3dib2FyZCwgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIG5ld0luc3RhbmNlLmRldGFjaCA9ICgpID0+IHRoaXMuaW5zdGFuY2VzLnNwbGljZSh0aGlzLmluc3RhbmNlcy5pbmRleE9mKG5ld0luc3RhbmNlKSwgMSk7XG4gICAgICAgIG5ld0luc3RhbmNlLmNvbnN0cnVjdCguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChuZXdJbnN0YW5jZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIHBsdWdpbiBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHBsdWdpbiwgYW4gZW1wdHkgYXJyYXkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5CYXNlW119XG4gICAgICovXG4gICAgZ2V0SW5zdGFuY2VzKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBpcyBhIHNpbXBsZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzRnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRoaXMuaW5zdGFuY2UgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBQbHVnaW5CYXNlID09PSBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaXMgYSBzaW5nbGV0b24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1NpbmdsZXRvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlIGluc3RhbmNlb2YgU2luZ2xldG9uID09PSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBzaW5nbGV0b24gaGFzIGJlZW4gaW5pdGlhbGlzZWQuXG4gICAgICpcbiAgICAgKiBOb3JtYWwgcGx1Z2lucyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzSW5pdGlhbGlzZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbi5pbml0aWFsaXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgaW5pdGlhbGlzZVNpbmdsZXRvbiguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyB0aGlzLmluc3RhbmNlKHRoaXMuc25vd2JvYXJkLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuZGV0YWNoID0gKCkgPT4gdGhpcy5pbnN0YW5jZXMuc3BsaWNlKHRoaXMuaW5zdGFuY2VzLmluZGV4T2YobmV3SW5zdGFuY2UpLCAxKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuY29uc3RydWN0KC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlcy5wdXNoKG5ld0luc3RhbmNlKTtcbiAgICAgICAgdGhpcy5zaW5nbGV0b24uaW5pdGlhbGlzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgY3VycmVudCBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbnMgY2Fubm90IGhhdmUgZGVwZW5kZW5jaWVzLlxuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGRlcGVuZGVuY3kgbWV0aG9kIHNwZWNpZmllZC5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZS5kZXBlbmRlbmNpZXMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZS5kZXBlbmRlbmNpZXMoKS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaGFzIGFsbCBpdHMgZGVwZW5kZW5jaWVzIGZ1bGZpbGxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpIHtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gdGhpcy5nZXREZXBlbmRlbmNpZXMoKTtcblxuICAgICAgICBsZXQgZnVsZmlsbGVkID0gdHJ1ZTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNub3dib2FyZC5oYXNQbHVnaW4ocGx1Z2luKSkge1xuICAgICAgICAgICAgICAgIGZ1bGZpbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZnVsZmlsbGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBhIG1ldGhvZCBvZiBhbiBpbnN0YW5jZSB0byBiZSBtb2NrZWQgZm9yIHRlc3RpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIG1vY2sgd2lsbCBiZSBhcHBsaWVkIGZvciB0aGUgbGlmZSBvZiBhbiBpbnN0YW5jZS4gRm9yIHNpbmdsZXRvbnMsIHRoZSBtb2NrIHdpbGwgYmUgYXBwbGllZCBmb3IgdGhlIGxpZmVcbiAgICAgKiBvZiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIE1vY2tzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgbW9jayhtZXRob2ROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gXCIke21ldGhvZE5hbWV9XCIgZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSBtb2NrZWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9ja3NbbWV0aG9kTmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgdGhpcy5vcmlnaW5hbEZ1bmN0aW9uc1ttZXRob2ROYW1lXSA9IHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdO1xuXG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xldG9uKCkgJiYgdGhpcy5pbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcblxuICAgICAgICAgICAgLy8gQXBwbHkgbW9ja2VkIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSAoLi4ucGFyYW1ldGVycykgPT4gY2FsbGJhY2sodGhpcywgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgbW9jayBjYWxsYmFjayBmcm9tIGZ1dHVyZSBpbnN0YW5jZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqL1xuICAgIHVubW9jayhtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tb2Nrc1ttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMubW9ja3NbbWV0aG9kTmFtZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zW21ldGhvZE5hbWVdO1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4gUmVmbGVjdC5nZXQodGFyZ2V0LCAncGx1Z2lucycpW3Byb3BMb3dlcl0uZ2V0SW5zdGFuY2UoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICB9LFxuXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcbmltcG9ydCBQbHVnaW5Mb2FkZXIgZnJvbSAnLi9QbHVnaW5Mb2FkZXInO1xuXG5pbXBvcnQgQ29va2llIGZyb20gJy4uL3V0aWxpdGllcy9Db29raWUnO1xuaW1wb3J0IEpzb25QYXJzZXIgZnJvbSAnLi4vdXRpbGl0aWVzL0pzb25QYXJzZXInO1xuaW1wb3J0IFNhbml0aXplciBmcm9tICcuLi91dGlsaXRpZXMvU2FuaXRpemVyJztcbmltcG9ydCBVcmwgZnJvbSAnLi4vdXRpbGl0aWVzL1VybCc7XG5cbi8qKlxuICogU25vd2JvYXJkIC0gdGhlIFdpbnRlciBKYXZhU2NyaXB0IGZyYW1ld29yay5cbiAqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGJhc2Ugb2YgYSBtb2Rlcm4gdGFrZSBvbiB0aGUgV2ludGVyIEpTIGZyYW1ld29yaywgYmVpbmcgZnVsbHkgZXh0ZW5zaWJsZSBhbmQgdGFraW5nIGFkdmFudGFnZVxuICogb2YgbW9kZXJuIEphdmFTY3JpcHQgZmVhdHVyZXMgYnkgbGV2ZXJhZ2luZyB0aGUgTGFyYXZlbCBNaXggY29tcGlsYXRpb24gZnJhbWV3b3JrLiBJdCBhbHNvIGlzIGNvZGVkIHVwIHRvIHJlbW92ZSB0aGVcbiAqIGRlcGVuZGVuY3kgb2YgalF1ZXJ5LlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICogQGxpbmsgaHR0cHM6Ly93aW50ZXJjbXMuY29tL2RvY3Mvc25vd2JvYXJkL2ludHJvZHVjdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbm93Ym9hcmQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdXRvU2luZ2xldG9ucyBBdXRvbWF0aWNhbGx5IGxvYWQgc2luZ2xldG9ucyB3aGVuIERPTSBpcyByZWFkeS4gRGVmYXVsdDogYHRydWVgLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVidWcgV2hldGhlciBkZWJ1Z2dpbmcgbG9ncyBzaG91bGQgYmUgc2hvd24uIERlZmF1bHQ6IGBmYWxzZWAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYXV0b1NpbmdsZXRvbnMsIGRlYnVnKSB7XG4gICAgICAgIHRoaXMuZGVidWdFbmFibGVkID0gKHR5cGVvZiBkZWJ1ZyA9PT0gJ2Jvb2xlYW4nICYmIGRlYnVnID09PSB0cnVlKTtcbiAgICAgICAgdGhpcy5hdXRvSW5pdFNpbmdsZXRvbnMgPSAodHlwZW9mIGF1dG9TaW5nbGV0b25zID09PSAnYm9vbGVhbicgJiYgYXV0b1NpbmdsZXRvbnMgPT09IGZhbHNlKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0ge307XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge307XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWFkaW5lc3MgPSB7XG4gICAgICAgICAgICBkb206IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICAvLyBTZWFsIHJlYWRpbmVzcyBmcm9tIGJlaW5nIGFkZGVkIHRvIGZ1cnRoZXIsIGJ1dCBhbGxvdyB0aGUgcHJvcGVydGllcyB0byBiZSBtb2RpZmllZC5cbiAgICAgICAgT2JqZWN0LnNlYWwodGhpcy5yZWFkaW5lc3MpO1xuICAgICAgICB0aGlzLmF0dGFjaEFic3RyYWN0cygpO1xuXG4gICAgICAgIC8vIEZyZWV6ZSB0aGUgU25vd2JvYXJkIGNsYXNzIHRvIHByZXZlbnQgZnVydGhlciBtb2RpZmljYXRpb25zLlxuICAgICAgICBPYmplY3QuZnJlZXplKFNub3dib2FyZC5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuXG4gICAgICAgIHRoaXMubG9hZFV0aWxpdGllcygpO1xuICAgICAgICB0aGlzLmluaXRpYWxpc2UoKTtcblxuICAgICAgICB0aGlzLmRlYnVnKCdTbm93Ym9hcmQgZnJhbWV3b3JrIGluaXRpYWxpc2VkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYWJzdHJhY3QgY2xhc3NlcyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBTbm93Ym9hcmQgY2xhc3MuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgSmF2YXNjcmlwdCBmdW5jdGlvbmFsaXR5IHdpdGggbm8gYnVpbGQgcHJvY2VzcyB0byBzdGlsbCBleHRlbmQgdGhlc2UgYWJzdHJhY3RzIGJ5IHByZWZpeGluZ1xuICAgICAqIHRoZW0gd2l0aCBcIlNub3dib2FyZFwiLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogY2xhc3MgTXlDbGFzcyBleHRlbmRzIFNub3dib2FyZC5QbHVnaW5CYXNlIHtcbiAgICAgKiAgICAgLi4uXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF0dGFjaEFic3RyYWN0cygpIHtcbiAgICAgICAgdGhpcy5QbHVnaW5CYXNlID0gUGx1Z2luQmFzZTtcbiAgICAgICAgdGhpcy5TaW5nbGV0b24gPSBTaW5nbGV0b247XG5cbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlBsdWdpbkJhc2UucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlBsdWdpbkJhc2UpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuU2luZ2xldG9uLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5TaW5nbGV0b24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBkZWZhdWx0IHV0aWxpdGllcy5cbiAgICAgKi9cbiAgICBsb2FkVXRpbGl0aWVzKCkge1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignY29va2llJywgQ29va2llKTtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ2pzb25QYXJzZXInLCBKc29uUGFyc2VyKTtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ3Nhbml0aXplcicsIFNhbml0aXplcik7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCd1cmwnLCBVcmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIHRoZSBmcmFtZXdvcmsuXG4gICAgICpcbiAgICAgKiBBdHRhY2hlcyBhIGxpc3RlbmVyIGZvciB0aGUgRE9NIGJlaW5nIHJlYWR5IGFuZCB0cmlnZ2VycyBhIGdsb2JhbCBcInJlYWR5XCIgZXZlbnQgZm9yIHBsdWdpbnMgdG8gYmVnaW4gYXR0YWNoaW5nXG4gICAgICogdGhlbXNlbHZlcyB0byB0aGUgRE9NLlxuICAgICAqL1xuICAgIGluaXRpYWxpc2UoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b0luaXRTaW5nbGV0b25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXNlU2luZ2xldG9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5nbG9iYWxFdmVudCgncmVhZHknKTtcbiAgICAgICAgICAgIHRoaXMucmVhZGluZXNzLmRvbSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIGFuIGluc3RhbmNlIG9mIGV2ZXJ5IHNpbmdsZXRvbi5cbiAgICAgKi9cbiAgICBpbml0aWFsaXNlU2luZ2xldG9ucygpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbnMpLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc1NpbmdsZXRvbigpICYmIHBsdWdpbi5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBwbHVnaW4gdG8gdGhlIGZyYW1ld29yay5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgYXJlIHRoZSBjb3JuZXJzdG9uZSBmb3IgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGZvciBTbm93Ym9hcmQuIEEgcGx1Z2luIG11c3QgZWl0aGVyIGJlIGFuIEVTMjAxNSBjbGFzc1xuICAgICAqIHRoYXQgZXh0ZW5kcyB0aGUgUGx1Z2luQmFzZSBvciBTaW5nbGV0b24gYWJzdHJhY3QgY2xhc3Nlcywgb3IgYSBzaW1wbGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBXaGVuIGEgcGx1Z2luIGlzIGFkZGVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGFzIGEgbmV3IG1hZ2ljIG1ldGhvZCBpbiB0aGUgU25vd2JvYXJkIGNsYXNzIHVzaW5nIHRoZSBuYW1lXG4gICAgICogcGFyYW1ldGVyLCBhbmQgY2FuIGJlIGNhbGxlZCB2aWEgdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIGJlIHRoZSBcImxvd2VyY2FzZVwiIHZlcnNpb24gb2YgdGhpcyBuYW1lLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIGEgcGx1Z2luIGlzIGFzc2lnbmVkIHRvIHRoZSBuYW1lIFwibXlQbHVnaW5cIiwgaXQgY2FuIGJlIGNhbGxlZCB2aWEgYFNub3dib2FyZC5teXBsdWdpbigpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfEZ1bmN0aW9ufSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFBsdWdpbihuYW1lLCBpbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzUGx1Z2luKGxvd2VyTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQSBwbHVnaW4gY2FsbGVkIFwiJHtuYW1lfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UgIT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UgaW5zdGFuY2VvZiBQbHVnaW5CYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgcGx1Z2luIG11c3QgZXh0ZW5kIHRoZSBQbHVnaW5CYXNlIGNsYXNzLCBvciBtdXN0IGJlIGEgY2FsbGJhY2sgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpc1tuYW1lXSAhPT0gdW5kZWZpbmVkIHx8IHRoaXNbbG93ZXJOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBnaXZlbiBuYW1lIGlzIGFscmVhZHkgaW4gdXNlIGZvciBhIHByb3BlcnR5IG9yIG1ldGhvZCBvZiB0aGUgU25vd2JvYXJkIGNsYXNzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV0gPSBuZXcgUGx1Z2luTG9hZGVyKGxvd2VyTmFtZSwgdGhpcywgaW5zdGFuY2UpO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFBsdWdpbiBcIiR7bmFtZX1cIiByZWdpc3RlcmVkYCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYW55IHNpbmdsZXRvbnMgbm93IGhhdmUgdGhlaXIgZGVwZW5kZW5jaWVzIGZ1bGZpbGxlZCwgYW5kIGZpcmUgdGhlaXIgXCJyZWFkeVwiIGhhbmRsZXIgaWYgd2UncmVcbiAgICAgICAgLy8gaW4gYSByZWFkeSBzdGF0ZS5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmdldFBsdWdpbnMoKSkuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGx1Z2luLmlzU2luZ2xldG9uKClcbiAgICAgICAgICAgICAgICAmJiAhcGx1Z2luLmlzSW5pdGlhbGlzZWQoKVxuICAgICAgICAgICAgICAgICYmIHBsdWdpbi5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKVxuICAgICAgICAgICAgICAgICYmIHBsdWdpbi5oYXNNZXRob2QoJ2xpc3RlbnMnKVxuICAgICAgICAgICAgICAgICYmIE9iamVjdC5rZXlzKHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJykpLmluY2x1ZGVzKCdyZWFkeScpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5yZWFkaW5lc3MuZG9tXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeU1ldGhvZCA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJykucmVhZHk7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmNhbGxNZXRob2QocmVhZHlNZXRob2QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcGx1Z2luLlxuICAgICAqXG4gICAgICogUmVtb3ZlcyBhIHBsdWdpbiBmcm9tIFNub3dib2FyZCwgY2FsbGluZyB0aGUgZGVzdHJ1Y3RvciBtZXRob2QgZm9yIGFsbCBhY3RpdmUgaW5zdGFuY2VzIG9mIHRoZSBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZVBsdWdpbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKGxvd2VyTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYFBsdWdpbiBcIiR7bmFtZX1cIiBhbHJlYWR5IHJlbW92ZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgZGVzdHJ1Y3RvcnMgZm9yIGFsbCBpbnN0YW5jZXNcbiAgICAgICAgdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV0uZ2V0SW5zdGFuY2VzKCkuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmRlc3RydWN0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXTtcbiAgICAgICAgZGVsZXRlIHRoaXNbbG93ZXJOYW1lXTtcbiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIHJlbW92ZWRgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgcGx1Z2luIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYW5kIGlzIGFjdGl2ZS5cbiAgICAgKlxuICAgICAqIEEgcGx1Z2luIHRoYXQgaXMgc3RpbGwgd2FpdGluZyBmb3IgZGVwZW5kZW5jaWVzIHRvIGJlIHJlZ2lzdGVyZWQgd2lsbCBub3QgYmUgYWN0aXZlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNQbHVnaW4obmFtZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZ2lzdGVyZWQgcGx1Z2lucyBhcyBQbHVnaW5Mb2FkZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5Mb2FkZXJbXX1cbiAgICAgKi9cbiAgICBnZXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBwbHVnaW5zLCBieSBuYW1lLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldFBsdWdpbk5hbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wbHVnaW5zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUGx1Z2luTG9hZGVyIG9iamVjdCBvZiBhIGdpdmVuIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5Mb2FkZXJ9XG4gICAgICovXG4gICAgZ2V0UGx1Z2luKG5hbWUpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwbHVnaW4gY2FsbGVkIFwiJHtsb3dlck5hbWV9XCIgaGFzIGJlZW4gcmVnaXN0ZXJlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhbGwgcGx1Z2lucyB0aGF0IGxpc3RlbiB0byB0aGUgZ2l2ZW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHdvcmtzIGZvciBib3RoIG5vcm1hbCBhbmQgcHJvbWlzZSBldmVudHMuIEl0IGRvZXMgTk9UIGNoZWNrIHRoYXQgdGhlIHBsdWdpbidzIGxpc3RlbmVyIGFjdHVhbGx5IGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFRoZSBuYW1lIG9mIHRoZSBwbHVnaW5zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50LlxuICAgICAqL1xuICAgIGxpc3RlbnNUb0V2ZW50KGV2ZW50TmFtZSkge1xuICAgICAgICBjb25zdCBwbHVnaW5zID0gW107XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5wbHVnaW5zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW25hbWUsIHBsdWdpbl0gPSBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBsdWdpbi5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGx1Z2luLmhhc01ldGhvZCgnbGlzdGVucycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyc1tldmVudE5hbWVdID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbGlzdGVuZXJzW2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5zLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwbHVnaW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHNpbXBsZSByZWFkeSBsaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIFN5bm9ueW1vdXMgd2l0aCBqUXVlcnkncyBcIiQoZG9jdW1lbnQpLnJlYWR5KClcIiBmdW5jdGlvbmFsaXR5LCB0aGlzIGFsbG93cyBpbmxpbmUgc2NyaXB0cyB0b1xuICAgICAqIGF0dGFjaCB0aGVtc2VsdmVzIHRvIFNub3dib2FyZCBpbW1lZGlhdGVseSBidXQgb25seSBmaXJlIHdoZW4gdGhlIERPTSBpcyByZWFkeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcmVhZHkoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZGluZXNzLmRvbSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub24oJ3JlYWR5JywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzaW1wbGUgbGlzdGVuZXIgZm9yIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWQtaG9jIHNjcmlwdHMgdGhhdCBkb24ndCBuZWVkIGEgZnVsbCBwbHVnaW4uIFRoZSBnaXZlbiBjYWxsYmFjayB3aWxsIGJlXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIGV2ZW50IG5hbWUgcHJvdmlkZWQgZmlyZXMuIFRoaXMgd29ya3MgZm9yIGJvdGggbm9ybWFsIGFuZCBQcm9taXNlIGV2ZW50cy4gRm9yXG4gICAgICogYSBQcm9taXNlIGV2ZW50LCB5b3VyIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uaW5jbHVkZXMoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHNpbXBsZSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBvZmYoZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgZ2xvYmFsIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYSBgZmFsc2VgLCB0aGUgZXZlbnQgaXMgY29uc2lkZXJlZCBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IElmIGV2ZW50IHdhcyBub3QgY2FuY2VsbGVkXG4gICAgICovXG4gICAgZ2xvYmFsRXZlbnQoZXZlbnROYW1lLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYENhbGxpbmcgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgLCAuLi5wYXJhbWV0ZXJzKTtcblxuICAgICAgICAvLyBGaW5kIHBsdWdpbnMgbGlzdGVuaW5nIHRvIHRoZSBldmVudC5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5zVG9FdmVudChldmVudE5hbWUpO1xuICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgTm8gbGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWJ1ZyhgTGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cIjogJHtsaXN0ZW5lcnMuam9pbignLCAnKX1gKTtcblxuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuZ2V0UGx1Z2luKG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNTaW5nbGV0b24oKSAmJiBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlzdGVuTWV0aG9kID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKVtldmVudE5hbWVdO1xuXG4gICAgICAgICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXIgbWV0aG9kcyBmb3IgYWxsIHBsdWdpbnMsIGlmIHRoZXkgaGF2ZSBhIG1ldGhvZCBzcGVjaWZpZWQgZm9yIHRoZSBldmVudC5cbiAgICAgICAgICAgIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgcGx1Z2luIGhhcyBjYW5jZWxsZWQgdGhlIGV2ZW50LCBubyBmdXJ0aGVyIHBsdWdpbnMgYXJlIGNvbnNpZGVyZWQuXG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGxpc3Rlbk1ldGhvZC5hcHBseShpbnN0YW5jZSwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwiJHtsaXN0ZW5NZXRob2R9XCIgbWV0aG9kIGluIFwiJHtuYW1lfVwiIHBsdWdpbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKC4uLnBhcmFtZXRlcnMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgR2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCIgY2FuY2VsbGVkIGJ5IFwiJHtuYW1lfVwiIHBsdWdpbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgTGlzdGVuIG1ldGhvZCBmb3IgXCIke2V2ZW50TmFtZX1cIiBldmVudCBpbiBcIiR7bmFtZX1cIiBwbHVnaW4gaXMgbm90IGEgZnVuY3Rpb24gb3Igc3RyaW5nLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIGFkLWhvYyBsaXN0ZW5lcnMgZm9yIHRoaXMgZXZlbnQuXG4gICAgICAgIGlmICghY2FuY2VsbGVkICYmIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBGb3VuZCAke3RoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RofSBhZC1ob2MgbGlzdGVuZXIocykgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIGxpc3RlbmVyIGhhcyBjYW5jZWxsZWQgdGhlIGV2ZW50LCBubyBmdXJ0aGVyIGxpc3RlbmVycyBhcmUgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIoLi4ucGFyYW1ldGVycykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgR2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9IGNhbmNlbGxlZCBieSBhbiBhZC1ob2MgbGlzdGVuZXIuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IGFuIGFkLWhvYyBsaXN0ZW5lci5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIWNhbmNlbGxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIGdsb2JhbCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zLCBleHBlY3RpbmcgYSBQcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IGFsbC5cbiAgICAgKlxuICAgICAqIFRoaXMgY29sbGF0ZXMgYWxsIHBsdWdpbnMgcmVzcG9uc2VzIGludG8gb25lIGxhcmdlIFByb21pc2UgdGhhdCBlaXRoZXIgZXhwZWN0cyBhbGwgdG8gYmUgcmVzb2x2ZWQsIG9yIG9uZSB0byByZWplY3QuXG4gICAgICogSWYgbm8gbGlzdGVuZXJzIGFyZSBmb3VuZCwgYSByZXNvbHZlZCBQcm9taXNlIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqL1xuICAgIGdsb2JhbFByb21pc2VFdmVudChldmVudE5hbWUsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgQ2FsbGluZyBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG5cbiAgICAgICAgLy8gRmluZCBwbHVnaW5zIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50LlxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbnNUb0V2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBObyBsaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKGBMaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCI6ICR7bGlzdGVuZXJzLmpvaW4oJywgJyl9YCk7XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5nZXRQbHVnaW4obmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc1NpbmdsZXRvbigpICYmIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5NZXRob2QgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpW2V2ZW50TmFtZV07XG5cbiAgICAgICAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlciBtZXRob2RzIGZvciBhbGwgcGx1Z2lucywgaWYgdGhleSBoYXZlIGEgbWV0aG9kIHNwZWNpZmllZCBmb3IgdGhlIGV2ZW50LlxuICAgICAgICAgICAgcGx1Z2luLmdldEluc3RhbmNlcygpLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlUHJvbWlzZSA9IGxpc3Rlbk1ldGhvZC5hcHBseShpbnN0YW5jZSwgcGFyYW1ldGVycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZVByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbnN0YW5jZVByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlW2xpc3Rlbk1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcIiR7bGlzdGVuTWV0aG9kfVwiIG1ldGhvZCBpbiBcIiR7bmFtZX1cIiBwbHVnaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZVByb21pc2UgPSBpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKC4uLnBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW5zdGFuY2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIHByb21pc2UgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgTGlzdGVuIG1ldGhvZCBmb3IgXCIke2V2ZW50TmFtZX1cIiBldmVudCBpbiBcIiR7bmFtZX1cIiBwbHVnaW4gaXMgbm90IGEgZnVuY3Rpb24gb3Igc3RyaW5nLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIGFkLWhvYyBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdICYmIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgRm91bmQgJHt0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aH0gYWQtaG9jIGxpc3RlbmVyKHMpIGZvciBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lclByb21pc2UgPSBsaXN0ZW5lciguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGxpc3RlbmVyUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBwcm9taXNlIGV2ZW50IGJ5IGFuIGFkLWhvYyBsaXN0ZW5lci5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhIHN0eWxlZCBtZXNzYWdlIGluIHRoZSBjb25zb2xlLlxuICAgICAqXG4gICAgICogSW5jbHVkZXMgcGFyYW1ldGVycyBhbmQgYSBzdGFjayB0cmFjZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGxvZ01lc3NhZ2UoY29sb3IsIGJvbGQsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgICAgICclY1tTbm93Ym9hcmRdJyxcbiAgICAgICAgICAgIGBjb2xvcjogJHtjb2xvcn07IGZvbnQtd2VpZ2h0OiAkeyhib2xkKSA/ICdib2xkJyA6ICdub3JtYWwnfTtgLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICApO1xuICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICAgICAgICAgYCVjUGFyYW1ldGVycyAlYygke3BhcmFtZXRlcnMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICdjb2xvcjogcmdiKDQ1LCAxNjcsIDE5OSk7IGZvbnQtd2VpZ2h0OiBib2xkOycsXG4gICAgICAgICAgICAgICAgJ2NvbG9yOiByZ2IoODgsIDg4LCA4OCk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJWMke2luZGV4fTpgLCAnY29sb3I6IHJnYig4OCwgODgsIDg4KTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsnLCBwYXJhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZCgnJWNUcmFjZScsICdjb2xvcjogcmdiKDQ1LCAxNjcsIDE5OSk7IGZvbnQtd2VpZ2h0OiBib2xkOycpO1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBsb2cobWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UoJ3JnYig0NSwgMTY3LCAxOTkpJywgZmFsc2UsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBUaGVzZSBtZXNzYWdlcyBhcmUgb25seSBzaG93biB3aGVuIGRlYnVnZ2luZyBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZGVidWcobWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAoIXRoaXMuZGVidWdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UoJ3JnYig0NSwgMTY3LCAxOTkpJywgZmFsc2UsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGVycm9yKG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKCdyZ2IoMjI5LCAzNSwgMzUpJywgdHJ1ZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VDb29raWUgZnJvbSAnanMtY29va2llJztcbmltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQ29va2llIHV0aWxpdHkuXG4gKlxuICogVGhpcyB1dGlsaXR5IGlzIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgXCJqcy1jb29raWVcIiBsaWJyYXJ5LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pzLWNvb2tpZS9qcy1jb29raWVcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWUgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGV4cGlyZXM6IG51bGwsXG4gICAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgICBkb21haW46IG51bGwsXG4gICAgICAgICAgICBzZWN1cmU6IGZhbHNlLFxuICAgICAgICAgICAgc2FtZVNpdGU6ICdMYXgnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBjb29raWUgcGFyYW1ldGVycyBmb3IgYWxsIHN1YnNlcXVlbnQgXCJzZXRcIiBhbmQgXCJyZW1vdmVcIiBjYWxscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICovXG4gICAgc2V0RGVmYXVsdHMob3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvb2tpZSBkZWZhdWx0cyBtdXN0IGJlIHByb3ZpZGVkIGFzIGFuIG9iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0c1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgY29va2llIHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldERlZmF1bHRzKCkge1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZGVmYXVsdHMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHNba2V5XSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvb2tpZSBieSBuYW1lLlxuICAgICAqXG4gICAgICogSWYgYG5hbWVgIGlzIHVuZGVmaW5lZCwgcmV0dXJucyBhbGwgY29va2llcyBhcyBhbiBPYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R8U3RyaW5nfVxuICAgICAqL1xuICAgIGdldChuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb2tpZXMgPSBCYXNlQ29va2llLmdldCgpO1xuXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhjb29raWVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtjb29raWVOYW1lLCBjb29raWVWYWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdjb29raWUuZ2V0JywgY29va2llTmFtZSwgY29va2llVmFsdWUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29raWVzW2Nvb2tpZU5hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvb2tpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBCYXNlQ29va2llLmdldChuYW1lKTtcblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIG92ZXJyaWRlIHRoZSBnb3R0ZW4gdmFsdWVcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Nvb2tpZS5nZXQnLCBuYW1lLCB2YWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGEgY29va2llIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCBjb29raWUgcGFyYW1ldGVycyB0aHJvdWdoIHRoZSBcIm9wdGlvbnNcIiBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBzZXQobmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHNhdmVWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIHRvIHNhdmVcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Nvb2tpZS5zZXQnLCBuYW1lLCB2YWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBzYXZlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEJhc2VDb29raWUuc2V0KG5hbWUsIHNhdmVWYWx1ZSwge1xuICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0cygpLFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgY29va2llIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHNwZWNpZnkgdGhlIGFkZGl0aW9uYWwgY29va2llIHBhcmFtZXRlcnMgdmlhIHRoZSBcIm9wdGlvbnNcIiBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlKG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgQmFzZUNvb2tpZS5yZW1vdmUobmFtZSwge1xuICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0cygpLFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBKU09OIFBhcnNlciB1dGlsaXR5LlxuICpcbiAqIFRoaXMgdXRpbGl0eSBwYXJzZXMgSlNPTi1saWtlIGRhdGEgdGhhdCBkb2VzIG5vdCBzdHJpY3RseSBtZWV0IHRoZSBKU09OIHNwZWNpZmljYXRpb25zIGluIG9yZGVyIHRvIHNpbXBsaWZ5IGRldmVsb3BtZW50LlxuICogSXQgaXMgYSBzYWZlIHJlcGxhY2VtZW50IGZvciBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV2YWwoXCIoe1wiICsgdmFsdWUgKyBcIn0pXCIpKSkgdGhhdCBkb2VzIG5vdCByZXF1aXJlIHRoZSB1c2Ugb2YgZXZhbCgpXG4gKlxuICogQGF1dGhvciBBeXVtaSBIYW1hc2FraVxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL29jdG9iZXJjbXMvb2N0b2Jlci9wdWxsLzQ1MjdcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSnNvblBhcnNlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICAvLyBBZGQgdG8gZ2xvYmFsIGZ1bmN0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICB3aW5kb3cud25KU09OID0gKGpzb24pID0+IHRoaXMucGFyc2UoanNvbik7XG4gICAgICAgIHdpbmRvdy5vY0pTT04gPSB3aW5kb3cud25KU09OO1xuICAgIH1cblxuICAgIHBhcnNlKHN0cikge1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gdGhpcy5wYXJzZVN0cmluZyhzdHIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcbiAgICB9XG5cbiAgICBwYXJzZVN0cmluZyh2YWx1ZSkge1xuICAgICAgICBsZXQgc3RyID0gdmFsdWUudHJpbSgpO1xuXG4gICAgICAgIGlmICghc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm9rZW4gSlNPTiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIGxldCB0eXBlID0gbnVsbDtcbiAgICAgICAgbGV0IGtleSA9IG51bGw7XG4gICAgICAgIGxldCBib2R5ID0gJyc7XG5cbiAgICAgICAgLypcbiAgICAgICAgKiB0aGUgbWlzdGFrZSAnLCdcbiAgICAgICAgKi9cbiAgICAgICAgd2hpbGUgKHN0ciAmJiBzdHJbMF0gPT09ICcsJykge1xuICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogc3RyaW5nXG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHJbMF0gPT09ICdcIicgfHwgc3RyWzBdID09PSAnXFwnJykge1xuICAgICAgICAgICAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gIT09IHN0clswXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcgSlNPTiBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJvZHkgPSAnXCInO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpICsgMV0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IHN0clswXSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJ1xcXFxcIic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nIEpTT04gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBib29sZWFuXG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHIgPT09ICd0cnVlJyB8fCBzdHIgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIG51bGxcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0ciA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBudW1iZXJcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHN0cik7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW0udG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogb2JqZWN0XG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHJbMF0gPT09ICd7Jykge1xuICAgICAgICAgICAgdHlwZSA9ICduZWVkS2V5JztcbiAgICAgICAgICAgIGtleSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQgPSAneyc7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNCbGFua0NoYXIoc3RyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnbmVlZEtleScgJiYgKHN0cltpXSA9PT0gJ1wiJyB8fCBzdHJbaV0gPT09ICdcXCcnKSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlS2V5KHN0ciwgaSArIDEsIHN0cltpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgXCIke2tleX1cImA7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0ga2V5Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyS2V5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICduZWVkS2V5JyAmJiB0aGlzLmNhbkJlS2V5SGVhZChzdHJbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VLZXkoc3RyLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXCInO1xuICAgICAgICAgICAgICAgICAgICBpICs9IGtleS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyS2V5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhZnRlcktleScgJiYgc3RyW2ldID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICc6JztcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICc6JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5nZXRCb2R5KHN0ciwgaSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyBib2R5Lm9yaWdpbkxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnBhcnNlU3RyaW5nKGJvZHkuYm9keSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlckJvZHknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FmdGVyQm9keScgfHwgdHlwZSA9PT0gJ25lZWRLZXknKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cltsYXN0XSA9PT0gJywnIHx8IHRoaXMuaXNCbGFua0NoYXIoc3RyW2xhc3RdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbbGFzdF0gPT09ICd9JyAmJiBsYXN0ID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICd9JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgIT09IGkgJiYgcmVzdWx0ICE9PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ25lZWRLZXknO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGxhc3QgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIG9iamVjdCBuZWFyICR7cmVzdWx0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBhcnJheVxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyWzBdID09PSAnWycpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICdbJztcbiAgICAgICAgICAgIHR5cGUgPSAnbmVlZEJvZHknO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnICcgfHwgc3RyW2ldID09PSAnXFxuJyB8fCBzdHJbaV0gPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICduZWVkQm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ251bGwsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ10nICYmIGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ10nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmdldEJvZHkoc3RyLCBpKTtcblxuICAgICAgICAgICAgICAgICAgICBpID0gaSArIGJvZHkub3JpZ2luTGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMucGFyc2VTdHJpbmcoYm9keS5ib2R5KTtcblxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyQm9keSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYWZ0ZXJCb2R5Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ25lZWRCb2R5JztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVhbCB3aXRoIG1pc3Rha2UgXCIsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdHJbaSArIDFdID09PSAnLCcgfHwgdGhpcy5pc0JsYW5rQ2hhcihzdHJbaSArIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaSArIDFdID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdudWxsLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICddJyAmJiBpID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICddJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYXJyYXkgbmVhciAke3Jlc3VsdH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBnZXRCb2R5KHN0ciwgcG9zKSB7XG4gICAgICAgIGxldCBib2R5ID0gJyc7XG5cbiAgICAgICAgLy8gcGFyc2Ugc3RyaW5nIGJvZHlcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnXCInIHx8IHN0cltwb3NdID09PSAnXFwnJykge1xuICAgICAgICAgICAgYm9keSA9IHN0cltwb3NdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcG9zICsgMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gc3RyW3Bvc10pIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBzdHJpbmcgYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIHRydWUgLyBmYWxzZVxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICd0Jykge1xuICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCd0cnVlJywgcG9zKSA9PT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiAndHJ1ZScubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ2YnKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ2YnLCBwb3MpID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6ICdmYWxzZScubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAnZmFsc2UnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9vbGVhbiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKDAsIHBvcyArIDEwKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIG51bGxcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnbicpIHtcbiAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZignbnVsbCcsIHBvcykgPT09IHBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogJ251bGwnLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogJ251bGwnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9vbGVhbiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKDAsIHBvcyArIDEwKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIG51bWJlclxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICctJyB8fCBzdHJbcG9zXSA9PT0gJysnIHx8IHN0cltwb3NdID09PSAnLicgfHwgKHN0cltwb3NdID49ICcwJyAmJiBzdHJbcG9zXSA8PSAnOScpKSB7XG4gICAgICAgICAgICBib2R5ID0gJyc7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnLScgfHwgc3RyW2ldID09PSAnKycgfHwgc3RyW2ldID09PSAnLicgfHwgKHN0cltpXSA+PSAnMCcgJiYgc3RyW2ldIDw9ICc5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBudW1iZXIgYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIG9iamVjdFxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICd7JyB8fCBzdHJbcG9zXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IFtcbiAgICAgICAgICAgICAgICBzdHJbcG9zXSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBib2R5ID0gc3RyW3Bvc107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwb3MgKyAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1wiJyAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCd7Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnfScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gJHsoc3RyW3Bvc10gPT09ICd7JyA/ICdvYmplY3QnIDogJ2FycmF5Jyl9IGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goJ1snKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICddJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBpIC0gcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gJHsoc3RyW3Bvc10gPT09ICd7JyA/ICdvYmplY3QnIDogJ2FycmF5Jyl9IGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoKHBvcyAtIDUgPj0gMCkgPyBwb3MgLSA1IDogMCwgNTApfWApO1xuICAgIH1cblxuICAgIHBhcnNlS2V5KHN0ciwgcG9zLCBxdW90ZSkge1xuICAgICAgICBsZXQga2V5ID0gJyc7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHF1b3RlICYmIHF1b3RlID09PSBzdHJbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdW90ZSAmJiAoc3RyW2ldID09PSAnICcgfHwgc3RyW2ldID09PSAnOicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAga2V5ICs9IHN0cltpXTtcblxuICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnICYmIGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGtleSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gc3ludGF4IG5lYXIgJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgY2FuQmVLZXlIZWFkKGNoKSB7XG4gICAgICAgIGlmIChjaFswXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjaFswXSA+PSAnYScgJiYgY2hbMF0gPD0gJ3onKSB8fCAoY2hbMF0gPj0gJ0EnICYmIGNoWzBdIDw9ICdaJykgfHwgY2hbMF0gPT09ICdfJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoWzBdID49ICcwJyAmJiBjaFswXSA8PSAnOScpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaFswXSA9PT0gJyQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2guY2hhckNvZGVBdCgwKSA+IDI1NSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNCbGFua0NoYXIoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID09PSAnICcgfHwgY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFx0JztcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIFNhbml0aXplciB1dGlsaXR5LlxuICpcbiAqIENsaWVudC1zaWRlIEhUTUwgc2FuaXRpemVyIGRlc2lnbmVkIG1vc3RseSB0byBwcmV2ZW50IHNlbGYtWFNTIGF0dGFja3MuXG4gKiBUaGUgc2FuaXRpemVyIHV0aWxpdHkgd2lsbCBzdHJpcCBhbGwgYXR0cmlidXRlcyB0aGF0IHN0YXJ0IHdpdGggYG9uYCAodXN1YWxseSBKUyBldmVudCBoYW5kbGVycyBhcyBhdHRyaWJ1dGVzLCBpLmUuIGBvbmxvYWRgIG9yIGBvbmVycm9yYCkgb3IgY29udGFpbiB0aGUgYGphdmFzY3JpcHQ6YCBwc2V1ZG8gcHJvdG9jb2wgaW4gdGhlaXIgdmFsdWVzLlxuICpcbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNhbml0aXplciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICAvLyBBZGQgdG8gZ2xvYmFsIGZ1bmN0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICB3aW5kb3cud25TYW5pdGl6ZSA9IChodG1sKSA9PiB0aGlzLnNhbml0aXplKGh0bWwpO1xuICAgICAgICB3aW5kb3cub2NTYW5pdGl6ZSA9IHdpbmRvdy53blNhbml0aXplO1xuICAgIH1cblxuICAgIHNhbml0aXplKGh0bWwsIGJvZHlPbmx5KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHJldHVybkJvZHlPbmx5ID0gKGJvZHlPbmx5ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGJvZHlPbmx5ID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICA/IGJvZHlPbmx5XG4gICAgICAgICAgICA6IHRydWU7XG5cbiAgICAgICAgdGhpcy5zYW5pdGl6ZU5vZGUoZG9tLmdldFJvb3ROb2RlKCkpO1xuXG4gICAgICAgIHJldHVybiAocmV0dXJuQm9keU9ubHkpID8gZG9tLmJvZHkuaW5uZXJIVE1MIDogZG9tLmlubmVySFRNTDtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZU5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS50YWdOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJpbUF0dHJpYnV0ZXMobm9kZSk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKG5vZGUuY2hpbGRyZW4pO1xuXG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhbml0aXplTm9kZShjaGlsZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyaW1BdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9IG5vZGUuYXR0cmlidXRlcy5pdGVtKGkpLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBub2RlLmF0dHJpYnV0ZXMuaXRlbShpKS52YWx1ZTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICogcmVtb3ZlIGF0dHJpYnV0ZXMgd2hlcmUgdGhlIG5hbWVzIHN0YXJ0IHdpdGggXCJvblwiIChmb3IgZXhhbXBsZTogb25sb2FkLCBvbmVycm9yLi4uKVxuICAgICAgICAgICAgKiByZW1vdmUgYXR0cmlidXRlcyB3aGVyZSB0aGUgdmFsdWUgc3RhcnRzIHdpdGggdGhlIFwiamF2YXNjcmlwdDpcIiBwc2V1ZG8gcHJvdG9jb2wgKGZvciBleGFtcGxlIGhyZWY9XCJqYXZhc2NyaXB0OmFsZXJ0KDEpXCIpXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICBpZiAoYXR0ck5hbWUuaW5kZXhPZignb24nKSA9PT0gMCB8fCBhdHRyVmFsdWUuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogVVJMIHV0aWxpdHkuXG4gKlxuICogVGhpcyB1dGlsaXR5IHByb3ZpZGVzIFVSTCBmdW5jdGlvbnMuXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVybCBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IG51bGw7XG4gICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IG51bGw7XG4gICAgICAgIHRoaXMuYmFzZVVybCgpO1xuICAgICAgICB0aGlzLmFzc2V0VXJsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIFVSTCBiYXNlZCBvbiBhIHJlbGF0aXZlIHBhdGguXG4gICAgICpcbiAgICAgKiBJZiBhbiBhYnNvbHV0ZSBVUkwgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG8odXJsKSB7XG4gICAgICAgIGNvbnN0IHVybFJlZ2V4ID0gL14oPzpbXjpdKzpcXC9cXC8pWy1hLXowLTlAOiUuXyt+Iz1dezEsMjU2fVxcYihbLWEtejAtOSgpQDolXysufiM/Ji8vPV0qKS9pO1xuXG4gICAgICAgIGlmICh1cmwubWF0Y2godXJsUmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhlVXJsID0gdXJsLnJlcGxhY2UoL15cXC8rLywgJycpO1xuXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmJhc2VVcmwoKX0ke3RoZVVybH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gQXNzZXQgVVJMIGJhc2VkIG9uIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKlxuICAgICAqIElmIGFuIGFic29sdXRlIFVSTCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBhc3NldCh1cmwpIHtcbiAgICAgICAgY29uc3QgdXJsUmVnZXggPSAvXig/OlteOl0rOlxcL1xcLylbLWEtejAtOUA6JS5fK34jPV17MSwyNTZ9XFxiKFstYS16MC05KClAOiVfKy5+Iz8mLy89XSopL2k7XG5cbiAgICAgICAgaWYgKHVybC5tYXRjaCh1cmxSZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aGVVcmwgPSB1cmwucmVwbGFjZSgvXlxcLysvLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYXNzZXRVcmwoKX0ke3RoZVVybH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBiYXNlIFVSTCBvZiB0aGlzIGluc3RhbGwuXG4gICAgICpcbiAgICAgKiBUaGlzIGRldGVybWluZXMgdGhlIGJhc2UgVVJMIGZyb20gdGhyZWUgc291cmNlcywgaW4gb3JkZXI6XG4gICAgICogIC0gSWYgU25vd2JvYXJkIGlzIGxvYWRlZCB2aWEgdGhlIGB7JSBzbm93Ym9hcmQgJX1gIHRhZywgaXQgd2lsbCByZXRyaWV2ZSB0aGUgYmFzZSBVUkwgdGhhdFxuICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgdGhlcmUuXG4gICAgICogIC0gSWYgYSBgPGJhc2U+YCB0YWcgaXMgYXZhaWxhYmxlLCBpdCB3aWxsIHVzZSB0aGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgYmFzZSB0YWcuXG4gICAgICogIC0gRmluYWxseSwgaXQgd2lsbCB0YWtlIGEgZ3Vlc3MgZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyB3aWxsIGxpa2VseSBub3Qgd29yayBmb3Igc2l0ZXNcbiAgICAgKiB0aGF0IHJlc2lkZSBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBiYXNlIFVSTCB3aWxsIGFsd2F5cyBjb250YWluIGEgdHJhaWxpbmcgYmFja3NsYXNoLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBiYXNlVXJsKCkge1xuICAgICAgICBpZiAodGhpcy5mb3VuZEJhc2VVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykuZGF0YXNldC5iYXNlVXJsKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gW1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgICAgICAgJy8vJyxcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LFxuICAgICAgICAgICAgJy8nLFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IHVybFBhcnRzLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgYXNzZXQgVVJMIG9mIHRoaXMgaW5zdGFsbC5cbiAgICAgKlxuICAgICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgYmFzZSBVUkwgZnJvbSB0aHJlZSBzb3VyY2VzLCBpbiBvcmRlcjpcbiAgICAgKiAgLSBJZiBTbm93Ym9hcmQgaXMgbG9hZGVkIHZpYSB0aGUgYHslIHNub3dib2FyZCAlfWAgdGFnLCBpdCB3aWxsIHJldHJpZXZlIHRoZSBhc3NldCBVUkwgdGhhdFxuICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgdGhlcmUuXG4gICAgICogIC0gSWYgYSBgPGxpbmsgcmVsPVwiYXNzZXRfdXJsXCIgaHJlZj1cImh0dHBzOi8vZXhhbXBsZS5jb21cIj5gIHRhZyBpcyBhdmFpbGFibGUsIGl0IHdpbGwgdXNlIHRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBsaW5rIHRhZy5cbiAgICAgKiAgLSBGaW5hbGx5LCBpdCB3aWxsIHRha2UgYSBndWVzcyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIHdpbGwgbGlrZWx5IG5vdCB3b3JrIGZvciBzaXRlc1xuICAgICAqIHRoYXQgcmVzaWRlIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgICAqXG4gICAgICogVGhlIGFzc2V0IFVSTCB3aWxsIGFsd2F5cyBjb250YWluIGEgdHJhaWxpbmcgYmFja3NsYXNoLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBhc3NldFVybCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm91bmRBc3NldFVybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpLmRhdGFzZXQuYXNzZXRVcmwpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImFzc2V0X3VybFwiXScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImFzc2V0X3VybFwiXScpLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IFtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCxcbiAgICAgICAgICAgICcvLycsXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdCxcbiAgICAgICAgICAgICcvJyxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gdXJsUGFydHMuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhlIGJhc2UgVVJMLCBlbnN1cmluZyBpdCBpcyBhIEhUVFAvSFRUUHMgVVJMLlxuICAgICAqXG4gICAgICogSWYgdGhlIFNub3dib2FyZCBzY3JpcHQgb3IgPGJhc2U+IHRhZyBvbiB0aGUgcGFnZSB1c2UgYSBkaWZmZXJlbnQgdHlwZSBvZiBVUkwsIHRoaXMgd2lsbCBmYWlsIHdpdGhcbiAgICAgKiBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHZhbGlkYXRlQmFzZVVybCh1cmwpIHtcbiAgICAgICAgY29uc3QgdXJsUmVnZXggPSAvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8vaTtcbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSB1cmxSZWdleC5leGVjKHVybCk7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdXJsUGFydHNbMl07XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybFBhcnRzWzRdO1xuXG4gICAgICAgIGlmIChwcm90b2NvbCAmJiBbJ2h0dHAnLCAnaHR0cHMnXS5pbmRleE9mKHByb3RvY29sLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhc2UgVVJMIGRldGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiYXNlIFVSTCBkZXRlY3RlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh1cmwuc3Vic3RyKC0xKSA9PT0gJy8nKVxuICAgICAgICAgICAgPyB1cmxcbiAgICAgICAgICAgIDogYCR7dXJsfS9gO1xuICAgIH1cbn1cbiIsImltcG9ydCBTbm93Ym9hcmQgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Nub3dib2FyZCc7XG5pbXBvcnQgUHJveHlIYW5kbGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvbWFpbi9Qcm94eUhhbmRsZXInO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L1JlcXVlc3QnO1xuaW1wb3J0IEF0dHJpYnV0ZVJlcXVlc3QgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L2hhbmRsZXJzL0F0dHJpYnV0ZVJlcXVlc3QnO1xuaW1wb3J0IEFzc2V0TG9hZGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Fzc2V0TG9hZGVyJztcbmltcG9ydCBEYXRhQ29uZmlnIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0RhdGFDb25maWcnO1xuaW1wb3J0IFN0eWxlc2hlZXRMb2FkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3R5bGVzaGVldExvYWRlcic7XG5pbXBvcnQgVHJhbnNpdGlvbiBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9UcmFuc2l0aW9uJztcbmltcG9ydCBGbGFzaCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaCc7XG5pbXBvcnQgRmxhc2hMaXN0ZW5lciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaExpc3RlbmVyJztcbmltcG9ydCBGb3JtVmFsaWRhdGlvbiBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9Gb3JtVmFsaWRhdGlvbic7XG5pbXBvcnQgQXR0YWNoTG9hZGluZyBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9BdHRhY2hMb2FkaW5nJztcbmltcG9ydCBTdHJpcGVMb2FkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3RyaXBlTG9hZGVyJztcbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyaWdnZXInO1xuXG4oKHdpbmRvdykgPT4ge1xuICAgIGNvbnN0IHNub3dib2FyZCA9IG5ldyBQcm94eShcbiAgICAgICAgbmV3IFNub3dib2FyZCh0cnVlLCB0cnVlKSxcbiAgICAgICAgUHJveHlIYW5kbGVyLFxuICAgICk7XG5cbiAgICAvLyBDb3ZlciBhbGwgYWxpYXNlc1xuICAgIHdpbmRvdy5zbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgd2luZG93LlNub3dib2FyZCA9IHNub3dib2FyZDtcbiAgICB3aW5kb3cuU25vd0JvYXJkID0gc25vd2JvYXJkO1xuXG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbigncmVxdWVzdCcsIFJlcXVlc3QpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2F0dHJpYnV0ZVJlcXVlc3QnLCBBdHRyaWJ1dGVSZXF1ZXN0KTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdhc3NldExvYWRlcicsIEFzc2V0TG9hZGVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdkYXRhQ29uZmlnJywgRGF0YUNvbmZpZyk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZXh0cmFzU3R5bGVzJywgU3R5bGVzaGVldExvYWRlcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbigndHJhbnNpdGlvbicsIFRyYW5zaXRpb24pO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2ZsYXNoJywgRmxhc2gpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2ZsYXNoTGlzdGVuZXInLCBGbGFzaExpc3RlbmVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdmb3JtVmFsaWRhdGlvbicsIEZvcm1WYWxpZGF0aW9uKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdhdHRhY2hMb2FkaW5nJywgQXR0YWNoTG9hZGluZyk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignc3RyaXBlTG9hZGVyJywgU3RyaXBlTG9hZGVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCd0cmlnZ2VyJywgVHJpZ2dlcik7XG5cbiAgICBzbm93Ym9hcmQub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAvLyBTY2FuIGZvciB0cmlnZ2Vyc1xuICAgICAgICBBcnJheVxuICAgICAgICAgICAgLmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpKVxuICAgICAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gWy4uLmVsZW1lbnQuYXR0cmlidXRlc10uZmlsdGVyKFxuICAgICAgICAgICAgICAgICh7IG5hbWUgfSkgPT4gbmFtZS5zdGFydHNXaXRoKFwiZGF0YS10cmlnZ2VyLVwiKSkubGVuZ3RoID4gMFxuICAgICAgICAgICAgKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgc25vd2JvYXJkLnRyaWdnZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcbn0pKHdpbmRvdyk7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCIvKiEganMtY29va2llIHYzLjAuNSB8IE1JVCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5mdW5jdGlvbiBhc3NpZ24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG52YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgcmVhZDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICB9LFxuICB3cml0ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIClcbiAgfVxufTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG5mdW5jdGlvbiBpbml0IChjb252ZXJ0ZXIsIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gIGZ1bmN0aW9uIHNldCAobmFtZSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGVmYXVsdEF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICB9XG5cbiAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpXG4gICAgICAucmVwbGFjZSgvJSgyWzM0NkJdfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXG4gICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgdmFyIHN0cmluZ2lmaWVkQXR0cmlidXRlcyA9ICcnO1xuICAgIGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgaWYgKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc2lkZXJzIFJGQyA2MjY1IHNlY3Rpb24gNS4yOlxuICAgICAgLy8gLi4uXG4gICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAvLyAgICAgY2hhcmFjdGVyOlxuICAgICAgLy8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcbiAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgLy8gLi4uXG4gICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAoZG9jdW1lbnQuY29va2llID1cbiAgICAgIG5hbWUgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIG5hbWUpICsgc3RyaW5naWZpZWRBdHRyaWJ1dGVzKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0IChuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgKGFyZ3VtZW50cy5sZW5ndGggJiYgIW5hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykgOiBbXTtcbiAgICB2YXIgamFyID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG4gICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBmb3VuZCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1swXSk7XG4gICAgICAgIGphcltmb3VuZF0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmQpO1xuXG4gICAgICAgIGlmIChuYW1lID09PSBmb3VuZCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWUgPyBqYXJbbmFtZV0gOiBqYXJcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgIHtcbiAgICAgIHNldCxcbiAgICAgIGdldCxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gKG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgc2V0KFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYXNzaWduKHt9LCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgd2l0aEF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiBpbml0KHRoaXMuY29udmVydGVyLCBhc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcykpXG4gICAgICB9LFxuICAgICAgd2l0aENvbnZlcnRlcjogZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICAgICAgICByZXR1cm4gaW5pdChhc3NpZ24oe30sIHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpLCB0aGlzLmF0dHJpYnV0ZXMpXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgY29udmVydGVyOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGNvbnZlcnRlcikgfVxuICAgIH1cbiAgKVxufVxuXG52YXIgYXBpID0gaW5pdChkZWZhdWx0Q29udmVydGVyLCB7IHBhdGg6ICcvJyB9KTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbmV4cG9ydCB7IGFwaSBhcyBkZWZhdWx0IH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsInZhciBkZWZlcnJlZCA9IFtdO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5PID0gKHJlc3VsdCwgY2h1bmtJZHMsIGZuLCBwcmlvcml0eSkgPT4ge1xuXHRpZihjaHVua0lkcykge1xuXHRcdHByaW9yaXR5ID0gcHJpb3JpdHkgfHwgMDtcblx0XHRmb3IodmFyIGkgPSBkZWZlcnJlZC5sZW5ndGg7IGkgPiAwICYmIGRlZmVycmVkW2kgLSAxXVsyXSA+IHByaW9yaXR5OyBpLS0pIGRlZmVycmVkW2ldID0gZGVmZXJyZWRbaSAtIDFdO1xuXHRcdGRlZmVycmVkW2ldID0gW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldO1xuXHRcdHJldHVybjtcblx0fVxuXHR2YXIgbm90RnVsZmlsbGVkID0gSW5maW5pdHk7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWQubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldID0gZGVmZXJyZWRbaV07XG5cdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjaHVua0lkcy5sZW5ndGg7IGorKykge1xuXHRcdFx0aWYgKChwcmlvcml0eSAmIDEgPT09IDAgfHwgbm90RnVsZmlsbGVkID49IHByaW9yaXR5KSAmJiBPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLk8pLmV2ZXJ5KChrZXkpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fLk9ba2V5XShjaHVua0lkc1tqXSkpKSkge1xuXHRcdFx0XHRjaHVua0lkcy5zcGxpY2Uoai0tLCAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZ1bGZpbGxlZCA9IGZhbHNlO1xuXHRcdFx0XHRpZihwcmlvcml0eSA8IG5vdEZ1bGZpbGxlZCkgbm90RnVsZmlsbGVkID0gcHJpb3JpdHk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKGZ1bGZpbGxlZCkge1xuXHRcdFx0ZGVmZXJyZWQuc3BsaWNlKGktLSwgMSlcblx0XHRcdHZhciByID0gZm4oKTtcblx0XHRcdGlmIChyICE9PSB1bmRlZmluZWQpIHJlc3VsdCA9IHI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyBubyBiYXNlVVJJXG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCIvYXNzZXRzL2pzL2FwcFwiOiAwLFxuXHRcImFzc2V0cy9jc3MvdGhlbWVcIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuX193ZWJwYWNrX3JlcXVpcmVfXy5PLmogPSAoY2h1bmtJZCkgPT4gKGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9PT0gMCk7XG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rd2ludGVyY21zX3dvcmtzaG9wX3RoZW1lXCJdID0gc2VsZltcIndlYnBhY2tDaHVua3dpbnRlcmNtc193b3Jrc2hvcF90aGVtZVwiXSB8fCBbXTtcbmNodW5rTG9hZGluZ0dsb2JhbC5mb3JFYWNoKHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgMCkpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKSk7IiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBkZXBlbmRzIG9uIG90aGVyIGxvYWRlZCBjaHVua3MgYW5kIGV4ZWN1dGlvbiBuZWVkIHRvIGJlIGRlbGF5ZWRcbl9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcImFzc2V0cy9jc3MvdGhlbWVcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9hc3NldHMvanMvc3JjL2FwcC5qc1wiKSkpXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcImFzc2V0cy9jc3MvdGhlbWVcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9hc3NldHMvY3NzL2Jhc2UuY3NzXCIpKSlcbl9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8oX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4iLCIiXSwibmFtZXMiOlsiUGx1Z2luQmFzZSIsInNub3dib2FyZCIsIl9jbGFzc0NhbGxDaGVjayIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiY29uc3RydWN0IiwiZGVwZW5kZW5jaWVzIiwibGlzdGVucyIsImRlc3RydWN0IiwiZGV0YWNoIiwiZGVzdHJ1Y3RvciIsImRlZmF1bHQiLCJTaW5nbGV0b24iLCJfUGx1Z2luQmFzZSIsIl9jYWxsU3VwZXIiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHMiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZSIsInQiLCJyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibiIsImhhc093blByb3BlcnR5IiwibyIsImRlZmluZVByb3BlcnR5IiwiaSIsIlN5bWJvbCIsImEiLCJpdGVyYXRvciIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiY2FsbCIsImgiLCJsIiwiZiIsInMiLCJ5IiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInAiLCJkIiwiZ2V0UHJvdG90eXBlT2YiLCJ2IiwidmFsdWVzIiwiZyIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsIl90eXBlb2YiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsIkVycm9yIiwiZG9uZSIsIm1ldGhvZCIsImRlbGVnYXRlIiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpc05hTiIsImxlbmd0aCIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwia2V5cyIsInJldmVyc2UiLCJwb3AiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicnZhbCIsImhhbmRsZSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwiaXNBcnJheSIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJpbWl0aXZlIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJfZ2V0UHJvdG90eXBlT2YiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIlJlZmVyZW5jZUVycm9yIiwiQm9vbGVhbiIsInZhbHVlT2YiLCJiaW5kIiwiX3NldFByb3RvdHlwZU9mIiwiUmVxdWVzdCIsImVsZW1lbnQiLCJoYW5kbGVyIiwib3B0aW9ucyIsIl90aGlzIiwiaXNIYW5kbGVyTmFtZSIsIm1hdGNoZWRFbGVtZW50IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiY29uY2F0IiwiZmV0Y2hPcHRpb25zIiwicmVzcG9uc2VEYXRhIiwicmVzcG9uc2VFcnJvciIsImNhbmNlbGxlZCIsImNoZWNrUmVxdWVzdCIsImdsb2JhbEV2ZW50IiwiZXZlbnQiLCJFdmVudCIsImNhbmNlbGFibGUiLCJyZXF1ZXN0IiwiZGlzcGF0Y2hFdmVudCIsImRlZmF1bHRQcmV2ZW50ZWQiLCJkb0NsaWVudFZhbGlkYXRpb24iLCJjb25maXJtIiwiZG9Db25maXJtIiwiY29uZmlybWVkIiwiZG9BamF4IiwicmVzcG9uc2UiLCJwcm9jZXNzVXBkYXRlIiwiWF9XSU5URVJfU1VDQ0VTUyIsInByb2Nlc3NFcnJvciIsInByb2Nlc3NSZXNwb25zZSIsImVycm9yIiwiRWxlbWVudCIsInVuZGVmaW5lZCIsImdldEZldGNoIiwiaGVhZGVycyIsImJvZHkiLCJkYXRhIiwicmVkaXJlY3QiLCJtb2RlIiwiZmV0Y2giLCJ1cmwiLCJicm93c2VyVmFsaWRhdGUiLCJmb3JtIiwiY2hlY2tWYWxpZGl0eSIsInJlcG9ydFZhbGlkaXR5IiwiX3RoaXMyIiwiYWpheFByb21pc2UiLCJyZWplY3QiLCJvayIsInN0YXR1cyIsImhhcyIsImdldCIsImluY2x1ZGVzIiwianNvbiIsIm1lc3NhZ2UiLCJleGNlcHRpb24iLCJyZW5kZXJFcnJvciIsImZpbGUiLCJsaW5lIiwidHJhY2UiLCJ0ZXh0IiwicmVzcG9uc2VUZXh0IiwiWF9XSU5URVJfUkVTUE9OU0VfQ09ERSIsInByb21pc2UiLCJfdGhpczMiLCJiZWZvcmVVcGRhdGUiLCJwYXJ0aWFscyIsImVudHJpZXMiLCJlbnRyeSIsIl9lbnRyeSIsInN1YnN0ciIsIlhfV0lOVEVSX0FTU0VUUyIsInByb2Nlc3NBc3NldHMiLCJwcm9taXNlcyIsImdsb2JhbFByb21pc2VFdmVudCIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZG9VcGRhdGUiLCJ3aW5kb3ciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJfdGhpczQiLCJhZmZlY3RlZCIsIl9lbnRyeTIiLCJwYXJ0aWFsIiwiY29udGVudCIsInNlbGVjdG9yIiwidXBkYXRlIiwiZWxlbWVudHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaW5uZXJIVE1MIiwic3VjY2VzcyIsImZsYXNoIiwiWF9XSU5URVJfRkxBU0hfTUVTU0FHRVMiLCJwcm9jZXNzRmxhc2hNZXNzYWdlcyIsIlhfV0lOVEVSX1JFRElSRUNUIiwicHJvY2Vzc1JlZGlyZWN0IiwicHJvY2Vzc0Vycm9yTWVzc2FnZSIsInNraXBFcnJvciIsIlhfV0lOVEVSX0VSUk9SX0ZJRUxEUyIsInByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzIiwiWF9XSU5URVJfRVJST1JfTUVTU0FHRSIsIl90aGlzNSIsImhhbmRsZVJlZGlyZWN0UmVzcG9uc2UiLCJhZGRFdmVudExpc3RlbmVyIiwiY3JlYXRlRXZlbnQiLCJldmVudE5hbWUiLCJvbmNlIiwibG9jYXRpb24iLCJhc3NpZ24iLCJoYW5kbGVFcnJvck1lc3NhZ2UiLCJhbGVydCIsIm1lc3NhZ2VzIiwiaGFuZGxlRmxhc2hNZXNzYWdlcyIsImZpZWxkcyIsImhhbmRsZVZhbGlkYXRpb25FcnJvcnMiLCJhc3NldHMiLCJfZG9Db25maXJtIiwiX2NhbGxlZTIiLCJmdWxmaWxsZWQiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJoYW5kbGVDb25maXJtTWVzc2FnZSIsImxpc3RlbnNUb0V2ZW50IiwidDAiLCJ0YWdOYW1lIiwiY2xvc2VzdCIsImV4dHJhY3RQYXJ0aWFscyIsInhzcmZUb2tlbiIsImxvYWRpbmciLCJocmVmIiwiZmlsZXMiLCJGb3JtRGF0YSIsImRlYnVnIiwiY29va2llIiwiZm9ybURhdGEiLCJfZW50cnkzIiwiYXBwZW5kIiwiam9pbiIsIkF0dHJpYnV0ZVJlcXVlc3QiLCJfU2luZ2xldG9uIiwicmVhZHkiLCJhamF4U2V0dXAiLCJhdHRhY2hIYW5kbGVycyIsImRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24iLCJkZXRhY2hIYW5kbGVycyIsIl9nZXQiLCJjaGFuZ2VIYW5kbGVyIiwiY2xpY2tIYW5kbGVyIiwia2V5RG93bkhhbmRsZXIiLCJzdWJtaXRIYW5kbGVyIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRhcmdldCIsIm1hdGNoZXMiLCJwcm9jZXNzUmVxdWVzdE9uRWxlbWVudCIsImN1cnJlbnRFbGVtZW50IiwicGFyZW50RWxlbWVudCIsInByZXZlbnREZWZhdWx0IiwidmFsaWRUeXBlcyIsImluZGV4T2YiLCJnZXRBdHRyaWJ1dGUiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJ0cmFja0lucHV0IiwiZGF0YXNldCIsInJlcXVlc3RDb25maXJtIiwicmVxdWVzdFJlZGlyZWN0IiwicmVxdWVzdExvYWRpbmciLCJyZXF1ZXN0Rm9ybSIsInJlcXVlc3RVcmwiLCJwYXJzZURhdGEiLCJyZXF1ZXN0VXBkYXRlIiwicmVxdWVzdERhdGEiLCJvbkFqYXhTZXR1cCIsImZpZWxkTmFtZSIsImdldFBhcmVudFJlcXVlc3REYXRhIiwiZWxlbWVudERhdGEiLCJqc29ucGFyc2VyIiwicGFyc2UiLCJsYXN0VmFsdWUiLCJpbnRlcnZhbCIsInJlc2V0VHJhY2tJbnB1dFRpbWVyIiwiaW5wdXRUaW1lciIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9uIiwiRiIsIkFzc2V0TG9hZGVyIiwiYWpheExvYWRBc3NldHMiLCJfbG9hZCIsIl9pdGVyYXRvciIsIl9zdGVwIiwic2NyaXB0IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsInN0eWxlIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsImltYWdlIiwianMiLCJsb2FkU2NyaXB0IiwidDEiLCJjc3MiLCJsb2FkU3R5bGUiLCJ0MiIsInQzIiwiaW1nIiwibG9hZEltYWdlIiwidDQiLCJ0NSIsImxvYWQiLCJfeCIsImFzc2V0IiwibG9hZGVkIiwiZG9tU2NyaXB0IiwiY3JlYXRlRWxlbWVudCIsImRvbUNzcyIsImhlYWQiLCJJbWFnZSIsInNyYyIsIkF0dGFjaExvYWRpbmciLCJhamF4U3RhcnQiLCJhamF4RG9uZSIsImxvYWRFbGVtZW50cyIsImNsYXNzTGlzdCIsImFkZCIsImdldExvYWRpbmdDbGFzcyIsImF0dGFjaExvYWRpbmciLCJyZW1vdmUiLCJEYXRhQ29uZmlnIiwiaW5zdGFuY2UiLCJsb2NhbENvbmZpZyIsIkhUTUxFbGVtZW50IiwiaW5zdGFuY2VDb25maWciLCJhY2NlcHRlZENvbmZpZ3MiLCJyZWZyZXNoIiwiY29uZmlnIiwic2V0IiwicGVyc2lzdCIsImdldEFjY2VwdGVkQ29uZmlncyIsInByb2Nlc3NDb25maWciLCJhY2NlcHRBbGxEYXRhQ29uZmlncyIsImRlZmF1bHRzIiwiZ2V0RGVmYXVsdHMiLCJjb2VyY2VWYWx1ZSIsInN0cmluZ1ZhbHVlIiwic3RhcnRzV2l0aCIsImJhc2U2NHN0ciIsInJlcGxhY2UiLCJkZWNvZGVkIiwiYXRvYiIsInRvTG93ZXJDYXNlIiwianNvblBhcnNlciIsIkZsYXNoIiwiZHVyYXRpb24iLCJjbGVhciIsInRpbWVyIiwiZmxhc2hUaW1lciIsInJlbW92ZUF0dHJpYnV0ZSIsInN0b3BUaW1lciIsInN0YXJ0VGltZXIiLCJhcHBlbmRDaGlsZCIsInRyYW5zaXRpb24iLCJ0aW1lclRyYW5zIiwiY2FuY2VsIiwiRmxhc2hMaXN0ZW5lciIsImFqYXhFcnJvck1lc3NhZ2UiLCJhamF4Rmxhc2hNZXNzYWdlcyIsImZsYXNoVHlwZSIsImZsYXNoRHVyYXRpb24iLCJjc3NDbGFzcyIsIkZvcm1WYWxpZGF0aW9uIiwiZXJyb3JCYWdzIiwiYWpheFZhbGlkYXRpb25FcnJvcnMiLCJjb2xsZWN0RXJyb3JCYWdzIiwiZG9WYWxpZGF0aW9uIiwiaW52YWxpZEZpZWxkcyIsInJlcXVlc3RWYWxpZGF0ZSIsImVycm9yQmFnIiwic2hvd0Vycm9yQmFnIiwiY2xlYXJWYWxpZGF0aW9uIiwiaGlkZUVycm9yQmFnIiwicm9vdE5vZGUiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJtZXNzYWdlTGlzdEVsZW1lbnQiLCJwbGFjZWhvbGRlciIsImNyZWF0ZUNvbW1lbnQiLCJlcnJvckJhZ0RhdGEiLCJ2YWxpZGF0ZUZvciIsInNwbGl0IiwiY2xvbmVOb2RlIiwibWVzc2FnZUxpc3RBbmNob3IiLCJjdXN0b21NZXNzYWdlIiwidGV4dENvbnRlbnQiLCJjaGlsZE5vZGVzIiwicmVwbGFjZUNoaWxkIiwiaXNDb25uZWN0ZWQiLCJlcnJvckJhZ1ZhbGlkYXRlc0ZpZWxkIiwiZmlyc3RGaWVsZCIsImZpZWxkIiwic2hpZnQiLCJfaW52YWxpZEZpZWxkcyRmaXJzdEYiLCJlcnJvcnMiLCJtZXNzYWdlRWxlbWVudCIsInZhbGlkYXRpb25NZXNzYWdlIiwiYWZ0ZXIiLCJfaW52YWxpZEZpZWxkcyRPYmplY3QiLCJTdHJpcGVMb2FkZXIiLCJjb3VudGVyIiwiY3JlYXRlU3RyaXBlIiwic3RyaXBlIiwic2hvdyIsImhpZGUiLCJpbmRpY2F0b3IiLCJzdHJpcGVMb2FkZWQiLCJuZXdTdHJpcGUiLCJmb3JjZSIsIlN0eWxlc2hlZXRMb2FkZXIiLCJzdHlsZXNMb2FkZWQiLCJlbmRzV2l0aCIsInN0eWxlc2hlZXQiLCJUcmFuc2l0aW9uIiwiY2FsbGJhY2siLCJ0cmFpbFRvIiwicGFyc2VEdXJhdGlvbiIsImRvVHJhbnNpdGlvbiIsImV2ZW50Q2xhc3NlcyIsIl9sZW4iLCJhcmdzIiwiX2tleSIsImFjdGl2ZSIsIm91dCIsInJldHVybkNsYXNzZXMiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJyZXNldENsYXNzZXMiLCJldmVudENsYXNzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9uVHJhbnNpdGlvbkVuZCIsInBhcnNlZCIsImV4ZWMiLCJhbW91bnQiLCJ1bml0IiwiTWF0aCIsImZsb29yIiwiVHJpZ2dlciIsInRyaWdnZXJzIiwiTWFwIiwiZXZlbnRzIiwiY29ubmVjdG9ycyIsInBhcnNlVHJpZ2dlcnMiLCJzaXplIiwicmVzZXRFdmVudHMiLCJjcmVhdGVUcmlnZ2VyRXZlbnRzIiwicnVuRXZlbnRzIiwiZGFzaFN0eWxlIiwibWF0Y2giLCJ0cmlnZ2VyUGFydHMiLCJ0cmlnZ2VyTmFtZSIsInRyaWdnZXJUeXBlIiwiX3RyaWdnZXJQYXJ0cyIsInRyaWdnZXIiLCJnZXRTZWxlY3RhYmxlRWxlbWVudHMiLCJoYXNWYWxpZENvbmRpdGlvbnMiLCJoYXNWYWxpZEFjdGlvbnMiLCJwYXJzZUNvbW1hbmQiLCJjb21tYW5kIiwiYWxsb3dNdWx0aXBsZSIsInRyaW0iLCJzcGxpdFZhbHVlcyIsInF1b3RlZCIsIm1hcCIsInNwbGl0VmFsdWUiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJwYXJhbWV0ZXJzIiwic3BsaXRDb21tYW5kcyIsImNvbW1hbmRzIiwic3BsaXRDb21tYW5kIiwiX2NvbW1hbmQkc3BsaXQiLCJfY29tbWFuZCRzcGxpdDIiLCJldmVyeSIsImNvbmRpdGlvbiIsImFjdGlvbiIsImNyZWF0ZVZhbHVlQ29uZGl0aW9uIiwiY3JlYXRlRW1wdHlDb25kaXRpb24iLCJjcmVhdGVDaGVja2VkQ29uZGl0aW9uIiwicmVnaXN0ZXJFdmVudExpc3RlbmVycyIsImFkZEV2ZW50IiwiU2V0IiwicHJpb3JpdHkiLCJleGVjdXRlQWN0aW9ucyIsIl9yZWYiLCJlbGVtZW50RXZlbnQiLCJzb3J0IiwiYiIsImFsbCIsInN1cHBvcnRlZEVsZW1lbnRzIiwiZWxlbWVudFZhbHVlcyIsImNoZWNrZWQiLCJzb21lIiwiX3RoaXM2IiwiX3RoaXM3IiwiYXRMZWFzdCIsImF0TW9zdCIsImF0TGVhc3RDb3VudCIsImF0TW9zdENvdW50IiwiZWxlbWVudENvbm5lY3RvcnMiLCJjb25uZWN0b3IiLCJjb25kaXRpb25NZXQiLCJfdGhpczgiLCJhY3Rpb25TaG93IiwiYWN0aW9uRW5hYmxlIiwiYWN0aW9uVmFsdWUiLCJhY3Rpb25DbGFzcyIsIl90aGlzOSIsImRpc3BsYXkiLCJvcmlnaW5hbERpc3BsYXkiLCJhZnRlckFjdGlvbiIsImVuYWJsZSIsIl90aGlzMTAiLCJkaXNhYmxlZCIsIl90aGlzMTEiLCJ1bm1ldFZhbHVlIiwibmV3VmFsdWUiLCJfdGhpczEyIiwidW5tZXRDc3NDbGFzcyIsInByb3AiLCJyZWNlaXZlciIsInByb3BMb3dlciIsImhhc1BsdWdpbiIsIl9SZWZsZWN0JGdldCRwcm9wTG93ZSIsImdldEluc3RhbmNlIiwiSW5uZXJQcm94eUhhbmRsZXIiLCJQbHVnaW5Mb2FkZXIiLCJQcm94eSIsImZyZWV6ZSIsImluc3RhbmNlcyIsInNpbmdsZXRvbiIsImluaXRpYWxpc2VkIiwic2VhbCIsIm1vY2tzIiwib3JpZ2luYWxGdW5jdGlvbnMiLCJoYXNNZXRob2QiLCJtZXRob2ROYW1lIiwiaXNGdW5jdGlvbiIsImNhbGxNZXRob2QiLCJfbGVuMiIsIl9rZXkyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwidW5tZXQiLCJnZXREZXBlbmRlbmNpZXMiLCJpdGVtIiwiZ2V0UGx1Z2luTmFtZXMiLCJpc1NpbmdsZXRvbiIsImluaXRpYWxpc2VTaW5nbGV0b24iLCJfbGVuMyIsInBhcmFtcyIsIl9rZXkzIiwiX2VudHJ5NCIsIl9sZW40IiwiX2tleTQiLCJuZXdJbnN0YW5jZSIsIl9jb25zdHJ1Y3QiLCJzcGxpY2UiLCJnZXRJbnN0YW5jZXMiLCJpc0luaXRpYWxpc2VkIiwiX2xlbjUiLCJfa2V5NSIsInBsdWdpbiIsIm1vY2siLCJfbGVuNiIsIl9rZXk2IiwidW5tb2NrIiwiQ29va2llIiwiSnNvblBhcnNlciIsIlNhbml0aXplciIsIlVybCIsIlNub3dib2FyZCIsImF1dG9TaW5nbGV0b25zIiwiZGVidWdFbmFibGVkIiwiYXV0b0luaXRTaW5nbGV0b25zIiwicGx1Z2lucyIsImxpc3RlbmVycyIsImZvdW5kQmFzZVVybCIsInJlYWRpbmVzcyIsImRvbSIsImF0dGFjaEFic3RyYWN0cyIsImxvYWRVdGlsaXRpZXMiLCJpbml0aWFsaXNlIiwiYWRkUGx1Z2luIiwiaW5pdGlhbGlzZVNpbmdsZXRvbnMiLCJsb3dlck5hbWUiLCJnZXRQbHVnaW5zIiwicmVhZHlNZXRob2QiLCJyZW1vdmVQbHVnaW4iLCJnZXRQbHVnaW4iLCJvbiIsIm9mZiIsImluZGV4IiwibGlzdGVuTWV0aG9kIiwicmVzdWx0IiwibGlzdGVuZXIiLCJpbnN0YW5jZVByb21pc2UiLCJsaXN0ZW5lclByb21pc2UiLCJsb2dNZXNzYWdlIiwiY29sb3IiLCJib2xkIiwiY29uc29sZSIsImdyb3VwQ29sbGFwc2VkIiwicGFyYW0iLCJsb2ciLCJncm91cEVuZCIsIkJhc2VDb29raWUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsInNhbWVTaXRlIiwic2V0RGVmYXVsdHMiLCJjb29raWVzIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlIiwic2F2ZVZhbHVlIiwid25KU09OIiwib2NKU09OIiwic3RyIiwianNvblN0cmluZyIsInBhcnNlU3RyaW5nIiwiSlNPTiIsIm51bSIsImlzQmxhbmtDaGFyIiwicGFyc2VLZXkiLCJjYW5CZUtleUhlYWQiLCJnZXRCb2R5Iiwib3JpZ2luTGVuZ3RoIiwibGFzdCIsInBvcyIsInN0YWNrIiwicXVvdGUiLCJjaCIsImNoYXJDb2RlQXQiLCJ3blNhbml0aXplIiwiaHRtbCIsInNhbml0aXplIiwib2NTYW5pdGl6ZSIsImJvZHlPbmx5IiwicGFyc2VyIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicmV0dXJuQm9keU9ubHkiLCJzYW5pdGl6ZU5vZGUiLCJnZXRSb290Tm9kZSIsIm5vZGUiLCJ0cmltQXR0cmlidXRlcyIsImNoaWxkcmVuIiwiY2hpbGQiLCJhdHRyaWJ1dGVzIiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJmb3VuZEFzc2V0VXJsIiwiYmFzZVVybCIsImFzc2V0VXJsIiwidG8iLCJ1cmxSZWdleCIsInRoZVVybCIsInZhbGlkYXRlQmFzZVVybCIsInVybFBhcnRzIiwicHJvdG9jb2wiLCJob3N0IiwiUHJveHlIYW5kbGVyIiwiU25vd0JvYXJkIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/pages/snowboard/triggers.htm b/pages/snowboard/triggers.htm index 42359d5..15b3ecc 100644 --- a/pages/snowboard/triggers.htm +++ b/pages/snowboard/triggers.htm @@ -379,7 +379,8 @@

Trigger on checked


Trigger on unchecked

-

Triggers when the checkbox is unchecked.

+

Triggers when the checkbox is unchecked. Also tests multiple actions - this one changes the button disabled state, changes + the wording and changes the class.

@@ -391,17 +392,65 @@

Trigger on unchecked

>
-
+ +
+ + + +
+ +

Trigger on multiple checked

+

The "checked" and "unchecked" conditions now accept a parameter defining a "lower limit" of checked checkboxes, + allowing you to trigger an action when a person ticks/unticks more than 1 of a group of checkboxes.

+ +
+
+ + + + + + +
+
+ Nice! +
+
- Let's go! + BOSS!
- +
From a7e0cb2fb159e1aefa1798d00bc5e11476094d7b Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Wed, 17 Jul 2024 10:27:01 +0800 Subject: [PATCH 7/7] Add focused test, rename assets --- assets/css/theme.css | 12 +- assets/js/app.js | 6326 --------------------------- assets/js/src/{app.js => theme.js} | 0 assets/js/theme.js | 6357 ++++++++++++++++++++++++++++ package.json | 46 +- pages/snowboard/triggers.htm | 73 + partials/html/foot.htm | 2 +- winter.mix.js | 2 +- 8 files changed, 6465 insertions(+), 6353 deletions(-) delete mode 100644 assets/js/app.js rename assets/js/src/{app.js => theme.js} (100%) create mode 100644 assets/js/theme.js diff --git a/assets/css/theme.css b/assets/css/theme.css index 8d0a1ff..d61a03d 100644 --- a/assets/css/theme.css +++ b/assets/css/theme.css @@ -1,5 +1,5 @@ /* -! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com +! tailwindcss v3.4.6 | MIT License | https://tailwindcss.com *//* 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) @@ -879,13 +879,17 @@ video { --tw-bg-opacity: 1; background-color: rgb(220 38 38 / var(--tw-bg-opacity)); } +.bg-red-700 { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); +} .bg-red-800 { --tw-bg-opacity: 1; background-color: rgb(153 27 27 / var(--tw-bg-opacity)); } -.bg-red-700 { +.bg-amber-50 { --tw-bg-opacity: 1; - background-color: rgb(185 28 28 / var(--tw-bg-opacity)); + background-color: rgb(255 251 235 / var(--tw-bg-opacity)); } .bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); @@ -1474,4 +1478,4 @@ p + h6 { } -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsb0VBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFB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RUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7QUFBQTtBQXBFQTs7RUFBQTtJQUFBLGlCQW9FQTtJQXBFQTtFQW9FQTs7RUFwRUE7SUFBQTtFQW9FQTs7RUFwRUE7SUFBQTtFQW9FQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9iYXNlLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL2NvbXBvbmVudHMuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvdXRpbGl0aWVzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL3NlY3Rpb25zL3VzZXIuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiQHRhaWx3aW5kIGJhc2U7XG4iLCJAdGFpbHdpbmQgY29tcG9uZW50cztcbiIsIkB0YWlsd2luZCB1dGlsaXRpZXM7XG4iLCIjYWNjb3VudC1jb21wb25lbnQge1xuICAgIC5yb3cge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbGc6Z3JpZCBsZzpncmlkLWNvbHMtMiBnYXAtMTA7XG5cbiAgICAgICAgLmNvbC1tZC02IHtcbiAgICAgICAgICAgIEBhcHBseSBoLWF1dG8gbGc6aC1mdWxsIHAtOCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGJnLWdyYXktNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBmbGV4IGZsZXgtY29sIGdhcC0yO1xuXG4gICAgICAgIC5mb3JtLWxhYmVsLCBsYWJlbCB7XG4gICAgICAgICAgICBAYXBwbHkgZm9udC1ib2xkIHRleHQtc20gdGV4dC1ncmF5LTYwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICAgICAgQGFwcGx5IGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBwLTIgZm9jdXM6b3V0bGluZSBmb2N1czpvdXRsaW5lLWJsdWUtNTAwIHBsYWNlaG9sZGVyOnRleHQtZ3JheS0zMDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCArIC5mb3JtLWdyb3VwIHtcbiAgICAgICAgQGFwcGx5IG10LTQ7XG4gICAgfVxuXG4gICAgLmJ0biB7XG4gICAgICAgIEBhcHBseSBtdC04IGlubGluZS1mbGV4IGZvbnQtYm9sZCB0ZXh0LXNtIHJvdW5kZWQtbGcgdHJhbnNpdGlvbiB0cmFuc2Zvcm0gYWN0aXZlOnNjYWxlLTkwIHB5LTQgcHgtOCBiZy1ncmVlbi02MDAgdGV4dC13aGl0ZSBob3ZlcjpiZy1ncmVlbi01MDA7XG4gICAgfVxuXG4gICAgLmRlYWN0aXZhdGUge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbXQtNCB0ZXh0LXJlZC02MDAgaG92ZXI6dGV4dC1yZWQtODAwO1xuICAgIH1cblxuICAgICNhY2NvdW50RGVhY3RpdmF0ZUZvcm0ge1xuICAgICAgICBAYXBwbHkgbXQtOCBib3JkZXIgYm9yZGVyLXJlZC0yMDAgYmctcmVkLTUwIHAtODtcblxuICAgICAgICAuYnRuIHtcbiAgICAgICAgICAgIEBhcHBseSBiZy1yZWQtNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctcmVkLTUwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5idG4gKyBhIHtcbiAgICAgICAgICAgIEBhcHBseSBtbC00O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGltcG9ydCAndGFpbHdpbmRjc3MvYmFzZSc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy9jb21wb25lbnRzJztcbkBpbXBvcnQgJ3RhaWx3aW5kY3NzL3V0aWxpdGllcyc7XG5AaW1wb3J0ICcuL3NlY3Rpb25zL3VzZXIuY3NzJztcblxuLyogRGVmYXVsdCBmb250ICovXG5ib2R5IHtcbiAgICBAYXBwbHkgdGV4dC1ncmF5LTUwMCBmb250LWJvZHk7XG59XG5cbi8qIERpc2FibGUgT1NYIHNjcm9sbGluZyBib3VuY2UgZWZmZWN0ICovXG5odG1sLFxuYm9keSB7XG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogbm9uZTtcbn1cblxuLyogSGVhZGluZyBzdHlsZXMgKi9cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS03MDAgZm9udC1oZWFkaW5nIG1iLTY7XG59XG5cbmgxIHtcbiAgICBAYXBwbHkgdGV4dC00eGw7XG59XG5cbmgyIHtcbiAgICBAYXBwbHkgdGV4dC0yeGw7XG59XG5cbmgzIHtcbiAgICBAYXBwbHkgdGV4dC14bDtcbn1cblxuaDQge1xuICAgIEBhcHBseSB0ZXh0LWxnO1xufVxuXG4vKiBQYXJhZ3JhcGhzIGFuZCBzcGFjaW5nICovXG5wIHtcbiAgICBAYXBwbHkgbWItNDtcbn1cblxucDpsYXN0LWNoaWxkIHtcbiAgICBAYXBwbHkgbWItMDtcbn1cblxucCArIGgxLFxucCArIGgyLFxucCArIGgzLFxucCArIGg0LFxucCArIGg1LFxucCArIGg2IHtcbiAgICBAYXBwbHkgbXQtODtcbn1cblxuLyogSGVybyAqL1xuLmhlcm8ge1xuICAgIEBhcHBseSBweC0xNiBwdC01MiBwYi0yOCB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cblxuLmhlcm8tc21hbGwge1xuICAgIEBhcHBseSBweC0xNiBwdC0zMiBwYi0xNiB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsMERBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsb0VBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG1FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDREQUFtQjtFQUFuQixtRUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSw0REFBbUI7RUFBbkIsbUVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNERBQW1CO0VBQW5CLG9FQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFB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cEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7O0VBcEVBO0lBQUE7RUFvRUE7QUFBQTtBQXBFQTs7RUFBQTtJQUFBLGlCQW9FQTtJQXBFQTtFQW9FQTs7RUFwRUE7SUFBQTtFQW9FQTs7RUFwRUE7SUFBQTtFQW9FQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcy9iYXNlLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzL2NvbXBvbmVudHMuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MvdXRpbGl0aWVzLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi9hc3NldHMvY3NzL3NlY3Rpb25zL3VzZXIuY3NzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiQHRhaWx3aW5kIGJhc2U7XG4iLCJAdGFpbHdpbmQgY29tcG9uZW50cztcbiIsIkB0YWlsd2luZCB1dGlsaXRpZXM7XG4iLCIjYWNjb3VudC1jb21wb25lbnQge1xuICAgIC5yb3cge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbGc6Z3JpZCBsZzpncmlkLWNvbHMtMiBnYXAtMTA7XG5cbiAgICAgICAgLmNvbC1tZC02IHtcbiAgICAgICAgICAgIEBhcHBseSBoLWF1dG8gbGc6aC1mdWxsIHAtOCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGJnLWdyYXktNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICAgIEBhcHBseSBmbGV4IGZsZXgtY29sIGdhcC0yO1xuXG4gICAgICAgIC5mb3JtLWxhYmVsLCBsYWJlbCB7XG4gICAgICAgICAgICBAYXBwbHkgZm9udC1ib2xkIHRleHQtc20gdGV4dC1ncmF5LTYwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb3JtLWNvbnRyb2wge1xuICAgICAgICAgICAgQGFwcGx5IGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBwLTIgZm9jdXM6b3V0bGluZSBmb2N1czpvdXRsaW5lLWJsdWUtNTAwIHBsYWNlaG9sZGVyOnRleHQtZ3JheS0zMDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuZm9ybS1ncm91cCArIC5mb3JtLWdyb3VwIHtcbiAgICAgICAgQGFwcGx5IG10LTQ7XG4gICAgfVxuXG4gICAgLmJ0biB7XG4gICAgICAgIEBhcHBseSBtdC04IGlubGluZS1mbGV4IGZvbnQtYm9sZCB0ZXh0LXNtIHJvdW5kZWQtbGcgdHJhbnNpdGlvbiB0cmFuc2Zvcm0gYWN0aXZlOnNjYWxlLTkwIHB5LTQgcHgtOCBiZy1ncmVlbi02MDAgdGV4dC13aGl0ZSBob3ZlcjpiZy1ncmVlbi01MDA7XG4gICAgfVxuXG4gICAgLmRlYWN0aXZhdGUge1xuICAgICAgICBAYXBwbHkgYmxvY2sgbXQtNCB0ZXh0LXJlZC02MDAgaG92ZXI6dGV4dC1yZWQtODAwO1xuICAgIH1cblxuICAgICNhY2NvdW50RGVhY3RpdmF0ZUZvcm0ge1xuICAgICAgICBAYXBwbHkgbXQtOCBib3JkZXIgYm9yZGVyLXJlZC0yMDAgYmctcmVkLTUwIHAtODtcblxuICAgICAgICAuYnRuIHtcbiAgICAgICAgICAgIEBhcHBseSBiZy1yZWQtNjAwIHRleHQtd2hpdGUgaG92ZXI6YmctcmVkLTUwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5idG4gKyBhIHtcbiAgICAgICAgICAgIEBhcHBseSBtbC00O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGltcG9ydCAndGFpbHdpbmRjc3MvYmFzZSc7XG5AaW1wb3J0ICd0YWlsd2luZGNzcy9jb21wb25lbnRzJztcbkBpbXBvcnQgJ3RhaWx3aW5kY3NzL3V0aWxpdGllcyc7XG5AaW1wb3J0ICcuL3NlY3Rpb25zL3VzZXIuY3NzJztcblxuLyogRGVmYXVsdCBmb250ICovXG5ib2R5IHtcbiAgICBAYXBwbHkgdGV4dC1ncmF5LTUwMCBmb250LWJvZHk7XG59XG5cbi8qIERpc2FibGUgT1NYIHNjcm9sbGluZyBib3VuY2UgZWZmZWN0ICovXG5odG1sLFxuYm9keSB7XG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogbm9uZTtcbn1cblxuLyogSGVhZGluZyBzdHlsZXMgKi9cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gICAgQGFwcGx5IHRleHQtZ3JheS03MDAgZm9udC1oZWFkaW5nIG1iLTY7XG59XG5cbmgxIHtcbiAgICBAYXBwbHkgdGV4dC00eGw7XG59XG5cbmgyIHtcbiAgICBAYXBwbHkgdGV4dC0yeGw7XG59XG5cbmgzIHtcbiAgICBAYXBwbHkgdGV4dC14bDtcbn1cblxuaDQge1xuICAgIEBhcHBseSB0ZXh0LWxnO1xufVxuXG4vKiBQYXJhZ3JhcGhzIGFuZCBzcGFjaW5nICovXG5wIHtcbiAgICBAYXBwbHkgbWItNDtcbn1cblxucDpsYXN0LWNoaWxkIHtcbiAgICBAYXBwbHkgbWItMDtcbn1cblxucCArIGgxLFxucCArIGgyLFxucCArIGgzLFxucCArIGg0LFxucCArIGg1LFxucCArIGg2IHtcbiAgICBAYXBwbHkgbXQtODtcbn1cblxuLyogSGVybyAqL1xuLmhlcm8ge1xuICAgIEBhcHBseSBweC0xNiBwdC01MiBwYi0yOCB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cblxuLmhlcm8tc21hbGwge1xuICAgIEBhcHBseSBweC0xNiBwdC0zMiBwYi0xNiB0ZXh0LWNlbnRlciBsZzpweC00MDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file diff --git a/assets/js/app.js b/assets/js/app.js deleted file mode 100644 index f3abc59..0000000 --- a/assets/js/app.js +++ /dev/null @@ -1,6326 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js": -/*!************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/abstracts/PluginBase.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ PluginBase) -/* harmony export */ }); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -/** - * Plugin base abstract. - * - * This class provides the base functionality for all plugins. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var PluginBase = /*#__PURE__*/function () { - /** - * Constructor. - * - * The constructor is provided the Snowboard framework instance, and should not be overwritten - * unless you absolutely know what you're doing. - * - * @param {Snowboard} snowboard - */ - function PluginBase(snowboard) { - _classCallCheck(this, PluginBase); - this.snowboard = snowboard; - } - - /** - * Plugin constructor. - * - * This method should be treated as the true constructor of a plugin, and can be overwritten. - * It will be called straight after construction. - */ - return _createClass(PluginBase, [{ - key: "construct", - value: function construct() {} - - /** - * Defines the required plugins for this specific module to work. - * - * @returns {string[]} An array of plugins required for this module to work, as strings. - */ - }, { - key: "dependencies", - value: function dependencies() { - return []; - } - - /** - * Defines the listener methods for global events. - * - * @returns {Object} - */ - }, { - key: "listens", - value: function listens() { - return {}; - } - - /** - * Plugin destructor. - * - * Fired when this plugin is removed. Can be manually called if you have another scenario for - * destruction, ie. the element attached to the plugin is removed or changed. - */ - }, { - key: "destruct", - value: function destruct() { - this.detach(); - delete this.snowboard; - } - - /** - * Plugin destructor (old method name). - * - * Allows previous usage of the "destructor" method to still work. - */ - }, { - key: "destructor", - value: function destructor() { - this.destruct(); - } - }]); -}(); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js": -/*!***********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/abstracts/Singleton.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Singleton) -/* harmony export */ }); -/* harmony import */ var _PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Singleton plugin abstract. - * - * This is a special definition class that the Snowboard framework will use to interpret the current plugin as a - * "singleton". This will ensure that only one instance of the plugin class is used across the board. - * - * Singletons are initialised on the "domReady" event by default. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var Singleton = /*#__PURE__*/function (_PluginBase) { - function Singleton() { - _classCallCheck(this, Singleton); - return _callSuper(this, Singleton, arguments); - } - _inherits(Singleton, _PluginBase); - return _createClass(Singleton); -}(_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/ajax/Request.js": -/*!****************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/ajax/Request.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Request) -/* harmony export */ }); -/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } -function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Request plugin. - * - * This is the default AJAX handler which will run using the `fetch()` method that is default in modern browsers. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var Request = /*#__PURE__*/function (_PluginBase) { - function Request() { - _classCallCheck(this, Request); - return _callSuper(this, Request, arguments); - } - _inherits(Request, _PluginBase); - return _createClass(Request, [{ - key: "construct", - value: - /** - * Constructor. - * - * The constructor accepts 2 or 3 parameters. - * - * If 2 parameters are provided, the first parameter is the handler name and the second - * parameter is the options. This assumes that this is a detached AJAX request not connected to - * an element. - * - * If 3 parameters are provided, the first parameter is an element or a selector, and the second - * and third parameters are the handler and options, respectively. - * - * @param {HTMLElement|string} element - * @param {string|Object} handler - * @param {Object} options - */ - function construct(element, handler, options) { - var _this = this; - if (typeof element === 'string') { - // Allow the element to be a handler name. - // This assumes the request is being made against no element, and the handler parameter - // will contain options. - if (this.isHandlerName(element)) { - this.element = null; - this.handler = element; - this.options = handler || {}; - } else { - var matchedElement = document.querySelector(element); - if (matchedElement === null) { - throw new Error("No element was found with the given selector: ".concat(element)); - } - this.element = matchedElement; - this.handler = handler; - this.options = options || {}; - } - } else { - this.element = element; - this.handler = handler; - this.options = options || {}; - } - this.fetchOptions = {}; - this.responseData = null; - this.responseError = null; - this.cancelled = false; - this.checkRequest(); - if (!this.snowboard.globalEvent('ajaxSetup', this)) { - this.cancelled = true; - return; - } - if (this.element) { - var event = new Event('ajaxSetup', { - cancelable: true - }); - event.request = this; - this.element.dispatchEvent(event); - if (event.defaultPrevented) { - this.cancelled = true; - return; - } - } - if (!this.doClientValidation()) { - this.cancelled = true; - return; - } - if (this.confirm) { - this.doConfirm().then(function (confirmed) { - if (confirmed) { - _this.doAjax().then(function (response) { - if (response.cancelled) { - _this.cancelled = true; - _this.complete(); - return; - } - _this.responseData = response; - _this.processUpdate(response).then(function () { - if (response.X_WINTER_SUCCESS === false) { - _this.processError(response); - } else { - _this.processResponse(response); - } - }); - }, function (error) { - _this.responseError = error; - _this.processError(error); - }); - } - }); - } else { - this.doAjax().then(function (response) { - if (response.cancelled) { - _this.cancelled = true; - _this.complete(); - return; - } - _this.responseData = response; - _this.processUpdate(response).then(function () { - if (response.X_WINTER_SUCCESS === false) { - _this.processError(response); - } else { - _this.processResponse(response); - } - }); - }, function (error) { - _this.responseError = error; - _this.processError(error); - }); - } - } - - /** - * Dependencies for this plugin. - * - * @returns {string[]} - */ - }, { - key: "dependencies", - value: function dependencies() { - return ['cookie', 'jsonParser']; - } - - /** - * Validates the element and handler given in the request. - */ - }, { - key: "checkRequest", - value: function checkRequest() { - if (this.element && this.element instanceof Element === false) { - throw new Error('The element provided must be an Element instance'); - } - if (this.handler === undefined) { - throw new Error('The AJAX handler name is not specified.'); - } - if (!this.isHandlerName(this.handler)) { - throw new Error('Invalid AJAX handler name. The correct handler name format is: "onEvent".'); - } - } - - /** - * Creates a Fetch request. - * - * This method is made available for plugins to extend or override the default fetch() settings with their own. - * - * @returns {Promise} - */ - }, { - key: "getFetch", - value: function getFetch() { - this.fetchOptions = this.options.fetchOptions !== undefined && _typeof(this.options.fetchOptions) === 'object' ? this.options.fetchOptions : { - method: 'POST', - headers: this.headers, - body: this.data, - redirect: 'follow', - mode: 'same-origin' - }; - this.snowboard.globalEvent('ajaxFetchOptions', this.fetchOptions, this); - return fetch(this.url, this.fetchOptions); - } - - /** - * Run client-side validation on the form, if available. - * - * @returns {boolean} - */ - }, { - key: "doClientValidation", - value: function doClientValidation() { - if (this.options.browserValidate === true && this.form) { - if (this.form.checkValidity() === false) { - this.form.reportValidity(); - return false; - } - } - return true; - } - - /** - * Executes the AJAX query. - * - * Returns a Promise object for when the AJAX request is completed. - * - * @returns {Promise} - */ - }, { - key: "doAjax", - value: function doAjax() { - var _this2 = this; - // Allow plugins to cancel the AJAX request before sending - if (this.snowboard.globalEvent('ajaxBeforeSend', this) === false) { - return Promise.resolve({ - cancelled: true - }); - } - var ajaxPromise = new Promise(function (resolve, reject) { - _this2.getFetch().then(function (response) { - if (!response.ok && response.status !== 406) { - if (response.headers.has('Content-Type') && response.headers.get('Content-Type').includes('/json')) { - response.json().then(function (responseData) { - if (responseData.message && responseData.exception) { - reject(_this2.renderError(responseData.message, responseData.exception, responseData.file, responseData.line, responseData.trace)); - } else { - reject(responseData); - } - }, function (error) { - reject(_this2.renderError("Unable to parse JSON response: ".concat(error))); - }); - } else { - response.text().then(function (responseText) { - reject(_this2.renderError(responseText)); - }, function (error) { - reject(_this2.renderError("Unable to process response: ".concat(error))); - }); - } - return; - } - if (response.headers.has('Content-Type') && response.headers.get('Content-Type').includes('/json')) { - response.json().then(function (responseData) { - resolve(_objectSpread(_objectSpread({}, responseData), {}, { - X_WINTER_SUCCESS: response.status !== 406, - X_WINTER_RESPONSE_CODE: response.status - })); - }, function (error) { - reject(_this2.renderError("Unable to parse JSON response: ".concat(error))); - }); - } else { - response.text().then(function (responseData) { - resolve(responseData); - }, function (error) { - reject(_this2.renderError("Unable to process response: ".concat(error))); - }); - } - }, function (responseError) { - reject(_this2.renderError("Unable to retrieve a response from the server: ".concat(responseError))); - }); - }); - this.snowboard.globalEvent('ajaxStart', ajaxPromise, this); - if (this.element) { - var event = new Event('ajaxPromise'); - event.promise = ajaxPromise; - this.element.dispatchEvent(event); - } - return ajaxPromise; - } - - /** - * Prepares for updating the partials from the AJAX response. - * - * If any partials are returned from the AJAX response, this method will also action the partial updates. - * - * Returns a Promise object which tracks when the partial update is complete. - * - * @param {Object} response - * @returns {Promise} - */ - }, { - key: "processUpdate", - value: function processUpdate(response) { - var _this3 = this; - return new Promise(function (resolve, reject) { - if (typeof _this3.options.beforeUpdate === 'function') { - if (_this3.options.beforeUpdate.apply(_this3, [response]) === false) { - resolve(); - return; - } - } - - // Extract partial information - var partials = {}; - Object.entries(response).forEach(function (entry) { - var _entry = _slicedToArray(entry, 2), - key = _entry[0], - value = _entry[1]; - if (key.substr(0, 8) !== 'X_WINTER') { - partials[key] = value; - } - }); - if (Object.keys(partials).length === 0) { - if (response.X_WINTER_ASSETS) { - _this3.processAssets(response.X_WINTER_ASSETS).then(function () { - resolve(); - }, function () { - reject(); - }); - } else { - resolve(); - } - return; - } - var promises = _this3.snowboard.globalPromiseEvent('ajaxBeforeUpdate', response, _this3); - promises.then( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - if (!response.X_WINTER_ASSETS) { - _context.next = 3; - break; - } - _context.next = 3; - return _this3.processAssets(response.X_WINTER_ASSETS); - case 3: - _this3.doUpdate(partials).then(function () { - // Allow for HTML redraw - window.requestAnimationFrame(function () { - return resolve(); - }); - }, function () { - reject(); - }); - case 4: - case "end": - return _context.stop(); - } - }, _callee); - })), function () { - resolve(); - }); - }); - } - - /** - * Updates the partials with the given content. - * - * @param {Object} partials - * @returns {Promise} - */ - }, { - key: "doUpdate", - value: function doUpdate(partials) { - var _this4 = this; - return new Promise(function (resolve) { - var affected = []; - Object.entries(partials).forEach(function (entry) { - var _entry2 = _slicedToArray(entry, 2), - partial = _entry2[0], - content = _entry2[1]; - var selector = _this4.options.update && _this4.options.update[partial] ? _this4.options.update[partial] : partial; - var mode = 'replace'; - if (selector.substr(0, 1) === '@') { - mode = 'append'; - selector = selector.substr(1); - } else if (selector.substr(0, 1) === '^') { - mode = 'prepend'; - selector = selector.substr(1); - } else if (selector.substr(0, 1) !== '#' && selector.substr(0, 1) !== '.') { - mode = 'noop'; - } - var elements = document.querySelectorAll(selector); - if (elements.length > 0) { - elements.forEach(function (element) { - switch (mode) { - case 'append': - element.innerHTML += content; - break; - case 'prepend': - element.innerHTML = content + element.innerHTML; - break; - case 'noop': - break; - case 'replace': - default: - element.innerHTML = content; - break; - } - affected.push(element); - - // Fire update event for each element that is updated - _this4.snowboard.globalEvent('ajaxUpdate', element, content, _this4); - var event = new Event('ajaxUpdate'); - event.content = content; - element.dispatchEvent(event); - }); - } - }); - _this4.snowboard.globalEvent('ajaxUpdateComplete', affected, _this4); - resolve(); - }); - } - - /** - * Processes the response data. - * - * This fires off all necessary processing functions depending on the response, ie. if there's any flash - * messages to handle, or any redirects to be undertaken. - * - * @param {Object} response - * @returns {void} - */ - }, { - key: "processResponse", - value: function processResponse(response) { - if (this.options.success && typeof this.options.success === 'function') { - if (this.options.success(this.responseData, this) === false) { - return; - } - } - - // Allow plugins to cancel any further response handling - if (this.snowboard.globalEvent('ajaxSuccess', this.responseData, this) === false) { - return; - } - - // Allow the element to cancel any further response handling - if (this.element) { - var event = new Event('ajaxDone', { - cancelable: true - }); - event.responseData = this.responseData; - event.request = this; - this.element.dispatchEvent(event); - if (event.defaultPrevented) { - return; - } - } - if (this.flash && response.X_WINTER_FLASH_MESSAGES) { - this.processFlashMessages(response.X_WINTER_FLASH_MESSAGES); - } - - // Check for a redirect from the response, or use the redirect as specified in the options. - if (this.redirect || response.X_WINTER_REDIRECT) { - this.processRedirect(this.redirect || response.X_WINTER_REDIRECT); - return; - } - this.complete(); - } - - /** - * Processes an error response from the AJAX request. - * - * This fires off all necessary processing functions depending on the error response, ie. if there's any error or - * validation messages to handle. - * - * @param {Object|Error} error - */ - }, { - key: "processError", - value: function processError(error) { - if (this.options.error && typeof this.options.error === 'function') { - if (this.options.error(this.responseError, this) === false) { - return; - } - } - - // Allow plugins to cancel any further error handling - if (this.snowboard.globalEvent('ajaxError', this.responseError, this) === false) { - return; - } - - // Allow the element to cancel any further error handling - if (this.element) { - var event = new Event('ajaxFail', { - cancelable: true - }); - event.responseError = this.responseError; - event.request = this; - this.element.dispatchEvent(event); - if (event.defaultPrevented) { - return; - } - } - if (error instanceof Error) { - this.processErrorMessage(error.message); - } else { - var skipError = false; - - // Process validation errors - if (error.X_WINTER_ERROR_FIELDS) { - skipError = this.processValidationErrors(error.X_WINTER_ERROR_FIELDS); - } - if (error.X_WINTER_ERROR_MESSAGE && !skipError) { - this.processErrorMessage(error.X_WINTER_ERROR_MESSAGE); - } - } - this.complete(); - } - - /** - * Processes a redirect response. - * - * By default, this processor will simply redirect the user in their browser. - * - * Plugins can augment this functionality from the `ajaxRedirect` event. You may also override this functionality on - * a per-request basis through the `handleRedirectResponse` callback option. If a `false` is returned from either, the - * redirect will be cancelled. - * - * @param {string} url - * @returns {void} - */ - }, { - key: "processRedirect", - value: function processRedirect(url) { - var _this5 = this; - // Run a custom per-request redirect handler. If false is returned, don't run the redirect. - if (typeof this.options.handleRedirectResponse === 'function') { - if (this.options.handleRedirectResponse.apply(this, [url]) === false) { - return; - } - } - - // Allow plugins to cancel the redirect - if (this.snowboard.globalEvent('ajaxRedirect', url, this) === false) { - return; - } - - // Indicate that the AJAX request is finished if we're still on the current page - // so that the loading indicator for redirects that just change the hash value of - // the URL instead of leaving the page will properly stop. - // @see https://github.com/octobercms/october/issues/2780 - window.addEventListener('popstate', function () { - if (_this5.element) { - var event = document.createEvent('CustomEvent'); - event.eventName = 'ajaxRedirected'; - _this5.element.dispatchEvent(event); - } - }, { - once: true - }); - window.location.assign(url); - } - - /** - * Processes an error message. - * - * By default, this processor will simply alert the user through a simple `alert()` call. - * - * Plugins can augment this functionality from the `ajaxErrorMessage` event. You may also override this functionality - * on a per-request basis through the `handleErrorMessage` callback option. If a `false` is returned from either, the - * error message handling will be cancelled. - * - * @param {string} message - * @returns {void} - */ - }, { - key: "processErrorMessage", - value: function processErrorMessage(message) { - // Run a custom per-request handler for error messages. If false is returned, do not process the error messages - // any further. - if (typeof this.options.handleErrorMessage === 'function') { - if (this.options.handleErrorMessage.apply(this, [message]) === false) { - return; - } - } - - // Allow plugins to cancel the error message being shown - if (this.snowboard.globalEvent('ajaxErrorMessage', message, this) === false) { - return; - } - - // By default, show a browser error message - window.alert(message); - } - - /** - * Processes flash messages from the response. - * - * By default, no flash message handling will occur. - * - * Plugins can augment this functionality from the `ajaxFlashMessages` event. You may also override this functionality - * on a per-request basis through the `handleFlashMessages` callback option. If a `false` is returned from either, the - * flash message handling will be cancelled. - * - * @param {Object} messages - * @returns - */ - }, { - key: "processFlashMessages", - value: function processFlashMessages(messages) { - // Run a custom per-request flash handler. If false is returned, don't show the flash message - if (typeof this.options.handleFlashMessages === 'function') { - if (this.options.handleFlashMessages.apply(this, [messages]) === false) { - return; - } - } - this.snowboard.globalEvent('ajaxFlashMessages', messages, this); - } - - /** - * Processes validation errors for fields. - * - * By default, no validation error handling will occur. - * - * Plugins can augment this functionality from the `ajaxValidationErrors` event. You may also override this functionality - * on a per-request basis through the `handleValidationErrors` callback option. If a `false` is returned from either, the - * validation error handling will be cancelled. - * - * @param {Object} fields - * @returns - */ - }, { - key: "processValidationErrors", - value: function processValidationErrors(fields) { - if (typeof this.options.handleValidationErrors === 'function') { - if (this.options.handleValidationErrors.apply(this, [this.form, fields]) === false) { - return true; - } - } - - // Allow plugins to cancel the validation errors being handled - if (this.snowboard.globalEvent('ajaxValidationErrors', this.form, fields, this) === false) { - return true; - } - return false; - } - - /** - * Processes assets returned by an AJAX request. - * - * By default, no asset processing will occur and this will return a resolved Promise. - * - * Plugins can augment this functionality from the `ajaxLoadAssets` event. This event is considered blocking, and - * allows assets to be loaded or processed before continuing with any additional functionality. - * - * @param {Object} assets - * @returns {Promise} - */ - }, { - key: "processAssets", - value: function processAssets(assets) { - return this.snowboard.globalPromiseEvent('ajaxLoadAssets', assets); - } - - /** - * Confirms the request with the user before proceeding. - * - * This is an asynchronous method. By default, it will use the browser's `confirm()` method to query the user to - * confirm the action. This method will return a Promise with a boolean value depending on whether the user confirmed - * or not. - * - * Plugins can augment this functionality from the `ajaxConfirmMessage` event. You may also override this functionality - * on a per-request basis through the `handleConfirmMessage` callback option. If a `false` is returned from either, - * the confirmation is assumed to have been denied. - * - * @returns {Promise} - */ - }, { - key: "doConfirm", - value: (function () { - var _doConfirm = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { - var promises, fulfilled; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - if (!(typeof this.options.handleConfirmMessage === 'function')) { - _context2.next = 4; - break; - } - if (!(this.options.handleConfirmMessage.apply(this, [this.confirm]) === false)) { - _context2.next = 3; - break; - } - return _context2.abrupt("return", false); - case 3: - return _context2.abrupt("return", true); - case 4: - if (!(this.snowboard.listensToEvent('ajaxConfirmMessage').length === 0)) { - _context2.next = 6; - break; - } - return _context2.abrupt("return", window.confirm(this.confirm)); - case 6: - // Run custom plugin confirmations - promises = this.snowboard.globalPromiseEvent('ajaxConfirmMessage', this.confirm, this); - _context2.prev = 7; - _context2.next = 10; - return promises; - case 10: - fulfilled = _context2.sent; - if (!fulfilled) { - _context2.next = 13; - break; - } - return _context2.abrupt("return", true); - case 13: - _context2.next = 18; - break; - case 15: - _context2.prev = 15; - _context2.t0 = _context2["catch"](7); - return _context2.abrupt("return", false); - case 18: - return _context2.abrupt("return", false); - case 19: - case "end": - return _context2.stop(); - } - }, _callee2, this, [[7, 15]]); - })); - function doConfirm() { - return _doConfirm.apply(this, arguments); - } - return doConfirm; - }() - /** - * Fires off completion events for the Request. - */ - ) - }, { - key: "complete", - value: function complete() { - if (this.options.complete && typeof this.options.complete === 'function') { - this.options.complete(this.responseData, this); - } - this.snowboard.globalEvent('ajaxDone', this.responseData, this); - if (this.element) { - var event = new Event('ajaxAlways'); - event.request = this; - event.responseData = this.responseData; - event.responseError = this.responseError; - this.element.dispatchEvent(event); - } - - // Fire off the destructor - this.destruct(); - } - }, { - key: "form", - get: function get() { - if (this.options.form) { - if (typeof this.options.form === 'string') { - return document.querySelector(this.options.form); - } - return this.options.form; - } - if (!this.element) { - return null; - } - if (this.element.tagName === 'FORM') { - return this.element; - } - return this.element.closest('form'); - } - }, { - key: "context", - get: function get() { - return { - handler: this.handler, - options: this.options - }; - } - }, { - key: "headers", - get: function get() { - var headers = { - 'X-Requested-With': 'XMLHttpRequest', - // Keeps compatibility with jQuery AJAX - 'X-WINTER-REQUEST-HANDLER': this.handler, - 'X-WINTER-REQUEST-PARTIALS': this.extractPartials(this.options.update || []) - }; - if (this.flash) { - headers['X-WINTER-REQUEST-FLASH'] = 1; - } - if (this.xsrfToken) { - headers['X-XSRF-TOKEN'] = this.xsrfToken; - } - return headers; - } - }, { - key: "loading", - get: function get() { - return this.options.loading || false; - } - }, { - key: "url", - get: function get() { - return this.options.url || window.location.href; - } - }, { - key: "redirect", - get: function get() { - return this.options.redirect && this.options.redirect.length ? this.options.redirect : null; - } - }, { - key: "flash", - get: function get() { - return this.options.flash || false; - } - }, { - key: "files", - get: function get() { - if (this.options.files === true) { - if (FormData === undefined) { - this.snowboard.debug('This browser does not support file uploads'); - return false; - } - return true; - } - return false; - } - }, { - key: "xsrfToken", - get: function get() { - return this.snowboard.cookie().get('XSRF-TOKEN'); - } - }, { - key: "data", - get: function get() { - var data = _typeof(this.options.data) === 'object' ? this.options.data : {}; - var formData = new FormData(this.form || undefined); - if (Object.keys(data).length > 0) { - Object.entries(data).forEach(function (entry) { - var _entry3 = _slicedToArray(entry, 2), - key = _entry3[0], - value = _entry3[1]; - formData.append(key, value); - }); - } - return formData; - } - }, { - key: "confirm", - get: function get() { - return this.options.confirm || false; - } - - /** - * Extracts partials. - * - * @param {Object} update - * @returns {string} - */ - }, { - key: "extractPartials", - value: function extractPartials(update) { - return Object.keys(update).join('&'); - } - - /** - * Renders an error with useful debug information. - * - * This method is used internally when the AJAX request could not be completed or processed correctly due to an error. - * - * @param {string} message - * @param {string} exception - * @param {string} file - * @param {Number} line - * @param {string[]} trace - * @returns {Error} - */ - }, { - key: "renderError", - value: function renderError(message, exception, file, line, trace) { - var error = new Error(message); - error.exception = exception || null; - error.file = file || null; - error.line = line || null; - error.trace = trace || []; - return error; - } - - /** - * Checks a given string to see if it is a valid AJAX handler name. - * - * @param {String} name - * @returns {Boolean} - */ - }, { - key: "isHandlerName", - value: function isHandlerName(name) { - return /^(?:\w+:{2})?on[A-Z0-9]/.test(name); - } - }]); -}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js": -/*!**********************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AttributeRequest) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } -function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Enable Data Attributes API for AJAX requests. - * - * This is an extension of the base AJAX functionality that includes handling of HTML data attributes for processing - * AJAX requests. It is separated from the base AJAX functionality to allow developers to opt-out of data attribute - * requests if they do not intend to use them. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var AttributeRequest = /*#__PURE__*/function (_Singleton) { - function AttributeRequest() { - _classCallCheck(this, AttributeRequest); - return _callSuper(this, AttributeRequest, arguments); - } - _inherits(AttributeRequest, _Singleton); - return _createClass(AttributeRequest, [{ - key: "listens", - value: - /** - * Listeners. - * - * @returns {Object} - */ - function listens() { - return { - ready: 'ready', - ajaxSetup: 'onAjaxSetup' - }; - } - - /** - * Ready event callback. - * - * Attaches handlers to the window to listen for all request interactions. - */ - }, { - key: "ready", - value: function ready() { - this.attachHandlers(); - this.disableDefaultFormValidation(); - } - - /** - * Dependencies. - * - * @returns {string[]} - */ - }, { - key: "dependencies", - value: function dependencies() { - return ['request', 'jsonParser']; - } - - /** - * Destructor. - * - * Detaches all handlers. - */ - }, { - key: "destruct", - value: function destruct() { - this.detachHandlers(); - _get(_getPrototypeOf(AttributeRequest.prototype), "destruct", this).call(this); - } - - /** - * Attaches the necessary handlers for all request interactions. - */ - }, { - key: "attachHandlers", - value: function attachHandlers() { - var _this = this; - window.addEventListener('change', function (event) { - return _this.changeHandler(event); - }); - window.addEventListener('click', function (event) { - return _this.clickHandler(event); - }); - window.addEventListener('keydown', function (event) { - return _this.keyDownHandler(event); - }); - window.addEventListener('submit', function (event) { - return _this.submitHandler(event); - }); - } - - /** - * Disables default form validation for AJAX forms. - * - * A form that contains a `data-request` attribute to specify an AJAX call without including a `data-browser-validate` - * attribute means that the AJAX callback function will likely be handling the validation instead. - */ - }, { - key: "disableDefaultFormValidation", - value: function disableDefaultFormValidation() { - document.querySelectorAll('form[data-request]:not([data-browser-validate])').forEach(function (form) { - form.setAttribute('novalidate', true); - }); - } - - /** - * Detaches the necessary handlers for all request interactions. - */ - }, { - key: "detachHandlers", - value: function detachHandlers() { - var _this2 = this; - window.removeEventListener('change', function (event) { - return _this2.changeHandler(event); - }); - window.removeEventListener('click', function (event) { - return _this2.clickHandler(event); - }); - window.removeEventListener('keydown', function (event) { - return _this2.keyDownHandler(event); - }); - window.removeEventListener('submit', function (event) { - return _this2.submitHandler(event); - }); - } - - /** - * Handles changes to select, radio, checkbox and file inputs. - * - * @param {Event} event - */ - }, { - key: "changeHandler", - value: function changeHandler(event) { - // Check that we are changing a valid element - if (!event.target.matches('select[data-request], input[type=radio][data-request], input[type=checkbox][data-request], input[type=file][data-request]')) { - return; - } - this.processRequestOnElement(event.target); - } - - /** - * Handles clicks on hyperlinks and buttons. - * - * This event can bubble up the hierarchy to find a suitable request element. - * - * @param {Event} event - */ - }, { - key: "clickHandler", - value: function clickHandler(event) { - var currentElement = event.target; - while (currentElement && currentElement.tagName !== 'HTML') { - if (!currentElement.matches('a[data-request], button[data-request], input[type=button][data-request], input[type=submit][data-request]')) { - currentElement = currentElement.parentElement; - } else { - event.preventDefault(); - this.processRequestOnElement(currentElement); - break; - } - } - } - - /** - * Handles key presses on inputs - * - * @param {Event} event - */ - }, { - key: "keyDownHandler", - value: function keyDownHandler(event) { - // Check that we are inputting into a valid element - if (!event.target.matches('input')) { - return; - } - - // Check that the input type is valid - var validTypes = ['checkbox', 'color', 'date', 'datetime', 'datetime-local', 'email', 'image', 'month', 'number', 'password', 'radio', 'range', 'search', 'tel', 'text', 'time', 'url', 'week']; - if (validTypes.indexOf(event.target.getAttribute('type')) === -1) { - return; - } - if (event.key === 'Enter' && event.target.matches('*[data-request]')) { - this.processRequestOnElement(event.target); - event.preventDefault(); - event.stopImmediatePropagation(); - } else if (event.target.matches('*[data-track-input]')) { - this.trackInput(event.target); - } - } - - /** - * Handles form submissions. - * - * @param {Event} event - */ - }, { - key: "submitHandler", - value: function submitHandler(event) { - // Check that we are submitting a valid form - if (!event.target.matches('form[data-request]')) { - return; - } - event.preventDefault(); - this.processRequestOnElement(event.target); - } - - /** - * Processes a request on a given element, using its data attributes. - * - * @param {HTMLElement} element - */ - }, { - key: "processRequestOnElement", - value: function processRequestOnElement(element) { - var data = element.dataset; - var handler = String(data.request); - var options = { - confirm: 'requestConfirm' in data ? String(data.requestConfirm) : null, - redirect: 'requestRedirect' in data ? String(data.requestRedirect) : null, - loading: 'requestLoading' in data ? String(data.requestLoading) : null, - flash: 'requestFlash' in data, - files: 'requestFiles' in data, - browserValidate: 'requestBrowserValidate' in data, - form: 'requestForm' in data ? String(data.requestForm) : null, - url: 'requestUrl' in data ? String(data.requestUrl) : null, - update: 'requestUpdate' in data ? this.parseData(String(data.requestUpdate)) : [], - data: 'requestData' in data ? this.parseData(String(data.requestData)) : [] - }; - this.snowboard.request(element, handler, options); - } - - /** - * Sets up an AJAX request via HTML attributes. - * - * @param {Request} request - */ - }, { - key: "onAjaxSetup", - value: function onAjaxSetup(request) { - if (!request.element) { - return; - } - var fieldName = request.element.getAttribute('name'); - var data = _objectSpread(_objectSpread({}, this.getParentRequestData(request.element)), request.options.data); - if (request.element && request.element.matches('input, textarea, select, button') && !request.form && fieldName && !request.options.data[fieldName]) { - data[fieldName] = request.element.value; - } - request.options.data = data; - } - - /** - * Parses and collates all data from elements up the DOM hierarchy. - * - * @param {Element} target - * @returns {Object} - */ - }, { - key: "getParentRequestData", - value: function getParentRequestData(target) { - var _this3 = this; - var elements = []; - var data = {}; - var currentElement = target; - while (currentElement.parentElement && currentElement.parentElement.tagName !== 'HTML') { - elements.push(currentElement.parentElement); - currentElement = currentElement.parentElement; - } - elements.reverse(); - elements.forEach(function (element) { - var elementData = element.dataset; - if ('requestData' in elementData) { - data = _objectSpread(_objectSpread({}, data), _this3.parseData(elementData.requestData)); - } - }); - return data; - } - - /** - * Parses data in the Winter/October JSON format. - * - * @param {String} data - * @returns {Object} - */ - }, { - key: "parseData", - value: function parseData(data) { - var value; - if (data === undefined) { - value = ''; - } - if (_typeof(value) === 'object') { - return value; - } - try { - return this.snowboard.jsonparser().parse("{".concat(data, "}")); - } catch (e) { - throw new Error("Error parsing the data attribute on element: ".concat(e.message)); - } - } - }, { - key: "trackInput", - value: function trackInput(element) { - var _this4 = this; - var lastValue = element.dataset.lastValue; - var interval = element.dataset.trackInput || 300; - if (lastValue !== undefined && lastValue === element.value) { - return; - } - this.resetTrackInputTimer(element); - element.dataset.inputTimer = window.setTimeout(function () { - if (element.dataset.request) { - _this4.processRequestOnElement(element); - return; - } - - // Traverse up the hierarchy and find a form that sends an AJAX query - var currentElement = element; - while (currentElement.parentElement && currentElement.parentElement.tagName !== 'HTML') { - currentElement = currentElement.parentElement; - if (currentElement.tagName === 'FORM' && currentElement.dataset.request) { - _this4.processRequestOnElement(currentElement); - break; - } - } - }, interval); - } - }, { - key: "resetTrackInputTimer", - value: function resetTrackInputTimer(element) { - if (element.dataset.inputTimer) { - window.clearTimeout(element.dataset.inputTimer); - element.dataset.inputTimer = null; - } - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/AssetLoader.js": -/*!**********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/AssetLoader.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AssetLoader) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } -function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } -function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Asset Loader. - * - * Provides simple asset loading functionality for Snowboard, making it easy to pre-load images or - * include JavaScript or CSS assets on the fly. - * - * By default, this loader will listen to any assets that have been requested to load in an AJAX - * response, such as responses from a component. - * - * You can also load assets manually by calling the following: - * - * ```js - * Snowboard.addPlugin('assetLoader', AssetLoader); - * Snowboard.assetLoader().processAssets(assets); - * ``` - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var AssetLoader = /*#__PURE__*/function (_Singleton) { - function AssetLoader() { - _classCallCheck(this, AssetLoader); - return _callSuper(this, AssetLoader, arguments); - } - _inherits(AssetLoader, _Singleton); - return _createClass(AssetLoader, [{ - key: "listens", - value: - /** - * Event listeners. - * - * @returns {Object} - */ - function listens() { - return { - ajaxLoadAssets: 'load' - }; - } - - /** - * Dependencies. - * - * @returns {Array} - */ - }, { - key: "dependencies", - value: function dependencies() { - return ['url']; - } - - /** - * Process and load assets. - * - * The `assets` property of this method requires an object with any of the following keys and an - * array of paths: - * - * - `js`: An array of JavaScript URLs to load - * - `css`: An array of CSS stylesheet URLs to load - * - `img`: An array of image URLs to pre-load - * - * Both `js` and `css` files will be automatically injected, however `img` files will not. - * - * This method will return a Promise that resolves when all required assets are loaded. If an - * asset fails to load, this Promise will be rejected. - * - * ESLint *REALLY* doesn't like this code, but ignore it. It's the only way it works. - * - * @param {Object} assets - * @returns {Promise} - */ - }, { - key: "load", - value: (function () { - var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(assets) { - var _iterator, _step, script, _iterator2, _step2, style, _iterator3, _step3, image; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - if (!(assets.js && assets.js.length > 0)) { - _context.next = 24; - break; - } - _iterator = _createForOfIteratorHelper(assets.js); - _context.prev = 2; - _iterator.s(); - case 4: - if ((_step = _iterator.n()).done) { - _context.next = 16; - break; - } - script = _step.value; - _context.prev = 6; - _context.next = 9; - return this.loadScript(script); - case 9: - _context.next = 14; - break; - case 11: - _context.prev = 11; - _context.t0 = _context["catch"](6); - return _context.abrupt("return", Promise.reject(_context.t0)); - case 14: - _context.next = 4; - break; - case 16: - _context.next = 21; - break; - case 18: - _context.prev = 18; - _context.t1 = _context["catch"](2); - _iterator.e(_context.t1); - case 21: - _context.prev = 21; - _iterator.f(); - return _context.finish(21); - case 24: - if (!(assets.css && assets.css.length > 0)) { - _context.next = 48; - break; - } - _iterator2 = _createForOfIteratorHelper(assets.css); - _context.prev = 26; - _iterator2.s(); - case 28: - if ((_step2 = _iterator2.n()).done) { - _context.next = 40; - break; - } - style = _step2.value; - _context.prev = 30; - _context.next = 33; - return this.loadStyle(style); - case 33: - _context.next = 38; - break; - case 35: - _context.prev = 35; - _context.t2 = _context["catch"](30); - return _context.abrupt("return", Promise.reject(_context.t2)); - case 38: - _context.next = 28; - break; - case 40: - _context.next = 45; - break; - case 42: - _context.prev = 42; - _context.t3 = _context["catch"](26); - _iterator2.e(_context.t3); - case 45: - _context.prev = 45; - _iterator2.f(); - return _context.finish(45); - case 48: - if (!(assets.img && assets.img.length > 0)) { - _context.next = 72; - break; - } - _iterator3 = _createForOfIteratorHelper(assets.img); - _context.prev = 50; - _iterator3.s(); - case 52: - if ((_step3 = _iterator3.n()).done) { - _context.next = 64; - break; - } - image = _step3.value; - _context.prev = 54; - _context.next = 57; - return this.loadImage(image); - case 57: - _context.next = 62; - break; - case 59: - _context.prev = 59; - _context.t4 = _context["catch"](54); - return _context.abrupt("return", Promise.reject(_context.t4)); - case 62: - _context.next = 52; - break; - case 64: - _context.next = 69; - break; - case 66: - _context.prev = 66; - _context.t5 = _context["catch"](50); - _iterator3.e(_context.t5); - case 69: - _context.prev = 69; - _iterator3.f(); - return _context.finish(69); - case 72: - return _context.abrupt("return", Promise.resolve()); - case 73: - case "end": - return _context.stop(); - } - }, _callee, this, [[2, 18, 21, 24], [6, 11], [26, 42, 45, 48], [30, 35], [50, 66, 69, 72], [54, 59]]); - })); - function load(_x) { - return _load.apply(this, arguments); - } - return load; - }() - /** - * Injects and loads a JavaScript URL into the DOM. - * - * The script will be appended before the closing `` tag. - * - * @param {String} script - * @returns {Promise} - */ - ) - }, { - key: "loadScript", - value: function loadScript(script) { - var _this = this; - return new Promise(function (resolve, reject) { - // Resolve script URL - script = _this.snowboard.url().asset(script); - - // Check that script is not already loaded - var loaded = document.querySelector("script[src=\"".concat(script, "\"]")); - if (loaded) { - resolve(); - return; - } - - // Create script - var domScript = document.createElement('script'); - domScript.setAttribute('type', 'text/javascript'); - domScript.setAttribute('src', script); - domScript.addEventListener('load', function () { - _this.snowboard.globalEvent('assetLoader.loaded', 'script', script, domScript); - resolve(); - }); - domScript.addEventListener('error', function () { - _this.snowboard.globalEvent('assetLoader.error', 'script', script, domScript); - reject(new Error("Unable to load script file: \"".concat(script, "\""))); - }); - document.body.append(domScript); - }); - } - - /** - * Injects and loads a CSS stylesheet into the DOM. - * - * The stylesheet will be appended before the closing `` tag. - * - * @param {String} style - * @returns {Promise} - */ - }, { - key: "loadStyle", - value: function loadStyle(style) { - var _this2 = this; - return new Promise(function (resolve, reject) { - // Resolve style URL - style = _this2.snowboard.url().asset(style); - - // Check that stylesheet is not already loaded - var loaded = document.querySelector("link[rel=\"stylesheet\"][href=\"".concat(style, "\"]")); - if (loaded) { - resolve(); - return; - } - - // Create stylesheet - var domCss = document.createElement('link'); - domCss.setAttribute('rel', 'stylesheet'); - domCss.setAttribute('href', style); - domCss.addEventListener('load', function () { - _this2.snowboard.globalEvent('assetLoader.loaded', 'style', style, domCss); - resolve(); - }); - domCss.addEventListener('error', function () { - _this2.snowboard.globalEvent('assetLoader.error', 'style', style, domCss); - reject(new Error("Unable to load stylesheet file: \"".concat(style, "\""))); - }); - document.head.append(domCss); - }); - } - - /** - * Pre-loads an image. - * - * The image will not be injected into the DOM. - * - * @param {String} image - * @returns {Promise} - */ - }, { - key: "loadImage", - value: function loadImage(image) { - var _this3 = this; - return new Promise(function (resolve, reject) { - // Resolve script URL - image = _this3.snowboard.url().asset(image); - var img = new Image(); - img.addEventListener('load', function () { - _this3.snowboard.globalEvent('assetLoader.loaded', 'image', image, img); - resolve(); - }); - img.addEventListener('error', function () { - _this3.snowboard.globalEvent('assetLoader.error', 'image', image, img); - reject(new Error("Unable to load image file: \"".concat(image, "\""))); - }); - img.src = image; - }); - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/AttachLoading.js": -/*!************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/AttachLoading.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ AttachLoading) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Allows attaching a loading class on elements that an AJAX request is targeting. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var AttachLoading = /*#__PURE__*/function (_Singleton) { - function AttachLoading() { - _classCallCheck(this, AttachLoading); - return _callSuper(this, AttachLoading, arguments); - } - _inherits(AttachLoading, _Singleton); - return _createClass(AttachLoading, [{ - key: "dependencies", - value: - /** - * Defines dependenices. - * - * @returns {string[]} - */ - function dependencies() { - return ['request']; - } - - /** - * Defines listeners. - * - * @returns {Object} - */ - }, { - key: "listens", - value: function listens() { - return { - ajaxStart: 'ajaxStart', - ajaxDone: 'ajaxDone' - }; - } - }, { - key: "ajaxStart", - value: function ajaxStart(promise, request) { - var _this = this; - if (!request.element) { - return; - } - if (request.element.tagName === 'FORM') { - var loadElements = request.element.querySelectorAll('[data-attach-loading]'); - if (loadElements.length > 0) { - loadElements.forEach(function (element) { - element.classList.add(_this.getLoadingClass(element)); - }); - } - } else if (request.element.dataset.attachLoading !== undefined) { - request.element.classList.add(this.getLoadingClass(request.element)); - } - } - }, { - key: "ajaxDone", - value: function ajaxDone(data, request) { - var _this2 = this; - if (!request.element) { - return; - } - if (request.element.tagName === 'FORM') { - var loadElements = request.element.querySelectorAll('[data-attach-loading]'); - if (loadElements.length > 0) { - loadElements.forEach(function (element) { - element.classList.remove(_this2.getLoadingClass(element)); - }); - } - } else if (request.element.dataset.attachLoading !== undefined) { - request.element.classList.remove(this.getLoadingClass(request.element)); - } - } - }, { - key: "getLoadingClass", - value: function getLoadingClass(element) { - return element.dataset.attachLoading !== undefined && element.dataset.attachLoading !== '' ? element.dataset.attachLoading : 'wn-loading'; - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/DataConfig.js": -/*!*********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/DataConfig.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ DataConfig) -/* harmony export */ }); -/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Data configuration provider. - * - * Provides a mechanism for passing configuration data through an element's data attributes. This - * is generally used for widgets or UI interactions to configure them. - * - * @copyright 2022 Winter. - * @author Ben Thomson - */ -var DataConfig = /*#__PURE__*/function (_PluginBase) { - function DataConfig() { - _classCallCheck(this, DataConfig); - return _callSuper(this, DataConfig, arguments); - } - _inherits(DataConfig, _PluginBase); - return _createClass(DataConfig, [{ - key: "construct", - value: - /** - * Constructor. - * - * @param {PluginBase} instance - * @param {HTMLElement} element - * @param {Object} localConfig - */ - function construct(instance, element, localConfig) { - if (instance instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false) { - throw new Error('You must provide a Snowboard plugin to enable data configuration'); - } - if (element instanceof HTMLElement === false) { - throw new Error('Data configuration can only be extracted from HTML elements'); - } - this.instance = instance; - this.element = element; - this.localConfig = localConfig || {}; - this.instanceConfig = {}; - this.acceptedConfigs = {}; - this.refresh(); - } - - /** - * Gets the config for this instance. - * - * If the `config` parameter is unspecified, returns the entire configuration. - * - * @param {string} config - */ - }, { - key: "get", - value: function get(config) { - if (config === undefined) { - return this.instanceConfig; - } - if (this.instanceConfig[config] !== undefined) { - return this.instanceConfig[config]; - } - return undefined; - } - - /** - * Sets the config for this instance. - * - * This allows you to override, at runtime, any configuration value as necessary. - * - * @param {string} config - * @param {any} value - * @param {boolean} persist - */ - }, { - key: "set", - value: function set(config, value, persist) { - if (config === undefined) { - throw new Error('You must provide a configuration key to set'); - } - this.instanceConfig[config] = value; - if (persist === true) { - this.element.dataset[config] = value; - this.localConfig[config] = value; - } - } - - /** - * Refreshes the configuration from the element. - * - * This will allow you to make changes to the data config on a DOM level and re-apply them - * to the config on the JavaScript side. - */ - }, { - key: "refresh", - value: function refresh() { - this.acceptedConfigs = this.getAcceptedConfigs(); - this.instanceConfig = this.processConfig(); - } - - /** - * Determines the available configurations that can be set through the data config. - * - * If an instance has an `acceptAllDataConfigs` property, set to `true`, then all data - * attributes will be available as configuration values. This can be a security concern, so - * tread carefully. - * - * Otherwise, available configurations will be determined by the keys available in an object - * returned by a `defaults()` method in the instance. - * - * @returns {string[]|boolean} - */ - }, { - key: "getAcceptedConfigs", - value: function getAcceptedConfigs() { - if (this.instance.acceptAllDataConfigs !== undefined && this.instance.acceptAllDataConfigs === true) { - return true; - } - if (this.instance.defaults !== undefined && typeof this.instance.defaults === 'function' && _typeof(this.instance.defaults()) === 'object') { - return Object.keys(this.instance.defaults()); - } - return false; - } - - /** - * Returns the default values for the instance. - * - * This will be an empty object if the instance either does not have a `defaults()` method, or - * the method itself does not return an object. - * - * @returns {object} - */ - }, { - key: "getDefaults", - value: function getDefaults() { - if (this.instance.defaults !== undefined && typeof this.instance.defaults === 'function' && _typeof(this.instance.defaults()) === 'object') { - return this.instance.defaults(); - } - return {}; - } - - /** - * Processes the configuration. - * - * Loads up the defaults, then populates it with any configuration values provided by the data - * attributes, based on the rules of the accepted configurations. - * - * This configuration object is then cached and available through `config.get()` calls. - * - * @returns {object} - */ - }, { - key: "processConfig", - value: function processConfig() { - var config = this.getDefaults(); - if (this.acceptedConfigs === false) { - return config; - } - - /* eslint-disable */ - for (var key in this.element.dataset) { - if (this.acceptedConfigs === true || this.acceptedConfigs.includes(key)) { - config[key] = this.coerceValue(this.element.dataset[key]); - } - } - for (var _key in this.localConfig) { - if (this.acceptedConfigs === true || this.acceptedConfigs.includes(_key)) { - config[_key] = this.localConfig[_key]; - } - } - /* eslint-enable */ - - return config; - } - - /** - * Coerces configuration values for JavaScript. - * - * Takes the string value returned from the data attribute and coerces it into a more suitable - * type for JavaScript processing. - * - * @param {*} value - * @returns {*} - */ - }, { - key: "coerceValue", - value: function coerceValue(value) { - var stringValue = String(value); - - // Null value - if (stringValue === 'null') { - return null; - } - - // Undefined value - if (stringValue === 'undefined') { - return undefined; - } - - // Base64 value - if (stringValue.startsWith('base64:')) { - var base64str = stringValue.replace(/^base64:/, ''); - var decoded = atob(base64str); - return this.coerceValue(decoded); - } - - // Boolean value - if (['true', 'yes'].includes(stringValue.toLowerCase())) { - return true; - } - if (['false', 'no'].includes(stringValue.toLowerCase())) { - return false; - } - - // Numeric value - if (/^[-+]?[0-9]+(\.[0-9]+)?$/.test(stringValue)) { - return Number(stringValue); - } - - // JSON value - try { - return this.snowboard.jsonParser().parse(stringValue); - } catch (e) { - return stringValue === '' ? true : stringValue; - } - } - }]); -}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/Flash.js": -/*!****************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/Flash.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Flash) -/* harmony export */ }); -/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } -function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Provides flash messages for the CMS. - * - * Flash messages will pop up at the top center of the page and will remain for 7 seconds by default. Hovering over - * the message will reset and pause the timer. Clicking on the flash message will dismiss it. - * - * Arguments: - * - "message": The content of the flash message. HTML is accepted. - * - "type": The type of flash message. This is appended as a class to the flash message itself. - * - "duration": How long the flash message will stay visible for, in seconds. Default: 7 seconds. - * - * Usage: - * Snowboard.flash('This is a flash message', 'info', 8); - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var Flash = /*#__PURE__*/function (_PluginBase) { - function Flash() { - _classCallCheck(this, Flash); - return _callSuper(this, Flash, arguments); - } - _inherits(Flash, _PluginBase); - return _createClass(Flash, [{ - key: "construct", - value: - /** - * Constructor. - * - * @param {string} message - * @param {string} type - * @param {Number} duration - */ - function construct(message, type, duration) { - this.message = message; - this.type = type || 'default'; - this.duration = Number(duration || 7); - if (this.duration < 0) { - throw new Error('Flash duration must be a positive number, or zero'); - } - this.clear(); - this.timer = null; - this.flashTimer = null; - this.create(); - } - - /** - * Defines dependencies. - * - * @returns {string[]} - */ - }, { - key: "dependencies", - value: function dependencies() { - return ['transition']; - } - - /** - * Destructor. - * - * This will ensure the flash message is removed and timeout is cleared if the module is removed. - */ - }, { - key: "destruct", - value: function destruct() { - if (this.timer !== null) { - window.clearTimeout(this.timer); - } - if (this.flashTimer) { - this.flashTimer.remove(); - } - if (this.flash) { - this.flash.remove(); - this.flash = null; - this.flashTimer = null; - } - _get(_getPrototypeOf(Flash.prototype), "destruct", this).call(this); - } - - /** - * Creates the flash message. - */ - }, { - key: "create", - value: function create() { - var _this = this; - this.snowboard.globalEvent('flash.create', this); - this.flash = document.createElement('DIV'); - this.flash.innerHTML = this.message; - this.flash.classList.add('flash-message', this.type); - this.flash.removeAttribute('data-control'); - this.flash.addEventListener('click', function () { - return _this.remove(); - }); - this.flash.addEventListener('mouseover', function () { - return _this.stopTimer(); - }); - this.flash.addEventListener('mouseout', function () { - return _this.startTimer(); - }); - if (this.duration > 0) { - this.flashTimer = document.createElement('DIV'); - this.flashTimer.classList.add('flash-timer'); - this.flash.appendChild(this.flashTimer); - } else { - this.flash.classList.add('no-timer'); - } - - // Add to body - document.body.appendChild(this.flash); - this.snowboard.transition(this.flash, 'show', function () { - _this.startTimer(); - }); - } - - /** - * Removes the flash message. - */ - }, { - key: "remove", - value: function remove() { - var _this2 = this; - this.snowboard.globalEvent('flash.remove', this); - this.stopTimer(); - this.snowboard.transition(this.flash, 'hide', function () { - _this2.flash.remove(); - _this2.flash = null; - _this2.destruct(); - }); - } - - /** - * Clears all flash messages available on the page. - */ - }, { - key: "clear", - value: function clear() { - document.querySelectorAll('body > div.flash-message').forEach(function (element) { - return element.remove(); - }); - } - - /** - * Starts the timer for this flash message. - */ - }, { - key: "startTimer", - value: function startTimer() { - var _this3 = this; - if (this.duration === 0) { - return; - } - this.timerTrans = this.snowboard.transition(this.flashTimer, 'timeout', null, "".concat(this.duration, ".0s"), true); - this.timer = window.setTimeout(function () { - return _this3.remove(); - }, this.duration * 1000); - } - - /** - * Resets the timer for this flash message. - */ - }, { - key: "stopTimer", - value: function stopTimer() { - if (this.timerTrans) { - this.timerTrans.cancel(); - } - if (this.timer) { - window.clearTimeout(this.timer); - } - } - }]); -}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/FlashListener.js": -/*!************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/FlashListener.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FlashListener) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Defines a default listener for flash events. - * - * Connects the Flash plugin to various events that use flash messages. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var FlashListener = /*#__PURE__*/function (_Singleton) { - function FlashListener() { - _classCallCheck(this, FlashListener); - return _callSuper(this, FlashListener, arguments); - } - _inherits(FlashListener, _Singleton); - return _createClass(FlashListener, [{ - key: "dependencies", - value: - /** - * Defines dependenices. - * - * @returns {string[]} - */ - function dependencies() { - return ['flash']; - } - - /** - * Defines listeners. - * - * @returns {Object} - */ - }, { - key: "listens", - value: function listens() { - return { - ready: 'ready', - ajaxErrorMessage: 'ajaxErrorMessage', - ajaxFlashMessages: 'ajaxFlashMessages' - }; - } - - /** - * Do flash messages for PHP flash responses. - */ - }, { - key: "ready", - value: function ready() { - var _this = this; - document.querySelectorAll('[data-control="flash-message"]').forEach(function (element) { - _this.snowboard.flash(element.innerHTML, element.dataset.flashType, element.dataset.flashDuration); - element.remove(); - }); - } - - /** - * Shows a flash message for AJAX errors. - * - * @param {string} message - * @returns {Boolean} - */ - }, { - key: "ajaxErrorMessage", - value: function ajaxErrorMessage(message) { - this.snowboard.flash(message, 'error'); - return false; - } - - /** - * Shows flash messages returned directly from AJAX functionality. - * - * @param {Object} messages - */ - }, { - key: "ajaxFlashMessages", - value: function ajaxFlashMessages(messages) { - var _this2 = this; - Object.entries(messages).forEach(function (entry) { - var _entry = _slicedToArray(entry, 2), - cssClass = _entry[0], - message = _entry[1]; - _this2.snowboard.flash(message, cssClass); - }); - return false; - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/FormValidation.js": -/*!*************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/FormValidation.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FormValidation) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Adds AJAX-driven form validation to Snowboard requests. - * - * Documentation for this feature can be found here: - * https://wintercms.com/docs/snowboard/extras#ajax-validation - * - * @copyright 2022 Winter. - * @author Ben Thomson - */ -var FormValidation = /*#__PURE__*/function (_Singleton) { - function FormValidation() { - _classCallCheck(this, FormValidation); - return _callSuper(this, FormValidation, arguments); - } - _inherits(FormValidation, _Singleton); - return _createClass(FormValidation, [{ - key: "construct", - value: - /** - * Constructor. - */ - function construct() { - this.errorBags = []; - } - - /** - * Defines listeners. - * - * @returns {Object} - */ - }, { - key: "listens", - value: function listens() { - return { - ready: 'ready', - ajaxStart: 'clearValidation', - ajaxValidationErrors: 'doValidation' - }; - } - - /** - * Ready event handler. - */ - }, { - key: "ready", - value: function ready() { - this.collectErrorBags(document); - } - - /** - * Retrieves validation errors from an AJAX response and passes them through to the error bags. - * - * This handler returns false to cancel any further validation handling, and prevents the flash - * message that is displayed by default for field errors in AJAX requests from showing. - * - * @param {HTMLFormElement} form - * @param {Object} invalidFields - * @param {Request} request - * @returns {Boolean} - */ - }, { - key: "doValidation", - value: function doValidation(form, invalidFields, request) { - var _this = this; - if (request.element && request.element.dataset.requestValidate === undefined) { - return null; - } - if (!form) { - return null; - } - var errorBags = this.errorBags.filter(function (errorBag) { - return errorBag.form === form; - }); - errorBags.forEach(function (errorBag) { - _this.showErrorBag(errorBag, invalidFields); - }); - return false; - } - - /** - * Clears any validation errors in the given form. - * - * @param {Promise} promise - * @param {Request} request - * @returns {void} - */ - }, { - key: "clearValidation", - value: function clearValidation(promise, request) { - var _this2 = this; - if (request.element && request.element.dataset.requestValidate === undefined) { - return; - } - if (!request.form) { - return; - } - var errorBags = this.errorBags.filter(function (errorBag) { - return errorBag.form === request.form; - }); - errorBags.forEach(function (errorBag) { - _this2.hideErrorBag(errorBag); - }); - } - - /** - * Collects error bags (elements with "data-validate-error" attribute) and links them to a - * placeholder and form. - * - * The error bags will be initially hidden, and will only show when validation errors occur. - * - * @param {HTMLElement} rootNode - */ - }, { - key: "collectErrorBags", - value: function collectErrorBags(rootNode) { - var _this3 = this; - rootNode.querySelectorAll('[data-validate-error], [data-validate-for]').forEach(function (errorBag) { - var form = errorBag.closest('form[data-request-validate]'); - - // If this error bag does not reside within a validating form, remove it - if (!form) { - errorBag.parentNode.removeChild(errorBag); - return; - } - - // Find message list node, if available - var messageListElement = null; - if (errorBag.matches('[data-validate-error]')) { - messageListElement = errorBag.querySelector('[data-message]'); - } - - // Create a placeholder node - var placeholder = document.createComment(''); - - // Register error bag and replace with placeholder - var errorBagData = { - element: errorBag, - form: form, - validateFor: errorBag.dataset.validateFor ? errorBag.dataset.validateFor.split(/\s*,\s*/) : '*', - placeholder: placeholder, - messageListElement: messageListElement ? messageListElement.cloneNode(true) : null, - messageListAnchor: null, - customMessage: errorBag.dataset.validateFor ? errorBag.textContent !== '' || errorBag.childNodes.length > 0 : false - }; - - // If an message list element exists, create another placeholder to act as an anchor point - if (messageListElement) { - var messageListAnchor = document.createComment(''); - messageListElement.parentNode.replaceChild(messageListAnchor, messageListElement); - errorBagData.messageListAnchor = messageListAnchor; - } - errorBag.parentNode.replaceChild(placeholder, errorBag); - _this3.errorBags.push(errorBagData); - }); - } - - /** - * Hides an error bag, replacing the error messages with a placeholder node. - * - * @param {Object} errorBag - */ - }, { - key: "hideErrorBag", - value: function hideErrorBag(errorBag) { - if (errorBag.element.isConnected) { - errorBag.element.parentNode.replaceChild(errorBag.placeholder, errorBag.element); - } - } - - /** - * Shows an error bag with the given invalid fields. - * - * @param {Object} errorBag - * @param {Object} invalidFields - */ - }, { - key: "showErrorBag", - value: function showErrorBag(errorBag, invalidFields) { - if (!this.errorBagValidatesField(errorBag, invalidFields)) { - return; - } - if (!errorBag.element.isConnected) { - errorBag.placeholder.parentNode.replaceChild(errorBag.element, errorBag.placeholder); - } - if (errorBag.validateFor !== '*') { - if (!errorBag.customMessage) { - var firstField = Object.keys(invalidFields).filter(function (field) { - return errorBag.validateFor.includes(field); - }).shift(); - var _invalidFields$firstF = _slicedToArray(invalidFields[firstField], 1); - errorBag.element.innerHTML = _invalidFields$firstF[0]; - } - } else if (errorBag.messageListElement) { - // Remove previous error messages - errorBag.element.querySelectorAll('[data-validation-message]').forEach(function (message) { - message.parentNode.removeChild(message); - }); - Object.entries(invalidFields).forEach(function (entry) { - var _entry = _slicedToArray(entry, 2), - errors = _entry[1]; - errors.forEach(function (error) { - var messageElement = errorBag.messageListElement.cloneNode(true); - messageElement.dataset.validationMessage = ''; - messageElement.innerHTML = error; - errorBag.messageListAnchor.after(messageElement); - }); - }); - } else { - var _invalidFields$Object = _slicedToArray(invalidFields[Object.keys(invalidFields).shift()], 1); - errorBag.element.innerHTML = _invalidFields$Object[0]; - } - } - - /** - * Determines if a given error bag applies for the given invalid fields. - * - * @param {Object} errorBag - * @param {Object} invalidFields - * @returns {Boolean} - */ - }, { - key: "errorBagValidatesField", - value: function errorBagValidatesField(errorBag, invalidFields) { - if (errorBag.validateFor === '*') { - return true; - } - return Object.keys(invalidFields).filter(function (field) { - return errorBag.validateFor.includes(field); - }).length > 0; - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/StripeLoader.js": -/*!***********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/StripeLoader.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ StripeLoader) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Displays a stripe at the top of the page that indicates loading. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var StripeLoader = /*#__PURE__*/function (_Singleton) { - function StripeLoader() { - _classCallCheck(this, StripeLoader); - return _callSuper(this, StripeLoader, arguments); - } - _inherits(StripeLoader, _Singleton); - return _createClass(StripeLoader, [{ - key: "dependencies", - value: - /** - * Defines dependenices. - * - * @returns {string[]} - */ - function dependencies() { - return ['request']; - } - - /** - * Defines listeners. - * - * @returns {Object} - */ - }, { - key: "listens", - value: function listens() { - return { - ready: 'ready', - ajaxStart: 'ajaxStart' - }; - } - }, { - key: "ready", - value: function ready() { - this.counter = 0; - this.createStripe(); - } - }, { - key: "ajaxStart", - value: function ajaxStart(promise, request) { - var _this = this; - if (request.options.stripe === false) { - return; - } - this.show(); - promise.then(function () { - _this.hide(); - })["catch"](function () { - _this.hide(); - }); - } - }, { - key: "createStripe", - value: function createStripe() { - this.indicator = document.createElement('DIV'); - this.stripe = document.createElement('DIV'); - this.stripeLoaded = document.createElement('DIV'); - this.indicator.classList.add('stripe-loading-indicator', 'loaded'); - this.stripe.classList.add('stripe'); - this.stripeLoaded.classList.add('stripe-loaded'); - this.indicator.appendChild(this.stripe); - this.indicator.appendChild(this.stripeLoaded); - document.body.appendChild(this.indicator); - } - }, { - key: "show", - value: function show() { - this.counter += 1; - var newStripe = this.stripe.cloneNode(true); - this.indicator.appendChild(newStripe); - this.stripe.remove(); - this.stripe = newStripe; - if (this.counter > 1) { - return; - } - this.indicator.classList.remove('loaded'); - document.body.classList.add('wn-loading'); - } - }, { - key: "hide", - value: function hide(force) { - this.counter -= 1; - if (force === true) { - this.counter = 0; - } - if (this.counter <= 0) { - this.indicator.classList.add('loaded'); - document.body.classList.remove('wn-loading'); - } - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js": -/*!***************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ StylesheetLoader) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Embeds the "extras" stylesheet into the page, if it is not loaded through the theme. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var StylesheetLoader = /*#__PURE__*/function (_Singleton) { - function StylesheetLoader() { - _classCallCheck(this, StylesheetLoader); - return _callSuper(this, StylesheetLoader, arguments); - } - _inherits(StylesheetLoader, _Singleton); - return _createClass(StylesheetLoader, [{ - key: "listens", - value: - /** - * Defines listeners. - * - * @returns {Object} - */ - function listens() { - return { - ready: 'ready' - }; - } - }, { - key: "ready", - value: function ready() { - var stylesLoaded = false; - - // Determine if stylesheet is already loaded - document.querySelectorAll('link[rel="stylesheet"]').forEach(function (css) { - if (css.href.endsWith('/modules/system/assets/css/snowboard.extras.css')) { - stylesLoaded = true; - } - }); - if (!stylesLoaded) { - var stylesheet = document.createElement('link'); - stylesheet.setAttribute('rel', 'stylesheet'); - stylesheet.setAttribute('href', this.snowboard.url().asset('/modules/system/assets/css/snowboard.extras.css')); - document.head.appendChild(stylesheet); - } - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/Transition.js": -/*!*********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/Transition.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Transition) -/* harmony export */ }); -/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Provides transition support for elements. - * - * Transition allows CSS transitions to be controlled and callbacks to be run once completed. It works similar to Vue - * transitions with 3 stages of transition, and classes assigned to the element with the transition name suffixed with - * the stage of transition: - * - * - `in`: A class assigned to the element for the first frame of the transition, removed afterwards. This should be - * used to define the initial state of the transition. - * - `active`: A class assigned to the element for the duration of the transition. This should be used to define the - * transition itself. - * - `out`: A class assigned to the element after the first frame of the transition and kept to the end of the - * transition. This should define the end state of the transition. - * - * Usage: - * Snowboard.transition(document.element, 'transition', () => { - * console.log('Remove element after 7 seconds'); - * this.remove(); - * }, '7s'); - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var Transition = /*#__PURE__*/function (_PluginBase) { - function Transition() { - _classCallCheck(this, Transition); - return _callSuper(this, Transition, arguments); - } - _inherits(Transition, _PluginBase); - return _createClass(Transition, [{ - key: "construct", - value: - /** - * Constructor. - * - * @param {HTMLElement} element The element to transition - * @param {string} transition The name of the transition, this prefixes the stages of transition. - * @param {Function} callback An optional callback to call when the transition ends. - * @param {Number} duration An optional override on the transition duration. Must be specified as 's' (secs) or 'ms' (msecs). - * @param {Boolean} trailTo If true, the "out" class will remain after the end of the transition. - */ - function construct(element, transition, callback, duration, trailTo) { - if (element instanceof HTMLElement === false) { - throw new Error('A HTMLElement must be provided for transitioning'); - } - this.element = element; - if (typeof transition !== 'string') { - throw new Error('Transition name must be specified as a string'); - } - this.transition = transition; - if (callback && typeof callback !== 'function') { - throw new Error('Callback must be a valid function'); - } - this.callback = callback; - if (duration) { - this.duration = this.parseDuration(duration); - } else { - this.duration = null; - } - this.trailTo = trailTo === true; - this.doTransition(); - } - - /** - * Maps event classes to the given transition state. - * - * @param {...any} args - * @returns {Array} - */ - }, { - key: "eventClasses", - value: function eventClasses() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - var eventClasses = { - "in": "".concat(this.transition, "-in"), - active: "".concat(this.transition, "-active"), - out: "".concat(this.transition, "-out") - }; - if (args.length === 0) { - return Object.values(eventClasses); - } - var returnClasses = []; - Object.entries(eventClasses).forEach(function (entry) { - var _entry = _slicedToArray(entry, 2), - key = _entry[0], - value = _entry[1]; - if (args.indexOf(key) !== -1) { - returnClasses.push(value); - } - }); - return returnClasses; - } - - /** - * Executes the transition. - * - * @returns {void} - */ - }, { - key: "doTransition", - value: function doTransition() { - var _this = this; - // Add duration override - if (this.duration !== null) { - this.element.style.transitionDuration = this.duration; - } - this.resetClasses(); - - // Start transition - show "in" and "active" classes - this.eventClasses('in', 'active').forEach(function (eventClass) { - _this.element.classList.add(eventClass); - }); - window.requestAnimationFrame(function () { - // Ensure a transition exists - if (window.getComputedStyle(_this.element)['transition-duration'] !== '0s') { - // Listen for the transition to end - _this.element.addEventListener('transitionend', function () { - return _this.onTransitionEnd(); - }, { - once: true - }); - window.requestAnimationFrame(function () { - _this.element.classList.remove(_this.eventClasses('in')[0]); - _this.element.classList.add(_this.eventClasses('out')[0]); - }); - } else { - _this.resetClasses(); - if (_this.callback) { - _this.callback.apply(_this.element); - } - _this.destruct(); - } - }); - } - - /** - * Callback function when the transition ends. - * - * When a transition ends, the instance of the transition is automatically destructed. - * - * @returns {void} - */ - }, { - key: "onTransitionEnd", - value: function onTransitionEnd() { - var _this2 = this; - this.eventClasses('active', !this.trailTo ? 'out' : '').forEach(function (eventClass) { - _this2.element.classList.remove(eventClass); - }); - if (this.callback) { - this.callback.apply(this.element); - } - - // Remove duration override - if (this.duration !== null) { - this.element.style.transitionDuration = null; - } - this.destruct(); - } - - /** - * Cancels a transition. - * - * @returns {void} - */ - }, { - key: "cancel", - value: function cancel() { - var _this3 = this; - this.element.removeEventListener('transitionend', function () { - return _this3.onTransitionEnd; - }, { - once: true - }); - this.resetClasses(); - - // Remove duration override - if (this.duration !== null) { - this.element.style.transitionDuration = null; - } - - // Call destructor - this.destruct(); - } - - /** - * Resets the classes, removing any transition classes. - * - * @returns {void} - */ - }, { - key: "resetClasses", - value: function resetClasses() { - var _this4 = this; - this.eventClasses().forEach(function (eventClass) { - _this4.element.classList.remove(eventClass); - }); - } - - /** - * Parses a given duration and converts it to a "ms" value. - * - * @param {String} duration - * @returns {String} - */ - }, { - key: "parseDuration", - value: function parseDuration(duration) { - var parsed = /^([0-9]+(\.[0-9]+)?)(m?s)?$/.exec(duration); - var amount = Number(parsed[1]); - var unit = parsed[3] === 's' ? 'sec' : 'msec'; - return unit === 'sec' ? "".concat(amount * 1000, "ms") : "".concat(Math.floor(amount), "ms"); - } - }]); -}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/extras/Trigger.js": -/*!******************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/extras/Trigger.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Trigger) -/* harmony export */ }); -/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } -function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } -function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * @typedef {Object} TriggerEntity - * @property {string} trigger The selector for the trigger target element(s). - * @property {string} condition The condition that must be met for the trigger to fire. - * @property {string} action The action to perform when the trigger fires. - * @property {string|undefined} parent The parent element with which to limit the trigger scope. - * @property {string|number} priority The priority of the trigger event. - * @property {HTMLElement[]} elements The target elements that this trigger applies to. - * @property {Function[]} conditionCallbacks The condition callbacks for this trigger. - * @property {Map>} elementEvents The events registered on the target elements. - */ -/** - * @typedef {Object} TriggerElement - * @property {HTMLElement} element The target element. - * @property {string} eventName The trigger event name. - * @property {int} priority The trigger event priority. - * @property {Function} event The trigger event function. - */ - -/** - * Trigger handler for HTML elements. - * - * This is a re-imagining of the Input.Trigger functionality in the original Winter CMS framework, - * initialised through the `data-trigger` attributes. - * - * In addition to remaining backwards-compatible with the original Input.Trigger functionality, this - * handler adds additional conditions and configuration for more flexible trigger usage. - * - * @see https://wintercms.com/docs/v1.2/ui/script/input-trigger - * - * @copyright 2024 Winter. - * @author Ben Thomson - */ -var Trigger = /*#__PURE__*/function (_PluginBase) { - function Trigger() { - _classCallCheck(this, Trigger); - return _callSuper(this, Trigger, arguments); - } - _inherits(Trigger, _PluginBase); - return _createClass(Trigger, [{ - key: "construct", - value: - /** - * Constructor. - * - * @param {HTMLElement} element - */ - function construct(element) { - /** - * The element this instance is attached to. - */ - this.element = element; - - /** - * @type {Map} The triggers for this element. - */ - this.triggers = new Map(); - - /** - * @type {Map>} A map of elements that trigger events. - */ - this.events = new Map(); - - /** - * @type {Map>} A map of elements and their event connectors. - */ - this.connectors = new Map(); - this.parseTriggers(); - if (this.triggers.size > 0) { - this.resetEvents(); - this.createTriggerEvents(); - this.runEvents(); - this.snowboard.globalEvent('triggers.ready', this.element); - } - } - - /** - * Destructor. - */ - }, { - key: "destruct", - value: function destruct() { - this.resetEvents(); - _get(_getPrototypeOf(Trigger.prototype), "destruct", this).call(this); - } - - /** - * Parses the element's data attributes and determines applicable triggers. - * - * Trigger data attributes must be in the format `data-trigger-[name]-[parameter]` for multiple - * triggers, or `data-trigger-[parameter]` for single triggers. - * - * Supported parameters are: - * - `condition` or `where`: The condition that must be met for the trigger to fire. - * - `action` or `do`: The action to perform when the trigger fires. - * - `closest-parent` or `parent`: The parent element with which to limit the trigger scope. - * - `priority`: The priority in which to consider the trigger. - * - * Internally, the trigger map uses the `trigger` parameter to store the trigger selector. - */ - }, { - key: "parseTriggers", - value: function parseTriggers() { - var _this = this; - var dataset = this.element.dataset; - this.triggers.clear(); - Object.keys(dataset).forEach(function (key) { - if (/-[A-Z]/.test(key)) { - throw new Error("Unable to convert camelCase to dash-style for data attribute: ".concat(key)); - } - var dashStyle = key.replace(/([A-Z])/g, function (match) { - return "-".concat(match.toLowerCase()); - }); - if (dashStyle !== 'trigger' && !dashStyle.startsWith('trigger-')) { - return; - } - var triggerParts = /([a-z0-9\-.:_]+?)(?:(?:-)(closest-parent|condition|when|action|parent|priority|do))?$/i.exec(dashStyle.replace('trigger-', '').toLowerCase()); - var triggerName = null; - var triggerType = null; - if (['trigger', 'condition', 'action', 'parent', 'when', 'closest'].indexOf(triggerParts[1]) !== -1 && (triggerParts[1] !== 'closest' || triggerParts[1] === 'closest' && triggerParts[2] === 'parent')) { - // Support original trigger format - triggerName = '__original'; - triggerType = triggerParts[1] === 'closest' ? 'parent' : triggerParts[1]; - } else if (triggerParts[2] === undefined || ['closest-parent', 'condition', 'when', 'action', 'parent', 'priority', 'do'].indexOf(triggerParts[2]) !== -1) { - // Parse multi-trigger format - var _triggerParts = _slicedToArray(triggerParts, 2); - triggerName = _triggerParts[1]; - switch (triggerParts[2]) { - case 'closest-parent': - case 'parent': - triggerType = 'parent'; - break; - case 'condition': - case 'when': - triggerType = 'condition'; - break; - case 'action': - case 'do': - triggerType = 'action'; - break; - case 'priority': - triggerType = 'priority'; - break; - default: - triggerType = 'trigger'; - break; - } - } - if (!_this.triggers.has(triggerName)) { - _this.triggers.set(triggerName, new Map()); - } - _this.triggers.get(triggerName).set(triggerType, dataset[key]); - - // Remove trigger data attribute after parsing - delete dataset[key]; - }); - - // Validate triggers, and remove those that do not have at least a trigger selector, a - // condition and an action, or are using invalid conditions or actions - this.triggers.forEach(function (trigger, name) { - var elements = _this.getSelectableElements(trigger); - if (!trigger.has('trigger') || !trigger.has('condition') || !trigger.has('action') || elements.length === 0 || !_this.hasValidConditions(trigger) || !_this.hasValidActions(trigger)) { - _this.triggers["delete"](name); - } else { - trigger.set('elements', elements); - if (!trigger.has('priority')) { - trigger.set('priority', 100); - } - } - }); - } - - /** - * Parses a command given as either a condition or an action. - * - * Commands are formatted as: name:parameter1,parameter2,parameter3, although we also support - * the old format of value[parameter1,parameter2,parameter3] for the `value` command only. - * - * If a parameter requires a comma within, the parameter should be wrapped in quotes. - * - * Multiple commands can be separated by a pipe character `|`. - * - * @param {string} command - * @param {string} allowMultiple - * @returns {{name: string, parameters: string[]}[]} - */ - }, { - key: "parseCommand", - value: function parseCommand(command) { - var _this2 = this; - var allowMultiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - // Support old-format value command (value[foo,bar]) - if (command.startsWith('value') && command.includes('[')) { - var match = command.match(/[^[\]]+(?=])/g); - var values = []; - - // Split values with commas - match.forEach(function (value) { - if (!value.includes(',')) { - values.push(value.replace(/^['"]|['"]$/g, '').trim()); - return; - } - var splitValues = value.replace(/('.*?(?} trigger - * @returns {HTMLElement[]} - */ - }, { - key: "getSelectableElements", - value: function getSelectableElements(trigger) { - if (trigger.has('parent')) { - return Array.from(this.element.closest(trigger.get('parent')).querySelectorAll(trigger.get('trigger'))); - } - return Array.from(document.querySelectorAll(trigger.get('trigger'))); - } - - /** - * Determines if the provided trigger condition(s) are valid. - * - * @param {TriggerEntity} trigger - * @returns {boolean} - */ - }, { - key: "hasValidConditions", - value: function hasValidConditions(trigger) { - return this.parseCommand(trigger.get('condition')).every(function (condition) { - return ['checked', 'unchecked', 'empty', 'value', 'oneof', 'allof', 'focus', 'blur', 'attr', 'class'].includes(condition.name.toLowerCase()); - }); - } - - /** - * Determines if the provided trigger action(s) are valid. - * - * @param {TriggerEntity} trigger - * @returns {boolean} - */ - }, { - key: "hasValidActions", - value: function hasValidActions(trigger) { - return this.parseCommand(trigger.get('action')).every(function (action) { - return ['show', 'hide', 'enable', 'disable', 'empty', 'value', 'valueOf', 'check', 'uncheck', 'class', 'classOf', 'attr', 'attrOf', 'style', 'styleOf'].includes(action.name.toLowerCase()); - }); - } - - /** - * Create trigger events on trigger and target elements. - */ - }, { - key: "createTriggerEvents", - value: function createTriggerEvents() { - var _this3 = this; - this.triggers.forEach(function (trigger) { - // Collect conditions and check them as a group. - trigger.set('conditionCallbacks', []); - trigger.set('elementEvents', new Map()); - _this3.parseCommand(trigger.get('condition')).forEach(function (condition) { - switch (condition.name.toLowerCase()) { - case 'value': - case 'oneof': - trigger.get('conditionCallbacks').push(_this3.createValueCondition.apply(_this3, [trigger, false].concat(_toConsumableArray(condition.parameters)))); - break; - case 'allof': - trigger.get('conditionCallbacks').push(_this3.createValueCondition.apply(_this3, [trigger, true].concat(_toConsumableArray(condition.parameters)))); - break; - case 'empty': - trigger.get('conditionCallbacks').push(_this3.createEmptyCondition(trigger)); - break; - case 'checked': - case 'unchecked': - trigger.get('conditionCallbacks').push(_this3.createCheckedCondition.apply(_this3, [trigger, condition.name === 'checked'].concat(_toConsumableArray(condition.parameters)))); - break; - default: - } - }); - }); - this.registerEventListeners(); - } - - /** - * Adds an event to an element. - * - * This registers the event in the `elementEvents` map for later usage and removal. - * - * @param {HTMLElement} element - * @param {TriggerEntity} trigger - * @param {string} eventName - */ - }, { - key: "addEvent", - value: function addEvent(element, trigger, eventName) { - if (!trigger.get('elementEvents').has(element)) { - trigger.get('elementEvents').set(element, new Set()); - } - if (!trigger.get('elementEvents').get(element).add(eventName)) { - trigger.get('elementEvents').get(element).add(eventName); - } - } - - /** - * Registers DOM event listeners for targeted elements of all triggers. - * - * Adds a connector to the element for the events, so that we may enable prioritisation and - * control over the firing of the events, and then registers DOM event listeners for the - * elements. - */ - }, { - key: "registerEventListeners", - value: function registerEventListeners() { - var _this4 = this; - var connectors = new Set(); - this.triggers.forEach(function (trigger) { - trigger.get('elementEvents').forEach(function (events, element) { - if (!_this4.events.has(element)) { - _this4.events.set(element, new Set()); - } - events.forEach(function (eventName) { - if (!connectors.has({ - element: element, - eventName: eventName - })) { - connectors.add({ - element: element, - eventName: eventName - }); - } - var event = { - element: element, - eventName: eventName, - priority: Number(trigger.get('priority')), - event: function event() { - _this4.executeActions(trigger, trigger.get('conditionCallbacks').every(function (condition) { - return condition(); - })); - } - }; - _this4.events.get(element).add(event); - }); - }); - }); - connectors.forEach(function (_ref) { - var element = _ref.element, - eventName = _ref.eventName; - if (!_this4.connectors.has(element)) { - _this4.connectors.set(element, new Map()); - } - if (!_this4.connectors.get(element).has(eventName)) { - _this4.connectors.get(element).set(eventName, function () { - var events = []; - _this4.events.get(element).forEach(function (elementEvent) { - if (elementEvent.eventName === eventName) { - events.push(elementEvent); - } - }); - events.sort(function (a, b) { - return a.priority - b.priority; - }).forEach(function (elementEvent) { - elementEvent.event(); - }); - }); - element.addEventListener(eventName, _this4.connectors.get(element).get(eventName)); - } - }); - } - - /** - * Creates a trigger that fires when the value of the target element(s) matches one of the - * provided values. - * - * @param {TriggerEntity} trigger - * @param {...string} values - */ - }, { - key: "createValueCondition", - value: function createValueCondition(trigger, all) { - var _this5 = this; - for (var _len = arguments.length, values = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - values[_key - 2] = arguments[_key]; - } - var supportedElements = new Set(); - trigger.get('elements').forEach(function (element) { - if (element.matches('input[type=button], input[type=file], input[type=image], input[type=reset], input[type=submit]')) { - // Buttons and file inputs are unsupported - return; - } - if (element.matches('input, select, textarea')) { - supportedElements.add(element); - } - }); - supportedElements.forEach(function (element) { - if (element.matches('input[type=checkbox], input[type=radio]')) { - _this5.addEvent(element, trigger, 'click'); - } - _this5.addEvent(element, trigger, 'input'); - }); - return function () { - var elementValues = new Set(); - supportedElements.forEach(function (element) { - if (element.matches('input[type=checkbox], input[type=radio]')) { - if (element.checked) { - elementValues.add(element.value); - } - return; - } - elementValues.add(element.value); - }); - if (all) { - return values.every(function (value) { - return elementValues.has(value); - }); - } - return values.some(function (value) { - return elementValues.has(value); - }); - }; - } - - /** - * Creates a trigger that fires when there is no value within the target element(s). - * - * @param {TriggerEntity} trigger - */ - }, { - key: "createEmptyCondition", - value: function createEmptyCondition(trigger) { - var _this6 = this; - var supportedElements = new Set(); - trigger.get('elements').forEach(function (element) { - if (element.matches('input[type=button], input[type=image], input[type=reset], input[type=submit]')) { - // Buttons and file inputs are unsupported - return; - } - if (element.matches('input, select, textarea')) { - supportedElements.add(element); - } - }); - supportedElements.forEach(function (element) { - if (element.matches('input[type=checkbox], input[type=radio]')) { - _this6.addEvent(element, trigger, 'click'); - return; - } - _this6.addEvent(element, trigger, 'input'); - }); - return function () { - var elementValues = new Set(); - supportedElements.forEach(function (element) { - if (element.matches('input[type=checkbox], input[type=radio]')) { - if (element.checked) { - elementValues.add(element); - } - return; - } - if (element.value.trim() !== '') { - elementValues.add(element); - } - }); - return elementValues.size === 0; - }; - } - - /** - * Creates a trigger that fires when a target element(s) is checked/unchecked. - * - * @param {TriggerEntity} trigger - * @param {boolean} checked If the element should be checked or unchecked. - * @param {string|number|undefined} atLeast The minimum number of elements that must be checked. - * Defaults to 1 if undefined. If specified as `all`, all elements must be checked. - */ - }, { - key: "createCheckedCondition", - value: function createCheckedCondition(trigger, checked) { - var _this7 = this; - var atLeast = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - var atMost = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; - var supportedElements = new Set(); - trigger.get('elements').forEach(function (element) { - // Only supports checkboxes and radio buttons - if (element.matches('input[type=radio], input[type=checkbox]')) { - supportedElements.add(element); - } - }); - supportedElements.forEach(function (element) { - _this7.addEvent(element, trigger, 'click'); - }); - return function () { - var elementValues = new Set(); - supportedElements.forEach(function (element) { - if (checked === element.checked) { - elementValues.add(element); - } - }); - if (atLeast === 'all') { - return elementValues.size === supportedElements.size; - } - var atLeastCount = atLeast !== undefined && Math.floor(atLeast) > 0 ? Math.floor(atLeast) : 1; - var atMostCount = atLeast !== undefined && Math.floor(atMost) > 1 ? Math.floor(atMost) : supportedElements.size; - return elementValues.size >= atLeastCount && elementValues.size <= atMostCount; - }; - } - - /** - * Manually runs all registered triggers. - * - * This can be used to update the state of the triggers. - */ - }, { - key: "runEvents", - value: function runEvents() { - this.connectors.forEach(function (elementConnectors) { - elementConnectors.forEach(function (connector) { - connector(); - }); - }); - } - - /** - * Clears all registered events. - * - * This will disable all triggers and their event listeners on the target elements. - */ - }, { - key: "resetEvents", - value: function resetEvents() { - this.connectors.forEach(function (elementConnectors, element) { - elementConnectors.forEach(function (connector, event) { - element.removeEventListener(event, connector); - }); - }); - this.connectors.clear(); - this.events.clear(); - } - - /** - * Executes actions based on the trigger condition. - * - * Actions should be binary, and show one state when the condition is met, and another when it - * is not. The second parameter is used to determine if the conditions of the trigger have been - * met. If a trigger has multiple conditions, ALL conditions must be met. - * - * @param {TriggerEntity} trigger - * @param {boolean} conditionMet - */ - }, { - key: "executeActions", - value: function executeActions(trigger, conditionMet) { - var _this8 = this; - this.parseCommand(trigger.get('action')).forEach(function (action) { - switch (action.name) { - case 'show': - case 'hide': - _this8.actionShow(trigger, action.parameters[0] ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element], action.name === 'show' ? conditionMet : !conditionMet); - break; - case 'enable': - case 'disable': - _this8.actionEnable(trigger, action.parameters[0] ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element], action.name === 'enable' ? conditionMet : !conditionMet); - break; - case 'empty': - if (conditionMet) { - _this8.actionValue(trigger, conditionMet, action.parameters[0] ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element], ''); - } - break; - case 'value': - case 'valueOf': - _this8.actionValue.apply(_this8, [trigger, conditionMet, action.name === 'valueOf' ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element]].concat(_toConsumableArray(action.parameters.length > 0 && action.name === 'valueOf' ? action.parameters.slice(1) : action.parameters))); - break; - case 'class': - case 'classOf': - _this8.actionClass.apply(_this8, [trigger, conditionMet, action.name === 'classOf' ? Array.from(_this8.element.querySelectorAll(action.parameters[0])) : [_this8.element]].concat(_toConsumableArray(action.name === 'classOf' ? action.parameters.slice(1) : action.parameters))); - default: - } - }); - } - - /** - * Shows or hides a trigger element. - * - * This action will toggle the `hide` class on the element, and set the `display` style to - * `none` when hidden, and the original display value when shown. - * - * @param {TriggerEntity} trigger - * @param {HTMLElement[]} elements - * @param {boolean} show - */ - }, { - key: "actionShow", - value: function actionShow(trigger, elements, show) { - var _this9 = this; - elements.forEach(function (element) { - if (show && getComputedStyle(element).display === 'none') { - element.classList.remove('hide'); - if (!element.dataset.originalDisplay) { - element.style.display = 'block'; - } else { - element.style.display = element.dataset.originalDisplay; - } - delete element.dataset.originalDisplay; - _this9.afterAction(trigger, element); - } else if (!show && getComputedStyle(element).display !== 'none') { - element.classList.add('hide'); - element.dataset.originalDisplay = getComputedStyle(element).display; - element.style.display = 'none'; - _this9.afterAction(trigger, element); - } - }); - } - - /** - * Enables or disables a trigger element. - * - * This action will toggle the `control-disabled` class on the element, and set the `disabled` - * property to `true` when disabled, and `false` when enabled. - * - * @param {TriggerEntity} trigger - * @param {HTMLElement[]} elements - * @param {boolean} enable - */ - }, { - key: "actionEnable", - value: function actionEnable(trigger, elements, enable) { - var _this10 = this; - elements.forEach(function (element) { - element.classList[enable ? 'remove' : 'add']('control-disabled'); - if (element.disabled !== undefined) { - element.disabled = !enable; - } - _this10.afterAction(trigger, element); - }); - } - - /** - * Sets the value of either the trigger element or a child element(s) within. - * - * This is a one-way action if the unmet value is not defined. - */ - }, { - key: "actionValue", - value: function actionValue(trigger, conditionMet, elements, value) { - var _this11 = this; - var unmetValue = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; - if (!conditionMet && unmetValue === undefined) { - return; - } - var newValue = conditionMet ? value : unmetValue; - elements.forEach(function (element) { - if (element.matches('input[type=checkbox], input[type=radio]')) { - element.checked = element.value === newValue; - return; - } - if (element.matches('input, select, textarea')) { - element.value = newValue; - return; - } - element.textContent = newValue; - _this11.afterAction(trigger); - }); - } - - /** - * Adds or removes the class from the trigger element or a child element(s) within. - * - * This will simply remove the class if the unmet class is not defined. Otherwise, the classes - * will be toggled. - */ - }, { - key: "actionClass", - value: function actionClass(trigger, conditionMet, elements, cssClass) { - var _this12 = this; - var unmetCssClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; - elements.forEach(function (element) { - if (conditionMet) { - element.classList.add(cssClass); - if (unmetCssClass) { - element.classList.remove(unmetCssClass); - } - } else { - element.classList.remove(cssClass); - if (unmetCssClass) { - element.classList.add(unmetCssClass); - } - } - _this12.afterAction(trigger); - }); - } - }, { - key: "afterAction", - value: function afterAction(trigger, element) { - this.snowboard.debug('Trigger fired', element, trigger); - this.snowboard.globalEvent('trigger.fired', element, trigger); - } - }]); -}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js": -/*!**************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js ***! - \**************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/** - * Internal proxy for Snowboard. - * - * This handler wraps the Snowboard instance that is passed to the constructor of plugin instances. - * It prevents access to the following methods: - * - `attachAbstracts`: No need to attach abstracts again. - * - `loadUtilties`: No need to load utilities again. - * - `initialise`: Snowboard is already initialised. - * - `initialiseSingletons`: Singletons are already initialised. - */ -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - get: function get(target, prop, receiver) { - if (typeof prop === 'string') { - var propLower = prop.toLowerCase(); - if (['attachAbstracts', 'loadUtilities', 'initialise', 'initialiseSingletons'].includes(prop)) { - throw new Error("You cannot use the \"".concat(prop, "\" Snowboard method within a plugin.")); - } - if (target.hasPlugin(propLower)) { - return function () { - var _Reflect$get$propLowe; - return (_Reflect$get$propLowe = Reflect.get(target, 'plugins')[propLower]).getInstance.apply(_Reflect$get$propLowe, arguments); - }; - } - } - return Reflect.get(target, prop, receiver); - }, - has: function has(target, prop) { - if (typeof prop === 'string') { - var propLower = prop.toLowerCase(); - if (['attachAbstracts', 'loadUtilities', 'initialise', 'initialiseSingletons'].includes(prop)) { - return false; - } - if (target.hasPlugin(propLower)) { - return true; - } - } - return Reflect.has(target, prop); - } -}); - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/main/PluginLoader.js": -/*!*********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/main/PluginLoader.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ PluginLoader) -/* harmony export */ }); -/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -/* harmony import */ var _InnerProxyHandler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./InnerProxyHandler */ "../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - -/** - * Plugin loader class. - * - * This is a provider (factory) class for a single plugin and provides the link between Snowboard framework functionality - * and the underlying plugin instances. It also provides some basic mocking of plugin methods for testing. - * - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var PluginLoader = /*#__PURE__*/function () { - /** - * Constructor. - * - * Binds the Winter framework to the instance. - * - * @param {string} name - * @param {Snowboard} snowboard - * @param {PluginBase} instance - */ - function PluginLoader(name, snowboard, instance) { - _classCallCheck(this, PluginLoader); - this.name = name; - this.snowboard = new Proxy(snowboard, _InnerProxyHandler__WEBPACK_IMPORTED_MODULE_2__["default"]); - this.instance = instance; - - // Freeze instance that has been inserted into this loader - Object.freeze(this.instance); - this.instances = []; - this.singleton = { - initialised: false - }; - // Prevent further extension of the singleton status object - Object.seal(this.singleton); - this.mocks = {}; - this.originalFunctions = {}; - - // Freeze loader itself - Object.freeze(PluginLoader.prototype); - Object.freeze(this); - } - - /** - * Determines if the current plugin has a specific method available. - * - * Returns false if the current plugin is a callback function. - * - * @param {string} methodName - * @returns {boolean} - */ - return _createClass(PluginLoader, [{ - key: "hasMethod", - value: function hasMethod(methodName) { - if (this.isFunction()) { - return false; - } - return typeof this.instance.prototype[methodName] === 'function'; - } - - /** - * Calls a prototype method for a plugin. This should generally be used for "static" calls. - * - * @param {string} methodName - * @param {...} args - * @returns {any} - */ - }, { - key: "callMethod", - value: function callMethod() { - if (this.isFunction()) { - return null; - } - for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) { - parameters[_key] = arguments[_key]; - } - var args = parameters; - var methodName = args.shift(); - return this.instance.prototype[methodName](args); - } - - /** - * Returns an instance of the current plugin. - * - * - If this is a callback function plugin, the function will be returned. - * - If this is a singleton, the single instance of the plugin will be returned. - * - * @returns {PluginBase|Function} - */ - }, { - key: "getInstance", - value: function getInstance() { - var _this = this; - for (var _len2 = arguments.length, parameters = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - parameters[_key2] = arguments[_key2]; - } - if (this.isFunction()) { - return this.instance.apply(this, parameters); - } - if (!this.dependenciesFulfilled()) { - var unmet = this.getDependencies().filter(function (item) { - return !_this.snowboard.getPluginNames().includes(item); - }); - throw new Error("The \"".concat(this.name, "\" plugin requires the following plugins: ").concat(unmet.join(', '))); - } - if (this.isSingleton()) { - if (this.instances.length === 0) { - this.initialiseSingleton.apply(this, parameters); - } - - // Apply mocked methods - if (Object.keys(this.mocks).length > 0) { - Object.entries(this.originalFunctions).forEach(function (entry) { - var _entry = _slicedToArray(entry, 2), - methodName = _entry[0], - callback = _entry[1]; - _this.instances[0][methodName] = callback; - }); - Object.entries(this.mocks).forEach(function (entry) { - var _entry2 = _slicedToArray(entry, 2), - methodName = _entry2[0], - callback = _entry2[1]; - _this.instances[0][methodName] = function () { - for (var _len3 = arguments.length, params = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - params[_key3] = arguments[_key3]; - } - return callback.apply(void 0, [_this].concat(params)); - }; - }); - } - return this.instances[0]; - } - - // Apply mocked methods to prototype - if (Object.keys(this.mocks).length > 0) { - Object.entries(this.originalFunctions).forEach(function (entry) { - var _entry3 = _slicedToArray(entry, 2), - methodName = _entry3[0], - callback = _entry3[1]; - _this.instance.prototype[methodName] = callback; - }); - Object.entries(this.mocks).forEach(function (entry) { - var _entry4 = _slicedToArray(entry, 2), - methodName = _entry4[0], - callback = _entry4[1]; - _this.instance.prototype[methodName] = function () { - for (var _len4 = arguments.length, params = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - params[_key4] = arguments[_key4]; - } - return callback.apply(void 0, [_this].concat(params)); - }; - }); - } - var newInstance = _construct(this.instance, [this.snowboard].concat(parameters)); - newInstance.detach = function () { - return _this.instances.splice(_this.instances.indexOf(newInstance), 1); - }; - newInstance.construct.apply(newInstance, parameters); - this.instances.push(newInstance); - return newInstance; - } - - /** - * Gets all instances of the current plugin. - * - * If this plugin is a callback function plugin, an empty array will be returned. - * - * @returns {PluginBase[]} - */ - }, { - key: "getInstances", - value: function getInstances() { - if (this.isFunction()) { - return []; - } - return this.instances; - } - - /** - * Determines if the current plugin is a simple callback function. - * - * @returns {boolean} - */ - }, { - key: "isFunction", - value: function isFunction() { - return typeof this.instance === 'function' && this.instance.prototype instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false; - } - - /** - * Determines if the current plugin is a singleton. - * - * @returns {boolean} - */ - }, { - key: "isSingleton", - value: function isSingleton() { - return this.instance.prototype instanceof _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"] === true; - } - - /** - * Determines if a singleton has been initialised. - * - * Normal plugins will always return true. - * - * @returns {boolean} - */ - }, { - key: "isInitialised", - value: function isInitialised() { - if (!this.isSingleton()) { - return true; - } - return this.singleton.initialised; - } - - /** - * Initialises the singleton instance. - * - * @returns {void} - */ - }, { - key: "initialiseSingleton", - value: function initialiseSingleton() { - var _this2 = this; - if (!this.isSingleton()) { - return; - } - for (var _len5 = arguments.length, parameters = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - parameters[_key5] = arguments[_key5]; - } - var newInstance = _construct(this.instance, [this.snowboard].concat(parameters)); - newInstance.detach = function () { - return _this2.instances.splice(_this2.instances.indexOf(newInstance), 1); - }; - newInstance.construct.apply(newInstance, parameters); - this.instances.push(newInstance); - this.singleton.initialised = true; - } - - /** - * Gets the dependencies of the current plugin. - * - * @returns {string[]} - */ - }, { - key: "getDependencies", - value: function getDependencies() { - // Callback functions cannot have dependencies. - if (this.isFunction()) { - return []; - } - - // No dependency method specified. - if (typeof this.instance.prototype.dependencies !== 'function') { - return []; - } - return this.instance.prototype.dependencies().map(function (item) { - return item.toLowerCase(); - }); - } - - /** - * Determines if the current plugin has all its dependencies fulfilled. - * - * @returns {boolean} - */ - }, { - key: "dependenciesFulfilled", - value: function dependenciesFulfilled() { - var _this3 = this; - var dependencies = this.getDependencies(); - var fulfilled = true; - dependencies.forEach(function (plugin) { - if (!_this3.snowboard.hasPlugin(plugin)) { - fulfilled = false; - } - }); - return fulfilled; - } - - /** - * Allows a method of an instance to be mocked for testing. - * - * This mock will be applied for the life of an instance. For singletons, the mock will be applied for the life - * of the page. - * - * Mocks cannot be applied to callback function plugins. - * - * @param {string} methodName - * @param {Function} callback - */ - }, { - key: "mock", - value: function mock(methodName, callback) { - var _this4 = this; - if (this.isFunction()) { - return; - } - if (!this.instance.prototype[methodName]) { - throw new Error("Function \"".concat(methodName, "\" does not exist and cannot be mocked")); - } - this.mocks[methodName] = callback; - this.originalFunctions[methodName] = this.instance.prototype[methodName]; - if (this.isSingleton() && this.instances.length === 0) { - this.initialiseSingleton(); - - // Apply mocked method - this.instances[0][methodName] = function () { - for (var _len6 = arguments.length, parameters = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { - parameters[_key6] = arguments[_key6]; - } - return callback.apply(void 0, [_this4].concat(parameters)); - }; - } - } - - /** - * Removes a mock callback from future instances. - * - * @param {string} methodName - */ - }, { - key: "unmock", - value: function unmock(methodName) { - if (this.isFunction()) { - return; - } - if (!this.mocks[methodName]) { - return; - } - if (this.isSingleton()) { - this.instances[0][methodName] = this.originalFunctions[methodName]; - } - delete this.mocks[methodName]; - delete this.originalFunctions[methodName]; - } - }]); -}(); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/main/ProxyHandler.js": -/*!*********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/main/ProxyHandler.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - get: function get(target, prop, receiver) { - if (typeof prop === 'string') { - var propLower = prop.toLowerCase(); - if (target.hasPlugin(propLower)) { - return function () { - var _Reflect$get$propLowe; - return (_Reflect$get$propLowe = Reflect.get(target, 'plugins')[propLower]).getInstance.apply(_Reflect$get$propLowe, arguments); - }; - } - } - return Reflect.get(target, prop, receiver); - }, - has: function has(target, prop) { - if (typeof prop === 'string') { - var propLower = prop.toLowerCase(); - if (target.hasPlugin(propLower)) { - return true; - } - } - return Reflect.has(target, prop); - } -}); - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/main/Snowboard.js": -/*!******************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/main/Snowboard.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Snowboard) -/* harmony export */ }); -/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -/* harmony import */ var _PluginLoader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PluginLoader */ "../../modules/system/assets/js/snowboard/main/PluginLoader.js"); -/* harmony import */ var _utilities_Cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/Cookie */ "../../modules/system/assets/js/snowboard/utilities/Cookie.js"); -/* harmony import */ var _utilities_JsonParser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/JsonParser */ "../../modules/system/assets/js/snowboard/utilities/JsonParser.js"); -/* harmony import */ var _utilities_Sanitizer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities/Sanitizer */ "../../modules/system/assets/js/snowboard/utilities/Sanitizer.js"); -/* harmony import */ var _utilities_Url__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utilities/Url */ "../../modules/system/assets/js/snowboard/utilities/Url.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - - -/** - * Snowboard - the Winter JavaScript framework. - * - * This class represents the base of a modern take on the Winter JS framework, being fully extensible and taking advantage - * of modern JavaScript features by leveraging the Laravel Mix compilation framework. It also is coded up to remove the - * dependency of jQuery. - * - * @copyright 2021 Winter. - * @author Ben Thomson - * @link https://wintercms.com/docs/snowboard/introduction - */ -var Snowboard = /*#__PURE__*/function () { - /** - * Constructor. - * - * @param {boolean} autoSingletons Automatically load singletons when DOM is ready. Default: `true`. - * @param {boolean} debug Whether debugging logs should be shown. Default: `false`. - */ - function Snowboard(autoSingletons, debug) { - _classCallCheck(this, Snowboard); - this.debugEnabled = typeof debug === 'boolean' && debug === true; - this.autoInitSingletons = typeof autoSingletons === 'boolean' && autoSingletons === false; - this.plugins = {}; - this.listeners = {}; - this.foundBaseUrl = null; - this.readiness = { - dom: false - }; - // Seal readiness from being added to further, but allow the properties to be modified. - Object.seal(this.readiness); - this.attachAbstracts(); - - // Freeze the Snowboard class to prevent further modifications. - Object.freeze(Snowboard.prototype); - Object.freeze(this); - this.loadUtilities(); - this.initialise(); - this.debug('Snowboard framework initialised'); - } - - /** - * Attaches abstract classes as properties of the Snowboard class. - * - * This will allow Javascript functionality with no build process to still extend these abstracts by prefixing - * them with "Snowboard". - * - * ``` - * class MyClass extends Snowboard.PluginBase { - * ... - * } - * ``` - */ - return _createClass(Snowboard, [{ - key: "attachAbstracts", - value: function attachAbstracts() { - this.PluginBase = _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]; - this.Singleton = _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"]; - Object.freeze(this.PluginBase.prototype); - Object.freeze(this.PluginBase); - Object.freeze(this.Singleton.prototype); - Object.freeze(this.Singleton); - } - - /** - * Loads the default utilities. - */ - }, { - key: "loadUtilities", - value: function loadUtilities() { - this.addPlugin('cookie', _utilities_Cookie__WEBPACK_IMPORTED_MODULE_3__["default"]); - this.addPlugin('jsonParser', _utilities_JsonParser__WEBPACK_IMPORTED_MODULE_4__["default"]); - this.addPlugin('sanitizer', _utilities_Sanitizer__WEBPACK_IMPORTED_MODULE_5__["default"]); - this.addPlugin('url', _utilities_Url__WEBPACK_IMPORTED_MODULE_6__["default"]); - } - - /** - * Initialises the framework. - * - * Attaches a listener for the DOM being ready and triggers a global "ready" event for plugins to begin attaching - * themselves to the DOM. - */ - }, { - key: "initialise", - value: function initialise() { - var _this = this; - window.addEventListener('DOMContentLoaded', function () { - if (_this.autoInitSingletons) { - _this.initialiseSingletons(); - } - _this.globalEvent('ready'); - _this.readiness.dom = true; - }); - } - - /** - * Initialises an instance of every singleton. - */ - }, { - key: "initialiseSingletons", - value: function initialiseSingletons() { - Object.values(this.plugins).forEach(function (plugin) { - if (plugin.isSingleton() && plugin.dependenciesFulfilled()) { - plugin.initialiseSingleton(); - } - }); - } - - /** - * Adds a plugin to the framework. - * - * Plugins are the cornerstone for additional functionality for Snowboard. A plugin must either be an ES2015 class - * that extends the PluginBase or Singleton abstract classes, or a simple callback function. - * - * When a plugin is added, it is automatically assigned as a new magic method in the Snowboard class using the name - * parameter, and can be called via this method. This method will always be the "lowercase" version of this name. - * - * For example, if a plugin is assigned to the name "myPlugin", it can be called via `Snowboard.myplugin()`. - * - * @param {string} name - * @param {PluginBase|Function} instance - */ - }, { - key: "addPlugin", - value: function addPlugin(name, instance) { - var _this2 = this; - var lowerName = name.toLowerCase(); - if (this.hasPlugin(lowerName)) { - throw new Error("A plugin called \"".concat(name, "\" is already registered.")); - } - if (typeof instance !== 'function' && instance instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false) { - throw new Error('The provided plugin must extend the PluginBase class, or must be a callback function.'); - } - if (this[name] !== undefined || this[lowerName] !== undefined) { - throw new Error('The given name is already in use for a property or method of the Snowboard class.'); - } - this.plugins[lowerName] = new _PluginLoader__WEBPACK_IMPORTED_MODULE_2__["default"](lowerName, this, instance); - this.debug("Plugin \"".concat(name, "\" registered")); - - // Check if any singletons now have their dependencies fulfilled, and fire their "ready" handler if we're - // in a ready state. - Object.values(this.getPlugins()).forEach(function (plugin) { - if (plugin.isSingleton() && !plugin.isInitialised() && plugin.dependenciesFulfilled() && plugin.hasMethod('listens') && Object.keys(plugin.callMethod('listens')).includes('ready') && _this2.readiness.dom) { - var readyMethod = plugin.callMethod('listens').ready; - plugin.callMethod(readyMethod); - } - }); - } - - /** - * Removes a plugin. - * - * Removes a plugin from Snowboard, calling the destructor method for all active instances of the plugin. - * - * @param {string} name - * @returns {void} - */ - }, { - key: "removePlugin", - value: function removePlugin(name) { - var lowerName = name.toLowerCase(); - if (!this.hasPlugin(lowerName)) { - this.debug("Plugin \"".concat(name, "\" already removed")); - return; - } - - // Call destructors for all instances - this.plugins[lowerName].getInstances().forEach(function (instance) { - instance.destruct(); - }); - delete this.plugins[lowerName]; - delete this[lowerName]; - delete this[name]; - this.debug("Plugin \"".concat(name, "\" removed")); - } - - /** - * Determines if a plugin has been registered and is active. - * - * A plugin that is still waiting for dependencies to be registered will not be active. - * - * @param {string} name - * @returns {boolean} - */ - }, { - key: "hasPlugin", - value: function hasPlugin(name) { - var lowerName = name.toLowerCase(); - return this.plugins[lowerName] !== undefined; - } - - /** - * Returns an array of registered plugins as PluginLoader objects. - * - * @returns {PluginLoader[]} - */ - }, { - key: "getPlugins", - value: function getPlugins() { - return this.plugins; - } - - /** - * Returns an array of registered plugins, by name. - * - * @returns {string[]} - */ - }, { - key: "getPluginNames", - value: function getPluginNames() { - return Object.keys(this.plugins); - } - - /** - * Returns a PluginLoader object of a given plugin. - * - * @returns {PluginLoader} - */ - }, { - key: "getPlugin", - value: function getPlugin(name) { - var lowerName = name.toLowerCase(); - if (!this.hasPlugin(lowerName)) { - throw new Error("No plugin called \"".concat(lowerName, "\" has been registered.")); - } - return this.plugins[lowerName]; - } - - /** - * Finds all plugins that listen to the given event. - * - * This works for both normal and promise events. It does NOT check that the plugin's listener actually exists. - * - * @param {string} eventName - * @returns {string[]} The name of the plugins that are listening to this event. - */ - }, { - key: "listensToEvent", - value: function listensToEvent(eventName) { - var plugins = []; - Object.entries(this.plugins).forEach(function (entry) { - var _entry = _slicedToArray(entry, 2), - name = _entry[0], - plugin = _entry[1]; - if (plugin.isFunction()) { - return; - } - if (!plugin.dependenciesFulfilled()) { - return; - } - if (!plugin.hasMethod('listens')) { - return; - } - var listeners = plugin.callMethod('listens'); - if (typeof listeners[eventName] === 'string' || typeof listeners[eventName] === 'function') { - plugins.push(name); - } - }); - return plugins; - } - - /** - * Add a simple ready listener. - * - * Synonymous with jQuery's "$(document).ready()" functionality, this allows inline scripts to - * attach themselves to Snowboard immediately but only fire when the DOM is ready. - * - * @param {Function} callback - */ - }, { - key: "ready", - value: function ready(callback) { - if (this.readiness.dom) { - callback(); - } - this.on('ready', callback); - } - - /** - * Adds a simple listener for an event. - * - * This can be used for ad-hoc scripts that don't need a full plugin. The given callback will be - * called when the event name provided fires. This works for both normal and Promise events. For - * a Promise event, your callback must return a Promise. - * - * @param {String} eventName - * @param {Function} callback - */ - }, { - key: "on", - value: function on(eventName, callback) { - if (!this.listeners[eventName]) { - this.listeners[eventName] = []; - } - if (!this.listeners[eventName].includes(callback)) { - this.listeners[eventName].push(callback); - } - } - - /** - * Removes a simple listener for an event. - * - * @param {String} eventName - * @param {Function} callback - */ - }, { - key: "off", - value: function off(eventName, callback) { - if (!this.listeners[eventName]) { - return; - } - var index = this.listeners[eventName].indexOf(callback); - if (index === -1) { - return; - } - this.listeners[eventName].splice(index, 1); - } - - /** - * Calls a global event to all registered plugins. - * - * If any plugin returns a `false`, the event is considered cancelled. - * - * @param {string} eventName - * @returns {boolean} If event was not cancelled - */ - }, { - key: "globalEvent", - value: function globalEvent(eventName) { - var _this3 = this; - for (var _len = arguments.length, parameters = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - parameters[_key - 1] = arguments[_key]; - } - this.debug.apply(this, ["Calling global event \"".concat(eventName, "\"")].concat(parameters)); - - // Find plugins listening to the event. - var listeners = this.listensToEvent(eventName); - if (listeners.length === 0) { - this.debug("No listeners found for global event \"".concat(eventName, "\"")); - return true; - } - this.debug("Listeners found for global event \"".concat(eventName, "\": ").concat(listeners.join(', '))); - var cancelled = false; - listeners.forEach(function (name) { - var plugin = _this3.getPlugin(name); - if (plugin.isFunction()) { - return; - } - if (plugin.isSingleton() && plugin.getInstances().length === 0) { - plugin.initialiseSingleton(); - } - var listenMethod = plugin.callMethod('listens')[eventName]; - - // Call event handler methods for all plugins, if they have a method specified for the event. - plugin.getInstances().forEach(function (instance) { - // If a plugin has cancelled the event, no further plugins are considered. - if (cancelled) { - return; - } - if (typeof listenMethod === 'function') { - try { - var result = listenMethod.apply(instance, parameters); - if (result === false) { - cancelled = true; - } - } catch (error) { - _this3.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); - } - } else if (typeof listenMethod === 'string') { - if (!instance[listenMethod]) { - throw new Error("Missing \"".concat(listenMethod, "\" method in \"").concat(name, "\" plugin")); - } - try { - if (instance[listenMethod].apply(instance, parameters) === false) { - cancelled = true; - _this3.debug("Global event \"".concat(eventName, "\" cancelled by \"").concat(name, "\" plugin")); - } - } catch (error) { - _this3.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); - } - } else { - _this3.error("Listen method for \"".concat(eventName, "\" event in \"").concat(name, "\" plugin is not a function or string.")); - } - }); - }); - - // Find ad-hoc listeners for this event. - if (!cancelled && this.listeners[eventName] && this.listeners[eventName].length > 0) { - this.debug("Found ".concat(this.listeners[eventName].length, " ad-hoc listener(s) for global event \"").concat(eventName, "\"")); - this.listeners[eventName].forEach(function (listener) { - // If a listener has cancelled the event, no further listeners are considered. - if (cancelled) { - return; - } - try { - if (listener.apply(void 0, parameters) === false) { - cancelled = true; - _this3.debug("Global event \"".concat(eventName, " cancelled by an ad-hoc listener.")); - } - } catch (error) { - _this3.error("Error thrown in \"".concat(eventName, "\" event by an ad-hoc listener."), error); - } - }); - } - return !cancelled; - } - - /** - * Calls a global event to all registered plugins, expecting a Promise to be returned by all. - * - * This collates all plugins responses into one large Promise that either expects all to be resolved, or one to reject. - * If no listeners are found, a resolved Promise is returned. - * - * @param {string} eventName - */ - }, { - key: "globalPromiseEvent", - value: function globalPromiseEvent(eventName) { - var _this4 = this; - for (var _len2 = arguments.length, parameters = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - parameters[_key2 - 1] = arguments[_key2]; - } - this.debug("Calling global promise event \"".concat(eventName, "\"")); - - // Find plugins listening to this event. - var listeners = this.listensToEvent(eventName); - if (listeners.length === 0) { - this.debug("No listeners found for global promise event \"".concat(eventName, "\"")); - return Promise.resolve(); - } - this.debug("Listeners found for global promise event \"".concat(eventName, "\": ").concat(listeners.join(', '))); - var promises = []; - listeners.forEach(function (name) { - var plugin = _this4.getPlugin(name); - if (plugin.isFunction()) { - return; - } - if (plugin.isSingleton() && plugin.getInstances().length === 0) { - plugin.initialiseSingleton(); - } - var listenMethod = plugin.callMethod('listens')[eventName]; - - // Call event handler methods for all plugins, if they have a method specified for the event. - plugin.getInstances().forEach(function (instance) { - if (typeof listenMethod === 'function') { - try { - var instancePromise = listenMethod.apply(instance, parameters); - if (instancePromise instanceof Promise === false) { - return; - } - promises.push(instancePromise); - } catch (error) { - _this4.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); - } - } else if (typeof listenMethod === 'string') { - if (!instance[listenMethod]) { - throw new Error("Missing \"".concat(listenMethod, "\" method in \"").concat(name, "\" plugin")); - } - try { - var _instancePromise = instance[listenMethod].apply(instance, parameters); - if (_instancePromise instanceof Promise === false) { - return; - } - promises.push(_instancePromise); - } catch (error) { - _this4.error("Error thrown in \"".concat(eventName, "\" promise event by \"").concat(name, "\" plugin."), error); - } - } else { - _this4.error("Listen method for \"".concat(eventName, "\" event in \"").concat(name, "\" plugin is not a function or string.")); - } - }); - }); - - // Find ad-hoc listeners listening to this event. - if (this.listeners[eventName] && this.listeners[eventName].length > 0) { - this.debug("Found ".concat(this.listeners[eventName].length, " ad-hoc listener(s) for global promise event \"").concat(eventName, "\"")); - this.listeners[eventName].forEach(function (listener) { - try { - var listenerPromise = listener.apply(void 0, parameters); - if (listenerPromise instanceof Promise === false) { - return; - } - promises.push(listenerPromise); - } catch (error) { - _this4.error("Error thrown in \"".concat(eventName, "\" promise event by an ad-hoc listener."), error); - } - }); - } - if (promises.length === 0) { - return Promise.resolve(); - } - return Promise.all(promises); - } - - /** - * Log a styled message in the console. - * - * Includes parameters and a stack trace. - * - * @returns {void} - */ - }, { - key: "logMessage", - value: function logMessage(color, bold, message) { - /* eslint-disable */ - console.groupCollapsed('%c[Snowboard]', "color: ".concat(color, "; font-weight: ").concat(bold ? 'bold' : 'normal', ";"), message); - for (var _len3 = arguments.length, parameters = new Array(_len3 > 3 ? _len3 - 3 : 0), _key3 = 3; _key3 < _len3; _key3++) { - parameters[_key3 - 3] = arguments[_key3]; - } - if (parameters.length) { - console.groupCollapsed("%cParameters %c(".concat(parameters.length, ")"), 'color: rgb(45, 167, 199); font-weight: bold;', 'color: rgb(88, 88, 88); font-weight: normal;'); - var index = 0; - parameters.forEach(function (param) { - index += 1; - console.log("%c".concat(index, ":"), 'color: rgb(88, 88, 88); font-weight: normal;', param); - }); - console.groupEnd(); - console.groupCollapsed('%cTrace', 'color: rgb(45, 167, 199); font-weight: bold;'); - console.trace(); - console.groupEnd(); - } else { - console.trace(); - } - console.groupEnd(); - /* eslint-enable */ - } - - /** - * Log a message. - * - * @returns {void} - */ - }, { - key: "log", - value: function log(message) { - for (var _len4 = arguments.length, parameters = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { - parameters[_key4 - 1] = arguments[_key4]; - } - this.logMessage.apply(this, ['rgb(45, 167, 199)', false, message].concat(parameters)); - } - - /** - * Log a debug message. - * - * These messages are only shown when debugging is enabled. - * - * @returns {void} - */ - }, { - key: "debug", - value: function debug(message) { - if (!this.debugEnabled) { - return; - } - for (var _len5 = arguments.length, parameters = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { - parameters[_key5 - 1] = arguments[_key5]; - } - this.logMessage.apply(this, ['rgb(45, 167, 199)', false, message].concat(parameters)); - } - - /** - * Logs an error message. - * - * @returns {void} - */ - }, { - key: "error", - value: function error(message) { - for (var _len6 = arguments.length, parameters = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { - parameters[_key6 - 1] = arguments[_key6]; - } - this.logMessage.apply(this, ['rgb(229, 35, 35)', true, message].concat(parameters)); - } - }]); -}(); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/utilities/Cookie.js": -/*!********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/utilities/Cookie.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Cookie) -/* harmony export */ }); -/* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! js-cookie */ "../../node_modules/js-cookie/dist/js.cookie.mjs"); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - - -/** - * Cookie utility. - * - * This utility is a thin wrapper around the "js-cookie" library. - * - * @see https://github.com/js-cookie/js-cookie - * @copyright 2021 Winter. - * @author Ben Thomson - */ -var Cookie = /*#__PURE__*/function (_Singleton) { - function Cookie() { - _classCallCheck(this, Cookie); - return _callSuper(this, Cookie, arguments); - } - _inherits(Cookie, _Singleton); - return _createClass(Cookie, [{ - key: "construct", - value: function construct() { - this.defaults = { - expires: null, - path: '/', - domain: null, - secure: false, - sameSite: 'Lax' - }; - } - - /** - * Set the default cookie parameters for all subsequent "set" and "remove" calls. - * - * @param {Object} options - */ - }, { - key: "setDefaults", - value: function setDefaults(options) { - var _this = this; - if (_typeof(options) !== 'object') { - throw new Error('Cookie defaults must be provided as an object'); - } - Object.entries(options).forEach(function (entry) { - var _entry = _slicedToArray(entry, 2), - key = _entry[0], - value = _entry[1]; - if (_this.defaults[key] !== undefined) { - _this.defaults[key] = value; - } - }); - } - - /** - * Get the current default cookie parameters. - * - * @returns {Object} - */ - }, { - key: "getDefaults", - value: function getDefaults() { - var _this2 = this; - var defaults = {}; - Object.entries(this.defaults).forEach(function (entry) { - var _entry2 = _slicedToArray(entry, 2), - key = _entry2[0], - value = _entry2[1]; - if (_this2.defaults[key] !== null) { - defaults[key] = value; - } - }); - return defaults; - } - - /** - * Get a cookie by name. - * - * If `name` is undefined, returns all cookies as an Object. - * - * @param {String} name - * @returns {Object|String} - */ - }, { - key: "get", - value: function get(name) { - var _this3 = this; - if (name === undefined) { - var cookies = js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].get(); - Object.entries(cookies).forEach(function (entry) { - var _entry3 = _slicedToArray(entry, 2), - cookieName = _entry3[0], - cookieValue = _entry3[1]; - _this3.snowboard.globalEvent('cookie.get', cookieName, cookieValue, function (newValue) { - cookies[cookieName] = newValue; - }); - }); - return cookies; - } - var value = js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].get(name); - - // Allow plugins to override the gotten value - this.snowboard.globalEvent('cookie.get', name, value, function (newValue) { - value = newValue; - }); - return value; - } - - /** - * Set a cookie by name. - * - * You can specify additional cookie parameters through the "options" parameter. - * - * @param {String} name - * @param {String} value - * @param {Object} options - * @returns {String} - */ - }, { - key: "set", - value: function set(name, value, options) { - var saveValue = value; - - // Allow plugins to override the value to save - this.snowboard.globalEvent('cookie.set', name, value, function (newValue) { - saveValue = newValue; - }); - return js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].set(name, saveValue, _objectSpread(_objectSpread({}, this.getDefaults()), options)); - } - - /** - * Remove a cookie by name. - * - * You can specify the additional cookie parameters via the "options" parameter. - * - * @param {String} name - * @param {Object} options - * @returns {void} - */ - }, { - key: "remove", - value: function remove(name, options) { - js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].remove(name, _objectSpread(_objectSpread({}, this.getDefaults()), options)); - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/utilities/JsonParser.js": -/*!************************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/utilities/JsonParser.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ JsonParser) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * JSON Parser utility. - * - * This utility parses JSON-like data that does not strictly meet the JSON specifications in order to simplify development. - * It is a safe replacement for JSON.parse(JSON.stringify(eval("({" + value + "})"))) that does not require the use of eval() - * - * @author Ayumi Hamasaki - * @author Ben Thomson - * @see https://github.com/octobercms/october/pull/4527 - */ -var JsonParser = /*#__PURE__*/function (_Singleton) { - function JsonParser() { - _classCallCheck(this, JsonParser); - return _callSuper(this, JsonParser, arguments); - } - _inherits(JsonParser, _Singleton); - return _createClass(JsonParser, [{ - key: "construct", - value: function construct() { - var _this = this; - // Add to global function for backwards compatibility - window.wnJSON = function (json) { - return _this.parse(json); - }; - window.ocJSON = window.wnJSON; - } - }, { - key: "parse", - value: function parse(str) { - var jsonString = this.parseString(str); - return JSON.parse(jsonString); - } - }, { - key: "parseString", - value: function parseString(value) { - var str = value.trim(); - if (!str.length) { - throw new Error('Broken JSON object.'); - } - var result = ''; - var type = null; - var key = null; - var body = ''; - - /* - * the mistake ',' - */ - while (str && str[0] === ',') { - str = str.substr(1); - } - - /* - * string - */ - if (str[0] === '"' || str[0] === '\'') { - if (str[str.length - 1] !== str[0]) { - throw new Error('Invalid string JSON object.'); - } - body = '"'; - for (var i = 1; i < str.length; i += 1) { - if (str[i] === '\\') { - if (str[i + 1] === '\'') { - body += str[i + 1]; - } else { - body += str[i]; - body += str[i + 1]; - } - i += 1; - } else if (str[i] === str[0]) { - body += '"'; - return body; - } else if (str[i] === '"') { - body += '\\"'; - } else { - body += str[i]; - } - } - throw new Error('Invalid string JSON object.'); - } - - /* - * boolean - */ - if (str === 'true' || str === 'false') { - return str; - } - - /* - * null - */ - if (str === 'null') { - return 'null'; - } - - /* - * number - */ - var num = Number(str); - if (!Number.isNaN(num)) { - return num.toString(); - } - - /* - * object - */ - if (str[0] === '{') { - type = 'needKey'; - key = null; - result = '{'; - for (var _i = 1; _i < str.length; _i += 1) { - if (this.isBlankChar(str[_i])) { - /* eslint-disable-next-line */ - continue; - } - if (type === 'needKey' && (str[_i] === '"' || str[_i] === '\'')) { - key = this.parseKey(str, _i + 1, str[_i]); - result += "\"".concat(key, "\""); - _i += key.length; - _i += 1; - type = 'afterKey'; - } else if (type === 'needKey' && this.canBeKeyHead(str[_i])) { - key = this.parseKey(str, _i); - result += '"'; - result += key; - result += '"'; - _i += key.length - 1; - type = 'afterKey'; - } else if (type === 'afterKey' && str[_i] === ':') { - result += ':'; - type = ':'; - } else if (type === ':') { - body = this.getBody(str, _i); - _i = _i + body.originLength - 1; - result += this.parseString(body.body); - type = 'afterBody'; - } else if (type === 'afterBody' || type === 'needKey') { - var last = _i; - while (str[last] === ',' || this.isBlankChar(str[last])) { - last += 1; - } - if (str[last] === '}' && last === str.length - 1) { - while (result[result.length - 1] === ',') { - result = result.substr(0, result.length - 1); - } - result += '}'; - return result; - } - if (last !== _i && result !== '{') { - result += ','; - type = 'needKey'; - _i = last - 1; - } - } - } - throw new Error("Broken JSON object near ".concat(result)); - } - - /* - * array - */ - if (str[0] === '[') { - result = '['; - type = 'needBody'; - for (var _i2 = 1; _i2 < str.length; _i2 += 1) { - if (str[_i2] === ' ' || str[_i2] === '\n' || str[_i2] === '\t') { - /* eslint-disable-next-line */ - continue; - } else if (type === 'needBody') { - if (str[_i2] === ',') { - result += 'null,'; - /* eslint-disable-next-line */ - continue; - } - if (str[_i2] === ']' && _i2 === str.length - 1) { - if (result[result.length - 1] === ',') { - result = result.substr(0, result.length - 1); - } - result += ']'; - return result; - } - body = this.getBody(str, _i2); - _i2 = _i2 + body.originLength - 1; - result += this.parseString(body.body); - type = 'afterBody'; - } else if (type === 'afterBody') { - if (str[_i2] === ',') { - result += ','; - type = 'needBody'; - - // deal with mistake "," - while (str[_i2 + 1] === ',' || this.isBlankChar(str[_i2 + 1])) { - if (str[_i2 + 1] === ',') { - result += 'null,'; - } - _i2 += 1; - } - } else if (str[_i2] === ']' && _i2 === str.length - 1) { - result += ']'; - return result; - } - } - } - throw new Error("Broken JSON array near ".concat(result)); - } - return ''; - } - }, { - key: "getBody", - value: function getBody(str, pos) { - var body = ''; - - // parse string body - if (str[pos] === '"' || str[pos] === '\'') { - body = str[pos]; - for (var i = pos + 1; i < str.length; i += 1) { - if (str[i] === '\\') { - body += str[i]; - if (i + 1 < str.length) { - body += str[i + 1]; - } - i += 1; - } else if (str[i] === str[pos]) { - body += str[pos]; - return { - originLength: body.length, - body: body - }; - } else { - body += str[i]; - } - } - throw new Error("Broken JSON string body near ".concat(body)); - } - - // parse true / false - if (str[pos] === 't') { - if (str.indexOf('true', pos) === pos) { - return { - originLength: 'true'.length, - body: 'true' - }; - } - throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); - } - if (str[pos] === 'f') { - if (str.indexOf('f', pos) === pos) { - return { - originLength: 'false'.length, - body: 'false' - }; - } - throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); - } - - // parse null - if (str[pos] === 'n') { - if (str.indexOf('null', pos) === pos) { - return { - originLength: 'null'.length, - body: 'null' - }; - } - throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); - } - - // parse number - if (str[pos] === '-' || str[pos] === '+' || str[pos] === '.' || str[pos] >= '0' && str[pos] <= '9') { - body = ''; - for (var _i3 = pos; _i3 < str.length; _i3 += 1) { - if (str[_i3] === '-' || str[_i3] === '+' || str[_i3] === '.' || str[_i3] >= '0' && str[_i3] <= '9') { - body += str[_i3]; - } else { - return { - originLength: body.length, - body: body - }; - } - } - throw new Error("Broken JSON number body near ".concat(body)); - } - - // parse object - if (str[pos] === '{' || str[pos] === '[') { - var stack = [str[pos]]; - body = str[pos]; - for (var _i4 = pos + 1; _i4 < str.length; _i4 += 1) { - body += str[_i4]; - if (str[_i4] === '\\') { - if (_i4 + 1 < str.length) { - body += str[_i4 + 1]; - } - _i4 += 1; - } else if (str[_i4] === '"') { - if (stack[stack.length - 1] === '"') { - stack.pop(); - } else if (stack[stack.length - 1] !== '\'') { - stack.push(str[_i4]); - } - } else if (str[_i4] === '\'') { - if (stack[stack.length - 1] === '\'') { - stack.pop(); - } else if (stack[stack.length - 1] !== '"') { - stack.push(str[_i4]); - } - } else if (stack[stack.length - 1] !== '"' && stack[stack.length - 1] !== '\'') { - if (str[_i4] === '{') { - stack.push('{'); - } else if (str[_i4] === '}') { - if (stack[stack.length - 1] === '{') { - stack.pop(); - } else { - throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); - } - } else if (str[_i4] === '[') { - stack.push('['); - } else if (str[_i4] === ']') { - if (stack[stack.length - 1] === '[') { - stack.pop(); - } else { - throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); - } - } - } - if (!stack.length) { - return { - originLength: _i4 - pos, - body: body - }; - } - } - throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); - } - throw new Error("Broken JSON body near ".concat(str.substr(pos - 5 >= 0 ? pos - 5 : 0, 50))); - } - }, { - key: "parseKey", - value: function parseKey(str, pos, quote) { - var key = ''; - for (var i = pos; i < str.length; i += 1) { - if (quote && quote === str[i]) { - return key; - } - if (!quote && (str[i] === ' ' || str[i] === ':')) { - return key; - } - key += str[i]; - if (str[i] === '\\' && i + 1 < str.length) { - key += str[i + 1]; - i += 1; - } - } - throw new Error("Broken JSON syntax near ".concat(key)); - } - }, { - key: "canBeKeyHead", - value: function canBeKeyHead(ch) { - if (ch[0] === '\\') { - return false; - } - if (ch[0] >= 'a' && ch[0] <= 'z' || ch[0] >= 'A' && ch[0] <= 'Z' || ch[0] === '_') { - return true; - } - if (ch[0] >= '0' && ch[0] <= '9') { - return true; - } - if (ch[0] === '$') { - return true; - } - if (ch.charCodeAt(0) > 255) { - return true; - } - return false; - } - }, { - key: "isBlankChar", - value: function isBlankChar(ch) { - return ch === ' ' || ch === '\n' || ch === '\t'; - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/utilities/Sanitizer.js": -/*!***********************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/utilities/Sanitizer.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Sanitizer) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * Sanitizer utility. - * - * Client-side HTML sanitizer designed mostly to prevent self-XSS attacks. - * The sanitizer utility will strip all attributes that start with `on` (usually JS event handlers as attributes, i.e. `onload` or `onerror`) or contain the `javascript:` pseudo protocol in their values. - * - * @author Ben Thomson - */ -var Sanitizer = /*#__PURE__*/function (_Singleton) { - function Sanitizer() { - _classCallCheck(this, Sanitizer); - return _callSuper(this, Sanitizer, arguments); - } - _inherits(Sanitizer, _Singleton); - return _createClass(Sanitizer, [{ - key: "construct", - value: function construct() { - var _this = this; - // Add to global function for backwards compatibility - window.wnSanitize = function (html) { - return _this.sanitize(html); - }; - window.ocSanitize = window.wnSanitize; - } - }, { - key: "sanitize", - value: function sanitize(html, bodyOnly) { - var parser = new DOMParser(); - var dom = parser.parseFromString(html, 'text/html'); - var returnBodyOnly = bodyOnly !== undefined && typeof bodyOnly === 'boolean' ? bodyOnly : true; - this.sanitizeNode(dom.getRootNode()); - return returnBodyOnly ? dom.body.innerHTML : dom.innerHTML; - } - }, { - key: "sanitizeNode", - value: function sanitizeNode(node) { - var _this2 = this; - if (node.tagName === 'SCRIPT') { - node.remove(); - return; - } - this.trimAttributes(node); - var children = Array.from(node.children); - children.forEach(function (child) { - _this2.sanitizeNode(child); - }); - } - }, { - key: "trimAttributes", - value: function trimAttributes(node) { - if (!node.attributes) { - return; - } - for (var i = 0; i < node.attributes.length; i += 1) { - var attrName = node.attributes.item(i).name; - var attrValue = node.attributes.item(i).value; - - /* - * remove attributes where the names start with "on" (for example: onload, onerror...) - * remove attributes where the value starts with the "javascript:" pseudo protocol (for example href="javascript:alert(1)") - */ - /* eslint-disable-next-line */ - if (attrName.indexOf('on') === 0 || attrValue.indexOf('javascript:') === 0) { - node.removeAttribute(attrName); - } - } - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "../../modules/system/assets/js/snowboard/utilities/Url.js": -/*!*****************************************************************!*\ - !*** ../../modules/system/assets/js/snowboard/utilities/Url.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ Url) -/* harmony export */ }); -/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } -function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } - - -/** - * URL utility. - * - * This utility provides URL functions. - * - * @copyright 2022 Winter. - * @author Ben Thomson - */ -var Url = /*#__PURE__*/function (_Singleton) { - function Url() { - _classCallCheck(this, Url); - return _callSuper(this, Url, arguments); - } - _inherits(Url, _Singleton); - return _createClass(Url, [{ - key: "construct", - value: function construct() { - this.foundBaseUrl = null; - this.foundAssetUrl = null; - this.baseUrl(); - this.assetUrl(); - } - - /** - * Gets a URL based on a relative path. - * - * If an absolute URL is provided, it will be returned unchanged. - * - * @param {string} url - * @returns {string} - */ - }, { - key: "to", - value: function to(url) { - var urlRegex = /^(?:[^:]+:\/\/)[-a-z0-9@:%._+~#=]{1,256}\b([-a-z0-9()@:%_+.~#?&//=]*)/i; - if (url.match(urlRegex)) { - return url; - } - var theUrl = url.replace(/^\/+/, ''); - return "".concat(this.baseUrl()).concat(theUrl); - } - - /** - * Gets an Asset URL based on a relative path. - * - * If an absolute URL is provided, it will be returned unchanged. - * - * @param {string} url - * @returns {string} - */ - }, { - key: "asset", - value: function asset(url) { - var urlRegex = /^(?:[^:]+:\/\/)[-a-z0-9@:%._+~#=]{1,256}\b([-a-z0-9()@:%_+.~#?&//=]*)/i; - if (url.match(urlRegex)) { - return url; - } - var theUrl = url.replace(/^\/+/, ''); - return "".concat(this.assetUrl()).concat(theUrl); - } - - /** - * Helper method to get the base URL of this install. - * - * This determines the base URL from three sources, in order: - * - If Snowboard is loaded via the `{% snowboard %}` tag, it will retrieve the base URL that - * is automatically included there. - * - If a `` tag is available, it will use the URL specified in the base tag. - * - Finally, it will take a guess from the current location. This will likely not work for sites - * that reside in subdirectories. - * - * The base URL will always contain a trailing backslash. - * - * @returns {string} - */ - }, { - key: "baseUrl", - value: function baseUrl() { - if (this.foundBaseUrl !== null) { - return this.foundBaseUrl; - } - if (document.querySelector('script[data-module="snowboard-base"]') !== null) { - this.foundBaseUrl = this.validateBaseUrl(document.querySelector('script[data-module="snowboard-base"]').dataset.baseUrl); - return this.foundBaseUrl; - } - if (document.querySelector('base') !== null) { - this.foundBaseUrl = this.validateBaseUrl(document.querySelector('base').getAttribute('href')); - return this.foundBaseUrl; - } - var urlParts = [window.location.protocol, '//', window.location.host, '/']; - this.foundBaseUrl = urlParts.join(''); - return this.foundBaseUrl; - } - - /** - * Helper method to get the asset URL of this install. - * - * This determines the base URL from three sources, in order: - * - If Snowboard is loaded via the `{% snowboard %}` tag, it will retrieve the asset URL that - * is automatically included there. - * - If a `` tag is available, it will use the URL specified in the link tag. - * - Finally, it will take a guess from the current location. This will likely not work for sites - * that reside in subdirectories. - * - * The asset URL will always contain a trailing backslash. - * - * @returns {string} - */ - }, { - key: "assetUrl", - value: function assetUrl() { - if (this.foundAssetUrl !== null) { - return this.foundAssetUrl; - } - if (document.querySelector('script[data-module="snowboard-base"]') !== null) { - this.foundAssetUrl = this.validateBaseUrl(document.querySelector('script[data-module="snowboard-base"]').dataset.assetUrl); - return this.foundAssetUrl; - } - if (document.querySelector('link[rel="asset_url"]') !== null) { - this.foundAssetUrl = this.validateBaseUrl(document.querySelector('link[rel="asset_url"]').getAttribute('href')); - return this.foundAssetUrl; - } - var urlParts = [window.location.protocol, '//', window.location.host, '/']; - this.foundAssetUrl = urlParts.join(''); - return this.foundAssetUrl; - } - - /** - * Validates the base URL, ensuring it is a HTTP/HTTPs URL. - * - * If the Snowboard script or tag on the page use a different type of URL, this will fail with - * an error. - * - * @param {string} url - * @returns {string} - */ - }, { - key: "validateBaseUrl", - value: function validateBaseUrl(url) { - var urlRegex = /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/i; - var urlParts = urlRegex.exec(url); - var protocol = urlParts[2]; - var domain = urlParts[4]; - if (protocol && ['http', 'https'].indexOf(protocol.toLowerCase()) === -1) { - throw new Error('Invalid base URL detected'); - } - if (!domain) { - throw new Error('Invalid base URL detected'); - } - return url.substr(-1) === '/' ? url : "".concat(url, "/"); - } - }]); -}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); - - -/***/ }), - -/***/ "./assets/js/src/app.js": -/*!******************************!*\ - !*** ./assets/js/src/app.js ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _modules_system_assets_js_snowboard_main_Snowboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/main/Snowboard */ "../../modules/system/assets/js/snowboard/main/Snowboard.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_main_ProxyHandler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/main/ProxyHandler */ "../../modules/system/assets/js/snowboard/main/ProxyHandler.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_ajax_Request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/ajax/Request */ "../../modules/system/assets/js/snowboard/ajax/Request.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_ajax_handlers_AttributeRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest */ "../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_AssetLoader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/AssetLoader */ "../../modules/system/assets/js/snowboard/extras/AssetLoader.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_DataConfig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/DataConfig */ "../../modules/system/assets/js/snowboard/extras/DataConfig.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_StylesheetLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/StylesheetLoader */ "../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Transition */ "../../modules/system/assets/js/snowboard/extras/Transition.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_Flash__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Flash */ "../../modules/system/assets/js/snowboard/extras/Flash.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_FlashListener__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/FlashListener */ "../../modules/system/assets/js/snowboard/extras/FlashListener.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_FormValidation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/FormValidation */ "../../modules/system/assets/js/snowboard/extras/FormValidation.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_AttachLoading__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/AttachLoading */ "../../modules/system/assets/js/snowboard/extras/AttachLoading.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_StripeLoader__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/StripeLoader */ "../../modules/system/assets/js/snowboard/extras/StripeLoader.js"); -/* harmony import */ var _modules_system_assets_js_snowboard_extras_Trigger__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Trigger */ "../../modules/system/assets/js/snowboard/extras/Trigger.js"); -function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } -function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } - - - - - - - - - - - - - - -(function (window) { - var snowboard = new Proxy(new _modules_system_assets_js_snowboard_main_Snowboard__WEBPACK_IMPORTED_MODULE_0__["default"](true, true), _modules_system_assets_js_snowboard_main_ProxyHandler__WEBPACK_IMPORTED_MODULE_1__["default"]); - - // Cover all aliases - window.snowboard = snowboard; - window.Snowboard = snowboard; - window.SnowBoard = snowboard; - snowboard.addPlugin('request', _modules_system_assets_js_snowboard_ajax_Request__WEBPACK_IMPORTED_MODULE_2__["default"]); - snowboard.addPlugin('attributeRequest', _modules_system_assets_js_snowboard_ajax_handlers_AttributeRequest__WEBPACK_IMPORTED_MODULE_3__["default"]); - snowboard.addPlugin('assetLoader', _modules_system_assets_js_snowboard_extras_AssetLoader__WEBPACK_IMPORTED_MODULE_4__["default"]); - snowboard.addPlugin('dataConfig', _modules_system_assets_js_snowboard_extras_DataConfig__WEBPACK_IMPORTED_MODULE_5__["default"]); - snowboard.addPlugin('extrasStyles', _modules_system_assets_js_snowboard_extras_StylesheetLoader__WEBPACK_IMPORTED_MODULE_6__["default"]); - snowboard.addPlugin('transition', _modules_system_assets_js_snowboard_extras_Transition__WEBPACK_IMPORTED_MODULE_7__["default"]); - snowboard.addPlugin('flash', _modules_system_assets_js_snowboard_extras_Flash__WEBPACK_IMPORTED_MODULE_8__["default"]); - snowboard.addPlugin('flashListener', _modules_system_assets_js_snowboard_extras_FlashListener__WEBPACK_IMPORTED_MODULE_9__["default"]); - snowboard.addPlugin('formValidation', _modules_system_assets_js_snowboard_extras_FormValidation__WEBPACK_IMPORTED_MODULE_10__["default"]); - snowboard.addPlugin('attachLoading', _modules_system_assets_js_snowboard_extras_AttachLoading__WEBPACK_IMPORTED_MODULE_11__["default"]); - snowboard.addPlugin('stripeLoader', _modules_system_assets_js_snowboard_extras_StripeLoader__WEBPACK_IMPORTED_MODULE_12__["default"]); - snowboard.addPlugin('trigger', _modules_system_assets_js_snowboard_extras_Trigger__WEBPACK_IMPORTED_MODULE_13__["default"]); - snowboard.on('ready', function () { - // Scan for triggers - Array.from(document.querySelectorAll('*')).filter(function (element) { - return _toConsumableArray(element.attributes).filter(function (_ref) { - var name = _ref.name; - return name.startsWith("data-trigger-"); - }).length > 0; - }).forEach(function (element) { - snowboard.trigger(element); - }); - }); -})(window); - -/***/ }), - -/***/ "./assets/css/base.css": -/*!*****************************!*\ - !*** ./assets/css/base.css ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "../../node_modules/js-cookie/dist/js.cookie.mjs": -/*!*******************************************************!*\ - !*** ../../node_modules/js-cookie/dist/js.cookie.mjs ***! - \*******************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ api) -/* harmony export */ }); -/*! js-cookie v3.0.5 | MIT */ -/* eslint-disable no-var */ -function assign (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - target[key] = source[key]; - } - } - return target -} -/* eslint-enable no-var */ - -/* eslint-disable no-var */ -var defaultConverter = { - read: function (value) { - if (value[0] === '"') { - value = value.slice(1, -1); - } - return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent) - }, - write: function (value) { - return encodeURIComponent(value).replace( - /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, - decodeURIComponent - ) - } -}; -/* eslint-enable no-var */ - -/* eslint-disable no-var */ - -function init (converter, defaultAttributes) { - function set (name, value, attributes) { - if (typeof document === 'undefined') { - return - } - - attributes = assign({}, defaultAttributes, attributes); - - if (typeof attributes.expires === 'number') { - attributes.expires = new Date(Date.now() + attributes.expires * 864e5); - } - if (attributes.expires) { - attributes.expires = attributes.expires.toUTCString(); - } - - name = encodeURIComponent(name) - .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) - .replace(/[()]/g, escape); - - var stringifiedAttributes = ''; - for (var attributeName in attributes) { - if (!attributes[attributeName]) { - continue - } - - stringifiedAttributes += '; ' + attributeName; - - if (attributes[attributeName] === true) { - continue - } - - // Considers RFC 6265 section 5.2: - // ... - // 3. If the remaining unparsed-attributes contains a %x3B (";") - // character: - // Consume the characters of the unparsed-attributes up to, - // not including, the first %x3B (";") character. - // ... - stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; - } - - return (document.cookie = - name + '=' + converter.write(value, name) + stringifiedAttributes) - } - - function get (name) { - if (typeof document === 'undefined' || (arguments.length && !name)) { - return - } - - // To prevent the for loop in the first place assign an empty array - // in case there are no cookies at all. - var cookies = document.cookie ? document.cookie.split('; ') : []; - var jar = {}; - for (var i = 0; i < cookies.length; i++) { - var parts = cookies[i].split('='); - var value = parts.slice(1).join('='); - - try { - var found = decodeURIComponent(parts[0]); - jar[found] = converter.read(value, found); - - if (name === found) { - break - } - } catch (e) {} - } - - return name ? jar[name] : jar - } - - return Object.create( - { - set, - get, - remove: function (name, attributes) { - set( - name, - '', - assign({}, attributes, { - expires: -1 - }) - ); - }, - withAttributes: function (attributes) { - return init(this.converter, assign({}, this.attributes, attributes)) - }, - withConverter: function (converter) { - return init(assign({}, this.converter, converter), this.attributes) - } - }, - { - attributes: { value: Object.freeze(defaultAttributes) }, - converter: { value: Object.freeze(converter) } - } - ) -} - -var api = init(defaultConverter, { path: '/' }); -/* eslint-enable no-var */ - - - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/chunk loaded */ -/******/ (() => { -/******/ var deferred = []; -/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { -/******/ if(chunkIds) { -/******/ priority = priority || 0; -/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; -/******/ deferred[i] = [chunkIds, fn, priority]; -/******/ return; -/******/ } -/******/ var notFulfilled = Infinity; -/******/ for (var i = 0; i < deferred.length; i++) { -/******/ var [chunkIds, fn, priority] = deferred[i]; -/******/ var fulfilled = true; -/******/ for (var j = 0; j < chunkIds.length; j++) { -/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { -/******/ chunkIds.splice(j--, 1); -/******/ } else { -/******/ fulfilled = false; -/******/ if(priority < notFulfilled) notFulfilled = priority; -/******/ } -/******/ } -/******/ if(fulfilled) { -/******/ deferred.splice(i--, 1) -/******/ var r = fn(); -/******/ if (r !== undefined) result = r; -/******/ } -/******/ } -/******/ return result; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/jsonp chunk loading */ -/******/ (() => { -/******/ // no baseURI -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ "/assets/js/app": 0, -/******/ "assets/css/theme": 0 -/******/ }; -/******/ -/******/ // no chunk on demand loading -/******/ -/******/ // no prefetching -/******/ -/******/ // no preloaded -/******/ -/******/ // no HMR -/******/ -/******/ // no HMR manifest -/******/ -/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); -/******/ -/******/ // install a JSONP callback for chunk loading -/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { -/******/ var [chunkIds, moreModules, runtime] = data; -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0; -/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { -/******/ for(moduleId in moreModules) { -/******/ if(__webpack_require__.o(moreModules, moduleId)) { -/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(runtime) var result = runtime(__webpack_require__); -/******/ } -/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { -/******/ installedChunks[chunkId][0](); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ return __webpack_require__.O(result); -/******/ } -/******/ -/******/ var chunkLoadingGlobal = self["webpackChunkwintercms_workshop_theme"] = self["webpackChunkwintercms_workshop_theme"] || []; -/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); -/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, ["assets/css/theme"], () => (__webpack_require__("./assets/js/src/app.js"))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["assets/css/theme"], () => (__webpack_require__("./assets/css/base.css"))) -/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); -/******/ -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLE1BQU0scUJBQXFCO1dBQzNCO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTtXQUNBOzs7OztVRWpEQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvUGx1Z2luQmFzZS5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvU2luZ2xldG9uLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L2hhbmRsZXJzL0F0dHJpYnV0ZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Fzc2V0TG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9BdHRhY2hMb2FkaW5nLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9EYXRhQ29uZmlnLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2hMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRm9ybVZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0cmlwZUxvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3R5bGVzaGVldExvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL0lubmVyUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUGx1Z2luTG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9Db29raWUuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL0pzb25QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL1Nhbml0aXplci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC91dGlsaXRpZXMvVXJsLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9qcy9zcmMvYXBwLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9jc3MvYmFzZS5jc3MiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL25vZGVfbW9kdWxlcy9qcy1jb29raWUvZGlzdC9qcy5jb29raWUubWpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gYmFzZSBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBwbHVnaW5zLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCB0aGUgU25vd2JvYXJkIGZyYW1ld29yayBpbnN0YW5jZSwgYW5kIHNob3VsZCBub3QgYmUgb3ZlcndyaXR0ZW5cbiAgICAgKiB1bmxlc3MgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U25vd2JvYXJkfSBzbm93Ym9hcmRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihzbm93Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1Z2luIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRydWUgY29uc3RydWN0b3Igb2YgYSBwbHVnaW4sIGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4uXG4gICAgICogSXQgd2lsbCBiZSBjYWxsZWQgc3RyYWlnaHQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSByZXF1aXJlZCBwbHVnaW5zIGZvciB0aGlzIHNwZWNpZmljIG1vZHVsZSB0byB3b3JrLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwbHVnaW5zIHJlcXVpcmVkIGZvciB0aGlzIG1vZHVsZSB0byB3b3JrLCBhcyBzdHJpbmdzLlxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGxpc3RlbmVyIG1ldGhvZHMgZm9yIGdsb2JhbCBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEZpcmVkIHdoZW4gdGhpcyBwbHVnaW4gaXMgcmVtb3ZlZC4gQ2FuIGJlIG1hbnVhbGx5IGNhbGxlZCBpZiB5b3UgaGF2ZSBhbm90aGVyIHNjZW5hcmlvIGZvclxuICAgICAqIGRlc3RydWN0aW9uLCBpZS4gdGhlIGVsZW1lbnQgYXR0YWNoZWQgdG8gdGhlIHBsdWdpbiBpcyByZW1vdmVkIG9yIGNoYW5nZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNub3dib2FyZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gZGVzdHJ1Y3RvciAob2xkIG1ldGhvZCBuYW1lKS5cbiAgICAgKlxuICAgICAqIEFsbG93cyBwcmV2aW91cyB1c2FnZSBvZiB0aGUgXCJkZXN0cnVjdG9yXCIgbWV0aG9kIHRvIHN0aWxsIHdvcmsuXG4gICAgICovXG4gICAgZGVzdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4vUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogU2luZ2xldG9uIHBsdWdpbiBhYnN0cmFjdC5cbiAqXG4gKiBUaGlzIGlzIGEgc3BlY2lhbCBkZWZpbml0aW9uIGNsYXNzIHRoYXQgdGhlIFNub3dib2FyZCBmcmFtZXdvcmsgd2lsbCB1c2UgdG8gaW50ZXJwcmV0IHRoZSBjdXJyZW50IHBsdWdpbiBhcyBhXG4gKiBcInNpbmdsZXRvblwiLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiBjbGFzcyBpcyB1c2VkIGFjcm9zcyB0aGUgYm9hcmQuXG4gKlxuICogU2luZ2xldG9ucyBhcmUgaW5pdGlhbGlzZWQgb24gdGhlIFwiZG9tUmVhZHlcIiBldmVudCBieSBkZWZhdWx0LlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBSZXF1ZXN0IHBsdWdpbi5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IEFKQVggaGFuZGxlciB3aGljaCB3aWxsIHJ1biB1c2luZyB0aGUgYGZldGNoKClgIG1ldGhvZCB0aGF0IGlzIGRlZmF1bHQgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyAyIG9yIDMgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIElmIDIgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGhhbmRsZXIgbmFtZSBhbmQgdGhlIHNlY29uZFxuICAgICAqIHBhcmFtZXRlciBpcyB0aGUgb3B0aW9ucy4gVGhpcyBhc3N1bWVzIHRoYXQgdGhpcyBpcyBhIGRldGFjaGVkIEFKQVggcmVxdWVzdCBub3QgY29ubmVjdGVkIHRvXG4gICAgICogYW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIDMgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gZWxlbWVudCBvciBhIHNlbGVjdG9yLCBhbmQgdGhlIHNlY29uZFxuICAgICAqIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIGFyZSB0aGUgaGFuZGxlciBhbmQgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IGhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdChlbGVtZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGJlIGEgaGFuZGxlciBuYW1lLlxuICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoZSByZXF1ZXN0IGlzIGJlaW5nIG1hZGUgYWdhaW5zdCBubyBlbGVtZW50LCBhbmQgdGhlIGhhbmRsZXIgcGFyYW1ldGVyXG4gICAgICAgICAgICAvLyB3aWxsIGNvbnRhaW4gb3B0aW9ucy5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGFuZGxlck5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gaGFuZGxlciB8fCB7fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGVsZW1lbnQgd2FzIGZvdW5kIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yOiAke2VsZW1lbnR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG1hdGNoZWRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb25zID0ge307XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNoZWNrUmVxdWVzdCgpO1xuICAgICAgICBpZiAoIXRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U2V0dXAnLCB0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4U2V0dXAnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRvQ2xpZW50VmFsaWRhdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maXJtKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ29uZmlybSgpLnRoZW4oKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZShyZXNwb25zZSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX1NVQ0NFU1MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kb0FqYXgoKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlKHJlc3BvbnNlKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9TVUNDRVNTID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZUVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcGVuZGVuY2llcyBmb3IgdGhpcyBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydjb29raWUnLCAnanNvblBhcnNlciddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgZWxlbWVudCBhbmQgaGFuZGxlciBnaXZlbiBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBjaGVja1JlcXVlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGVsZW1lbnQgcHJvdmlkZWQgbXVzdCBiZSBhbiBFbGVtZW50IGluc3RhbmNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFKQVggaGFuZGxlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNIYW5kbGVyTmFtZSh0aGlzLmhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQUpBWCBoYW5kbGVyIG5hbWUuIFRoZSBjb3JyZWN0IGhhbmRsZXIgbmFtZSBmb3JtYXQgaXM6IFwib25FdmVudFwiLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZldGNoIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtYWRlIGF2YWlsYWJsZSBmb3IgcGx1Z2lucyB0byBleHRlbmQgb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmV0Y2goKSBzZXR0aW5ncyB3aXRoIHRoZWlyIG93bi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGdldEZldGNoKCkge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9ucyA9ICh0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5mZXRjaE9wdGlvbnMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMuZmV0Y2hPcHRpb25zXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgICAgICAgICBtb2RlOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEZldGNoT3B0aW9ucycsIHRoaXMuZmV0Y2hPcHRpb25zLCB0aGlzKTtcblxuICAgICAgICByZXR1cm4gZmV0Y2godGhpcy51cmwsIHRoaXMuZmV0Y2hPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBvbiB0aGUgZm9ybSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZG9DbGllbnRWYWxpZGF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJWYWxpZGF0ZSA9PT0gdHJ1ZSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY2hlY2tWYWxpZGl0eSgpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBBSkFYIHF1ZXJ5LlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB3aGVuIHRoZSBBSkFYIHJlcXVlc3QgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9BamF4KCkge1xuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgQUpBWCByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEJlZm9yZVNlbmQnLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWpheFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEZldGNoKCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vayAmJiByZXNwb25zZS5zdGF0dXMgIT09IDQwNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykuaW5jbHVkZXMoJy9qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5qc29uKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5tZXNzYWdlICYmIHJlc3BvbnNlRGF0YS5leGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5leGNlcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5maWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLnRyYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRleHQoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VUZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihyZXNwb25zZVRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHByb2Nlc3MgcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKS5pbmNsdWRlcygnL2pzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfV0lOVEVSX1NVQ0NFU1M6IHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9XSU5URVJfUkVTUE9OU0VfQ09ERTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHBhcnNlIEpTT04gcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVuZGVyRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcjogJHtyZXNwb25zZUVycm9yfWApKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhTdGFydCcsIGFqYXhQcm9taXNlLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFByb21pc2UnKTtcbiAgICAgICAgICAgIGV2ZW50LnByb21pc2UgPSBhamF4UHJvbWlzZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhamF4UHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBmb3IgdXBkYXRpbmcgdGhlIHBhcnRpYWxzIGZyb20gdGhlIEFKQVggcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBJZiBhbnkgcGFydGlhbHMgYXJlIHJldHVybmVkIGZyb20gdGhlIEFKQVggcmVzcG9uc2UsIHRoaXMgbWV0aG9kIHdpbGwgYWxzbyBhY3Rpb24gdGhlIHBhcnRpYWwgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIG9iamVjdCB3aGljaCB0cmFja3Mgd2hlbiB0aGUgcGFydGlhbCB1cGRhdGUgaXMgY29tcGxldGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBwcm9jZXNzVXBkYXRlKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJlZm9yZVVwZGF0ZS5hcHBseSh0aGlzLCBbcmVzcG9uc2VdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFeHRyYWN0IHBhcnRpYWwgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxzID0ge307XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDgpICE9PSAnWF9XSU5URVInKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcnRpYWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfQVNTRVRTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4QmVmb3JlVXBkYXRlJywgcmVzcG9uc2UsIHRoaXMpO1xuICAgICAgICAgICAgcHJvbWlzZXMudGhlbihcbiAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Fzc2V0cyhyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1VwZGF0ZShwYXJ0aWFscykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgSFRNTCByZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBwYXJ0aWFscyB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnRpYWxzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZG9VcGRhdGUocGFydGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhZmZlY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXJ0aWFscykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcGFydGlhbCwgY29udGVudF0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RvciA9ICh0aGlzLm9wdGlvbnMudXBkYXRlICYmIHRoaXMub3B0aW9ucy51cGRhdGVbcGFydGlhbF0pXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5vcHRpb25zLnVwZGF0ZVtwYXJ0aWFsXVxuICAgICAgICAgICAgICAgICAgICA6IHBhcnRpYWw7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9kZSA9ICdyZXBsYWNlJztcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ2FwcGVuZCc7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3Iuc3Vic3RyKDAsIDEpID09PSAnXicpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdwcmVwZW5kJztcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcjJyAmJiBzZWxlY3Rvci5zdWJzdHIoMCwgMSkgIT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ25vb3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXBwZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgKz0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJlcGVuZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudCArIGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdub29wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVwbGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWQucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSB1cGRhdGUgZXZlbnQgZm9yIGVhY2ggZWxlbWVudCB0aGF0IGlzIHVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4VXBkYXRlJywgZWxlbWVudCwgY29udGVudCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheFVwZGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhVcGRhdGVDb21wbGV0ZScsIGFmZmVjdGVkLCB0aGlzKTtcblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIHJlc3BvbnNlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBmbGFzaFxuICAgICAqIG1lc3NhZ2VzIHRvIGhhbmRsZSwgb3IgYW55IHJlZGlyZWN0cyB0byBiZSB1bmRlcnRha2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2VzcyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2Vzcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgYW55IGZ1cnRoZXIgcmVzcG9uc2UgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4U3VjY2VzcycsIHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciByZXNwb25zZSBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheERvbmUnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZURhdGEgPSB0aGlzLnJlc3BvbnNlRGF0YTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoICYmIHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NGbGFzaE1lc3NhZ2VzKHJlc3BvbnNlLlhfV0lOVEVSX0ZMQVNIX01FU1NBR0VTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBhIHJlZGlyZWN0IGZyb20gdGhlIHJlc3BvbnNlLCBvciB1c2UgdGhlIHJlZGlyZWN0IGFzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlZGlyZWN0KHRoaXMucmVkaXJlY3QgfHwgcmVzcG9uc2UuWF9XSU5URVJfUkVESVJFQ1QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIGZpcmVzIG9mZiBhbGwgbmVjZXNzYXJ5IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgZXJyb3IgcmVzcG9uc2UsIGllLiBpZiB0aGVyZSdzIGFueSBlcnJvciBvclxuICAgICAqIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8RXJyb3J9IGVycm9yXG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvcih0aGlzLnJlc3BvbnNlRXJyb3IsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yJywgdGhpcy5yZXNwb25zZUVycm9yLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSBlbGVtZW50IHRvIGNhbmNlbCBhbnkgZnVydGhlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheEZhaWwnLCB7IGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBza2lwRXJyb3IgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX0ZJRUxEUykge1xuICAgICAgICAgICAgICAgIHNraXBFcnJvciA9IHRoaXMucHJvY2Vzc1ZhbGlkYXRpb25FcnJvcnMoZXJyb3IuWF9XSU5URVJfRVJST1JfRklFTERTKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycm9yLlhfV0lOVEVSX0VSUk9SX01FU1NBR0UgJiYgIXNraXBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yTWVzc2FnZShlcnJvci5YX1dJTlRFUl9FUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSByZWRpcmVjdCByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2Vzc29yIHdpbGwgc2ltcGx5IHJlZGlyZWN0IHRoZSB1c2VyIGluIHRoZWlyIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheFJlZGlyZWN0YCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBvblxuICAgICAqIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZVJlZGlyZWN0UmVzcG9uc2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiByZWRpcmVjdCB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcm9jZXNzUmVkaXJlY3QodXJsKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCByZWRpcmVjdCBoYW5kbGVyLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgZG9uJ3QgcnVuIHRoZSByZWRpcmVjdC5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlUmVkaXJlY3RSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVSZWRpcmVjdFJlc3BvbnNlLmFwcGx5KHRoaXMsIFt1cmxdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgcmVkaXJlY3RcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4UmVkaXJlY3QnLCB1cmwsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgQUpBWCByZXF1ZXN0IGlzIGZpbmlzaGVkIGlmIHdlJ3JlIHN0aWxsIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgbG9hZGluZyBpbmRpY2F0b3IgZm9yIHJlZGlyZWN0cyB0aGF0IGp1c3QgY2hhbmdlIHRoZSBoYXNoIHZhbHVlIG9mXG4gICAgICAgIC8vIHRoZSBVUkwgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBwYWdlIHdpbGwgcHJvcGVybHkgc3RvcC5cbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2JlcmNtcy9vY3RvYmVyL2lzc3Vlcy8yNzgwXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50TmFtZSA9ICdhamF4UmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3NvciB3aWxsIHNpbXBseSBhbGVydCB0aGUgdXNlciB0aHJvdWdoIGEgc2ltcGxlIGBhbGVydCgpYCBjYWxsLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhFcnJvck1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlRXJyb3JNZXNzYWdlYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogZXJyb3IgbWVzc2FnZSBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJvY2Vzc0Vycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCBoYW5kbGVyIGZvciBlcnJvciBtZXNzYWdlcy4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvIG5vdCBwcm9jZXNzIHRoZSBlcnJvciBtZXNzYWdlc1xuICAgICAgICAvLyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRXJyb3JNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUVycm9yTWVzc2FnZS5hcHBseSh0aGlzLCBbbWVzc2FnZV0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIHRoZSBlcnJvciBtZXNzYWdlIGJlaW5nIHNob3duXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheEVycm9yTWVzc2FnZScsIG1lc3NhZ2UsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgc2hvdyBhIGJyb3dzZXIgZXJyb3IgbWVzc2FnZVxuICAgICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGZsYXNoIG1lc3NhZ2VzIGZyb20gdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgbm8gZmxhc2ggbWVzc2FnZSBoYW5kbGluZyB3aWxsIG9jY3VyLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhGbGFzaE1lc3NhZ2VzYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZUZsYXNoTWVzc2FnZXNgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiBmbGFzaCBtZXNzYWdlIGhhbmRsaW5nIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2VzXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcm9jZXNzRmxhc2hNZXNzYWdlcyhtZXNzYWdlcykge1xuICAgICAgICAvLyBSdW4gYSBjdXN0b20gcGVyLXJlcXVlc3QgZmxhc2ggaGFuZGxlci4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGRvbid0IHNob3cgdGhlIGZsYXNoIG1lc3NhZ2VcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlRmxhc2hNZXNzYWdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYW5kbGVGbGFzaE1lc3NhZ2VzLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4Rmxhc2hNZXNzYWdlcycsIG1lc3NhZ2VzLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIG5vIHZhbGlkYXRpb24gZXJyb3IgaGFuZGxpbmcgd2lsbCBvY2N1ci5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4VmFsaWRhdGlvbkVycm9yc2AgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVWYWxpZGF0aW9uRXJyb3JzYCBjYWxsYmFjayBvcHRpb24uIElmIGEgYGZhbHNlYCBpcyByZXR1cm5lZCBmcm9tIGVpdGhlciwgdGhlXG4gICAgICogdmFsaWRhdGlvbiBlcnJvciBoYW5kbGluZyB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHNcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzKGZpZWxkcykge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZVZhbGlkYXRpb25FcnJvcnMuYXBwbHkodGhpcywgW3RoaXMuZm9ybSwgZmllbGRzXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgYmVpbmcgaGFuZGxlZFxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhWYWxpZGF0aW9uRXJyb3JzJywgdGhpcy5mb3JtLCBmaWVsZHMsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFzc2V0cyByZXR1cm5lZCBieSBhbiBBSkFYIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBubyBhc3NldCBwcm9jZXNzaW5nIHdpbGwgb2NjdXIgYW5kIHRoaXMgd2lsbCByZXR1cm4gYSByZXNvbHZlZCBQcm9taXNlLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhMb2FkQXNzZXRzYCBldmVudC4gVGhpcyBldmVudCBpcyBjb25zaWRlcmVkIGJsb2NraW5nLCBhbmRcbiAgICAgKiBhbGxvd3MgYXNzZXRzIHRvIGJlIGxvYWRlZCBvciBwcm9jZXNzZWQgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCBhbnkgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFzc2V0c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHByb2Nlc3NBc3NldHMoYXNzZXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5nbG9iYWxQcm9taXNlRXZlbnQoJ2FqYXhMb2FkQXNzZXRzJywgYXNzZXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maXJtcyB0aGUgcmVxdWVzdCB3aXRoIHRoZSB1c2VyIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgbWV0aG9kLiBCeSBkZWZhdWx0LCBpdCB3aWxsIHVzZSB0aGUgYnJvd3NlcidzIGBjb25maXJtKClgIG1ldGhvZCB0byBxdWVyeSB0aGUgdXNlciB0b1xuICAgICAqIGNvbmZpcm0gdGhlIGFjdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBQcm9taXNlIHdpdGggYSBib29sZWFuIHZhbHVlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB1c2VyIGNvbmZpcm1lZFxuICAgICAqIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4Q29uZmlybU1lc3NhZ2VgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlQ29uZmlybU1lc3NhZ2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLFxuICAgICAqIHRoZSBjb25maXJtYXRpb24gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gZGVuaWVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgYXN5bmMgZG9Db25maXJtKCkge1xuICAgICAgICAvLyBBbGxvdyBmb3IgYSBjdXN0b20gaGFuZGxlciBmb3IgdGhlIGNvbmZpcm1hdGlvbiwgcGVyIHJlcXVlc3QuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUNvbmZpcm1NZXNzYWdlLmFwcGx5KHRoaXMsIFt0aGlzLmNvbmZpcm1dKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gcGx1Z2lucyBoYXZlIGN1c3RvbWlzZWQgdGhlIGNvbmZpcm1hdGlvbiwgdXNlIGEgc2ltcGxlIGJyb3dzZXIgY29uZmlybWF0aW9uLlxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQubGlzdGVuc1RvRXZlbnQoJ2FqYXhDb25maXJtTWVzc2FnZScpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5jb25maXJtKHRoaXMuY29uZmlybSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gY3VzdG9tIHBsdWdpbiBjb25maXJtYXRpb25zXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5zbm93Ym9hcmQuZ2xvYmFsUHJvbWlzZUV2ZW50KCdhamF4Q29uZmlybU1lc3NhZ2UnLCB0aGlzLmNvbmZpcm0sIHRoaXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdWxmaWxsZWQgPSBhd2FpdCBwcm9taXNlcztcbiAgICAgICAgICAgIGlmIChmdWxmaWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIG9mZiBjb21wbGV0aW9uIGV2ZW50cyBmb3IgdGhlIFJlcXVlc3QuXG4gICAgICovXG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGxldGUgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbXBsZXRlKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheERvbmUnLCB0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhBbHdheXMnKTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgZXZlbnQucmVzcG9uc2VEYXRhID0gdGhpcy5yZXNwb25zZURhdGE7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZUVycm9yID0gdGhpcy5yZXNwb25zZUVycm9yO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZSBvZmYgdGhlIGRlc3RydWN0b3JcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIGdldCBmb3JtKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5vcHRpb25zLmZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mb3JtO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xvc2VzdCgnZm9ybScpO1xuICAgIH1cblxuICAgIGdldCBjb250ZXh0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBoZWFkZXJzKCkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLCAvLyBLZWVwcyBjb21wYXRpYmlsaXR5IHdpdGggalF1ZXJ5IEFKQVhcbiAgICAgICAgICAgICdYLVdJTlRFUi1SRVFVRVNULUhBTkRMRVInOiB0aGlzLmhhbmRsZXIsXG4gICAgICAgICAgICAnWC1XSU5URVItUkVRVUVTVC1QQVJUSUFMUyc6IHRoaXMuZXh0cmFjdFBhcnRpYWxzKHRoaXMub3B0aW9ucy51cGRhdGUgfHwgW10pLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmZsYXNoKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVdJTlRFUi1SRVFVRVNULUZMQVNIJ10gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMueHNyZlRva2VuKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLVhTUkYtVE9LRU4nXSA9IHRoaXMueHNyZlRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9hZGluZyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG5cbiAgICBnZXQgcmVkaXJlY3QoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5vcHRpb25zLnJlZGlyZWN0ICYmIHRoaXMub3B0aW9ucy5yZWRpcmVjdC5sZW5ndGgpID8gdGhpcy5vcHRpb25zLnJlZGlyZWN0IDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZmxhc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmxhc2ggfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVzKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbGVzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoRm9ybURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmRlYnVnKCdUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBmaWxlIHVwbG9hZHMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldCB4c3JmVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5jb29raWUoKS5nZXQoJ1hTUkYtVE9LRU4nKTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9ICh0eXBlb2YgdGhpcy5vcHRpb25zLmRhdGEgPT09ICdvYmplY3QnKSA/IHRoaXMub3B0aW9ucy5kYXRhIDoge307XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5mb3JtIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGdldCBjb25maXJtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbmZpcm0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgcGFydGlhbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXBkYXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBleHRyYWN0UGFydGlhbHModXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh1cGRhdGUpLmpvaW4oJyYnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGFuIGVycm9yIHdpdGggdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIEFKQVggcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIG9yIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVlIHRvIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhjZXB0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGluZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRyYWNlXG4gICAgICogQHJldHVybnMge0Vycm9yfVxuICAgICAqL1xuICAgIHJlbmRlckVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbiwgZmlsZSwgbGluZSwgdHJhY2UpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGVycm9yLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbiB8fCBudWxsO1xuICAgICAgICBlcnJvci5maWxlID0gZmlsZSB8fCBudWxsO1xuICAgICAgICBlcnJvci5saW5lID0gbGluZSB8fCBudWxsO1xuICAgICAgICBlcnJvci50cmFjZSA9IHRyYWNlIHx8IFtdO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGEgZ2l2ZW4gc3RyaW5nIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIEFKQVggaGFuZGxlciBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0hhbmRsZXJOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIC9eKD86XFx3Kzp7Mn0pP29uW0EtWjAtOV0vLnRlc3QobmFtZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi8uLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBFbmFibGUgRGF0YSBBdHRyaWJ1dGVzIEFQSSBmb3IgQUpBWCByZXF1ZXN0cy5cbiAqXG4gKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBBSkFYIGZ1bmN0aW9uYWxpdHkgdGhhdCBpbmNsdWRlcyBoYW5kbGluZyBvZiBIVE1MIGRhdGEgYXR0cmlidXRlcyBmb3IgcHJvY2Vzc2luZ1xuICogQUpBWCByZXF1ZXN0cy4gSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIGJhc2UgQUpBWCBmdW5jdGlvbmFsaXR5IHRvIGFsbG93IGRldmVsb3BlcnMgdG8gb3B0LW91dCBvZiBkYXRhIGF0dHJpYnV0ZVxuICogcmVxdWVzdHMgaWYgdGhleSBkbyBub3QgaW50ZW5kIHRvIHVzZSB0aGVtLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRyaWJ1dGVSZXF1ZXN0IGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTZXR1cDogJ29uQWpheFNldHVwJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkeSBldmVudCBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEF0dGFjaGVzIGhhbmRsZXJzIHRvIHRoZSB3aW5kb3cgdG8gbGlzdGVuIGZvciBhbGwgcmVxdWVzdCBpbnRlcmFjdGlvbnMuXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoSGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlRGVmYXVsdEZvcm1WYWxpZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCcsICdqc29uUGFyc2VyJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIERldGFjaGVzIGFsbCBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5kZXRhY2hIYW5kbGVycygpO1xuXG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGF0dGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBkZWZhdWx0IGZvcm0gdmFsaWRhdGlvbiBmb3IgQUpBWCBmb3Jtcy5cbiAgICAgKlxuICAgICAqIEEgZm9ybSB0aGF0IGNvbnRhaW5zIGEgYGRhdGEtcmVxdWVzdGAgYXR0cmlidXRlIHRvIHNwZWNpZnkgYW4gQUpBWCBjYWxsIHdpdGhvdXQgaW5jbHVkaW5nIGEgYGRhdGEtYnJvd3Nlci12YWxpZGF0ZWBcbiAgICAgKiBhdHRyaWJ1dGUgbWVhbnMgdGhhdCB0aGUgQUpBWCBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGxpa2VseSBiZSBoYW5kbGluZyB0aGUgdmFsaWRhdGlvbiBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24oKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm1bZGF0YS1yZXF1ZXN0XTpub3QoW2RhdGEtYnJvd3Nlci12YWxpZGF0ZV0pJykuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ25vdmFsaWRhdGUnLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoZXMgdGhlIG5lY2Vzc2FyeSBoYW5kbGVycyBmb3IgYWxsIHJlcXVlc3QgaW50ZXJhY3Rpb25zLlxuICAgICAqL1xuICAgIGRldGFjaEhhbmRsZXJzKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB0aGlzLmNoYW5nZUhhbmRsZXIoZXZlbnQpKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLmNsaWNrSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5rZXlEb3duSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGV2ZW50KSA9PiB0aGlzLnN1Ym1pdEhhbmRsZXIoZXZlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGNoYW5nZXMgdG8gc2VsZWN0LCByYWRpbywgY2hlY2tib3ggYW5kIGZpbGUgaW5wdXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBjaGFuZ2VIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGNoYW5naW5nIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ3NlbGVjdFtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWZpbGVdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBjbGlja3Mgb24gaHlwZXJsaW5rcyBhbmQgYnV0dG9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgZXZlbnQgY2FuIGJ1YmJsZSB1cCB0aGUgaGllcmFyY2h5IHRvIGZpbmQgYSBzdWl0YWJsZSByZXF1ZXN0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdIVE1MJykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50RWxlbWVudC5tYXRjaGVzKFxuICAgICAgICAgICAgICAgICdhW2RhdGEtcmVxdWVzdF0sIGJ1dHRvbltkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPWJ1dHRvbl1bZGF0YS1yZXF1ZXN0XSwgaW5wdXRbdHlwZT1zdWJtaXRdW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5IHByZXNzZXMgb24gaW5wdXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGtleURvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGlucHV0dGluZyBpbnRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgdHlwZSBpcyB2YWxpZFxuICAgICAgICBjb25zdCB2YWxpZFR5cGVzID0gW1xuICAgICAgICAgICAgJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAnZGF0ZXRpbWUnLFxuICAgICAgICAgICAgJ2RhdGV0aW1lLWxvY2FsJyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICdyYWRpbycsXG4gICAgICAgICAgICAncmFuZ2UnLFxuICAgICAgICAgICAgJ3NlYXJjaCcsXG4gICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd0aW1lJyxcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICAgJ3dlZWsnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAodmFsaWRUeXBlcy5pbmRleE9mKGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmIGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtcmVxdWVzdF0nKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCcqW2RhdGEtdHJhY2staW5wdXRdJykpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tJbnB1dChldmVudC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzdWJtaXRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIHN1Ym1pdHRpbmcgYSB2YWxpZCBmb3JtXG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAnZm9ybVtkYXRhLXJlcXVlc3RdJyxcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgcmVxdWVzdCBvbiBhIGdpdmVuIGVsZW1lbnQsIHVzaW5nIGl0cyBkYXRhIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgcHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBTdHJpbmcoZGF0YS5yZXF1ZXN0KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNvbmZpcm06ICgncmVxdWVzdENvbmZpcm0nIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdENvbmZpcm0pIDogbnVsbCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiAoJ3JlcXVlc3RSZWRpcmVjdCcgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0UmVkaXJlY3QpIDogbnVsbCxcbiAgICAgICAgICAgIGxvYWRpbmc6ICgncmVxdWVzdExvYWRpbmcnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdExvYWRpbmcpIDogbnVsbCxcbiAgICAgICAgICAgIGZsYXNoOiAoJ3JlcXVlc3RGbGFzaCcgaW4gZGF0YSksXG4gICAgICAgICAgICBmaWxlczogKCdyZXF1ZXN0RmlsZXMnIGluIGRhdGEpLFxuICAgICAgICAgICAgYnJvd3NlclZhbGlkYXRlOiAoJ3JlcXVlc3RCcm93c2VyVmFsaWRhdGUnIGluIGRhdGEpLFxuICAgICAgICAgICAgZm9ybTogKCdyZXF1ZXN0Rm9ybScgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0Rm9ybSkgOiBudWxsLFxuICAgICAgICAgICAgdXJsOiAoJ3JlcXVlc3RVcmwnIGluIGRhdGEpID8gU3RyaW5nKGRhdGEucmVxdWVzdFVybCkgOiBudWxsLFxuICAgICAgICAgICAgdXBkYXRlOiAoJ3JlcXVlc3RVcGRhdGUnIGluIGRhdGEpID8gdGhpcy5wYXJzZURhdGEoU3RyaW5nKGRhdGEucmVxdWVzdFVwZGF0ZSkpIDogW10sXG4gICAgICAgICAgICBkYXRhOiAoJ3JlcXVlc3REYXRhJyBpbiBkYXRhKSA/IHRoaXMucGFyc2VEYXRhKFN0cmluZyhkYXRhLnJlcXVlc3REYXRhKSkgOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5yZXF1ZXN0KGVsZW1lbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYW4gQUpBWCByZXF1ZXN0IHZpYSBIVE1MIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKi9cbiAgICBvbkFqYXhTZXR1cChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSByZXF1ZXN0LmVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0UGFyZW50UmVxdWVzdERhdGEocmVxdWVzdC5lbGVtZW50KSxcbiAgICAgICAgICAgIC4uLnJlcXVlc3Qub3B0aW9ucy5kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24nKSAmJiAhcmVxdWVzdC5mb3JtICYmIGZpZWxkTmFtZSAmJiAhcmVxdWVzdC5vcHRpb25zLmRhdGFbZmllbGROYW1lXSkge1xuICAgICAgICAgICAgZGF0YVtmaWVsZE5hbWVdID0gcmVxdWVzdC5lbGVtZW50LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5vcHRpb25zLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhbmQgY29sbGF0ZXMgYWxsIGRhdGEgZnJvbSBlbGVtZW50cyB1cCB0aGUgRE9NIGhpZXJhcmNoeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXRQYXJlbnRSZXF1ZXN0RGF0YSh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMucmV2ZXJzZSgpO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZWxlbWVudC5kYXRhc2V0O1xuXG4gICAgICAgICAgICBpZiAoJ3JlcXVlc3REYXRhJyBpbiBlbGVtZW50RGF0YSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyc2VEYXRhKGVsZW1lbnREYXRhLnJlcXVlc3REYXRhKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgZGF0YSBpbiB0aGUgV2ludGVyL09jdG9iZXIgSlNPTiBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgcGFyc2VEYXRhKGRhdGEpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvbnBhcnNlcigpLnBhcnNlKGB7JHtkYXRhfX1gKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nIHRoZSBkYXRhIGF0dHJpYnV0ZSBvbiBlbGVtZW50OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrSW5wdXQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZSB9ID0gZWxlbWVudC5kYXRhc2V0O1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGVsZW1lbnQuZGF0YXNldC50cmFja0lucHV0IHx8IDMwMDtcblxuICAgICAgICBpZiAobGFzdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbGFzdFZhbHVlID09PSBlbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpO1xuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBoaWVyYXJjaHkgYW5kIGZpbmQgYSBmb3JtIHRoYXQgc2VuZHMgYW4gQUpBWCBxdWVyeVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBjdXJyZW50RWxlbWVudC5kYXRhc2V0LnJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdE9uRWxlbWVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIHJlc2V0VHJhY2tJbnB1dFRpbWVyKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbnB1dFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQXNzZXQgTG9hZGVyLlxuICpcbiAqIFByb3ZpZGVzIHNpbXBsZSBhc3NldCBsb2FkaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIFNub3dib2FyZCwgbWFraW5nIGl0IGVhc3kgdG8gcHJlLWxvYWQgaW1hZ2VzIG9yXG4gKiBpbmNsdWRlIEphdmFTY3JpcHQgb3IgQ1NTIGFzc2V0cyBvbiB0aGUgZmx5LlxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoaXMgbG9hZGVyIHdpbGwgbGlzdGVuIHRvIGFueSBhc3NldHMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkIHRvIGxvYWQgaW4gYW4gQUpBWFxuICogcmVzcG9uc2UsIHN1Y2ggYXMgcmVzcG9uc2VzIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogWW91IGNhbiBhbHNvIGxvYWQgYXNzZXRzIG1hbnVhbGx5IGJ5IGNhbGxpbmcgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBgYGBqc1xuICogU25vd2JvYXJkLmFkZFBsdWdpbignYXNzZXRMb2FkZXInLCBBc3NldExvYWRlcik7XG4gKiBTbm93Ym9hcmQuYXNzZXRMb2FkZXIoKS5wcm9jZXNzQXNzZXRzKGFzc2V0cyk7XG4gKiBgYGBcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXNzZXRMb2FkZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFqYXhMb2FkQXNzZXRzOiAnbG9hZCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd1cmwnLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYW5kIGxvYWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogVGhlIGBhc3NldHNgIHByb3BlcnR5IG9mIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGFuIG9iamVjdCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGtleXMgYW5kIGFuXG4gICAgICogYXJyYXkgb2YgcGF0aHM6XG4gICAgICpcbiAgICAgKiAtIGBqc2A6IEFuIGFycmF5IG9mIEphdmFTY3JpcHQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgY3NzYDogQW4gYXJyYXkgb2YgQ1NTIHN0eWxlc2hlZXQgVVJMcyB0byBsb2FkXG4gICAgICogLSBgaW1nYDogQW4gYXJyYXkgb2YgaW1hZ2UgVVJMcyB0byBwcmUtbG9hZFxuICAgICAqXG4gICAgICogQm90aCBganNgIGFuZCBgY3NzYCBmaWxlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5qZWN0ZWQsIGhvd2V2ZXIgYGltZ2AgZmlsZXMgd2lsbCBub3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCByZXF1aXJlZCBhc3NldHMgYXJlIGxvYWRlZC4gSWYgYW5cbiAgICAgKiBhc3NldCBmYWlscyB0byBsb2FkLCB0aGlzIFByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEVTTGludCAqUkVBTExZKiBkb2Vzbid0IGxpa2UgdGhpcyBjb2RlLCBidXQgaWdub3JlIGl0LiBJdCdzIHRoZSBvbmx5IHdheSBpdCB3b3Jrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhc3NldHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGFzc2V0cykge1xuICAgICAgICBpZiAoYXNzZXRzLmpzICYmIGFzc2V0cy5qcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBhc3NldHMuanMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3NldHMuY3NzICYmIGFzc2V0cy5jc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBhc3NldHMuY3NzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU3R5bGUoc3R5bGUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2V0cy5pbWcgJiYgYXNzZXRzLmltZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGFzc2V0cy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbWFnZShpbWFnZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBhbmQgbG9hZHMgYSBKYXZhU2NyaXB0IFVSTCBpbnRvIHRoZSBET00uXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBjbG9zaW5nIGA8L2JvZHk+YCB0YWcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NyaXB0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZFNjcmlwdChzY3JpcHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgc2NyaXB0IFVSTFxuICAgICAgICAgICAgc2NyaXB0ID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc2NyaXB0KTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBzY3JpcHQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHtzY3JpcHR9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHNjcmlwdFxuICAgICAgICAgICAgY29uc3QgZG9tU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBkb21TY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgICAgICAgICAgZG9tU2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgc2NyaXB0KTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnc2NyaXB0Jywgc2NyaXB0LCBkb21TY3JpcHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tU2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzY3JpcHQnLCBzY3JpcHQsIGRvbVNjcmlwdCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgc2NyaXB0IGZpbGU6IFwiJHtzY3JpcHR9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRvbVNjcmlwdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdHMgYW5kIGxvYWRzIGEgQ1NTIHN0eWxlc2hlZXQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogVGhlIHN0eWxlc2hlZXQgd2lsbCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhlIGNsb3NpbmcgYDwvaGVhZD5gIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHlsZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGxvYWRTdHlsZShzdHlsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBzdHlsZSBVUkxcbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoc3R5bGUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHN0eWxlc2hlZXQgaXMgbm90IGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1baHJlZj1cIiR7c3R5bGV9XCJdYCk7XG4gICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHN0eWxlc2hlZXRcbiAgICAgICAgICAgIGNvbnN0IGRvbUNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgIGRvbUNzcy5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XG4gICAgICAgICAgICBkb21Dc3Muc2V0QXR0cmlidXRlKCdocmVmJywgc3R5bGUpO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmxvYWRlZCcsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQ3NzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdzdHlsZScsIHN0eWxlLCBkb21Dc3MpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIHN0eWxlc2hlZXQgZmlsZTogXCIke3N0eWxlfVwiYCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChkb21Dc3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmUtbG9hZHMgYW4gaW1hZ2UuXG4gICAgICpcbiAgICAgKiBUaGUgaW1hZ2Ugd2lsbCBub3QgYmUgaW5qZWN0ZWQgaW50byB0aGUgRE9NLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGltYWdlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZEltYWdlKGltYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHNjcmlwdCBVUkxcbiAgICAgICAgICAgIGltYWdlID0gdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoaW1hZ2UpO1xuXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5sb2FkZWQnLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIuZXJyb3InLCAnaW1hZ2UnLCBpbWFnZSwgaW1nKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBpbWFnZSBmaWxlOiBcIiR7aW1hZ2V9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltZy5zcmMgPSBpbWFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBBbGxvd3MgYXR0YWNoaW5nIGEgbG9hZGluZyBjbGFzcyBvbiBlbGVtZW50cyB0aGF0IGFuIEFKQVggcmVxdWVzdCBpcyB0YXJnZXRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dGFjaExvYWRpbmcgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5pY2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsncmVxdWVzdCddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWpheFN0YXJ0OiAnYWpheFN0YXJ0JyxcbiAgICAgICAgICAgIGFqYXhEb25lOiAnYWpheERvbmUnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFqYXhTdGFydChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgY29uc3QgbG9hZEVsZW1lbnRzID0gcmVxdWVzdC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWF0dGFjaC1sb2FkaW5nXScpO1xuICAgICAgICAgICAgaWYgKGxvYWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9hZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKHJlcXVlc3QuZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWpheERvbmUoZGF0YSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRFbGVtZW50cyA9IHJlcXVlc3QuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hdHRhY2gtbG9hZGluZ10nKTtcbiAgICAgICAgICAgIGlmIChsb2FkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxvYWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5lbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldExvYWRpbmdDbGFzcyhyZXF1ZXN0LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExvYWRpbmdDbGFzcyhlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAoZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gJycpXG4gICAgICAgICAgICA/IGVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nXG4gICAgICAgICAgICA6ICd3bi1sb2FkaW5nJztcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogRGF0YSBjb25maWd1cmF0aW9uIHByb3ZpZGVyLlxuICpcbiAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBwYXNzaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSB0aHJvdWdoIGFuIGVsZW1lbnQncyBkYXRhIGF0dHJpYnV0ZXMuIFRoaXNcbiAqIGlzIGdlbmVyYWxseSB1c2VkIGZvciB3aWRnZXRzIG9yIFVJIGludGVyYWN0aW9ucyB0byBjb25maWd1cmUgdGhlbS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YUNvbmZpZyBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbG9jYWxDb25maWdcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoaW5zdGFuY2UsIGVsZW1lbnQsIGxvY2FsQ29uZmlnKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBTbm93Ym9hcmQgcGx1Z2luIHRvIGVuYWJsZSBkYXRhIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgZXh0cmFjdGVkIGZyb20gSFRNTCBlbGVtZW50cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmxvY2FsQ29uZmlnID0gbG9jYWxDb25maWcgfHwge307XG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25maWcgPSB7fTtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlnIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIGBjb25maWdgIHBhcmFtZXRlciBpcyB1bnNwZWNpZmllZCwgcmV0dXJucyB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnXG4gICAgICovXG4gICAgZ2V0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb25maWdbY29uZmlnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb25maWcgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUsIGF0IHJ1bnRpbWUsIGFueSBjb25maWd1cmF0aW9uIHZhbHVlIGFzIG5lY2Vzc2FyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RcbiAgICAgKi9cbiAgICBzZXQoY29uZmlnLCB2YWx1ZSwgcGVyc2lzdCkge1xuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGNvbmZpZ3VyYXRpb24ga2V5IHRvIHNldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHBlcnNpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhc2V0W2NvbmZpZ10gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxDb25maWdbY29uZmlnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaGVzIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIG1ha2UgY2hhbmdlcyB0byB0aGUgZGF0YSBjb25maWcgb24gYSBET00gbGV2ZWwgYW5kIHJlLWFwcGx5IHRoZW1cbiAgICAgKiB0byB0aGUgY29uZmlnIG9uIHRoZSBKYXZhU2NyaXB0IHNpZGUuXG4gICAgICovXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy5hY2NlcHRlZENvbmZpZ3MgPSB0aGlzLmdldEFjY2VwdGVkQ29uZmlncygpO1xuICAgICAgICB0aGlzLmluc3RhbmNlQ29uZmlnID0gdGhpcy5wcm9jZXNzQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkYXRhIGNvbmZpZy5cbiAgICAgKlxuICAgICAqIElmIGFuIGluc3RhbmNlIGhhcyBhbiBgYWNjZXB0QWxsRGF0YUNvbmZpZ3NgIHByb3BlcnR5LCBzZXQgdG8gYHRydWVgLCB0aGVuIGFsbCBkYXRhXG4gICAgICogYXR0cmlidXRlcyB3aWxsIGJlIGF2YWlsYWJsZSBhcyBjb25maWd1cmF0aW9uIHZhbHVlcy4gVGhpcyBjYW4gYmUgYSBzZWN1cml0eSBjb25jZXJuLCBzb1xuICAgICAqIHRyZWFkIGNhcmVmdWxseS5cbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSwgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUga2V5cyBhdmFpbGFibGUgaW4gYW4gb2JqZWN0XG4gICAgICogcmV0dXJuZWQgYnkgYSBgZGVmYXVsdHMoKWAgbWV0aG9kIGluIHRoZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXXxib29sZWFufVxuICAgICAqL1xuICAgIGdldEFjY2VwdGVkQ29uZmlncygpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5hY2NlcHRBbGxEYXRhQ29uZmlncyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0aGlzLmluc3RhbmNlLmFjY2VwdEFsbERhdGFDb25maWdzID09PSB0cnVlXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlZmF1bHRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBpbnN0YW5jZSBlaXRoZXIgZG9lcyBub3QgaGF2ZSBhIGBkZWZhdWx0cygpYCBtZXRob2QsIG9yXG4gICAgICogdGhlIG1ldGhvZCBpdHNlbGYgZG9lcyBub3QgcmV0dXJuIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBMb2FkcyB1cCB0aGUgZGVmYXVsdHMsIHRoZW4gcG9wdWxhdGVzIGl0IHdpdGggYW55IGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBkYXRhXG4gICAgICogYXR0cmlidXRlcywgYmFzZWQgb24gdGhlIHJ1bGVzIG9mIHRoZSBhY2NlcHRlZCBjb25maWd1cmF0aW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgdGhlbiBjYWNoZWQgYW5kIGF2YWlsYWJsZSB0aHJvdWdoIGBjb25maWcuZ2V0KClgIGNhbGxzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBwcm9jZXNzQ29uZmlnKCkge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldERlZmF1bHRzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDb25maWdzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZWxlbWVudC5kYXRhc2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY2NlcHRlZENvbmZpZ3MgPT09IHRydWUgfHwgdGhpcy5hY2NlcHRlZENvbmZpZ3MuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1trZXldID0gdGhpcy5jb2VyY2VWYWx1ZSh0aGlzLmVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubG9jYWxDb25maWcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ29uZmlncyA9PT0gdHJ1ZSB8fCB0aGlzLmFjY2VwdGVkQ29uZmlncy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmxvY2FsQ29uZmlnW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29lcmNlcyBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgSmF2YVNjcmlwdC5cbiAgICAgKlxuICAgICAqIFRha2VzIHRoZSBzdHJpbmcgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YSBhdHRyaWJ1dGUgYW5kIGNvZXJjZXMgaXQgaW50byBhIG1vcmUgc3VpdGFibGVcbiAgICAgKiB0eXBlIGZvciBKYXZhU2NyaXB0IHByb2Nlc3NpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgY29lcmNlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXG4gICAgICAgIC8vIE51bGwgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5kZWZpbmVkIHZhbHVlXG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYXNlNjQgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlLnN0YXJ0c1dpdGgoJ2Jhc2U2NDonKSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0c3RyID0gc3RyaW5nVmFsdWUucmVwbGFjZSgvXmJhc2U2NDovLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihiYXNlNjRzdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29lcmNlVmFsdWUoZGVjb2RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb29sZWFuIHZhbHVlXG4gICAgICAgIGlmIChbJ3RydWUnLCAneWVzJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChbJ2ZhbHNlJywgJ25vJ10uaW5jbHVkZXMoc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE51bWVyaWMgdmFsdWVcbiAgICAgICAgaWYgKC9eWy0rXT9bMC05XSsoXFwuWzAtOV0rKT8kLy50ZXN0KHN0cmluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihzdHJpbmdWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKU09OIHZhbHVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbm93Ym9hcmQuanNvblBhcnNlcigpLnBhcnNlKHN0cmluZ1ZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIChzdHJpbmdWYWx1ZSA9PT0gJycpID8gdHJ1ZSA6IHN0cmluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGZsYXNoIG1lc3NhZ2VzIGZvciB0aGUgQ01TLlxuICpcbiAqIEZsYXNoIG1lc3NhZ2VzIHdpbGwgcG9wIHVwIGF0IHRoZSB0b3AgY2VudGVyIG9mIHRoZSBwYWdlIGFuZCB3aWxsIHJlbWFpbiBmb3IgNyBzZWNvbmRzIGJ5IGRlZmF1bHQuIEhvdmVyaW5nIG92ZXJcbiAqIHRoZSBtZXNzYWdlIHdpbGwgcmVzZXQgYW5kIHBhdXNlIHRoZSB0aW1lci4gQ2xpY2tpbmcgb24gdGhlIGZsYXNoIG1lc3NhZ2Ugd2lsbCBkaXNtaXNzIGl0LlxuICpcbiAqIEFyZ3VtZW50czpcbiAqICAtIFwibWVzc2FnZVwiOiBUaGUgY29udGVudCBvZiB0aGUgZmxhc2ggbWVzc2FnZS4gSFRNTCBpcyBhY2NlcHRlZC5cbiAqICAtIFwidHlwZVwiOiBUaGUgdHlwZSBvZiBmbGFzaCBtZXNzYWdlLiBUaGlzIGlzIGFwcGVuZGVkIGFzIGEgY2xhc3MgdG8gdGhlIGZsYXNoIG1lc3NhZ2UgaXRzZWxmLlxuICogIC0gXCJkdXJhdGlvblwiOiBIb3cgbG9uZyB0aGUgZmxhc2ggbWVzc2FnZSB3aWxsIHN0YXkgdmlzaWJsZSBmb3IsIGluIHNlY29uZHMuIERlZmF1bHQ6IDcgc2Vjb25kcy5cbiAqXG4gKiBVc2FnZTpcbiAqICAgICAgU25vd2JvYXJkLmZsYXNoKCdUaGlzIGlzIGEgZmxhc2ggbWVzc2FnZScsICdpbmZvJywgOCk7XG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsYXNoIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0KG1lc3NhZ2UsIHR5cGUsIGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgJ2RlZmF1bHQnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gTnVtYmVyKGR1cmF0aW9uIHx8IDcpO1xuXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFzaCBkdXJhdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBvciB6ZXJvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsndHJhbnNpdGlvbiddO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBmbGFzaCBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRpbWVvdXQgaXMgY2xlYXJlZCBpZiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVzdHJ1Y3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2hUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2gpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2guY3JlYXRlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5mbGFzaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICB0aGlzLmZsYXNoLmlubmVySFRNTCA9IHRoaXMubWVzc2FnZTtcbiAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCdmbGFzaC1tZXNzYWdlJywgdGhpcy50eXBlKTtcbiAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY29udHJvbCcpO1xuICAgICAgICB0aGlzLmZsYXNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5yZW1vdmUoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4gdGhpcy5zdG9wVGltZXIoKSk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB0aGlzLnN0YXJ0VGltZXIoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lci5jbGFzc0xpc3QuYWRkKCdmbGFzaC10aW1lcicpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoVGltZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5jbGFzc0xpc3QuYWRkKCduby10aW1lcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGJvZHlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmZsYXNoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdzaG93JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnZmxhc2gucmVtb3ZlJywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5zdG9wVGltZXIoKTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2gsICdoaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2ggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGZsYXNoIG1lc3NhZ2VzIGF2YWlsYWJsZSBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSA+IGRpdi5mbGFzaC1tZXNzYWdlJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5yZW1vdmUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSB0aW1lciBmb3IgdGhpcyBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YXJ0VGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbWVyVHJhbnMgPSB0aGlzLnNub3dib2FyZC50cmFuc2l0aW9uKHRoaXMuZmxhc2hUaW1lciwgJ3RpbWVvdXQnLCBudWxsLCBgJHt0aGlzLmR1cmF0aW9ufS4wc2AsIHRydWUpO1xuICAgICAgICB0aGlzLnRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW1vdmUoKSwgdGhpcy5kdXJhdGlvbiAqIDEwMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdGltZXIgZm9yIHRoaXMgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICBzdG9wVGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyVHJhbnMpIHtcbiAgICAgICAgICAgIHRoaXMudGltZXJUcmFucy5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRGVmaW5lcyBhIGRlZmF1bHQgbGlzdGVuZXIgZm9yIGZsYXNoIGV2ZW50cy5cbiAqXG4gKiBDb25uZWN0cyB0aGUgRmxhc2ggcGx1Z2luIHRvIHZhcmlvdXMgZXZlbnRzIHRoYXQgdXNlIGZsYXNoIG1lc3NhZ2VzLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbGFzaExpc3RlbmVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuaWNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ2ZsYXNoJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhFcnJvck1lc3NhZ2U6ICdhamF4RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgIGFqYXhGbGFzaE1lc3NhZ2VzOiAnYWpheEZsYXNoTWVzc2FnZXMnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvIGZsYXNoIG1lc3NhZ2VzIGZvciBQSFAgZmxhc2ggcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIHJlYWR5KCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jb250cm9sPVwiZmxhc2gtbWVzc2FnZVwiXScpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmZsYXNoKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5mbGFzaFR5cGUsXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmZsYXNoRHVyYXRpb24sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhIGZsYXNoIG1lc3NhZ2UgZm9yIEFKQVggZXJyb3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBhamF4RXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBmbGFzaCBtZXNzYWdlcyByZXR1cm5lZCBkaXJlY3RseSBmcm9tIEFKQVggZnVuY3Rpb25hbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlc1xuICAgICAqL1xuICAgIGFqYXhGbGFzaE1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG1lc3NhZ2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Nzc0NsYXNzLCBtZXNzYWdlXSA9IGVudHJ5O1xuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2gobWVzc2FnZSwgY3NzQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQWRkcyBBSkFYLWRyaXZlbiBmb3JtIHZhbGlkYXRpb24gdG8gU25vd2JvYXJkIHJlcXVlc3RzLlxuICpcbiAqIERvY3VtZW50YXRpb24gZm9yIHRoaXMgZmVhdHVyZSBjYW4gYmUgZm91bmQgaGVyZTpcbiAqIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3Nub3dib2FyZC9leHRyYXMjYWpheC12YWxpZGF0aW9uXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1WYWxpZGF0aW9uIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZXJyb3JCYWdzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2NsZWFyVmFsaWRhdGlvbicsXG4gICAgICAgICAgICBhamF4VmFsaWRhdGlvbkVycm9yczogJ2RvVmFsaWRhdGlvbicsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZHkgZXZlbnQgaGFuZGxlci5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0RXJyb3JCYWdzKGRvY3VtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhbiBBSkFYIHJlc3BvbnNlIGFuZCBwYXNzZXMgdGhlbSB0aHJvdWdoIHRvIHRoZSBlcnJvciBiYWdzLlxuICAgICAqXG4gICAgICogVGhpcyBoYW5kbGVyIHJldHVybnMgZmFsc2UgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIHZhbGlkYXRpb24gaGFuZGxpbmcsIGFuZCBwcmV2ZW50cyB0aGUgZmxhc2hcbiAgICAgKiBtZXNzYWdlIHRoYXQgaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQgZm9yIGZpZWxkIGVycm9ycyBpbiBBSkFYIHJlcXVlc3RzIGZyb20gc2hvd2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBkb1ZhbGlkYXRpb24oZm9ybSwgaW52YWxpZEZpZWxkcywgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50ICYmIHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LnJlcXVlc3RWYWxpZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gZm9ybSk7XG4gICAgICAgIGVycm9yQmFncy5mb3JFYWNoKChlcnJvckJhZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFueSB2YWxpZGF0aW9uIGVycm9ycyBpbiB0aGUgZ2l2ZW4gZm9ybS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJvbWlzZVxuICAgICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNsZWFyVmFsaWRhdGlvbihwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50LmRhdGFzZXQucmVxdWVzdFZhbGlkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlcXVlc3QuZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JCYWdzID0gdGhpcy5lcnJvckJhZ3MuZmlsdGVyKChlcnJvckJhZykgPT4gZXJyb3JCYWcuZm9ybSA9PT0gcmVxdWVzdC5mb3JtKTtcbiAgICAgICAgZXJyb3JCYWdzLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVFcnJvckJhZyhlcnJvckJhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIGVycm9yIGJhZ3MgKGVsZW1lbnRzIHdpdGggXCJkYXRhLXZhbGlkYXRlLWVycm9yXCIgYXR0cmlidXRlKSBhbmQgbGlua3MgdGhlbSB0byBhXG4gICAgICogcGxhY2Vob2xkZXIgYW5kIGZvcm0uXG4gICAgICpcbiAgICAgKiBUaGUgZXJyb3IgYmFncyB3aWxsIGJlIGluaXRpYWxseSBoaWRkZW4sIGFuZCB3aWxsIG9ubHkgc2hvdyB3aGVuIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdE5vZGVcbiAgICAgKi9cbiAgICBjb2xsZWN0RXJyb3JCYWdzKHJvb3ROb2RlKSB7XG4gICAgICAgIHJvb3ROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXSwgW2RhdGEtdmFsaWRhdGUtZm9yXScpLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZXJyb3JCYWcuY2xvc2VzdCgnZm9ybVtkYXRhLXJlcXVlc3QtdmFsaWRhdGVdJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgZXJyb3IgYmFnIGRvZXMgbm90IHJlc2lkZSB3aXRoaW4gYSB2YWxpZGF0aW5nIGZvcm0sIHJlbW92ZSBpdFxuICAgICAgICAgICAgaWYgKCFmb3JtKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlcnJvckJhZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5kIG1lc3NhZ2UgbGlzdCBub2RlLCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCBtZXNzYWdlTGlzdEVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVycm9yQmFnLm1hdGNoZXMoJ1tkYXRhLXZhbGlkYXRlLWVycm9yXScpKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50ID0gZXJyb3JCYWcucXVlcnlTZWxlY3RvcignW2RhdGEtbWVzc2FnZV0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgbm9kZVxuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXJyb3IgYmFnIGFuZCByZXBsYWNlIHdpdGggcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yQmFnRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlcnJvckJhZyxcbiAgICAgICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9yOiAoZXJyb3JCYWcuZGF0YXNldC52YWxpZGF0ZUZvcilcbiAgICAgICAgICAgICAgICAgICAgPyBlcnJvckJhZy5kYXRhc2V0LnZhbGlkYXRlRm9yLnNwbGl0KC9cXHMqLFxccyovKVxuICAgICAgICAgICAgICAgICAgICA6ICcqJyxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQ6IChtZXNzYWdlTGlzdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZUxpc3RFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RBbmNob3I6IG51bGwsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZTogKGVycm9yQmFnLmRhdGFzZXQudmFsaWRhdGVGb3IpXG4gICAgICAgICAgICAgICAgICAgID8gKGVycm9yQmFnLnRleHRDb250ZW50ICE9PSAnJyB8fCBlcnJvckJhZy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBJZiBhbiBtZXNzYWdlIGxpc3QgZWxlbWVudCBleGlzdHMsIGNyZWF0ZSBhbm90aGVyIHBsYWNlaG9sZGVyIHRvIGFjdCBhcyBhbiBhbmNob3IgcG9pbnRcbiAgICAgICAgICAgIGlmIChtZXNzYWdlTGlzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlTGlzdEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtZXNzYWdlTGlzdEFuY2hvciwgbWVzc2FnZUxpc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlcnJvckJhZ0RhdGEubWVzc2FnZUxpc3RBbmNob3IgPSBtZXNzYWdlTGlzdEFuY2hvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3JCYWcucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocGxhY2Vob2xkZXIsIGVycm9yQmFnKTtcblxuICAgICAgICAgICAgdGhpcy5lcnJvckJhZ3MucHVzaChlcnJvckJhZ0RhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlcyBhbiBlcnJvciBiYWcsIHJlcGxhY2luZyB0aGUgZXJyb3IgbWVzc2FnZXMgd2l0aCBhIHBsYWNlaG9sZGVyIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKi9cbiAgICBoaWRlRXJyb3JCYWcoZXJyb3JCYWcpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZXJyb3JCYWcucGxhY2Vob2xkZXIsIGVycm9yQmFnLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYW4gZXJyb3IgYmFnIHdpdGggdGhlIGdpdmVuIGludmFsaWQgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yQmFnXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGludmFsaWRGaWVsZHNcbiAgICAgKi9cbiAgICBzaG93RXJyb3JCYWcoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVycm9yQmFnLmVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVycm9yQmFnLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVycm9yQmFnLmVsZW1lbnQsIGVycm9yQmFnLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvckJhZy52YWxpZGF0ZUZvciAhPT0gJyonKSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yQmFnLmN1c3RvbU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZpZWxkID0gT2JqZWN0LmtleXMoaW52YWxpZEZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGVycm9yQmFnLnZhbGlkYXRlRm9yLmluY2x1ZGVzKGZpZWxkKSlcbiAgICAgICAgICAgICAgICAgICAgLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgW2Vycm9yQmFnLmVsZW1lbnQuaW5uZXJIVE1MXSA9IGludmFsaWRGaWVsZHNbZmlyc3RGaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JCYWcubWVzc2FnZUxpc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGVycm9yQmFnLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdmFsaWRhdGlvbi1tZXNzYWdlXScpLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaW52YWxpZEZpZWxkcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbLCBlcnJvcnNdID0gZW50cnk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBlcnJvckJhZy5tZXNzYWdlTGlzdEVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5kYXRhc2V0LnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmlubmVySFRNTCA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICBlcnJvckJhZy5tZXNzYWdlTGlzdEFuY2hvci5hZnRlcihtZXNzYWdlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFtlcnJvckJhZy5lbGVtZW50LmlubmVySFRNTF0gPSBpbnZhbGlkRmllbGRzW09iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpLnNoaWZ0KCldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGVycm9yIGJhZyBhcHBsaWVzIGZvciB0aGUgZ2l2ZW4gaW52YWxpZCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW52YWxpZEZpZWxkc1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGVycm9yQmFnVmFsaWRhdGVzRmllbGQoZXJyb3JCYWcsIGludmFsaWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKGVycm9yQmFnLnZhbGlkYXRlRm9yID09PSAnKicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGludmFsaWRGaWVsZHMpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZXJyb3JCYWcudmFsaWRhdGVGb3IuaW5jbHVkZXMoZmllbGQpKVxuICAgICAgICAgICAgLmxlbmd0aCA+IDA7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBEaXNwbGF5cyBhIHN0cmlwZSBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHRoYXQgaW5kaWNhdGVzIGxvYWRpbmcuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0cmlwZUxvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmljZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydyZXF1ZXN0J107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgICAgIGFqYXhTdGFydDogJ2FqYXhTdGFydCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuY291bnRlciA9IDA7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVTdHJpcGUoKTtcbiAgICB9XG5cbiAgICBhamF4U3RhcnQocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5vcHRpb25zLnN0cmlwZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvdygpO1xuXG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZVN0cmlwZSgpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5zdHJpcGVMb2FkZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICB0aGlzLmluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGluZy1pbmRpY2F0b3InLCAnbG9hZGVkJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlLmNsYXNzTGlzdC5hZGQoJ3N0cmlwZScpO1xuICAgICAgICB0aGlzLnN0cmlwZUxvYWRlZC5jbGFzc0xpc3QuYWRkKCdzdHJpcGUtbG9hZGVkJyk7XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuYXBwZW5kQ2hpbGQodGhpcy5zdHJpcGUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZCh0aGlzLnN0cmlwZUxvYWRlZCk7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmluZGljYXRvcik7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jb3VudGVyICs9IDE7XG5cbiAgICAgICAgY29uc3QgbmV3U3RyaXBlID0gdGhpcy5zdHJpcGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZChuZXdTdHJpcGUpO1xuICAgICAgICB0aGlzLnN0cmlwZS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5zdHJpcGUgPSBuZXdTdHJpcGU7XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRlZCcpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3duLWxvYWRpbmcnKTtcbiAgICB9XG5cbiAgICBoaWRlKGZvcmNlKSB7XG4gICAgICAgIHRoaXMuY291bnRlciAtPSAxO1xuXG4gICAgICAgIGlmIChmb3JjZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvdW50ZXIgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3duLWxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogRW1iZWRzIHRoZSBcImV4dHJhc1wiIHN0eWxlc2hlZXQgaW50byB0aGUgcGFnZSwgaWYgaXQgaXMgbm90IGxvYWRlZCB0aHJvdWdoIHRoZSB0aGVtZS5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3R5bGVzaGVldExvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWFkeTogJ3JlYWR5JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZWFkeSgpIHtcbiAgICAgICAgbGV0IHN0eWxlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiBzdHlsZXNoZWV0IGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbcmVsPVwic3R5bGVzaGVldFwiXScpLmZvckVhY2goKGNzcykgPT4ge1xuICAgICAgICAgICAgaWYgKGNzcy5ocmVmLmVuZHNXaXRoKCcvbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2Nzcy9zbm93Ym9hcmQuZXh0cmFzLmNzcycpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFzdHlsZXNMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQuc2V0QXR0cmlidXRlKCdocmVmJywgdGhpcy5zbm93Ym9hcmQudXJsKCkuYXNzZXQoJy9tb2R1bGVzL3N5c3RlbS9hc3NldHMvY3NzL3Nub3dib2FyZC5leHRyYXMuY3NzJykpO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZXNoZWV0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBQcm92aWRlcyB0cmFuc2l0aW9uIHN1cHBvcnQgZm9yIGVsZW1lbnRzLlxuICpcbiAqIFRyYW5zaXRpb24gYWxsb3dzIENTUyB0cmFuc2l0aW9ucyB0byBiZSBjb250cm9sbGVkIGFuZCBjYWxsYmFja3MgdG8gYmUgcnVuIG9uY2UgY29tcGxldGVkLiBJdCB3b3JrcyBzaW1pbGFyIHRvIFZ1ZVxuICogdHJhbnNpdGlvbnMgd2l0aCAzIHN0YWdlcyBvZiB0cmFuc2l0aW9uLCBhbmQgY2xhc3NlcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSB0cmFuc2l0aW9uIG5hbWUgc3VmZml4ZWQgd2l0aFxuICogdGhlIHN0YWdlIG9mIHRyYW5zaXRpb246XG4gKlxuICogIC0gYGluYDogQSBjbGFzcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uLCByZW1vdmVkIGFmdGVyd2FyZHMuIFRoaXMgc2hvdWxkIGJlXG4gKiAgICAgIHVzZWQgdG8gZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICogIC0gYGFjdGl2ZWA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24gaXRzZWxmLlxuICogIC0gYG91dGA6IEEgY2xhc3MgYXNzaWduZWQgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uIGFuZCBrZXB0IHRvIHRoZSBlbmQgb2YgdGhlXG4gKiAgICAgIHRyYW5zaXRpb24uIFRoaXMgc2hvdWxkIGRlZmluZSB0aGUgZW5kIHN0YXRlIG9mIHRoZSB0cmFuc2l0aW9uLlxuICpcbiAqIFVzYWdlOlxuICogICAgICBTbm93Ym9hcmQudHJhbnNpdGlvbihkb2N1bWVudC5lbGVtZW50LCAndHJhbnNpdGlvbicsICgpID0+IHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgZWxlbWVudCBhZnRlciA3IHNlY29uZHMnKTtcbiAqICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gKiAgICAgIH0sICc3cycpO1xuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFuc2l0aW9uIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHRyYW5zaXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNpdGlvbiBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpdGlvbiwgdGhpcyBwcmVmaXhlcyB0aGUgc3RhZ2VzIG9mIHRyYW5zaXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uIEFuIG9wdGlvbmFsIG92ZXJyaWRlIG9uIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uLiBNdXN0IGJlIHNwZWNpZmllZCBhcyAncycgKHNlY3MpIG9yICdtcycgKG1zZWNzKS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRyYWlsVG8gSWYgdHJ1ZSwgdGhlIFwib3V0XCIgY2xhc3Mgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QoZWxlbWVudCwgdHJhbnNpdGlvbiwgY2FsbGJhY2ssIGR1cmF0aW9uLCB0cmFpbFRvKSB7XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgSFRNTEVsZW1lbnQgbXVzdCBiZSBwcm92aWRlZCBmb3IgdHJhbnNpdGlvbmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2l0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMucGFyc2VEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhaWxUbyA9ICh0cmFpbFRvID09PSB0cnVlKTtcblxuICAgICAgICB0aGlzLmRvVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgZXZlbnQgY2xhc3NlcyB0byB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBldmVudENsYXNzZXMoLi4uYXJncykge1xuICAgICAgICBjb25zdCBldmVudENsYXNzZXMgPSB7XG4gICAgICAgICAgICBpbjogYCR7dGhpcy50cmFuc2l0aW9ufS1pbmAsXG4gICAgICAgICAgICBhY3RpdmU6IGAke3RoaXMudHJhbnNpdGlvbn0tYWN0aXZlYCxcbiAgICAgICAgICAgIG91dDogYCR7dGhpcy50cmFuc2l0aW9ufS1vdXRgLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXZlbnRDbGFzc2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldHVybkNsYXNzZXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRDbGFzc2VzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmIChhcmdzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5DbGFzc2VzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3NlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRvVHJhbnNpdGlvbigpIHtcbiAgICAgICAgLy8gQWRkIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRDbGFzc2VzKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdHJhbnNpdGlvbiAtIHNob3cgXCJpblwiIGFuZCBcImFjdGl2ZVwiIGNsYXNzZXNcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2luJywgJ2FjdGl2ZScpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBhIHRyYW5zaXRpb24gZXhpc3RzXG4gICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KVsndHJhbnNpdGlvbi1kdXJhdGlvbiddICE9PSAnMHMnKSB7XG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciB0aGUgdHJhbnNpdGlvbiB0byBlbmRcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRoaXMub25UcmFuc2l0aW9uRW5kKCksIHtcbiAgICAgICAgICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5ldmVudENsYXNzZXMoJ2luJylbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmV2ZW50Q2xhc3Nlcygnb3V0JylbMF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Q2xhc3NlcygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgdHJhbnNpdGlvbiBlbmRzLlxuICAgICAqXG4gICAgICogV2hlbiBhIHRyYW5zaXRpb24gZW5kcywgdGhlIGluc3RhbmNlIG9mIHRoZSB0cmFuc2l0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZGVzdHJ1Y3RlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG9uVHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoJ2FjdGl2ZScsICghdGhpcy50cmFpbFRvKSA/ICdvdXQnIDogJycpLmZvckVhY2goKGV2ZW50Q2xhc3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGV2ZW50Q2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5hcHBseSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGR1cmF0aW9uIG92ZXJyaWRlXG4gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGEgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB0aGlzLm9uVHJhbnNpdGlvbkVuZCwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNldENsYXNzZXMoKTtcblxuICAgICAgICAvLyBSZW1vdmUgZHVyYXRpb24gb3ZlcnJpZGVcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBkZXN0cnVjdG9yXG4gICAgICAgIHRoaXMuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNsYXNzZXMsIHJlbW92aW5nIGFueSB0cmFuc2l0aW9uIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZXNldENsYXNzZXMoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRDbGFzc2VzKCkuZm9yRWFjaCgoZXZlbnRDbGFzcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZXZlbnRDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGdpdmVuIGR1cmF0aW9uIGFuZCBjb252ZXJ0cyBpdCB0byBhIFwibXNcIiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkdXJhdGlvblxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcGFyc2VEdXJhdGlvbihkdXJhdGlvbikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSAvXihbMC05XSsoXFwuWzAtOV0rKT8pKG0/cyk/JC8uZXhlYyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihwYXJzZWRbMV0pO1xuICAgICAgICBjb25zdCB1bml0ID0gKHBhcnNlZFszXSA9PT0gJ3MnKVxuICAgICAgICAgICAgPyAnc2VjJ1xuICAgICAgICAgICAgOiAnbXNlYyc7XG5cbiAgICAgICAgcmV0dXJuICh1bml0ID09PSAnc2VjJylcbiAgICAgICAgICAgID8gYCR7YW1vdW50ICogMTAwMH1tc2BcbiAgICAgICAgICAgIDogYCR7TWF0aC5mbG9vcihhbW91bnQpfW1zYDtcbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJpZ2dlckVudGl0eVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXIgVGhlIHNlbGVjdG9yIGZvciB0aGUgdHJpZ2dlciB0YXJnZXQgZWxlbWVudChzKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgbWV0IGZvciB0aGUgdHJpZ2dlciB0byBmaXJlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgdHJpZ2dlciBmaXJlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHVuZGVmaW5lZH0gcGFyZW50IFRoZSBwYXJlbnQgZWxlbWVudCB3aXRoIHdoaWNoIHRvIGxpbWl0IHRoZSB0cmlnZ2VyIHNjb3BlLlxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIHRyaWdnZXIgZXZlbnQuXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50W119IGVsZW1lbnRzIFRoZSB0YXJnZXQgZWxlbWVudHMgdGhhdCB0aGlzIHRyaWdnZXIgYXBwbGllcyB0by5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25bXX0gY29uZGl0aW9uQ2FsbGJhY2tzIFRoZSBjb25kaXRpb24gY2FsbGJhY2tzIGZvciB0aGlzIHRyaWdnZXIuXG4gKiBAcHJvcGVydHkge01hcDxIVE1MRWxlbWVudCwgU2V0PHN0cmluZz4+fSBlbGVtZW50RXZlbnRzIFRoZSBldmVudHMgcmVnaXN0ZXJlZCBvbiB0aGUgdGFyZ2V0IGVsZW1lbnRzLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRyaWdnZXJFbGVtZW50XG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIHRyaWdnZXIgZXZlbnQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW50fSBwcmlvcml0eSBUaGUgdHJpZ2dlciBldmVudCBwcmlvcml0eS5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGV2ZW50IFRoZSB0cmlnZ2VyIGV2ZW50IGZ1bmN0aW9uLlxuICovXG5cbi8qKlxuICogVHJpZ2dlciBoYW5kbGVyIGZvciBIVE1MIGVsZW1lbnRzLlxuICpcbiAqIFRoaXMgaXMgYSByZS1pbWFnaW5pbmcgb2YgdGhlIElucHV0LlRyaWdnZXIgZnVuY3Rpb25hbGl0eSBpbiB0aGUgb3JpZ2luYWwgV2ludGVyIENNUyBmcmFtZXdvcmssXG4gKiBpbml0aWFsaXNlZCB0aHJvdWdoIHRoZSBgZGF0YS10cmlnZ2VyYCBhdHRyaWJ1dGVzLlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIHJlbWFpbmluZyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbCBJbnB1dC5UcmlnZ2VyIGZ1bmN0aW9uYWxpdHksIHRoaXNcbiAqIGhhbmRsZXIgYWRkcyBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZmxleGlibGUgdHJpZ2dlciB1c2FnZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vd2ludGVyY21zLmNvbS9kb2NzL3YxLjIvdWkvc2NyaXB0L2lucHV0LXRyaWdnZXJcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjQgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJpZ2dlciBleHRlbmRzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdChlbGVtZW50KSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZWxlbWVudCB0aGlzIGluc3RhbmNlIGlzIGF0dGFjaGVkIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge01hcDxzdHJpbmcsIFRyaWdnZXJFbnRpdHk+fSBUaGUgdHJpZ2dlcnMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJpZ2dlcnMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtNYXA8RWxlbWVudCwgU2V0PFRyaWdnZXJFbGVtZW50Pj59IEEgbWFwIG9mIGVsZW1lbnRzIHRoYXQgdHJpZ2dlciBldmVudHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV2ZW50cyA9IG5ldyBNYXAoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge01hcDxFbGVtZW50LCBNYXA8c3RyaW5nLCBGdW5jdGlvbj4+fSBBIG1hcCBvZiBlbGVtZW50cyBhbmQgdGhlaXIgZXZlbnQgY29ubmVjdG9ycy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29ubmVjdG9ycyA9IG5ldyBNYXAoKTtcblxuICAgICAgICB0aGlzLnBhcnNlVHJpZ2dlcnMoKTtcblxuICAgICAgICBpZiAodGhpcy50cmlnZ2Vycy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldEV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVUcmlnZ2VyRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLnJ1bkV2ZW50cygpO1xuXG4gICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgndHJpZ2dlcnMucmVhZHknLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEV2ZW50cygpO1xuICAgICAgICBzdXBlci5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB0aGUgZWxlbWVudCdzIGRhdGEgYXR0cmlidXRlcyBhbmQgZGV0ZXJtaW5lcyBhcHBsaWNhYmxlIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogVHJpZ2dlciBkYXRhIGF0dHJpYnV0ZXMgbXVzdCBiZSBpbiB0aGUgZm9ybWF0IGBkYXRhLXRyaWdnZXItW25hbWVdLVtwYXJhbWV0ZXJdYCBmb3IgbXVsdGlwbGVcbiAgICAgKiB0cmlnZ2Vycywgb3IgYGRhdGEtdHJpZ2dlci1bcGFyYW1ldGVyXWAgZm9yIHNpbmdsZSB0cmlnZ2Vycy5cbiAgICAgKlxuICAgICAqIFN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZTpcbiAgICAgKiAgLSBgY29uZGl0aW9uYCBvciBgd2hlcmVgOiBUaGUgY29uZGl0aW9uIHRoYXQgbXVzdCBiZSBtZXQgZm9yIHRoZSB0cmlnZ2VyIHRvIGZpcmUuXG4gICAgICogIC0gYGFjdGlvbmAgb3IgYGRvYDogVGhlIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIHRyaWdnZXIgZmlyZXMuXG4gICAgICogIC0gYGNsb3Nlc3QtcGFyZW50YCBvciBgcGFyZW50YDogVGhlIHBhcmVudCBlbGVtZW50IHdpdGggd2hpY2ggdG8gbGltaXQgdGhlIHRyaWdnZXIgc2NvcGUuXG4gICAgICogIC0gYHByaW9yaXR5YDogVGhlIHByaW9yaXR5IGluIHdoaWNoIHRvIGNvbnNpZGVyIHRoZSB0cmlnZ2VyLlxuICAgICAqXG4gICAgICogSW50ZXJuYWxseSwgdGhlIHRyaWdnZXIgbWFwIHVzZXMgdGhlIGB0cmlnZ2VyYCBwYXJhbWV0ZXIgdG8gc3RvcmUgdGhlIHRyaWdnZXIgc2VsZWN0b3IuXG4gICAgICovXG4gICAgcGFyc2VUcmlnZ2VycygpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhc2V0IH0gPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIHRoaXMudHJpZ2dlcnMuY2xlYXIoKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhkYXRhc2V0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICgvLVtBLVpdLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0IGNhbWVsQ2FzZSB0byBkYXNoLXN0eWxlIGZvciBkYXRhIGF0dHJpYnV0ZTogJHtrZXl9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhc2hTdHlsZSA9IGtleS5yZXBsYWNlKC8oW0EtWl0pL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG5cbiAgICAgICAgICAgIGlmIChkYXNoU3R5bGUgIT09ICd0cmlnZ2VyJyAmJiAhZGFzaFN0eWxlLnN0YXJ0c1dpdGgoJ3RyaWdnZXItJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJQYXJ0cyA9IC8oW2EtejAtOVxcLS46X10rPykoPzooPzotKShjbG9zZXN0LXBhcmVudHxjb25kaXRpb258d2hlbnxhY3Rpb258cGFyZW50fHByaW9yaXR5fGRvKSk/JC9pLmV4ZWMoXG4gICAgICAgICAgICAgICAgZGFzaFN0eWxlLnJlcGxhY2UoJ3RyaWdnZXItJywgJycpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgdHJpZ2dlck5hbWUgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJUeXBlID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIFsndHJpZ2dlcicsICdjb25kaXRpb24nLCAnYWN0aW9uJywgJ3BhcmVudCcsICd3aGVuJywgJ2Nsb3Nlc3QnXS5pbmRleE9mKHRyaWdnZXJQYXJ0c1sxXSkgIT09IC0xXG4gICAgICAgICAgICAgICAgJiYgKHRyaWdnZXJQYXJ0c1sxXSAhPT0gJ2Nsb3Nlc3QnIHx8ICh0cmlnZ2VyUGFydHNbMV0gPT09ICdjbG9zZXN0JyAmJiB0cmlnZ2VyUGFydHNbMl0gPT09ICdwYXJlbnQnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgb3JpZ2luYWwgdHJpZ2dlciBmb3JtYXRcbiAgICAgICAgICAgICAgICB0cmlnZ2VyTmFtZSA9ICdfX29yaWdpbmFsJztcbiAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICh0cmlnZ2VyUGFydHNbMV0gPT09ICdjbG9zZXN0JykgPyAncGFyZW50JyA6IHRyaWdnZXJQYXJ0c1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdHJpZ2dlclBhcnRzWzJdID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBbJ2Nsb3Nlc3QtcGFyZW50JywgJ2NvbmRpdGlvbicsICd3aGVuJywgJ2FjdGlvbicsICdwYXJlbnQnLCAncHJpb3JpdHknLCAnZG8nXS5pbmRleE9mKHRyaWdnZXJQYXJ0c1syXSkgIT09IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSBtdWx0aS10cmlnZ2VyIGZvcm1hdFxuICAgICAgICAgICAgICAgIFssIHRyaWdnZXJOYW1lXSA9IHRyaWdnZXJQYXJ0cztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRyaWdnZXJQYXJ0c1syXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZXN0LXBhcmVudCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmVudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdwYXJlbnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbmRpdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3doZW4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAnY29uZGl0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdhY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdhY3Rpb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ByaW9yaXR5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ3ByaW9yaXR5JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAndHJpZ2dlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy50cmlnZ2Vycy5oYXModHJpZ2dlck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2Vycy5zZXQodHJpZ2dlck5hbWUsIG5ldyBNYXAoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJzLmdldCh0cmlnZ2VyTmFtZSkuc2V0KHRyaWdnZXJUeXBlLCBkYXRhc2V0W2tleV0pO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdHJpZ2dlciBkYXRhIGF0dHJpYnV0ZSBhZnRlciBwYXJzaW5nXG4gICAgICAgICAgICBkZWxldGUgZGF0YXNldFtrZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0cmlnZ2VycywgYW5kIHJlbW92ZSB0aG9zZSB0aGF0IGRvIG5vdCBoYXZlIGF0IGxlYXN0IGEgdHJpZ2dlciBzZWxlY3RvciwgYVxuICAgICAgICAvLyBjb25kaXRpb24gYW5kIGFuIGFjdGlvbiwgb3IgYXJlIHVzaW5nIGludmFsaWQgY29uZGl0aW9ucyBvciBhY3Rpb25zXG4gICAgICAgIHRoaXMudHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlciwgbmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmdldFNlbGVjdGFibGVFbGVtZW50cyh0cmlnZ2VyKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0cmlnZ2VyLmhhcygndHJpZ2dlcicpXG4gICAgICAgICAgICAgICAgfHwgIXRyaWdnZXIuaGFzKCdjb25kaXRpb24nKVxuICAgICAgICAgICAgICAgIHx8ICF0cmlnZ2VyLmhhcygnYWN0aW9uJylcbiAgICAgICAgICAgICAgICB8fCBlbGVtZW50cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5oYXNWYWxpZENvbmRpdGlvbnModHJpZ2dlcilcbiAgICAgICAgICAgICAgICB8fCAhdGhpcy5oYXNWYWxpZEFjdGlvbnModHJpZ2dlcilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcnMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyLnNldCgnZWxlbWVudHMnLCBlbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKCF0cmlnZ2VyLmhhcygncHJpb3JpdHknKSkge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLnNldCgncHJpb3JpdHknLCAxMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgY29tbWFuZCBnaXZlbiBhcyBlaXRoZXIgYSBjb25kaXRpb24gb3IgYW4gYWN0aW9uLlxuICAgICAqXG4gICAgICogQ29tbWFuZHMgYXJlIGZvcm1hdHRlZCBhczogbmFtZTpwYXJhbWV0ZXIxLHBhcmFtZXRlcjIscGFyYW1ldGVyMywgYWx0aG91Z2ggd2UgYWxzbyBzdXBwb3J0XG4gICAgICogdGhlIG9sZCBmb3JtYXQgb2YgdmFsdWVbcGFyYW1ldGVyMSxwYXJhbWV0ZXIyLHBhcmFtZXRlcjNdIGZvciB0aGUgYHZhbHVlYCBjb21tYW5kIG9ubHkuXG4gICAgICpcbiAgICAgKiBJZiBhIHBhcmFtZXRlciByZXF1aXJlcyBhIGNvbW1hIHdpdGhpbiwgdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgd3JhcHBlZCBpbiBxdW90ZXMuXG4gICAgICpcbiAgICAgKiBNdWx0aXBsZSBjb21tYW5kcyBjYW4gYmUgc2VwYXJhdGVkIGJ5IGEgcGlwZSBjaGFyYWN0ZXIgYHxgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWxsb3dNdWx0aXBsZVxuICAgICAqIEByZXR1cm5zIHt7bmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJzOiBzdHJpbmdbXX1bXX1cbiAgICAgKi9cbiAgICBwYXJzZUNvbW1hbmQoY29tbWFuZCwgYWxsb3dNdWx0aXBsZSA9IHRydWUpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBvbGQtZm9ybWF0IHZhbHVlIGNvbW1hbmQgKHZhbHVlW2ZvbyxiYXJdKVxuICAgICAgICBpZiAoY29tbWFuZC5zdGFydHNXaXRoKCd2YWx1ZScpICYmIGNvbW1hbmQuaW5jbHVkZXMoJ1snKSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjb21tYW5kLm1hdGNoKC9bXltcXF1dKyg/PV0pL2cpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFNwbGl0IHZhbHVlcyB3aXRoIGNvbW1hc1xuICAgICAgICAgICAgbWF0Y2guZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykudHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0VmFsdWVzID0gdmFsdWUucmVwbGFjZSgvKCcuKj8oPzwhXFxcXCknKXwoXCIuKj8oPzwhXFxcXClcIikvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChzcGxpdFZhbHVlKSA9PiBzcGxpdFZhbHVlLnJlcGxhY2UoL1xcfFxcfFxcfC9nLCAnLCcpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpLnRyaW0oKSk7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCguLi5zcGxpdFZhbHVlcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB2YWx1ZXMsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBjb21tYW5kc1xuICAgICAgICBpZiAoY29tbWFuZC5pbmNsdWRlcygnfCcpICYmIGFsbG93TXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0Q29tbWFuZHMgPSBjb21tYW5kLnJlcGxhY2UoLygnLio/KD88IVxcXFwpJyl8KFwiLio/KD88IVxcXFwpXCIpL2csIChxdW90ZWQpID0+IHF1b3RlZC5yZXBsYWNlKC9cXHwvZywgJ3x8fCcpKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgLm1hcCgoc3BsaXRWYWx1ZSkgPT4gc3BsaXRWYWx1ZS5yZXBsYWNlKC9cXHxcXHxcXHwvZywgJ3wnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gW107XG4gICAgICAgICAgICBzcGxpdENvbW1hbmRzLmZvckVhY2goKHNwbGl0Q29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goLi4udGhpcy5wYXJzZUNvbW1hbmQoc3BsaXRDb21tYW5kLCBmYWxzZSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb21tYW5kcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWFuZC5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgICAgICBuYW1lOiBjb21tYW5kLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbbmFtZSwgcGFyYW1ldGVyc10gPSBjb21tYW5kLnNwbGl0KCc6JywgMik7XG5cbiAgICAgICAgaWYgKCFwYXJhbWV0ZXJzLmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW3BhcmFtZXRlcnNdLFxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdFZhbHVlcyA9IHBhcmFtZXRlcnMucmVwbGFjZSgvKCcuKj8oPzwhXFxcXCknKXwoXCIuKj8oPzwhXFxcXClcIikvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoLywvZywgJ3x8fCcpKVxuICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoKHNwbGl0VmFsdWUpID0+IHNwbGl0VmFsdWUucmVwbGFjZSgvXFx8XFx8XFx8L2csICcsJykucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykucmVwbGFjZSgvXFxcXChbJ1wiXSkvLCAnJDEnKS50cmltKCkpO1xuXG4gICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHNwbGl0VmFsdWVzLFxuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW55IGVsZW1lbnRzIGFyZSBhY2Nlc3NpYmxlIGJ5IHRoZSBwcm92aWRlZCB0cmlnZ2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNYXA8VHJpZ2dlckVudGl0eT59IHRyaWdnZXJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX1cbiAgICAgKi9cbiAgICBnZXRTZWxlY3RhYmxlRWxlbWVudHModHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlci5oYXMoJ3BhcmVudCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQuY2xvc2VzdCh0cmlnZ2VyLmdldCgncGFyZW50JykpLnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlci5nZXQoJ3RyaWdnZXInKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0cmlnZ2VyLmdldCgndHJpZ2dlcicpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvdmlkZWQgdHJpZ2dlciBjb25kaXRpb24ocykgYXJlIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzVmFsaWRDb25kaXRpb25zKHRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdjb25kaXRpb24nKSkuZXZlcnkoKGNvbmRpdGlvbikgPT4gW1xuICAgICAgICAgICAgJ2NoZWNrZWQnLFxuICAgICAgICAgICAgJ3VuY2hlY2tlZCcsXG4gICAgICAgICAgICAnZW1wdHknLFxuICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICdvbmVvZicsXG4gICAgICAgICAgICAnYWxsb2YnLFxuICAgICAgICAgICAgJ2ZvY3VzJyxcbiAgICAgICAgICAgICdibHVyJyxcbiAgICAgICAgICAgICdhdHRyJyxcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgIF0uaW5jbHVkZXMoY29uZGl0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb3ZpZGVkIHRyaWdnZXIgYWN0aW9uKHMpIGFyZSB2YWxpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1ZhbGlkQWN0aW9ucyh0cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnYWN0aW9uJykpLmV2ZXJ5KChhY3Rpb24pID0+IFtcbiAgICAgICAgICAgICdzaG93JyxcbiAgICAgICAgICAgICdoaWRlJyxcbiAgICAgICAgICAgICdlbmFibGUnLFxuICAgICAgICAgICAgJ2Rpc2FibGUnLFxuICAgICAgICAgICAgJ2VtcHR5JyxcbiAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAndmFsdWVPZicsXG4gICAgICAgICAgICAnY2hlY2snLFxuICAgICAgICAgICAgJ3VuY2hlY2snLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdjbGFzc09mJyxcbiAgICAgICAgICAgICdhdHRyJyxcbiAgICAgICAgICAgICdhdHRyT2YnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzdHlsZU9mJyxcbiAgICAgICAgXS5pbmNsdWRlcyhhY3Rpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRyaWdnZXIgZXZlbnRzIG9uIHRyaWdnZXIgYW5kIHRhcmdldCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBjcmVhdGVUcmlnZ2VyRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXIpID0+IHtcbiAgICAgICAgICAgIC8vIENvbGxlY3QgY29uZGl0aW9ucyBhbmQgY2hlY2sgdGhlbSBhcyBhIGdyb3VwLlxuICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ2NvbmRpdGlvbkNhbGxiYWNrcycsIFtdKTtcbiAgICAgICAgICAgIHRyaWdnZXIuc2V0KCdlbGVtZW50RXZlbnRzJywgbmV3IE1hcCgpKTtcblxuICAgICAgICAgICAgdGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2NvbmRpdGlvbicpKS5mb3JFYWNoKChjb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvbmVvZic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLmdldCgnY29uZGl0aW9uQ2FsbGJhY2tzJykucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbHVlQ29uZGl0aW9uKHRyaWdnZXIsIGZhbHNlLCAuLi5jb25kaXRpb24ucGFyYW1ldGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FsbG9mJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsdWVDb25kaXRpb24odHJpZ2dlciwgdHJ1ZSwgLi4uY29uZGl0aW9uLnBhcmFtZXRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLmdldCgnY29uZGl0aW9uQ2FsbGJhY2tzJykucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVtcHR5Q29uZGl0aW9uKHRyaWdnZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjaGVja2VkJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndW5jaGVja2VkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hlY2tlZENvbmRpdGlvbih0cmlnZ2VyLCAoY29uZGl0aW9uLm5hbWUgPT09ICdjaGVja2VkJyksIC4uLmNvbmRpdGlvbi5wYXJhbWV0ZXJzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBldmVudCB0byBhbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyByZWdpc3RlcnMgdGhlIGV2ZW50IGluIHRoZSBgZWxlbWVudEV2ZW50c2AgbWFwIGZvciBsYXRlciB1c2FnZSBhbmQgcmVtb3ZhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICovXG4gICAgYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgZXZlbnROYW1lKSB7XG4gICAgICAgIGlmICghdHJpZ2dlci5nZXQoJ2VsZW1lbnRFdmVudHMnKS5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50RXZlbnRzJykuc2V0KGVsZW1lbnQsIG5ldyBTZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmlnZ2VyLmdldCgnZWxlbWVudEV2ZW50cycpLmdldChlbGVtZW50KS5hZGQoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgdHJpZ2dlci5nZXQoJ2VsZW1lbnRFdmVudHMnKS5nZXQoZWxlbWVudCkuYWRkKGV2ZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgRE9NIGV2ZW50IGxpc3RlbmVycyBmb3IgdGFyZ2V0ZWQgZWxlbWVudHMgb2YgYWxsIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogQWRkcyBhIGNvbm5lY3RvciB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGV2ZW50cywgc28gdGhhdCB3ZSBtYXkgZW5hYmxlIHByaW9yaXRpc2F0aW9uIGFuZFxuICAgICAqIGNvbnRyb2wgb3ZlciB0aGUgZmlyaW5nIG9mIHRoZSBldmVudHMsIGFuZCB0aGVuIHJlZ2lzdGVycyBET00gZXZlbnQgbGlzdGVuZXJzIGZvciB0aGVcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKi9cbiAgICByZWdpc3RlckV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgICBjb25zdCBjb25uZWN0b3JzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlcikgPT4ge1xuICAgICAgICAgICAgdHJpZ2dlci5nZXQoJ2VsZW1lbnRFdmVudHMnKS5mb3JFYWNoKChldmVudHMsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXZlbnRzLmhhcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5zZXQoZWxlbWVudCwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBldmVudHMuZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29ubmVjdG9ycy5oYXMoeyBlbGVtZW50LCBldmVudE5hbWUgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvcnMuYWRkKHsgZWxlbWVudCwgZXZlbnROYW1lIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IE51bWJlcih0cmlnZ2VyLmdldCgncHJpb3JpdHknKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5ldmVyeSgoY29uZGl0aW9uKSA9PiBjb25kaXRpb24oKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZ2V0KGVsZW1lbnQpLmFkZChldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29ubmVjdG9ycy5mb3JFYWNoKCh7IGVsZW1lbnQsIGV2ZW50TmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29ubmVjdG9ycy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RvcnMuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jb25uZWN0b3JzLmdldChlbGVtZW50KS5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuc2V0KGV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5nZXQoZWxlbWVudCkuZm9yRWFjaCgoZWxlbWVudEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEV2ZW50LmV2ZW50TmFtZSA9PT0gZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnB1c2goZWxlbWVudEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoZWxlbWVudEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEV2ZW50LmV2ZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuZ2V0KGV2ZW50TmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSB0YXJnZXQgZWxlbWVudChzKSBtYXRjaGVzIG9uZSBvZiB0aGVcbiAgICAgKiBwcm92aWRlZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHZhbHVlc1xuICAgICAqL1xuICAgIGNyZWF0ZVZhbHVlQ29uZGl0aW9uKHRyaWdnZXIsIGFsbCwgLi4udmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50cycpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1maWxlXSwgaW5wdXRbdHlwZT1pbWFnZV0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0nKSkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbnMgYW5kIGZpbGUgaW5wdXRzIGFyZSB1bnN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdjbGljaycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdpbnB1dCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlcyA9IG5ldyBTZXQoKTtcblxuICAgICAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuc29tZSgodmFsdWUpID0+IGVsZW1lbnRWYWx1ZXMuaGFzKHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRyaWdnZXIgdGhhdCBmaXJlcyB3aGVuIHRoZXJlIGlzIG5vIHZhbHVlIHdpdGhpbiB0aGUgdGFyZ2V0IGVsZW1lbnQocykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKi9cbiAgICBjcmVhdGVFbXB0eUNvbmRpdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50cycpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1pbWFnZV0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0nKSkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbnMgYW5kIGZpbGUgaW5wdXRzIGFyZSB1bnN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdjbGljaycpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnaW5wdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZXMuc2l6ZSA9PT0gMDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdHJpZ2dlciB0aGF0IGZpcmVzIHdoZW4gYSB0YXJnZXQgZWxlbWVudChzKSBpcyBjaGVja2VkL3VuY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tlZCBJZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciB1bmNoZWNrZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHVuZGVmaW5lZH0gYXRMZWFzdCBUaGUgbWluaW11bSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBtdXN0IGJlIGNoZWNrZWQuXG4gICAgICogIERlZmF1bHRzIHRvIDEgaWYgdW5kZWZpbmVkLiBJZiBzcGVjaWZpZWQgYXMgYGFsbGAsIGFsbCBlbGVtZW50cyBtdXN0IGJlIGNoZWNrZWQuXG4gICAgICovXG4gICAgY3JlYXRlQ2hlY2tlZENvbmRpdGlvbih0cmlnZ2VyLCBjaGVja2VkLCBhdExlYXN0ID0gdW5kZWZpbmVkLCBhdE1vc3QgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkRWxlbWVudHMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgdHJpZ2dlci5nZXQoJ2VsZW1lbnRzJykuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0cyBjaGVja2JveGVzIGFuZCByYWRpbyBidXR0b25zXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPXJhZGlvXSwgaW5wdXRbdHlwZT1jaGVja2JveF0nKSkge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwcG9ydGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnY2xpY2snKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCA9PT0gZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYXRMZWFzdCA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlcy5zaXplID09PSBzdXBwb3J0ZWRFbGVtZW50cy5zaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBhdExlYXN0Q291bnQgPSAoYXRMZWFzdCAhPT0gdW5kZWZpbmVkICYmIE1hdGguZmxvb3IoYXRMZWFzdCkgPiAwKVxuICAgICAgICAgICAgICAgID8gTWF0aC5mbG9vcihhdExlYXN0KVxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgICAgIGNvbnN0IGF0TW9zdENvdW50ID0gKGF0TGVhc3QgIT09IHVuZGVmaW5lZCAmJiBNYXRoLmZsb29yKGF0TW9zdCkgPiAxKVxuICAgICAgICAgICAgICAgID8gTWF0aC5mbG9vcihhdE1vc3QpXG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0ZWRFbGVtZW50cy5zaXplO1xuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlcy5zaXplID49IGF0TGVhc3RDb3VudCAmJiBlbGVtZW50VmFsdWVzLnNpemUgPD0gYXRNb3N0Q291bnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgcnVucyBhbGwgcmVnaXN0ZXJlZCB0cmlnZ2Vycy5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgdHJpZ2dlcnMuXG4gICAgICovXG4gICAgcnVuRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmNvbm5lY3RvcnMuZm9yRWFjaCgoZWxlbWVudENvbm5lY3RvcnMpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRDb25uZWN0b3JzLmZvckVhY2goKGNvbm5lY3RvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbm5lY3RvcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgcmVnaXN0ZXJlZCBldmVudHMuXG4gICAgICpcbiAgICAgKiBUaGlzICB3aWxsIGRpc2FibGUgYWxsIHRyaWdnZXJzIGFuZCB0aGVpciBldmVudCBsaXN0ZW5lcnMgb24gdGhlIHRhcmdldCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICByZXNldEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0b3JzLmZvckVhY2goKGVsZW1lbnRDb25uZWN0b3JzLCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50Q29ubmVjdG9ycy5mb3JFYWNoKChjb25uZWN0b3IsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBjb25uZWN0b3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5jbGVhcigpO1xuICAgICAgICB0aGlzLmV2ZW50cy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGFjdGlvbnMgYmFzZWQgb24gdGhlIHRyaWdnZXIgY29uZGl0aW9uLlxuICAgICAqXG4gICAgICogQWN0aW9ucyBzaG91bGQgYmUgYmluYXJ5LCBhbmQgc2hvdyBvbmUgc3RhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGlzIG1ldCwgYW5kIGFub3RoZXIgd2hlbiBpdFxuICAgICAqIGlzIG5vdC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbmRpdGlvbnMgb2YgdGhlIHRyaWdnZXIgaGF2ZSBiZWVuXG4gICAgICogbWV0LiBJZiBhIHRyaWdnZXIgaGFzIG11bHRpcGxlIGNvbmRpdGlvbnMsIEFMTCBjb25kaXRpb25zIG11c3QgYmUgbWV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjb25kaXRpb25NZXRcbiAgICAgKi9cbiAgICBleGVjdXRlQWN0aW9ucyh0cmlnZ2VyLCBjb25kaXRpb25NZXQpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2FjdGlvbicpKS5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzaG93JzpcbiAgICAgICAgICAgICAgICBjYXNlICdoaWRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25TaG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24ucGFyYW1ldGVyc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYWN0aW9uLnBhcmFtZXRlcnNbMF0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW3RoaXMuZWxlbWVudF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uLm5hbWUgPT09ICdzaG93JykgPyBjb25kaXRpb25NZXQgOiAhY29uZGl0aW9uTWV0LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbmFibGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2FibGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkVuYWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uLnBhcmFtZXRlcnNbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0aGlzLmVsZW1lbnRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5uYW1lID09PSAnZW5hYmxlJykgPyBjb25kaXRpb25NZXQgOiAhY29uZGl0aW9uTWV0LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25NZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYWN0aW9uLnBhcmFtZXRlcnNbMF0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0aGlzLmVsZW1lbnRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAndmFsdWVPZic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uTWV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5uYW1lID09PSAndmFsdWVPZicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0aGlzLmVsZW1lbnRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGFjdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiYgYWN0aW9uLm5hbWUgPT09ICd2YWx1ZU9mJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFjdGlvbi5wYXJhbWV0ZXJzLnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhY3Rpb24ucGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NsYXNzT2YnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbk1ldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24ubmFtZSA9PT0gJ2NsYXNzT2YnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChhY3Rpb24ucGFyYW1ldGVyc1swXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbdGhpcy5lbGVtZW50XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhY3Rpb24ubmFtZSA9PT0gJ2NsYXNzT2YnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWN0aW9uLnBhcmFtZXRlcnMuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFjdGlvbi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIG9yIGhpZGVzIGEgdHJpZ2dlciBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBhY3Rpb24gd2lsbCB0b2dnbGUgdGhlIGBoaWRlYCBjbGFzcyBvbiB0aGUgZWxlbWVudCwgYW5kIHNldCB0aGUgYGRpc3BsYXlgIHN0eWxlIHRvXG4gICAgICogYG5vbmVgIHdoZW4gaGlkZGVuLCBhbmQgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgd2hlbiBzaG93bi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gZWxlbWVudHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dcbiAgICAgKi9cbiAgICBhY3Rpb25TaG93KHRyaWdnZXIsIGVsZW1lbnRzLCBzaG93KSB7XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChzaG93ICYmIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LmRhdGFzZXQub3JpZ2luYWxEaXNwbGF5O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3cgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXkgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIHRyaWdnZXIgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgYWN0aW9uIHdpbGwgdG9nZ2xlIHRoZSBgY29udHJvbC1kaXNhYmxlZGAgY2xhc3Mgb24gdGhlIGVsZW1lbnQsIGFuZCBzZXQgdGhlIGBkaXNhYmxlZGBcbiAgICAgKiBwcm9wZXJ0eSB0byBgdHJ1ZWAgd2hlbiBkaXNhYmxlZCwgYW5kIGBmYWxzZWAgd2hlbiBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBlbGVtZW50c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlXG4gICAgICovXG4gICAgYWN0aW9uRW5hYmxlKHRyaWdnZXIsIGVsZW1lbnRzLCBlbmFibGUpIHtcbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3RbKGVuYWJsZSkgPyAncmVtb3ZlJyA6ICdhZGQnXSgnY29udHJvbC1kaXNhYmxlZCcpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kaXNhYmxlZCA9ICFlbmFibGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlciwgZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGVpdGhlciB0aGUgdHJpZ2dlciBlbGVtZW50IG9yIGEgY2hpbGQgZWxlbWVudChzKSB3aXRoaW4uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgb25lLXdheSBhY3Rpb24gaWYgdGhlIHVubWV0IHZhbHVlIGlzIG5vdCBkZWZpbmVkLlxuICAgICAqL1xuICAgIGFjdGlvblZhbHVlKHRyaWdnZXIsIGNvbmRpdGlvbk1ldCwgZWxlbWVudHMsIHZhbHVlLCB1bm1ldFZhbHVlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uTWV0ICYmIHVubWV0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAoY29uZGl0aW9uTWV0KSA/IHZhbHVlIDogdW5tZXRWYWx1ZTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IChlbGVtZW50LnZhbHVlID09PSBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG5ld1ZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLmFmdGVyQWN0aW9uKHRyaWdnZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG9yIHJlbW92ZXMgdGhlIGNsYXNzIGZyb20gdGhlIHRyaWdnZXIgZWxlbWVudCBvciBhIGNoaWxkIGVsZW1lbnQocykgd2l0aGluLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIHNpbXBseSByZW1vdmUgdGhlIGNsYXNzIGlmIHRoZSB1bm1ldCBjbGFzcyBpcyBub3QgZGVmaW5lZC4gT3RoZXJ3aXNlLCB0aGUgY2xhc3Nlc1xuICAgICAqIHdpbGwgYmUgdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBhY3Rpb25DbGFzcyh0cmlnZ2VyLCBjb25kaXRpb25NZXQsIGVsZW1lbnRzLCBjc3NDbGFzcywgdW5tZXRDc3NDbGFzcyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uTWV0KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICBpZiAodW5tZXRDc3NDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodW5tZXRDc3NDbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY3NzQ2xhc3MpO1xuICAgICAgICAgICAgICAgIGlmICh1bm1ldENzc0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh1bm1ldENzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFmdGVyQWN0aW9uKHRyaWdnZXIsIGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZGVidWcoJ1RyaWdnZXIgZmlyZWQnLCBlbGVtZW50LCB0cmlnZ2VyKTtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ3RyaWdnZXIuZmlyZWQnLCBlbGVtZW50LCB0cmlnZ2VyKTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEludGVybmFsIHByb3h5IGZvciBTbm93Ym9hcmQuXG4gKlxuICogVGhpcyBoYW5kbGVyIHdyYXBzIHRoZSBTbm93Ym9hcmQgaW5zdGFuY2UgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHBsdWdpbiBpbnN0YW5jZXMuXG4gKiBJdCBwcmV2ZW50cyBhY2Nlc3MgdG8gdGhlIGZvbGxvd2luZyBtZXRob2RzOlxuICogIC0gYGF0dGFjaEFic3RyYWN0c2A6IE5vIG5lZWQgdG8gYXR0YWNoIGFic3RyYWN0cyBhZ2Fpbi5cbiAqICAtIGBsb2FkVXRpbHRpZXNgOiBObyBuZWVkIHRvIGxvYWQgdXRpbGl0aWVzIGFnYWluLlxuICogIC0gYGluaXRpYWxpc2VgOiBTbm93Ym9hcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZC5cbiAqICAtIGBpbml0aWFsaXNlU2luZ2xldG9uc2A6IFNpbmdsZXRvbnMgYXJlIGFscmVhZHkgaW5pdGlhbGlzZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChbJ2F0dGFjaEFic3RyYWN0cycsICdsb2FkVXRpbGl0aWVzJywgJ2luaXRpYWxpc2UnLCAnaW5pdGlhbGlzZVNpbmdsZXRvbnMnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IGNhbm5vdCB1c2UgdGhlIFwiJHtwcm9wfVwiIFNub3dib2FyZCBtZXRob2Qgd2l0aGluIGEgcGx1Z2luLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc1BsdWdpbihwcm9wTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IFJlZmxlY3QuZ2V0KHRhcmdldCwgJ3BsdWdpbnMnKVtwcm9wTG93ZXJdLmdldEluc3RhbmNlKC4uLnBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfSxcblxuICAgIGhhcyh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJvcExvd2VyID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoWydhdHRhY2hBYnN0cmFjdHMnLCAnbG9hZFV0aWxpdGllcycsICdpbml0aWFsaXNlJywgJ2luaXRpYWxpc2VTaW5nbGV0b25zJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcbmltcG9ydCBJbm5lclByb3h5SGFuZGxlciBmcm9tICcuL0lubmVyUHJveHlIYW5kbGVyJztcblxuLyoqXG4gKiBQbHVnaW4gbG9hZGVyIGNsYXNzLlxuICpcbiAqIFRoaXMgaXMgYSBwcm92aWRlciAoZmFjdG9yeSkgY2xhc3MgZm9yIGEgc2luZ2xlIHBsdWdpbiBhbmQgcHJvdmlkZXMgdGhlIGxpbmsgYmV0d2VlbiBTbm93Ym9hcmQgZnJhbWV3b3JrIGZ1bmN0aW9uYWxpdHlcbiAqIGFuZCB0aGUgdW5kZXJseWluZyBwbHVnaW4gaW5zdGFuY2VzLiBJdCBhbHNvIHByb3ZpZGVzIHNvbWUgYmFzaWMgbW9ja2luZyBvZiBwbHVnaW4gbWV0aG9kcyBmb3IgdGVzdGluZy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luTG9hZGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEJpbmRzIHRoZSBXaW50ZXIgZnJhbWV3b3JrIHRvIHRoZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtTbm93Ym9hcmR9IHNub3dib2FyZFxuICAgICAqIEBwYXJhbSB7UGx1Z2luQmFzZX0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzbm93Ym9hcmQsIGluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkID0gbmV3IFByb3h5KFxuICAgICAgICAgICAgc25vd2JvYXJkLFxuICAgICAgICAgICAgSW5uZXJQcm94eUhhbmRsZXIsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgICAvLyBGcmVlemUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoaXMgbG9hZGVyXG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5pbnN0YW5jZSk7XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zaW5nbGV0b24gPSB7XG4gICAgICAgICAgICBpbml0aWFsaXNlZDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIC8vIFByZXZlbnQgZnVydGhlciBleHRlbnNpb24gb2YgdGhlIHNpbmdsZXRvbiBzdGF0dXMgb2JqZWN0XG4gICAgICAgIE9iamVjdC5zZWFsKHRoaXMuc2luZ2xldG9uKTtcblxuICAgICAgICB0aGlzLm1vY2tzID0ge307XG4gICAgICAgIHRoaXMub3JpZ2luYWxGdW5jdGlvbnMgPSB7fTtcblxuICAgICAgICAvLyBGcmVlemUgbG9hZGVyIGl0c2VsZlxuICAgICAgICBPYmplY3QuZnJlZXplKFBsdWdpbkxvYWRlci5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGhhcyBhIHNwZWNpZmljIG1ldGhvZCBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNNZXRob2QobWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAodHlwZW9mIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdID09PSAnZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIHByb3RvdHlwZSBtZXRob2QgZm9yIGEgcGx1Z2luLiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgYmUgdXNlZCBmb3IgXCJzdGF0aWNcIiBjYWxscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICogQHBhcmFtIHsuLi59IGFyZ3NcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGNhbGxNZXRob2QoLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdKGFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGN1cnJlbnQgcGx1Z2luLlxuICAgICAqXG4gICAgICogLSBJZiB0aGlzIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2luLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiAtIElmIHRoaXMgaXMgYSBzaW5nbGV0b24sIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkJhc2V8RnVuY3Rpb259XG4gICAgICovXG4gICAgZ2V0SW5zdGFuY2UoLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSkge1xuICAgICAgICAgICAgY29uc3QgdW5tZXQgPSB0aGlzLmdldERlcGVuZGVuY2llcygpLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuc25vd2JvYXJkLmdldFBsdWdpbk5hbWVzKCkuaW5jbHVkZXMoaXRlbSkpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCIke3RoaXMubmFtZX1cIiBwbHVnaW4gcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbHVnaW5zOiAke3VubWV0LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzZVNpbmdsZXRvbiguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXBwbHkgbW9ja2VkIG1ldGhvZHNcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm1vY2tzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5vcmlnaW5hbEZ1bmN0aW9ucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubW9ja3MpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFttZXRob2ROYW1lLCBjYWxsYmFja10gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSAoLi4ucGFyYW1zKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXNbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kcyB0byBwcm90b3R5cGVcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubW9ja3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMub3JpZ2luYWxGdW5jdGlvbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubW9ja3MpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdID0gKC4uLnBhcmFtcykgPT4gY2FsbGJhY2sodGhpcywgLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgdGhpcy5pbnN0YW5jZSh0aGlzLnNub3dib2FyZCwgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIG5ld0luc3RhbmNlLmRldGFjaCA9ICgpID0+IHRoaXMuaW5zdGFuY2VzLnNwbGljZSh0aGlzLmluc3RhbmNlcy5pbmRleE9mKG5ld0luc3RhbmNlKSwgMSk7XG4gICAgICAgIG5ld0luc3RhbmNlLmNvbnN0cnVjdCguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChuZXdJbnN0YW5jZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIHBsdWdpbiBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHBsdWdpbiwgYW4gZW1wdHkgYXJyYXkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5CYXNlW119XG4gICAgICovXG4gICAgZ2V0SW5zdGFuY2VzKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBpcyBhIHNpbXBsZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzRnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRoaXMuaW5zdGFuY2UgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBQbHVnaW5CYXNlID09PSBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaXMgYSBzaW5nbGV0b24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1NpbmdsZXRvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlIGluc3RhbmNlb2YgU2luZ2xldG9uID09PSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBzaW5nbGV0b24gaGFzIGJlZW4gaW5pdGlhbGlzZWQuXG4gICAgICpcbiAgICAgKiBOb3JtYWwgcGx1Z2lucyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzSW5pdGlhbGlzZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbi5pbml0aWFsaXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgaW5pdGlhbGlzZVNpbmdsZXRvbiguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyB0aGlzLmluc3RhbmNlKHRoaXMuc25vd2JvYXJkLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuZGV0YWNoID0gKCkgPT4gdGhpcy5pbnN0YW5jZXMuc3BsaWNlKHRoaXMuaW5zdGFuY2VzLmluZGV4T2YobmV3SW5zdGFuY2UpLCAxKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuY29uc3RydWN0KC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlcy5wdXNoKG5ld0luc3RhbmNlKTtcbiAgICAgICAgdGhpcy5zaW5nbGV0b24uaW5pdGlhbGlzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgY3VycmVudCBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbnMgY2Fubm90IGhhdmUgZGVwZW5kZW5jaWVzLlxuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGRlcGVuZGVuY3kgbWV0aG9kIHNwZWNpZmllZC5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZS5kZXBlbmRlbmNpZXMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZS5kZXBlbmRlbmNpZXMoKS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaGFzIGFsbCBpdHMgZGVwZW5kZW5jaWVzIGZ1bGZpbGxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpIHtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gdGhpcy5nZXREZXBlbmRlbmNpZXMoKTtcblxuICAgICAgICBsZXQgZnVsZmlsbGVkID0gdHJ1ZTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNub3dib2FyZC5oYXNQbHVnaW4ocGx1Z2luKSkge1xuICAgICAgICAgICAgICAgIGZ1bGZpbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZnVsZmlsbGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBhIG1ldGhvZCBvZiBhbiBpbnN0YW5jZSB0byBiZSBtb2NrZWQgZm9yIHRlc3RpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIG1vY2sgd2lsbCBiZSBhcHBsaWVkIGZvciB0aGUgbGlmZSBvZiBhbiBpbnN0YW5jZS4gRm9yIHNpbmdsZXRvbnMsIHRoZSBtb2NrIHdpbGwgYmUgYXBwbGllZCBmb3IgdGhlIGxpZmVcbiAgICAgKiBvZiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIE1vY2tzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgbW9jayhtZXRob2ROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gXCIke21ldGhvZE5hbWV9XCIgZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSBtb2NrZWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9ja3NbbWV0aG9kTmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgdGhpcy5vcmlnaW5hbEZ1bmN0aW9uc1ttZXRob2ROYW1lXSA9IHRoaXMuaW5zdGFuY2UucHJvdG90eXBlW21ldGhvZE5hbWVdO1xuXG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xldG9uKCkgJiYgdGhpcy5pbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcblxuICAgICAgICAgICAgLy8gQXBwbHkgbW9ja2VkIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSAoLi4ucGFyYW1ldGVycykgPT4gY2FsbGJhY2sodGhpcywgLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgbW9jayBjYWxsYmFjayBmcm9tIGZ1dHVyZSBpbnN0YW5jZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqL1xuICAgIHVubW9jayhtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tb2Nrc1ttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGV0b24oKSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNbMF1bbWV0aG9kTmFtZV0gPSB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMubW9ja3NbbWV0aG9kTmFtZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zW21ldGhvZE5hbWVdO1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4gUmVmbGVjdC5nZXQodGFyZ2V0LCAncGx1Z2lucycpW3Byb3BMb3dlcl0uZ2V0SW5zdGFuY2UoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICB9LFxuXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcbmltcG9ydCBQbHVnaW5Mb2FkZXIgZnJvbSAnLi9QbHVnaW5Mb2FkZXInO1xuXG5pbXBvcnQgQ29va2llIGZyb20gJy4uL3V0aWxpdGllcy9Db29raWUnO1xuaW1wb3J0IEpzb25QYXJzZXIgZnJvbSAnLi4vdXRpbGl0aWVzL0pzb25QYXJzZXInO1xuaW1wb3J0IFNhbml0aXplciBmcm9tICcuLi91dGlsaXRpZXMvU2FuaXRpemVyJztcbmltcG9ydCBVcmwgZnJvbSAnLi4vdXRpbGl0aWVzL1VybCc7XG5cbi8qKlxuICogU25vd2JvYXJkIC0gdGhlIFdpbnRlciBKYXZhU2NyaXB0IGZyYW1ld29yay5cbiAqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGJhc2Ugb2YgYSBtb2Rlcm4gdGFrZSBvbiB0aGUgV2ludGVyIEpTIGZyYW1ld29yaywgYmVpbmcgZnVsbHkgZXh0ZW5zaWJsZSBhbmQgdGFraW5nIGFkdmFudGFnZVxuICogb2YgbW9kZXJuIEphdmFTY3JpcHQgZmVhdHVyZXMgYnkgbGV2ZXJhZ2luZyB0aGUgTGFyYXZlbCBNaXggY29tcGlsYXRpb24gZnJhbWV3b3JrLiBJdCBhbHNvIGlzIGNvZGVkIHVwIHRvIHJlbW92ZSB0aGVcbiAqIGRlcGVuZGVuY3kgb2YgalF1ZXJ5LlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICogQGxpbmsgaHR0cHM6Ly93aW50ZXJjbXMuY29tL2RvY3Mvc25vd2JvYXJkL2ludHJvZHVjdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbm93Ym9hcmQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdXRvU2luZ2xldG9ucyBBdXRvbWF0aWNhbGx5IGxvYWQgc2luZ2xldG9ucyB3aGVuIERPTSBpcyByZWFkeS4gRGVmYXVsdDogYHRydWVgLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVidWcgV2hldGhlciBkZWJ1Z2dpbmcgbG9ncyBzaG91bGQgYmUgc2hvd24uIERlZmF1bHQ6IGBmYWxzZWAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYXV0b1NpbmdsZXRvbnMsIGRlYnVnKSB7XG4gICAgICAgIHRoaXMuZGVidWdFbmFibGVkID0gKHR5cGVvZiBkZWJ1ZyA9PT0gJ2Jvb2xlYW4nICYmIGRlYnVnID09PSB0cnVlKTtcbiAgICAgICAgdGhpcy5hdXRvSW5pdFNpbmdsZXRvbnMgPSAodHlwZW9mIGF1dG9TaW5nbGV0b25zID09PSAnYm9vbGVhbicgJiYgYXV0b1NpbmdsZXRvbnMgPT09IGZhbHNlKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0ge307XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge307XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWFkaW5lc3MgPSB7XG4gICAgICAgICAgICBkb206IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICAvLyBTZWFsIHJlYWRpbmVzcyBmcm9tIGJlaW5nIGFkZGVkIHRvIGZ1cnRoZXIsIGJ1dCBhbGxvdyB0aGUgcHJvcGVydGllcyB0byBiZSBtb2RpZmllZC5cbiAgICAgICAgT2JqZWN0LnNlYWwodGhpcy5yZWFkaW5lc3MpO1xuICAgICAgICB0aGlzLmF0dGFjaEFic3RyYWN0cygpO1xuXG4gICAgICAgIC8vIEZyZWV6ZSB0aGUgU25vd2JvYXJkIGNsYXNzIHRvIHByZXZlbnQgZnVydGhlciBtb2RpZmljYXRpb25zLlxuICAgICAgICBPYmplY3QuZnJlZXplKFNub3dib2FyZC5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuXG4gICAgICAgIHRoaXMubG9hZFV0aWxpdGllcygpO1xuICAgICAgICB0aGlzLmluaXRpYWxpc2UoKTtcblxuICAgICAgICB0aGlzLmRlYnVnKCdTbm93Ym9hcmQgZnJhbWV3b3JrIGluaXRpYWxpc2VkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYWJzdHJhY3QgY2xhc3NlcyBhcyBwcm9wZXJ0aWVzIG9mIHRoZSBTbm93Ym9hcmQgY2xhc3MuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgSmF2YXNjcmlwdCBmdW5jdGlvbmFsaXR5IHdpdGggbm8gYnVpbGQgcHJvY2VzcyB0byBzdGlsbCBleHRlbmQgdGhlc2UgYWJzdHJhY3RzIGJ5IHByZWZpeGluZ1xuICAgICAqIHRoZW0gd2l0aCBcIlNub3dib2FyZFwiLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogY2xhc3MgTXlDbGFzcyBleHRlbmRzIFNub3dib2FyZC5QbHVnaW5CYXNlIHtcbiAgICAgKiAgICAgLi4uXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF0dGFjaEFic3RyYWN0cygpIHtcbiAgICAgICAgdGhpcy5QbHVnaW5CYXNlID0gUGx1Z2luQmFzZTtcbiAgICAgICAgdGhpcy5TaW5nbGV0b24gPSBTaW5nbGV0b247XG5cbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlBsdWdpbkJhc2UucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlBsdWdpbkJhc2UpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuU2luZ2xldG9uLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5TaW5nbGV0b24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBkZWZhdWx0IHV0aWxpdGllcy5cbiAgICAgKi9cbiAgICBsb2FkVXRpbGl0aWVzKCkge1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignY29va2llJywgQ29va2llKTtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ2pzb25QYXJzZXInLCBKc29uUGFyc2VyKTtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ3Nhbml0aXplcicsIFNhbml0aXplcik7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCd1cmwnLCBVcmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIHRoZSBmcmFtZXdvcmsuXG4gICAgICpcbiAgICAgKiBBdHRhY2hlcyBhIGxpc3RlbmVyIGZvciB0aGUgRE9NIGJlaW5nIHJlYWR5IGFuZCB0cmlnZ2VycyBhIGdsb2JhbCBcInJlYWR5XCIgZXZlbnQgZm9yIHBsdWdpbnMgdG8gYmVnaW4gYXR0YWNoaW5nXG4gICAgICogdGhlbXNlbHZlcyB0byB0aGUgRE9NLlxuICAgICAqL1xuICAgIGluaXRpYWxpc2UoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b0luaXRTaW5nbGV0b25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXNlU2luZ2xldG9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5nbG9iYWxFdmVudCgncmVhZHknKTtcbiAgICAgICAgICAgIHRoaXMucmVhZGluZXNzLmRvbSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIGFuIGluc3RhbmNlIG9mIGV2ZXJ5IHNpbmdsZXRvbi5cbiAgICAgKi9cbiAgICBpbml0aWFsaXNlU2luZ2xldG9ucygpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbnMpLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc1NpbmdsZXRvbigpICYmIHBsdWdpbi5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBwbHVnaW4gdG8gdGhlIGZyYW1ld29yay5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgYXJlIHRoZSBjb3JuZXJzdG9uZSBmb3IgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGZvciBTbm93Ym9hcmQuIEEgcGx1Z2luIG11c3QgZWl0aGVyIGJlIGFuIEVTMjAxNSBjbGFzc1xuICAgICAqIHRoYXQgZXh0ZW5kcyB0aGUgUGx1Z2luQmFzZSBvciBTaW5nbGV0b24gYWJzdHJhY3QgY2xhc3Nlcywgb3IgYSBzaW1wbGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBXaGVuIGEgcGx1Z2luIGlzIGFkZGVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGFzIGEgbmV3IG1hZ2ljIG1ldGhvZCBpbiB0aGUgU25vd2JvYXJkIGNsYXNzIHVzaW5nIHRoZSBuYW1lXG4gICAgICogcGFyYW1ldGVyLCBhbmQgY2FuIGJlIGNhbGxlZCB2aWEgdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIGJlIHRoZSBcImxvd2VyY2FzZVwiIHZlcnNpb24gb2YgdGhpcyBuYW1lLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIGEgcGx1Z2luIGlzIGFzc2lnbmVkIHRvIHRoZSBuYW1lIFwibXlQbHVnaW5cIiwgaXQgY2FuIGJlIGNhbGxlZCB2aWEgYFNub3dib2FyZC5teXBsdWdpbigpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfEZ1bmN0aW9ufSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZFBsdWdpbihuYW1lLCBpbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzUGx1Z2luKGxvd2VyTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQSBwbHVnaW4gY2FsbGVkIFwiJHtuYW1lfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UgIT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UgaW5zdGFuY2VvZiBQbHVnaW5CYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgcGx1Z2luIG11c3QgZXh0ZW5kIHRoZSBQbHVnaW5CYXNlIGNsYXNzLCBvciBtdXN0IGJlIGEgY2FsbGJhY2sgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpc1tuYW1lXSAhPT0gdW5kZWZpbmVkIHx8IHRoaXNbbG93ZXJOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBnaXZlbiBuYW1lIGlzIGFscmVhZHkgaW4gdXNlIGZvciBhIHByb3BlcnR5IG9yIG1ldGhvZCBvZiB0aGUgU25vd2JvYXJkIGNsYXNzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV0gPSBuZXcgUGx1Z2luTG9hZGVyKGxvd2VyTmFtZSwgdGhpcywgaW5zdGFuY2UpO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFBsdWdpbiBcIiR7bmFtZX1cIiByZWdpc3RlcmVkYCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYW55IHNpbmdsZXRvbnMgbm93IGhhdmUgdGhlaXIgZGVwZW5kZW5jaWVzIGZ1bGZpbGxlZCwgYW5kIGZpcmUgdGhlaXIgXCJyZWFkeVwiIGhhbmRsZXIgaWYgd2UncmVcbiAgICAgICAgLy8gaW4gYSByZWFkeSBzdGF0ZS5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmdldFBsdWdpbnMoKSkuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGx1Z2luLmlzU2luZ2xldG9uKClcbiAgICAgICAgICAgICAgICAmJiAhcGx1Z2luLmlzSW5pdGlhbGlzZWQoKVxuICAgICAgICAgICAgICAgICYmIHBsdWdpbi5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKVxuICAgICAgICAgICAgICAgICYmIHBsdWdpbi5oYXNNZXRob2QoJ2xpc3RlbnMnKVxuICAgICAgICAgICAgICAgICYmIE9iamVjdC5rZXlzKHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJykpLmluY2x1ZGVzKCdyZWFkeScpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5yZWFkaW5lc3MuZG9tXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeU1ldGhvZCA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJykucmVhZHk7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmNhbGxNZXRob2QocmVhZHlNZXRob2QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcGx1Z2luLlxuICAgICAqXG4gICAgICogUmVtb3ZlcyBhIHBsdWdpbiBmcm9tIFNub3dib2FyZCwgY2FsbGluZyB0aGUgZGVzdHJ1Y3RvciBtZXRob2QgZm9yIGFsbCBhY3RpdmUgaW5zdGFuY2VzIG9mIHRoZSBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZVBsdWdpbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKGxvd2VyTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYFBsdWdpbiBcIiR7bmFtZX1cIiBhbHJlYWR5IHJlbW92ZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgZGVzdHJ1Y3RvcnMgZm9yIGFsbCBpbnN0YW5jZXNcbiAgICAgICAgdGhpcy5wbHVnaW5zW2xvd2VyTmFtZV0uZ2V0SW5zdGFuY2VzKCkuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmRlc3RydWN0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXTtcbiAgICAgICAgZGVsZXRlIHRoaXNbbG93ZXJOYW1lXTtcbiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIHJlbW92ZWRgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgcGx1Z2luIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYW5kIGlzIGFjdGl2ZS5cbiAgICAgKlxuICAgICAqIEEgcGx1Z2luIHRoYXQgaXMgc3RpbGwgd2FpdGluZyBmb3IgZGVwZW5kZW5jaWVzIHRvIGJlIHJlZ2lzdGVyZWQgd2lsbCBub3QgYmUgYWN0aXZlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNQbHVnaW4obmFtZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZ2lzdGVyZWQgcGx1Z2lucyBhcyBQbHVnaW5Mb2FkZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5Mb2FkZXJbXX1cbiAgICAgKi9cbiAgICBnZXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBwbHVnaW5zLCBieSBuYW1lLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldFBsdWdpbk5hbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wbHVnaW5zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUGx1Z2luTG9hZGVyIG9iamVjdCBvZiBhIGdpdmVuIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQbHVnaW5Mb2FkZXJ9XG4gICAgICovXG4gICAgZ2V0UGx1Z2luKG5hbWUpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwbHVnaW4gY2FsbGVkIFwiJHtsb3dlck5hbWV9XCIgaGFzIGJlZW4gcmVnaXN0ZXJlZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhbGwgcGx1Z2lucyB0aGF0IGxpc3RlbiB0byB0aGUgZ2l2ZW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIHdvcmtzIGZvciBib3RoIG5vcm1hbCBhbmQgcHJvbWlzZSBldmVudHMuIEl0IGRvZXMgTk9UIGNoZWNrIHRoYXQgdGhlIHBsdWdpbidzIGxpc3RlbmVyIGFjdHVhbGx5IGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFRoZSBuYW1lIG9mIHRoZSBwbHVnaW5zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50LlxuICAgICAqL1xuICAgIGxpc3RlbnNUb0V2ZW50KGV2ZW50TmFtZSkge1xuICAgICAgICBjb25zdCBwbHVnaW5zID0gW107XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5wbHVnaW5zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW25hbWUsIHBsdWdpbl0gPSBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBsdWdpbi5kZXBlbmRlbmNpZXNGdWxmaWxsZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGx1Z2luLmhhc01ldGhvZCgnbGlzdGVucycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyc1tldmVudE5hbWVdID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbGlzdGVuZXJzW2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5zLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwbHVnaW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHNpbXBsZSByZWFkeSBsaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIFN5bm9ueW1vdXMgd2l0aCBqUXVlcnkncyBcIiQoZG9jdW1lbnQpLnJlYWR5KClcIiBmdW5jdGlvbmFsaXR5LCB0aGlzIGFsbG93cyBpbmxpbmUgc2NyaXB0cyB0b1xuICAgICAqIGF0dGFjaCB0aGVtc2VsdmVzIHRvIFNub3dib2FyZCBpbW1lZGlhdGVseSBidXQgb25seSBmaXJlIHdoZW4gdGhlIERPTSBpcyByZWFkeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcmVhZHkoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZGluZXNzLmRvbSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub24oJ3JlYWR5JywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzaW1wbGUgbGlzdGVuZXIgZm9yIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWQtaG9jIHNjcmlwdHMgdGhhdCBkb24ndCBuZWVkIGEgZnVsbCBwbHVnaW4uIFRoZSBnaXZlbiBjYWxsYmFjayB3aWxsIGJlXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIGV2ZW50IG5hbWUgcHJvdmlkZWQgZmlyZXMuIFRoaXMgd29ya3MgZm9yIGJvdGggbm9ybWFsIGFuZCBQcm9taXNlIGV2ZW50cy4gRm9yXG4gICAgICogYSBQcm9taXNlIGV2ZW50LCB5b3VyIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uaW5jbHVkZXMoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHNpbXBsZSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBvZmYoZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgZ2xvYmFsIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYSBgZmFsc2VgLCB0aGUgZXZlbnQgaXMgY29uc2lkZXJlZCBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IElmIGV2ZW50IHdhcyBub3QgY2FuY2VsbGVkXG4gICAgICovXG4gICAgZ2xvYmFsRXZlbnQoZXZlbnROYW1lLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYENhbGxpbmcgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgLCAuLi5wYXJhbWV0ZXJzKTtcblxuICAgICAgICAvLyBGaW5kIHBsdWdpbnMgbGlzdGVuaW5nIHRvIHRoZSBldmVudC5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5zVG9FdmVudChldmVudE5hbWUpO1xuICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgTm8gbGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWJ1ZyhgTGlzdGVuZXJzIGZvdW5kIGZvciBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cIjogJHtsaXN0ZW5lcnMuam9pbignLCAnKX1gKTtcblxuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuZ2V0UGx1Z2luKG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNTaW5nbGV0b24oKSAmJiBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlzdGVuTWV0aG9kID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKVtldmVudE5hbWVdO1xuXG4gICAgICAgICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXIgbWV0aG9kcyBmb3IgYWxsIHBsdWdpbnMsIGlmIHRoZXkgaGF2ZSBhIG1ldGhvZCBzcGVjaWZpZWQgZm9yIHRoZSBldmVudC5cbiAgICAgICAgICAgIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgcGx1Z2luIGhhcyBjYW5jZWxsZWQgdGhlIGV2ZW50LCBubyBmdXJ0aGVyIHBsdWdpbnMgYXJlIGNvbnNpZGVyZWQuXG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGxpc3Rlbk1ldGhvZC5hcHBseShpbnN0YW5jZSwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwiJHtsaXN0ZW5NZXRob2R9XCIgbWV0aG9kIGluIFwiJHtuYW1lfVwiIHBsdWdpbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKC4uLnBhcmFtZXRlcnMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgR2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCIgY2FuY2VsbGVkIGJ5IFwiJHtuYW1lfVwiIHBsdWdpbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgTGlzdGVuIG1ldGhvZCBmb3IgXCIke2V2ZW50TmFtZX1cIiBldmVudCBpbiBcIiR7bmFtZX1cIiBwbHVnaW4gaXMgbm90IGEgZnVuY3Rpb24gb3Igc3RyaW5nLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIGFkLWhvYyBsaXN0ZW5lcnMgZm9yIHRoaXMgZXZlbnQuXG4gICAgICAgIGlmICghY2FuY2VsbGVkICYmIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBGb3VuZCAke3RoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RofSBhZC1ob2MgbGlzdGVuZXIocykgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIGxpc3RlbmVyIGhhcyBjYW5jZWxsZWQgdGhlIGV2ZW50LCBubyBmdXJ0aGVyIGxpc3RlbmVycyBhcmUgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIoLi4ucGFyYW1ldGVycykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgR2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9IGNhbmNlbGxlZCBieSBhbiBhZC1ob2MgbGlzdGVuZXIuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IGFuIGFkLWhvYyBsaXN0ZW5lci5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIWNhbmNlbGxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIGdsb2JhbCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zLCBleHBlY3RpbmcgYSBQcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IGFsbC5cbiAgICAgKlxuICAgICAqIFRoaXMgY29sbGF0ZXMgYWxsIHBsdWdpbnMgcmVzcG9uc2VzIGludG8gb25lIGxhcmdlIFByb21pc2UgdGhhdCBlaXRoZXIgZXhwZWN0cyBhbGwgdG8gYmUgcmVzb2x2ZWQsIG9yIG9uZSB0byByZWplY3QuXG4gICAgICogSWYgbm8gbGlzdGVuZXJzIGFyZSBmb3VuZCwgYSByZXNvbHZlZCBQcm9taXNlIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqL1xuICAgIGdsb2JhbFByb21pc2VFdmVudChldmVudE5hbWUsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgQ2FsbGluZyBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG5cbiAgICAgICAgLy8gRmluZCBwbHVnaW5zIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50LlxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbnNUb0V2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBObyBsaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKGBMaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCI6ICR7bGlzdGVuZXJzLmpvaW4oJywgJyl9YCk7XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5nZXRQbHVnaW4obmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc1NpbmdsZXRvbigpICYmIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5NZXRob2QgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpW2V2ZW50TmFtZV07XG5cbiAgICAgICAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlciBtZXRob2RzIGZvciBhbGwgcGx1Z2lucywgaWYgdGhleSBoYXZlIGEgbWV0aG9kIHNwZWNpZmllZCBmb3IgdGhlIGV2ZW50LlxuICAgICAgICAgICAgcGx1Z2luLmdldEluc3RhbmNlcygpLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlUHJvbWlzZSA9IGxpc3Rlbk1ldGhvZC5hcHBseShpbnN0YW5jZSwgcGFyYW1ldGVycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZVByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbnN0YW5jZVByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdGVuTWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlW2xpc3Rlbk1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcIiR7bGlzdGVuTWV0aG9kfVwiIG1ldGhvZCBpbiBcIiR7bmFtZX1cIiBwbHVnaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZVByb21pc2UgPSBpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKC4uLnBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW5zdGFuY2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIHByb21pc2UgZXZlbnQgYnkgXCIke25hbWV9XCIgcGx1Z2luLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgTGlzdGVuIG1ldGhvZCBmb3IgXCIke2V2ZW50TmFtZX1cIiBldmVudCBpbiBcIiR7bmFtZX1cIiBwbHVnaW4gaXMgbm90IGEgZnVuY3Rpb24gb3Igc3RyaW5nLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIGFkLWhvYyBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdICYmIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgRm91bmQgJHt0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aH0gYWQtaG9jIGxpc3RlbmVyKHMpIGZvciBnbG9iYWwgcHJvbWlzZSBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lclByb21pc2UgPSBsaXN0ZW5lciguLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGxpc3RlbmVyUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBwcm9taXNlIGV2ZW50IGJ5IGFuIGFkLWhvYyBsaXN0ZW5lci5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhIHN0eWxlZCBtZXNzYWdlIGluIHRoZSBjb25zb2xlLlxuICAgICAqXG4gICAgICogSW5jbHVkZXMgcGFyYW1ldGVycyBhbmQgYSBzdGFjayB0cmFjZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGxvZ01lc3NhZ2UoY29sb3IsIGJvbGQsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgICAgICclY1tTbm93Ym9hcmRdJyxcbiAgICAgICAgICAgIGBjb2xvcjogJHtjb2xvcn07IGZvbnQtd2VpZ2h0OiAkeyhib2xkKSA/ICdib2xkJyA6ICdub3JtYWwnfTtgLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICApO1xuICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICAgICAgICAgYCVjUGFyYW1ldGVycyAlYygke3BhcmFtZXRlcnMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICdjb2xvcjogcmdiKDQ1LCAxNjcsIDE5OSk7IGZvbnQtd2VpZ2h0OiBib2xkOycsXG4gICAgICAgICAgICAgICAgJ2NvbG9yOiByZ2IoODgsIDg4LCA4OCk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJWMke2luZGV4fTpgLCAnY29sb3I6IHJnYig4OCwgODgsIDg4KTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsnLCBwYXJhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZCgnJWNUcmFjZScsICdjb2xvcjogcmdiKDQ1LCAxNjcsIDE5OSk7IGZvbnQtd2VpZ2h0OiBib2xkOycpO1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBsb2cobWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UoJ3JnYig0NSwgMTY3LCAxOTkpJywgZmFsc2UsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBUaGVzZSBtZXNzYWdlcyBhcmUgb25seSBzaG93biB3aGVuIGRlYnVnZ2luZyBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZGVidWcobWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBpZiAoIXRoaXMuZGVidWdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UoJ3JnYig0NSwgMTY3LCAxOTkpJywgZmFsc2UsIG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGVycm9yKG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKCdyZ2IoMjI5LCAzNSwgMzUpJywgdHJ1ZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VDb29raWUgZnJvbSAnanMtY29va2llJztcbmltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogQ29va2llIHV0aWxpdHkuXG4gKlxuICogVGhpcyB1dGlsaXR5IGlzIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgXCJqcy1jb29raWVcIiBsaWJyYXJ5LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pzLWNvb2tpZS9qcy1jb29raWVcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWUgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIGV4cGlyZXM6IG51bGwsXG4gICAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgICBkb21haW46IG51bGwsXG4gICAgICAgICAgICBzZWN1cmU6IGZhbHNlLFxuICAgICAgICAgICAgc2FtZVNpdGU6ICdMYXgnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBjb29raWUgcGFyYW1ldGVycyBmb3IgYWxsIHN1YnNlcXVlbnQgXCJzZXRcIiBhbmQgXCJyZW1vdmVcIiBjYWxscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICovXG4gICAgc2V0RGVmYXVsdHMob3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvb2tpZSBkZWZhdWx0cyBtdXN0IGJlIHByb3ZpZGVkIGFzIGFuIG9iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0c1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgY29va2llIHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldERlZmF1bHRzKCkge1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZGVmYXVsdHMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHNba2V5XSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvb2tpZSBieSBuYW1lLlxuICAgICAqXG4gICAgICogSWYgYG5hbWVgIGlzIHVuZGVmaW5lZCwgcmV0dXJucyBhbGwgY29va2llcyBhcyBhbiBPYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R8U3RyaW5nfVxuICAgICAqL1xuICAgIGdldChuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb2tpZXMgPSBCYXNlQ29va2llLmdldCgpO1xuXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhjb29raWVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtjb29raWVOYW1lLCBjb29raWVWYWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdjb29raWUuZ2V0JywgY29va2llTmFtZSwgY29va2llVmFsdWUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29raWVzW2Nvb2tpZU5hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvb2tpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBCYXNlQ29va2llLmdldChuYW1lKTtcblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIG92ZXJyaWRlIHRoZSBnb3R0ZW4gdmFsdWVcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Nvb2tpZS5nZXQnLCBuYW1lLCB2YWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGEgY29va2llIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCBjb29raWUgcGFyYW1ldGVycyB0aHJvdWdoIHRoZSBcIm9wdGlvbnNcIiBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBzZXQobmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHNhdmVWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIHRvIHNhdmVcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Nvb2tpZS5zZXQnLCBuYW1lLCB2YWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBzYXZlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEJhc2VDb29raWUuc2V0KG5hbWUsIHNhdmVWYWx1ZSwge1xuICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0cygpLFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgY29va2llIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHNwZWNpZnkgdGhlIGFkZGl0aW9uYWwgY29va2llIHBhcmFtZXRlcnMgdmlhIHRoZSBcIm9wdGlvbnNcIiBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlKG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgQmFzZUNvb2tpZS5yZW1vdmUobmFtZSwge1xuICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0cygpLFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBKU09OIFBhcnNlciB1dGlsaXR5LlxuICpcbiAqIFRoaXMgdXRpbGl0eSBwYXJzZXMgSlNPTi1saWtlIGRhdGEgdGhhdCBkb2VzIG5vdCBzdHJpY3RseSBtZWV0IHRoZSBKU09OIHNwZWNpZmljYXRpb25zIGluIG9yZGVyIHRvIHNpbXBsaWZ5IGRldmVsb3BtZW50LlxuICogSXQgaXMgYSBzYWZlIHJlcGxhY2VtZW50IGZvciBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV2YWwoXCIoe1wiICsgdmFsdWUgKyBcIn0pXCIpKSkgdGhhdCBkb2VzIG5vdCByZXF1aXJlIHRoZSB1c2Ugb2YgZXZhbCgpXG4gKlxuICogQGF1dGhvciBBeXVtaSBIYW1hc2FraVxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL29jdG9iZXJjbXMvb2N0b2Jlci9wdWxsLzQ1MjdcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSnNvblBhcnNlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICAvLyBBZGQgdG8gZ2xvYmFsIGZ1bmN0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICB3aW5kb3cud25KU09OID0gKGpzb24pID0+IHRoaXMucGFyc2UoanNvbik7XG4gICAgICAgIHdpbmRvdy5vY0pTT04gPSB3aW5kb3cud25KU09OO1xuICAgIH1cblxuICAgIHBhcnNlKHN0cikge1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gdGhpcy5wYXJzZVN0cmluZyhzdHIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcbiAgICB9XG5cbiAgICBwYXJzZVN0cmluZyh2YWx1ZSkge1xuICAgICAgICBsZXQgc3RyID0gdmFsdWUudHJpbSgpO1xuXG4gICAgICAgIGlmICghc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm9rZW4gSlNPTiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIGxldCB0eXBlID0gbnVsbDtcbiAgICAgICAgbGV0IGtleSA9IG51bGw7XG4gICAgICAgIGxldCBib2R5ID0gJyc7XG5cbiAgICAgICAgLypcbiAgICAgICAgKiB0aGUgbWlzdGFrZSAnLCdcbiAgICAgICAgKi9cbiAgICAgICAgd2hpbGUgKHN0ciAmJiBzdHJbMF0gPT09ICcsJykge1xuICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogc3RyaW5nXG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHJbMF0gPT09ICdcIicgfHwgc3RyWzBdID09PSAnXFwnJykge1xuICAgICAgICAgICAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gIT09IHN0clswXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcgSlNPTiBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJvZHkgPSAnXCInO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpICsgMV0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09IHN0clswXSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJ1xcXFxcIic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nIEpTT04gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBib29sZWFuXG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHIgPT09ICd0cnVlJyB8fCBzdHIgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIG51bGxcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0ciA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBudW1iZXJcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHN0cik7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW0udG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogb2JqZWN0XG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHJbMF0gPT09ICd7Jykge1xuICAgICAgICAgICAgdHlwZSA9ICduZWVkS2V5JztcbiAgICAgICAgICAgIGtleSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQgPSAneyc7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNCbGFua0NoYXIoc3RyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnbmVlZEtleScgJiYgKHN0cltpXSA9PT0gJ1wiJyB8fCBzdHJbaV0gPT09ICdcXCcnKSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlS2V5KHN0ciwgaSArIDEsIHN0cltpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgXCIke2tleX1cImA7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0ga2V5Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyS2V5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICduZWVkS2V5JyAmJiB0aGlzLmNhbkJlS2V5SGVhZChzdHJbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VLZXkoc3RyLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXCInO1xuICAgICAgICAgICAgICAgICAgICBpICs9IGtleS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyS2V5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhZnRlcktleScgJiYgc3RyW2ldID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICc6JztcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICc6JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5nZXRCb2R5KHN0ciwgaSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyBib2R5Lm9yaWdpbkxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnBhcnNlU3RyaW5nKGJvZHkuYm9keSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdhZnRlckJvZHknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FmdGVyQm9keScgfHwgdHlwZSA9PT0gJ25lZWRLZXknKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cltsYXN0XSA9PT0gJywnIHx8IHRoaXMuaXNCbGFua0NoYXIoc3RyW2xhc3RdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbbGFzdF0gPT09ICd9JyAmJiBsYXN0ID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICd9JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgIT09IGkgJiYgcmVzdWx0ICE9PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ25lZWRLZXknO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGxhc3QgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIG9iamVjdCBuZWFyICR7cmVzdWx0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBhcnJheVxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyWzBdID09PSAnWycpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICdbJztcbiAgICAgICAgICAgIHR5cGUgPSAnbmVlZEJvZHknO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnICcgfHwgc3RyW2ldID09PSAnXFxuJyB8fCBzdHJbaV0gPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICduZWVkQm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ251bGwsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ10nICYmIGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ10nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmdldEJvZHkoc3RyLCBpKTtcblxuICAgICAgICAgICAgICAgICAgICBpID0gaSArIGJvZHkub3JpZ2luTGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMucGFyc2VTdHJpbmcoYm9keS5ib2R5KTtcblxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyQm9keSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYWZ0ZXJCb2R5Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ25lZWRCb2R5JztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVhbCB3aXRoIG1pc3Rha2UgXCIsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdHJbaSArIDFdID09PSAnLCcgfHwgdGhpcy5pc0JsYW5rQ2hhcihzdHJbaSArIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaSArIDFdID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdudWxsLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICddJyAmJiBpID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICddJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYXJyYXkgbmVhciAke3Jlc3VsdH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBnZXRCb2R5KHN0ciwgcG9zKSB7XG4gICAgICAgIGxldCBib2R5ID0gJyc7XG5cbiAgICAgICAgLy8gcGFyc2Ugc3RyaW5nIGJvZHlcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnXCInIHx8IHN0cltwb3NdID09PSAnXFwnJykge1xuICAgICAgICAgICAgYm9keSA9IHN0cltwb3NdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcG9zICsgMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gc3RyW3Bvc10pIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBzdHJpbmcgYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIHRydWUgLyBmYWxzZVxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICd0Jykge1xuICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCd0cnVlJywgcG9zKSA9PT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiAndHJ1ZScubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ2YnKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ2YnLCBwb3MpID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6ICdmYWxzZScubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAnZmFsc2UnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9vbGVhbiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKDAsIHBvcyArIDEwKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIG51bGxcbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnbicpIHtcbiAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZignbnVsbCcsIHBvcykgPT09IHBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogJ251bGwnLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogJ251bGwnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9vbGVhbiBib2R5IG5lYXIgJHtzdHIuc3Vic3RyKDAsIHBvcyArIDEwKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIG51bWJlclxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICctJyB8fCBzdHJbcG9zXSA9PT0gJysnIHx8IHN0cltwb3NdID09PSAnLicgfHwgKHN0cltwb3NdID49ICcwJyAmJiBzdHJbcG9zXSA8PSAnOScpKSB7XG4gICAgICAgICAgICBib2R5ID0gJyc7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnLScgfHwgc3RyW2ldID09PSAnKycgfHwgc3RyW2ldID09PSAnLicgfHwgKHN0cltpXSA+PSAnMCcgJiYgc3RyW2ldIDw9ICc5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBudW1iZXIgYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIG9iamVjdFxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICd7JyB8fCBzdHJbcG9zXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IFtcbiAgICAgICAgICAgICAgICBzdHJbcG9zXSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBib2R5ID0gc3RyW3Bvc107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwb3MgKyAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1wiJyAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXSAhPT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKCd7Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnfScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gJHsoc3RyW3Bvc10gPT09ICd7JyA/ICdvYmplY3QnIDogJ2FycmF5Jyl9IGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goJ1snKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICddJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBpIC0gcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gJHsoc3RyW3Bvc10gPT09ICd7JyA/ICdvYmplY3QnIDogJ2FycmF5Jyl9IGJvZHkgbmVhciAke2JvZHl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoKHBvcyAtIDUgPj0gMCkgPyBwb3MgLSA1IDogMCwgNTApfWApO1xuICAgIH1cblxuICAgIHBhcnNlS2V5KHN0ciwgcG9zLCBxdW90ZSkge1xuICAgICAgICBsZXQga2V5ID0gJyc7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHF1b3RlICYmIHF1b3RlID09PSBzdHJbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdW90ZSAmJiAoc3RyW2ldID09PSAnICcgfHwgc3RyW2ldID09PSAnOicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAga2V5ICs9IHN0cltpXTtcblxuICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnICYmIGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGtleSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gc3ludGF4IG5lYXIgJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgY2FuQmVLZXlIZWFkKGNoKSB7XG4gICAgICAgIGlmIChjaFswXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjaFswXSA+PSAnYScgJiYgY2hbMF0gPD0gJ3onKSB8fCAoY2hbMF0gPj0gJ0EnICYmIGNoWzBdIDw9ICdaJykgfHwgY2hbMF0gPT09ICdfJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoWzBdID49ICcwJyAmJiBjaFswXSA8PSAnOScpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaFswXSA9PT0gJyQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2guY2hhckNvZGVBdCgwKSA+IDI1NSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNCbGFua0NoYXIoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID09PSAnICcgfHwgY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFx0JztcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIFNhbml0aXplciB1dGlsaXR5LlxuICpcbiAqIENsaWVudC1zaWRlIEhUTUwgc2FuaXRpemVyIGRlc2lnbmVkIG1vc3RseSB0byBwcmV2ZW50IHNlbGYtWFNTIGF0dGFja3MuXG4gKiBUaGUgc2FuaXRpemVyIHV0aWxpdHkgd2lsbCBzdHJpcCBhbGwgYXR0cmlidXRlcyB0aGF0IHN0YXJ0IHdpdGggYG9uYCAodXN1YWxseSBKUyBldmVudCBoYW5kbGVycyBhcyBhdHRyaWJ1dGVzLCBpLmUuIGBvbmxvYWRgIG9yIGBvbmVycm9yYCkgb3IgY29udGFpbiB0aGUgYGphdmFzY3JpcHQ6YCBwc2V1ZG8gcHJvdG9jb2wgaW4gdGhlaXIgdmFsdWVzLlxuICpcbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNhbml0aXplciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICAvLyBBZGQgdG8gZ2xvYmFsIGZ1bmN0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICB3aW5kb3cud25TYW5pdGl6ZSA9IChodG1sKSA9PiB0aGlzLnNhbml0aXplKGh0bWwpO1xuICAgICAgICB3aW5kb3cub2NTYW5pdGl6ZSA9IHdpbmRvdy53blNhbml0aXplO1xuICAgIH1cblxuICAgIHNhbml0aXplKGh0bWwsIGJvZHlPbmx5KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHJldHVybkJvZHlPbmx5ID0gKGJvZHlPbmx5ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGJvZHlPbmx5ID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICA/IGJvZHlPbmx5XG4gICAgICAgICAgICA6IHRydWU7XG5cbiAgICAgICAgdGhpcy5zYW5pdGl6ZU5vZGUoZG9tLmdldFJvb3ROb2RlKCkpO1xuXG4gICAgICAgIHJldHVybiAocmV0dXJuQm9keU9ubHkpID8gZG9tLmJvZHkuaW5uZXJIVE1MIDogZG9tLmlubmVySFRNTDtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZU5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS50YWdOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJpbUF0dHJpYnV0ZXMobm9kZSk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKG5vZGUuY2hpbGRyZW4pO1xuXG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhbml0aXplTm9kZShjaGlsZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyaW1BdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9IG5vZGUuYXR0cmlidXRlcy5pdGVtKGkpLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBub2RlLmF0dHJpYnV0ZXMuaXRlbShpKS52YWx1ZTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICogcmVtb3ZlIGF0dHJpYnV0ZXMgd2hlcmUgdGhlIG5hbWVzIHN0YXJ0IHdpdGggXCJvblwiIChmb3IgZXhhbXBsZTogb25sb2FkLCBvbmVycm9yLi4uKVxuICAgICAgICAgICAgKiByZW1vdmUgYXR0cmlidXRlcyB3aGVyZSB0aGUgdmFsdWUgc3RhcnRzIHdpdGggdGhlIFwiamF2YXNjcmlwdDpcIiBwc2V1ZG8gcHJvdG9jb2wgKGZvciBleGFtcGxlIGhyZWY9XCJqYXZhc2NyaXB0OmFsZXJ0KDEpXCIpXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICBpZiAoYXR0ck5hbWUuaW5kZXhPZignb24nKSA9PT0gMCB8fCBhdHRyVmFsdWUuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogVVJMIHV0aWxpdHkuXG4gKlxuICogVGhpcyB1dGlsaXR5IHByb3ZpZGVzIFVSTCBmdW5jdGlvbnMuXG4gKlxuICogQGNvcHlyaWdodCAyMDIyIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVybCBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IG51bGw7XG4gICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IG51bGw7XG4gICAgICAgIHRoaXMuYmFzZVVybCgpO1xuICAgICAgICB0aGlzLmFzc2V0VXJsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIFVSTCBiYXNlZCBvbiBhIHJlbGF0aXZlIHBhdGguXG4gICAgICpcbiAgICAgKiBJZiBhbiBhYnNvbHV0ZSBVUkwgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG8odXJsKSB7XG4gICAgICAgIGNvbnN0IHVybFJlZ2V4ID0gL14oPzpbXjpdKzpcXC9cXC8pWy1hLXowLTlAOiUuXyt+Iz1dezEsMjU2fVxcYihbLWEtejAtOSgpQDolXysufiM/Ji8vPV0qKS9pO1xuXG4gICAgICAgIGlmICh1cmwubWF0Y2godXJsUmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhlVXJsID0gdXJsLnJlcGxhY2UoL15cXC8rLywgJycpO1xuXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmJhc2VVcmwoKX0ke3RoZVVybH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gQXNzZXQgVVJMIGJhc2VkIG9uIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKlxuICAgICAqIElmIGFuIGFic29sdXRlIFVSTCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBhc3NldCh1cmwpIHtcbiAgICAgICAgY29uc3QgdXJsUmVnZXggPSAvXig/OlteOl0rOlxcL1xcLylbLWEtejAtOUA6JS5fK34jPV17MSwyNTZ9XFxiKFstYS16MC05KClAOiVfKy5+Iz8mLy89XSopL2k7XG5cbiAgICAgICAgaWYgKHVybC5tYXRjaCh1cmxSZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aGVVcmwgPSB1cmwucmVwbGFjZSgvXlxcLysvLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYXNzZXRVcmwoKX0ke3RoZVVybH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBiYXNlIFVSTCBvZiB0aGlzIGluc3RhbGwuXG4gICAgICpcbiAgICAgKiBUaGlzIGRldGVybWluZXMgdGhlIGJhc2UgVVJMIGZyb20gdGhyZWUgc291cmNlcywgaW4gb3JkZXI6XG4gICAgICogIC0gSWYgU25vd2JvYXJkIGlzIGxvYWRlZCB2aWEgdGhlIGB7JSBzbm93Ym9hcmQgJX1gIHRhZywgaXQgd2lsbCByZXRyaWV2ZSB0aGUgYmFzZSBVUkwgdGhhdFxuICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgdGhlcmUuXG4gICAgICogIC0gSWYgYSBgPGJhc2U+YCB0YWcgaXMgYXZhaWxhYmxlLCBpdCB3aWxsIHVzZSB0aGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgYmFzZSB0YWcuXG4gICAgICogIC0gRmluYWxseSwgaXQgd2lsbCB0YWtlIGEgZ3Vlc3MgZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyB3aWxsIGxpa2VseSBub3Qgd29yayBmb3Igc2l0ZXNcbiAgICAgKiB0aGF0IHJlc2lkZSBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBiYXNlIFVSTCB3aWxsIGFsd2F5cyBjb250YWluIGEgdHJhaWxpbmcgYmFja3NsYXNoLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBiYXNlVXJsKCkge1xuICAgICAgICBpZiAodGhpcy5mb3VuZEJhc2VVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykuZGF0YXNldC5iYXNlVXJsKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gW1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgICAgICAgJy8vJyxcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LFxuICAgICAgICAgICAgJy8nLFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmZvdW5kQmFzZVVybCA9IHVybFBhcnRzLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvdW5kQmFzZVVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgYXNzZXQgVVJMIG9mIHRoaXMgaW5zdGFsbC5cbiAgICAgKlxuICAgICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgYmFzZSBVUkwgZnJvbSB0aHJlZSBzb3VyY2VzLCBpbiBvcmRlcjpcbiAgICAgKiAgLSBJZiBTbm93Ym9hcmQgaXMgbG9hZGVkIHZpYSB0aGUgYHslIHNub3dib2FyZCAlfWAgdGFnLCBpdCB3aWxsIHJldHJpZXZlIHRoZSBhc3NldCBVUkwgdGhhdFxuICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgdGhlcmUuXG4gICAgICogIC0gSWYgYSBgPGxpbmsgcmVsPVwiYXNzZXRfdXJsXCIgaHJlZj1cImh0dHBzOi8vZXhhbXBsZS5jb21cIj5gIHRhZyBpcyBhdmFpbGFibGUsIGl0IHdpbGwgdXNlIHRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBsaW5rIHRhZy5cbiAgICAgKiAgLSBGaW5hbGx5LCBpdCB3aWxsIHRha2UgYSBndWVzcyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIHdpbGwgbGlrZWx5IG5vdCB3b3JrIGZvciBzaXRlc1xuICAgICAqIHRoYXQgcmVzaWRlIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgICAqXG4gICAgICogVGhlIGFzc2V0IFVSTCB3aWxsIGFsd2F5cyBjb250YWluIGEgdHJhaWxpbmcgYmFja3NsYXNoLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBhc3NldFVybCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm91bmRBc3NldFVybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1tb2R1bGU9XCJzbm93Ym9hcmQtYmFzZVwiXScpLmRhdGFzZXQuYXNzZXRVcmwpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImFzc2V0X3VybFwiXScpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImFzc2V0X3VybFwiXScpLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvdW5kQXNzZXRVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IFtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCxcbiAgICAgICAgICAgICcvLycsXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdCxcbiAgICAgICAgICAgICcvJyxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gdXJsUGFydHMuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhlIGJhc2UgVVJMLCBlbnN1cmluZyBpdCBpcyBhIEhUVFAvSFRUUHMgVVJMLlxuICAgICAqXG4gICAgICogSWYgdGhlIFNub3dib2FyZCBzY3JpcHQgb3IgPGJhc2U+IHRhZyBvbiB0aGUgcGFnZSB1c2UgYSBkaWZmZXJlbnQgdHlwZSBvZiBVUkwsIHRoaXMgd2lsbCBmYWlsIHdpdGhcbiAgICAgKiBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHZhbGlkYXRlQmFzZVVybCh1cmwpIHtcbiAgICAgICAgY29uc3QgdXJsUmVnZXggPSAvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8vaTtcbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSB1cmxSZWdleC5leGVjKHVybCk7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdXJsUGFydHNbMl07XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybFBhcnRzWzRdO1xuXG4gICAgICAgIGlmIChwcm90b2NvbCAmJiBbJ2h0dHAnLCAnaHR0cHMnXS5pbmRleE9mKHByb3RvY29sLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhc2UgVVJMIGRldGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiYXNlIFVSTCBkZXRlY3RlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh1cmwuc3Vic3RyKC0xKSA9PT0gJy8nKVxuICAgICAgICAgICAgPyB1cmxcbiAgICAgICAgICAgIDogYCR7dXJsfS9gO1xuICAgIH1cbn1cbiIsImltcG9ydCBTbm93Ym9hcmQgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Nub3dib2FyZCc7XG5pbXBvcnQgUHJveHlIYW5kbGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvbWFpbi9Qcm94eUhhbmRsZXInO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L1JlcXVlc3QnO1xuaW1wb3J0IEF0dHJpYnV0ZVJlcXVlc3QgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L2hhbmRsZXJzL0F0dHJpYnV0ZVJlcXVlc3QnO1xuaW1wb3J0IEFzc2V0TG9hZGVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Fzc2V0TG9hZGVyJztcbmltcG9ydCBEYXRhQ29uZmlnIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0RhdGFDb25maWcnO1xuaW1wb3J0IFN0eWxlc2hlZXRMb2FkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3R5bGVzaGVldExvYWRlcic7XG5pbXBvcnQgVHJhbnNpdGlvbiBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9UcmFuc2l0aW9uJztcbmltcG9ydCBGbGFzaCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaCc7XG5pbXBvcnQgRmxhc2hMaXN0ZW5lciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaExpc3RlbmVyJztcbmltcG9ydCBGb3JtVmFsaWRhdGlvbiBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9Gb3JtVmFsaWRhdGlvbic7XG5pbXBvcnQgQXR0YWNoTG9hZGluZyBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9BdHRhY2hMb2FkaW5nJztcbmltcG9ydCBTdHJpcGVMb2FkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3RyaXBlTG9hZGVyJztcbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyaWdnZXInO1xuXG4oKHdpbmRvdykgPT4ge1xuICAgIGNvbnN0IHNub3dib2FyZCA9IG5ldyBQcm94eShcbiAgICAgICAgbmV3IFNub3dib2FyZCh0cnVlLCB0cnVlKSxcbiAgICAgICAgUHJveHlIYW5kbGVyLFxuICAgICk7XG5cbiAgICAvLyBDb3ZlciBhbGwgYWxpYXNlc1xuICAgIHdpbmRvdy5zbm93Ym9hcmQgPSBzbm93Ym9hcmQ7XG4gICAgd2luZG93LlNub3dib2FyZCA9IHNub3dib2FyZDtcbiAgICB3aW5kb3cuU25vd0JvYXJkID0gc25vd2JvYXJkO1xuXG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbigncmVxdWVzdCcsIFJlcXVlc3QpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2F0dHJpYnV0ZVJlcXVlc3QnLCBBdHRyaWJ1dGVSZXF1ZXN0KTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdhc3NldExvYWRlcicsIEFzc2V0TG9hZGVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdkYXRhQ29uZmlnJywgRGF0YUNvbmZpZyk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZXh0cmFzU3R5bGVzJywgU3R5bGVzaGVldExvYWRlcik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbigndHJhbnNpdGlvbicsIFRyYW5zaXRpb24pO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2ZsYXNoJywgRmxhc2gpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2ZsYXNoTGlzdGVuZXInLCBGbGFzaExpc3RlbmVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdmb3JtVmFsaWRhdGlvbicsIEZvcm1WYWxpZGF0aW9uKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdhdHRhY2hMb2FkaW5nJywgQXR0YWNoTG9hZGluZyk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignc3RyaXBlTG9hZGVyJywgU3RyaXBlTG9hZGVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCd0cmlnZ2VyJywgVHJpZ2dlcik7XG5cbiAgICBzbm93Ym9hcmQub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAvLyBTY2FuIGZvciB0cmlnZ2Vyc1xuICAgICAgICBBcnJheVxuICAgICAgICAgICAgLmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpKVxuICAgICAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gWy4uLmVsZW1lbnQuYXR0cmlidXRlc10uZmlsdGVyKFxuICAgICAgICAgICAgICAgICh7IG5hbWUgfSkgPT4gbmFtZS5zdGFydHNXaXRoKFwiZGF0YS10cmlnZ2VyLVwiKSkubGVuZ3RoID4gMFxuICAgICAgICAgICAgKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgc25vd2JvYXJkLnRyaWdnZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcbn0pKHdpbmRvdyk7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCIvKiEganMtY29va2llIHYzLjAuNSB8IE1JVCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5mdW5jdGlvbiBhc3NpZ24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG52YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgcmVhZDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICB9LFxuICB3cml0ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIClcbiAgfVxufTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG5mdW5jdGlvbiBpbml0IChjb252ZXJ0ZXIsIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gIGZ1bmN0aW9uIHNldCAobmFtZSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGVmYXVsdEF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICB9XG5cbiAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpXG4gICAgICAucmVwbGFjZSgvJSgyWzM0NkJdfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXG4gICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgdmFyIHN0cmluZ2lmaWVkQXR0cmlidXRlcyA9ICcnO1xuICAgIGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgaWYgKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc2lkZXJzIFJGQyA2MjY1IHNlY3Rpb24gNS4yOlxuICAgICAgLy8gLi4uXG4gICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAvLyAgICAgY2hhcmFjdGVyOlxuICAgICAgLy8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcbiAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgLy8gLi4uXG4gICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAoZG9jdW1lbnQuY29va2llID1cbiAgICAgIG5hbWUgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIG5hbWUpICsgc3RyaW5naWZpZWRBdHRyaWJ1dGVzKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0IChuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgKGFyZ3VtZW50cy5sZW5ndGggJiYgIW5hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykgOiBbXTtcbiAgICB2YXIgamFyID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG4gICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBmb3VuZCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1swXSk7XG4gICAgICAgIGphcltmb3VuZF0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmQpO1xuXG4gICAgICAgIGlmIChuYW1lID09PSBmb3VuZCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWUgPyBqYXJbbmFtZV0gOiBqYXJcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgIHtcbiAgICAgIHNldCxcbiAgICAgIGdldCxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gKG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgc2V0KFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYXNzaWduKHt9LCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgd2l0aEF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiBpbml0KHRoaXMuY29udmVydGVyLCBhc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcykpXG4gICAgICB9LFxuICAgICAgd2l0aENvbnZlcnRlcjogZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICAgICAgICByZXR1cm4gaW5pdChhc3NpZ24oe30sIHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpLCB0aGlzLmF0dHJpYnV0ZXMpXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgY29udmVydGVyOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGNvbnZlcnRlcikgfVxuICAgIH1cbiAgKVxufVxuXG52YXIgYXBpID0gaW5pdChkZWZhdWx0Q29udmVydGVyLCB7IHBhdGg6ICcvJyB9KTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbmV4cG9ydCB7IGFwaSBhcyBkZWZhdWx0IH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsInZhciBkZWZlcnJlZCA9IFtdO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5PID0gKHJlc3VsdCwgY2h1bmtJZHMsIGZuLCBwcmlvcml0eSkgPT4ge1xuXHRpZihjaHVua0lkcykge1xuXHRcdHByaW9yaXR5ID0gcHJpb3JpdHkgfHwgMDtcblx0XHRmb3IodmFyIGkgPSBkZWZlcnJlZC5sZW5ndGg7IGkgPiAwICYmIGRlZmVycmVkW2kgLSAxXVsyXSA+IHByaW9yaXR5OyBpLS0pIGRlZmVycmVkW2ldID0gZGVmZXJyZWRbaSAtIDFdO1xuXHRcdGRlZmVycmVkW2ldID0gW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldO1xuXHRcdHJldHVybjtcblx0fVxuXHR2YXIgbm90RnVsZmlsbGVkID0gSW5maW5pdHk7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWQubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldID0gZGVmZXJyZWRbaV07XG5cdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjaHVua0lkcy5sZW5ndGg7IGorKykge1xuXHRcdFx0aWYgKChwcmlvcml0eSAmIDEgPT09IDAgfHwgbm90RnVsZmlsbGVkID49IHByaW9yaXR5KSAmJiBPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLk8pLmV2ZXJ5KChrZXkpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fLk9ba2V5XShjaHVua0lkc1tqXSkpKSkge1xuXHRcdFx0XHRjaHVua0lkcy5zcGxpY2Uoai0tLCAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZ1bGZpbGxlZCA9IGZhbHNlO1xuXHRcdFx0XHRpZihwcmlvcml0eSA8IG5vdEZ1bGZpbGxlZCkgbm90RnVsZmlsbGVkID0gcHJpb3JpdHk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKGZ1bGZpbGxlZCkge1xuXHRcdFx0ZGVmZXJyZWQuc3BsaWNlKGktLSwgMSlcblx0XHRcdHZhciByID0gZm4oKTtcblx0XHRcdGlmIChyICE9PSB1bmRlZmluZWQpIHJlc3VsdCA9IHI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyBubyBiYXNlVVJJXG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCIvYXNzZXRzL2pzL2FwcFwiOiAwLFxuXHRcImFzc2V0cy9jc3MvdGhlbWVcIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuX193ZWJwYWNrX3JlcXVpcmVfXy5PLmogPSAoY2h1bmtJZCkgPT4gKGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9PT0gMCk7XG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rd2ludGVyY21zX3dvcmtzaG9wX3RoZW1lXCJdID0gc2VsZltcIndlYnBhY2tDaHVua3dpbnRlcmNtc193b3Jrc2hvcF90aGVtZVwiXSB8fCBbXTtcbmNodW5rTG9hZGluZ0dsb2JhbC5mb3JFYWNoKHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgMCkpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKSk7IiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBkZXBlbmRzIG9uIG90aGVyIGxvYWRlZCBjaHVua3MgYW5kIGV4ZWN1dGlvbiBuZWVkIHRvIGJlIGRlbGF5ZWRcbl9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcImFzc2V0cy9jc3MvdGhlbWVcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9hc3NldHMvanMvc3JjL2FwcC5qc1wiKSkpXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcImFzc2V0cy9jc3MvdGhlbWVcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9hc3NldHMvY3NzL2Jhc2UuY3NzXCIpKSlcbl9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8oX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4iLCIiXSwibmFtZXMiOlsiUGx1Z2luQmFzZSIsInNub3dib2FyZCIsIl9jbGFzc0NhbGxDaGVjayIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiY29uc3RydWN0IiwiZGVwZW5kZW5jaWVzIiwibGlzdGVucyIsImRlc3RydWN0IiwiZGV0YWNoIiwiZGVzdHJ1Y3RvciIsImRlZmF1bHQiLCJTaW5nbGV0b24iLCJfUGx1Z2luQmFzZSIsIl9jYWxsU3VwZXIiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHMiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZSIsInQiLCJyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibiIsImhhc093blByb3BlcnR5IiwibyIsImRlZmluZVByb3BlcnR5IiwiaSIsIlN5bWJvbCIsImEiLCJpdGVyYXRvciIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiY2FsbCIsImgiLCJsIiwiZiIsInMiLCJ5IiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInAiLCJkIiwiZ2V0UHJvdG90eXBlT2YiLCJ2IiwidmFsdWVzIiwiZyIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsIl90eXBlb2YiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsIkVycm9yIiwiZG9uZSIsIm1ldGhvZCIsImRlbGVnYXRlIiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpc05hTiIsImxlbmd0aCIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwia2V5cyIsInJldmVyc2UiLCJwb3AiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicnZhbCIsImhhbmRsZSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwiaXNBcnJheSIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJpbWl0aXZlIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJfZ2V0UHJvdG90eXBlT2YiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIlJlZmVyZW5jZUVycm9yIiwiQm9vbGVhbiIsInZhbHVlT2YiLCJiaW5kIiwiX3NldFByb3RvdHlwZU9mIiwiUmVxdWVzdCIsImVsZW1lbnQiLCJoYW5kbGVyIiwib3B0aW9ucyIsIl90aGlzIiwiaXNIYW5kbGVyTmFtZSIsIm1hdGNoZWRFbGVtZW50IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiY29uY2F0IiwiZmV0Y2hPcHRpb25zIiwicmVzcG9uc2VEYXRhIiwicmVzcG9uc2VFcnJvciIsImNhbmNlbGxlZCIsImNoZWNrUmVxdWVzdCIsImdsb2JhbEV2ZW50IiwiZXZlbnQiLCJFdmVudCIsImNhbmNlbGFibGUiLCJyZXF1ZXN0IiwiZGlzcGF0Y2hFdmVudCIsImRlZmF1bHRQcmV2ZW50ZWQiLCJkb0NsaWVudFZhbGlkYXRpb24iLCJjb25maXJtIiwiZG9Db25maXJtIiwiY29uZmlybWVkIiwiZG9BamF4IiwicmVzcG9uc2UiLCJwcm9jZXNzVXBkYXRlIiwiWF9XSU5URVJfU1VDQ0VTUyIsInByb2Nlc3NFcnJvciIsInByb2Nlc3NSZXNwb25zZSIsImVycm9yIiwiRWxlbWVudCIsInVuZGVmaW5lZCIsImdldEZldGNoIiwiaGVhZGVycyIsImJvZHkiLCJkYXRhIiwicmVkaXJlY3QiLCJtb2RlIiwiZmV0Y2giLCJ1cmwiLCJicm93c2VyVmFsaWRhdGUiLCJmb3JtIiwiY2hlY2tWYWxpZGl0eSIsInJlcG9ydFZhbGlkaXR5IiwiX3RoaXMyIiwiYWpheFByb21pc2UiLCJyZWplY3QiLCJvayIsInN0YXR1cyIsImhhcyIsImdldCIsImluY2x1ZGVzIiwianNvbiIsIm1lc3NhZ2UiLCJleGNlcHRpb24iLCJyZW5kZXJFcnJvciIsImZpbGUiLCJsaW5lIiwidHJhY2UiLCJ0ZXh0IiwicmVzcG9uc2VUZXh0IiwiWF9XSU5URVJfUkVTUE9OU0VfQ09ERSIsInByb21pc2UiLCJfdGhpczMiLCJiZWZvcmVVcGRhdGUiLCJwYXJ0aWFscyIsImVudHJpZXMiLCJlbnRyeSIsIl9lbnRyeSIsInN1YnN0ciIsIlhfV0lOVEVSX0FTU0VUUyIsInByb2Nlc3NBc3NldHMiLCJwcm9taXNlcyIsImdsb2JhbFByb21pc2VFdmVudCIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZG9VcGRhdGUiLCJ3aW5kb3ciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJfdGhpczQiLCJhZmZlY3RlZCIsIl9lbnRyeTIiLCJwYXJ0aWFsIiwiY29udGVudCIsInNlbGVjdG9yIiwidXBkYXRlIiwiZWxlbWVudHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaW5uZXJIVE1MIiwic3VjY2VzcyIsImZsYXNoIiwiWF9XSU5URVJfRkxBU0hfTUVTU0FHRVMiLCJwcm9jZXNzRmxhc2hNZXNzYWdlcyIsIlhfV0lOVEVSX1JFRElSRUNUIiwicHJvY2Vzc1JlZGlyZWN0IiwicHJvY2Vzc0Vycm9yTWVzc2FnZSIsInNraXBFcnJvciIsIlhfV0lOVEVSX0VSUk9SX0ZJRUxEUyIsInByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzIiwiWF9XSU5URVJfRVJST1JfTUVTU0FHRSIsIl90aGlzNSIsImhhbmRsZVJlZGlyZWN0UmVzcG9uc2UiLCJhZGRFdmVudExpc3RlbmVyIiwiY3JlYXRlRXZlbnQiLCJldmVudE5hbWUiLCJvbmNlIiwibG9jYXRpb24iLCJhc3NpZ24iLCJoYW5kbGVFcnJvck1lc3NhZ2UiLCJhbGVydCIsIm1lc3NhZ2VzIiwiaGFuZGxlRmxhc2hNZXNzYWdlcyIsImZpZWxkcyIsImhhbmRsZVZhbGlkYXRpb25FcnJvcnMiLCJhc3NldHMiLCJfZG9Db25maXJtIiwiX2NhbGxlZTIiLCJmdWxmaWxsZWQiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJoYW5kbGVDb25maXJtTWVzc2FnZSIsImxpc3RlbnNUb0V2ZW50IiwidDAiLCJ0YWdOYW1lIiwiY2xvc2VzdCIsImV4dHJhY3RQYXJ0aWFscyIsInhzcmZUb2tlbiIsImxvYWRpbmciLCJocmVmIiwiZmlsZXMiLCJGb3JtRGF0YSIsImRlYnVnIiwiY29va2llIiwiZm9ybURhdGEiLCJfZW50cnkzIiwiYXBwZW5kIiwiam9pbiIsIkF0dHJpYnV0ZVJlcXVlc3QiLCJfU2luZ2xldG9uIiwicmVhZHkiLCJhamF4U2V0dXAiLCJhdHRhY2hIYW5kbGVycyIsImRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24iLCJkZXRhY2hIYW5kbGVycyIsIl9nZXQiLCJjaGFuZ2VIYW5kbGVyIiwiY2xpY2tIYW5kbGVyIiwia2V5RG93bkhhbmRsZXIiLCJzdWJtaXRIYW5kbGVyIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRhcmdldCIsIm1hdGNoZXMiLCJwcm9jZXNzUmVxdWVzdE9uRWxlbWVudCIsImN1cnJlbnRFbGVtZW50IiwicGFyZW50RWxlbWVudCIsInByZXZlbnREZWZhdWx0IiwidmFsaWRUeXBlcyIsImluZGV4T2YiLCJnZXRBdHRyaWJ1dGUiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJ0cmFja0lucHV0IiwiZGF0YXNldCIsInJlcXVlc3RDb25maXJtIiwicmVxdWVzdFJlZGlyZWN0IiwicmVxdWVzdExvYWRpbmciLCJyZXF1ZXN0Rm9ybSIsInJlcXVlc3RVcmwiLCJwYXJzZURhdGEiLCJyZXF1ZXN0VXBkYXRlIiwicmVxdWVzdERhdGEiLCJvbkFqYXhTZXR1cCIsImZpZWxkTmFtZSIsImdldFBhcmVudFJlcXVlc3REYXRhIiwiZWxlbWVudERhdGEiLCJqc29ucGFyc2VyIiwicGFyc2UiLCJsYXN0VmFsdWUiLCJpbnRlcnZhbCIsInJlc2V0VHJhY2tJbnB1dFRpbWVyIiwiaW5wdXRUaW1lciIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9uIiwiRiIsIkFzc2V0TG9hZGVyIiwiYWpheExvYWRBc3NldHMiLCJfbG9hZCIsIl9pdGVyYXRvciIsIl9zdGVwIiwic2NyaXB0IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsInN0eWxlIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsImltYWdlIiwianMiLCJsb2FkU2NyaXB0IiwidDEiLCJjc3MiLCJsb2FkU3R5bGUiLCJ0MiIsInQzIiwiaW1nIiwibG9hZEltYWdlIiwidDQiLCJ0NSIsImxvYWQiLCJfeCIsImFzc2V0IiwibG9hZGVkIiwiZG9tU2NyaXB0IiwiY3JlYXRlRWxlbWVudCIsImRvbUNzcyIsImhlYWQiLCJJbWFnZSIsInNyYyIsIkF0dGFjaExvYWRpbmciLCJhamF4U3RhcnQiLCJhamF4RG9uZSIsImxvYWRFbGVtZW50cyIsImNsYXNzTGlzdCIsImFkZCIsImdldExvYWRpbmdDbGFzcyIsImF0dGFjaExvYWRpbmciLCJyZW1vdmUiLCJEYXRhQ29uZmlnIiwiaW5zdGFuY2UiLCJsb2NhbENvbmZpZyIsIkhUTUxFbGVtZW50IiwiaW5zdGFuY2VDb25maWciLCJhY2NlcHRlZENvbmZpZ3MiLCJyZWZyZXNoIiwiY29uZmlnIiwic2V0IiwicGVyc2lzdCIsImdldEFjY2VwdGVkQ29uZmlncyIsInByb2Nlc3NDb25maWciLCJhY2NlcHRBbGxEYXRhQ29uZmlncyIsImRlZmF1bHRzIiwiZ2V0RGVmYXVsdHMiLCJjb2VyY2VWYWx1ZSIsInN0cmluZ1ZhbHVlIiwic3RhcnRzV2l0aCIsImJhc2U2NHN0ciIsInJlcGxhY2UiLCJkZWNvZGVkIiwiYXRvYiIsInRvTG93ZXJDYXNlIiwianNvblBhcnNlciIsIkZsYXNoIiwiZHVyYXRpb24iLCJjbGVhciIsInRpbWVyIiwiZmxhc2hUaW1lciIsInJlbW92ZUF0dHJpYnV0ZSIsInN0b3BUaW1lciIsInN0YXJ0VGltZXIiLCJhcHBlbmRDaGlsZCIsInRyYW5zaXRpb24iLCJ0aW1lclRyYW5zIiwiY2FuY2VsIiwiRmxhc2hMaXN0ZW5lciIsImFqYXhFcnJvck1lc3NhZ2UiLCJhamF4Rmxhc2hNZXNzYWdlcyIsImZsYXNoVHlwZSIsImZsYXNoRHVyYXRpb24iLCJjc3NDbGFzcyIsIkZvcm1WYWxpZGF0aW9uIiwiZXJyb3JCYWdzIiwiYWpheFZhbGlkYXRpb25FcnJvcnMiLCJjb2xsZWN0RXJyb3JCYWdzIiwiZG9WYWxpZGF0aW9uIiwiaW52YWxpZEZpZWxkcyIsInJlcXVlc3RWYWxpZGF0ZSIsImVycm9yQmFnIiwic2hvd0Vycm9yQmFnIiwiY2xlYXJWYWxpZGF0aW9uIiwiaGlkZUVycm9yQmFnIiwicm9vdE5vZGUiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJtZXNzYWdlTGlzdEVsZW1lbnQiLCJwbGFjZWhvbGRlciIsImNyZWF0ZUNvbW1lbnQiLCJlcnJvckJhZ0RhdGEiLCJ2YWxpZGF0ZUZvciIsInNwbGl0IiwiY2xvbmVOb2RlIiwibWVzc2FnZUxpc3RBbmNob3IiLCJjdXN0b21NZXNzYWdlIiwidGV4dENvbnRlbnQiLCJjaGlsZE5vZGVzIiwicmVwbGFjZUNoaWxkIiwiaXNDb25uZWN0ZWQiLCJlcnJvckJhZ1ZhbGlkYXRlc0ZpZWxkIiwiZmlyc3RGaWVsZCIsImZpZWxkIiwic2hpZnQiLCJfaW52YWxpZEZpZWxkcyRmaXJzdEYiLCJlcnJvcnMiLCJtZXNzYWdlRWxlbWVudCIsInZhbGlkYXRpb25NZXNzYWdlIiwiYWZ0ZXIiLCJfaW52YWxpZEZpZWxkcyRPYmplY3QiLCJTdHJpcGVMb2FkZXIiLCJjb3VudGVyIiwiY3JlYXRlU3RyaXBlIiwic3RyaXBlIiwic2hvdyIsImhpZGUiLCJpbmRpY2F0b3IiLCJzdHJpcGVMb2FkZWQiLCJuZXdTdHJpcGUiLCJmb3JjZSIsIlN0eWxlc2hlZXRMb2FkZXIiLCJzdHlsZXNMb2FkZWQiLCJlbmRzV2l0aCIsInN0eWxlc2hlZXQiLCJUcmFuc2l0aW9uIiwiY2FsbGJhY2siLCJ0cmFpbFRvIiwicGFyc2VEdXJhdGlvbiIsImRvVHJhbnNpdGlvbiIsImV2ZW50Q2xhc3NlcyIsIl9sZW4iLCJhcmdzIiwiX2tleSIsImFjdGl2ZSIsIm91dCIsInJldHVybkNsYXNzZXMiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJyZXNldENsYXNzZXMiLCJldmVudENsYXNzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9uVHJhbnNpdGlvbkVuZCIsInBhcnNlZCIsImV4ZWMiLCJhbW91bnQiLCJ1bml0IiwiTWF0aCIsImZsb29yIiwiVHJpZ2dlciIsInRyaWdnZXJzIiwiTWFwIiwiZXZlbnRzIiwiY29ubmVjdG9ycyIsInBhcnNlVHJpZ2dlcnMiLCJzaXplIiwicmVzZXRFdmVudHMiLCJjcmVhdGVUcmlnZ2VyRXZlbnRzIiwicnVuRXZlbnRzIiwiZGFzaFN0eWxlIiwibWF0Y2giLCJ0cmlnZ2VyUGFydHMiLCJ0cmlnZ2VyTmFtZSIsInRyaWdnZXJUeXBlIiwiX3RyaWdnZXJQYXJ0cyIsInRyaWdnZXIiLCJnZXRTZWxlY3RhYmxlRWxlbWVudHMiLCJoYXNWYWxpZENvbmRpdGlvbnMiLCJoYXNWYWxpZEFjdGlvbnMiLCJwYXJzZUNvbW1hbmQiLCJjb21tYW5kIiwiYWxsb3dNdWx0aXBsZSIsInRyaW0iLCJzcGxpdFZhbHVlcyIsInF1b3RlZCIsIm1hcCIsInNwbGl0VmFsdWUiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJwYXJhbWV0ZXJzIiwic3BsaXRDb21tYW5kcyIsImNvbW1hbmRzIiwic3BsaXRDb21tYW5kIiwiX2NvbW1hbmQkc3BsaXQiLCJfY29tbWFuZCRzcGxpdDIiLCJldmVyeSIsImNvbmRpdGlvbiIsImFjdGlvbiIsImNyZWF0ZVZhbHVlQ29uZGl0aW9uIiwiY3JlYXRlRW1wdHlDb25kaXRpb24iLCJjcmVhdGVDaGVja2VkQ29uZGl0aW9uIiwicmVnaXN0ZXJFdmVudExpc3RlbmVycyIsImFkZEV2ZW50IiwiU2V0IiwicHJpb3JpdHkiLCJleGVjdXRlQWN0aW9ucyIsIl9yZWYiLCJlbGVtZW50RXZlbnQiLCJzb3J0IiwiYiIsImFsbCIsInN1cHBvcnRlZEVsZW1lbnRzIiwiZWxlbWVudFZhbHVlcyIsImNoZWNrZWQiLCJzb21lIiwiX3RoaXM2IiwiX3RoaXM3IiwiYXRMZWFzdCIsImF0TW9zdCIsImF0TGVhc3RDb3VudCIsImF0TW9zdENvdW50IiwiZWxlbWVudENvbm5lY3RvcnMiLCJjb25uZWN0b3IiLCJjb25kaXRpb25NZXQiLCJfdGhpczgiLCJhY3Rpb25TaG93IiwiYWN0aW9uRW5hYmxlIiwiYWN0aW9uVmFsdWUiLCJhY3Rpb25DbGFzcyIsIl90aGlzOSIsImRpc3BsYXkiLCJvcmlnaW5hbERpc3BsYXkiLCJhZnRlckFjdGlvbiIsImVuYWJsZSIsIl90aGlzMTAiLCJkaXNhYmxlZCIsIl90aGlzMTEiLCJ1bm1ldFZhbHVlIiwibmV3VmFsdWUiLCJfdGhpczEyIiwidW5tZXRDc3NDbGFzcyIsInByb3AiLCJyZWNlaXZlciIsInByb3BMb3dlciIsImhhc1BsdWdpbiIsIl9SZWZsZWN0JGdldCRwcm9wTG93ZSIsImdldEluc3RhbmNlIiwiSW5uZXJQcm94eUhhbmRsZXIiLCJQbHVnaW5Mb2FkZXIiLCJQcm94eSIsImZyZWV6ZSIsImluc3RhbmNlcyIsInNpbmdsZXRvbiIsImluaXRpYWxpc2VkIiwic2VhbCIsIm1vY2tzIiwib3JpZ2luYWxGdW5jdGlvbnMiLCJoYXNNZXRob2QiLCJtZXRob2ROYW1lIiwiaXNGdW5jdGlvbiIsImNhbGxNZXRob2QiLCJfbGVuMiIsIl9rZXkyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwidW5tZXQiLCJnZXREZXBlbmRlbmNpZXMiLCJpdGVtIiwiZ2V0UGx1Z2luTmFtZXMiLCJpc1NpbmdsZXRvbiIsImluaXRpYWxpc2VTaW5nbGV0b24iLCJfbGVuMyIsInBhcmFtcyIsIl9rZXkzIiwiX2VudHJ5NCIsIl9sZW40IiwiX2tleTQiLCJuZXdJbnN0YW5jZSIsIl9jb25zdHJ1Y3QiLCJzcGxpY2UiLCJnZXRJbnN0YW5jZXMiLCJpc0luaXRpYWxpc2VkIiwiX2xlbjUiLCJfa2V5NSIsInBsdWdpbiIsIm1vY2siLCJfbGVuNiIsIl9rZXk2IiwidW5tb2NrIiwiQ29va2llIiwiSnNvblBhcnNlciIsIlNhbml0aXplciIsIlVybCIsIlNub3dib2FyZCIsImF1dG9TaW5nbGV0b25zIiwiZGVidWdFbmFibGVkIiwiYXV0b0luaXRTaW5nbGV0b25zIiwicGx1Z2lucyIsImxpc3RlbmVycyIsImZvdW5kQmFzZVVybCIsInJlYWRpbmVzcyIsImRvbSIsImF0dGFjaEFic3RyYWN0cyIsImxvYWRVdGlsaXRpZXMiLCJpbml0aWFsaXNlIiwiYWRkUGx1Z2luIiwiaW5pdGlhbGlzZVNpbmdsZXRvbnMiLCJsb3dlck5hbWUiLCJnZXRQbHVnaW5zIiwicmVhZHlNZXRob2QiLCJyZW1vdmVQbHVnaW4iLCJnZXRQbHVnaW4iLCJvbiIsIm9mZiIsImluZGV4IiwibGlzdGVuTWV0aG9kIiwicmVzdWx0IiwibGlzdGVuZXIiLCJpbnN0YW5jZVByb21pc2UiLCJsaXN0ZW5lclByb21pc2UiLCJsb2dNZXNzYWdlIiwiY29sb3IiLCJib2xkIiwiY29uc29sZSIsImdyb3VwQ29sbGFwc2VkIiwicGFyYW0iLCJsb2ciLCJncm91cEVuZCIsIkJhc2VDb29raWUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsInNhbWVTaXRlIiwic2V0RGVmYXVsdHMiLCJjb29raWVzIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlIiwic2F2ZVZhbHVlIiwid25KU09OIiwib2NKU09OIiwic3RyIiwianNvblN0cmluZyIsInBhcnNlU3RyaW5nIiwiSlNPTiIsIm51bSIsImlzQmxhbmtDaGFyIiwicGFyc2VLZXkiLCJjYW5CZUtleUhlYWQiLCJnZXRCb2R5Iiwib3JpZ2luTGVuZ3RoIiwibGFzdCIsInBvcyIsInN0YWNrIiwicXVvdGUiLCJjaCIsImNoYXJDb2RlQXQiLCJ3blNhbml0aXplIiwiaHRtbCIsInNhbml0aXplIiwib2NTYW5pdGl6ZSIsImJvZHlPbmx5IiwicGFyc2VyIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicmV0dXJuQm9keU9ubHkiLCJzYW5pdGl6ZU5vZGUiLCJnZXRSb290Tm9kZSIsIm5vZGUiLCJ0cmltQXR0cmlidXRlcyIsImNoaWxkcmVuIiwiY2hpbGQiLCJhdHRyaWJ1dGVzIiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJmb3VuZEFzc2V0VXJsIiwiYmFzZVVybCIsImFzc2V0VXJsIiwidG8iLCJ1cmxSZWdleCIsInRoZVVybCIsInZhbGlkYXRlQmFzZVVybCIsInVybFBhcnRzIiwicHJvdG9jb2wiLCJob3N0IiwiUHJveHlIYW5kbGVyIiwiU25vd0JvYXJkIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/assets/js/src/app.js b/assets/js/src/theme.js similarity index 100% rename from assets/js/src/app.js rename to assets/js/src/theme.js diff --git a/assets/js/theme.js b/assets/js/theme.js new file mode 100644 index 0000000..5b4f205 --- /dev/null +++ b/assets/js/theme.js @@ -0,0 +1,6357 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/abstracts/PluginBase.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PluginBase) +/* harmony export */ }); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +/** + * Plugin base abstract. + * + * This class provides the base functionality for all plugins. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var PluginBase = /*#__PURE__*/function () { + /** + * Constructor. + * + * The constructor is provided the Snowboard framework instance, and should not be overwritten + * unless you absolutely know what you're doing. + * + * @param {Snowboard} snowboard + */ + function PluginBase(snowboard) { + _classCallCheck(this, PluginBase); + this.snowboard = snowboard; + } + + /** + * Plugin constructor. + * + * This method should be treated as the true constructor of a plugin, and can be overwritten. + * It will be called straight after construction. + */ + return _createClass(PluginBase, [{ + key: "construct", + value: function construct() {} + + /** + * Defines the required plugins for this specific module to work. + * + * @returns {string[]} An array of plugins required for this module to work, as strings. + */ + }, { + key: "dependencies", + value: function dependencies() { + return []; + } + + /** + * Defines the listener methods for global events. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return {}; + } + + /** + * Plugin destructor. + * + * Fired when this plugin is removed. Can be manually called if you have another scenario for + * destruction, ie. the element attached to the plugin is removed or changed. + */ + }, { + key: "destruct", + value: function destruct() { + this.detach(); + delete this.snowboard; + } + + /** + * Plugin destructor (old method name). + * + * Allows previous usage of the "destructor" method to still work. + */ + }, { + key: "destructor", + value: function destructor() { + this.destruct(); + } + }]); +}(); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js": +/*!***********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/abstracts/Singleton.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Singleton) +/* harmony export */ }); +/* harmony import */ var _PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Singleton plugin abstract. + * + * This is a special definition class that the Snowboard framework will use to interpret the current plugin as a + * "singleton". This will ensure that only one instance of the plugin class is used across the board. + * + * Singletons are initialised on the "domReady" event by default. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Singleton = /*#__PURE__*/function (_PluginBase) { + function Singleton() { + _classCallCheck(this, Singleton); + return _callSuper(this, Singleton, arguments); + } + _inherits(Singleton, _PluginBase); + return _createClass(Singleton); +}(_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/ajax/Request.js": +/*!****************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/ajax/Request.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Request) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } +function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Request plugin. + * + * This is the default AJAX handler which will run using the `fetch()` method that is default in modern browsers. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Request = /*#__PURE__*/function (_PluginBase) { + function Request() { + _classCallCheck(this, Request); + return _callSuper(this, Request, arguments); + } + _inherits(Request, _PluginBase); + return _createClass(Request, [{ + key: "construct", + value: + /** + * Constructor. + * + * The constructor accepts 2 or 3 parameters. + * + * If 2 parameters are provided, the first parameter is the handler name and the second + * parameter is the options. This assumes that this is a detached AJAX request not connected to + * an element. + * + * If 3 parameters are provided, the first parameter is an element or a selector, and the second + * and third parameters are the handler and options, respectively. + * + * @param {HTMLElement|string} element + * @param {string|Object} handler + * @param {Object} options + */ + function construct(element, handler, options) { + var _this = this; + if (typeof element === 'string') { + // Allow the element to be a handler name. + // This assumes the request is being made against no element, and the handler parameter + // will contain options. + if (this.isHandlerName(element)) { + this.element = null; + this.handler = element; + this.options = handler || {}; + } else { + var matchedElement = document.querySelector(element); + if (matchedElement === null) { + throw new Error("No element was found with the given selector: ".concat(element)); + } + this.element = matchedElement; + this.handler = handler; + this.options = options || {}; + } + } else { + this.element = element; + this.handler = handler; + this.options = options || {}; + } + this.fetchOptions = {}; + this.responseData = null; + this.responseError = null; + this.cancelled = false; + this.checkRequest(); + if (!this.snowboard.globalEvent('ajaxSetup', this)) { + this.cancelled = true; + return; + } + if (this.element) { + var event = new Event('ajaxSetup', { + cancelable: true + }); + event.request = this; + this.element.dispatchEvent(event); + if (event.defaultPrevented) { + this.cancelled = true; + return; + } + } + if (!this.doClientValidation()) { + this.cancelled = true; + return; + } + if (this.confirm) { + this.doConfirm().then(function (confirmed) { + if (confirmed) { + _this.doAjax().then(function (response) { + if (response.cancelled) { + _this.cancelled = true; + _this.complete(); + return; + } + _this.responseData = response; + _this.processUpdate(response).then(function () { + if (response.X_WINTER_SUCCESS === false) { + _this.processError(response); + } else { + _this.processResponse(response); + } + }); + }, function (error) { + _this.responseError = error; + _this.processError(error); + }); + } + }); + } else { + this.doAjax().then(function (response) { + if (response.cancelled) { + _this.cancelled = true; + _this.complete(); + return; + } + _this.responseData = response; + _this.processUpdate(response).then(function () { + if (response.X_WINTER_SUCCESS === false) { + _this.processError(response); + } else { + _this.processResponse(response); + } + }); + }, function (error) { + _this.responseError = error; + _this.processError(error); + }); + } + } + + /** + * Dependencies for this plugin. + * + * @returns {string[]} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['cookie', 'jsonParser']; + } + + /** + * Validates the element and handler given in the request. + */ + }, { + key: "checkRequest", + value: function checkRequest() { + if (this.element && this.element instanceof Element === false) { + throw new Error('The element provided must be an Element instance'); + } + if (this.handler === undefined) { + throw new Error('The AJAX handler name is not specified.'); + } + if (!this.isHandlerName(this.handler)) { + throw new Error('Invalid AJAX handler name. The correct handler name format is: "onEvent".'); + } + } + + /** + * Creates a Fetch request. + * + * This method is made available for plugins to extend or override the default fetch() settings with their own. + * + * @returns {Promise} + */ + }, { + key: "getFetch", + value: function getFetch() { + this.fetchOptions = this.options.fetchOptions !== undefined && _typeof(this.options.fetchOptions) === 'object' ? this.options.fetchOptions : { + method: 'POST', + headers: this.headers, + body: this.data, + redirect: 'follow', + mode: 'same-origin' + }; + this.snowboard.globalEvent('ajaxFetchOptions', this.fetchOptions, this); + return fetch(this.url, this.fetchOptions); + } + + /** + * Run client-side validation on the form, if available. + * + * @returns {boolean} + */ + }, { + key: "doClientValidation", + value: function doClientValidation() { + if (this.options.browserValidate === true && this.form) { + if (this.form.checkValidity() === false) { + this.form.reportValidity(); + return false; + } + } + return true; + } + + /** + * Executes the AJAX query. + * + * Returns a Promise object for when the AJAX request is completed. + * + * @returns {Promise} + */ + }, { + key: "doAjax", + value: function doAjax() { + var _this2 = this; + // Allow plugins to cancel the AJAX request before sending + if (this.snowboard.globalEvent('ajaxBeforeSend', this) === false) { + return Promise.resolve({ + cancelled: true + }); + } + var ajaxPromise = new Promise(function (resolve, reject) { + _this2.getFetch().then(function (response) { + if (!response.ok && response.status !== 406) { + if (response.headers.has('Content-Type') && response.headers.get('Content-Type').includes('/json')) { + response.json().then(function (responseData) { + if (responseData.message && responseData.exception) { + reject(_this2.renderError(responseData.message, responseData.exception, responseData.file, responseData.line, responseData.trace)); + } else { + reject(responseData); + } + }, function (error) { + reject(_this2.renderError("Unable to parse JSON response: ".concat(error))); + }); + } else { + response.text().then(function (responseText) { + reject(_this2.renderError(responseText)); + }, function (error) { + reject(_this2.renderError("Unable to process response: ".concat(error))); + }); + } + return; + } + if (response.headers.has('Content-Type') && response.headers.get('Content-Type').includes('/json')) { + response.json().then(function (responseData) { + resolve(_objectSpread(_objectSpread({}, responseData), {}, { + X_WINTER_SUCCESS: response.status !== 406, + X_WINTER_RESPONSE_CODE: response.status + })); + }, function (error) { + reject(_this2.renderError("Unable to parse JSON response: ".concat(error))); + }); + } else { + response.text().then(function (responseData) { + resolve(responseData); + }, function (error) { + reject(_this2.renderError("Unable to process response: ".concat(error))); + }); + } + }, function (responseError) { + reject(_this2.renderError("Unable to retrieve a response from the server: ".concat(responseError))); + }); + }); + this.snowboard.globalEvent('ajaxStart', ajaxPromise, this); + if (this.element) { + var event = new Event('ajaxPromise'); + event.promise = ajaxPromise; + this.element.dispatchEvent(event); + } + return ajaxPromise; + } + + /** + * Prepares for updating the partials from the AJAX response. + * + * If any partials are returned from the AJAX response, this method will also action the partial updates. + * + * Returns a Promise object which tracks when the partial update is complete. + * + * @param {Object} response + * @returns {Promise} + */ + }, { + key: "processUpdate", + value: function processUpdate(response) { + var _this3 = this; + return new Promise(function (resolve, reject) { + if (typeof _this3.options.beforeUpdate === 'function') { + if (_this3.options.beforeUpdate.apply(_this3, [response]) === false) { + resolve(); + return; + } + } + + // Extract partial information + var partials = {}; + Object.entries(response).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + key = _entry[0], + value = _entry[1]; + if (key.substr(0, 8) !== 'X_WINTER') { + partials[key] = value; + } + }); + if (Object.keys(partials).length === 0) { + if (response.X_WINTER_ASSETS) { + _this3.processAssets(response.X_WINTER_ASSETS).then(function () { + resolve(); + }, function () { + reject(); + }); + } else { + resolve(); + } + return; + } + var promises = _this3.snowboard.globalPromiseEvent('ajaxBeforeUpdate', response, _this3); + promises.then( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!response.X_WINTER_ASSETS) { + _context.next = 3; + break; + } + _context.next = 3; + return _this3.processAssets(response.X_WINTER_ASSETS); + case 3: + _this3.doUpdate(partials).then(function () { + // Allow for HTML redraw + window.requestAnimationFrame(function () { + return resolve(); + }); + }, function () { + reject(); + }); + case 4: + case "end": + return _context.stop(); + } + }, _callee); + })), function () { + resolve(); + }); + }); + } + + /** + * Updates the partials with the given content. + * + * @param {Object} partials + * @returns {Promise} + */ + }, { + key: "doUpdate", + value: function doUpdate(partials) { + var _this4 = this; + return new Promise(function (resolve) { + var affected = []; + Object.entries(partials).forEach(function (entry) { + var _entry2 = _slicedToArray(entry, 2), + partial = _entry2[0], + content = _entry2[1]; + var selector = _this4.options.update && _this4.options.update[partial] ? _this4.options.update[partial] : partial; + var mode = 'replace'; + if (selector.substr(0, 1) === '@') { + mode = 'append'; + selector = selector.substr(1); + } else if (selector.substr(0, 1) === '^') { + mode = 'prepend'; + selector = selector.substr(1); + } else if (selector.substr(0, 1) !== '#' && selector.substr(0, 1) !== '.') { + mode = 'noop'; + } + var elements = document.querySelectorAll(selector); + if (elements.length > 0) { + elements.forEach(function (element) { + switch (mode) { + case 'append': + element.innerHTML += content; + break; + case 'prepend': + element.innerHTML = content + element.innerHTML; + break; + case 'noop': + break; + case 'replace': + default: + element.innerHTML = content; + break; + } + affected.push(element); + + // Fire update event for each element that is updated + _this4.snowboard.globalEvent('ajaxUpdate', element, content, _this4); + var event = new Event('ajaxUpdate'); + event.content = content; + element.dispatchEvent(event); + }); + } + }); + _this4.snowboard.globalEvent('ajaxUpdateComplete', affected, _this4); + resolve(); + }); + } + + /** + * Processes the response data. + * + * This fires off all necessary processing functions depending on the response, ie. if there's any flash + * messages to handle, or any redirects to be undertaken. + * + * @param {Object} response + * @returns {void} + */ + }, { + key: "processResponse", + value: function processResponse(response) { + if (this.options.success && typeof this.options.success === 'function') { + if (this.options.success(this.responseData, this) === false) { + return; + } + } + + // Allow plugins to cancel any further response handling + if (this.snowboard.globalEvent('ajaxSuccess', this.responseData, this) === false) { + return; + } + + // Allow the element to cancel any further response handling + if (this.element) { + var event = new Event('ajaxDone', { + cancelable: true + }); + event.responseData = this.responseData; + event.request = this; + this.element.dispatchEvent(event); + if (event.defaultPrevented) { + return; + } + } + if (this.flash && response.X_WINTER_FLASH_MESSAGES) { + this.processFlashMessages(response.X_WINTER_FLASH_MESSAGES); + } + + // Check for a redirect from the response, or use the redirect as specified in the options. + if (this.redirect || response.X_WINTER_REDIRECT) { + this.processRedirect(this.redirect || response.X_WINTER_REDIRECT); + return; + } + this.complete(); + } + + /** + * Processes an error response from the AJAX request. + * + * This fires off all necessary processing functions depending on the error response, ie. if there's any error or + * validation messages to handle. + * + * @param {Object|Error} error + */ + }, { + key: "processError", + value: function processError(error) { + if (this.options.error && typeof this.options.error === 'function') { + if (this.options.error(this.responseError, this) === false) { + return; + } + } + + // Allow plugins to cancel any further error handling + if (this.snowboard.globalEvent('ajaxError', this.responseError, this) === false) { + return; + } + + // Allow the element to cancel any further error handling + if (this.element) { + var event = new Event('ajaxFail', { + cancelable: true + }); + event.responseError = this.responseError; + event.request = this; + this.element.dispatchEvent(event); + if (event.defaultPrevented) { + return; + } + } + if (error instanceof Error) { + this.processErrorMessage(error.message); + } else { + var skipError = false; + + // Process validation errors + if (error.X_WINTER_ERROR_FIELDS) { + skipError = this.processValidationErrors(error.X_WINTER_ERROR_FIELDS); + } + if (error.X_WINTER_ERROR_MESSAGE && !skipError) { + this.processErrorMessage(error.X_WINTER_ERROR_MESSAGE); + } + } + this.complete(); + } + + /** + * Processes a redirect response. + * + * By default, this processor will simply redirect the user in their browser. + * + * Plugins can augment this functionality from the `ajaxRedirect` event. You may also override this functionality on + * a per-request basis through the `handleRedirectResponse` callback option. If a `false` is returned from either, the + * redirect will be cancelled. + * + * @param {string} url + * @returns {void} + */ + }, { + key: "processRedirect", + value: function processRedirect(url) { + var _this5 = this; + // Run a custom per-request redirect handler. If false is returned, don't run the redirect. + if (typeof this.options.handleRedirectResponse === 'function') { + if (this.options.handleRedirectResponse.apply(this, [url]) === false) { + return; + } + } + + // Allow plugins to cancel the redirect + if (this.snowboard.globalEvent('ajaxRedirect', url, this) === false) { + return; + } + + // Indicate that the AJAX request is finished if we're still on the current page + // so that the loading indicator for redirects that just change the hash value of + // the URL instead of leaving the page will properly stop. + // @see https://github.com/octobercms/october/issues/2780 + window.addEventListener('popstate', function () { + if (_this5.element) { + var event = document.createEvent('CustomEvent'); + event.eventName = 'ajaxRedirected'; + _this5.element.dispatchEvent(event); + } + }, { + once: true + }); + window.location.assign(url); + } + + /** + * Processes an error message. + * + * By default, this processor will simply alert the user through a simple `alert()` call. + * + * Plugins can augment this functionality from the `ajaxErrorMessage` event. You may also override this functionality + * on a per-request basis through the `handleErrorMessage` callback option. If a `false` is returned from either, the + * error message handling will be cancelled. + * + * @param {string} message + * @returns {void} + */ + }, { + key: "processErrorMessage", + value: function processErrorMessage(message) { + // Run a custom per-request handler for error messages. If false is returned, do not process the error messages + // any further. + if (typeof this.options.handleErrorMessage === 'function') { + if (this.options.handleErrorMessage.apply(this, [message]) === false) { + return; + } + } + + // Allow plugins to cancel the error message being shown + if (this.snowboard.globalEvent('ajaxErrorMessage', message, this) === false) { + return; + } + + // By default, show a browser error message + window.alert(message); + } + + /** + * Processes flash messages from the response. + * + * By default, no flash message handling will occur. + * + * Plugins can augment this functionality from the `ajaxFlashMessages` event. You may also override this functionality + * on a per-request basis through the `handleFlashMessages` callback option. If a `false` is returned from either, the + * flash message handling will be cancelled. + * + * @param {Object} messages + * @returns + */ + }, { + key: "processFlashMessages", + value: function processFlashMessages(messages) { + // Run a custom per-request flash handler. If false is returned, don't show the flash message + if (typeof this.options.handleFlashMessages === 'function') { + if (this.options.handleFlashMessages.apply(this, [messages]) === false) { + return; + } + } + this.snowboard.globalEvent('ajaxFlashMessages', messages, this); + } + + /** + * Processes validation errors for fields. + * + * By default, no validation error handling will occur. + * + * Plugins can augment this functionality from the `ajaxValidationErrors` event. You may also override this functionality + * on a per-request basis through the `handleValidationErrors` callback option. If a `false` is returned from either, the + * validation error handling will be cancelled. + * + * @param {Object} fields + * @returns + */ + }, { + key: "processValidationErrors", + value: function processValidationErrors(fields) { + if (typeof this.options.handleValidationErrors === 'function') { + if (this.options.handleValidationErrors.apply(this, [this.form, fields]) === false) { + return true; + } + } + + // Allow plugins to cancel the validation errors being handled + if (this.snowboard.globalEvent('ajaxValidationErrors', this.form, fields, this) === false) { + return true; + } + return false; + } + + /** + * Processes assets returned by an AJAX request. + * + * By default, no asset processing will occur and this will return a resolved Promise. + * + * Plugins can augment this functionality from the `ajaxLoadAssets` event. This event is considered blocking, and + * allows assets to be loaded or processed before continuing with any additional functionality. + * + * @param {Object} assets + * @returns {Promise} + */ + }, { + key: "processAssets", + value: function processAssets(assets) { + return this.snowboard.globalPromiseEvent('ajaxLoadAssets', assets); + } + + /** + * Confirms the request with the user before proceeding. + * + * This is an asynchronous method. By default, it will use the browser's `confirm()` method to query the user to + * confirm the action. This method will return a Promise with a boolean value depending on whether the user confirmed + * or not. + * + * Plugins can augment this functionality from the `ajaxConfirmMessage` event. You may also override this functionality + * on a per-request basis through the `handleConfirmMessage` callback option. If a `false` is returned from either, + * the confirmation is assumed to have been denied. + * + * @returns {Promise} + */ + }, { + key: "doConfirm", + value: (function () { + var _doConfirm = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var promises, fulfilled; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof this.options.handleConfirmMessage === 'function')) { + _context2.next = 4; + break; + } + if (!(this.options.handleConfirmMessage.apply(this, [this.confirm]) === false)) { + _context2.next = 3; + break; + } + return _context2.abrupt("return", false); + case 3: + return _context2.abrupt("return", true); + case 4: + if (!(this.snowboard.listensToEvent('ajaxConfirmMessage').length === 0)) { + _context2.next = 6; + break; + } + return _context2.abrupt("return", window.confirm(this.confirm)); + case 6: + // Run custom plugin confirmations + promises = this.snowboard.globalPromiseEvent('ajaxConfirmMessage', this.confirm, this); + _context2.prev = 7; + _context2.next = 10; + return promises; + case 10: + fulfilled = _context2.sent; + if (!fulfilled) { + _context2.next = 13; + break; + } + return _context2.abrupt("return", true); + case 13: + _context2.next = 18; + break; + case 15: + _context2.prev = 15; + _context2.t0 = _context2["catch"](7); + return _context2.abrupt("return", false); + case 18: + return _context2.abrupt("return", false); + case 19: + case "end": + return _context2.stop(); + } + }, _callee2, this, [[7, 15]]); + })); + function doConfirm() { + return _doConfirm.apply(this, arguments); + } + return doConfirm; + }() + /** + * Fires off completion events for the Request. + */ + ) + }, { + key: "complete", + value: function complete() { + if (this.options.complete && typeof this.options.complete === 'function') { + this.options.complete(this.responseData, this); + } + this.snowboard.globalEvent('ajaxDone', this.responseData, this); + if (this.element) { + var event = new Event('ajaxAlways'); + event.request = this; + event.responseData = this.responseData; + event.responseError = this.responseError; + this.element.dispatchEvent(event); + } + + // Fire off the destructor + this.destruct(); + } + }, { + key: "form", + get: function get() { + if (this.options.form) { + if (typeof this.options.form === 'string') { + return document.querySelector(this.options.form); + } + return this.options.form; + } + if (!this.element) { + return null; + } + if (this.element.tagName === 'FORM') { + return this.element; + } + return this.element.closest('form'); + } + }, { + key: "context", + get: function get() { + return { + handler: this.handler, + options: this.options + }; + } + }, { + key: "headers", + get: function get() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + // Keeps compatibility with jQuery AJAX + 'X-WINTER-REQUEST-HANDLER': this.handler, + 'X-WINTER-REQUEST-PARTIALS': this.extractPartials(this.options.update || []) + }; + if (this.flash) { + headers['X-WINTER-REQUEST-FLASH'] = 1; + } + if (this.xsrfToken) { + headers['X-XSRF-TOKEN'] = this.xsrfToken; + } + return headers; + } + }, { + key: "loading", + get: function get() { + return this.options.loading || false; + } + }, { + key: "url", + get: function get() { + return this.options.url || window.location.href; + } + }, { + key: "redirect", + get: function get() { + return this.options.redirect && this.options.redirect.length ? this.options.redirect : null; + } + }, { + key: "flash", + get: function get() { + return this.options.flash || false; + } + }, { + key: "files", + get: function get() { + if (this.options.files === true) { + if (FormData === undefined) { + this.snowboard.debug('This browser does not support file uploads'); + return false; + } + return true; + } + return false; + } + }, { + key: "xsrfToken", + get: function get() { + return this.snowboard.cookie().get('XSRF-TOKEN'); + } + }, { + key: "data", + get: function get() { + var data = _typeof(this.options.data) === 'object' ? this.options.data : {}; + var formData = new FormData(this.form || undefined); + if (Object.keys(data).length > 0) { + Object.entries(data).forEach(function (entry) { + var _entry3 = _slicedToArray(entry, 2), + key = _entry3[0], + value = _entry3[1]; + formData.append(key, value); + }); + } + return formData; + } + }, { + key: "confirm", + get: function get() { + return this.options.confirm || false; + } + + /** + * Extracts partials. + * + * @param {Object} update + * @returns {string} + */ + }, { + key: "extractPartials", + value: function extractPartials(update) { + return Object.keys(update).join('&'); + } + + /** + * Renders an error with useful debug information. + * + * This method is used internally when the AJAX request could not be completed or processed correctly due to an error. + * + * @param {string} message + * @param {string} exception + * @param {string} file + * @param {Number} line + * @param {string[]} trace + * @returns {Error} + */ + }, { + key: "renderError", + value: function renderError(message, exception, file, line, trace) { + var error = new Error(message); + error.exception = exception || null; + error.file = file || null; + error.line = line || null; + error.trace = trace || []; + return error; + } + + /** + * Checks a given string to see if it is a valid AJAX handler name. + * + * @param {String} name + * @returns {Boolean} + */ + }, { + key: "isHandlerName", + value: function isHandlerName(name) { + return /^(?:\w+:{2})?on[A-Z0-9]/.test(name); + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js": +/*!**********************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AttributeRequest) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } +function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Enable Data Attributes API for AJAX requests. + * + * This is an extension of the base AJAX functionality that includes handling of HTML data attributes for processing + * AJAX requests. It is separated from the base AJAX functionality to allow developers to opt-out of data attribute + * requests if they do not intend to use them. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var AttributeRequest = /*#__PURE__*/function (_Singleton) { + function AttributeRequest() { + _classCallCheck(this, AttributeRequest); + return _callSuper(this, AttributeRequest, arguments); + } + _inherits(AttributeRequest, _Singleton); + return _createClass(AttributeRequest, [{ + key: "listens", + value: + /** + * Listeners. + * + * @returns {Object} + */ + function listens() { + return { + ready: 'ready', + ajaxSetup: 'onAjaxSetup' + }; + } + + /** + * Ready event callback. + * + * Attaches handlers to the window to listen for all request interactions. + */ + }, { + key: "ready", + value: function ready() { + this.attachHandlers(); + this.disableDefaultFormValidation(); + } + + /** + * Dependencies. + * + * @returns {string[]} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['request', 'jsonParser']; + } + + /** + * Destructor. + * + * Detaches all handlers. + */ + }, { + key: "destruct", + value: function destruct() { + this.detachHandlers(); + _get(_getPrototypeOf(AttributeRequest.prototype), "destruct", this).call(this); + } + + /** + * Attaches the necessary handlers for all request interactions. + */ + }, { + key: "attachHandlers", + value: function attachHandlers() { + var _this = this; + window.addEventListener('change', function (event) { + return _this.changeHandler(event); + }); + window.addEventListener('click', function (event) { + return _this.clickHandler(event); + }); + window.addEventListener('keydown', function (event) { + return _this.keyDownHandler(event); + }); + window.addEventListener('submit', function (event) { + return _this.submitHandler(event); + }); + } + + /** + * Disables default form validation for AJAX forms. + * + * A form that contains a `data-request` attribute to specify an AJAX call without including a `data-browser-validate` + * attribute means that the AJAX callback function will likely be handling the validation instead. + */ + }, { + key: "disableDefaultFormValidation", + value: function disableDefaultFormValidation() { + document.querySelectorAll('form[data-request]:not([data-browser-validate])').forEach(function (form) { + form.setAttribute('novalidate', true); + }); + } + + /** + * Detaches the necessary handlers for all request interactions. + */ + }, { + key: "detachHandlers", + value: function detachHandlers() { + var _this2 = this; + window.removeEventListener('change', function (event) { + return _this2.changeHandler(event); + }); + window.removeEventListener('click', function (event) { + return _this2.clickHandler(event); + }); + window.removeEventListener('keydown', function (event) { + return _this2.keyDownHandler(event); + }); + window.removeEventListener('submit', function (event) { + return _this2.submitHandler(event); + }); + } + + /** + * Handles changes to select, radio, checkbox and file inputs. + * + * @param {Event} event + */ + }, { + key: "changeHandler", + value: function changeHandler(event) { + // Check that we are changing a valid element + if (!event.target.matches('select[data-request], input[type=radio][data-request], input[type=checkbox][data-request], input[type=file][data-request]')) { + return; + } + this.processRequestOnElement(event.target); + } + + /** + * Handles clicks on hyperlinks and buttons. + * + * This event can bubble up the hierarchy to find a suitable request element. + * + * @param {Event} event + */ + }, { + key: "clickHandler", + value: function clickHandler(event) { + var currentElement = event.target; + while (currentElement && currentElement.tagName !== 'HTML') { + if (!currentElement.matches('a[data-request], button[data-request], input[type=button][data-request], input[type=submit][data-request]')) { + currentElement = currentElement.parentElement; + } else { + event.preventDefault(); + this.processRequestOnElement(currentElement); + break; + } + } + } + + /** + * Handles key presses on inputs + * + * @param {Event} event + */ + }, { + key: "keyDownHandler", + value: function keyDownHandler(event) { + // Check that we are inputting into a valid element + if (!event.target.matches('input')) { + return; + } + + // Check that the input type is valid + var validTypes = ['checkbox', 'color', 'date', 'datetime', 'datetime-local', 'email', 'image', 'month', 'number', 'password', 'radio', 'range', 'search', 'tel', 'text', 'time', 'url', 'week']; + if (validTypes.indexOf(event.target.getAttribute('type')) === -1) { + return; + } + if (event.key === 'Enter' && event.target.matches('*[data-request]')) { + this.processRequestOnElement(event.target); + event.preventDefault(); + event.stopImmediatePropagation(); + } else if (event.target.matches('*[data-track-input]')) { + this.trackInput(event.target); + } + } + + /** + * Handles form submissions. + * + * @param {Event} event + */ + }, { + key: "submitHandler", + value: function submitHandler(event) { + // Check that we are submitting a valid form + if (!event.target.matches('form[data-request]')) { + return; + } + event.preventDefault(); + this.processRequestOnElement(event.target); + } + + /** + * Processes a request on a given element, using its data attributes. + * + * @param {HTMLElement} element + */ + }, { + key: "processRequestOnElement", + value: function processRequestOnElement(element) { + var data = element.dataset; + var handler = String(data.request); + var options = { + confirm: 'requestConfirm' in data ? String(data.requestConfirm) : null, + redirect: 'requestRedirect' in data ? String(data.requestRedirect) : null, + loading: 'requestLoading' in data ? String(data.requestLoading) : null, + flash: 'requestFlash' in data, + files: 'requestFiles' in data, + browserValidate: 'requestBrowserValidate' in data, + form: 'requestForm' in data ? String(data.requestForm) : null, + url: 'requestUrl' in data ? String(data.requestUrl) : null, + update: 'requestUpdate' in data ? this.parseData(String(data.requestUpdate)) : [], + data: 'requestData' in data ? this.parseData(String(data.requestData)) : [] + }; + this.snowboard.request(element, handler, options); + } + + /** + * Sets up an AJAX request via HTML attributes. + * + * @param {Request} request + */ + }, { + key: "onAjaxSetup", + value: function onAjaxSetup(request) { + if (!request.element) { + return; + } + var fieldName = request.element.getAttribute('name'); + var data = _objectSpread(_objectSpread({}, this.getParentRequestData(request.element)), request.options.data); + if (request.element && request.element.matches('input, textarea, select, button') && !request.form && fieldName && !request.options.data[fieldName]) { + data[fieldName] = request.element.value; + } + request.options.data = data; + } + + /** + * Parses and collates all data from elements up the DOM hierarchy. + * + * @param {Element} target + * @returns {Object} + */ + }, { + key: "getParentRequestData", + value: function getParentRequestData(target) { + var _this3 = this; + var elements = []; + var data = {}; + var currentElement = target; + while (currentElement.parentElement && currentElement.parentElement.tagName !== 'HTML') { + elements.push(currentElement.parentElement); + currentElement = currentElement.parentElement; + } + elements.reverse(); + elements.forEach(function (element) { + var elementData = element.dataset; + if ('requestData' in elementData) { + data = _objectSpread(_objectSpread({}, data), _this3.parseData(elementData.requestData)); + } + }); + return data; + } + + /** + * Parses data in the Winter/October JSON format. + * + * @param {String} data + * @returns {Object} + */ + }, { + key: "parseData", + value: function parseData(data) { + var value; + if (data === undefined) { + value = ''; + } + if (_typeof(value) === 'object') { + return value; + } + try { + return this.snowboard.jsonparser().parse("{".concat(data, "}")); + } catch (e) { + throw new Error("Error parsing the data attribute on element: ".concat(e.message)); + } + } + }, { + key: "trackInput", + value: function trackInput(element) { + var _this4 = this; + var lastValue = element.dataset.lastValue; + var interval = element.dataset.trackInput || 300; + if (lastValue !== undefined && lastValue === element.value) { + return; + } + this.resetTrackInputTimer(element); + element.dataset.inputTimer = window.setTimeout(function () { + if (element.dataset.request) { + _this4.processRequestOnElement(element); + return; + } + + // Traverse up the hierarchy and find a form that sends an AJAX query + var currentElement = element; + while (currentElement.parentElement && currentElement.parentElement.tagName !== 'HTML') { + currentElement = currentElement.parentElement; + if (currentElement.tagName === 'FORM' && currentElement.dataset.request) { + _this4.processRequestOnElement(currentElement); + break; + } + } + }, interval); + } + }, { + key: "resetTrackInputTimer", + value: function resetTrackInputTimer(element) { + if (element.dataset.inputTimer) { + window.clearTimeout(element.dataset.inputTimer); + element.dataset.inputTimer = null; + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/AssetLoader.js": +/*!**********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/AssetLoader.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AssetLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } +function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Asset Loader. + * + * Provides simple asset loading functionality for Snowboard, making it easy to pre-load images or + * include JavaScript or CSS assets on the fly. + * + * By default, this loader will listen to any assets that have been requested to load in an AJAX + * response, such as responses from a component. + * + * You can also load assets manually by calling the following: + * + * ```js + * Snowboard.addPlugin('assetLoader', AssetLoader); + * Snowboard.assetLoader().processAssets(assets); + * ``` + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var AssetLoader = /*#__PURE__*/function (_Singleton) { + function AssetLoader() { + _classCallCheck(this, AssetLoader); + return _callSuper(this, AssetLoader, arguments); + } + _inherits(AssetLoader, _Singleton); + return _createClass(AssetLoader, [{ + key: "listens", + value: + /** + * Event listeners. + * + * @returns {Object} + */ + function listens() { + return { + ajaxLoadAssets: 'load' + }; + } + + /** + * Dependencies. + * + * @returns {Array} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['url']; + } + + /** + * Process and load assets. + * + * The `assets` property of this method requires an object with any of the following keys and an + * array of paths: + * + * - `js`: An array of JavaScript URLs to load + * - `css`: An array of CSS stylesheet URLs to load + * - `img`: An array of image URLs to pre-load + * + * Both `js` and `css` files will be automatically injected, however `img` files will not. + * + * This method will return a Promise that resolves when all required assets are loaded. If an + * asset fails to load, this Promise will be rejected. + * + * ESLint *REALLY* doesn't like this code, but ignore it. It's the only way it works. + * + * @param {Object} assets + * @returns {Promise} + */ + }, { + key: "load", + value: (function () { + var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(assets) { + var _iterator, _step, script, _iterator2, _step2, style, _iterator3, _step3, image; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!(assets.js && assets.js.length > 0)) { + _context.next = 24; + break; + } + _iterator = _createForOfIteratorHelper(assets.js); + _context.prev = 2; + _iterator.s(); + case 4: + if ((_step = _iterator.n()).done) { + _context.next = 16; + break; + } + script = _step.value; + _context.prev = 6; + _context.next = 9; + return this.loadScript(script); + case 9: + _context.next = 14; + break; + case 11: + _context.prev = 11; + _context.t0 = _context["catch"](6); + return _context.abrupt("return", Promise.reject(_context.t0)); + case 14: + _context.next = 4; + break; + case 16: + _context.next = 21; + break; + case 18: + _context.prev = 18; + _context.t1 = _context["catch"](2); + _iterator.e(_context.t1); + case 21: + _context.prev = 21; + _iterator.f(); + return _context.finish(21); + case 24: + if (!(assets.css && assets.css.length > 0)) { + _context.next = 48; + break; + } + _iterator2 = _createForOfIteratorHelper(assets.css); + _context.prev = 26; + _iterator2.s(); + case 28: + if ((_step2 = _iterator2.n()).done) { + _context.next = 40; + break; + } + style = _step2.value; + _context.prev = 30; + _context.next = 33; + return this.loadStyle(style); + case 33: + _context.next = 38; + break; + case 35: + _context.prev = 35; + _context.t2 = _context["catch"](30); + return _context.abrupt("return", Promise.reject(_context.t2)); + case 38: + _context.next = 28; + break; + case 40: + _context.next = 45; + break; + case 42: + _context.prev = 42; + _context.t3 = _context["catch"](26); + _iterator2.e(_context.t3); + case 45: + _context.prev = 45; + _iterator2.f(); + return _context.finish(45); + case 48: + if (!(assets.img && assets.img.length > 0)) { + _context.next = 72; + break; + } + _iterator3 = _createForOfIteratorHelper(assets.img); + _context.prev = 50; + _iterator3.s(); + case 52: + if ((_step3 = _iterator3.n()).done) { + _context.next = 64; + break; + } + image = _step3.value; + _context.prev = 54; + _context.next = 57; + return this.loadImage(image); + case 57: + _context.next = 62; + break; + case 59: + _context.prev = 59; + _context.t4 = _context["catch"](54); + return _context.abrupt("return", Promise.reject(_context.t4)); + case 62: + _context.next = 52; + break; + case 64: + _context.next = 69; + break; + case 66: + _context.prev = 66; + _context.t5 = _context["catch"](50); + _iterator3.e(_context.t5); + case 69: + _context.prev = 69; + _iterator3.f(); + return _context.finish(69); + case 72: + return _context.abrupt("return", Promise.resolve()); + case 73: + case "end": + return _context.stop(); + } + }, _callee, this, [[2, 18, 21, 24], [6, 11], [26, 42, 45, 48], [30, 35], [50, 66, 69, 72], [54, 59]]); + })); + function load(_x) { + return _load.apply(this, arguments); + } + return load; + }() + /** + * Injects and loads a JavaScript URL into the DOM. + * + * The script will be appended before the closing `` tag. + * + * @param {String} script + * @returns {Promise} + */ + ) + }, { + key: "loadScript", + value: function loadScript(script) { + var _this = this; + return new Promise(function (resolve, reject) { + // Resolve script URL + script = _this.snowboard.url().asset(script); + + // Check that script is not already loaded + var loaded = document.querySelector("script[src=\"".concat(script, "\"]")); + if (loaded) { + resolve(); + return; + } + + // Create script + var domScript = document.createElement('script'); + domScript.setAttribute('type', 'text/javascript'); + domScript.setAttribute('src', script); + domScript.addEventListener('load', function () { + _this.snowboard.globalEvent('assetLoader.loaded', 'script', script, domScript); + resolve(); + }); + domScript.addEventListener('error', function () { + _this.snowboard.globalEvent('assetLoader.error', 'script', script, domScript); + reject(new Error("Unable to load script file: \"".concat(script, "\""))); + }); + document.body.append(domScript); + }); + } + + /** + * Injects and loads a CSS stylesheet into the DOM. + * + * The stylesheet will be appended before the closing `` tag. + * + * @param {String} style + * @returns {Promise} + */ + }, { + key: "loadStyle", + value: function loadStyle(style) { + var _this2 = this; + return new Promise(function (resolve, reject) { + // Resolve style URL + style = _this2.snowboard.url().asset(style); + + // Check that stylesheet is not already loaded + var loaded = document.querySelector("link[rel=\"stylesheet\"][href=\"".concat(style, "\"]")); + if (loaded) { + resolve(); + return; + } + + // Create stylesheet + var domCss = document.createElement('link'); + domCss.setAttribute('rel', 'stylesheet'); + domCss.setAttribute('href', style); + domCss.addEventListener('load', function () { + _this2.snowboard.globalEvent('assetLoader.loaded', 'style', style, domCss); + resolve(); + }); + domCss.addEventListener('error', function () { + _this2.snowboard.globalEvent('assetLoader.error', 'style', style, domCss); + reject(new Error("Unable to load stylesheet file: \"".concat(style, "\""))); + }); + document.head.append(domCss); + }); + } + + /** + * Pre-loads an image. + * + * The image will not be injected into the DOM. + * + * @param {String} image + * @returns {Promise} + */ + }, { + key: "loadImage", + value: function loadImage(image) { + var _this3 = this; + return new Promise(function (resolve, reject) { + // Resolve script URL + image = _this3.snowboard.url().asset(image); + var img = new Image(); + img.addEventListener('load', function () { + _this3.snowboard.globalEvent('assetLoader.loaded', 'image', image, img); + resolve(); + }); + img.addEventListener('error', function () { + _this3.snowboard.globalEvent('assetLoader.error', 'image', image, img); + reject(new Error("Unable to load image file: \"".concat(image, "\""))); + }); + img.src = image; + }); + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/AttachLoading.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/AttachLoading.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AttachLoading) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Allows attaching a loading class on elements that an AJAX request is targeting. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var AttachLoading = /*#__PURE__*/function (_Singleton) { + function AttachLoading() { + _classCallCheck(this, AttachLoading); + return _callSuper(this, AttachLoading, arguments); + } + _inherits(AttachLoading, _Singleton); + return _createClass(AttachLoading, [{ + key: "dependencies", + value: + /** + * Defines dependenices. + * + * @returns {string[]} + */ + function dependencies() { + return ['request']; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ajaxStart: 'ajaxStart', + ajaxDone: 'ajaxDone' + }; + } + }, { + key: "ajaxStart", + value: function ajaxStart(promise, request) { + var _this = this; + if (!request.element) { + return; + } + if (request.element.tagName === 'FORM') { + var loadElements = request.element.querySelectorAll('[data-attach-loading]'); + if (loadElements.length > 0) { + loadElements.forEach(function (element) { + element.classList.add(_this.getLoadingClass(element)); + }); + } + } else if (request.element.dataset.attachLoading !== undefined) { + request.element.classList.add(this.getLoadingClass(request.element)); + } + } + }, { + key: "ajaxDone", + value: function ajaxDone(data, request) { + var _this2 = this; + if (!request.element) { + return; + } + if (request.element.tagName === 'FORM') { + var loadElements = request.element.querySelectorAll('[data-attach-loading]'); + if (loadElements.length > 0) { + loadElements.forEach(function (element) { + element.classList.remove(_this2.getLoadingClass(element)); + }); + } + } else if (request.element.dataset.attachLoading !== undefined) { + request.element.classList.remove(this.getLoadingClass(request.element)); + } + } + }, { + key: "getLoadingClass", + value: function getLoadingClass(element) { + return element.dataset.attachLoading !== undefined && element.dataset.attachLoading !== '' ? element.dataset.attachLoading : 'wn-loading'; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/DataConfig.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/DataConfig.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ DataConfig) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Data configuration provider. + * + * Provides a mechanism for passing configuration data through an element's data attributes. This + * is generally used for widgets or UI interactions to configure them. + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +var DataConfig = /*#__PURE__*/function (_PluginBase) { + function DataConfig() { + _classCallCheck(this, DataConfig); + return _callSuper(this, DataConfig, arguments); + } + _inherits(DataConfig, _PluginBase); + return _createClass(DataConfig, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {PluginBase} instance + * @param {HTMLElement} element + * @param {Object} localConfig + */ + function construct(instance, element, localConfig) { + if (instance instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false) { + throw new Error('You must provide a Snowboard plugin to enable data configuration'); + } + if (element instanceof HTMLElement === false) { + throw new Error('Data configuration can only be extracted from HTML elements'); + } + this.instance = instance; + this.element = element; + this.localConfig = localConfig || {}; + this.instanceConfig = {}; + this.acceptedConfigs = {}; + this.refresh(); + } + + /** + * Gets the config for this instance. + * + * If the `config` parameter is unspecified, returns the entire configuration. + * + * @param {string} config + */ + }, { + key: "get", + value: function get(config) { + if (config === undefined) { + return this.instanceConfig; + } + if (this.instanceConfig[config] !== undefined) { + return this.instanceConfig[config]; + } + return undefined; + } + + /** + * Sets the config for this instance. + * + * This allows you to override, at runtime, any configuration value as necessary. + * + * @param {string} config + * @param {any} value + * @param {boolean} persist + */ + }, { + key: "set", + value: function set(config, value, persist) { + if (config === undefined) { + throw new Error('You must provide a configuration key to set'); + } + this.instanceConfig[config] = value; + if (persist === true) { + this.element.dataset[config] = value; + this.localConfig[config] = value; + } + } + + /** + * Refreshes the configuration from the element. + * + * This will allow you to make changes to the data config on a DOM level and re-apply them + * to the config on the JavaScript side. + */ + }, { + key: "refresh", + value: function refresh() { + this.acceptedConfigs = this.getAcceptedConfigs(); + this.instanceConfig = this.processConfig(); + } + + /** + * Determines the available configurations that can be set through the data config. + * + * If an instance has an `acceptAllDataConfigs` property, set to `true`, then all data + * attributes will be available as configuration values. This can be a security concern, so + * tread carefully. + * + * Otherwise, available configurations will be determined by the keys available in an object + * returned by a `defaults()` method in the instance. + * + * @returns {string[]|boolean} + */ + }, { + key: "getAcceptedConfigs", + value: function getAcceptedConfigs() { + if (this.instance.acceptAllDataConfigs !== undefined && this.instance.acceptAllDataConfigs === true) { + return true; + } + if (this.instance.defaults !== undefined && typeof this.instance.defaults === 'function' && _typeof(this.instance.defaults()) === 'object') { + return Object.keys(this.instance.defaults()); + } + return false; + } + + /** + * Returns the default values for the instance. + * + * This will be an empty object if the instance either does not have a `defaults()` method, or + * the method itself does not return an object. + * + * @returns {object} + */ + }, { + key: "getDefaults", + value: function getDefaults() { + if (this.instance.defaults !== undefined && typeof this.instance.defaults === 'function' && _typeof(this.instance.defaults()) === 'object') { + return this.instance.defaults(); + } + return {}; + } + + /** + * Processes the configuration. + * + * Loads up the defaults, then populates it with any configuration values provided by the data + * attributes, based on the rules of the accepted configurations. + * + * This configuration object is then cached and available through `config.get()` calls. + * + * @returns {object} + */ + }, { + key: "processConfig", + value: function processConfig() { + var config = this.getDefaults(); + if (this.acceptedConfigs === false) { + return config; + } + + /* eslint-disable */ + for (var key in this.element.dataset) { + if (this.acceptedConfigs === true || this.acceptedConfigs.includes(key)) { + config[key] = this.coerceValue(this.element.dataset[key]); + } + } + for (var _key in this.localConfig) { + if (this.acceptedConfigs === true || this.acceptedConfigs.includes(_key)) { + config[_key] = this.localConfig[_key]; + } + } + /* eslint-enable */ + + return config; + } + + /** + * Coerces configuration values for JavaScript. + * + * Takes the string value returned from the data attribute and coerces it into a more suitable + * type for JavaScript processing. + * + * @param {*} value + * @returns {*} + */ + }, { + key: "coerceValue", + value: function coerceValue(value) { + var stringValue = String(value); + + // Null value + if (stringValue === 'null') { + return null; + } + + // Undefined value + if (stringValue === 'undefined') { + return undefined; + } + + // Base64 value + if (stringValue.startsWith('base64:')) { + var base64str = stringValue.replace(/^base64:/, ''); + var decoded = atob(base64str); + return this.coerceValue(decoded); + } + + // Boolean value + if (['true', 'yes'].includes(stringValue.toLowerCase())) { + return true; + } + if (['false', 'no'].includes(stringValue.toLowerCase())) { + return false; + } + + // Numeric value + if (/^[-+]?[0-9]+(\.[0-9]+)?$/.test(stringValue)) { + return Number(stringValue); + } + + // JSON value + try { + return this.snowboard.jsonParser().parse(stringValue); + } catch (e) { + return stringValue === '' ? true : stringValue; + } + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/Flash.js": +/*!****************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/Flash.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Flash) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } +function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Provides flash messages for the CMS. + * + * Flash messages will pop up at the top center of the page and will remain for 7 seconds by default. Hovering over + * the message will reset and pause the timer. Clicking on the flash message will dismiss it. + * + * Arguments: + * - "message": The content of the flash message. HTML is accepted. + * - "type": The type of flash message. This is appended as a class to the flash message itself. + * - "duration": How long the flash message will stay visible for, in seconds. Default: 7 seconds. + * + * Usage: + * Snowboard.flash('This is a flash message', 'info', 8); + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Flash = /*#__PURE__*/function (_PluginBase) { + function Flash() { + _classCallCheck(this, Flash); + return _callSuper(this, Flash, arguments); + } + _inherits(Flash, _PluginBase); + return _createClass(Flash, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {string} message + * @param {string} type + * @param {Number} duration + */ + function construct(message, type, duration) { + this.message = message; + this.type = type || 'default'; + this.duration = Number(duration || 7); + if (this.duration < 0) { + throw new Error('Flash duration must be a positive number, or zero'); + } + this.clear(); + this.timer = null; + this.flashTimer = null; + this.create(); + } + + /** + * Defines dependencies. + * + * @returns {string[]} + */ + }, { + key: "dependencies", + value: function dependencies() { + return ['transition']; + } + + /** + * Destructor. + * + * This will ensure the flash message is removed and timeout is cleared if the module is removed. + */ + }, { + key: "destruct", + value: function destruct() { + if (this.timer !== null) { + window.clearTimeout(this.timer); + } + if (this.flashTimer) { + this.flashTimer.remove(); + } + if (this.flash) { + this.flash.remove(); + this.flash = null; + this.flashTimer = null; + } + _get(_getPrototypeOf(Flash.prototype), "destruct", this).call(this); + } + + /** + * Creates the flash message. + */ + }, { + key: "create", + value: function create() { + var _this = this; + this.snowboard.globalEvent('flash.create', this); + this.flash = document.createElement('DIV'); + this.flash.innerHTML = this.message; + this.flash.classList.add('flash-message', this.type); + this.flash.removeAttribute('data-control'); + this.flash.addEventListener('click', function () { + return _this.remove(); + }); + this.flash.addEventListener('mouseover', function () { + return _this.stopTimer(); + }); + this.flash.addEventListener('mouseout', function () { + return _this.startTimer(); + }); + if (this.duration > 0) { + this.flashTimer = document.createElement('DIV'); + this.flashTimer.classList.add('flash-timer'); + this.flash.appendChild(this.flashTimer); + } else { + this.flash.classList.add('no-timer'); + } + + // Add to body + document.body.appendChild(this.flash); + this.snowboard.transition(this.flash, 'show', function () { + _this.startTimer(); + }); + } + + /** + * Removes the flash message. + */ + }, { + key: "remove", + value: function remove() { + var _this2 = this; + this.snowboard.globalEvent('flash.remove', this); + this.stopTimer(); + this.snowboard.transition(this.flash, 'hide', function () { + _this2.flash.remove(); + _this2.flash = null; + _this2.destruct(); + }); + } + + /** + * Clears all flash messages available on the page. + */ + }, { + key: "clear", + value: function clear() { + document.querySelectorAll('body > div.flash-message').forEach(function (element) { + return element.remove(); + }); + } + + /** + * Starts the timer for this flash message. + */ + }, { + key: "startTimer", + value: function startTimer() { + var _this3 = this; + if (this.duration === 0) { + return; + } + this.timerTrans = this.snowboard.transition(this.flashTimer, 'timeout', null, "".concat(this.duration, ".0s"), true); + this.timer = window.setTimeout(function () { + return _this3.remove(); + }, this.duration * 1000); + } + + /** + * Resets the timer for this flash message. + */ + }, { + key: "stopTimer", + value: function stopTimer() { + if (this.timerTrans) { + this.timerTrans.cancel(); + } + if (this.timer) { + window.clearTimeout(this.timer); + } + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/FlashListener.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/FlashListener.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ FlashListener) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Defines a default listener for flash events. + * + * Connects the Flash plugin to various events that use flash messages. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var FlashListener = /*#__PURE__*/function (_Singleton) { + function FlashListener() { + _classCallCheck(this, FlashListener); + return _callSuper(this, FlashListener, arguments); + } + _inherits(FlashListener, _Singleton); + return _createClass(FlashListener, [{ + key: "dependencies", + value: + /** + * Defines dependenices. + * + * @returns {string[]} + */ + function dependencies() { + return ['flash']; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ready: 'ready', + ajaxErrorMessage: 'ajaxErrorMessage', + ajaxFlashMessages: 'ajaxFlashMessages' + }; + } + + /** + * Do flash messages for PHP flash responses. + */ + }, { + key: "ready", + value: function ready() { + var _this = this; + document.querySelectorAll('[data-control="flash-message"]').forEach(function (element) { + _this.snowboard.flash(element.innerHTML, element.dataset.flashType, element.dataset.flashDuration); + element.remove(); + }); + } + + /** + * Shows a flash message for AJAX errors. + * + * @param {string} message + * @returns {Boolean} + */ + }, { + key: "ajaxErrorMessage", + value: function ajaxErrorMessage(message) { + this.snowboard.flash(message, 'error'); + return false; + } + + /** + * Shows flash messages returned directly from AJAX functionality. + * + * @param {Object} messages + */ + }, { + key: "ajaxFlashMessages", + value: function ajaxFlashMessages(messages) { + var _this2 = this; + Object.entries(messages).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + cssClass = _entry[0], + message = _entry[1]; + _this2.snowboard.flash(message, cssClass); + }); + return false; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/FormValidation.js": +/*!*************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/FormValidation.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ FormValidation) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Adds AJAX-driven form validation to Snowboard requests. + * + * Documentation for this feature can be found here: + * https://wintercms.com/docs/snowboard/extras#ajax-validation + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +var FormValidation = /*#__PURE__*/function (_Singleton) { + function FormValidation() { + _classCallCheck(this, FormValidation); + return _callSuper(this, FormValidation, arguments); + } + _inherits(FormValidation, _Singleton); + return _createClass(FormValidation, [{ + key: "construct", + value: + /** + * Constructor. + */ + function construct() { + this.errorBags = []; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ready: 'ready', + ajaxStart: 'clearValidation', + ajaxValidationErrors: 'doValidation' + }; + } + + /** + * Ready event handler. + */ + }, { + key: "ready", + value: function ready() { + this.collectErrorBags(document); + } + + /** + * Retrieves validation errors from an AJAX response and passes them through to the error bags. + * + * This handler returns false to cancel any further validation handling, and prevents the flash + * message that is displayed by default for field errors in AJAX requests from showing. + * + * @param {HTMLFormElement} form + * @param {Object} invalidFields + * @param {Request} request + * @returns {Boolean} + */ + }, { + key: "doValidation", + value: function doValidation(form, invalidFields, request) { + var _this = this; + if (request.element && request.element.dataset.requestValidate === undefined) { + return null; + } + if (!form) { + return null; + } + var errorBags = this.errorBags.filter(function (errorBag) { + return errorBag.form === form; + }); + errorBags.forEach(function (errorBag) { + _this.showErrorBag(errorBag, invalidFields); + }); + return false; + } + + /** + * Clears any validation errors in the given form. + * + * @param {Promise} promise + * @param {Request} request + * @returns {void} + */ + }, { + key: "clearValidation", + value: function clearValidation(promise, request) { + var _this2 = this; + if (request.element && request.element.dataset.requestValidate === undefined) { + return; + } + if (!request.form) { + return; + } + var errorBags = this.errorBags.filter(function (errorBag) { + return errorBag.form === request.form; + }); + errorBags.forEach(function (errorBag) { + _this2.hideErrorBag(errorBag); + }); + } + + /** + * Collects error bags (elements with "data-validate-error" attribute) and links them to a + * placeholder and form. + * + * The error bags will be initially hidden, and will only show when validation errors occur. + * + * @param {HTMLElement} rootNode + */ + }, { + key: "collectErrorBags", + value: function collectErrorBags(rootNode) { + var _this3 = this; + rootNode.querySelectorAll('[data-validate-error], [data-validate-for]').forEach(function (errorBag) { + var form = errorBag.closest('form[data-request-validate]'); + + // If this error bag does not reside within a validating form, remove it + if (!form) { + errorBag.parentNode.removeChild(errorBag); + return; + } + + // Find message list node, if available + var messageListElement = null; + if (errorBag.matches('[data-validate-error]')) { + messageListElement = errorBag.querySelector('[data-message]'); + } + + // Create a placeholder node + var placeholder = document.createComment(''); + + // Register error bag and replace with placeholder + var errorBagData = { + element: errorBag, + form: form, + validateFor: errorBag.dataset.validateFor ? errorBag.dataset.validateFor.split(/\s*,\s*/) : '*', + placeholder: placeholder, + messageListElement: messageListElement ? messageListElement.cloneNode(true) : null, + messageListAnchor: null, + customMessage: errorBag.dataset.validateFor ? errorBag.textContent !== '' || errorBag.childNodes.length > 0 : false + }; + + // If an message list element exists, create another placeholder to act as an anchor point + if (messageListElement) { + var messageListAnchor = document.createComment(''); + messageListElement.parentNode.replaceChild(messageListAnchor, messageListElement); + errorBagData.messageListAnchor = messageListAnchor; + } + errorBag.parentNode.replaceChild(placeholder, errorBag); + _this3.errorBags.push(errorBagData); + }); + } + + /** + * Hides an error bag, replacing the error messages with a placeholder node. + * + * @param {Object} errorBag + */ + }, { + key: "hideErrorBag", + value: function hideErrorBag(errorBag) { + if (errorBag.element.isConnected) { + errorBag.element.parentNode.replaceChild(errorBag.placeholder, errorBag.element); + } + } + + /** + * Shows an error bag with the given invalid fields. + * + * @param {Object} errorBag + * @param {Object} invalidFields + */ + }, { + key: "showErrorBag", + value: function showErrorBag(errorBag, invalidFields) { + if (!this.errorBagValidatesField(errorBag, invalidFields)) { + return; + } + if (!errorBag.element.isConnected) { + errorBag.placeholder.parentNode.replaceChild(errorBag.element, errorBag.placeholder); + } + if (errorBag.validateFor !== '*') { + if (!errorBag.customMessage) { + var firstField = Object.keys(invalidFields).filter(function (field) { + return errorBag.validateFor.includes(field); + }).shift(); + var _invalidFields$firstF = _slicedToArray(invalidFields[firstField], 1); + errorBag.element.innerHTML = _invalidFields$firstF[0]; + } + } else if (errorBag.messageListElement) { + // Remove previous error messages + errorBag.element.querySelectorAll('[data-validation-message]').forEach(function (message) { + message.parentNode.removeChild(message); + }); + Object.entries(invalidFields).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + errors = _entry[1]; + errors.forEach(function (error) { + var messageElement = errorBag.messageListElement.cloneNode(true); + messageElement.dataset.validationMessage = ''; + messageElement.innerHTML = error; + errorBag.messageListAnchor.after(messageElement); + }); + }); + } else { + var _invalidFields$Object = _slicedToArray(invalidFields[Object.keys(invalidFields).shift()], 1); + errorBag.element.innerHTML = _invalidFields$Object[0]; + } + } + + /** + * Determines if a given error bag applies for the given invalid fields. + * + * @param {Object} errorBag + * @param {Object} invalidFields + * @returns {Boolean} + */ + }, { + key: "errorBagValidatesField", + value: function errorBagValidatesField(errorBag, invalidFields) { + if (errorBag.validateFor === '*') { + return true; + } + return Object.keys(invalidFields).filter(function (field) { + return errorBag.validateFor.includes(field); + }).length > 0; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/StripeLoader.js": +/*!***********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/StripeLoader.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ StripeLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Displays a stripe at the top of the page that indicates loading. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var StripeLoader = /*#__PURE__*/function (_Singleton) { + function StripeLoader() { + _classCallCheck(this, StripeLoader); + return _callSuper(this, StripeLoader, arguments); + } + _inherits(StripeLoader, _Singleton); + return _createClass(StripeLoader, [{ + key: "dependencies", + value: + /** + * Defines dependenices. + * + * @returns {string[]} + */ + function dependencies() { + return ['request']; + } + + /** + * Defines listeners. + * + * @returns {Object} + */ + }, { + key: "listens", + value: function listens() { + return { + ready: 'ready', + ajaxStart: 'ajaxStart' + }; + } + }, { + key: "ready", + value: function ready() { + this.counter = 0; + this.createStripe(); + } + }, { + key: "ajaxStart", + value: function ajaxStart(promise, request) { + var _this = this; + if (request.options.stripe === false) { + return; + } + this.show(); + promise.then(function () { + _this.hide(); + })["catch"](function () { + _this.hide(); + }); + } + }, { + key: "createStripe", + value: function createStripe() { + this.indicator = document.createElement('DIV'); + this.stripe = document.createElement('DIV'); + this.stripeLoaded = document.createElement('DIV'); + this.indicator.classList.add('stripe-loading-indicator', 'loaded'); + this.stripe.classList.add('stripe'); + this.stripeLoaded.classList.add('stripe-loaded'); + this.indicator.appendChild(this.stripe); + this.indicator.appendChild(this.stripeLoaded); + document.body.appendChild(this.indicator); + } + }, { + key: "show", + value: function show() { + this.counter += 1; + var newStripe = this.stripe.cloneNode(true); + this.indicator.appendChild(newStripe); + this.stripe.remove(); + this.stripe = newStripe; + if (this.counter > 1) { + return; + } + this.indicator.classList.remove('loaded'); + document.body.classList.add('wn-loading'); + } + }, { + key: "hide", + value: function hide(force) { + this.counter -= 1; + if (force === true) { + this.counter = 0; + } + if (this.counter <= 0) { + this.indicator.classList.add('loaded'); + document.body.classList.remove('wn-loading'); + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js": +/*!***************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ StylesheetLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Embeds the "extras" stylesheet into the page, if it is not loaded through the theme. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var StylesheetLoader = /*#__PURE__*/function (_Singleton) { + function StylesheetLoader() { + _classCallCheck(this, StylesheetLoader); + return _callSuper(this, StylesheetLoader, arguments); + } + _inherits(StylesheetLoader, _Singleton); + return _createClass(StylesheetLoader, [{ + key: "listens", + value: + /** + * Defines listeners. + * + * @returns {Object} + */ + function listens() { + return { + ready: 'ready' + }; + } + }, { + key: "ready", + value: function ready() { + var stylesLoaded = false; + + // Determine if stylesheet is already loaded + document.querySelectorAll('link[rel="stylesheet"]').forEach(function (css) { + if (css.href.endsWith('/modules/system/assets/css/snowboard.extras.css')) { + stylesLoaded = true; + } + }); + if (!stylesLoaded) { + var stylesheet = document.createElement('link'); + stylesheet.setAttribute('rel', 'stylesheet'); + stylesheet.setAttribute('href', this.snowboard.url().asset('/modules/system/assets/css/snowboard.extras.css')); + document.head.appendChild(stylesheet); + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/Transition.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/Transition.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Transition) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Provides transition support for elements. + * + * Transition allows CSS transitions to be controlled and callbacks to be run once completed. It works similar to Vue + * transitions with 3 stages of transition, and classes assigned to the element with the transition name suffixed with + * the stage of transition: + * + * - `in`: A class assigned to the element for the first frame of the transition, removed afterwards. This should be + * used to define the initial state of the transition. + * - `active`: A class assigned to the element for the duration of the transition. This should be used to define the + * transition itself. + * - `out`: A class assigned to the element after the first frame of the transition and kept to the end of the + * transition. This should define the end state of the transition. + * + * Usage: + * Snowboard.transition(document.element, 'transition', () => { + * console.log('Remove element after 7 seconds'); + * this.remove(); + * }, '7s'); + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Transition = /*#__PURE__*/function (_PluginBase) { + function Transition() { + _classCallCheck(this, Transition); + return _callSuper(this, Transition, arguments); + } + _inherits(Transition, _PluginBase); + return _createClass(Transition, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {HTMLElement} element The element to transition + * @param {string} transition The name of the transition, this prefixes the stages of transition. + * @param {Function} callback An optional callback to call when the transition ends. + * @param {Number} duration An optional override on the transition duration. Must be specified as 's' (secs) or 'ms' (msecs). + * @param {Boolean} trailTo If true, the "out" class will remain after the end of the transition. + */ + function construct(element, transition, callback, duration, trailTo) { + if (element instanceof HTMLElement === false) { + throw new Error('A HTMLElement must be provided for transitioning'); + } + this.element = element; + if (typeof transition !== 'string') { + throw new Error('Transition name must be specified as a string'); + } + this.transition = transition; + if (callback && typeof callback !== 'function') { + throw new Error('Callback must be a valid function'); + } + this.callback = callback; + if (duration) { + this.duration = this.parseDuration(duration); + } else { + this.duration = null; + } + this.trailTo = trailTo === true; + this.doTransition(); + } + + /** + * Maps event classes to the given transition state. + * + * @param {...any} args + * @returns {Array} + */ + }, { + key: "eventClasses", + value: function eventClasses() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + var eventClasses = { + "in": "".concat(this.transition, "-in"), + active: "".concat(this.transition, "-active"), + out: "".concat(this.transition, "-out") + }; + if (args.length === 0) { + return Object.values(eventClasses); + } + var returnClasses = []; + Object.entries(eventClasses).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + key = _entry[0], + value = _entry[1]; + if (args.indexOf(key) !== -1) { + returnClasses.push(value); + } + }); + return returnClasses; + } + + /** + * Executes the transition. + * + * @returns {void} + */ + }, { + key: "doTransition", + value: function doTransition() { + var _this = this; + // Add duration override + if (this.duration !== null) { + this.element.style.transitionDuration = this.duration; + } + this.resetClasses(); + + // Start transition - show "in" and "active" classes + this.eventClasses('in', 'active').forEach(function (eventClass) { + _this.element.classList.add(eventClass); + }); + window.requestAnimationFrame(function () { + // Ensure a transition exists + if (window.getComputedStyle(_this.element)['transition-duration'] !== '0s') { + // Listen for the transition to end + _this.element.addEventListener('transitionend', function () { + return _this.onTransitionEnd(); + }, { + once: true + }); + window.requestAnimationFrame(function () { + _this.element.classList.remove(_this.eventClasses('in')[0]); + _this.element.classList.add(_this.eventClasses('out')[0]); + }); + } else { + _this.resetClasses(); + if (_this.callback) { + _this.callback.apply(_this.element); + } + _this.destruct(); + } + }); + } + + /** + * Callback function when the transition ends. + * + * When a transition ends, the instance of the transition is automatically destructed. + * + * @returns {void} + */ + }, { + key: "onTransitionEnd", + value: function onTransitionEnd() { + var _this2 = this; + this.eventClasses('active', !this.trailTo ? 'out' : '').forEach(function (eventClass) { + _this2.element.classList.remove(eventClass); + }); + if (this.callback) { + this.callback.apply(this.element); + } + + // Remove duration override + if (this.duration !== null) { + this.element.style.transitionDuration = null; + } + this.destruct(); + } + + /** + * Cancels a transition. + * + * @returns {void} + */ + }, { + key: "cancel", + value: function cancel() { + var _this3 = this; + this.element.removeEventListener('transitionend', function () { + return _this3.onTransitionEnd; + }, { + once: true + }); + this.resetClasses(); + + // Remove duration override + if (this.duration !== null) { + this.element.style.transitionDuration = null; + } + + // Call destructor + this.destruct(); + } + + /** + * Resets the classes, removing any transition classes. + * + * @returns {void} + */ + }, { + key: "resetClasses", + value: function resetClasses() { + var _this4 = this; + this.eventClasses().forEach(function (eventClass) { + _this4.element.classList.remove(eventClass); + }); + } + + /** + * Parses a given duration and converts it to a "ms" value. + * + * @param {String} duration + * @returns {String} + */ + }, { + key: "parseDuration", + value: function parseDuration(duration) { + var parsed = /^([0-9]+(\.[0-9]+)?)(m?s)?$/.exec(duration); + var amount = Number(parsed[1]); + var unit = parsed[3] === 's' ? 'sec' : 'msec'; + return unit === 'sec' ? "".concat(amount * 1000, "ms") : "".concat(Math.floor(amount), "ms"); + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/extras/Trigger.js": +/*!******************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/extras/Trigger.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Trigger) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } +function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * @typedef {Object} TriggerEntity + * @property {string} trigger The selector for the trigger target element(s). + * @property {string} condition The condition that must be met for the trigger to fire. + * @property {string} action The action to perform when the trigger fires. + * @property {string|undefined} parent The parent element with which to limit the trigger scope. + * @property {string|number} priority The priority of the trigger event. + * @property {HTMLElement[]} elements The target elements that this trigger applies to. + * @property {Function[]} conditionCallbacks The condition callbacks for this trigger. + * @property {Map>} elementEvents The events registered on the target elements. + */ +/** + * @typedef {Object} TriggerElement + * @property {HTMLElement} element The target element. + * @property {string} eventName The trigger event name. + * @property {int} priority The trigger event priority. + * @property {Function} event The trigger event function. + */ + +/** + * Trigger handler for HTML elements. + * + * This is a re-imagining of the Input.Trigger functionality in the original Winter CMS framework, + * initialised through the `data-trigger` attributes. + * + * In addition to remaining backwards-compatible with the original Input.Trigger functionality, this + * handler adds additional conditions and configuration for more flexible trigger usage. + * + * @see https://wintercms.com/docs/v1.2/ui/script/input-trigger + * + * @copyright 2024 Winter. + * @author Ben Thomson + */ +var Trigger = /*#__PURE__*/function (_PluginBase) { + function Trigger() { + _classCallCheck(this, Trigger); + return _callSuper(this, Trigger, arguments); + } + _inherits(Trigger, _PluginBase); + return _createClass(Trigger, [{ + key: "construct", + value: + /** + * Constructor. + * + * @param {HTMLElement} element + */ + function construct(element) { + /** + * The element this instance is attached to. + */ + this.element = element; + + /** + * @type {Map} The triggers for this element. + */ + this.triggers = new Map(); + + /** + * @type {Map>} A map of elements that trigger events. + */ + this.events = new Map(); + + /** + * @type {Map>} A map of elements and their event connectors. + */ + this.connectors = new Map(); + this.parseTriggers(); + if (this.triggers.size > 0) { + this.resetEvents(); + this.createTriggerEvents(); + this.runEvents(); + this.snowboard.globalEvent('triggers.ready', this.element); + } + } + + /** + * Destructor. + */ + }, { + key: "destruct", + value: function destruct() { + this.resetEvents(); + _get(_getPrototypeOf(Trigger.prototype), "destruct", this).call(this); + } + + /** + * Parses the element's data attributes and determines applicable triggers. + * + * Trigger data attributes must be in the format `data-trigger-[name]-[parameter]` for multiple + * triggers, or `data-trigger-[parameter]` for single triggers. + * + * Supported parameters are: + * - `condition` or `where`: The condition that must be met for the trigger to fire. + * - `action` or `do`: The action to perform when the trigger fires. + * - `closest-parent` or `parent`: The parent element with which to limit the trigger scope. + * - `priority`: The priority in which to consider the trigger. + * + * Internally, the trigger map uses the `trigger` parameter to store the trigger selector. + */ + }, { + key: "parseTriggers", + value: function parseTriggers() { + var _this = this; + var dataset = this.element.dataset; + this.triggers.clear(); + Object.keys(dataset).forEach(function (key) { + if (/-[A-Z]/.test(key)) { + throw new Error("Unable to convert camelCase to dash-style for data attribute: ".concat(key)); + } + var dashStyle = key.replace(/([A-Z])/g, function (match) { + return "-".concat(match.toLowerCase()); + }); + if (dashStyle !== 'trigger' && !dashStyle.startsWith('trigger-')) { + return; + } + var triggerParts = /([a-z0-9\-.:_]+?)(?:(?:-)(closest-parent|condition|when|action|parent|priority|do))?$/i.exec(dashStyle.replace('trigger-', '').toLowerCase()); + var triggerName = null; + var triggerType = null; + if (['trigger', 'condition', 'action', 'parent', 'when', 'closest'].indexOf(triggerParts[1]) !== -1 && (triggerParts[1] !== 'closest' || triggerParts[1] === 'closest' && triggerParts[2] === 'parent')) { + // Support original trigger format + triggerName = '__original'; + triggerType = triggerParts[1] === 'closest' ? 'parent' : triggerParts[1]; + } else if (triggerParts[2] === undefined || ['closest-parent', 'condition', 'when', 'action', 'parent', 'priority', 'do'].indexOf(triggerParts[2]) !== -1) { + // Parse multi-trigger format + var _triggerParts = _slicedToArray(triggerParts, 2); + triggerName = _triggerParts[1]; + switch (triggerParts[2]) { + case 'closest-parent': + case 'parent': + triggerType = 'parent'; + break; + case 'condition': + case 'when': + triggerType = 'condition'; + break; + case 'action': + case 'do': + triggerType = 'action'; + break; + case 'priority': + triggerType = 'priority'; + break; + default: + triggerType = 'trigger'; + break; + } + } + if (!_this.triggers.has(triggerName)) { + _this.triggers.set(triggerName, new Map()); + } + _this.triggers.get(triggerName).set(triggerType, dataset[key]); + + // Remove trigger data attribute after parsing + delete dataset[key]; + }); + + // Validate triggers, and remove those that do not have at least a trigger selector, a + // condition and an action, or are using invalid conditions or actions + this.triggers.forEach(function (trigger, name) { + var elements = _this.getSelectableElements(trigger); + if (!trigger.has('trigger') || !trigger.has('condition') || !trigger.has('action') || elements.length === 0 || !_this.hasValidConditions(trigger) || !_this.hasValidActions(trigger)) { + _this.triggers["delete"](name); + } else { + trigger.set('elements', elements); + if (!trigger.has('priority')) { + trigger.set('priority', 100); + } + } + }); + } + + /** + * Parses a command given as either a condition or an action. + * + * Commands are formatted as: name:parameter1,parameter2,parameter3, although we also support + * the old format of value[parameter1,parameter2,parameter3] for the `value` command only. + * + * If a parameter requires a comma within, the parameter should be wrapped in quotes. + * + * Multiple commands can be separated by a pipe character `|`. + * + * @param {string} command + * @param {string} allowMultiple + * @returns {{name: string, parameters: string[]}[]} + */ + }, { + key: "parseCommand", + value: function parseCommand(command) { + var _this2 = this; + var allowMultiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + // Support old-format value command (value[foo,bar]) + if (command.startsWith('value') && command.includes('[')) { + var match = command.match(/[^[\]]+(?=])/g); + var values = []; + + // Split values with commas + match.forEach(function (value) { + if (!value.includes(',')) { + values.push(value.replace(/^['"]|['"]$/g, '').trim()); + return; + } + var splitValues = value.replace(/('.*?(?} trigger + * @returns {HTMLElement[]} + */ + }, { + key: "getSelectableElements", + value: function getSelectableElements(trigger) { + if (trigger.has('parent')) { + if (!this.element.closest(trigger.get('parent'))) { + return []; + } + return Array.from(this.element.closest(trigger.get('parent')).querySelectorAll(trigger.get('trigger'))); + } + return Array.from(document.querySelectorAll(trigger.get('trigger'))); + } + + /** + * Determines if the provided trigger condition(s) are valid. + * + * @param {TriggerEntity} trigger + * @returns {boolean} + */ + }, { + key: "hasValidConditions", + value: function hasValidConditions(trigger) { + return this.parseCommand(trigger.get('condition')).every(function (condition) { + return ['checked', 'unchecked', 'empty', 'value', 'oneof', 'allof', 'focus', 'attr', 'class'].includes(condition.name.toLowerCase()); + }); + } + + /** + * Determines if the provided trigger action(s) are valid. + * + * @param {TriggerEntity} trigger + * @returns {boolean} + */ + }, { + key: "hasValidActions", + value: function hasValidActions(trigger) { + return this.parseCommand(trigger.get('action')).every(function (action) { + return ['show', 'hide', 'enable', 'disable', 'empty', 'value', 'valueOf', 'check', 'uncheck', 'class', 'classOf', 'attr', 'attrOf', 'style', 'styleOf'].includes(action.name.toLowerCase()); + }); + } + + /** + * Create trigger events on trigger and target elements. + */ + }, { + key: "createTriggerEvents", + value: function createTriggerEvents() { + var _this3 = this; + this.triggers.forEach(function (trigger) { + // Collect conditions and check them as a group. + trigger.set('conditionCallbacks', []); + trigger.set('elementEvents', new Map()); + _this3.parseCommand(trigger.get('condition')).forEach(function (condition) { + switch (condition.name.toLowerCase()) { + case 'value': + case 'oneof': + trigger.get('conditionCallbacks').push(_this3.createValueCondition.apply(_this3, [trigger, false].concat(_toConsumableArray(condition.parameters)))); + break; + case 'allof': + trigger.get('conditionCallbacks').push(_this3.createValueCondition.apply(_this3, [trigger, true].concat(_toConsumableArray(condition.parameters)))); + break; + case 'empty': + trigger.get('conditionCallbacks').push(_this3.createEmptyCondition(trigger)); + break; + case 'checked': + case 'unchecked': + trigger.get('conditionCallbacks').push(_this3.createCheckedCondition.apply(_this3, [trigger, condition.name === 'checked'].concat(_toConsumableArray(condition.parameters)))); + break; + case 'focus': + trigger.get('conditionCallbacks').push(_this3.createFocusedCondition(trigger)); + break; + default: + } + }); + }); + this.registerEventListeners(); + } + + /** + * Adds an event to an element. + * + * This registers the event in the `elementEvents` map for later usage and removal. + * + * @param {HTMLElement} element + * @param {TriggerEntity} trigger + * @param {string} eventName + */ + }, { + key: "addEvent", + value: function addEvent(element, trigger, eventName) { + if (!trigger.get('elementEvents').has(element)) { + trigger.get('elementEvents').set(element, new Set()); + } + if (!trigger.get('elementEvents').get(element).add(eventName)) { + trigger.get('elementEvents').get(element).add(eventName); + } + } + + /** + * Registers DOM event listeners for targeted elements of all triggers. + * + * Adds a connector to the element for the events, so that we may enable prioritisation and + * control over the firing of the events, and then registers DOM event listeners for the + * elements. + */ + }, { + key: "registerEventListeners", + value: function registerEventListeners() { + var _this4 = this; + var connectors = new Set(); + this.triggers.forEach(function (trigger) { + trigger.get('elementEvents').forEach(function (events, element) { + if (!_this4.events.has(element)) { + _this4.events.set(element, new Set()); + } + events.forEach(function (eventName) { + if (!connectors.has({ + element: element, + eventName: eventName + })) { + connectors.add({ + element: element, + eventName: eventName + }); + } + var event = { + element: element, + eventName: eventName, + priority: Number(trigger.get('priority')), + event: function event() { + _this4.executeActions(trigger, trigger.get('conditionCallbacks').every(function (condition) { + return condition(); + })); + } + }; + _this4.events.get(element).add(event); + }); + }); + }); + connectors.forEach(function (_ref) { + var element = _ref.element, + eventName = _ref.eventName; + if (!_this4.connectors.has(element)) { + _this4.connectors.set(element, new Map()); + } + if (!_this4.connectors.get(element).has(eventName)) { + _this4.connectors.get(element).set(eventName, function () { + var events = []; + _this4.events.get(element).forEach(function (elementEvent) { + if (elementEvent.eventName === eventName) { + events.push(elementEvent); + } + }); + events.sort(function (a, b) { + return a.priority - b.priority; + }).forEach(function (elementEvent) { + elementEvent.event(); + }); + }); + element.addEventListener(eventName, _this4.connectors.get(element).get(eventName)); + } + }); + } + + /** + * Creates a trigger that fires when the value of the target element(s) matches one of the + * provided values. + * + * @param {TriggerEntity} trigger + * @param {...string} values + */ + }, { + key: "createValueCondition", + value: function createValueCondition(trigger, all) { + var _this5 = this; + for (var _len = arguments.length, values = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + values[_key - 2] = arguments[_key]; + } + var supportedElements = new Set(); + trigger.get('elements').forEach(function (element) { + if (element.matches('input[type=button], input[type=file], input[type=image], input[type=reset], input[type=submit]')) { + // Buttons and file inputs are unsupported + return; + } + if (element.matches('input, select, textarea')) { + supportedElements.add(element); + } + }); + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + _this5.addEvent(element, trigger, 'click'); + } + _this5.addEvent(element, trigger, 'input'); + }); + return function () { + var elementValues = new Set(); + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + if (element.checked) { + elementValues.add(element.value); + } + return; + } + elementValues.add(element.value); + }); + if (all) { + return values.every(function (value) { + return elementValues.has(value); + }); + } + return values.some(function (value) { + return elementValues.has(value); + }); + }; + } + + /** + * Creates a trigger that fires when there is no value within the target element(s). + * + * @param {TriggerEntity} trigger + */ + }, { + key: "createEmptyCondition", + value: function createEmptyCondition(trigger) { + var _this6 = this; + var supportedElements = new Set(); + trigger.get('elements').forEach(function (element) { + if (element.matches('input[type=button], input[type=image], input[type=reset], input[type=submit]')) { + // Buttons and file inputs are unsupported + return; + } + if (element.matches('input, select, textarea')) { + supportedElements.add(element); + } + }); + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + _this6.addEvent(element, trigger, 'click'); + return; + } + _this6.addEvent(element, trigger, 'input'); + }); + return function () { + var elementValues = new Set(); + supportedElements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + if (element.checked) { + elementValues.add(element); + } + return; + } + if (element.value.trim() !== '') { + elementValues.add(element); + } + }); + return elementValues.size === 0; + }; + } + + /** + * Creates a trigger that fires when a target element(s) is checked/unchecked. + * + * @param {TriggerEntity} trigger + * @param {boolean} checked If the element should be checked or unchecked. + * @param {string|number|undefined} atLeast The minimum number of elements that must be checked. + * Defaults to 1 if undefined. If specified as `all`, all elements must be checked. + */ + }, { + key: "createCheckedCondition", + value: function createCheckedCondition(trigger, checked) { + var _this7 = this; + var atLeast = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + var atMost = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; + var supportedElements = new Set(); + trigger.get('elements').forEach(function (element) { + // Only supports checkboxes and radio buttons + if (element.matches('input[type=radio], input[type=checkbox]')) { + supportedElements.add(element); + } + }); + supportedElements.forEach(function (element) { + _this7.addEvent(element, trigger, 'click'); + }); + return function () { + var elementValues = new Set(); + supportedElements.forEach(function (element) { + if (checked === element.checked) { + elementValues.add(element); + } + }); + if (atLeast === 'all') { + return elementValues.size === supportedElements.size; + } + var atLeastCount = atLeast !== undefined && Math.floor(atLeast) > 0 ? Math.floor(atLeast) : 1; + var atMostCount = atLeast !== undefined && Math.floor(atMost) > 1 ? Math.floor(atMost) : supportedElements.size; + return elementValues.size >= atLeastCount && elementValues.size <= atMostCount; + }; + } + + /** + * Creates a trigger that fires when a target element(s) is focused or blurred. + * + * @param {TriggerEntity} trigger + */ + }, { + key: "createFocusedCondition", + value: function createFocusedCondition(trigger) { + var _this8 = this; + var supportedElements = new Set(); + trigger.get('elements').forEach(function (element) { + // All elements are supported (technically) + supportedElements.add(element); + }); + supportedElements.forEach(function (element) { + _this8.addEvent(element, trigger, 'focus'); + _this8.addEvent(element, trigger, 'blur'); + }); + return function () { + return Array.from(supportedElements).some(function (element) { + return document.activeElement === element; + }); + }; + } + + /** + * Manually runs all registered triggers. + * + * This can be used to update the state of the triggers. + */ + }, { + key: "runEvents", + value: function runEvents() { + this.connectors.forEach(function (elementConnectors) { + elementConnectors.forEach(function (connector) { + connector(); + }); + }); + } + + /** + * Clears all registered events. + * + * This will disable all triggers and their event listeners on the target elements. + */ + }, { + key: "resetEvents", + value: function resetEvents() { + this.connectors.forEach(function (elementConnectors, element) { + elementConnectors.forEach(function (connector, event) { + element.removeEventListener(event, connector); + }); + }); + this.connectors.clear(); + this.events.clear(); + } + + /** + * Executes actions based on the trigger condition. + * + * Actions should be binary, and show one state when the condition is met, and another when it + * is not. The second parameter is used to determine if the conditions of the trigger have been + * met. If a trigger has multiple conditions, ALL conditions must be met. + * + * @param {TriggerEntity} trigger + * @param {boolean} conditionMet + */ + }, { + key: "executeActions", + value: function executeActions(trigger, conditionMet) { + var _this9 = this; + this.parseCommand(trigger.get('action')).forEach(function (action) { + switch (action.name) { + case 'show': + case 'hide': + _this9.actionShow(trigger, action.parameters[0] ? Array.from(_this9.element.querySelectorAll(action.parameters[0])) : [_this9.element], action.name === 'show' ? conditionMet : !conditionMet); + break; + case 'enable': + case 'disable': + _this9.actionEnable(trigger, action.parameters[0] ? Array.from(_this9.element.querySelectorAll(action.parameters[0])) : [_this9.element], action.name === 'enable' ? conditionMet : !conditionMet); + break; + case 'empty': + if (conditionMet) { + _this9.actionValue(trigger, conditionMet, action.parameters[0] ? Array.from(_this9.element.querySelectorAll(action.parameters[0])) : [_this9.element], ''); + } + break; + case 'value': + case 'valueOf': + _this9.actionValue.apply(_this9, [trigger, conditionMet, action.name === 'valueOf' ? Array.from(_this9.element.querySelectorAll(action.parameters[0])) : [_this9.element]].concat(_toConsumableArray(action.parameters.length > 0 && action.name === 'valueOf' ? action.parameters.slice(1) : action.parameters))); + break; + case 'class': + case 'classOf': + _this9.actionClass.apply(_this9, [trigger, conditionMet, action.name === 'classOf' ? Array.from(_this9.element.querySelectorAll(action.parameters[0])) : [_this9.element]].concat(_toConsumableArray(action.name === 'classOf' ? action.parameters.slice(1) : action.parameters))); + default: + } + }); + } + + /** + * Shows or hides a trigger element. + * + * This action will toggle the `hide` class on the element, and set the `display` style to + * `none` when hidden, and the original display value when shown. + * + * @param {TriggerEntity} trigger + * @param {HTMLElement[]} elements + * @param {boolean} show + */ + }, { + key: "actionShow", + value: function actionShow(trigger, elements, show) { + var _this10 = this; + elements.forEach(function (element) { + if (show && getComputedStyle(element).display === 'none') { + element.classList.remove('hide'); + if (!element.dataset.originalDisplay) { + element.style.display = 'block'; + } else { + element.style.display = element.dataset.originalDisplay; + } + delete element.dataset.originalDisplay; + _this10.afterAction(trigger, element); + } else if (!show && getComputedStyle(element).display !== 'none') { + element.classList.add('hide'); + element.dataset.originalDisplay = getComputedStyle(element).display; + element.style.display = 'none'; + _this10.afterAction(trigger, element); + } + }); + } + + /** + * Enables or disables a trigger element. + * + * This action will toggle the `control-disabled` class on the element, and set the `disabled` + * property to `true` when disabled, and `false` when enabled. + * + * @param {TriggerEntity} trigger + * @param {HTMLElement[]} elements + * @param {boolean} enable + */ + }, { + key: "actionEnable", + value: function actionEnable(trigger, elements, enable) { + var _this11 = this; + elements.forEach(function (element) { + element.classList[enable ? 'remove' : 'add']('control-disabled'); + if (element.disabled !== undefined) { + element.disabled = !enable; + } + _this11.afterAction(trigger, element); + }); + } + + /** + * Sets the value of either the trigger element or a child element(s) within. + * + * This is a one-way action if the unmet value is not defined. + */ + }, { + key: "actionValue", + value: function actionValue(trigger, conditionMet, elements, value) { + var _this12 = this; + var unmetValue = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; + if (!conditionMet && unmetValue === undefined) { + return; + } + var newValue = conditionMet ? value : unmetValue; + elements.forEach(function (element) { + if (element.matches('input[type=checkbox], input[type=radio]')) { + element.checked = element.value === newValue; + return; + } + if (element.matches('input, select, textarea')) { + element.value = newValue; + return; + } + element.textContent = newValue; + _this12.afterAction(trigger); + }); + } + + /** + * Adds or removes the class from the trigger element or a child element(s) within. + * + * This will simply remove the class if the unmet class is not defined. Otherwise, the classes + * will be toggled. + */ + }, { + key: "actionClass", + value: function actionClass(trigger, conditionMet, elements, cssClass) { + var _this13 = this; + var unmetCssClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; + elements.forEach(function (element) { + if (conditionMet) { + element.classList.add(cssClass); + if (unmetCssClass) { + element.classList.remove(unmetCssClass); + } + } else { + element.classList.remove(cssClass); + if (unmetCssClass) { + element.classList.add(unmetCssClass); + } + } + _this13.afterAction(trigger); + }); + } + }, { + key: "afterAction", + value: function afterAction(trigger, element) { + this.snowboard.debug('Trigger fired', element, trigger); + this.snowboard.globalEvent('trigger.fired', element, trigger); + } + }]); +}(_abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js": +/*!**************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/** + * Internal proxy for Snowboard. + * + * This handler wraps the Snowboard instance that is passed to the constructor of plugin instances. + * It prevents access to the following methods: + * - `attachAbstracts`: No need to attach abstracts again. + * - `loadUtilties`: No need to load utilities again. + * - `initialise`: Snowboard is already initialised. + * - `initialiseSingletons`: Singletons are already initialised. + */ +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ + get: function get(target, prop, receiver) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (['attachAbstracts', 'loadUtilities', 'initialise', 'initialiseSingletons'].includes(prop)) { + throw new Error("You cannot use the \"".concat(prop, "\" Snowboard method within a plugin.")); + } + if (target.hasPlugin(propLower)) { + return function () { + var _Reflect$get$propLowe; + return (_Reflect$get$propLowe = Reflect.get(target, 'plugins')[propLower]).getInstance.apply(_Reflect$get$propLowe, arguments); + }; + } + } + return Reflect.get(target, prop, receiver); + }, + has: function has(target, prop) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (['attachAbstracts', 'loadUtilities', 'initialise', 'initialiseSingletons'].includes(prop)) { + return false; + } + if (target.hasPlugin(propLower)) { + return true; + } + } + return Reflect.has(target, prop); + } +}); + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/PluginLoader.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/PluginLoader.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PluginLoader) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +/* harmony import */ var _InnerProxyHandler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./InnerProxyHandler */ "../../modules/system/assets/js/snowboard/main/InnerProxyHandler.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + + + + +/** + * Plugin loader class. + * + * This is a provider (factory) class for a single plugin and provides the link between Snowboard framework functionality + * and the underlying plugin instances. It also provides some basic mocking of plugin methods for testing. + * + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var PluginLoader = /*#__PURE__*/function () { + /** + * Constructor. + * + * Binds the Winter framework to the instance. + * + * @param {string} name + * @param {Snowboard} snowboard + * @param {PluginBase} instance + */ + function PluginLoader(name, snowboard, instance) { + _classCallCheck(this, PluginLoader); + this.name = name; + this.snowboard = new Proxy(snowboard, _InnerProxyHandler__WEBPACK_IMPORTED_MODULE_2__["default"]); + this.instance = instance; + + // Freeze instance that has been inserted into this loader + Object.freeze(this.instance); + this.instances = []; + this.singleton = { + initialised: false + }; + // Prevent further extension of the singleton status object + Object.seal(this.singleton); + this.mocks = {}; + this.originalFunctions = {}; + + // Freeze loader itself + Object.freeze(PluginLoader.prototype); + Object.freeze(this); + } + + /** + * Determines if the current plugin has a specific method available. + * + * Returns false if the current plugin is a callback function. + * + * @param {string} methodName + * @returns {boolean} + */ + return _createClass(PluginLoader, [{ + key: "hasMethod", + value: function hasMethod(methodName) { + if (this.isFunction()) { + return false; + } + return typeof this.instance.prototype[methodName] === 'function'; + } + + /** + * Calls a prototype method for a plugin. This should generally be used for "static" calls. + * + * @param {string} methodName + * @param {...} args + * @returns {any} + */ + }, { + key: "callMethod", + value: function callMethod() { + if (this.isFunction()) { + return null; + } + for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) { + parameters[_key] = arguments[_key]; + } + var args = parameters; + var methodName = args.shift(); + return this.instance.prototype[methodName](args); + } + + /** + * Returns an instance of the current plugin. + * + * - If this is a callback function plugin, the function will be returned. + * - If this is a singleton, the single instance of the plugin will be returned. + * + * @returns {PluginBase|Function} + */ + }, { + key: "getInstance", + value: function getInstance() { + var _this = this; + for (var _len2 = arguments.length, parameters = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + parameters[_key2] = arguments[_key2]; + } + if (this.isFunction()) { + return this.instance.apply(this, parameters); + } + if (!this.dependenciesFulfilled()) { + var unmet = this.getDependencies().filter(function (item) { + return !_this.snowboard.getPluginNames().includes(item); + }); + throw new Error("The \"".concat(this.name, "\" plugin requires the following plugins: ").concat(unmet.join(', '))); + } + if (this.isSingleton()) { + if (this.instances.length === 0) { + this.initialiseSingleton.apply(this, parameters); + } + + // Apply mocked methods + if (Object.keys(this.mocks).length > 0) { + Object.entries(this.originalFunctions).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + methodName = _entry[0], + callback = _entry[1]; + _this.instances[0][methodName] = callback; + }); + Object.entries(this.mocks).forEach(function (entry) { + var _entry2 = _slicedToArray(entry, 2), + methodName = _entry2[0], + callback = _entry2[1]; + _this.instances[0][methodName] = function () { + for (var _len3 = arguments.length, params = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + params[_key3] = arguments[_key3]; + } + return callback.apply(void 0, [_this].concat(params)); + }; + }); + } + return this.instances[0]; + } + + // Apply mocked methods to prototype + if (Object.keys(this.mocks).length > 0) { + Object.entries(this.originalFunctions).forEach(function (entry) { + var _entry3 = _slicedToArray(entry, 2), + methodName = _entry3[0], + callback = _entry3[1]; + _this.instance.prototype[methodName] = callback; + }); + Object.entries(this.mocks).forEach(function (entry) { + var _entry4 = _slicedToArray(entry, 2), + methodName = _entry4[0], + callback = _entry4[1]; + _this.instance.prototype[methodName] = function () { + for (var _len4 = arguments.length, params = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + params[_key4] = arguments[_key4]; + } + return callback.apply(void 0, [_this].concat(params)); + }; + }); + } + var newInstance = _construct(this.instance, [this.snowboard].concat(parameters)); + newInstance.detach = function () { + return _this.instances.splice(_this.instances.indexOf(newInstance), 1); + }; + newInstance.construct.apply(newInstance, parameters); + this.instances.push(newInstance); + return newInstance; + } + + /** + * Gets all instances of the current plugin. + * + * If this plugin is a callback function plugin, an empty array will be returned. + * + * @returns {PluginBase[]} + */ + }, { + key: "getInstances", + value: function getInstances() { + if (this.isFunction()) { + return []; + } + return this.instances; + } + + /** + * Determines if the current plugin is a simple callback function. + * + * @returns {boolean} + */ + }, { + key: "isFunction", + value: function isFunction() { + return typeof this.instance === 'function' && this.instance.prototype instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false; + } + + /** + * Determines if the current plugin is a singleton. + * + * @returns {boolean} + */ + }, { + key: "isSingleton", + value: function isSingleton() { + return this.instance.prototype instanceof _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"] === true; + } + + /** + * Determines if a singleton has been initialised. + * + * Normal plugins will always return true. + * + * @returns {boolean} + */ + }, { + key: "isInitialised", + value: function isInitialised() { + if (!this.isSingleton()) { + return true; + } + return this.singleton.initialised; + } + + /** + * Initialises the singleton instance. + * + * @returns {void} + */ + }, { + key: "initialiseSingleton", + value: function initialiseSingleton() { + var _this2 = this; + if (!this.isSingleton()) { + return; + } + for (var _len5 = arguments.length, parameters = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + parameters[_key5] = arguments[_key5]; + } + var newInstance = _construct(this.instance, [this.snowboard].concat(parameters)); + newInstance.detach = function () { + return _this2.instances.splice(_this2.instances.indexOf(newInstance), 1); + }; + newInstance.construct.apply(newInstance, parameters); + this.instances.push(newInstance); + this.singleton.initialised = true; + } + + /** + * Gets the dependencies of the current plugin. + * + * @returns {string[]} + */ + }, { + key: "getDependencies", + value: function getDependencies() { + // Callback functions cannot have dependencies. + if (this.isFunction()) { + return []; + } + + // No dependency method specified. + if (typeof this.instance.prototype.dependencies !== 'function') { + return []; + } + return this.instance.prototype.dependencies().map(function (item) { + return item.toLowerCase(); + }); + } + + /** + * Determines if the current plugin has all its dependencies fulfilled. + * + * @returns {boolean} + */ + }, { + key: "dependenciesFulfilled", + value: function dependenciesFulfilled() { + var _this3 = this; + var dependencies = this.getDependencies(); + var fulfilled = true; + dependencies.forEach(function (plugin) { + if (!_this3.snowboard.hasPlugin(plugin)) { + fulfilled = false; + } + }); + return fulfilled; + } + + /** + * Allows a method of an instance to be mocked for testing. + * + * This mock will be applied for the life of an instance. For singletons, the mock will be applied for the life + * of the page. + * + * Mocks cannot be applied to callback function plugins. + * + * @param {string} methodName + * @param {Function} callback + */ + }, { + key: "mock", + value: function mock(methodName, callback) { + var _this4 = this; + if (this.isFunction()) { + return; + } + if (!this.instance.prototype[methodName]) { + throw new Error("Function \"".concat(methodName, "\" does not exist and cannot be mocked")); + } + this.mocks[methodName] = callback; + this.originalFunctions[methodName] = this.instance.prototype[methodName]; + if (this.isSingleton() && this.instances.length === 0) { + this.initialiseSingleton(); + + // Apply mocked method + this.instances[0][methodName] = function () { + for (var _len6 = arguments.length, parameters = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { + parameters[_key6] = arguments[_key6]; + } + return callback.apply(void 0, [_this4].concat(parameters)); + }; + } + } + + /** + * Removes a mock callback from future instances. + * + * @param {string} methodName + */ + }, { + key: "unmock", + value: function unmock(methodName) { + if (this.isFunction()) { + return; + } + if (!this.mocks[methodName]) { + return; + } + if (this.isSingleton()) { + this.instances[0][methodName] = this.originalFunctions[methodName]; + } + delete this.mocks[methodName]; + delete this.originalFunctions[methodName]; + } + }]); +}(); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/ProxyHandler.js": +/*!*********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/ProxyHandler.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ + get: function get(target, prop, receiver) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (target.hasPlugin(propLower)) { + return function () { + var _Reflect$get$propLowe; + return (_Reflect$get$propLowe = Reflect.get(target, 'plugins')[propLower]).getInstance.apply(_Reflect$get$propLowe, arguments); + }; + } + } + return Reflect.get(target, prop, receiver); + }, + has: function has(target, prop) { + if (typeof prop === 'string') { + var propLower = prop.toLowerCase(); + if (target.hasPlugin(propLower)) { + return true; + } + } + return Reflect.has(target, prop); + } +}); + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/main/Snowboard.js": +/*!******************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/main/Snowboard.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Snowboard) +/* harmony export */ }); +/* harmony import */ var _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/PluginBase */ "../../modules/system/assets/js/snowboard/abstracts/PluginBase.js"); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +/* harmony import */ var _PluginLoader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PluginLoader */ "../../modules/system/assets/js/snowboard/main/PluginLoader.js"); +/* harmony import */ var _utilities_Cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/Cookie */ "../../modules/system/assets/js/snowboard/utilities/Cookie.js"); +/* harmony import */ var _utilities_JsonParser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/JsonParser */ "../../modules/system/assets/js/snowboard/utilities/JsonParser.js"); +/* harmony import */ var _utilities_Sanitizer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities/Sanitizer */ "../../modules/system/assets/js/snowboard/utilities/Sanitizer.js"); +/* harmony import */ var _utilities_Url__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utilities/Url */ "../../modules/system/assets/js/snowboard/utilities/Url.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + + + + + + + + +/** + * Snowboard - the Winter JavaScript framework. + * + * This class represents the base of a modern take on the Winter JS framework, being fully extensible and taking advantage + * of modern JavaScript features by leveraging the Laravel Mix compilation framework. It also is coded up to remove the + * dependency of jQuery. + * + * @copyright 2021 Winter. + * @author Ben Thomson + * @link https://wintercms.com/docs/snowboard/introduction + */ +var Snowboard = /*#__PURE__*/function () { + /** + * Constructor. + * + * @param {boolean} autoSingletons Automatically load singletons when DOM is ready. Default: `true`. + * @param {boolean} debug Whether debugging logs should be shown. Default: `false`. + */ + function Snowboard(autoSingletons, debug) { + _classCallCheck(this, Snowboard); + this.debugEnabled = typeof debug === 'boolean' && debug === true; + this.autoInitSingletons = typeof autoSingletons === 'boolean' && autoSingletons === false; + this.plugins = {}; + this.listeners = {}; + this.foundBaseUrl = null; + this.readiness = { + dom: false + }; + // Seal readiness from being added to further, but allow the properties to be modified. + Object.seal(this.readiness); + this.attachAbstracts(); + + // Freeze the Snowboard class to prevent further modifications. + Object.freeze(Snowboard.prototype); + Object.freeze(this); + this.loadUtilities(); + this.initialise(); + this.debug('Snowboard framework initialised'); + } + + /** + * Attaches abstract classes as properties of the Snowboard class. + * + * This will allow Javascript functionality with no build process to still extend these abstracts by prefixing + * them with "Snowboard". + * + * ``` + * class MyClass extends Snowboard.PluginBase { + * ... + * } + * ``` + */ + return _createClass(Snowboard, [{ + key: "attachAbstracts", + value: function attachAbstracts() { + this.PluginBase = _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"]; + this.Singleton = _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"]; + Object.freeze(this.PluginBase.prototype); + Object.freeze(this.PluginBase); + Object.freeze(this.Singleton.prototype); + Object.freeze(this.Singleton); + } + + /** + * Loads the default utilities. + */ + }, { + key: "loadUtilities", + value: function loadUtilities() { + this.addPlugin('cookie', _utilities_Cookie__WEBPACK_IMPORTED_MODULE_3__["default"]); + this.addPlugin('jsonParser', _utilities_JsonParser__WEBPACK_IMPORTED_MODULE_4__["default"]); + this.addPlugin('sanitizer', _utilities_Sanitizer__WEBPACK_IMPORTED_MODULE_5__["default"]); + this.addPlugin('url', _utilities_Url__WEBPACK_IMPORTED_MODULE_6__["default"]); + } + + /** + * Initialises the framework. + * + * Attaches a listener for the DOM being ready and triggers a global "ready" event for plugins to begin attaching + * themselves to the DOM. + */ + }, { + key: "initialise", + value: function initialise() { + var _this = this; + window.addEventListener('DOMContentLoaded', function () { + if (_this.autoInitSingletons) { + _this.initialiseSingletons(); + } + _this.globalEvent('ready'); + _this.readiness.dom = true; + }); + } + + /** + * Initialises an instance of every singleton. + */ + }, { + key: "initialiseSingletons", + value: function initialiseSingletons() { + Object.values(this.plugins).forEach(function (plugin) { + if (plugin.isSingleton() && plugin.dependenciesFulfilled()) { + plugin.initialiseSingleton(); + } + }); + } + + /** + * Adds a plugin to the framework. + * + * Plugins are the cornerstone for additional functionality for Snowboard. A plugin must either be an ES2015 class + * that extends the PluginBase or Singleton abstract classes, or a simple callback function. + * + * When a plugin is added, it is automatically assigned as a new magic method in the Snowboard class using the name + * parameter, and can be called via this method. This method will always be the "lowercase" version of this name. + * + * For example, if a plugin is assigned to the name "myPlugin", it can be called via `Snowboard.myplugin()`. + * + * @param {string} name + * @param {PluginBase|Function} instance + */ + }, { + key: "addPlugin", + value: function addPlugin(name, instance) { + var _this2 = this; + var lowerName = name.toLowerCase(); + if (this.hasPlugin(lowerName)) { + throw new Error("A plugin called \"".concat(name, "\" is already registered.")); + } + if (typeof instance !== 'function' && instance instanceof _abstracts_PluginBase__WEBPACK_IMPORTED_MODULE_0__["default"] === false) { + throw new Error('The provided plugin must extend the PluginBase class, or must be a callback function.'); + } + if (this[name] !== undefined || this[lowerName] !== undefined) { + throw new Error('The given name is already in use for a property or method of the Snowboard class.'); + } + this.plugins[lowerName] = new _PluginLoader__WEBPACK_IMPORTED_MODULE_2__["default"](lowerName, this, instance); + this.debug("Plugin \"".concat(name, "\" registered")); + + // Check if any singletons now have their dependencies fulfilled, and fire their "ready" handler if we're + // in a ready state. + Object.values(this.getPlugins()).forEach(function (plugin) { + if (plugin.isSingleton() && !plugin.isInitialised() && plugin.dependenciesFulfilled() && plugin.hasMethod('listens') && Object.keys(plugin.callMethod('listens')).includes('ready') && _this2.readiness.dom) { + var readyMethod = plugin.callMethod('listens').ready; + plugin.callMethod(readyMethod); + } + }); + } + + /** + * Removes a plugin. + * + * Removes a plugin from Snowboard, calling the destructor method for all active instances of the plugin. + * + * @param {string} name + * @returns {void} + */ + }, { + key: "removePlugin", + value: function removePlugin(name) { + var lowerName = name.toLowerCase(); + if (!this.hasPlugin(lowerName)) { + this.debug("Plugin \"".concat(name, "\" already removed")); + return; + } + + // Call destructors for all instances + this.plugins[lowerName].getInstances().forEach(function (instance) { + instance.destruct(); + }); + delete this.plugins[lowerName]; + delete this[lowerName]; + delete this[name]; + this.debug("Plugin \"".concat(name, "\" removed")); + } + + /** + * Determines if a plugin has been registered and is active. + * + * A plugin that is still waiting for dependencies to be registered will not be active. + * + * @param {string} name + * @returns {boolean} + */ + }, { + key: "hasPlugin", + value: function hasPlugin(name) { + var lowerName = name.toLowerCase(); + return this.plugins[lowerName] !== undefined; + } + + /** + * Returns an array of registered plugins as PluginLoader objects. + * + * @returns {PluginLoader[]} + */ + }, { + key: "getPlugins", + value: function getPlugins() { + return this.plugins; + } + + /** + * Returns an array of registered plugins, by name. + * + * @returns {string[]} + */ + }, { + key: "getPluginNames", + value: function getPluginNames() { + return Object.keys(this.plugins); + } + + /** + * Returns a PluginLoader object of a given plugin. + * + * @returns {PluginLoader} + */ + }, { + key: "getPlugin", + value: function getPlugin(name) { + var lowerName = name.toLowerCase(); + if (!this.hasPlugin(lowerName)) { + throw new Error("No plugin called \"".concat(lowerName, "\" has been registered.")); + } + return this.plugins[lowerName]; + } + + /** + * Finds all plugins that listen to the given event. + * + * This works for both normal and promise events. It does NOT check that the plugin's listener actually exists. + * + * @param {string} eventName + * @returns {string[]} The name of the plugins that are listening to this event. + */ + }, { + key: "listensToEvent", + value: function listensToEvent(eventName) { + var plugins = []; + Object.entries(this.plugins).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + name = _entry[0], + plugin = _entry[1]; + if (plugin.isFunction()) { + return; + } + if (!plugin.dependenciesFulfilled()) { + return; + } + if (!plugin.hasMethod('listens')) { + return; + } + var listeners = plugin.callMethod('listens'); + if (typeof listeners[eventName] === 'string' || typeof listeners[eventName] === 'function') { + plugins.push(name); + } + }); + return plugins; + } + + /** + * Add a simple ready listener. + * + * Synonymous with jQuery's "$(document).ready()" functionality, this allows inline scripts to + * attach themselves to Snowboard immediately but only fire when the DOM is ready. + * + * @param {Function} callback + */ + }, { + key: "ready", + value: function ready(callback) { + if (this.readiness.dom) { + callback(); + } + this.on('ready', callback); + } + + /** + * Adds a simple listener for an event. + * + * This can be used for ad-hoc scripts that don't need a full plugin. The given callback will be + * called when the event name provided fires. This works for both normal and Promise events. For + * a Promise event, your callback must return a Promise. + * + * @param {String} eventName + * @param {Function} callback + */ + }, { + key: "on", + value: function on(eventName, callback) { + if (!this.listeners[eventName]) { + this.listeners[eventName] = []; + } + if (!this.listeners[eventName].includes(callback)) { + this.listeners[eventName].push(callback); + } + } + + /** + * Removes a simple listener for an event. + * + * @param {String} eventName + * @param {Function} callback + */ + }, { + key: "off", + value: function off(eventName, callback) { + if (!this.listeners[eventName]) { + return; + } + var index = this.listeners[eventName].indexOf(callback); + if (index === -1) { + return; + } + this.listeners[eventName].splice(index, 1); + } + + /** + * Calls a global event to all registered plugins. + * + * If any plugin returns a `false`, the event is considered cancelled. + * + * @param {string} eventName + * @returns {boolean} If event was not cancelled + */ + }, { + key: "globalEvent", + value: function globalEvent(eventName) { + var _this3 = this; + for (var _len = arguments.length, parameters = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + parameters[_key - 1] = arguments[_key]; + } + this.debug.apply(this, ["Calling global event \"".concat(eventName, "\"")].concat(parameters)); + + // Find plugins listening to the event. + var listeners = this.listensToEvent(eventName); + if (listeners.length === 0) { + this.debug("No listeners found for global event \"".concat(eventName, "\"")); + return true; + } + this.debug("Listeners found for global event \"".concat(eventName, "\": ").concat(listeners.join(', '))); + var cancelled = false; + listeners.forEach(function (name) { + var plugin = _this3.getPlugin(name); + if (plugin.isFunction()) { + return; + } + if (plugin.isSingleton() && plugin.getInstances().length === 0) { + plugin.initialiseSingleton(); + } + var listenMethod = plugin.callMethod('listens')[eventName]; + + // Call event handler methods for all plugins, if they have a method specified for the event. + plugin.getInstances().forEach(function (instance) { + // If a plugin has cancelled the event, no further plugins are considered. + if (cancelled) { + return; + } + if (typeof listenMethod === 'function') { + try { + var result = listenMethod.apply(instance, parameters); + if (result === false) { + cancelled = true; + } + } catch (error) { + _this3.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); + } + } else if (typeof listenMethod === 'string') { + if (!instance[listenMethod]) { + throw new Error("Missing \"".concat(listenMethod, "\" method in \"").concat(name, "\" plugin")); + } + try { + if (instance[listenMethod].apply(instance, parameters) === false) { + cancelled = true; + _this3.debug("Global event \"".concat(eventName, "\" cancelled by \"").concat(name, "\" plugin")); + } + } catch (error) { + _this3.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); + } + } else { + _this3.error("Listen method for \"".concat(eventName, "\" event in \"").concat(name, "\" plugin is not a function or string.")); + } + }); + }); + + // Find ad-hoc listeners for this event. + if (!cancelled && this.listeners[eventName] && this.listeners[eventName].length > 0) { + this.debug("Found ".concat(this.listeners[eventName].length, " ad-hoc listener(s) for global event \"").concat(eventName, "\"")); + this.listeners[eventName].forEach(function (listener) { + // If a listener has cancelled the event, no further listeners are considered. + if (cancelled) { + return; + } + try { + if (listener.apply(void 0, parameters) === false) { + cancelled = true; + _this3.debug("Global event \"".concat(eventName, " cancelled by an ad-hoc listener.")); + } + } catch (error) { + _this3.error("Error thrown in \"".concat(eventName, "\" event by an ad-hoc listener."), error); + } + }); + } + return !cancelled; + } + + /** + * Calls a global event to all registered plugins, expecting a Promise to be returned by all. + * + * This collates all plugins responses into one large Promise that either expects all to be resolved, or one to reject. + * If no listeners are found, a resolved Promise is returned. + * + * @param {string} eventName + */ + }, { + key: "globalPromiseEvent", + value: function globalPromiseEvent(eventName) { + var _this4 = this; + for (var _len2 = arguments.length, parameters = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + parameters[_key2 - 1] = arguments[_key2]; + } + this.debug("Calling global promise event \"".concat(eventName, "\"")); + + // Find plugins listening to this event. + var listeners = this.listensToEvent(eventName); + if (listeners.length === 0) { + this.debug("No listeners found for global promise event \"".concat(eventName, "\"")); + return Promise.resolve(); + } + this.debug("Listeners found for global promise event \"".concat(eventName, "\": ").concat(listeners.join(', '))); + var promises = []; + listeners.forEach(function (name) { + var plugin = _this4.getPlugin(name); + if (plugin.isFunction()) { + return; + } + if (plugin.isSingleton() && plugin.getInstances().length === 0) { + plugin.initialiseSingleton(); + } + var listenMethod = plugin.callMethod('listens')[eventName]; + + // Call event handler methods for all plugins, if they have a method specified for the event. + plugin.getInstances().forEach(function (instance) { + if (typeof listenMethod === 'function') { + try { + var instancePromise = listenMethod.apply(instance, parameters); + if (instancePromise instanceof Promise === false) { + return; + } + promises.push(instancePromise); + } catch (error) { + _this4.error("Error thrown in \"".concat(eventName, "\" event by \"").concat(name, "\" plugin."), error); + } + } else if (typeof listenMethod === 'string') { + if (!instance[listenMethod]) { + throw new Error("Missing \"".concat(listenMethod, "\" method in \"").concat(name, "\" plugin")); + } + try { + var _instancePromise = instance[listenMethod].apply(instance, parameters); + if (_instancePromise instanceof Promise === false) { + return; + } + promises.push(_instancePromise); + } catch (error) { + _this4.error("Error thrown in \"".concat(eventName, "\" promise event by \"").concat(name, "\" plugin."), error); + } + } else { + _this4.error("Listen method for \"".concat(eventName, "\" event in \"").concat(name, "\" plugin is not a function or string.")); + } + }); + }); + + // Find ad-hoc listeners listening to this event. + if (this.listeners[eventName] && this.listeners[eventName].length > 0) { + this.debug("Found ".concat(this.listeners[eventName].length, " ad-hoc listener(s) for global promise event \"").concat(eventName, "\"")); + this.listeners[eventName].forEach(function (listener) { + try { + var listenerPromise = listener.apply(void 0, parameters); + if (listenerPromise instanceof Promise === false) { + return; + } + promises.push(listenerPromise); + } catch (error) { + _this4.error("Error thrown in \"".concat(eventName, "\" promise event by an ad-hoc listener."), error); + } + }); + } + if (promises.length === 0) { + return Promise.resolve(); + } + return Promise.all(promises); + } + + /** + * Log a styled message in the console. + * + * Includes parameters and a stack trace. + * + * @returns {void} + */ + }, { + key: "logMessage", + value: function logMessage(color, bold, message) { + /* eslint-disable */ + console.groupCollapsed('%c[Snowboard]', "color: ".concat(color, "; font-weight: ").concat(bold ? 'bold' : 'normal', ";"), message); + for (var _len3 = arguments.length, parameters = new Array(_len3 > 3 ? _len3 - 3 : 0), _key3 = 3; _key3 < _len3; _key3++) { + parameters[_key3 - 3] = arguments[_key3]; + } + if (parameters.length) { + console.groupCollapsed("%cParameters %c(".concat(parameters.length, ")"), 'color: rgb(45, 167, 199); font-weight: bold;', 'color: rgb(88, 88, 88); font-weight: normal;'); + var index = 0; + parameters.forEach(function (param) { + index += 1; + console.log("%c".concat(index, ":"), 'color: rgb(88, 88, 88); font-weight: normal;', param); + }); + console.groupEnd(); + console.groupCollapsed('%cTrace', 'color: rgb(45, 167, 199); font-weight: bold;'); + console.trace(); + console.groupEnd(); + } else { + console.trace(); + } + console.groupEnd(); + /* eslint-enable */ + } + + /** + * Log a message. + * + * @returns {void} + */ + }, { + key: "log", + value: function log(message) { + for (var _len4 = arguments.length, parameters = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + parameters[_key4 - 1] = arguments[_key4]; + } + this.logMessage.apply(this, ['rgb(45, 167, 199)', false, message].concat(parameters)); + } + + /** + * Log a debug message. + * + * These messages are only shown when debugging is enabled. + * + * @returns {void} + */ + }, { + key: "debug", + value: function debug(message) { + if (!this.debugEnabled) { + return; + } + for (var _len5 = arguments.length, parameters = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { + parameters[_key5 - 1] = arguments[_key5]; + } + this.logMessage.apply(this, ['rgb(45, 167, 199)', false, message].concat(parameters)); + } + + /** + * Logs an error message. + * + * @returns {void} + */ + }, { + key: "error", + value: function error(message) { + for (var _len6 = arguments.length, parameters = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + parameters[_key6 - 1] = arguments[_key6]; + } + this.logMessage.apply(this, ['rgb(229, 35, 35)', true, message].concat(parameters)); + } + }]); +}(); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/Cookie.js": +/*!********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/Cookie.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Cookie) +/* harmony export */ }); +/* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! js-cookie */ "../../node_modules/js-cookie/dist/js.cookie.mjs"); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + + +/** + * Cookie utility. + * + * This utility is a thin wrapper around the "js-cookie" library. + * + * @see https://github.com/js-cookie/js-cookie + * @copyright 2021 Winter. + * @author Ben Thomson + */ +var Cookie = /*#__PURE__*/function (_Singleton) { + function Cookie() { + _classCallCheck(this, Cookie); + return _callSuper(this, Cookie, arguments); + } + _inherits(Cookie, _Singleton); + return _createClass(Cookie, [{ + key: "construct", + value: function construct() { + this.defaults = { + expires: null, + path: '/', + domain: null, + secure: false, + sameSite: 'Lax' + }; + } + + /** + * Set the default cookie parameters for all subsequent "set" and "remove" calls. + * + * @param {Object} options + */ + }, { + key: "setDefaults", + value: function setDefaults(options) { + var _this = this; + if (_typeof(options) !== 'object') { + throw new Error('Cookie defaults must be provided as an object'); + } + Object.entries(options).forEach(function (entry) { + var _entry = _slicedToArray(entry, 2), + key = _entry[0], + value = _entry[1]; + if (_this.defaults[key] !== undefined) { + _this.defaults[key] = value; + } + }); + } + + /** + * Get the current default cookie parameters. + * + * @returns {Object} + */ + }, { + key: "getDefaults", + value: function getDefaults() { + var _this2 = this; + var defaults = {}; + Object.entries(this.defaults).forEach(function (entry) { + var _entry2 = _slicedToArray(entry, 2), + key = _entry2[0], + value = _entry2[1]; + if (_this2.defaults[key] !== null) { + defaults[key] = value; + } + }); + return defaults; + } + + /** + * Get a cookie by name. + * + * If `name` is undefined, returns all cookies as an Object. + * + * @param {String} name + * @returns {Object|String} + */ + }, { + key: "get", + value: function get(name) { + var _this3 = this; + if (name === undefined) { + var cookies = js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].get(); + Object.entries(cookies).forEach(function (entry) { + var _entry3 = _slicedToArray(entry, 2), + cookieName = _entry3[0], + cookieValue = _entry3[1]; + _this3.snowboard.globalEvent('cookie.get', cookieName, cookieValue, function (newValue) { + cookies[cookieName] = newValue; + }); + }); + return cookies; + } + var value = js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].get(name); + + // Allow plugins to override the gotten value + this.snowboard.globalEvent('cookie.get', name, value, function (newValue) { + value = newValue; + }); + return value; + } + + /** + * Set a cookie by name. + * + * You can specify additional cookie parameters through the "options" parameter. + * + * @param {String} name + * @param {String} value + * @param {Object} options + * @returns {String} + */ + }, { + key: "set", + value: function set(name, value, options) { + var saveValue = value; + + // Allow plugins to override the value to save + this.snowboard.globalEvent('cookie.set', name, value, function (newValue) { + saveValue = newValue; + }); + return js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].set(name, saveValue, _objectSpread(_objectSpread({}, this.getDefaults()), options)); + } + + /** + * Remove a cookie by name. + * + * You can specify the additional cookie parameters via the "options" parameter. + * + * @param {String} name + * @param {Object} options + * @returns {void} + */ + }, { + key: "remove", + value: function remove(name, options) { + js_cookie__WEBPACK_IMPORTED_MODULE_0__["default"].remove(name, _objectSpread(_objectSpread({}, this.getDefaults()), options)); + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_1__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/JsonParser.js": +/*!************************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/JsonParser.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ JsonParser) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * JSON Parser utility. + * + * This utility parses JSON-like data that does not strictly meet the JSON specifications in order to simplify development. + * It is a safe replacement for JSON.parse(JSON.stringify(eval("({" + value + "})"))) that does not require the use of eval() + * + * @author Ayumi Hamasaki + * @author Ben Thomson + * @see https://github.com/octobercms/october/pull/4527 + */ +var JsonParser = /*#__PURE__*/function (_Singleton) { + function JsonParser() { + _classCallCheck(this, JsonParser); + return _callSuper(this, JsonParser, arguments); + } + _inherits(JsonParser, _Singleton); + return _createClass(JsonParser, [{ + key: "construct", + value: function construct() { + var _this = this; + // Add to global function for backwards compatibility + window.wnJSON = function (json) { + return _this.parse(json); + }; + window.ocJSON = window.wnJSON; + } + }, { + key: "parse", + value: function parse(str) { + var jsonString = this.parseString(str); + return JSON.parse(jsonString); + } + }, { + key: "parseString", + value: function parseString(value) { + var str = value.trim(); + if (!str.length) { + throw new Error('Broken JSON object.'); + } + var result = ''; + var type = null; + var key = null; + var body = ''; + + /* + * the mistake ',' + */ + while (str && str[0] === ',') { + str = str.substr(1); + } + + /* + * string + */ + if (str[0] === '"' || str[0] === '\'') { + if (str[str.length - 1] !== str[0]) { + throw new Error('Invalid string JSON object.'); + } + body = '"'; + for (var i = 1; i < str.length; i += 1) { + if (str[i] === '\\') { + if (str[i + 1] === '\'') { + body += str[i + 1]; + } else { + body += str[i]; + body += str[i + 1]; + } + i += 1; + } else if (str[i] === str[0]) { + body += '"'; + return body; + } else if (str[i] === '"') { + body += '\\"'; + } else { + body += str[i]; + } + } + throw new Error('Invalid string JSON object.'); + } + + /* + * boolean + */ + if (str === 'true' || str === 'false') { + return str; + } + + /* + * null + */ + if (str === 'null') { + return 'null'; + } + + /* + * number + */ + var num = Number(str); + if (!Number.isNaN(num)) { + return num.toString(); + } + + /* + * object + */ + if (str[0] === '{') { + type = 'needKey'; + key = null; + result = '{'; + for (var _i = 1; _i < str.length; _i += 1) { + if (this.isBlankChar(str[_i])) { + /* eslint-disable-next-line */ + continue; + } + if (type === 'needKey' && (str[_i] === '"' || str[_i] === '\'')) { + key = this.parseKey(str, _i + 1, str[_i]); + result += "\"".concat(key, "\""); + _i += key.length; + _i += 1; + type = 'afterKey'; + } else if (type === 'needKey' && this.canBeKeyHead(str[_i])) { + key = this.parseKey(str, _i); + result += '"'; + result += key; + result += '"'; + _i += key.length - 1; + type = 'afterKey'; + } else if (type === 'afterKey' && str[_i] === ':') { + result += ':'; + type = ':'; + } else if (type === ':') { + body = this.getBody(str, _i); + _i = _i + body.originLength - 1; + result += this.parseString(body.body); + type = 'afterBody'; + } else if (type === 'afterBody' || type === 'needKey') { + var last = _i; + while (str[last] === ',' || this.isBlankChar(str[last])) { + last += 1; + } + if (str[last] === '}' && last === str.length - 1) { + while (result[result.length - 1] === ',') { + result = result.substr(0, result.length - 1); + } + result += '}'; + return result; + } + if (last !== _i && result !== '{') { + result += ','; + type = 'needKey'; + _i = last - 1; + } + } + } + throw new Error("Broken JSON object near ".concat(result)); + } + + /* + * array + */ + if (str[0] === '[') { + result = '['; + type = 'needBody'; + for (var _i2 = 1; _i2 < str.length; _i2 += 1) { + if (str[_i2] === ' ' || str[_i2] === '\n' || str[_i2] === '\t') { + /* eslint-disable-next-line */ + continue; + } else if (type === 'needBody') { + if (str[_i2] === ',') { + result += 'null,'; + /* eslint-disable-next-line */ + continue; + } + if (str[_i2] === ']' && _i2 === str.length - 1) { + if (result[result.length - 1] === ',') { + result = result.substr(0, result.length - 1); + } + result += ']'; + return result; + } + body = this.getBody(str, _i2); + _i2 = _i2 + body.originLength - 1; + result += this.parseString(body.body); + type = 'afterBody'; + } else if (type === 'afterBody') { + if (str[_i2] === ',') { + result += ','; + type = 'needBody'; + + // deal with mistake "," + while (str[_i2 + 1] === ',' || this.isBlankChar(str[_i2 + 1])) { + if (str[_i2 + 1] === ',') { + result += 'null,'; + } + _i2 += 1; + } + } else if (str[_i2] === ']' && _i2 === str.length - 1) { + result += ']'; + return result; + } + } + } + throw new Error("Broken JSON array near ".concat(result)); + } + return ''; + } + }, { + key: "getBody", + value: function getBody(str, pos) { + var body = ''; + + // parse string body + if (str[pos] === '"' || str[pos] === '\'') { + body = str[pos]; + for (var i = pos + 1; i < str.length; i += 1) { + if (str[i] === '\\') { + body += str[i]; + if (i + 1 < str.length) { + body += str[i + 1]; + } + i += 1; + } else if (str[i] === str[pos]) { + body += str[pos]; + return { + originLength: body.length, + body: body + }; + } else { + body += str[i]; + } + } + throw new Error("Broken JSON string body near ".concat(body)); + } + + // parse true / false + if (str[pos] === 't') { + if (str.indexOf('true', pos) === pos) { + return { + originLength: 'true'.length, + body: 'true' + }; + } + throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); + } + if (str[pos] === 'f') { + if (str.indexOf('f', pos) === pos) { + return { + originLength: 'false'.length, + body: 'false' + }; + } + throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); + } + + // parse null + if (str[pos] === 'n') { + if (str.indexOf('null', pos) === pos) { + return { + originLength: 'null'.length, + body: 'null' + }; + } + throw new Error("Broken JSON boolean body near ".concat(str.substr(0, pos + 10))); + } + + // parse number + if (str[pos] === '-' || str[pos] === '+' || str[pos] === '.' || str[pos] >= '0' && str[pos] <= '9') { + body = ''; + for (var _i3 = pos; _i3 < str.length; _i3 += 1) { + if (str[_i3] === '-' || str[_i3] === '+' || str[_i3] === '.' || str[_i3] >= '0' && str[_i3] <= '9') { + body += str[_i3]; + } else { + return { + originLength: body.length, + body: body + }; + } + } + throw new Error("Broken JSON number body near ".concat(body)); + } + + // parse object + if (str[pos] === '{' || str[pos] === '[') { + var stack = [str[pos]]; + body = str[pos]; + for (var _i4 = pos + 1; _i4 < str.length; _i4 += 1) { + body += str[_i4]; + if (str[_i4] === '\\') { + if (_i4 + 1 < str.length) { + body += str[_i4 + 1]; + } + _i4 += 1; + } else if (str[_i4] === '"') { + if (stack[stack.length - 1] === '"') { + stack.pop(); + } else if (stack[stack.length - 1] !== '\'') { + stack.push(str[_i4]); + } + } else if (str[_i4] === '\'') { + if (stack[stack.length - 1] === '\'') { + stack.pop(); + } else if (stack[stack.length - 1] !== '"') { + stack.push(str[_i4]); + } + } else if (stack[stack.length - 1] !== '"' && stack[stack.length - 1] !== '\'') { + if (str[_i4] === '{') { + stack.push('{'); + } else if (str[_i4] === '}') { + if (stack[stack.length - 1] === '{') { + stack.pop(); + } else { + throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); + } + } else if (str[_i4] === '[') { + stack.push('['); + } else if (str[_i4] === ']') { + if (stack[stack.length - 1] === '[') { + stack.pop(); + } else { + throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); + } + } + } + if (!stack.length) { + return { + originLength: _i4 - pos, + body: body + }; + } + } + throw new Error("Broken JSON ".concat(str[pos] === '{' ? 'object' : 'array', " body near ").concat(body)); + } + throw new Error("Broken JSON body near ".concat(str.substr(pos - 5 >= 0 ? pos - 5 : 0, 50))); + } + }, { + key: "parseKey", + value: function parseKey(str, pos, quote) { + var key = ''; + for (var i = pos; i < str.length; i += 1) { + if (quote && quote === str[i]) { + return key; + } + if (!quote && (str[i] === ' ' || str[i] === ':')) { + return key; + } + key += str[i]; + if (str[i] === '\\' && i + 1 < str.length) { + key += str[i + 1]; + i += 1; + } + } + throw new Error("Broken JSON syntax near ".concat(key)); + } + }, { + key: "canBeKeyHead", + value: function canBeKeyHead(ch) { + if (ch[0] === '\\') { + return false; + } + if (ch[0] >= 'a' && ch[0] <= 'z' || ch[0] >= 'A' && ch[0] <= 'Z' || ch[0] === '_') { + return true; + } + if (ch[0] >= '0' && ch[0] <= '9') { + return true; + } + if (ch[0] === '$') { + return true; + } + if (ch.charCodeAt(0) > 255) { + return true; + } + return false; + } + }, { + key: "isBlankChar", + value: function isBlankChar(ch) { + return ch === ' ' || ch === '\n' || ch === '\t'; + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/Sanitizer.js": +/*!***********************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/Sanitizer.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Sanitizer) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * Sanitizer utility. + * + * Client-side HTML sanitizer designed mostly to prevent self-XSS attacks. + * The sanitizer utility will strip all attributes that start with `on` (usually JS event handlers as attributes, i.e. `onload` or `onerror`) or contain the `javascript:` pseudo protocol in their values. + * + * @author Ben Thomson + */ +var Sanitizer = /*#__PURE__*/function (_Singleton) { + function Sanitizer() { + _classCallCheck(this, Sanitizer); + return _callSuper(this, Sanitizer, arguments); + } + _inherits(Sanitizer, _Singleton); + return _createClass(Sanitizer, [{ + key: "construct", + value: function construct() { + var _this = this; + // Add to global function for backwards compatibility + window.wnSanitize = function (html) { + return _this.sanitize(html); + }; + window.ocSanitize = window.wnSanitize; + } + }, { + key: "sanitize", + value: function sanitize(html, bodyOnly) { + var parser = new DOMParser(); + var dom = parser.parseFromString(html, 'text/html'); + var returnBodyOnly = bodyOnly !== undefined && typeof bodyOnly === 'boolean' ? bodyOnly : true; + this.sanitizeNode(dom.getRootNode()); + return returnBodyOnly ? dom.body.innerHTML : dom.innerHTML; + } + }, { + key: "sanitizeNode", + value: function sanitizeNode(node) { + var _this2 = this; + if (node.tagName === 'SCRIPT') { + node.remove(); + return; + } + this.trimAttributes(node); + var children = Array.from(node.children); + children.forEach(function (child) { + _this2.sanitizeNode(child); + }); + } + }, { + key: "trimAttributes", + value: function trimAttributes(node) { + if (!node.attributes) { + return; + } + for (var i = 0; i < node.attributes.length; i += 1) { + var attrName = node.attributes.item(i).name; + var attrValue = node.attributes.item(i).value; + + /* + * remove attributes where the names start with "on" (for example: onload, onerror...) + * remove attributes where the value starts with the "javascript:" pseudo protocol (for example href="javascript:alert(1)") + */ + /* eslint-disable-next-line */ + if (attrName.indexOf('on') === 0 || attrValue.indexOf('javascript:') === 0) { + node.removeAttribute(attrName); + } + } + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "../../modules/system/assets/js/snowboard/utilities/Url.js": +/*!*****************************************************************!*\ + !*** ../../modules/system/assets/js/snowboard/utilities/Url.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Url) +/* harmony export */ }); +/* harmony import */ var _abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../abstracts/Singleton */ "../../modules/system/assets/js/snowboard/abstracts/Singleton.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + +/** + * URL utility. + * + * This utility provides URL functions. + * + * @copyright 2022 Winter. + * @author Ben Thomson + */ +var Url = /*#__PURE__*/function (_Singleton) { + function Url() { + _classCallCheck(this, Url); + return _callSuper(this, Url, arguments); + } + _inherits(Url, _Singleton); + return _createClass(Url, [{ + key: "construct", + value: function construct() { + this.foundBaseUrl = null; + this.foundAssetUrl = null; + this.baseUrl(); + this.assetUrl(); + } + + /** + * Gets a URL based on a relative path. + * + * If an absolute URL is provided, it will be returned unchanged. + * + * @param {string} url + * @returns {string} + */ + }, { + key: "to", + value: function to(url) { + var urlRegex = /^(?:[^:]+:\/\/)[-a-z0-9@:%._+~#=]{1,256}\b([-a-z0-9()@:%_+.~#?&//=]*)/i; + if (url.match(urlRegex)) { + return url; + } + var theUrl = url.replace(/^\/+/, ''); + return "".concat(this.baseUrl()).concat(theUrl); + } + + /** + * Gets an Asset URL based on a relative path. + * + * If an absolute URL is provided, it will be returned unchanged. + * + * @param {string} url + * @returns {string} + */ + }, { + key: "asset", + value: function asset(url) { + var urlRegex = /^(?:[^:]+:\/\/)[-a-z0-9@:%._+~#=]{1,256}\b([-a-z0-9()@:%_+.~#?&//=]*)/i; + if (url.match(urlRegex)) { + return url; + } + var theUrl = url.replace(/^\/+/, ''); + return "".concat(this.assetUrl()).concat(theUrl); + } + + /** + * Helper method to get the base URL of this install. + * + * This determines the base URL from three sources, in order: + * - If Snowboard is loaded via the `{% snowboard %}` tag, it will retrieve the base URL that + * is automatically included there. + * - If a `` tag is available, it will use the URL specified in the base tag. + * - Finally, it will take a guess from the current location. This will likely not work for sites + * that reside in subdirectories. + * + * The base URL will always contain a trailing backslash. + * + * @returns {string} + */ + }, { + key: "baseUrl", + value: function baseUrl() { + if (this.foundBaseUrl !== null) { + return this.foundBaseUrl; + } + if (document.querySelector('script[data-module="snowboard-base"]') !== null) { + this.foundBaseUrl = this.validateBaseUrl(document.querySelector('script[data-module="snowboard-base"]').dataset.baseUrl); + return this.foundBaseUrl; + } + if (document.querySelector('base') !== null) { + this.foundBaseUrl = this.validateBaseUrl(document.querySelector('base').getAttribute('href')); + return this.foundBaseUrl; + } + var urlParts = [window.location.protocol, '//', window.location.host, '/']; + this.foundBaseUrl = urlParts.join(''); + return this.foundBaseUrl; + } + + /** + * Helper method to get the asset URL of this install. + * + * This determines the base URL from three sources, in order: + * - If Snowboard is loaded via the `{% snowboard %}` tag, it will retrieve the asset URL that + * is automatically included there. + * - If a `` tag is available, it will use the URL specified in the link tag. + * - Finally, it will take a guess from the current location. This will likely not work for sites + * that reside in subdirectories. + * + * The asset URL will always contain a trailing backslash. + * + * @returns {string} + */ + }, { + key: "assetUrl", + value: function assetUrl() { + if (this.foundAssetUrl !== null) { + return this.foundAssetUrl; + } + if (document.querySelector('script[data-module="snowboard-base"]') !== null) { + this.foundAssetUrl = this.validateBaseUrl(document.querySelector('script[data-module="snowboard-base"]').dataset.assetUrl); + return this.foundAssetUrl; + } + if (document.querySelector('link[rel="asset_url"]') !== null) { + this.foundAssetUrl = this.validateBaseUrl(document.querySelector('link[rel="asset_url"]').getAttribute('href')); + return this.foundAssetUrl; + } + var urlParts = [window.location.protocol, '//', window.location.host, '/']; + this.foundAssetUrl = urlParts.join(''); + return this.foundAssetUrl; + } + + /** + * Validates the base URL, ensuring it is a HTTP/HTTPs URL. + * + * If the Snowboard script or tag on the page use a different type of URL, this will fail with + * an error. + * + * @param {string} url + * @returns {string} + */ + }, { + key: "validateBaseUrl", + value: function validateBaseUrl(url) { + var urlRegex = /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/i; + var urlParts = urlRegex.exec(url); + var protocol = urlParts[2]; + var domain = urlParts[4]; + if (protocol && ['http', 'https'].indexOf(protocol.toLowerCase()) === -1) { + throw new Error('Invalid base URL detected'); + } + if (!domain) { + throw new Error('Invalid base URL detected'); + } + return url.substr(-1) === '/' ? url : "".concat(url, "/"); + } + }]); +}(_abstracts_Singleton__WEBPACK_IMPORTED_MODULE_0__["default"]); + + +/***/ }), + +/***/ "./assets/js/src/theme.js": +/*!********************************!*\ + !*** ./assets/js/src/theme.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_system_assets_js_snowboard_main_Snowboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/main/Snowboard */ "../../modules/system/assets/js/snowboard/main/Snowboard.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_main_ProxyHandler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/main/ProxyHandler */ "../../modules/system/assets/js/snowboard/main/ProxyHandler.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_ajax_Request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/ajax/Request */ "../../modules/system/assets/js/snowboard/ajax/Request.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_ajax_handlers_AttributeRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest */ "../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_AssetLoader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/AssetLoader */ "../../modules/system/assets/js/snowboard/extras/AssetLoader.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_DataConfig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/DataConfig */ "../../modules/system/assets/js/snowboard/extras/DataConfig.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_StylesheetLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/StylesheetLoader */ "../../modules/system/assets/js/snowboard/extras/StylesheetLoader.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Transition */ "../../modules/system/assets/js/snowboard/extras/Transition.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_Flash__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Flash */ "../../modules/system/assets/js/snowboard/extras/Flash.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_FlashListener__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/FlashListener */ "../../modules/system/assets/js/snowboard/extras/FlashListener.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_FormValidation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/FormValidation */ "../../modules/system/assets/js/snowboard/extras/FormValidation.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_AttachLoading__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/AttachLoading */ "../../modules/system/assets/js/snowboard/extras/AttachLoading.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_StripeLoader__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/StripeLoader */ "../../modules/system/assets/js/snowboard/extras/StripeLoader.js"); +/* harmony import */ var _modules_system_assets_js_snowboard_extras_Trigger__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../../../modules/system/assets/js/snowboard/extras/Trigger */ "../../modules/system/assets/js/snowboard/extras/Trigger.js"); +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } + + + + + + + + + + + + + + +(function (window) { + var snowboard = new Proxy(new _modules_system_assets_js_snowboard_main_Snowboard__WEBPACK_IMPORTED_MODULE_0__["default"](true, true), _modules_system_assets_js_snowboard_main_ProxyHandler__WEBPACK_IMPORTED_MODULE_1__["default"]); + + // Cover all aliases + window.snowboard = snowboard; + window.Snowboard = snowboard; + window.SnowBoard = snowboard; + snowboard.addPlugin('request', _modules_system_assets_js_snowboard_ajax_Request__WEBPACK_IMPORTED_MODULE_2__["default"]); + snowboard.addPlugin('attributeRequest', _modules_system_assets_js_snowboard_ajax_handlers_AttributeRequest__WEBPACK_IMPORTED_MODULE_3__["default"]); + snowboard.addPlugin('assetLoader', _modules_system_assets_js_snowboard_extras_AssetLoader__WEBPACK_IMPORTED_MODULE_4__["default"]); + snowboard.addPlugin('dataConfig', _modules_system_assets_js_snowboard_extras_DataConfig__WEBPACK_IMPORTED_MODULE_5__["default"]); + snowboard.addPlugin('extrasStyles', _modules_system_assets_js_snowboard_extras_StylesheetLoader__WEBPACK_IMPORTED_MODULE_6__["default"]); + snowboard.addPlugin('transition', _modules_system_assets_js_snowboard_extras_Transition__WEBPACK_IMPORTED_MODULE_7__["default"]); + snowboard.addPlugin('flash', _modules_system_assets_js_snowboard_extras_Flash__WEBPACK_IMPORTED_MODULE_8__["default"]); + snowboard.addPlugin('flashListener', _modules_system_assets_js_snowboard_extras_FlashListener__WEBPACK_IMPORTED_MODULE_9__["default"]); + snowboard.addPlugin('formValidation', _modules_system_assets_js_snowboard_extras_FormValidation__WEBPACK_IMPORTED_MODULE_10__["default"]); + snowboard.addPlugin('attachLoading', _modules_system_assets_js_snowboard_extras_AttachLoading__WEBPACK_IMPORTED_MODULE_11__["default"]); + snowboard.addPlugin('stripeLoader', _modules_system_assets_js_snowboard_extras_StripeLoader__WEBPACK_IMPORTED_MODULE_12__["default"]); + snowboard.addPlugin('trigger', _modules_system_assets_js_snowboard_extras_Trigger__WEBPACK_IMPORTED_MODULE_13__["default"]); + snowboard.on('ready', function () { + // Scan for triggers + Array.from(document.querySelectorAll('*')).filter(function (element) { + return _toConsumableArray(element.attributes).filter(function (_ref) { + var name = _ref.name; + return name.startsWith("data-trigger-"); + }).length > 0; + }).forEach(function (element) { + snowboard.trigger(element); + }); + }); +})(window); + +/***/ }), + +/***/ "./assets/css/base.css": +/*!*****************************!*\ + !*** ./assets/css/base.css ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +// extracted by mini-css-extract-plugin + + +/***/ }), + +/***/ "../../node_modules/js-cookie/dist/js.cookie.mjs": +/*!*******************************************************!*\ + !*** ../../node_modules/js-cookie/dist/js.cookie.mjs ***! + \*******************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ api) +/* harmony export */ }); +/*! js-cookie v3.0.5 | MIT */ +/* eslint-disable no-var */ +function assign (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + target[key] = source[key]; + } + } + return target +} +/* eslint-enable no-var */ + +/* eslint-disable no-var */ +var defaultConverter = { + read: function (value) { + if (value[0] === '"') { + value = value.slice(1, -1); + } + return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent) + }, + write: function (value) { + return encodeURIComponent(value).replace( + /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, + decodeURIComponent + ) + } +}; +/* eslint-enable no-var */ + +/* eslint-disable no-var */ + +function init (converter, defaultAttributes) { + function set (name, value, attributes) { + if (typeof document === 'undefined') { + return + } + + attributes = assign({}, defaultAttributes, attributes); + + if (typeof attributes.expires === 'number') { + attributes.expires = new Date(Date.now() + attributes.expires * 864e5); + } + if (attributes.expires) { + attributes.expires = attributes.expires.toUTCString(); + } + + name = encodeURIComponent(name) + .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) + .replace(/[()]/g, escape); + + var stringifiedAttributes = ''; + for (var attributeName in attributes) { + if (!attributes[attributeName]) { + continue + } + + stringifiedAttributes += '; ' + attributeName; + + if (attributes[attributeName] === true) { + continue + } + + // Considers RFC 6265 section 5.2: + // ... + // 3. If the remaining unparsed-attributes contains a %x3B (";") + // character: + // Consume the characters of the unparsed-attributes up to, + // not including, the first %x3B (";") character. + // ... + stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; + } + + return (document.cookie = + name + '=' + converter.write(value, name) + stringifiedAttributes) + } + + function get (name) { + if (typeof document === 'undefined' || (arguments.length && !name)) { + return + } + + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. + var cookies = document.cookie ? document.cookie.split('; ') : []; + var jar = {}; + for (var i = 0; i < cookies.length; i++) { + var parts = cookies[i].split('='); + var value = parts.slice(1).join('='); + + try { + var found = decodeURIComponent(parts[0]); + jar[found] = converter.read(value, found); + + if (name === found) { + break + } + } catch (e) {} + } + + return name ? jar[name] : jar + } + + return Object.create( + { + set, + get, + remove: function (name, attributes) { + set( + name, + '', + assign({}, attributes, { + expires: -1 + }) + ); + }, + withAttributes: function (attributes) { + return init(this.converter, assign({}, this.attributes, attributes)) + }, + withConverter: function (converter) { + return init(assign({}, this.converter, converter), this.attributes) + } + }, + { + attributes: { value: Object.freeze(defaultAttributes) }, + converter: { value: Object.freeze(converter) } + } + ) +} + +var api = init(defaultConverter, { path: '/' }); +/* eslint-enable no-var */ + + + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "/assets/js/theme": 0, +/******/ "assets/css/theme": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkwintercms_workshop_theme"] = self["webpackChunkwintercms_workshop_theme"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ __webpack_require__.O(undefined, ["assets/css/theme"], () => (__webpack_require__("./assets/js/src/theme.js"))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["assets/css/theme"], () => (__webpack_require__("./assets/css/base.css"))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLE1BQU0scUJBQXFCO1dBQzNCO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTtXQUNBOzs7OztVRWpEQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvUGx1Z2luQmFzZS5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hYnN0cmFjdHMvU2luZ2xldG9uLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9hamF4L2hhbmRsZXJzL0F0dHJpYnV0ZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Fzc2V0TG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9BdHRhY2hMb2FkaW5nLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9EYXRhQ29uZmlnLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9GbGFzaC5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRmxhc2hMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRm9ybVZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1N0cmlwZUxvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvU3R5bGVzaGVldExvYWRlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL0lubmVyUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUGx1Z2luTG9hZGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vUHJveHlIYW5kbGVyLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL3V0aWxpdGllcy9Db29raWUuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL0pzb25QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvdXRpbGl0aWVzL1Nhbml0aXplci5qcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC91dGlsaXRpZXMvVXJsLmpzIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS8uL2Fzc2V0cy9qcy9zcmMvdGhlbWUuanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lLy4vYXNzZXRzL2Nzcy9iYXNlLmNzcyIsIndlYnBhY2s6Ly93aW50ZXJjbXMtd29ya3Nob3AtdGhlbWUvLi4vLi4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5tanMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvY2h1bmsgbG9hZGVkIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL3dpbnRlcmNtcy13b3Jrc2hvcC10aGVtZS93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vd2ludGVyY21zLXdvcmtzaG9wLXRoZW1lL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBsdWdpbiBiYXNlIGFic3RyYWN0LlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIHBsdWdpbnMuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIHRoZSBTbm93Ym9hcmQgZnJhbWV3b3JrIGluc3RhbmNlLCBhbmQgc2hvdWxkIG5vdCBiZSBvdmVyd3JpdHRlblxuICAgICAqIHVubGVzcyB5b3UgYWJzb2x1dGVseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTbm93Ym9hcmR9IHNub3dib2FyZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNub3dib2FyZCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZCA9IHNub3dib2FyZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVnaW4gY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdHJlYXRlZCBhcyB0aGUgdHJ1ZSBjb25zdHJ1Y3RvciBvZiBhIHBsdWdpbiwgYW5kIGNhbiBiZSBvdmVyd3JpdHRlbi5cbiAgICAgKiBJdCB3aWxsIGJlIGNhbGxlZCBzdHJhaWdodCBhZnRlciBjb25zdHJ1Y3Rpb24uXG4gICAgICovXG4gICAgY29uc3RydWN0KCkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHJlcXVpcmVkIHBsdWdpbnMgZm9yIHRoaXMgc3BlY2lmaWMgbW9kdWxlIHRvIHdvcmsuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFuIGFycmF5IG9mIHBsdWdpbnMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kdWxlIHRvIHdvcmssIGFzIHN0cmluZ3MuXG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgbGlzdGVuZXIgbWV0aG9kcyBmb3IgZ2xvYmFsIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsdWdpbiBkZXN0cnVjdG9yLlxuICAgICAqXG4gICAgICogRmlyZWQgd2hlbiB0aGlzIHBsdWdpbiBpcyByZW1vdmVkLiBDYW4gYmUgbWFudWFsbHkgY2FsbGVkIGlmIHlvdSBoYXZlIGFub3RoZXIgc2NlbmFyaW8gZm9yXG4gICAgICogZGVzdHJ1Y3Rpb24sIGllLiB0aGUgZWxlbWVudCBhdHRhY2hlZCB0byB0aGUgcGx1Z2luIGlzIHJlbW92ZWQgb3IgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5kZXRhY2goKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc25vd2JvYXJkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsdWdpbiBkZXN0cnVjdG9yIChvbGQgbWV0aG9kIG5hbWUpLlxuICAgICAqXG4gICAgICogQWxsb3dzIHByZXZpb3VzIHVzYWdlIG9mIHRoZSBcImRlc3RydWN0b3JcIiBtZXRob2QgdG8gc3RpbGwgd29yay5cbiAgICAgKi9cbiAgICBkZXN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBTaW5nbGV0b24gcGx1Z2luIGFic3RyYWN0LlxuICpcbiAqIFRoaXMgaXMgYSBzcGVjaWFsIGRlZmluaXRpb24gY2xhc3MgdGhhdCB0aGUgU25vd2JvYXJkIGZyYW1ld29yayB3aWxsIHVzZSB0byBpbnRlcnByZXQgdGhlIGN1cnJlbnQgcGx1Z2luIGFzIGFcbiAqIFwic2luZ2xldG9uXCIuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luIGNsYXNzIGlzIHVzZWQgYWNyb3NzIHRoZSBib2FyZC5cbiAqXG4gKiBTaW5nbGV0b25zIGFyZSBpbml0aWFsaXNlZCBvbiB0aGUgXCJkb21SZWFkeVwiIGV2ZW50IGJ5IGRlZmF1bHQuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbmdsZXRvbiBleHRlbmRzIFBsdWdpbkJhc2Uge1xufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFJlcXVlc3QgcGx1Z2luLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgQUpBWCBoYW5kbGVyIHdoaWNoIHdpbGwgcnVuIHVzaW5nIHRoZSBgZmV0Y2goKWAgbWV0aG9kIHRoYXQgaXMgZGVmYXVsdCBpbiBtb2Rlcm4gYnJvd3NlcnMuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcXVlc3QgZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIDIgb3IgMyBwYXJhbWV0ZXJzLlxuICAgICAqXG4gICAgICogSWYgMiBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgaGFuZGxlciBuYW1lIGFuZCB0aGUgc2Vjb25kXG4gICAgICogcGFyYW1ldGVyIGlzIHRoZSBvcHRpb25zLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGlzIGlzIGEgZGV0YWNoZWQgQUpBWCByZXF1ZXN0IG5vdCBjb25uZWN0ZWQgdG9cbiAgICAgKiBhbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgMyBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhbiBlbGVtZW50IG9yIGEgc2VsZWN0b3IsIGFuZCB0aGUgc2Vjb25kXG4gICAgICogYW5kIHRoaXJkIHBhcmFtZXRlcnMgYXJlIHRoZSBoYW5kbGVyIGFuZCBvcHRpb25zLCByZXNwZWN0aXZlbHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fHN0cmluZ30gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gaGFuZGxlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0KGVsZW1lbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gQWxsb3cgdGhlIGVsZW1lbnQgdG8gYmUgYSBoYW5kbGVyIG5hbWUuXG4gICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhlIHJlcXVlc3QgaXMgYmVpbmcgbWFkZSBhZ2FpbnN0IG5vIGVsZW1lbnQsIGFuZCB0aGUgaGFuZGxlciBwYXJhbWV0ZXJcbiAgICAgICAgICAgIC8vIHdpbGwgY29udGFpbiBvcHRpb25zLlxuICAgICAgICAgICAgaWYgKHRoaXMuaXNIYW5kbGVyTmFtZShlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBoYW5kbGVyIHx8IHt9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZWxlbWVudCB3YXMgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0b3I6ICR7ZWxlbWVudH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gbWF0Y2hlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZXRjaE9wdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1ZXN0KCk7XG4gICAgICAgIGlmICghdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhTZXR1cCcsIHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2FqYXhTZXR1cCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGV2ZW50LnJlcXVlc3QgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZG9DbGllbnRWYWxpZGF0aW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpcm0pIHtcbiAgICAgICAgICAgIHRoaXMuZG9Db25maXJtKCkudGhlbigoY29uZmlybWVkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvQWpheCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVXBkYXRlKHJlc3BvbnNlKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuWF9XSU5URVJfU1VDQ0VTUyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRvQWpheCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NVcGRhdGUocmVzcG9uc2UpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX1NVQ0NFU1MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVwZW5kZW5jaWVzIGZvciB0aGlzIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ2Nvb2tpZScsICdqc29uUGFyc2VyJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoZSBlbGVtZW50IGFuZCBoYW5kbGVyIGdpdmVuIGluIHRoZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIGNoZWNrUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZWxlbWVudCBwcm92aWRlZCBtdXN0IGJlIGFuIEVsZW1lbnQgaW5zdGFuY2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQUpBWCBoYW5kbGVyIG5hbWUgaXMgbm90IHNwZWNpZmllZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc0hhbmRsZXJOYW1lKHRoaXMuaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBSkFYIGhhbmRsZXIgbmFtZS4gVGhlIGNvcnJlY3QgaGFuZGxlciBuYW1lIGZvcm1hdCBpczogXCJvbkV2ZW50XCIuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmV0Y2ggcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG1hZGUgYXZhaWxhYmxlIGZvciBwbHVnaW5zIHRvIGV4dGVuZCBvciBvdmVycmlkZSB0aGUgZGVmYXVsdCBmZXRjaCgpIHNldHRpbmdzIHdpdGggdGhlaXIgb3duLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgZ2V0RmV0Y2goKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb25zID0gKHRoaXMub3B0aW9ucy5mZXRjaE9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmZldGNoT3B0aW9ucyA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICA/IHRoaXMub3B0aW9ucy5mZXRjaE9wdGlvbnNcbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiB0aGlzLmRhdGEsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICAgICAgICAgIG1vZGU6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4RmV0Y2hPcHRpb25zJywgdGhpcy5mZXRjaE9wdGlvbnMsIHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBmZXRjaCh0aGlzLnVybCwgdGhpcy5mZXRjaE9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1biBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG9uIHRoZSBmb3JtLCBpZiBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBkb0NsaWVudFZhbGlkYXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnJvd3NlclZhbGlkYXRlID09PSB0cnVlICYmIHRoaXMuZm9ybSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5jaGVja1ZhbGlkaXR5KCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIEFKQVggcXVlcnkuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZm9yIHdoZW4gdGhlIEFKQVggcmVxdWVzdCBpcyBjb21wbGV0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBkb0FqYXgoKSB7XG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIHRoZSBBSkFYIHJlcXVlc3QgYmVmb3JlIHNlbmRpbmdcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4QmVmb3JlU2VuZCcsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgY2FuY2VsbGVkOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhamF4UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RmV0Y2goKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rICYmIHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKS5pbmNsdWRlcygnL2pzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmpzb24oKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VEYXRhLm1lc3NhZ2UgJiYgcmVzcG9uc2VEYXRhLmV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLmV4Y2VwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhLmZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YS5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEudHJhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKGBVbmFibGUgdG8gcGFyc2UgSlNPTiByZXNwb25zZTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZVRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKHJlc3BvbnNlVGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKGBVbmFibGUgdG8gcHJvY2VzcyByZXNwb25zZTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpLmluY2x1ZGVzKCcvanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5qc29uKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzcG9uc2VEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9XSU5URVJfU1VDQ0VTUzogcmVzcG9uc2Uuc3RhdHVzICE9PSA0MDYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYX1dJTlRFUl9SRVNQT05TRV9DT0RFOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlbmRlckVycm9yKGBVbmFibGUgdG8gcGFyc2UgSlNPTiByZXNwb25zZTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS50ZXh0KCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHByb2Nlc3MgcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAocmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5yZW5kZXJFcnJvcihgVW5hYmxlIHRvIHJldHJpZXZlIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyOiAke3Jlc3BvbnNlRXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFN0YXJ0JywgYWpheFByb21pc2UsIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4UHJvbWlzZScpO1xuICAgICAgICAgICAgZXZlbnQucHJvbWlzZSA9IGFqYXhQcm9taXNlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFqYXhQcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGZvciB1cGRhdGluZyB0aGUgcGFydGlhbHMgZnJvbSB0aGUgQUpBWCByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIElmIGFueSBwYXJ0aWFscyBhcmUgcmV0dXJuZWQgZnJvbSB0aGUgQUpBWCByZXNwb25zZSwgdGhpcyBtZXRob2Qgd2lsbCBhbHNvIGFjdGlvbiB0aGUgcGFydGlhbCB1cGRhdGVzLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IHdoaWNoIHRyYWNrcyB3aGVuIHRoZSBwYXJ0aWFsIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHByb2Nlc3NVcGRhdGUocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlLmFwcGx5KHRoaXMsIFtyZXNwb25zZV0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEV4dHJhY3QgcGFydGlhbCBpbmZvcm1hdGlvblxuICAgICAgICAgICAgY29uc3QgcGFydGlhbHMgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgOCkgIT09ICdYX1dJTlRFUicpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydGlhbHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5YX1dJTlRFUl9BU1NFVFMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQXNzZXRzKHJlc3BvbnNlLlhfV0lOVEVSX0FTU0VUUykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLnNub3dib2FyZC5nbG9iYWxQcm9taXNlRXZlbnQoJ2FqYXhCZWZvcmVVcGRhdGUnLCByZXNwb25zZSwgdGhpcyk7XG4gICAgICAgICAgICBwcm9taXNlcy50aGVuKFxuICAgICAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLlhfV0lOVEVSX0FTU0VUUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzQXNzZXRzKHJlc3BvbnNlLlhfV0lOVEVSX0FTU0VUUyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvVXBkYXRlKHBhcnRpYWxzKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IGZvciBIVE1MIHJlZHJhd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHBhcnRpYWxzIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydGlhbHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBkb1VwZGF0ZShwYXJ0aWFscykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFmZmVjdGVkID0gW107XG5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHBhcnRpYWxzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtwYXJ0aWFsLCBjb250ZW50XSA9IGVudHJ5O1xuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdG9yID0gKHRoaXMub3B0aW9ucy51cGRhdGUgJiYgdGhpcy5vcHRpb25zLnVwZGF0ZVtwYXJ0aWFsXSlcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMudXBkYXRlW3BhcnRpYWxdXG4gICAgICAgICAgICAgICAgICAgIDogcGFydGlhbDtcblxuICAgICAgICAgICAgICAgIGxldCBtb2RlID0gJ3JlcGxhY2UnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLnN1YnN0cigwLCAxKSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGUgPSAnYXBwZW5kJztcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5zdWJzdHIoMCwgMSkgPT09ICdeJykge1xuICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ3ByZXBlbmQnO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnN1YnN0cigwLCAxKSAhPT0gJyMnICYmIHNlbGVjdG9yLnN1YnN0cigwLCAxKSAhPT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGUgPSAnbm9vcCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhcHBlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCArPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmVwZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50ICsgZWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vb3AnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXBsYWNlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZC5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlIHVwZGF0ZSBldmVudCBmb3IgZWFjaCBlbGVtZW50IHRoYXQgaXMgdXBkYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhVcGRhdGUnLCBlbGVtZW50LCBjb250ZW50LCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4VXBkYXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFVwZGF0ZUNvbXBsZXRlJywgYWZmZWN0ZWQsIHRoaXMpO1xuXG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyB0aGUgcmVzcG9uc2UgZGF0YS5cbiAgICAgKlxuICAgICAqIFRoaXMgZmlyZXMgb2ZmIGFsbCBuZWNlc3NhcnkgcHJvY2Vzc2luZyBmdW5jdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSByZXNwb25zZSwgaWUuIGlmIHRoZXJlJ3MgYW55IGZsYXNoXG4gICAgICogbWVzc2FnZXMgdG8gaGFuZGxlLCBvciBhbnkgcmVkaXJlY3RzIHRvIGJlIHVuZGVydGFrZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdWNjZXNzICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuc3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdWNjZXNzKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBwbHVnaW5zIHRvIGNhbmNlbCBhbnkgZnVydGhlciByZXNwb25zZSBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhTdWNjZXNzJywgdGhpcy5yZXNwb25zZURhdGEsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgdGhlIGVsZW1lbnQgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIHJlc3BvbnNlIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4RG9uZScsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGV2ZW50LnJlc3BvbnNlRGF0YSA9IHRoaXMucmVzcG9uc2VEYXRhO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2ggJiYgcmVzcG9uc2UuWF9XSU5URVJfRkxBU0hfTUVTU0FHRVMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZsYXNoTWVzc2FnZXMocmVzcG9uc2UuWF9XSU5URVJfRkxBU0hfTUVTU0FHRVMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgcmVkaXJlY3QgZnJvbSB0aGUgcmVzcG9uc2UsIG9yIHVzZSB0aGUgcmVkaXJlY3QgYXMgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLlxuICAgICAgICBpZiAodGhpcy5yZWRpcmVjdCB8fCByZXNwb25zZS5YX1dJTlRFUl9SRURJUkVDVCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVkaXJlY3QodGhpcy5yZWRpcmVjdCB8fCByZXNwb25zZS5YX1dJTlRFUl9SRURJUkVDVCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIEFKQVggcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIFRoaXMgZmlyZXMgb2ZmIGFsbCBuZWNlc3NhcnkgcHJvY2Vzc2luZyBmdW5jdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBlcnJvciByZXNwb25zZSwgaWUuIGlmIHRoZXJlJ3MgYW55IGVycm9yIG9yXG4gICAgICogdmFsaWRhdGlvbiBtZXNzYWdlcyB0byBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHxFcnJvcn0gZXJyb3JcbiAgICAgKi9cbiAgICBwcm9jZXNzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvciAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVycm9yKHRoaXMucmVzcG9uc2VFcnJvciwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgYW55IGZ1cnRoZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4RXJyb3InLCB0aGlzLnJlc3BvbnNlRXJyb3IsIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgdGhlIGVsZW1lbnQgdG8gY2FuY2VsIGFueSBmdXJ0aGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdhamF4RmFpbCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGV2ZW50LnJlc3BvbnNlRXJyb3IgPSB0aGlzLnJlc3BvbnNlRXJyb3I7XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3JNZXNzYWdlKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHNraXBFcnJvciA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgICAgICBpZiAoZXJyb3IuWF9XSU5URVJfRVJST1JfRklFTERTKSB7XG4gICAgICAgICAgICAgICAgc2tpcEVycm9yID0gdGhpcy5wcm9jZXNzVmFsaWRhdGlvbkVycm9ycyhlcnJvci5YX1dJTlRFUl9FUlJPUl9GSUVMRFMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IuWF9XSU5URVJfRVJST1JfTUVTU0FHRSAmJiAhc2tpcEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3JNZXNzYWdlKGVycm9yLlhfV0lOVEVSX0VSUk9SX01FU1NBR0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIHJlZGlyZWN0IHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgdGhpcyBwcm9jZXNzb3Igd2lsbCBzaW1wbHkgcmVkaXJlY3QgdGhlIHVzZXIgaW4gdGhlaXIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIFBsdWdpbnMgY2FuIGF1Z21lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGBhamF4UmVkaXJlY3RgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IG9uXG4gICAgICogYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlUmVkaXJlY3RSZXNwb25zZWAgY2FsbGJhY2sgb3B0aW9uLiBJZiBhIGBmYWxzZWAgaXMgcmV0dXJuZWQgZnJvbSBlaXRoZXIsIHRoZVxuICAgICAqIHJlZGlyZWN0IHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByb2Nlc3NSZWRpcmVjdCh1cmwpIHtcbiAgICAgICAgLy8gUnVuIGEgY3VzdG9tIHBlci1yZXF1ZXN0IHJlZGlyZWN0IGhhbmRsZXIuIElmIGZhbHNlIGlzIHJldHVybmVkLCBkb24ndCBydW4gdGhlIHJlZGlyZWN0LlxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVSZWRpcmVjdFJlc3BvbnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZVJlZGlyZWN0UmVzcG9uc2UuYXBwbHkodGhpcywgW3VybF0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIHRoZSByZWRpcmVjdFxuICAgICAgICBpZiAodGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhSZWRpcmVjdCcsIHVybCwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBBSkFYIHJlcXVlc3QgaXMgZmluaXNoZWQgaWYgd2UncmUgc3RpbGwgb24gdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBsb2FkaW5nIGluZGljYXRvciBmb3IgcmVkaXJlY3RzIHRoYXQganVzdCBjaGFuZ2UgdGhlIGhhc2ggdmFsdWUgb2ZcbiAgICAgICAgLy8gdGhlIFVSTCBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIHBhZ2Ugd2lsbCBwcm9wZXJseSBzdG9wLlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vY3RvYmVyY21zL29jdG9iZXIvaXNzdWVzLzI3ODBcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnROYW1lID0gJ2FqYXhSZWRpcmVjdGVkJztcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2Vzc29yIHdpbGwgc2ltcGx5IGFsZXJ0IHRoZSB1c2VyIHRocm91Z2ggYSBzaW1wbGUgYGFsZXJ0KClgIGNhbGwuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheEVycm9yTWVzc2FnZWAgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVFcnJvck1lc3NhZ2VgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiBlcnJvciBtZXNzYWdlIGhhbmRsaW5nIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcm9jZXNzRXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgLy8gUnVuIGEgY3VzdG9tIHBlci1yZXF1ZXN0IGhhbmRsZXIgZm9yIGVycm9yIG1lc3NhZ2VzLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgZG8gbm90IHByb2Nlc3MgdGhlIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIC8vIGFueSBmdXJ0aGVyLlxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVFcnJvck1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlRXJyb3JNZXNzYWdlLmFwcGx5KHRoaXMsIFttZXNzYWdlXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBjYW5jZWwgdGhlIGVycm9yIG1lc3NhZ2UgYmVpbmcgc2hvd25cbiAgICAgICAgaWYgKHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4RXJyb3JNZXNzYWdlJywgbWVzc2FnZSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCeSBkZWZhdWx0LCBzaG93IGEgYnJvd3NlciBlcnJvciBtZXNzYWdlXG4gICAgICAgIHdpbmRvdy5hbGVydChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgZmxhc2ggbWVzc2FnZXMgZnJvbSB0aGUgcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBubyBmbGFzaCBtZXNzYWdlIGhhbmRsaW5nIHdpbGwgb2NjdXIuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheEZsYXNoTWVzc2FnZXNgIGV2ZW50LiBZb3UgbWF5IGFsc28gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICogb24gYSBwZXItcmVxdWVzdCBiYXNpcyB0aHJvdWdoIHRoZSBgaGFuZGxlRmxhc2hNZXNzYWdlc2AgY2FsbGJhY2sgb3B0aW9uLiBJZiBhIGBmYWxzZWAgaXMgcmV0dXJuZWQgZnJvbSBlaXRoZXIsIHRoZVxuICAgICAqIGZsYXNoIG1lc3NhZ2UgaGFuZGxpbmcgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZXNcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByb2Nlc3NGbGFzaE1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gICAgICAgIC8vIFJ1biBhIGN1c3RvbSBwZXItcmVxdWVzdCBmbGFzaCBoYW5kbGVyLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgZG9uJ3Qgc2hvdyB0aGUgZmxhc2ggbWVzc2FnZVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYW5kbGVGbGFzaE1lc3NhZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZUZsYXNoTWVzc2FnZXMuYXBwbHkodGhpcywgW21lc3NhZ2VzXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2FqYXhGbGFzaE1lc3NhZ2VzJywgbWVzc2FnZXMsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgZmllbGRzLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgbm8gdmFsaWRhdGlvbiBlcnJvciBoYW5kbGluZyB3aWxsIG9jY3VyLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhWYWxpZGF0aW9uRXJyb3JzYCBldmVudC4gWW91IG1heSBhbHNvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAqIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgdGhyb3VnaCB0aGUgYGhhbmRsZVZhbGlkYXRpb25FcnJvcnNgIGNhbGxiYWNrIG9wdGlvbi4gSWYgYSBgZmFsc2VgIGlzIHJldHVybmVkIGZyb20gZWl0aGVyLCB0aGVcbiAgICAgKiB2YWxpZGF0aW9uIGVycm9yIGhhbmRsaW5nIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkc1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJvY2Vzc1ZhbGlkYXRpb25FcnJvcnMoZmllbGRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhbmRsZVZhbGlkYXRpb25FcnJvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlVmFsaWRhdGlvbkVycm9ycy5hcHBseSh0aGlzLCBbdGhpcy5mb3JtLCBmaWVsZHNdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gY2FuY2VsIHRoZSB2YWxpZGF0aW9uIGVycm9ycyBiZWluZyBoYW5kbGVkXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYWpheFZhbGlkYXRpb25FcnJvcnMnLCB0aGlzLmZvcm0sIGZpZWxkcywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYXNzZXRzIHJldHVybmVkIGJ5IGFuIEFKQVggcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIG5vIGFzc2V0IHByb2Nlc3Npbmcgd2lsbCBvY2N1ciBhbmQgdGhpcyB3aWxsIHJldHVybiBhIHJlc29sdmVkIFByb21pc2UuXG4gICAgICpcbiAgICAgKiBQbHVnaW5zIGNhbiBhdWdtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBgYWpheExvYWRBc3NldHNgIGV2ZW50LiBUaGlzIGV2ZW50IGlzIGNvbnNpZGVyZWQgYmxvY2tpbmcsIGFuZFxuICAgICAqIGFsbG93cyBhc3NldHMgdG8gYmUgbG9hZGVkIG9yIHByb2Nlc3NlZCBiZWZvcmUgY29udGludWluZyB3aXRoIGFueSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXNzZXRzXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgcHJvY2Vzc0Fzc2V0cyhhc3NldHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc25vd2JvYXJkLmdsb2JhbFByb21pc2VFdmVudCgnYWpheExvYWRBc3NldHMnLCBhc3NldHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpcm1zIHRoZSByZXF1ZXN0IHdpdGggdGhlIHVzZXIgYmVmb3JlIHByb2NlZWRpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBtZXRob2QuIEJ5IGRlZmF1bHQsIGl0IHdpbGwgdXNlIHRoZSBicm93c2VyJ3MgYGNvbmZpcm0oKWAgbWV0aG9kIHRvIHF1ZXJ5IHRoZSB1c2VyIHRvXG4gICAgICogY29uZmlybSB0aGUgYWN0aW9uLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIFByb21pc2Ugd2l0aCBhIGJvb2xlYW4gdmFsdWUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHVzZXIgY29uZmlybWVkXG4gICAgICogb3Igbm90LlxuICAgICAqXG4gICAgICogUGx1Z2lucyBjYW4gYXVnbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgYGFqYXhDb25maXJtTWVzc2FnZWAgZXZlbnQuIFlvdSBtYXkgYWxzbyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHlcbiAgICAgKiBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIHRocm91Z2ggdGhlIGBoYW5kbGVDb25maXJtTWVzc2FnZWAgY2FsbGJhY2sgb3B0aW9uLiBJZiBhIGBmYWxzZWAgaXMgcmV0dXJuZWQgZnJvbSBlaXRoZXIsXG4gICAgICogdGhlIGNvbmZpcm1hdGlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbiBkZW5pZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhc3luYyBkb0NvbmZpcm0oKSB7XG4gICAgICAgIC8vIEFsbG93IGZvciBhIGN1c3RvbSBoYW5kbGVyIGZvciB0aGUgY29uZmlybWF0aW9uLCBwZXIgcmVxdWVzdC5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFuZGxlQ29uZmlybU1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlQ29uZmlybU1lc3NhZ2UuYXBwbHkodGhpcywgW3RoaXMuY29uZmlybV0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBwbHVnaW5zIGhhdmUgY3VzdG9taXNlZCB0aGUgY29uZmlybWF0aW9uLCB1c2UgYSBzaW1wbGUgYnJvd3NlciBjb25maXJtYXRpb24uXG4gICAgICAgIGlmICh0aGlzLnNub3dib2FyZC5saXN0ZW5zVG9FdmVudCgnYWpheENvbmZpcm1NZXNzYWdlJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmNvbmZpcm0odGhpcy5jb25maXJtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biBjdXN0b20gcGx1Z2luIGNvbmZpcm1hdGlvbnNcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLnNub3dib2FyZC5nbG9iYWxQcm9taXNlRXZlbnQoJ2FqYXhDb25maXJtTWVzc2FnZScsIHRoaXMuY29uZmlybSwgdGhpcyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGZpbGxlZCA9IGF3YWl0IHByb21pc2VzO1xuICAgICAgICAgICAgaWYgKGZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyZXMgb2ZmIGNvbXBsZXRpb24gZXZlbnRzIGZvciB0aGUgUmVxdWVzdC5cbiAgICAgKi9cbiAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wbGV0ZSAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmNvbXBsZXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29tcGxldGUodGhpcy5yZXNwb25zZURhdGEsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhamF4RG9uZScsIHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgnYWpheEFsd2F5cycpO1xuICAgICAgICAgICAgZXZlbnQucmVxdWVzdCA9IHRoaXM7XG4gICAgICAgICAgICBldmVudC5yZXNwb25zZURhdGEgPSB0aGlzLnJlc3BvbnNlRGF0YTtcbiAgICAgICAgICAgIGV2ZW50LnJlc3BvbnNlRXJyb3IgPSB0aGlzLnJlc3BvbnNlRXJyb3I7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJlIG9mZiB0aGUgZGVzdHJ1Y3RvclxuICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm0oKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZm9ybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLm9wdGlvbnMuZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZvcm07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbG9zZXN0KCdmb3JtJyk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmhhbmRsZXIsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGhlYWRlcnMoKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsIC8vIEtlZXBzIGNvbXBhdGliaWxpdHkgd2l0aCBqUXVlcnkgQUpBWFxuICAgICAgICAgICAgJ1gtV0lOVEVSLVJFUVVFU1QtSEFORExFUic6IHRoaXMuaGFuZGxlcixcbiAgICAgICAgICAgICdYLVdJTlRFUi1SRVFVRVNULVBBUlRJQUxTJzogdGhpcy5leHRyYWN0UGFydGlhbHModGhpcy5vcHRpb25zLnVwZGF0ZSB8fCBbXSksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuZmxhc2gpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1gtV0lOVEVSLVJFUVVFU1QtRkxBU0gnXSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy54c3JmVG9rZW4pIHtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1gtWFNSRi1UT0tFTiddID0gdGhpcy54c3JmVG9rZW47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG5cbiAgICBnZXQgbG9hZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2FkaW5nIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCB1cmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cblxuICAgIGdldCByZWRpcmVjdCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm9wdGlvbnMucmVkaXJlY3QgJiYgdGhpcy5vcHRpb25zLnJlZGlyZWN0Lmxlbmd0aCkgPyB0aGlzLm9wdGlvbnMucmVkaXJlY3QgOiBudWxsO1xuICAgIH1cblxuICAgIGdldCBmbGFzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mbGFzaCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgZmlsZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGlmIChGb3JtRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZGVidWcoJ1RoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGZpbGUgdXBsb2FkcycpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IHhzcmZUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc25vd2JvYXJkLmNvb2tpZSgpLmdldCgnWFNSRi1UT0tFTicpO1xuICAgIH1cblxuICAgIGdldCBkYXRhKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGF0YSA9PT0gJ29iamVjdCcpID8gdGhpcy5vcHRpb25zLmRhdGEgOiB7fTtcblxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSh0aGlzLmZvcm0gfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxuXG4gICAgZ2V0IGNvbmZpcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29uZmlybSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBwYXJ0aWFscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGV4dHJhY3RQYXJ0aWFscyh1cGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHVwZGF0ZSkuam9pbignJicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYW4gZXJyb3Igd2l0aCB1c2VmdWwgZGVidWcgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGludGVybmFsbHkgd2hlbiB0aGUgQUpBWCByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgb3IgcHJvY2Vzc2VkIGNvcnJlY3RseSBkdWUgdG8gYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleGNlcHRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsaW5lXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdHJhY2VcbiAgICAgKiBAcmV0dXJucyB7RXJyb3J9XG4gICAgICovXG4gICAgcmVuZGVyRXJyb3IobWVzc2FnZSwgZXhjZXB0aW9uLCBmaWxlLCBsaW5lLCB0cmFjZSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgZXJyb3IuZXhjZXB0aW9uID0gZXhjZXB0aW9uIHx8IG51bGw7XG4gICAgICAgIGVycm9yLmZpbGUgPSBmaWxlIHx8IG51bGw7XG4gICAgICAgIGVycm9yLmxpbmUgPSBsaW5lIHx8IG51bGw7XG4gICAgICAgIGVycm9yLnRyYWNlID0gdHJhY2UgfHwgW107XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYSBnaXZlbiBzdHJpbmcgdG8gc2VlIGlmIGl0IGlzIGEgdmFsaWQgQUpBWCBoYW5kbGVyIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzSGFuZGxlck5hbWUobmFtZSkge1xuICAgICAgICByZXR1cm4gL14oPzpcXHcrOnsyfSk/b25bQS1aMC05XS8udGVzdChuYW1lKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uLy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEVuYWJsZSBEYXRhIEF0dHJpYnV0ZXMgQVBJIGZvciBBSkFYIHJlcXVlc3RzLlxuICpcbiAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBiYXNlIEFKQVggZnVuY3Rpb25hbGl0eSB0aGF0IGluY2x1ZGVzIGhhbmRsaW5nIG9mIEhUTUwgZGF0YSBhdHRyaWJ1dGVzIGZvciBwcm9jZXNzaW5nXG4gKiBBSkFYIHJlcXVlc3RzLiBJdCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgYmFzZSBBSkFYIGZ1bmN0aW9uYWxpdHkgdG8gYWxsb3cgZGV2ZWxvcGVycyB0byBvcHQtb3V0IG9mIGRhdGEgYXR0cmlidXRlXG4gKiByZXF1ZXN0cyBpZiB0aGV5IGRvIG5vdCBpbnRlbmQgdG8gdXNlIHRoZW0uXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dHJpYnV0ZVJlcXVlc3QgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIExpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWR5OiAncmVhZHknLFxuICAgICAgICAgICAgYWpheFNldHVwOiAnb25BamF4U2V0dXAnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWR5IGV2ZW50IGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogQXR0YWNoZXMgaGFuZGxlcnMgdG8gdGhlIHdpbmRvdyB0byBsaXN0ZW4gZm9yIGFsbCByZXF1ZXN0IGludGVyYWN0aW9ucy5cbiAgICAgKi9cbiAgICByZWFkeSgpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hIYW5kbGVycygpO1xuICAgICAgICB0aGlzLmRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbmNpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydyZXF1ZXN0JywgJ2pzb25QYXJzZXInXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cnVjdG9yLlxuICAgICAqXG4gICAgICogRGV0YWNoZXMgYWxsIGhhbmRsZXJzLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICB0aGlzLmRldGFjaEhhbmRsZXJzKCk7XG5cbiAgICAgICAgc3VwZXIuZGVzdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyB0aGUgbmVjZXNzYXJ5IGhhbmRsZXJzIGZvciBhbGwgcmVxdWVzdCBpbnRlcmFjdGlvbnMuXG4gICAgICovXG4gICAgYXR0YWNoSGFuZGxlcnMoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXZlbnQpID0+IHRoaXMuY2hhbmdlSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHRoaXMuY2xpY2tIYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB0aGlzLmtleURvd25IYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZXZlbnQpID0+IHRoaXMuc3VibWl0SGFuZGxlcihldmVudCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIGRlZmF1bHQgZm9ybSB2YWxpZGF0aW9uIGZvciBBSkFYIGZvcm1zLlxuICAgICAqXG4gICAgICogQSBmb3JtIHRoYXQgY29udGFpbnMgYSBgZGF0YS1yZXF1ZXN0YCBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBhbiBBSkFYIGNhbGwgd2l0aG91dCBpbmNsdWRpbmcgYSBgZGF0YS1icm93c2VyLXZhbGlkYXRlYFxuICAgICAqIGF0dHJpYnV0ZSBtZWFucyB0aGF0IHRoZSBBSkFYIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgbGlrZWx5IGJlIGhhbmRsaW5nIHRoZSB2YWxpZGF0aW9uIGluc3RlYWQuXG4gICAgICovXG4gICAgZGlzYWJsZURlZmF1bHRGb3JtVmFsaWRhdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZm9ybVtkYXRhLXJlcXVlc3RdOm5vdChbZGF0YS1icm93c2VyLXZhbGlkYXRlXSknKS5mb3JFYWNoKChmb3JtKSA9PiB7XG4gICAgICAgICAgICBmb3JtLnNldEF0dHJpYnV0ZSgnbm92YWxpZGF0ZScsIHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRhY2hlcyB0aGUgbmVjZXNzYXJ5IGhhbmRsZXJzIGZvciBhbGwgcmVxdWVzdCBpbnRlcmFjdGlvbnMuXG4gICAgICovXG4gICAgZGV0YWNoSGFuZGxlcnMoKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXZlbnQpID0+IHRoaXMuY2hhbmdlSGFuZGxlcihldmVudCkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHRoaXMuY2xpY2tIYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB0aGlzLmtleURvd25IYW5kbGVyKGV2ZW50KSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZXZlbnQpID0+IHRoaXMuc3VibWl0SGFuZGxlcihldmVudCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgY2hhbmdlcyB0byBzZWxlY3QsIHJhZGlvLCBjaGVja2JveCBhbmQgZmlsZSBpbnB1dHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGNoYW5nZUhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgY2hhbmdpbmcgYSB2YWxpZCBlbGVtZW50XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAnc2VsZWN0W2RhdGEtcmVxdWVzdF0sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtcmVxdWVzdF0sIGlucHV0W3R5cGU9Y2hlY2tib3hdW2RhdGEtcmVxdWVzdF0sIGlucHV0W3R5cGU9ZmlsZV1bZGF0YS1yZXF1ZXN0XScsXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGNsaWNrcyBvbiBoeXBlcmxpbmtzIGFuZCBidXR0b25zLlxuICAgICAqXG4gICAgICogVGhpcyBldmVudCBjYW4gYnViYmxlIHVwIHRoZSBoaWVyYXJjaHkgdG8gZmluZCBhIHN1aXRhYmxlIHJlcXVlc3QgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgY2xpY2tIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQudGFnTmFtZSAhPT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50Lm1hdGNoZXMoXG4gICAgICAgICAgICAgICAgJ2FbZGF0YS1yZXF1ZXN0XSwgYnV0dG9uW2RhdGEtcmVxdWVzdF0sIGlucHV0W3R5cGU9YnV0dG9uXVtkYXRhLXJlcXVlc3RdLCBpbnB1dFt0eXBlPXN1Ym1pdF1bZGF0YS1yZXF1ZXN0XScsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBrZXkgcHJlc3NlcyBvbiBpbnB1dHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAga2V5RG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgaW5wdXR0aW5nIGludG8gYSB2YWxpZCBlbGVtZW50XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoXG4gICAgICAgICAgICAnaW5wdXQnLFxuICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnB1dCB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGNvbnN0IHZhbGlkVHlwZXMgPSBbXG4gICAgICAgICAgICAnY2hlY2tib3gnLFxuICAgICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAgICdkYXRlJyxcbiAgICAgICAgICAgICdkYXRldGltZScsXG4gICAgICAgICAgICAnZGF0ZXRpbWUtbG9jYWwnLFxuICAgICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbW9udGgnLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAncGFzc3dvcmQnLFxuICAgICAgICAgICAgJ3JhZGlvJyxcbiAgICAgICAgICAgICdyYW5nZScsXG4gICAgICAgICAgICAnc2VhcmNoJyxcbiAgICAgICAgICAgICd0ZWwnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3RpbWUnLFxuICAgICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgICAnd2VlaycsXG4gICAgICAgIF07XG4gICAgICAgIGlmICh2YWxpZFR5cGVzLmluZGV4T2YoZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgndHlwZScpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJypbZGF0YS1yZXF1ZXN0XScpKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJypbZGF0YS10cmFjay1pbnB1dF0nKSkge1xuICAgICAgICAgICAgdGhpcy50cmFja0lucHV0KGV2ZW50LnRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWlzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIHN1Ym1pdEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgc3VibWl0dGluZyBhIHZhbGlkIGZvcm1cbiAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhcbiAgICAgICAgICAgICdmb3JtW2RhdGEtcmVxdWVzdF0nLFxuICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RPbkVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSByZXF1ZXN0IG9uIGEgZ2l2ZW4gZWxlbWVudCwgdXNpbmcgaXRzIGRhdGEgYXR0cmlidXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcm9jZXNzUmVxdWVzdE9uRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlbGVtZW50LmRhdGFzZXQ7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IFN0cmluZyhkYXRhLnJlcXVlc3QpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgY29uZmlybTogKCdyZXF1ZXN0Q29uZmlybScgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0Q29uZmlybSkgOiBudWxsLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICgncmVxdWVzdFJlZGlyZWN0JyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RSZWRpcmVjdCkgOiBudWxsLFxuICAgICAgICAgICAgbG9hZGluZzogKCdyZXF1ZXN0TG9hZGluZycgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0TG9hZGluZykgOiBudWxsLFxuICAgICAgICAgICAgZmxhc2g6ICgncmVxdWVzdEZsYXNoJyBpbiBkYXRhKSxcbiAgICAgICAgICAgIGZpbGVzOiAoJ3JlcXVlc3RGaWxlcycgaW4gZGF0YSksXG4gICAgICAgICAgICBicm93c2VyVmFsaWRhdGU6ICgncmVxdWVzdEJyb3dzZXJWYWxpZGF0ZScgaW4gZGF0YSksXG4gICAgICAgICAgICBmb3JtOiAoJ3JlcXVlc3RGb3JtJyBpbiBkYXRhKSA/IFN0cmluZyhkYXRhLnJlcXVlc3RGb3JtKSA6IG51bGwsXG4gICAgICAgICAgICB1cmw6ICgncmVxdWVzdFVybCcgaW4gZGF0YSkgPyBTdHJpbmcoZGF0YS5yZXF1ZXN0VXJsKSA6IG51bGwsXG4gICAgICAgICAgICB1cGRhdGU6ICgncmVxdWVzdFVwZGF0ZScgaW4gZGF0YSkgPyB0aGlzLnBhcnNlRGF0YShTdHJpbmcoZGF0YS5yZXF1ZXN0VXBkYXRlKSkgOiBbXSxcbiAgICAgICAgICAgIGRhdGE6ICgncmVxdWVzdERhdGEnIGluIGRhdGEpID8gdGhpcy5wYXJzZURhdGEoU3RyaW5nKGRhdGEucmVxdWVzdERhdGEpKSA6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLnJlcXVlc3QoZWxlbWVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB1cCBhbiBBSkFYIHJlcXVlc3QgdmlhIEhUTUwgYXR0cmlidXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdFxuICAgICAqL1xuICAgIG9uQWpheFNldHVwKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHJlcXVlc3QuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgLi4udGhpcy5nZXRQYXJlbnRSZXF1ZXN0RGF0YShyZXF1ZXN0LmVsZW1lbnQpLFxuICAgICAgICAgICAgLi4ucmVxdWVzdC5vcHRpb25zLmRhdGEsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudCAmJiByZXF1ZXN0LmVsZW1lbnQubWF0Y2hlcygnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGJ1dHRvbicpICYmICFyZXF1ZXN0LmZvcm0gJiYgZmllbGROYW1lICYmICFyZXF1ZXN0Lm9wdGlvbnMuZGF0YVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICBkYXRhW2ZpZWxkTmFtZV0gPSByZXF1ZXN0LmVsZW1lbnQudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0Lm9wdGlvbnMuZGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGFuZCBjb2xsYXRlcyBhbGwgZGF0YSBmcm9tIGVsZW1lbnRzIHVwIHRoZSBET00gaGllcmFyY2h5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFBhcmVudFJlcXVlc3REYXRhKHRhcmdldCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICAgICAgICBsZXQgZGF0YSA9IHt9O1xuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSB0YXJnZXQ7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50YWdOYW1lICE9PSAnSFRNTCcpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50cy5yZXZlcnNlKCk7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGEgPSBlbGVtZW50LmRhdGFzZXQ7XG5cbiAgICAgICAgICAgIGlmICgncmVxdWVzdERhdGEnIGluIGVsZW1lbnREYXRhKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wYXJzZURhdGEoZWxlbWVudERhdGEucmVxdWVzdERhdGEpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBkYXRhIGluIHRoZSBXaW50ZXIvT2N0b2JlciBKU09OIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBwYXJzZURhdGEoZGF0YSkge1xuICAgICAgICBsZXQgdmFsdWU7XG5cbiAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5qc29ucGFyc2VyKCkucGFyc2UoYHske2RhdGF9fWApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHBhcnNpbmcgdGhlIGRhdGEgYXR0cmlidXRlIG9uIGVsZW1lbnQ6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhY2tJbnB1dChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgbGFzdFZhbHVlIH0gPSBlbGVtZW50LmRhdGFzZXQ7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gZWxlbWVudC5kYXRhc2V0LnRyYWNrSW5wdXQgfHwgMzAwO1xuXG4gICAgICAgIGlmIChsYXN0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBsYXN0VmFsdWUgPT09IGVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRUcmFja0lucHV0VGltZXIoZWxlbWVudCk7XG5cbiAgICAgICAgZWxlbWVudC5kYXRhc2V0LmlucHV0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kYXRhc2V0LnJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdXAgdGhlIGhpZXJhcmNoeSBhbmQgZmluZCBhIGZvcm0gdGhhdCBzZW5kcyBhbiBBSkFYIHF1ZXJ5XG4gICAgICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50YWdOYW1lICE9PSAnSFRNTCcpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIGN1cnJlbnRFbGVtZW50LmRhdGFzZXQucmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0T25FbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBpbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgcmVzZXRUcmFja0lucHV0VGltZXIoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudC5kYXRhc2V0LmlucHV0VGltZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoZWxlbWVudC5kYXRhc2V0LmlucHV0VGltZXIpO1xuICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmlucHV0VGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBBc3NldCBMb2FkZXIuXG4gKlxuICogUHJvdmlkZXMgc2ltcGxlIGFzc2V0IGxvYWRpbmcgZnVuY3Rpb25hbGl0eSBmb3IgU25vd2JvYXJkLCBtYWtpbmcgaXQgZWFzeSB0byBwcmUtbG9hZCBpbWFnZXMgb3JcbiAqIGluY2x1ZGUgSmF2YVNjcmlwdCBvciBDU1MgYXNzZXRzIG9uIHRoZSBmbHkuXG4gKlxuICogQnkgZGVmYXVsdCwgdGhpcyBsb2FkZXIgd2lsbCBsaXN0ZW4gdG8gYW55IGFzc2V0cyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgdG8gbG9hZCBpbiBhbiBBSkFYXG4gKiByZXNwb25zZSwgc3VjaCBhcyByZXNwb25zZXMgZnJvbSBhIGNvbXBvbmVudC5cbiAqXG4gKiBZb3UgY2FuIGFsc28gbG9hZCBhc3NldHMgbWFudWFsbHkgYnkgY2FsbGluZyB0aGUgZm9sbG93aW5nOlxuICpcbiAqIGBgYGpzXG4gKiBTbm93Ym9hcmQuYWRkUGx1Z2luKCdhc3NldExvYWRlcicsIEFzc2V0TG9hZGVyKTtcbiAqIFNub3dib2FyZC5hc3NldExvYWRlcigpLnByb2Nlc3NBc3NldHMoYXNzZXRzKTtcbiAqIGBgYFxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBc3NldExvYWRlciBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRXZlbnQgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBsaXN0ZW5zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWpheExvYWRBc3NldHM6ICdsb2FkJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbmNpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3VybCcsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBhbmQgbG9hZCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBUaGUgYGFzc2V0c2AgcHJvcGVydHkgb2YgdGhpcyBtZXRob2QgcmVxdWlyZXMgYW4gb2JqZWN0IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcga2V5cyBhbmQgYW5cbiAgICAgKiBhcnJheSBvZiBwYXRoczpcbiAgICAgKlxuICAgICAqIC0gYGpzYDogQW4gYXJyYXkgb2YgSmF2YVNjcmlwdCBVUkxzIHRvIGxvYWRcbiAgICAgKiAtIGBjc3NgOiBBbiBhcnJheSBvZiBDU1Mgc3R5bGVzaGVldCBVUkxzIHRvIGxvYWRcbiAgICAgKiAtIGBpbWdgOiBBbiBhcnJheSBvZiBpbWFnZSBVUkxzIHRvIHByZS1sb2FkXG4gICAgICpcbiAgICAgKiBCb3RoIGBqc2AgYW5kIGBjc3NgIGZpbGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmplY3RlZCwgaG93ZXZlciBgaW1nYCBmaWxlcyB3aWxsIG5vdC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIHJlcXVpcmVkIGFzc2V0cyBhcmUgbG9hZGVkLiBJZiBhblxuICAgICAqIGFzc2V0IGZhaWxzIHRvIGxvYWQsIHRoaXMgUHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogRVNMaW50ICpSRUFMTFkqIGRvZXNuJ3QgbGlrZSB0aGlzIGNvZGUsIGJ1dCBpZ25vcmUgaXQuIEl0J3MgdGhlIG9ubHkgd2F5IGl0IHdvcmtzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFzc2V0c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoYXNzZXRzKSB7XG4gICAgICAgIGlmIChhc3NldHMuanMgJiYgYXNzZXRzLmpzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIGFzc2V0cy5qcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFNjcmlwdChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2V0cy5jc3MgJiYgYXNzZXRzLmNzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0eWxlIG9mIGFzc2V0cy5jc3MpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTdHlsZShzdHlsZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXNzZXRzLmltZyAmJiBhc3NldHMuaW1nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaW1hZ2Ugb2YgYXNzZXRzLmltZykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEltYWdlKGltYWdlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmplY3RzIGFuZCBsb2FkcyBhIEphdmFTY3JpcHQgVVJMIGludG8gdGhlIERPTS5cbiAgICAgKlxuICAgICAqIFRoZSBzY3JpcHQgd2lsbCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhlIGNsb3NpbmcgYDwvYm9keT5gIHRhZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzY3JpcHRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBsb2FkU2NyaXB0KHNjcmlwdCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBzY3JpcHQgVVJMXG4gICAgICAgICAgICBzY3JpcHQgPSB0aGlzLnNub3dib2FyZC51cmwoKS5hc3NldChzY3JpcHQpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHNjcmlwdCBpcyBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmM9XCIke3NjcmlwdH1cIl1gKTtcbiAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgc2NyaXB0XG4gICAgICAgICAgICBjb25zdCBkb21TY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgIGRvbVNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7XG4gICAgICAgICAgICBkb21TY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCBzY3JpcHQpO1xuICAgICAgICAgICAgZG9tU2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmxvYWRlZCcsICdzY3JpcHQnLCBzY3JpcHQsIGRvbVNjcmlwdCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb21TY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmVycm9yJywgJ3NjcmlwdCcsIHNjcmlwdCwgZG9tU2NyaXB0KTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBzY3JpcHQgZmlsZTogXCIke3NjcmlwdH1cImApKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZG9tU2NyaXB0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5qZWN0cyBhbmQgbG9hZHMgYSBDU1Mgc3R5bGVzaGVldCBpbnRvIHRoZSBET00uXG4gICAgICpcbiAgICAgKiBUaGUgc3R5bGVzaGVldCB3aWxsIGJlIGFwcGVuZGVkIGJlZm9yZSB0aGUgY2xvc2luZyBgPC9oZWFkPmAgdGFnLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgbG9hZFN0eWxlKHN0eWxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHN0eWxlIFVSTFxuICAgICAgICAgICAgc3R5bGUgPSB0aGlzLnNub3dib2FyZC51cmwoKS5hc3NldChzdHlsZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc3R5bGVzaGVldCBpcyBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpbmtbcmVsPVwic3R5bGVzaGVldFwiXVtocmVmPVwiJHtzdHlsZX1cIl1gKTtcbiAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgc3R5bGVzaGVldFxuICAgICAgICAgICAgY29uc3QgZG9tQ3NzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgZG9tQ3NzLnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgICAgIGRvbUNzcy5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBzdHlsZSk7XG4gICAgICAgICAgICBkb21Dc3MuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnYXNzZXRMb2FkZXIubG9hZGVkJywgJ3N0eWxlJywgc3R5bGUsIGRvbUNzcyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb21Dc3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmVycm9yJywgJ3N0eWxlJywgc3R5bGUsIGRvbUNzcyk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgc3R5bGVzaGVldCBmaWxlOiBcIiR7c3R5bGV9XCJgKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGRvbUNzcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZS1sb2FkcyBhbiBpbWFnZS5cbiAgICAgKlxuICAgICAqIFRoZSBpbWFnZSB3aWxsIG5vdCBiZSBpbmplY3RlZCBpbnRvIHRoZSBET00uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW1hZ2VcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBsb2FkSW1hZ2UoaW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgc2NyaXB0IFVSTFxuICAgICAgICAgICAgaW1hZ2UgPSB0aGlzLnNub3dib2FyZC51cmwoKS5hc3NldChpbWFnZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Fzc2V0TG9hZGVyLmxvYWRlZCcsICdpbWFnZScsIGltYWdlLCBpbWcpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdhc3NldExvYWRlci5lcnJvcicsICdpbWFnZScsIGltYWdlLCBpbWcpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGltYWdlIGZpbGU6IFwiJHtpbWFnZX1cImApKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW1nLnNyYyA9IGltYWdlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEFsbG93cyBhdHRhY2hpbmcgYSBsb2FkaW5nIGNsYXNzIG9uIGVsZW1lbnRzIHRoYXQgYW4gQUpBWCByZXF1ZXN0IGlzIHRhcmdldGluZy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXR0YWNoTG9hZGluZyBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmljZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWydyZXF1ZXN0J107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxpc3RlbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhamF4U3RhcnQ6ICdhamF4U3RhcnQnLFxuICAgICAgICAgICAgYWpheERvbmU6ICdhamF4RG9uZScsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWpheFN0YXJ0KHByb21pc2UsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgICAgICBjb25zdCBsb2FkRWxlbWVudHMgPSByZXF1ZXN0LmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXR0YWNoLWxvYWRpbmddJyk7XG4gICAgICAgICAgICBpZiAobG9hZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2FkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5nZXRMb2FkaW5nQ2xhc3MoZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdC5lbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5nZXRMb2FkaW5nQ2xhc3MocmVxdWVzdC5lbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhamF4RG9uZShkYXRhLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdC5lbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICAgICAgY29uc3QgbG9hZEVsZW1lbnRzID0gcmVxdWVzdC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWF0dGFjaC1sb2FkaW5nXScpO1xuICAgICAgICAgICAgaWYgKGxvYWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9hZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZ2V0TG9hZGluZ0NsYXNzKHJlcXVlc3QuZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TG9hZGluZ0NsYXNzKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIChlbGVtZW50LmRhdGFzZXQuYXR0YWNoTG9hZGluZyAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQuZGF0YXNldC5hdHRhY2hMb2FkaW5nICE9PSAnJylcbiAgICAgICAgICAgID8gZWxlbWVudC5kYXRhc2V0LmF0dGFjaExvYWRpbmdcbiAgICAgICAgICAgIDogJ3duLWxvYWRpbmcnO1xuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBEYXRhIGNvbmZpZ3VyYXRpb24gcHJvdmlkZXIuXG4gKlxuICogUHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHBhc3NpbmcgY29uZmlndXJhdGlvbiBkYXRhIHRocm91Z2ggYW4gZWxlbWVudCdzIGRhdGEgYXR0cmlidXRlcy4gVGhpc1xuICogaXMgZ2VuZXJhbGx5IHVzZWQgZm9yIHdpZGdldHMgb3IgVUkgaW50ZXJhY3Rpb25zIHRvIGNvbmZpZ3VyZSB0aGVtLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMiBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhQ29uZmlnIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BsdWdpbkJhc2V9IGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsb2NhbENvbmZpZ1xuICAgICAqL1xuICAgIGNvbnN0cnVjdChpbnN0YW5jZSwgZWxlbWVudCwgbG9jYWxDb25maWcpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgUGx1Z2luQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIFNub3dib2FyZCBwbHVnaW4gdG8gZW5hYmxlIGRhdGEgY29uZmlndXJhdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBleHRyYWN0ZWQgZnJvbSBIVE1MIGVsZW1lbnRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubG9jYWxDb25maWcgPSBsb2NhbENvbmZpZyB8fCB7fTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbmZpZyA9IHt9O1xuICAgICAgICB0aGlzLmFjY2VwdGVkQ29uZmlncyA9IHt9O1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWcgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgYGNvbmZpZ2AgcGFyYW1ldGVyIGlzIHVuc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdcbiAgICAgKi9cbiAgICBnZXQoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VDb25maWc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZUNvbmZpZ1tjb25maWddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlQ29uZmlnW2NvbmZpZ107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbmZpZyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byBvdmVycmlkZSwgYXQgcnVudGltZSwgYW55IGNvbmZpZ3VyYXRpb24gdmFsdWUgYXMgbmVjZXNzYXJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ1xuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGVyc2lzdFxuICAgICAqL1xuICAgIHNldChjb25maWcsIHZhbHVlLCBwZXJzaXN0KSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGEgY29uZmlndXJhdGlvbiBrZXkgdG8gc2V0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluc3RhbmNlQ29uZmlnW2NvbmZpZ10gPSB2YWx1ZTtcblxuICAgICAgICBpZiAocGVyc2lzdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRhdGFzZXRbY29uZmlnXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5sb2NhbENvbmZpZ1tjb25maWddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoZXMgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBkYXRhIGNvbmZpZyBvbiBhIERPTSBsZXZlbCBhbmQgcmUtYXBwbHkgdGhlbVxuICAgICAqIHRvIHRoZSBjb25maWcgb24gdGhlIEphdmFTY3JpcHQgc2lkZS5cbiAgICAgKi9cbiAgICByZWZyZXNoKCkge1xuICAgICAgICB0aGlzLmFjY2VwdGVkQ29uZmlncyA9IHRoaXMuZ2V0QWNjZXB0ZWRDb25maWdzKCk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25maWcgPSB0aGlzLnByb2Nlc3NDb25maWcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBhdmFpbGFibGUgY29uZmlndXJhdGlvbnMgdGhhdCBjYW4gYmUgc2V0IHRocm91Z2ggdGhlIGRhdGEgY29uZmlnLlxuICAgICAqXG4gICAgICogSWYgYW4gaW5zdGFuY2UgaGFzIGFuIGBhY2NlcHRBbGxEYXRhQ29uZmlnc2AgcHJvcGVydHksIHNldCB0byBgdHJ1ZWAsIHRoZW4gYWxsIGRhdGFcbiAgICAgKiBhdHRyaWJ1dGVzIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGNvbmZpZ3VyYXRpb24gdmFsdWVzLiBUaGlzIGNhbiBiZSBhIHNlY3VyaXR5IGNvbmNlcm4sIHNvXG4gICAgICogdHJlYWQgY2FyZWZ1bGx5LlxuICAgICAqXG4gICAgICogT3RoZXJ3aXNlLCBhdmFpbGFibGUgY29uZmlndXJhdGlvbnMgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBrZXlzIGF2YWlsYWJsZSBpbiBhbiBvYmplY3RcbiAgICAgKiByZXR1cm5lZCBieSBhIGBkZWZhdWx0cygpYCBtZXRob2QgaW4gdGhlIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfGJvb2xlYW59XG4gICAgICovXG4gICAgZ2V0QWNjZXB0ZWRDb25maWdzKCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmFjY2VwdEFsbERhdGFDb25maWdzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICYmIHRoaXMuaW5zdGFuY2UuYWNjZXB0QWxsRGF0YUNvbmZpZ3MgPT09IHRydWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIHR5cGVvZiB0aGlzLmluc3RhbmNlLmRlZmF1bHRzKCkgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBiZSBhbiBlbXB0eSBvYmplY3QgaWYgdGhlIGluc3RhbmNlIGVpdGhlciBkb2VzIG5vdCBoYXZlIGEgYGRlZmF1bHRzKClgIG1ldGhvZCwgb3JcbiAgICAgKiB0aGUgbWV0aG9kIGl0c2VsZiBkb2VzIG5vdCByZXR1cm4gYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0cygpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAmJiB0eXBlb2YgdGhpcy5pbnN0YW5jZS5kZWZhdWx0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXMuaW5zdGFuY2UuZGVmYXVsdHMoKSA9PT0gJ29iamVjdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5kZWZhdWx0cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyB0aGUgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIExvYWRzIHVwIHRoZSBkZWZhdWx0cywgdGhlbiBwb3B1bGF0ZXMgaXQgd2l0aCBhbnkgY29uZmlndXJhdGlvbiB2YWx1ZXMgcHJvdmlkZWQgYnkgdGhlIGRhdGFcbiAgICAgKiBhdHRyaWJ1dGVzLCBiYXNlZCBvbiB0aGUgcnVsZXMgb2YgdGhlIGFjY2VwdGVkIGNvbmZpZ3VyYXRpb25zLlxuICAgICAqXG4gICAgICogVGhpcyBjb25maWd1cmF0aW9uIG9iamVjdCBpcyB0aGVuIGNhY2hlZCBhbmQgYXZhaWxhYmxlIHRocm91Z2ggYGNvbmZpZy5nZXQoKWAgY2FsbHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgICAqL1xuICAgIHByb2Nlc3NDb25maWcoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdHMoKTtcblxuICAgICAgICBpZiAodGhpcy5hY2NlcHRlZENvbmZpZ3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5lbGVtZW50LmRhdGFzZXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2VwdGVkQ29uZmlncyA9PT0gdHJ1ZSB8fCB0aGlzLmFjY2VwdGVkQ29uZmlncy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmNvZXJjZVZhbHVlKHRoaXMuZWxlbWVudC5kYXRhc2V0W2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5sb2NhbENvbmZpZykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0ZWRDb25maWdzID09PSB0cnVlIHx8IHRoaXMuYWNjZXB0ZWRDb25maWdzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHRoaXMubG9jYWxDb25maWdba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2VyY2VzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciBKYXZhU2NyaXB0LlxuICAgICAqXG4gICAgICogVGFrZXMgdGhlIHN0cmluZyB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBkYXRhIGF0dHJpYnV0ZSBhbmQgY29lcmNlcyBpdCBpbnRvIGEgbW9yZSBzdWl0YWJsZVxuICAgICAqIHR5cGUgZm9yIEphdmFTY3JpcHQgcHJvY2Vzc2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBjb2VyY2VWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG5cbiAgICAgICAgLy8gTnVsbCB2YWx1ZVxuICAgICAgICBpZiAoc3RyaW5nVmFsdWUgPT09ICdudWxsJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmRlZmluZWQgdmFsdWVcbiAgICAgICAgaWYgKHN0cmluZ1ZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhc2U2NCB2YWx1ZVxuICAgICAgICBpZiAoc3RyaW5nVmFsdWUuc3RhcnRzV2l0aCgnYmFzZTY0OicpKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlNjRzdHIgPSBzdHJpbmdWYWx1ZS5yZXBsYWNlKC9eYmFzZTY0Oi8sICcnKTtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBhdG9iKGJhc2U2NHN0cik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2VyY2VWYWx1ZShkZWNvZGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJvb2xlYW4gdmFsdWVcbiAgICAgICAgaWYgKFsndHJ1ZScsICd5ZXMnXS5pbmNsdWRlcyhzdHJpbmdWYWx1ZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFsnZmFsc2UnLCAnbm8nXS5pbmNsdWRlcyhzdHJpbmdWYWx1ZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTnVtZXJpYyB2YWx1ZVxuICAgICAgICBpZiAoL15bLStdP1swLTldKyhcXC5bMC05XSspPyQvLnRlc3Qoc3RyaW5nVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHN0cmluZ1ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEpTT04gdmFsdWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNub3dib2FyZC5qc29uUGFyc2VyKCkucGFyc2Uoc3RyaW5nVmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHN0cmluZ1ZhbHVlID09PSAnJykgPyB0cnVlIDogc3RyaW5nVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgZmxhc2ggbWVzc2FnZXMgZm9yIHRoZSBDTVMuXG4gKlxuICogRmxhc2ggbWVzc2FnZXMgd2lsbCBwb3AgdXAgYXQgdGhlIHRvcCBjZW50ZXIgb2YgdGhlIHBhZ2UgYW5kIHdpbGwgcmVtYWluIGZvciA3IHNlY29uZHMgYnkgZGVmYXVsdC4gSG92ZXJpbmcgb3ZlclxuICogdGhlIG1lc3NhZ2Ugd2lsbCByZXNldCBhbmQgcGF1c2UgdGhlIHRpbWVyLiBDbGlja2luZyBvbiB0aGUgZmxhc2ggbWVzc2FnZSB3aWxsIGRpc21pc3MgaXQuXG4gKlxuICogQXJndW1lbnRzOlxuICogIC0gXCJtZXNzYWdlXCI6IFRoZSBjb250ZW50IG9mIHRoZSBmbGFzaCBtZXNzYWdlLiBIVE1MIGlzIGFjY2VwdGVkLlxuICogIC0gXCJ0eXBlXCI6IFRoZSB0eXBlIG9mIGZsYXNoIG1lc3NhZ2UuIFRoaXMgaXMgYXBwZW5kZWQgYXMgYSBjbGFzcyB0byB0aGUgZmxhc2ggbWVzc2FnZSBpdHNlbGYuXG4gKiAgLSBcImR1cmF0aW9uXCI6IEhvdyBsb25nIHRoZSBmbGFzaCBtZXNzYWdlIHdpbGwgc3RheSB2aXNpYmxlIGZvciwgaW4gc2Vjb25kcy4gRGVmYXVsdDogNyBzZWNvbmRzLlxuICpcbiAqIFVzYWdlOlxuICogICAgICBTbm93Ym9hcmQuZmxhc2goJ1RoaXMgaXMgYSBmbGFzaCBtZXNzYWdlJywgJ2luZm8nLCA4KTtcbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxhc2ggZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZHVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3QobWVzc2FnZSwgdHlwZSwgZHVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAnZGVmYXVsdCc7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBOdW1iZXIoZHVyYXRpb24gfHwgNyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXNoIGR1cmF0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIsIG9yIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMuZmxhc2hUaW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBkZXBlbmRlbmNpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gWyd0cmFuc2l0aW9uJ107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBlbnN1cmUgdGhlIGZsYXNoIG1lc3NhZ2UgaXMgcmVtb3ZlZCBhbmQgdGltZW91dCBpcyBjbGVhcmVkIGlmIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZXN0cnVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mbGFzaFRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoVGltZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mbGFzaCkge1xuICAgICAgICAgICAgdGhpcy5mbGFzaC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2ggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdmbGFzaC5jcmVhdGUnLCB0aGlzKTtcblxuICAgICAgICB0aGlzLmZsYXNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIHRoaXMuZmxhc2guaW5uZXJIVE1MID0gdGhpcy5tZXNzYWdlO1xuICAgICAgICB0aGlzLmZsYXNoLmNsYXNzTGlzdC5hZGQoJ2ZsYXNoLW1lc3NhZ2UnLCB0aGlzLnR5cGUpO1xuICAgICAgICB0aGlzLmZsYXNoLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jb250cm9sJyk7XG4gICAgICAgIHRoaXMuZmxhc2guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnJlbW92ZSgpKTtcbiAgICAgICAgdGhpcy5mbGFzaC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB0aGlzLnN0b3BUaW1lcigpKTtcbiAgICAgICAgdGhpcy5mbGFzaC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHRoaXMuc3RhcnRUaW1lcigpKTtcblxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hUaW1lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaFRpbWVyLmNsYXNzTGlzdC5hZGQoJ2ZsYXNoLXRpbWVyJyk7XG4gICAgICAgICAgICB0aGlzLmZsYXNoLmFwcGVuZENoaWxkKHRoaXMuZmxhc2hUaW1lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoLmNsYXNzTGlzdC5hZGQoJ25vLXRpbWVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdG8gYm9keVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZmxhc2gpO1xuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLnRyYW5zaXRpb24odGhpcy5mbGFzaCwgJ3Nob3cnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgZmxhc2ggbWVzc2FnZS5cbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCdmbGFzaC5yZW1vdmUnLCB0aGlzKTtcblxuICAgICAgICB0aGlzLnN0b3BUaW1lcigpO1xuXG4gICAgICAgIHRoaXMuc25vd2JvYXJkLnRyYW5zaXRpb24odGhpcy5mbGFzaCwgJ2hpZGUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZsYXNoLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmRlc3RydWN0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgZmxhc2ggbWVzc2FnZXMgYXZhaWxhYmxlIG9uIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ID4gZGl2LmZsYXNoLW1lc3NhZ2UnKS5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50LnJlbW92ZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIHRpbWVyIGZvciB0aGlzIGZsYXNoIG1lc3NhZ2UuXG4gICAgICovXG4gICAgc3RhcnRUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGltZXJUcmFucyA9IHRoaXMuc25vd2JvYXJkLnRyYW5zaXRpb24odGhpcy5mbGFzaFRpbWVyLCAndGltZW91dCcsIG51bGwsIGAke3RoaXMuZHVyYXRpb259LjBzYCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMudGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbW92ZSgpLCB0aGlzLmR1cmF0aW9uICogMTAwMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSB0aW1lciBmb3IgdGhpcyBmbGFzaCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0b3BUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZXJUcmFucykge1xuICAgICAgICAgICAgdGhpcy50aW1lclRyYW5zLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBEZWZpbmVzIGEgZGVmYXVsdCBsaXN0ZW5lciBmb3IgZmxhc2ggZXZlbnRzLlxuICpcbiAqIENvbm5lY3RzIHRoZSBGbGFzaCBwbHVnaW4gdG8gdmFyaW91cyBldmVudHMgdGhhdCB1c2UgZmxhc2ggbWVzc2FnZXMuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsYXNoTGlzdGVuZXIgZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgZGVwZW5kZW5pY2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFsnZmxhc2gnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWR5OiAncmVhZHknLFxuICAgICAgICAgICAgYWpheEVycm9yTWVzc2FnZTogJ2FqYXhFcnJvck1lc3NhZ2UnLFxuICAgICAgICAgICAgYWpheEZsYXNoTWVzc2FnZXM6ICdhamF4Rmxhc2hNZXNzYWdlcycsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG8gZmxhc2ggbWVzc2FnZXMgZm9yIFBIUCBmbGFzaCByZXNwb25zZXMuXG4gICAgICovXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNvbnRyb2w9XCJmbGFzaC1tZXNzYWdlXCJdJykuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZmxhc2goXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwsXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmZsYXNoVHlwZSxcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuZmxhc2hEdXJhdGlvbixcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIGEgZmxhc2ggbWVzc2FnZSBmb3IgQUpBWCBlcnJvcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGFqYXhFcnJvck1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5mbGFzaChtZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIGZsYXNoIG1lc3NhZ2VzIHJldHVybmVkIGRpcmVjdGx5IGZyb20gQUpBWCBmdW5jdGlvbmFsaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2VzXG4gICAgICovXG4gICAgYWpheEZsYXNoTWVzc2FnZXMobWVzc2FnZXMpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMobWVzc2FnZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbY3NzQ2xhc3MsIG1lc3NhZ2VdID0gZW50cnk7XG4gICAgICAgICAgICB0aGlzLnNub3dib2FyZC5mbGFzaChtZXNzYWdlLCBjc3NDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBBZGRzIEFKQVgtZHJpdmVuIGZvcm0gdmFsaWRhdGlvbiB0byBTbm93Ym9hcmQgcmVxdWVzdHMuXG4gKlxuICogRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBmZWF0dXJlIGNhbiBiZSBmb3VuZCBoZXJlOlxuICogaHR0cHM6Ly93aW50ZXJjbXMuY29tL2RvY3Mvc25vd2JvYXJkL2V4dHJhcyNhamF4LXZhbGlkYXRpb25cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybVZhbGlkYXRpb24gZXh0ZW5kcyBTaW5nbGV0b24ge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdCgpIHtcbiAgICAgICAgdGhpcy5lcnJvckJhZ3MgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWR5OiAncmVhZHknLFxuICAgICAgICAgICAgYWpheFN0YXJ0OiAnY2xlYXJWYWxpZGF0aW9uJyxcbiAgICAgICAgICAgIGFqYXhWYWxpZGF0aW9uRXJyb3JzOiAnZG9WYWxpZGF0aW9uJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkeSBldmVudCBoYW5kbGVyLlxuICAgICAqL1xuICAgIHJlYWR5KCkge1xuICAgICAgICB0aGlzLmNvbGxlY3RFcnJvckJhZ3MoZG9jdW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB2YWxpZGF0aW9uIGVycm9ycyBmcm9tIGFuIEFKQVggcmVzcG9uc2UgYW5kIHBhc3NlcyB0aGVtIHRocm91Z2ggdG8gdGhlIGVycm9yIGJhZ3MuXG4gICAgICpcbiAgICAgKiBUaGlzIGhhbmRsZXIgcmV0dXJucyBmYWxzZSB0byBjYW5jZWwgYW55IGZ1cnRoZXIgdmFsaWRhdGlvbiBoYW5kbGluZywgYW5kIHByZXZlbnRzIHRoZSBmbGFzaFxuICAgICAqIG1lc3NhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgYnkgZGVmYXVsdCBmb3IgZmllbGQgZXJyb3JzIGluIEFKQVggcmVxdWVzdHMgZnJvbSBzaG93aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRm9ybUVsZW1lbnR9IGZvcm1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW52YWxpZEZpZWxkc1xuICAgICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGRvVmFsaWRhdGlvbihmb3JtLCBpbnZhbGlkRmllbGRzLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0LmVsZW1lbnQgJiYgcmVxdWVzdC5lbGVtZW50LmRhdGFzZXQucmVxdWVzdFZhbGlkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlcnJvckJhZ3MgPSB0aGlzLmVycm9yQmFncy5maWx0ZXIoKGVycm9yQmFnKSA9PiBlcnJvckJhZy5mb3JtID09PSBmb3JtKTtcbiAgICAgICAgZXJyb3JCYWdzLmZvckVhY2goKGVycm9yQmFnKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvckJhZyhlcnJvckJhZywgaW52YWxpZEZpZWxkcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYW55IHZhbGlkYXRpb24gZXJyb3JzIGluIHRoZSBnaXZlbiBmb3JtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9taXNlfSBwcm9taXNlXG4gICAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXF1ZXN0XG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgY2xlYXJWYWxpZGF0aW9uKHByb21pc2UsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QuZWxlbWVudCAmJiByZXF1ZXN0LmVsZW1lbnQuZGF0YXNldC5yZXF1ZXN0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVxdWVzdC5mb3JtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlcnJvckJhZ3MgPSB0aGlzLmVycm9yQmFncy5maWx0ZXIoKGVycm9yQmFnKSA9PiBlcnJvckJhZy5mb3JtID09PSByZXF1ZXN0LmZvcm0pO1xuICAgICAgICBlcnJvckJhZ3MuZm9yRWFjaCgoZXJyb3JCYWcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZUVycm9yQmFnKGVycm9yQmFnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdHMgZXJyb3IgYmFncyAoZWxlbWVudHMgd2l0aCBcImRhdGEtdmFsaWRhdGUtZXJyb3JcIiBhdHRyaWJ1dGUpIGFuZCBsaW5rcyB0aGVtIHRvIGFcbiAgICAgKiBwbGFjZWhvbGRlciBhbmQgZm9ybS5cbiAgICAgKlxuICAgICAqIFRoZSBlcnJvciBiYWdzIHdpbGwgYmUgaW5pdGlhbGx5IGhpZGRlbiwgYW5kIHdpbGwgb25seSBzaG93IHdoZW4gdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb290Tm9kZVxuICAgICAqL1xuICAgIGNvbGxlY3RFcnJvckJhZ3Mocm9vdE5vZGUpIHtcbiAgICAgICAgcm9vdE5vZGUucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdmFsaWRhdGUtZXJyb3JdLCBbZGF0YS12YWxpZGF0ZS1mb3JdJykuZm9yRWFjaCgoZXJyb3JCYWcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBlcnJvckJhZy5jbG9zZXN0KCdmb3JtW2RhdGEtcmVxdWVzdC12YWxpZGF0ZV0nKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhpcyBlcnJvciBiYWcgZG9lcyBub3QgcmVzaWRlIHdpdGhpbiBhIHZhbGlkYXRpbmcgZm9ybSwgcmVtb3ZlIGl0XG4gICAgICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgICAgICBlcnJvckJhZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVycm9yQmFnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbmQgbWVzc2FnZSBsaXN0IG5vZGUsIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VMaXN0RWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXJyb3JCYWcubWF0Y2hlcygnW2RhdGEtdmFsaWRhdGUtZXJyb3JdJykpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQgPSBlcnJvckJhZy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tZXNzYWdlXScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBwbGFjZWhvbGRlciBub2RlXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBlcnJvciBiYWcgYW5kIHJlcGxhY2Ugd2l0aCBwbGFjZWhvbGRlclxuICAgICAgICAgICAgY29uc3QgZXJyb3JCYWdEYXRhID0ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVycm9yQmFnLFxuICAgICAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVGb3I6IChlcnJvckJhZy5kYXRhc2V0LnZhbGlkYXRlRm9yKVxuICAgICAgICAgICAgICAgICAgICA/IGVycm9yQmFnLmRhdGFzZXQudmFsaWRhdGVGb3Iuc3BsaXQoL1xccyosXFxzKi8pXG4gICAgICAgICAgICAgICAgICAgIDogJyonLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudDogKG1lc3NhZ2VMaXN0RWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgPyBtZXNzYWdlTGlzdEVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlTGlzdEFuY2hvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlOiAoZXJyb3JCYWcuZGF0YXNldC52YWxpZGF0ZUZvcilcbiAgICAgICAgICAgICAgICAgICAgPyAoZXJyb3JCYWcudGV4dENvbnRlbnQgIT09ICcnIHx8IGVycm9yQmFnLmNoaWxkTm9kZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIElmIGFuIG1lc3NhZ2UgbGlzdCBlbGVtZW50IGV4aXN0cywgY3JlYXRlIGFub3RoZXIgcGxhY2Vob2xkZXIgdG8gYWN0IGFzIGFuIGFuY2hvciBwb2ludFxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VMaXN0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VMaXN0QW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnJyk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG1lc3NhZ2VMaXN0QW5jaG9yLCBtZXNzYWdlTGlzdEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGVycm9yQmFnRGF0YS5tZXNzYWdlTGlzdEFuY2hvciA9IG1lc3NhZ2VMaXN0QW5jaG9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvckJhZy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChwbGFjZWhvbGRlciwgZXJyb3JCYWcpO1xuXG4gICAgICAgICAgICB0aGlzLmVycm9yQmFncy5wdXNoKGVycm9yQmFnRGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGVzIGFuIGVycm9yIGJhZywgcmVwbGFjaW5nIHRoZSBlcnJvciBtZXNzYWdlcyB3aXRoIGEgcGxhY2Vob2xkZXIgbm9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlcnJvckJhZ1xuICAgICAqL1xuICAgIGhpZGVFcnJvckJhZyhlcnJvckJhZykge1xuICAgICAgICBpZiAoZXJyb3JCYWcuZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgZXJyb3JCYWcuZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlcnJvckJhZy5wbGFjZWhvbGRlciwgZXJyb3JCYWcuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhbiBlcnJvciBiYWcgd2l0aCB0aGUgZ2l2ZW4gaW52YWxpZCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JCYWdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW52YWxpZEZpZWxkc1xuICAgICAqL1xuICAgIHNob3dFcnJvckJhZyhlcnJvckJhZywgaW52YWxpZEZpZWxkcykge1xuICAgICAgICBpZiAoIXRoaXMuZXJyb3JCYWdWYWxpZGF0ZXNGaWVsZChlcnJvckJhZywgaW52YWxpZEZpZWxkcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXJyb3JCYWcuZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgZXJyb3JCYWcucGxhY2Vob2xkZXIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZXJyb3JCYWcuZWxlbWVudCwgZXJyb3JCYWcucGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yQmFnLnZhbGlkYXRlRm9yICE9PSAnKicpIHtcbiAgICAgICAgICAgIGlmICghZXJyb3JCYWcuY3VzdG9tTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0RmllbGQgPSBPYmplY3Qua2V5cyhpbnZhbGlkRmllbGRzKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZXJyb3JCYWcudmFsaWRhdGVGb3IuaW5jbHVkZXMoZmllbGQpKVxuICAgICAgICAgICAgICAgICAgICAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBbZXJyb3JCYWcuZWxlbWVudC5pbm5lckhUTUxdID0gaW52YWxpZEZpZWxkc1tmaXJzdEZpZWxkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlcnJvckJhZy5tZXNzYWdlTGlzdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBwcmV2aW91cyBlcnJvciBtZXNzYWdlc1xuICAgICAgICAgICAgZXJyb3JCYWcuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS12YWxpZGF0aW9uLW1lc3NhZ2VdJykuZm9yRWFjaCgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpbnZhbGlkRmllbGRzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFssIGVycm9yc10gPSBlbnRyeTtcblxuICAgICAgICAgICAgICAgIGVycm9ycy5mb3JFYWNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRWxlbWVudCA9IGVycm9yQmFnLm1lc3NhZ2VMaXN0RWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmRhdGFzZXQudmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuaW5uZXJIVE1MID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yQmFnLm1lc3NhZ2VMaXN0QW5jaG9yLmFmdGVyKG1lc3NhZ2VFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgW2Vycm9yQmFnLmVsZW1lbnQuaW5uZXJIVE1MXSA9IGludmFsaWRGaWVsZHNbT2JqZWN0LmtleXMoaW52YWxpZEZpZWxkcykuc2hpZnQoKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gZXJyb3IgYmFnIGFwcGxpZXMgZm9yIHRoZSBnaXZlbiBpbnZhbGlkIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlcnJvckJhZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnZhbGlkRmllbGRzXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgZXJyb3JCYWdWYWxpZGF0ZXNGaWVsZChlcnJvckJhZywgaW52YWxpZEZpZWxkcykge1xuICAgICAgICBpZiAoZXJyb3JCYWcudmFsaWRhdGVGb3IgPT09ICcqJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaW52YWxpZEZpZWxkcylcbiAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiBlcnJvckJhZy52YWxpZGF0ZUZvci5pbmNsdWRlcyhmaWVsZCkpXG4gICAgICAgICAgICAubGVuZ3RoID4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIERpc3BsYXlzIGEgc3RyaXBlIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UgdGhhdCBpbmRpY2F0ZXMgbG9hZGluZy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjEgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyaXBlTG9hZGVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGRlcGVuZGVuaWNlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3JlcXVlc3QnXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWR5OiAncmVhZHknLFxuICAgICAgICAgICAgYWpheFN0YXJ0OiAnYWpheFN0YXJ0JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZWFkeSgpIHtcbiAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcblxuICAgICAgICB0aGlzLmNyZWF0ZVN0cmlwZSgpO1xuICAgIH1cblxuICAgIGFqYXhTdGFydChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0Lm9wdGlvbnMuc3RyaXBlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93KCk7XG5cbiAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY3JlYXRlU3RyaXBlKCkge1xuICAgICAgICB0aGlzLmluZGljYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICB0aGlzLnN0cmlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICB0aGlzLnN0cmlwZUxvYWRlZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoJ3N0cmlwZS1sb2FkaW5nLWluZGljYXRvcicsICdsb2FkZWQnKTtcbiAgICAgICAgdGhpcy5zdHJpcGUuY2xhc3NMaXN0LmFkZCgnc3RyaXBlJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlTG9hZGVkLmNsYXNzTGlzdC5hZGQoJ3N0cmlwZS1sb2FkZWQnKTtcblxuICAgICAgICB0aGlzLmluZGljYXRvci5hcHBlbmRDaGlsZCh0aGlzLnN0cmlwZSk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmFwcGVuZENoaWxkKHRoaXMuc3RyaXBlTG9hZGVkKTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuaW5kaWNhdG9yKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmNvdW50ZXIgKz0gMTtcblxuICAgICAgICBjb25zdCBuZXdTdHJpcGUgPSB0aGlzLnN0cmlwZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLmFwcGVuZENoaWxkKG5ld1N0cmlwZSk7XG4gICAgICAgIHRoaXMuc3RyaXBlLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnN0cmlwZSA9IG5ld1N0cmlwZTtcblxuICAgICAgICBpZiAodGhpcy5jb3VudGVyID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbmRpY2F0b3IuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGVkJyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnd24tbG9hZGluZycpO1xuICAgIH1cblxuICAgIGhpZGUoZm9yY2UpIHtcbiAgICAgICAgdGhpcy5jb3VudGVyIC09IDE7XG5cbiAgICAgICAgaWYgKGZvcmNlID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdsb2FkZWQnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnd24tbG9hZGluZycpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBFbWJlZHMgdGhlIFwiZXh0cmFzXCIgc3R5bGVzaGVldCBpbnRvIHRoZSBwYWdlLCBpZiBpdCBpcyBub3QgbG9hZGVkIHRocm91Z2ggdGhlIHRoZW1lLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdHlsZXNoZWV0TG9hZGVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgbGlzdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWR5OiAncmVhZHknLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlYWR5KCkge1xuICAgICAgICBsZXQgc3R5bGVzTG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHN0eWxlc2hlZXQgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdJykuZm9yRWFjaCgoY3NzKSA9PiB7XG4gICAgICAgICAgICBpZiAoY3NzLmhyZWYuZW5kc1dpdGgoJy9tb2R1bGVzL3N5c3RlbS9hc3NldHMvY3NzL3Nub3dib2FyZC5leHRyYXMuY3NzJykpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXN0eWxlc0xvYWRlZCkge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQuc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpO1xuICAgICAgICAgICAgc3R5bGVzaGVldC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB0aGlzLnNub3dib2FyZC51cmwoKS5hc3NldCgnL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9jc3Mvc25vd2JvYXJkLmV4dHJhcy5jc3MnKSk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlc2hlZXQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFBsdWdpbkJhc2UgZnJvbSAnLi4vYWJzdHJhY3RzL1BsdWdpbkJhc2UnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgZWxlbWVudHMuXG4gKlxuICogVHJhbnNpdGlvbiBhbGxvd3MgQ1NTIHRyYW5zaXRpb25zIHRvIGJlIGNvbnRyb2xsZWQgYW5kIGNhbGxiYWNrcyB0byBiZSBydW4gb25jZSBjb21wbGV0ZWQuIEl0IHdvcmtzIHNpbWlsYXIgdG8gVnVlXG4gKiB0cmFuc2l0aW9ucyB3aXRoIDMgc3RhZ2VzIG9mIHRyYW5zaXRpb24sIGFuZCBjbGFzc2VzIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50IHdpdGggdGhlIHRyYW5zaXRpb24gbmFtZSBzdWZmaXhlZCB3aXRoXG4gKiB0aGUgc3RhZ2Ugb2YgdHJhbnNpdGlvbjpcbiAqXG4gKiAgLSBgaW5gOiBBIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50IGZvciB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlIHRyYW5zaXRpb24sIHJlbW92ZWQgYWZ0ZXJ3YXJkcy4gVGhpcyBzaG91bGQgYmVcbiAqICAgICAgdXNlZCB0byBkZWZpbmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHRyYW5zaXRpb24uXG4gKiAgLSBgYWN0aXZlYDogQSBjbGFzcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGRlZmluZSB0aGVcbiAqICAgICAgdHJhbnNpdGlvbiBpdHNlbGYuXG4gKiAgLSBgb3V0YDogQSBjbGFzcyBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCBhZnRlciB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlIHRyYW5zaXRpb24gYW5kIGtlcHQgdG8gdGhlIGVuZCBvZiB0aGVcbiAqICAgICAgdHJhbnNpdGlvbi4gVGhpcyBzaG91bGQgZGVmaW5lIHRoZSBlbmQgc3RhdGUgb2YgdGhlIHRyYW5zaXRpb24uXG4gKlxuICogVXNhZ2U6XG4gKiAgICAgIFNub3dib2FyZC50cmFuc2l0aW9uKGRvY3VtZW50LmVsZW1lbnQsICd0cmFuc2l0aW9uJywgKCkgPT4ge1xuICogICAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZSBlbGVtZW50IGFmdGVyIDcgc2Vjb25kcycpO1xuICogICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAqICAgICAgfSwgJzdzJyk7XG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYW5zaXRpb24gZXh0ZW5kcyBQbHVnaW5CYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdHJhbnNpdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2l0aW9uIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2l0aW9uLCB0aGlzIHByZWZpeGVzIHRoZSBzdGFnZXMgb2YgdHJhbnNpdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBbiBvcHRpb25hbCBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHRyYW5zaXRpb24gZW5kcy5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZHVyYXRpb24gQW4gb3B0aW9uYWwgb3ZlcnJpZGUgb24gdGhlIHRyYW5zaXRpb24gZHVyYXRpb24uIE11c3QgYmUgc3BlY2lmaWVkIGFzICdzJyAoc2Vjcykgb3IgJ21zJyAobXNlY3MpLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdHJhaWxUbyBJZiB0cnVlLCB0aGUgXCJvdXRcIiBjbGFzcyB3aWxsIHJlbWFpbiBhZnRlciB0aGUgZW5kIG9mIHRoZSB0cmFuc2l0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdChlbGVtZW50LCB0cmFuc2l0aW9uLCBjYWxsYmFjaywgZHVyYXRpb24sIHRyYWlsVG8pIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBIVE1MRWxlbWVudCBtdXN0IGJlIHByb3ZpZGVkIGZvciB0cmFuc2l0aW9uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICBpZiAodHlwZW9mIHRyYW5zaXRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zaXRpb24gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsYmFjayBtdXN0IGJlIGEgdmFsaWQgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gdGhpcy5wYXJzZUR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFpbFRvID0gKHRyYWlsVG8gPT09IHRydWUpO1xuXG4gICAgICAgIHRoaXMuZG9UcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBldmVudCBjbGFzc2VzIHRvIHRoZSBnaXZlbiB0cmFuc2l0aW9uIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGV2ZW50Q2xhc3NlcyguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q2xhc3NlcyA9IHtcbiAgICAgICAgICAgIGluOiBgJHt0aGlzLnRyYW5zaXRpb259LWluYCxcbiAgICAgICAgICAgIGFjdGl2ZTogYCR7dGhpcy50cmFuc2l0aW9ufS1hY3RpdmVgLFxuICAgICAgICAgICAgb3V0OiBgJHt0aGlzLnRyYW5zaXRpb259LW91dGAsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudENsYXNzZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV0dXJuQ2xhc3NlcyA9IFtdO1xuICAgICAgICBPYmplY3QuZW50cmllcyhldmVudENsYXNzZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcblxuICAgICAgICAgICAgaWYgKGFyZ3MuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybkNsYXNzZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5DbGFzc2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZG9UcmFuc2l0aW9uKCkge1xuICAgICAgICAvLyBBZGQgZHVyYXRpb24gb3ZlcnJpZGVcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldENsYXNzZXMoKTtcblxuICAgICAgICAvLyBTdGFydCB0cmFuc2l0aW9uIC0gc2hvdyBcImluXCIgYW5kIFwiYWN0aXZlXCIgY2xhc3Nlc1xuICAgICAgICB0aGlzLmV2ZW50Q2xhc3NlcygnaW4nLCAnYWN0aXZlJykuZm9yRWFjaCgoZXZlbnRDbGFzcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoZXZlbnRDbGFzcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gRW5zdXJlIGEgdHJhbnNpdGlvbiBleGlzdHNcbiAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpWyd0cmFuc2l0aW9uLWR1cmF0aW9uJ10gIT09ICcwcycpIHtcbiAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIHRoZSB0cmFuc2l0aW9uIHRvIGVuZFxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4gdGhpcy5vblRyYW5zaXRpb25FbmQoKSwge1xuICAgICAgICAgICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmV2ZW50Q2xhc3NlcygnaW4nKVswXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuZXZlbnRDbGFzc2VzKCdvdXQnKVswXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRDbGFzc2VzKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrLmFwcGx5KHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICpcbiAgICAgKiBXaGVuIGEgdHJhbnNpdGlvbiBlbmRzLCB0aGUgaW5zdGFuY2Ugb2YgdGhlIHRyYW5zaXRpb24gaXMgYXV0b21hdGljYWxseSBkZXN0cnVjdGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgb25UcmFuc2l0aW9uRW5kKCkge1xuICAgICAgICB0aGlzLmV2ZW50Q2xhc3NlcygnYWN0aXZlJywgKCF0aGlzLnRyYWlsVG8pID8gJ291dCcgOiAnJykuZm9yRWFjaCgoZXZlbnRDbGFzcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZXZlbnRDbGFzcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrLmFwcGx5KHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZHVyYXRpb24gb3ZlcnJpZGVcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbmNlbHMgYSB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRoaXMub25UcmFuc2l0aW9uRW5kLCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0Q2xhc3NlcygpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBkdXJhdGlvbiBvdmVycmlkZVxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGRlc3RydWN0b3JcbiAgICAgICAgdGhpcy5kZXN0cnVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgY2xhc3NlcywgcmVtb3ZpbmcgYW55IHRyYW5zaXRpb24gY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlc2V0Q2xhc3NlcygpIHtcbiAgICAgICAgdGhpcy5ldmVudENsYXNzZXMoKS5mb3JFYWNoKChldmVudENsYXNzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShldmVudENsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgZ2l2ZW4gZHVyYXRpb24gYW5kIGNvbnZlcnRzIGl0IHRvIGEgXCJtc1wiIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGR1cmF0aW9uXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBwYXJzZUR1cmF0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IC9eKFswLTldKyhcXC5bMC05XSspPykobT9zKT8kLy5leGVjKGR1cmF0aW9uKTtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gTnVtYmVyKHBhcnNlZFsxXSk7XG4gICAgICAgIGNvbnN0IHVuaXQgPSAocGFyc2VkWzNdID09PSAncycpXG4gICAgICAgICAgICA/ICdzZWMnXG4gICAgICAgICAgICA6ICdtc2VjJztcblxuICAgICAgICByZXR1cm4gKHVuaXQgPT09ICdzZWMnKVxuICAgICAgICAgICAgPyBgJHthbW91bnQgKiAxMDAwfW1zYFxuICAgICAgICAgICAgOiBgJHtNYXRoLmZsb29yKGFtb3VudCl9bXNgO1xuICAgIH1cbn1cbiIsImltcG9ydCBQbHVnaW5CYXNlIGZyb20gJy4uL2Fic3RyYWN0cy9QbHVnaW5CYXNlJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUcmlnZ2VyRW50aXR5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlciBUaGUgc2VsZWN0b3IgZm9yIHRoZSB0cmlnZ2VyIHRhcmdldCBlbGVtZW50KHMpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmRpdGlvbiBUaGUgY29uZGl0aW9uIHRoYXQgbXVzdCBiZSBtZXQgZm9yIHRoZSB0cmlnZ2VyIHRvIGZpcmUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHRoZSB0cmlnZ2VyIGZpcmVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd8dW5kZWZpbmVkfSBwYXJlbnQgVGhlIHBhcmVudCBlbGVtZW50IHdpdGggd2hpY2ggdG8gbGltaXQgdGhlIHRyaWdnZXIgc2NvcGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IHByaW9yaXR5IFRoZSBwcmlvcml0eSBvZiB0aGUgdHJpZ2dlciBldmVudC5cbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnRbXX0gZWxlbWVudHMgVGhlIHRhcmdldCBlbGVtZW50cyB0aGF0IHRoaXMgdHJpZ2dlciBhcHBsaWVzIHRvLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbltdfSBjb25kaXRpb25DYWxsYmFja3MgVGhlIGNvbmRpdGlvbiBjYWxsYmFja3MgZm9yIHRoaXMgdHJpZ2dlci5cbiAqIEBwcm9wZXJ0eSB7TWFwPEhUTUxFbGVtZW50LCBTZXQ8c3RyaW5nPj59IGVsZW1lbnRFdmVudHMgVGhlIGV2ZW50cyByZWdpc3RlcmVkIG9uIHRoZSB0YXJnZXQgZWxlbWVudHMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJpZ2dlckVsZW1lbnRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgdHJpZ2dlciBldmVudCBuYW1lLlxuICogQHByb3BlcnR5IHtpbnR9IHByaW9yaXR5IFRoZSB0cmlnZ2VyIGV2ZW50IHByaW9yaXR5LlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZXZlbnQgVGhlIHRyaWdnZXIgZXZlbnQgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBUcmlnZ2VyIGhhbmRsZXIgZm9yIEhUTUwgZWxlbWVudHMuXG4gKlxuICogVGhpcyBpcyBhIHJlLWltYWdpbmluZyBvZiB0aGUgSW5wdXQuVHJpZ2dlciBmdW5jdGlvbmFsaXR5IGluIHRoZSBvcmlnaW5hbCBXaW50ZXIgQ01TIGZyYW1ld29yayxcbiAqIGluaXRpYWxpc2VkIHRocm91Z2ggdGhlIGBkYXRhLXRyaWdnZXJgIGF0dHJpYnV0ZXMuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gcmVtYWluaW5nIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsIElucHV0LlRyaWdnZXIgZnVuY3Rpb25hbGl0eSwgdGhpc1xuICogaGFuZGxlciBhZGRzIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBhbmQgY29uZmlndXJhdGlvbiBmb3IgbW9yZSBmbGV4aWJsZSB0cmlnZ2VyIHVzYWdlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly93aW50ZXJjbXMuY29tL2RvY3MvdjEuMi91aS9zY3JpcHQvaW5wdXQtdHJpZ2dlclxuICpcbiAqIEBjb3B5cmlnaHQgMjAyNCBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmlnZ2VyIGV4dGVuZHMgUGx1Z2luQmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3RydWN0KGVsZW1lbnQpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBlbGVtZW50IHRoaXMgaW5zdGFuY2UgaXMgYXR0YWNoZWQgdG8uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgVHJpZ2dlckVudGl0eT59IFRoZSB0cmlnZ2VycyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VycyA9IG5ldyBNYXAoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge01hcDxFbGVtZW50LCBTZXQ8VHJpZ2dlckVsZW1lbnQ+Pn0gQSBtYXAgb2YgZWxlbWVudHMgdGhhdCB0cmlnZ2VyIGV2ZW50cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXZlbnRzID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TWFwPEVsZW1lbnQsIE1hcDxzdHJpbmcsIEZ1bmN0aW9uPj59IEEgbWFwIG9mIGVsZW1lbnRzIGFuZCB0aGVpciBldmVudCBjb25uZWN0b3JzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb25uZWN0b3JzID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VUcmlnZ2VycygpO1xuXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVRyaWdnZXJFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMucnVuRXZlbnRzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuc25vd2JvYXJkLmdsb2JhbEV2ZW50KCd0cmlnZ2Vycy5yZWFkeScsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cnVjdG9yLlxuICAgICAqL1xuICAgIGRlc3RydWN0KCkge1xuICAgICAgICB0aGlzLnJlc2V0RXZlbnRzKCk7XG4gICAgICAgIHN1cGVyLmRlc3RydWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHRoZSBlbGVtZW50J3MgZGF0YSBhdHRyaWJ1dGVzIGFuZCBkZXRlcm1pbmVzIGFwcGxpY2FibGUgdHJpZ2dlcnMuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VyIGRhdGEgYXR0cmlidXRlcyBtdXN0IGJlIGluIHRoZSBmb3JtYXQgYGRhdGEtdHJpZ2dlci1bbmFtZV0tW3BhcmFtZXRlcl1gIGZvciBtdWx0aXBsZVxuICAgICAqIHRyaWdnZXJzLCBvciBgZGF0YS10cmlnZ2VyLVtwYXJhbWV0ZXJdYCBmb3Igc2luZ2xlIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogU3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlOlxuICAgICAqICAtIGBjb25kaXRpb25gIG9yIGB3aGVyZWA6IFRoZSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHRyaWdnZXIgdG8gZmlyZS5cbiAgICAgKiAgLSBgYWN0aW9uYCBvciBgZG9gOiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgdHJpZ2dlciBmaXJlcy5cbiAgICAgKiAgLSBgY2xvc2VzdC1wYXJlbnRgIG9yIGBwYXJlbnRgOiBUaGUgcGFyZW50IGVsZW1lbnQgd2l0aCB3aGljaCB0byBsaW1pdCB0aGUgdHJpZ2dlciBzY29wZS5cbiAgICAgKiAgLSBgcHJpb3JpdHlgOiBUaGUgcHJpb3JpdHkgaW4gd2hpY2ggdG8gY29uc2lkZXIgdGhlIHRyaWdnZXIuXG4gICAgICpcbiAgICAgKiBJbnRlcm5hbGx5LCB0aGUgdHJpZ2dlciBtYXAgdXNlcyB0aGUgYHRyaWdnZXJgIHBhcmFtZXRlciB0byBzdG9yZSB0aGUgdHJpZ2dlciBzZWxlY3Rvci5cbiAgICAgKi9cbiAgICBwYXJzZVRyaWdnZXJzKCkge1xuICAgICAgICBjb25zdCB7IGRhdGFzZXQgfSA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5jbGVhcigpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFzZXQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKC8tW0EtWl0vLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgY2FtZWxDYXNlIHRvIGRhc2gtc3R5bGUgZm9yIGRhdGEgYXR0cmlidXRlOiAke2tleX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGFzaFN0eWxlID0ga2V5LnJlcGxhY2UoLyhbQS1aXSkvZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcblxuICAgICAgICAgICAgaWYgKGRhc2hTdHlsZSAhPT0gJ3RyaWdnZXInICYmICFkYXNoU3R5bGUuc3RhcnRzV2l0aCgndHJpZ2dlci0nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlclBhcnRzID0gLyhbYS16MC05XFwtLjpfXSs/KSg/Oig/Oi0pKGNsb3Nlc3QtcGFyZW50fGNvbmRpdGlvbnx3aGVufGFjdGlvbnxwYXJlbnR8cHJpb3JpdHl8ZG8pKT8kL2kuZXhlYyhcbiAgICAgICAgICAgICAgICBkYXNoU3R5bGUucmVwbGFjZSgndHJpZ2dlci0nLCAnJykudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCB0cmlnZ2VyTmFtZSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdHJpZ2dlclR5cGUgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgWyd0cmlnZ2VyJywgJ2NvbmRpdGlvbicsICdhY3Rpb24nLCAncGFyZW50JywgJ3doZW4nLCAnY2xvc2VzdCddLmluZGV4T2YodHJpZ2dlclBhcnRzWzFdKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAmJiAodHJpZ2dlclBhcnRzWzFdICE9PSAnY2xvc2VzdCcgfHwgKHRyaWdnZXJQYXJ0c1sxXSA9PT0gJ2Nsb3Nlc3QnICYmIHRyaWdnZXJQYXJ0c1syXSA9PT0gJ3BhcmVudCcpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBvcmlnaW5hbCB0cmlnZ2VyIGZvcm1hdFxuICAgICAgICAgICAgICAgIHRyaWdnZXJOYW1lID0gJ19fb3JpZ2luYWwnO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gKHRyaWdnZXJQYXJ0c1sxXSA9PT0gJ2Nsb3Nlc3QnKSA/ICdwYXJlbnQnIDogdHJpZ2dlclBhcnRzWzFdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUGFydHNbMl0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IFsnY2xvc2VzdC1wYXJlbnQnLCAnY29uZGl0aW9uJywgJ3doZW4nLCAnYWN0aW9uJywgJ3BhcmVudCcsICdwcmlvcml0eScsICdkbyddLmluZGV4T2YodHJpZ2dlclBhcnRzWzJdKSAhPT0gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFBhcnNlIG11bHRpLXRyaWdnZXIgZm9ybWF0XG4gICAgICAgICAgICAgICAgWywgdHJpZ2dlck5hbWVdID0gdHJpZ2dlclBhcnRzO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJpZ2dlclBhcnRzWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3Nlc3QtcGFyZW50JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGFyZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ3BhcmVudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29uZGl0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2hlbic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICdjb25kaXRpb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJUeXBlID0gJ2FjdGlvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJpb3JpdHknOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUgPSAncHJpb3JpdHknO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9ICd0cmlnZ2VyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJzLmhhcyh0cmlnZ2VyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJzLnNldCh0cmlnZ2VyTmFtZSwgbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcnMuZ2V0KHRyaWdnZXJOYW1lKS5zZXQodHJpZ2dlclR5cGUsIGRhdGFzZXRba2V5XSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0cmlnZ2VyIGRhdGEgYXR0cmlidXRlIGFmdGVyIHBhcnNpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0W2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRyaWdnZXJzLCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgZG8gbm90IGhhdmUgYXQgbGVhc3QgYSB0cmlnZ2VyIHNlbGVjdG9yLCBhXG4gICAgICAgIC8vIGNvbmRpdGlvbiBhbmQgYW4gYWN0aW9uLCBvciBhcmUgdXNpbmcgaW52YWxpZCBjb25kaXRpb25zIG9yIGFjdGlvbnNcbiAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKCh0cmlnZ2VyLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKHRyaWdnZXIpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRyaWdnZXIuaGFzKCd0cmlnZ2VyJylcbiAgICAgICAgICAgICAgICB8fCAhdHJpZ2dlci5oYXMoJ2NvbmRpdGlvbicpXG4gICAgICAgICAgICAgICAgfHwgIXRyaWdnZXIuaGFzKCdhY3Rpb24nKVxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIHx8ICF0aGlzLmhhc1ZhbGlkQ29uZGl0aW9ucyh0cmlnZ2VyKVxuICAgICAgICAgICAgICAgIHx8ICF0aGlzLmhhc1ZhbGlkQWN0aW9ucyh0cmlnZ2VyKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2Vycy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyaWdnZXIuc2V0KCdlbGVtZW50cycsIGVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRyaWdnZXIuaGFzKCdwcmlvcml0eScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuc2V0KCdwcmlvcml0eScsIDEwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBjb21tYW5kIGdpdmVuIGFzIGVpdGhlciBhIGNvbmRpdGlvbiBvciBhbiBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBDb21tYW5kcyBhcmUgZm9ybWF0dGVkIGFzOiBuYW1lOnBhcmFtZXRlcjEscGFyYW1ldGVyMixwYXJhbWV0ZXIzLCBhbHRob3VnaCB3ZSBhbHNvIHN1cHBvcnRcbiAgICAgKiB0aGUgb2xkIGZvcm1hdCBvZiB2YWx1ZVtwYXJhbWV0ZXIxLHBhcmFtZXRlcjIscGFyYW1ldGVyM10gZm9yIHRoZSBgdmFsdWVgIGNvbW1hbmQgb25seS5cbiAgICAgKlxuICAgICAqIElmIGEgcGFyYW1ldGVyIHJlcXVpcmVzIGEgY29tbWEgd2l0aGluLCB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSB3cmFwcGVkIGluIHF1b3Rlcy5cbiAgICAgKlxuICAgICAqIE11bHRpcGxlIGNvbW1hbmRzIGNhbiBiZSBzZXBhcmF0ZWQgYnkgYSBwaXBlIGNoYXJhY3RlciBgfGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhbGxvd011bHRpcGxlXG4gICAgICogQHJldHVybnMge3tuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IHN0cmluZ1tdfVtdfVxuICAgICAqL1xuICAgIHBhcnNlQ29tbWFuZChjb21tYW5kLCBhbGxvd011bHRpcGxlID0gdHJ1ZSkge1xuICAgICAgICAvLyBTdXBwb3J0IG9sZC1mb3JtYXQgdmFsdWUgY29tbWFuZCAodmFsdWVbZm9vLGJhcl0pXG4gICAgICAgIGlmIChjb21tYW5kLnN0YXJ0c1dpdGgoJ3ZhbHVlJykgJiYgY29tbWFuZC5pbmNsdWRlcygnWycpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNvbW1hbmQubWF0Y2goL1teW1xcXV0rKD89XSkvZyk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gU3BsaXQgdmFsdWVzIHdpdGggY29tbWFzXG4gICAgICAgICAgICBtYXRjaC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRWYWx1ZXMgPSB2YWx1ZS5yZXBsYWNlKC8oJy4qPyg/PCFcXFxcKScpfChcIi4qPyg/PCFcXFxcKVwiKS9nLCAocXVvdGVkKSA9PiBxdW90ZWQucmVwbGFjZSgvLC9nLCAnfHx8JykpXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHNwbGl0VmFsdWUpID0+IHNwbGl0VmFsdWUucmVwbGFjZSgvXFx8XFx8XFx8L2csICcsJykucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykudHJpbSgpKTtcblxuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKC4uLnNwbGl0VmFsdWVzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHZhbHVlcyxcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIGNvbW1hbmRzXG4gICAgICAgIGlmIChjb21tYW5kLmluY2x1ZGVzKCd8JykgJiYgYWxsb3dNdWx0aXBsZSkge1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRDb21tYW5kcyA9IGNvbW1hbmQucmVwbGFjZSgvKCcuKj8oPzwhXFxcXCknKXwoXCIuKj8oPzwhXFxcXClcIikvZywgKHF1b3RlZCkgPT4gcXVvdGVkLnJlcGxhY2UoL1xcfC9nLCAnfHx8JykpXG4gICAgICAgICAgICAgICAgLnNwbGl0KCd8JylcbiAgICAgICAgICAgICAgICAubWFwKChzcGxpdFZhbHVlKSA9PiBzcGxpdFZhbHVlLnJlcGxhY2UoL1xcfFxcfFxcfC9nLCAnfCcpKTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgICAgICAgICAgIHNwbGl0Q29tbWFuZHMuZm9yRWFjaCgoc3BsaXRDb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCguLi50aGlzLnBhcnNlQ29tbWFuZChzcGxpdENvbW1hbmQsIGZhbHNlKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb21tYW5kLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgICAgIG5hbWU6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW10sXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtuYW1lLCBwYXJhbWV0ZXJzXSA9IGNvbW1hbmQuc3BsaXQoJzonLCAyKTtcblxuICAgICAgICBpZiAoIXBhcmFtZXRlcnMuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbcGFyYW1ldGVyc10sXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwbGl0VmFsdWVzID0gcGFyYW1ldGVycy5yZXBsYWNlKC8oJy4qPyg/PCFcXFxcKScpfChcIi4qPyg/PCFcXFxcKVwiKS9nLCAocXVvdGVkKSA9PiBxdW90ZWQucmVwbGFjZSgvLC9nLCAnfHx8JykpXG4gICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcCgoc3BsaXRWYWx1ZSkgPT4gc3BsaXRWYWx1ZS5yZXBsYWNlKC9cXHxcXHxcXHwvZywgJywnKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKS5yZXBsYWNlKC9cXFxcKFsnXCJdKS8sICckMScpLnRyaW0oKSk7XG5cbiAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogc3BsaXRWYWx1ZXMsXG4gICAgICAgIH1dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbnkgZWxlbWVudHMgYXJlIGFjY2Vzc2libGUgYnkgdGhlIHByb3ZpZGVkIHRyaWdnZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge01hcDxUcmlnZ2VyRW50aXR5Pn0gdHJpZ2dlclxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfVxuICAgICAqL1xuICAgIGdldFNlbGVjdGFibGVFbGVtZW50cyh0cmlnZ2VyKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyLmhhcygncGFyZW50JykpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5lbGVtZW50LmNsb3Nlc3QodHJpZ2dlci5nZXQoJ3BhcmVudCcpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZWxlbWVudC5jbG9zZXN0KHRyaWdnZXIuZ2V0KCdwYXJlbnQnKSkucXVlcnlTZWxlY3RvckFsbCh0cmlnZ2VyLmdldCgndHJpZ2dlcicpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRyaWdnZXIuZ2V0KCd0cmlnZ2VyJykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm92aWRlZCB0cmlnZ2VyIGNvbmRpdGlvbihzKSBhcmUgdmFsaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNWYWxpZENvbmRpdGlvbnModHJpZ2dlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNvbW1hbmQodHJpZ2dlci5nZXQoJ2NvbmRpdGlvbicpKS5ldmVyeSgoY29uZGl0aW9uKSA9PiBbXG4gICAgICAgICAgICAnY2hlY2tlZCcsXG4gICAgICAgICAgICAndW5jaGVja2VkJyxcbiAgICAgICAgICAgICdlbXB0eScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ29uZW9mJyxcbiAgICAgICAgICAgICdhbGxvZicsXG4gICAgICAgICAgICAnZm9jdXMnLFxuICAgICAgICAgICAgJ2F0dHInLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgXS5pbmNsdWRlcyhjb25kaXRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvdmlkZWQgdHJpZ2dlciBhY3Rpb24ocykgYXJlIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzVmFsaWRBY3Rpb25zKHRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb21tYW5kKHRyaWdnZXIuZ2V0KCdhY3Rpb24nKSkuZXZlcnkoKGFjdGlvbikgPT4gW1xuICAgICAgICAgICAgJ3Nob3cnLFxuICAgICAgICAgICAgJ2hpZGUnLFxuICAgICAgICAgICAgJ2VuYWJsZScsXG4gICAgICAgICAgICAnZGlzYWJsZScsXG4gICAgICAgICAgICAnZW1wdHknLFxuICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICd2YWx1ZU9mJyxcbiAgICAgICAgICAgICdjaGVjaycsXG4gICAgICAgICAgICAndW5jaGVjaycsXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ2NsYXNzT2YnLFxuICAgICAgICAgICAgJ2F0dHInLFxuICAgICAgICAgICAgJ2F0dHJPZicsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ3N0eWxlT2YnLFxuICAgICAgICBdLmluY2x1ZGVzKGFjdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdHJpZ2dlciBldmVudHMgb24gdHJpZ2dlciBhbmQgdGFyZ2V0IGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGNyZWF0ZVRyaWdnZXJFdmVudHMoKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlcikgPT4ge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCBjb25kaXRpb25zIGFuZCBjaGVjayB0aGVtIGFzIGEgZ3JvdXAuXG4gICAgICAgICAgICB0cmlnZ2VyLnNldCgnY29uZGl0aW9uQ2FsbGJhY2tzJywgW10pO1xuICAgICAgICAgICAgdHJpZ2dlci5zZXQoJ2VsZW1lbnRFdmVudHMnLCBuZXcgTWFwKCkpO1xuXG4gICAgICAgICAgICB0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnY29uZGl0aW9uJykpLmZvckVhY2goKGNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ29uZW9mJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsdWVDb25kaXRpb24odHJpZ2dlciwgZmFsc2UsIC4uLmNvbmRpdGlvbi5wYXJhbWV0ZXJzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWxsb2YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5nZXQoJ2NvbmRpdGlvbkNhbGxiYWNrcycpLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWx1ZUNvbmRpdGlvbih0cmlnZ2VyLCB0cnVlLCAuLi5jb25kaXRpb24ucGFyYW1ldGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VtcHR5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdjb25kaXRpb25DYWxsYmFja3MnKS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRW1wdHlDb25kaXRpb24odHJpZ2dlciksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd1bmNoZWNrZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5nZXQoJ2NvbmRpdGlvbkNhbGxiYWNrcycpLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGVja2VkQ29uZGl0aW9uKHRyaWdnZXIsIChjb25kaXRpb24ubmFtZSA9PT0gJ2NoZWNrZWQnKSwgLi4uY29uZGl0aW9uLnBhcmFtZXRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmb2N1cyc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLmdldCgnY29uZGl0aW9uQ2FsbGJhY2tzJykucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvY3VzZWRDb25kaXRpb24odHJpZ2dlciksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gZXZlbnQgdG8gYW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgcmVnaXN0ZXJzIHRoZSBldmVudCBpbiB0aGUgYGVsZW1lbnRFdmVudHNgIG1hcCBmb3IgbGF0ZXIgdXNhZ2UgYW5kIHJlbW92YWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqL1xuICAgIGFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsIGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAoIXRyaWdnZXIuZ2V0KCdlbGVtZW50RXZlbnRzJykuaGFzKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudEV2ZW50cycpLnNldChlbGVtZW50LCBuZXcgU2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdHJpZ2dlci5nZXQoJ2VsZW1lbnRFdmVudHMnKS5nZXQoZWxlbWVudCkuYWRkKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50RXZlbnRzJykuZ2V0KGVsZW1lbnQpLmFkZChldmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIERPTSBldmVudCBsaXN0ZW5lcnMgZm9yIHRhcmdldGVkIGVsZW1lbnRzIG9mIGFsbCB0cmlnZ2Vycy5cbiAgICAgKlxuICAgICAqIEFkZHMgYSBjb25uZWN0b3IgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBldmVudHMsIHNvIHRoYXQgd2UgbWF5IGVuYWJsZSBwcmlvcml0aXNhdGlvbiBhbmRcbiAgICAgKiBjb250cm9sIG92ZXIgdGhlIGZpcmluZyBvZiB0aGUgZXZlbnRzLCBhbmQgdGhlbiByZWdpc3RlcnMgRE9NIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlXG4gICAgICogZWxlbWVudHMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdG9ycyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXIpID0+IHtcbiAgICAgICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50RXZlbnRzJykuZm9yRWFjaCgoZXZlbnRzLCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV2ZW50cy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuc2V0KGVsZW1lbnQsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goKGV2ZW50TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbm5lY3RvcnMuaGFzKHsgZWxlbWVudCwgZXZlbnROYW1lIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JzLmFkZCh7IGVsZW1lbnQsIGV2ZW50TmFtZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBOdW1iZXIodHJpZ2dlci5nZXQoJ3ByaW9yaXR5JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLmdldCgnY29uZGl0aW9uQ2FsbGJhY2tzJykuZXZlcnkoKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmdldChlbGVtZW50KS5hZGQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbm5lY3RvcnMuZm9yRWFjaCgoeyBlbGVtZW50LCBldmVudE5hbWUgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RvcnMuaGFzKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0b3JzLnNldChlbGVtZW50LCBuZXcgTWFwKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29ubmVjdG9ycy5nZXQoZWxlbWVudCkuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RvcnMuZ2V0KGVsZW1lbnQpLnNldChldmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZ2V0KGVsZW1lbnQpLmZvckVhY2goKGVsZW1lbnRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRFdmVudC5ldmVudE5hbWUgPT09IGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKGVsZW1lbnRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKGVsZW1lbnRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRFdmVudC5ldmVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB0aGlzLmNvbm5lY3RvcnMuZ2V0KGVsZW1lbnQpLmdldChldmVudE5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRyaWdnZXIgdGhhdCBmaXJlcyB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQocykgbWF0Y2hlcyBvbmUgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtICB7Li4uc3RyaW5nfSB2YWx1ZXNcbiAgICAgKi9cbiAgICBjcmVhdGVWYWx1ZUNvbmRpdGlvbih0cmlnZ2VyLCBhbGwsIC4uLnZhbHVlcykge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9ZmlsZV0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnY2xpY2snKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnaW5wdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlcy5hZGQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiBlbGVtZW50VmFsdWVzLmhhcyh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLnNvbWUoKHZhbHVlKSA9PiBlbGVtZW50VmFsdWVzLmhhcyh2YWx1ZSkpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0cmlnZ2VyIHRoYXQgZmlyZXMgd2hlbiB0aGVyZSBpcyBubyB2YWx1ZSB3aXRoaW4gdGhlIHRhcmdldCBlbGVtZW50KHMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICovXG4gICAgY3JlYXRlRW1wdHlDb25kaXRpb24odHJpZ2dlcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9aW1hZ2VdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1zdWJtaXRdJykpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b25zIGFuZCBmaWxlIGlucHV0cyBhcmUgdW5zdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudChlbGVtZW50LCB0cmlnZ2VyLCAnY2xpY2snKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2lucHV0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWVzID0gbmV3IFNldCgpO1xuXG4gICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlcy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlcy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50VmFsdWVzLnNpemUgPT09IDA7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRyaWdnZXIgdGhhdCBmaXJlcyB3aGVuIGEgdGFyZ2V0IGVsZW1lbnQocykgaXMgY2hlY2tlZC91bmNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrZWQgSWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3IgdW5jaGVja2VkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnx1bmRlZmluZWR9IGF0TGVhc3QgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgbXVzdCBiZSBjaGVja2VkLlxuICAgICAqICBEZWZhdWx0cyB0byAxIGlmIHVuZGVmaW5lZC4gSWYgc3BlY2lmaWVkIGFzIGBhbGxgLCBhbGwgZWxlbWVudHMgbXVzdCBiZSBjaGVja2VkLlxuICAgICAqL1xuICAgIGNyZWF0ZUNoZWNrZWRDb25kaXRpb24odHJpZ2dlciwgY2hlY2tlZCwgYXRMZWFzdCA9IHVuZGVmaW5lZCwgYXRNb3N0ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gICAgICAgIHRyaWdnZXIuZ2V0KCdlbGVtZW50cycpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydHMgY2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9uc1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnaW5wdXRbdHlwZT1yYWRpb10sIGlucHV0W3R5cGU9Y2hlY2tib3hdJykpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWVzID0gbmV3IFNldCgpO1xuXG4gICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQgPT09IGVsZW1lbnQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGF0TGVhc3QgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZXMuc2l6ZSA9PT0gc3VwcG9ydGVkRWxlbWVudHMuc2l6ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXRMZWFzdENvdW50ID0gKGF0TGVhc3QgIT09IHVuZGVmaW5lZCAmJiBNYXRoLmZsb29yKGF0TGVhc3QpID4gMClcbiAgICAgICAgICAgICAgICA/IE1hdGguZmxvb3IoYXRMZWFzdClcbiAgICAgICAgICAgICAgICA6IDE7XG4gICAgICAgICAgICBjb25zdCBhdE1vc3RDb3VudCA9IChhdExlYXN0ICE9PSB1bmRlZmluZWQgJiYgTWF0aC5mbG9vcihhdE1vc3QpID4gMSlcbiAgICAgICAgICAgICAgICA/IE1hdGguZmxvb3IoYXRNb3N0KVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydGVkRWxlbWVudHMuc2l6ZTtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZXMuc2l6ZSA+PSBhdExlYXN0Q291bnQgJiYgZWxlbWVudFZhbHVlcy5zaXplIDw9IGF0TW9zdENvdW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0cmlnZ2VyIHRoYXQgZmlyZXMgd2hlbiBhIHRhcmdldCBlbGVtZW50KHMpIGlzIGZvY3VzZWQgb3IgYmx1cnJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlckVudGl0eX0gdHJpZ2dlclxuICAgICAqL1xuICAgIGNyZWF0ZUZvY3VzZWRDb25kaXRpb24odHJpZ2dlcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRFbGVtZW50cyA9IG5ldyBTZXQoKTtcblxuICAgICAgICB0cmlnZ2VyLmdldCgnZWxlbWVudHMnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBBbGwgZWxlbWVudHMgYXJlIHN1cHBvcnRlZCAodGVjaG5pY2FsbHkpXG4gICAgICAgICAgICBzdXBwb3J0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cHBvcnRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZWxlbWVudCwgdHJpZ2dlciwgJ2ZvY3VzJyk7XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGVsZW1lbnQsIHRyaWdnZXIsICdibHVyJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiBBcnJheS5mcm9tKHN1cHBvcnRlZEVsZW1lbnRzKS5zb21lKChlbGVtZW50KSA9PiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW51YWxseSBydW5zIGFsbCByZWdpc3RlcmVkIHRyaWdnZXJzLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIHRoZSB0cmlnZ2Vycy5cbiAgICAgKi9cbiAgICBydW5FdmVudHMoKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9ycy5mb3JFYWNoKChlbGVtZW50Q29ubmVjdG9ycykgPT4ge1xuICAgICAgICAgICAgZWxlbWVudENvbm5lY3RvcnMuZm9yRWFjaCgoY29ubmVjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdG9yKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCByZWdpc3RlcmVkIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgIHdpbGwgZGlzYWJsZSBhbGwgdHJpZ2dlcnMgYW5kIHRoZWlyIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgdGFyZ2V0IGVsZW1lbnRzLlxuICAgICAqL1xuICAgIHJlc2V0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLmNvbm5lY3RvcnMuZm9yRWFjaCgoZWxlbWVudENvbm5lY3RvcnMsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRDb25uZWN0b3JzLmZvckVhY2goKGNvbm5lY3RvciwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGNvbm5lY3Rvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb25uZWN0b3JzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZXZlbnRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYWN0aW9ucyBiYXNlZCBvbiB0aGUgdHJpZ2dlciBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBBY3Rpb25zIHNob3VsZCBiZSBiaW5hcnksIGFuZCBzaG93IG9uZSBzdGF0ZSB3aGVuIHRoZSBjb25kaXRpb24gaXMgbWV0LCBhbmQgYW5vdGhlciB3aGVuIGl0XG4gICAgICogaXMgbm90LiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uZGl0aW9ucyBvZiB0aGUgdHJpZ2dlciBoYXZlIGJlZW5cbiAgICAgKiBtZXQuIElmIGEgdHJpZ2dlciBoYXMgbXVsdGlwbGUgY29uZGl0aW9ucywgQUxMIGNvbmRpdGlvbnMgbXVzdCBiZSBtZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNvbmRpdGlvbk1ldFxuICAgICAqL1xuICAgIGV4ZWN1dGVBY3Rpb25zKHRyaWdnZXIsIGNvbmRpdGlvbk1ldCkge1xuICAgICAgICB0aGlzLnBhcnNlQ29tbWFuZCh0cmlnZ2VyLmdldCgnYWN0aW9uJykpLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24ubmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Nob3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2hpZGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvblNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChhY3Rpb24ucGFyYW1ldGVyc1swXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbdGhpcy5lbGVtZW50XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24ubmFtZSA9PT0gJ3Nob3cnKSA/IGNvbmRpdGlvbk1ldCA6ICFjb25kaXRpb25NZXQsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VuYWJsZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzYWJsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uRW5hYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24ucGFyYW1ldGVyc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYWN0aW9uLnBhcmFtZXRlcnNbMF0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW3RoaXMuZWxlbWVudF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uLm5hbWUgPT09ICdlbmFibGUnKSA/IGNvbmRpdGlvbk1ldCA6ICFjb25kaXRpb25NZXQsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VtcHR5JzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbk1ldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbk1ldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uLnBhcmFtZXRlcnNbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChhY3Rpb24ucGFyYW1ldGVyc1swXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW3RoaXMuZWxlbWVudF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZU9mJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uLm5hbWUgPT09ICd2YWx1ZU9mJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYWN0aW9uLnBhcmFtZXRlcnNbMF0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW3RoaXMuZWxlbWVudF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oYWN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBhY3Rpb24ubmFtZSA9PT0gJ3ZhbHVlT2YnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWN0aW9uLnBhcmFtZXRlcnMuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFjdGlvbi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xhc3NPZic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uTWV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbi5uYW1lID09PSAnY2xhc3NPZicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGFjdGlvbi5wYXJhbWV0ZXJzWzBdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0aGlzLmVsZW1lbnRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGFjdGlvbi5uYW1lID09PSAnY2xhc3NPZicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhY3Rpb24ucGFyYW1ldGVycy5zbGljZSgxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWN0aW9uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3Mgb3IgaGlkZXMgYSB0cmlnZ2VyIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGFjdGlvbiB3aWxsIHRvZ2dsZSB0aGUgYGhpZGVgIGNsYXNzIG9uIHRoZSBlbGVtZW50LCBhbmQgc2V0IHRoZSBgZGlzcGxheWAgc3R5bGUgdG9cbiAgICAgKiBgbm9uZWAgd2hlbiBoaWRkZW4sIGFuZCB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZSB3aGVuIHNob3duLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUcmlnZ2VyRW50aXR5fSB0cmlnZ2VyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBlbGVtZW50c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvd1xuICAgICAqL1xuICAgIGFjdGlvblNob3codHJpZ2dlciwgZWxlbWVudHMsIHNob3cpIHtcbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNob3cgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsRGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIGVsZW1lbnQuZGF0YXNldC5vcmlnaW5hbERpc3BsYXk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQWN0aW9uKHRyaWdnZXIsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc2hvdyAmJiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0Lm9yaWdpbmFsRGlzcGxheSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZGlzcGxheTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQWN0aW9uKHRyaWdnZXIsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgdHJpZ2dlciBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBhY3Rpb24gd2lsbCB0b2dnbGUgdGhlIGBjb250cm9sLWRpc2FibGVkYCBjbGFzcyBvbiB0aGUgZWxlbWVudCwgYW5kIHNldCB0aGUgYGRpc2FibGVkYFxuICAgICAqIHByb3BlcnR5IHRvIGB0cnVlYCB3aGVuIGRpc2FibGVkLCBhbmQgYGZhbHNlYCB3aGVuIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RyaWdnZXJFbnRpdHl9IHRyaWdnZXJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVcbiAgICAgKi9cbiAgICBhY3Rpb25FbmFibGUodHJpZ2dlciwgZWxlbWVudHMsIGVuYWJsZSkge1xuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdFsoZW5hYmxlKSA/ICdyZW1vdmUnIDogJ2FkZCddKCdjb250cm9sLWRpc2FibGVkJyk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRpc2FibGVkID0gIWVuYWJsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyLCBlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgZWl0aGVyIHRoZSB0cmlnZ2VyIGVsZW1lbnQgb3IgYSBjaGlsZCBlbGVtZW50KHMpIHdpdGhpbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYSBvbmUtd2F5IGFjdGlvbiBpZiB0aGUgdW5tZXQgdmFsdWUgaXMgbm90IGRlZmluZWQuXG4gICAgICovXG4gICAgYWN0aW9uVmFsdWUodHJpZ2dlciwgY29uZGl0aW9uTWV0LCBlbGVtZW50cywgdmFsdWUsIHVubWV0VmFsdWUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb25NZXQgJiYgdW5tZXRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IChjb25kaXRpb25NZXQpID8gdmFsdWUgOiB1bm1ldFZhbHVlO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXScpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jaGVja2VkID0gKGVsZW1lbnQudmFsdWUgPT09IG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gbmV3VmFsdWU7XG5cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBY3Rpb24odHJpZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgb3IgcmVtb3ZlcyB0aGUgY2xhc3MgZnJvbSB0aGUgdHJpZ2dlciBlbGVtZW50IG9yIGEgY2hpbGQgZWxlbWVudChzKSB3aXRoaW4uXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgc2ltcGx5IHJlbW92ZSB0aGUgY2xhc3MgaWYgdGhlIHVubWV0IGNsYXNzIGlzIG5vdCBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZSBjbGFzc2VzXG4gICAgICogd2lsbCBiZSB0b2dnbGVkLlxuICAgICAqL1xuICAgIGFjdGlvbkNsYXNzKHRyaWdnZXIsIGNvbmRpdGlvbk1ldCwgZWxlbWVudHMsIGNzc0NsYXNzLCB1bm1ldENzc0NsYXNzID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25NZXQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY3NzQ2xhc3MpO1xuICAgICAgICAgICAgICAgIGlmICh1bm1ldENzc0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh1bm1ldENzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjc3NDbGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKHVubWV0Q3NzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHVubWV0Q3NzQ2xhc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hZnRlckFjdGlvbih0cmlnZ2VyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWZ0ZXJBY3Rpb24odHJpZ2dlciwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLnNub3dib2FyZC5kZWJ1ZygnVHJpZ2dlciBmaXJlZCcsIGVsZW1lbnQsIHRyaWdnZXIpO1xuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgndHJpZ2dlci5maXJlZCcsIGVsZW1lbnQsIHRyaWdnZXIpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogSW50ZXJuYWwgcHJveHkgZm9yIFNub3dib2FyZC5cbiAqXG4gKiBUaGlzIGhhbmRsZXIgd3JhcHMgdGhlIFNub3dib2FyZCBpbnN0YW5jZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgcGx1Z2luIGluc3RhbmNlcy5cbiAqIEl0IHByZXZlbnRzIGFjY2VzcyB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHM6XG4gKiAgLSBgYXR0YWNoQWJzdHJhY3RzYDogTm8gbmVlZCB0byBhdHRhY2ggYWJzdHJhY3RzIGFnYWluLlxuICogIC0gYGxvYWRVdGlsdGllc2A6IE5vIG5lZWQgdG8gbG9hZCB1dGlsaXRpZXMgYWdhaW4uXG4gKiAgLSBgaW5pdGlhbGlzZWA6IFNub3dib2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkLlxuICogIC0gYGluaXRpYWxpc2VTaW5nbGV0b25zYDogU2luZ2xldG9ucyBhcmUgYWxyZWFkeSBpbml0aWFsaXNlZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKFsnYXR0YWNoQWJzdHJhY3RzJywgJ2xvYWRVdGlsaXRpZXMnLCAnaW5pdGlhbGlzZScsICdpbml0aWFsaXNlU2luZ2xldG9ucyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgY2Fubm90IHVzZSB0aGUgXCIke3Byb3B9XCIgU25vd2JvYXJkIG1ldGhvZCB3aXRoaW4gYSBwbHVnaW4uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzUGx1Z2luKHByb3BMb3dlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4gUmVmbGVjdC5nZXQodGFyZ2V0LCAncGx1Z2lucycpW3Byb3BMb3dlcl0uZ2V0SW5zdGFuY2UoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICB9LFxuXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTG93ZXIgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChbJ2F0dGFjaEFic3RyYWN0cycsICdsb2FkVXRpbGl0aWVzJywgJ2luaXRpYWxpc2UnLCAnaW5pdGlhbGlzZVNpbmdsZXRvbnMnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbn07XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuaW1wb3J0IElubmVyUHJveHlIYW5kbGVyIGZyb20gJy4vSW5uZXJQcm94eUhhbmRsZXInO1xuXG4vKipcbiAqIFBsdWdpbiBsb2FkZXIgY2xhc3MuXG4gKlxuICogVGhpcyBpcyBhIHByb3ZpZGVyIChmYWN0b3J5KSBjbGFzcyBmb3IgYSBzaW5nbGUgcGx1Z2luIGFuZCBwcm92aWRlcyB0aGUgbGluayBiZXR3ZWVuIFNub3dib2FyZCBmcmFtZXdvcmsgZnVuY3Rpb25hbGl0eVxuICogYW5kIHRoZSB1bmRlcmx5aW5nIHBsdWdpbiBpbnN0YW5jZXMuIEl0IGFsc28gcHJvdmlkZXMgc29tZSBiYXNpYyBtb2NraW5nIG9mIHBsdWdpbiBtZXRob2RzIGZvciB0ZXN0aW5nLlxuICpcbiAqIEBjb3B5cmlnaHQgMjAyMSBXaW50ZXIuXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5Mb2FkZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQmluZHMgdGhlIFdpbnRlciBmcmFtZXdvcmsgdG8gdGhlIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1Nub3dib2FyZH0gc25vd2JvYXJkXG4gICAgICogQHBhcmFtIHtQbHVnaW5CYXNlfSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHNub3dib2FyZCwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zbm93Ym9hcmQgPSBuZXcgUHJveHkoXG4gICAgICAgICAgICBzbm93Ym9hcmQsXG4gICAgICAgICAgICBJbm5lclByb3h5SGFuZGxlcixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG4gICAgICAgIC8vIEZyZWV6ZSBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhpcyBsb2FkZXJcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLmluc3RhbmNlKTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IHtcbiAgICAgICAgICAgIGluaXRpYWxpc2VkOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUHJldmVudCBmdXJ0aGVyIGV4dGVuc2lvbiBvZiB0aGUgc2luZ2xldG9uIHN0YXR1cyBvYmplY3RcbiAgICAgICAgT2JqZWN0LnNlYWwodGhpcy5zaW5nbGV0b24pO1xuXG4gICAgICAgIHRoaXMubW9ja3MgPSB7fTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgICAgIC8vIEZyZWV6ZSBsb2FkZXIgaXRzZWxmXG4gICAgICAgIE9iamVjdC5mcmVlemUoUGx1Z2luTG9hZGVyLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBwbHVnaW4gaGFzIGEgc3BlY2lmaWMgbWV0aG9kIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc01ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgcHJvdG90eXBlIG1ldGhvZCBmb3IgYSBwbHVnaW4uIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBiZSB1c2VkIGZvciBcInN0YXRpY1wiIGNhbGxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICAgKiBAcGFyYW0gey4uLn0gYXJnc1xuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgY2FsbE1ldGhvZCguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gcGFyYW1ldGVycztcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGFyZ3Muc2hpZnQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0oYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBwbHVnaW4uXG4gICAgICpcbiAgICAgKiAtIElmIHRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBwbHVnaW4sIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gSWYgdGhpcyBpcyBhIHNpbmdsZXRvbiwgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UGx1Z2luQmFzZXxGdW5jdGlvbn1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW5jZSguLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICBjb25zdCB1bm1ldCA9IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKCkuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5zbm93Ym9hcmQuZ2V0UGx1Z2luTmFtZXMoKS5pbmNsdWRlcyhpdGVtKSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIiR7dGhpcy5uYW1lfVwiIHBsdWdpbiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsdWdpbnM6ICR7dW5tZXQuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXNlU2luZ2xldG9uKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kc1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubW9ja3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm9yaWdpbmFsRnVuY3Rpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzWzBdW21ldGhvZE5hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5tb2NrcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW21ldGhvZE5hbWUsIGNhbGxiYWNrXSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9ICguLi5wYXJhbXMpID0+IGNhbGxiYWNrKHRoaXMsIC4uLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG1vY2tlZCBtZXRob2RzIHRvIHByb3RvdHlwZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5tb2NrcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5vcmlnaW5hbEZ1bmN0aW9ucykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5tb2NrcykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbWV0aG9kTmFtZSwgY2FsbGJhY2tdID0gZW50cnk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSAoLi4ucGFyYW1zKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyB0aGlzLmluc3RhbmNlKHRoaXMuc25vd2JvYXJkLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuZGV0YWNoID0gKCkgPT4gdGhpcy5pbnN0YW5jZXMuc3BsaWNlKHRoaXMuaW5zdGFuY2VzLmluZGV4T2YobmV3SW5zdGFuY2UpLCAxKTtcbiAgICAgICAgbmV3SW5zdGFuY2UuY29uc3RydWN0KC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlcy5wdXNoKG5ld0luc3RhbmNlKTtcblxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgcGx1Z2luIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2luLCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkJhc2VbXX1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW5jZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgcGx1Z2luIGlzIGEgc2ltcGxlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdGhpcy5pbnN0YW5jZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLmluc3RhbmNlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBpcyBhIHNpbmdsZXRvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzU2luZ2xldG9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBTaW5nbGV0b24gPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHNpbmdsZXRvbiBoYXMgYmVlbiBpbml0aWFsaXNlZC5cbiAgICAgKlxuICAgICAqIE5vcm1hbCBwbHVnaW5zIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNJbml0aWFsaXNlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9uLmluaXRpYWxpc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBpbml0aWFsaXNlU2luZ2xldG9uKC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2luZ2xldG9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMuaW5zdGFuY2UodGhpcy5zbm93Ym9hcmQsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBuZXdJbnN0YW5jZS5kZXRhY2ggPSAoKSA9PiB0aGlzLmluc3RhbmNlcy5zcGxpY2UodGhpcy5pbnN0YW5jZXMuaW5kZXhPZihuZXdJbnN0YW5jZSksIDEpO1xuICAgICAgICBuZXdJbnN0YW5jZS5jb25zdHJ1Y3QoLi4ucGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpO1xuICAgICAgICB0aGlzLnNpbmdsZXRvbi5pbml0aWFsaXNlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBjdXJyZW50IHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXREZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9ucyBjYW5ub3QgaGF2ZSBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gZGVwZW5kZW5jeSBtZXRob2Qgc3BlY2lmaWVkLlxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlLmRlcGVuZGVuY2llcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UucHJvdG90eXBlLmRlcGVuZGVuY2llcygpLm1hcCgoaXRlbSkgPT4gaXRlbS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHBsdWdpbiBoYXMgYWxsIGl0cyBkZXBlbmRlbmNpZXMgZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkKCkge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSB0aGlzLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIGxldCBmdWxmaWxsZWQgPSB0cnVlO1xuICAgICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc25vd2JvYXJkLmhhc1BsdWdpbihwbHVnaW4pKSB7XG4gICAgICAgICAgICAgICAgZnVsZmlsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmdWxmaWxsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIHRvIGJlIG1vY2tlZCBmb3IgdGVzdGluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbW9jayB3aWxsIGJlIGFwcGxpZWQgZm9yIHRoZSBsaWZlIG9mIGFuIGluc3RhbmNlLiBGb3Igc2luZ2xldG9ucywgdGhlIG1vY2sgd2lsbCBiZSBhcHBsaWVkIGZvciB0aGUgbGlmZVxuICAgICAqIG9mIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogTW9ja3MgY2Fubm90IGJlIGFwcGxpZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24gcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBtb2NrKG1ldGhvZE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlLnByb3RvdHlwZVttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiBcIiR7bWV0aG9kTmFtZX1cIiBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIG1vY2tlZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2Nrc1ttZXRob2ROYW1lXSA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRnVuY3Rpb25zW21ldGhvZE5hbWVdID0gdGhpcy5pbnN0YW5jZS5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGV0b24oKSAmJiB0aGlzLmluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBtb2NrZWQgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9ICguLi5wYXJhbWV0ZXJzKSA9PiBjYWxsYmFjayh0aGlzLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBtb2NrIGNhbGxiYWNrIGZyb20gZnV0dXJlIGluc3RhbmNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAgICovXG4gICAgdW5tb2NrKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1vY2tzW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZXRvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc1swXVttZXRob2ROYW1lXSA9IHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy5tb2Nrc1ttZXRob2ROYW1lXTtcbiAgICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxGdW5jdGlvbnNbbWV0aG9kTmFtZV07XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBSZWZsZWN0LmdldCh0YXJnZXQsICdwbHVnaW5zJylbcHJvcExvd2VyXS5nZXRJbnN0YW5jZSguLi5wYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BMb3dlciA9IHByb3AudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNQbHVnaW4ocHJvcExvd2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCk7XG4gICAgfSxcbn07XG4iLCJpbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuLi9hYnN0cmFjdHMvUGx1Z2luQmFzZSc7XG5pbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuaW1wb3J0IFBsdWdpbkxvYWRlciBmcm9tICcuL1BsdWdpbkxvYWRlcic7XG5cbmltcG9ydCBDb29raWUgZnJvbSAnLi4vdXRpbGl0aWVzL0Nvb2tpZSc7XG5pbXBvcnQgSnNvblBhcnNlciBmcm9tICcuLi91dGlsaXRpZXMvSnNvblBhcnNlcic7XG5pbXBvcnQgU2FuaXRpemVyIGZyb20gJy4uL3V0aWxpdGllcy9TYW5pdGl6ZXInO1xuaW1wb3J0IFVybCBmcm9tICcuLi91dGlsaXRpZXMvVXJsJztcblxuLyoqXG4gKiBTbm93Ym9hcmQgLSB0aGUgV2ludGVyIEphdmFTY3JpcHQgZnJhbWV3b3JrLlxuICpcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgYmFzZSBvZiBhIG1vZGVybiB0YWtlIG9uIHRoZSBXaW50ZXIgSlMgZnJhbWV3b3JrLCBiZWluZyBmdWxseSBleHRlbnNpYmxlIGFuZCB0YWtpbmcgYWR2YW50YWdlXG4gKiBvZiBtb2Rlcm4gSmF2YVNjcmlwdCBmZWF0dXJlcyBieSBsZXZlcmFnaW5nIHRoZSBMYXJhdmVsIE1peCBjb21waWxhdGlvbiBmcmFtZXdvcmsuIEl0IGFsc28gaXMgY29kZWQgdXAgdG8gcmVtb3ZlIHRoZVxuICogZGVwZW5kZW5jeSBvZiBqUXVlcnkuXG4gKlxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKiBAbGluayBodHRwczovL3dpbnRlcmNtcy5jb20vZG9jcy9zbm93Ym9hcmQvaW50cm9kdWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNub3dib2FyZCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGF1dG9TaW5nbGV0b25zIEF1dG9tYXRpY2FsbHkgbG9hZCBzaW5nbGV0b25zIHdoZW4gRE9NIGlzIHJlYWR5LiBEZWZhdWx0OiBgdHJ1ZWAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZWJ1ZyBXaGV0aGVyIGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSBzaG93bi4gRGVmYXVsdDogYGZhbHNlYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhdXRvU2luZ2xldG9ucywgZGVidWcpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSAodHlwZW9mIGRlYnVnID09PSAnYm9vbGVhbicgJiYgZGVidWcgPT09IHRydWUpO1xuICAgICAgICB0aGlzLmF1dG9Jbml0U2luZ2xldG9ucyA9ICh0eXBlb2YgYXV0b1NpbmdsZXRvbnMgPT09ICdib29sZWFuJyAmJiBhdXRvU2luZ2xldG9ucyA9PT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB7fTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLnJlYWRpbmVzcyA9IHtcbiAgICAgICAgICAgIGRvbTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIC8vIFNlYWwgcmVhZGluZXNzIGZyb20gYmVpbmcgYWRkZWQgdG8gZnVydGhlciwgYnV0IGFsbG93IHRoZSBwcm9wZXJ0aWVzIHRvIGJlIG1vZGlmaWVkLlxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzLnJlYWRpbmVzcyk7XG4gICAgICAgIHRoaXMuYXR0YWNoQWJzdHJhY3RzKCk7XG5cbiAgICAgICAgLy8gRnJlZXplIHRoZSBTbm93Ym9hcmQgY2xhc3MgdG8gcHJldmVudCBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gICAgICAgIE9iamVjdC5mcmVlemUoU25vd2JvYXJkLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG5cbiAgICAgICAgdGhpcy5sb2FkVXRpbGl0aWVzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZSgpO1xuXG4gICAgICAgIHRoaXMuZGVidWcoJ1Nub3dib2FyZCBmcmFtZXdvcmsgaW5pdGlhbGlzZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhYnN0cmFjdCBjbGFzc2VzIGFzIHByb3BlcnRpZXMgb2YgdGhlIFNub3dib2FyZCBjbGFzcy5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbGxvdyBKYXZhc2NyaXB0IGZ1bmN0aW9uYWxpdHkgd2l0aCBubyBidWlsZCBwcm9jZXNzIHRvIHN0aWxsIGV4dGVuZCB0aGVzZSBhYnN0cmFjdHMgYnkgcHJlZml4aW5nXG4gICAgICogdGhlbSB3aXRoIFwiU25vd2JvYXJkXCIuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjbGFzcyBNeUNsYXNzIGV4dGVuZHMgU25vd2JvYXJkLlBsdWdpbkJhc2Uge1xuICAgICAqICAgICAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXR0YWNoQWJzdHJhY3RzKCkge1xuICAgICAgICB0aGlzLlBsdWdpbkJhc2UgPSBQbHVnaW5CYXNlO1xuICAgICAgICB0aGlzLlNpbmdsZXRvbiA9IFNpbmdsZXRvbjtcblxuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuUGx1Z2luQmFzZS5wcm90b3R5cGUpO1xuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMuUGx1Z2luQmFzZSk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcy5TaW5nbGV0b24ucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLlNpbmdsZXRvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGRlZmF1bHQgdXRpbGl0aWVzLlxuICAgICAqL1xuICAgIGxvYWRVdGlsaXRpZXMoKSB7XG4gICAgICAgIHRoaXMuYWRkUGx1Z2luKCdjb29raWUnLCBDb29raWUpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignanNvblBhcnNlcicsIEpzb25QYXJzZXIpO1xuICAgICAgICB0aGlzLmFkZFBsdWdpbignc2FuaXRpemVyJywgU2FuaXRpemVyKTtcbiAgICAgICAgdGhpcy5hZGRQbHVnaW4oJ3VybCcsIFVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgdGhlIGZyYW1ld29yay5cbiAgICAgKlxuICAgICAqIEF0dGFjaGVzIGEgbGlzdGVuZXIgZm9yIHRoZSBET00gYmVpbmcgcmVhZHkgYW5kIHRyaWdnZXJzIGEgZ2xvYmFsIFwicmVhZHlcIiBldmVudCBmb3IgcGx1Z2lucyB0byBiZWdpbiBhdHRhY2hpbmdcbiAgICAgKiB0aGVtc2VsdmVzIHRvIHRoZSBET00uXG4gICAgICovXG4gICAgaW5pdGlhbGlzZSgpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvSW5pdFNpbmdsZXRvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpc2VTaW5nbGV0b25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdsb2JhbEV2ZW50KCdyZWFkeScpO1xuICAgICAgICAgICAgdGhpcy5yZWFkaW5lc3MuZG9tID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYW4gaW5zdGFuY2Ugb2YgZXZlcnkgc2luZ2xldG9uLlxuICAgICAqL1xuICAgIGluaXRpYWxpc2VTaW5nbGV0b25zKCkge1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMucGx1Z2lucykuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmluaXRpYWxpc2VTaW5nbGV0b24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHBsdWdpbiB0byB0aGUgZnJhbWV3b3JrLlxuICAgICAqXG4gICAgICogUGx1Z2lucyBhcmUgdGhlIGNvcm5lcnN0b25lIGZvciBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgZm9yIFNub3dib2FyZC4gQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYW4gRVMyMDE1IGNsYXNzXG4gICAgICogdGhhdCBleHRlbmRzIHRoZSBQbHVnaW5CYXNlIG9yIFNpbmdsZXRvbiBhYnN0cmFjdCBjbGFzc2VzLCBvciBhIHNpbXBsZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFdoZW4gYSBwbHVnaW4gaXMgYWRkZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgYXMgYSBuZXcgbWFnaWMgbWV0aG9kIGluIHRoZSBTbm93Ym9hcmQgY2xhc3MgdXNpbmcgdGhlIG5hbWVcbiAgICAgKiBwYXJhbWV0ZXIsIGFuZCBjYW4gYmUgY2FsbGVkIHZpYSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgYmUgdGhlIFwibG93ZXJjYXNlXCIgdmVyc2lvbiBvZiB0aGlzIG5hbWUuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYSBwbHVnaW4gaXMgYXNzaWduZWQgdG8gdGhlIG5hbWUgXCJteVBsdWdpblwiLCBpdCBjYW4gYmUgY2FsbGVkIHZpYSBgU25vd2JvYXJkLm15cGx1Z2luKClgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1BsdWdpbkJhc2V8RnVuY3Rpb259IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUGx1Z2luKG5hbWUsIGluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAodGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHBsdWdpbiBjYWxsZWQgXCIke25hbWV9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZSAhPT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdWdpbkJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBwbHVnaW4gbXVzdCBleHRlbmQgdGhlIFBsdWdpbkJhc2UgY2xhc3MsIG9yIG11c3QgYmUgYSBjYWxsYmFjayBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzW25hbWVdICE9PSB1bmRlZmluZWQgfHwgdGhpc1tsb3dlck5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIGEgcHJvcGVydHkgb3IgbWV0aG9kIG9mIHRoZSBTbm93Ym9hcmQgY2xhc3MuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXSA9IG5ldyBQbHVnaW5Mb2FkZXIobG93ZXJOYW1lLCB0aGlzLCBpbnN0YW5jZSk7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIHJlZ2lzdGVyZWRgKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgc2luZ2xldG9ucyBub3cgaGF2ZSB0aGVpciBkZXBlbmRlbmNpZXMgZnVsZmlsbGVkLCBhbmQgZmlyZSB0aGVpciBcInJlYWR5XCIgaGFuZGxlciBpZiB3ZSdyZVxuICAgICAgICAvLyBpbiBhIHJlYWR5IHN0YXRlLlxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZ2V0UGx1Z2lucygpKS5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwbHVnaW4uaXNTaW5nbGV0b24oKVxuICAgICAgICAgICAgICAgICYmICFwbHVnaW4uaXNJbml0aWFsaXNlZCgpXG4gICAgICAgICAgICAgICAgJiYgcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpXG4gICAgICAgICAgICAgICAgJiYgcGx1Z2luLmhhc01ldGhvZCgnbGlzdGVucycpXG4gICAgICAgICAgICAgICAgJiYgT2JqZWN0LmtleXMocGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKSkuaW5jbHVkZXMoJ3JlYWR5JylcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnJlYWRpbmVzcy5kb21cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5TWV0aG9kID0gcGx1Z2luLmNhbGxNZXRob2QoJ2xpc3RlbnMnKS5yZWFkeTtcbiAgICAgICAgICAgICAgICBwbHVnaW4uY2FsbE1ldGhvZChyZWFkeU1ldGhvZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBSZW1vdmVzIGEgcGx1Z2luIGZyb20gU25vd2JvYXJkLCBjYWxsaW5nIHRoZSBkZXN0cnVjdG9yIG1ldGhvZCBmb3IgYWxsIGFjdGl2ZSBpbnN0YW5jZXMgb2YgdGhlIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlUGx1Z2luKG5hbWUpIHtcbiAgICAgICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4obG93ZXJOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgUGx1Z2luIFwiJHtuYW1lfVwiIGFscmVhZHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBkZXN0cnVjdG9ycyBmb3IgYWxsIGluc3RhbmNlc1xuICAgICAgICB0aGlzLnBsdWdpbnNbbG93ZXJOYW1lXS5nZXRJbnN0YW5jZXMoKS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgaW5zdGFuY2UuZGVzdHJ1Y3QoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpc1tsb3dlck5hbWVdO1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTtcblxuICAgICAgICB0aGlzLmRlYnVnKGBQbHVnaW4gXCIke25hbWV9XCIgcmVtb3ZlZGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZCBhbmQgaXMgYWN0aXZlLlxuICAgICAqXG4gICAgICogQSBwbHVnaW4gdGhhdCBpcyBzdGlsbCB3YWl0aW5nIGZvciBkZXBlbmRlbmNpZXMgdG8gYmUgcmVnaXN0ZXJlZCB3aWxsIG5vdCBiZSBhY3RpdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1BsdWdpbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICByZXR1cm4gKHRoaXMucGx1Z2luc1tsb3dlck5hbWVdICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBwbHVnaW5zIGFzIFBsdWdpbkxvYWRlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkxvYWRlcltdfVxuICAgICAqL1xuICAgIGdldFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiByZWdpc3RlcmVkIHBsdWdpbnMsIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0UGx1Z2luTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBQbHVnaW5Mb2FkZXIgb2JqZWN0IG9mIGEgZ2l2ZW4gcGx1Z2luLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BsdWdpbkxvYWRlcn1cbiAgICAgKi9cbiAgICBnZXRQbHVnaW4obmFtZSkge1xuICAgICAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1BsdWdpbihsb3dlck5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBsdWdpbiBjYWxsZWQgXCIke2xvd2VyTmFtZX1cIiBoYXMgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luc1tsb3dlck5hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBwbHVnaW5zIHRoYXQgbGlzdGVuIHRvIHRoZSBnaXZlbiBldmVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgd29ya3MgZm9yIGJvdGggbm9ybWFsIGFuZCBwcm9taXNlIGV2ZW50cy4gSXQgZG9lcyBOT1QgY2hlY2sgdGhhdCB0aGUgcGx1Z2luJ3MgbGlzdGVuZXIgYWN0dWFsbHkgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbnMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICovXG4gICAgbGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbXTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnBsdWdpbnMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbmFtZSwgcGx1Z2luXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzRnVuY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGx1Z2luLmRlcGVuZGVuY2llc0Z1bGZpbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwbHVnaW4uaGFzTWV0aG9kKCdsaXN0ZW5zJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzW2V2ZW50TmFtZV0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBsaXN0ZW5lcnNbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBsdWdpbnMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBsdWdpbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc2ltcGxlIHJlYWR5IGxpc3RlbmVyLlxuICAgICAqXG4gICAgICogU3lub255bW91cyB3aXRoIGpRdWVyeSdzIFwiJChkb2N1bWVudCkucmVhZHkoKVwiIGZ1bmN0aW9uYWxpdHksIHRoaXMgYWxsb3dzIGlubGluZSBzY3JpcHRzIHRvXG4gICAgICogYXR0YWNoIHRoZW1zZWx2ZXMgdG8gU25vd2JvYXJkIGltbWVkaWF0ZWx5IGJ1dCBvbmx5IGZpcmUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICByZWFkeShjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5yZWFkaW5lc3MuZG9tKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbigncmVhZHknLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhZC1ob2Mgc2NyaXB0cyB0aGF0IGRvbid0IG5lZWQgYSBmdWxsIHBsdWdpbi4gVGhlIGdpdmVuIGNhbGxiYWNrIHdpbGwgYmVcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgbmFtZSBwcm92aWRlZCBmaXJlcy4gVGhpcyB3b3JrcyBmb3IgYm90aCBub3JtYWwgYW5kIFByb21pc2UgZXZlbnRzLiBGb3JcbiAgICAgKiBhIFByb21pc2UgZXZlbnQsIHlvdXIgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBQcm9taXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgb24oZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5pbmNsdWRlcyhjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc2ltcGxlIGxpc3RlbmVyIGZvciBhbiBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG9mZihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBnbG9iYWwgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIElmIGFueSBwbHVnaW4gcmV0dXJucyBhIGBmYWxzZWAsIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgZXZlbnQgd2FzIG5vdCBjYW5jZWxsZWRcbiAgICAgKi9cbiAgICBnbG9iYWxFdmVudChldmVudE5hbWUsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgQ2FsbGluZyBnbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cImAsIC4uLnBhcmFtZXRlcnMpO1xuXG4gICAgICAgIC8vIEZpbmQgcGx1Z2lucyBsaXN0ZW5pbmcgdG8gdGhlIGV2ZW50LlxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbnNUb0V2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBObyBsaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiYCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKGBMaXN0ZW5lcnMgZm91bmQgZm9yIGdsb2JhbCBldmVudCBcIiR7ZXZlbnROYW1lfVwiOiAke2xpc3RlbmVycy5qb2luKCcsICcpfWApO1xuXG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcblxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5nZXRQbHVnaW4obmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4uaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc1NpbmdsZXRvbigpICYmIHBsdWdpbi5nZXRJbnN0YW5jZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uaW5pdGlhbGlzZVNpbmdsZXRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5NZXRob2QgPSBwbHVnaW4uY2FsbE1ldGhvZCgnbGlzdGVucycpW2V2ZW50TmFtZV07XG5cbiAgICAgICAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlciBtZXRob2RzIGZvciBhbGwgcGx1Z2lucywgaWYgdGhleSBoYXZlIGEgbWV0aG9kIHNwZWNpZmllZCBmb3IgdGhlIGV2ZW50LlxuICAgICAgICAgICAgcGx1Z2luLmdldEluc3RhbmNlcygpLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBwbHVnaW4gaGFzIGNhbmNlbGxlZCB0aGUgZXZlbnQsIG5vIGZ1cnRoZXIgcGx1Z2lucyBhcmUgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbGlzdGVuTWV0aG9kLmFwcGx5KGluc3RhbmNlLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGJ5IFwiJHtuYW1lfVwiIHBsdWdpbi5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZVtsaXN0ZW5NZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCIke2xpc3Rlbk1ldGhvZH1cIiBtZXRob2QgaW4gXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlW2xpc3Rlbk1ldGhvZF0oLi4ucGFyYW1ldGVycykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBHbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX1cIiBjYW5jZWxsZWQgYnkgXCIke25hbWV9XCIgcGx1Z2luYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBMaXN0ZW4gbWV0aG9kIGZvciBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGluIFwiJHtuYW1lfVwiIHBsdWdpbiBpcyBub3QgYSBmdW5jdGlvbiBvciBzdHJpbmcuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYWQtaG9jIGxpc3RlbmVycyBmb3IgdGhpcyBldmVudC5cbiAgICAgICAgaWYgKCFjYW5jZWxsZWQgJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSAmJiB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZvdW5kICR7dGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGh9IGFkLWhvYyBsaXN0ZW5lcihzKSBmb3IgZ2xvYmFsIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgbGlzdGVuZXIgaGFzIGNhbmNlbGxlZCB0aGUgZXZlbnQsIG5vIGZ1cnRoZXIgbGlzdGVuZXJzIGFyZSBjb25zaWRlcmVkLlxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciguLi5wYXJhbWV0ZXJzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBHbG9iYWwgZXZlbnQgXCIke2V2ZW50TmFtZX0gY2FuY2VsbGVkIGJ5IGFuIGFkLWhvYyBsaXN0ZW5lci5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgZXZlbnQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhY2FuY2VsbGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgZ2xvYmFsIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMsIGV4cGVjdGluZyBhIFByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgYWxsLlxuICAgICAqXG4gICAgICogVGhpcyBjb2xsYXRlcyBhbGwgcGx1Z2lucyByZXNwb25zZXMgaW50byBvbmUgbGFyZ2UgUHJvbWlzZSB0aGF0IGVpdGhlciBleHBlY3RzIGFsbCB0byBiZSByZXNvbHZlZCwgb3Igb25lIHRvIHJlamVjdC5cbiAgICAgKiBJZiBubyBsaXN0ZW5lcnMgYXJlIGZvdW5kLCBhIHJlc29sdmVkIFByb21pc2UgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAgICovXG4gICAgZ2xvYmFsUHJvbWlzZUV2ZW50KGV2ZW50TmFtZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmRlYnVnKGBDYWxsaW5nIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAvLyBGaW5kIHBsdWdpbnMgbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuc1RvRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYE5vIGxpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoYExpc3RlbmVycyBmb3VuZCBmb3IgZ2xvYmFsIHByb21pc2UgZXZlbnQgXCIke2V2ZW50TmFtZX1cIjogJHtsaXN0ZW5lcnMuam9pbignLCAnKX1gKTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmdldFBsdWdpbihuYW1lKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGx1Z2luLmlzU2luZ2xldG9uKCkgJiYgcGx1Z2luLmdldEluc3RhbmNlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5pbml0aWFsaXNlU2luZ2xldG9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3Rlbk1ldGhvZCA9IHBsdWdpbi5jYWxsTWV0aG9kKCdsaXN0ZW5zJylbZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyIG1ldGhvZHMgZm9yIGFsbCBwbHVnaW5zLCBpZiB0aGV5IGhhdmUgYSBtZXRob2Qgc3BlY2lmaWVkIGZvciB0aGUgZXZlbnQuXG4gICAgICAgICAgICBwbHVnaW4uZ2V0SW5zdGFuY2VzKCkuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3Rlbk1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VQcm9taXNlID0gbGlzdGVuTWV0aG9kLmFwcGx5KGluc3RhbmNlLCBwYXJhbWV0ZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGluc3RhbmNlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB0aHJvd24gaW4gXCIke2V2ZW50TmFtZX1cIiBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ZW5NZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VbbGlzdGVuTWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwiJHtsaXN0ZW5NZXRob2R9XCIgbWV0aG9kIGluIFwiJHtuYW1lfVwiIHBsdWdpbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlUHJvbWlzZSA9IGluc3RhbmNlW2xpc3Rlbk1ldGhvZF0oLi4ucGFyYW1ldGVycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZVByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbnN0YW5jZVByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgdGhyb3duIGluIFwiJHtldmVudE5hbWV9XCIgcHJvbWlzZSBldmVudCBieSBcIiR7bmFtZX1cIiBwbHVnaW4uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBMaXN0ZW4gbWV0aG9kIGZvciBcIiR7ZXZlbnROYW1lfVwiIGV2ZW50IGluIFwiJHtuYW1lfVwiIHBsdWdpbiBpcyBub3QgYSBmdW5jdGlvbiBvciBzdHJpbmcuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYWQtaG9jIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gdGhpcyBldmVudC5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0gJiYgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBGb3VuZCAke3RoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0ubGVuZ3RofSBhZC1ob2MgbGlzdGVuZXIocykgZm9yIGdsb2JhbCBwcm9taXNlIGV2ZW50IFwiJHtldmVudE5hbWV9XCJgKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyUHJvbWlzZSA9IGxpc3RlbmVyKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gobGlzdGVuZXJQcm9taXNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHRocm93biBpbiBcIiR7ZXZlbnROYW1lfVwiIHByb21pc2UgZXZlbnQgYnkgYW4gYWQtaG9jIGxpc3RlbmVyLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgc3R5bGVkIG1lc3NhZ2UgaW4gdGhlIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBJbmNsdWRlcyBwYXJhbWV0ZXJzIGFuZCBhIHN0YWNrIHRyYWNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbG9nTWVzc2FnZShjb2xvciwgYm9sZCwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAgICAgJyVjW1Nub3dib2FyZF0nLFxuICAgICAgICAgICAgYGNvbG9yOiAke2NvbG9yfTsgZm9udC13ZWlnaHQ6ICR7KGJvbGQpID8gJ2JvbGQnIDogJ25vcm1hbCd9O2AsXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgICAgICAgICBgJWNQYXJhbWV0ZXJzICVjKCR7cGFyYW1ldGVycy5sZW5ndGh9KWAsXG4gICAgICAgICAgICAgICAgJ2NvbG9yOiByZ2IoNDUsIDE2NywgMTk5KTsgZm9udC13ZWlnaHQ6IGJvbGQ7JyxcbiAgICAgICAgICAgICAgICAnY29sb3I6IHJnYig4OCwgODgsIDg4KTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAlYyR7aW5kZXh9OmAsICdjb2xvcjogcmdiKDg4LCA4OCwgODgpOyBmb250LXdlaWdodDogbm9ybWFsOycsIHBhcmFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKCclY1RyYWNlJywgJ2NvbG9yOiByZ2IoNDUsIDE2NywgMTk5KTsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGxvZyhtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDQ1LCAxNjcsIDE5OSknLCBmYWxzZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIGEgZGVidWcgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFRoZXNlIG1lc3NhZ2VzIGFyZSBvbmx5IHNob3duIHdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkZWJ1ZyhtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICghdGhpcy5kZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nTWVzc2FnZSgncmdiKDQ1LCAxNjcsIDE5OSknLCBmYWxzZSwgbWVzc2FnZSwgLi4ucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZXJyb3IobWVzc2FnZSwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UoJ3JnYigyMjksIDM1LCAzNSknLCB0cnVlLCBtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUNvb2tpZSBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBDb29raWUgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBcImpzLWNvb2tpZVwiIGxpYnJhcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vanMtY29va2llL2pzLWNvb2tpZVxuICogQGNvcHlyaWdodCAyMDIxIFdpbnRlci5cbiAqIEBhdXRob3IgQmVuIFRob21zb24gPGdpdEBhbGZyZWlkby5jb20+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZSBleHRlbmRzIFNpbmdsZXRvbiB7XG4gICAgY29uc3RydWN0KCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgICAgICAgZXhwaXJlczogbnVsbCxcbiAgICAgICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgICAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgICAgIHNlY3VyZTogZmFsc2UsXG4gICAgICAgICAgICBzYW1lU2l0ZTogJ0xheCcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGNvb2tpZSBwYXJhbWV0ZXJzIGZvciBhbGwgc3Vic2VxdWVudCBcInNldFwiIGFuZCBcInJlbW92ZVwiIGNhbGxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBzZXREZWZhdWx0cyhvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29va2llIGRlZmF1bHRzIG11c3QgYmUgcHJvdmlkZWQgYXMgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb29raWUgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0ge307XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5kZWZhdWx0cykuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0c1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29va2llIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBJZiBgbmFtZWAgaXMgdW5kZWZpbmVkLCByZXR1cm5zIGFsbCBjb29raWVzIGFzIGFuIE9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IEJhc2VDb29raWUuZ2V0KCk7XG5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGNvb2tpZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2Nvb2tpZU5hbWUsIGNvb2tpZVZhbHVlXSA9IGVudHJ5O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zbm93Ym9hcmQuZ2xvYmFsRXZlbnQoJ2Nvb2tpZS5nZXQnLCBjb29raWVOYW1lLCBjb29raWVWYWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZXNbY29va2llTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29va2llcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IEJhc2VDb29raWUuZ2V0KG5hbWUpO1xuXG4gICAgICAgIC8vIEFsbG93IHBsdWdpbnMgdG8gb3ZlcnJpZGUgdGhlIGdvdHRlbiB2YWx1ZVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLmdldCcsIG5hbWUsIHZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvb2tpZSBwYXJhbWV0ZXJzIHRocm91Z2ggdGhlIFwib3B0aW9uc1wiIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHNldChuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgc2F2ZVZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgLy8gQWxsb3cgcGx1Z2lucyB0byBvdmVycmlkZSB0aGUgdmFsdWUgdG8gc2F2ZVxuICAgICAgICB0aGlzLnNub3dib2FyZC5nbG9iYWxFdmVudCgnY29va2llLnNldCcsIG5hbWUsIHZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHNhdmVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQmFzZUNvb2tpZS5zZXQobmFtZSwgc2F2ZVZhbHVlLCB7XG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRzKCksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjb29raWUgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgYWRkaXRpb25hbCBjb29raWUgcGFyYW1ldGVycyB2aWEgdGhlIFwib3B0aW9uc1wiIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmUobmFtZSwgb3B0aW9ucykge1xuICAgICAgICBCYXNlQ29va2llLnJlbW92ZShuYW1lLCB7XG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRzKCksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gJy4uL2Fic3RyYWN0cy9TaW5nbGV0b24nO1xuXG4vKipcbiAqIEpTT04gUGFyc2VyIHV0aWxpdHkuXG4gKlxuICogVGhpcyB1dGlsaXR5IHBhcnNlcyBKU09OLWxpa2UgZGF0YSB0aGF0IGRvZXMgbm90IHN0cmljdGx5IG1lZXQgdGhlIEpTT04gc3BlY2lmaWNhdGlvbnMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgZGV2ZWxvcG1lbnQuXG4gKiBJdCBpcyBhIHNhZmUgcmVwbGFjZW1lbnQgZm9yIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZhbChcIih7XCIgKyB2YWx1ZSArIFwifSlcIikpKSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdGhlIHVzZSBvZiBldmFsKClcbiAqXG4gKiBAYXV0aG9yIEF5dW1pIEhhbWFzYWtpXG4gKiBAYXV0aG9yIEJlbiBUaG9tc29uIDxnaXRAYWxmcmVpZG8uY29tPlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2JlcmNtcy9vY3RvYmVyL3B1bGwvNDUyN1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKc29uUGFyc2VyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIC8vIEFkZCB0byBnbG9iYWwgZnVuY3Rpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHdpbmRvdy53bkpTT04gPSAoanNvbikgPT4gdGhpcy5wYXJzZShqc29uKTtcbiAgICAgICAgd2luZG93Lm9jSlNPTiA9IHdpbmRvdy53bkpTT047XG4gICAgfVxuXG4gICAgcGFyc2Uoc3RyKSB7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB0aGlzLnBhcnNlU3RyaW5nKHN0cik7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuICAgIH1cblxuICAgIHBhcnNlU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGxldCBzdHIgPSB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgaWYgKCFzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb2tlbiBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgbGV0IHR5cGUgPSBudWxsO1xuICAgICAgICBsZXQga2V5ID0gbnVsbDtcbiAgICAgICAgbGV0IGJvZHkgPSAnJztcblxuICAgICAgICAvKlxuICAgICAgICAqIHRoZSBtaXN0YWtlICcsJ1xuICAgICAgICAqL1xuICAgICAgICB3aGlsZSAoc3RyICYmIHN0clswXSA9PT0gJywnKSB7XG4gICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBzdHJpbmdcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ1wiJyB8fCBzdHJbMF0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSAhPT0gc3RyWzBdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZyBKU09OIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYm9keSA9ICdcIic7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2kgKyAxXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gc3RyWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSAnXFxcXFwiJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcgSlNPTiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIGJvb2xlYW5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0ciA9PT0gJ3RydWUnIHx8IHN0ciA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICogbnVsbFxuICAgICAgICAqL1xuICAgICAgICBpZiAoc3RyID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIG51bWJlclxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIoc3RyKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bS50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgKiBvYmplY3RcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHN0clswXSA9PT0gJ3snKSB7XG4gICAgICAgICAgICB0eXBlID0gJ25lZWRLZXknO1xuICAgICAgICAgICAga2V5ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdCA9ICd7JztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0JsYW5rQ2hhcihzdHJbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICduZWVkS2V5JyAmJiAoc3RyW2ldID09PSAnXCInIHx8IHN0cltpXSA9PT0gJ1xcJycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VLZXkoc3RyLCBpICsgMSwgc3RyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGBcIiR7a2V5fVwiYDtcbiAgICAgICAgICAgICAgICAgICAgaSArPSBrZXkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJLZXknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25lZWRLZXknICYmIHRoaXMuY2FuQmVLZXlIZWFkKHN0cltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZUtleShzdHIsIGkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcIic7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0ga2V5Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJLZXknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FmdGVyS2V5JyAmJiBzdHJbaV0gPT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzonO1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJzonO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmdldEJvZHkoc3RyLCBpKTtcblxuICAgICAgICAgICAgICAgICAgICBpID0gaSArIGJvZHkub3JpZ2luTGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMucGFyc2VTdHJpbmcoYm9keS5ib2R5KTtcblxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2FmdGVyQm9keSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYWZ0ZXJCb2R5JyB8fCB0eXBlID09PSAnbmVlZEtleScpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RyW2xhc3RdID09PSAnLCcgfHwgdGhpcy5pc0JsYW5rQ2hhcihzdHJbbGFzdF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltsYXN0XSA9PT0gJ30nICYmIGxhc3QgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ30nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAhPT0gaSAmJiByZXN1bHQgIT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnbmVlZEtleSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gbGFzdCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gb2JqZWN0IG5lYXIgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAqIGFycmF5XG4gICAgICAgICovXG4gICAgICAgIGlmIChzdHJbMF0gPT09ICdbJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gJ1snO1xuICAgICAgICAgICAgdHlwZSA9ICduZWVkQm9keSc7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcgJyB8fCBzdHJbaV0gPT09ICdcXG4nIHx8IHN0cltpXSA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25lZWRCb2R5Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbnVsbCwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXScgJiYgaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuZ2V0Qm9keShzdHIsIGkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGkgPSBpICsgYm9keS5vcmlnaW5MZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5wYXJzZVN0cmluZyhib2R5LmJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnYWZ0ZXJCb2R5JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhZnRlckJvZHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnbmVlZEJvZHknO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggbWlzdGFrZSBcIixcIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cltpICsgMV0gPT09ICcsJyB8fCB0aGlzLmlzQmxhbmtDaGFyKHN0cltpICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpICsgMV0gPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ251bGwsJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ10nICYmIGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ10nO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBhcnJheSBuZWFyICR7cmVzdWx0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGdldEJvZHkoc3RyLCBwb3MpIHtcbiAgICAgICAgbGV0IGJvZHkgPSAnJztcblxuICAgICAgICAvLyBwYXJzZSBzdHJpbmcgYm9keVxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICdcIicgfHwgc3RyW3Bvc10gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICBib2R5ID0gc3RyW3Bvc107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwb3MgKyAxOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gc3RyW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBzdHJbcG9zXSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltwb3NdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIHN0cmluZyBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgdHJ1ZSAvIGZhbHNlXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ3QnKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ3RydWUnLCBwb3MpID09PSBwb3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6ICd0cnVlJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIGJvb2xlYW4gYm9keSBuZWFyICR7c3RyLnN1YnN0cigwLCBwb3MgKyAxMCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cltwb3NdID09PSAnZicpIHtcbiAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZignZicsIHBvcykgPT09IHBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkxlbmd0aDogJ2ZhbHNlJy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICdmYWxzZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgbnVsbFxuICAgICAgICBpZiAoc3RyW3Bvc10gPT09ICduJykge1xuICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCdudWxsJywgcG9zKSA9PT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiAnbnVsbCcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAnbnVsbCcsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBib29sZWFuIGJvZHkgbmVhciAke3N0ci5zdWJzdHIoMCwgcG9zICsgMTApfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2UgbnVtYmVyXG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJy0nIHx8IHN0cltwb3NdID09PSAnKycgfHwgc3RyW3Bvc10gPT09ICcuJyB8fCAoc3RyW3Bvc10gPj0gJzAnICYmIHN0cltwb3NdIDw9ICc5JykpIHtcbiAgICAgICAgICAgIGJvZHkgPSAnJztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHJbaV0gPT09ICctJyB8fCBzdHJbaV0gPT09ICcrJyB8fCBzdHJbaV0gPT09ICcuJyB8fCAoc3RyW2ldID49ICcwJyAmJiBzdHJbaV0gPD0gJzknKSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OIG51bWJlciBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFyc2Ugb2JqZWN0XG4gICAgICAgIGlmIChzdHJbcG9zXSA9PT0gJ3snIHx8IHN0cltwb3NdID09PSAnWycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gW1xuICAgICAgICAgICAgICAgIHN0cltwb3NdLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGJvZHkgPSBzdHJbcG9zXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBvcyArIDE7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBib2R5ICs9IHN0cltpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSBzdHJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ1xcJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0cltpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXCInICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdICE9PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2ldID09PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goJ3snKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICd9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgnWycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJyb2tlbiBKU09OICR7KHN0cltwb3NdID09PSAneycgPyAnb2JqZWN0JyA6ICdhcnJheScpfSBib2R5IG5lYXIgJHtib2R5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MZW5ndGg6IGkgLSBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiAkeyhzdHJbcG9zXSA9PT0gJ3snID8gJ29iamVjdCcgOiAnYXJyYXknKX0gYm9keSBuZWFyICR7Ym9keX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJva2VuIEpTT04gYm9keSBuZWFyICR7c3RyLnN1YnN0cigocG9zIC0gNSA+PSAwKSA/IHBvcyAtIDUgOiAwLCA1MCl9YCk7XG4gICAgfVxuXG4gICAgcGFyc2VLZXkoc3RyLCBwb3MsIHF1b3RlKSB7XG4gICAgICAgIGxldCBrZXkgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAocXVvdGUgJiYgcXVvdGUgPT09IHN0cltpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXF1b3RlICYmIChzdHJbaV0gPT09ICcgJyB8fCBzdHJbaV0gPT09ICc6JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBrZXkgKz0gc3RyW2ldO1xuXG4gICAgICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcgJiYgaSArIDEgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAga2V5ICs9IHN0cltpICsgMV07XG4gICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm9rZW4gSlNPTiBzeW50YXggbmVhciAke2tleX1gKTtcbiAgICB9XG5cbiAgICBjYW5CZUtleUhlYWQoY2gpIHtcbiAgICAgICAgaWYgKGNoWzBdID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNoWzBdID49ICdhJyAmJiBjaFswXSA8PSAneicpIHx8IChjaFswXSA+PSAnQScgJiYgY2hbMF0gPD0gJ1onKSB8fCBjaFswXSA9PT0gJ18nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hbMF0gPj0gJzAnICYmIGNoWzBdIDw9ICc5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoWzBdID09PSAnJCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaC5jaGFyQ29kZUF0KDApID4gMjU1KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0JsYW5rQ2hhcihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICdcXHQnO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaW5nbGV0b24gZnJvbSAnLi4vYWJzdHJhY3RzL1NpbmdsZXRvbic7XG5cbi8qKlxuICogU2FuaXRpemVyIHV0aWxpdHkuXG4gKlxuICogQ2xpZW50LXNpZGUgSFRNTCBzYW5pdGl6ZXIgZGVzaWduZWQgbW9zdGx5IHRvIHByZXZlbnQgc2VsZi1YU1MgYXR0YWNrcy5cbiAqIFRoZSBzYW5pdGl6ZXIgdXRpbGl0eSB3aWxsIHN0cmlwIGFsbCBhdHRyaWJ1dGVzIHRoYXQgc3RhcnQgd2l0aCBgb25gICh1c3VhbGx5IEpTIGV2ZW50IGhhbmRsZXJzIGFzIGF0dHJpYnV0ZXMsIGkuZS4gYG9ubG9hZGAgb3IgYG9uZXJyb3JgKSBvciBjb250YWluIHRoZSBgamF2YXNjcmlwdDpgIHBzZXVkbyBwcm90b2NvbCBpbiB0aGVpciB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2FuaXRpemVyIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIC8vIEFkZCB0byBnbG9iYWwgZnVuY3Rpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHdpbmRvdy53blNhbml0aXplID0gKGh0bWwpID0+IHRoaXMuc2FuaXRpemUoaHRtbCk7XG4gICAgICAgIHdpbmRvdy5vY1Nhbml0aXplID0gd2luZG93LnduU2FuaXRpemU7XG4gICAgfVxuXG4gICAgc2FuaXRpemUoaHRtbCwgYm9keU9ubHkpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3QgcmV0dXJuQm9keU9ubHkgPSAoYm9keU9ubHkgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgYm9keU9ubHkgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgID8gYm9keU9ubHlcbiAgICAgICAgICAgIDogdHJ1ZTtcblxuICAgICAgICB0aGlzLnNhbml0aXplTm9kZShkb20uZ2V0Um9vdE5vZGUoKSk7XG5cbiAgICAgICAgcmV0dXJuIChyZXR1cm5Cb2R5T25seSkgPyBkb20uYm9keS5pbm5lckhUTUwgOiBkb20uaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIHNhbml0aXplTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnRhZ05hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmltQXR0cmlidXRlcyhub2RlKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20obm9kZS5jaGlsZHJlbik7XG5cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2FuaXRpemVOb2RlKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJpbUF0dHJpYnV0ZXMobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gbm9kZS5hdHRyaWJ1dGVzLml0ZW0oaSkubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IG5vZGUuYXR0cmlidXRlcy5pdGVtKGkpLnZhbHVlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgKiByZW1vdmUgYXR0cmlidXRlcyB3aGVyZSB0aGUgbmFtZXMgc3RhcnQgd2l0aCBcIm9uXCIgKGZvciBleGFtcGxlOiBvbmxvYWQsIG9uZXJyb3IuLi4pXG4gICAgICAgICAgICAqIHJlbW92ZSBhdHRyaWJ1dGVzIHdoZXJlIHRoZSB2YWx1ZSBzdGFydHMgd2l0aCB0aGUgXCJqYXZhc2NyaXB0OlwiIHBzZXVkbyBwcm90b2NvbCAoZm9yIGV4YW1wbGUgaHJlZj1cImphdmFzY3JpcHQ6YWxlcnQoMSlcIilcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgIGlmIChhdHRyTmFtZS5pbmRleE9mKCdvbicpID09PSAwIHx8IGF0dHJWYWx1ZS5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFNpbmdsZXRvbiBmcm9tICcuLi9hYnN0cmFjdHMvU2luZ2xldG9uJztcblxuLyoqXG4gKiBVUkwgdXRpbGl0eS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgcHJvdmlkZXMgVVJMIGZ1bmN0aW9ucy5cbiAqXG4gKiBAY29weXJpZ2h0IDIwMjIgV2ludGVyLlxuICogQGF1dGhvciBCZW4gVGhvbXNvbiA8Z2l0QGFsZnJlaWRvLmNvbT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXJsIGV4dGVuZHMgU2luZ2xldG9uIHtcbiAgICBjb25zdHJ1Y3QoKSB7XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3VuZEFzc2V0VXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXNlVXJsKCk7XG4gICAgICAgIHRoaXMuYXNzZXRVcmwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgVVJMIGJhc2VkIG9uIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKlxuICAgICAqIElmIGFuIGFic29sdXRlIFVSTCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB0byh1cmwpIHtcbiAgICAgICAgY29uc3QgdXJsUmVnZXggPSAvXig/OlteOl0rOlxcL1xcLylbLWEtejAtOUA6JS5fK34jPV17MSwyNTZ9XFxiKFstYS16MC05KClAOiVfKy5+Iz8mLy89XSopL2k7XG5cbiAgICAgICAgaWYgKHVybC5tYXRjaCh1cmxSZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aGVVcmwgPSB1cmwucmVwbGFjZSgvXlxcLysvLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYmFzZVVybCgpfSR7dGhlVXJsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBBc3NldCBVUkwgYmFzZWQgb24gYSByZWxhdGl2ZSBwYXRoLlxuICAgICAqXG4gICAgICogSWYgYW4gYWJzb2x1dGUgVVJMIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzc2V0KHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKD86W146XSs6XFwvXFwvKVstYS16MC05QDolLl8rfiM9XXsxLDI1Nn1cXGIoWy1hLXowLTkoKUA6JV8rLn4jPyYvLz1dKikvaTtcblxuICAgICAgICBpZiAodXJsLm1hdGNoKHVybFJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRoZVVybCA9IHVybC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5hc3NldFVybCgpfSR7dGhlVXJsfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGJhc2UgVVJMIG9mIHRoaXMgaW5zdGFsbC5cbiAgICAgKlxuICAgICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgYmFzZSBVUkwgZnJvbSB0aHJlZSBzb3VyY2VzLCBpbiBvcmRlcjpcbiAgICAgKiAgLSBJZiBTbm93Ym9hcmQgaXMgbG9hZGVkIHZpYSB0aGUgYHslIHNub3dib2FyZCAlfWAgdGFnLCBpdCB3aWxsIHJldHJpZXZlIHRoZSBiYXNlIFVSTCB0aGF0XG4gICAgICogaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCB0aGVyZS5cbiAgICAgKiAgLSBJZiBhIGA8YmFzZT5gIHRhZyBpcyBhdmFpbGFibGUsIGl0IHdpbGwgdXNlIHRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBiYXNlIHRhZy5cbiAgICAgKiAgLSBGaW5hbGx5LCBpdCB3aWxsIHRha2UgYSBndWVzcyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIHdpbGwgbGlrZWx5IG5vdCB3b3JrIGZvciBzaXRlc1xuICAgICAqIHRoYXQgcmVzaWRlIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgICAqXG4gICAgICogVGhlIGJhc2UgVVJMIHdpbGwgYWx3YXlzIGNvbnRhaW4gYSB0cmFpbGluZyBiYWNrc2xhc2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGJhc2VVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvdW5kQmFzZVVybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdGhpcy52YWxpZGF0ZUJhc2VVcmwoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtbW9kdWxlPVwic25vd2JvYXJkLWJhc2VcIl0nKS5kYXRhc2V0LmJhc2VVcmwpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZEJhc2VVcmwgPSB0aGlzLnZhbGlkYXRlQmFzZVVybChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJykuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSBbXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsXG4gICAgICAgICAgICAnLy8nLFxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgICAgICAnLycsXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZm91bmRCYXNlVXJsID0gdXJsUGFydHMuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRCYXNlVXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBhc3NldCBVUkwgb2YgdGhpcyBpbnN0YWxsLlxuICAgICAqXG4gICAgICogVGhpcyBkZXRlcm1pbmVzIHRoZSBiYXNlIFVSTCBmcm9tIHRocmVlIHNvdXJjZXMsIGluIG9yZGVyOlxuICAgICAqICAtIElmIFNub3dib2FyZCBpcyBsb2FkZWQgdmlhIHRoZSBgeyUgc25vd2JvYXJkICV9YCB0YWcsIGl0IHdpbGwgcmV0cmlldmUgdGhlIGFzc2V0IFVSTCB0aGF0XG4gICAgICogaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCB0aGVyZS5cbiAgICAgKiAgLSBJZiBhIGA8bGluayByZWw9XCJhc3NldF91cmxcIiBocmVmPVwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiPmAgdGFnIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCB1c2UgdGhlIFVSTCBzcGVjaWZpZWQgaW4gdGhlIGxpbmsgdGFnLlxuICAgICAqICAtIEZpbmFsbHksIGl0IHdpbGwgdGFrZSBhIGd1ZXNzIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgd2lsbCBsaWtlbHkgbm90IHdvcmsgZm9yIHNpdGVzXG4gICAgICogdGhhdCByZXNpZGUgaW4gc3ViZGlyZWN0b3JpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYXNzZXQgVVJMIHdpbGwgYWx3YXlzIGNvbnRhaW4gYSB0cmFpbGluZyBiYWNrc2xhc2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGFzc2V0VXJsKCkge1xuICAgICAgICBpZiAodGhpcy5mb3VuZEFzc2V0VXJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLW1vZHVsZT1cInNub3dib2FyZC1iYXNlXCJdJykuZGF0YXNldC5hc3NldFVybCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiYXNzZXRfdXJsXCJdJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBc3NldFVybCA9IHRoaXMudmFsaWRhdGVCYXNlVXJsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiYXNzZXRfdXJsXCJdJykuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRBc3NldFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gW1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgICAgICAgJy8vJyxcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LFxuICAgICAgICAgICAgJy8nLFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmZvdW5kQXNzZXRVcmwgPSB1cmxQYXJ0cy5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3VuZEFzc2V0VXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgYmFzZSBVUkwsIGVuc3VyaW5nIGl0IGlzIGEgSFRUUC9IVFRQcyBVUkwuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgU25vd2JvYXJkIHNjcmlwdCBvciA8YmFzZT4gdGFnIG9uIHRoZSBwYWdlIHVzZSBhIGRpZmZlcmVudCB0eXBlIG9mIFVSTCwgdGhpcyB3aWxsIGZhaWwgd2l0aFxuICAgICAqIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdmFsaWRhdGVCYXNlVXJsKHVybCkge1xuICAgICAgICBjb25zdCB1cmxSZWdleCA9IC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIyguKikpPy9pO1xuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IHVybFJlZ2V4LmV4ZWModXJsKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB1cmxQYXJ0c1syXTtcbiAgICAgICAgY29uc3QgZG9tYWluID0gdXJsUGFydHNbNF07XG5cbiAgICAgICAgaWYgKHByb3RvY29sICYmIFsnaHR0cCcsICdodHRwcyddLmluZGV4T2YocHJvdG9jb2wudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZSBVUkwgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvbWFpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhc2UgVVJMIGRldGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHVybC5zdWJzdHIoLTEpID09PSAnLycpXG4gICAgICAgICAgICA/IHVybFxuICAgICAgICAgICAgOiBgJHt1cmx9L2A7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNub3dib2FyZCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL21haW4vU25vd2JvYXJkJztcbmltcG9ydCBQcm94eUhhbmRsZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9tYWluL1Byb3h5SGFuZGxlcic7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvUmVxdWVzdCc7XG5pbXBvcnQgQXR0cmlidXRlUmVxdWVzdCBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2FqYXgvaGFuZGxlcnMvQXR0cmlidXRlUmVxdWVzdCc7XG5pbXBvcnQgQXNzZXRMb2FkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvQXNzZXRMb2FkZXInO1xuaW1wb3J0IERhdGFDb25maWcgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvRGF0YUNvbmZpZyc7XG5pbXBvcnQgU3R5bGVzaGVldExvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHlsZXNoZWV0TG9hZGVyJztcbmltcG9ydCBUcmFuc2l0aW9uIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL1RyYW5zaXRpb24nO1xuaW1wb3J0IEZsYXNoIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoJztcbmltcG9ydCBGbGFzaExpc3RlbmVyIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0ZsYXNoTGlzdGVuZXInO1xuaW1wb3J0IEZvcm1WYWxpZGF0aW9uIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0Zvcm1WYWxpZGF0aW9uJztcbmltcG9ydCBBdHRhY2hMb2FkaW5nIGZyb20gJy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3lzdGVtL2Fzc2V0cy9qcy9zbm93Ym9hcmQvZXh0cmFzL0F0dGFjaExvYWRpbmcnO1xuaW1wb3J0IFN0cmlwZUxvYWRlciBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N5c3RlbS9hc3NldHMvanMvc25vd2JvYXJkL2V4dHJhcy9TdHJpcGVMb2FkZXInO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zeXN0ZW0vYXNzZXRzL2pzL3Nub3dib2FyZC9leHRyYXMvVHJpZ2dlcic7XG5cbigod2luZG93KSA9PiB7XG4gICAgY29uc3Qgc25vd2JvYXJkID0gbmV3IFByb3h5KFxuICAgICAgICBuZXcgU25vd2JvYXJkKHRydWUsIHRydWUpLFxuICAgICAgICBQcm94eUhhbmRsZXIsXG4gICAgKTtcblxuICAgIC8vIENvdmVyIGFsbCBhbGlhc2VzXG4gICAgd2luZG93LnNub3dib2FyZCA9IHNub3dib2FyZDtcbiAgICB3aW5kb3cuU25vd2JvYXJkID0gc25vd2JvYXJkO1xuICAgIHdpbmRvdy5Tbm93Qm9hcmQgPSBzbm93Ym9hcmQ7XG5cbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdyZXF1ZXN0JywgUmVxdWVzdCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignYXR0cmlidXRlUmVxdWVzdCcsIEF0dHJpYnV0ZVJlcXVlc3QpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2Fzc2V0TG9hZGVyJywgQXNzZXRMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2RhdGFDb25maWcnLCBEYXRhQ29uZmlnKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdleHRyYXNTdHlsZXMnLCBTdHlsZXNoZWV0TG9hZGVyKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCd0cmFuc2l0aW9uJywgVHJhbnNpdGlvbik7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZmxhc2gnLCBGbGFzaCk7XG4gICAgc25vd2JvYXJkLmFkZFBsdWdpbignZmxhc2hMaXN0ZW5lcicsIEZsYXNoTGlzdGVuZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2Zvcm1WYWxpZGF0aW9uJywgRm9ybVZhbGlkYXRpb24pO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ2F0dGFjaExvYWRpbmcnLCBBdHRhY2hMb2FkaW5nKTtcbiAgICBzbm93Ym9hcmQuYWRkUGx1Z2luKCdzdHJpcGVMb2FkZXInLCBTdHJpcGVMb2FkZXIpO1xuICAgIHNub3dib2FyZC5hZGRQbHVnaW4oJ3RyaWdnZXInLCBUcmlnZ2VyKTtcblxuICAgIHNub3dib2FyZC5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICAgIC8vIFNjYW4gZm9yIHRyaWdnZXJzXG4gICAgICAgIEFycmF5XG4gICAgICAgICAgICAuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG4gICAgICAgICAgICAuZmlsdGVyKChlbGVtZW50KSA9PiBbLi4uZWxlbWVudC5hdHRyaWJ1dGVzXS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lLnN0YXJ0c1dpdGgoXCJkYXRhLXRyaWdnZXItXCIpKS5sZW5ndGggPiAwXG4gICAgICAgICAgICApLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzbm93Ym9hcmQudHJpZ2dlcihlbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xufSkod2luZG93KTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8qISBqcy1jb29raWUgdjMuMC41IHwgTUlUICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbmZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbnZhciBkZWZhdWx0Q29udmVydGVyID0ge1xuICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWVbMF0gPT09ICdcIicpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKCVbXFxkQS1GXXsyfSkrL2dpLCBkZWNvZGVVUklDb21wb25lbnQpXG4gIH0sXG4gIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKS5yZXBsYWNlKFxuICAgICAgLyUoMlszNDZCRl18M1tBQy1GXXw0MHw1W0JERV18NjB8N1tCQ0RdKS9nLFxuICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgKVxuICB9XG59O1xuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbmZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgZnVuY3Rpb24gc2V0IChuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlNSk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVzLmV4cGlyZXMpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgIH1cblxuICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSlcbiAgICAgIC5yZXBsYWNlKC8lKDJbMzQ2Ql18NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICAgIC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XG5cbiAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgZm9yICh2YXIgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc7ICcgKyBhdHRyaWJ1dGVOYW1lO1xuXG4gICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAvLyAuLi5cbiAgICAgIC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAvLyBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLFxuICAgICAgLy8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgICAvLyAuLi5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnPScgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnNwbGl0KCc7JylbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgbmFtZSArICc9JyArIGNvbnZlcnRlci53cml0ZSh2YWx1ZSwgbmFtZSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gIH1cblxuICBmdW5jdGlvbiBnZXQgKG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCAoYXJndW1lbnRzLmxlbmd0aCAmJiAhbmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRvIHByZXZlbnQgdGhlIGZvciBsb29wIGluIHRoZSBmaXJzdCBwbGFjZSBhc3NpZ24gYW4gZW1wdHkgYXJyYXlcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICB2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdO1xuICAgIHZhciBqYXIgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYXJ0cyA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcbiAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJz0nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZvdW5kID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzBdKTtcbiAgICAgICAgamFyW2ZvdW5kXSA9IGNvbnZlcnRlci5yZWFkKHZhbHVlLCBmb3VuZCk7XG5cbiAgICAgICAgaWYgKG5hbWUgPT09IGZvdW5kKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZSA/IGphcltuYW1lXSA6IGphclxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoXG4gICAge1xuICAgICAgc2V0LFxuICAgICAgZ2V0LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlcykge1xuICAgICAgICBzZXQoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBhc3NpZ24oe30sIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IC0xXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGluaXQodGhpcy5jb252ZXJ0ZXIsIGFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKSlcbiAgICAgIH0sXG4gICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgIHJldHVybiBpbml0KGFzc2lnbih7fSwgdGhpcy5jb252ZXJ0ZXIsIGNvbnZlcnRlciksIHRoaXMuYXR0cmlidXRlcylcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoZGVmYXVsdEF0dHJpYnV0ZXMpIH0sXG4gICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgfVxuICApXG59XG5cbnZhciBhcGkgPSBpbml0KGRlZmF1bHRDb252ZXJ0ZXIsIHsgcGF0aDogJy8nIH0pO1xuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuZXhwb3J0IHsgYXBpIGFzIGRlZmF1bHQgfTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwidmFyIGRlZmVycmVkID0gW107XG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8gPSAocmVzdWx0LCBjaHVua0lkcywgZm4sIHByaW9yaXR5KSA9PiB7XG5cdGlmKGNodW5rSWRzKSB7XG5cdFx0cHJpb3JpdHkgPSBwcmlvcml0eSB8fCAwO1xuXHRcdGZvcih2YXIgaSA9IGRlZmVycmVkLmxlbmd0aDsgaSA+IDAgJiYgZGVmZXJyZWRbaSAtIDFdWzJdID4gcHJpb3JpdHk7IGktLSkgZGVmZXJyZWRbaV0gPSBkZWZlcnJlZFtpIC0gMV07XG5cdFx0ZGVmZXJyZWRbaV0gPSBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV07XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhciBub3RGdWxmaWxsZWQgPSBJbmZpbml0eTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV0gPSBkZWZlcnJlZFtpXTtcblx0XHR2YXIgZnVsZmlsbGVkID0gdHJ1ZTtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGNodW5rSWRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRpZiAoKHByaW9yaXR5ICYgMSA9PT0gMCB8fCBub3RGdWxmaWxsZWQgPj0gcHJpb3JpdHkpICYmIE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uTykuZXZlcnkoKGtleSkgPT4gKF9fd2VicGFja19yZXF1aXJlX18uT1trZXldKGNodW5rSWRzW2pdKSkpKSB7XG5cdFx0XHRcdGNodW5rSWRzLnNwbGljZShqLS0sIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZnVsZmlsbGVkID0gZmFsc2U7XG5cdFx0XHRcdGlmKHByaW9yaXR5IDwgbm90RnVsZmlsbGVkKSBub3RGdWxmaWxsZWQgPSBwcmlvcml0eTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYoZnVsZmlsbGVkKSB7XG5cdFx0XHRkZWZlcnJlZC5zcGxpY2UoaS0tLCAxKVxuXHRcdFx0dmFyIHIgPSBmbigpO1xuXHRcdFx0aWYgKHIgIT09IHVuZGVmaW5lZCkgcmVzdWx0ID0gcjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIi9hc3NldHMvanMvdGhlbWVcIjogMCxcblx0XCJhc3NldHMvY3NzL3RoZW1lXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGlmKGNodW5rSWRzLnNvbWUoKGlkKSA9PiAoaW5zdGFsbGVkQ2h1bmtzW2lkXSAhPT0gMCkpKSB7XG5cdFx0Zm9yKG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0fVxuXHRpZihwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbikgcGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24oZGF0YSk7XG5cdGZvcig7aSA8IGNodW5rSWRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y2h1bmtJZCA9IGNodW5rSWRzW2ldO1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpICYmIGluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKCk7XG5cdFx0fVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9IDA7XG5cdH1cblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uTyhyZXN1bHQpO1xufVxuXG52YXIgY2h1bmtMb2FkaW5nR2xvYmFsID0gc2VsZltcIndlYnBhY2tDaHVua3dpbnRlcmNtc193b3Jrc2hvcF90aGVtZVwiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmt3aW50ZXJjbXNfd29ya3Nob3BfdGhlbWVcIl0gfHwgW107XG5jaHVua0xvYWRpbmdHbG9iYWwuZm9yRWFjaCh3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIDApKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gd2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCBjaHVua0xvYWRpbmdHbG9iYWwucHVzaC5iaW5kKGNodW5rTG9hZGluZ0dsb2JhbCkpOyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgZGVwZW5kcyBvbiBvdGhlciBsb2FkZWQgY2h1bmtzIGFuZCBleGVjdXRpb24gbmVlZCB0byBiZSBkZWxheWVkXG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8odW5kZWZpbmVkLCBbXCJhc3NldHMvY3NzL3RoZW1lXCJdLCAoKSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vYXNzZXRzL2pzL3NyYy90aGVtZS5qc1wiKSkpXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcImFzc2V0cy9jc3MvdGhlbWVcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9hc3NldHMvY3NzL2Jhc2UuY3NzXCIpKSlcbl9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8oX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4iLCIiXSwibmFtZXMiOlsiUGx1Z2luQmFzZSIsInNub3dib2FyZCIsIl9jbGFzc0NhbGxDaGVjayIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiY29uc3RydWN0IiwiZGVwZW5kZW5jaWVzIiwibGlzdGVucyIsImRlc3RydWN0IiwiZGV0YWNoIiwiZGVzdHJ1Y3RvciIsImRlZmF1bHQiLCJTaW5nbGV0b24iLCJfUGx1Z2luQmFzZSIsIl9jYWxsU3VwZXIiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHMiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZSIsInQiLCJyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibiIsImhhc093blByb3BlcnR5IiwibyIsImRlZmluZVByb3BlcnR5IiwiaSIsIlN5bWJvbCIsImEiLCJpdGVyYXRvciIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiY2FsbCIsImgiLCJsIiwiZiIsInMiLCJ5IiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInAiLCJkIiwiZ2V0UHJvdG90eXBlT2YiLCJ2IiwidmFsdWVzIiwiZyIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsIl90eXBlb2YiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsIkVycm9yIiwiZG9uZSIsIm1ldGhvZCIsImRlbGVnYXRlIiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpc05hTiIsImxlbmd0aCIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwia2V5cyIsInJldmVyc2UiLCJwb3AiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicnZhbCIsImhhbmRsZSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwiaXNBcnJheSIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJpbWl0aXZlIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJfZ2V0UHJvdG90eXBlT2YiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIlJlZmVyZW5jZUVycm9yIiwiQm9vbGVhbiIsInZhbHVlT2YiLCJiaW5kIiwiX3NldFByb3RvdHlwZU9mIiwiUmVxdWVzdCIsImVsZW1lbnQiLCJoYW5kbGVyIiwib3B0aW9ucyIsIl90aGlzIiwiaXNIYW5kbGVyTmFtZSIsIm1hdGNoZWRFbGVtZW50IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiY29uY2F0IiwiZmV0Y2hPcHRpb25zIiwicmVzcG9uc2VEYXRhIiwicmVzcG9uc2VFcnJvciIsImNhbmNlbGxlZCIsImNoZWNrUmVxdWVzdCIsImdsb2JhbEV2ZW50IiwiZXZlbnQiLCJFdmVudCIsImNhbmNlbGFibGUiLCJyZXF1ZXN0IiwiZGlzcGF0Y2hFdmVudCIsImRlZmF1bHRQcmV2ZW50ZWQiLCJkb0NsaWVudFZhbGlkYXRpb24iLCJjb25maXJtIiwiZG9Db25maXJtIiwiY29uZmlybWVkIiwiZG9BamF4IiwicmVzcG9uc2UiLCJwcm9jZXNzVXBkYXRlIiwiWF9XSU5URVJfU1VDQ0VTUyIsInByb2Nlc3NFcnJvciIsInByb2Nlc3NSZXNwb25zZSIsImVycm9yIiwiRWxlbWVudCIsInVuZGVmaW5lZCIsImdldEZldGNoIiwiaGVhZGVycyIsImJvZHkiLCJkYXRhIiwicmVkaXJlY3QiLCJtb2RlIiwiZmV0Y2giLCJ1cmwiLCJicm93c2VyVmFsaWRhdGUiLCJmb3JtIiwiY2hlY2tWYWxpZGl0eSIsInJlcG9ydFZhbGlkaXR5IiwiX3RoaXMyIiwiYWpheFByb21pc2UiLCJyZWplY3QiLCJvayIsInN0YXR1cyIsImhhcyIsImdldCIsImluY2x1ZGVzIiwianNvbiIsIm1lc3NhZ2UiLCJleGNlcHRpb24iLCJyZW5kZXJFcnJvciIsImZpbGUiLCJsaW5lIiwidHJhY2UiLCJ0ZXh0IiwicmVzcG9uc2VUZXh0IiwiWF9XSU5URVJfUkVTUE9OU0VfQ09ERSIsInByb21pc2UiLCJfdGhpczMiLCJiZWZvcmVVcGRhdGUiLCJwYXJ0aWFscyIsImVudHJpZXMiLCJlbnRyeSIsIl9lbnRyeSIsInN1YnN0ciIsIlhfV0lOVEVSX0FTU0VUUyIsInByb2Nlc3NBc3NldHMiLCJwcm9taXNlcyIsImdsb2JhbFByb21pc2VFdmVudCIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZG9VcGRhdGUiLCJ3aW5kb3ciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJfdGhpczQiLCJhZmZlY3RlZCIsIl9lbnRyeTIiLCJwYXJ0aWFsIiwiY29udGVudCIsInNlbGVjdG9yIiwidXBkYXRlIiwiZWxlbWVudHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaW5uZXJIVE1MIiwic3VjY2VzcyIsImZsYXNoIiwiWF9XSU5URVJfRkxBU0hfTUVTU0FHRVMiLCJwcm9jZXNzRmxhc2hNZXNzYWdlcyIsIlhfV0lOVEVSX1JFRElSRUNUIiwicHJvY2Vzc1JlZGlyZWN0IiwicHJvY2Vzc0Vycm9yTWVzc2FnZSIsInNraXBFcnJvciIsIlhfV0lOVEVSX0VSUk9SX0ZJRUxEUyIsInByb2Nlc3NWYWxpZGF0aW9uRXJyb3JzIiwiWF9XSU5URVJfRVJST1JfTUVTU0FHRSIsIl90aGlzNSIsImhhbmRsZVJlZGlyZWN0UmVzcG9uc2UiLCJhZGRFdmVudExpc3RlbmVyIiwiY3JlYXRlRXZlbnQiLCJldmVudE5hbWUiLCJvbmNlIiwibG9jYXRpb24iLCJhc3NpZ24iLCJoYW5kbGVFcnJvck1lc3NhZ2UiLCJhbGVydCIsIm1lc3NhZ2VzIiwiaGFuZGxlRmxhc2hNZXNzYWdlcyIsImZpZWxkcyIsImhhbmRsZVZhbGlkYXRpb25FcnJvcnMiLCJhc3NldHMiLCJfZG9Db25maXJtIiwiX2NhbGxlZTIiLCJmdWxmaWxsZWQiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJoYW5kbGVDb25maXJtTWVzc2FnZSIsImxpc3RlbnNUb0V2ZW50IiwidDAiLCJ0YWdOYW1lIiwiY2xvc2VzdCIsImV4dHJhY3RQYXJ0aWFscyIsInhzcmZUb2tlbiIsImxvYWRpbmciLCJocmVmIiwiZmlsZXMiLCJGb3JtRGF0YSIsImRlYnVnIiwiY29va2llIiwiZm9ybURhdGEiLCJfZW50cnkzIiwiYXBwZW5kIiwiam9pbiIsIkF0dHJpYnV0ZVJlcXVlc3QiLCJfU2luZ2xldG9uIiwicmVhZHkiLCJhamF4U2V0dXAiLCJhdHRhY2hIYW5kbGVycyIsImRpc2FibGVEZWZhdWx0Rm9ybVZhbGlkYXRpb24iLCJkZXRhY2hIYW5kbGVycyIsIl9nZXQiLCJjaGFuZ2VIYW5kbGVyIiwiY2xpY2tIYW5kbGVyIiwia2V5RG93bkhhbmRsZXIiLCJzdWJtaXRIYW5kbGVyIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRhcmdldCIsIm1hdGNoZXMiLCJwcm9jZXNzUmVxdWVzdE9uRWxlbWVudCIsImN1cnJlbnRFbGVtZW50IiwicGFyZW50RWxlbWVudCIsInByZXZlbnREZWZhdWx0IiwidmFsaWRUeXBlcyIsImluZGV4T2YiLCJnZXRBdHRyaWJ1dGUiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJ0cmFja0lucHV0IiwiZGF0YXNldCIsInJlcXVlc3RDb25maXJtIiwicmVxdWVzdFJlZGlyZWN0IiwicmVxdWVzdExvYWRpbmciLCJyZXF1ZXN0Rm9ybSIsInJlcXVlc3RVcmwiLCJwYXJzZURhdGEiLCJyZXF1ZXN0VXBkYXRlIiwicmVxdWVzdERhdGEiLCJvbkFqYXhTZXR1cCIsImZpZWxkTmFtZSIsImdldFBhcmVudFJlcXVlc3REYXRhIiwiZWxlbWVudERhdGEiLCJqc29ucGFyc2VyIiwicGFyc2UiLCJsYXN0VmFsdWUiLCJpbnRlcnZhbCIsInJlc2V0VHJhY2tJbnB1dFRpbWVyIiwiaW5wdXRUaW1lciIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9uIiwiRiIsIkFzc2V0TG9hZGVyIiwiYWpheExvYWRBc3NldHMiLCJfbG9hZCIsIl9pdGVyYXRvciIsIl9zdGVwIiwic2NyaXB0IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsInN0eWxlIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsImltYWdlIiwianMiLCJsb2FkU2NyaXB0IiwidDEiLCJjc3MiLCJsb2FkU3R5bGUiLCJ0MiIsInQzIiwiaW1nIiwibG9hZEltYWdlIiwidDQiLCJ0NSIsImxvYWQiLCJfeCIsImFzc2V0IiwibG9hZGVkIiwiZG9tU2NyaXB0IiwiY3JlYXRlRWxlbWVudCIsImRvbUNzcyIsImhlYWQiLCJJbWFnZSIsInNyYyIsIkF0dGFjaExvYWRpbmciLCJhamF4U3RhcnQiLCJhamF4RG9uZSIsImxvYWRFbGVtZW50cyIsImNsYXNzTGlzdCIsImFkZCIsImdldExvYWRpbmdDbGFzcyIsImF0dGFjaExvYWRpbmciLCJyZW1vdmUiLCJEYXRhQ29uZmlnIiwiaW5zdGFuY2UiLCJsb2NhbENvbmZpZyIsIkhUTUxFbGVtZW50IiwiaW5zdGFuY2VDb25maWciLCJhY2NlcHRlZENvbmZpZ3MiLCJyZWZyZXNoIiwiY29uZmlnIiwic2V0IiwicGVyc2lzdCIsImdldEFjY2VwdGVkQ29uZmlncyIsInByb2Nlc3NDb25maWciLCJhY2NlcHRBbGxEYXRhQ29uZmlncyIsImRlZmF1bHRzIiwiZ2V0RGVmYXVsdHMiLCJjb2VyY2VWYWx1ZSIsInN0cmluZ1ZhbHVlIiwic3RhcnRzV2l0aCIsImJhc2U2NHN0ciIsInJlcGxhY2UiLCJkZWNvZGVkIiwiYXRvYiIsInRvTG93ZXJDYXNlIiwianNvblBhcnNlciIsIkZsYXNoIiwiZHVyYXRpb24iLCJjbGVhciIsInRpbWVyIiwiZmxhc2hUaW1lciIsInJlbW92ZUF0dHJpYnV0ZSIsInN0b3BUaW1lciIsInN0YXJ0VGltZXIiLCJhcHBlbmRDaGlsZCIsInRyYW5zaXRpb24iLCJ0aW1lclRyYW5zIiwiY2FuY2VsIiwiRmxhc2hMaXN0ZW5lciIsImFqYXhFcnJvck1lc3NhZ2UiLCJhamF4Rmxhc2hNZXNzYWdlcyIsImZsYXNoVHlwZSIsImZsYXNoRHVyYXRpb24iLCJjc3NDbGFzcyIsIkZvcm1WYWxpZGF0aW9uIiwiZXJyb3JCYWdzIiwiYWpheFZhbGlkYXRpb25FcnJvcnMiLCJjb2xsZWN0RXJyb3JCYWdzIiwiZG9WYWxpZGF0aW9uIiwiaW52YWxpZEZpZWxkcyIsInJlcXVlc3RWYWxpZGF0ZSIsImVycm9yQmFnIiwic2hvd0Vycm9yQmFnIiwiY2xlYXJWYWxpZGF0aW9uIiwiaGlkZUVycm9yQmFnIiwicm9vdE5vZGUiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJtZXNzYWdlTGlzdEVsZW1lbnQiLCJwbGFjZWhvbGRlciIsImNyZWF0ZUNvbW1lbnQiLCJlcnJvckJhZ0RhdGEiLCJ2YWxpZGF0ZUZvciIsInNwbGl0IiwiY2xvbmVOb2RlIiwibWVzc2FnZUxpc3RBbmNob3IiLCJjdXN0b21NZXNzYWdlIiwidGV4dENvbnRlbnQiLCJjaGlsZE5vZGVzIiwicmVwbGFjZUNoaWxkIiwiaXNDb25uZWN0ZWQiLCJlcnJvckJhZ1ZhbGlkYXRlc0ZpZWxkIiwiZmlyc3RGaWVsZCIsImZpZWxkIiwic2hpZnQiLCJfaW52YWxpZEZpZWxkcyRmaXJzdEYiLCJlcnJvcnMiLCJtZXNzYWdlRWxlbWVudCIsInZhbGlkYXRpb25NZXNzYWdlIiwiYWZ0ZXIiLCJfaW52YWxpZEZpZWxkcyRPYmplY3QiLCJTdHJpcGVMb2FkZXIiLCJjb3VudGVyIiwiY3JlYXRlU3RyaXBlIiwic3RyaXBlIiwic2hvdyIsImhpZGUiLCJpbmRpY2F0b3IiLCJzdHJpcGVMb2FkZWQiLCJuZXdTdHJpcGUiLCJmb3JjZSIsIlN0eWxlc2hlZXRMb2FkZXIiLCJzdHlsZXNMb2FkZWQiLCJlbmRzV2l0aCIsInN0eWxlc2hlZXQiLCJUcmFuc2l0aW9uIiwiY2FsbGJhY2siLCJ0cmFpbFRvIiwicGFyc2VEdXJhdGlvbiIsImRvVHJhbnNpdGlvbiIsImV2ZW50Q2xhc3NlcyIsIl9sZW4iLCJhcmdzIiwiX2tleSIsImFjdGl2ZSIsIm91dCIsInJldHVybkNsYXNzZXMiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJyZXNldENsYXNzZXMiLCJldmVudENsYXNzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9uVHJhbnNpdGlvbkVuZCIsInBhcnNlZCIsImV4ZWMiLCJhbW91bnQiLCJ1bml0IiwiTWF0aCIsImZsb29yIiwiVHJpZ2dlciIsInRyaWdnZXJzIiwiTWFwIiwiZXZlbnRzIiwiY29ubmVjdG9ycyIsInBhcnNlVHJpZ2dlcnMiLCJzaXplIiwicmVzZXRFdmVudHMiLCJjcmVhdGVUcmlnZ2VyRXZlbnRzIiwicnVuRXZlbnRzIiwiZGFzaFN0eWxlIiwibWF0Y2giLCJ0cmlnZ2VyUGFydHMiLCJ0cmlnZ2VyTmFtZSIsInRyaWdnZXJUeXBlIiwiX3RyaWdnZXJQYXJ0cyIsInRyaWdnZXIiLCJnZXRTZWxlY3RhYmxlRWxlbWVudHMiLCJoYXNWYWxpZENvbmRpdGlvbnMiLCJoYXNWYWxpZEFjdGlvbnMiLCJwYXJzZUNvbW1hbmQiLCJjb21tYW5kIiwiYWxsb3dNdWx0aXBsZSIsInRyaW0iLCJzcGxpdFZhbHVlcyIsInF1b3RlZCIsIm1hcCIsInNwbGl0VmFsdWUiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJwYXJhbWV0ZXJzIiwic3BsaXRDb21tYW5kcyIsImNvbW1hbmRzIiwic3BsaXRDb21tYW5kIiwiX2NvbW1hbmQkc3BsaXQiLCJfY29tbWFuZCRzcGxpdDIiLCJldmVyeSIsImNvbmRpdGlvbiIsImFjdGlvbiIsImNyZWF0ZVZhbHVlQ29uZGl0aW9uIiwiY3JlYXRlRW1wdHlDb25kaXRpb24iLCJjcmVhdGVDaGVja2VkQ29uZGl0aW9uIiwiY3JlYXRlRm9jdXNlZENvbmRpdGlvbiIsInJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMiLCJhZGRFdmVudCIsIlNldCIsInByaW9yaXR5IiwiZXhlY3V0ZUFjdGlvbnMiLCJfcmVmIiwiZWxlbWVudEV2ZW50Iiwic29ydCIsImIiLCJhbGwiLCJzdXBwb3J0ZWRFbGVtZW50cyIsImVsZW1lbnRWYWx1ZXMiLCJjaGVja2VkIiwic29tZSIsIl90aGlzNiIsIl90aGlzNyIsImF0TGVhc3QiLCJhdE1vc3QiLCJhdExlYXN0Q291bnQiLCJhdE1vc3RDb3VudCIsIl90aGlzOCIsImFjdGl2ZUVsZW1lbnQiLCJlbGVtZW50Q29ubmVjdG9ycyIsImNvbm5lY3RvciIsImNvbmRpdGlvbk1ldCIsIl90aGlzOSIsImFjdGlvblNob3ciLCJhY3Rpb25FbmFibGUiLCJhY3Rpb25WYWx1ZSIsImFjdGlvbkNsYXNzIiwiX3RoaXMxMCIsImRpc3BsYXkiLCJvcmlnaW5hbERpc3BsYXkiLCJhZnRlckFjdGlvbiIsImVuYWJsZSIsIl90aGlzMTEiLCJkaXNhYmxlZCIsIl90aGlzMTIiLCJ1bm1ldFZhbHVlIiwibmV3VmFsdWUiLCJfdGhpczEzIiwidW5tZXRDc3NDbGFzcyIsInByb3AiLCJyZWNlaXZlciIsInByb3BMb3dlciIsImhhc1BsdWdpbiIsIl9SZWZsZWN0JGdldCRwcm9wTG93ZSIsImdldEluc3RhbmNlIiwiSW5uZXJQcm94eUhhbmRsZXIiLCJQbHVnaW5Mb2FkZXIiLCJQcm94eSIsImZyZWV6ZSIsImluc3RhbmNlcyIsInNpbmdsZXRvbiIsImluaXRpYWxpc2VkIiwic2VhbCIsIm1vY2tzIiwib3JpZ2luYWxGdW5jdGlvbnMiLCJoYXNNZXRob2QiLCJtZXRob2ROYW1lIiwiaXNGdW5jdGlvbiIsImNhbGxNZXRob2QiLCJfbGVuMiIsIl9rZXkyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwidW5tZXQiLCJnZXREZXBlbmRlbmNpZXMiLCJpdGVtIiwiZ2V0UGx1Z2luTmFtZXMiLCJpc1NpbmdsZXRvbiIsImluaXRpYWxpc2VTaW5nbGV0b24iLCJfbGVuMyIsInBhcmFtcyIsIl9rZXkzIiwiX2VudHJ5NCIsIl9sZW40IiwiX2tleTQiLCJuZXdJbnN0YW5jZSIsIl9jb25zdHJ1Y3QiLCJzcGxpY2UiLCJnZXRJbnN0YW5jZXMiLCJpc0luaXRpYWxpc2VkIiwiX2xlbjUiLCJfa2V5NSIsInBsdWdpbiIsIm1vY2siLCJfbGVuNiIsIl9rZXk2IiwidW5tb2NrIiwiQ29va2llIiwiSnNvblBhcnNlciIsIlNhbml0aXplciIsIlVybCIsIlNub3dib2FyZCIsImF1dG9TaW5nbGV0b25zIiwiZGVidWdFbmFibGVkIiwiYXV0b0luaXRTaW5nbGV0b25zIiwicGx1Z2lucyIsImxpc3RlbmVycyIsImZvdW5kQmFzZVVybCIsInJlYWRpbmVzcyIsImRvbSIsImF0dGFjaEFic3RyYWN0cyIsImxvYWRVdGlsaXRpZXMiLCJpbml0aWFsaXNlIiwiYWRkUGx1Z2luIiwiaW5pdGlhbGlzZVNpbmdsZXRvbnMiLCJsb3dlck5hbWUiLCJnZXRQbHVnaW5zIiwicmVhZHlNZXRob2QiLCJyZW1vdmVQbHVnaW4iLCJnZXRQbHVnaW4iLCJvbiIsIm9mZiIsImluZGV4IiwibGlzdGVuTWV0aG9kIiwicmVzdWx0IiwibGlzdGVuZXIiLCJpbnN0YW5jZVByb21pc2UiLCJsaXN0ZW5lclByb21pc2UiLCJsb2dNZXNzYWdlIiwiY29sb3IiLCJib2xkIiwiY29uc29sZSIsImdyb3VwQ29sbGFwc2VkIiwicGFyYW0iLCJsb2ciLCJncm91cEVuZCIsIkJhc2VDb29raWUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsInNhbWVTaXRlIiwic2V0RGVmYXVsdHMiLCJjb29raWVzIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlIiwic2F2ZVZhbHVlIiwid25KU09OIiwib2NKU09OIiwic3RyIiwianNvblN0cmluZyIsInBhcnNlU3RyaW5nIiwiSlNPTiIsIm51bSIsImlzQmxhbmtDaGFyIiwicGFyc2VLZXkiLCJjYW5CZUtleUhlYWQiLCJnZXRCb2R5Iiwib3JpZ2luTGVuZ3RoIiwibGFzdCIsInBvcyIsInN0YWNrIiwicXVvdGUiLCJjaCIsImNoYXJDb2RlQXQiLCJ3blNhbml0aXplIiwiaHRtbCIsInNhbml0aXplIiwib2NTYW5pdGl6ZSIsImJvZHlPbmx5IiwicGFyc2VyIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicmV0dXJuQm9keU9ubHkiLCJzYW5pdGl6ZU5vZGUiLCJnZXRSb290Tm9kZSIsIm5vZGUiLCJ0cmltQXR0cmlidXRlcyIsImNoaWxkcmVuIiwiY2hpbGQiLCJhdHRyaWJ1dGVzIiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJmb3VuZEFzc2V0VXJsIiwiYmFzZVVybCIsImFzc2V0VXJsIiwidG8iLCJ1cmxSZWdleCIsInRoZVVybCIsInZhbGlkYXRlQmFzZVVybCIsInVybFBhcnRzIiwicHJvdG9jb2wiLCJob3N0IiwiUHJveHlIYW5kbGVyIiwiU25vd0JvYXJkIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/package.json b/package.json index b2e6336..fccdcb1 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,27 @@ { - "name": "wintercms-workshop-theme", - "description": "Winter CMS Workshop Theme", - "private": true, - "author": { - "name": "Ben Thomson", - "email": "git@alfreido.com" - }, - "contributors": [ - { - "name": "Winter CMS Maintainers", - "url": "https://wintercms.com" - } - ], - "license": "MIT", - "bugs": "https://github.com/wintercms/wn-workshop-theme/issues", - "devDependencies": { - "autoprefixer": "^10.4.4", - "postcss": "^8.4.12", - "postcss-import": "^14.1.0", - "tailwindcss": "^3.0.24" - } + "name": "wintercms-workshop-theme", + "description": "Winter CMS Workshop Theme", + "private": true, + "author": { + "name": "Ben Thomson", + "email": "git@alfreido.com" + }, + "contributors": [ + { + "name": "Winter CMS Maintainers", + "url": "https://wintercms.com" + } + ], + "license": "MIT", + "bugs": "https://github.com/wintercms/wn-workshop-theme/issues", + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/typography": "^0.5.2", + "autoprefixer": "^10.4.4", + "browser-sync": "^3.0.2", + "browser-sync-webpack-plugin": "^2.3.0", + "postcss": "^8.4.12", + "postcss-import": "^14.1.0", + "tailwindcss": "^3.0.24" + } } diff --git a/pages/snowboard/triggers.htm b/pages/snowboard/triggers.htm index 15b3ecc..7ed89de 100644 --- a/pages/snowboard/triggers.htm +++ b/pages/snowboard/triggers.htm @@ -451,6 +451,79 @@

Trigger on multiple checked

+ +
+ +

Focus

+ + +
+ +

Trigger on focus

+

The textboxes below all trigger a focus condition on the message, and with additional triggers, update the text of the message.

+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
diff --git a/partials/html/foot.htm b/partials/html/foot.htm index 7f49421..862a683 100644 --- a/partials/html/foot.htm +++ b/partials/html/foot.htm @@ -14,7 +14,7 @@

- + {% scripts %} diff --git a/winter.mix.js b/winter.mix.js index 69359ef..02a4580 100644 --- a/winter.mix.js +++ b/winter.mix.js @@ -10,4 +10,4 @@ mix.postCss('assets/css/base.css', 'assets/css/theme.css', [ require('autoprefixer') ]); -mix.js('assets/js/src/app.js', 'assets/js/app.js'); +mix.js('assets/js/src/theme.js', 'assets/js/theme.js');