{"id":25759,"date":"2026-10-16T12:59:20","date_gmt":"2026-10-16T12:59:20","guid":{"rendered":"https:\/\/cmacademy.events\/?post_type=ht_kb&#038;p=25759"},"modified":"2026-10-16T13:01:34","modified_gmt":"2026-10-16T13:01:34","slug":"kontrollera-och-optimera-dina-bilder","status":"publish","type":"ht_kb","link":"https:\/\/cmacademy.events\/sv\/knowledge-base\/kontrollera-och-optimera-dina-bilder\/","title":{"rendered":"Kontrollera och optimera dina bilder"},"content":{"rendered":"\n<div class=\"cm-image-tool-placeholder\"><!-- Ers\u00e4tt detta block med bildkontrollen (flikarna HTML, CSS och JavaScript, mappen SV). --><\/div>\n\n\n\n<style data-wp-block-html=\"css\">\n#cm-image-lab,#cm-image-lab *{box-sizing:border-box}\n#cm-image-lab{--green:var(--cmac-brand,#9CCC3D);--green-soft:#F8FBEF;--blue:var(--cmac-accent,#185ABC);--navy:var(--cmac-ink,#1F354D);--text:#12202E;--body:#405266;--muted:var(--cmac-muted,#677482);--line:#D9E2EA;--line-soft:#E4EAEF;--soft:#F7F9FB;color:var(--text);font-family:inherit;line-height:1.6;max-width:100%}\n#cm-image-lab button,#cm-image-lab select,#cm-image-lab input{font:inherit;letter-spacing:normal;text-transform:none}\n#cm-image-lab h2,#cm-image-lab h3{font-family:inherit;letter-spacing:normal;text-transform:none;line-height:1.25}\n#cm-image-lab p{margin:0 0 12px}\n#cm-image-lab .cil-card{border:1px solid var(--line);border-radius:16px;padding:30px 32px;background:#fff;margin:0 0 24px;box-shadow:0 1px 2px rgba(18,32,46,.04),0 10px 28px rgba(18,32,46,.05)}\n#cm-image-lab .cil-title{margin:0 0 8px;font-size:26px;font-weight:700;color:var(--navy);letter-spacing:-.01em}\n#cm-image-lab .cil-subtitle{margin:20px 0 8px;font-size:19px;font-weight:700;color:var(--navy)}\n#cm-image-lab .cil-lead{margin:0 0 24px;color:var(--body);font-size:17px;max-width:62ch}\n#cm-image-lab .cil-muted{font-size:14px;color:var(--muted)}\n#cm-image-lab .cil-small{font-size:13px;color:var(--muted)}\n#cm-image-lab .cil-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}\n#cm-image-lab .cil-options{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0 16px}\n#cm-image-lab .cil-choice{flex:0 0 auto;border:1px solid #CFD8E1;border-radius:8px;background:#fff;color:#31465A;padding:9px 16px;cursor:pointer;font-weight:700;box-shadow:none;line-height:1.3;transition:border-color .15s,background .15s}\n#cm-image-lab .cil-choice:hover{border-color:var(--green);background:#F0F6E7}\n#cm-image-lab .cil-choice[aria-pressed=true]{border-color:var(--green);background:#EEF6DF;color:var(--navy);box-shadow:inset 0 0 0 1px var(--green)}\n#cm-image-lab .cil-field{display:flex;flex-direction:column;gap:5px;min-width:0;margin:0}\n#cm-image-lab .cil-label{font-weight:700;font-size:14px;color:var(--navy)}\n#cm-image-lab .cil-tipbtn{display:inline-flex!important;align-items:center;justify-content:center;width:18px;height:18px;min-height:0!important;margin-left:6px;padding:0!important;border:1.5px solid #B6C2CE!important;border-radius:50%!important;background:#fff!important;color:#5B6B7B!important;-webkit-text-fill-color:#5B6B7B!important;font:700 11px\/1 inherit!important;cursor:pointer;vertical-align:1px;box-shadow:none!important;transition:border-color .15s,color .15s,background .15s}\n#cm-image-lab .cil-tipbtn:hover,#cm-image-lab .cil-tipbtn:focus-visible,#cm-image-lab .cil-tipbtn[aria-expanded=\"true\"]{border-color:var(--blue)!important;background:#EEF4FF!important;color:var(--blue)!important;-webkit-text-fill-color:var(--blue)!important}\n#cm-image-lab .cil-tiptext{display:block;margin:6px 0 4px;padding:8px 10px;border-radius:8px;background:#F4F7FA;font-size:13px;font-weight:400;line-height:1.45;color:var(--text)}\n#cm-image-lab .cil-tiptext[hidden]{display:none}\n#cm-image-lab .cil-stat{position:relative}\n#cm-image-lab .cil-stat-label .cil-tipbtn{flex:0 0 18px;margin-left:0}\n#cm-image-lab .cil-tipwrap{position:relative;display:inline-flex;flex:0 0 auto;vertical-align:middle}\n#cm-image-lab .cil-stat-label .cil-tipbtn{margin-left:0}\n#cm-image-lab .cil-tippop{position:absolute;right:-10px;bottom:calc(100% + 10px);left:auto;top:auto;z-index:6;width:min(280px,80vw);margin:0;background:#fff;border:1px solid var(--line-soft);box-shadow:0 10px 24px rgba(18,32,46,.14)}\n#cm-image-lab .cil-tippop::after{content:\"\";position:absolute;right:12px;bottom:-6px;width:10px;height:10px;background:#fff;border-right:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);transform:rotate(45deg)}\n#cm-image-lab .cil-tip-left .cil-tippop{left:-10px;right:auto}\n#cm-image-lab .cil-tip-left .cil-tippop::after{left:12px;right:auto}\n#cm-image-lab select,#cm-image-lab input[type=number]{border:1px solid #CFD8E1;background:#fff;border-radius:8px;min-height:42px;padding:8px 10px;width:100%;max-width:100%;color:var(--text);margin:0;box-shadow:none}\n#cm-image-lab input[type=url]{border:1px solid #CFD8E1;background:#fff;border-radius:8px;min-height:42px;padding:8px 10px;width:100%;max-width:100%;color:var(--text);margin:0;box-shadow:none}\n#cm-image-lab .cil-urlrow{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;margin:0 0 12px}\n#cm-image-lab .cil-urlfield{flex:1 1 260px}\n#cm-image-lab input[type=range]{width:100%;accent-color:#185ABC;margin:4px 0}\n#cm-image-lab .cil-drop{border:1.5px dashed #B9D97A;border-radius:16px;background:#FAFCF6;padding:40px 24px 30px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:0;margin:14px 0;color:var(--body);cursor:pointer;}\n#cm-image-lab .cil-drop:hover{background:#F6FAEE}\n#cm-image-lab .cil-drop-icon{display:grid;place-items:center;width:48px;height:48px;border-radius:12px;background:#EAF4D6;color:#5E8A14;margin:0 0 14px}\n#cm-image-lab .cil-drop-icon svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-drop-title{display:block;font-size:20px;font-weight:700;color:var(--navy);line-height:1.3;margin:0 0 6px}\n#cm-image-lab .cil-drop-text{display:block;font-size:15px;color:var(--muted);margin:0 0 16px}\n#cm-image-lab .cil-drop-btn{min-height:48px;padding:12px 22px;border-radius:10px;font-size:16px}\n#cm-image-lab .cil-drop-btn svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-drop-hint{display:block;font-size:13px;color:var(--muted);margin:12px 0 0}\n#cm-image-lab .cil-drop[data-drag=\"1\"]{border-color:var(--green);background:#FBFDF8}\n#cm-image-lab .cil-btn{border:0;border-radius:8px;transition:background .18s,color .18s,box-shadow .18s;background:var(--blue);color:#fff!important;padding:11px 18px;min-height:42px;cursor:pointer;font-weight:700;text-decoration:none!important;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-shadow:none;line-height:1.2;}\n#cm-image-lab .cil-btn:hover,#cm-image-lab .cil-btn:focus-visible{background:var(--green)}\n#cm-image-lab .cil-btn:disabled{opacity:.5;cursor:not-allowed}\n#cm-image-lab .cil-btn:disabled:hover{background:var(--blue)}\n#cm-image-lab .cil-btn-primary{background:var(--green);color:#fff!important}\n#cm-image-lab .cil-btn-primary svg,#cm-image-lab .cil-btn-primary svg *{stroke:#fff!important;fill:none!important;color:#fff!important}\n#cm-image-lab .cil-btn-primary:hover{background:var(--blue);color:#fff!important}\n#cm-image-lab .cil-btn-secondary{background:transparent;color:var(--blue)!important;box-shadow:inset 0 0 0 2px var(--blue)}\n#cm-image-lab .cil-btn-secondary:hover,#cm-image-lab .cil-btn-secondary:disabled:hover{background:var(--blue);color:#fff!important}\n#cm-image-lab .cil-btn-secondary:disabled:hover{background:transparent;color:var(--blue)!important}\n#cm-image-lab .cil-btn-text{background:transparent;color:var(--blue)!important;padding:6px 10px;min-height:42px}\n#cm-image-lab .cil-btn-text:hover{background:#EEF4FF}\n#cm-image-lab select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:42px!important;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%231F354D' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'\/%3E%3C\/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 16px center!important;background-size:16px 16px!important}\n#cm-image-lab select::-ms-expand{display:none}\n#cm-image-lab .cil-unitrow select{padding-right:30px!important;background-position:right 10px center!important}\n#cm-image-lab .cil-options{display:grid!important;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;margin:10px 0 16px;max-width:720px}\n#cm-image-lab .cil-choice{display:flex!important;align-items:flex-start;gap:12px;width:100%;text-align:left;padding:14px 16px!important;border:1px solid var(--line)!important;border-radius:10px!important;background:#fff!important;box-shadow:none!important;color:var(--navy)!important;transition:border-color .15s,background .15s}\n#cm-image-lab .cil-choice:hover{border-color:var(--green)!important;background:#FBFDF7!important}\n#cm-image-lab .cil-choice[aria-pressed=true]{border-color:var(--green)!important;background:var(--green-soft)!important;box-shadow:inset 0 0 0 1px var(--green)!important}\n#cm-image-lab .cil-choice-icon{flex:0 0 36px;width:36px;height:36px;border-radius:8px;background:#F1F4F7;display:grid;place-items:center}\n#cm-image-lab .cil-choice-icon svg{width:20px;height:20px;fill:none!important;stroke:#677482!important;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-icon{background:var(--green)}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-icon svg{stroke:#fff!important}\n#cm-image-lab .cil-choice-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}\n#cm-image-lab .cil-choice-name{font-weight:700;font-size:16px;line-height:1.3;color:var(--navy)}\n#cm-image-lab .cil-choice-desc{font-weight:400;font-size:13px;line-height:1.4;color:var(--body)}\n#cm-image-lab .cil-choice-check{flex:0 0 20px;width:20px;height:20px;border-radius:50%;border:1.5px solid #B7C3CF;display:grid;place-items:center;margin-top:2px}\n#cm-image-lab .cil-choice-check svg{width:12px;height:12px;fill:none!important;stroke:#fff!important;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;opacity:0}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-check{background:var(--green);border-color:var(--green)}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-check svg{opacity:1}\n#cm-image-lab .cil-adv{border-top:1px solid var(--line-soft);padding-top:12px;margin:14px 0 4px}\n#cm-image-lab .cil-adv summary{cursor:pointer;font-weight:700;color:var(--blue);font-size:15px;list-style:none;display:inline-flex;align-items:center;gap:6px}\n#cm-image-lab .cil-adv summary::-webkit-details-marker{display:none}\n#cm-image-lab .cil-adv summary::after{content:'';width:8px;height:8px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);margin:-3px 0 0 2px;transition:transform .15s}\n#cm-image-lab .cil-adv[open] summary::after{transform:rotate(-135deg);margin-top:3px}\n#cm-image-lab .cil-adv .cil-small{margin:4px 0 10px}\n#cm-image-lab .cil-adv-body{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}\n#cm-image-lab .cil-range input[type=range]{-webkit-appearance:auto;appearance:auto;width:100%;height:auto!important;min-height:0!important;margin:8px 0 4px!important;padding:0!important;border:0!important;border-radius:0;box-shadow:none!important;background:transparent!important;accent-color:var(--blue);cursor:pointer}\n#cm-image-lab{font-size:16px}\n#cm-image-lab select,#cm-image-lab input[type=number],#cm-image-lab input[type=url]{font-size:15px!important;line-height:1.4!important;min-height:42px}\n#cm-image-lab .cil-btn{font-size:15px!important;line-height:1.3!important}\n#cm-image-lab .cil-card p,#cm-image-lab .cil-card li{font-size:15px}\n#cm-image-lab .cil-small{font-size:13px!important}\n#cm-image-lab .cil-placement-note{grid-column:1\/-1;margin:0}\n#cm-image-lab .cil-check{display:flex;align-items:center;gap:8px;min-height:32px;font-size:14px;cursor:pointer}\n#cm-image-lab .cil-check input{width:16px;height:16px;margin:0;accent-color:#185ABC}\n#cm-image-lab .cil-stack{display:flex;flex-direction:column;gap:16px;min-width:0}\n#cm-image-lab .cil-range input[type=range]{max-width:420px}\n#cm-image-lab .cil-pick img{cursor:crosshair}\n#cm-image-lab .cil-pickbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin:10px 0 0}\n#cm-image-lab .cil-editor{margin:14px 0 4px;padding:16px;border:1px solid #D9E2EA;border-radius:10px;background:#fff;display:flex;flex-direction:column;gap:10px}\n#cm-image-lab .cil-ed-title{font-size:16px;color:#1F354D}\n#cm-image-lab .cil-editor>.cil-small{margin:-6px 0 0}\n#cm-image-lab .cil-ed-bar{display:flex;flex-wrap:wrap;align-items:center;gap:6px}\n#cm-image-lab .cil-ed-btn{min-width:40px;height:36px;padding:0 12px;border:1px solid #D9E2EA;border-radius:8px;background:#fff;color:#1F354D;font:inherit;font-size:14px;font-weight:600;cursor:pointer}\n#cm-image-lab .cil-ed-btn:hover:not(:disabled){border-color:#185ABC;color:#185ABC}\n#cm-image-lab .cil-ed-btn:disabled{opacity:.45;cursor:default}\n#cm-image-lab .cil-ed-zoom{min-width:44px;font-size:13px;color:var(--muted);text-align:center}\n#cm-image-lab .cil-ed-tol{flex:1 1 200px;margin-left:8px}\n#cm-image-lab .cil-ed-tol input[type=range]{max-width:260px}\n#cm-image-lab .cil-ed-view{max-height:520px;overflow:auto;border:1px solid #D9E2EA;border-radius:10px;background:repeating-conic-gradient(#EEF1F4 0 25%,#fff 0 50%) 0 0\/16px 16px;display:flex;min-height:200px}\n#cm-image-lab .cil-ed-canvas{display:block;flex:0 0 auto;margin:auto;cursor:crosshair;image-rendering:pixelated;height:auto}\n#cm-image-lab .cil-ed-foot{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}\n#cm-image-lab .cil-ed-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;min-height:58px}\n#cm-image-lab .cil-ed-modes{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1 1 320px}\n#cm-image-lab .cil-ed-toolbar .cil-ed-bar{margin-left:auto}\n#cm-image-lab .cil-ed-group{display:inline-flex;border:1px solid #D9E2EA;border-radius:8px;overflow:hidden;background:#fff}\n#cm-image-lab .cil-ed-mode{display:inline-flex!important;align-items:center;justify-content:center;width:40px;height:36px;padding:0!important;margin:0!important;border:0!important;border-radius:0!important;background:#fff!important;color:#1F354D!important;cursor:pointer;box-shadow:none!important}\n#cm-image-lab .cil-ed-mode+.cil-ed-mode{border-left:1px solid #D9E2EA!important}\n#cm-image-lab .cil-ed-mode:hover{background:#F3F9FE!important;color:#185ABC!important}\n#cm-image-lab .cil-ed-mode[aria-pressed='true'],#cm-image-lab .cil-ed-mode[aria-pressed='true']:hover,#cm-image-lab .cil-ed-mode[aria-pressed='true']:focus{background:#185ABC!important;color:#fff!important}\n#cm-image-lab .cil-ed-mode svg{display:block;pointer-events:none;fill:none!important;stroke:currentColor!important}\n#cm-image-lab .cil-ed-mode svg *{fill:none!important;stroke:currentColor!important;stroke-width:2!important}\n#cm-image-lab .cil-ed-mode svg,#cm-image-lab .cil-ed-mode svg *{stroke:#1F354D!important;color:#1F354D!important}\n#cm-image-lab .cil-ed-mode:hover svg,#cm-image-lab .cil-ed-mode:hover svg *{stroke:#185ABC!important}\n#cm-image-lab .cil-ed-mode[aria-pressed='true'] svg,#cm-image-lab .cil-ed-mode[aria-pressed='true'] svg *{stroke:#fff!important;color:#fff!important}\n#cm-image-lab .cil-ed-toolname{font-size:14px;font-weight:600;color:#1F354D;margin-right:8px}\n#cm-image-lab .cil-ed-canvas{touch-action:none}\n#cm-image-lab .cil-locked .cil-controls,#cm-image-lab .cil-locked .cil-grid,#cm-image-lab .cil-locked .cil-adv,#cm-image-lab .cil-locked .cil-hint{opacity:.5;pointer-events:none}\n#cm-image-lab .cil-locked .cil-editor .cil-hint{opacity:1;pointer-events:auto}\n#cm-image-lab .cil-lock-note{color:#1F354D}\n#cm-image-lab .cil-actions.cil-actions-split{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:start}\n#cm-image-lab .cil-acts-group{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;min-width:0}\n@media (max-width:700px){#cm-image-lab .cil-actions.cil-actions-split{grid-template-columns:1fr}}\n#cm-image-lab #cil-drop{position:relative}\n#cm-image-lab .cil-drop-ok{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;border-radius:inherit;background:rgba(248,251,239,.97);color:#1F354D;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility 0s linear .2s;pointer-events:none;z-index:2}\n#cm-image-lab .cil-drop-ok.cil-show{opacity:1;visibility:visible;transition:opacity .2s ease}\n#cm-image-lab .cil-drop-okicon{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:#9CCC3D;color:#fff;transform:scale(.8);transition:transform .25s ease}\n#cm-image-lab .cil-drop-ok.cil-show .cil-drop-okicon{transform:scale(1)}\n#cm-image-lab .cil-drop-okicon svg,#cm-image-lab .cil-drop-okicon svg *{fill:none!important;stroke:#fff!important}\n#cm-image-lab .cil-drop-oktext{font-size:20px;font-weight:700}\n#cm-image-lab .cil-drop-oksub{font-size:14px;color:#3D4F61}\n@media (prefers-reduced-motion:reduce){#cm-image-lab .cil-drop-ok,#cm-image-lab .cil-drop-okicon{transition:none}}\n#cm-image-lab .cil-clear-bottom{margin-left:auto}\n\/* no lingering focus look after a mouse click; keyboard focus still shows via :focus-visible *\/\n#cm-image-lab button:focus:not(:focus-visible),#cm-image-lab summary:focus:not(:focus-visible),#cm-image-lab select:focus:not(:focus-visible){outline:none!important;box-shadow:none!important}\n#cm-image-lab .cil-btn-text:focus:not(:focus-visible),#cm-image-lab .cil-btn-text:active{background:transparent!important;border-color:transparent!important}\n#cm-image-lab .cil-btn-secondary:focus:not(:focus-visible),#cm-image-lab .cil-btn-secondary:active{background:transparent!important;color:var(--blue)!important;box-shadow:inset 0 0 0 2px var(--blue)!important}\n#cm-image-lab .cil-btn:not(.cil-btn-secondary):not(.cil-btn-text):focus:not(:focus-visible){background:#185ABC!important;color:#fff!important}\n#cm-image-lab .cil-help{display:block;margin-top:5px;font-size:13px;line-height:1.45;color:var(--muted)}\n#cm-image-lab button:focus-visible,#cm-image-lab select:focus-visible,#cm-image-lab input:focus-visible,#cm-image-lab a:focus-visible{outline:2px solid var(--blue);outline-offset:2px}\n#cm-image-lab .cil-summary{border:0;border-radius:14px;background:var(--soft);padding:18px;margin:18px 0 22px}\n#cm-image-lab .cil-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:10px}\n#cm-image-lab .cil-stat{background:#fff;border:1px solid var(--line-soft);border-radius:12px;padding:14px 16px;min-width:0}\n#cm-image-lab .cil-stat-label{display:flex;align-items:flex-start;justify-content:space-between;gap:6px;font-size:13px;font-weight:700;color:var(--muted)}\n#cm-image-lab .cil-summary .cil-stat-value{display:block;font-size:26px;line-height:1.2;margin:4px 0 2px;color:var(--navy)}\n#cm-image-lab .cil-stat-sub{display:block;font-size:13px;color:var(--muted);line-height:1.4}\n#cm-image-lab .cil-stat-good .cil-stat-value{color:#4E7A0E}\n#cm-image-lab .cil-stat-warn .cil-stat-value{color:#8A6D00}\n#cm-image-lab .cil-stat-good{border-color:rgba(156,204,61,.45);background:#F8FBEF}\n#cm-image-lab .cil-stat-warn{border-color:rgba(230,214,60,.6);background:#FCFCE8}\n#cm-image-lab .cil-stat-alert{border-color:rgba(232,137,43,.5);background:#FFF4E8}\n#cm-image-lab .cil-stat-alert .cil-stat-value{color:#B5590C}\n#cm-image-lab .cil-summary .cil-small{display:block;font-size:13px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--navy)}\n\n#cm-image-lab .cil-summary p{margin:4px 0 0;color:var(--body)}\n#cm-image-lab .cil-file{border:1px solid var(--line);border-radius:14px;padding:22px 24px;margin:16px 0;min-width:0;background:#fff}\n#cm-image-lab .cil-filetop{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n#cm-image-lab .cil-filename{margin:0;font-size:17px;font-weight:700;color:var(--navy);overflow-wrap:anywhere;min-width:0}\n#cm-image-lab .cil-metrics{display:flex;flex-wrap:wrap;gap:10px;margin:12px 0}\n#cm-image-lab .cil-metric{padding:10px 14px;background:var(--soft);border:0;border-radius:10px;min-width:120px;flex:1}\n#cm-image-lab .cil-metric .cil-small{display:block}\n#cm-image-lab .cil-metric b{display:block;color:var(--navy)}\n#cm-image-lab .cil-hint{display:flex;gap:12px;align-items:flex-start;padding:11px 15px;border:1px solid rgba(24,90,188,.18);border-radius:12px;background:#F6FAFF;color:var(--text);font-size:15px;line-height:1.5;margin:10px 0}\n#cm-image-lab .cil-warn{border-color:rgba(230,214,60,.6);background:#FCFCE8}\n#cm-image-lab .cil-success{border-color:rgba(156,204,61,.45);background:#F8FBEF}\n#cm-image-lab .cil-success .cmac-info-icon{background:#7FAF2A}\n#cm-image-lab .cil-alert{border-color:rgba(232,137,43,.5);background:#FFF4E8}\n#cm-image-lab .cil-alert .cmac-info-icon{background:#E8892B}\n#cm-image-lab .cil-neutral{border-color:#E3E9EF;background:#F7F9FB}\n#cm-image-lab .cil-hint.cil-success .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#7FAF2A!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-success .cmac-info-icon::before{content:\"\";display:block;width:19px;height:19px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m16%209-5.5%205.5L8%2012%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m16%209-5.5%205.5L8%2012%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-warn .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#D9B800!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-warn .cmac-info-icon::before{content:\"\";display:block;width:19px;height:19px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712%27%20y1%3D%278%27%20y2%3D%2712%27%2F%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712.01%27%20y1%3D%2716%27%20y2%3D%2716%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712%27%20y1%3D%278%27%20y2%3D%2712%27%2F%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712.01%27%20y1%3D%2716%27%20y2%3D%2716%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-alert .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#E8892B!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-alert .cmac-info-icon::before{content:\"\";display:block;width:16px;height:16px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m21.73%2018-8-14a2%202%200%200%200-3.48%200l-8%2014A2%202%200%200%200%204%2021h16a2%202%200%200%200%201.73-3%27%2F%3E%3Cpath%20d%3D%27M12%209v4%27%2F%3E%3Cpath%20d%3D%27M12%2017h.01%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m21.73%2018-8-14a2%202%200%200%200-3.48%200l-8%2014A2%202%200%200%200%204%2021h16a2%202%200%200%200%201.73-3%27%2F%3E%3Cpath%20d%3D%27M12%209v4%27%2F%3E%3Cpath%20d%3D%27M12%2017h.01%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-error .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#B84040!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-error .cmac-info-icon::before{content:\"\";display:block;width:19px;height:19px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m15%209-6%206%27%2F%3E%3Cpath%20d%3D%27m9%209%206%206%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m15%209-6%206%27%2F%3E%3Cpath%20d%3D%27m9%209%206%206%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-neutral .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#8A97A5!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-neutral .cmac-info-icon::before{content:\"\";display:block;width:16px;height:16px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M21.3%2015.3a2.4%202.4%200%200%201%200%203.4l-2.6%202.6a2.4%202.4%200%200%201-3.4%200L2.7%208.7a2.41%202.41%200%200%201%200-3.4l2.6-2.6a2.41%202.41%200%200%201%203.4%200Z%27%2F%3E%3Cpath%20d%3D%27m14.5%2012.5%202-2%27%2F%3E%3Cpath%20d%3D%27m11.5%209.5%202-2%27%2F%3E%3Cpath%20d%3D%27m8.5%206.5%202-2%27%2F%3E%3Cpath%20d%3D%27m17.5%2015.5%202-2%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M21.3%2015.3a2.4%202.4%200%200%201%200%203.4l-2.6%202.6a2.4%202.4%200%200%201-3.4%200L2.7%208.7a2.41%202.41%200%200%201%200-3.4l2.6-2.6a2.41%202.41%200%200%201%203.4%200Z%27%2F%3E%3Cpath%20d%3D%27m14.5%2012.5%202-2%27%2F%3E%3Cpath%20d%3D%27m11.5%209.5%202-2%27%2F%3E%3Cpath%20d%3D%27m8.5%206.5%202-2%27%2F%3E%3Cpath%20d%3D%27m17.5%2015.5%202-2%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-warn .cmac-info-icon{background:#D9B800}\n#cm-image-lab .cil-error{border-color:rgba(184,64,64,.32);background:var(--cmac-alert-soft,#FFF0F0)}\n#cm-image-lab .cil-success{border-color:rgba(156,204,61,.42);background:var(--green-soft)}\n#cm-image-lab .cil-controls{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}\n#cm-image-lab .cil-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:14px}\n#cm-image-lab .cil-guide{position:relative;display:block;overflow:hidden;margin:20px 0;padding:18px 18px 18px 22px;border:1px solid rgba(156,204,61,.32);border-radius:14px;background:linear-gradient(135deg,rgba(156,204,61,.14) 0%,rgba(255,255,255,.98) 58%,rgba(240,247,224,.8) 100%);box-shadow:0 8px 20px rgba(18,32,46,.06);text-decoration:none!important;color:#12202E;}\n#cm-image-lab .cil-guide::before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:5px;background:var(--green)}\n#cm-image-lab .cil-guide:hover{border-color:var(--green);box-shadow:0 14px 30px rgba(18,32,46,.13)}\n#cm-image-lab .cil-guide:focus-visible{outline:2px solid var(--blue);outline-offset:3px}\n#cm-image-lab .cil-badge{display:inline-flex;margin-bottom:11px;padding:4px 10px;border-radius:999px;background:var(--green);color:#fff;font-size:13px;font-weight:700;line-height:1.2;letter-spacing:.04em;text-transform:uppercase}\n#cm-image-lab .cil-guide-title{display:block;margin-bottom:5px;font-size:20px;font-weight:700;line-height:1.3;color:#12202E}\n#cm-image-lab .cil-guide-desc{display:block;margin-bottom:13px;color:#677482;font-size:16px;line-height:1.5}\n#cm-image-lab .cil-guide-cta{display:inline-flex;align-items:center;gap:.35em;color:var(--blue);font-size:15px;font-weight:700;}\n#cm-image-lab .cil-guide:hover .cil-guide-cta{color:var(--green)}\n#cm-image-lab .cil-hide{display:none!important}\n#cm-image-lab a{color:var(--blue)}\n#cm-image-lab .cil-unitrow{display:flex;gap:8px}\n#cm-image-lab .cil-unitrow input{flex:1 1 auto;min-width:0}\n#cm-image-lab .cil-unitrow select{flex:0 0 76px;width:76px}\n#cm-image-lab .cil-file .cil-grid{margin:12px 0;grid-template-columns:repeat(3,minmax(0,1fr))}\n@media (max-width:700px){#cm-image-lab .cil-file .cil-grid{grid-template-columns:1fr}}\n#cm-image-lab .cil-note{display:flex;gap:14px;align-items:flex-start;border-color:rgba(24,90,188,.18);background:#F6FAFF;box-shadow:none;margin:0 0 20px}\n#cm-image-lab .cmac-info-body{min-width:0;flex:1}\n#cm-image-lab .cmac-info-icon{display:none}\n#cm-image-lab[data-icons=\"1\"] .cmac-info-icon{display:block}\n#cm-image-lab[data-icons=\"1\"] .cil-hint .cmac-info-icon{flex:0 0 26px;width:26px;height:26px}\n#cm-image-lab .cil-error .cmac-info-icon{background:var(--cmac-alert,#B84040)}\n#cm-image-lab .cil-note .cmac-info-icon{margin-top:2px}\n#cm-image-lab .cil-note .cil-title{font-size:19px}\n#cm-image-lab .cil-list{margin:0 0 12px;padding-left:22px}\n#cm-image-lab .cil-list li{margin:6px 0;line-height:1.55}\n#cm-image-lab .cil-compare{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:6px}\n#cm-image-lab .cil-pane{margin:0;min-width:0}\n#cm-image-lab .cil-view{height:240px;overflow:auto;border:1px solid var(--line);border-radius:10px;background:repeating-conic-gradient(#EEF1F4 0 25%,#fff 0 50%) 0 0\/16px 16px;display:flex;align-items:center;justify-content:center;padding:0}\n#cm-image-lab .cil-view img{display:block;max-width:100%;max-height:100%;width:auto;height:auto;margin:0;border-radius:0}\n#cm-image-lab .cil-view[data-actual=\"1\"]{display:block}\n#cm-image-lab .cil-view[data-actual=\"1\"] img{max-width:none;max-height:none}\n#cm-image-lab .cil-pane figcaption{font-size:13px;color:var(--muted);margin-top:5px}\n#cm-image-lab .cil-eyebrow{display:block;font-size:13px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#5E8A14;margin:0 0 6px}\n#cm-image-lab .cil-basics{margin:16px 0 0;border:1px solid var(--line);border-radius:10px;background:#fff}\n#cm-image-lab .cil-basics summary{cursor:pointer;padding:12px 16px;font-weight:700;color:var(--navy);list-style:none;display:flex;align-items:center;gap:10px}\n#cm-image-lab .cil-basics summary::-webkit-details-marker{display:none}\n#cm-image-lab .cil-basics summary::before{content:'';flex:0 0 22px;width:22px;height:22px;border-radius:50%;background-color:var(--green);background-image:linear-gradient(#fff,#fff),linear-gradient(#fff,#fff);background-size:10px 2px,2px 10px;background-position:center;background-repeat:no-repeat}\n#cm-image-lab .cil-basics[open] summary::before{background-size:10px 2px,0 0}\n#cm-image-lab .cil-basics-body{padding:0 16px 14px 48px;color:var(--body);font-size:15px}\n#cm-image-lab .cil-basics-body p{margin:0 0 10px}\n#cm-image-lab .cil-added{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;margin:10px 0 0;padding:12px 16px;border:1px solid var(--green);border-radius:10px;background:var(--green-soft);color:var(--navy);font-size:15px;font-weight:600}\n#cm-image-lab .cil-added::before{content:'\u2713';display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--green);color:#fff;font-weight:800;font-size:13px}\n#cm-image-lab .cil-added .cil-btn-text{padding:0;font-size:15px}\n#cm-image-lab .cil-thumbs{display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px;margin:12px 0 0;padding:12px 16px;border:1px solid var(--green);border-radius:10px;background:var(--green-soft)}\n#cm-image-lab .cil-thumbrow{display:flex;flex-wrap:wrap;gap:8px}\n#cm-image-lab .cil-thumb{display:grid;place-items:center;width:56px;height:56px;border-radius:8px;overflow:hidden;background:#fff;border:1px solid var(--line);font-weight:700;color:var(--navy);font-size:14px}\n#cm-image-lab .cil-thumb img{width:100%;height:100%;object-fit:cover;display:block}\n#cm-image-lab .cil-thumbtext{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 220px;color:var(--body);font-size:14px}\n#cm-image-lab .cil-thumbtext strong{color:var(--navy);font-size:15px}\n#cm-image-lab .cil-thumbtext .cil-btn-text{align-self:flex-start;padding:2px 0 0;font-size:14px}\n#cm-image-lab .cil-intro{border:0;box-shadow:none;background:transparent;padding:0;margin:0 0 28px}\n#cm-image-lab .cil-hero{font-size:32px;line-height:1.15;margin:0 0 10px}\n\n\n\n\n#cm-image-lab #cil-guide{border:0;background:transparent;padding:0;color:var(--muted);font-size:15px;margin:0 0 18px}\n#cm-image-lab #cil-guide .cmac-info-icon{display:none!important}\n#cm-image-lab .cil-drop{border:2px dashed #B9D97A;background:linear-gradient(180deg,#FAFCF5 0%,#F3F8E8 100%);padding:52px 24px 40px;border-radius:18px}\n#cm-image-lab .cil-drop:hover{background:linear-gradient(180deg,#F7FBEF 0%,#EEF6DF 100%);border-color:var(--green)}\n#cm-image-lab .cil-drop-icon{width:64px;height:64px;border-radius:18px;background:#fff;box-shadow:0 2px 10px rgba(94,138,20,.15);margin-bottom:18px}\n#cm-image-lab .cil-drop-icon svg{width:30px;height:30px}\n#cm-image-lab .cil-drop-title{font-size:24px}\n#cm-image-lab .cil-privacy{display:flex;align-items:center;gap:10px;margin:16px 0 0;padding:10px 14px;background:var(--soft);border-radius:10px}\n#cm-image-lab .cil-lock{flex:0 0 28px;display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:#fff;color:var(--navy)}\n#cm-image-lab .cil-lock svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-filename{font-size:18px}\n@media(max-width:760px){#cm-image-lab .cil-stats{grid-template-columns:repeat(2,minmax(0,1fr))}}\n@media(max-width:640px){#cm-image-lab .cil-card{padding:20px}#cm-image-lab .cil-file{padding:16px}#cm-image-lab .cil-grid,#cm-image-lab .cil-controls,#cm-image-lab .cil-compare{grid-template-columns:1fr}#cm-image-lab .cil-metric{min-width:100px}}\n\n#cm-image-lab #cil-status:empty{display:none}\n#cm-image-lab #cil-status .cil-hint{margin:12px 0 0}\n<\/style>\n\n<script data-wp-block-html=\"js\">\n\/* CM Academy image checker v8 (SV), JavaScript tab. The code is encoded so WordPress cannot alter characters in it. *\/\n(function(){try{var c=decodeURIComponent(escape(atob(\"KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2lsU3RhcnQoKXsKKGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOwp2YXIgcm9vdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20taW1hZ2UtbGFiJyk7aWYoIXJvb3R8fHJvb3QuZGF0YXNldC5yZWFkeSlyZXR1cm47cm9vdC5kYXRhc2V0LnJlYWR5PScxJzsKdHJ5e2lmKGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWNtYWMtYWNjZW50JykudHJpbSgpKXJvb3QuZGF0YXNldC5pY29ucz0nMSd9Y2F0Y2goZSl7fQpjb25zdCAkPWlkPT5yb290LnF1ZXJ5U2VsZWN0b3IoJyMnK2lkKTsKY29uc3QgS0I9MTAyNCxNQj1LQipLQixNQVhfUElYRUxTPTE2Nzc3MjE2LE1BWF9TSURFPTE2Mzg0LE1BWF9JTlBVVF9XSURUSD0xMjAwMCxNQVhfWklQX0ZJTEVTPTUwMCxNQVhfU1ZHX0JZVEVTPTEwKk1CLE1BWF9HSUZfU0NBTj02NCpNQixSRUFEX0NPTkNVUlJFTkNZPTM7CmNvbnN0IFdFQlNJVEU9e2hlYWRlcjp7YTpbMjU2MCw3NjgsNTY4XSxiOlsxMDI0LDc2OCw1NjhdLGM6WzMwMCw3NjgsNTY4XX0sYmFja2dyb3VuZDp7YTpbMjU2MCw3NjgsNTY4XSxiOlsxMDI0LDc2OCw1NjhdLGM6WzIyNDAsNzY4LDU2OF19LGNvbHVtbnM6e2E6WzExNDAsNTQ2LDM0OF0sYjpbMTAyNCw0MzgsMjc2XSxjOlsxMTQwLDU0NiwzNDhdfSxzZWN0aW9uOnthOlsxMTQwXSxiOlsxMDI0XSxjOlsxMTQwXX19Owpjb25zdCBFTUFJTD17JzEnOjYwMCwnMic6MzAwLCczJzoyMDB9Owpjb25zdCBUWVBFUz17J2ltYWdlL2pwZWcnOlsnSlBHJywnanBnJ10sJ2ltYWdlL3BuZyc6WydQTkcnLCdwbmcnXSwnaW1hZ2UvZ2lmJzpbJ0dJRicsJ2dpZiddLCdpbWFnZS9ibXAnOlsnQk1QJywnYm1wJ10sJ2ltYWdlL3dlYnAnOlsnV2ViUCcsJ3dlYnAnXSwnaW1hZ2Uvc3ZnK3htbCc6WydTVkcnLCdzdmcnXSwnaW1hZ2UvYXZpZic6WydBVklGJywnYXZpZiddLCdpbWFnZS9oZWljJzpbJ0hFSUMnLCdoZWljJ10sJ2ltYWdlL3RpZmYnOlsnVElGRicsJ3RpZiddLCdpbWFnZS94LWljb24nOlsnSUNPJywnaWNvJ119Owpjb25zdCBFWFRfVFlQRT17anBnOidpbWFnZS9qcGVnJyxqcGVnOidpbWFnZS9qcGVnJyxqcGU6J2ltYWdlL2pwZWcnLGpmaWY6J2ltYWdlL2pwZWcnLHBuZzonaW1hZ2UvcG5nJyxnaWY6J2ltYWdlL2dpZicsYm1wOidpbWFnZS9ibXAnLGRpYjonaW1hZ2UvYm1wJyx3ZWJwOidpbWFnZS93ZWJwJyxzdmc6J2ltYWdlL3N2Zyt4bWwnLGF2aWY6J2ltYWdlL2F2aWYnLGhlaWM6J2ltYWdlL2hlaWMnLGhlaWY6J2ltYWdlL2hlaWMnLHRpZjonaW1hZ2UvdGlmZicsdGlmZjonaW1hZ2UvdGlmZicsaWNvOidpbWFnZS94LWljb24nfTsKY29uc3QgQ01fQUNDRVBURUQ9WydpbWFnZS9qcGVnJywnaW1hZ2UvcG5nJywnaW1hZ2UvZ2lmJywnaW1hZ2UvYm1wJ107CmNvbnN0IEFMUEhBX1RZUEVTPVsnaW1hZ2UvcG5nJywnaW1hZ2UvZ2lmJywnaW1hZ2Uvd2VicCcsJ2ltYWdlL3N2Zyt4bWwnLCdpbWFnZS9ibXAnLCdpbWFnZS9hdmlmJywnaW1hZ2UvdGlmZicsJ2ltYWdlL3gtaWNvbiddOwpsZXQgYXJlYT0nd2Vic2l0ZScsaXRlbXM9W10sc2VyaWFsPTEsemlwQnVzeT1mYWxzZSxvcHRCdXN5PWZhbHNlO2NvbnN0IHF1ZXVlPVtdO2xldCBhY3RpdmU9MDsKY29uc3QgZm10PW49PihuPEtCP24rJyBCJzpuPE1CPyhuL0tCKS50b0ZpeGVkKG48MTAqS0I\/MTowKSsnIEtCJzoobi9NQikudG9GaXhlZCgyKSsnIE1CJykucmVwbGFjZSgnLicsJywnKTsKY29uc3QgZXh0T2Y9bmFtZT0+e2NvbnN0IG09L1wuKFteLlwvXFxdKykkLy5leGVjKG5hbWV8fCcnKTtyZXR1cm4gbT9tWzFdLnRvTG93ZXJDYXNlKCk6Jyd9Owpjb25zdCB0eXBlTGFiZWw9dD0+VFlQRVNbdF0\/VFlQRVNbdF1bMF06J3Vua25vd24nOwpjb25zdCBhbGl2ZT1pdGVtPT5pdGVtcy5pbmRleE9mKGl0ZW0pPi0xOwpmdW5jdGlvbiBzdGF0dXMobXNnLHRvbmUpe2NvbnN0IHN0PSQoJ2NpbC1zdGF0dXMnKTtzdC5jbGFzc0xpc3QucmVtb3ZlKCdjaWwtYWRkZWQnKTtzdC50ZXh0Q29udGVudD0nJztpZighbXNnKXJldHVybjtpZih0b25lKWhpbnQoc3QsbXNnLHRvbmUpO2Vsc2Ugc3QudGV4dENvbnRlbnQ9bXNnfQpmdW5jdGlvbiBnb1Jlc3VsdHMoKXtjb25zdCByPSQoJ2NpbC1yZXN1bHRzJyk7aWYoIXIpcmV0dXJuO2NvbnN0IHk9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LTkwO3dpbmRvdy5zY3JvbGxUbyh7dG9wOk1hdGgubWF4KDAseSksYmVoYXZpb3I6J3Ntb290aCd9KX0KZnVuY3Rpb24gdGh1bWJzKCl7Y29uc3QgYm94PSQoJ2NpbC10aHVtYnMnKTtpZighYm94KXJldHVybjtib3gudGV4dENvbnRlbnQ9Jyc7Ym94LmNsYXNzTGlzdC50b2dnbGUoJ2NpbC1oaWRlJywhaXRlbXMubGVuZ3RoKTtpZighaXRlbXMubGVuZ3RoKXJldHVybjsKIGNvbnN0IHJvdz1lbCgnZGl2JywnY2lsLXRodW1icm93Jyk7aXRlbXMuc2xpY2UoMCw4KS5mb3JFYWNoKGl0ZW09Pntjb25zdCBmPWVsKCdzcGFuJywnY2lsLXRodW1iJyk7aWYoaXRlbS51cmxPbmx5fHxpdGVtLmZpbGUgaW5zdGFuY2VvZiBCbG9iKXtjb25zdCBpbT1lbCgnaW1nJyk7aW0uYWx0PScnO2ltLm9uZXJyb3I9KCk9PntpZihpbS5kYXRhc2V0LmZifHxpdGVtLnVybE9ubHkpcmV0dXJuO2ltLmRhdGFzZXQuZmI9JzEnO2NvbnN0IHI9bmV3IEZpbGVSZWFkZXIoKTtyLm9ubG9hZD0oKT0+e2ltLnNyYz1yLnJlc3VsdH07ci5yZWFkQXNEYXRhVVJMKGl0ZW0uZmlsZSl9O2ltLnNyYz1pdGVtLnVybE9ubHk\/aXRlbS5zcmNVcmw6b2JqVXJsKGl0ZW0sJ29yaWcnLGl0ZW0uZmlsZSk7Zi5hcHBlbmQoaW0pfWYudGl0bGU9aXRlbS5maWxlLm5hbWV8fCcnO3Jvdy5hcHBlbmQoZil9KTtpZihpdGVtcy5sZW5ndGg+OClyb3cuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXRodW1iIGNpbC10aHVtYi1tb3JlJywnKycrKGl0ZW1zLmxlbmd0aC04KSkpOwogY29uc3Qgbj1pdGVtcy5sZW5ndGgsdHh0PWVsKCdkaXYnLCdjaWwtdGh1bWJ0ZXh0Jyk7dHh0LmFwcGVuZChlbCgnc3Ryb25nJyxudWxsLG49PT0xPycxIGJpbGQgdGlsbGFnZCc6bisnIGJpbGRlciB0aWxsYWdkYScpLGVsKCdzcGFuJyxudWxsLCdTY3JvbGxhIG5lciBmw7ZyIGF0dCBzZSBzdG9ybGVrIG9jaCBtw6V0dCBmw7ZyIHZhcmplIGJpbGQsIG9jaCBvcHRpbWVyYSBkZW0gdmlkIGJlaG92LicpKTtib3guYXBwZW5kKHJvdyx0eHQpfQpmdW5jdGlvbiBzaG93QWRkZWQobil7Y29uc3Qgc3Q9JCgnY2lsLXN0YXR1cycpO3N0LnRleHRDb250ZW50PScnO3N0LmNsYXNzTGlzdC5hZGQoJ2NpbC1hZGRlZCcpO2NvbnN0IHQ9ZWwoJ3NwYW4nLG51bGwsKG49PT0xPycxIGJpbGQgdGlsbGFnZC4nOm4rJyBiaWxkZXIgdGlsbGFnZGEuJykrJyBWw6RsaiBpbnN0w6RsbG5pbmdhciBvY2ggb3B0aW1lcmEgbmVkYW4uJyk7Y29uc3QgYj1idXR0b24oJ0fDpSB0aWxsIGRpbmEgYmlsZGVyJyxnb1Jlc3VsdHMsJ2NpbC1idG4tdGV4dCcpO3N0LmFwcGVuZCh0LGIpfQovKiBVc2FnZSB0cmFja2luZyB2aWEgQ00gQWNhZGVteSBDb21wYW5pb246IG9uZSBldmVudCBwZXIgYWN0aW9uIHBlciBwYWdlIHZpZXcuIE9ubHkgdGhlIGFjdGlvbiBhbmQgV2Vic2l0ZS9FbWFpbCBhcmUgc2VudCwgbmV2ZXIgZmlsZSBuYW1lcywgc2l6ZXMgb3IgaW1hZ2VzLiBEb2VzIG5vdGhpbmcgaWYgdHJhY2tpbmcgaXMgb2ZmLiAqLwpjb25zdCB0cmFja2VkPXt9OwpmdW5jdGlvbiB0cmFjayhhY3Rpb24pe2NvbnN0IGtleT0naW1hZ2VfY2hlY2tlcl8nK2FjdGlvbisnXycrYXJlYTtpZih0cmFja2VkW2tleV0pcmV0dXJuO3RyYWNrZWRba2V5XT0xO3RyeXtjb25zdCBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO2IudHlwZT0nYnV0dG9uJztiLmhpZGRlbj10cnVlO2Iuc2V0QXR0cmlidXRlKCdkYXRhLWNtLXRyYWNrJywnY21fYnV0dG9uX2NsaWNrJyk7Yi5zZXRBdHRyaWJ1dGUoJ2RhdGEtY20ta2V5JyxrZXkpO2IudGV4dENvbnRlbnQ9J0ltYWdlIGNoZWNrZXI6ICcrYWN0aW9uKycgKCcrYXJlYSsnKSc7ZG9jdW1lbnQuYm9keS5hcHBlbmQoYik7Yi5jbGljaygpO2IucmVtb3ZlKCl9Y2F0Y2goZSl7fX0KLyogLS0tLS0tLS0tLSBzZXR0aW5ncyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIHdlYnNpdGVSZWMoaXRlbSl7Y29uc3QgcD1pdGVtLndQbGFjZW1lbnQ7aWYocD09PSdjdXN0b20nKXJldHVybiBpdGVtLnNpdGVXaWR0aFVuaXQ9PT0nJSc\/KGl0ZW0uc2l0ZVdpZHRoJiZpdGVtLnNpdGVCYXNlP01hdGgucm91bmQoaXRlbS5zaXRlQmFzZSppdGVtLnNpdGVXaWR0aC8xMDApOjApOml0ZW0uc2l0ZVdpZHRofHwwO3JldHVybiBXRUJTSVRFW3BdP1dFQlNJVEVbcF1baXRlbS53VGhlbWVdW3A9PT0nc2VjdGlvbic\/MDooTnVtYmVyKGl0ZW0ud1ZhcmlhbnQpfHwwKV06MH0KZnVuY3Rpb24gc3VnZ2VzdGVkKGl0ZW0pe3JldHVybiBhcmVhPT09J3dlYnNpdGUnP3dlYnNpdGVSZWMoaXRlbSk6aXRlbS5sYXlvdXQ9PT0nY3VzdG9tJz8oaXRlbS5sYXlvdXRXaWR0aFVuaXQ9PT0nJSc\/KGl0ZW0ubGF5b3V0V2lkdGg\/TWF0aC5yb3VuZCg2MDAqaXRlbS5sYXlvdXRXaWR0aC8xMDApOjApOml0ZW0ubGF5b3V0V2lkdGh8fDApOkVNQUlMW2l0ZW0ubGF5b3V0XXx8NjAwfQpmdW5jdGlvbiB0b29OYXJyb3coaXRlbSl7Y29uc3Qgcj1zdWdnZXN0ZWQoaXRlbSk7cmV0dXJuICEhciYmaXRlbS50eXBlIT09J2ltYWdlL3N2Zyt4bWwnJiZpdGVtLndpZHRoPjAmJml0ZW0ud2lkdGg8ciowLjc1fQpmdW5jdGlvbiBlbWFpbFZlcmRpY3Qobil7cmV0dXJuIG48NTAwKktCPydVdG3DpHJrdC4nOm48PU1CPydCcmEuJzpuPD0yKk1CPyfDlnZlcnbDpGcgYXR0IG9wdGltZXJhLiBTaWt0YSBww6UgdW5kZXIgMSBNQiB0b3RhbHQuJzonT3B0aW1lcmluZyByZWtvbW1lbmRlcmFzLiBTdG9yYSBlLXBvc3RtZWRkZWxhbmRlbiBrYW4gdGEgbMOkbmdyZSB0aWQgYXR0IHNraWNrYSwgb2NoIHZpc3NhIGlua29yZ2FyIGthbiBhdnZpc2EgZGVtLiBTaWt0YSBww6UgdW5kZXIgMSBNQiBvY2ggaMO2Z3N0IDIgTUIuJ30KZnVuY3Rpb24gaXNDb2x1bW4oaXRlbSl7cmV0dXJuIGFyZWE9PT0nd2Vic2l0ZScmJihpdGVtLndQbGFjZW1lbnQ9PT0nY29sdW1ucyd8fGl0ZW0ud1BsYWNlbWVudD09PSdzZWN0aW9uJyl9CmZ1bmN0aW9uIGlzRXhhY3QoaXRlbSl7cmV0dXJuIGFyZWE9PT0nd2Vic2l0ZScmJihpdGVtLndQbGFjZW1lbnQ9PT0nYmFja2dyb3VuZCd8fGl0ZW0ud1BsYWNlbWVudD09PSdoZWFkZXInKX0KZnVuY3Rpb24gbGV2ZWwoaSl7aWYoaS5sb2FkaW5nKXJldHVybiAtMTtjb25zdCBSPWkucmVzdWx0JiYhaS5yZXN1bHQua2VwdE9yaWdpbmFsP2kucmVzdWx0Om51bGw7aWYoUiYmaS50eXBlIT09J2ltYWdlL3N2Zyt4bWwnJiZpLndpZHRoPFIud2lkdGgqMC45KXJldHVybiAzO2lmKGkuZXJyb3J8fCghUiYmKGkubWlzbWF0Y2h8fChpLnR5cGUmJiFDTV9BQ0NFUFRFRC5pbmNsdWRlcyhpLnR5cGUpKSkpKXJldHVybiAzO2NvbnN0IHI9c3VnZ2VzdGVkKGkpLHN2Zz0hUiYmaS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnLFc9Uj9SLndpZHRoOmkud2lkdGgsU1o9Uj9SLmJsb2Iuc2l6ZTppLmZpbGUuc2l6ZTtsZXQgbHY9MDtpZihyJiZXPjAmJiFzdmcpe2lmKGlzRXhhY3QoaSkpbHY9Vz09PXI\/MDozO2Vsc2UgaWYoaXNDb2x1bW4oaSkpbHY9TWF0aC5hYnMoVy1yKTw9NT8wOjI7ZWxzZSBpZihXPHJ8fFc+cioyKWx2PTJ9aWYoU1o+TUIpbHY9MztlbHNlIGlmKFNaPjUwMCpLQilsdj1NYXRoLm1heChsdiwyKTtyZXR1cm4gbHZ9CmZ1bmN0aW9uIGlzQ3VzdG9tV2lkdGgoaXRlbSl7cmV0dXJuIGFyZWE9PT0nd2Vic2l0ZSc\/aXRlbS53UGxhY2VtZW50PT09J2N1c3RvbSc6aXRlbS5sYXlvdXQ9PT0nY3VzdG9tJ30KZnVuY3Rpb24gdXBkYXRlR3VpZGUoKXskKCdjaWwtZ3VpZGUnKS50ZXh0Q29udGVudD1hcmVhPT09J2VtYWlsJz8nTMOkZ2cgdGlsbCBhbGxhIGJpbGRlciBzb20gZHUgdMOkbmtlciBhbnbDpG5kYSBpIGRpdHQgZS1wb3N0bWVkZGVsYW5kZS4gVsOkbGogZW4ga29sdW1ubGF5b3V0IGVsbGVyIGFuZ2UgZW4gZWdlbiBicmVkZCBmw7ZyIHZhcmplIGJpbGQuIFJla29tbWVuZGVyYWRlIGJyZWRkZXI6IGVuIGtvbHVtbiA2MDAgcHgsIHR2w6Uga29sdW1uZXIgMzAwIHB4LCB0cmUga29sdW1uZXIgMjAwIHB4IChzdGFuZGFyZG1lZGRlbGFuZGUgcMOlIDYwMCBweCkuIERldCDDpHIgcmlrdGxpbmplciwgaW50ZSBncsOkbnNlciBmw7ZyIHVwcGxhZGRuaW5nLiBEZW4gc2FtbWFubGFnZGEgZmlsc3Rvcmxla2VuIGbDtnIgYWxsYSBiaWxkZXIsIMOkdmVuIGJpbGRlciBmcsOlbiBlbiBVUkwsIHZpc2FzIG5lZGFuLic6J0zDpGdnIHRpbGwgZW4gZWxsZXIgZmxlcmEgYmlsZGVyLiBWw6RsaiBwbGFjZXJpbmcgb2NoIHRlbWEgZsO2ciB2YXJqZSBiaWxkLiBCYWtncnVuZHNiaWxkZXIgaSBoZWFkZXJzIG9jaCBzZWt0aW9uZXIgYmVow7Z2ZXIgZXhha3QgZGVuIGJyZWRkIHNvbSB2aXNhcy4gQmlsZGVyIGkga29sdW1uZXIgbGluamVyYXIgYsOkc3QgbWVkIGRlbiByZWtvbW1lbmRlcmFkZSBicmVkZGVuLCBzb20gYnlnZ2VyIHDDpSBzdGFuZGFyZGJyZWRkZXJuYSBmw7ZyIGtvbHVtbmVyLiBPbSBkdSBoYXIgw6RuZHJhdCBrb2x1bW5icmVkZGVybmEsIHbDpGxqIEVnZW4gYnJlZGQgaSBzdMOkbGxldC4nfQpmdW5jdGlvbiBzZXR0aW5nc0NoYW5nZWQoKXt1cGRhdGVHdWlkZSgpO2l0ZW1zLmZvckVhY2goaT0+e2lmKGkucmVzaXplPT09J3JlY29tbWVuZGVkJylpbnZhbGlkYXRlKGkpfSk7cmVuZGVyKCl9CnJvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJlYV0nKS5mb3JFYWNoKGI9PmIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57aWYoYXJlYT09PWIuZGF0YXNldC5hcmVhKXJldHVybjthcmVhPWIuZGF0YXNldC5hcmVhO3Jvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJlYV0nKS5mb3JFYWNoKHg9Pnguc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLFN0cmluZyh4PT09YikpKTtyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW9ubHldJykuZm9yRWFjaCh4PT54LmNsYXNzTGlzdC50b2dnbGUoJ2NpbC1oaWRlJyx4LmRhdGFzZXQub25seSE9PWFyZWEpKTtzZXR0aW5nc0NoYW5nZWQoKTtpZighYi5kYXRhc2V0LnNpbGVudCl7dHJ5e2NvbnN0IHU9bmV3IFVSTChsb2NhdGlvbi5ocmVmKTt1LnNlYXJjaFBhcmFtcy5zZXQoJ3VzZScsYXJlYSk7aGlzdG9yeS5yZXBsYWNlU3RhdGUoaGlzdG9yeS5zdGF0ZSwnJyx1KX1jYXRjaChlKXt9fX0pKTsKLyogTGluayBkaXJlY3RseSB0byBhIHRhYjogP3VzZT1lbWFpbCBvciA\/dXNlPXdlYnNpdGUgKGFsc28gI2VtYWlsIC8gI3dlYnNpdGUpICovCnRyeXtjb25zdCBxPW5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKS5nZXQoJ3VzZScpfHxsb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCcnKTtpZihxPT09J2VtYWlsJ3x8cT09PSd3ZWJzaXRlJyl7Y29uc3QgYj1yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFyZWE9IicrcSsnIl0nKTtpZihiKXtiLmRhdGFzZXQuc2lsZW50PScxJztiLmNsaWNrKCk7ZGVsZXRlIGIuZGF0YXNldC5zaWxlbnR9fX1jYXRjaChlKXt9CnVwZGF0ZUd1aWRlKCk7Ci8qIC0tLS0tLS0tLS0gZmlsZSBpbnRha2UgLS0tLS0tLS0tLSAqLwokKCdjaWwtYWRkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGU9PntlLnN0b3BQcm9wYWdhdGlvbigpOyQoJ2NpbC1pbnB1dCcpLmNsaWNrKCl9KTsKJCgnY2lsLWRyb3AnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+e2lmKGUudGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbixpbnB1dCcpKXJldHVybjskKCdjaWwtaW5wdXQnKS5jbGljaygpfSk7CiQoJ2NpbC1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZT0+e2NvbnN0IGY9QXJyYXkuZnJvbShlLnRhcmdldC5maWxlc3x8W10pO2UudGFyZ2V0LnZhbHVlPScnO2FkZEZpbGVzKGYpfSk7CmNvbnN0IGR6PSQoJ2NpbC1kcm9wJyksaGFzRmlsZXM9ZT0+ISFlLmRhdGFUcmFuc2ZlciYmQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci50eXBlc3x8W10pLmluZGV4T2YoJ0ZpbGVzJyk+LTE7CnJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLGU9PntpZighaGFzRmlsZXMoZSkpcmV0dXJuO2UucHJldmVudERlZmF1bHQoKTtlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSdjb3B5Jztkei5kYXRhc2V0LmRyYWc9JzEnfSk7CnJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJyxlPT57aWYoIXJvb3QuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSlkZWxldGUgZHouZGF0YXNldC5kcmFnfSk7CnJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsZT0+e2lmKCFoYXNGaWxlcyhlKSlyZXR1cm47ZS5wcmV2ZW50RGVmYXVsdCgpO2RlbGV0ZSBkei5kYXRhc2V0LmRyYWc7YWRkRmlsZXMoQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci5maWxlc3x8W10pKX0pOwpmdW5jdGlvbiBjbGVhckFsbCgpe2lmKGl0ZW1zLnNvbWUoaT0+aS5yZXN1bHQmJiFpLnJlc3VsdC5rZXB0T3JpZ2luYWwpJiYhd2luZG93LmNvbmZpcm0oJ1RhIGJvcnQgYWxsYSBiaWxkZXI\/IE9wdGltZXJhZGUgYmlsZGVyIHNvbSBkdSBpbnRlIGhhciBsYWRkYXQgbmVyIGbDtnJzdmlubmVyLicpKXJldHVybjtpdGVtcy5mb3JFYWNoKGRpc2NhcmQpO2l0ZW1zPVtdO3F1ZXVlLmxlbmd0aD0wO3JlbmRlcigpO3N0YXR1cygnQWxsYSBiaWxkZXIgaGFyIHRhZ2l0cyBib3J0LicpOyQoJ2NpbC1hZGQnKS5mb2N1cygpfQokKCdjaWwtY2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsY2xlYXJBbGwpO2lmKCQoJ2NpbC1jbGVhcjInKSkkKCdjaWwtY2xlYXIyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGNsZWFyQWxsKTsKYXN5bmMgZnVuY3Rpb24gaGVhZEJ5dGVzKGZpbGUsbil7cmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IGZpbGUuc2xpY2UoMCxuKS5hcnJheUJ1ZmZlcigpKX0KYXN5bmMgZnVuY3Rpb24gc25pZmYoZmlsZSl7CiBjb25zdCBiPWF3YWl0IGhlYWRCeXRlcyhmaWxlLDY0KSxhdD0obyxzKT0+e2ZvcihsZXQgaT0wO2k8cy5sZW5ndGg7aSsrKWlmKGJbbytpXSE9PXMuY2hhckNvZGVBdChpKSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9OwogaWYoYlswXT09PTB4RkYmJmJbMV09PT0weEQ4JiZiWzJdPT09MHhGRilyZXR1cm4gJ2ltYWdlL2pwZWcnOwogaWYoYXQoMCwnXHg4OVBOR1xyXG5ceDFhXG4nKSlyZXR1cm4gJ2ltYWdlL3BuZyc7CiBpZihhdCgwLCdHSUY4N2EnKXx8YXQoMCwnR0lGODlhJykpcmV0dXJuICdpbWFnZS9naWYnOwogaWYoYXQoMCwnQk0nKSYmYi5sZW5ndGg+PTE4JiZbMTIsMTYsNDAsNTIsNTYsNjQsMTA4LDEyNF0uaW5kZXhPZihiWzE0XXwoYlsxNV08PDgpKT4tMSYmYlsxNl09PT0wJiZiWzE3XT09PTApcmV0dXJuICdpbWFnZS9ibXAnOwogaWYoYXQoMCwnUklGRicpJiZhdCg4LCdXRUJQJykpcmV0dXJuICdpbWFnZS93ZWJwJzsKIGlmKGF0KDQsJ2Z0eXAnKSl7Y29uc3Qgcz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYi5zdWJhcnJheSg4LDY0KSk7aWYoL2F2aVtmc10vLnRlc3QocykpcmV0dXJuICdpbWFnZS9hdmlmJztpZigvaGVpW2Ntc3hdfGhldltjbXN4XXxtaWYxfG1zZjEvLnRlc3QocykpcmV0dXJuICdpbWFnZS9oZWljJztyZXR1cm4gJyd9CiBpZigoYXQoMCwnSUknKSYmYlsyXT09PTQyJiZiWzNdPT09MCl8fChhdCgwLCdNTScpJiZiWzJdPT09MCYmYlszXT09PTQyKSlyZXR1cm4gJ2ltYWdlL3RpZmYnOwogaWYoYlswXT09PTAmJmJbMV09PT0wJiZiWzJdPT09MSYmYlszXT09PTAmJmJbNF0+MClyZXR1cm4gJ2ltYWdlL3gtaWNvbic7CiBjb25zdCBoZWFkPW5ldyBUZXh0RGVjb2RlcigndXRmLTgnKS5kZWNvZGUoYXdhaXQgaGVhZEJ5dGVzKGZpbGUsNDA5NikpLnJlcGxhY2UoL15cdUZFRkYvLCcnKTsKIGlmKC9eXHMqKDxcP3htbFtePl0qXD8+XHMqKT8oXHgzYyEtLVtcc1xTXSo\/LS1ceDNlXHMqfFx4M2MhRE9DVFlQRVtePl0qPlxzKikqPHN2Z1tccz5cL10vaS50ZXN0KGhlYWQpKXJldHVybiAnaW1hZ2Uvc3ZnK3htbCc7CiByZXR1cm4gJyc7Cn0KZnVuY3Rpb24gZGVmYXVsdE91dHB1dCh0eXBlKXtyZXR1cm4gdHlwZT09PSdpbWFnZS9naWYnPydvcmlnaW5hbCc6J2F1dG8nfQphc3luYyBmdW5jdGlvbiBhZGRGaWxlcyhmaWxlcyl7CiBpZighZmlsZXMubGVuZ3RoKXJldHVybjtsZXQgYWRkZWQ9MCxkdXBlcz0wO2NvbnN0IHJlamVjdGVkPVtdLGRhbWFnZWQ9W107CiBmb3IoY29uc3QgZmlsZSBvZiBmaWxlcyl7CiAgY29uc3Qga2V5PVtmaWxlLm5hbWUsZmlsZS5zaXplLGZpbGUubGFzdE1vZGlmaWVkXS5qb2luKCc6Jyk7CiAgaWYoaXRlbXMuc29tZShpPT5pLmtleT09PWtleSkpe2R1cGVzKys7Y29udGludWV9CiAgbGV0IHR5cGU9Jyc7dHJ5e3R5cGU9YXdhaXQgc25pZmYoZmlsZSl9Y2F0Y2goZSl7fQogIGlmKCF0eXBlKXsoRVhUX1RZUEVbZXh0T2YoZmlsZS5uYW1lKV0\/ZGFtYWdlZDpyZWplY3RlZCkucHVzaChmaWxlLm5hbWV8fCduYW1ubMO2cyBmaWwnKTtjb250aW51ZX0KICBpZihpdGVtcy5zb21lKGk9Pmkua2V5PT09a2V5KSl7ZHVwZXMrKztjb250aW51ZX0KICBjb25zdCBjbGFpbWVkPUVYVF9UWVBFW2V4dE9mKGZpbGUubmFtZSldfHwnJzsKICBjb25zdCBpdGVtPXtpZDpzZXJpYWwrKyxrZXksZmlsZSx0eXBlLGNsYWltZWQsbWlzbWF0Y2g6Y2xhaW1lZCE9PXR5cGUsd2lkdGg6MCxoZWlnaHQ6MCxsb2FkaW5nOnRydWUsZXJyb3I6JycsZnJhbWVzOjAsYW5pbWF0ZWQ6ZmFsc2Usc3ZnOm51bGwsc3ZnQXNzdW1lZDpmYWxzZSxsYXlvdXQ6JzEnLGxheW91dFdpZHRoOjAsc2l0ZVdpZHRoOjAsbGF5b3V0V2lkdGhVbml0OidweCcsc2l0ZVdpZHRoVW5pdDoncHgnLHNpdGVCYXNlOjAsd1BsYWNlbWVudDonbm9uZScsd1RoZW1lOidhJyx3VmFyaWFudDonMCcsY29tcGFyZTpmYWxzZSx0cmFuc3A6ZmFsc2UsdG9sOjQwLGNsaWNrczpbXSxhY3R1YWw6ZmFsc2UsdXJsczp7fSxvdXRwdXQ6ZGVmYXVsdE91dHB1dCh0eXBlKSxyZXNpemU6J3JlY29tbWVuZGVkJyxjdXN0b21XaWR0aDowLHF1YWxpdHk6ODIsY29sb3VyczoyNTYscmVzdWx0Om51bGwsYnVzeTpmYWxzZSxyZXY6MH07CiAgaXRlbXMucHVzaChpdGVtKTtxdWV1ZS5wdXNoKGl0ZW0pO2FkZGVkKys7CiB9CiBwdW1wKCk7cmVuZGVyKCk7aWYoYWRkZWQpe3RyYWNrKCdhZGQnKTtkcm9wQ29uZmlybShhZGRlZCl9CiBjb25zdCBtc2c9W107aWYoYWRkZWQpbXNnLnB1c2goYWRkZWQrKGFkZGVkPT09MT8nIGJpbGQnOicgYmlsZGVyJykrJyB0aWxsYWdkYS4nKTtpZihkdXBlcyltc2cucHVzaChkdXBlcysnIGZpbm5zIHJlZGFuIGkgbGlzdGFuLicpOwogaWYoZGFtYWdlZC5sZW5ndGgpbXNnLnB1c2goKGRhbWFnZWQubGVuZ3RoPT09MT8nRmlsZW4gc2VyIHV0IHNvbSBlbiBiaWxkLCBtZW4gZGVuIGt1bmRlIGludGUgbMOkc2FzOiAnOidGaWxlcm5hIHNlciB1dCBzb20gYmlsZGVyLCBtZW4gZGUga3VuZGUgaW50ZSBsw6RzYXM6ICcpK2RhbWFnZWQuc2xpY2UoMCwzKS5qb2luKCcsICcpKyhkYW1hZ2VkLmxlbmd0aD4zPycgb2NoICcrKGRhbWFnZWQubGVuZ3RoLTMpKycgdGlsbCc6JycpKycuICcrKGRhbWFnZWQubGVuZ3RoPT09MT8nRmlsZW4ga2FuIHZhcmEgc2thZGFkIGVsbGVyIGZlbGFrdGlndCBzcGFyYWQuIMOWcHBuYSBkZW4gaSBkaXR0IGJpbGRwcm9ncmFtIG9jaCBzcGFyYSBlbGxlciBleHBvcnRlcmEgZGVuIGlnZW4uJzonRmlsZXJuYSBrYW4gdmFyYSBza2FkYWRlIGVsbGVyIGZlbGFrdGlndCBzcGFyYWRlLiDDlnBwbmEgZGVtIGkgZGl0dCBiaWxkcHJvZ3JhbSBvY2ggc3BhcmEgZWxsZXIgZXhwb3J0ZXJhIGRlbSBpZ2VuLicpKTsKIGlmKHJlamVjdGVkLmxlbmd0aCltc2cucHVzaCgocmVqZWN0ZWQubGVuZ3RoPT09MT8nRmlsZW4gw6RyIGludGUgZW4gYmlsZCBvY2gga2FuIGludGUga29udHJvbGxlcmFzOiAnOidGaWxlcm5hIMOkciBpbnRlIGJpbGRlciBvY2gga2FuIGludGUga29udHJvbGxlcmFzOiAnKStyZWplY3RlZC5zbGljZSgwLDMpLmpvaW4oJywgJykrKHJlamVjdGVkLmxlbmd0aD4zPycgb2NoICcrKHJlamVjdGVkLmxlbmd0aC0zKSsnIHRpbGwnOicnKSsnLiBWw6RsaiBlbiBKUEctLCBQTkctLCBHSUYtLCBCTVAtLCBXZWJQLSBlbGxlciBTVkctZmlsLicpOwogaWYocmVqZWN0ZWQubGVuZ3RofHxkYW1hZ2VkLmxlbmd0aClzdGF0dXMobXNnLmZpbHRlcihtPT4hLyBhZGRlZFwuJC8udGVzdChtKSkuam9pbignICcpLCdlcnJvcicpO2Vsc2UgaWYoZHVwZXMpc3RhdHVzKG1zZy5maWx0ZXIobT0+IS8gYWRkZWRcLiQvLnRlc3QobSkpLmpvaW4oJyAnKSk7ZWxzZSBzdGF0dXMoJycpCn0KZnVuY3Rpb24gZHJvcENvbmZpcm0obil7Y29uc3QgZD0kKCdjaWwtZHJvcCcpO2lmKCFkKXJldHVybjtsZXQgb2s9ZC5xdWVyeVNlbGVjdG9yKCcuY2lsLWRyb3Atb2snKTtpZighb2spe29rPWVsKCdkaXYnLCdjaWwtZHJvcC1vaycpO29rLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCd0cnVlJyk7b2suaW5uZXJIVE1MPSc8c3BhbiBjbGFzcz0iY2lsLWRyb3Atb2tpY29uIj48c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIwIDYgOSAxN2wtNS01Ii8+PC9zdmc+PC9zcGFuPjxzdHJvbmcgY2xhc3M9ImNpbC1kcm9wLW9rdGV4dCI+PC9zdHJvbmc+PHNwYW4gY2xhc3M9ImNpbC1kcm9wLW9rc3ViIj5TZSBkZXRhbGplcm5hIG5lZGFuPC9zcGFuPic7ZC5hcHBlbmQob2spfW9rLnF1ZXJ5U2VsZWN0b3IoJy5jaWwtZHJvcC1va3RleHQnKS50ZXh0Q29udGVudD1uKyhuPT09MT8nIGJpbGQgdGlsbGFnZCc6JyBiaWxkZXIgdGlsbGFnZGEnKTtvay5jbGFzc0xpc3QucmVtb3ZlKCdjaWwtc2hvdycpO3ZvaWQgb2sub2Zmc2V0V2lkdGg7b2suY2xhc3NMaXN0LmFkZCgnY2lsLXNob3cnKTtjbGVhclRpbWVvdXQoZHJvcENvbmZpcm0udCk7ZHJvcENvbmZpcm0udD1zZXRUaW1lb3V0KCgpPT5vay5jbGFzc0xpc3QucmVtb3ZlKCdjaWwtc2hvdycpLDIyMDApfQpmdW5jdGlvbiBwdW1wKCl7d2hpbGUoYWN0aXZlPFJFQURfQ09OQ1VSUkVOQ1kmJnF1ZXVlLmxlbmd0aCl7Y29uc3QgaXRlbT1xdWV1ZS5zaGlmdCgpO2lmKCFhbGl2ZShpdGVtKSljb250aW51ZTthY3RpdmUrKztpbnNwZWN0KGl0ZW0pLmZpbmFsbHkoKCk9PnthY3RpdmUtLTtwdW1wKCl9KX19CmZ1bmN0aW9uIGdpZkZyYW1lcyhiKXsKIGlmKGIubGVuZ3RoPDEzKXJldHVybiAwO2xldCBwPTEzLGZyYW1lcz0wO2lmKGJbMTBdJjB4ODApcCs9MyooMTw8KChiWzEwXSY3KSsxKSk7CiBjb25zdCBza2lwQmxvY2tzPSgpPT57d2hpbGUocDxiLmxlbmd0aCYmYltwXSE9PTApcCs9YltwXSsxO3ArK307CiB3aGlsZShwPGIubGVuZ3RoKXtjb25zdCBjPWJbcCsrXTtpZihjPT09MHgzQilicmVhaztpZihjPT09MHgyMSl7cCsrO3NraXBCbG9ja3MoKX1lbHNlIGlmKGM9PT0weDJDKXtmcmFtZXMrKztpZihwKzk+Yi5sZW5ndGgpYnJlYWs7Y29uc3QgcGs9YltwKzhdO3ArPTk7aWYocGsmMHg4MClwKz0zKigxPDwoKHBrJjcpKzEpKTtwKys7c2tpcEJsb2NrcygpfWVsc2UgYnJlYWt9CiByZXR1cm4gZnJhbWVzOwp9CmFzeW5jIGZ1bmN0aW9uIGlzQXBuZyhmaWxlKXtjb25zdCBiPWF3YWl0IGhlYWRCeXRlcyhmaWxlLDQqTUIpLHY9bmV3IERhdGFWaWV3KGIuYnVmZmVyKTtsZXQgcD04O3doaWxlKHArODw9Yi5sZW5ndGgpe2NvbnN0IGxlbj12LmdldFVpbnQzMihwKSx0PVN0cmluZy5mcm9tQ2hhckNvZGUoYltwKzRdLGJbcCs1XSxiW3ArNl0sYltwKzddKTtpZih0PT09J2FjVEwnKXJldHVybiB0cnVlO2lmKHQ9PT0nSURBVCd8fHQ9PT0nSUVORCcpcmV0dXJuIGZhbHNlO3ArPTEyK2xlbn1yZXR1cm4gZmFsc2V9CmFzeW5jIGZ1bmN0aW9uIGlzQW5pbWF0ZWRXZWJwKGZpbGUpe2NvbnN0IGI9YXdhaXQgaGVhZEJ5dGVzKGZpbGUsMzIpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGJbMTJdLGJbMTNdLGJbMTRdLGJbMTVdKT09PSdWUDhYJyYmKGJbMjBdJjB4MDIpPT09MHgwMn0KZnVuY3Rpb24gbG9hZEltZyhibG9iKXtyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e2NvbnN0IHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLGltZz1uZXcgSW1hZ2UoKTtpbWcub25sb2FkPSgpPT5yZXNvbHZlKHtzb3VyY2U6aW1nLHdpZHRoOmltZy5uYXR1cmFsV2lkdGgsaGVpZ2h0OmltZy5uYXR1cmFsSGVpZ2h0LHJlbGVhc2U6KCk9PlVSTC5yZXZva2VPYmplY3RVUkwodXJsKX0pO2ltZy5vbmVycm9yPSgpPT57VVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOy8qIEZhbGxiYWNrIGZvciBzaXRlcyB3aG9zZSBzZWN1cml0eSBwb2xpY3kgYmxvY2tzIGJsb2I6IGltYWdlcyAqL2NvbnN0IHI9bmV3IEZpbGVSZWFkZXIoKTtyLm9ubG9hZD0oKT0+e2NvbnN0IGkyPW5ldyBJbWFnZSgpO2kyLm9ubG9hZD0oKT0+cmVzb2x2ZSh7c291cmNlOmkyLHdpZHRoOmkyLm5hdHVyYWxXaWR0aCxoZWlnaHQ6aTIubmF0dXJhbEhlaWdodCxyZWxlYXNlOigpPT57fX0pO2kyLm9uZXJyb3I9KCk9PnJlamVjdChFcnJvcignZGVjb2RlJykpO2kyLnNyYz1yLnJlc3VsdH07ci5vbmVycm9yPSgpPT5yZWplY3QoRXJyb3IoJ2RlY29kZScpKTtyLnJlYWRBc0RhdGFVUkwoYmxvYil9O2ltZy5zcmM9dXJsfSl9CmFzeW5jIGZ1bmN0aW9uIGRlY29kZVJhc3RlcihmaWxlKXsKIGlmKHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcD09PSdmdW5jdGlvbicpe3RyeXtjb25zdCBibXA9YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSx7aW1hZ2VPcmllbnRhdGlvbjonZnJvbS1pbWFnZSd9KTtyZXR1cm4ge3NvdXJjZTpibXAsd2lkdGg6Ym1wLndpZHRoLGhlaWdodDpibXAuaGVpZ2h0LHJlbGVhc2U6KCk9PmJtcC5jbG9zZSYmYm1wLmNsb3NlKCl9fWNhdGNoKGUpe319CiByZXR1cm4gbG9hZEltZyhmaWxlKTsKfQphc3luYyBmdW5jdGlvbiBzdmdJbmZvKGZpbGUpewogaWYoZmlsZS5zaXplPk1BWF9TVkdfQllURVMpdGhyb3cgRXJyb3IoJ1NWRy1maWxlbiDDpHIgZsO2ciBzdG9yIGbDtnIgYXR0IGtvbnRyb2xsZXJhcyBzw6RrZXJ0ICjDtnZlciAxMCBNQikuJyk7CiBjb25zdCBkb2M9bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhhd2FpdCBmaWxlLnRleHQoKSwnaW1hZ2Uvc3ZnK3htbCcpLHN2Zz1kb2MuZG9jdW1lbnRFbGVtZW50OwogaWYoZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXJzZXJlcnJvcicpLmxlbmd0aHx8IXN2Z3x8c3ZnLmxvY2FsTmFtZSE9PSdzdmcnKXRocm93IEVycm9yKCdTVkctZmlsZW4gdmVya2FyIHZhcmEgZmVsYWt0aWcgb2NoIGthbiBpbnRlIGtvbnZlcnRlcmFzIGjDpHIuJyk7CiBjb25zdCBsZW49dj0+e2NvbnN0IG09L15ccyooWzAtOV0qXC4\/WzAtOV0rKD86ZVsrLV0\/XGQrKT8pXHMqKHB4KT9ccyokL2kuZXhlYyh2fHwnJyk7cmV0dXJuIG0\/cGFyc2VGbG9hdChtWzFdKTowfTsKIGxldCB3PWxlbihzdmcuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKSxoPWxlbihzdmcuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7CiBjb25zdCB2Yj0oc3ZnLmdldEF0dHJpYnV0ZSgndmlld0JveCcpfHwnJykudHJpbSgpLnNwbGl0KC9bXHMsXSsvKS5tYXAoTnVtYmVyKSxoYXNWQj12Yi5sZW5ndGg9PT00JiZ2Yi5ldmVyeShpc0Zpbml0ZSkmJnZiWzJdPjAmJnZiWzNdPjA7CiBpZihoYXNWQil7aWYodyYmIWgpaD13KnZiWzNdL3ZiWzJdO2Vsc2UgaWYoaCYmIXcpdz1oKnZiWzJdL3ZiWzNdO2Vsc2UgaWYoIXcmJiFoKXt3PXZiWzJdO2g9dmJbM119fQogbGV0IGFzc3VtZWQ9ZmFsc2U7aWYoIXd8fCFoKXt3PTMwMDtoPTE1MDthc3N1bWVkPXRydWV9CiByZXR1cm4ge3N2ZyxoYXNWQix3aWR0aDpNYXRoLm1heCgxLE1hdGgucm91bmQodykpLGhlaWdodDpNYXRoLm1heCgxLE1hdGgucm91bmQoaCkpLGFzc3VtZWR9Owp9CmZ1bmN0aW9uIHN2Z0Jsb2IoaW5mbyx3LGgpe2NvbnN0IHM9aW5mby5zdmcuY2xvbmVOb2RlKHRydWUpO2lmKCFpbmZvLmhhc1ZCKXMuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywnMCAwICcraW5mby53aWR0aCsnICcraW5mby5oZWlnaHQpO3Muc2V0QXR0cmlidXRlKCd3aWR0aCcsU3RyaW5nKHcpKTtzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JyxTdHJpbmcoaCkpO3JldHVybiBuZXcgQmxvYihbbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhzKV0se3R5cGU6J2ltYWdlL3N2Zyt4bWwnfSl9CmFzeW5jIGZ1bmN0aW9uIGluc3BlY3QoaXRlbSl7CiB0cnl7CiAgaWYoaXRlbS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnKXtjb25zdCBpbmZvPWF3YWl0IHN2Z0luZm8oaXRlbS5maWxlKTtpdGVtLnN2Zz1pbmZvO2l0ZW0ud2lkdGg9aW5mby53aWR0aDtpdGVtLmhlaWdodD1pbmZvLmhlaWdodDtpdGVtLnN2Z0Fzc3VtZWQ9aW5mby5hc3N1bWVkfQogIGVsc2V7CiAgIGlmKGl0ZW0udHlwZT09PSdpbWFnZS9naWYnJiZpdGVtLmZpbGUuc2l6ZTw9TUFYX0dJRl9TQ0FOKXtpdGVtLmZyYW1lcz1naWZGcmFtZXMobmV3IFVpbnQ4QXJyYXkoYXdhaXQgaXRlbS5maWxlLmFycmF5QnVmZmVyKCkpKTtpdGVtLmFuaW1hdGVkPWl0ZW0uZnJhbWVzPjF9CiAgIGVsc2UgaWYoaXRlbS50eXBlPT09J2ltYWdlL3BuZycpaXRlbS5hbmltYXRlZD1hd2FpdCBpc0FwbmcoaXRlbS5maWxlKTsKICAgZWxzZSBpZihpdGVtLnR5cGU9PT0naW1hZ2Uvd2VicCcpaXRlbS5hbmltYXRlZD1hd2FpdCBpc0FuaW1hdGVkV2VicChpdGVtLmZpbGUpOwogICBpZihpdGVtLmFuaW1hdGVkJiZpdGVtLnR5cGU9PT0naW1hZ2UvcG5nJyYmaXRlbS5vdXRwdXQ9PT0nYXV0bycpaXRlbS5vdXRwdXQ9J29yaWdpbmFsJzsKICAgbGV0IHNyYzt0cnl7c3JjPWF3YWl0IGRlY29kZVJhc3RlcihpdGVtLmZpbGUpfWNhdGNoKGUpe3Rocm93IEVycm9yKCdEaW4gd2ViYmzDpHNhcmUga2FuIGludGUgbMOkc2EgZGVubmEgJyt0eXBlTGFiZWwoaXRlbS50eXBlKSsnLWZpbCwgc8OlIGRlbiBrYW4gaW50ZSBrb250cm9sbGVyYXMgZWxsZXIga29udmVydGVyYXMgaMOkci4gRXhwb3J0ZXJhIGRlbiBzb20gSlBHIGVsbGVyIFBORyBmcsOlbiBkaXR0IGJpbGRwcm9ncmFtLicpfQogICBpdGVtLndpZHRoPXNyYy53aWR0aDtpdGVtLmhlaWdodD1zcmMuaGVpZ2h0O3NyYy5yZWxlYXNlKCk7CiAgIGlmKCFpdGVtLndpZHRofHwhaXRlbS5oZWlnaHQpdGhyb3cgRXJyb3IoJ0JpbGRlbnMgbcOldHQga3VuZGUgaW50ZSBsw6RzYXMuJyk7CiAgfQogfWNhdGNoKGUpe2l0ZW0uZXJyb3I9ZS5tZXNzYWdlfHwnQmlsZGVuIGt1bmRlIGludGUgbMOkc2FzLid9CiBmaW5hbGx5e2l0ZW0ubG9hZGluZz1mYWxzZTtpZihhbGl2ZShpdGVtKSlyZW5kZXIoKX0KfQovKiAtLS0tLS0tLS0tIHBlci1pdGVtIHN0YXRlIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gZHJvcFVybChpdGVtLGspe2lmKGl0ZW0udXJsc1trXSl7VVJMLnJldm9rZU9iamVjdFVSTChpdGVtLnVybHNba10pO2RlbGV0ZSBpdGVtLnVybHNba119fQpmdW5jdGlvbiBvYmpVcmwoaXRlbSxrLGJsb2Ipe2lmKCFpdGVtLnVybHNba10paXRlbS51cmxzW2tdPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7cmV0dXJuIGl0ZW0udXJsc1trXX0KZnVuY3Rpb24gaW52YWxpZGF0ZShpdGVtKXtpdGVtLnJlc3VsdD1udWxsO2l0ZW0ucmV2Kys7aXRlbS5idXN5PWZhbHNlO2Ryb3BVcmwoaXRlbSwncmVzJyl9CmZ1bmN0aW9uIGRpc2NhcmQoaXRlbSl7aW52YWxpZGF0ZShpdGVtKTtkcm9wVXJsKGl0ZW0sJ29yaWcnKX0KZnVuY3Rpb24gY2hhbmdlSXRlbShpdGVtLHByb3AsdmFsdWUpe2l0ZW1bcHJvcF09dmFsdWU7aWYocHJvcD09PSdyZXNpemUnKWl0ZW0ucmVzaXplQ2hvc2VuPXRydWU7aWYocHJvcD09PSdyZXNpemUnJiZ2YWx1ZT09PSdjdXN0b20nJiYhaXRlbS5jdXN0b21XaWR0aClpdGVtLmN1c3RvbVdpZHRoPU1hdGgubWluKGl0ZW0ud2lkdGh8fDEyMDAsMTIwMCk7aWYoWydsYXlvdXQnLCd3UGxhY2VtZW50Jywnd1RoZW1lJywnd1ZhcmlhbnQnLCdsYXlvdXRXaWR0aCcsJ3NpdGVXaWR0aCcsJ2xheW91dFdpZHRoVW5pdCcsJ3NpdGVXaWR0aFVuaXQnLCdzaXRlQmFzZSddLmluZGV4T2YocHJvcCk8MHx8aXRlbS5yZXNpemU9PT0ncmVjb21tZW5kZWQnKWludmFsaWRhdGUoaXRlbSk7cmVuZGVyKCl9CmZ1bmN0aW9uIHJlc2l6ZU1vZGUoaXRlbSl7Y29uc3QgcmVjPXN1Z2dlc3RlZChpdGVtKTtpZihpdGVtLnJlc2l6ZT09PSdyZWNvbW1lbmRlZCcmJiFyZWMpcmV0dXJuICdvcmlnaW5hbCc7aWYoaXRlbS5yZXNpemU9PT0ncmVjb21tZW5kZWQnJiYhaXRlbS5yZXNpemVDaG9zZW4mJml0ZW0udHlwZSE9PSdpbWFnZS9zdmcreG1sJyYmaXRlbS53aWR0aD4wJiZpdGVtLndpZHRoPHJlYyowLjkpcmV0dXJuICdvcmlnaW5hbCc7cmV0dXJuIGl0ZW0ucmVzaXplfQpmdW5jdGlvbiBvdXRUeXBlKGl0ZW0pe3JldHVybiBpdGVtLm91dHB1dD09PSdvcmlnaW5hbCc\/Jyc6aXRlbS5vdXRwdXR9CmZ1bmN0aW9uIGNhbk9wdGltaXNlKGl0ZW0pe3JldHVybiAhaXRlbS5sb2FkaW5nJiYhaXRlbS5lcnJvciYmIWl0ZW0uYnVzeSYmISFvdXRUeXBlKGl0ZW0pJiZpdGVtLndpZHRoPjAmJml0ZW0uaGVpZ2h0PjB9CmZ1bmN0aW9uIHRhcmdldFNpemUoaXRlbSl7CiBjb25zdCB3MD1pdGVtLndpZHRoLGgwPWl0ZW0uaGVpZ2h0LHN2Zz1pdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcsbW9kZT1yZXNpemVNb2RlKGl0ZW0pO2xldCB3PXcwOwogaWYobW9kZT09PSdyZWNvbW1lbmRlZCcpdz1zdWdnZXN0ZWQoaXRlbSk7CiBlbHNlIGlmKG1vZGU9PT0nY3VzdG9tJyl7Y29uc3Qgbj1OdW1iZXIoaXRlbS5jdXN0b21XaWR0aCk7aWYoIU51bWJlci5pc0ludGVnZXIobil8fG48MXx8bj5NQVhfSU5QVVRfV0lEVEgpdGhyb3cgRXJyb3IoJ0FuZ2UgZXR0IGhlbHRhbCBtZWxsYW4gMSBvY2ggMTIgMDAwIGbDtnIgYnJlZGRlbi4nKTt3PW59CiBjb25zdCBoPU1hdGgubWF4KDEsTWF0aC5yb3VuZChoMCp3L3cwKSk7CiBpZih3Pk1BWF9TSURFfHxoPk1BWF9TSURFfHx3Kmg+TUFYX1BJWEVMUyl0aHJvdyBFcnJvcignUmVzdWx0YXRldCBza3VsbGUgYmxpICcrdysnIMOXICcraCsnIHB4LCB2aWxrZXQgw6RyIGbDtnIgc3RvcnQgZsO2ciBhdHQgaGFudGVyYXMgc8Oka2VydCBpIGFsbGEgd2ViYmzDpHNhcmUgKGdyw6RucyAxNiw3IG1lZ2FwaXhlbCkuIFbDpGxqIGVuIG1pbmRyZSBicmVkZC4nKTsKIHJldHVybiB7dyxofTsKfQpmdW5jdGlvbiBzYWZlQmFzZShuYW1lKXtsZXQgYj0obmFtZXx8JycpLm5vcm1hbGl6ZSgnTkZDJykucmVwbGFjZSgvXC5bXi5dKiQvLCcnKS5yZXBsYWNlKC9bXHUwMDAwLVx1MDAxZlx1MDA3ZlwvXFw6Kj8iPD58XSsvZywnXycpLnJlcGxhY2UoL15bXHMuXSt8W1xzLl0rJC9nLCcnKTtyZXR1cm4gKGJ8fCdpbWFnZScpLnNsaWNlKDAsMTIwKX0KZnVuY3Rpb24gYW5hbHlzZShzb3VyY2UsdyxoKXsKIHRyeXtjb25zdCBzPU1hdGgubWluKDEsMTI4L01hdGgubWF4KHcsaCkpLGN3PU1hdGgubWF4KDEsTWF0aC5yb3VuZCh3KnMpKSxjaD1NYXRoLm1heCgxLE1hdGgucm91bmQoaCpzKSksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjLndpZHRoPWN3O2MuaGVpZ2h0PWNoOwogIGNvbnN0IHg9Yy5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSk7eC5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ZmFsc2U7eC5kcmF3SW1hZ2Uoc291cmNlLDAsMCxjdyxjaCk7CiAgY29uc3QgZD14LmdldEltYWdlRGF0YSgwLDAsY3csY2gpLmRhdGEsc2Vlbj1uZXcgU2V0KCk7bGV0IGFscGhhPWZhbHNlOwogIGZvcihsZXQgaT0wO2k8ZC5sZW5ndGg7aSs9NCl7aWYoZFtpKzNdPDI1MClhbHBoYT10cnVlO2lmKHNlZW4uc2l6ZTw9MTAyNClzZWVuLmFkZCgoZFtpXTw8MTYpfChkW2krMV08PDgpfGRbaSsyXSl9CiAgYy53aWR0aD1jLmhlaWdodD0wO3JldHVybiB7YWxwaGEscGhvdG86c2Vlbi5zaXplPjEwMjR9OwogfWNhdGNoKGUpe3JldHVybiBudWxsfQp9Ci8qIHdoaWxlIHRoZSBtYW51YWwgZWRpdG9yIGlzIG9wZW4sIGxvY2sgZXZlcnl0aGluZyBlbHNlIGZvciB0aGF0IGltYWdlIHNvIG9ubHkgRG9uZSBvciBDYW5jZWwgYXBwbHkgKi8KY29uc3QgX19yZW5kZXJCYXNlPXJlbmRlcjtyZW5kZXI9ZnVuY3Rpb24oKXtfX3JlbmRlckJhc2UoKTsKIC8qIHJlc3VsdCBidXR0b25zIHNpdCBvbiB0aGUgc2FtZSByb3cgYXMgT3B0aW1pc2UsIHVuZGVyIHRoZSBvcHRpbWlzZWQgaW1hZ2UgKi8KIGNvbnN0IGNhcmRzPXJvb3QucXVlcnlTZWxlY3RvckFsbCgnI2NpbC1maWxlcyA+IC5jaWwtZmlsZScpO2l0ZW1zLmZvckVhY2goKGl0LGl4KT0+e2NvbnN0IGNhcmQ9Y2FyZHNbaXhdO2lmKCFjYXJkfHwhaXQucmVzdWx0fHxpdC5yZXN1bHQua2VwdE9yaWdpbmFsfHwhaXQuY29tcGFyZXx8aXQuZWRpdGluZylyZXR1cm47Y29uc3QgYWN0cz1bLi4uY2FyZC5jaGlsZHJlbl0uZmlsdGVyKHg9PnguY2xhc3NMaXN0LmNvbnRhaW5zKCdjaWwtYWN0aW9ucycpKS5wb3AoKTtpZighYWN0cylyZXR1cm47Y29uc3QgTD1lbCgnZGl2JywnY2lsLWFjdHMtZ3JvdXAnKSxSPWVsKCdkaXYnLCdjaWwtYWN0cy1ncm91cCcpO3doaWxlKGFjdHMuZmlyc3RDaGlsZClMLmFwcGVuZChhY3RzLmZpcnN0Q2hpbGQpO1IuYXBwZW5kKGJ1dHRvbignTGFkZGEgbmVyICcrdHlwZUxhYmVsKGl0LnJlc3VsdC50eXBlKSwoKT0+e3RyYWNrKCdkb3dubG9hZCcpO2Rvd25sb2FkKGl0LnJlc3VsdC5ibG9iLGl0LnJlc3VsdC5uYW1lKX0sJycsaXQuaWQrJy1kbCcpKTtpZihpdC50cmFuc3ApUi5hcHBlbmQoYnV0dG9uKCdSZWRpZ2VyYSBiYWtncnVuZCBtYW51ZWxsdCcsKCk9Pm9wZW5FZGl0b3IoaXQpLCdjaWwtYnRuLXNlY29uZGFyeScsaXQuaWQrJy1lZGl0JykpO2lmKChpdC5jbGlja3N8fFtdKS5sZW5ndGgpUi5hcHBlbmQoYnV0dG9uKCfDhW5ncmEgbWFudWVsbGEgw6RuZHJpbmdhcicsKCk9PntpdC5jbGlja3M9W107b3B0aW1pc2UoaXQpfSwnY2lsLWJ0bi10ZXh0JyxpdC5pZCsnLXVuZG9lZCcpKTthY3RzLmNsYXNzTGlzdC5hZGQoJ2NpbC1hY3Rpb25zLXNwbGl0Jyk7YWN0cy5hcHBlbmQoTCxSKX0pO2NvbnN0IGVkcz1yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaWwtZWRpdG9yJyk7ZWRzLmZvckVhY2goZWQ9Pntjb25zdCBjYXJkPWVkLmNsb3Nlc3QoJy5jaWwtZmlsZScpO2lmKCFjYXJkKXJldHVybjtjYXJkLmNsYXNzTGlzdC5hZGQoJ2NpbC1sb2NrZWQnKTtjYXJkLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCxpbnB1dCxidXR0b24sdGV4dGFyZWEsc3VtbWFyeScpLmZvckVhY2goeD0+e2lmKHguY2xvc2VzdCgnLmNpbC1lZGl0b3InKSlyZXR1cm47aWYoeC50YWdOYW1lPT09J1NVTU1BUlknKXt4LnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsJ3RydWUnKTt4LnRhYkluZGV4PS0xfWVsc2UgeC5kaXNhYmxlZD10cnVlfSk7Y29uc3QgYWN0cz1bLi4uY2FyZC5xdWVyeVNlbGVjdG9yQWxsKCcuY2lsLWFjdGlvbnMnKV0ucG9wKCk7aWYoYWN0cyYmIWFjdHMucXVlcnlTZWxlY3RvcignLmNpbC1sb2NrLW5vdGUnKSlhY3RzLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1zbWFsbCBjaWwtbG9jay1ub3RlJywnU2x1dGbDtnIgcmVkaWdlcmluZ2VuIGF2IGJha2dydW5kZW4gZsO2cnN0OiBrbGlja2EgcMOlIEtsYXIgZWxsZXIgQXZicnl0LicpKX0pO2lmKGVkcy5sZW5ndGgpe1snY2lsLW9wdGFsbCcsJ2NpbC16aXAnXS5mb3JFYWNoKGlkPT57Y29uc3QgYj0kKGlkKTtpZihiKWIuZGlzYWJsZWQ9dHJ1ZX0pfX07Ci8qIC0tLS0tLS0tLS0gbWFudWFsIGJhY2tncm91bmQgZWRpdG9yOiBlZGl0cyBhIGNhbnZhcyBkaXJlY3RseSwgb3B0aW1pc2VzIG9uY2Ugb24gRG9uZSAtLS0tLS0tLS0tICovCmNvbnN0IFpPT01TPVswLjI1LDAuNSwxLDIsNCw4XTsKZnVuY3Rpb24gb3BlbkVkaXRvcihpdGVtKXtpdGVtLmVkaXRpbmc9dHJ1ZTtpdGVtLmVkWm9vbT0wO2l0ZW0uZWRUb29sPWl0ZW0uZWRUb29sfHwnZmlsbCc7aXRlbS5lZFRvbD1pdGVtLmVkVG9sfHxpdGVtLnRvbHx8NDA7aXRlbS5lZEJydXNoPWl0ZW0uZWRCcnVzaHx8MTY7aXRlbS5lZFN0YWNrPVtdO2l0ZW0uZHJhZnQ9W107aXRlbS5lZENhbnZhcz1udWxsO3JlbmRlcigpOwogZGVjb2RlUmFzdGVyKGl0ZW0ucmVzdWx0LmJsb2IpLnRoZW4oc3JjPT57aWYoIWl0ZW0uZWRpdGluZylyZXR1cm47Y29uc3QgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7Y3YuY2xhc3NOYW1lPSdjaWwtZWQtY2FudmFzJztjdi53aWR0aD1zcmMud2lkdGg7Y3YuaGVpZ2h0PXNyYy5oZWlnaHQ7Y3YuZ2V0Q29udGV4dCgnMmQnLHt3aWxsUmVhZEZyZXF1ZW50bHk6dHJ1ZX0pLmRyYXdJbWFnZShzcmMuc291cmNlLDAsMCk7aWYoc3JjLnJlbGVhc2Upc3JjLnJlbGVhc2UoKTtjdi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+e2lmKGl0ZW0uZWRUb29sIT09J2JydXNoJyllZENsaWNrKGl0ZW0sZSl9KTtjdi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsZT0+ZWRCcnVzaFN0YXJ0KGl0ZW0sZSkpO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJyxlPT5lZEJydXNoTW92ZShpdGVtLGUpKTtbJ3BvaW50ZXJ1cCcsJ3BvaW50ZXJjYW5jZWwnLCdwb2ludGVybGVhdmUnXS5mb3JFYWNoKHQ9PmN2LmFkZEV2ZW50TGlzdGVuZXIodCwoKT0+ZWRCcnVzaEVuZChpdGVtKSkpO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJyxlPT5lZFJpbmcoaXRlbSxlKSk7Y3YuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJyxlPT5lZFJpbmcoaXRlbSxlKSk7Y3YuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywoKT0+ZWRSaW5nSGlkZShpdGVtKSk7aXRlbS5lZENhbnZhcz1jdjtyZW5kZXIoKX0pLmNhdGNoKCgpPT57aXRlbS5lZGl0aW5nPWZhbHNlO3N0YXR1cygnUmVkaWdlcmFyZW4ga3VuZGUgaW50ZSDDtnBwbmEgYmlsZGVuLicpO3JlbmRlcigpfSl9CmZ1bmN0aW9uIGZsb29kQ2xlYXIoZCx3LGgsZngsZnksdG9sKXtjb25zdCBuPXcqaCxjeD1NYXRoLm1pbih3LTEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKGZ4KncpKSksY3k9TWF0aC5taW4oaC0xLE1hdGgubWF4KDAsTWF0aC5mbG9vcihmeSpoKSkpLHMwPWN5KncrY3g7aWYoZFtzMCo0KzNdPT09MClyZXR1cm4gZmFsc2U7Y29uc3QgcjA9ZFtzMCo0XSxnMD1kW3MwKjQrMV0sYjA9ZFtzMCo0KzJdLGRvbmU9bmV3IFVpbnQ4QXJyYXkobikscT1uZXcgVWludDMyQXJyYXkobik7bGV0IHFoPTAscXQ9MDtjb25zdCBwYz1wPT57aWYoIWRvbmVbcF0mJmRbcCo0KzNdPjAmJk1hdGgubWF4KE1hdGguYWJzKGRbcCo0XS1yMCksTWF0aC5hYnMoZFtwKjQrMV0tZzApLE1hdGguYWJzKGRbcCo0KzJdLWIwKSk8PXRvbCl7ZG9uZVtwXT0xO3FbcXQrK109cH19O3BjKHMwKTt3aGlsZShxaDxxdCl7Y29uc3QgcD1xW3FoKytdLHg9cCV3O2lmKHg+MClwYyhwLTEpO2lmKHg8dy0xKXBjKHArMSk7aWYocD49dylwYyhwLXcpO2lmKHA8bi13KXBjKHArdyl9Zm9yKGxldCBpPTA7aTxxdDtpKyspZFtxW2ldKjQrM109MDtyZXR1cm4gcXQ+MH0KZnVuY3Rpb24gZWRDbGljayhpdGVtLGUpe2NvbnN0IGN2PWl0ZW0uZWRDYW52YXM7aWYoIWN2KXJldHVybjtjb25zdCBiPWN2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFiLndpZHRofHwhYi5oZWlnaHQpcmV0dXJuO2NvbnN0IGZ4PShlLmNsaWVudFgtYi5sZWZ0KS9iLndpZHRoLGZ5PShlLmNsaWVudFktYi50b3ApL2IuaGVpZ2h0LGN0eD1jdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSksaW1nPWN0eC5nZXRJbWFnZURhdGEoMCwwLGN2LndpZHRoLGN2LmhlaWdodCksc25hcD1uZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nLmRhdGEpOwogaWYoIWZsb29kQ2xlYXIoaW1nLmRhdGEsY3Yud2lkdGgsY3YuaGVpZ2h0LGZ4LGZ5LGl0ZW0uZWRUb2x8fDQwKSlyZXR1cm47aWYoaXRlbS5lZFN0YWNrLmxlbmd0aD49MjApaXRlbS5lZFN0YWNrLnNoaWZ0KCk7aXRlbS5lZFN0YWNrLnB1c2goe2RhdGE6c25hcCxuOml0ZW0uZHJhZnQubGVuZ3RofSk7Y3R4LnB1dEltYWdlRGF0YShpbWcsMCwwKTtpdGVtLmRyYWZ0LnB1c2goe3g6ZngseTpmeSx0Oml0ZW0uZWRUb2x8fDQwfSk7cmVuZGVyKCl9CmZ1bmN0aW9uIGVkUHQoaXRlbSxlKXtjb25zdCBjdj1pdGVtLmVkQ2FudmFzLGI9Y3YuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHtmeDooZS5jbGllbnRYLWIubGVmdCkvYi53aWR0aCxmeTooZS5jbGllbnRZLWIudG9wKS9iLmhlaWdodH19CmZ1bmN0aW9uIGVkQnJ1c2hTdGFydChpdGVtLGUpe2lmKGl0ZW0uZWRUb29sIT09J2JydXNoJ3x8IWl0ZW0uZWRDYW52YXMpcmV0dXJuO2UucHJldmVudERlZmF1bHQoKTtjb25zdCBjdj1pdGVtLmVkQ2FudmFzLGN0eD1jdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSk7aWYoaXRlbS5lZFN0YWNrLmxlbmd0aD49MjApaXRlbS5lZFN0YWNrLnNoaWZ0KCk7aXRlbS5lZFN0YWNrLnB1c2goe2RhdGE6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGN0eC5nZXRJbWFnZURhdGEoMCwwLGN2LndpZHRoLGN2LmhlaWdodCkuZGF0YSksbjppdGVtLmRyYWZ0Lmxlbmd0aH0pO3RyeXtjdi5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCl9Y2F0Y2goeCl7fWl0ZW0uZWRTdHJva2U9KGl0ZW0uZWRTdHJva2V8fDApKzE7aXRlbS5lZERvd249dHJ1ZTtpdGVtLmVkTGFzdD1udWxsO2VkQnJ1c2hNb3ZlKGl0ZW0sZSl9CmZ1bmN0aW9uIGVkQnJ1c2hNb3ZlKGl0ZW0sZSl7aWYoIWl0ZW0uZWREb3dufHwhaXRlbS5lZENhbnZhcylyZXR1cm47Y29uc3QgY3Y9aXRlbS5lZENhbnZhcyxjdHg9Y3YuZ2V0Q29udGV4dCgnMmQnLHt3aWxsUmVhZEZyZXF1ZW50bHk6dHJ1ZX0pLHA9ZWRQdChpdGVtLGUpLHB4PXAuZngqY3Yud2lkdGgscHk9cC5meSpjdi5oZWlnaHQscnI9aXRlbS5lZEJydXNoLzI7Y3R4LnNhdmUoKTtjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSdkZXN0aW5hdGlvbi1vdXQnO2N0eC5maWxsU3R5bGU9JyMwMDAnO2N0eC5zdHJva2VTdHlsZT0nIzAwMCc7Y3R4LmxpbmVDYXA9J3JvdW5kJztjdHgubGluZVdpZHRoPXJyKjI7aWYoaXRlbS5lZExhc3Qpe2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKGl0ZW0uZWRMYXN0LnB4LGl0ZW0uZWRMYXN0LnB5KTtjdHgubGluZVRvKHB4LHB5KTtjdHguc3Ryb2tlKCl9ZWxzZXtjdHguYmVnaW5QYXRoKCk7Y3R4LmFyYyhweCxweSxyciwwLE1hdGguUEkqMik7Y3R4LmZpbGwoKX1jdHgucmVzdG9yZSgpO2l0ZW0uZWRMYXN0PXtweCxweX07aXRlbS5kcmFmdC5wdXNoKHtiOjEsczppdGVtLmVkU3Ryb2tlLHg6cC5meCx5OnAuZnkscjpyci9jdi53aWR0aH0pfQpmdW5jdGlvbiBlZFJpbmdIaWRlKGl0ZW0pe2lmKGl0ZW0uZWRSaW5nRWwpaXRlbS5lZFJpbmdFbC5zdHlsZS5kaXNwbGF5PSdub25lJ30KZnVuY3Rpb24gZWRSaW5nKGl0ZW0sZSl7aWYoaXRlbS5lZFRvb2whPT0nYnJ1c2gnfHwhaXRlbS5lZENhbnZhc3x8ZS5wb2ludGVyVHlwZT09PSd0b3VjaCcpe2VkUmluZ0hpZGUoaXRlbSk7cmV0dXJufWxldCByaW5nPWl0ZW0uZWRSaW5nRWw7aWYoIXJpbmd8fCFyaW5nLmlzQ29ubmVjdGVkKXtyaW5nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3Jpbmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtyaW5nLnN0eWxlLmNzc1RleHQ9J3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MjE0NzQ4MzAwMDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjoxcHggc29saWQgI2ZmZjtib3gtc2hhZG93OjAgMCAwIDFweCAjMUYzNTREO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtkaXNwbGF5Om5vbmUnO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocmluZyk7aXRlbS5lZFJpbmdFbD1yaW5nfWNvbnN0IGN2PWl0ZW0uZWRDYW52YXMsYj1jdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPU1hdGgubWF4KDQsaXRlbS5lZEJydXNoKihiLndpZHRoL2N2LndpZHRoKSk7cmluZy5zdHlsZS53aWR0aD1yaW5nLnN0eWxlLmhlaWdodD1kKydweCc7cmluZy5zdHlsZS5sZWZ0PWUuY2xpZW50WCsncHgnO3Jpbmcuc3R5bGUudG9wPWUuY2xpZW50WSsncHgnO3Jpbmcuc3R5bGUuZGlzcGxheT0nYmxvY2snfQpmdW5jdGlvbiBlZEJydXNoRW5kKGl0ZW0pe2lmKCFpdGVtLmVkRG93bilyZXR1cm47aXRlbS5lZERvd249ZmFsc2U7aXRlbS5lZExhc3Q9bnVsbDtyZW5kZXIoKX0KZnVuY3Rpb24gZWRVbmRvKGl0ZW0pe2NvbnN0IHN0PWl0ZW0uZWRTdGFjay5wb3AoKTtpZighc3QpcmV0dXJuO2NvbnN0IGN2PWl0ZW0uZWRDYW52YXMsY3R4PWN2LmdldENvbnRleHQoJzJkJyk7Y3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKHN0LmRhdGEsY3Yud2lkdGgsY3YuaGVpZ2h0KSwwLDApO2l0ZW0uZHJhZnQubGVuZ3RoPXN0Lm47cmVuZGVyKCl9CmZ1bmN0aW9uIGVkWm9vbShpdGVtLGRpcil7Y29uc3QgY3Y9aXRlbS5lZENhbnZhcztpZighY3YpcmV0dXJuO2NvbnN0IGN1cj1pdGVtLmVkWm9vbXx8KGN2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoL2N2LndpZHRoKXx8MTtsZXQgejtpZihkaXI+MCl6PVpPT01TLmZpbmQodj0+dj5jdXIrMC4wMDEpfHxaT09NU1taT09NUy5sZW5ndGgtMV07ZWxzZSB6PVsuLi5aT09NU10ucmV2ZXJzZSgpLmZpbmQodj0+djxjdXItMC4wMDEpfHxaT09NU1swXTtpdGVtLmVkWm9vbT16O3JlbmRlcigpfQpmdW5jdGlvbiBlZGl0b3JGb3IoaXRlbSl7Y29uc3QgZWQ9ZWwoJ2RpdicsJ2NpbC1lZGl0b3InKSxjdj1pdGVtLmVkQ2FudmFzOwogY29uc3QgYnJ1c2g9aXRlbS5lZFRvb2w9PT0nYnJ1c2gnO2VkLmFwcGVuZChlbCgnc3Ryb25nJywnY2lsLWVkLXRpdGxlJywnUmVkaWdlcmEgYmFrZ3J1bmQnKSxlbCgncCcsJ2NpbC1zbWFsbCcsYnJ1c2g\/J0RyYSDDtnZlciBiaWxkZW4gZsO2ciBhdHQgc3VkZGEuIEFudsOkbmQgZGV0IGbDtnIgc23DpSBmbMOkY2thciBvY2gga2FudGVyIHNvbSDDpHIgc3bDpXJhIGF0dCBrbGlja2EgcMOlLic6J0tsaWNrYSBww6UgZXR0IG9tcsOlZGUgZsO2ciBhdHQgZ8O2cmEgZGV0IHRyYW5zcGFyZW50LiBPbXLDpWRlc3RvbGVyYW5zIGFuZ2VyIGh1ciBsaWthIGbDpHJnZXJuYSBtw6VzdGUgdmFyYS4gRGVuIHDDpXZlcmthciBiYXJhIGRpbmEga2xpY2sgaMOkciwgaW50ZSBkZW4gYXV0b21hdGlza2EgYm9ydHRhZ25pbmdlbiBvdmFuLicpKTsKIGNvbnN0IG1vZGVzPWVsKCdkaXYnLCdjaWwtZWQtbW9kZXMnKSxncnA9ZWwoJ2RpdicsJ2NpbC1lZC1ncm91cCcpO2dycC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdncm91cCcpO2dycC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdWZXJrdHlnJyk7Y29uc3QgSUNPPXtmaWxsOic8cGF0aCBkPSJtMTkgMTEtOC04LTguNiA4LjZhMiAyIDAgMCAwIDAgMi44bDUuMiA1LjJjLjguOCAyIC44IDIuOCAwTDE5IDExWiIvPjxwYXRoIGQ9Im01IDIgNSA1Ii8+PHBhdGggZD0iTTIgMTNoMTUiLz48cGF0aCBkPSJNMjIgMjBhMiAyIDAgMSAxLTQgMGMwLTEuNiAxLjctMi40IDItNCAuMyAxLjYgMiAyLjQgMiA0WiIvPicsYnJ1c2g6JzxwYXRoIGQ9Im03IDIxLTQuMy00LjNjLTEtMS0xLTIuNSAwLTMuNGw5LjYtOS42YzEtMSAyLjUtMSAzLjQgMGw1LjYgNS42YzEgMSAxIDIuNSAwIDMuNEwxMyAyMSIvPjxwYXRoIGQ9Ik0yMiAyMUg3Ii8+PHBhdGggZD0ibTUgMTEgOSA5Ii8+J307W1snZmlsbCcsJ1RhIGJvcnQgb21yw6VkZSddLFsnYnJ1c2gnLCdTdWRkZ3VtbWknXV0uZm9yRWFjaCgoW2ssdF0pPT57Y29uc3QgYj1lbCgnYnV0dG9uJywnY2lsLWVkLW1vZGUnKTtiLnR5cGU9J2J1dHRvbic7Yi50aXRsZT10O2Iuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyx0KTtiLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJyxpdGVtLmVkVG9vbD09PWs\/J3RydWUnOidmYWxzZScpO2IuaW5uZXJIVE1MPSc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4nK0lDT1trXSsnPC9zdmc+JztiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e2l0ZW0uZWRUb29sPWs7cmVuZGVyKCl9KTtncnAuYXBwZW5kKGIpfSk7bW9kZXMuYXBwZW5kKGdycCxlbCgnc3BhbicsJ2NpbC1lZC10b29sbmFtZScsYnJ1c2g\/J1N1ZGRndW1taSc6J1RhIGJvcnQgb21yw6VkZScpKTsKIGlmKGJydXNoKXtjb25zdCBibD1lbCgnbGFiZWwnLCdjaWwtZmllbGQgY2lsLXJhbmdlIGNpbC1lZC10b2wnKSxicT1lbCgnaW5wdXQnKSxidj1lbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ1N1ZGRndW1taXRzIHN0b3JsZWs6ICcraXRlbS5lZEJydXNoKycgcHgnKTticS50eXBlPSdyYW5nZSc7YnEubWluPScyJzticS5tYXg9JzEyMCc7YnEuc3RlcD0nMSc7YnEudmFsdWU9U3RyaW5nKGl0ZW0uZWRCcnVzaCk7YnEuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57YnYudGV4dENvbnRlbnQ9J1N1ZGRndW1taXRzIHN0b3JsZWs6ICcrYnEudmFsdWUrJyBweCc7aXRlbS5lZEJydXNoPU51bWJlcihicS52YWx1ZSk7Y29uc3QgY3Y9aXRlbS5lZENhbnZhcyxyaW5nPWl0ZW0uZWRSaW5nRWw7aWYoY3Ype2lmKCFyaW5nfHwhcmluZy5pc0Nvbm5lY3RlZCl7ZWRSaW5nKGl0ZW0se2NsaWVudFg6MCxjbGllbnRZOjAscG9pbnRlclR5cGU6J21vdXNlJ30pO31jb25zdCByZz1pdGVtLmVkUmluZ0VsLGI9Y3YuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLm1heCg0LGl0ZW0uZWRCcnVzaCooYi53aWR0aC9jdi53aWR0aCkpO3JnLnN0eWxlLndpZHRoPXJnLnN0eWxlLmhlaWdodD1kKydweCc7cmcuc3R5bGUubGVmdD0oYi5sZWZ0K2Iud2lkdGgvMikrJ3B4JztyZy5zdHlsZS50b3A9KGIudG9wK01hdGgubWluKGIuaGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodC1iLnRvcCkvMikrJ3B4JztyZy5zdHlsZS5kaXNwbGF5PSdibG9jayc7Y2xlYXJUaW1lb3V0KGl0ZW0uZWRSaW5nVCk7aXRlbS5lZFJpbmdUPXNldFRpbWVvdXQoKCk9PmVkUmluZ0hpZGUoaXRlbSksOTAwKX19KTtibC5hcHBlbmQoYnEsYnYpO21vZGVzLmFwcGVuZChibCl9CiBpZighYnJ1c2gpe2NvbnN0IHRsPWVsKCdsYWJlbCcsJ2NpbC1maWVsZCBjaWwtcmFuZ2UgY2lsLWVkLXRvbCcpLHE9ZWwoJ2lucHV0Jyksdj1lbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ09tcsOlZGVzdG9sZXJhbnM6ICcrKGl0ZW0uZWRUb2x8fDQwKSk7cS50eXBlPSdyYW5nZSc7cS5taW49JzUnO3EubWF4PScxMjAnO3Euc3RlcD0nMSc7cS52YWx1ZT1TdHJpbmcoaXRlbS5lZFRvbHx8NDApO3EuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57di50ZXh0Q29udGVudD0nT21yw6VkZXN0b2xlcmFuczogJytxLnZhbHVlO2l0ZW0uZWRUb2w9TnVtYmVyKHEudmFsdWUpfSk7dGwuYXBwZW5kKHEsdik7bW9kZXMuYXBwZW5kKHRsKX0KIGNvbnN0IGJhcj1lbCgnZGl2JywnY2lsLWVkLWJhcicpLHRiPSh0LGYsZGlzLGxhYik9Pntjb25zdCBiPWVsKCdidXR0b24nLCdjaWwtZWQtYnRuJyx0KTtiLnR5cGU9J2J1dHRvbic7aWYobGFiKWIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyxsYWIpO2IuZGlzYWJsZWQ9ISFkaXM7Yi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZik7cmV0dXJuIGJ9OwogY29uc3Qgej1pdGVtLmVkWm9vbTtiYXIuYXBwZW5kKHRiKCfiiJInLCgpPT5lZFpvb20oaXRlbSwtMSksIWN2LCdab29tYSB1dCcpLHRiKCcrJywoKT0+ZWRab29tKGl0ZW0sMSksIWN2LCdab29tYSBpbicpLHRiKCdBbnBhc3NhJywoKT0+e2l0ZW0uZWRab29tPTA7cmVuZGVyKCl9LCFjdnx8IXopLHRiKCcxMDAlJywoKT0+e2l0ZW0uZWRab29tPTE7cmVuZGVyKCl9LCFjdnx8ej09PTEpLGVsKCdzcGFuJywnY2lsLWVkLXpvb20nLGN2Pyh6P01hdGgucm91bmQoeioxMDApKyclJzonQW5wYXNzYScpOicnKSx0Yignw4VuZ3JhJywoKT0+ZWRVbmRvKGl0ZW0pLCFpdGVtLmVkU3RhY2subGVuZ3RoKSx0Yignw4V0ZXJzdMOkbGwnLCgpPT5vcGVuRWRpdG9yKGl0ZW0pLCFpdGVtLmVkU3RhY2subGVuZ3RoKSk7CiBjb25zdCByb3c9ZWwoJ2RpdicsJ2NpbC1lZC10b29sYmFyJyk7cm93LmFwcGVuZChtb2RlcyxiYXIpO2VkLmFwcGVuZChyb3cpOwogY29uc3Qgdmlldz1lbCgnZGl2JywnY2lsLWVkLXZpZXcnKTtpZihjdil7Y3Yuc3R5bGUuY3Vyc29yPWJydXNoPydub25lJzonY3Jvc3NoYWlyJztpZighYnJ1c2gpZWRSaW5nSGlkZShpdGVtKTtpZih6KXtjdi5zdHlsZS53aWR0aD1NYXRoLnJvdW5kKGN2LndpZHRoKnopKydweCc7Y3Yuc3R5bGUubWF4V2lkdGg9J25vbmUnO2N2LnN0eWxlLm1heEhlaWdodD0nbm9uZSc7dmlldy5kYXRhc2V0Lnpvb209JzEnfWVsc2V7Y3Yuc3R5bGUud2lkdGg9Jyc7Y3Yuc3R5bGUubWF4V2lkdGg9JzEwMCUnO2N2LnN0eWxlLm1heEhlaWdodD0nNDgwcHgnfXZpZXcuYXBwZW5kKGN2KX1lbHNlIHZpZXcuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJywnTGFkZGFy4oCmJykpO2VkLmFwcGVuZCh2aWV3KTsKIGNvbnN0IGZ0PWVsKCdkaXYnLCdjaWwtZWQtZm9vdCcpLGRvbmU9YnV0dG9uKCdLbGFyJywoKT0+e2VkUmluZ0hpZGUoaXRlbSk7aXRlbS5jbGlja3M9KGl0ZW0uY2xpY2tzfHxbXSkuY29uY2F0KGl0ZW0uZHJhZnQpO2l0ZW0uZWRpdGluZz1mYWxzZTtpdGVtLmVkQ2FudmFzPW51bGw7aXRlbS5lZFN0YWNrPVtdO29wdGltaXNlKGl0ZW0pfSwnJyxpdGVtLmlkKyctZWRkb25lJyk7ZG9uZS5kaXNhYmxlZD0hY3Y7Y29uc3QgY2FuY2VsPWVsKCdidXR0b24nLCdjaWwtYnRuLXRleHQnLCdBdmJyeXQnKTtjYW5jZWwudHlwZT0nYnV0dG9uJztjYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57ZWRSaW5nSGlkZShpdGVtKTtpdGVtLmVkaXRpbmc9ZmFsc2U7aXRlbS5lZENhbnZhcz1udWxsO2l0ZW0uZWRTdGFjaz1bXTtpdGVtLmRyYWZ0PVtdO3JlbmRlcigpfSk7CiBmdC5hcHBlbmQoZG9uZSxjYW5jZWwpO2VkLmFwcGVuZChmdCk7cmV0dXJuIGVkfQovKiAtLS0tLS0tLS0tIGJhY2tncm91bmQgcmVtb3ZhbDogZmxvb2QgZmlsbCBmcm9tIHRoZSBlZGdlcywgY29sb3VyIHRha2VuIGZyb20gdGhlIGNvcm5lcnMgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiByZW1vdmVCZyhjdHgsdyxoLHRvbCxjbGlja3MpewogY29uc3QgaW1nPWN0eC5nZXRJbWFnZURhdGEoMCwwLHcsaCksZD1pbWcuZGF0YSxuPXcqaDsKIGNvbnN0IGNzPVswLHctMSwoaC0xKSp3LG4tMV0uZmlsdGVyKHA9PmRbcCo0KzNdPjIwMCk7aWYoIWNzLmxlbmd0aClyZXR1cm4gZmFsc2U7CiBsZXQgbWl4ZWQ9ZmFsc2U7Zm9yKGNvbnN0IGEgb2YgY3MpZm9yKGNvbnN0IGIgb2YgY3MpaWYoTWF0aC5tYXgoTWF0aC5hYnMoZFthKjRdLWRbYio0XSksTWF0aC5hYnMoZFthKjQrMV0tZFtiKjQrMV0pLE1hdGguYWJzKGRbYSo0KzJdLWRbYio0KzJdKSk+NjApbWl4ZWQ9dHJ1ZTsKIGxldCBicj0wLGJnPTAsYmI9MDtjcy5mb3JFYWNoKHA9Pnticis9ZFtwKjRdO2JnKz1kW3AqNCsxXTtiYis9ZFtwKjQrMl19KTtici89Y3MubGVuZ3RoO2JnLz1jcy5sZW5ndGg7YmIvPWNzLmxlbmd0aDsKIGNvbnN0IGRpc3Q9cD0+TWF0aC5tYXgoTWF0aC5hYnMoZFtwKjRdLWJyKSxNYXRoLmFicyhkW3AqNCsxXS1iZyksTWF0aC5hYnMoZFtwKjQrMl0tYmIpKTsKIGNvbnN0IGRvbmU9bmV3IFVpbnQ4QXJyYXkobikscT1uZXcgVWludDMyQXJyYXkobik7bGV0IHFoPTAscXQ9MDsKIGNvbnN0IHB1c2g9cD0+e2lmKCFkb25lW3BdJiZkW3AqNCszXT4wJiZkaXN0KHApPD10b2wpe2RvbmVbcF09MTtxW3F0KytdPXB9fTsKIGZvcihsZXQgeD0wO3g8dzt4Kyspe3B1c2goeCk7cHVzaCgoaC0xKSp3K3gpfWZvcihsZXQgeT0wO3k8aDt5Kyspe3B1c2goeSp3KTtwdXNoKHkqdyt3LTEpfQogd2hpbGUocWg8cXQpe2NvbnN0IHA9cVtxaCsrXSx4PXAldztpZih4PjApcHVzaChwLTEpO2lmKHg8dy0xKXB1c2gocCsxKTtpZihwPj13KXB1c2gocC13KTtpZihwPG4tdylwdXNoKHArdyl9CiBjb25zdCBzdGFtcD0ocHgscHkscnIpPT57Y29uc3QgeDA9TWF0aC5tYXgoMCxNYXRoLmZsb29yKHB4LXJyKSkseDE9TWF0aC5taW4ody0xLE1hdGguY2VpbChweCtycikpLHkwPU1hdGgubWF4KDAsTWF0aC5mbG9vcihweS1ycikpLHkxPU1hdGgubWluKGgtMSxNYXRoLmNlaWwocHkrcnIpKTtmb3IobGV0IHk9eTA7eTw9eTE7eSsrKWZvcihsZXQgeD14MDt4PD14MTt4KyspaWYoKHgtcHgpKih4LXB4KSsoeS1weSkqKHktcHkpPD1ycipycilkb25lW3kqdyt4XT0xfTsKIGxldCBwcmV2Qj1udWxsOyhjbGlja3N8fFtdKS5mb3JFYWNoKGM9PntpZihjLmIpe2NvbnN0IHB4PWMueCp3LHB5PWMueSpoLHJyPU1hdGgubWF4KDAuNSxjLnIqdyk7aWYocHJldkImJnByZXZCLnM9PT1jLnMpe2NvbnN0IGR4PXB4LXByZXZCLnB4LGR5PXB5LXByZXZCLnB5LEw9TWF0aC5oeXBvdChkeCxkeSksc3Q9TWF0aC5tYXgoMSxNYXRoLmNlaWwoTC9NYXRoLm1heCgxLHJyLzIpKSk7Zm9yKGxldCBrPTE7azw9c3Q7aysrKXN0YW1wKHByZXZCLnB4K2R4Kmsvc3QscHJldkIucHkrZHkqay9zdCxycil9ZWxzZSBzdGFtcChweCxweSxycik7cHJldkI9e3M6Yy5zLHB4LHB5fTtyZXR1cm59cHJldkI9bnVsbDtjb25zdCBjeD1NYXRoLm1pbih3LTEsTWF0aC5tYXgoMCxNYXRoLnJvdW5kKGMueCp3KSkpLGN5PU1hdGgubWluKGgtMSxNYXRoLm1heCgwLE1hdGgucm91bmQoYy55KmgpKSksczA9Y3kqdytjeDtpZihkb25lW3MwXSlyZXR1cm47Y29uc3QgcjA9ZFtzMCo0XSxnMD1kW3MwKjQrMV0sYjA9ZFtzMCo0KzJdO2NvbnN0IGRjPXA9Pk1hdGgubWF4KE1hdGguYWJzKGRbcCo0XS1yMCksTWF0aC5hYnMoZFtwKjQrMV0tZzApLE1hdGguYWJzKGRbcCo0KzJdLWIwKSk7Y29uc3QgY3Q9Yy50fHx0b2wscGM9cD0+e2lmKCFkb25lW3BdJiZkW3AqNCszXT4wJiZkYyhwKTw9Y3Qpe2RvbmVbcF09MTtxW3F0KytdPXB9fTtwYyhzMCk7d2hpbGUocWg8cXQpe2NvbnN0IHA9cVtxaCsrXSx4PXAldztpZih4PjApcGMocC0xKTtpZih4PHctMSlwYyhwKzEpO2lmKHA+PXcpcGMocC13KTtpZihwPG4tdylwYyhwK3cpfX0pOwogZm9yKGxldCBwPTA7cDxuO3ArKylpZihkb25lW3BdKWRbcCo0KzNdPTA7CiBmb3IobGV0IHA9MDtwPG47cCsrKXtpZihkb25lW3BdKWNvbnRpbnVlO2NvbnN0IHg9cCV3O2lmKCEoKHg+MCYmZG9uZVtwLTFdKXx8KHg8dy0xJiZkb25lW3ArMV0pfHwocD49dyYmZG9uZVtwLXddKXx8KHA8bi13JiZkb25lW3Ard10pKSljb250aW51ZTtjb25zdCBrPWRpc3QocCk7aWYoazx0b2wqMilkW3AqNCszXT1NYXRoLnJvdW5kKGRbcCo0KzNdKihrLXRvbCkvdG9sKX0KIGxldCBlZGdlPTAsZWRnZURvbmU9MCxyZW1vdmVkPTA7Zm9yKGxldCBwPTA7cDxuO3ArKylpZihkb25lW3BdKXJlbW92ZWQrKzsKIGZvcihsZXQgeD0wO3g8dzt4Kyspe2Zvcihjb25zdCBwIG9mIFt4LChoLTEpKncreF0pe2VkZ2UrKztpZihkb25lW3BdKWVkZ2VEb25lKyt9fWZvcihsZXQgeT0xO3k8aC0xO3krKyl7Zm9yKGNvbnN0IHAgb2YgW3kqdyx5Kncrdy0xXSl7ZWRnZSsrO2lmKGRvbmVbcF0pZWRnZURvbmUrK319CiBjdHgucHV0SW1hZ2VEYXRhKGltZywwLDApOwogY29uc3QgZWRnZVNoYXJlPWVkZ2U\/ZWRnZURvbmUvZWRnZTowLHNoYXJlPXJlbW92ZWQvbjsKIGxldCBzdGF0dXM9J29rJztpZihzaGFyZTwwLjAyKXN0YXR1cz0nbm9uZSc7ZWxzZSBpZihzaGFyZT4wLjk3KXN0YXR1cz0nYWxsJztlbHNlIGlmKG1peGVkfHxlZGdlU2hhcmU8MC44NSlzdGF0dXM9J3BhcnRpYWwnOwogcmV0dXJuIHttaXhlZCxzdGF0dXMsZWRnZVNoYXJlLHNoYXJlfTsKfQovKiAtLS0tLS0tLS0tIFBORyBjb2xvdXIgcmVkdWN0aW9uIChsaWtlIFRpbnlQTkcgLyBDYW52YSBjb21wcmVzc2lvbikgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBwbmdDcmMoYil7bGV0IGM9fjA7Zm9yKGxldCBpPTA7aTxiLmxlbmd0aDtpKyspe2NePWJbaV07Zm9yKGxldCBrPTA7azw4O2srKyljPShjPj4+MSleKDB4RURCODgzMjAmLShjJjEpKX1yZXR1cm4gfmM+Pj4wfQpmdW5jdGlvbiBwbmdDaHVuayh0eXBlLGRhdGEpe2NvbnN0IG91dD1uZXcgVWludDhBcnJheSgxMitkYXRhLmxlbmd0aCksZHY9bmV3IERhdGFWaWV3KG91dC5idWZmZXIpO2R2LnNldFVpbnQzMigwLGRhdGEubGVuZ3RoKTtmb3IobGV0IGk9MDtpPDQ7aSsrKW91dFs0K2ldPXR5cGUuY2hhckNvZGVBdChpKTtvdXQuc2V0KGRhdGEsOCk7ZHYuc2V0VWludDMyKDgrZGF0YS5sZW5ndGgscG5nQ3JjKG91dC5zdWJhcnJheSg0LDgrZGF0YS5sZW5ndGgpKSk7cmV0dXJuIG91dH0KYXN5bmMgZnVuY3Rpb24gZGVmbGF0ZShieXRlcyl7Y29uc3QgY3M9bmV3IENvbXByZXNzaW9uU3RyZWFtKCdkZWZsYXRlJyk7Y29uc3Qgdz1jcy53cml0YWJsZS5nZXRXcml0ZXIoKTt3LndyaXRlKGJ5dGVzKTt3LmNsb3NlKCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXNwb25zZShjcy5yZWFkYWJsZSkuYXJyYXlCdWZmZXIoKSl9CmZ1bmN0aW9uIG1lZGlhbkN1dChkLG4pewogY29uc3Qgc3RlcD1NYXRoLm1heCgxLE1hdGguZmxvb3IoZC5sZW5ndGgvNC8yNTAwMDApKSxweD1bXTsKIGZvcihsZXQgaT0wO2k8ZC5sZW5ndGg7aSs9NCpzdGVwKXtjb25zdCBhPWRbaSszXTtpZihhPDgpY29udGludWU7cHgucHVzaChbZFtpXSxkW2krMV0sZFtpKzJdLGFdKX0KIGlmKCFweC5sZW5ndGgpcmV0dXJuIFtdOwogbGV0IGJveGVzPVtweF07CiB3aGlsZShib3hlcy5sZW5ndGg8bil7bGV0IGJpPS0xLGJlc3Q9MCxiYz0wOwogIGJveGVzLmZvckVhY2goKGIsaSk9PntpZihiLmxlbmd0aDwyKXJldHVybjtmb3IobGV0IGM9MDtjPDQ7YysrKXtsZXQgbG89MjU1LGhpPTA7Zm9yKGNvbnN0IHAgb2YgYil7aWYocFtjXTxsbylsbz1wW2NdO2lmKHBbY10+aGkpaGk9cFtjXX1jb25zdCBzYz0oaGktbG8pKk1hdGguc3FydChiLmxlbmd0aCk7aWYoc2M+YmVzdCl7YmVzdD1zYztiaT1pO2JjPWN9fX0pOwogIGlmKGJpPDB8fGJlc3Q9PT0wKWJyZWFrO2NvbnN0IGI9Ym94ZXNbYmldO2Iuc29ydCgoeCx5KT0+eFtiY10teVtiY10pO2NvbnN0IG09Yi5sZW5ndGg+PjE7Ym94ZXMuc3BsaWNlKGJpLDEsYi5zbGljZSgwLG0pLGIuc2xpY2UobSkpfQogcmV0dXJuIGJveGVzLm1hcChiPT57bGV0IHI9MCxnPTAsYmw9MCxhPTA7Zm9yKGNvbnN0IHAgb2YgYil7cis9cFswXTtnKz1wWzFdO2JsKz1wWzJdO2ErPXBbM119Y29uc3Qgaz1iLmxlbmd0aDtyZXR1cm4gW01hdGgucm91bmQoci9rKSxNYXRoLnJvdW5kKGcvayksTWF0aC5yb3VuZChibC9rKSxNYXRoLnJvdW5kKGEvayldfSk7Cn0KYXN5bmMgZnVuY3Rpb24gcXVhbnRQbmcoY3R4LHcsaCxuKXsKIGNvbnN0IGQ9Y3R4LmdldEltYWdlRGF0YSgwLDAsdyxoKS5kYXRhOwogbGV0IGhhc0NsZWFyPWZhbHNlO2ZvcihsZXQgaT0zO2k8ZC5sZW5ndGg7aSs9NClpZihkW2ldPDgpe2hhc0NsZWFyPXRydWU7YnJlYWt9CiBjb25zdCBwYWw9bWVkaWFuQ3V0KGQsaGFzQ2xlYXI\/bi0xOm4pO2lmKGhhc0NsZWFyKXBhbC51bnNoaWZ0KFswLDAsMCwwXSk7CiBpZighcGFsLmxlbmd0aClwYWwucHVzaChbMCwwLDAsMF0pOwogY29uc3QgY2FjaGU9bmV3IEludDE2QXJyYXkoMTw8MjApLmZpbGwoLTEpLHN0YXJ0PWhhc0NsZWFyPzE6MDsKIGNvbnN0IHJhdz1uZXcgVWludDhBcnJheSgodysxKSpoKTsKIGZvcihsZXQgeT0wLG89MCxpPTA7eTxoO3krKyl7cmF3W28rK109MDtmb3IobGV0IHg9MDt4PHc7eCsrLGkrPTQpewogIGNvbnN0IGE9ZFtpKzNdO2xldCBpZHg7CiAgaWYoYTw4JiZoYXNDbGVhcilpZHg9MDtlbHNle2NvbnN0IGtleT0oKGRbaV0+PjMpPDwxNSl8KChkW2krMV0+PjMpPDwxMCl8KChkW2krMl0+PjMpPDw1KXwoYT4+Myk7aWR4PWNhY2hlW2tleV07CiAgIGlmKGlkeDwwKXtsZXQgYmQ9MWU5O2ZvcihsZXQgcD1zdGFydDtwPHBhbC5sZW5ndGg7cCsrKXtjb25zdCBxPXBhbFtwXSxkcj1xWzBdLWRbaV0sZGc9cVsxXS1kW2krMV0sZGI9cVsyXS1kW2krMl0sZGE9cVszXS1hLGRkPWRyKmRyKjIrZGcqZGcqNCtkYipkYitkYSpkYSozO2lmKGRkPGJkKXtiZD1kZDtpZHg9cH19Y2FjaGVba2V5XT1pZHh9fQogIHJhd1tvKytdPWlkeH19CiBjb25zdCBpaGRyPW5ldyBVaW50OEFycmF5KDEzKSxkdj1uZXcgRGF0YVZpZXcoaWhkci5idWZmZXIpO2R2LnNldFVpbnQzMigwLHcpO2R2LnNldFVpbnQzMig0LGgpO2loZHJbOF09ODtpaGRyWzldPTM7CiBjb25zdCBwbHRlPW5ldyBVaW50OEFycmF5KHBhbC5sZW5ndGgqMyk7cGFsLmZvckVhY2goKHAsaSk9PntwbHRlW2kqM109cFswXTtwbHRlW2kqMysxXT1wWzFdO3BsdGVbaSozKzJdPXBbMl19KTsKIGxldCBsYXN0PS0xO3BhbC5mb3JFYWNoKChwLGkpPT57aWYocFszXSE9PTI1NSlsYXN0PWl9KTsKIGNvbnN0IHBhcnRzPVtuZXcgVWludDhBcnJheShbMTM3LDgwLDc4LDcxLDEzLDEwLDI2LDEwXSkscG5nQ2h1bmsoJ0lIRFInLGloZHIpLHBuZ0NodW5rKCdQTFRFJyxwbHRlKV07CiBpZihsYXN0Pj0wKXBhcnRzLnB1c2gocG5nQ2h1bmsoJ3RSTlMnLG5ldyBVaW50OEFycmF5KHBhbC5zbGljZSgwLGxhc3QrMSkubWFwKHA9PnBbM10pKSkpOwogcGFydHMucHVzaChwbmdDaHVuaygnSURBVCcsYXdhaXQgZGVmbGF0ZShyYXcpKSxwbmdDaHVuaygnSUVORCcsbmV3IFVpbnQ4QXJyYXkoMCkpKTsKIHJldHVybiBuZXcgQmxvYihwYXJ0cyx7dHlwZTonaW1hZ2UvcG5nJ30pOwp9CmNvbnN0IENBTl9RVUFOVD10eXBlb2YgQ29tcHJlc3Npb25TdHJlYW09PT0nZnVuY3Rpb24nOwphc3luYyBmdW5jdGlvbiBvcHRpbWlzZShpdGVtKXsKIGlmKCFjYW5PcHRpbWlzZShpdGVtKSlyZXR1cm47Y29uc3QgcmV2PSsraXRlbS5yZXY7aXRlbS5yZXN1bHQ9bnVsbDtkcm9wVXJsKGl0ZW0sJ3JlcycpO2l0ZW0uYnVzeT10cnVlO3JlbmRlcigpOwogbGV0IHNyYz1udWxsLGNhbnZhcz1udWxsOwogdHJ5ewogIGxldCBvdXQ9b3V0VHlwZShpdGVtKSxyZWFzb249Jyc7Y29uc3QgdD10YXJnZXRTaXplKGl0ZW0pOwogIGlmKGl0ZW0udHlwZT09PSdpbWFnZS9zdmcreG1sJyl7dHJ5e3NyYz1hd2FpdCBsb2FkSW1nKHN2Z0Jsb2IoaXRlbS5zdmcsdC53LHQuaCkpfWNhdGNoKGUpe3Rocm93IEVycm9yKCdEaW4gd2ViYmzDpHNhcmUga3VuZGUgaW50ZSB2aXNhIGRlbm5hIFNWRy4gRGVuIGFudsOkbmRlciBrYW5za2UgZnVua3Rpb25lciBzb20gaW50ZSBrYW4gcml0YXMgc29tIGVuIGJpbGQuJyl9fQogIGVsc2Ugc3JjPWF3YWl0IGRlY29kZVJhc3RlcihpdGVtLmZpbGUpOwogIGlmKG91dD09PSdhdXRvJyl7Y29uc3QgYT1pdGVtLnR5cGU9PT0naW1hZ2UvanBlZyc\/e2FscGhhOmZhbHNlLHBob3RvOnRydWV9OmFuYWx5c2Uoc3JjLnNvdXJjZSx0LncsdC5oKTsKICAgaWYoIWF8fGEuYWxwaGEpe291dD0naW1hZ2UvcG5nJztyZWFzb249YT8nU3BhcmFkIHNvbSBQTkcgZsO2ciBhdHQgYmVow6VsbGEgdHJhbnNwYXJlbnNlbi4nOicnfQogICBlbHNlIGlmKCFhLnBob3RvKXtvdXQ9J2ltYWdlL3BuZyc7cmVhc29uPSdTcGFyYWQgc29tIFBORyBlZnRlcnNvbSBkZW4gc2VyIHV0IHNvbSBlbiBncmFmaWsgZWxsZXIgbG9nb3R5cCBtZWQgZsOlIGbDpHJnZXIuJ30KICAgZWxzZXtvdXQ9J2ltYWdlL2pwZWcnO3JlYXNvbj1pdGVtLnR5cGU9PT0naW1hZ2UvanBlZyc\/J0JlaMOlbGxlbiBzb20gSlBHLCBzb20gcGFzc2FyIGZvdG9uIG9jaCBiaWxkZXIgdXRhbiB0cmFuc3BhcmVucy4nOidTcGFyYWQgc29tIEpQRyBlZnRlcnNvbSBkZW4gc2VyIHV0IHNvbSBldHQgZm90byB1dGFuIHRyYW5zcGFyZW5zLid9fQogIGlmKGl0ZW0udHJhbnNwJiYhaXRlbS5hbmltYXRlZCl7b3V0PSdpbWFnZS9wbmcnO3JlYXNvbj0nU3BhcmFkIHNvbSBQTkcgZsO2ciBhdHQgYmVow6VsbGEgZGVuIHRyYW5zcGFyZW50YSBiYWtncnVuZGVuLid9CiAgY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2NhbnZhcy53aWR0aD10Lnc7Y2FudmFzLmhlaWdodD10Lmg7CiAgY29uc3QgY3R4PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2lmKCFjdHgpdGhyb3cgRXJyb3IoJ0JpbGRiZWhhbmRsaW5nIMOkciBpbnRlIHRpbGxnw6RuZ2xpZyBpIGRlbiBow6RyIHdlYmJsw6RzYXJlbi4nKTsKICBpZihvdXQ9PT0naW1hZ2UvanBlZycpe2N0eC5maWxsU3R5bGU9JyNmZmYnO2N0eC5maWxsUmVjdCgwLDAsdC53LHQuaCl9CiAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZD10cnVlO2N0eC5pbWFnZVNtb290aGluZ1F1YWxpdHk9J2hpZ2gnO2N0eC5kcmF3SW1hZ2Uoc3JjLnNvdXJjZSwwLDAsdC53LHQuaCk7CiAgbGV0IGJnTWl4ZWQ9bnVsbDtpZihpdGVtLnRyYW5zcCYmIWl0ZW0uYW5pbWF0ZWQpYmdNaXhlZD1yZW1vdmVCZyhjdHgsdC53LHQuaCxpdGVtLnRvbHx8NDAsaXRlbS5jbGlja3MpfHx7c3RhdHVzOidub25lJ307CiAgbGV0IGJsb2I7CiAgaWYob3V0PT09J2ltYWdlL3BuZycmJkNBTl9RVUFOVCYmaXRlbS5jb2xvdXJzPjApe3RyeXtibG9iPWF3YWl0IHF1YW50UG5nKGN0eCx0LncsdC5oLGl0ZW0uY29sb3Vycyl9Y2F0Y2goZSl7YmxvYj1udWxsfX0KICBpZighYmxvYilibG9iPWF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pnt0cnl7Y2FudmFzLnRvQmxvYihiPT5iP3Jlc29sdmUoYik6cmVqZWN0KEVycm9yKCdEaW4gd2ViYmzDpHNhcmUga3VuZGUgaW50ZSBza2FwYSBiaWxkZW4uIERlbiDDpHIga2Fuc2tlIGbDtnIgc3RvciBmw7ZyIHRpbGxnw6RuZ2xpZ3QgbWlubmUuJykpLG91dCxpdGVtLnF1YWxpdHkvMTAwKX1jYXRjaChlKXtyZWplY3QoZSYmZS5uYW1lPT09J1NlY3VyaXR5RXJyb3InP0Vycm9yKCdEaW4gd2ViYmzDpHNhcmUgYmxvY2tlcmFkZSBrb252ZXJ0ZXJpbmdlbiBhdiBkZW5uYSBTVkcuIEV4cG9ydGVyYSBkZW4gc29tIFBORyBmcsOlbiBkaXR0IGRlc2lnbnByb2dyYW0gaSBzdMOkbGxldC4nKTplKX19KTsKICBpZihibG9iLnR5cGUhPT1vdXQpdGhyb3cgRXJyb3IoJ0RpbiB3ZWJibMOkc2FyZSBrYW4gaW50ZSBza2FwYSAnK3R5cGVMYWJlbChvdXQpKyctZmlsZXIuJyk7CiAgY29uc3Qga2VwdD0haXRlbS50cmFuc3AmJkNNX0FDQ0VQVEVELmluY2x1ZGVzKGl0ZW0udHlwZSkmJiFpdGVtLm1pc21hdGNoJiZ0Lnc9PT1pdGVtLndpZHRoJiZ0Lmg9PT1pdGVtLmhlaWdodCYmYmxvYi5zaXplPj1pdGVtLmZpbGUuc2l6ZSYmKGl0ZW0ub3V0cHV0PT09J2F1dG8nfHxvdXQ9PT1pdGVtLnR5cGUpLGNob3Nlbj1rZXB0P2l0ZW0uZmlsZTpibG9iOwogIGNvbnN0IGNyYz1jcmMzMihuZXcgVWludDhBcnJheShhd2FpdCBjaG9zZW4uYXJyYXlCdWZmZXIoKSkpOwogIGlmKHJldiE9PWl0ZW0ucmV2fHwhYWxpdmUoaXRlbSkpcmV0dXJuOwogIGl0ZW0ucmVzdWx0PXtibG9iOmNob3NlbixjcmMsdHlwZTprZXB0P2l0ZW0udHlwZTpvdXQsd2lkdGg6dC53LGhlaWdodDp0Lmgsa2VwdE9yaWdpbmFsOmtlcHQsdHJpZWRTaXplOmJsb2Iuc2l6ZSxiZ01peGVkLHJlYXNvbixuYW1lOmtlcHQ\/c2FmZUJhc2UoaXRlbS5maWxlLm5hbWUpKycuJysoZXh0T2YoaXRlbS5maWxlLm5hbWUpfHxUWVBFU1tpdGVtLnR5cGVdWzFdKTpzYWZlQmFzZShpdGVtLmZpbGUubmFtZSkrJy1vcHRpbWlzZWQuJytUWVBFU1tvdXRdWzFdfTsKICBpdGVtLmNvbXBhcmU9dHJ1ZTt0cmFjaygnb3B0aW1pc2UnKTsKICBzdGF0dXMoa2VwdD9pdGVtLmZpbGUubmFtZSsnIMOkciByZWRhbiB2w6RsIG9wdGltZXJhZC4gT3JpZ2luYWxmaWxlbiBoYXIgYmVow6VsbGl0cy4nOidCaWxkZW4gw6RyIGtsYXI6ICcraXRlbS5yZXN1bHQubmFtZSk7CiB9Y2F0Y2goZSl7aWYocmV2PT09aXRlbS5yZXYmJmFsaXZlKGl0ZW0pKXN0YXR1cygnS3VuZGUgaW50ZSBvcHRpbWVyYSAnK2l0ZW0uZmlsZS5uYW1lKyc6ICcrKGUmJmUubWVzc2FnZT9lLm1lc3NhZ2U6J29rw6RudCBmZWwnKSl9CiBmaW5hbGx5e2lmKHNyYylzcmMucmVsZWFzZSgpO2lmKGNhbnZhcyl7Y2FudmFzLndpZHRoPTA7Y2FudmFzLmhlaWdodD0wfWlmKHJldj09PWl0ZW0ucmV2KWl0ZW0uYnVzeT1mYWxzZTtpZihhbGl2ZShpdGVtKSlyZW5kZXIoKX0KfQovKiAtLS0tLS0tLS0tIHJlbmRlcmluZyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIGVsKHRhZyxjbHMsdHh0KXtjb25zdCB4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtpZihjbHMpeC5jbGFzc05hbWU9Y2xzO2lmKHR4dCE9PXVuZGVmaW5lZCl4LnRleHRDb250ZW50PXR4dDtyZXR1cm4geH0KY29uc3Qgb3BlblRpcHM9bmV3IFNldCgpOwpjb25zdCBjYW5Ib3Zlcj13aW5kb3cubWF0Y2hNZWRpYSYmbWF0Y2hNZWRpYSgnKGhvdmVyOiBob3ZlcikgYW5kIChwb2ludGVyOiBmaW5lKScpLm1hdGNoZXM7CmZ1bmN0aW9uIGhlbHBUaXAodGV4dCxrZXkpe2NvbnN0IHc9ZWwoJ3NwYW4nLCdjaWwtdGlwd3JhcCcpLGI9ZWwoJ2J1dHRvbicsJ2NpbC10aXBidG4nLCc\/JykscD1lbCgnc3BhbicsJ2NpbC10aXB0ZXh0IGNpbC10aXBwb3AnLHRleHQpO2IudHlwZT0nYnV0dG9uJztiLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ01lciBpbmZvcm1hdGlvbicpO2NvbnN0IHNldD1vPT57cC5oaWRkZW49IW87Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLFN0cmluZyhvKSl9O3NldCghY2FuSG92ZXImJm9wZW5UaXBzLmhhcyhrZXkpKTsKIGlmKGNhbkhvdmVyKXt3LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCgpPT5zZXQodHJ1ZSkpO3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsKCk9PntpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09YilzZXQoZmFsc2UpfSk7Yi5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsKCk9PnNldCh0cnVlKSk7Yi5hZGRFdmVudExpc3RlbmVyKCdibHVyJywoKT0+c2V0KGZhbHNlKSk7Yi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+e2UucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpfSl9CiBlbHNlIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGU9PntlLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKTtjb25zdCBvPXAuaGlkZGVuO3NldChvKTtpZihvKW9wZW5UaXBzLmFkZChrZXkpO2Vsc2Ugb3BlblRpcHMuZGVsZXRlKGtleSl9KTsKIHcuYXBwZW5kKGIscCk7cmV0dXJuIHd9CmZ1bmN0aW9uIGZpZWxkSGVscCh0ZXh0LGNvbnRyb2wsaGVscCxrZXkpe2NvbnN0IGQ9ZWwoJ2RpdicsJ2NpbC1maWVsZCcpLGg9ZWwoJ3NwYW4nLCdjaWwtbGFiZWwnLHRleHQpO3tjb25zdCB0dz1oZWxwVGlwKGhlbHAsa2V5KTt0dy5jbGFzc0xpc3QuYWRkKCdjaWwtdGlwLWxlZnQnKTtoLmFwcGVuZCh0dyl9Y29udHJvbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLHRleHQpO2QuYXBwZW5kKGgsY29udHJvbCk7cmV0dXJuIGR9CmZ1bmN0aW9uIGZpZWxkKHRleHQsY29udHJvbCl7Y29uc3QgbD1lbCgnbGFiZWwnLCdjaWwtZmllbGQnKTtsLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1sYWJlbCcsdGV4dCksY29udHJvbCk7cmV0dXJuIGx9CmZ1bmN0aW9uIHNlbGVjdChvcHRzLHZhbHVlLGZpZCxvbkNoYW5nZSl7Y29uc3Qgcz1lbCgnc2VsZWN0Jyk7cy5kYXRhc2V0LmY9ZmlkO29wdHMuZm9yRWFjaCgoW3YsdF0pPT57Y29uc3Qgbz1lbCgnb3B0aW9uJyxudWxsLHQpO28udmFsdWU9djtzLmFwcGVuZChvKX0pO3MudmFsdWU9dmFsdWU7cy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT5vbkNoYW5nZShzLnZhbHVlKSk7cmV0dXJuIHN9CmZ1bmN0aW9uIGJ1dHRvbih0ZXh0LGZuLGNscyxmaWQpe2NvbnN0IGI9ZWwoJ2J1dHRvbicsJ2NpbC1idG4nKyhjbHM\/JyAnK2NsczonJyksdGV4dCk7Yi50eXBlPSdidXR0b24nO2lmKGZpZCliLmRhdGFzZXQuZj1maWQ7Yi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZm4pO3JldHVybiBifQpmdW5jdGlvbiBtZXRyaWMobmFtZSx2YWx1ZSl7Y29uc3QgZD1lbCgnZGl2JywnY2lsLW1ldHJpYycpO2QuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJyxuYW1lKSxlbCgnYicsbnVsbCx2YWx1ZSkpO3JldHVybiBkfQpjb25zdCBJTkZPX1RZUEU9eycnOidnb29kLXRvLWtub3cnLHdhcm46J2Nhbm5vdC1iZS11bmRvbmUnLGFsZXJ0OidjYW5ub3QtYmUtdW5kb25lJyxlcnJvcjonY2Fubm90LWJlLXVuZG9uZScsc3VjY2VzczondGlwJyxuZXV0cmFsOidnb29kLXRvLWtub3cnfTsKZnVuY3Rpb24gaGludChjYXJkLHRleHQsdG9uZSl7Y29uc3QgZD1lbCgnZGl2JywnY2lsLWhpbnQgY21hYy1pbmZvIGNtYWMtaW5mby0nK0lORk9fVFlQRVt0b25lfHwnJ10rKHRvbmU\/JyBjaWwtJyt0b25lOicnKSksaT1lbCgnc3BhbicsJ2NtYWMtaW5mby1pY29uJyksYj1lbCgnZGl2JywnY21hYy1pbmZvLWJvZHknKSxjPWVsKCdkaXYnLCdjbWFjLWluZm8tY29udGVudCcsdGV4dCk7aS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywndHJ1ZScpO2IuYXBwZW5kKGMpO2QuYXBwZW5kKGksYik7Y2FyZC5hcHBlbmQoZCl9CmZ1bmN0aW9uIGJnSGludChjYXJkLHJlcCl7aWYoIXJlcHx8cmVwLnN0YXR1cz09PSdvaycpcmV0dXJuO2NvbnN0IG1zZz17bm9uZTonQmFrZ3J1bmRlbiBrdW5kZSBpbnRlIHRhcyBib3J0LiBWZXJrdHlnZXQgdGFyIGJhcmEgYm9ydCBlbiBlbmbDpHJnYWQgYmFrZ3J1bmQgc29tIG7DpXIgYmlsZGVucyBrYW50ZXIsIHRpbGwgZXhlbXBlbCB2aXR0IGJha29tIGVuIGxvZ290eXAuJyxwYXJ0aWFsOidCYWtncnVuZGVuIHRvZ3MgYmFyYSBib3J0IGRlbHZpcy4gQmlsZGVucyBrYW50ZXIgaGFyIG1lciDDpG4gZW4gZsOkcmcsIHZpbGtldCBvZnRhc3QgYmV0eWRlciBhdHQgZGV0IMOkciBldHQgZm90byBlbGxlciBoYXIgZW4gc2t1Z2dhIGVsbGVyIHRvbmluZy4gUHJvdmEgZW4gaMO2Z3JlIHRvbGVyYW5zLicsYWxsOidOw6RzdGFuIGhlbGEgYmlsZGVuIHRvZ3MgYm9ydCwgZWZ0ZXJzb20gYmlsZGVuIHRpbGwgc3TDtnJzdGEgZGVsZW4gaGFyIHNhbW1hIGbDpHJnIHNvbSBiYWtncnVuZGVuLiBTw6RuayB0b2xlcmFuc2VuLid9W3JlcC5zdGF0dXNdO2hpbnQoY2FyZCxtc2cscmVwLnN0YXR1cz09PSdwYXJ0aWFsJz8nd2Fybic6J2FsZXJ0Jyk7Y29uc3QgYm94PWNhcmQubGFzdENoaWxkLnF1ZXJ5U2VsZWN0b3IoJy5jbWFjLWluZm8tY29udGVudCcpO2JveC5hcHBlbmQoJyBGw7ZyIGZvdG9uIG9jaCBtZXIga29tcGxleGEgYmlsZGVyIGthbiBkdSBhbnbDpG5kYSBldHQgQUktdmVya3R5ZyBmw7ZyIGF0dCB0YSBib3J0IGJha2dydW5kZXIsIHRpbGwgZXhlbXBlbCAnKTtjb25zdCBhPWVsKCdhJyxudWxsLCdyZW1vdmUuYmcnKTthLmhyZWY9J2h0dHBzOi8vd3d3LnJlbW92ZS5iZy8nO2EudGFyZ2V0PSdfYmxhbmsnO2EucmVsPSdub29wZW5lciBub3JlZmVycmVyJztib3guYXBwZW5kKGEsJy4nKX0KZnVuY3Rpb24gZm9ybWF0VGV4dChpdGVtKXtsZXQgdD10eXBlTGFiZWwoaXRlbS50eXBlKTtpZihpdGVtLnR5cGU9PT0naW1hZ2UvZ2lmJyl0Kz1pdGVtLmFuaW1hdGVkPycgKGFuaW1lcmFkLCAnK2l0ZW0uZnJhbWVzKycgYmlsZHJ1dG9yKSc6aXRlbS5mcmFtZXM9PT0xPycgKHN0YXRpc2spJzonJztlbHNlIGlmKGl0ZW0uYW5pbWF0ZWQpdCs9JyAoYW5pbWVyYWQpJztyZXR1cm4gdH0KZnVuY3Rpb24gYWR2aWNlRm9yKGNhcmQsaXRlbSl7CiBpZihpdGVtLmxvYWRpbmcpe2hpbnQoY2FyZCwnTMOkc2VyIGJpbGTigKYnKTtyZXR1cm59CiBpZihpdGVtLm1pc21hdGNoKWhpbnQoY2FyZCwoaXRlbS5jbGFpbWVkPydGaWxuYW1uZXQgYW5nZXIgJyt0eXBlTGFiZWwoaXRlbS5jbGFpbWVkKSsnLCBtZW4gZmlsZW5zIGlubmVow6VsbCDDpHIgJyt0eXBlTGFiZWwoaXRlbS50eXBlKSsnLic6J0ZpbG5hbW5ldCBoYXIgaW5nZW4ga8OkbmQgZmlsw6RuZGVsc2UgZsO2ciBiaWxkZXIuIElubmVow6VsbGV0IMOkciAnK3R5cGVMYWJlbChpdGVtLnR5cGUpKycuJykrJyBDb25mZXJlbmNlIE1hbmFnZXIga2FuIGF2dmlzYSBkZW4gZWxsZXIgdmlzYSBkZW4gZmVsLiBLb252ZXJ0ZXJhIGRlbiBuZWRhbiwgZWxsZXIgc3BhcmEgZGVuIGlnZW4gbWVkIHLDpHR0IGZpbMOkbmRlbHNlLicsJ3dhcm4nKTsKIGlmKCFDTV9BQ0NFUFRFRC5pbmNsdWRlcyhpdGVtLnR5cGUpKWhpbnQoY2FyZCx0eXBlTGFiZWwoaXRlbS50eXBlKSsnLWZpbGVyIGthbiBpbnRlIGxhZGRhcyB1cHAgdGlsbCBtZWRpZWFya2l2ZXQgaSBDb25mZXJlbmNlIE1hbmFnZXIuIEtvbnZlcnRlcmEgdGlsbCBKUEcgZWxsZXIgUE5HLicrKGFyZWE9PT0nZW1haWwnJiYoaXRlbS50eXBlPT09J2ltYWdlL3dlYnAnfHxpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcpPycgQmlsZCAoVVJMKSBrYW4gdmlzYSBlbiBleHRlcm50IGxhZ3JhZCAnK3R5cGVMYWJlbChpdGVtLnR5cGUpKyctZmlsIGkgcmVkaWdlcmFyZW4sIG1lbiBtb3R0YWdhcm5hcyBlLXBvc3Rwcm9ncmFtIHZpc2FyIGRlbiBrYW5za2UgaW50ZS4nOicnKSwnd2FybicpOwogaWYoaXRlbS5lcnJvcil7aGludChjYXJkLGl0ZW0uZXJyb3IsJ2Vycm9yJyk7cmV0dXJufQogY29uc3QgUj1pdGVtLnJlc3VsdCYmIWl0ZW0ucmVzdWx0LmtlcHRPcmlnaW5hbD9pdGVtLnJlc3VsdDpudWxsLFNaPVI\/Ui5ibG9iLnNpemU6aXRlbS5maWxlLnNpemUscmVjPXN1Z2dlc3RlZChpdGVtKSxzdmc9IVImJml0ZW0udHlwZT09PSdpbWFnZS9zdmcreG1sJyxXPVI\/Ui53aWR0aDppdGVtLndpZHRoLGV4YWN0PWlzRXhhY3QoaXRlbSkmJiEhcmVjLGNvbD1pc0NvbHVtbihpdGVtKSYmISFyZWMmJiFzdmcsYmlnPXJlYyYmIWV4YWN0JiYhY29sJiZXPnJlYyoyOwogY29uc3Qgc2l6ZVR4dD1TWj5NQj8nRmlsZW4gw6RyICcrKGJpZz8nb2Nrc8OlICc6JycpKydnYW5za2Egc3RvciAoJytmbXQoU1opKycpLiDDlnZlcnbDpGcgYXR0IGtvbXByaW1lcmEgZGVuLCBlZnRlcnNvbSBzdG9yYSBiaWxkZmlsZXIga2FuICcrKGFyZWE9PT0nZW1haWwnPydww6V2ZXJrYSBsYWRkbmluZ3N0aWRlbiwgdXRza2lja2V0IG9jaCBpIHZpc3NhIGZhbGwgbGV2ZXJhbnNlbiBhdiBlLXBvc3RtZWRkZWxhbmRldC4nOidnw7ZyYSBkaW4gd2ViYnBsYXRzIGzDpW5nc2FtbWFyZSwgc8OkcnNraWx0IHDDpSBtb2JpbGEgZW5oZXRlci4nKTpTWj41MDAqS0I\/J0ZpbGVuIMOkciAnKyhiaWc\/J29ja3PDpSAnOicnKSsncmVsYXRpdnQgc3RvciAoJytmbXQoU1opKycpLiBEdSBrYW4gw7Z2ZXJ2w6RnYSBhdHQga29tcHJpbWVyYSBkZW4uJzpTWj4wPydGaWxzdG9ybGVrZW4gKCcrZm10KFNaKSsnKSDDpHIgYnJhLic6Jyc7CiBsZXQgZGltPScnLGx2PTA7CiBpZighcmVjKWx2PS0xLGRpbT1pc0N1c3RvbVdpZHRoKGl0ZW0pPydBbmdlIGJpbGRicmVkZGVuIGkgcHggZsO2ciBhdHQgasOkbWbDtnJhIGRlbiBtZWQgYmlsZGVuLic6YXJlYT09PSd3ZWJzaXRlJyYmaXRlbS53UGxhY2VtZW50PT09J25vbmUnPydWw6RsaiBlbiBwbGFjZXJpbmcgZsO2ciBhdHQgc2UgZW4gcmVrb21tZW5kZXJhZCBicmVkZC4nOidEZXQgZmlubnMgaW5nZW4gc8OkcnNraWxkIHJla29tbWVuZGVyYWQgYnJlZGQgZsO2ciBkZW4gaMOkciBwbGFjZXJpbmdlbi4nOwogZWxzZSBpZihleGFjdCl7CiAgaWYoVz09PXJlYyl7bHY9MDtkaW09J1LDpHR0IGJyZWRkOiBwbGFjZXJpbmdlbiBrcsOkdmVyICcrcmVjKycgcHgsIG9jaCBiaWxkZW4gw6RyICcrVysnIHB4IGJyZWQuJ30KICBlbHNlIGlmKHN2ZylkaW09J1BsYWNlcmluZ2VuIGtyw6R2ZXIgZXhha3QgJytyZWMrJyBweC4gVsOkbGogRXhha3QgJytyZWMrJyBweCB1bmRlciBCaWxkbcOldHQuIFNWRyBrYW4ga29udmVydGVyYXMgaSB2YWxmcmkgYnJlZGQgdXRhbiBhdHQgYmxpIG9za2FycC4nOwogIGVsc2V7bHY9MztkaW09J0ZlbCBicmVkZCBmw7ZyIGRlbiBow6RyIHBsYWNlcmluZ2VuOiBiaWxkZW4gw6RyICcrVysnIHB4IGJyZWQsIG9jaCBwbGFjZXJpbmdlbiBrcsOkdmVyIGV4YWt0ICcrcmVjKycgcHguIEJpbGRlciBzb20gw6RyIGbDtnIgc21hbGEgZWxsZXIgZsO2ciBicmVkYSB2aXNhcyBrYW5za2UgaW50ZSBzb20gdMOkbmt0IGkgV2ViYmRlc2lnbmVyLiAnKyhXPHJlYyowLjk\/J0FudsOkbmQgZW4gc3TDtnJyZSBiaWxkIHNvbSDDpHIgbWluc3QgJytyZWMrJyBweCBicmVkLiBPbSBiaWxkZW4gZsO2cnN0b3JhcyBibGlyIGRlbiBtaW5kcmUgc2thcnAsIHPDpSBkZXQgcmVrb21tZW5kZXJhciB2aSBpbnRlLic6J1bDpGxqIEV4YWt0ICcrcmVjKycgcHggdW5kZXIgQmlsZG3DpXR0IG9jaCBrbGlja2EgcMOlIE9wdGltZXJhIC8ga29udmVydGVyYS4gQmFyYSBicmVkZGVuIMOkbmRyYXMsIGJpbGRlbiBiZXNrw6RycyBpbnRlLicrKFc8cmVjPycgQmlsZGVuIGbDtnJzdG9yYXMgbsOlZ290LCB2aWxrZXQgb2Z0YXN0IGludGUgc3lucy4nOicnKSl9CiB9CiBlbHNlIGlmKGNvbCl7CiAgaWYoTWF0aC5hYnMoVy1yZWMpPD01KXtsdj0wO2RpbT0nQnJhIGJyZWRkOiBjaXJrYSAnK3JlYysnIHB4IHJla29tbWVuZGVyYXMgZsO2ciBkZW4gaMOkciBrb2x1bW5sYXlvdXRlbiwgb2NoIGJpbGRlbiDDpHIgJytXKycgcHggYnJlZC4nfQogIGVsc2UgaWYoVz5yZWMpe2x2PTI7ZGltPSdEaW4gYmlsZCDDpHIgJytXKycgcHggYnJlZCwgb2NoIGNpcmthICcrcmVjKycgcHggcmVrb21tZW5kZXJhcyBmw7ZyIGRlbiBow6RyIGtvbHVtbmxheW91dGVuIChzdGFuZGFyZGJyZWRkZXIpLiBCaWxkZXIgaSBrb2x1bW5lciBsaW5qZXJhciBiw6RzdCBuw6RyIGRlIGhhciBkZW4gcmVrb21tZW5kZXJhZGUgYnJlZGRlbi4gVsOkbGogUmVrb21tZW5kZXJhZCBicmVkZCB1bmRlciBCaWxkbcOldHQgb2NoIGtsaWNrYSBww6UgT3B0aW1lcmEgLyBrb252ZXJ0ZXJhLid9CiAgZWxzZXtsdj0yO2RpbT0nRGluIGJpbGQgw6RyICcrVysnIHB4IGJyZWQsIG9jaCBjaXJrYSAnK3JlYysnIHB4IHJla29tbWVuZGVyYXMgZsO2ciBkZW4gaMOkciBrb2x1bW5sYXlvdXRlbi4gRGVuIGZ5bGxlciBrYW5za2UgaW50ZSBrb2x1bW5lbiBlbGxlciBsaW5qZXJhciBtZWQgZGUgYW5kcmEgYmlsZGVybmEsIG9jaCBkZW4ga2FuIHNlIG9za2FycCB1dC4gQW52w6RuZCBlbiBzdMO2cnJlIGJpbGQgb20gZHUgaGFyIGVuLid9CiB9CiBlbHNlIGlmKFc8cmVjJiYhc3ZnKXtsdj0yO2RpbT0odG9vTmFycm93KGl0ZW0pPydTbWFsYXJlIMOkbiByZWtvbW1lbmRlcmF0OiAnOidOw6Vnb3Qgc21hbGFyZSDDpG4gcmVrb21tZW5kZXJhdDogJykrJ2JpbGRlbiDDpHIgJytXKycgcHggYnJlZCwgb2NoIGNpcmthICcrcmVjKycgcHggcmVrb21tZW5kZXJhcy4gRGVuIGthbiBzZSBvc2thcnAgdXQnKyhhcmVhPT09J2VtYWlsJz8nIGkgZS1wb3N0bWVkZGVsYW5kZXQnOicnKSsnLiBBbnbDpG5kIGVuIHN0w7ZycmUgYmlsZCBvbSBkdSBoYXIgZW4uJ30KIGVsc2UgaWYoVzxyZWMpZGltPSdSZWtvbW1lbmRlcmFkIGJyZWRkOiBjaXJrYSAnK3JlYysnIHB4LiBTVkcga2FuIGtvbnZlcnRlcmFzIGkgZGVuIGJyZWRkZW4gdXRhbiBhdHQgYmxpIG9za2FycC4nOwogZWxzZSBpZihiaWcmJlNaPD01MDAqS0Ipe2x2PTI7ZGltPSdEaW4gYmlsZCDDpHIgJytXKycgcHggYnJlZCwgb2NoIGNpcmthICcrcmVjKycgcHggcmVrb21tZW5kZXJhcyBmw7ZyICcrKGFyZWE9PT0nZW1haWwnPydkZW4gaMOkciBsYXlvdXRlbic6J2RlbiBow6RyIHBsYWNlcmluZ2VuJykrJy4gVmkgcmVrb21tZW5kZXJhciBhdHQgZHUgw6RuZHJhciBkZW4gdGlsbCBjaXJrYSAnK3JlYysnIHB4LiBWw6RsaiBSZWtvbW1lbmRlcmFkIGJyZWRkIHVuZGVyIEJpbGRtw6V0dCBvY2gga2xpY2thIHDDpSBPcHRpbWVyYSAvIGtvbnZlcnRlcmEuJ30KIGVsc2UgaWYoYmlnKXtsdj0yO2RpbT0nRGluIGJpbGQgw6RyICcrVysnIHB4IGJyZWQsIG1lZGFuIGRlbiByZWtvbW1lbmRlcmFkZSBicmVkZGVuIGbDtnIgJysoYXJlYT09PSdlbWFpbCc\/J2RlbiBow6RyIGxheW91dGVuJzonZGVuIGjDpHIgcGxhY2VyaW5nZW4nKSsnIMOkciBjaXJrYSAnK3JlYysnIHB4LiBBbmRyYSBtw6V0dCBrYW4gb2Nrc8OlIGZ1bmdlcmEsIG1lbiBkdSBrYW4gbWluc2thIGJyZWRkZW4gZsO2ciBhdHQgaMOlbGxhIG5lcmUgZmlsc3Rvcmxla2VuLid9CiBlbHNle2x2PTA7ZGltPSdSZWtvbW1lbmRlcmFkIGJyZWRkOiBjaXJrYSAnK3JlYysnIHB4LiBCaWxkZW4gw6RyIHRpbGxyw6Rja2xpZ3QgYnJlZC4nfQogaWYoc3ZnJiZyZWMpe2x2PTI7ZGltPWV4YWN0PydLb252ZXJ0ZXJhIGRlbm5hIFNWRyBpIGV4YWt0ICcrcmVjKycgcHg6IHbDpGxqIEV4YWt0ICcrcmVjKycgcHggdW5kZXIgQmlsZG3DpXR0IG9jaCBrbGlja2EgcMOlIE9wdGltZXJhIC8ga29udmVydGVyYS4gU1ZHIGthbiBrb252ZXJ0ZXJhcyBpIHZhbGZyaSBicmVkZCB1dGFuIGF0dCBibGkgb3NrYXJwLic6J0tvbnZlcnRlcmEgZGVubmEgU1ZHIGkgY2lya2EgJytyZWMrJyBweDogdsOkbGogUmVrb21tZW5kZXJhZCBicmVkZCB1bmRlciBCaWxkbcOldHQgb2NoIGtsaWNrYSBww6UgT3B0aW1lcmEgLyBrb252ZXJ0ZXJhLiBTVkcga2FuIGtvbnZlcnRlcmFzIGkgdmFsZnJpIGJyZWRkIHV0YW4gYXR0IGJsaSBvc2thcnAuJ30KIGNvbnN0IGx2RGltPWx2OwogaWYoc3ZnKXt9ZWxzZSBpZihTWj5NQilsdj1NYXRoLm1heChsdiwzKTtlbHNlIGlmKFNaPjUwMCpLQilsdj1NYXRoLm1heChsdiwyKTsKIGlmKCFSfHxsdkRpbT49MiloaW50KGNhcmQsZGltKyghUiYmc2l6ZVR4dCYmIXN2ZyYmIShiaWcmJlNaPD01MDAqS0IpPycgJytzaXplVHh0OicnKSxSP1snc3VjY2VzcycsJ3N1Y2Nlc3MnLCd3YXJuJywnYWxlcnQnXVtsdkRpbV06bHY8MD8nbmV1dHJhbCc6WydzdWNjZXNzJywnc3VjY2VzcycsJ3dhcm4nLCdhbGVydCddW2x2XSk7CiBpZihpdGVtLnR5cGU9PT0naW1hZ2UvYm1wJyloaW50KGNhcmQsJ0JNUCBrYW4gYW52w6RuZGFzIGkgbWVkaWVhcmtpdmV0LCBtZW4gSlBHIGVsbGVyIFBORyByZWtvbW1lbmRlcmFzIGbDtnIgbWluZHJlIGZpbGVyIG9jaCBiw6R0dHJlIHZpc25pbmcgaSBlLXBvc3QuJyk7CiBpZihpdGVtLnR5cGU9PT0naW1hZ2UvZ2lmJyYmaXRlbS5hbmltYXRlZCloaW50KGNhcmQsYXJlYT09PSdlbWFpbCc\/J0FuaW1lcmFkIEdJRi4gQW5pbWF0aW9uZW4gZnVuZ2VyYWRlIGkgdsOlcmEgdGVzdGVyIGF2IGUtcG9zdHJlZGlnZXJhcmVuLCBtZW4gdXBwc3BlbG5pbmdlbiBpIG1vdHRhZ2FybmFzIGUtcG9zdHByb2dyYW0gdmFyaWVyYXIuIEJlaMOlbGwgb3JpZ2luYWxmaWxlbiBmw7ZyIGF0dCBiZXZhcmEgYW5pbWF0aW9uZW4uJzonQW5pbWVyYWQgR0lGLiBCZWjDpWxsIG9yaWdpbmFsZmlsZW4gZsO2ciBhdHQgYmV2YXJhIGFuaW1hdGlvbmVuLicpOwogaWYoaXRlbS5zdmdBc3N1bWVkKWhpbnQoY2FyZCwnRGVubmEgU1ZHIGhhciBpbmdlbiBmYXN0IHN0b3JsZWssIHPDpSAzMDAgw5cgMTUwIHB4IGhhciBhbnRhZ2l0cy4gVsOkbGogZW4gZWdlbiBicmVkZCB2aWQga29udmVydGVyaW5nLicsJ3dhcm4nKTsKfQpmdW5jdGlvbiBjb250cm9sc0ZvcihjYXJkLGl0ZW0pewogY29uc3QgYz1lbCgnZGl2JywnY2lsLWNvbnRyb2xzJyksa2VlcD1pdGVtLnR5cGU9PT0naW1hZ2UvZ2lmJ3x8aXRlbS50eXBlPT09J2ltYWdlL2JtcCd8fChpdGVtLnR5cGU9PT0naW1hZ2UvcG5nJyYmaXRlbS5hbmltYXRlZCk7CiBjb25zdCBvdXRzPVtdO2lmKGtlZXApb3V0cy5wdXNoKFsnb3JpZ2luYWwnLCdCZWjDpWxsIG9yaWdpbmFsICcrdHlwZUxhYmVsKGl0ZW0udHlwZSkrJyAoaW5nZW4ga29udmVydGVyaW5nKSddKTtpZighKGtlZXAmJml0ZW0uYW5pbWF0ZWQpKW91dHMucHVzaChbJ2F1dG8nLCdBdXRvbWF0aXNrdCAocmVrb21tZW5kZXJhcyknXSk7b3V0cy5wdXNoKFsnaW1hZ2UvanBlZycsJ0pQRyddLFsnaW1hZ2UvcG5nJywnUE5HJ10pOwogY29uc3Qgb3V0Q29sPWVsKCdkaXYnLCdjaWwtc3RhY2snKTtvdXRDb2wuYXBwZW5kKGZpZWxkKCdGaWxmb3JtYXQnLHNlbGVjdChvdXRzLGl0ZW0ub3V0cHV0LGl0ZW0uaWQrJy1vdXQnLHY9PmNoYW5nZUl0ZW0oaXRlbSwnb3V0cHV0Jyx2KSkpKTtjLmFwcGVuZChvdXRDb2wpOwogY29uc3QgcmVjPXN1Z2dlc3RlZChpdGVtKSxzaXplcz1bWydvcmlnaW5hbCcsJ0JlaMOlbGwgb3JpZ2luYWxtw6V0dCddXTtpZihyZWMpc2l6ZXMucHVzaChbJ3JlY29tbWVuZGVkJyxpc0V4YWN0KGl0ZW0pPydFeGFrdCAnK3JlYysnIHB4JzonUmVrb21tZW5kZXJhZCBicmVkZCAoJytyZWMrJyBweCknXSk7c2l6ZXMucHVzaChbJ2N1c3RvbScsaXRlbS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnPydFZ2VuIGJyZWRkJzonRWdlbiBicmVkZCddKTsKIHtjb25zdCBkZj1maWVsZCgnQmlsZG3DpXR0JyxzZWxlY3Qoc2l6ZXMscmVzaXplTW9kZShpdGVtKSxpdGVtLmlkKyctc2l6ZScsdj0+Y2hhbmdlSXRlbShpdGVtLCdyZXNpemUnLHYpKSk7ZGYuYXBwZW5kKGVsKCdzcGFuJywnY2lsLWhlbHAnLGlzRXhhY3QoaXRlbSkmJnJlYz8nUGxhY2VyaW5nZW4ga3LDpHZlciBleGFrdCAnK3JlYysnIHB4LiBPbSBlbiBiaWxkIGbDtnJzdG9yYXMga2FuIGRlbiBzZSBvc2thcnAgdXQuJzonRW4gc21hbGFyZSBiaWxkIGdlciBlbiBtaW5kcmUgZmlsLiBFbiBicmVkYXJlIGJpbGQga2FuIHNlIG9za2FycCB1dC4nKSk7Yy5hcHBlbmQoZGYpfQogaWYoaXRlbS5yZXNpemU9PT0nY3VzdG9tJyl7Y29uc3Qgdz1lbCgnaW5wdXQnKTt3LnR5cGU9J251bWJlcic7dy5taW49JzEnO3cubWF4PVN0cmluZyhNQVhfSU5QVVRfV0lEVEgpO3cuc3RlcD0nMSc7dy5pbnB1dE1vZGU9J251bWVyaWMnO3cudmFsdWU9U3RyaW5nKGl0ZW0uY3VzdG9tV2lkdGh8fCcnKTt3LmRhdGFzZXQuZj1pdGVtLmlkKyctdyc7dy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT5jaGFuZ2VJdGVtKGl0ZW0sJ2N1c3RvbVdpZHRoJyx3LnZhbHVlLnRyaW0oKT09PScnPzA6TnVtYmVyKHcudmFsdWUpKSk7Yy5hcHBlbmQoZmllbGQoaXRlbS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnPydCcmVkZCAocHgpJzonQnJlZGQgKHB4KScsdykpfQogaWYoIWl0ZW0uYW5pbWF0ZWQmJml0ZW0udHlwZSE9PSdpbWFnZS9zdmcreG1sJyl7Y29uc3QgdGY9ZWwoJ2RpdicsJ2NpbC1maWVsZCBjaWwtcmFuZ2UgY2lsLXRyYW5zcCcpLGxiPWVsKCdsYWJlbCcsJ2NpbC1jaGVjaycpLGNiPWVsKCdpbnB1dCcpO2NiLnR5cGU9J2NoZWNrYm94JztjYi5jaGVja2VkPSEhaXRlbS50cmFuc3A7Y2IuZGF0YXNldC5mPWl0ZW0uaWQrJy10cic7Y2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+Y2hhbmdlSXRlbShpdGVtLCd0cmFuc3AnLGNiLmNoZWNrZWQpKTtsYi5hcHBlbmQoY2IsZWwoJ3NwYW4nLG51bGwsJ0fDtnIgYmFrZ3J1bmRlbiB0cmFuc3BhcmVudCcpKTt0Zi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtbGFiZWwnLCdCYWtncnVuZCcpLGxiLGVsKCdzcGFuJywnY2lsLWhlbHAnLCdGdW5nZXJhciBiw6RzdCBww6UgbG9nb3R5cGVyIG9jaCBncmFmaWsgbWVkIGVuZsOkcmdhZCBiYWtncnVuZCwgdGlsbCBleGVtcGVsIHZpdHQgYmFrb20gZW4gbG9nb3R5cC4gQmlsZGVuIHNwYXJhcyBzb20gUE5HLicpKTsKICBpZihpdGVtLnRyYW5zcCl7Y29uc3QgcT1lbCgnaW5wdXQnKSx2PWVsKCdzcGFuJywnY2lsLXNtYWxsJywnVG9sZXJhbnM6ICcrKGl0ZW0udG9sfHw0MCkpO3EudHlwZT0ncmFuZ2UnO3EubWluPSc1JztxLm1heD0nMTIwJztxLnN0ZXA9JzEnO3EudmFsdWU9U3RyaW5nKGl0ZW0udG9sfHw0MCk7cS5kYXRhc2V0LmY9aXRlbS5pZCsnLXRvbCc7cS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsKCk9Pnt2LnRleHRDb250ZW50PSdUb2xlcmFuczogJytxLnZhbHVlfSk7cS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT5jaGFuZ2VJdGVtKGl0ZW0sJ3RvbCcsTnVtYmVyKHEudmFsdWUpKSk7dGYuYXBwZW5kKHEsdixlbCgnc3BhbicsJ2NpbC1oZWxwJywnSMO2aiBkZW4gb20gZW4gbGp1cyBrYW50IGVsbGVyIHNrdWdnYSBibGlyIGt2YXIuIFPDpG5rIGRlbiBvbSBkZWxhciBhdiBiaWxkZW4gZsO2cnN2aW5uZXIuJykpfQogIG91dENvbC5hcHBlbmQodGYpfQogY29uc3QgYWR2PWVsKCdkaXYnLCdjaWwtYWR2LWJvZHknKTtsZXQgYWR2RWw9bnVsbDsKIGlmKGl0ZW0ub3V0cHV0PT09J2ltYWdlL2pwZWcnKXtjb25zdCBxPWVsKCdpbnB1dCcpLGw9ZWwoJ2xhYmVsJywnY2lsLWZpZWxkIGNpbC1yYW5nZScpLHY9ZWwoJ3NwYW4nLCdjaWwtc21hbGwnLCdKUEcta3ZhbGl0ZXQ6ICcraXRlbS5xdWFsaXR5KyclJyk7cS50eXBlPSdyYW5nZSc7cS5taW49JzUwJztxLm1heD0nOTUnO3Euc3RlcD0nMSc7cS52YWx1ZT1TdHJpbmcoaXRlbS5xdWFsaXR5KTtxLmRhdGFzZXQuZj1pdGVtLmlkKyctcSc7cS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsKCk9Pnt2LnRleHRDb250ZW50PSdKUEcta3ZhbGl0ZXQ6ICcrcS52YWx1ZSsnJSd9KTtxLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCk9PmNoYW5nZUl0ZW0oaXRlbSwncXVhbGl0eScsTnVtYmVyKHEudmFsdWUpKSk7bC5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtbGFiZWwnLCdLb21wcmltZXJpbmdza3ZhbGl0ZXQnKSxxLHYsZWwoJ3NwYW4nLCdjaWwtaGVscCcsJ0zDpGdyZSBnZXIgZW4gbWluZHJlIGZpbCBtZW4gZsOkcnJlIGRldGFsamVyLiA3NeKAkzg1ICUgcGFzc2FyIGRlIGZsZXN0YSBmb3Rvbi4nKSk7YWR2LmFwcGVuZChsKX0KIGlmKENBTl9RVUFOVCYmKGl0ZW0ub3V0cHV0PT09J2ltYWdlL3BuZyd8fGl0ZW0ub3V0cHV0PT09J2F1dG8nKSYmIWl0ZW0uYW5pbWF0ZWQpYWR2LmFwcGVuZChmaWVsZChpdGVtLm91dHB1dD09PSdhdXRvJz8nUE5HLWbDpHJnZXIgKGFudsOkbmRzIG9tIGJpbGRlbiBzcGFyYXMgc29tIFBORyknOidQTkctZsOkcmdlcicsc2VsZWN0KFtbJzI1NicsJzI1NiBmw6RyZ2VyIChyZWtvbW1lbmRlcmFzKSddLFsnMTI4JywnMTI4IGbDpHJnZXInXSxbJzY0JywnNjQgZsOkcmdlciddLFsnMzInLCczMiBmw6RyZ2VyJ10sWycwJywnQWxsYSBmw6RyZ2VyIChmw7ZybHVzdGZyaXR0KSddXSxTdHJpbmcoaXRlbS5jb2xvdXJzKSxpdGVtLmlkKyctY29sJyx2PT5jaGFuZ2VJdGVtKGl0ZW0sJ2NvbG91cnMnLE51bWJlcih2KSkpKSk7CiBpZihhZHYubGFzdENoaWxkJiZhZHYubGFzdENoaWxkLnF1ZXJ5U2VsZWN0b3ImJmFkdi5sYXN0Q2hpbGQucXVlcnlTZWxlY3Rvcignc2VsZWN0W2RhdGEtZiQ9Ii1jb2wiXScpKWFkdi5sYXN0Q2hpbGQuYXBwZW5kKGVsKCdzcGFuJywnY2lsLWhlbHAnLCdGw6RycmUgZsOkcmdlciBnZXIgZW4gbWluZHJlIGZpbC4gVsOkbGogQWxsYSBmw6RyZ2VyIG9tIHRvbmluZ2FyIHNlciBvasOkbW5hIHV0LicpKTsKIGlmKGFkdi5jaGlsZE5vZGVzLmxlbmd0aCl7Y29uc3QgZD1lbCgnZGV0YWlscycsJ2NpbC1hZHYnKTtpZihpdGVtLmFkdk9wZW4pZC5vcGVuPXRydWU7ZC5hZGRFdmVudExpc3RlbmVyKCd0b2dnbGUnLCgpPT57aXRlbS5hZHZPcGVuPWQub3Blbn0pO2QuYXBwZW5kKGVsKCdzdW1tYXJ5JyxudWxsLCdBdmFuY2VyYWRlIGluc3TDpGxsbmluZ2FyJyksZWwoJ3AnLCdjaWwtc21hbGwnLCdWYWxmcml0dC4gU3RhbmRhcmRpbnN0w6RsbG5pbmdhcm5hIHBhc3NhciBkZSBmbGVzdGEgYmlsZGVyLicpLGFkdik7YWR2RWw9ZH0KIGNhcmQuYXBwZW5kKGMpOwogY29uc3Qgb3V0PW91dFR5cGUoaXRlbSk7CiBpZighb3V0KWhpbnQoY2FyZCwnSW5nZW4ga29udmVydGVyaW5nIGJlaMO2dnM6IGFudsOkbmQgZGluIG9yaWdpbmFsZmlsLicrKGl0ZW0udHlwZT09PSdpbWFnZS9naWYnPycgT20gZW4gR0lGIGtvbnZlcnRlcmFzIHRpbGwgSlBHIGVsbGVyIFBORyBiZWjDpWxscyBiYXJhIGVuIGJpbGRydXRhLic6JycpKTsKIGlmKG91dD09PSdhdXRvJyloaW50KGNhcmQsJ0F1dG9tYXRpc2t0IHbDpGxqZXIgUE5HIGbDtnIgYmlsZGVyIG1lZCB0cmFuc3BhcmVucyBlbGxlciBmw6UgZsOkcmdlciBvY2ggSlBHIGbDtnIgYWxsdCBhbm5hdC4gRGV0IGvDpG5uZXIgaW50ZSBpZ2VuIHZhZCBiaWxkZW4gdmlzYXIsIHPDpSBrb250cm9sbGVyYSBmw7ZyaGFuZHN2aXNuaW5nZW4uJyk7CiBpZihvdXQmJml0ZW0uYW5pbWF0ZWQpaGludChjYXJkLCdWaWQga29udmVydGVyaW5nIGJlaMOlbGxzIGJhcmEgZGVuIGbDtnJzdGEgYmlsZHJ1dGFuLiBBbmltYXRpb25lbiBmw7Zyc3Zpbm5lci4gQmVow6VsbCBvcmlnaW5hbGZpbGVuIGbDtnIgYXR0IGJldmFyYSBhbmltYXRpb25lbi4nLCd3YXJuJyk7CiBpZihvdXQmJml0ZW0udHlwZT09PSdpbWFnZS9zdmcreG1sJyloaW50KGNhcmQsJ07DpHIgU1ZHIGtvbnZlcnRlcmFzIHRpbGwgSlBHIGVsbGVyIFBORyBibGlyIGRldCBlbiByYXN0ZXJiaWxkLiBUZXh0IG9jaCBmb3JtZXIga2FuIGTDpSBpbnRlIGzDpG5ncmUgc2thbGFzIHV0YW4ga3ZhbGl0ZXRzZsO2cmx1c3QuJywnd2FybicpOwogaWYob3V0PT09J2ltYWdlL2pwZWcnJiZBTFBIQV9UWVBFUy5pbmNsdWRlcyhpdGVtLnR5cGUpKWhpbnQoY2FyZCwnSlBHIHN0w7ZkZXIgaW50ZSB0cmFuc3BhcmVucy4gVHJhbnNwYXJlbnRhIG9tcsOlZGVuIGJsaXIgdml0YS4nKTsKIGlmKG91dD09PSdpbWFnZS9wbmcnJiZpdGVtLnR5cGU9PT0naW1hZ2UvanBlZycpaGludChjYXJkLCdQTkcgw6RyIG9mdGFzdCBteWNrZXQgc3TDtnJyZSDDpG4gSlBHIGbDtnIgZm90b24uJyk7CiBpZihhZHZFbCljYXJkLmFwcGVuZChhZHZFbCk7Cn0KZnVuY3Rpb24gcmVzdWx0Rm9yKGNhcmQsaXRlbSl7CiBjb25zdCByPWl0ZW0ucmVzdWx0OwogaWYoci5rZXB0T3JpZ2luYWwpe2hpbnQoY2FyZCwodG9vTmFycm93KGl0ZW0pPydGaWxzdG9ybGVrZW4gw6RyIHJlZGFuIHbDpGwgb3B0aW1lcmFkLCBtZW4gYmlsZGVuIMOkciBmb3J0ZmFyYW5kZSBmw7ZyIHNtYWwgKHNlIG92YW4pLic6J0RpbiBvcmlnaW5hbGZpbCDDpHIgcmVkYW4gdsOkbCBvcHRpbWVyYWQuJykrJyBPcHRpbWVyaW5nZW4gZ2F2IGVuIHN0w7ZycmUgZmlsICgnK2ZtdChyLnRyaWVkU2l6ZSkrJyksIHPDpSBmb3J0c8OkdHQgYXR0IGFudsOkbmRhIGRpbiBvcmlnaW5hbGZpbCAoJytmbXQoaXRlbS5maWxlLnNpemUpKycpLiBEZW4ga29tbWVyIMOkbmTDpSBtZWQgb20gZHUgbGFkZGFyIG5lciBlbiBaSVAuJyx0b29OYXJyb3coaXRlbSk\/J3dhcm4nOidzdWNjZXNzJyk7cmV0dXJufQogY29uc3QgZGVsdGE9KDEtci5ibG9iLnNpemUvaXRlbS5maWxlLnNpemUpKjEwMCxhY2NlcHRlZD1DTV9BQ0NFUFRFRC5pbmNsdWRlcyhpdGVtLnR5cGUpJiYhaXRlbS5taXNtYXRjaDsKIGxldCB0PSdPcHRpbWVyYWQgZmlsOiAnK2ZtdChyLmJsb2Iuc2l6ZSkrJyDCtyAnK3Iud2lkdGgrJyDDlyAnK3IuaGVpZ2h0KycgcHggwrcgJyt0eXBlTGFiZWwoci50eXBlKSsnIMK3ICc7CiBpZihNYXRoLmFicyhkZWx0YSk8MC41KXQrPSd1bmdlZsOkciBzYW1tYSBzdG9ybGVrIHNvbSBvcmlnaW5hbGV0Lic7ZWxzZSBpZihkZWx0YT4wKXQrPWRlbHRhLnRvRml4ZWQoMCkrJyUgbWluZHJlLic7ZWxzZSBpZihyLndpZHRoIT09aXRlbS53aWR0aCl0Kz1NYXRoLmFicyhkZWx0YSkudG9GaXhlZCgwKSsnJSBzdMO2cnJlLCBlZnRlcnNvbSBiaWxkZW4gaGFyIMOkbmRyYXRzIHRpbGwgJytyLndpZHRoKycgcHguJztlbHNlIHQrPU1hdGguYWJzKGRlbHRhKS50b0ZpeGVkKDApKyclIHN0w7ZycmUuJysoYWNjZXB0ZWQ\/JyBPcmlnaW5hbGV0IMOkciBtaW5kcmUsIHPDpSBkdSBrYW4gYmVow6VsbGEgZGV0IGkgc3TDpGxsZXQuJzonJyk7CiBpZihyLnJlYXNvbil0Kz0nICcrci5yZWFzb247CiBpZihyLmJnTWl4ZWQpYmdIaW50KGNhcmQsci5iZ01peGVkKTsKIGNvbnN0IGVubD0hci5rZXB0T3JpZ2luYWwmJml0ZW0udHlwZSE9PSdpbWFnZS9zdmcreG1sJyYmaXRlbS53aWR0aDxyLndpZHRoKjAuOTsKIGlmKGVubCl7aGludChjYXJkLCdGw7Zyc3RvcmFkIGJpbGQ6IGJpbGRlbiBoYXIgZsO2cnN0b3JhdHMgZnLDpW4gJytpdGVtLndpZHRoKycgcHggdGlsbCAnK3Iud2lkdGgrJyBweCwgc8OlIGRlbiBibGlyIG1pbmRyZSBza2FycC4gVmkgcmVrb21tZW5kZXJhciBpbnRlIGF0dCBkdSBhbnbDpG5kZXIgZW4gZsO2cnN0b3JhZCBiaWxkLiBBbnbDpG5kIGkgc3TDpGxsZXQgZW4gc3TDtnJyZSBiaWxkIHNvbSDDpHIgbWluc3QgJytyLndpZHRoKycgcHggYnJlZC4gRsO2cnN0b3JhZCBmaWw6ICcrZm10KHIuYmxvYi5zaXplKSsnIMK3ICcrci53aWR0aCsnIMOXICcrci5oZWlnaHQrJyBweCDCtyAnK3R5cGVMYWJlbChyLnR5cGUpKycuJywnYWxlcnQnKTtyZXR1cm59CiBpZighci5rZXB0T3JpZ2luYWwpe2lmKHIuYmxvYi5zaXplPk1CJiYhL2xvd2VyIHRoZSBKUEcgcXVhbGl0eS8udGVzdCh0KSl0Kz0nIEZpbGVuIMOkciBmb3J0ZmFyYW5kZSBnYW5za2Egc3RvciAoJytmbXQoci5ibG9iLnNpemUpKycpLiBTw6RuayBKUEcta3ZhbGl0ZXRlbiB1bmRlciBBdmFuY2VyYWRlIGluc3TDpGxsbmluZ2FyIGVsbGVyIHbDpGxqIGVuIG1pbmRyZSBicmVkZC4nO2Vsc2UgaWYoci5ibG9iLnNpemU+NTAwKktCJiZyLmJsb2Iuc2l6ZTw9TUIpdCs9JyBGaWxlbiDDpHIgZm9ydGZhcmFuZGUgcmVsYXRpdnQgc3RvciAoJytmbXQoci5ibG9iLnNpemUpKycpLiBEdSBrYW4gc8OkbmthIEpQRy1rdmFsaXRldGVuIHVuZGVyIEF2YW5jZXJhZGUgaW5zdMOkbGxuaW5nYXIuJ30KIGNvbnN0IGx2Uj1sZXZlbChpdGVtKTtoaW50KGNhcmQsdCxyLmtlcHRPcmlnaW5hbD8oZGVsdGE+PTB8fCFhY2NlcHRlZD8nc3VjY2Vzcyc6J3dhcm4nKTpsdlI+PTM\/J2FsZXJ0JzpsdlI+PTI\/J3dhcm4nOidzdWNjZXNzJyk7Cn0KZnVuY3Rpb24gcHJldmlld0ZvcihjYXJkLGl0ZW0pewogY29uc3Qgcj1pdGVtLnJlc3VsdCx3cmFwPWVsKCdkaXYnLCdjaWwtY29tcGFyZScpLHZpZXdzPVtdLGJhcj1lbCgnZGl2JywnY2lsLWFjdGlvbnMnKTsKIGNvbnN0IHBhbmU9KHRpdGxlLGtleSxibG9iLG1ldGEpPT57Y29uc3QgZj1lbCgnZmlndXJlJywnY2lsLXBhbmUnKSx2PWVsKCdkaXYnLCdjaWwtdmlldycpO2lmKGl0ZW0uYWN0dWFsKXYuZGF0YXNldC5hY3R1YWw9JzEnO2lmKGJsb2Ipey8qIHJldXNlIHRoZSBzYW1lIGltZyBlbGVtZW50IGJldHdlZW4gcmVuZGVycyBzbyB0aGUgcHJldmlldyBkb2VzIG5vdCBmbGlja2VyICovaXRlbS5faW1zPWl0ZW0uX2ltc3x8e307Y29uc3QgYz1pdGVtLl9pbXNba2V5XTtsZXQgaW07aWYoYyYmYy5ibG9iPT09YmxvYil7aW09Yy5pbX1lbHNle2ltPWVsKCdpbWcnKTtpbS5hbHQ9dGl0bGUrJzogJysoaXRlbS5maWxlLm5hbWV8fCdpbWFnZScpO2ltLm9uZXJyb3I9KCk9PntpZihpbS5kYXRhc2V0LmZiKXJldHVybjtpbS5kYXRhc2V0LmZiPScxJzsvKiBibG9iOiBibG9ja2VkIGJ5IHRoZSBzaXRlIHNlY3VyaXR5IHBvbGljeTogdXNlIGEgZGF0YSBVUkwgaW5zdGVhZCAqL2NvbnN0IHI9bmV3IEZpbGVSZWFkZXIoKTtyLm9ubG9hZD0oKT0+e2ltLnNyYz1yLnJlc3VsdH07ci5yZWFkQXNEYXRhVVJMKGJsb2IpfTtpbS5zcmM9b2JqVXJsKGl0ZW0sa2V5LGJsb2IpO2l0ZW0uX2ltc1trZXldPXtibG9iLGltfX12LmFwcGVuZChpbSl9ZWxzZSB2LmFwcGVuZChlbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ09wdGltZXJhIGJpbGRlbiBmw7ZyIGF0dCBzZSByZXN1bHRhdGV0IGjDpHIuJykpO2YuYXBwZW5kKHYsZWwoJ2ZpZ2NhcHRpb24nLG51bGwsbWV0YT90aXRsZSsnIMK3ICcrbWV0YTp0aXRsZSkpO3ZpZXdzLnB1c2godik7cmV0dXJuIGZ9OwogY29uc3QgcGlja0Jhcj1pdGVtLnJlc3VsdCYmIWl0ZW0ucmVzdWx0LmtlcHRPcmlnaW5hbCYmIWl0ZW0uZWRpdGluZz8oKCk9Pntjb25zdCBwYj1lbCgnZGl2JywnY2lsLXBpY2tiYXInKTtwYi5hcHBlbmQoYnV0dG9uKCdMYWRkYSBuZXIgJyt0eXBlTGFiZWwoaXRlbS5yZXN1bHQudHlwZSksKCk9Pnt0cmFjaygnZG93bmxvYWQnKTtkb3dubG9hZChpdGVtLnJlc3VsdC5ibG9iLGl0ZW0ucmVzdWx0Lm5hbWUpfSwnJyxpdGVtLmlkKyctZGwnKSk7aWYoaXRlbS50cmFuc3ApcGIuYXBwZW5kKGJ1dHRvbignUmVkaWdlcmEgYmFrZ3J1bmQgbWFudWVsbHQnLCgpPT5vcGVuRWRpdG9yKGl0ZW0pLCdjaWwtYnRuLXNlY29uZGFyeScsaXRlbS5pZCsnLWVkaXQnKSk7aWYoKGl0ZW0uY2xpY2tzfHxbXSkubGVuZ3RoKXtjb25zdCBycz1lbCgnYnV0dG9uJywnY2lsLWJ0bi10ZXh0Jywnw4VuZ3JhIG1hbnVlbGxhIMOkbmRyaW5nYXInKTtycy50eXBlPSdidXR0b24nO3JzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e2l0ZW0uY2xpY2tzPVtdO29wdGltaXNlKGl0ZW0pfSk7cGIuYXBwZW5kKHJzKX1yZXR1cm4gcGJ9KSgpOm51bGw7CiB3cmFwLmFwcGVuZChwYW5lKCdPcmlnaW5hbCcsJ29yaWcnLGl0ZW0uZmlsZSxmbXQoaXRlbS5maWxlLnNpemUpKycgwrcgJytpdGVtLndpZHRoKycgw5cgJytpdGVtLmhlaWdodCsnIHB4JykscGFuZShyJiZyLmtlcHRPcmlnaW5hbD8nT3JpZ2luYWwgYmVow6VsbGVuJzonT3B0aW1lcmFkJywncmVzJyxyP3IuYmxvYjpudWxsLHI\/Zm10KHIuYmxvYi5zaXplKSsnIMK3ICcrci53aWR0aCsnIMOXICcrci5oZWlnaHQrJyBweCc6JycpKTsKIGxldCBsb2NrPWZhbHNlO3ZpZXdzLmZvckVhY2godj0+di5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCgpPT57aWYobG9jaylyZXR1cm47bG9jaz10cnVlO2NvbnN0IG89dmlld3Nbdmlld3NbMF09PT12PzE6MF0sZng9di5zY3JvbGxMZWZ0L01hdGgubWF4KDEsdi5zY3JvbGxXaWR0aC12LmNsaWVudFdpZHRoKSxmeT12LnNjcm9sbFRvcC9NYXRoLm1heCgxLHYuc2Nyb2xsSGVpZ2h0LXYuY2xpZW50SGVpZ2h0KTtvLnNjcm9sbExlZnQ9ZngqKG8uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aCk7by5zY3JvbGxUb3A9ZnkqKG8uc2Nyb2xsSGVpZ2h0LW8uY2xpZW50SGVpZ2h0KTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pntsb2NrPWZhbHNlfSl9KSk7CiBiYXIuYXBwZW5kKGJ1dHRvbihpdGVtLmFjdHVhbD8nQW5wYXNzYSB0aWxsIHJ1dGFuJzonVmlzYSBpIGZha3Rpc2sgc3RvcmxlaycsKCk9PntpdGVtLmFjdHVhbD0haXRlbS5hY3R1YWw7cmVuZGVyKCl9LCdjaWwtYnRuLXRleHQnLGl0ZW0uaWQrJy16b29tJyksZWwoJ3NwYW4nLCdjaWwtc21hbGwnLCdLb250cm9sbGVyYSBkZXRhbGplciwgdGV4dCBvY2gga2FudGVyIGkgZmFrdGlzayBzdG9ybGVrLicpKTsKIGNhcmQuYXBwZW5kKGJhcix3cmFwKTtpZihpdGVtLmVkaXRpbmcpY2FyZC5hcHBlbmQoZWRpdG9yRm9yKGl0ZW0pKTsKfQpmdW5jdGlvbiB3ZWJzaXRlRmllbGRzKGl0ZW0pewogY29uc3QgZz1lbCgnZGl2JywnY2lsLWdyaWQnKSxwPWl0ZW0ud1BsYWNlbWVudDsKIGcuYXBwZW5kKGZpZWxkSGVscCgnUGxhY2VyaW5nJyxzZWxlY3QoW1snbm9uZScsJ0ludGUgdmFsZCddLFsnaGVhZGVyJywnSGVhZGVyJ10sWydiYWNrZ3JvdW5kJywnQmFrZ3J1bmQgaSBzZWt0aW9uJ10sWydzZWN0aW9uJywnQmlsZCBpIHNla3Rpb24nXSxbJ2NvbHVtbnMnLCdCaWxkIGkga29sdW1uJ10sWydjdXN0b20nLCdFZ2VuIGJyZWRkJ10sWydvdGhlcicsJ0FubmFuIGJpbGQnXV0scCxpdGVtLmlkKyctd3AnLHY9PmNoYW5nZUl0ZW0oaXRlbSwnd1BsYWNlbWVudCcsdikpLCdIZWFkZXIgb2NoIEJha2dydW5kIGkgc2VrdGlvbiBrcsOkdmVyIGV4YWt0IGRlbiBicmVkZCBzb20gcGFzc2FyIGRpdHQgdGVtYSBvY2ggZGluIHNrw6RybXN0b3JsZWsuIEVuIGhlYWRlcmJpbGQgYW5wYXNzYXIgc2lnIHRpbGwgc2vDpHJtZW5zIGJyZWRkLiBFbiBiYWtncnVuZHNiaWxkIGkgZW4gc2VrdGlvbiBza2FsYXMgaW50ZSwgc8OlIHDDpSBzbWFsYXJlIHNrw6RybWFyIHNrw6RycyBow7ZncmEgc2lkYW4gYXYuIFBsYWNlcmEgdmlrdGlndCBpbm5laMOlbGwgaSBiaWxkZW5zIHbDpG5zdHJhIGRlbC4gQmlsZCBpIHNla3Rpb24gw6RyIGVuIGJpbGQgZGlyZWt0IGkgZW4gc2VrdGlvbiwgdXRhbiBrb2x1bW5lci4gQmlsZCBpIHNla3Rpb24gb2NoIEJpbGQgaSBrb2x1bW4gaGFyIGVuIHJla29tbWVuZGVyYWQgYnJlZGQgc8OlIGF0dCBiaWxkZXJuYSBsaW5qZXJhci4gT20gZHUgaGFyIMOkbmRyYXQga29sdW1uYnJlZGRlcm5hLCB2w6RsaiBFZ2VuIGJyZWRkLicsJ3dwLScraXRlbS5pZCkpOwogaWYoV0VCU0lURVtwXSl7Zy5hcHBlbmQoZmllbGQoJ1RlbWEnLHNlbGVjdChbWydhJywnU3RhbmRhcmQgQSddLFsnYicsJ1N0YW5kYXJkIEInXSxbJ2MnLCdTdGFuZGFyZCBDJ11dLGl0ZW0ud1RoZW1lLGl0ZW0uaWQrJy13dCcsdj0+Y2hhbmdlSXRlbShpdGVtLCd3VGhlbWUnLHYpKSkpOwogIGlmKHAhPT0nc2VjdGlvbicpZy5hcHBlbmQoZmllbGQoKHA9PT0nYmFja2dyb3VuZCd8fHA9PT0naGVhZGVyJyk\/J0VuaGV0JzonS29sdW1uZXInLHNlbGVjdCgoKHA9PT0nYmFja2dyb3VuZCd8fHA9PT0naGVhZGVyJyk\/WydEYXRvcicsJ1N1cmZwbGF0dGEnLCdNb2JpbCddOlsnRW4ga29sdW1uJywnVHbDpSBrb2x1bW5lcicsJ1RyZSBrb2x1bW5lciddKS5tYXAoKHgsaSk9PltTdHJpbmcoaSkseF0pLGl0ZW0ud1ZhcmlhbnQsaXRlbS5pZCsnLXd2Jyx2PT5jaGFuZ2VJdGVtKGl0ZW0sJ3dWYXJpYW50Jyx2KSkpKX0KIGlmKHA9PT0nY3VzdG9tJyl7Zy5hcHBlbmQod2lkdGhGaWVsZChpdGVtLCdzaXRlV2lkdGgnLCdCaWxkYnJlZGQgcMOlIGRpbiB3ZWJicGxhdHMnKSk7aWYoaXRlbS5zaXRlV2lkdGhVbml0PT09JyUnKXtjb25zdCBmPWZpZWxkKCdCcmVkZCBww6Ugc2VrdGlvbmVuIGVsbGVyIGtvbHVtbmVuIChweCknLG51bUlucHV0KGl0ZW0sJ3NpdGVCYXNlJyxNQVhfSU5QVVRfV0lEVEgsJ2UuZy4gMTE0MCcpKSxweD1zdWdnZXN0ZWQoaXRlbSk7Zi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwnLHB4Pyc9ICcrcHgrJyBweC4nOidQcm9jZW50ZW4gYmVyw6RrbmFzIHV0aWZyw6VuIGRlbiBow6RyIGJyZWRkZW4uJykpO2cuYXBwZW5kKGYpfX0KIGlmKHA9PT0naGVhZGVyJylnLmFwcGVuZChlbCgncCcsJ2NpbC1oZWxwIGNpbC1wbGFjZW1lbnQtbm90ZScsJ0FudsOkbmQgZGVuIHJla29tbWVuZGVyYWRlIGJyZWRkZW4uIEVuIGhlYWRlcmJpbGQgYW5wYXNzYXIgc2lnIHRpbGwgc2vDpHJtZW5zIGJyZWRkLicpKTsKIGlmKHA9PT0nYmFja2dyb3VuZCcpZy5hcHBlbmQoZWwoJ3AnLCdjaWwtaGVscCBjaWwtcGxhY2VtZW50LW5vdGUnLCdFbiBiYWtncnVuZHNiaWxkIGkgZW4gc2VrdGlvbiBza2FsYXMgaW50ZS4gRGVuIHZpc2FzIGkgc2luIGVnZW4gc3RvcmxlayBmcsOlbiB2w6Ruc3RlcmthbnRlbiwgc8OlIHDDpSBza8Okcm1hciBzb20gw6RyIHNtYWxhcmUgw6RuIGRlbiByZWtvbW1lbmRlcmFkZSBicmVkZGVuIHNrw6RycyBow7ZncmEgc2lkYW4gYXYuIERlIHJla29tbWVuZGVyYWRlIGJyZWRkZXJuYSBwYXNzYXIgZGVuIGJyZWRhc3RlIHNrw6RybWVuIGkgdmFyamUgZ3J1cHA6IGRhdG9yLCBzdXJmcGxhdHRhIG9jaCBtb2JpbC4gUGxhY2VyYSB2aWt0aWd0IGlubmVow6VsbCBpIGJpbGRlbnMgdsOkbnN0cmEgZGVsLicpKTsKIHJldHVybiBnOwp9CmZ1bmN0aW9uIG51bUlucHV0KGl0ZW0scHJvcCxtYXgscGgpe2NvbnN0IHc9ZWwoJ2lucHV0Jyk7dy50eXBlPSdudW1iZXInO3cubWluPScxJzt3Lm1heD1TdHJpbmcobWF4KTt3LnN0ZXA9JzEnO3cuaW5wdXRNb2RlPSdudW1lcmljJzt3LnBsYWNlaG9sZGVyPXBoO3cudmFsdWU9aXRlbVtwcm9wXT9TdHJpbmcoaXRlbVtwcm9wXSk6Jyc7dy5pZD0nY2lsLScraXRlbS5pZCsnLScrcHJvcDt3LmRhdGFzZXQuZj1pdGVtLmlkKyctJytwcm9wO3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+e2NvbnN0IG49TnVtYmVyKHcudmFsdWUpO2NoYW5nZUl0ZW0oaXRlbSxwcm9wLE51bWJlci5pc0ludGVnZXIobikmJm4+PTEmJm48PW1heD9uOjApfSk7cmV0dXJuIHd9CmZ1bmN0aW9uIHdpZHRoRmllbGQoaXRlbSxwcm9wLGxhYmVsKXsKIGNvbnN0IHVuaXQ9aXRlbVtwcm9wKydFbmhldCddLHBjdD11bml0PT09JyUnLGY9ZWwoJ2RpdicsJ2NpbC1maWVsZCcpLGw9ZWwoJ2xhYmVsJywnY2lsLWxhYmVsJyxsYWJlbCkscm93PWVsKCdkaXYnLCdjaWwtdW5pdHJvdycpOwogY29uc3Qgdz1udW1JbnB1dChpdGVtLHByb3AscGN0PzEwMDpNQVhfSU5QVVRfV0lEVEgscGN0PydlLmcuIDUwJzonZS5nLiA0MDAnKTtsLmh0bWxGb3I9dy5pZDsKIGNvbnN0IHU9c2VsZWN0KFtbJ3B4JywncHgnXSxbJyUnLCclJ11dLHVuaXQsaXRlbS5pZCsnLScrcHJvcCsnLXVuaXQnLHY9PntpdGVtW3Byb3BdPTA7Y2hhbmdlSXRlbShpdGVtLHByb3ArJ0VuaGV0Jyx2KX0pO3Uuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywnRW5oZXQnKTsKIHJvdy5hcHBlbmQodyx1KTtmLmFwcGVuZChsLHJvdyk7CiBjb25zdCBweD1zdWdnZXN0ZWQoaXRlbSk7CiBpZihwY3QmJnByb3A9PT0nbGF5b3V0V2lkdGgnKWYuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJyxweD8nPSAnK3B4KycgcHggYXYgc3RhbmRhcmRicmVkZGVuIHDDpSA2MDAgcHggZsO2ciBlLXBvc3QuJzonUHJvY2VudCBhdiBzdGFuZGFyZGJyZWRkZW4gcMOlIDYwMCBweCBmw7ZyIGUtcG9zdC4nKSk7CiBlbHNlIGlmKCFwY3QpZi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwnLHByb3A9PT0nbGF5b3V0V2lkdGgnPydBbnbDpG5kIGRldHRhIG9tIGR1IGhhciDDpG5kcmF0IGtvbHVtbi0gZWxsZXIgYmlsZGJyZWRkZW4uJzonQW52w6RuZCBkZXR0YSBvbSBkdSBoYXIgYW5nZXR0IGVuIHZpc3MgYnJlZGQgZsO2ciBiaWxkZW4gZWxsZXIga29sdW1uZW4uJykpOwogcmV0dXJuIGY7Cn0KZnVuY3Rpb24gZW1haWxGaWVsZHMoaXRlbSl7CiBjb25zdCBnPWVsKCdkaXYnLCdjaWwtZ3JpZCcpOwogZy5hcHBlbmQoZmllbGQoJ1BsYWNlcmluZyAodmFsZnJpdHQpJyxzZWxlY3QoW1snMScsJ0VuIGtvbHVtbiddLFsnMicsJ1R2w6Uga29sdW1uZXInXSxbJzMnLCdUcmUga29sdW1uZXInXSxbJ2N1c3RvbScsJ0VnZW4gYnJlZGQnXV0saXRlbS5sYXlvdXQsaXRlbS5pZCsnLWxheW91dCcsdj0+Y2hhbmdlSXRlbShpdGVtLCdsYXlvdXQnLHYpKSkpOwogaWYoaXRlbS5sYXlvdXQ9PT0nY3VzdG9tJylnLmFwcGVuZCh3aWR0aEZpZWxkKGl0ZW0sJ2xheW91dFdpZHRoJywnQmlsZGJyZWRkIGkgZGl0dCBlLXBvc3RtZWRkZWxhbmRlJykpOwogcmV0dXJuIGc7Cn0KZnVuY3Rpb24gdXJsQm9keShjYXJkLGl0ZW0pewogY29uc3QgcmVjPXN1Z2dlc3RlZChpdGVtKTtsZXQgdD0nJzsKIGlmKHJlYyYmaXNFeGFjdChpdGVtKSl7aWYoaXRlbS53aWR0aD09PXJlYyl0PSdSw6R0dCBicmVkZDogcGxhY2VyaW5nZW4ga3LDpHZlciAnK3JlYysnIHB4LCBvY2ggYmlsZGVuIMOkciAnK2l0ZW0ud2lkdGgrJyBweCBicmVkLic7ZWxzZXtoaW50KGNhcmQsJ0ZlbCBicmVkZCBmw7ZyIGRlbiBow6RyIHBsYWNlcmluZ2VuOiBiaWxkZW4gw6RyICcraXRlbS53aWR0aCsnIHB4IGJyZWQsIG9jaCBwbGFjZXJpbmdlbiBrcsOkdmVyIGV4YWt0ICcrcmVjKycgcHguIEJpbGRlciBzb20gw6RyIGbDtnIgc21hbGEgZWxsZXIgZsO2ciBicmVkYSB2aXNhcyBrYW5za2UgaW50ZSBzb20gdMOkbmt0IGkgV2ViYmRlc2lnbmVyLiAnKyhpdGVtLndpZHRoPHJlYyowLjk\/J0FudsOkbmQgZW4gc3TDtnJyZSBiaWxkIHNvbSDDpHIgbWluc3QgJytyZWMrJyBweCBicmVkLic6J1NwYXJhIGJpbGRlbiBww6UgZGluIGRhdG9yLCBsw6RnZyB0aWxsIGRlbiBzb20gZmlsIG9jaCB2w6RsaiBFeGFrdCAnK3JlYysnIHB4LicpLCd3YXJuJyl9fQogZWxzZSBpZihyZWMpe3Q9KGlzQ3VzdG9tV2lkdGgoaXRlbSk\/J0RpbiBiaWxkYnJlZGQ6ICcrcmVjKycgcHguICc6J1Jla29tbWVuZGVyYWQgYmlsZGJyZWRkOiBjaXJrYSAnK3JlYysnIHB4LiAnKTt0Kz1pdGVtLndpZHRoPHJlYz8nQmlsZGVuIMOkciBzbWFsYXJlIMOkbiBkZW4gcmVrb21tZW5kZXJhZGUgYnJlZGRlbiBvY2gga2FuIHNlIG1pbmRyZSBza2FycCB1dC4nOml0ZW0ud2lkdGg+cmVjKjI\/J0JpbGRlbiDDpHIgbXlja2V0IGJyZWRhcmUgw6RuIG7DtmR2w6RuZGlndC4gRW4gbWluZHJlIHZlcnNpb24gc2t1bGxlIGxhZGRhcyBzbmFiYmFyZS4nOidCcmVkZGVuIHNlciBsw6RtcGxpZyB1dC4nfQogZWxzZSBpZihpc0N1c3RvbVdpZHRoKGl0ZW0pKXQ9J0FuZ2UgYmlsZGJyZWRkZW4gaSBweCBmw7ZyIGF0dCBqw6RtZsO2cmEgZGVuIG1lZCBiaWxkZW4uJzsKIGVsc2UgaWYoYXJlYT09PSd3ZWJzaXRlJyYmaXRlbS53UGxhY2VtZW50PT09J25vbmUnKXQ9J1bDpGxqIGVuIHBsYWNlcmluZyBmw7ZyIGF0dCBzZSBlbiByZWtvbW1lbmRlcmFkIGJyZWRkLic7CiBpZih0KWhpbnQoY2FyZCx0KTsKIGlmKGl0ZW0udHlwZSYmIUNNX0FDQ0VQVEVELmluY2x1ZGVzKGl0ZW0udHlwZSkpaGludChjYXJkLHR5cGVMYWJlbChpdGVtLnR5cGUpKyctZmlsZXIga2FuIGludGUgbGFkZGFzIHVwcCB0aWxsIG1lZGllYXJraXZldCBpIENvbmZlcmVuY2UgTWFuYWdlci4nKyhhcmVhPT09J2VtYWlsJz8nIFZpYSBCaWxkIChVUkwpIHZpc2FzIGRlIGthbnNrZSBpbnRlIGbDtnIgYWxsYSBtb3R0YWdhcmUuJzonJyksJ3dhcm4nKTsKIGlmKCFpdGVtLnR5cGUpaGludChjYXJkLCdGb3JtYXRldCBrdW5kZSBpbnRlIGF2Z8O2cmFzIHV0aWZyw6VuIFVSTDplbi4nKTsKIGlmKGl0ZW0uZmlsZS5zaXplPjUwMCpLQiloaW50KGNhcmQsaXRlbS5maWxlLnNpemU+TUI\/J0ZpbGVuIMOkciDDtnZlciAxIE1CLiDDlnZlcnbDpGcgYXR0IG9wdGltZXJhIGRlbi4nOifDlnZlcnbDpGcgYXR0IGfDtnJhIGRlbiBow6RyIGdhbnNrYSBzdG9yYSBmaWxlbiBtaW5kcmUuJyxpdGVtLmZpbGUuc2l6ZT5NQj8nd2Fybic6JycpOwogZWxzZSBpZighaXRlbS5maWxlLnNpemUpaGludChjYXJkLCdGaWxzdG9ybGVrZW4ga2FuIGludGUgbMOkc2FzIGVmdGVyc29tIHdlYmJwbGF0c2VuIGTDpHIgYmlsZGVuIGxpZ2dlciBpbnRlIHRpbGzDpXRlciBkZXQuIFNwYXJhIGJpbGRlbiBww6UgZGluIGRhdG9yIG9jaCBsw6RnZyB0aWxsIGRlbiBvdmFuIGbDtnIgYXR0IGtvbnRyb2xsZXJhIGZpbHN0b3JsZWtlbiBlbGxlciBrb252ZXJ0ZXJhIGJpbGRlbi4nLCd3YXJuJyk7CiBjb25zdCB2PWVsKCdkaXYnLCdjaWwtdmlldycpLGltPWVsKCdpbWcnKTtpbS5hbHQ9J0bDtnJoYW5kc3Zpc25pbmc6ICcraXRlbS5maWxlLm5hbWU7aW0ucmVmZXJyZXJQb2xpY3k9J25vLXJlZmVycmVyJztpbS5zcmM9aXRlbS5zcmNVcmw7di5zdHlsZS5oZWlnaHQ9JzE4MHB4Jzt2LmFwcGVuZChpbSk7Y2FyZC5hcHBlbmQodik7Cn0KYXN5bmMgZnVuY3Rpb24gY2hlY2tVcmwocmF3KXsKIGxldCB1O3RyeXt1PW5ldyBVUkwocmF3KX1jYXRjaChlKXt1PW51bGx9CiBpZighdXx8IS9eaHR0cHM\/OiQvLnRlc3QodS5wcm90b2NvbCkpe3N0YXR1cygnQW5nZSBlbiBmdWxsc3TDpG5kaWcgYmlsZC1VUkwgc29tIGLDtnJqYXIgbWVkIGh0dHBzOi8vJyk7JCgnY2lsLXVybCcpLmZvY3VzKCk7cmV0dXJufQogaWYoaXRlbXMuc29tZShpPT5pLnNyY1VybD09PXUuaHJlZikpe3N0YXR1cygnQmlsZGVuIGZpbm5zIHJlZGFuIGkgbGlzdGFuLicpO3JldHVybn0KIGNvbnN0IGJ0bj0kKCdjaWwtdXJsLWJ0bicpO2J0bi5kaXNhYmxlZD10cnVlO2J0bi50ZXh0Q29udGVudD0nTMOkZ2dlciB0aWxs4oCmJzt0cmFjaygndXJsJyk7c3RhdHVzKCdLb250cm9sbGVyYXIgYmlsZOKApicpOwogbGV0IG5hbWU9J2ltYWdlJzt0cnl7bmFtZT1kZWNvZGVVUklDb21wb25lbnQodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpfHwnJyl8fHUuaG9zdG5hbWV9Y2F0Y2goZSl7bmFtZT11Lmhvc3RuYW1lfW5hbWU9bmFtZS5zbGljZSgwLDE1MCk7CiB0cnl7CiAgdHJ5ewogICBjb25zdCBjdGw9bmV3IEFib3J0Q29udHJvbGxlcigpLHRtPXNldFRpbWVvdXQoKCk9PmN0bC5hYm9ydCgpLDE1MDAwKTsKICAgY29uc3Qgcj1hd2FpdCBmZXRjaCh1LmhyZWYse21vZGU6J2NvcnMnLGNyZWRlbnRpYWxzOidvbWl0JyxyZWZlcnJlclBvbGljeTonbm8tcmVmZXJyZXInLHNpZ25hbDpjdGwuc2lnbmFsfSk7Y2xlYXJUaW1lb3V0KHRtKTsKICAgaWYoci5vayl7Y29uc3QgYmxvYj1hd2FpdCByLmJsb2IoKTtjb25zdCBiZWZvcmU9aXRlbXMubGVuZ3RoO2F3YWl0IGFkZEZpbGVzKFtuZXcgRmlsZShbYmxvYl0sbmFtZSx7dHlwZTpibG9iLnR5cGUsbGFzdE1vZGlmaWVkOjB9KV0pO2lmKGl0ZW1zLmxlbmd0aD5iZWZvcmUpe2l0ZW1zW2l0ZW1zLmxlbmd0aC0xXS5zcmNVcmw9dS5ocmVmOyQoJ2NpbC11cmwnKS52YWx1ZT0nJztzdGF0dXMoJ0JpbGRlbiBoYXIgaMOkbXRhdHMgZnLDpW4gVVJMOmVuLiBGaWxzdG9ybGVrLCBmb3JtYXQgb2NoIGtvbnZlcnRlcmluZyDDpHIgdGlsbGfDpG5nbGlnYS4nKX1yZXR1cm59CiAgfWNhdGNoKGUpe30KICBjb25zdCBpbWc9YXdhaXQgbmV3IFByb21pc2UoKHJlcyxyZWopPT57Y29uc3QgaW09bmV3IEltYWdlKCksdG09c2V0VGltZW91dCgoKT0+cmVqKEVycm9yKCd0aW1lb3V0JykpLDE1MDAwKTtpbS5yZWZlcnJlclBvbGljeT0nbm8tcmVmZXJyZXInO2ltLm9ubG9hZD0oKT0+e2NsZWFyVGltZW91dCh0bSk7cmVzKGltKX07aW0ub25lcnJvcj0oKT0+e2NsZWFyVGltZW91dCh0bSk7cmVqKEVycm9yKCdsb2FkJykpfTtpbS5zcmM9dS5ocmVmfSk7CiAgY29uc3QgdHlwZT1FWFRfVFlQRVtleHRPZih1LnBhdGhuYW1lKV18fCcnO2xldCBzaXplPTA7CiAgdHJ5e2NvbnN0IGVuPXBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUodS5ocmVmKS5wb3AoKTtzaXplPWVuPyhlbi5lbmNvZGVkQm9keVNpemV8fDApOjB9Y2F0Y2goZSl7fQogIGl0ZW1zLnB1c2goe2lkOnNlcmlhbCsrLGtleTondXJsOicrdS5ocmVmLHNyY1VybDp1LmhyZWYsdXJsT25seTp0cnVlLGZpbGU6e25hbWUsc2l6ZX0sdHlwZSxjbGFpbWVkOnR5cGUsbWlzbWF0Y2g6ZmFsc2Usd2lkdGg6aW1nLm5hdHVyYWxXaWR0aCxoZWlnaHQ6aW1nLm5hdHVyYWxIZWlnaHQsbG9hZGluZzpmYWxzZSxlcnJvcjonJyxmcmFtZXM6MCxhbmltYXRlZDpmYWxzZSxsYXlvdXQ6JzEnLGxheW91dFdpZHRoOjAsc2l0ZVdpZHRoOjAsbGF5b3V0V2lkdGhVbml0OidweCcsc2l0ZVdpZHRoVW5pdDoncHgnLHNpdGVCYXNlOjAsd1BsYWNlbWVudDonbm9uZScsd1RoZW1lOidhJyx3VmFyaWFudDonMCcsY29tcGFyZTpmYWxzZSx0cmFuc3A6ZmFsc2UsdG9sOjQwLGNsaWNrczpbXSxhY3R1YWw6ZmFsc2UsdXJsczp7fSxvdXRwdXQ6J29yaWdpbmFsJyxyZXNpemU6J29yaWdpbmFsJyxjdXN0b21XaWR0aDowLHF1YWxpdHk6ODIscmVzdWx0Om51bGwsYnVzeTpmYWxzZSxyZXY6MH0pOwogICQoJ2NpbC11cmwnKS52YWx1ZT0nJztyZW5kZXIoKTtzdGF0dXMoc2l6ZT8nQmlsZGVuIGhhciBrb250cm9sbGVyYXRzIGZyw6VuIFVSTDplbi4nOidCaWxkZW4gaGFyIGtvbnRyb2xsZXJhdHMgZnLDpW4gVVJMOmVuLiBGaWxzdG9ybGVrZW4ga3VuZGUgaW50ZSBsw6RzYXMgZnLDpW4gZGVuIGjDpHIgd2ViYnBsYXRzZW4uJyk7CiB9Y2F0Y2goZSl7c3RhdHVzKCdCaWxkZW4ga3VuZGUgaW50ZSBow6RtdGFzLiBLb250cm9sbGVyYSBhdHQgVVJMOmVuIHBla2FyIGRpcmVrdCBww6UgZW4gYmlsZGZpbCBvY2ggw6RyIG9mZmVudGxpZ3QgdGlsbGfDpG5nbGlnLicpfQogZmluYWxseXtidG4uZGlzYWJsZWQ9ZmFsc2U7YnRuLnRleHRDb250ZW50PSdMw6RnZyB0aWxsIGJpbGQgZnLDpW4gVVJMJ30KfQokKCdjaWwtdXJsLWZvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLGU9PntlLnByZXZlbnREZWZhdWx0KCk7Y2hlY2tVcmwoJCgnY2lsLXVybCcpLnZhbHVlLnRyaW0oKSl9KTsKZnVuY3Rpb24gcmVuZGVyKCl7dGh1bWJzKCk7CiBjb25zdCBmYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50LGZvY3VzSWQ9ZmEmJnJvb3QuY29udGFpbnMoZmEpJiZmYS5kYXRhc2V0P2ZhLmRhdGFzZXQuZjpudWxsOwogY29uc3QgbGlzdD0kKCdjaWwtZmlsZXMnKSxwcmV2SD1saXN0Lm9mZnNldEhlaWdodDskKCdjaWwtcmVzdWx0cycpLmNsYXNzTGlzdC50b2dnbGUoJ2NpbC1oaWRlJywhaXRlbXMubGVuZ3RoKTtsaXN0LnJlcGxhY2VDaGlsZHJlbigpOwogLyoga2VlcCB0aGUgcGFnZSBmcm9tIGp1bXBpbmcgd2hpbGUgYW4gaW1hZ2UgaXMgcmUtb3B0aW1pc2VkIChlLmcuIGFmdGVyIGEgY2xpY2sgdG8gcmVtb3ZlIGFuIGFyZWEpICovCiBsaXN0LnN0eWxlLm1pbkhlaWdodD1pdGVtcy5zb21lKGk9PmkuYnVzeSkmJnByZXZIP3ByZXZIKydweCc6Jyc7CiBjb25zdCBkb25lPWl0ZW1zLmZpbHRlcihpPT5pLnJlc3VsdCk7JCgnY2lsLW9wdGFsbCcpLmRpc2FibGVkPW9wdEJ1c3l8fCFpdGVtcy5zb21lKGk9PmNhbk9wdGltaXNlKGkpJiYhaS5yZXN1bHQpOyQoJ2NpbC1vcHRhbGwnKS50ZXh0Q29udGVudD1vcHRCdXN5PydPcHRpbWVyYXLigKYnOidPcHRpbWVyYSBhbGxhIGJpbGRlcic7JCgnY2lsLXppcCcpLmRpc2FibGVkPSFkb25lLmxlbmd0aHx8emlwQnVzeTskKCdjaWwtemlwJykudGV4dENvbnRlbnQ9emlwQnVzeT8nRsO2cmJlcmVkZXIgWklQ4oCmJzonTGFkZGEgbmVyIG9wdGltZXJhZGUgYmlsZGVyIHNvbSBaSVAnOwogJCgnY2lsLXppcC1ub3RlJykudGV4dENvbnRlbnQ9ZG9uZS5sZW5ndGg\/ZG9uZS5sZW5ndGgrKGRvbmUubGVuZ3RoPT09MT8nIG9wdGltZXJhZCAnOicgb3B0aW1lcmFkZSAnKSsoZG9uZS5sZW5ndGg9PT0xPydiaWxkJzonYmlsZGVyJykrJyBrbGFyYSBmw7ZyIFpJUC4nOidPcHRpbWVyYSBtaW5zdCBlbiBiaWxkIGbDtnIgYXR0IGt1bm5hIGxhZGRhIG5lciBlbiBaSVAuJzsKIGlmKCFpdGVtcy5sZW5ndGgpcmV0dXJuOwogY29uc3QgdG90YWw9aXRlbXMucmVkdWNlKChzLGkpPT5zK2kuZmlsZS5zaXplLDApLG1peGVkPWl0ZW1zLnJlZHVjZSgocyxpKT0+cysoaS5yZXN1bHQ\/aS5yZXN1bHQuYmxvYi5zaXplOmkuZmlsZS5zaXplKSwwKSxzdW09JCgnY2lsLXN1bW1hcnknKSxuPWl0ZW1zLmxlbmd0aCsoaXRlbXMubGVuZ3RoPT09MT8nIGJpbGQnOicgYmlsZGVyJykrJyB2YWxkYSc7CiBjb25zdCBzdGF0PShsLHYsc3ViLHRvbmUsaGVscCk9Pntjb25zdCBkPWVsKCdkaXYnLCdjaWwtc3RhdCcrKHRvbmU\/JyBjaWwtc3RhdC0nK3RvbmU6JycpKSxsYj1lbCgnc3BhbicsJ2NpbC1zdGF0LWxhYmVsJyxsKTtsZXQgdGlwPW51bGw7aWYoaGVscClsYi5hcHBlbmQoaGVscFRpcChoZWxwLCdzdGF0LScrbCkpO2QuYXBwZW5kKGxiLGVsKCdzdHJvbmcnLCdjaWwtc3RhdC12YWx1ZScsdikpO2lmKHN1YilkLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1zdGF0LXN1Yicsc3ViKSk7cmV0dXJuIGR9OwogY29uc3QgdW5rbm93bj1hcmVhPT09J2VtYWlsJz9pdGVtcy5maWx0ZXIoaT0+aS51cmxPbmx5JiYhaS5maWxlLnNpemUpLmxlbmd0aDowOwogY29uc3Qgc2F2ZWQ9ZG9uZS5sZW5ndGgmJnRvdGFsP01hdGgucm91bmQoKDEtbWl4ZWQvdG90YWwpKjEwMCk6MCxhdHRuPWl0ZW1zLmZpbHRlcihpPT5sZXZlbChpKT49MikubGVuZ3RoLGF0dG5NYXg9aXRlbXMucmVkdWNlKChtLGkpPT5NYXRoLm1heChtLGxldmVsKGkpKSwwKSxncmlkPWVsKCdkaXYnLCdjaWwtc3RhdHMnKTsKIGdyaWQuYXBwZW5kKHN0YXQoJ0JpbGRlcicsU3RyaW5nKGl0ZW1zLmxlbmd0aCksZG9uZS5sZW5ndGg\/ZG9uZS5sZW5ndGgrJyBvcHRpbWVyYWRlJzonSW5nZW4gb3B0aW1lcmFkIMOkbm51JyksKGFyZWE9PT0nZW1haWwnP3N0YXQoJ1NhbW1hbmxhZ2QgZmlsc3RvcmxlayBmw7ZyIGJpbGRlcicsKHVua25vd24\/J01pbnN0ICc6JycpK2ZtdChtaXhlZCksZW1haWxWZXJkaWN0KG1peGVkKSsodW5rbm93bj8nICcrdW5rbm93bisodW5rbm93bj4xPycgYmlsZHN0b3JsZWthcic6JyBiaWxkc3RvcmxlaycpKycga3VuZGUgaW50ZSBsw6RzYXMsIHPDpSBkZW4gdmVya2xpZ2Egc3VtbWFuIMOkciBow7ZncmUuJzonJyksbWl4ZWQ8PU1CPydnb29kJzptaXhlZDw9MipNQj8nd2Fybic6J2FsZXJ0JywnRGV0IGjDpHIgw6RyIGJpbGRmaWxlcm5hcyBzYW1tYW5sYWdkYSBzdG9ybGVrLiBEZXQgc2tpY2thZGUgZS1wb3N0bWVkZGVsYW5kZXQga2FuIGJsaSBzdMO2cnJlLCBlZnRlcnNvbSBiaWxkZXJuYSBrb2RhcyBuw6RyIGRldCBza2lja2FzLiBHcsOkbnNlcm5hIMOkciByaWt0bGluamVyLCBpbnRlIGdyw6Ruc2VyIGkgQ29uZmVyZW5jZSBNYW5hZ2VyLicpOnN0YXQoJ1NhbW1hbmxhZ2QgZmlsc3RvcmxlaycsZm10KHRvdGFsKSwnU3VtbWFuIGF2IGFsbGEgdmFsZGEgYmlsZGVyJywnJywnT20gYWxsYSBiaWxkZXJuYSBmaW5ucyBww6Ugc2FtbWEgc2lkYSBww6V2ZXJrYXIgc3VtbWFuIGh1ciBzbmFiYnQgc2lkYW4gbGFkZGFzLiBPbSBkZSBmaW5ucyBww6Ugb2xpa2Egc2lkb3IgYmV0eWRlciB2YXJqZSBiaWxkcyBmaWxzdG9ybGVrIG1lci4nKSksc3RhdCgnRWZ0ZXIgb3B0aW1lcmluZycsZG9uZS5sZW5ndGg\/Zm10KG1peGVkKTon4oCTJyxkb25lLmxlbmd0aD8oc2F2ZWQ+MD9zYXZlZCsnJSBtaW5kcmUnOidJbmdlbiBtaW5za25pbmcnKTonT3B0aW1lcmEgZsO2ciBhdHQgc2UgcmVzdWx0YXRldCcsZG9uZS5sZW5ndGgmJnNhdmVkPjA\/J2dvb2QnOicnLCdEZW4gc2FtbWFubGFnZGEgc3Rvcmxla2VuIHDDpSBhbGxhIGJpbGRlciBlZnRlciBvcHRpbWVyaW5nLiBCaWxkZXIgc29tIGR1IGludGUgaGFyIG9wdGltZXJhdCByw6RrbmFzIG1lZCBzaW4gdXJzcHJ1bmdsaWdhIHN0b3JsZWsuJyksc3RhdCgnQmVow7Z2ZXIgw6V0Z8OkcmRhcycsU3RyaW5nKGF0dG4pLGF0dG4\/KGF0dG49PT0xPycxIGJpbGQgaGFyIGV0dCBtZWRkZWxhbmRlJzphdHRuKycgYmlsZGVyIGhhciBldHQgbWVkZGVsYW5kZScpKycgbmVkYW4nOidBbGxhIHNlciBicmEgdXQnLGF0dG5NYXg+PTM\/J2FsZXJ0JzphdHRuPyd3YXJuJzonZ29vZCcsJ1LDpGtuYXIgYmlsZGVyIG1lZCBldHQgZ3VsdCBlbGxlciBvcmFuZ2UgbWVkZGVsYW5kZS4gR3LDtm50IGJldHlkZXIgYXR0IGJyZWRkIG9jaCBmaWxzdG9ybGVrIHBhc3NhciBkZW4gdmFsZGEgcGxhY2VyaW5nZW4uJykpOwogc3VtLnJlcGxhY2VDaGlsZHJlbihlbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ8OWdmVyc2lrdCcpLGdyaWQpO3ZvaWQgbjsKIAogZm9yKGNvbnN0IGl0ZW0gb2YgaXRlbXMpewogIGNvbnN0IGNhcmQ9ZWwoJ2RpdicsJ2NpbC1maWxlJyksdG9wPWVsKCdkaXYnLCdjaWwtZmlsZXRvcCcpOwogIHRvcC5hcHBlbmQoZWwoJ2gzJywnY2lsLWZpbGVuYW1lJyxpdGVtLmZpbGUubmFtZXx8J05hbW5sw7ZzIGZpbCcpLGJ1dHRvbignVGEgYm9ydCcsKCk9Pntjb25zdCBpZHg9aXRlbXMuaW5kZXhPZihpdGVtKTtkaXNjYXJkKGl0ZW0pO2l0ZW1zPWl0ZW1zLmZpbHRlcih4PT54IT09aXRlbSk7cmVuZGVyKCk7Y29uc3QgbmV4dD1pdGVtc1tNYXRoLm1pbihpZHgsaXRlbXMubGVuZ3RoLTEpXTtjb25zdCBmPW5leHQmJnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtZj0iJytuZXh0LmlkKyctcm0iXScpOyhmfHwkKCdjaWwtYWRkJykpLmZvY3VzKCl9LCdjaWwtYnRuLXRleHQnLGl0ZW0uaWQrJy1ybScpKTsKICBjYXJkLmFwcGVuZCh0b3ApO2NvbnN0IG09ZWwoJ2RpdicsJ2NpbC1tZXRyaWNzJyk7CiAgbS5hcHBlbmQobWV0cmljKGl0ZW0udXJsT25seT8nRmlsc3Rvcmxlayc6J1Vyc3BydW5nbGlnIGZpbHN0b3JsZWsnLGl0ZW0udXJsT25seSYmIWl0ZW0uZmlsZS5zaXplPydJbnRlIHRpbGxnw6RuZ2xpZyc6Zm10KGl0ZW0uZmlsZS5zaXplKSksbWV0cmljKCdNw6V0dCcsaXRlbS5sb2FkaW5nPydMw6RzZXLigKYnOml0ZW0ud2lkdGg\/aXRlbS53aWR0aCsnIMOXICcraXRlbS5oZWlnaHQrJyBweCc6J0ludGUgdGlsbGfDpG5nbGlnJyksbWV0cmljKCdGb3JtYXQnLGl0ZW0udXJsT25seT8oaXRlbS50eXBlP3R5cGVMYWJlbChpdGVtLnR5cGUpKycgKGZyw6VuIFVSTCknOidPa8OkbnQnKTpmb3JtYXRUZXh0KGl0ZW0pKSk7Y2FyZC5hcHBlbmQobSk7CiAgaWYoYXJlYT09PSdlbWFpbCcpY2FyZC5hcHBlbmQoZW1haWxGaWVsZHMoaXRlbSkpOwogIGVsc2UgY2FyZC5hcHBlbmQod2Vic2l0ZUZpZWxkcyhpdGVtKSk7CiAgaWYoaXRlbS51cmxPbmx5KXt1cmxCb2R5KGNhcmQsaXRlbSk7Y29uc3QgdWE9ZWwoJ2RpdicsJ2NpbC1hY3Rpb25zJyk7Y2FyZC5hcHBlbmQodWEpO2xpc3QuYXBwZW5kKGNhcmQpO2NvbnRpbnVlfQogIGFkdmljZUZvcihjYXJkLGl0ZW0pOwogIGlmKCFpdGVtLmxvYWRpbmcmJiFpdGVtLmVycm9yKWNvbnRyb2xzRm9yKGNhcmQsaXRlbSk7CiAgY29uc3QgYWN0cz1lbCgnZGl2JywnY2lsLWFjdGlvbnMnKSxvcHQ9YnV0dG9uKGl0ZW0uYnVzeT8nQXJiZXRhcuKApic6J09wdGltZXJhIC8ga29udmVydGVyYScsKCk9Pm9wdGltaXNlKGl0ZW0pLCcnLGl0ZW0uaWQrJy1vcHQnKTtvcHQuZGlzYWJsZWQ9IWNhbk9wdGltaXNlKGl0ZW0pO2FjdHMuYXBwZW5kKG9wdCk7CiAgaWYoaXRlbS5yZXN1bHQpe3Jlc3VsdEZvcihjYXJkLGl0ZW0pO2lmKCFpdGVtLnJlc3VsdC5rZXB0T3JpZ2luYWwmJiFpdGVtLmNvbXBhcmUpYWN0cy5hcHBlbmQoYnV0dG9uKCdMYWRkYSBuZXIgJyt0eXBlTGFiZWwoaXRlbS5yZXN1bHQudHlwZSksKCk9Pnt0cmFjaygnZG93bmxvYWQnKTtkb3dubG9hZChpdGVtLnJlc3VsdC5ibG9iLGl0ZW0ucmVzdWx0Lm5hbWUpfSwnY2lsLWJ0bi1zZWNvbmRhcnknLGl0ZW0uaWQrJy1kbCcpKX0KICBpZihpdGVtLnJlc3VsdCl7Y29uc3QgcHY9YnV0dG9uKGl0ZW0uY29tcGFyZT8nRMO2bGogasOkbWbDtnJlbHNlJzonSsOkbWbDtnIgbWVkIG9yaWdpbmFsJywoKT0+e2l0ZW0uY29tcGFyZT0haXRlbS5jb21wYXJlO2lmKCFpdGVtLmNvbXBhcmUpe2Ryb3BVcmwoaXRlbSwnb3JpZycpO2Ryb3BVcmwoaXRlbSwncmVzJyl9cmVuZGVyKCl9LCdjaWwtYnRuLXRleHQnLGl0ZW0uaWQrJy1wdicpO3B2LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsU3RyaW5nKGl0ZW0uY29tcGFyZSkpO2FjdHMuYXBwZW5kKHB2KTtpZihpdGVtLmNvbXBhcmUpcHJldmlld0ZvcihjYXJkLGl0ZW0pfQogIGNhcmQuYXBwZW5kKGFjdHMpO2xpc3QuYXBwZW5kKGNhcmQpOwogfQogaWYoZm9jdXNJZCl7Y29uc3QgZj1yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWY9IicrZm9jdXNJZCsnIl0nKTtpZihmJiYhZi5kaXNhYmxlZClmLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOnRydWV9KX0KfQpmdW5jdGlvbiBkb3dubG9hZChibG9iLG5hbWUpe2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpLHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO2EuaHJlZj11cmw7YS5kb3dubG9hZD1uYW1lO2EucmVsPSdub29wZW5lcic7YS5zdHlsZS5kaXNwbGF5PSdub25lJztkb2N1bWVudC5ib2R5LmFwcGVuZChhKTthLmNsaWNrKCk7YS5yZW1vdmUoKTtzZXRUaW1lb3V0KCgpPT5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCksNjAwMDApfQovKiAtLS0tLS0tLS0tIFpJUCAoU1RPUkUsIFVURi04IG5hbWVzLCBDUkMtMzIpIC0tLS0tLS0tLS0gKi8KY29uc3QgQ1JDX1RBQkxFPSgoKT0+e2NvbnN0IHQ9bmV3IFVpbnQzMkFycmF5KDI1Nik7Zm9yKGxldCBuPTA7bjwyNTY7bisrKXtsZXQgYz1uO2ZvcihsZXQgaz0wO2s8ODtrKyspYz1jJjE\/MHhFREI4ODMyMF4oYz4+PjEpOmM+Pj4xO3Rbbl09Yz4+PjB9cmV0dXJuIHR9KSgpOwpmdW5jdGlvbiBjcmMzMihkKXtsZXQgYz0weEZGRkZGRkZGO2ZvcihsZXQgaT0wO2k8ZC5sZW5ndGg7aSsrKWM9Q1JDX1RBQkxFWyhjXmRbaV0pJjI1NV1eKGM+Pj44KTtyZXR1cm4gKGNeMHhGRkZGRkZGRik+Pj4wfQpmdW5jdGlvbiB6aXBCbG9iKGVudHJpZXMpewogY29uc3QgZW5jPW5ldyBUZXh0RW5jb2RlcigpLG5vdz1uZXcgRGF0ZSgpLHRpbWU9KG5vdy5nZXRIb3VycygpPDwxMSl8KG5vdy5nZXRNaW51dGVzKCk8PDUpfChub3cuZ2V0U2Vjb25kcygpPj4xKSxkYXRlPSgoTWF0aC5tYXgoMTk4MCxub3cuZ2V0RnVsbFllYXIoKSktMTk4MCk8PDkpfCgobm93LmdldE1vbnRoKCkrMSk8PDUpfG5vdy5nZXREYXRlKCk7CiBjb25zdCBwYXJ0cz1bXSxjZW50cmFsPVtdO2xldCBvZmZzZXQ9MDsKIGZvcihjb25zdCBlIG9mIGVudHJpZXMpewogIGNvbnN0IG5hbWU9ZW5jLmVuY29kZShlLm5hbWUpLHNpemU9ZS5ibG9iLnNpemUsaD1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDMwKSksZD1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDQ2KSk7CiAgaC5zZXRVaW50MzIoMCwweDA0MDM0YjUwLHRydWUpO2guc2V0VWludDE2KDQsMjAsdHJ1ZSk7aC5zZXRVaW50MTYoNiwweDA4MDAsdHJ1ZSk7aC5zZXRVaW50MTYoOCwwLHRydWUpO2guc2V0VWludDE2KDEwLHRpbWUsdHJ1ZSk7aC5zZXRVaW50MTYoMTIsZGF0ZSx0cnVlKTtoLnNldFVpbnQzMigxNCxlLmNyYyx0cnVlKTtoLnNldFVpbnQzMigxOCxzaXplLHRydWUpO2guc2V0VWludDMyKDIyLHNpemUsdHJ1ZSk7aC5zZXRVaW50MTYoMjYsbmFtZS5sZW5ndGgsdHJ1ZSk7aC5zZXRVaW50MTYoMjgsMCx0cnVlKTsKICBkLnNldFVpbnQzMigwLDB4MDIwMTRiNTAsdHJ1ZSk7ZC5zZXRVaW50MTYoNCwyMCx0cnVlKTtkLnNldFVpbnQxNig2LDIwLHRydWUpO2Quc2V0VWludDE2KDgsMHgwODAwLHRydWUpO2Quc2V0VWludDE2KDEwLDAsdHJ1ZSk7ZC5zZXRVaW50MTYoMTIsdGltZSx0cnVlKTtkLnNldFVpbnQxNigxNCxkYXRlLHRydWUpO2Quc2V0VWludDMyKDE2LGUuY3JjLHRydWUpO2Quc2V0VWludDMyKDIwLHNpemUsdHJ1ZSk7ZC5zZXRVaW50MzIoMjQsc2l6ZSx0cnVlKTtkLnNldFVpbnQxNigyOCxuYW1lLmxlbmd0aCx0cnVlKTtkLnNldFVpbnQzMig0MixvZmZzZXQsdHJ1ZSk7CiAgcGFydHMucHVzaChuZXcgVWludDhBcnJheShoLmJ1ZmZlciksbmFtZSxlLmJsb2IpO2NlbnRyYWwucHVzaChuZXcgVWludDhBcnJheShkLmJ1ZmZlciksbmFtZSk7CiAgb2Zmc2V0Kz0zMCtuYW1lLmxlbmd0aCtzaXplO2lmKG9mZnNldD4weEZGRkZGRkZGKXRocm93IEVycm9yKCdaSVAtZmlsZW4gc2t1bGxlIGJsaSBzdMO2cnJlIMOkbiA0IEdCLiBMYWRkYSBuZXIgZsOkcnJlIGJpbGRlciDDpXQgZ8Olbmdlbi4nKTsKIH0KIGNvbnN0IGNzaXplPWNlbnRyYWwucmVkdWNlKChzLHgpPT5zK3gubGVuZ3RoLDApLGVuZD1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDIyKSk7CiBlbmQuc2V0VWludDMyKDAsMHgwNjA1NGI1MCx0cnVlKTtlbmQuc2V0VWludDE2KDgsZW50cmllcy5sZW5ndGgsdHJ1ZSk7ZW5kLnNldFVpbnQxNigxMCxlbnRyaWVzLmxlbmd0aCx0cnVlKTtlbmQuc2V0VWludDMyKDEyLGNzaXplLHRydWUpO2VuZC5zZXRVaW50MzIoMTYsb2Zmc2V0LHRydWUpOwogcmV0dXJuIG5ldyBCbG9iKHBhcnRzLmNvbmNhdChjZW50cmFsLFtuZXcgVWludDhBcnJheShlbmQuYnVmZmVyKV0pLHt0eXBlOidhcHBsaWNhdGlvbi96aXAnfSk7Cn0KZnVuY3Rpb24gdW5pcXVlTmFtZXMobGlzdCl7Y29uc3QgdXNlZD1uZXcgU2V0KCk7cmV0dXJuIGxpc3QubWFwKGk9Pntjb25zdCBuYW1lPWkucmVzdWx0Lm5hbWUsZG90PW5hbWUubGFzdEluZGV4T2YoJy4nKSxiYXNlPW5hbWUuc2xpY2UoMCxkb3QpLGV4dD1uYW1lLnNsaWNlKGRvdCk7bGV0IG49bmFtZSxrPTI7d2hpbGUodXNlZC5oYXMobi50b0xvd2VyQ2FzZSgpKSluPWJhc2UrJyAoJysoaysrKSsnKScrZXh0O3VzZWQuYWRkKG4udG9Mb3dlckNhc2UoKSk7cmV0dXJuIHtuYW1lOm4sYmxvYjppLnJlc3VsdC5ibG9iLGNyYzppLnJlc3VsdC5jcmN9fSl9CiQoJ2NpbC1vcHRhbGwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsYXN5bmMoKT0+ewogaWYob3B0QnVzeSlyZXR1cm47Y29uc3QgbGlzdD1pdGVtcy5maWx0ZXIoaT0+Y2FuT3B0aW1pc2UoaSkmJiFpLnJlc3VsdCk7aWYoIWxpc3QubGVuZ3RoKXJldHVybjtvcHRCdXN5PXRydWU7bGV0IG49MDsKIGZvcihjb25zdCBpdCBvZiBsaXN0KXtpZighYWxpdmUoaXQpfHwhY2FuT3B0aW1pc2UoaXQpKWNvbnRpbnVlO24rKztzdGF0dXMoJ09wdGltZXJhciBiaWxkICcrbisnIGF2ICcrbGlzdC5sZW5ndGgrJ+KApicpO3RyeXthd2FpdCBvcHRpbWlzZShpdCl9Y2F0Y2goZSl7fX0KIG9wdEJ1c3k9ZmFsc2U7cmVuZGVyKCk7c3RhdHVzKCdLbGFydC4gSsOkbWbDtnIgdmFyamUgcmVzdWx0YXQgbWVkIG9yaWdpbmFsZXQgaW5uYW4gZHUgYW52w6RuZGVyIGRldC4nKX0pOwokKCdjaWwtemlwJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57CiBpZih6aXBCdXN5KXJldHVybjtjb25zdCByZWFkeT1pdGVtcy5maWx0ZXIoaT0+aS5yZXN1bHQpO2lmKCFyZWFkeS5sZW5ndGgpcmV0dXJuOwogaWYocmVhZHkubGVuZ3RoPk1BWF9aSVBfRklMRVMpe3N0YXR1cygnTGFkZGEgbmVyIGjDtmdzdCAnK01BWF9aSVBfRklMRVMrJyBiaWxkZXIgw6V0IGfDpW5nZW4uJyk7cmV0dXJufQogemlwQnVzeT10cnVlO3JlbmRlcigpOwogdHJ5e3RyYWNrKCd6aXAnKTtkb3dubG9hZCh6aXBCbG9iKHVuaXF1ZU5hbWVzKHJlYWR5KSksJ2NtLW9wdGltaXNlZC1pbWFnZXMuemlwJyk7c3RhdHVzKCdaSVAgbmVkbGFkZGFkIG1lZCAnK3JlYWR5Lmxlbmd0aCsocmVhZHkubGVuZ3RoPT09MT8nIGJpbGQuJzonIGJpbGRlci4nKSl9CiBjYXRjaChlKXtzdGF0dXMoJ1pJUC1uZWRsYWRkbmluZ2VuIG1pc3NseWNrYWRlczogJytlLm1lc3NhZ2UpfQogZmluYWxseXt6aXBCdXN5PWZhbHNlO3JlbmRlcigpfQp9KTsKcmVuZGVyKCk7Cn0pKCk7Cn0KaWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSdsb2FkaW5nJyl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsY2lsU3RhcnQpfWVsc2V7Y2lsU3RhcnQoKX19KSgpOw==\")));(new Function(c))()}catch(e){if(window.console){console.error('CM image checker:',e)}}})();\n\n<\/script>\n\n<section id=\"cm-image-lab\" data-cmac-toc-skip aria-label=\"Bildkontroll och optimering\">\n <div class=\"cil-card cil-intro\">\n  <p class=\"cil-lead\">Kontrollera bilders m\u00e5tt (px), filstorlekar (KB\/MB) och format. Optimera eller konvertera bilder innan du l\u00e4gger till dem i Conference Manager.<\/p>\n  <div class=\"cil-label\" id=\"cil-area-label\">Var ska du anv\u00e4nda dina bilder?<\/div>\n  <div class=\"cil-options\" role=\"group\" aria-labelledby=\"cil-area-label\"><button type=\"button\" class=\"cil-choice\" data-area=\"website\" aria-pressed=\"true\"><span class=\"cil-choice-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><path d=\"M2 12h20\"><\/path><path d=\"M12 2a15 15 0 0 1 0 20a15 15 0 0 1 0-20\"><\/path><\/svg><\/span><span class=\"cil-choice-text\"><span class=\"cil-choice-name\">Webbdesigner<\/span><span class=\"cil-choice-desc\">Bilder till ditt evenemangs webbplats<\/span><\/span><span class=\"cil-choice-check\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"><\/path><\/svg><\/span><\/button><button type=\"button\" class=\"cil-choice\" data-area=\"email\" aria-pressed=\"false\"><span class=\"cil-choice-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"><\/rect><path d=\"m22 7-10 6L2 7\"><\/path><\/svg><\/span><span class=\"cil-choice-text\"><span class=\"cil-choice-name\">E-postredigerare<\/span><span class=\"cil-choice-desc\">Bilder till dina e-postmeddelanden<\/span><\/span><span class=\"cil-choice-check\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"><\/path><\/svg><\/span><\/button><\/div>\n  <div id=\"cil-guide\" class=\"cil-hint\" aria-live=\"polite\"><\/div>\n  <div id=\"cil-drop\" class=\"cil-drop\"><input type=\"file\" id=\"cil-input\" accept=\"image\/*,.jpg,.jpeg,.png,.gif,.bmp,.dib,.svg,.webp\" multiple hidden><span class=\"cil-drop-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M18 22H4a2 2 0 0 1-2-2V6\"><\/path><path d=\"m22 13-1.3-1.3a2.4 2.4 0 0 0-3.4 0L11 18\"><\/path><circle cx=\"12\" cy=\"8\" r=\"2\"><\/circle><rect width=\"16\" height=\"16\" x=\"6\" y=\"2\" rx=\"2\"><\/rect><\/svg><\/span><span class=\"cil-drop-title\">L\u00e4gg till dina bilder<\/span><span class=\"cil-drop-text\">Dra och sl\u00e4pp bilder h\u00e4r, eller bl\u00e4ddra bland dina filer<\/span><button type=\"button\" class=\"cil-btn cil-btn-primary cil-drop-btn\" id=\"cil-add\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"><\/path><path d=\"m17 8-5-5-5 5\"><\/path><path d=\"M12 3v12\"><\/path><\/svg>V\u00e4lj bilder<\/button><span class=\"cil-drop-hint\">V\u00e4lj en eller flera bilder<\/span><\/div>\n  <form id=\"cil-url-form\" class=\"cil-urlrow cil-hide\" data-only=\"email\" novalidate><label class=\"cil-field cil-urlfield\"><span class=\"cil-label\">Anv\u00e4nder du Bild (URL)? Kontrollera en bild utifr\u00e5n dess URL<\/span><input type=\"url\" id=\"cil-url\" placeholder=\"https:\/\/example.com\/image.jpg\" autocomplete=\"off\" spellcheck=\"false\"><\/label><button type=\"submit\" class=\"cil-btn cil-btn-secondary\" id=\"cil-url-btn\">L\u00e4gg till bild fr\u00e5n URL<\/button><\/form>\n  <div id=\"cil-status\" class=\"cil-small\" role=\"status\" aria-live=\"polite\"><\/div>\n  <p class=\"cil-muted cil-privacy\"><span class=\"cil-lock\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\"><\/rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"><\/path><\/svg><\/span><span>Bilderna behandlas lokalt i din webbl\u00e4sare. Inget laddas upp till CM Academy eller sparas p\u00e5 v\u00e5ra servrar.<span data-only=\"email\" class=\"cil-hide\"> Om du kontrollerar en bild fr\u00e5n en URL h\u00e4mtar din webbl\u00e4sare den direkt fr\u00e5n webbplatsen d\u00e4r den ligger.<\/span><\/span><\/p>\n  <div id=\"cil-thumbs\" class=\"cil-thumbs cil-hide\" aria-live=\"polite\"><\/div>\n  <details class=\"cil-basics\"><summary>Ny med bilder? L\u00e4r dig grunderna<\/summary><div class=\"cil-basics-body\">\n<p><strong>M\u00e5tt (px)<\/strong> anger en bilds bredd och h\u00f6jd i pixlar, till exempel 1920 \u00d7 1080 px. R\u00e4tt m\u00e5tt beror p\u00e5 var bilden anv\u00e4nds. I <strong>Webbdesigner<\/strong> beh\u00f6ver bakgrundsbilder i headers och sektioner exakt den bredd som passar ditt tema: en bild som \u00e4r f\u00f6r smal eller f\u00f6r bred visas kanske inte som t\u00e4nkt. Bilder i kolumner linjerar b\u00e4st med den rekommenderade bredden, som bygger p\u00e5 standardbredderna f\u00f6r kolumner. Om du har \u00e4ndrat kolumnbredderna, v\u00e4lj Egen bredd i st\u00e4llet. I <strong>E-postredigerare<\/strong> \u00e4r de rekommenderade bredderna riktlinjer.<\/p>\n<p><strong>Filstorlek (KB eller MB)<\/strong> \u00e4r hur mycket utrymme filen tar. 1 MB \u00e4r 1 024 KB. \u00c4ven en bild med r\u00e4tt m\u00e5tt kan ha en stor filstorlek. P\u00e5 webbplatser laddas stora filer l\u00e5ngsammare, s\u00e4rskilt i mobilen. I e-post kan de g\u00f6ra utskicket l\u00e5ngsammare och g\u00f6ra meddelandet st\u00f6rre, s\u00e5 att vissa inkorgar avvisar det.<\/p>\n<p><strong>Format<\/strong> \u00e4r filtypen i slutet av filnamnet, till exempel .jpg eller .png. Anv\u00e4nd <strong>JPG<\/strong> f\u00f6r foton och <strong>PNG<\/strong> f\u00f6r logotyper, ikoner, sk\u00e4rmbilder och allt som beh\u00f6ver en transparent bakgrund.<\/p>\n<p><strong>Optimering<\/strong> g\u00f6r filen mindre. Verktyget kan g\u00f6ra bilden smalare eller spara den i ett annat format. Mindre filer kan se n\u00e5got mindre skarpa ut, s\u00e5 j\u00e4mf\u00f6r alltid f\u00f6re och efter.<\/p>\n<p><strong>Avancerade inst\u00e4llningar<\/strong> \u00e4r valfria. <strong>JPG-kvalitet<\/strong> anger hur mycket en JPG komprimeras: ett l\u00e4gre v\u00e4rde ger en mindre fil men f\u00e4rre detaljer. <strong>PNG-f\u00e4rger<\/strong> minskar antalet f\u00e4rger i en PNG, vilket g\u00f6r logotyper och grafik mycket mindre. 256 f\u00e4rger ser oftast ut som originalet. V\u00e4lj <strong>Alla f\u00e4rger<\/strong> om du ser en skillnad, till exempel i mjuka toningar.<\/p>\n<p><strong>S\u00e5 anv\u00e4nder du verktyget<\/strong><\/p>\n<ol class=\"cil-list\"><li>V\u00e4lj Webbdesigner eller E-postredigerare.<\/li><li>L\u00e4gg till dina bilder. Nu ser du filstorlek, m\u00e5tt och format f\u00f6r varje bild.<\/li><li>V\u00e4lj var varje bild ska placeras f\u00f6r att se den bredd som kr\u00e4vs eller rekommenderas.<\/li><li>Om en bild har fel bredd, stor filstorlek eller fel format, klicka p\u00e5 <strong>Optimera \/ konvertera<\/strong> och j\u00e4mf\u00f6r resultatet med originalet.<\/li><li>Ladda ner den optimerade bilden, eller alla bilder som ZIP, och ladda upp den i Conference Manager.<\/li><\/ol>\n<\/div><\/details>\n <\/div>\n <div class=\"cil-card cil-hide\" id=\"cil-results\">\n  <div class=\"cil-filetop\"><div class=\"cil-title\" role=\"heading\" aria-level=\"2\" style=\"margin:0\">Dina bilder<\/div><button class=\"cil-btn cil-btn-text\" id=\"cil-clear\" type=\"button\">Ta bort alla<\/button><\/div>\n  <div class=\"cil-summary\" id=\"cil-summary\"><\/div>\n  <div id=\"cil-files\"><\/div>\n  <div class=\"cil-actions\"><button class=\"cil-btn cil-btn-secondary\" type=\"button\" id=\"cil-optall\" disabled>Optimera alla bilder<\/button><button class=\"cil-btn cil-btn-secondary\" type=\"button\" id=\"cil-zip\" disabled>Ladda ner optimerade bilder som ZIP<\/button><span class=\"cil-small\" id=\"cil-zip-note\"><\/span><button class=\"cil-btn cil-btn-text cil-clear-bottom\" id=\"cil-clear2\" type=\"button\">Ta bort alla bilder<\/button><\/div>\n  <p class=\"cil-small\" style=\"margin:10px 0 0\">Kontrollera alltid hur dina optimerade bilder ser ut p\u00e5 din webbplats eller i ditt e-postmeddelande innan du publicerar eller skickar.<\/p>\n <\/div>\n <div class=\"cil-card cil-note cmac-info cmac-info-good-to-know\"><span class=\"cmac-info-icon\" aria-hidden=\"true\"><\/span><div class=\"cmac-info-body\"><div class=\"cil-title\" role=\"heading\" aria-level=\"2\">Kontrollera bildkvaliteten<\/div><div class=\"cmac-info-content\"><p>Optimering kan p\u00e5verka bildkvaliteten, och resultatet kan variera beroende p\u00e5 originalfilen och din webbl\u00e4sare.<\/p><p>F\u00f6rhandsgranska alltid dina optimerade eller konverterade bilder och kontrollera hur de ser ut p\u00e5 din webbplats eller i ditt e-postmeddelande innan du publicerar eller skickar.<\/p><p style=\"margin-bottom:0\">Om du inte \u00e4r n\u00f6jd med resultatet, justera inst\u00e4llningarna eller anv\u00e4nd ett bildbehandlingsprogram som <a href=\"https:\/\/www.canva.com\/\" target=\"_blank\" rel=\"noopener\">Canva<\/a>, <a href=\"https:\/\/www.adobe.com\/products\/photoshop.html\" target=\"_blank\" rel=\"noopener\">Adobe Photoshop<\/a> eller <a href=\"https:\/\/squoosh.app\/\" target=\"_blank\" rel=\"noopener\">Squoosh<\/a>.<\/p><\/div><\/div><\/div>\n <div class=\"cil-card\"><div class=\"cil-title\" role=\"heading\" aria-level=\"2\" style=\"font-size:19px\">Bildformat som st\u00f6ds<\/div><p><strong>JPG, PNG, GIF och BMP<\/strong> kan laddas upp till mediearkivet i Conference Manager. F\u00f6r mindre filer och brett st\u00f6d rekommenderar vi JPG f\u00f6r foton och PNG f\u00f6r grafik som beh\u00f6ver transparens. <span data-only=\"website\">GIF st\u00f6ds, \u00e4ven animerade GIF:ar, men animerade GIF:ar \u00e4r ofta mycket stora filer. Anv\u00e4nd dem sparsamt.<\/span><span data-only=\"email\" class=\"cil-hide\">GIF st\u00f6ds, men animerade GIF:ar \u00e4r ofta mycket stora filer och kan fungera olika i olika e-postprogram. Anv\u00e4nd dem sparsamt.<\/span> BMP accepteras men \u00e4r ofta mycket st\u00f6rre \u00e4n JPG eller PNG.<\/p><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">D\u00e4rf\u00f6r spelar filstorleken roll<\/div><p data-only=\"website\">Stora bildfiler g\u00f6r din webbplats l\u00e5ngsammare, s\u00e4rskilt p\u00e5 mobila enheter och l\u00e5ngsamma anslutningar. H\u00e5ll filstorleken s\u00e5 liten som m\u00f6jligt utan synlig kvalitetsf\u00f6rlust. F\u00f6r bakgrunder i headers och sektioner m\u00e5ste bredden \u00e4nd\u00e5 passa exakt till ditt tema.<\/p><p data-only=\"email\" class=\"cil-hide\">Stora bilder g\u00f6r att ditt e-postmeddelande laddas l\u00e5ngsammare och kan f\u00f6rsena leveransen. Vissa inkorgar kan avvisa meddelanden med mycket stora bilder. Om du g\u00f6r en bild mindre i redigeraren blir filen inte mindre, s\u00e5 ladda upp den i den storlek som den ska visas i.<\/p><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">N\u00e4r ska du anv\u00e4nda JPG eller PNG<\/div><ul class=\"cil-list\"><li><strong>JPG:<\/strong> foton och bilder med m\u00e5nga f\u00e4rger eller mjuka toningar, till exempel bilder p\u00e5 talare, lokaler och bakgrunder. Ger de minsta filerna. St\u00f6der inte transparens.<\/li><li><strong>PNG:<\/strong> logotyper, ikoner, sk\u00e4rmbilder och grafik med text, skarpa kanter eller f\u00e5 f\u00e4rger, och alla bilder som beh\u00f6ver en transparent bakgrund. Beh\u00e5ller skarpa kanter och text, men foton som sparas som PNG blir ofta mycket st\u00f6rre.<\/li><\/ul><p class=\"cil-muted\"><strong>Automatiskt<\/strong> i konverteraren v\u00e4ljer utifr\u00e5n transparens och antalet f\u00e4rger i bilden. Det k\u00e4nner inte igen vad bilden visar, s\u00e5 f\u00f6rhandsgranska alltid resultatet och v\u00e4lj JPG eller PNG sj\u00e4lv vid behov.<\/p><p><strong>WebP och SVG<\/strong> kan inte laddas upp till mediearkivet. Anv\u00e4nd konverteraren ovan f\u00f6r att skapa en JPG eller PNG i st\u00e4llet.<\/p><div data-only=\"email\" class=\"cil-hide\"><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">Bild och Bild (URL) i e-postredigeraren<\/div><ul class=\"cil-list\"><li><strong>Bild:<\/strong> Anv\u00e4nder mediearkivet i Conference Manager, som accepterar JPG, PNG, GIF och BMP.<\/li><li><strong>Bild (URL):<\/strong> Anv\u00e4nder en bild som ligger n\u00e5gon annanstans och l\u00e4ggs till via sin webbadress. SVG och WebP kan se r\u00e4tt ut i redigeraren men visas kanske inte f\u00f6r alla mottagare, till exempel i Outlook.<\/li><\/ul><p>F\u00f6r b\u00e4sta visning i alla e-postprogram, anv\u00e4nd JPG eller PNG.<\/p><\/div><\/div>\n<\/section>\n\n\n<div class=\"cmac-author wp-block-cm-academy-author\"><img class=\"cmac-author-photo\" src=\"https:\/\/cmacademy.events\/wp-content\/plugins\/cm-academy-companion\/assets\/author.png\" alt=\"Elisabeth Bj\u00f8rn Andersen\" width=\"80\" height=\"80\" loading=\"lazy\" decoding=\"async\"><div class=\"cmac-author-text\"><span class=\"cmac-author-name\">Elisabeth Bj\u00f8rn Andersen<\/span><span class=\"cmac-author-date\">Publicerad: 2026-10-16<\/span><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Kontrollera bilders m\u00e5tt (px), filstorlekar (KB\/MB) och format. Optimera eller konvertera bilder innan du l\u00e4gger till dem i Conference Manager. Var ska du anv\u00e4nda dina bilder? WebbdesignerBilder till ditt evenemangs webbplatsE-postredigerareBilder till dina e-postmeddelanden L\u00e4gg till dina bilderDra och sl\u00e4pp bilder h\u00e4r, eller bl\u00e4ddra bland dina filerV\u00e4lj bilderV\u00e4lj en eller flera bilder Anv\u00e4nder du Bild &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/cmacademy.events\/sv\/knowledge-base\/kontrollera-och-optimera-dina-bilder\/\" class=\"more-link\">Forts\u00e4tt l\u00e4sa<span class=\"screen-reader-text\"> \u201dKontrollera och optimera dina bilder\u201d<\/span><\/a><\/p>\n","protected":false},"author":6,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"ht-kb-category":[],"ht-kb-tag":[],"class_list":["post-25759","ht_kb","type-ht_kb","status-publish","format-standard","hentry","entry"],"_links":{"self":[{"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/ht-kb\/25759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/ht-kb"}],"about":[{"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/comments?post=25759"}],"version-history":[{"count":2,"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/ht-kb\/25759\/revisions"}],"predecessor-version":[{"id":25765,"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/ht-kb\/25759\/revisions\/25765"}],"wp:attachment":[{"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/media?parent=25759"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/ht-kb-category?post=25759"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/cmacademy.events\/sv\/wp-json\/wp\/v2\/ht-kb-tag?post=25759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}