@rivet-health/design-system 31.0.1 → 31.2.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.
- package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +370 -0
- package/esm2020/lib/overlay/toast/toast.component.mjs +3 -2
- package/esm2020/lib/riv.module.mjs +6 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/rivet-health-design-system.mjs +378 -3
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +374 -3
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/input/mentions-input/mentions-input.component.d.ts +88 -0
- package/lib/overlay/toast/toast.component.d.ts +1 -0
- package/lib/riv.module.d.ts +16 -15
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "../../overlay/callout/callout.component";
|
|
5
|
+
/**
|
|
6
|
+
* A rich text input component that allows users to type text and mention other users by typing `@` followed by a name.
|
|
7
|
+
* Uses a `contenteditable` div instead of a traditional input/textarea.
|
|
8
|
+
*
|
|
9
|
+
* ## Data Model
|
|
10
|
+
* Works with a structured content model rather than plain strings:
|
|
11
|
+
* - **Input/Output**: `ContentItem[]` - an array of content pieces
|
|
12
|
+
* - **ContentItem types**:
|
|
13
|
+
* - `UserMention`: `{ type: 'mention', id: number, name: string }`
|
|
14
|
+
* - `Text`: `{ type: 'text', text: string }`
|
|
15
|
+
*
|
|
16
|
+
* ## Rendering Flow
|
|
17
|
+
* 1. **Content → DOM**: `renderContent()` converts the content input array to HTML. Mentions become `<span>` elements with `data-id` and `data-type` attributes. Text is escaped and rendered as plain text.
|
|
18
|
+
* 2. **DOM → Content**: `domToContentItems()` parses the DOM back into `ContentItem[]`, walking through child nodes extracting mentions and text. Emitted via `contentChange` event on input.
|
|
19
|
+
*
|
|
20
|
+
* ## User Interaction
|
|
21
|
+
* - **Typing `@` triggers mentions**: Monitors input for `@` character, extracts text after `@` (up to first space) as search text, positions a callout dropdown at the cursor location
|
|
22
|
+
* - **Keyboard navigation**: Arrow keys navigate filtered users list, Enter selects highlighted user, Escape closes mentions dropdown
|
|
23
|
+
* - **Selecting a mention**: Deletes the `@` and search text from DOM, creates a non-editable `<span>` element for the mention, inserts at cursor position, repositions cursor after the mention
|
|
24
|
+
*
|
|
25
|
+
* ## Technical Details
|
|
26
|
+
* - **Cursor management**: Uses Selection API and Range objects to track/manipulate cursor position
|
|
27
|
+
* - **Text extraction**: `getTextBeforeCursor()` gets plain text before cursor, treating mention spans as `@name`
|
|
28
|
+
* - **Character position mapping**: `findDomPositionAtCharIndex()` converts character indices to DOM node positions using TreeWalker
|
|
29
|
+
* - **Change detection**: Uses OnPush with manual `markForCheck()` calls
|
|
30
|
+
* - **Readonly mode**: Swaps between contenteditable and non-editable divs, styles mentions differently
|
|
31
|
+
*
|
|
32
|
+
* ## State
|
|
33
|
+
* - `mentionsVisible`: controls dropdown visibility
|
|
34
|
+
* - `mentionSearchText`: current filter text after @
|
|
35
|
+
* - `mentionAnchor`: DOMRect for positioning dropdown
|
|
36
|
+
* - `selectedUserIndex`: keyboard navigation state
|
|
37
|
+
* - `savedRange`: preserves cursor position for click-based selection
|
|
38
|
+
*/
|
|
39
|
+
export class MentionsInputComponent {
|
|
40
|
+
constructor(cdr) {
|
|
41
|
+
this.cdr = cdr;
|
|
42
|
+
this.content = [];
|
|
43
|
+
this.users = [];
|
|
44
|
+
this.readonly = false;
|
|
45
|
+
this.placeholder = 'Add a comment';
|
|
46
|
+
this.contentChange = new EventEmitter();
|
|
47
|
+
this.mentionsVisible = false;
|
|
48
|
+
this.mentionSearchText = '';
|
|
49
|
+
this.mentionAnchor = null;
|
|
50
|
+
this.selectedUserIndex = 0;
|
|
51
|
+
this.savedRange = null;
|
|
52
|
+
}
|
|
53
|
+
ngAfterViewInit() {
|
|
54
|
+
this.renderContent();
|
|
55
|
+
}
|
|
56
|
+
//DAHNE NOTE - ngOnChanges is called whenever any @Input() property changes, where the changed input contains information about those changes
|
|
57
|
+
//So if @Input() content changes and it's not the first change (the first render is handled by ngAfterViewInit()), we render the content
|
|
58
|
+
ngOnChanges(changes) {
|
|
59
|
+
if (changes['content'] && !changes['content'].firstChange) {
|
|
60
|
+
this.renderContent();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
renderContent() {
|
|
64
|
+
//This is necessary because the @ViewChild reference isn't available until after the view initializes
|
|
65
|
+
if (!this.inputElement?.nativeElement) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const html = this.content
|
|
69
|
+
.map(item => MentionsInputComponent.contentItemToHtml(item, this.readonly))
|
|
70
|
+
.join('');
|
|
71
|
+
this.inputElement.nativeElement.innerHTML = html;
|
|
72
|
+
}
|
|
73
|
+
static contentItemToHtml(item, readonly) {
|
|
74
|
+
switch (item.type) {
|
|
75
|
+
//DAHNE TODO - maybe we escape HTML here too? Although I don't think it will be possible for users to input an XSS attack in item.name
|
|
76
|
+
case 'mention':
|
|
77
|
+
return `<span class="${readonly ? 'readonly-mention' : 'mention'}" data-id="${item.id}" data-type="mention" contenteditable="false">@${MentionsInputComponent.escapeHtml(item.name)}</span>`;
|
|
78
|
+
case 'text':
|
|
79
|
+
return MentionsInputComponent.escapeHtml(item.text);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
static escapeHtml(text) {
|
|
83
|
+
const div = document.createElement('div');
|
|
84
|
+
div.textContent = text;
|
|
85
|
+
return div.innerHTML;
|
|
86
|
+
}
|
|
87
|
+
onInput() {
|
|
88
|
+
this.checkForMentionTrigger();
|
|
89
|
+
this.emitContentChange();
|
|
90
|
+
}
|
|
91
|
+
onKeyDown(event) {
|
|
92
|
+
if (!this.mentionsVisible) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const filteredUsers = this.getFilteredUsers();
|
|
96
|
+
switch (event.key) {
|
|
97
|
+
case 'ArrowDown':
|
|
98
|
+
event.preventDefault();
|
|
99
|
+
this.selectedUserIndex = Math.min(this.selectedUserIndex + 1, filteredUsers.length - 1);
|
|
100
|
+
this.cdr.markForCheck();
|
|
101
|
+
break;
|
|
102
|
+
case 'ArrowUp':
|
|
103
|
+
event.preventDefault();
|
|
104
|
+
this.selectedUserIndex = Math.max(this.selectedUserIndex - 1, 0);
|
|
105
|
+
this.cdr.markForCheck();
|
|
106
|
+
break;
|
|
107
|
+
case 'Enter':
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
if (filteredUsers[this.selectedUserIndex]) {
|
|
110
|
+
this.selectUser(filteredUsers[this.selectedUserIndex]);
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
case 'Tab':
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
if (filteredUsers[this.selectedUserIndex]) {
|
|
116
|
+
this.selectUser(filteredUsers[this.selectedUserIndex]);
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
case 'Escape':
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
this.closeMentions();
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
checkForMentionTrigger() {
|
|
126
|
+
const selection = window.getSelection();
|
|
127
|
+
if (!selection || !selection.rangeCount || !this.inputElement) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const range = selection.getRangeAt(0);
|
|
131
|
+
const textBeforeCursor = this.getTextBeforeCursor(range);
|
|
132
|
+
const lastAtIndex = textBeforeCursor.lastIndexOf('@');
|
|
133
|
+
if (lastAtIndex === -1) {
|
|
134
|
+
this.closeMentions();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
//If we allow for a single space, we need to check to make sure that this logic won't pick up previous
|
|
138
|
+
//'@' mentions and keep the mention dropdown open
|
|
139
|
+
const atPosition = this.findDomPositionAtCharIndex(lastAtIndex);
|
|
140
|
+
if (atPosition && this.isInsideMentionSpan(atPosition.node)) {
|
|
141
|
+
this.closeMentions();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const textAfterAt = textBeforeCursor.substring(lastAtIndex + 1);
|
|
145
|
+
const char1 = textAfterAt.charCodeAt(0);
|
|
146
|
+
const charN = textAfterAt.charCodeAt(textAfterAt.length - 1);
|
|
147
|
+
const charN_1 = textAfterAt.charCodeAt(textAfterAt.length - 2);
|
|
148
|
+
//These are the Unicode representations of normal space and non-breaking space
|
|
149
|
+
const unicodeSpaceChars = [32, 160];
|
|
150
|
+
// Close mentions if:
|
|
151
|
+
// - There's a double space (allows single spaces in the middle of search)
|
|
152
|
+
// - The text starts with a space (typing "@ " should not trigger mentions)
|
|
153
|
+
if (textAfterAt.includes(' ') ||
|
|
154
|
+
textAfterAt.startsWith(' ') ||
|
|
155
|
+
char1 == 160 ||
|
|
156
|
+
(unicodeSpaceChars.includes(charN) && unicodeSpaceChars.includes(charN_1))) {
|
|
157
|
+
this.closeMentions();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Trim trailing/leading spaces from search text while preserving spaces in the middle
|
|
161
|
+
this.mentionSearchText = textAfterAt.trim();
|
|
162
|
+
this.mentionsVisible = true;
|
|
163
|
+
this.selectedUserIndex = 0;
|
|
164
|
+
//Save the current range for later restoration (needed for click selection)
|
|
165
|
+
//DAHNE NOTE - this is annoyingly neceessary because clicks and enter keys have different effects on the
|
|
166
|
+
//focus of the contenteditable div
|
|
167
|
+
this.savedRange = range.cloneRange();
|
|
168
|
+
//This is how we calcluate the callout position
|
|
169
|
+
const cursorRect = range.getBoundingClientRect();
|
|
170
|
+
this.mentionAnchor = cursorRect;
|
|
171
|
+
this.cdr.markForCheck();
|
|
172
|
+
}
|
|
173
|
+
getTextBeforeCursor(range) {
|
|
174
|
+
const clonedRange = range.cloneRange();
|
|
175
|
+
//We select all of the input contents, and then move the end point to the current cursor position
|
|
176
|
+
clonedRange.selectNodeContents(this.inputElement.nativeElement);
|
|
177
|
+
clonedRange.setEnd(range.endContainer, range.endOffset);
|
|
178
|
+
//Create a temporary div so that we can extract text content from it
|
|
179
|
+
const fragment = clonedRange.cloneContents();
|
|
180
|
+
const div = document.createElement('div');
|
|
181
|
+
div.appendChild(fragment);
|
|
182
|
+
//Get text content, replacing mention spans with @name
|
|
183
|
+
return div.textContent || '';
|
|
184
|
+
}
|
|
185
|
+
getFilteredUsers() {
|
|
186
|
+
const users = !this.mentionSearchText
|
|
187
|
+
? this.users
|
|
188
|
+
: this.users.filter(user => user.name
|
|
189
|
+
.toLowerCase()
|
|
190
|
+
.includes(this.mentionSearchText.toLowerCase()));
|
|
191
|
+
return users.slice().sort((a, b) => a.name.localeCompare(b.name));
|
|
192
|
+
}
|
|
193
|
+
selectUser(user) {
|
|
194
|
+
if (!this.inputElement) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
//This gets DOM info from user (e.g. highlighted selections, and cursor position)
|
|
198
|
+
const selection = window.getSelection();
|
|
199
|
+
if (!selection) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// Restore the saved range if available (needed when selecting via click)
|
|
203
|
+
if (this.savedRange) {
|
|
204
|
+
selection.removeAllRanges();
|
|
205
|
+
selection.addRange(this.savedRange);
|
|
206
|
+
}
|
|
207
|
+
if (!selection.rangeCount) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Delete the "@" and search text
|
|
211
|
+
this.deleteAtMentionSearch();
|
|
212
|
+
//DAHNE NOTE - this would ideally be the same as contentItemToHTML, but we need an actual element reference here in order to append it to the DOM
|
|
213
|
+
const mentionSpan = document.createElement('span');
|
|
214
|
+
mentionSpan.className = this.readonly ? 'readonly-mention' : 'mention';
|
|
215
|
+
mentionSpan.setAttribute('data-id', String(user.id));
|
|
216
|
+
mentionSpan.setAttribute('data-type', 'mention');
|
|
217
|
+
mentionSpan.setAttribute('contenteditable', 'false');
|
|
218
|
+
mentionSpan.textContent = `@${user.name}`;
|
|
219
|
+
//Find current cursor position
|
|
220
|
+
const newRange = window.getSelection()?.getRangeAt(0);
|
|
221
|
+
if (newRange) {
|
|
222
|
+
newRange.insertNode(mentionSpan);
|
|
223
|
+
//Set the range start and end to the same location (rendering the cursor in the right position)
|
|
224
|
+
newRange.setStartAfter(mentionSpan);
|
|
225
|
+
newRange.setEndAfter(mentionSpan);
|
|
226
|
+
selection.removeAllRanges();
|
|
227
|
+
//Apply this range to the DOM
|
|
228
|
+
selection.addRange(newRange);
|
|
229
|
+
}
|
|
230
|
+
this.closeMentions();
|
|
231
|
+
this.emitContentChange();
|
|
232
|
+
}
|
|
233
|
+
deleteAtMentionSearch() {
|
|
234
|
+
const selection = window.getSelection();
|
|
235
|
+
if (!selection || !selection.rangeCount) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
//This represents the current position of the cursor
|
|
239
|
+
const cursorRange = selection.getRangeAt(0);
|
|
240
|
+
//This will return all of the raw text (HTML-stripped) before the cursor
|
|
241
|
+
const textBeforeCursor = this.getTextBeforeCursor(cursorRange);
|
|
242
|
+
//We do that^ so that we can find the correct index of the most recent '@'
|
|
243
|
+
const lastAtIndex = textBeforeCursor.lastIndexOf('@');
|
|
244
|
+
if (lastAtIndex === -1) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
//Knowing the position of the last '@' character we can now find the actual DOM node + offset where "@" lives
|
|
248
|
+
const atPosition = this.findDomPositionAtCharIndex(lastAtIndex);
|
|
249
|
+
if (!atPosition) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
// Create range from "@" to cursor and delete it
|
|
253
|
+
const deleteRange = document.createRange();
|
|
254
|
+
deleteRange.setStart(atPosition.node, atPosition.offset);
|
|
255
|
+
deleteRange.setEnd(cursorRange.endContainer, cursorRange.endOffset);
|
|
256
|
+
deleteRange.deleteContents();
|
|
257
|
+
}
|
|
258
|
+
isInsideMentionSpan(node) {
|
|
259
|
+
let currentNode = node;
|
|
260
|
+
while (currentNode && currentNode !== this.inputElement?.nativeElement) {
|
|
261
|
+
if (currentNode.nodeType === Node.ELEMENT_NODE &&
|
|
262
|
+
currentNode.getAttribute('data-type') === 'mention') {
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
currentNode = currentNode.parentNode;
|
|
266
|
+
}
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
//This will go text node by node looking for the
|
|
270
|
+
//@ mention and give its position in the context of that node
|
|
271
|
+
findDomPositionAtCharIndex(charIndex) {
|
|
272
|
+
if (!this.inputElement) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
// Walk through all text nodes in the input, counting characters
|
|
276
|
+
const treeWalker = document.createTreeWalker(this.inputElement.nativeElement, NodeFilter.SHOW_TEXT, null);
|
|
277
|
+
let charCount = 0;
|
|
278
|
+
while (treeWalker.nextNode()) {
|
|
279
|
+
const node = treeWalker.currentNode;
|
|
280
|
+
const text = node.textContent || '';
|
|
281
|
+
// Check if our target character is in this text node
|
|
282
|
+
if (charCount + text.length > charIndex) {
|
|
283
|
+
// The character at charIndex is in this node
|
|
284
|
+
const offsetInNode = charIndex - charCount;
|
|
285
|
+
return { node, offset: offsetInNode };
|
|
286
|
+
}
|
|
287
|
+
charCount += text.length;
|
|
288
|
+
}
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
closeMentions() {
|
|
292
|
+
this.mentionsVisible = false;
|
|
293
|
+
this.mentionSearchText = '';
|
|
294
|
+
this.mentionAnchor = null;
|
|
295
|
+
this.selectedUserIndex = 0;
|
|
296
|
+
this.savedRange = null;
|
|
297
|
+
this.cdr.markForCheck();
|
|
298
|
+
}
|
|
299
|
+
emitContentChange() {
|
|
300
|
+
if (!this.inputElement) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const contentItems = this.domToContentItems();
|
|
304
|
+
this.contentChange.emit(contentItems);
|
|
305
|
+
}
|
|
306
|
+
domToContentItems() {
|
|
307
|
+
if (!this.inputElement?.nativeElement) {
|
|
308
|
+
return [];
|
|
309
|
+
}
|
|
310
|
+
const items = [];
|
|
311
|
+
const childNodes = this.inputElement.nativeElement.childNodes;
|
|
312
|
+
for (const node of Array.from(childNodes)) {
|
|
313
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
314
|
+
const element = node;
|
|
315
|
+
if (element.tagName === 'SPAN' &&
|
|
316
|
+
element.getAttribute('data-type') === 'mention') {
|
|
317
|
+
const id = Number(element.getAttribute('data-id'));
|
|
318
|
+
const name = element.textContent?.replace('@', '') || '';
|
|
319
|
+
items.push({ type: 'mention', id, name });
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (node.nodeType === Node.TEXT_NODE) {
|
|
323
|
+
const text = node.textContent || '';
|
|
324
|
+
if (text) {
|
|
325
|
+
items.push({ type: 'text', text });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return items;
|
|
330
|
+
}
|
|
331
|
+
onCalloutClose() {
|
|
332
|
+
this.closeMentions();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
MentionsInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MentionsInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
336
|
+
MentionsInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MentionsInputComponent, selector: "riv-mentions-input", inputs: { content: "content", users: "users", readonly: "readonly", placeholder: "placeholder" }, outputs: { contentChange: "contentChange" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"mentions-container\" #container>\n <div\n *ngIf=\"!readonly\"\n #input\n class=\"text-content editable\"\n contenteditable=\"true\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n ></div>\n\n <div *ngIf=\"readonly\" #input class=\"text-content\"></div>\n\n <riv-callout\n *ngIf=\"!readonly && mentionsVisible && mentionAnchor\"\n [anchor]=\"mentionAnchor\"\n [isModal]=\"false\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n (close)=\"onCalloutClose()\"\n >\n <div class=\"mentions-content\">\n <div class=\"mentions-header\">Mention someone</div>\n <ul class=\"mentions-list\">\n <li\n *ngFor=\"let user of getFilteredUsers(); let i = index\"\n [class.selected]=\"i === selectedUserIndex\"\n >\n <button (click)=\"selectUser(user)\">{{ user.name }}</button>\n </li>\n </ul>\n </div>\n </riv-callout>\n</div>\n", styles: [".mentions-container{position:relative;width:100%}.mentions-input{width:100%;min-height:100px;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);overflow-y:auto;white-space:pre-wrap;word-wrap:break-word}.mentions-input:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled);pointer-events:none}.mentions-input:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.mentions-input[contenteditable=false]{color:var(--type-light-disabled);background-color:var(--surface-light-1);cursor:not-allowed}span.mention{color:var(--type-light-link);font-weight:var(--font-weight-heavy)}span.readonly-mention{font-weight:var(--font-weight-heavy)}.mentions-input.warning{border-color:var(--surface-dark-caution)}.mentions-input.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.mentions-input.large{font:var(--input-large);padding:var(--size-medium)}.mentions-list{list-style:none;margin:0;padding:0;max-height:calc(var(--base-grid-size) * 50);overflow-y:auto;display:flex;flex-direction:column;gap:var(--size-xxsmall)}.mentions-list li{padding:var(--size-small) var(--size-small);border-radius:var(--border-radius-medium);cursor:pointer;transition:background-color .2s;font:var(--input-medium)}.mentions-list li:hover,.mentions-list li.selected{background-color:var(--surface-light-2)}.mentions-content{max-height:50vh;min-width:calc(var(--base-grid-size) * 62);max-width:50vw;padding:var(--size-large);display:flex;flex-direction:column}.mentions-header{padding:var(--size-small) var(--size-small);font:var(--input-medium);color:var(--type-light-low-contrast)}.text-content{width:100%;min-height:9em;border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);resize:vertical}.editable{border:var(--border-width) solid var(--border-light)}.text-content::placeholder{color:var(--type-light-disabled)}.text-content.editable[data-placeholder]:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled)}.text-content:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.text-content:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.text-content.warning{border-color:var(--surface-dark-caution)}.text-content.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.text-content.large{font:var(--input-large);padding:var(--size-medium)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MentionsInputComponent, decorators: [{
|
|
338
|
+
type: Component,
|
|
339
|
+
args: [{ selector: 'riv-mentions-input', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mentions-container\" #container>\n <div\n *ngIf=\"!readonly\"\n #input\n class=\"text-content editable\"\n contenteditable=\"true\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n ></div>\n\n <div *ngIf=\"readonly\" #input class=\"text-content\"></div>\n\n <riv-callout\n *ngIf=\"!readonly && mentionsVisible && mentionAnchor\"\n [anchor]=\"mentionAnchor\"\n [isModal]=\"false\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n (close)=\"onCalloutClose()\"\n >\n <div class=\"mentions-content\">\n <div class=\"mentions-header\">Mention someone</div>\n <ul class=\"mentions-list\">\n <li\n *ngFor=\"let user of getFilteredUsers(); let i = index\"\n [class.selected]=\"i === selectedUserIndex\"\n >\n <button (click)=\"selectUser(user)\">{{ user.name }}</button>\n </li>\n </ul>\n </div>\n </riv-callout>\n</div>\n", styles: [".mentions-container{position:relative;width:100%}.mentions-input{width:100%;min-height:100px;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);overflow-y:auto;white-space:pre-wrap;word-wrap:break-word}.mentions-input:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled);pointer-events:none}.mentions-input:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.mentions-input[contenteditable=false]{color:var(--type-light-disabled);background-color:var(--surface-light-1);cursor:not-allowed}span.mention{color:var(--type-light-link);font-weight:var(--font-weight-heavy)}span.readonly-mention{font-weight:var(--font-weight-heavy)}.mentions-input.warning{border-color:var(--surface-dark-caution)}.mentions-input.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.mentions-input.large{font:var(--input-large);padding:var(--size-medium)}.mentions-list{list-style:none;margin:0;padding:0;max-height:calc(var(--base-grid-size) * 50);overflow-y:auto;display:flex;flex-direction:column;gap:var(--size-xxsmall)}.mentions-list li{padding:var(--size-small) var(--size-small);border-radius:var(--border-radius-medium);cursor:pointer;transition:background-color .2s;font:var(--input-medium)}.mentions-list li:hover,.mentions-list li.selected{background-color:var(--surface-light-2)}.mentions-content{max-height:50vh;min-width:calc(var(--base-grid-size) * 62);max-width:50vw;padding:var(--size-large);display:flex;flex-direction:column}.mentions-header{padding:var(--size-small) var(--size-small);font:var(--input-medium);color:var(--type-light-low-contrast)}.text-content{width:100%;min-height:9em;border-radius:var(--border-radius-small);font:var(--input-medium);color:var(--type-light-high-contrast);padding:var(--size-large);resize:vertical}.editable{border:var(--border-width) solid var(--border-light)}.text-content::placeholder{color:var(--type-light-disabled)}.text-content.editable[data-placeholder]:empty:before{content:attr(data-placeholder);color:var(--type-light-disabled)}.text-content:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.text-content:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.text-content.warning{border-color:var(--surface-dark-caution)}.text-content.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.text-content.large{font:var(--input-large);padding:var(--size-medium)}\n"] }]
|
|
340
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { content: [{
|
|
341
|
+
type: Input
|
|
342
|
+
}], users: [{
|
|
343
|
+
type: Input
|
|
344
|
+
}], readonly: [{
|
|
345
|
+
type: Input
|
|
346
|
+
}], placeholder: [{
|
|
347
|
+
type: Input
|
|
348
|
+
}], contentChange: [{
|
|
349
|
+
type: Output
|
|
350
|
+
}], inputElement: [{
|
|
351
|
+
type: ViewChild,
|
|
352
|
+
args: ['input', { static: false }]
|
|
353
|
+
}] } });
|
|
354
|
+
(function (MentionsInputComponent) {
|
|
355
|
+
MentionsInputComponent.ContentTypes = ['mention', 'text'];
|
|
356
|
+
function contentToPlainText(content) {
|
|
357
|
+
return content
|
|
358
|
+
.map(item => {
|
|
359
|
+
switch (item.type) {
|
|
360
|
+
case 'mention':
|
|
361
|
+
return `@${item.name}`;
|
|
362
|
+
case 'text':
|
|
363
|
+
return item.text;
|
|
364
|
+
}
|
|
365
|
+
})
|
|
366
|
+
.join('');
|
|
367
|
+
}
|
|
368
|
+
MentionsInputComponent.contentToPlainText = contentToPlainText;
|
|
369
|
+
})(MentionsInputComponent || (MentionsInputComponent = {}));
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbnMtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvbWVudGlvbnMtaW5wdXQvbWVudGlvbnMtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvbWVudGlvbnMtaW5wdXQvbWVudGlvbnMtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7OztBQUV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBUUgsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUUxQyxZQUFPLEdBQXlDLEVBQUUsQ0FBQztRQUNuRCxVQUFLLEdBQWtDLEVBQUUsQ0FBQztRQUMxQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGdCQUFXLEdBQVcsZUFBZSxDQUFDO1FBRTVCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBRWhELENBQUM7UUFLSixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDdkIsa0JBQWEsR0FBbUIsSUFBSSxDQUFDO1FBQ3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUNkLGVBQVUsR0FBaUIsSUFBSSxDQUFDO0lBbEJjLENBQUM7SUFvQnZELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELDZJQUE2STtJQUM3SSx3SUFBd0k7SUFDeEksV0FBVyxDQUFDLE9BQXNCO1FBQ2hD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QUtVLFlBQVk7c0JBRDVCLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7QUFzWHZDLFdBQWlCLHNCQUFzQjtJQUN4QixtQ0FBWSxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBVSxDQUFDO0lBY3pELFNBQWdCLGtCQUFrQixDQUFDLE9BQXNCO1FBQ3ZELE9BQU8sT0FBTzthQUNYLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNWLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxTQUFTO29CQUNaLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssTUFBTTtvQkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDcEI7UUFDSCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDO0lBWGUseUNBQWtCLHFCQVdqQyxDQUFBO0FBQ0gsQ0FBQyxFQTNCZ0Isc0JBQXNCLEtBQXRCLHNCQUFzQixRQTJCdEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEEgcmljaCB0ZXh0IGlucHV0IGNvbXBvbmVudCB0aGF0IGFsbG93cyB1c2VycyB0byB0eXBlIHRleHQgYW5kIG1lbnRpb24gb3RoZXIgdXNlcnMgYnkgdHlwaW5nIGBAYCBmb2xsb3dlZCBieSBhIG5hbWUuXG4gKiBVc2VzIGEgYGNvbnRlbnRlZGl0YWJsZWAgZGl2IGluc3RlYWQgb2YgYSB0cmFkaXRpb25hbCBpbnB1dC90ZXh0YXJlYS5cbiAqXG4gKiAjIyBEYXRhIE1vZGVsXG4gKiBXb3JrcyB3aXRoIGEgc3RydWN0dXJlZCBjb250ZW50IG1vZGVsIHJhdGhlciB0aGFuIHBsYWluIHN0cmluZ3M6XG4gKiAtICoqSW5wdXQvT3V0cHV0Kio6IGBDb250ZW50SXRlbVtdYCAtIGFuIGFycmF5IG9mIGNvbnRlbnQgcGllY2VzXG4gKiAtICoqQ29udGVudEl0ZW0gdHlwZXMqKjpcbiAqICAgLSBgVXNlck1lbnRpb25gOiBgeyB0eXBlOiAnbWVudGlvbicsIGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZyB9YFxuICogICAtIGBUZXh0YDogYHsgdHlwZTogJ3RleHQnLCB0ZXh0OiBzdHJpbmcgfWBcbiAqXG4gKiAjIyBSZW5kZXJpbmcgRmxvd1xuICogMS4gKipDb250ZW50IOKGkiBET00qKjogYHJlbmRlckNvbnRlbnQoKWAgY29udmVydHMgdGhlIGNvbnRlbnQgaW5wdXQgYXJyYXkgdG8gSFRNTC4gTWVudGlvbnMgYmVjb21lIGA8c3Bhbj5gIGVsZW1lbnRzIHdpdGggYGRhdGEtaWRgIGFuZCBgZGF0YS10eXBlYCBhdHRyaWJ1dGVzLiBUZXh0IGlzIGVzY2FwZWQgYW5kIHJlbmRlcmVkIGFzIHBsYWluIHRleHQuXG4gKiAyLiAqKkRPTSDihpIgQ29udGVudCoqOiBgZG9tVG9Db250ZW50SXRlbXMoKWAgcGFyc2VzIHRoZSBET00gYmFjayBpbnRvIGBDb250ZW50SXRlbVtdYCwgd2Fsa2luZyB0aHJvdWdoIGNoaWxkIG5vZGVzIGV4dHJhY3RpbmcgbWVudGlvbnMgYW5kIHRleHQuIEVtaXR0ZWQgdmlhIGBjb250ZW50Q2hhbmdlYCBldmVudCBvbiBpbnB1dC5cbiAqXG4gKiAjIyBVc2VyIEludGVyYWN0aW9uXG4gKiAtICoqVHlwaW5nIGBAYCB0cmlnZ2VycyBtZW50aW9ucyoqOiBNb25pdG9ycyBpbnB1dCBmb3IgYEBgIGNoYXJhY3RlciwgZXh0cmFjdHMgdGV4dCBhZnRlciBgQGAgKHVwIHRvIGZpcnN0IHNwYWNlKSBhcyBzZWFyY2ggdGV4dCwgcG9zaXRpb25zIGEgY2FsbG91dCBkcm9wZG93biBhdCB0aGUgY3Vyc29yIGxvY2F0aW9uXG4gKiAtICoqS2V5Ym9hcmQgbmF2aWdhdGlvbioqOiBBcnJvdyBrZXlzIG5hdmlnYXRlIGZpbHRlcmVkIHVzZXJzIGxpc3QsIEVudGVyIHNlbGVjdHMgaGlnaGxpZ2h0ZWQgdXNlciwgRXNjYXBlIGNsb3NlcyBtZW50aW9ucyBkcm9wZG93blxuICogLSAqKlNlbGVjdGluZyBhIG1lbnRpb24qKjogRGVsZXRlcyB0aGUgYEBgIGFuZCBzZWFyY2ggdGV4dCBmcm9tIERPTSwgY3JlYXRlcyBhIG5vbi1lZGl0YWJsZSBgPHNwYW4+YCBlbGVtZW50IGZvciB0aGUgbWVudGlvbiwgaW5zZXJ0cyBhdCBjdXJzb3IgcG9zaXRpb24sIHJlcG9zaXRpb25zIGN1cnNvciBhZnRlciB0aGUgbWVudGlvblxuICpcbiAqICMjIFRlY2huaWNhbCBEZXRhaWxzXG4gKiAtICoqQ3Vyc29yIG1hbmFnZW1lbnQqKjogVXNlcyBTZWxlY3Rpb24gQVBJIGFuZCBSYW5nZSBvYmplY3RzIHRvIHRyYWNrL21hbmlwdWxhdGUgY3Vyc29yIHBvc2l0aW9uXG4gKiAtICoqVGV4dCBleHRyYWN0aW9uKio6IGBnZXRUZXh0QmVmb3JlQ3Vyc29yKClgIGdldHMgcGxhaW4gdGV4dCBiZWZvcmUgY3Vyc29yLCB0cmVhdGluZyBtZW50aW9uIHNwYW5zIGFzIGBAbmFtZWBcbiAqIC0gKipDaGFyYWN0ZXIgcG9zaXRpb24gbWFwcGluZyoqOiBgZmluZERvbVBvc2l0aW9uQXRDaGFySW5kZXgoKWAgY29udmVydHMgY2hhcmFjdGVyIGluZGljZXMgdG8gRE9NIG5vZGUgcG9zaXRpb25zIHVzaW5nIFRyZWVXYWxrZXJcbiAqIC0gKipDaGFuZ2UgZGV0ZWN0aW9uKio6IFVzZXMgT25QdXNoIHdpdGggbWFudWFsIGBtYXJrRm9yQ2hlY2soKWAgY2FsbHNcbiAqIC0gKipSZWFkb25seSBtb2RlKio6IFN3YXBzIGJldHdlZW4gY29udGVudGVkaXRhYmxlIGFuZCBub24tZWRpdGFibGUgZGl2cywgc3R5bGVzIG1lbnRpb25zIGRpZmZlcmVudGx5XG4gKlxuICogIyMgU3RhdGVcbiAqIC0gYG1lbnRpb25zVmlzaWJsZWA6IGNvbnRyb2xzIGRyb3Bkb3duIHZpc2liaWxpdHlcbiAqIC0gYG1lbnRpb25TZWFyY2hUZXh0YDogY3VycmVudCBmaWx0ZXIgdGV4dCBhZnRlciBAXG4gKiAtIGBtZW50aW9uQW5jaG9yYDogRE9NUmVjdCBmb3IgcG9zaXRpb25pbmcgZHJvcGRvd25cbiAqIC0gYHNlbGVjdGVkVXNlckluZGV4YDoga2V5Ym9hcmQgbmF2aWdhdGlvbiBzdGF0ZVxuICogLSBgc2F2ZWRSYW5nZWA6IHByZXNlcnZlcyBjdXJzb3IgcG9zaXRpb24gZm9yIGNsaWNrLWJhc2VkIHNlbGVjdGlvblxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtbWVudGlvbnMtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogYC4vbWVudGlvbnMtaW5wdXQuY29tcG9uZW50Lmh0bWxgLFxuICBzdHlsZVVybHM6IFsnLi9tZW50aW9ucy1pbnB1dC5jb21wb25lbnQuY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZW50aW9uc0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuQ29udGVudEl0ZW1bXSA9IFtdO1xuICBASW5wdXQoKSB1c2VyczogTWVudGlvbnNJbnB1dENvbXBvbmVudC5Vc2VyW10gPSBbXTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdBZGQgYSBjb21tZW50JztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29udGVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgTWVudGlvbnNJbnB1dENvbXBvbmVudC5Db250ZW50SXRlbVtdXG4gID4oKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0RWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIG1lbnRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICBtZW50aW9uU2VhcmNoVGV4dCA9ICcnO1xuICBtZW50aW9uQW5jaG9yOiBET01SZWN0IHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkVXNlckluZGV4ID0gMDtcbiAgcHJpdmF0ZSBzYXZlZFJhbmdlOiBSYW5nZSB8IG51bGwgPSBudWxsO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgfVxuXG4gIC8vREFITkUgTk9URSAtIG5nT25DaGFuZ2VzIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgQElucHV0KCkgcHJvcGVydHkgY2hhbmdlcywgd2hlcmUgdGhlIGNoYW5nZWQgaW5wdXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhvc2UgY2hhbmdlc1xuICAvL1NvIGlmIEBJbnB1dCgpIGNvbnRlbnQgY2hhbmdlcyBhbmQgaXQncyBub3QgdGhlIGZpcnN0IGNoYW5nZSAodGhlIGZpcnN0IHJlbmRlciBpcyBoYW5kbGVkIGJ5IG5nQWZ0ZXJWaWV3SW5pdCgpKSwgd2UgcmVuZGVyIHRoZSBjb250ZW50XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29udGVudCddICYmICFjaGFuZ2VzWydjb250ZW50J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpOiB2b2lkIHtcbiAgICAvL1RoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIEBWaWV3Q2hpbGQgcmVmZXJlbmNlIGlzbid0IGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgdmlldyBpbml0aWFsaXplc1xuICAgIGlmICghdGhpcy5pbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBodG1sID0gdGhpcy5jb250ZW50XG4gICAgICAubWFwKGl0ZW0gPT5cbiAgICAgICAgTWVudGlvbnNJbnB1dENvbXBvbmVudC5jb250ZW50SXRlbVRvSHRtbChpdGVtLCB0aGlzLnJlYWRvbmx5KSxcbiAgICAgIClcbiAgICAgIC5qb2luKCcnKTtcbiAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb250ZW50SXRlbVRvSHRtbChcbiAgICBpdGVtOiBNZW50aW9uc0lucHV0Q29tcG9uZW50LkNvbnRlbnRJdGVtLFxuICAgIHJlYWRvbmx5OiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAvL0RBSE5FIFRPRE8gLSBtYXliZSB3ZSBlc2NhcGUgSFRNTCBoZXJlIHRvbz8gQWx0aG91Z2ggSSBkb24ndCB0aGluayBpdCB3aWxsIGJlIHBvc3NpYmxlIGZvciB1c2VycyB0byBpbnB1dCBhbiBYU1MgYXR0YWNrIGluIGl0ZW0ubmFtZVxuICAgICAgY2FzZSAnbWVudGlvbic6XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCIke1xuICAgICAgICAgIHJlYWRvbmx5ID8gJ3JlYWRvbmx5LW1lbnRpb24nIDogJ21lbnRpb24nXG4gICAgICAgIH1cIiBkYXRhLWlkPVwiJHtcbiAgICAgICAgICBpdGVtLmlkXG4gICAgICAgIH1cIiBkYXRhLXR5cGU9XCJtZW50aW9uXCIgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIj5AJHtNZW50aW9uc0lucHV0Q29tcG9uZW50LmVzY2FwZUh0bWwoXG4gICAgICAgICAgaXRlbS5uYW1lLFxuICAgICAgICApfTwvc3Bhbj5gO1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIHJldHVybiBNZW50aW9uc0lucHV0Q29tcG9uZW50LmVzY2FwZUh0bWwoaXRlbS50ZXh0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja0Zvck1lbnRpb25UcmlnZ2VyKCk7XG4gICAgdGhpcy5lbWl0Q29udGVudENoYW5nZSgpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnRpb25zVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkVXNlcnMgPSB0aGlzLmdldEZpbHRlcmVkVXNlcnMoKTtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlckluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmRleCArIDEsXG4gICAgICAgICAgZmlsdGVyZWRVc2Vycy5sZW5ndGggLSAxLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJJbmRleCA9IE1hdGgubWF4KHRoaXMuc2VsZWN0ZWRVc2VySW5kZXggLSAxLCAwKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZmlsdGVyZWRVc2Vyc1t0aGlzLnNlbGVjdGVkVXNlckluZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0VXNlcihmaWx0ZXJlZFVzZXJzW3RoaXMuc2VsZWN0ZWRVc2VySW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChmaWx0ZXJlZFVzZXJzW3RoaXMuc2VsZWN0ZWRVc2VySW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RVc2VyKGZpbHRlcmVkVXNlcnNbdGhpcy5zZWxlY3RlZFVzZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZU1lbnRpb25zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JNZW50aW9uVHJpZ2dlcigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50IHx8ICF0aGlzLmlucHV0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IHRoaXMuZ2V0VGV4dEJlZm9yZUN1cnNvcihyYW5nZSk7XG5cbiAgICBjb25zdCBsYXN0QXRJbmRleCA9IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoJ0AnKTtcblxuICAgIGlmIChsYXN0QXRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vSWYgd2UgYWxsb3cgZm9yIGEgc2luZ2xlIHNwYWNlLCB3ZSBuZWVkIHRvIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgbG9naWMgd29uJ3QgcGljayB1cCBwcmV2aW91c1xuICAgIC8vJ0AnIG1lbnRpb25zIGFuZCBrZWVwIHRoZSBtZW50aW9uIGRyb3Bkb3duIG9wZW5cbiAgICBjb25zdCBhdFBvc2l0aW9uID0gdGhpcy5maW5kRG9tUG9zaXRpb25BdENoYXJJbmRleChsYXN0QXRJbmRleCk7XG4gICAgaWYgKGF0UG9zaXRpb24gJiYgdGhpcy5pc0luc2lkZU1lbnRpb25TcGFuKGF0UG9zaXRpb24ubm9kZSkpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRBZnRlckF0ID0gdGV4dEJlZm9yZUN1cnNvci5zdWJzdHJpbmcobGFzdEF0SW5kZXggKyAxKTtcbiAgICBjb25zdCBjaGFyMSA9IHRleHRBZnRlckF0LmNoYXJDb2RlQXQoMCk7XG4gICAgY29uc3QgY2hhck4gPSB0ZXh0QWZ0ZXJBdC5jaGFyQ29kZUF0KHRleHRBZnRlckF0Lmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGNoYXJOXzEgPSB0ZXh0QWZ0ZXJBdC5jaGFyQ29kZUF0KHRleHRBZnRlckF0Lmxlbmd0aCAtIDIpO1xuICAgIC8vVGhlc2UgYXJlIHRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9ucyBvZiBub3JtYWwgc3BhY2UgYW5kIG5vbi1icmVha2luZyBzcGFjZVxuICAgIGNvbnN0IHVuaWNvZGVTcGFjZUNoYXJzID0gWzMyLCAxNjBdO1xuXG4gICAgLy8gQ2xvc2UgbWVudGlvbnMgaWY6XG4gICAgLy8gLSBUaGVyZSdzIGEgZG91YmxlIHNwYWNlIChhbGxvd3Mgc2luZ2xlIHNwYWNlcyBpbiB0aGUgbWlkZGxlIG9mIHNlYXJjaClcbiAgICAvLyAtIFRoZSB0ZXh0IHN0YXJ0cyB3aXRoIGEgc3BhY2UgKHR5cGluZyBcIkAgXCIgc2hvdWxkIG5vdCB0cmlnZ2VyIG1lbnRpb25zKVxuICAgIGlmIChcbiAgICAgIHRleHRBZnRlckF0LmluY2x1ZGVzKCcgICcpIHx8XG4gICAgICB0ZXh0QWZ0ZXJBdC5zdGFydHNXaXRoKCcgJykgfHxcbiAgICAgIGNoYXIxID09IDE2MCB8fFxuICAgICAgKHVuaWNvZGVTcGFjZUNoYXJzLmluY2x1ZGVzKGNoYXJOKSAmJiB1bmljb2RlU3BhY2VDaGFycy5pbmNsdWRlcyhjaGFyTl8xKSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyaW0gdHJhaWxpbmcvbGVhZGluZyBzcGFjZXMgZnJvbSBzZWFyY2ggdGV4dCB3aGlsZSBwcmVzZXJ2aW5nIHNwYWNlcyBpbiB0aGUgbWlkZGxlXG4gICAgdGhpcy5tZW50aW9uU2VhcmNoVGV4dCA9IHRleHRBZnRlckF0LnRyaW0oKTtcbiAgICB0aGlzLm1lbnRpb25zVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZFVzZXJJbmRleCA9IDA7XG5cbiAgICAvL1NhdmUgdGhlIGN1cnJlbnQgcmFuZ2UgZm9yIGxhdGVyIHJlc3RvcmF0aW9uIChuZWVkZWQgZm9yIGNsaWNrIHNlbGVjdGlvbilcbiAgICAvL0RBSE5FIE5PVEUgLSB0aGlzIGlzIGFubm95aW5nbHkgbmVjZWVzc2FyeSBiZWNhdXNlIGNsaWNrcyBhbmQgZW50ZXIga2V5cyBoYXZlIGRpZmZlcmVudCBlZmZlY3RzIG9uIHRoZVxuICAgIC8vZm9jdXMgb2YgdGhlIGNvbnRlbnRlZGl0YWJsZSBkaXZcbiAgICB0aGlzLnNhdmVkUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG5cbiAgICAvL1RoaXMgaXMgaG93IHdlIGNhbGNsdWF0ZSB0aGUgY2FsbG91dCBwb3NpdGlvblxuICAgIGNvbnN0IGN1cnNvclJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLm1lbnRpb25BbmNob3IgPSBjdXJzb3JSZWN0O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUZXh0QmVmb3JlQ3Vyc29yKHJhbmdlOiBSYW5nZSk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xvbmVkUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgLy9XZSBzZWxlY3QgYWxsIG9mIHRoZSBpbnB1dCBjb250ZW50cywgYW5kIHRoZW4gbW92ZSB0aGUgZW5kIHBvaW50IHRvIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxuICAgIGNsb25lZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh0aGlzLmlucHV0RWxlbWVudCEubmF0aXZlRWxlbWVudCk7XG4gICAgY2xvbmVkUmFuZ2Uuc2V0RW5kKHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcblxuICAgIC8vQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpdiBzbyB0aGF0IHdlIGNhbiBleHRyYWN0IHRleHQgY29udGVudCBmcm9tIGl0XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjbG9uZWRSYW5nZS5jbG9uZUNvbnRlbnRzKCk7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcblxuICAgIC8vR2V0IHRleHQgY29udGVudCwgcmVwbGFjaW5nIG1lbnRpb24gc3BhbnMgd2l0aCBAbmFtZVxuICAgIHJldHVybiBkaXYudGV4dENvbnRlbnQgfHwgJyc7XG4gIH1cblxuICBnZXRGaWx0ZXJlZFVzZXJzKCk6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuVXNlcltdIHtcbiAgICBjb25zdCB1c2VycyA9ICF0aGlzLm1lbnRpb25TZWFyY2hUZXh0XG4gICAgICA/IHRoaXMudXNlcnNcbiAgICAgIDogdGhpcy51c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgICAgIHVzZXIubmFtZVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLm1lbnRpb25TZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIH1cblxuICBzZWxlY3RVc2VyKHVzZXI6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuVXNlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnB1dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL1RoaXMgZ2V0cyBET00gaW5mbyBmcm9tIHVzZXIgKGUuZy4gaGlnaGxpZ2h0ZWQgc2VsZWN0aW9ucywgYW5kIGN1cnNvciBwb3NpdGlvbilcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHRoZSBzYXZlZCByYW5nZSBpZiBhdmFpbGFibGUgKG5lZWRlZCB3aGVuIHNlbGVjdGluZyB2aWEgY2xpY2spXG4gICAgaWYgKHRoaXMuc2F2ZWRSYW5nZSkge1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHRoaXMuc2F2ZWRSYW5nZSk7XG4gICAgfVxuXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSB0aGUgXCJAXCIgYW5kIHNlYXJjaCB0ZXh0XG4gICAgdGhpcy5kZWxldGVBdE1lbnRpb25TZWFyY2goKTtcblxuICAgIC8vREFITkUgTk9URSAtIHRoaXMgd291bGQgaWRlYWxseSBiZSB0aGUgc2FtZSBhcyBjb250ZW50SXRlbVRvSFRNTCwgYnV0IHdlIG5lZWQgYW4gYWN0dWFsIGVsZW1lbnQgcmVmZXJlbmNlIGhlcmUgaW4gb3JkZXIgdG8gYXBwZW5kIGl0IHRvIHRoZSBET01cbiAgICBjb25zdCBtZW50aW9uU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBtZW50aW9uU3Bhbi5jbGFzc05hbWUgPSB0aGlzLnJlYWRvbmx5ID8gJ3JlYWRvbmx5LW1lbnRpb24nIDogJ21lbnRpb24nO1xuICAgIG1lbnRpb25TcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsIFN0cmluZyh1c2VyLmlkKSk7XG4gICAgbWVudGlvblNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnLCAnbWVudGlvbicpO1xuICAgIG1lbnRpb25TcGFuLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJyk7XG4gICAgbWVudGlvblNwYW4udGV4dENvbnRlbnQgPSBgQCR7dXNlci5uYW1lfWA7XG5cbiAgICAvL0ZpbmQgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cbiAgICBjb25zdCBuZXdSYW5nZSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKTtcbiAgICBpZiAobmV3UmFuZ2UpIHtcbiAgICAgIG5ld1JhbmdlLmluc2VydE5vZGUobWVudGlvblNwYW4pO1xuICAgICAgLy9TZXQgdGhlIHJhbmdlIHN0YXJ0IGFuZCBlbmQgdG8gdGhlIHNhbWUgbG9jYXRpb24gKHJlbmRlcmluZyB0aGUgY3Vyc29yIGluIHRoZSByaWdodCBwb3NpdGlvbilcbiAgICAgIG5ld1JhbmdlLnNldFN0YXJ0QWZ0ZXIobWVudGlvblNwYW4pO1xuICAgICAgbmV3UmFuZ2Uuc2V0RW5kQWZ0ZXIobWVudGlvblNwYW4pO1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgLy9BcHBseSB0aGlzIHJhbmdlIHRvIHRoZSBET01cbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZU1lbnRpb25zKCk7XG4gICAgdGhpcy5lbWl0Q29udGVudENoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVBdE1lbnRpb25TZWFyY2goKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vVGhpcyByZXByZXNlbnRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBjdXJzb3JcbiAgICBjb25zdCBjdXJzb3JSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuXG4gICAgLy9UaGlzIHdpbGwgcmV0dXJuIGFsbCBvZiB0aGUgcmF3IHRleHQgKEhUTUwtc3RyaXBwZWQpIGJlZm9yZSB0aGUgY3Vyc29yXG4gICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IHRoaXMuZ2V0VGV4dEJlZm9yZUN1cnNvcihjdXJzb3JSYW5nZSk7XG4gICAgLy9XZSBkbyB0aGF0XiBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZSBjb3JyZWN0IGluZGV4IG9mIHRoZSBtb3N0IHJlY2VudCAnQCdcbiAgICBjb25zdCBsYXN0QXRJbmRleCA9IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoJ0AnKTtcblxuICAgIGlmIChsYXN0QXRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL0tub3dpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0ICdAJyBjaGFyYWN0ZXIgd2UgY2FuIG5vdyBmaW5kIHRoZSBhY3R1YWwgRE9NIG5vZGUgKyBvZmZzZXQgd2hlcmUgXCJAXCIgbGl2ZXNcbiAgICBjb25zdCBhdFBvc2l0aW9uID0gdGhpcy5maW5kRG9tUG9zaXRpb25BdENoYXJJbmRleChsYXN0QXRJbmRleCk7XG5cbiAgICBpZiAoIWF0UG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcmFuZ2UgZnJvbSBcIkBcIiB0byBjdXJzb3IgYW5kIGRlbGV0ZSBpdFxuICAgIGNvbnN0IGRlbGV0ZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBkZWxldGVSYW5nZS5zZXRTdGFydChhdFBvc2l0aW9uLm5vZGUsIGF0UG9zaXRpb24ub2Zmc2V0KTtcbiAgICBkZWxldGVSYW5nZS5zZXRFbmQoY3Vyc29yUmFuZ2UuZW5kQ29udGFpbmVyLCBjdXJzb3JSYW5nZS5lbmRPZmZzZXQpO1xuICAgIGRlbGV0ZVJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlTWVudGlvblNwYW4obm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSBub2RlO1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZSAhPT0gdGhpcy5pbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmXG4gICAgICAgIChjdXJyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA9PT0gJ21lbnRpb24nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vVGhpcyB3aWxsIGdvIHRleHQgbm9kZSBieSBub2RlIGxvb2tpbmcgZm9yIHRoZVxuICAvL0AgbWVudGlvbiBhbmQgZ2l2ZSBpdHMgcG9zaXRpb24gaW4gdGhlIGNvbnRleHQgb2YgdGhhdCBub2RlXG4gIHByaXZhdGUgZmluZERvbVBvc2l0aW9uQXRDaGFySW5kZXgoXG4gICAgY2hhckluZGV4OiBudW1iZXIsXG4gICk6IHsgbm9kZTogTm9kZTsgb2Zmc2V0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5pbnB1dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhyb3VnaCBhbGwgdGV4dCBub2RlcyBpbiB0aGUgaW5wdXQsIGNvdW50aW5nIGNoYXJhY3RlcnNcbiAgICBjb25zdCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcbiAgICAgIG51bGwsXG4gICAgKTtcblxuICAgIGxldCBjaGFyQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKHRyZWVXYWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRyZWVXYWxrZXIuY3VycmVudE5vZGU7XG4gICAgICBjb25zdCB0ZXh0ID0gbm9kZS50ZXh0Q29udGVudCB8fCAnJztcblxuICAgICAgLy8gQ2hlY2sgaWYgb3VyIHRhcmdldCBjaGFyYWN0ZXIgaXMgaW4gdGhpcyB0ZXh0IG5vZGVcbiAgICAgIGlmIChjaGFyQ291bnQgKyB0ZXh0Lmxlbmd0aCA+IGNoYXJJbmRleCkge1xuICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGF0IGNoYXJJbmRleCBpcyBpbiB0aGlzIG5vZGVcbiAgICAgICAgY29uc3Qgb2Zmc2V0SW5Ob2RlID0gY2hhckluZGV4IC0gY2hhckNvdW50O1xuICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IG9mZnNldEluTm9kZSB9O1xuICAgICAgfVxuXG4gICAgICBjaGFyQ291bnQgKz0gdGV4dC5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlTWVudGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZW50aW9uc1Zpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLm1lbnRpb25TZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5tZW50aW9uQW5jaG9yID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkVXNlckluZGV4ID0gMDtcbiAgICB0aGlzLnNhdmVkUmFuZ2UgPSBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29udGVudENoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5kb21Ub0NvbnRlbnRJdGVtcygpO1xuICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KGNvbnRlbnRJdGVtcyk7XG4gIH1cblxuICBwcml2YXRlIGRvbVRvQ29udGVudEl0ZW1zKCk6IE1lbnRpb25zSW5wdXRDb21wb25lbnQuQ29udGVudEl0ZW1bXSB7XG4gICAgaWYgKCF0aGlzLmlucHV0RWxlbWVudD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zOiBNZW50aW9uc0lucHV0Q29tcG9uZW50LkNvbnRlbnRJdGVtW10gPSBbXTtcbiAgICBjb25zdCBjaGlsZE5vZGVzID0gdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIEFycmF5LmZyb20oY2hpbGROb2RlcykpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NQQU4nICYmXG4gICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpID09PSAnbWVudGlvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSBOdW1iZXIoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSk7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW1lbnQudGV4dENvbnRlbnQ/LnJlcGxhY2UoJ0AnLCAnJykgfHwgJyc7XG4gICAgICAgICAgaXRlbXMucHVzaCh7IHR5cGU6ICdtZW50aW9uJywgaWQsIG5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IG5vZGUudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgaXRlbXMucHVzaCh7IHR5cGU6ICd0ZXh0JywgdGV4dCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIG9uQ2FsbG91dENsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VNZW50aW9ucygpO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTWVudGlvbnNJbnB1dENvbXBvbmVudCB7XG4gIGV4cG9ydCBjb25zdCBDb250ZW50VHlwZXMgPSBbJ21lbnRpb24nLCAndGV4dCddIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBDb250ZW50VHlwZSA9XG4gICAgKHR5cGVvZiBNZW50aW9uc0lucHV0Q29tcG9uZW50LkNvbnRlbnRUeXBlcylbbnVtYmVyXTtcbiAgZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgfVxuICBleHBvcnQgdHlwZSBDb250ZW50PFQgZXh0ZW5kcyBDb250ZW50VHlwZT4gPSB7IHR5cGU6IFQgfTtcblxuICBleHBvcnQgdHlwZSBVc2VyTWVudGlvbiA9IENvbnRlbnQ8J21lbnRpb24nPiAmIFVzZXI7XG4gIGV4cG9ydCB0eXBlIFRleHQgPSBDb250ZW50PCd0ZXh0Jz4gJiB7IHRleHQ6IHN0cmluZyB9O1xuXG4gIGV4cG9ydCB0eXBlIENvbnRlbnRJdGVtID0gVXNlck1lbnRpb24gfCBUZXh0O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjb250ZW50VG9QbGFpblRleHQoY29udGVudDogQ29udGVudEl0ZW1bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnbWVudGlvbic6XG4gICAgICAgICAgICByZXR1cm4gYEAke2l0ZW0ubmFtZX1gO1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udGV4dDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1lbnRpb25zLWNvbnRhaW5lclwiICNjb250YWluZXI+XG4gIDxkaXZcbiAgICAqbmdJZj1cIiFyZWFkb25seVwiXG4gICAgI2lucHV0XG4gICAgY2xhc3M9XCJ0ZXh0LWNvbnRlbnQgZWRpdGFibGVcIlxuICAgIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIlxuICAgIFthdHRyLmRhdGEtcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIChpbnB1dCk9XCJvbklucHV0KClcIlxuICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgPjwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJyZWFkb25seVwiICNpbnB1dCBjbGFzcz1cInRleHQtY29udGVudFwiPjwvZGl2PlxuXG4gIDxyaXYtY2FsbG91dFxuICAgICpuZ0lmPVwiIXJlYWRvbmx5ICYmIG1lbnRpb25zVmlzaWJsZSAmJiBtZW50aW9uQW5jaG9yXCJcbiAgICBbYW5jaG9yXT1cIm1lbnRpb25BbmNob3JcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbc2hvd0NhcmV0XT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1yaWdodCdcIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAoY2xvc2UpPVwib25DYWxsb3V0Q2xvc2UoKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibWVudGlvbnMtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1lbnRpb25zLWhlYWRlclwiPk1lbnRpb24gc29tZW9uZTwvZGl2PlxuICAgICAgPHVsIGNsYXNzPVwibWVudGlvbnMtbGlzdFwiPlxuICAgICAgICA8bGlcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdXNlciBvZiBnZXRGaWx0ZXJlZFVzZXJzKCk7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpID09PSBzZWxlY3RlZFVzZXJJbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzZWxlY3RVc2VyKHVzZXIpXCI+e3sgdXNlci5uYW1lIH19PC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9kaXY+XG4iXX0=
|
|
@@ -13,9 +13,10 @@ export class ToastComponent {
|
|
|
13
13
|
ngOnInit() {
|
|
14
14
|
setTimeout(() => {
|
|
15
15
|
this.close.emit();
|
|
16
|
-
},
|
|
16
|
+
}, ToastComponent.DURATION);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
+
ToastComponent.DURATION = 5000;
|
|
19
20
|
ToastComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
20
21
|
ToastComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ToastComponent, selector: "riv-toast", inputs: { variant: "variant", icon: "icon" }, outputs: { close: "close" }, ngImport: i0, template: "<div *riv-overlay class=\"wrapper\" [attr.data-animation-hook]=\"hook\">\n <div class=\"toast\" [ngClass]=\"variant\">\n <riv-icon *ngIf=\"icon\" [name]=\"icon\" [size]=\"16\"></riv-icon>\n <div class=\"content\"><ng-content></ng-content></div>\n </div>\n</div>\n", styles: [".wrapper{position:fixed;top:calc(var(--base-grid-size) * 20);left:50%}.toast{transform:translate(-50%);display:inline-flex;align-items:center;justify-content:center;gap:var(--size-small);padding:var(--size-xsmall) var(--size-large);border-radius:calc(var(--base-grid-size) * 8);box-shadow:var(--depth-1);font:var(--body-medium)}.toast.basic{background-color:var(--surface-dark-0);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--surface-dark-0)}.toast.danger{background-color:var(--danger-main);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--danger-main)}.toast.safety{background-color:var(--safety-main);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--safety-main)}.toast.safety-dark{background-color:var(--baja-blast-90);color:var(--type-dark-high-contrast);border:var(--border-width) solid var(--baja-blast-90)}.toast.safety-inverse{background-color:var(--surface-light-safety);color:var(--type-light-safety);border:var(--border-width) solid currentColor}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "directive", type: i3.OverlayDirective, selector: "[riv-overlay]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
21
22
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ToastComponent, decorators: [{
|
|
@@ -37,4 +38,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
37
38
|
'safety-inverse',
|
|
38
39
|
];
|
|
39
40
|
})(ToastComponent || (ToastComponent = {}));
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvb3ZlcmxheS90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9vdmVybGF5L3RvYXN0L3RvYXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7OztBQVFsRSxNQUFNLE9BQU8sY0FBYztJQU4zQjtRQVVFLFlBQU8sR0FBMkIsT0FBTyxDQUFDO1FBWTFDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXhCLFNBQUksR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0tBQ2hEO0lBVkMsUUFBUTtRQUNOLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7QUFaTSx1QkFBUSxHQUFHLElBQUksQ0FBQzsyR0FEWixjQUFjOytGQUFkLGNBQWMsNEhDakIzQixpUkFNQTsyRkRXYSxjQUFjO2tCQU4xQixTQUFTOytCQUNFLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTTs4QkFNL0MsT0FBTztzQkFETixLQUFLO2dCQUlOLElBQUk7c0JBREgsS0FBSztnQkFVTixLQUFLO3NCQURKLE1BQU07O0FBTVQsV0FBaUIsY0FBYztJQUNoQix1QkFBUSxHQUFHO1FBQ3RCLE9BQU87UUFDUCxRQUFRO1FBQ1IsUUFBUTtRQUNSLGFBQWE7UUFDYixnQkFBZ0I7S0FDUixDQUFDO0FBRWIsQ0FBQyxFQVRnQixjQUFjLEtBQWQsY0FBYyxRQVM5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IEFOSU1BVElPTl9DT05TVEFOVFMgfSBmcm9tICcuLi9vdmVybGF5LW91dGxldC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdG9hc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9hc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90b2FzdC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHN0YXRpYyBEVVJBVElPTiA9IDUwMDA7XG5cbiAgQElucHV0KClcbiAgdmFyaWFudDogVG9hc3RDb21wb25lbnQuVmFyaWFudCA9ICdiYXNpYyc7XG5cbiAgQElucHV0KClcbiAgaWNvbj86IEljb25Db21wb25lbnQuTmFtZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICAgIH0sIFRvYXN0Q29tcG9uZW50LkRVUkFUSU9OKTtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICByZWFkb25seSBob29rID0gQU5JTUFUSU9OX0NPTlNUQU5UUy5UT0FTVC5IT09LO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRvYXN0Q29tcG9uZW50IHtcbiAgZXhwb3J0IGNvbnN0IFZhcmlhbnRzID0gW1xuICAgICdiYXNpYycsXG4gICAgJ2RhbmdlcicsXG4gICAgJ3NhZmV0eScsXG4gICAgJ3NhZmV0eS1kYXJrJyxcbiAgICAnc2FmZXR5LWludmVyc2UnLFxuICBdIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBWYXJpYW50ID0gKHR5cGVvZiBWYXJpYW50cylbbnVtYmVyXTtcbn1cbiIsIjxkaXYgKnJpdi1vdmVybGF5IGNsYXNzPVwid3JhcHBlclwiIFthdHRyLmRhdGEtYW5pbWF0aW9uLWhvb2tdPVwiaG9va1wiPlxuICA8ZGl2IGNsYXNzPVwidG9hc3RcIiBbbmdDbGFzc109XCJ2YXJpYW50XCI+XG4gICAgPHJpdi1pY29uICpuZ0lmPVwiaWNvblwiIFtuYW1lXT1cImljb25cIiBbc2l6ZV09XCIxNlwiPjwvcml2LWljb24+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|