slate-angular 18.0.1 → 19.0.0-next.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.
Files changed (63) hide show
  1. package/fesm2022/slate-angular.mjs +120 -130
  2. package/fesm2022/slate-angular.mjs.map +1 -1
  3. package/package.json +1 -3
  4. package/view/base.d.ts +4 -4
  5. package/view/container-item.d.ts +1 -1
  6. package/view/container.d.ts +1 -1
  7. package/esm2022/components/block-card/block-card.component.mjs +0 -33
  8. package/esm2022/components/children/children-outlet.component.mjs +0 -22
  9. package/esm2022/components/children/children.component.mjs +0 -23
  10. package/esm2022/components/editable/editable.component.mjs +0 -1266
  11. package/esm2022/components/element/default-element.component.mjs +0 -19
  12. package/esm2022/components/element/default-element.component.token.mjs +0 -3
  13. package/esm2022/components/element/element.component.mjs +0 -19
  14. package/esm2022/components/leaf/default-leaf.component.mjs +0 -30
  15. package/esm2022/components/leaf/token.mjs +0 -3
  16. package/esm2022/components/leaves/leaves.component.mjs +0 -25
  17. package/esm2022/components/string/default-string.component.mjs +0 -75
  18. package/esm2022/components/string/string.component.mjs +0 -108
  19. package/esm2022/components/string/template.component.mjs +0 -20
  20. package/esm2022/components/text/default-text.component.mjs +0 -22
  21. package/esm2022/components/text/token.mjs +0 -4
  22. package/esm2022/components/text/void-text.component.mjs +0 -32
  23. package/esm2022/custom-event/BeforeInputEventPlugin.mjs +0 -251
  24. package/esm2022/custom-event/DOMTopLevelEventTypes.mjs +0 -13
  25. package/esm2022/custom-event/FallbackCompositionState.mjs +0 -62
  26. package/esm2022/custom-event/before-input-polyfill.mjs +0 -13
  27. package/esm2022/module.mjs +0 -69
  28. package/esm2022/plugins/angular-editor.mjs +0 -610
  29. package/esm2022/plugins/with-angular.mjs +0 -217
  30. package/esm2022/public-api.mjs +0 -20
  31. package/esm2022/slate-angular.mjs +0 -5
  32. package/esm2022/types/clipboard.mjs +0 -2
  33. package/esm2022/types/error.mjs +0 -12
  34. package/esm2022/types/feature.mjs +0 -2
  35. package/esm2022/types/index.mjs +0 -5
  36. package/esm2022/types/view.mjs +0 -2
  37. package/esm2022/utils/block-card.mjs +0 -25
  38. package/esm2022/utils/clipboard/clipboard.mjs +0 -78
  39. package/esm2022/utils/clipboard/common.mjs +0 -42
  40. package/esm2022/utils/clipboard/data-transfer.mjs +0 -44
  41. package/esm2022/utils/clipboard/index.mjs +0 -5
  42. package/esm2022/utils/clipboard/navigator-clipboard.mjs +0 -59
  43. package/esm2022/utils/constants.mjs +0 -2
  44. package/esm2022/utils/dom.mjs +0 -165
  45. package/esm2022/utils/environment.mjs +0 -34
  46. package/esm2022/utils/global-normalize.mjs +0 -11
  47. package/esm2022/utils/hotkeys.mjs +0 -99
  48. package/esm2022/utils/index.mjs +0 -12
  49. package/esm2022/utils/key.mjs +0 -14
  50. package/esm2022/utils/lines.mjs +0 -46
  51. package/esm2022/utils/range-list.mjs +0 -29
  52. package/esm2022/utils/restore-dom.mjs +0 -33
  53. package/esm2022/utils/throttle.mjs +0 -18
  54. package/esm2022/utils/view.mjs +0 -8
  55. package/esm2022/utils/weak-maps.mjs +0 -40
  56. package/esm2022/view/base.mjs +0 -273
  57. package/esm2022/view/container-item.mjs +0 -108
  58. package/esm2022/view/container.mjs +0 -22
  59. package/esm2022/view/context-change.mjs +0 -13
  60. package/esm2022/view/context.mjs +0 -2
  61. package/esm2022/view/render/leaves-render.mjs +0 -107
  62. package/esm2022/view/render/list-render.mjs +0 -302
  63. package/esm2022/view/render/utils.mjs +0 -110
@@ -1,1266 +0,0 @@
1
- import { Component, Input, ViewChild, HostBinding, ElementRef, ChangeDetectionStrategy, forwardRef, Inject, inject, ViewContainerRef } from '@angular/core';
2
- import { NODE_TO_ELEMENT, IS_FOCUSED, EDITOR_TO_ELEMENT, ELEMENT_TO_NODE, IS_READONLY, EDITOR_TO_ON_CHANGE, EDITOR_TO_WINDOW } from '../../utils/weak-maps';
3
- import { Element, Transforms, Editor, Range, Path, Node } from 'slate';
4
- import { direction } from 'direction';
5
- import scrollIntoView from 'scroll-into-view-if-needed';
6
- import { AngularEditor } from '../../plugins/angular-editor';
7
- import { isDOMNode, isDOMElement, isPlainTextOnlyPaste, getDefaultView } from '../../utils/dom';
8
- import { Subject } from 'rxjs';
9
- import { IS_FIREFOX, IS_SAFARI, IS_CHROME, HAS_BEFORE_INPUT_SUPPORT, IS_ANDROID } from '../../utils/environment';
10
- import Hotkeys from '../../utils/hotkeys';
11
- import { extractBeforeInputEvent } from '../../custom-event/BeforeInputEventPlugin';
12
- import { BEFORE_INPUT_EVENTS } from '../../custom-event/before-input-polyfill';
13
- import { SlateErrorCode } from '../../types/error';
14
- import { SlateStringTemplate } from '../string/template.component';
15
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
16
- import { HistoryEditor } from 'slate-history';
17
- import { isDecoratorRangeListEqual } from '../../utils';
18
- import { restoreDom } from '../../utils/restore-dom';
19
- import { SlateChildren } from '../children/children.component';
20
- import { SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN } from '../element/default-element.component.token';
21
- import { SLATE_DEFAULT_TEXT_COMPONENT_TOKEN, SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN } from '../text/token';
22
- import { SlateVoidText } from '../text/void-text.component';
23
- import { SlateDefaultText } from '../text/default-text.component';
24
- import { SlateDefaultElement } from '../element/default-element.component';
25
- import { SlateDefaultLeaf } from '../leaf/default-leaf.component';
26
- import { SLATE_DEFAULT_LEAF_COMPONENT_TOKEN } from '../leaf/token';
27
- import { ListRender } from '../../view/render/list-render';
28
- import { TRIPLE_CLICK } from '../../utils/constants';
29
- import * as i0 from "@angular/core";
30
- // not correctly clipboardData on beforeinput
31
- const forceOnDOMPaste = IS_SAFARI;
32
- export class SlateEditable {
33
- get hasBeforeInputSupport() {
34
- return HAS_BEFORE_INPUT_SUPPORT;
35
- }
36
- constructor(elementRef, renderer2, cdr, ngZone, injector, defaultElement, defaultText, defaultVoidText, defaultLeaf) {
37
- this.elementRef = elementRef;
38
- this.renderer2 = renderer2;
39
- this.cdr = cdr;
40
- this.ngZone = ngZone;
41
- this.injector = injector;
42
- this.defaultElement = defaultElement;
43
- this.defaultText = defaultText;
44
- this.defaultVoidText = defaultVoidText;
45
- this.defaultLeaf = defaultLeaf;
46
- this.destroy$ = new Subject();
47
- this.isComposing = false;
48
- this.isDraggingInternally = false;
49
- this.isUpdatingSelection = false;
50
- this.latestElement = null;
51
- this.manualListeners = [];
52
- this.onTouchedCallback = () => { };
53
- this.onChangeCallback = () => { };
54
- this.decorate = () => [];
55
- this.scrollSelectionIntoView = defaultScrollSelectionIntoView;
56
- this.isStrictDecorate = true;
57
- this.trackBy = () => null;
58
- this.readonly = false;
59
- //#endregion
60
- //#region DOM attr
61
- this.spellCheck = false;
62
- this.autoCorrect = false;
63
- this.autoCapitalize = false;
64
- this.dataSlateEditor = true;
65
- this.dataSlateNode = 'value';
66
- this.dataGramm = false;
67
- this.viewContainerRef = inject(ViewContainerRef);
68
- this.getOutletParent = () => {
69
- return this.elementRef.nativeElement;
70
- };
71
- }
72
- ngOnInit() {
73
- this.editor.injector = this.injector;
74
- this.editor.children = [];
75
- let window = getDefaultView(this.elementRef.nativeElement);
76
- EDITOR_TO_WINDOW.set(this.editor, window);
77
- EDITOR_TO_ELEMENT.set(this.editor, this.elementRef.nativeElement);
78
- NODE_TO_ELEMENT.set(this.editor, this.elementRef.nativeElement);
79
- ELEMENT_TO_NODE.set(this.elementRef.nativeElement, this.editor);
80
- IS_READONLY.set(this.editor, this.readonly);
81
- EDITOR_TO_ON_CHANGE.set(this.editor, () => {
82
- this.ngZone.run(() => {
83
- this.onChange();
84
- });
85
- });
86
- this.ngZone.runOutsideAngular(() => {
87
- this.initialize();
88
- });
89
- this.initializeViewContext();
90
- this.initializeContext();
91
- // remove unused DOM, just keep templateComponent instance
92
- this.templateElementRef.nativeElement.remove();
93
- // add browser class
94
- let browserClass = IS_FIREFOX ? 'firefox' : IS_SAFARI ? 'safari' : '';
95
- browserClass && this.elementRef.nativeElement.classList.add(browserClass);
96
- this.listRender = new ListRender(this.viewContext, this.viewContainerRef, this.getOutletParent, () => null);
97
- }
98
- ngOnChanges(simpleChanges) {
99
- if (!this.initialized) {
100
- return;
101
- }
102
- const decorateChange = simpleChanges['decorate'];
103
- if (decorateChange) {
104
- this.forceRender();
105
- }
106
- const placeholderChange = simpleChanges['placeholder'];
107
- if (placeholderChange) {
108
- this.render();
109
- }
110
- const readonlyChange = simpleChanges['readonly'];
111
- if (readonlyChange) {
112
- IS_READONLY.set(this.editor, this.readonly);
113
- this.render();
114
- this.toSlateSelection();
115
- }
116
- }
117
- registerOnChange(fn) {
118
- this.onChangeCallback = fn;
119
- }
120
- registerOnTouched(fn) {
121
- this.onTouchedCallback = fn;
122
- }
123
- writeValue(value) {
124
- if (value && value.length) {
125
- this.editor.children = value;
126
- this.initializeContext();
127
- if (!this.listRender.initialized) {
128
- this.listRender.initialize(this.editor.children, this.editor, this.context);
129
- }
130
- else {
131
- this.listRender.update(this.editor.children, this.editor, this.context);
132
- }
133
- this.cdr.markForCheck();
134
- }
135
- }
136
- initialize() {
137
- this.initialized = true;
138
- const window = AngularEditor.getWindow(this.editor);
139
- this.addEventListener('selectionchange', event => {
140
- this.toSlateSelection();
141
- }, window.document);
142
- if (HAS_BEFORE_INPUT_SUPPORT) {
143
- this.addEventListener('beforeinput', this.onDOMBeforeInput.bind(this));
144
- }
145
- this.addEventListener('blur', this.onDOMBlur.bind(this));
146
- this.addEventListener('click', this.onDOMClick.bind(this));
147
- this.addEventListener('compositionend', this.onDOMCompositionEnd.bind(this));
148
- this.addEventListener('compositionupdate', this.onDOMCompositionUpdate.bind(this));
149
- this.addEventListener('compositionstart', this.onDOMCompositionStart.bind(this));
150
- this.addEventListener('copy', this.onDOMCopy.bind(this));
151
- this.addEventListener('cut', this.onDOMCut.bind(this));
152
- this.addEventListener('dragover', this.onDOMDragOver.bind(this));
153
- this.addEventListener('dragstart', this.onDOMDragStart.bind(this));
154
- this.addEventListener('dragend', this.onDOMDragEnd.bind(this));
155
- this.addEventListener('drop', this.onDOMDrop.bind(this));
156
- this.addEventListener('focus', this.onDOMFocus.bind(this));
157
- this.addEventListener('keydown', this.onDOMKeydown.bind(this));
158
- this.addEventListener('paste', this.onDOMPaste.bind(this));
159
- BEFORE_INPUT_EVENTS.forEach(event => {
160
- this.addEventListener(event.name, () => { });
161
- });
162
- }
163
- toNativeSelection() {
164
- try {
165
- const { selection } = this.editor;
166
- const root = AngularEditor.findDocumentOrShadowRoot(this.editor);
167
- const { activeElement } = root;
168
- const domSelection = root.getSelection();
169
- if ((this.isComposing && !IS_ANDROID) || !domSelection || !AngularEditor.isFocused(this.editor)) {
170
- return;
171
- }
172
- const hasDomSelection = domSelection.type !== 'None';
173
- // If the DOM selection is properly unset, we're done.
174
- if (!selection && !hasDomSelection) {
175
- return;
176
- }
177
- // If the DOM selection is already correct, we're done.
178
- // verify that the dom selection is in the editor
179
- const editorElement = EDITOR_TO_ELEMENT.get(this.editor);
180
- let hasDomSelectionInEditor = false;
181
- if (editorElement.contains(domSelection.anchorNode) && editorElement.contains(domSelection.focusNode)) {
182
- hasDomSelectionInEditor = true;
183
- }
184
- // If the DOM selection is in the editor and the editor selection is already correct, we're done.
185
- if (hasDomSelection && hasDomSelectionInEditor && selection && hasStringTarget(domSelection)) {
186
- const rangeFromDOMSelection = AngularEditor.toSlateRange(this.editor, domSelection, { suppressThrow: true });
187
- if (rangeFromDOMSelection && Range.equals(rangeFromDOMSelection, selection)) {
188
- return;
189
- }
190
- }
191
- // prevent updating native selection when active element is void element
192
- if (isTargetInsideVoid(this.editor, activeElement)) {
193
- return;
194
- }
195
- // when <Editable/> is being controlled through external value
196
- // then its children might just change - DOM responds to it on its own
197
- // but Slate's value is not being updated through any operation
198
- // and thus it doesn't transform selection on its own
199
- if (selection && !AngularEditor.hasRange(this.editor, selection)) {
200
- this.editor.selection = AngularEditor.toSlateRange(this.editor, domSelection, { suppressThrow: false });
201
- return;
202
- }
203
- // Otherwise the DOM selection is out of sync, so update it.
204
- const el = AngularEditor.toDOMNode(this.editor, this.editor);
205
- this.isUpdatingSelection = true;
206
- const newDomRange = selection && AngularEditor.toDOMRange(this.editor, selection);
207
- if (newDomRange) {
208
- // COMPAT: Since the DOM range has no concept of backwards/forwards
209
- // we need to check and do the right thing here.
210
- if (Range.isBackward(selection)) {
211
- // eslint-disable-next-line max-len
212
- domSelection.setBaseAndExtent(newDomRange.endContainer, newDomRange.endOffset, newDomRange.startContainer, newDomRange.startOffset);
213
- }
214
- else {
215
- // eslint-disable-next-line max-len
216
- domSelection.setBaseAndExtent(newDomRange.startContainer, newDomRange.startOffset, newDomRange.endContainer, newDomRange.endOffset);
217
- }
218
- }
219
- else {
220
- domSelection.removeAllRanges();
221
- }
222
- setTimeout(() => {
223
- // handle scrolling in setTimeout because of
224
- // dom should not have updated immediately after listRender's updating
225
- newDomRange && this.scrollSelectionIntoView(this.editor, newDomRange);
226
- // COMPAT: In Firefox, it's not enough to create a range, you also need
227
- // to focus the contenteditable element too. (2016/11/16)
228
- if (newDomRange && IS_FIREFOX) {
229
- el.focus();
230
- }
231
- this.isUpdatingSelection = false;
232
- });
233
- }
234
- catch (error) {
235
- this.editor.onError({
236
- code: SlateErrorCode.ToNativeSelectionError,
237
- nativeError: error
238
- });
239
- this.isUpdatingSelection = false;
240
- }
241
- }
242
- onChange() {
243
- this.forceRender();
244
- this.onChangeCallback(this.editor.children);
245
- }
246
- ngAfterViewChecked() { }
247
- ngDoCheck() { }
248
- forceRender() {
249
- this.updateContext();
250
- this.listRender.update(this.editor.children, this.editor, this.context);
251
- // repair collaborative editing when Chinese input is interrupted by other users' cursors
252
- // when the DOMElement where the selection is located is removed
253
- // the compositionupdate and compositionend events will no longer be fired
254
- // so isComposing needs to be corrected
255
- // need exec after this.cdr.detectChanges() to render HTML
256
- // need exec before this.toNativeSelection() to correct native selection
257
- if (this.isComposing) {
258
- // Composition input text be not rendered when user composition input with selection is expanded
259
- // At this time, the following matching conditions are met, assign isComposing to false, and the status is wrong
260
- // this time condition is true and isComposiing is assigned false
261
- // Therefore, need to wait for the composition input text to be rendered before performing condition matching
262
- setTimeout(() => {
263
- const textNode = Node.get(this.editor, this.editor.selection.anchor.path);
264
- const textDOMNode = AngularEditor.toDOMNode(this.editor, textNode);
265
- let textContent = '';
266
- // skip decorate text
267
- textDOMNode.querySelectorAll('[editable-text]').forEach(stringDOMNode => {
268
- let text = stringDOMNode.textContent;
269
- const zeroChar = '\uFEFF';
270
- // remove zero with char
271
- if (text.startsWith(zeroChar)) {
272
- text = text.slice(1);
273
- }
274
- if (text.endsWith(zeroChar)) {
275
- text = text.slice(0, text.length - 1);
276
- }
277
- textContent += text;
278
- });
279
- if (Node.string(textNode).endsWith(textContent)) {
280
- this.isComposing = false;
281
- }
282
- }, 0);
283
- }
284
- this.toNativeSelection();
285
- }
286
- render() {
287
- const changed = this.updateContext();
288
- if (changed) {
289
- this.listRender.update(this.editor.children, this.editor, this.context);
290
- }
291
- }
292
- updateContext() {
293
- const decorations = this.generateDecorations();
294
- if (this.context.selection !== this.editor.selection ||
295
- this.context.decorate !== this.decorate ||
296
- this.context.readonly !== this.readonly ||
297
- !isDecoratorRangeListEqual(this.context.decorations, decorations)) {
298
- this.context = {
299
- parent: this.editor,
300
- selection: this.editor.selection,
301
- decorations: decorations,
302
- decorate: this.decorate,
303
- readonly: this.readonly
304
- };
305
- return true;
306
- }
307
- return false;
308
- }
309
- initializeContext() {
310
- this.context = {
311
- parent: this.editor,
312
- selection: this.editor.selection,
313
- decorations: this.generateDecorations(),
314
- decorate: this.decorate,
315
- readonly: this.readonly
316
- };
317
- }
318
- initializeViewContext() {
319
- this.viewContext = {
320
- editor: this.editor,
321
- renderElement: this.renderElement,
322
- renderLeaf: this.renderLeaf,
323
- renderText: this.renderText,
324
- trackBy: this.trackBy,
325
- isStrictDecorate: this.isStrictDecorate,
326
- templateComponent: this.templateComponent,
327
- defaultElement: this.defaultElement,
328
- defaultText: this.defaultText,
329
- defaultVoidText: this.defaultVoidText,
330
- defaultLeaf: this.defaultLeaf
331
- };
332
- }
333
- composePlaceholderDecorate(editor) {
334
- if (this.placeholderDecorate) {
335
- return this.placeholderDecorate(editor) || [];
336
- }
337
- if (this.placeholder && editor.children.length === 1 && Array.from(Node.texts(editor)).length === 1 && Node.string(editor) === '') {
338
- const start = Editor.start(editor, []);
339
- return [
340
- {
341
- placeholder: this.placeholder,
342
- anchor: start,
343
- focus: start
344
- }
345
- ];
346
- }
347
- else {
348
- return [];
349
- }
350
- }
351
- generateDecorations() {
352
- const decorations = this.decorate([this.editor, []]);
353
- const placeholderDecorations = this.isComposing ? [] : this.composePlaceholderDecorate(this.editor);
354
- decorations.push(...placeholderDecorations);
355
- return decorations;
356
- }
357
- //#region event proxy
358
- addEventListener(eventName, listener, target = this.elementRef.nativeElement) {
359
- this.manualListeners.push(this.renderer2.listen(target, eventName, (event) => {
360
- const beforeInputEvent = extractBeforeInputEvent(event.type, null, event, event.target);
361
- if (beforeInputEvent) {
362
- this.onFallbackBeforeInput(beforeInputEvent);
363
- }
364
- listener(event);
365
- }));
366
- }
367
- toSlateSelection() {
368
- if ((!this.isComposing || IS_ANDROID) && !this.isUpdatingSelection && !this.isDraggingInternally) {
369
- try {
370
- const root = AngularEditor.findDocumentOrShadowRoot(this.editor);
371
- const { activeElement } = root;
372
- const el = AngularEditor.toDOMNode(this.editor, this.editor);
373
- const domSelection = root.getSelection();
374
- if (activeElement === el) {
375
- this.latestElement = activeElement;
376
- IS_FOCUSED.set(this.editor, true);
377
- }
378
- else {
379
- IS_FOCUSED.delete(this.editor);
380
- }
381
- if (!domSelection) {
382
- return Transforms.deselect(this.editor);
383
- }
384
- const editorElement = EDITOR_TO_ELEMENT.get(this.editor);
385
- const hasDomSelectionInEditor = editorElement.contains(domSelection.anchorNode) && editorElement.contains(domSelection.focusNode);
386
- if (!hasDomSelectionInEditor) {
387
- Transforms.deselect(this.editor);
388
- return;
389
- }
390
- // try to get the selection directly, because some terrible case can be normalize for normalizeDOMPoint
391
- // for example, double-click the last cell of the table to select a non-editable DOM
392
- const range = AngularEditor.toSlateRange(this.editor, domSelection, { exactMatch: false, suppressThrow: true });
393
- if (range) {
394
- if (this.editor.selection && Range.equals(range, this.editor.selection) && !hasStringTarget(domSelection)) {
395
- if (!isTargetInsideVoid(this.editor, activeElement)) {
396
- // force adjust DOMSelection
397
- this.toNativeSelection();
398
- }
399
- }
400
- else {
401
- Transforms.select(this.editor, range);
402
- }
403
- }
404
- }
405
- catch (error) {
406
- this.editor.onError({
407
- code: SlateErrorCode.ToSlateSelectionError,
408
- nativeError: error
409
- });
410
- }
411
- }
412
- }
413
- onDOMBeforeInput(event) {
414
- const editor = this.editor;
415
- const root = AngularEditor.findDocumentOrShadowRoot(this.editor);
416
- const { activeElement } = root;
417
- const { selection } = editor;
418
- const { inputType: type } = event;
419
- const data = event.dataTransfer || event.data || undefined;
420
- if (IS_ANDROID) {
421
- let targetRange = null;
422
- let [nativeTargetRange] = event.getTargetRanges();
423
- if (nativeTargetRange) {
424
- targetRange = AngularEditor.toSlateRange(editor, nativeTargetRange);
425
- }
426
- // COMPAT: SelectionChange event is fired after the action is performed, so we
427
- // have to manually get the selection here to ensure it's up-to-date.
428
- const window = AngularEditor.getWindow(editor);
429
- const domSelection = window.getSelection();
430
- if (!targetRange && domSelection) {
431
- targetRange = AngularEditor.toSlateRange(editor, domSelection);
432
- }
433
- targetRange = targetRange ?? editor.selection;
434
- if (type === 'insertCompositionText') {
435
- if (data && data.toString().includes('\n')) {
436
- restoreDom(editor, () => {
437
- Editor.insertBreak(editor);
438
- });
439
- }
440
- else {
441
- if (targetRange) {
442
- if (data) {
443
- restoreDom(editor, () => {
444
- Transforms.insertText(editor, data.toString(), { at: targetRange });
445
- });
446
- }
447
- else {
448
- restoreDom(editor, () => {
449
- Transforms.delete(editor, { at: targetRange });
450
- });
451
- }
452
- }
453
- }
454
- return;
455
- }
456
- if (type === 'deleteContentBackward') {
457
- // gboard can not prevent default action, so must use restoreDom,
458
- // sougou Keyboard can prevent default action(only in Chinese input mode).
459
- // In order to avoid weird action in Sougou Keyboard, use resotreDom only range's isCollapsed is false (recognize gboard)
460
- if (!Range.isCollapsed(targetRange)) {
461
- restoreDom(editor, () => {
462
- Transforms.delete(editor, { at: targetRange });
463
- });
464
- return;
465
- }
466
- }
467
- if (type === 'insertText') {
468
- restoreDom(editor, () => {
469
- if (typeof data === 'string') {
470
- Editor.insertText(editor, data);
471
- }
472
- });
473
- return;
474
- }
475
- }
476
- if (!this.readonly &&
477
- hasEditableTarget(editor, event.target) &&
478
- !isTargetInsideVoid(editor, activeElement) &&
479
- !this.isDOMEventHandled(event, this.beforeInput)) {
480
- try {
481
- event.preventDefault();
482
- // COMPAT: If the selection is expanded, even if the command seems like
483
- // a delete forward/backward command it should delete the selection.
484
- if (selection && Range.isExpanded(selection) && type.startsWith('delete')) {
485
- const direction = type.endsWith('Backward') ? 'backward' : 'forward';
486
- Editor.deleteFragment(editor, { direction });
487
- return;
488
- }
489
- switch (type) {
490
- case 'deleteByComposition':
491
- case 'deleteByCut':
492
- case 'deleteByDrag': {
493
- Editor.deleteFragment(editor);
494
- break;
495
- }
496
- case 'deleteContent':
497
- case 'deleteContentForward': {
498
- Editor.deleteForward(editor);
499
- break;
500
- }
501
- case 'deleteContentBackward': {
502
- Editor.deleteBackward(editor);
503
- break;
504
- }
505
- case 'deleteEntireSoftLine': {
506
- Editor.deleteBackward(editor, { unit: 'line' });
507
- Editor.deleteForward(editor, { unit: 'line' });
508
- break;
509
- }
510
- case 'deleteHardLineBackward': {
511
- Editor.deleteBackward(editor, { unit: 'block' });
512
- break;
513
- }
514
- case 'deleteSoftLineBackward': {
515
- Editor.deleteBackward(editor, { unit: 'line' });
516
- break;
517
- }
518
- case 'deleteHardLineForward': {
519
- Editor.deleteForward(editor, { unit: 'block' });
520
- break;
521
- }
522
- case 'deleteSoftLineForward': {
523
- Editor.deleteForward(editor, { unit: 'line' });
524
- break;
525
- }
526
- case 'deleteWordBackward': {
527
- Editor.deleteBackward(editor, { unit: 'word' });
528
- break;
529
- }
530
- case 'deleteWordForward': {
531
- Editor.deleteForward(editor, { unit: 'word' });
532
- break;
533
- }
534
- case 'insertLineBreak':
535
- case 'insertParagraph': {
536
- Editor.insertBreak(editor);
537
- break;
538
- }
539
- case 'insertFromComposition': {
540
- // COMPAT: in safari, `compositionend` event is dispatched after
541
- // the beforeinput event with the inputType "insertFromComposition" has been dispatched.
542
- // https://www.w3.org/TR/input-events-2/
543
- // so the following code is the right logic
544
- // because DOM selection in sync will be exec before `compositionend` event
545
- // isComposing is true will prevent DOM selection being update correctly.
546
- this.isComposing = false;
547
- preventInsertFromComposition(event, this.editor);
548
- }
549
- case 'insertFromDrop':
550
- case 'insertFromPaste':
551
- case 'insertFromYank':
552
- case 'insertReplacementText':
553
- case 'insertText': {
554
- // use a weak comparison instead of 'instanceof' to allow
555
- // programmatic access of paste events coming from external windows
556
- // like cypress where cy.window does not work realibly
557
- if (data?.constructor.name === 'DataTransfer') {
558
- AngularEditor.insertData(editor, data);
559
- }
560
- else if (typeof data === 'string') {
561
- Editor.insertText(editor, data);
562
- }
563
- break;
564
- }
565
- }
566
- }
567
- catch (error) {
568
- this.editor.onError({
569
- code: SlateErrorCode.OnDOMBeforeInputError,
570
- nativeError: error
571
- });
572
- }
573
- }
574
- }
575
- onDOMBlur(event) {
576
- if (this.readonly ||
577
- this.isUpdatingSelection ||
578
- !hasEditableTarget(this.editor, event.target) ||
579
- this.isDOMEventHandled(event, this.blur)) {
580
- return;
581
- }
582
- const window = AngularEditor.getWindow(this.editor);
583
- // COMPAT: If the current `activeElement` is still the previous
584
- // one, this is due to the window being blurred when the tab
585
- // itself becomes unfocused, so we want to abort early to allow to
586
- // editor to stay focused when the tab becomes focused again.
587
- const root = AngularEditor.findDocumentOrShadowRoot(this.editor);
588
- if (this.latestElement === root.activeElement) {
589
- return;
590
- }
591
- const { relatedTarget } = event;
592
- const el = AngularEditor.toDOMNode(this.editor, this.editor);
593
- // COMPAT: The event should be ignored if the focus is returning
594
- // to the editor from an embedded editable element (eg. an <input>
595
- // element inside a void node).
596
- if (relatedTarget === el) {
597
- return;
598
- }
599
- // COMPAT: The event should be ignored if the focus is moving from
600
- // the editor to inside a void node's spacer element.
601
- if (isDOMElement(relatedTarget) && relatedTarget.hasAttribute('data-slate-spacer')) {
602
- return;
603
- }
604
- // COMPAT: The event should be ignored if the focus is moving to a
605
- // non- editable section of an element that isn't a void node (eg.
606
- // a list item of the check list example).
607
- if (relatedTarget != null && isDOMNode(relatedTarget) && AngularEditor.hasDOMNode(this.editor, relatedTarget)) {
608
- const node = AngularEditor.toSlateNode(this.editor, relatedTarget);
609
- if (Element.isElement(node) && !this.editor.isVoid(node)) {
610
- return;
611
- }
612
- }
613
- IS_FOCUSED.delete(this.editor);
614
- }
615
- onDOMClick(event) {
616
- if (!this.readonly &&
617
- hasTarget(this.editor, event.target) &&
618
- !this.isDOMEventHandled(event, this.click) &&
619
- isDOMNode(event.target)) {
620
- const node = AngularEditor.toSlateNode(this.editor, event.target);
621
- const path = AngularEditor.findPath(this.editor, node);
622
- const start = Editor.start(this.editor, path);
623
- const end = Editor.end(this.editor, path);
624
- const startVoid = Editor.void(this.editor, { at: start });
625
- const endVoid = Editor.void(this.editor, { at: end });
626
- if (event.detail === TRIPLE_CLICK && path.length >= 1) {
627
- let blockPath = path;
628
- if (!(Element.isElement(node) && Editor.isBlock(this.editor, node))) {
629
- const block = Editor.above(this.editor, {
630
- match: n => Element.isElement(n) && Editor.isBlock(this.editor, n),
631
- at: path
632
- });
633
- blockPath = block?.[1] ?? path.slice(0, 1);
634
- }
635
- const range = Editor.range(this.editor, blockPath);
636
- Transforms.select(this.editor, range);
637
- return;
638
- }
639
- if (startVoid &&
640
- endVoid &&
641
- Path.equals(startVoid[1], endVoid[1]) &&
642
- !(AngularEditor.isBlockCardLeftCursor(this.editor) || AngularEditor.isBlockCardRightCursor(this.editor))) {
643
- const range = Editor.range(this.editor, start);
644
- Transforms.select(this.editor, range);
645
- }
646
- }
647
- }
648
- onDOMCompositionStart(event) {
649
- const { selection } = this.editor;
650
- if (selection) {
651
- // solve the problem of cross node Chinese input
652
- if (Range.isExpanded(selection)) {
653
- Editor.deleteFragment(this.editor);
654
- this.forceRender();
655
- }
656
- }
657
- if (hasEditableTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.compositionStart)) {
658
- this.isComposing = true;
659
- }
660
- this.render();
661
- }
662
- onDOMCompositionUpdate(event) {
663
- this.isDOMEventHandled(event, this.compositionUpdate);
664
- }
665
- onDOMCompositionEnd(event) {
666
- if (!event.data && !Range.isCollapsed(this.editor.selection)) {
667
- Transforms.delete(this.editor);
668
- }
669
- if (hasEditableTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.compositionEnd)) {
670
- // COMPAT: In Chrome/Firefox, `beforeinput` events for compositions
671
- // aren't correct and never fire the "insertFromComposition"
672
- // type that we need. So instead, insert whenever a composition
673
- // ends since it will already have been committed to the DOM.
674
- if (this.isComposing === true && !IS_SAFARI && !IS_ANDROID && event.data) {
675
- preventInsertFromComposition(event, this.editor);
676
- Editor.insertText(this.editor, event.data);
677
- }
678
- // COMPAT: In Firefox 87.0 CompositionEnd fire twice
679
- // so we need avoid repeat isnertText by isComposing === true,
680
- this.isComposing = false;
681
- }
682
- this.render();
683
- }
684
- onDOMCopy(event) {
685
- const window = AngularEditor.getWindow(this.editor);
686
- const isOutsideSlate = !hasStringTarget(window.getSelection()) && isTargetInsideVoid(this.editor, event.target);
687
- if (!isOutsideSlate && hasTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.copy)) {
688
- event.preventDefault();
689
- AngularEditor.setFragmentData(this.editor, event.clipboardData, 'copy');
690
- }
691
- }
692
- onDOMCut(event) {
693
- if (!this.readonly && hasEditableTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.cut)) {
694
- event.preventDefault();
695
- AngularEditor.setFragmentData(this.editor, event.clipboardData, 'cut');
696
- const { selection } = this.editor;
697
- if (selection) {
698
- AngularEditor.deleteCutData(this.editor);
699
- }
700
- }
701
- }
702
- onDOMDragOver(event) {
703
- if (hasTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.dragOver)) {
704
- // Only when the target is void, call `preventDefault` to signal
705
- // that drops are allowed. Editable content is droppable by
706
- // default, and calling `preventDefault` hides the cursor.
707
- const node = AngularEditor.toSlateNode(this.editor, event.target);
708
- if (Element.isElement(node) && Editor.isVoid(this.editor, node)) {
709
- event.preventDefault();
710
- }
711
- }
712
- }
713
- onDOMDragStart(event) {
714
- if (!this.readonly && hasTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.dragStart)) {
715
- const node = AngularEditor.toSlateNode(this.editor, event.target);
716
- const path = AngularEditor.findPath(this.editor, node);
717
- const voidMatch = Element.isElement(node) && (Editor.isVoid(this.editor, node) || Editor.void(this.editor, { at: path, voids: true }));
718
- // If starting a drag on a void node, make sure it is selected
719
- // so that it shows up in the selection's fragment.
720
- if (voidMatch) {
721
- const range = Editor.range(this.editor, path);
722
- Transforms.select(this.editor, range);
723
- }
724
- this.isDraggingInternally = true;
725
- AngularEditor.setFragmentData(this.editor, event.dataTransfer, 'drag');
726
- }
727
- }
728
- onDOMDrop(event) {
729
- const editor = this.editor;
730
- if (!this.readonly && hasTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.drop)) {
731
- event.preventDefault();
732
- // Keep a reference to the dragged range before updating selection
733
- const draggedRange = editor.selection;
734
- // Find the range where the drop happened
735
- const range = AngularEditor.findEventRange(editor, event);
736
- const data = event.dataTransfer;
737
- Transforms.select(editor, range);
738
- if (this.isDraggingInternally) {
739
- if (draggedRange) {
740
- Transforms.delete(editor, {
741
- at: draggedRange
742
- });
743
- }
744
- this.isDraggingInternally = false;
745
- }
746
- AngularEditor.insertData(editor, data);
747
- // When dragging from another source into the editor, it's possible
748
- // that the current editor does not have focus.
749
- if (!AngularEditor.isFocused(editor)) {
750
- AngularEditor.focus(editor);
751
- }
752
- }
753
- }
754
- onDOMDragEnd(event) {
755
- if (!this.readonly &&
756
- this.isDraggingInternally &&
757
- hasTarget(this.editor, event.target) &&
758
- !this.isDOMEventHandled(event, this.dragEnd)) {
759
- this.isDraggingInternally = false;
760
- }
761
- }
762
- onDOMFocus(event) {
763
- if (!this.readonly &&
764
- !this.isUpdatingSelection &&
765
- hasEditableTarget(this.editor, event.target) &&
766
- !this.isDOMEventHandled(event, this.focus)) {
767
- const el = AngularEditor.toDOMNode(this.editor, this.editor);
768
- const root = AngularEditor.findDocumentOrShadowRoot(this.editor);
769
- this.latestElement = root.activeElement;
770
- // COMPAT: If the editor has nested editable elements, the focus
771
- // can go to them. In Firefox, this must be prevented because it
772
- // results in issues with keyboard navigation. (2017/03/30)
773
- if (IS_FIREFOX && event.target !== el) {
774
- el.focus();
775
- return;
776
- }
777
- IS_FOCUSED.set(this.editor, true);
778
- }
779
- }
780
- onDOMKeydown(event) {
781
- const editor = this.editor;
782
- const root = AngularEditor.findDocumentOrShadowRoot(this.editor);
783
- const { activeElement } = root;
784
- if (!this.readonly &&
785
- hasEditableTarget(editor, event.target) &&
786
- !isTargetInsideVoid(editor, activeElement) && // stop fire keydown handle when focus void node
787
- !this.isComposing &&
788
- !this.isDOMEventHandled(event, this.keydown)) {
789
- const nativeEvent = event;
790
- const { selection } = editor;
791
- const element = editor.children[selection !== null ? selection.focus.path[0] : 0];
792
- const isRTL = direction(Node.string(element)) === 'rtl';
793
- try {
794
- // COMPAT: Since we prevent the default behavior on
795
- // `beforeinput` events, the browser doesn't think there's ever
796
- // any history stack to undo or redo, so we have to manage these
797
- // hotkeys ourselves. (2019/11/06)
798
- if (Hotkeys.isRedo(nativeEvent)) {
799
- event.preventDefault();
800
- if (HistoryEditor.isHistoryEditor(editor)) {
801
- editor.redo();
802
- }
803
- return;
804
- }
805
- if (Hotkeys.isUndo(nativeEvent)) {
806
- event.preventDefault();
807
- if (HistoryEditor.isHistoryEditor(editor)) {
808
- editor.undo();
809
- }
810
- return;
811
- }
812
- // COMPAT: Certain browsers don't handle the selection updates
813
- // properly. In Chrome, the selection isn't properly extended.
814
- // And in Firefox, the selection isn't properly collapsed.
815
- // (2017/10/17)
816
- if (Hotkeys.isMoveLineBackward(nativeEvent)) {
817
- event.preventDefault();
818
- Transforms.move(editor, { unit: 'line', reverse: true });
819
- return;
820
- }
821
- if (Hotkeys.isMoveLineForward(nativeEvent)) {
822
- event.preventDefault();
823
- Transforms.move(editor, { unit: 'line' });
824
- return;
825
- }
826
- if (Hotkeys.isExtendLineBackward(nativeEvent)) {
827
- event.preventDefault();
828
- Transforms.move(editor, {
829
- unit: 'line',
830
- edge: 'focus',
831
- reverse: true
832
- });
833
- return;
834
- }
835
- if (Hotkeys.isExtendLineForward(nativeEvent)) {
836
- event.preventDefault();
837
- Transforms.move(editor, { unit: 'line', edge: 'focus' });
838
- return;
839
- }
840
- // COMPAT: If a void node is selected, or a zero-width text node
841
- // adjacent to an inline is selected, we need to handle these
842
- // hotkeys manually because browsers won't be able to skip over
843
- // the void node with the zero-width space not being an empty
844
- // string.
845
- if (Hotkeys.isMoveBackward(nativeEvent)) {
846
- event.preventDefault();
847
- if (selection && Range.isCollapsed(selection)) {
848
- Transforms.move(editor, { reverse: !isRTL });
849
- }
850
- else {
851
- Transforms.collapse(editor, { edge: 'start' });
852
- }
853
- return;
854
- }
855
- if (Hotkeys.isMoveForward(nativeEvent)) {
856
- event.preventDefault();
857
- if (selection && Range.isCollapsed(selection)) {
858
- Transforms.move(editor, { reverse: isRTL });
859
- }
860
- else {
861
- Transforms.collapse(editor, { edge: 'end' });
862
- }
863
- return;
864
- }
865
- if (Hotkeys.isMoveWordBackward(nativeEvent)) {
866
- event.preventDefault();
867
- if (selection && Range.isExpanded(selection)) {
868
- Transforms.collapse(editor, { edge: 'focus' });
869
- }
870
- Transforms.move(editor, { unit: 'word', reverse: !isRTL });
871
- return;
872
- }
873
- if (Hotkeys.isMoveWordForward(nativeEvent)) {
874
- event.preventDefault();
875
- if (selection && Range.isExpanded(selection)) {
876
- Transforms.collapse(editor, { edge: 'focus' });
877
- }
878
- Transforms.move(editor, { unit: 'word', reverse: isRTL });
879
- return;
880
- }
881
- // COMPAT: Certain browsers don't support the `beforeinput` event, so we
882
- // fall back to guessing at the input intention for hotkeys.
883
- // COMPAT: In iOS, some of these hotkeys are handled in the
884
- if (!HAS_BEFORE_INPUT_SUPPORT) {
885
- // We don't have a core behavior for these, but they change the
886
- // DOM if we don't prevent them, so we have to.
887
- if (Hotkeys.isBold(nativeEvent) || Hotkeys.isItalic(nativeEvent) || Hotkeys.isTransposeCharacter(nativeEvent)) {
888
- event.preventDefault();
889
- return;
890
- }
891
- if (Hotkeys.isSplitBlock(nativeEvent)) {
892
- event.preventDefault();
893
- Editor.insertBreak(editor);
894
- return;
895
- }
896
- if (Hotkeys.isDeleteBackward(nativeEvent)) {
897
- event.preventDefault();
898
- if (selection && Range.isExpanded(selection)) {
899
- Editor.deleteFragment(editor, {
900
- direction: 'backward'
901
- });
902
- }
903
- else {
904
- Editor.deleteBackward(editor);
905
- }
906
- return;
907
- }
908
- if (Hotkeys.isDeleteForward(nativeEvent)) {
909
- event.preventDefault();
910
- if (selection && Range.isExpanded(selection)) {
911
- Editor.deleteFragment(editor, {
912
- direction: 'forward'
913
- });
914
- }
915
- else {
916
- Editor.deleteForward(editor);
917
- }
918
- return;
919
- }
920
- if (Hotkeys.isDeleteLineBackward(nativeEvent)) {
921
- event.preventDefault();
922
- if (selection && Range.isExpanded(selection)) {
923
- Editor.deleteFragment(editor, {
924
- direction: 'backward'
925
- });
926
- }
927
- else {
928
- Editor.deleteBackward(editor, { unit: 'line' });
929
- }
930
- return;
931
- }
932
- if (Hotkeys.isDeleteLineForward(nativeEvent)) {
933
- event.preventDefault();
934
- if (selection && Range.isExpanded(selection)) {
935
- Editor.deleteFragment(editor, {
936
- direction: 'forward'
937
- });
938
- }
939
- else {
940
- Editor.deleteForward(editor, { unit: 'line' });
941
- }
942
- return;
943
- }
944
- if (Hotkeys.isDeleteWordBackward(nativeEvent)) {
945
- event.preventDefault();
946
- if (selection && Range.isExpanded(selection)) {
947
- Editor.deleteFragment(editor, {
948
- direction: 'backward'
949
- });
950
- }
951
- else {
952
- Editor.deleteBackward(editor, { unit: 'word' });
953
- }
954
- return;
955
- }
956
- if (Hotkeys.isDeleteWordForward(nativeEvent)) {
957
- event.preventDefault();
958
- if (selection && Range.isExpanded(selection)) {
959
- Editor.deleteFragment(editor, {
960
- direction: 'forward'
961
- });
962
- }
963
- else {
964
- Editor.deleteForward(editor, { unit: 'word' });
965
- }
966
- return;
967
- }
968
- }
969
- else {
970
- if (IS_CHROME || IS_SAFARI) {
971
- // COMPAT: Chrome and Safari support `beforeinput` event but do not fire
972
- // an event when deleting backwards in a selected void inline node
973
- if (selection &&
974
- (Hotkeys.isDeleteBackward(nativeEvent) || Hotkeys.isDeleteForward(nativeEvent)) &&
975
- Range.isCollapsed(selection)) {
976
- const currentNode = Node.parent(editor, selection.anchor.path);
977
- if (Element.isElement(currentNode) &&
978
- Editor.isVoid(editor, currentNode) &&
979
- (Editor.isInline(editor, currentNode) || Editor.isBlock(editor, currentNode))) {
980
- event.preventDefault();
981
- Editor.deleteBackward(editor, {
982
- unit: 'block'
983
- });
984
- return;
985
- }
986
- }
987
- }
988
- }
989
- }
990
- catch (error) {
991
- this.editor.onError({
992
- code: SlateErrorCode.OnDOMKeydownError,
993
- nativeError: error
994
- });
995
- }
996
- }
997
- }
998
- onDOMPaste(event) {
999
- // COMPAT: Certain browsers don't support the `beforeinput` event, so we
1000
- // fall back to React's `onPaste` here instead.
1001
- // COMPAT: Firefox, Chrome and Safari are not emitting `beforeinput` events
1002
- // when "paste without formatting" option is used.
1003
- // This unfortunately needs to be handled with paste events instead.
1004
- if (!this.isDOMEventHandled(event, this.paste) &&
1005
- (!HAS_BEFORE_INPUT_SUPPORT || isPlainTextOnlyPaste(event) || forceOnDOMPaste) &&
1006
- !this.readonly &&
1007
- hasEditableTarget(this.editor, event.target)) {
1008
- event.preventDefault();
1009
- AngularEditor.insertData(this.editor, event.clipboardData);
1010
- }
1011
- }
1012
- onFallbackBeforeInput(event) {
1013
- // COMPAT: Certain browsers don't support the `beforeinput` event, so we
1014
- // fall back to React's leaky polyfill instead just for it. It
1015
- // only works for the `insertText` input type.
1016
- if (!HAS_BEFORE_INPUT_SUPPORT &&
1017
- !this.readonly &&
1018
- !this.isDOMEventHandled(event.nativeEvent, this.beforeInput) &&
1019
- hasEditableTarget(this.editor, event.nativeEvent.target)) {
1020
- event.nativeEvent.preventDefault();
1021
- try {
1022
- const text = event.data;
1023
- if (!Range.isCollapsed(this.editor.selection)) {
1024
- Editor.deleteFragment(this.editor);
1025
- }
1026
- // just handle Non-IME input
1027
- if (!this.isComposing) {
1028
- Editor.insertText(this.editor, text);
1029
- }
1030
- }
1031
- catch (error) {
1032
- this.editor.onError({
1033
- code: SlateErrorCode.ToNativeSelectionError,
1034
- nativeError: error
1035
- });
1036
- }
1037
- }
1038
- }
1039
- isDOMEventHandled(event, handler) {
1040
- if (!handler) {
1041
- return false;
1042
- }
1043
- handler(event);
1044
- return event.defaultPrevented;
1045
- }
1046
- //#endregion
1047
- ngOnDestroy() {
1048
- NODE_TO_ELEMENT.delete(this.editor);
1049
- this.manualListeners.forEach(manualListener => {
1050
- manualListener();
1051
- });
1052
- this.destroy$.complete();
1053
- EDITOR_TO_ON_CHANGE.delete(this.editor);
1054
- }
1055
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: SlateEditable, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Injector }, { token: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN }, { token: SLATE_DEFAULT_TEXT_COMPONENT_TOKEN }, { token: SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN }, { token: SLATE_DEFAULT_LEAF_COMPONENT_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
1056
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: SlateEditable, isStandalone: true, selector: "slate-editable", inputs: { editor: "editor", renderElement: "renderElement", renderLeaf: "renderLeaf", renderText: "renderText", decorate: "decorate", placeholderDecorate: "placeholderDecorate", scrollSelectionIntoView: "scrollSelectionIntoView", isStrictDecorate: "isStrictDecorate", trackBy: "trackBy", readonly: "readonly", placeholder: "placeholder", beforeInput: "beforeInput", blur: "blur", click: "click", compositionEnd: "compositionEnd", compositionUpdate: "compositionUpdate", compositionStart: "compositionStart", copy: "copy", cut: "cut", dragOver: "dragOver", dragStart: "dragStart", dragEnd: "dragEnd", drop: "drop", focus: "focus", keydown: "keydown", paste: "paste", spellCheck: "spellCheck", autoCorrect: "autoCorrect", autoCapitalize: "autoCapitalize" }, host: { properties: { "attr.contenteditable": "readonly ? undefined : true", "attr.role": "readonly ? undefined : 'textbox'", "attr.spellCheck": "!hasBeforeInputSupport ? false : spellCheck", "attr.autoCorrect": "!hasBeforeInputSupport ? 'false' : autoCorrect", "attr.autoCapitalize": "!hasBeforeInputSupport ? 'false' : autoCapitalize", "attr.data-slate-editor": "this.dataSlateEditor", "attr.data-slate-node": "this.dataSlateNode", "attr.data-gramm": "this.dataGramm" }, classAttribute: "slate-editable-container" }, providers: [
1057
- {
1058
- provide: NG_VALUE_ACCESSOR,
1059
- useExisting: forwardRef(() => SlateEditable),
1060
- multi: true
1061
- },
1062
- {
1063
- provide: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN,
1064
- useValue: SlateDefaultElement
1065
- },
1066
- {
1067
- provide: SLATE_DEFAULT_TEXT_COMPONENT_TOKEN,
1068
- useValue: SlateDefaultText
1069
- },
1070
- {
1071
- provide: SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN,
1072
- useValue: SlateVoidText
1073
- },
1074
- {
1075
- provide: SLATE_DEFAULT_LEAF_COMPONENT_TOKEN,
1076
- useValue: SlateDefaultLeaf
1077
- }
1078
- ], viewQueries: [{ propertyName: "templateComponent", first: true, predicate: ["templateComponent"], descendants: true, static: true }, { propertyName: "templateElementRef", first: true, predicate: ["templateComponent"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<slate-string-template #templateComponent></slate-string-template>\n", dependencies: [{ kind: "component", type: SlateStringTemplate, selector: "slate-string-template" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1079
- }
1080
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: SlateEditable, decorators: [{
1081
- type: Component,
1082
- args: [{ selector: 'slate-editable', host: {
1083
- class: 'slate-editable-container',
1084
- '[attr.contenteditable]': 'readonly ? undefined : true',
1085
- '[attr.role]': `readonly ? undefined : 'textbox'`,
1086
- '[attr.spellCheck]': `!hasBeforeInputSupport ? false : spellCheck`,
1087
- '[attr.autoCorrect]': `!hasBeforeInputSupport ? 'false' : autoCorrect`,
1088
- '[attr.autoCapitalize]': `!hasBeforeInputSupport ? 'false' : autoCapitalize`
1089
- }, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
1090
- {
1091
- provide: NG_VALUE_ACCESSOR,
1092
- useExisting: forwardRef(() => SlateEditable),
1093
- multi: true
1094
- },
1095
- {
1096
- provide: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN,
1097
- useValue: SlateDefaultElement
1098
- },
1099
- {
1100
- provide: SLATE_DEFAULT_TEXT_COMPONENT_TOKEN,
1101
- useValue: SlateDefaultText
1102
- },
1103
- {
1104
- provide: SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN,
1105
- useValue: SlateVoidText
1106
- },
1107
- {
1108
- provide: SLATE_DEFAULT_LEAF_COMPONENT_TOKEN,
1109
- useValue: SlateDefaultLeaf
1110
- }
1111
- ], standalone: true, imports: [SlateChildren, SlateStringTemplate], template: "<slate-string-template #templateComponent></slate-string-template>\n" }]
1112
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.Injector }, { type: undefined, decorators: [{
1113
- type: Inject,
1114
- args: [SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN]
1115
- }] }, { type: undefined, decorators: [{
1116
- type: Inject,
1117
- args: [SLATE_DEFAULT_TEXT_COMPONENT_TOKEN]
1118
- }] }, { type: undefined, decorators: [{
1119
- type: Inject,
1120
- args: [SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN]
1121
- }] }, { type: undefined, decorators: [{
1122
- type: Inject,
1123
- args: [SLATE_DEFAULT_LEAF_COMPONENT_TOKEN]
1124
- }] }], propDecorators: { editor: [{
1125
- type: Input
1126
- }], renderElement: [{
1127
- type: Input
1128
- }], renderLeaf: [{
1129
- type: Input
1130
- }], renderText: [{
1131
- type: Input
1132
- }], decorate: [{
1133
- type: Input
1134
- }], placeholderDecorate: [{
1135
- type: Input
1136
- }], scrollSelectionIntoView: [{
1137
- type: Input
1138
- }], isStrictDecorate: [{
1139
- type: Input
1140
- }], trackBy: [{
1141
- type: Input
1142
- }], readonly: [{
1143
- type: Input
1144
- }], placeholder: [{
1145
- type: Input
1146
- }], beforeInput: [{
1147
- type: Input
1148
- }], blur: [{
1149
- type: Input
1150
- }], click: [{
1151
- type: Input
1152
- }], compositionEnd: [{
1153
- type: Input
1154
- }], compositionUpdate: [{
1155
- type: Input
1156
- }], compositionStart: [{
1157
- type: Input
1158
- }], copy: [{
1159
- type: Input
1160
- }], cut: [{
1161
- type: Input
1162
- }], dragOver: [{
1163
- type: Input
1164
- }], dragStart: [{
1165
- type: Input
1166
- }], dragEnd: [{
1167
- type: Input
1168
- }], drop: [{
1169
- type: Input
1170
- }], focus: [{
1171
- type: Input
1172
- }], keydown: [{
1173
- type: Input
1174
- }], paste: [{
1175
- type: Input
1176
- }], spellCheck: [{
1177
- type: Input
1178
- }], autoCorrect: [{
1179
- type: Input
1180
- }], autoCapitalize: [{
1181
- type: Input
1182
- }], dataSlateEditor: [{
1183
- type: HostBinding,
1184
- args: ['attr.data-slate-editor']
1185
- }], dataSlateNode: [{
1186
- type: HostBinding,
1187
- args: ['attr.data-slate-node']
1188
- }], dataGramm: [{
1189
- type: HostBinding,
1190
- args: ['attr.data-gramm']
1191
- }], templateComponent: [{
1192
- type: ViewChild,
1193
- args: ['templateComponent', { static: true }]
1194
- }], templateElementRef: [{
1195
- type: ViewChild,
1196
- args: ['templateComponent', { static: true, read: ElementRef }]
1197
- }] } });
1198
- export const defaultScrollSelectionIntoView = (editor, domRange) => {
1199
- // This was affecting the selection of multiple blocks and dragging behavior,
1200
- // so enabled only if the selection has been collapsed.
1201
- if (domRange.getBoundingClientRect && (!editor.selection || (editor.selection && Range.isCollapsed(editor.selection)))) {
1202
- const leafEl = domRange.startContainer.parentElement;
1203
- leafEl.getBoundingClientRect = domRange.getBoundingClientRect.bind(domRange);
1204
- scrollIntoView(leafEl, {
1205
- scrollMode: 'if-needed'
1206
- });
1207
- delete leafEl.getBoundingClientRect;
1208
- }
1209
- };
1210
- /**
1211
- * Check if the target is editable and in the editor.
1212
- */
1213
- export const hasEditableTarget = (editor, target) => {
1214
- return isDOMNode(target) && AngularEditor.hasDOMNode(editor, target, { editable: true });
1215
- };
1216
- /**
1217
- * Check if two DOM range objects are equal.
1218
- */
1219
- const isRangeEqual = (a, b) => {
1220
- return ((a.startContainer === b.startContainer &&
1221
- a.startOffset === b.startOffset &&
1222
- a.endContainer === b.endContainer &&
1223
- a.endOffset === b.endOffset) ||
1224
- (a.startContainer === b.endContainer &&
1225
- a.startOffset === b.endOffset &&
1226
- a.endContainer === b.startContainer &&
1227
- a.endOffset === b.startOffset));
1228
- };
1229
- /**
1230
- * Check if the target is in the editor.
1231
- */
1232
- const hasTarget = (editor, target) => {
1233
- return isDOMNode(target) && AngularEditor.hasDOMNode(editor, target);
1234
- };
1235
- /**
1236
- * Check if the target is inside void and in the editor.
1237
- */
1238
- const isTargetInsideVoid = (editor, target) => {
1239
- const slateNode = hasTarget(editor, target) && AngularEditor.toSlateNode(editor, target, { suppressThrow: true });
1240
- return slateNode && Element.isElement(slateNode) && Editor.isVoid(editor, slateNode);
1241
- };
1242
- const hasStringTarget = (domSelection) => {
1243
- return ((domSelection.anchorNode.parentElement.hasAttribute('data-slate-string') ||
1244
- domSelection.anchorNode.parentElement.hasAttribute('data-slate-zero-width')) &&
1245
- (domSelection.focusNode.parentElement.hasAttribute('data-slate-string') ||
1246
- domSelection.focusNode.parentElement.hasAttribute('data-slate-zero-width')));
1247
- };
1248
- /**
1249
- * remove default insert from composition
1250
- * @param text
1251
- */
1252
- const preventInsertFromComposition = (event, editor) => {
1253
- const types = ['compositionend', 'insertFromComposition'];
1254
- if (!types.includes(event.type)) {
1255
- return;
1256
- }
1257
- const insertText = event.data;
1258
- const window = AngularEditor.getWindow(editor);
1259
- const domSelection = window.getSelection();
1260
- // ensure text node insert composition input text
1261
- if (insertText && domSelection.anchorNode instanceof Text && domSelection.anchorNode.textContent.endsWith(insertText)) {
1262
- const textNode = domSelection.anchorNode;
1263
- textNode.splitText(textNode.length - insertText.length).remove();
1264
- }
1265
- };
1266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvZWRpdGFibGUvZWRpdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvZWRpdGFibGUvZWRpdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFFWCxVQUFVLEVBQ1YsdUJBQXVCLEVBS3ZCLFVBQVUsRUFLVixNQUFNLEVBQ04sTUFBTSxFQUNOLGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsZUFBZSxFQUNmLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ25CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFhLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sY0FBYyxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBR0gsU0FBUyxFQUdULFlBQVksRUFDWixvQkFBb0IsRUFFcEIsY0FBYyxFQUNqQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pI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IElucHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBIb3N0QmluZGluZyxcbiAgICBSZW5kZXJlcjIsXG4gICAgRWxlbWVudFJlZixcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgTmdab25lLFxuICAgIEluamVjdG9yLFxuICAgIGZvcndhcmRSZWYsXG4gICAgT25DaGFuZ2VzLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBEb0NoZWNrLFxuICAgIEluamVjdCxcbiAgICBpbmplY3QsXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTk9ERV9UT19FTEVNRU5ULFxuICAgIElTX0ZPQ1VTRUQsXG4gICAgRURJVE9SX1RPX0VMRU1FTlQsXG4gICAgRUxFTUVOVF9UT19OT0RFLFxuICAgIElTX1JFQURPTkxZLFxuICAgIEVESVRPUl9UT19PTl9DSEFOR0UsXG4gICAgRURJVE9SX1RPX1dJTkRPV1xufSBmcm9tICcuLi8uLi91dGlscy93ZWFrLW1hcHMnO1xuaW1wb3J0IHsgVGV4dCBhcyBTbGF0ZVRleHQsIEVsZW1lbnQsIFRyYW5zZm9ybXMsIEVkaXRvciwgUmFuZ2UsIFBhdGgsIE5vZGVFbnRyeSwgTm9kZSB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IGRpcmVjdGlvbiB9IGZyb20gJ2RpcmVjdGlvbic7XG5pbXBvcnQgc2Nyb2xsSW50b1ZpZXcgZnJvbSAnc2Nyb2xsLWludG8tdmlldy1pZi1uZWVkZWQnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJy4uLy4uL3BsdWdpbnMvYW5ndWxhci1lZGl0b3InO1xuaW1wb3J0IHtcbiAgICBET01FbGVtZW50LFxuICAgIERPTU5vZGUsXG4gICAgaXNET01Ob2RlLFxuICAgIERPTVN0YXRpY1JhbmdlLFxuICAgIERPTVJhbmdlLFxuICAgIGlzRE9NRWxlbWVudCxcbiAgICBpc1BsYWluVGV4dE9ubHlQYXN0ZSxcbiAgICBET01TZWxlY3Rpb24sXG4gICAgZ2V0RGVmYXVsdFZpZXdcbn0gZnJvbSAnLi4vLi4vdXRpbHMvZG9tJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElTX0ZJUkVGT1gsIElTX1NBRkFSSSwgSVNfQ0hST01FLCBIQVNfQkVGT1JFX0lOUFVUX1NVUFBPUlQsIElTX0FORFJPSUQgfSBmcm9tICcuLi8uLi91dGlscy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgSG90a2V5cyBmcm9tICcuLi8uLi91dGlscy9ob3RrZXlzJztcbmltcG9ydCB7IEJlZm9yZUlucHV0RXZlbnQsIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50IH0gZnJvbSAnLi4vLi4vY3VzdG9tLWV2ZW50L0JlZm9yZUlucHV0RXZlbnRQbHVnaW4nO1xuaW1wb3J0IHsgQkVGT1JFX0lOUFVUX0VWRU5UUyB9IGZyb20gJy4uLy4uL2N1c3RvbS1ldmVudC9iZWZvcmUtaW5wdXQtcG9seWZpbGwnO1xuaW1wb3J0IHsgU2xhdGVFcnJvckNvZGUgfSBmcm9tICcuLi8uLi90eXBlcy9lcnJvcic7XG5pbXBvcnQgeyBTbGF0ZVN0cmluZ1RlbXBsYXRlIH0gZnJvbSAnLi4vc3RyaW5nL3RlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNsYXRlQ2hpbGRyZW5Db250ZXh0LCBTbGF0ZVZpZXdDb250ZXh0IH0gZnJvbSAnLi4vLi4vdmlldy9jb250ZXh0JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIFZpZXdUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQgeyBIaXN0b3J5RWRpdG9yIH0gZnJvbSAnc2xhdGUtaGlzdG9yeSc7XG5pbXBvcnQgeyBpc0RlY29yYXRvclJhbmdlTGlzdEVxdWFsLCBjaGVjaywgbm9ybWFsaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgU2xhdGVQbGFjZWhvbGRlciB9IGZyb20gJy4uLy4uL3R5cGVzL2ZlYXR1cmUnO1xuaW1wb3J0IHsgcmVzdG9yZURvbSB9IGZyb20gJy4uLy4uL3V0aWxzL3Jlc3RvcmUtZG9tJztcbmltcG9ydCB7IFNsYXRlQ2hpbGRyZW4gfSBmcm9tICcuLi9jaGlsZHJlbi9jaGlsZHJlbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU0xBVEVfREVGQVVMVF9FTEVNRU5UX0NPTVBPTkVOVF9UT0tFTiB9IGZyb20gJy4uL2VsZW1lbnQvZGVmYXVsdC1lbGVtZW50LmNvbXBvbmVudC50b2tlbic7XG5pbXBvcnQgeyBTTEFURV9ERUZBVUxUX1RFWFRfQ09NUE9ORU5UX1RPS0VOLCBTTEFURV9ERUZBVUxUX1ZPSURfVEVYVF9DT01QT05FTlRfVE9LRU4gfSBmcm9tICcuLi90ZXh0L3Rva2VuJztcbmltcG9ydCB7IFNsYXRlVm9pZFRleHQgfSBmcm9tICcuLi90ZXh0L3ZvaWQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2xhdGVEZWZhdWx0VGV4dCB9IGZyb20gJy4uL3RleHQvZGVmYXVsdC10ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbGF0ZURlZmF1bHRFbGVtZW50IH0gZnJvbSAnLi4vZWxlbWVudC9kZWZhdWx0LWVsZW1lbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFNsYXRlRGVmYXVsdExlYWYgfSBmcm9tICcuLi9sZWFmL2RlZmF1bHQtbGVhZi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU0xBVEVfREVGQVVMVF9MRUFGX0NPTVBPTkVOVF9UT0tFTiB9IGZyb20gJy4uL2xlYWYvdG9rZW4nO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRDb21wb25lbnQsIEJhc2VMZWFmQ29tcG9uZW50LCBCYXNlVGV4dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ZpZXcvYmFzZSc7XG5pbXBvcnQgeyBMaXN0UmVuZGVyIH0gZnJvbSAnLi4vLi4vdmlldy9yZW5kZXIvbGlzdC1yZW5kZXInO1xuaW1wb3J0IHsgVFJJUExFX0NMSUNLIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uc3RhbnRzJztcblxuLy8gbm90IGNvcnJlY3RseSBjbGlwYm9hcmREYXRhIG9uIGJlZm9yZWlucHV0XG5jb25zdCBmb3JjZU9uRE9NUGFzdGUgPSBJU19TQUZBUkk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2xhdGUtZWRpdGFibGUnLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdzbGF0ZS1lZGl0YWJsZS1jb250YWluZXInLFxuICAgICAgICAnW2F0dHIuY29udGVudGVkaXRhYmxlXSc6ICdyZWFkb25seSA/IHVuZGVmaW5lZCA6IHRydWUnLFxuICAgICAgICAnW2F0dHIucm9sZV0nOiBgcmVhZG9ubHkgPyB1bmRlZmluZWQgOiAndGV4dGJveCdgLFxuICAgICAgICAnW2F0dHIuc3BlbGxDaGVja10nOiBgIWhhc0JlZm9yZUlucHV0U3VwcG9ydCA/IGZhbHNlIDogc3BlbGxDaGVja2AsXG4gICAgICAgICdbYXR0ci5hdXRvQ29ycmVjdF0nOiBgIWhhc0JlZm9yZUlucHV0U3VwcG9ydCA/ICdmYWxzZScgOiBhdXRvQ29ycmVjdGAsXG4gICAgICAgICdbYXR0ci5hdXRvQ2FwaXRhbGl6ZV0nOiBgIWhhc0JlZm9yZUlucHV0U3VwcG9ydCA/ICdmYWxzZScgOiBhdXRvQ2FwaXRhbGl6ZWBcbiAgICB9LFxuICAgIHRlbXBsYXRlVXJsOiAnZWRpdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNsYXRlRWRpdGFibGUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogU0xBVEVfREVGQVVMVF9FTEVNRU5UX0NPTVBPTkVOVF9UT0tFTixcbiAgICAgICAgICAgIHVzZVZhbHVlOiBTbGF0ZURlZmF1bHRFbGVtZW50XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFNMQVRFX0RFRkFVTFRfVEVYVF9DT01QT05FTlRfVE9LRU4sXG4gICAgICAgICAgICB1c2VWYWx1ZTogU2xhdGVEZWZhdWx0VGV4dFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBTTEFURV9ERUZBVUxUX1ZPSURfVEVYVF9DT01QT05FTlRfVE9LRU4sXG4gICAgICAgICAgICB1c2VWYWx1ZTogU2xhdGVWb2lkVGV4dFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBTTEFURV9ERUZBVUxUX0xFQUZfQ09NUE9ORU5UX1RPS0VOLFxuICAgICAgICAgICAgdXNlVmFsdWU6IFNsYXRlRGVmYXVsdExlYWZcbiAgICAgICAgfVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbU2xhdGVDaGlsZHJlbiwgU2xhdGVTdHJpbmdUZW1wbGF0ZV1cbn0pXG5leHBvcnQgY2xhc3MgU2xhdGVFZGl0YWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIERvQ2hlY2sge1xuICAgIHZpZXdDb250ZXh0OiBTbGF0ZVZpZXdDb250ZXh0O1xuICAgIGNvbnRleHQ6IFNsYXRlQ2hpbGRyZW5Db250ZXh0O1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgIGlzRHJhZ2dpbmdJbnRlcm5hbGx5ID0gZmFsc2U7XG4gICAgaXNVcGRhdGluZ1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgIGxhdGVzdEVsZW1lbnQgPSBudWxsIGFzIERPTUVsZW1lbnQgfCBudWxsO1xuXG4gICAgcHJvdGVjdGVkIG1hbnVhbExpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIEBJbnB1dCgpIGVkaXRvcjogQW5ndWxhckVkaXRvcjtcblxuICAgIEBJbnB1dCgpIHJlbmRlckVsZW1lbnQ6IChlbGVtZW50OiBFbGVtZW50KSA9PiBWaWV3VHlwZSB8IG51bGw7XG5cbiAgICBASW5wdXQoKSByZW5kZXJMZWFmOiAodGV4dDogU2xhdGVUZXh0KSA9PiBWaWV3VHlwZSB8IG51bGw7XG5cbiAgICBASW5wdXQoKSByZW5kZXJUZXh0OiAodGV4dDogU2xhdGVUZXh0KSA9PiBWaWV3VHlwZSB8IG51bGw7XG5cbiAgICBASW5wdXQoKSBkZWNvcmF0ZTogKGVudHJ5OiBOb2RlRW50cnkpID0+IFJhbmdlW10gPSAoKSA9PiBbXTtcblxuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyRGVjb3JhdGU6IChlZGl0b3I6IEVkaXRvcikgPT4gU2xhdGVQbGFjZWhvbGRlcltdO1xuXG4gICAgQElucHV0KCkgc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXc6IChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIGRvbVJhbmdlOiBET01SYW5nZSkgPT4gdm9pZCA9IGRlZmF1bHRTY3JvbGxTZWxlY3Rpb25JbnRvVmlldztcblxuICAgIEBJbnB1dCgpIGlzU3RyaWN0RGVjb3JhdGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KCkgdHJhY2tCeTogKG5vZGU6IEVsZW1lbnQpID0+IGFueSA9ICgpID0+IG51bGw7XG5cbiAgICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAgIC8vI3JlZ2lvbiBpbnB1dCBldmVudCBoYW5kbGVyXG4gICAgQElucHV0KCkgYmVmb3JlSW5wdXQ6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkgYmx1cjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgICBASW5wdXQoKSBjbGljazogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICAgIEBJbnB1dCgpIGNvbXBvc2l0aW9uRW5kOiAoZXZlbnQ6IENvbXBvc2l0aW9uRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkgY29tcG9zaXRpb25VcGRhdGU6IChldmVudDogQ29tcG9zaXRpb25FdmVudCkgPT4gdm9pZDtcbiAgICBASW5wdXQoKSBjb21wb3NpdGlvblN0YXJ0OiAoZXZlbnQ6IENvbXBvc2l0aW9uRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkgY29weTogKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4gdm9pZDtcbiAgICBASW5wdXQoKSBjdXQ6IChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkgZHJhZ092ZXI6IChldmVudDogRHJhZ0V2ZW50KSA9PiB2b2lkO1xuICAgIEBJbnB1dCgpIGRyYWdTdGFydDogKGV2ZW50OiBEcmFnRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkgZHJhZ0VuZDogKGV2ZW50OiBEcmFnRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkgZHJvcDogKGV2ZW50OiBEcmFnRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkgZm9jdXM6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gICAgQElucHV0KCkga2V5ZG93bjogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICAgIEBJbnB1dCgpIHBhc3RlOiAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB2b2lkO1xuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIERPTSBhdHRyXG4gICAgQElucHV0KCkgc3BlbGxDaGVjayA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGF1dG9Db3JyZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgYXV0b0NhcGl0YWxpemUgPSBmYWxzZTtcblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLXNsYXRlLWVkaXRvcicpIGRhdGFTbGF0ZUVkaXRvciA9IHRydWU7XG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtc2xhdGUtbm9kZScpIGRhdGFTbGF0ZU5vZGUgPSAndmFsdWUnO1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWdyYW1tJykgZGF0YUdyYW1tID0gZmFsc2U7XG5cbiAgICBnZXQgaGFzQmVmb3JlSW5wdXRTdXBwb3J0KCkge1xuICAgICAgICByZXR1cm4gSEFTX0JFRk9SRV9JTlBVVF9TVVBQT1JUO1xuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlQ29tcG9uZW50JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICB0ZW1wbGF0ZUNvbXBvbmVudDogU2xhdGVTdHJpbmdUZW1wbGF0ZTtcblxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlQ29tcG9uZW50JywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICB0ZW1wbGF0ZUVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8YW55PjtcblxuICAgIHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgICBnZXRPdXRsZXRQYXJlbnQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9O1xuXG4gICAgbGlzdFJlbmRlcjogTGlzdFJlbmRlcjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHVibGljIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIEBJbmplY3QoU0xBVEVfREVGQVVMVF9FTEVNRU5UX0NPTVBPTkVOVF9UT0tFTilcbiAgICAgICAgcHVibGljIGRlZmF1bHRFbGVtZW50OiBDb21wb25lbnRUeXBlPEJhc2VFbGVtZW50Q29tcG9uZW50PixcbiAgICAgICAgQEluamVjdChTTEFURV9ERUZBVUxUX1RFWFRfQ09NUE9ORU5UX1RPS0VOKVxuICAgICAgICBwdWJsaWMgZGVmYXVsdFRleHQ6IENvbXBvbmVudFR5cGU8QmFzZVRleHRDb21wb25lbnQ+LFxuICAgICAgICBASW5qZWN0KFNMQVRFX0RFRkFVTFRfVk9JRF9URVhUX0NPTVBPTkVOVF9UT0tFTilcbiAgICAgICAgcHVibGljIGRlZmF1bHRWb2lkVGV4dDogQ29tcG9uZW50VHlwZTxCYXNlVGV4dENvbXBvbmVudD4sXG4gICAgICAgIEBJbmplY3QoU0xBVEVfREVGQVVMVF9MRUFGX0NPTVBPTkVOVF9UT0tFTilcbiAgICAgICAgcHVibGljIGRlZmF1bHRMZWFmOiBDb21wb25lbnRUeXBlPEJhc2VMZWFmQ29tcG9uZW50PlxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmVkaXRvci5pbmplY3RvciA9IHRoaXMuaW5qZWN0b3I7XG4gICAgICAgIHRoaXMuZWRpdG9yLmNoaWxkcmVuID0gW107XG4gICAgICAgIGxldCB3aW5kb3cgPSBnZXREZWZhdWx0Vmlldyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIEVESVRPUl9UT19XSU5ET1cuc2V0KHRoaXMuZWRpdG9yLCB3aW5kb3cpO1xuICAgICAgICBFRElUT1JfVE9fRUxFTUVOVC5zZXQodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgTk9ERV9UT19FTEVNRU5ULnNldCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBFTEVNRU5UX1RPX05PREUuc2V0KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmVkaXRvcik7XG4gICAgICAgIElTX1JFQURPTkxZLnNldCh0aGlzLmVkaXRvciwgdGhpcy5yZWFkb25seSk7XG4gICAgICAgIEVESVRPUl9UT19PTl9DSEFOR0Uuc2V0KHRoaXMuZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3Q29udGV4dCgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVDb250ZXh0KCk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHVudXNlZCBET00sIGp1c3Qga2VlcCB0ZW1wbGF0ZUNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICB0aGlzLnRlbXBsYXRlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIGFkZCBicm93c2VyIGNsYXNzXG4gICAgICAgIGxldCBicm93c2VyQ2xhc3MgPSBJU19GSVJFRk9YID8gJ2ZpcmVmb3gnIDogSVNfU0FGQVJJID8gJ3NhZmFyaScgOiAnJztcbiAgICAgICAgYnJvd3NlckNsYXNzICYmIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYnJvd3NlckNsYXNzKTtcbiAgICAgICAgdGhpcy5saXN0UmVuZGVyID0gbmV3IExpc3RSZW5kZXIodGhpcy52aWV3Q29udGV4dCwgdGhpcy52aWV3Q29udGFpbmVyUmVmLCB0aGlzLmdldE91dGxldFBhcmVudCwgKCkgPT4gbnVsbCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoc2ltcGxlQ2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNvcmF0ZUNoYW5nZSA9IHNpbXBsZUNoYW5nZXNbJ2RlY29yYXRlJ107XG4gICAgICAgIGlmIChkZWNvcmF0ZUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JjZVJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyQ2hhbmdlID0gc2ltcGxlQ2hhbmdlc1sncGxhY2Vob2xkZXInXTtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWRvbmx5Q2hhbmdlID0gc2ltcGxlQ2hhbmdlc1sncmVhZG9ubHknXTtcbiAgICAgICAgaWYgKHJlYWRvbmx5Q2hhbmdlKSB7XG4gICAgICAgICAgICBJU19SRUFET05MWS5zZXQodGhpcy5lZGl0b3IsIHRoaXMucmVhZG9ubHkpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMudG9TbGF0ZVNlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBFbGVtZW50W10pIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3IuY2hpbGRyZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRleHQoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0UmVuZGVyLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0UmVuZGVyLmluaXRpYWxpemUodGhpcy5lZGl0b3IuY2hpbGRyZW4sIHRoaXMuZWRpdG9yLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RSZW5kZXIudXBkYXRlKHRoaXMuZWRpdG9yLmNoaWxkcmVuLCB0aGlzLmVkaXRvciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IEFuZ3VsYXJFZGl0b3IuZ2V0V2luZG93KHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgJ3NlbGVjdGlvbmNoYW5nZScsXG4gICAgICAgICAgICBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b1NsYXRlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50XG4gICAgICAgICk7XG4gICAgICAgIGlmIChIQVNfQkVGT1JFX0lOUFVUX1NVUFBPUlQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCB0aGlzLm9uRE9NQmVmb3JlSW5wdXQuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5vbkRPTUJsdXIuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRE9NQ2xpY2suYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY29tcG9zaXRpb25lbmQnLCB0aGlzLm9uRE9NQ29tcG9zaXRpb25FbmQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY29tcG9zaXRpb251cGRhdGUnLCB0aGlzLm9uRE9NQ29tcG9zaXRpb25VcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY29tcG9zaXRpb25zdGFydCcsIHRoaXMub25ET01Db21wb3NpdGlvblN0YXJ0LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NvcHknLCB0aGlzLm9uRE9NQ29weS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjdXQnLCB0aGlzLm9uRE9NQ3V0LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5vbkRPTURyYWdPdmVyLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMub25ET01EcmFnU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMub25ET01EcmFnRW5kLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLm9uRE9NRHJvcC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMub25ET01Gb2N1cy5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbkRPTUtleWRvd24uYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLm9uRE9NUGFzdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIEJFRk9SRV9JTlBVVF9FVkVOVFMuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQubmFtZSwgKCkgPT4ge30pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b05hdGl2ZVNlbGVjdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSB0aGlzLmVkaXRvcjtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBBbmd1bGFyRWRpdG9yLmZpbmREb2N1bWVudE9yU2hhZG93Um9vdCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICBjb25zdCB7IGFjdGl2ZUVsZW1lbnQgfSA9IHJvb3Q7XG4gICAgICAgICAgICBjb25zdCBkb21TZWxlY3Rpb24gPSAocm9vdCBhcyBEb2N1bWVudCkuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgIGlmICgodGhpcy5pc0NvbXBvc2luZyAmJiAhSVNfQU5EUk9JRCkgfHwgIWRvbVNlbGVjdGlvbiB8fCAhQW5ndWxhckVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBoYXNEb21TZWxlY3Rpb24gPSBkb21TZWxlY3Rpb24udHlwZSAhPT0gJ05vbmUnO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgRE9NIHNlbGVjdGlvbiBpcyBwcm9wZXJseSB1bnNldCwgd2UncmUgZG9uZS5cbiAgICAgICAgICAgIGlmICghc2VsZWN0aW9uICYmICFoYXNEb21TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBET00gc2VsZWN0aW9uIGlzIGFscmVhZHkgY29ycmVjdCwgd2UncmUgZG9uZS5cbiAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBkb20gc2VsZWN0aW9uIGlzIGluIHRoZSBlZGl0b3JcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvckVsZW1lbnQgPSBFRElUT1JfVE9fRUxFTUVOVC5nZXQodGhpcy5lZGl0b3IpITtcbiAgICAgICAgICAgIGxldCBoYXNEb21TZWxlY3Rpb25JbkVkaXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGVkaXRvckVsZW1lbnQuY29udGFpbnMoZG9tU2VsZWN0aW9uLmFuY2hvck5vZGUpICYmIGVkaXRvckVsZW1lbnQuY29udGFpbnMoZG9tU2VsZWN0aW9uLmZvY3VzTm9kZSkpIHtcbiAgICAgICAgICAgICAgICBoYXNEb21TZWxlY3Rpb25JbkVkaXRvciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBET00gc2VsZWN0aW9uIGlzIGluIHRoZSBlZGl0b3IgYW5kIHRoZSBlZGl0b3Igc2VsZWN0aW9uIGlzIGFscmVhZHkgY29ycmVjdCwgd2UncmUgZG9uZS5cbiAgICAgICAgICAgIGlmIChoYXNEb21TZWxlY3Rpb24gJiYgaGFzRG9tU2VsZWN0aW9uSW5FZGl0b3IgJiYgc2VsZWN0aW9uICYmIGhhc1N0cmluZ1RhcmdldChkb21TZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2VGcm9tRE9NU2VsZWN0aW9uID0gQW5ndWxhckVkaXRvci50b1NsYXRlUmFuZ2UodGhpcy5lZGl0b3IsIGRvbVNlbGVjdGlvbiwgeyBzdXBwcmVzc1Rocm93OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZUZyb21ET01TZWxlY3Rpb24gJiYgUmFuZ2UuZXF1YWxzKHJhbmdlRnJvbURPTVNlbGVjdGlvbiwgc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IHVwZGF0aW5nIG5hdGl2ZSBzZWxlY3Rpb24gd2hlbiBhY3RpdmUgZWxlbWVudCBpcyB2b2lkIGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChpc1RhcmdldEluc2lkZVZvaWQodGhpcy5lZGl0b3IsIGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3aGVuIDxFZGl0YWJsZS8+IGlzIGJlaW5nIGNvbnRyb2xsZWQgdGhyb3VnaCBleHRlcm5hbCB2YWx1ZVxuICAgICAgICAgICAgLy8gdGhlbiBpdHMgY2hpbGRyZW4gbWlnaHQganVzdCBjaGFuZ2UgLSBET00gcmVzcG9uZHMgdG8gaXQgb24gaXRzIG93blxuICAgICAgICAgICAgLy8gYnV0IFNsYXRlJ3MgdmFsdWUgaXMgbm90IGJlaW5nIHVwZGF0ZWQgdGhyb3VnaCBhbnkgb3BlcmF0aW9uXG4gICAgICAgICAgICAvLyBhbmQgdGh1cyBpdCBkb2Vzbid0IHRyYW5zZm9ybSBzZWxlY3Rpb24gb24gaXRzIG93blxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiAhQW5ndWxhckVkaXRvci5oYXNSYW5nZSh0aGlzLmVkaXRvciwgc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNlbGVjdGlvbiA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZVJhbmdlKHRoaXMuZWRpdG9yLCBkb21TZWxlY3Rpb24sIHsgc3VwcHJlc3NUaHJvdzogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhlIERPTSBzZWxlY3Rpb24gaXMgb3V0IG9mIHN5bmMsIHNvIHVwZGF0ZSBpdC5cbiAgICAgICAgICAgIGNvbnN0IGVsID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIHRoaXMuaXNVcGRhdGluZ1NlbGVjdGlvbiA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0RvbVJhbmdlID0gc2VsZWN0aW9uICYmIEFuZ3VsYXJFZGl0b3IudG9ET01SYW5nZSh0aGlzLmVkaXRvciwgc2VsZWN0aW9uKTtcblxuICAgICAgICAgICAgaWYgKG5ld0RvbVJhbmdlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ09NUEFUOiBTaW5jZSB0aGUgRE9NIHJhbmdlIGhhcyBubyBjb25jZXB0IG9mIGJhY2t3YXJkcy9mb3J3YXJkc1xuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgYW5kIGRvIHRoZSByaWdodCB0aGluZyBoZXJlLlxuICAgICAgICAgICAgICAgIGlmIChSYW5nZS5pc0JhY2t3YXJkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICAgICAgZG9tU2VsZWN0aW9uLnNldEJhc2VBbmRFeHRlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEb21SYW5nZS5lbmRDb250YWluZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEb21SYW5nZS5lbmRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEb21SYW5nZS5zdGFydENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RvbVJhbmdlLnN0YXJ0T2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICAgICAgZG9tU2VsZWN0aW9uLnNldEJhc2VBbmRFeHRlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEb21SYW5nZS5zdGFydENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RvbVJhbmdlLnN0YXJ0T2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RG9tUmFuZ2UuZW5kQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RG9tUmFuZ2UuZW5kT2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb21TZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzY3JvbGxpbmcgaW4gc2V0VGltZW91dCBiZWNhdXNlIG9mXG4gICAgICAgICAgICAgICAgLy8gZG9tIHNob3VsZCBub3QgaGF2ZSB1cGRhdGVkIGltbWVkaWF0ZWx5IGFmdGVyIGxpc3RSZW5kZXIncyB1cGRhdGluZ1xuICAgICAgICAgICAgICAgIG5ld0RvbVJhbmdlICYmIHRoaXMuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcodGhpcy5lZGl0b3IsIG5ld0RvbVJhbmdlKTtcbiAgICAgICAgICAgICAgICAvLyBDT01QQVQ6IEluIEZpcmVmb3gsIGl0J3Mgbm90IGVub3VnaCB0byBjcmVhdGUgYSByYW5nZSwgeW91IGFsc28gbmVlZFxuICAgICAgICAgICAgICAgIC8vIHRvIGZvY3VzIHRoZSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCB0b28uICgyMDE2LzExLzE2KVxuICAgICAgICAgICAgICAgIGlmIChuZXdEb21SYW5nZSAmJiBJU19GSVJFRk9YKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pc1VwZGF0aW5nU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNsYXRlRXJyb3JDb2RlLlRvTmF0aXZlU2VsZWN0aW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXJyb3I6IGVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNVcGRhdGluZ1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZm9yY2VSZW5kZXIoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMuZWRpdG9yLmNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7fVxuXG4gICAgbmdEb0NoZWNrKCkge31cblxuICAgIGZvcmNlUmVuZGVyKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgdGhpcy5saXN0UmVuZGVyLnVwZGF0ZSh0aGlzLmVkaXRvci5jaGlsZHJlbiwgdGhpcy5lZGl0b3IsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIC8vIHJlcGFpciBjb2xsYWJvcmF0aXZlIGVkaXRpbmcgd2hlbiBDaGluZXNlIGlucHV0IGlzIGludGVycnVwdGVkIGJ5IG90aGVyIHVzZXJzJyBjdXJzb3JzXG4gICAgICAgIC8vIHdoZW4gdGhlIERPTUVsZW1lbnQgd2hlcmUgdGhlIHNlbGVjdGlvbiBpcyBsb2NhdGVkIGlzIHJlbW92ZWRcbiAgICAgICAgLy8gdGhlIGNvbXBvc2l0aW9udXBkYXRlIGFuZCBjb21wb3NpdGlvbmVuZCBldmVudHMgd2lsbCBubyBsb25nZXIgYmUgZmlyZWRcbiAgICAgICAgLy8gc28gaXNDb21wb3NpbmcgbmVlZHMgdG8gYmUgY29ycmVjdGVkXG4gICAgICAgIC8vIG5lZWQgZXhlYyBhZnRlciB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCkgdG8gcmVuZGVyIEhUTUxcbiAgICAgICAgLy8gbmVlZCBleGVjIGJlZm9yZSB0aGlzLnRvTmF0aXZlU2VsZWN0aW9uKCkgdG8gY29ycmVjdCBuYXRpdmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9zaW5nKSB7XG4gICAgICAgICAgICAvLyBDb21wb3NpdGlvbiBpbnB1dCB0ZXh0IGJlIG5vdCByZW5kZXJlZCB3aGVuIHVzZXIgY29tcG9zaXRpb24gaW5wdXQgd2l0aCBzZWxlY3Rpb24gaXMgZXhwYW5kZWRcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgdGltZSwgdGhlIGZvbGxvd2luZyBtYXRjaGluZyBjb25kaXRpb25zIGFyZSBtZXQsIGFzc2lnbiBpc0NvbXBvc2luZyB0byBmYWxzZSwgYW5kIHRoZSBzdGF0dXMgaXMgd3JvbmdcbiAgICAgICAgICAgIC8vIHRoaXMgdGltZSBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgaXNDb21wb3NpaW5nIGlzIGFzc2lnbmVkIGZhbHNlXG4gICAgICAgICAgICAvLyBUaGVyZWZvcmUsIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGNvbXBvc2l0aW9uIGlucHV0IHRleHQgdG8gYmUgcmVuZGVyZWQgYmVmb3JlIHBlcmZvcm1pbmcgY29uZGl0aW9uIG1hdGNoaW5nXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IE5vZGUuZ2V0KHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLnBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRET01Ob2RlID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRleHROb2RlKTtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgICAgICAgICAvLyBza2lwIGRlY29yYXRlIHRleHRcbiAgICAgICAgICAgICAgICB0ZXh0RE9NTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdbZWRpdGFibGUtdGV4dF0nKS5mb3JFYWNoKHN0cmluZ0RPTU5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHN0cmluZ0RPTU5vZGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHplcm9DaGFyID0gJ1xcdUZFRkYnO1xuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgemVybyB3aXRoIGNoYXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCh6ZXJvQ2hhcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LmVuZHNXaXRoKHplcm9DaGFyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCArPSB0ZXh0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChOb2RlLnN0cmluZyh0ZXh0Tm9kZSkuZW5kc1dpdGgodGV4dENvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvTmF0aXZlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy51cGRhdGVDb250ZXh0KCk7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RSZW5kZXIudXBkYXRlKHRoaXMuZWRpdG9yLmNoaWxkcmVuLCB0aGlzLmVkaXRvciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUNvbnRleHQoKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRpb25zID0gdGhpcy5nZW5lcmF0ZURlY29yYXRpb25zKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zZWxlY3Rpb24gIT09IHRoaXMuZWRpdG9yLnNlbGVjdGlvbiB8fFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRlY29yYXRlICE9PSB0aGlzLmRlY29yYXRlIHx8XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVhZG9ubHkgIT09IHRoaXMucmVhZG9ubHkgfHxcbiAgICAgICAgICAgICFpc0RlY29yYXRvclJhbmdlTGlzdEVxdWFsKHRoaXMuY29udGV4dC5kZWNvcmF0aW9ucywgZGVjb3JhdGlvbnMpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5lZGl0b3IsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLmVkaXRvci5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnM6IGRlY29yYXRpb25zLFxuICAgICAgICAgICAgICAgIGRlY29yYXRlOiB0aGlzLmRlY29yYXRlLFxuICAgICAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVDb250ZXh0KCkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSB7XG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLmVkaXRvci5zZWxlY3Rpb24sXG4gICAgICAgICAgICBkZWNvcmF0aW9uczogdGhpcy5nZW5lcmF0ZURlY29yYXRpb25zKCksXG4gICAgICAgICAgICBkZWNvcmF0ZTogdGhpcy5kZWNvcmF0ZSxcbiAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVZpZXdDb250ZXh0KCkge1xuICAgICAgICB0aGlzLnZpZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgZWRpdG9yOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgIHJlbmRlckVsZW1lbnQ6IHRoaXMucmVuZGVyRWxlbWVudCxcbiAgICAgICAgICAgIHJlbmRlckxlYWY6IHRoaXMucmVuZGVyTGVhZixcbiAgICAgICAgICAgIHJlbmRlclRleHQ6IHRoaXMucmVuZGVyVGV4dCxcbiAgICAgICAgICAgIHRyYWNrQnk6IHRoaXMudHJhY2tCeSxcbiAgICAgICAgICAgIGlzU3RyaWN0RGVjb3JhdGU6IHRoaXMuaXNTdHJpY3REZWNvcmF0ZSxcbiAgICAgICAgICAgIHRlbXBsYXRlQ29tcG9uZW50OiB0aGlzLnRlbXBsYXRlQ29tcG9uZW50LFxuICAgICAgICAgICAgZGVmYXVsdEVsZW1lbnQ6IHRoaXMuZGVmYXVsdEVsZW1lbnQsXG4gICAgICAgICAgICBkZWZhdWx0VGV4dDogdGhpcy5kZWZhdWx0VGV4dCxcbiAgICAgICAgICAgIGRlZmF1bHRWb2lkVGV4dDogdGhpcy5kZWZhdWx0Vm9pZFRleHQsXG4gICAgICAgICAgICBkZWZhdWx0TGVhZjogdGhpcy5kZWZhdWx0TGVhZlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbXBvc2VQbGFjZWhvbGRlckRlY29yYXRlKGVkaXRvcjogRWRpdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyRGVjb3JhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyRGVjb3JhdGUoZWRpdG9yKSB8fCBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyICYmIGVkaXRvci5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgQXJyYXkuZnJvbShOb2RlLnRleHRzKGVkaXRvcikpLmxlbmd0aCA9PT0gMSAmJiBOb2RlLnN0cmluZyhlZGl0b3IpID09PSAnJykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcjogc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGZvY3VzOiBzdGFydFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZURlY29yYXRpb25zKCkge1xuICAgICAgICBjb25zdCBkZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdGUoW3RoaXMuZWRpdG9yLCBbXV0pO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlckRlY29yYXRpb25zID0gdGhpcy5pc0NvbXBvc2luZyA/IFtdIDogdGhpcy5jb21wb3NlUGxhY2Vob2xkZXJEZWNvcmF0ZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIGRlY29yYXRpb25zLnB1c2goLi4ucGxhY2Vob2xkZXJEZWNvcmF0aW9ucyk7XG4gICAgICAgIHJldHVybiBkZWNvcmF0aW9ucztcbiAgICB9XG5cbiAgICAvLyNyZWdpb24gZXZlbnQgcHJveHlcbiAgICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyLCB0YXJnZXQ6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLm1hbnVhbExpc3RlbmVycy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIubGlzdGVuKHRhcmdldCwgZXZlbnROYW1lLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlSW5wdXRFdmVudCA9IGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGV2ZW50LnR5cGUsIG51bGwsIGV2ZW50LCBldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmVJbnB1dEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GYWxsYmFja0JlZm9yZUlucHV0KGJlZm9yZUlucHV0RXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihldmVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9TbGF0ZVNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKCghdGhpcy5pc0NvbXBvc2luZyB8fCBJU19BTkRST0lEKSAmJiAhdGhpcy5pc1VwZGF0aW5nU2VsZWN0aW9uICYmICF0aGlzLmlzRHJhZ2dpbmdJbnRlcm5hbGx5KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBBbmd1bGFyRWRpdG9yLmZpbmREb2N1bWVudE9yU2hhZG93Um9vdCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBhY3RpdmVFbGVtZW50IH0gPSByb290O1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkb21TZWxlY3Rpb24gPSAocm9vdCBhcyBEb2N1bWVudCkuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RFbGVtZW50ID0gYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgSVNfRk9DVVNFRC5zZXQodGhpcy5lZGl0b3IsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIElTX0ZPQ1VTRUQuZGVsZXRlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRvbVNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNmb3Jtcy5kZXNlbGVjdCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdG9yRWxlbWVudCA9IEVESVRPUl9UT19FTEVNRU5ULmdldCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRG9tU2VsZWN0aW9uSW5FZGl0b3IgPVxuICAgICAgICAgICAgICAgICAgICBlZGl0b3JFbGVtZW50LmNvbnRhaW5zKGRvbVNlbGVjdGlvbi5hbmNob3JOb2RlKSAmJiBlZGl0b3JFbGVtZW50LmNvbnRhaW5zKGRvbVNlbGVjdGlvbi5mb2N1c05vZGUpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzRG9tU2VsZWN0aW9uSW5FZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZXNlbGVjdCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IHRoZSBzZWxlY3Rpb24gZGlyZWN0bHksIGJlY2F1c2Ugc29tZSB0ZXJyaWJsZSBjYXNlIGNhbiBiZSBub3JtYWxpemUgZm9yIG5vcm1hbGl6ZURPTVBvaW50XG4gICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUsIGRvdWJsZS1jbGljayB0aGUgbGFzdCBjZWxsIG9mIHRoZSB0YWJsZSB0byBzZWxlY3QgYSBub24tZWRpdGFibGUgRE9NXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVSYW5nZSh0aGlzLmVkaXRvciwgZG9tU2VsZWN0aW9uLCB7IGV4YWN0TWF0Y2g6IGZhbHNlLCBzdXBwcmVzc1Rocm93OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0b3Iuc2VsZWN0aW9uICYmIFJhbmdlLmVxdWFscyhyYW5nZSwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uKSAmJiAhaGFzU3RyaW5nVGFyZ2V0KGRvbVNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUYXJnZXRJbnNpZGVWb2lkKHRoaXMuZWRpdG9yLCBhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGFkanVzdCBET01TZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvTmF0aXZlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgcmFuZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5vbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogU2xhdGVFcnJvckNvZGUuVG9TbGF0ZVNlbGVjdGlvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVFcnJvcjogZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25ET01CZWZvcmVJbnB1dChcbiAgICAgICAgZXZlbnQ6IEV2ZW50ICYge1xuICAgICAgICAgICAgaW5wdXRUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICBpc0NvbXBvc2luZzogYm9vbGVhbjtcbiAgICAgICAgICAgIGRhdGE6IHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICBkYXRhVHJhbnNmZXI6IERhdGFUcmFuc2ZlciB8IG51bGw7XG4gICAgICAgICAgICBnZXRUYXJnZXRSYW5nZXMoKTogRE9NU3RhdGljUmFuZ2VbXTtcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICAgICAgY29uc3Qgcm9vdCA9IEFuZ3VsYXJFZGl0b3IuZmluZERvY3VtZW50T3JTaGFkb3dSb290KHRoaXMuZWRpdG9yKTtcbiAgICAgICAgY29uc3QgeyBhY3RpdmVFbGVtZW50IH0gPSByb290O1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuICAgICAgICBjb25zdCB7IGlucHV0VHlwZTogdHlwZSB9ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhVHJhbnNmZXIgfHwgZXZlbnQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChJU19BTkRST0lEKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0UmFuZ2U6IFJhbmdlIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgW25hdGl2ZVRhcmdldFJhbmdlXSA9IGV2ZW50LmdldFRhcmdldFJhbmdlcygpO1xuICAgICAgICAgICAgaWYgKG5hdGl2ZVRhcmdldFJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0UmFuZ2UgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVSYW5nZShlZGl0b3IsIG5hdGl2ZVRhcmdldFJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENPTVBBVDogU2VsZWN0aW9uQ2hhbmdlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaXMgcGVyZm9ybWVkLCBzbyB3ZVxuICAgICAgICAgICAgLy8gaGF2ZSB0byBtYW51YWxseSBnZXQgdGhlIHNlbGVjdGlvbiBoZXJlIHRvIGVuc3VyZSBpdCdzIHVwLXRvLWRhdGUuXG4gICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBBbmd1bGFyRWRpdG9yLmdldFdpbmRvdyhlZGl0b3IpO1xuICAgICAgICAgICAgY29uc3QgZG9tU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXRSYW5nZSAmJiBkb21TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRSYW5nZSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZVJhbmdlKGVkaXRvciwgZG9tU2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhcmdldFJhbmdlID0gdGFyZ2V0UmFuZ2UgPz8gZWRpdG9yLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnaW5zZXJ0Q29tcG9zaXRpb25UZXh0Jykge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEudG9TdHJpbmcoKS5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZURvbShlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvci5pbnNlcnRCcmVhayhlZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZURvbShlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5pbnNlcnRUZXh0KGVkaXRvciwgZGF0YS50b1N0cmluZygpLCB7IGF0OiB0YXJnZXRSYW5nZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZURvbShlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7IGF0OiB0YXJnZXRSYW5nZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RlbGV0ZUNvbnRlbnRCYWNrd2FyZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBnYm9hcmQgY2FuIG5vdCBwcmV2ZW50IGRlZmF1bHQgYWN0aW9uLCBzbyBtdXN0IHVzZSByZXN0b3JlRG9tLFxuICAgICAgICAgICAgICAgIC8vIHNvdWdvdSBLZXlib2FyZCBjYW4gcHJldmVudCBkZWZhdWx0IGFjdGlvbu+8iG9ubHkgaW4gQ2hpbmVzZSBpbnB1dCBtb2Rl77yJLlxuICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIHdlaXJkIGFjdGlvbiBpbiBTb3Vnb3UgS2V5Ym9hcmQsIHVzZSByZXNvdHJlRG9tIG9ubHkgcmFuZ2UncyBpc0NvbGxhcHNlZCBpcyBmYWxzZSAocmVjb2duaXplIGdib2FyZClcbiAgICAgICAgICAgICAgICBpZiAoIVJhbmdlLmlzQ29sbGFwc2VkKHRhcmdldFJhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN0b3JlRG9tKGVkaXRvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7IGF0OiB0YXJnZXRSYW5nZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2luc2VydFRleHQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdG9yZURvbShlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmluc2VydFRleHQoZWRpdG9yLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5yZWFkb25seSAmJlxuICAgICAgICAgICAgaGFzRWRpdGFibGVUYXJnZXQoZWRpdG9yLCBldmVudC50YXJnZXQpICYmXG4gICAgICAgICAgICAhaXNUYXJnZXRJbnNpZGVWb2lkKGVkaXRvciwgYWN0aXZlRWxlbWVudCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLmJlZm9yZUlucHV0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIC8vIENPTVBBVDogSWYgdGhlIHNlbGVjdGlvbiBpcyBleHBhbmRlZCwgZXZlbiBpZiB0aGUgY29tbWFuZCBzZWVtcyBsaWtlXG4gICAgICAgICAgICAgICAgLy8gYSBkZWxldGUgZm9yd2FyZC9iYWNrd2FyZCBjb21tYW5kIGl0IHNob3VsZCBkZWxldGUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIFJhbmdlLmlzRXhwYW5kZWQoc2VsZWN0aW9uKSAmJiB0eXBlLnN0YXJ0c1dpdGgoJ2RlbGV0ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHR5cGUuZW5kc1dpdGgoJ0JhY2t3YXJkJykgPyAnYmFja3dhcmQnIDogJ2ZvcndhcmQnO1xuICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRnJhZ21lbnQoZWRpdG9yLCB7IGRpcmVjdGlvbiB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWxldGVCeUNvbXBvc2l0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVsZXRlQnlDdXQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWxldGVCeURyYWcnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRnJhZ21lbnQoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVsZXRlQ29udGVudCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZUNvbnRlbnRGb3J3YXJkJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZvcndhcmQoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVsZXRlQ29udGVudEJhY2t3YXJkJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZUVudGlyZVNvZnRMaW5lJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKGVkaXRvciwgeyB1bml0OiAnbGluZScgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRm9yd2FyZChlZGl0b3IsIHsgdW5pdDogJ2xpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWxldGVIYXJkTGluZUJhY2t3YXJkJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKGVkaXRvciwgeyB1bml0OiAnYmxvY2snIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWxldGVTb2Z0TGluZUJhY2t3YXJkJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKGVkaXRvciwgeyB1bml0OiAnbGluZScgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZUhhcmRMaW5lRm9yd2FyZCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvci5kZWxldGVGb3J3YXJkKGVkaXRvciwgeyB1bml0OiAnYmxvY2snIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWxldGVTb2Z0TGluZUZvcndhcmQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRm9yd2FyZChlZGl0b3IsIHsgdW5pdDogJ2xpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWxldGVXb3JkQmFja3dhcmQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlQmFja3dhcmQoZWRpdG9yLCB7IHVuaXQ6ICd3b3JkJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVsZXRlV29yZEZvcndhcmQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRm9yd2FyZChlZGl0b3IsIHsgdW5pdDogJ3dvcmQnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnNlcnRMaW5lQnJlYWsnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnNlcnRQYXJhZ3JhcGgnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuaW5zZXJ0QnJlYWsoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5zZXJ0RnJvbUNvbXBvc2l0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ09NUEFUOiBpbiBzYWZhcmksIGBjb21wb3NpdGlvbmVuZGAgZXZlbnQgaXMgZGlzcGF0Y2hlZCBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJlZm9yZWlucHV0IGV2ZW50IHdpdGggdGhlIGlucHV0VHlwZSBcImluc2VydEZyb21Db21wb3NpdGlvblwiIGhhcyBiZWVuIGRpc3BhdGNoZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaW5wdXQtZXZlbnRzLTIvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgZm9sbG93aW5nIGNvZGUgaXMgdGhlIHJpZ2h0IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIERPTSBzZWxlY3Rpb24gaW4gc3luYyB3aWxsIGJlIGV4ZWMgYmVmb3JlIGBjb21wb3NpdGlvbmVuZGAgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzQ29tcG9zaW5nIGlzIHRydWUgd2lsbCBwcmV2ZW50IERPTSBzZWxlY3Rpb24gYmVpbmcgdXBkYXRlIGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRJbnNlcnRGcm9tQ29tcG9zaXRpb24oZXZlbnQsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnNlcnRGcm9tRHJvcCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luc2VydEZyb21QYXN0ZSc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luc2VydEZyb21ZYW5rJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5zZXJ0UmVwbGFjZW1lbnRUZXh0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5zZXJ0VGV4dCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIHdlYWsgY29tcGFyaXNvbiBpbnN0ZWFkIG9mICdpbnN0YW5jZW9mJyB0byBhbGxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvZ3JhbW1hdGljIGFjY2VzcyBvZiBwYXN0ZSBldmVudHMgY29taW5nIGZyb20gZXh0ZXJuYWwgd2luZG93c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSBjeXByZXNzIHdoZXJlIGN5LndpbmRvdyBkb2VzIG5vdCB3b3JrIHJlYWxpYmx5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YT8uY29uc3RydWN0b3IubmFtZSA9PT0gJ0RhdGFUcmFuc2ZlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmd1bGFyRWRpdG9yLmluc2VydERhdGEoZWRpdG9yLCBkYXRhIGFzIERhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvci5pbnNlcnRUZXh0KGVkaXRvciwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iub25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFNsYXRlRXJyb3JDb2RlLk9uRE9NQmVmb3JlSW5wdXRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRE9NQmx1cihldmVudDogRm9jdXNFdmVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnJlYWRvbmx5IHx8XG4gICAgICAgICAgICB0aGlzLmlzVXBkYXRpbmdTZWxlY3Rpb24gfHxcbiAgICAgICAgICAgICFoYXNFZGl0YWJsZVRhcmdldCh0aGlzLmVkaXRvciwgZXZlbnQudGFyZ2V0KSB8fFxuICAgICAgICAgICAgdGhpcy5pc0RPTUV2ZW50SGFuZGxlZChldmVudCwgdGhpcy5ibHVyKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IEFuZ3VsYXJFZGl0b3IuZ2V0V2luZG93KHRoaXMuZWRpdG9yKTtcblxuICAgICAgICAvLyBDT01QQVQ6IElmIHRoZSBjdXJyZW50IGBhY3RpdmVFbGVtZW50YCBpcyBzdGlsbCB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gb25lLCB0aGlzIGlzIGR1ZSB0byB0aGUgd2luZG93IGJlaW5nIGJsdXJyZWQgd2hlbiB0aGUgdGFiXG4gICAgICAgIC8vIGl0c2VsZiBiZWNvbWVzIHVuZm9jdXNlZCwgc28gd2Ugd2FudCB0byBhYm9ydCBlYXJseSB0byBhbGxvdyB0b1xuICAgICAgICAvLyBlZGl0b3IgdG8gc3RheSBmb2N1c2VkIHdoZW4gdGhlIHRhYiBiZWNvbWVzIGZvY3VzZWQgYWdhaW4uXG4gICAgICAgIGNvbnN0IHJvb3QgPSBBbmd1bGFyRWRpdG9yLmZpbmREb2N1bWVudE9yU2hhZG93Um9vdCh0aGlzLmVkaXRvcik7XG4gICAgICAgIGlmICh0aGlzLmxhdGVzdEVsZW1lbnQgPT09IHJvb3QuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyByZWxhdGVkVGFyZ2V0IH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgZWwgPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3IpO1xuXG4gICAgICAgIC8vIENPTVBBVDogVGhlIGV2ZW50IHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZSBmb2N1cyBpcyByZXR1cm5pbmdcbiAgICAgICAgLy8gdG8gdGhlIGVkaXRvciBmcm9tIGFuIGVtYmVkZGVkIGVkaXRhYmxlIGVsZW1lbnQgKGVnLiBhbiA8aW5wdXQ+XG4gICAgICAgIC8vIGVsZW1lbnQgaW5zaWRlIGEgdm9pZCBub2RlKS5cbiAgICAgICAgaWYgKHJlbGF0ZWRUYXJnZXQgPT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDT01QQVQ6IFRoZSBldmVudCBzaG91bGQgYmUgaWdub3JlZCBpZiB0aGUgZm9jdXMgaXMgbW92aW5nIGZyb21cbiAgICAgICAgLy8gdGhlIGVkaXRvciB0byBpbnNpZGUgYSB2b2lkIG5vZGUncyBzcGFjZXIgZWxlbWVudC5cbiAgICAgICAgaWYgKGlzRE9NRWxlbWVudChyZWxhdGVkVGFyZ2V0KSAmJiByZWxhdGVkVGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1zbGF0ZS1zcGFjZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ09NUEFUOiBUaGUgZXZlbnQgc2hvdWxkIGJlIGlnbm9yZWQgaWYgdGhlIGZvY3VzIGlzIG1vdmluZyB0byBhXG4gICAgICAgIC8vIG5vbi0gZWRpdGFibGUgc2VjdGlvbiBvZiBhbiBlbGVtZW50IHRoYXQgaXNuJ3QgYSB2b2lkIG5vZGUgKGVnLlxuICAgICAgICAvLyBhIGxpc3QgaXRlbSBvZiB0aGUgY2hlY2sgbGlzdCBleGFtcGxlKS5cbiAgICAgICAgaWYgKHJlbGF0ZWRUYXJnZXQgIT0gbnVsbCAmJiBpc0RPTU5vZGUocmVsYXRlZFRhcmdldCkgJiYgQW5ndWxhckVkaXRvci5oYXNET01Ob2RlKHRoaXMuZWRpdG9yLCByZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZU5vZGUodGhpcy5lZGl0b3IsIHJlbGF0ZWRUYXJnZXQpO1xuXG4gICAgICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQobm9kZSkgJiYgIXRoaXMuZWRpdG9yLmlzVm9pZChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIElTX0ZPQ1VTRUQuZGVsZXRlKHRoaXMuZWRpdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRE9NQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMucmVhZG9ubHkgJiZcbiAgICAgICAgICAgIGhhc1RhcmdldCh0aGlzLmVkaXRvciwgZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNET01FdmVudEhhbmRsZWQoZXZlbnQsIHRoaXMuY2xpY2spICYmXG4gICAgICAgICAgICBpc0RPTU5vZGUoZXZlbnQudGFyZ2V0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVOb2RlKHRoaXMuZWRpdG9yLCBldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IEFuZ3VsYXJFZGl0b3IuZmluZFBhdGgodGhpcy5lZGl0b3IsIG5vZGUpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBFZGl0b3Iuc3RhcnQodGhpcy5lZGl0b3IsIHBhdGgpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gRWRpdG9yLmVuZCh0aGlzLmVkaXRvciwgcGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Vm9pZCA9IEVkaXRvci52b2lkKHRoaXMuZWRpdG9yLCB7IGF0OiBzdGFydCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFZvaWQgPSBFZGl0b3Iudm9pZCh0aGlzLmVkaXRvciwgeyBhdDogZW5kIH0pO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09PSBUUklQTEVfQ0xJQ0sgJiYgcGF0aC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgIGxldCBibG9ja1BhdGggPSBwYXRoO1xuICAgICAgICAgICAgICAgIGlmICghKEVsZW1lbnQuaXNFbGVtZW50KG5vZGUpICYmIEVkaXRvci5pc0Jsb2NrKHRoaXMuZWRpdG9yLCBub2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBFZGl0b3IuYWJvdmUodGhpcy5lZGl0b3IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiBuID0+IEVsZW1lbnQuaXNFbGVtZW50KG4pICYmIEVkaXRvci5pc0Jsb2NrKHRoaXMuZWRpdG9yLCBuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0OiBwYXRoXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrUGF0aCA9IGJsb2NrPy5bMV0gPz8gcGF0aC5zbGljZSgwLCAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IEVkaXRvci5yYW5nZSh0aGlzLmVkaXRvciwgYmxvY2tQYXRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0YXJ0Vm9pZCAmJlxuICAgICAgICAgICAgICAgIGVuZFZvaWQgJiZcbiAgICAgICAgICAgICAgICBQYXRoLmVxdWFscyhzdGFydFZvaWRbMV0sIGVuZFZvaWRbMV0pICYmXG4gICAgICAgICAgICAgICAgIShBbmd1bGFyRWRpdG9yLmlzQmxvY2tDYXJkTGVmdEN1cnNvcih0aGlzLmVkaXRvcikgfHwgQW5ndWxhckVkaXRvci5pc0Jsb2NrQ2FyZFJpZ2h0Q3Vyc29yKHRoaXMuZWRpdG9yKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gRWRpdG9yLnJhbmdlKHRoaXMuZWRpdG9yLCBzdGFydCk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25ET01Db21wb3NpdGlvblN0YXJ0KGV2ZW50OiBDb21wb3NpdGlvbkV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSB0aGlzLmVkaXRvcjtcbiAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgLy8gc29sdmUgdGhlIHByb2JsZW0gb2YgY3Jvc3Mgbm9kZSBDaGluZXNlIGlucHV0XG4gICAgICAgICAgICBpZiAoUmFuZ2UuaXNFeHBhbmRlZChzZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZyYWdtZW50KHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlUmVuZGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0VkaXRhYmxlVGFyZ2V0KHRoaXMuZWRpdG9yLCBldmVudC50YXJnZXQpICYmICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLmNvbXBvc2l0aW9uU3RhcnQpKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25ET01Db21wb3NpdGlvblVwZGF0ZShldmVudDogQ29tcG9zaXRpb25FdmVudCkge1xuICAgICAgICB0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLmNvbXBvc2l0aW9uVXBkYXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRE9NQ29tcG9zaXRpb25FbmQoZXZlbnQ6IENvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5kYXRhICYmICFSYW5nZS5pc0NvbGxhcHNlZCh0aGlzLmVkaXRvci5zZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLmRlbGV0ZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0VkaXRhYmxlVGFyZ2V0KHRoaXMuZWRpdG9yLCBldmVudC50YXJnZXQpICYmICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLmNvbXBvc2l0aW9uRW5kKSkge1xuICAgICAgICAgICAgLy8gQ09NUEFUOiBJbiBDaHJvbWUvRmlyZWZveCwgYGJlZm9yZWlucHV0YCBldmVudHMgZm9yIGNvbXBvc2l0aW9uc1xuICAgICAgICAgICAgLy8gYXJlbid0IGNvcnJlY3QgYW5kIG5ldmVyIGZpcmUgdGhlIFwiaW5zZXJ0RnJvbUNvbXBvc2l0aW9uXCJcbiAgICAgICAgICAgIC8vIHR5cGUgdGhhdCB3ZSBuZWVkLiBTbyBpbnN0ZWFkLCBpbnNlcnQgd2hlbmV2ZXIgYSBjb21wb3NpdGlvblxuICAgICAgICAgICAgLy8gZW5kcyBzaW5jZSBpdCB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGNvbW1pdHRlZCB0byB0aGUgRE9NLlxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpbmcgPT09IHRydWUgJiYgIUlTX1NBRkFSSSAmJiAhSVNfQU5EUk9JRCAmJiBldmVudC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudEluc2VydEZyb21Db21wb3NpdGlvbihldmVudCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgIEVkaXRvci5pbnNlcnRUZXh0KHRoaXMuZWRpdG9yLCBldmVudC5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ09NUEFUOiBJbiBGaXJlZm94IDg3LjAgQ29tcG9zaXRpb25FbmQgZmlyZSB0d2ljZVxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCBhdm9pZCByZXBlYXQgaXNuZXJ0VGV4dCBieSBpc0NvbXBvc2luZyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25ET01Db3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCB3aW5kb3cgPSBBbmd1bGFyRWRpdG9yLmdldFdpbmRvdyh0aGlzLmVkaXRvcik7XG4gICAgICAgIGNvbnN0IGlzT3V0c2lkZVNsYXRlID0gIWhhc1N0cmluZ1RhcmdldCh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkpICYmIGlzVGFyZ2V0SW5zaWRlVm9pZCh0aGlzLmVkaXRvciwgZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFpc091dHNpZGVTbGF0ZSAmJiBoYXNUYXJnZXQodGhpcy5lZGl0b3IsIGV2ZW50LnRhcmdldCkgJiYgIXRoaXMuaXNET01FdmVudEhhbmRsZWQoZXZlbnQsIHRoaXMuY29weSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBBbmd1bGFyRWRpdG9yLnNldEZyYWdtZW50RGF0YSh0aGlzLmVkaXRvciwgZXZlbnQuY2xpcGJvYXJkRGF0YSwgJ2NvcHknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25ET01DdXQoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkb25seSAmJiBoYXNFZGl0YWJsZVRhcmdldCh0aGlzLmVkaXRvciwgZXZlbnQudGFyZ2V0KSAmJiAhdGhpcy5pc0RPTUV2ZW50SGFuZGxlZChldmVudCwgdGhpcy5jdXQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgQW5ndWxhckVkaXRvci5zZXRGcmFnbWVudERhdGEodGhpcy5lZGl0b3IsIGV2ZW50LmNsaXBib2FyZERhdGEsICdjdXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSB0aGlzLmVkaXRvcjtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IuZGVsZXRlQ3V0RGF0YSh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRE9NRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgICAgICBpZiAoaGFzVGFyZ2V0KHRoaXMuZWRpdG9yLCBldmVudC50YXJnZXQpICYmICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLmRyYWdPdmVyKSkge1xuICAgICAgICAgICAgLy8gT25seSB3aGVuIHRoZSB0YXJnZXQgaXMgdm9pZCwgY2FsbCBgcHJldmVudERlZmF1bHRgIHRvIHNpZ25hbFxuICAgICAgICAgICAgLy8gdGhhdCBkcm9wcyBhcmUgYWxsb3dlZC4gRWRpdGFibGUgY29udGVudCBpcyBkcm9wcGFibGUgYnlcbiAgICAgICAgICAgIC8vIGRlZmF1bHQsIGFuZCBjYWxsaW5nIGBwcmV2ZW50RGVmYXVsdGAgaGlkZXMgdGhlIGN1cnNvci5cbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVOb2RlKHRoaXMuZWRpdG9yLCBldmVudC50YXJnZXQpO1xuXG4gICAgICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQobm9kZSkgJiYgRWRpdG9yLmlzVm9pZCh0aGlzLmVkaXRvciwgbm9kZSkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRPTURyYWdTdGFydChldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkb25seSAmJiBoYXNUYXJnZXQodGhpcy5lZGl0b3IsIGV2ZW50LnRhcmdldCkgJiYgIXRoaXMuaXNET01FdmVudEhhbmRsZWQoZXZlbnQsIHRoaXMuZHJhZ1N0YXJ0KSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZU5vZGUodGhpcy5lZGl0b3IsIGV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gQW5ndWxhckVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgbm9kZSk7XG4gICAgICAgICAgICBjb25zdCB2b2lkTWF0Y2ggPVxuICAgICAgICAgICAgICAgIEVsZW1lbnQuaXNFbGVtZW50KG5vZGUpICYmIChFZGl0b3IuaXNWb2lkKHRoaXMuZWRpdG9yLCBub2RlKSB8fCBFZGl0b3Iudm9pZCh0aGlzLmVkaXRvciwgeyBhdDogcGF0aCwgdm9pZHM6IHRydWUgfSkpO1xuXG4gICAgICAgICAgICAvLyBJZiBzdGFydGluZyBhIGRyYWcgb24gYSB2b2lkIG5vZGUsIG1ha2Ugc3VyZSBpdCBpcyBzZWxlY3RlZFxuICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBzaG93cyB1cCBpbiB0aGUgc2VsZWN0aW9uJ3MgZnJhZ21lbnQuXG4gICAgICAgICAgICBpZiAodm9pZE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBFZGl0b3IucmFuZ2UodGhpcy5lZGl0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCByYW5nZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZ0ludGVybmFsbHkgPSB0cnVlO1xuXG4gICAgICAgICAgICBBbmd1bGFyRWRpdG9yLnNldEZyYWdtZW50RGF0YSh0aGlzLmVkaXRvciwgZXZlbnQuZGF0YVRyYW5zZmVyLCAnZHJhZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRPTURyb3AoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRvbmx5ICYmIGhhc1RhcmdldCh0aGlzLmVkaXRvciwgZXZlbnQudGFyZ2V0KSAmJiAhdGhpcy5pc0RPTUV2ZW50SGFuZGxlZChldmVudCwgdGhpcy5kcm9wKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIC8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGRyYWdnZWQgcmFuZ2UgYmVmb3JlIHVwZGF0aW5nIHNlbGVjdGlvblxuICAgICAgICAgICAgY29uc3QgZHJhZ2dlZFJhbmdlID0gZWRpdG9yLnNlbGVjdGlvbjtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgcmFuZ2Ugd2hlcmUgdGhlIGRyb3AgaGFwcGVuZWRcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gQW5ndWxhckVkaXRvci5maW5kRXZlbnRSYW5nZShlZGl0b3IsIGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhVHJhbnNmZXI7XG5cbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgcmFuZ2UpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nSW50ZXJuYWxseSkge1xuICAgICAgICAgICAgICAgIGlmIChkcmFnZ2VkUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdDogZHJhZ2dlZFJhbmdlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZ0ludGVybmFsbHkgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQW5ndWxhckVkaXRvci5pbnNlcnREYXRhKGVkaXRvciwgZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIFdoZW4gZHJhZ2dpbmcgZnJvbSBhbm90aGVyIHNvdXJjZSBpbnRvIHRoZSBlZGl0b3IsIGl0J3MgcG9zc2libGVcbiAgICAgICAgICAgIC8vIHRoYXQgdGhlIGN1cnJlbnQgZWRpdG9yIGRvZXMgbm90IGhhdmUgZm9jdXMuXG4gICAgICAgICAgICBpZiAoIUFuZ3VsYXJFZGl0b3IuaXNGb2N1c2VkKGVkaXRvcikpIHtcbiAgICAgICAgICAgICAgICBBbmd1bGFyRWRpdG9yLmZvY3VzKGVkaXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRE9NRHJhZ0VuZChldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnJlYWRvbmx5ICYmXG4gICAgICAgICAgICB0aGlzLmlzRHJhZ2dpbmdJbnRlcm5hbGx5ICYmXG4gICAgICAgICAgICBoYXNUYXJnZXQodGhpcy5lZGl0b3IsIGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLmRyYWdFbmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nSW50ZXJuYWxseSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRPTUZvY3VzKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5yZWFkb25seSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNVcGRhdGluZ1NlbGVjdGlvbiAmJlxuICAgICAgICAgICAgaGFzRWRpdGFibGVUYXJnZXQodGhpcy5lZGl0b3IsIGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLmZvY3VzKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBBbmd1bGFyRWRpdG9yLmZpbmREb2N1bWVudE9yU2hhZG93Um9vdCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICB0aGlzLmxhdGVzdEVsZW1lbnQgPSByb290LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIENPTVBBVDogSWYgdGhlIGVkaXRvciBoYXMgbmVzdGVkIGVkaXRhYmxlIGVsZW1lbnRzLCB0aGUgZm9jdXNcbiAgICAgICAgICAgIC8vIGNhbiBnbyB0byB0aGVtLiBJbiBGaXJlZm94LCB0aGlzIG11c3QgYmUgcHJldmVudGVkIGJlY2F1c2UgaXRcbiAgICAgICAgICAgIC8vIHJlc3VsdHMgaW4gaXNzdWVzIHdpdGgga2V5Ym9hcmQgbmF2aWdhdGlvbi4gKDIwMTcvMDMvMzApXG4gICAgICAgICAgICBpZiAoSVNfRklSRUZPWCAmJiBldmVudC50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElTX0ZPQ1VTRUQuc2V0KHRoaXMuZWRpdG9yLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25ET01LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICAgICAgICBjb25zdCByb290ID0gQW5ndWxhckVkaXRvci5maW5kRG9jdW1lbnRPclNoYWRvd1Jvb3QodGhpcy5lZGl0b3IpO1xuICAgICAgICBjb25zdCB7IGFjdGl2ZUVsZW1lbnQgfSA9IHJvb3Q7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnJlYWRvbmx5ICYmXG4gICAgICAgICAgICBoYXNFZGl0YWJsZVRhcmdldChlZGl0b3IsIGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICFpc1RhcmdldEluc2lkZVZvaWQoZWRpdG9yLCBhY3RpdmVFbGVtZW50KSAmJiAvLyBzdG9wIGZpcmUga2V5ZG93biBoYW5kbGUgd2hlbiBmb2N1cyB2b2lkIG5vZGVcbiAgICAgICAgICAgICF0aGlzLmlzQ29tcG9zaW5nICYmXG4gICAgICAgICAgICAhdGhpcy5pc0RPTUV2ZW50SGFuZGxlZChldmVudCwgdGhpcy5rZXlkb3duKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZWRpdG9yLmNoaWxkcmVuW3NlbGVjdGlvbiAhPT0gbnVsbCA/IHNlbGVjdGlvbi5mb2N1cy5wYXRoWzBdIDogMF07XG4gICAgICAgICAgICBjb25zdCBpc1JUTCA9IGRpcmVjdGlvbihOb2RlLnN0cmluZyhlbGVtZW50KSkgPT09ICdydGwnO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIENPTVBBVDogU2luY2Ugd2UgcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvblxuICAgICAgICAgICAgICAgIC8vIGBiZWZvcmVpbnB1dGAgZXZlbnRzLCB0aGUgYnJvd3NlciBkb2Vzbid0IHRoaW5rIHRoZXJlJ3MgZXZlclxuICAgICAgICAgICAgICAgIC8vIGFueSBoaXN0b3J5IHN0YWNrIHRvIHVuZG8gb3IgcmVkbywgc28gd2UgaGF2ZSB0byBtYW5hZ2UgdGhlc2VcbiAgICAgICAgICAgICAgICAvLyBob3RrZXlzIG91cnNlbHZlcy4gKDIwMTkvMTEvMDYpXG4gICAgICAgICAgICAgICAgaWYgKEhvdGtleXMuaXNSZWRvKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChIaXN0b3J5RWRpdG9yLmlzSGlzdG9yeUVkaXRvcihlZGl0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVkbygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChIb3RrZXlzLmlzVW5kbyhuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoSGlzdG9yeUVkaXRvci5pc0hpc3RvcnlFZGl0b3IoZWRpdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnVuZG8oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDT01QQVQ6IENlcnRhaW4gYnJvd3NlcnMgZG9uJ3QgaGFuZGxlIHRoZSBzZWxlY3Rpb24gdXBkYXRlc1xuICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5LiBJbiBDaHJvbWUsIHRoZSBzZWxlY3Rpb24gaXNuJ3QgcHJvcGVybHkgZXh0ZW5kZWQuXG4gICAgICAgICAgICAgICAgLy8gQW5kIGluIEZpcmVmb3gsIHRoZSBzZWxlY3Rpb24gaXNuJ3QgcHJvcGVybHkgY29sbGFwc2VkLlxuICAgICAgICAgICAgICAgIC8vICgyMDE3LzEwLzE3KVxuICAgICAgICAgICAgICAgIGlmIChIb3RrZXlzLmlzTW92ZUxpbmVCYWNrd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5tb3ZlKGVkaXRvciwgeyB1bml0OiAnbGluZScsIHJldmVyc2U6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc01vdmVMaW5lRm9yd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5tb3ZlKGVkaXRvciwgeyB1bml0OiAnbGluZScgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc0V4dGVuZExpbmVCYWNrd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5tb3ZlKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWRnZTogJ2ZvY3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2U6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc0V4dGVuZExpbmVGb3J3YXJkKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLm1vdmUoZWRpdG9yLCB7IHVuaXQ6ICdsaW5lJywgZWRnZTogJ2ZvY3VzJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENPTVBBVDogSWYgYSB2b2lkIG5vZGUgaXMgc2VsZWN0ZWQsIG9yIGEgemVyby13aWR0aCB0ZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAvLyBhZGphY2VudCB0byBhbiBpbmxpbmUgaXMgc2VsZWN0ZWQsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZXNlXG4gICAgICAgICAgICAgICAgLy8gaG90a2V5cyBtYW51YWxseSBiZWNhdXNlIGJyb3dzZXJzIHdvbid0IGJlIGFibGUgdG8gc2tpcCBvdmVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHZvaWQgbm9kZSB3aXRoIHRoZSB6ZXJvLXdpZHRoIHNwYWNlIG5vdCBiZWluZyBhbiBlbXB0eVxuICAgICAgICAgICAgICAgIC8vIHN0cmluZy5cbiAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc01vdmVCYWNrd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIFJhbmdlLmlzQ29sbGFwc2VkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMubW92ZShlZGl0b3IsIHsgcmV2ZXJzZTogIWlzUlRMIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5jb2xsYXBzZShlZGl0b3IsIHsgZWRnZTogJ3N0YXJ0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc01vdmVGb3J3YXJkKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgUmFuZ2UuaXNDb2xsYXBzZWQoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5tb3ZlKGVkaXRvciwgeyByZXZlcnNlOiBpc1JUTCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuY29sbGFwc2UoZWRpdG9yLCB7IGVkZ2U6ICdlbmQnIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChIb3RrZXlzLmlzTW92ZVdvcmRCYWNrd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIFJhbmdlLmlzRXhwYW5kZWQoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5jb2xsYXBzZShlZGl0b3IsIHsgZWRnZTogJ2ZvY3VzJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMubW92ZShlZGl0b3IsIHsgdW5pdDogJ3dvcmQnLCByZXZlcnNlOiAhaXNSVEwgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc01vdmVXb3JkRm9yd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIFJhbmdlLmlzRXhwYW5kZWQoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5jb2xsYXBzZShlZGl0b3IsIHsgZWRnZTogJ2ZvY3VzJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMubW92ZShlZGl0b3IsIHsgdW5pdDogJ3dvcmQnLCByZXZlcnNlOiBpc1JUTCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENPTVBBVDogQ2VydGFpbiBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSBgYmVmb3JlaW5wdXRgIGV2ZW50LCBzbyB3ZVxuICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBndWVzc2luZyBhdCB0aGUgaW5wdXQgaW50ZW50aW9uIGZvciBob3RrZXlzLlxuICAgICAgICAgICAgICAgIC8vIENPTVBBVDogSW4gaU9TLCBzb21lIG9mIHRoZXNlIGhvdGtleXMgYXJlIGhhbmRsZWQgaW4gdGhlXG4gICAgICAgICAgICAgICAgaWYgKCFIQVNfQkVGT1JFX0lOUFVUX1NVUFBPUlQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIGNvcmUgYmVoYXZpb3IgZm9yIHRoZXNlLCBidXQgdGhleSBjaGFuZ2UgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIERPTSBpZiB3ZSBkb24ndCBwcmV2ZW50IHRoZW0sIHNvIHdlIGhhdmUgdG8uXG4gICAgICAgICAgICAgICAgICAgIGlmIChIb3RrZXlzLmlzQm9sZChuYXRpdmVFdmVudCkgfHwgSG90a2V5cy5pc0l0YWxpYyhuYXRpdmVFdmVudCkgfHwgSG90a2V5cy5pc1RyYW5zcG9zZUNoYXJhY3RlcihuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc1NwbGl0QmxvY2sobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmluc2VydEJyZWFrKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc0RlbGV0ZUJhY2t3YXJkKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBSYW5nZS5pc0V4cGFuZGVkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRnJhZ21lbnQoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2JhY2t3YXJkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlQmFja3dhcmQoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEhvdGtleXMuaXNEZWxldGVGb3J3YXJkKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBSYW5nZS5pc0V4cGFuZGVkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRnJhZ21lbnQoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2ZvcndhcmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvci5kZWxldGVGb3J3YXJkKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChIb3RrZXlzLmlzRGVsZXRlTGluZUJhY2t3YXJkKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBSYW5nZS5pc0V4cGFuZGVkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRnJhZ21lbnQoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2JhY2t3YXJkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlQmFja3dhcmQoZWRpdG9yLCB7IHVuaXQ6ICdsaW5lJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEhvdGtleXMuaXNEZWxldGVMaW5lRm9yd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgUmFuZ2UuaXNFeHBhbmRlZChzZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZyYWdtZW50KGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdmb3J3YXJkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRm9yd2FyZChlZGl0b3IsIHsgdW5pdDogJ2xpbmUnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoSG90a2V5cy5pc0RlbGV0ZVdvcmRCYWNrd2FyZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgUmFuZ2UuaXNFeHBhbmRlZChzZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZyYWdtZW50KGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdiYWNrd2FyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKGVkaXRvciwgeyB1bml0OiAnd29yZCcgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChIb3RrZXlzLmlzRGVsZXRlV29yZEZvcndhcmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIFJhbmdlLmlzRXhwYW5kZWQoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvci5kZWxldGVGcmFnbWVudChlZGl0b3IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnZm9yd2FyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZvcndhcmQoZWRpdG9yLCB7IHVuaXQ6ICd3b3JkJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElTX0NIUk9NRSB8fCBJU19TQUZBUkkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTVBBVDogQ2hyb21lIGFuZCBTYWZhcmkgc3VwcG9ydCBgYmVmb3JlaW5wdXRgIGV2ZW50IGJ1dCBkbyBub3QgZmlyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gZXZlbnQgd2hlbiBkZWxldGluZyBiYWNrd2FyZHMgaW4gYSBzZWxlY3RlZCB2b2lkIGlubGluZSBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhvdGtleXMuaXNEZWxldGVCYWNrd2FyZChuYXRpdmVFdmVudCkgfHwgSG90a2V5cy5pc0RlbGV0ZUZvcndhcmQobmF0aXZlRXZlbnQpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlLmlzQ29sbGFwc2VkKHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gTm9kZS5wYXJlbnQoZWRpdG9yLCBzZWxlY3Rpb24uYW5jaG9yLnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5pc0VsZW1lbnQoY3VycmVudE5vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvci5pc1ZvaWQoZWRpdG9yLCBjdXJyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVkaXRvci5pc0lubGluZShlZGl0b3IsIGN1cnJlbnROb2RlKSB8fCBFZGl0b3IuaXNCbG9jayhlZGl0b3IsIGN1cnJlbnROb2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogJ2Jsb2NrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iub25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFNsYXRlRXJyb3JDb2RlLk9uRE9NS2V5ZG93bkVycm9yLFxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVFcnJvcjogZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25ET01QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy8gQ09NUEFUOiBDZXJ0YWluIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgdGhlIGBiZWZvcmVpbnB1dGAgZXZlbnQsIHNvIHdlXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBSZWFjdCdzIGBvblBhc3RlYCBoZXJlIGluc3RlYWQuXG4gICAgICAgIC8vIENPTVBBVDogRmlyZWZveCwgQ2hyb21lIGFuZCBTYWZhcmkgYXJlIG5vdCBlbWl0dGluZyBgYmVmb3JlaW5wdXRgIGV2ZW50c1xuICAgICAgICAvLyB3aGVuIFwicGFzdGUgd2l0aG91dCBmb3JtYXR0aW5nXCIgb3B0aW9uIGlzIHVzZWQuXG4gICAgICAgIC8vIFRoaXMgdW5mb3J0dW5hdGVseSBuZWVkcyB0byBiZSBoYW5kbGVkIHdpdGggcGFzdGUgZXZlbnRzIGluc3RlYWQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50LCB0aGlzLnBhc3RlKSAmJlxuICAgICAgICAgICAgKCFIQVNfQkVGT1JFX0lOUFVUX1NVUFBPUlQgfHwgaXNQbGFpblRleHRPbmx5UGFzdGUoZXZlbnQpIHx8IGZvcmNlT25ET01QYXN0ZSkgJiZcbiAgICAgICAgICAgICF0aGlzLnJlYWRvbmx5ICYmXG4gICAgICAgICAgICBoYXNFZGl0YWJsZVRhcmdldCh0aGlzLmVkaXRvciwgZXZlbnQudGFyZ2V0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBBbmd1bGFyRWRpdG9yLmluc2VydERhdGEodGhpcy5lZGl0b3IsIGV2ZW50LmNsaXBib2FyZERhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkZhbGxiYWNrQmVmb3JlSW5wdXQoZXZlbnQ6IEJlZm9yZUlucHV0RXZlbnQpIHtcbiAgICAgICAgLy8gQ09NUEFUOiBDZXJ0YWluIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgdGhlIGBiZWZvcmVpbnB1dGAgZXZlbnQsIHNvIHdlXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBSZWFjdCdzIGxlYWt5IHBvbHlmaWxsIGluc3RlYWQganVzdCBmb3IgaXQuIEl0XG4gICAgICAgIC8vIG9ubHkgd29ya3MgZm9yIHRoZSBgaW5zZXJ0VGV4dGAgaW5wdXQgdHlwZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIUhBU19CRUZPUkVfSU5QVVRfU1VQUE9SVCAmJlxuICAgICAgICAgICAgIXRoaXMucmVhZG9ubHkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50Lm5hdGl2ZUV2ZW50LCB0aGlzLmJlZm9yZUlucHV0KSAmJlxuICAgICAgICAgICAgaGFzRWRpdGFibGVUYXJnZXQodGhpcy5lZGl0b3IsIGV2ZW50Lm5hdGl2ZUV2ZW50LnRhcmdldClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBldmVudC5uYXRpdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoIVJhbmdlLmlzQ29sbGFwc2VkKHRoaXMuZWRpdG9yLnNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZyYWdtZW50KHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8ganVzdCBoYW5kbGUgTm9uLUlNRSBpbnB1dFxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0NvbXBvc2luZykge1xuICAgICAgICAgICAgICAgICAgICBFZGl0b3IuaW5zZXJ0VGV4dCh0aGlzLmVkaXRvciwgdGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5vbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogU2xhdGVFcnJvckNvZGUuVG9OYXRpdmVTZWxlY3Rpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRE9NRXZlbnRIYW5kbGVkKGV2ZW50OiBFdmVudCwgaGFuZGxlcj86IChldmVudDogRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICAgIHJldHVybiBldmVudC5kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBOT0RFX1RPX0VMRU1FTlQuZGVsZXRlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy5tYW51YWxMaXN0ZW5lcnMuZm9yRWFjaChtYW51YWxMaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICBtYW51YWxMaXN0ZW5lcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICBFRElUT1JfVE9fT05fQ0hBTkdFLmRlbGV0ZSh0aGlzLmVkaXRvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFNjcm9sbFNlbGVjdGlvbkludG9WaWV3ID0gKGVkaXRvcjogQW5ndWxhckVkaXRvciwgZG9tUmFuZ2U6IERPTVJhbmdlKSA9PiB7XG4gICAgLy8gVGhpcyB3YXMgYWZmZWN0aW5nIHRoZSBzZWxlY3Rpb24gb2YgbXVsdGlwbGUgYmxvY2tzIGFuZCBkcmFnZ2luZyBiZWhhdmlvcixcbiAgICAvLyBzbyBlbmFibGVkIG9ubHkgaWYgdGhlIHNlbGVjdGlvbiBoYXMgYmVlbiBjb2xsYXBzZWQuXG4gICAgaWYgKGRvbVJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiAoIWVkaXRvci5zZWxlY3Rpb24gfHwgKGVkaXRvci5zZWxlY3Rpb24gJiYgUmFuZ2UuaXNDb2xsYXBzZWQoZWRpdG9yLnNlbGVjdGlvbikpKSkge1xuICAgICAgICBjb25zdCBsZWFmRWwgPSBkb21SYW5nZS5zdGFydENvbnRhaW5lci5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgbGVhZkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9IGRvbVJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdC5iaW5kKGRvbVJhbmdlKTtcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXcobGVhZkVsLCB7XG4gICAgICAgICAgICBzY3JvbGxNb2RlOiAnaWYtbmVlZGVkJ1xuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIGxlYWZFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3Q7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIGVkaXRhYmxlIGFuZCBpbiB0aGUgZWRpdG9yLlxuICovXG5cbmV4cG9ydCBjb25zdCBoYXNFZGl0YWJsZVRhcmdldCA9IChlZGl0b3I6IEFuZ3VsYXJFZGl0b3IsIHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogdGFyZ2V0IGlzIERPTU5vZGUgPT4ge1xuICAgIHJldHVybiBpc0RPTU5vZGUodGFyZ2V0KSAmJiBBbmd1bGFyRWRpdG9yLmhhc0RPTU5vZGUoZWRpdG9yLCB0YXJnZXQsIHsgZWRpdGFibGU6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHR3byBET00gcmFuZ2Ugb2JqZWN0cyBhcmUgZXF1YWwuXG4gKi9cbmNvbnN0IGlzUmFuZ2VFcXVhbCA9IChhOiBET01SYW5nZSwgYjogRE9NUmFuZ2UpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoYS5zdGFydENvbnRhaW5lciA9PT0gYi5zdGFydENvbnRhaW5lciAmJlxuICAgICAgICAgICAgYS5zdGFydE9mZnNldCA9PT0gYi5zdGFydE9mZnNldCAmJlxuICAgICAgICAgICAgYS5lbmRDb250YWluZXIgPT09IGIuZW5kQ29udGFpbmVyICYmXG4gICAgICAgICAgICBhLmVuZE9mZnNldCA9PT0gYi5lbmRPZmZzZXQpIHx8XG4gICAgICAgIChhLnN0YXJ0Q29udGFpbmVyID09PSBiLmVuZENvbnRhaW5lciAmJlxuICAgICAgICAgICAgYS5zdGFydE9mZnNldCA9PT0gYi5lbmRPZmZzZXQgJiZcbiAgICAgICAgICAgIGEuZW5kQ29udGFpbmVyID09PSBiLnN0YXJ0Q29udGFpbmVyICYmXG4gICAgICAgICAgICBhLmVuZE9mZnNldCA9PT0gYi5zdGFydE9mZnNldClcbiAgICApO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIGluIHRoZSBlZGl0b3IuXG4gKi9cblxuY29uc3QgaGFzVGFyZ2V0ID0gKGVkaXRvcjogQW5ndWxhckVkaXRvciwgdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwpOiB0YXJnZXQgaXMgRE9NTm9kZSA9PiB7XG4gICAgcmV0dXJuIGlzRE9NTm9kZSh0YXJnZXQpICYmIEFuZ3VsYXJFZGl0b3IuaGFzRE9NTm9kZShlZGl0b3IsIHRhcmdldCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgaW5zaWRlIHZvaWQgYW5kIGluIHRoZSBlZGl0b3IuXG4gKi9cblxuY29uc3QgaXNUYXJnZXRJbnNpZGVWb2lkID0gKGVkaXRvcjogQW5ndWxhckVkaXRvciwgdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBzbGF0ZU5vZGUgPSBoYXNUYXJnZXQoZWRpdG9yLCB0YXJnZXQpICYmIEFuZ3VsYXJFZGl0b3IudG9TbGF0ZU5vZGUoZWRpdG9yLCB0YXJnZXQsIHsgc3VwcHJlc3NUaHJvdzogdHJ1ZSB9KTtcbiAgICByZXR1cm4gc2xhdGVOb2RlICYmIEVsZW1lbnQuaXNFbGVtZW50KHNsYXRlTm9kZSkgJiYgRWRpdG9yLmlzVm9pZChlZGl0b3IsIHNsYXRlTm9kZSk7XG59O1xuXG5jb25zdCBoYXNTdHJpbmdUYXJnZXQgPSAoZG9tU2VsZWN0aW9uOiBET01TZWxlY3Rpb24pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoZG9tU2VsZWN0aW9uLmFuY2hvck5vZGUucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtc3RyaW5nJykgfHxcbiAgICAgICAgICAgIGRvbVNlbGVjdGlvbi5hbmNob3JOb2RlLnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLXNsYXRlLXplcm8td2lkdGgnKSkgJiZcbiAgICAgICAgKGRvbVNlbGVjdGlvbi5mb2N1c05vZGUucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtc3RyaW5nJykgfHxcbiAgICAgICAgICAgIGRvbVNlbGVjdGlvbi5mb2N1c05vZGUucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2xhdGUtemVyby13aWR0aCcpKVxuICAgICk7XG59O1xuXG4vKipcbiAqIHJlbW92ZSBkZWZhdWx0IGluc2VydCBmcm9tIGNvbXBvc2l0aW9uXG4gKiBAcGFyYW0gdGV4dFxuICovXG5jb25zdCBwcmV2ZW50SW5zZXJ0RnJvbUNvbXBvc2l0aW9uID0gKGV2ZW50OiBFdmVudCwgZWRpdG9yOiBBbmd1bGFyRWRpdG9yKSA9PiB7XG4gICAgY29uc3QgdHlwZXMgPSBbJ2NvbXBvc2l0aW9uZW5kJywgJ2luc2VydEZyb21Db21wb3NpdGlvbiddO1xuICAgIGlmICghdHlwZXMuaW5jbHVkZXMoZXZlbnQudHlwZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnNlcnRUZXh0ID0gKGV2ZW50IGFzIENvbXBvc2l0aW9uRXZlbnQpLmRhdGE7XG4gICAgY29uc3Qgd2luZG93ID0gQW5ndWxhckVkaXRvci5nZXRXaW5kb3coZWRpdG9yKTtcbiAgICBjb25zdCBkb21TZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgLy8gZW5zdXJlIHRleHQgbm9kZSBpbnNlcnQgY29tcG9zaXRpb24gaW5wdXQgdGV4dFxuICAgIGlmIChpbnNlcnRUZXh0ICYmIGRvbVNlbGVjdGlvbi5hbmNob3JOb2RlIGluc3RhbmNlb2YgVGV4dCAmJiBkb21TZWxlY3Rpb24uYW5jaG9yTm9kZS50ZXh0Q29udGVudC5lbmRzV2l0aChpbnNlcnRUZXh0KSkge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvbVNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgICB0ZXh0Tm9kZS5zcGxpdFRleHQodGV4dE5vZGUubGVuZ3RoIC0gaW5zZXJ0VGV4dC5sZW5ndGgpLnJlbW92ZSgpO1xuICAgIH1cbn07XG4iLCI8c2xhdGUtc3RyaW5nLXRlbXBsYXRlICN0ZW1wbGF0ZUNvbXBvbmVudD48L3NsYXRlLXN0cmluZy10ZW1wbGF0ZT5cbiJdfQ==