@covalent/markdown 6.3.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,293 +0,0 @@
1
- import { Component, ElementRef, Input, Output, EventEmitter, Renderer2, SecurityContext, HostBinding, NgZone, } from '@angular/core';
2
- import { DomSanitizer } from '@angular/platform-browser';
3
- import { scrollToAnchor, genHeadingId, isAnchorLink, removeTrailingHash, rawGithubHref, isGithubHref, isRawGithubHref, renderVideoElements, } from './markdown-utils/markdown-utils';
4
- import * as showdown from 'showdown';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/platform-browser";
7
- // TODO: assumes it is a github url
8
- // allow override somehow
9
- function generateAbsoluteHref(currentHref, relativeHref) {
10
- if (currentHref && relativeHref) {
11
- const currentUrl = new URL(currentHref);
12
- const path = currentUrl.pathname.split('/').slice(1, -1).join('/');
13
- const correctUrl = new URL(currentHref);
14
- if (relativeHref.startsWith('/')) {
15
- // url is relative to top level
16
- const orgAndRepo = path.split('/').slice(0, 3).join('/');
17
- correctUrl.pathname = `${orgAndRepo}${relativeHref}`;
18
- }
19
- else {
20
- correctUrl.pathname = `${path}/${relativeHref}`;
21
- }
22
- return correctUrl.href;
23
- }
24
- return '';
25
- }
26
- function normalizeHtmlHrefs(html, currentHref) {
27
- if (currentHref) {
28
- const document = new DOMParser().parseFromString(html, 'text/html');
29
- document
30
- .querySelectorAll('a[href]')
31
- .forEach((link) => {
32
- const url = new URL(link.href);
33
- const originalHash = url.hash;
34
- if (isAnchorLink(link)) {
35
- if (originalHash) {
36
- url.hash = genHeadingId(originalHash);
37
- link.href = url.hash;
38
- }
39
- }
40
- else if (url.host === window.location.host) {
41
- // hosts match, meaning URL MIGHT have been malformed by showdown
42
- // url is a relative url or just a link to a part of the application
43
- if (url.pathname.endsWith('.md')) {
44
- // only check .md urls
45
- const hrefWithoutHash = removeTrailingHash(link.getAttribute('href'));
46
- url.href = generateAbsoluteHref(currentHref, hrefWithoutHash);
47
- if (originalHash) {
48
- url.hash = genHeadingId(originalHash);
49
- }
50
- link.href = url.href;
51
- }
52
- link.target = '_blank';
53
- }
54
- else {
55
- // url is absolute
56
- if (url.pathname.endsWith('.md')) {
57
- if (originalHash) {
58
- url.hash = genHeadingId(originalHash);
59
- }
60
- link.href = url.href;
61
- }
62
- link.target = '_blank';
63
- }
64
- });
65
- return new XMLSerializer().serializeToString(document);
66
- }
67
- return html;
68
- }
69
- function normalizeImageSrcs(html, currentHref) {
70
- if (currentHref) {
71
- const document = new DOMParser().parseFromString(html, 'text/html');
72
- document
73
- .querySelectorAll('img[src]')
74
- .forEach((image) => {
75
- const src = image.getAttribute('src') ?? '';
76
- try {
77
- /* tslint:disable-next-line:no-unused-expression */
78
- new URL(src);
79
- if (isGithubHref(src)) {
80
- image.src = rawGithubHref(src);
81
- }
82
- }
83
- catch {
84
- image.src = generateAbsoluteHref(isGithubHref(currentHref)
85
- ? rawGithubHref(currentHref)
86
- : currentHref, src);
87
- }
88
- // gh svgs need to have ?sanitize=true
89
- if (isRawGithubHref(image.src)) {
90
- const url = new URL(image.src);
91
- if (url.pathname.endsWith('.svg')) {
92
- url.searchParams.set('sanitize', 'true');
93
- image.src = url.href;
94
- }
95
- }
96
- });
97
- return new XMLSerializer().serializeToString(document);
98
- }
99
- return html;
100
- }
101
- function addIdsToHeadings(html) {
102
- if (html) {
103
- const document = new DOMParser().parseFromString(html, 'text/html');
104
- document
105
- .querySelectorAll('h1, h2, h3, h4, h5, h6')
106
- .forEach((heading) => {
107
- const id = genHeadingId(heading.innerHTML);
108
- heading.setAttribute('id', id);
109
- });
110
- return new XMLSerializer().serializeToString(document);
111
- }
112
- return html;
113
- }
114
- export class TdMarkdownComponent {
115
- /**
116
- * content?: string
117
- *
118
- * Markdown format content to be parsed as html markup.
119
- *
120
- * e.g. README.md content.
121
- */
122
- set content(content) {
123
- this._content = content;
124
- }
125
- /**
126
- * simpleLineBreaks?: string
127
- *
128
- * Sets whether newline characters inside paragraphs and spans are parsed as <br/>.
129
- * Defaults to false.
130
- */
131
- set simpleLineBreaks(simpleLineBreaks) {
132
- this._simpleLineBreaks = simpleLineBreaks;
133
- }
134
- /**
135
- * hostedUrl?: string
136
- *
137
- * If markdown contains relative paths, this is required to generate correct urls.
138
- *
139
- */
140
- set hostedUrl(hostedUrl) {
141
- this._hostedUrl = hostedUrl;
142
- }
143
- /**
144
- * anchor?: string
145
- *
146
- * Anchor to jump to.
147
- *
148
- */
149
- set anchor(anchor) {
150
- this._anchor = anchor;
151
- }
152
- constructor(_renderer, _elementRef, _domSanitizer, _ngZone) {
153
- this._renderer = _renderer;
154
- this._elementRef = _elementRef;
155
- this._domSanitizer = _domSanitizer;
156
- this._ngZone = _ngZone;
157
- this._simpleLineBreaks = false;
158
- this._viewInit = false;
159
- /**
160
- * .td-markdown class added to host so ::ng-deep gets scoped.
161
- */
162
- this.class = 'td-markdown';
163
- /**
164
- * contentReady?: function
165
- * Event emitted after the markdown content rendering is finished.
166
- */
167
- this.contentReady = new EventEmitter();
168
- }
169
- ngOnChanges(changes) {
170
- // only anchor changed
171
- if (changes['anchor'] &&
172
- !changes['content'] &&
173
- !changes['simpleLineBreaks'] &&
174
- !changes['hostedUrl']) {
175
- scrollToAnchor(this._elementRef.nativeElement, this._anchor, true);
176
- }
177
- else {
178
- this.refresh();
179
- }
180
- }
181
- ngAfterViewInit() {
182
- if (!this._content) {
183
- this._loadContent(this._elementRef.nativeElement.textContent);
184
- }
185
- this._viewInit = true;
186
- // Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM
187
- // API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.
188
- // Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.
189
- // It also calls `markViewDirty()` before calling the actual listener (the decorated class method).
190
- this._ngZone.runOutsideAngular(() => {
191
- this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event) => {
192
- const element = event.srcElement;
193
- if (element.matches('a[href]') &&
194
- isAnchorLink(element)) {
195
- this.handleAnchorClicks(event);
196
- }
197
- });
198
- });
199
- }
200
- ngOnDestroy() {
201
- this._anchorListener?.();
202
- }
203
- refresh() {
204
- if (this._content) {
205
- this._loadContent(this._content);
206
- }
207
- else if (this._viewInit) {
208
- this._loadContent(this._elementRef.nativeElement.textContent);
209
- }
210
- }
211
- /**
212
- * General method to parse a string markdown into HTML Elements and load them into the container
213
- */
214
- _loadContent(markdown) {
215
- if (markdown && markdown.trim().length > 0) {
216
- // Clean container
217
- this._renderer.setProperty(this._elementRef.nativeElement, 'innerHTML', '');
218
- // Parse html string into actual HTML elements.
219
- this._elementFromString(this._render(markdown));
220
- }
221
- // TODO: timeout required since resizing of html elements occurs which causes a change in the scroll position
222
- this._ngZone.runOutsideAngular(() => setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250));
223
- this.contentReady.emit();
224
- }
225
- handleAnchorClicks(event) {
226
- event.preventDefault();
227
- const url = new URL(event.target.href);
228
- const hash = decodeURI(url.hash);
229
- scrollToAnchor(this._elementRef.nativeElement, hash, true);
230
- }
231
- _elementFromString(markupStr) {
232
- // Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]
233
- // to parse the string into DOM element for now.
234
- const div = this._renderer.createElement('div');
235
- this._renderer.appendChild(this._elementRef.nativeElement, div);
236
- const html = this._domSanitizer.sanitize(SecurityContext.HTML, markupStr) ?? '';
237
- const htmlWithAbsoluteHrefs = normalizeHtmlHrefs(html, this._hostedUrl);
238
- const htmlWithAbsoluteImgSrcs = normalizeImageSrcs(htmlWithAbsoluteHrefs, this._hostedUrl);
239
- const htmlWithHeadingIds = addIdsToHeadings(htmlWithAbsoluteImgSrcs);
240
- const htmlWithVideos = renderVideoElements(htmlWithHeadingIds);
241
- this._renderer.setProperty(div, 'innerHTML', htmlWithVideos);
242
- return div;
243
- }
244
- _render(markdown) {
245
- // Trim leading and trailing newlines
246
- markdown = markdown
247
- .replace(/^(\s|\t)*\n+/g, '')
248
- .replace(/(\s|\t)*\n+(\s|\t)*$/g, '');
249
- // Split markdown by line characters
250
- let lines = markdown.split('\n');
251
- // check how much indentation is used by the first actual markdown line
252
- const firstLineWhitespaceMatch = lines[0].match(/^(\s|\t)*/);
253
- const firstLineWhitespace = firstLineWhitespaceMatch
254
- ? firstLineWhitespaceMatch[0]
255
- : '';
256
- // Remove all indentation spaces so markdown can be parsed correctly
257
- const startingWhitespaceRegex = new RegExp('^' + firstLineWhitespace);
258
- lines = lines.map(function (line) {
259
- return line.replace(startingWhitespaceRegex, '');
260
- });
261
- // Join lines again with line characters
262
- const markdownToParse = lines.join('\n');
263
- // Convert markdown into html
264
- const converter = new showdown.Converter();
265
- converter.setOption('ghCodeBlocks', true);
266
- converter.setOption('tasklists', true);
267
- converter.setOption('tables', true);
268
- converter.setOption('literalMidWordUnderscores', true);
269
- converter.setOption('simpleLineBreaks', this._simpleLineBreaks);
270
- converter.setOption('emoji', true);
271
- return converter.makeHtml(markdownToParse);
272
- }
273
- }
274
- TdMarkdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdMarkdownComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.DomSanitizer }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
275
- TdMarkdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: TdMarkdownComponent, selector: "td-markdown", inputs: { content: "content", simpleLineBreaks: "simpleLineBreaks", hostedUrl: "hostedUrl", anchor: "anchor" }, outputs: { contentReady: "contentReady" }, host: { properties: { "class": "this.class" } }, usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host.td-markdown::ng-deep a{background-color:transparent}:host.td-markdown::ng-deep a:active,:host.td-markdown::ng-deep a:hover{outline-width:0}:host.td-markdown::ng-deep strong{font-weight:inherit;font-weight:bolder}:host.td-markdown::ng-deep h1{font-size:2em;margin:.67em 0}:host.td-markdown::ng-deep img{border-style:none}:host.td-markdown::ng-deep svg:not(:root){overflow:hidden}:host.td-markdown::ng-deep code,:host.td-markdown::ng-deep kbd,:host.td-markdown::ng-deep pre{font-family:monospace;font-size:1em}:host.td-markdown::ng-deep hr{box-sizing:content-box;height:0;overflow:visible}:host.td-markdown::ng-deep input{font:inherit;margin:0;overflow:visible}:host.td-markdown::ng-deep button:-moz-focusring,:host.td-markdown::ng-deep [type=button]:-moz-focusring,:host.td-markdown::ng-deep [type=reset]:-moz-focusring,:host.td-markdown::ng-deep [type=submit]:-moz-focusring{outline:1px dotted ButtonText}:host.td-markdown::ng-deep [type=checkbox]{box-sizing:border-box;padding:0}:host.td-markdown::ng-deep table{border-spacing:0;border-collapse:collapse}:host.td-markdown::ng-deep td,:host.td-markdown::ng-deep th{padding:0}:host.td-markdown::ng-deep *{box-sizing:border-box}:host.td-markdown::ng-deep input{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol}:host.td-markdown::ng-deep a{text-decoration:none}:host.td-markdown::ng-deep a:hover,:host.td-markdown::ng-deep a:active{text-decoration:underline}:host.td-markdown::ng-deep hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep hr:before{display:table;content:\"\"}:host.td-markdown::ng-deep hr:after{display:table;clear:both;content:\"\"}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:0;margin-bottom:0;line-height:1.5}:host.td-markdown::ng-deep h1{font-size:30px}:host.td-markdown::ng-deep h2{font-size:21px}:host.td-markdown::ng-deep h3{font-size:16px}:host.td-markdown::ng-deep h4{font-size:14px}:host.td-markdown::ng-deep h5{font-size:12px}:host.td-markdown::ng-deep h6{font-size:11px}:host.td-markdown::ng-deep p{margin-top:0;margin-bottom:10px}:host.td-markdown::ng-deep blockquote{margin:0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:0;margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ul ol{list-style-type:lower-roman}:host.td-markdown::ng-deep ul ul ol,:host.td-markdown::ng-deep ul ol ol,:host.td-markdown::ng-deep ol ul ol,:host.td-markdown::ng-deep ol ol ol{list-style-type:lower-alpha}:host.td-markdown::ng-deep dd{margin-left:0}:host.td-markdown::ng-deep code{font-family:Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:0;font:12px Consolas,Liberation Mono,Menlo,Courier,monospace}:host.td-markdown::ng-deep .pl-0{padding-left:0!important}:host.td-markdown::ng-deep .pl-1{padding-left:3px!important}:host.td-markdown::ng-deep .pl-2{padding-left:6px!important}:host.td-markdown::ng-deep .pl-3{padding-left:12px!important}:host.td-markdown::ng-deep .pl-4{padding-left:24px!important}:host.td-markdown::ng-deep .pl-5{padding-left:36px!important}:host.td-markdown::ng-deep .pl-6{padding-left:48px!important}:host.td-markdown::ng-deep .form-select::-ms-expand{opacity:0}:host.td-markdown::ng-deep a:not([href]){color:inherit;text-decoration:none}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}:host.td-markdown::ng-deep h1 .octicon-link,:host.td-markdown::ng-deep h2 .octicon-link,:host.td-markdown::ng-deep h3 .octicon-link,:host.td-markdown::ng-deep h4 .octicon-link,:host.td-markdown::ng-deep h5 .octicon-link,:host.td-markdown::ng-deep h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}:host.td-markdown::ng-deep h1:hover .anchor,:host.td-markdown::ng-deep h2:hover .anchor,:host.td-markdown::ng-deep h3:hover .anchor,:host.td-markdown::ng-deep h4:hover .anchor,:host.td-markdown::ng-deep h5:hover .anchor,:host.td-markdown::ng-deep h6:hover .anchor{text-decoration:none}:host.td-markdown::ng-deep h1:hover .anchor .octicon-link,:host.td-markdown::ng-deep h2:hover .anchor .octicon-link,:host.td-markdown::ng-deep h3:hover .anchor .octicon-link,:host.td-markdown::ng-deep h4:hover .anchor .octicon-link,:host.td-markdown::ng-deep h5:hover .anchor .octicon-link,:host.td-markdown::ng-deep h6:hover .anchor .octicon-link{visibility:visible}:host.td-markdown::ng-deep h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h1 .anchor{line-height:1}:host.td-markdown::ng-deep h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h2 .anchor{line-height:1}:host.td-markdown::ng-deep h3{font-size:1.5em;line-height:1.43}:host.td-markdown::ng-deep h3 .anchor{line-height:1.2}:host.td-markdown::ng-deep h4{font-size:1.25em}:host.td-markdown::ng-deep h4 .anchor{line-height:1.2}:host.td-markdown::ng-deep h5{font-size:1em}:host.td-markdown::ng-deep h5 .anchor{line-height:1.1}:host.td-markdown::ng-deep h6{font-size:1em}:host.td-markdown::ng-deep h6 .anchor{line-height:1.1}:host.td-markdown::ng-deep p,:host.td-markdown::ng-deep blockquote,:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol,:host.td-markdown::ng-deep dl,:host.td-markdown::ng-deep table,:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:16px}:host.td-markdown::ng-deep hr{margin:16px 0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:2em}:host.td-markdown::ng-deep ul ul,:host.td-markdown::ng-deep ul ol,:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ol ul{margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep li>p{margin-top:16px}:host.td-markdown::ng-deep dl{padding:0}:host.td-markdown::ng-deep dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}:host.td-markdown::ng-deep dl dd{padding:0 16px;margin-bottom:16px}:host.td-markdown::ng-deep blockquote{padding:0 15px;border-left-width:4px;border-left-style:solid}:host.td-markdown::ng-deep blockquote>:first-child{margin-top:0}:host.td-markdown::ng-deep blockquote>:last-child{margin-bottom:0}:host.td-markdown::ng-deep table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}:host.td-markdown::ng-deep table th{font-weight:700}:host.td-markdown::ng-deep table th,:host.td-markdown::ng-deep table td{padding:6px 13px;border-width:1px;border-style:solid}:host.td-markdown::ng-deep table tr{border-top-width:1px;border-top-style:solid}:host.td-markdown::ng-deep img{max-width:100%;box-sizing:content-box}:host.td-markdown::ng-deep code{padding:.2em 0;margin:0;font-size:85%;border-radius:3px}:host.td-markdown::ng-deep code:before,:host.td-markdown::ng-deep code:after{letter-spacing:-.2em}:host.td-markdown::ng-deep pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}:host.td-markdown::ng-deep .highlight{margin-bottom:16px}:host.td-markdown::ng-deep .highlight pre,:host.td-markdown::ng-deep pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px}:host.td-markdown::ng-deep .highlight pre{margin-bottom:0;word-break:normal}:host.td-markdown::ng-deep pre{word-wrap:normal}:host.td-markdown::ng-deep pre code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}:host.td-markdown::ng-deep pre code:before,:host.td-markdown::ng-deep pre code:after{content:normal}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;vertical-align:middle;border-style:solid;border-width:1px;border-radius:3px}:host.td-markdown::ng-deep .pl-c{color:#969896}:host.td-markdown::ng-deep .pl-c1,:host.td-markdown::ng-deep .pl-s .pl-v{color:#0086b3}:host.td-markdown::ng-deep .pl-e,:host.td-markdown::ng-deep .pl-en{color:#795da3}:host.td-markdown::ng-deep .pl-s .pl-s1,:host.td-markdown::ng-deep .pl-smi{color:#333}:host.td-markdown::ng-deep .pl-ent{color:#63a35c}:host.td-markdown::ng-deep .pl-k{color:#a71d5d}:host.td-markdown::ng-deep .pl-pds,:host.td-markdown::ng-deep .pl-s,:host.td-markdown::ng-deep .pl-s .pl-pse .pl-s1,:host.td-markdown::ng-deep .pl-sr,:host.td-markdown::ng-deep .pl-sr .pl-cce,:host.td-markdown::ng-deep .pl-sr .pl-sra,:host.td-markdown::ng-deep .pl-sr .pl-sre{color:#183691}:host.td-markdown::ng-deep .pl-v{color:#ed6a43}:host.td-markdown::ng-deep .pl-id{color:#b52a1d}:host.td-markdown::ng-deep .pl-ii{background-color:#b52a1d;color:#f8f8f8}:host.td-markdown::ng-deep .pl-sr .pl-cce{color:#63a35c;font-weight:700}:host.td-markdown::ng-deep .pl-ml{color:#693a17}:host.td-markdown::ng-deep .pl-mh,:host.td-markdown::ng-deep .pl-mh .pl-en,:host.td-markdown::ng-deep .pl-ms{color:#1d3e81;font-weight:700}:host.td-markdown::ng-deep .pl-mq{color:teal}:host.td-markdown::ng-deep .pl-mi{color:#333;font-style:italic}:host.td-markdown::ng-deep .pl-mb{color:#333;font-weight:700}:host.td-markdown::ng-deep .pl-md{background-color:#ffecec;color:#bd2c00}:host.td-markdown::ng-deep .pl-mi1{background-color:#eaffea;color:#55a532}:host.td-markdown::ng-deep .pl-mdr{color:#795da3;font-weight:700}:host.td-markdown::ng-deep .pl-mo{color:#1d3e81}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font:11px Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #cccccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px #bbb}:host.td-markdown::ng-deep .full-commit .btn-outline:not(:disabled):hover{color:#4078c0;border:1px solid #4078c0}:host.td-markdown::ng-deep :checked+.radio-label{position:relative;z-index:1;border-color:#4078c0}:host.td-markdown::ng-deep .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}:host.td-markdown::ng-deep .task-list-item{list-style-type:none}:host.td-markdown::ng-deep .task-list-item+.task-list-item{margin-top:3px}:host.td-markdown::ng-deep .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}\n"] });
276
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdMarkdownComponent, decorators: [{
277
- type: Component,
278
- args: [{ selector: 'td-markdown', template: "<ng-content></ng-content>\n", styles: [":host.td-markdown::ng-deep a{background-color:transparent}:host.td-markdown::ng-deep a:active,:host.td-markdown::ng-deep a:hover{outline-width:0}:host.td-markdown::ng-deep strong{font-weight:inherit;font-weight:bolder}:host.td-markdown::ng-deep h1{font-size:2em;margin:.67em 0}:host.td-markdown::ng-deep img{border-style:none}:host.td-markdown::ng-deep svg:not(:root){overflow:hidden}:host.td-markdown::ng-deep code,:host.td-markdown::ng-deep kbd,:host.td-markdown::ng-deep pre{font-family:monospace;font-size:1em}:host.td-markdown::ng-deep hr{box-sizing:content-box;height:0;overflow:visible}:host.td-markdown::ng-deep input{font:inherit;margin:0;overflow:visible}:host.td-markdown::ng-deep button:-moz-focusring,:host.td-markdown::ng-deep [type=button]:-moz-focusring,:host.td-markdown::ng-deep [type=reset]:-moz-focusring,:host.td-markdown::ng-deep [type=submit]:-moz-focusring{outline:1px dotted ButtonText}:host.td-markdown::ng-deep [type=checkbox]{box-sizing:border-box;padding:0}:host.td-markdown::ng-deep table{border-spacing:0;border-collapse:collapse}:host.td-markdown::ng-deep td,:host.td-markdown::ng-deep th{padding:0}:host.td-markdown::ng-deep *{box-sizing:border-box}:host.td-markdown::ng-deep input{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol}:host.td-markdown::ng-deep a{text-decoration:none}:host.td-markdown::ng-deep a:hover,:host.td-markdown::ng-deep a:active{text-decoration:underline}:host.td-markdown::ng-deep hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep hr:before{display:table;content:\"\"}:host.td-markdown::ng-deep hr:after{display:table;clear:both;content:\"\"}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:0;margin-bottom:0;line-height:1.5}:host.td-markdown::ng-deep h1{font-size:30px}:host.td-markdown::ng-deep h2{font-size:21px}:host.td-markdown::ng-deep h3{font-size:16px}:host.td-markdown::ng-deep h4{font-size:14px}:host.td-markdown::ng-deep h5{font-size:12px}:host.td-markdown::ng-deep h6{font-size:11px}:host.td-markdown::ng-deep p{margin-top:0;margin-bottom:10px}:host.td-markdown::ng-deep blockquote{margin:0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:0;margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ul ol{list-style-type:lower-roman}:host.td-markdown::ng-deep ul ul ol,:host.td-markdown::ng-deep ul ol ol,:host.td-markdown::ng-deep ol ul ol,:host.td-markdown::ng-deep ol ol ol{list-style-type:lower-alpha}:host.td-markdown::ng-deep dd{margin-left:0}:host.td-markdown::ng-deep code{font-family:Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:0;font:12px Consolas,Liberation Mono,Menlo,Courier,monospace}:host.td-markdown::ng-deep .pl-0{padding-left:0!important}:host.td-markdown::ng-deep .pl-1{padding-left:3px!important}:host.td-markdown::ng-deep .pl-2{padding-left:6px!important}:host.td-markdown::ng-deep .pl-3{padding-left:12px!important}:host.td-markdown::ng-deep .pl-4{padding-left:24px!important}:host.td-markdown::ng-deep .pl-5{padding-left:36px!important}:host.td-markdown::ng-deep .pl-6{padding-left:48px!important}:host.td-markdown::ng-deep .form-select::-ms-expand{opacity:0}:host.td-markdown::ng-deep a:not([href]){color:inherit;text-decoration:none}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}:host.td-markdown::ng-deep h1 .octicon-link,:host.td-markdown::ng-deep h2 .octicon-link,:host.td-markdown::ng-deep h3 .octicon-link,:host.td-markdown::ng-deep h4 .octicon-link,:host.td-markdown::ng-deep h5 .octicon-link,:host.td-markdown::ng-deep h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}:host.td-markdown::ng-deep h1:hover .anchor,:host.td-markdown::ng-deep h2:hover .anchor,:host.td-markdown::ng-deep h3:hover .anchor,:host.td-markdown::ng-deep h4:hover .anchor,:host.td-markdown::ng-deep h5:hover .anchor,:host.td-markdown::ng-deep h6:hover .anchor{text-decoration:none}:host.td-markdown::ng-deep h1:hover .anchor .octicon-link,:host.td-markdown::ng-deep h2:hover .anchor .octicon-link,:host.td-markdown::ng-deep h3:hover .anchor .octicon-link,:host.td-markdown::ng-deep h4:hover .anchor .octicon-link,:host.td-markdown::ng-deep h5:hover .anchor .octicon-link,:host.td-markdown::ng-deep h6:hover .anchor .octicon-link{visibility:visible}:host.td-markdown::ng-deep h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h1 .anchor{line-height:1}:host.td-markdown::ng-deep h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h2 .anchor{line-height:1}:host.td-markdown::ng-deep h3{font-size:1.5em;line-height:1.43}:host.td-markdown::ng-deep h3 .anchor{line-height:1.2}:host.td-markdown::ng-deep h4{font-size:1.25em}:host.td-markdown::ng-deep h4 .anchor{line-height:1.2}:host.td-markdown::ng-deep h5{font-size:1em}:host.td-markdown::ng-deep h5 .anchor{line-height:1.1}:host.td-markdown::ng-deep h6{font-size:1em}:host.td-markdown::ng-deep h6 .anchor{line-height:1.1}:host.td-markdown::ng-deep p,:host.td-markdown::ng-deep blockquote,:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol,:host.td-markdown::ng-deep dl,:host.td-markdown::ng-deep table,:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:16px}:host.td-markdown::ng-deep hr{margin:16px 0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:2em}:host.td-markdown::ng-deep ul ul,:host.td-markdown::ng-deep ul ol,:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ol ul{margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep li>p{margin-top:16px}:host.td-markdown::ng-deep dl{padding:0}:host.td-markdown::ng-deep dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}:host.td-markdown::ng-deep dl dd{padding:0 16px;margin-bottom:16px}:host.td-markdown::ng-deep blockquote{padding:0 15px;border-left-width:4px;border-left-style:solid}:host.td-markdown::ng-deep blockquote>:first-child{margin-top:0}:host.td-markdown::ng-deep blockquote>:last-child{margin-bottom:0}:host.td-markdown::ng-deep table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}:host.td-markdown::ng-deep table th{font-weight:700}:host.td-markdown::ng-deep table th,:host.td-markdown::ng-deep table td{padding:6px 13px;border-width:1px;border-style:solid}:host.td-markdown::ng-deep table tr{border-top-width:1px;border-top-style:solid}:host.td-markdown::ng-deep img{max-width:100%;box-sizing:content-box}:host.td-markdown::ng-deep code{padding:.2em 0;margin:0;font-size:85%;border-radius:3px}:host.td-markdown::ng-deep code:before,:host.td-markdown::ng-deep code:after{letter-spacing:-.2em}:host.td-markdown::ng-deep pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}:host.td-markdown::ng-deep .highlight{margin-bottom:16px}:host.td-markdown::ng-deep .highlight pre,:host.td-markdown::ng-deep pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px}:host.td-markdown::ng-deep .highlight pre{margin-bottom:0;word-break:normal}:host.td-markdown::ng-deep pre{word-wrap:normal}:host.td-markdown::ng-deep pre code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}:host.td-markdown::ng-deep pre code:before,:host.td-markdown::ng-deep pre code:after{content:normal}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;vertical-align:middle;border-style:solid;border-width:1px;border-radius:3px}:host.td-markdown::ng-deep .pl-c{color:#969896}:host.td-markdown::ng-deep .pl-c1,:host.td-markdown::ng-deep .pl-s .pl-v{color:#0086b3}:host.td-markdown::ng-deep .pl-e,:host.td-markdown::ng-deep .pl-en{color:#795da3}:host.td-markdown::ng-deep .pl-s .pl-s1,:host.td-markdown::ng-deep .pl-smi{color:#333}:host.td-markdown::ng-deep .pl-ent{color:#63a35c}:host.td-markdown::ng-deep .pl-k{color:#a71d5d}:host.td-markdown::ng-deep .pl-pds,:host.td-markdown::ng-deep .pl-s,:host.td-markdown::ng-deep .pl-s .pl-pse .pl-s1,:host.td-markdown::ng-deep .pl-sr,:host.td-markdown::ng-deep .pl-sr .pl-cce,:host.td-markdown::ng-deep .pl-sr .pl-sra,:host.td-markdown::ng-deep .pl-sr .pl-sre{color:#183691}:host.td-markdown::ng-deep .pl-v{color:#ed6a43}:host.td-markdown::ng-deep .pl-id{color:#b52a1d}:host.td-markdown::ng-deep .pl-ii{background-color:#b52a1d;color:#f8f8f8}:host.td-markdown::ng-deep .pl-sr .pl-cce{color:#63a35c;font-weight:700}:host.td-markdown::ng-deep .pl-ml{color:#693a17}:host.td-markdown::ng-deep .pl-mh,:host.td-markdown::ng-deep .pl-mh .pl-en,:host.td-markdown::ng-deep .pl-ms{color:#1d3e81;font-weight:700}:host.td-markdown::ng-deep .pl-mq{color:teal}:host.td-markdown::ng-deep .pl-mi{color:#333;font-style:italic}:host.td-markdown::ng-deep .pl-mb{color:#333;font-weight:700}:host.td-markdown::ng-deep .pl-md{background-color:#ffecec;color:#bd2c00}:host.td-markdown::ng-deep .pl-mi1{background-color:#eaffea;color:#55a532}:host.td-markdown::ng-deep .pl-mdr{color:#795da3;font-weight:700}:host.td-markdown::ng-deep .pl-mo{color:#1d3e81}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font:11px Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #cccccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px #bbb}:host.td-markdown::ng-deep .full-commit .btn-outline:not(:disabled):hover{color:#4078c0;border:1px solid #4078c0}:host.td-markdown::ng-deep :checked+.radio-label{position:relative;z-index:1;border-color:#4078c0}:host.td-markdown::ng-deep .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}:host.td-markdown::ng-deep .task-list-item{list-style-type:none}:host.td-markdown::ng-deep .task-list-item+.task-list-item{margin-top:3px}:host.td-markdown::ng-deep .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}\n"] }]
279
- }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, propDecorators: { class: [{
280
- type: HostBinding,
281
- args: ['class']
282
- }], content: [{
283
- type: Input
284
- }], simpleLineBreaks: [{
285
- type: Input
286
- }], hostedUrl: [{
287
- type: Input
288
- }], anchor: [{
289
- type: Input
290
- }], contentReady: [{
291
- type: Output
292
- }] } });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9tYXJrZG93bi9zcmMvbGliL21hcmtkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvbWFya2Rvd24vc3JjL2xpYi9tYXJrZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsZUFBZSxFQUdmLFdBQVcsRUFDWCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLFlBQVksRUFDWixlQUFlLEVBQ2YsbUJBQW1CLEdBQ3BCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7OztBQUVyQyxtQ0FBbUM7QUFDbkMseUJBQXlCO0FBQ3pCLFNBQVMsb0JBQW9CLENBQzNCLFdBQW1CLEVBQ25CLFlBQW9CO0lBRXBCLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtRQUMvQixNQUFNLFVBQVUsR0FBUSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBVyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFRLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FB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QUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwQyxTQUFTLENBQUMsU0FBUyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFNBQVMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7O2dIQXhOVSxtQkFBbUI7b0dBQW5CLG1CQUFtQixvUkNwS2hDLDZCQUNBOzJGRG1LYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsYUFBYTt5S0FnQkQsS0FBSztzQkFBMUIsV0FBVzt1QkFBQyxPQUFPO2dCQVVoQixPQUFPO3NCQURWLEtBQUs7Z0JBWUYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQVlGLFNBQVM7c0JBRFosS0FBSztnQkFZRixNQUFNO3NCQURULEtBQUs7Z0JBU0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBSZW5kZXJlcjIsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBIb3N0QmluZGluZyxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtcbiAgc2Nyb2xsVG9BbmNob3IsXG4gIGdlbkhlYWRpbmdJZCxcbiAgaXNBbmNob3JMaW5rLFxuICByZW1vdmVUcmFpbGluZ0hhc2gsXG4gIHJhd0dpdGh1YkhyZWYsXG4gIGlzR2l0aHViSHJlZixcbiAgaXNSYXdHaXRodWJIcmVmLFxuICByZW5kZXJWaWRlb0VsZW1lbnRzLFxufSBmcm9tICcuL21hcmtkb3duLXV0aWxzL21hcmtkb3duLXV0aWxzJztcblxuaW1wb3J0ICogYXMgc2hvd2Rvd24gZnJvbSAnc2hvd2Rvd24nO1xuXG4vLyBUT0RPOiBhc3N1bWVzIGl0IGlzIGEgZ2l0aHViIHVybFxuLy8gYWxsb3cgb3ZlcnJpZGUgc29tZWhvd1xuZnVuY3Rpb24gZ2VuZXJhdGVBYnNvbHV0ZUhyZWYoXG4gIGN1cnJlbnRIcmVmOiBzdHJpbmcsXG4gIHJlbGF0aXZlSHJlZjogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoY3VycmVudEhyZWYgJiYgcmVsYXRpdmVIcmVmKSB7XG4gICAgY29uc3QgY3VycmVudFVybDogVVJMID0gbmV3IFVSTChjdXJyZW50SHJlZik7XG4gICAgY29uc3QgcGF0aDogc3RyaW5nID0gY3VycmVudFVybC5wYXRobmFtZS5zcGxpdCgnLycpLnNsaWNlKDEsIC0xKS5qb2luKCcvJyk7XG4gICAgY29uc3QgY29ycmVjdFVybDogVVJMID0gbmV3IFVSTChjdXJyZW50SHJlZik7XG5cbiAgICBpZiAocmVsYXRpdmVIcmVmLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgLy8gdXJsIGlzIHJlbGF0aXZlIHRvIHRvcCBsZXZlbFxuICAgICAgY29uc3Qgb3JnQW5kUmVwbzogc3RyaW5nID0gcGF0aC5zcGxpdCgnLycpLnNsaWNlKDAsIDMpLmpvaW4oJy8nKTtcbiAgICAgIGNvcnJlY3RVcmwucGF0aG5hbWUgPSBgJHtvcmdBbmRSZXBvfSR7cmVsYXRpdmVIcmVmfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvcnJlY3RVcmwucGF0aG5hbWUgPSBgJHtwYXRofS8ke3JlbGF0aXZlSHJlZn1gO1xuICAgIH1cbiAgICByZXR1cm4gY29ycmVjdFVybC5ocmVmO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSHRtbEhyZWZzKGh0bWw6IHN0cmluZywgY3VycmVudEhyZWY6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChjdXJyZW50SHJlZikge1xuICAgIGNvbnN0IGRvY3VtZW50OiBEb2N1bWVudCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoXG4gICAgICBodG1sLFxuICAgICAgJ3RleHQvaHRtbCdcbiAgICApO1xuICAgIGRvY3VtZW50XG4gICAgICAucXVlcnlTZWxlY3RvckFsbDxIVE1MQW5jaG9yRWxlbWVudD4oJ2FbaHJlZl0nKVxuICAgICAgLmZvckVhY2goKGxpbms6IEhUTUxBbmNob3JFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybDogVVJMID0gbmV3IFVSTChsaW5rLmhyZWYpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEhhc2g6IHN0cmluZyA9IHVybC5oYXNoO1xuICAgICAgICBpZiAoaXNBbmNob3JMaW5rKGxpbmspKSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsSGFzaCkge1xuICAgICAgICAgICAgdXJsLmhhc2ggPSBnZW5IZWFkaW5nSWQob3JpZ2luYWxIYXNoKTtcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5oYXNoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1cmwuaG9zdCA9PT0gd2luZG93LmxvY2F0aW9uLmhvc3QpIHtcbiAgICAgICAgICAvLyBob3N0cyBtYXRjaCwgbWVhbmluZyBVUkwgTUlHSFQgaGF2ZSBiZWVuIG1hbGZvcm1lZCBieSBzaG93ZG93blxuICAgICAgICAgIC8vIHVybCBpcyBhIHJlbGF0aXZlIHVybCBvciBqdXN0IGEgbGluayB0byBhIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICAgICAgaWYgKHVybC5wYXRobmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgY2hlY2sgLm1kIHVybHNcblxuICAgICAgICAgICAgY29uc3QgaHJlZldpdGhvdXRIYXNoOiBzdHJpbmcgPSByZW1vdmVUcmFpbGluZ0hhc2goXG4gICAgICAgICAgICAgIGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHVybC5ocmVmID0gZ2VuZXJhdGVBYnNvbHV0ZUhyZWYoY3VycmVudEhyZWYsIGhyZWZXaXRob3V0SGFzaCk7XG5cbiAgICAgICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICAgICAgdXJsLmhhc2ggPSBnZW5IZWFkaW5nSWQob3JpZ2luYWxIYXNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5ocmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVybCBpcyBhYnNvbHV0ZVxuICAgICAgICAgIGlmICh1cmwucGF0aG5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxIYXNoKSB7XG4gICAgICAgICAgICAgIHVybC5oYXNoID0gZ2VuSGVhZGluZ0lkKG9yaWdpbmFsSGFzaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaW5rLmhyZWYgPSB1cmwuaHJlZjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhkb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUltYWdlU3JjcyhodG1sOiBzdHJpbmcsIGN1cnJlbnRIcmVmOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY3VycmVudEhyZWYpIHtcbiAgICBjb25zdCBkb2N1bWVudDogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgICAgaHRtbCxcbiAgICAgICd0ZXh0L2h0bWwnXG4gICAgKTtcbiAgICBkb2N1bWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEltYWdlRWxlbWVudD4oJ2ltZ1tzcmNdJylcbiAgICAgIC5mb3JFYWNoKChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBzcmMgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3NyYycpID8/ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvbiAqL1xuICAgICAgICAgIG5ldyBVUkwoc3JjKTtcbiAgICAgICAgICBpZiAoaXNHaXRodWJIcmVmKHNyYykpIHtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IHJhd0dpdGh1YkhyZWYoc3JjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGltYWdlLnNyYyA9IGdlbmVyYXRlQWJzb2x1dGVIcmVmKFxuICAgICAgICAgICAgaXNHaXRodWJIcmVmKGN1cnJlbnRIcmVmKVxuICAgICAgICAgICAgICA/IHJhd0dpdGh1YkhyZWYoY3VycmVudEhyZWYpXG4gICAgICAgICAgICAgIDogY3VycmVudEhyZWYsXG4gICAgICAgICAgICBzcmNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdoIHN2Z3MgbmVlZCB0byBoYXZlID9zYW5pdGl6ZT10cnVlXG4gICAgICAgIGlmIChpc1Jhd0dpdGh1YkhyZWYoaW1hZ2Uuc3JjKSkge1xuICAgICAgICAgIGNvbnN0IHVybDogVVJMID0gbmV3IFVSTChpbWFnZS5zcmMpO1xuICAgICAgICAgIGlmICh1cmwucGF0aG5hbWUuZW5kc1dpdGgoJy5zdmcnKSkge1xuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3Nhbml0aXplJywgJ3RydWUnKTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IHVybC5ocmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhkb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIGFkZElkc1RvSGVhZGluZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGh0bWwpIHtcbiAgICBjb25zdCBkb2N1bWVudDogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgICAgaHRtbCxcbiAgICAgICd0ZXh0L2h0bWwnXG4gICAgKTtcbiAgICBkb2N1bWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJ2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYnKVxuICAgICAgLmZvckVhY2goKGhlYWRpbmc6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGdlbkhlYWRpbmdJZChoZWFkaW5nLmlubmVySFRNTCk7XG4gICAgICAgIGhlYWRpbmcuc2V0QXR0cmlidXRlKCdpZCcsIGlkKTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGRvY3VtZW50KTtcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGQtbWFya2Rvd24nLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBUZE1hcmtkb3duQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSBfY29udGVudCE6IHN0cmluZztcbiAgcHJpdmF0ZSBfc2ltcGxlTGluZUJyZWFrcyA9IGZhbHNlO1xuICBwcml2YXRlIF9ob3N0ZWRVcmwhOiBzdHJpbmc7XG4gIHByaXZhdGUgX2FuY2hvciE6IHN0cmluZztcbiAgcHJpdmF0ZSBfdmlld0luaXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYW5jaG9yTGlzdGVuZXI/OiBWb2lkRnVuY3Rpb247XG4gIC8qKlxuICAgKiAudGQtbWFya2Rvd24gY2xhc3MgYWRkZWQgdG8gaG9zdCBzbyA6Om5nLWRlZXAgZ2V0cyBzY29wZWQuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3MgPSAndGQtbWFya2Rvd24nO1xuXG4gIC8qKlxuICAgKiBjb250ZW50Pzogc3RyaW5nXG4gICAqXG4gICAqIE1hcmtkb3duIGZvcm1hdCBjb250ZW50IHRvIGJlIHBhcnNlZCBhcyBodG1sIG1hcmt1cC5cbiAgICpcbiAgICogZS5nLiBSRUFETUUubWQgY29udGVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBjb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIHNpbXBsZUxpbmVCcmVha3M/OiBzdHJpbmdcbiAgICpcbiAgICogU2V0cyB3aGV0aGVyIG5ld2xpbmUgY2hhcmFjdGVycyBpbnNpZGUgcGFyYWdyYXBocyBhbmQgc3BhbnMgYXJlIHBhcnNlZCBhcyA8YnIvPi5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2ltcGxlTGluZUJyZWFrcyhzaW1wbGVMaW5lQnJlYWtzOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2ltcGxlTGluZUJyZWFrcyA9IHNpbXBsZUxpbmVCcmVha3M7XG4gIH1cblxuICAvKipcbiAgICogaG9zdGVkVXJsPzogc3RyaW5nXG4gICAqXG4gICAqIElmIG1hcmtkb3duIGNvbnRhaW5zIHJlbGF0aXZlIHBhdGhzLCB0aGlzIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGNvcnJlY3QgdXJscy5cbiAgICpcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBob3N0ZWRVcmwoaG9zdGVkVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ob3N0ZWRVcmwgPSBob3N0ZWRVcmw7XG4gIH1cblxuICAvKipcbiAgICogYW5jaG9yPzogc3RyaW5nXG4gICAqXG4gICAqIEFuY2hvciB0byBqdW1wIHRvLlxuICAgKlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGFuY2hvcihhbmNob3I6IHN0cmluZykge1xuICAgIHRoaXMuX2FuY2hvciA9IGFuY2hvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBjb250ZW50UmVhZHk/OiBmdW5jdGlvblxuICAgKiBFdmVudCBlbWl0dGVkIGFmdGVyIHRoZSBtYXJrZG93biBjb250ZW50IHJlbmRlcmluZyBpcyBmaW5pc2hlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBjb250ZW50UmVhZHk6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBvbmx5IGFuY2hvciBjaGFuZ2VkXG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1snYW5jaG9yJ10gJiZcbiAgICAgICFjaGFuZ2VzWydjb250ZW50J10gJiZcbiAgICAgICFjaGFuZ2VzWydzaW1wbGVMaW5lQnJlYWtzJ10gJiZcbiAgICAgICFjaGFuZ2VzWydob3N0ZWRVcmwnXVxuICAgICkge1xuICAgICAgc2Nyb2xsVG9BbmNob3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9hbmNob3IsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9sb2FkQ29udGVudChcbiAgICAgICAgKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl92aWV3SW5pdCA9IHRydWU7XG5cbiAgICAvLyBDYXJldGFrZXIgbm90ZTogdGhlIGBzY3JvbGxUb0FuY2hvcmAgY2FsbHMgYGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXdgLCBhIG5hdGl2ZSBzeW5jaHJvbm91cyBET01cbiAgICAvLyBBUEkgYW5kIGl0IGRvZXNuJ3QgcmVxdWlyZSBBbmd1bGFyIHJ1bm5pbmcgYEFwcGxpY2F0aW9uUmVmLnRpY2soKWAgZWFjaCB0aW1lIHRoZSBtYXJrZG93biBjb21wb25lbnQgaXMgY2xpY2tlZC5cbiAgICAvLyBIb3N0IGxpc3RlbmVyIChhZGRlZCB0aHJvdWdoIGBASG9zdExpc3RlbmVyYCkgY2F1c2UgQW5ndWxhciB0byBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgd2l0aGluIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAgLy8gSXQgYWxzbyBjYWxscyBgbWFya1ZpZXdEaXJ0eSgpYCBiZWZvcmUgY2FsbGluZyB0aGUgYWN0dWFsIGxpc3RlbmVyICh0aGUgZGVjb3JhdGVkIGNsYXNzIG1ldGhvZCkuXG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX2FuY2hvckxpc3RlbmVyID0gdGhpcy5fcmVuZGVyZXIubGlzdGVuKFxuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICdjbGljaycsXG4gICAgICAgIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnNyY0VsZW1lbnQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWxlbWVudC5tYXRjaGVzKCdhW2hyZWZdJykgJiZcbiAgICAgICAgICAgIGlzQW5jaG9yTGluayg8SFRNTEFuY2hvckVsZW1lbnQ+ZWxlbWVudClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQW5jaG9yQ2xpY2tzKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9hbmNob3JMaXN0ZW5lcj8uKCk7XG4gIH1cblxuICByZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9sb2FkQ29udGVudCh0aGlzLl9jb250ZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3ZpZXdJbml0KSB7XG4gICAgICB0aGlzLl9sb2FkQ29udGVudChcbiAgICAgICAgKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmFsIG1ldGhvZCB0byBwYXJzZSBhIHN0cmluZyBtYXJrZG93biBpbnRvIEhUTUwgRWxlbWVudHMgYW5kIGxvYWQgdGhlbSBpbnRvIHRoZSBjb250YWluZXJcbiAgICovXG4gIHByaXZhdGUgX2xvYWRDb250ZW50KG1hcmtkb3duOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKG1hcmtkb3duICYmIG1hcmtkb3duLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDbGVhbiBjb250YWluZXJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICdpbm5lckhUTUwnLFxuICAgICAgICAnJ1xuICAgICAgKTtcbiAgICAgIC8vIFBhcnNlIGh0bWwgc3RyaW5nIGludG8gYWN0dWFsIEhUTUwgZWxlbWVudHMuXG4gICAgICB0aGlzLl9lbGVtZW50RnJvbVN0cmluZyh0aGlzLl9yZW5kZXIobWFya2Rvd24pKTtcbiAgICB9XG4gICAgLy8gVE9ETzogdGltZW91dCByZXF1aXJlZCBzaW5jZSByZXNpemluZyBvZiBodG1sIGVsZW1lbnRzIG9jY3VycyB3aGljaCBjYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxuICAgICAgc2V0VGltZW91dChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBzY3JvbGxUb0FuY2hvcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2FuY2hvciwgdHJ1ZSksXG4gICAgICAgIDI1MFxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5jb250ZW50UmVhZHkuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBbmNob3JDbGlja3MoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB1cmw6IFVSTCA9IG5ldyBVUkwoKDxIVE1MQW5jaG9yRWxlbWVudD5ldmVudC50YXJnZXQpLmhyZWYpO1xuICAgIGNvbnN0IGhhc2g6IHN0cmluZyA9IGRlY29kZVVSSSh1cmwuaGFzaCk7XG4gICAgc2Nyb2xsVG9BbmNob3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBoYXNoLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VsZW1lbnRGcm9tU3RyaW5nKG1hcmt1cFN0cjogc3RyaW5nKTogSFRNTERpdkVsZW1lbnQge1xuICAgIC8vIFJlbmRlcmVyMiBkb2VzbnQgaGF2ZSBhIHBhcnNpbmcgbWV0aG9kLCBzbyB3ZSBoYXZlIHRvIHNhbml0aXplIGFuZCB1c2UgW2lubmVySFRNTF1cbiAgICAvLyB0byBwYXJzZSB0aGUgc3RyaW5nIGludG8gRE9NIGVsZW1lbnQgZm9yIG5vdy5cbiAgICBjb25zdCBkaXY6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBkaXYpO1xuICAgIGNvbnN0IGh0bWw6IHN0cmluZyA9XG4gICAgICB0aGlzLl9kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIG1hcmt1cFN0cikgPz8gJyc7XG4gICAgY29uc3QgaHRtbFdpdGhBYnNvbHV0ZUhyZWZzOiBzdHJpbmcgPSBub3JtYWxpemVIdG1sSHJlZnMoXG4gICAgICBodG1sLFxuICAgICAgdGhpcy5faG9zdGVkVXJsXG4gICAgKTtcbiAgICBjb25zdCBodG1sV2l0aEFic29sdXRlSW1nU3Jjczogc3RyaW5nID0gbm9ybWFsaXplSW1hZ2VTcmNzKFxuICAgICAgaHRtbFdpdGhBYnNvbHV0ZUhyZWZzLFxuICAgICAgdGhpcy5faG9zdGVkVXJsXG4gICAgKTtcbiAgICBjb25zdCBodG1sV2l0aEhlYWRpbmdJZHM6IHN0cmluZyA9IGFkZElkc1RvSGVhZGluZ3MoXG4gICAgICBodG1sV2l0aEFic29sdXRlSW1nU3Jjc1xuICAgICk7XG4gICAgY29uc3QgaHRtbFdpdGhWaWRlb3M6IFNhZmVIdG1sID0gcmVuZGVyVmlkZW9FbGVtZW50cyhodG1sV2l0aEhlYWRpbmdJZHMpO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KGRpdiwgJ2lubmVySFRNTCcsIGh0bWxXaXRoVmlkZW9zKTtcbiAgICByZXR1cm4gZGl2O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyKG1hcmtkb3duOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgbmV3bGluZXNcbiAgICBtYXJrZG93biA9IG1hcmtkb3duXG4gICAgICAucmVwbGFjZSgvXihcXHN8XFx0KSpcXG4rL2csICcnKVxuICAgICAgLnJlcGxhY2UoLyhcXHN8XFx0KSpcXG4rKFxcc3xcXHQpKiQvZywgJycpO1xuICAgIC8vIFNwbGl0IG1hcmtkb3duIGJ5IGxpbmUgY2hhcmFjdGVyc1xuICAgIGxldCBsaW5lczogc3RyaW5nW10gPSBtYXJrZG93bi5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBjaGVjayBob3cgbXVjaCBpbmRlbnRhdGlvbiBpcyB1c2VkIGJ5IHRoZSBmaXJzdCBhY3R1YWwgbWFya2Rvd24gbGluZVxuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2VNYXRjaCA9IGxpbmVzWzBdLm1hdGNoKC9eKFxcc3xcXHQpKi8pO1xuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2U6IHN0cmluZyA9IGZpcnN0TGluZVdoaXRlc3BhY2VNYXRjaFxuICAgICAgPyBmaXJzdExpbmVXaGl0ZXNwYWNlTWF0Y2hbMF1cbiAgICAgIDogJyc7XG5cbiAgICAvLyBSZW1vdmUgYWxsIGluZGVudGF0aW9uIHNwYWNlcyBzbyBtYXJrZG93biBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseVxuICAgIGNvbnN0IHN0YXJ0aW5nV2hpdGVzcGFjZVJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBmaXJzdExpbmVXaGl0ZXNwYWNlKTtcbiAgICBsaW5lcyA9IGxpbmVzLm1hcChmdW5jdGlvbiAobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBsaW5lLnJlcGxhY2Uoc3RhcnRpbmdXaGl0ZXNwYWNlUmVnZXgsICcnKTtcbiAgICB9KTtcblxuICAgIC8vIEpvaW4gbGluZXMgYWdhaW4gd2l0aCBsaW5lIGNoYXJhY3RlcnNcbiAgICBjb25zdCBtYXJrZG93blRvUGFyc2U6IHN0cmluZyA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29udmVydCBtYXJrZG93biBpbnRvIGh0bWxcbiAgICBjb25zdCBjb252ZXJ0ZXI6IHNob3dkb3duLkNvbnZlcnRlciA9IG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdnaENvZGVCbG9ja3MnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YXNrbGlzdHMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YWJsZXMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzJywgdHJ1ZSk7XG4gICAgY29udmVydGVyLnNldE9wdGlvbignc2ltcGxlTGluZUJyZWFrcycsIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MpO1xuICAgIGNvbnZlcnRlci5zZXRPcHRpb24oJ2Vtb2ppJywgdHJ1ZSk7XG4gICAgcmV0dXJuIGNvbnZlcnRlci5tYWtlSHRtbChtYXJrZG93blRvUGFyc2UpO1xuICB9XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=