@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
268 lines (262 loc) • 39 kB
JavaScript
import { Injectable } from '@angular/core';
import { NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution';
import * as i0 from "@angular/core";
const OPEN = /^:::(\+?)\s+(\w+)(\s+.+)?/;
const CLOSE = /^:::\s*$/;
/**
* Contribution to add collapsible styled block to markdown syntax.
*/
export class NgeMarkdownAdmonitions {
contribute(transformer) {
this.addStyles();
this.autoFixAdmonitionsSyntax(transformer);
this.createAdmonitions(transformer);
}
addStyles() {
const head = document.head;
if (head.querySelector('[nge-markdown-admonitions]')) {
return;
}
const admonitions = {
note: {
bg: 'rgba(68, 138, 255, 0.1)',
border: '#448aff',
},
abstract: {
bg: 'rgba(0, 176, 255, 0.1)',
border: '#00b0ff',
},
info: {
bg: 'rgba(0, 184, 212, 0.1)',
border: '#00b8d4',
},
tip: {
bg: 'rgba(0, 191, 165, 0.1)',
border: '#00bfa5',
},
success: {
bg: 'rgba(0, 200, 83, 0.1)',
border: '#00c853',
},
question: {
bg: 'rgba(100, 221, 23, 0.1)',
border: '#64dd17',
},
warning: {
bg: 'rgba(255, 145, 0, 0.1)',
border: '#ff9100',
},
failure: {
bg: 'rgba(255, 82, 82, 0.1)',
border: '#ff5252',
},
danger: {
bg: 'rgba(255, 23, 68, 0.1)',
border: '#ff1744',
},
bug: {
bg: 'rgba(245, 0, 87, 0.1)',
border: '#f50057',
},
example: {
bg: 'rgba(101, 31, 255, 0.1)',
border: '#651fff',
},
quote: {
bg: 'rgba(158, 158, 158, 0.1)',
border: '#9e9e9e',
},
};
const stylesheet = [
`
/* CONTAINER */
.nge-md-admonition {
margin: 1.5625em 0;
overflow: hidden;
font-size: 0.84rem;
page-break-inside: avoid;
border-radius: 0.1rem;
box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.05rem rgba(0, 0, 0, 0.1);
--admonition--note: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>');
--admonition--abstract: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 5h16v2H4V5m0 4h16v2H4V9m0 4h16v2H4v-2m0 4h10v2H4v-2z"/></svg>');
--admonition--info: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10A10 10 0 0012 2z"/></svg>');
--admonition--tip: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.55 11.2c-.23-.3-.5-.56-.76-.82-.65-.6-1.4-1.03-2.03-1.66C13.3 7.26 13 4.85 13.91 3c-.91.23-1.75.75-2.45 1.32-2.54 2.08-3.54 5.75-2.34 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.22.1-.46.04-.64-.12a.83.83 0 01-.15-.17c-1.1-1.43-1.28-3.48-.53-5.12C5.89 10 5 12.3 5.14 14.47c.04.5.1 1 .27 1.5.14.6.4 1.2.72 1.73 1.04 1.73 2.87 2.97 4.84 3.22 2.1.27 4.35-.12 5.96-1.6 1.8-1.66 2.45-4.32 1.5-6.6l-.13-.26c-.2-.46-.47-.87-.8-1.25l.05-.01m-3.1 6.3c-.28.24-.73.5-1.08.6-1.1.4-2.2-.16-2.87-.82 1.19-.28 1.89-1.16 2.09-2.05.17-.8-.14-1.46-.27-2.23-.12-.74-.1-1.37.18-2.06.17.38.37.76.6 1.06.76 1 1.95 1.44 2.2 2.8.04.14.06.28.06.43.03.82-.32 1.72-.92 2.27h.01z"/></svg>');
--admonition--success: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2m-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>');
--admonition--question: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.07 11.25l-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 00-2-2 2 2 0 00-2 2H8a4 4 0 014-4 4 4 0 014 4 3.2 3.2 0 01-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10c0-5.53-4.5-10-10-10z"/></svg>');
--admonition--warning: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 14h-2v-4h2m0 8h-2v-2h2M1 21h22L12 2 1 21z"/></svg>');
--admonition--failure: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2c5.53 0 10 4.47 10 10s-4.47 10-10 10S2 17.53 2 12 6.47 2 12 2m3.59 5L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41 15.59 7z"/></svg>');
--admonition--danger: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.5 20l4.86-9.73H13V4l-5 9.73h3.5V20M12 2c2.75 0 5.1 1 7.05 2.95C21 6.9 22 9.25 22 12s-1 5.1-2.95 7.05C17.1 21 14.75 22 12 22s-5.1-1-7.05-2.95C3 17.1 2 14.75 2 12s1-5.1 2.95-7.05C6.9 3 9.25 2 12 2z"/></svg>');
--admonition--bug: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 00-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 00-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z"/></svg>');
--admonition--example: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 01.75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z"/></svg>');
--admonition--quote: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z"/></svg>');
--admonition--chevron-right: url('data:image/svg+xml;:charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z"/></svg>');
--admonition--chevron-down: url('data:image/svg+xml;:charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/></svg>');
}
/* TITLE */
.nge-md-admonition-title {
min-height: 24px;
box-sizing: border-box;
position: relative;
display: flex;
align-items: center;
margin-top: 0 !important;
margin-bottom: 0 !important;
padding: 0.4rem 0.6rem 0.4rem 2rem;
font-weight: 700;
/*REMOVE DETAILS MARKER IN FIREFOX*/
list-style-type: none;
}
.nge-md-admonition-title:focus {
outline: none;
}
/* DETAILS MARKER */
.nge-md-admonition-title::marker,
.nge-md-admonition-title::-webkit-details-marker {
display: none;
}
/* TITLE COLLAPSIBLE */
details .nge-md-admonition-title {
cursor: pointer;
}
details .nge-md-admonition-title:after {
position: absolute;
right: 0.6rem;
width: 1rem;
height: 1rem;
-o-mask-image: var(--admonition--chevron-right);
-webkit-mask-image: var(--admonition--chevron-right);
mask-image: var(--admonition--chevron-right);
content: "";
}
details[open] .nge-md-admonition-title:after {
-o-mask-image: var(--admonition--chevron-down);
-webkit-mask-image: var(--admonition--chevron-down);
mask-image: var(--admonition--chevron-down);
}
/* CONTENT */
.nge-md-admonition-content {
padding: 0 0.6rem;
}
`,
];
Object.keys(admonitions).forEach((type) => {
const map = admonitions[type];
stylesheet.push(`
.nge-md-admonition--${type} {
border-left: 0.2rem solid ${map.border};
}
.nge-md-admonition-title--${type} {
background-color: ${map.bg};
}
.nge-md-admonition-title--${type}:before,
.nge-md-admonition-title--${type}:after {
background-color: ${map.border};
}
.nge-md-admonition-title--${type}:before {
position: absolute;
left: 0.6rem;
width: 1rem;
height: 1rem;
-o-mask-image: var(--admonition--${type});
-webkit-mask-image: var(--admonition--${type});
mask-image: var(--admonition--${type});
content: "";
}
`);
});
const style = document.createElement('style');
style.setAttribute('nge-markdown-admonitions', '');
style.innerHTML = stylesheet.join('\n');
head.appendChild(style);
}
createAdmonitions(transformer) {
transformer.addHtmlTransformer((element) => {
const paragraphs = element.querySelectorAll('p');
paragraphs.forEach((p) => {
const text = p.innerHTML;
const match = text.match(OPEN);
if (match) {
const opener = match[1];
const type = match[2];
const title = (match[3] || '').trim();
const admonition = document.createElement('details');
if (opener.endsWith('+')) {
admonition.open = true;
}
admonition.className = 'nge-md-admonition nge-md-admonition--' + type;
const summary = document.createElement('summary');
summary.className = 'nge-md-admonition-title nge-md-admonition-title--' + type;
summary.innerHTML = title;
const content = [];
admonition.appendChild(summary);
let node = p.nextElementSibling;
let opened = 1;
while (node) {
const innerHTML = node.innerHTML.trim();
if (innerHTML.match(OPEN)) {
opened++;
}
else if (innerHTML.match(CLOSE)) {
opened--;
if (opened === 0) {
node.remove();
break;
}
}
content.push(node);
node = node.nextElementSibling;
}
const div = document.createElement('div');
div.className = 'nge-md-admonition-content';
content.forEach((e) => div.appendChild(e));
admonition.appendChild(div);
p.parentElement?.insertBefore(admonition, p);
p.remove();
}
});
});
}
autoFixAdmonitionsSyntax(transformer) {
transformer.addMarkdownTransformer((markdown) => {
const lines = markdown.split('\n');
const length = lines.length;
let insideCodeBlock = false;
for (let i = 0; i < length; i++) {
const curr = lines[i];
if (curr.startsWith('```')) {
insideCodeBlock = !insideCodeBlock;
}
if (insideCodeBlock) {
continue;
}
const prev = i > 0 ? lines[i - 1] : undefined;
const next = i < length - 1 ? lines[i + 1] : undefined;
if (curr.match(OPEN)) {
if (next?.trim()) {
lines[i] = curr + '\n';
}
}
else if (curr.match(CLOSE)) {
if (prev?.trim()) {
lines[i] = '\n' + curr;
}
}
}
return lines.join('\n');
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownAdmonitions, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownAdmonitions }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownAdmonitions, decorators: [{
type: Injectable
}] });
/**
* Injection token to register `NgeMarkdownAdmonitions` contribution.
*/
export const NgeMarkdownAdmonitionsProvider = {
provide: NGE_MARKDOWN_CONTRIBUTION,
multi: true,
useClass: NgeMarkdownAdmonitions,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdlLW1hcmtkb3duLWFkbW9uaXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdlL21hcmtkb3duL3NyYy9jb250cmlidXRpb25zL25nZS1tYXJrZG93bi1hZG1vbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFBO0FBRXBELE9BQU8sRUFBMkIseUJBQXlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTs7QUFFakcsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUE7QUFDeEMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFBO0FBRXhCOztHQUVHO0FBRUgsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxVQUFVLENBQUMsV0FBbUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ2hCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMxQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVPLFNBQVM7UUFDZixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFBO1FBQzFCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLENBQUM7WUFDckQsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBbUQ7WUFDbEUsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSx5QkFBeUI7Z0JBQzdCLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLEVBQUUsRUFBRSx3QkFBd0I7Z0JBQzVCLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSx3QkFBd0I7Z0JBQzVCLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsR0FBRyxFQUFFO2dCQUNILEVBQUUsRUFBRSx3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Q0FBQyxTQUFTLENBQUE7Z0JBQzdDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7Z0JBQ3RELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNyQixJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNqQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtvQkFDeEIsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QixJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNqQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtvQkFDeEIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7OEdBL1BVLHNCQUFzQjtrSEFBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVOztBQW1RWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSx5QkFBeUI7SUFDbEMsS0FBSyxFQUFFLElBQUk7SUFDWCxRQUFRLEVBQUUsc0JBQXNCO0NBQ2pDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBOZ2VNYXJrZG93blRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vbmdlLW1hcmtkb3duLXRyYW5zZm9ybWVyJ1xuaW1wb3J0IHsgTmdlTWFya2Rvd25Db250cmlidXRpb24sIE5HRV9NQVJLRE9XTl9DT05UUklCVVRJT04gfSBmcm9tICcuLi9uZ2UtbWFya2Rvd24tY29udHJpYnV0aW9uJ1xuXG5jb25zdCBPUEVOID0gL146OjooXFwrPylcXHMrKFxcdyspKFxccysuKyk/L1xuY29uc3QgQ0xPU0UgPSAvXjo6OlxccyokL1xuXG4vKipcbiAqIENvbnRyaWJ1dGlvbiB0byBhZGQgY29sbGFwc2libGUgc3R5bGVkIGJsb2NrIHRvIG1hcmtkb3duIHN5bnRheC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nZU1hcmtkb3duQWRtb25pdGlvbnMgaW1wbGVtZW50cyBOZ2VNYXJrZG93bkNvbnRyaWJ1dGlvbiB7XG4gIGNvbnRyaWJ1dGUodHJhbnNmb3JtZXI6IE5nZU1hcmtkb3duVHJhbnNmb3JtZXIpIHtcbiAgICB0aGlzLmFkZFN0eWxlcygpXG4gICAgdGhpcy5hdXRvRml4QWRtb25pdGlvbnNTeW50YXgodHJhbnNmb3JtZXIpXG4gICAgdGhpcy5jcmVhdGVBZG1vbml0aW9ucyh0cmFuc2Zvcm1lcilcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3R5bGVzKCkge1xuICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5oZWFkXG4gICAgaWYgKGhlYWQucXVlcnlTZWxlY3RvcignW25nZS1tYXJrZG93bi1hZG1vbml0aW9uc10nKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWRtb25pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgYm9yZGVyOiBzdHJpbmc7IGJnOiBzdHJpbmcgfT4gPSB7XG4gICAgICBub3RlOiB7XG4gICAgICAgIGJnOiAncmdiYSg2OCwgMTM4LCAyNTUsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjNDQ4YWZmJyxcbiAgICAgIH0sXG4gICAgICBhYnN0cmFjdDoge1xuICAgICAgICBiZzogJ3JnYmEoMCwgMTc2LCAyNTUsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjMDBiMGZmJyxcbiAgICAgIH0sXG4gICAgICBpbmZvOiB7XG4gICAgICAgIGJnOiAncmdiYSgwLCAxODQsIDIxMiwgMC4xKScsXG4gICAgICAgIGJvcmRlcjogJyMwMGI4ZDQnLFxuICAgICAgfSxcbiAgICAgIHRpcDoge1xuICAgICAgICBiZzogJ3JnYmEoMCwgMTkxLCAxNjUsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjMDBiZmE1JyxcbiAgICAgIH0sXG4gICAgICBzdWNjZXNzOiB7XG4gICAgICAgIGJnOiAncmdiYSgwLCAyMDAsIDgzLCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnIzAwYzg1MycsXG4gICAgICB9LFxuICAgICAgcXVlc3Rpb246IHtcbiAgICAgICAgYmc6ICdyZ2JhKDEwMCwgMjIxLCAyMywgMC4xKScsXG4gICAgICAgIGJvcmRlcjogJyM2NGRkMTcnLFxuICAgICAgfSxcbiAgICAgIHdhcm5pbmc6IHtcbiAgICAgICAgYmc6ICdyZ2JhKDI1NSwgMTQ1LCAwLCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnI2ZmOTEwMCcsXG4gICAgICB9LFxuICAgICAgZmFpbHVyZToge1xuICAgICAgICBiZzogJ3JnYmEoMjU1LCA4MiwgODIsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjZmY1MjUyJyxcbiAgICAgIH0sXG4gICAgICBkYW5nZXI6IHtcbiAgICAgICAgYmc6ICdyZ2JhKDI1NSwgMjMsIDY4LCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnI2ZmMTc0NCcsXG4gICAgICB9LFxuICAgICAgYnVnOiB7XG4gICAgICAgIGJnOiAncmdiYSgyNDUsIDAsIDg3LCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnI2Y1MDA1NycsXG4gICAgICB9LFxuICAgICAgZXhhbXBsZToge1xuICAgICAgICBiZzogJ3JnYmEoMTAxLCAzMSwgMjU1LCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnIzY1MWZmZicsXG4gICAgICB9LFxuICAgICAgcXVvdGU6IHtcbiAgICAgICAgYmc6ICdyZ2JhKDE1OCwgMTU4LCAxNTgsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjOWU5ZTllJyxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IFtcbiAgICAgIGBcbiAgICAgICAgICAgIC8qIENPTlRBSU5FUiAqL1xuICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uIHtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDEuNTYyNWVtIDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBmb250LXNpemU6IDAuODRyZW07XG4gICAgICAgICAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuMXJlbTtcbiAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDAuMnJlbSAwLjVyZW0gcmdiYSgwLCAwLCAwLCAwLjA1KSwgMCAwIDAuMDVyZW0gcmdiYSgwLCAwLCAwLCAwLjEpO1xuXG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS1ub3RlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjA0IDAtMS40MWwtMi4zNC0yLjM0Yy0uMzctLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44NCAxLjgzIDMuNzUgMy43NU0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45M2wtMy43NS0zLjc1TDMgMTcuMjV6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tYWJzdHJhY3Q6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNCA1aDE2djJINFY1bTAgNGgxNnYySDRWOW0wIDRoMTZ2Mkg0di0ybTAgNGgxMHYySDR2LTJ6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0taW5mbzogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMyA5aC0yVjdoMm0wIDEwaC0ydi02aDJtLTEtOUExMCAxMCAwIDAwMiAxMmExMCAxMCAwIDAwMTAgMTAgMTAgMTAgMCAwMDEwLTEwQTEwIDEwIDAgMDAxMiAyelwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLXRpcDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNy41NSAxMS4yYy0uMjMtLjMtLjUtLjU2LS43Ni0uODItLjY1LS42LTEuNC0xLjAzLTIuMDMtMS42NkMxMy4zIDcuMjYgMTMgNC44NSAxMy45MSAzYy0uOTEuMjMtMS43NS43NS0yLjQ1IDEuMzItMi41NCAyLjA4LTMuNTQgNS43NS0yLjM0IDguOS4wNC4xLjA4LjIuMDguMzMgMCAuMjItLjE1LjQyLS4zNS41LS4yMi4xLS40Ni4wNC0uNjQtLjEyYS44My44MyAwIDAxLS4xNS0uMTdjLTEuMS0xLjQzLTEuMjgtMy40OC0uNTMtNS4xMkM1Ljg5IDEwIDUgMTIuMyA1LjE0IDE0LjQ3Yy4wNC41LjEgMSAuMjcgMS41LjE0LjYuNCAxLjIuNzIgMS43MyAxLjA0IDEuNzMgMi44NyAyLjk3IDQuODQgMy4yMiAyLjEuMjcgNC4zNS0uMTIgNS45Ni0xLjYgMS44LTEuNjYgMi40NS00LjMyIDEuNS02LjZsLS4xMy0uMjZjLS4yLS40Ni0uNDctLjg3LS44LTEuMjVsLjA1LS4wMW0tMy4xIDYuM2MtLjI4LjI0LS43My41LTEuMDguNi0xLjEuNC0yLjItLjE2LTIuODctLjgyIDEuMTktLjI4IDEuODktMS4xNiAyLjA5LTIuMDUuMTctLjgtLjE0LTEuNDYtLjI3LTIuMjMtLjEyLS43NC0uMS0xLjM3LjE4LTIuMDYuMTcuMzguMzcuNzYuNiAxLjA2Ljc2IDEgMS45NSAxLjQ0IDIuMiAyLjguMDQuMTQuMDYuMjguMDYuNDMuMDMuODItLjMyIDEuNzItLjkyIDIuMjdoLjAxelwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLXN1Y2Nlc3M6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJtLTIgMTVsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXpcIi8+PC9zdmc+Jyk7XG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS1xdWVzdGlvbjogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNS4wNyAxMS4yNWwtLjkuOTJDMTMuNDUgMTIuODkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjExLjQ1LTIuMTEgMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2LjU5LS44Ni41OS0xLjQxYTIgMiAwIDAwLTItMiAyIDIgMCAwMC0yIDJIOGE0IDQgMCAwMTQtNCA0IDQgMCAwMTQgNCAzLjIgMy4yIDAgMDEtLjkzIDIuMjVNMTMgMTloLTJ2LTJoMk0xMiAyQTEwIDEwIDAgMDAyIDEyYTEwIDEwIDAgMDAxMCAxMCAxMCAxMCAwIDAwMTAtMTBjMC01LjUzLTQuNS0xMC0xMC0xMHpcIi8+PC9zdmc+Jyk7XG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS13YXJuaW5nOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTEzIDE0aC0ydi00aDJtMCA4aC0ydi0yaDJNMSAyMWgyMkwxMiAyIDEgMjF6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tZmFpbHVyZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMiAyYzUuNTMgMCAxMCA0LjQ3IDEwIDEwcy00LjQ3IDEwLTEwIDEwUzIgMTcuNTMgMiAxMiA2LjQ3IDIgMTIgMm0zLjU5IDVMMTIgMTAuNTkgOC40MSA3IDcgOC40MSAxMC41OSAxMiA3IDE1LjU5IDguNDEgMTcgMTIgMTMuNDEgMTUuNTkgMTcgMTcgMTUuNTkgMTMuNDEgMTIgMTcgOC40MSAxNS41OSA3elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLWRhbmdlcjogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMS41IDIwbDQuODYtOS43M0gxM1Y0bC01IDkuNzNoMy41VjIwTTEyIDJjMi43NSAwIDUuMSAxIDcuMDUgMi45NUMyMSA2LjkgMjIgOS4yNSAyMiAxMnMtMSA1LjEtMi45NSA3LjA1QzE3LjEgMjEgMTQuNzUgMjIgMTIgMjJzLTUuMS0xLTcuMDUtMi45NUMzIDE3LjEgMiAxNC43NSAyIDEyczEtNS4xIDIuOTUtNy4wNUM2LjkgMyA5LjI1IDIgMTIgMnpcIi8+PC9zdmc+Jyk7XG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS1idWc6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTQgMTJoLTR2LTJoNG0wIDZoLTR2LTJoNG02LTZoLTIuODFhNS45ODUgNS45ODUgMCAwMC0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdhNi4wMDIgNi4wMDIgMCAwMC0yLjgzIDBMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLWV4YW1wbGU6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNyAxM3YtMmgxNHYySDdtMCA2di0yaDE0djJIN003IDdWNWgxNHYySDdNMyA4VjVIMlY0aDJ2NEgzbS0xIDl2LTFoM3Y0SDJ2LTFoMnYtLjVIM3YtMWgxVjE3SDJtMi4yNS03YS43NS43NSAwIDAxLjc1Ljc1YzAgLjItLjA4LjM5LS4yMS41MkwzLjEyIDEzSDV2MUgydi0uOTJMNCAxMUgydi0xaDIuMjV6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tcXVvdGU6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTQgMTdoM2wyLTRWN2gtNnY2aDNNNiAxN2gzbDItNFY3SDV2NmgzbC0yIDR6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tY2hldnJvbi1yaWdodDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7OmNoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNjQ2IDEuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxIDAgLjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOC0uNzA4TDEwLjI5MyA4IDQuNjQ2IDIuMzU0YS41LjUgMCAwIDEgMC0uNzA4elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLWNoZXZyb24tZG93bjogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7OmNoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggMTAuMjkzbDUuNjQ2LTUuNjQ3YS41LjUgMCAwIDEgLjcwOC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDggMGwtNi02YS41LjUgMCAwIDEgMC0uNzA4elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogVElUTEUgKi9cbiAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZSB7XG4gICAgICAgICAgICAgICAgbWluLWhlaWdodDogMjRweDtcbiAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLjRyZW0gMC42cmVtIDAuNHJlbSAycmVtO1xuICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgICAgICAgICAgLypSRU1PVkUgREVUQUlMUyBNQVJLRVIgSU4gRklSRUZPWCovXG4gICAgICAgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlOmZvY3VzIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBERVRBSUxTIE1BUktFUiAqL1xuICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlOjptYXJrZXIsXG4gICAgICAgICAgICAubmdlLW1kLWFkbW9uaXRpb24tdGl0bGU6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFRJVExFIENPTExBUFNJQkxFICovXG5cbiAgICAgICAgICAgIGRldGFpbHMgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlIHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXRhaWxzIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZTphZnRlciB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHJpZ2h0OiAwLjZyZW07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDFyZW07XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxcmVtO1xuICAgICAgICAgICAgICAgIC1vLW1hc2staW1hZ2U6IHZhcigtLWFkbW9uaXRpb24tLWNoZXZyb24tcmlnaHQpO1xuICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tY2hldnJvbi1yaWdodCk7XG4gICAgICAgICAgICAgICAgbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tY2hldnJvbi1yaWdodCk7XG4gICAgICAgICAgICAgICAgY29udGVudDogXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRldGFpbHNbb3Blbl0gLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlOmFmdGVyIHtcbiAgICAgICAgICAgICAgICAtby1tYXNrLWltYWdlOiB2YXIoLS1hZG1vbml0aW9uLS1jaGV2cm9uLWRvd24pO1xuICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tY2hldnJvbi1kb3duKTtcbiAgICAgICAgICAgICAgICBtYXNrLWltYWdlOiB2YXIoLS1hZG1vbml0aW9uLS1jaGV2cm9uLWRvd24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBDT05URU5UICovXG4gICAgICAgICAgICAubmdlLW1kLWFkbW9uaXRpb24tY29udGVudCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCAwLjZyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXVxuXG4gICAgT2JqZWN0LmtleXMoYWRtb25pdGlvbnMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IG1hcCA9IGFkbW9uaXRpb25zW3R5cGVdXG4gICAgICBzdHlsZXNoZWV0LnB1c2goYFxuICAgICAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi0tJHt0eXBlfSB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAwLjJyZW0gc29saWQgJHttYXAuYm9yZGVyfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlLS0ke3R5cGV9IHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHttYXAuYmd9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAubmdlLW1kLWFkbW9uaXRpb24tdGl0bGUtLSR7dHlwZX06YmVmb3JlLFxuICAgICAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZS0tJHt0eXBlfTphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7bWFwLmJvcmRlcn07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZS0tJHt0eXBlfTpiZWZvcmUge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAuNnJlbTtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDFyZW07XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMXJlbTtcbiAgICAgICAgICAgICAgICAgICAgLW8tbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tJHt0eXBlfSk7XG4gICAgICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tJHt0eXBlfSk7XG4gICAgICAgICAgICAgICAgICAgIG1hc2staW1hZ2U6IHZhcigtLWFkbW9uaXRpb24tLSR7dHlwZX0pO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGApXG4gICAgfSlcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25nZS1tYXJrZG93bi1hZG1vbml0aW9ucycsICcnKVxuICAgIHN0eWxlLmlubmVySFRNTCA9IHN0eWxlc2hlZXQuam9pbignXFxuJylcblxuICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFkbW9uaXRpb25zKHRyYW5zZm9ybWVyOiBOZ2VNYXJrZG93blRyYW5zZm9ybWVyKSB7XG4gICAgdHJhbnNmb3JtZXIuYWRkSHRtbFRyYW5zZm9ybWVyKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBwYXJhZ3JhcGhzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwJylcbiAgICAgIHBhcmFncmFwaHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0ID0gcC5pbm5lckhUTUxcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKE9QRU4pXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnN0IG9wZW5lciA9IG1hdGNoWzFdXG4gICAgICAgICAgY29uc3QgdHlwZSA9IG1hdGNoWzJdXG4gICAgICAgICAgY29uc3QgdGl0bGUgPSAobWF0Y2hbM10gfHwgJycpLnRyaW0oKVxuXG4gICAgICAgICAgY29uc3QgYWRtb25pdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKVxuICAgICAgICAgIGlmIChvcGVuZXIuZW5kc1dpdGgoJysnKSkge1xuICAgICAgICAgICAgYWRtb25pdGlvbi5vcGVuID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZG1vbml0aW9uLmNsYXNzTmFtZSA9ICduZ2UtbWQtYWRtb25pdGlvbiBuZ2UtbWQtYWRtb25pdGlvbi0tJyArIHR5cGVcblxuICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5JylcbiAgICAgICAgICBzdW1tYXJ5LmNsYXNzTmFtZSA9ICduZ2UtbWQtYWRtb25pdGlvbi10aXRsZSBuZ2UtbWQtYWRtb25pdGlvbi10aXRsZS0tJyArIHR5cGVcbiAgICAgICAgICBzdW1tYXJ5LmlubmVySFRNTCA9IHRpdGxlXG5cbiAgICAgICAgICBjb25zdCBjb250ZW50OiBIVE1MRWxlbWVudFtdID0gW11cbiAgICAgICAgICBhZG1vbml0aW9uLmFwcGVuZENoaWxkKHN1bW1hcnkpXG5cbiAgICAgICAgICBsZXQgbm9kZSA9IHAubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgICAgICAgbGV0IG9wZW5lZCA9IDFcbiAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJIVE1MID0gbm9kZS5pbm5lckhUTUwudHJpbSgpXG4gICAgICAgICAgICBpZiAoaW5uZXJIVE1MLm1hdGNoKE9QRU4pKSB7XG4gICAgICAgICAgICAgIG9wZW5lZCsrXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlubmVySFRNTC5tYXRjaChDTE9TRSkpIHtcbiAgICAgICAgICAgICAgb3BlbmVkLS1cbiAgICAgICAgICAgICAgaWYgKG9wZW5lZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlKClcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50LnB1c2gobm9kZSBhcyBIVE1MRWxlbWVudClcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRFbGVtZW50U2libGluZ1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICduZ2UtbWQtYWRtb25pdGlvbi1jb250ZW50J1xuICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaCgoZSkgPT4gZGl2LmFwcGVuZENoaWxkKGUpKVxuICAgICAgICAgIGFkbW9uaXRpb24uYXBwZW5kQ2hpbGQoZGl2KVxuXG4gICAgICAgICAgcC5wYXJlbnRFbGVtZW50Py5pbnNlcnRCZWZvcmUoYWRtb25pdGlvbiwgcClcbiAgICAgICAgICBwLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXV0b0ZpeEFkbW9uaXRpb25zU3ludGF4KHRyYW5zZm9ybWVyOiBOZ2VNYXJrZG93blRyYW5zZm9ybWVyKSB7XG4gICAgdHJhbnNmb3JtZXIuYWRkTWFya2Rvd25UcmFuc2Zvcm1lcigobWFya2Rvd24pID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQoJ1xcbicpXG4gICAgICBjb25zdCBsZW5ndGggPSBsaW5lcy5sZW5ndGhcbiAgICAgIGxldCBpbnNpZGVDb2RlQmxvY2sgPSBmYWxzZVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyID0gbGluZXNbaV1cbiAgICAgICAgaWYgKGN1cnIuc3RhcnRzV2l0aCgnYGBgJykpIHtcbiAgICAgICAgICBpbnNpZGVDb2RlQmxvY2sgPSAhaW5zaWRlQ29kZUJsb2NrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc2lkZUNvZGVCbG9jaykge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldiA9IGkgPiAwID8gbGluZXNbaSAtIDFdIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IG5leHQgPSBpIDwgbGVuZ3RoIC0gMSA/IGxpbmVzW2kgKyAxXSA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoY3Vyci5tYXRjaChPUEVOKSkge1xuICAgICAgICAgIGlmIChuZXh0Py50cmltKCkpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldID0gY3VyciArICdcXG4nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnIubWF0Y2goQ0xPU0UpKSB7XG4gICAgICAgICAgaWYgKHByZXY/LnRyaW0oKSkge1xuICAgICAgICAgICAgbGluZXNbaV0gPSAnXFxuJyArIGN1cnJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdG8gcmVnaXN0ZXIgYE5nZU1hcmtkb3duQWRtb25pdGlvbnNgIGNvbnRyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE5nZU1hcmtkb3duQWRtb25pdGlvbnNQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HRV9NQVJLRE9XTl9DT05UUklCVVRJT04sXG4gIG11bHRpOiB0cnVlLFxuICB1c2VDbGFzczogTmdlTWFya2Rvd25BZG1vbml0aW9ucyxcbn1cbiJdfQ==