@sitecore-jss/sitecore-jss-angular 21.6.2-canary.2 → 21.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +202 -202
- package/README.md +7 -7
- package/angular.json +48 -48
- package/dist/README.md +7 -7
- package/dist/components/data-resolver-factory.d.ts +13 -13
- package/dist/components/date.directive.d.ts +20 -20
- package/dist/components/editframe.component.d.ts +22 -22
- package/dist/components/file.directive.d.ts +17 -17
- package/dist/components/generic-link.directive.d.ts +20 -20
- package/dist/components/guard-resolver-factory.d.ts +11 -11
- package/dist/components/hidden-rendering.component.d.ts +7 -7
- package/dist/components/image.directive.d.ts +35 -35
- package/dist/components/link.directive.d.ts +26 -26
- package/dist/components/missing-component.component.d.ts +7 -7
- package/dist/components/placeholder-loading.directive.d.ts +8 -8
- package/dist/components/placeholder.component.d.ts +59 -59
- package/dist/components/placeholder.token.d.ts +64 -64
- package/dist/components/raw.component.d.ts +12 -12
- package/dist/components/render-component.component.d.ts +33 -33
- package/dist/components/render-each.directive.d.ts +8 -8
- package/dist/components/render-empty.directive.d.ts +8 -8
- package/dist/components/rendering-field.d.ts +41 -41
- package/dist/components/rendering.d.ts +5 -5
- package/dist/components/rich-text.directive.d.ts +18 -18
- package/dist/components/router-link.directive.d.ts +19 -19
- package/dist/components/text.directive.d.ts +16 -16
- package/dist/esm2022/components/data-resolver-factory.mjs +58 -58
- package/dist/esm2022/components/date.directive.mjs +67 -67
- package/dist/esm2022/components/editframe.component.mjs +70 -70
- package/dist/esm2022/components/file.directive.mjs +48 -48
- package/dist/esm2022/components/generic-link.directive.mjs +67 -67
- package/dist/esm2022/components/guard-resolver-factory.mjs +85 -85
- package/dist/esm2022/components/hidden-rendering.component.mjs +20 -20
- package/dist/esm2022/components/image.directive.mjs +150 -150
- package/dist/esm2022/components/link.directive.mjs +122 -122
- package/dist/esm2022/components/missing-component.component.mjs +16 -16
- package/dist/esm2022/components/placeholder-loading.directive.mjs +16 -16
- package/dist/esm2022/components/placeholder.component.mjs +271 -271
- package/dist/esm2022/components/placeholder.token.mjs +27 -27
- package/dist/esm2022/components/raw.component.mjs +38 -38
- package/dist/esm2022/components/render-component.component.mjs +98 -98
- package/dist/esm2022/components/render-each.directive.mjs +16 -16
- package/dist/esm2022/components/render-empty.directive.mjs +16 -16
- package/dist/esm2022/components/rendering-field.mjs +1 -1
- package/dist/esm2022/components/rendering.mjs +7 -7
- package/dist/esm2022/components/rich-text.directive.mjs +68 -68
- package/dist/esm2022/components/router-link.directive.mjs +49 -49
- package/dist/esm2022/components/text.directive.mjs +61 -61
- package/dist/esm2022/jss-component-factory.service.mjs +87 -87
- package/dist/esm2022/lib.module.mjs +160 -160
- package/dist/esm2022/public_api.mjs +24 -24
- package/dist/esm2022/sitecore-jss-sitecore-jss-angular.mjs +4 -4
- package/dist/esm2022/utils.mjs +16 -16
- package/dist/fesm2022/sitecore-jss-sitecore-jss-angular.mjs +1507 -1507
- package/dist/index.d.ts +5 -5
- package/dist/jss-component-factory.service.d.ts +25 -25
- package/dist/lib.module.d.ts +46 -46
- package/dist/package.json +2 -2
- package/dist/public_api.d.ts +25 -25
- package/dist/utils.d.ts +6 -6
- package/ng-package.json +13 -13
- package/package.json +3 -3
- package/tsconfig.json +9 -9
- package/tsconfig.spec.json +17 -17
- package/typings/README.md +2 -2
|
@@ -1,287 +1,287 @@
|
|
|
1
|
-
/* eslint-disable @angular-eslint/no-conflicting-lifecycle */
|
|
2
|
-
import { isPlatformServer } from '@angular/common';
|
|
3
|
-
import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
4
|
-
import { UrlTree } from '@angular/router';
|
|
5
|
-
import { Observable } from 'rxjs';
|
|
6
|
-
import { takeWhile } from 'rxjs/operators';
|
|
7
|
-
import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
|
|
8
|
-
import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
|
|
9
|
-
import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from './placeholder.token';
|
|
10
|
-
import { RenderEachDirective } from './render-each.directive';
|
|
11
|
-
import { RenderEmptyDirective } from './render-empty.directive';
|
|
12
|
-
import { isRawRendering } from './rendering';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "../jss-component-factory.service";
|
|
15
|
-
import * as i2 from "@angular/router";
|
|
16
|
-
import * as i3 from "@angular/common";
|
|
17
|
-
/**
|
|
18
|
-
* @param {ComponentRendering} rendering
|
|
19
|
-
* @param {string} name
|
|
20
|
-
*/
|
|
21
|
-
function getPlaceholder(rendering, name) {
|
|
22
|
-
if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
|
|
23
|
-
return rendering.placeholders[name];
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
export class PlaceholderComponent {
|
|
28
|
-
differs;
|
|
29
|
-
componentFactory;
|
|
30
|
-
changeDetectorRef;
|
|
31
|
-
elementRef;
|
|
32
|
-
renderer;
|
|
33
|
-
router;
|
|
34
|
-
missingComponentComponent;
|
|
35
|
-
hiddenRenderingComponent;
|
|
36
|
-
guardResolver;
|
|
37
|
-
dataResolver;
|
|
38
|
-
platformId;
|
|
39
|
-
name;
|
|
40
|
-
rendering;
|
|
41
|
-
renderings;
|
|
42
|
-
outputs;
|
|
43
|
-
clientOnly = false;
|
|
44
|
-
loaded = new EventEmitter();
|
|
45
|
-
renderEachTemplate;
|
|
46
|
-
renderEmptyTemplate;
|
|
47
|
-
placeholderLoading;
|
|
48
|
-
view;
|
|
49
|
-
isLoading = true;
|
|
50
|
-
_inputs;
|
|
51
|
-
_differ;
|
|
52
|
-
_componentInstances = [];
|
|
53
|
-
destroyed = false;
|
|
54
|
-
parentStyleAttribute = '';
|
|
55
|
-
constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
57
|
-
platformId) {
|
|
58
|
-
this.differs = differs;
|
|
59
|
-
this.componentFactory = componentFactory;
|
|
60
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
61
|
-
this.elementRef = elementRef;
|
|
62
|
-
this.renderer = renderer;
|
|
63
|
-
this.router = router;
|
|
64
|
-
this.missingComponentComponent = missingComponentComponent;
|
|
65
|
-
this.hiddenRenderingComponent = hiddenRenderingComponent;
|
|
66
|
-
this.guardResolver = guardResolver;
|
|
67
|
-
this.dataResolver = dataResolver;
|
|
68
|
-
this.platformId = platformId;
|
|
69
|
-
}
|
|
70
|
-
set inputs(value) {
|
|
71
|
-
this._inputs = value;
|
|
72
|
-
if (!this._differ && value) {
|
|
73
|
-
this._differ = this.differs.find(value).create();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
ngOnInit() {
|
|
77
|
-
// just to ensure the element exists
|
|
78
|
-
const elem = this.elementRef.nativeElement;
|
|
79
|
-
if (elem) {
|
|
80
|
-
const attributes = elem.attributes;
|
|
81
|
-
for (let i = 0; i < attributes.length; i++) {
|
|
82
|
-
const attr = attributes.item(i);
|
|
83
|
-
if (attr && attr.name.indexOf('_ngcontent') !== -1) {
|
|
84
|
-
this.parentStyleAttribute = attr.name;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
ngOnDestroy() {
|
|
90
|
-
this.destroyed = true;
|
|
91
|
-
this._componentInstances = [];
|
|
92
|
-
}
|
|
93
|
-
ngOnChanges(changes) {
|
|
94
|
-
if (changes.rendering || changes.renderings) {
|
|
95
|
-
this._render();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
ngDoCheck() {
|
|
99
|
-
if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const changes = this._differ.diff(this._inputs);
|
|
103
|
-
if (!changes) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
const updates = {};
|
|
107
|
-
changes.forEachRemovedItem((change) => (updates[change.key] = null));
|
|
108
|
-
changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
|
|
109
|
-
changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
|
|
110
|
-
this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
|
|
111
|
-
}
|
|
112
|
-
_setComponentInputs(componentInstance, inputs) {
|
|
113
|
-
Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
|
|
114
|
-
}
|
|
115
|
-
_subscribeComponentOutputs(componentInstance, outputs) {
|
|
116
|
-
Object.keys(outputs)
|
|
117
|
-
.filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
|
|
118
|
-
.forEach((output) => componentInstance[output]
|
|
119
|
-
.pipe(takeWhile(() => !this.destroyed))
|
|
120
|
-
.subscribe(outputs[output]));
|
|
121
|
-
}
|
|
122
|
-
async _render() {
|
|
123
|
-
if (this.clientOnly && isPlatformServer(this.platformId)) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
this._componentInstances = [];
|
|
127
|
-
this.view.clear();
|
|
128
|
-
if (!this.rendering && !this.renderings) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
if (!this.name && !this.renderings) {
|
|
132
|
-
console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
|
|
133
|
-
this.isLoading = false;
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
|
|
137
|
-
if (!placeholder) {
|
|
138
|
-
console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
|
|
139
|
-
this.isLoading = false;
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
// if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
|
|
143
|
-
const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
|
|
144
|
-
if (this.renderEmptyTemplate && placeholderIsEmpty) {
|
|
145
|
-
this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
|
|
146
|
-
renderings: placeholder,
|
|
147
|
-
});
|
|
148
|
-
this.isLoading = false;
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
const factories = await this.componentFactory.getComponents(placeholder);
|
|
152
|
-
try {
|
|
153
|
-
const nonGuarded = await this.guardResolver(factories);
|
|
154
|
-
const withData = await this.dataResolver(nonGuarded);
|
|
155
|
-
withData.forEach((rendering, index) => {
|
|
156
|
-
if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
|
|
157
|
-
this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
this.isLoading = false;
|
|
164
|
-
this.changeDetectorRef.markForCheck();
|
|
165
|
-
this.loaded.emit(this.name);
|
|
166
|
-
}
|
|
167
|
-
catch (e) {
|
|
168
|
-
this.isLoading = false;
|
|
169
|
-
if (e instanceof UrlTree) {
|
|
170
|
-
this.router.navigateByUrl(e);
|
|
171
|
-
}
|
|
172
|
-
else if (typeof e === 'string') {
|
|
173
|
-
this.router.navigate([e]);
|
|
174
|
-
}
|
|
175
|
-
else if (Array.isArray(e)) {
|
|
176
|
-
this.router.navigate(e);
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
throw e;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
_renderTemplatedComponent(rendering, index) {
|
|
185
|
-
// the render-each template takes care of all component mapping etc
|
|
186
|
-
// generally using <sc-render-component> which is about like _renderEmbeddedComponent()
|
|
187
|
-
// as a separate component
|
|
188
|
-
this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
|
|
189
|
-
rendering,
|
|
190
|
-
index,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
_renderEmbeddedComponent(rendering, data, index) {
|
|
194
|
-
if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
|
|
195
|
-
rendering.componentImplementation = this.hiddenRenderingComponent;
|
|
196
|
-
}
|
|
197
|
-
if (!rendering.componentImplementation) {
|
|
198
|
-
const componentName = rendering.componentDefinition.componentName;
|
|
1
|
+
/* eslint-disable @angular-eslint/no-conflicting-lifecycle */
|
|
2
|
+
import { isPlatformServer } from '@angular/common';
|
|
3
|
+
import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
4
|
+
import { UrlTree } from '@angular/router';
|
|
5
|
+
import { Observable } from 'rxjs';
|
|
6
|
+
import { takeWhile } from 'rxjs/operators';
|
|
7
|
+
import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
|
|
8
|
+
import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
|
|
9
|
+
import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from './placeholder.token';
|
|
10
|
+
import { RenderEachDirective } from './render-each.directive';
|
|
11
|
+
import { RenderEmptyDirective } from './render-empty.directive';
|
|
12
|
+
import { isRawRendering } from './rendering';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "../jss-component-factory.service";
|
|
15
|
+
import * as i2 from "@angular/router";
|
|
16
|
+
import * as i3 from "@angular/common";
|
|
17
|
+
/**
|
|
18
|
+
* @param {ComponentRendering} rendering
|
|
19
|
+
* @param {string} name
|
|
20
|
+
*/
|
|
21
|
+
function getPlaceholder(rendering, name) {
|
|
22
|
+
if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
|
|
23
|
+
return rendering.placeholders[name];
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
export class PlaceholderComponent {
|
|
28
|
+
differs;
|
|
29
|
+
componentFactory;
|
|
30
|
+
changeDetectorRef;
|
|
31
|
+
elementRef;
|
|
32
|
+
renderer;
|
|
33
|
+
router;
|
|
34
|
+
missingComponentComponent;
|
|
35
|
+
hiddenRenderingComponent;
|
|
36
|
+
guardResolver;
|
|
37
|
+
dataResolver;
|
|
38
|
+
platformId;
|
|
39
|
+
name;
|
|
40
|
+
rendering;
|
|
41
|
+
renderings;
|
|
42
|
+
outputs;
|
|
43
|
+
clientOnly = false;
|
|
44
|
+
loaded = new EventEmitter();
|
|
45
|
+
renderEachTemplate;
|
|
46
|
+
renderEmptyTemplate;
|
|
47
|
+
placeholderLoading;
|
|
48
|
+
view;
|
|
49
|
+
isLoading = true;
|
|
50
|
+
_inputs;
|
|
51
|
+
_differ;
|
|
52
|
+
_componentInstances = [];
|
|
53
|
+
destroyed = false;
|
|
54
|
+
parentStyleAttribute = '';
|
|
55
|
+
constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
57
|
+
platformId) {
|
|
58
|
+
this.differs = differs;
|
|
59
|
+
this.componentFactory = componentFactory;
|
|
60
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
61
|
+
this.elementRef = elementRef;
|
|
62
|
+
this.renderer = renderer;
|
|
63
|
+
this.router = router;
|
|
64
|
+
this.missingComponentComponent = missingComponentComponent;
|
|
65
|
+
this.hiddenRenderingComponent = hiddenRenderingComponent;
|
|
66
|
+
this.guardResolver = guardResolver;
|
|
67
|
+
this.dataResolver = dataResolver;
|
|
68
|
+
this.platformId = platformId;
|
|
69
|
+
}
|
|
70
|
+
set inputs(value) {
|
|
71
|
+
this._inputs = value;
|
|
72
|
+
if (!this._differ && value) {
|
|
73
|
+
this._differ = this.differs.find(value).create();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
ngOnInit() {
|
|
77
|
+
// just to ensure the element exists
|
|
78
|
+
const elem = this.elementRef.nativeElement;
|
|
79
|
+
if (elem) {
|
|
80
|
+
const attributes = elem.attributes;
|
|
81
|
+
for (let i = 0; i < attributes.length; i++) {
|
|
82
|
+
const attr = attributes.item(i);
|
|
83
|
+
if (attr && attr.name.indexOf('_ngcontent') !== -1) {
|
|
84
|
+
this.parentStyleAttribute = attr.name;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
ngOnDestroy() {
|
|
90
|
+
this.destroyed = true;
|
|
91
|
+
this._componentInstances = [];
|
|
92
|
+
}
|
|
93
|
+
ngOnChanges(changes) {
|
|
94
|
+
if (changes.rendering || changes.renderings) {
|
|
95
|
+
this._render();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
ngDoCheck() {
|
|
99
|
+
if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const changes = this._differ.diff(this._inputs);
|
|
103
|
+
if (!changes) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const updates = {};
|
|
107
|
+
changes.forEachRemovedItem((change) => (updates[change.key] = null));
|
|
108
|
+
changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
|
|
109
|
+
changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
|
|
110
|
+
this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
|
|
111
|
+
}
|
|
112
|
+
_setComponentInputs(componentInstance, inputs) {
|
|
113
|
+
Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
|
|
114
|
+
}
|
|
115
|
+
_subscribeComponentOutputs(componentInstance, outputs) {
|
|
116
|
+
Object.keys(outputs)
|
|
117
|
+
.filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
|
|
118
|
+
.forEach((output) => componentInstance[output]
|
|
119
|
+
.pipe(takeWhile(() => !this.destroyed))
|
|
120
|
+
.subscribe(outputs[output]));
|
|
121
|
+
}
|
|
122
|
+
async _render() {
|
|
123
|
+
if (this.clientOnly && isPlatformServer(this.platformId)) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this._componentInstances = [];
|
|
127
|
+
this.view.clear();
|
|
128
|
+
if (!this.rendering && !this.renderings) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!this.name && !this.renderings) {
|
|
132
|
+
console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
|
|
133
|
+
this.isLoading = false;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
|
|
137
|
+
if (!placeholder) {
|
|
138
|
+
console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
|
|
139
|
+
this.isLoading = false;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
|
|
143
|
+
const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
|
|
144
|
+
if (this.renderEmptyTemplate && placeholderIsEmpty) {
|
|
145
|
+
this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
|
|
146
|
+
renderings: placeholder,
|
|
147
|
+
});
|
|
148
|
+
this.isLoading = false;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const factories = await this.componentFactory.getComponents(placeholder);
|
|
152
|
+
try {
|
|
153
|
+
const nonGuarded = await this.guardResolver(factories);
|
|
154
|
+
const withData = await this.dataResolver(nonGuarded);
|
|
155
|
+
withData.forEach((rendering, index) => {
|
|
156
|
+
if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
|
|
157
|
+
this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
this.isLoading = false;
|
|
164
|
+
this.changeDetectorRef.markForCheck();
|
|
165
|
+
this.loaded.emit(this.name);
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
this.isLoading = false;
|
|
169
|
+
if (e instanceof UrlTree) {
|
|
170
|
+
this.router.navigateByUrl(e);
|
|
171
|
+
}
|
|
172
|
+
else if (typeof e === 'string') {
|
|
173
|
+
this.router.navigate([e]);
|
|
174
|
+
}
|
|
175
|
+
else if (Array.isArray(e)) {
|
|
176
|
+
this.router.navigate(e);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
throw e;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
_renderTemplatedComponent(rendering, index) {
|
|
185
|
+
// the render-each template takes care of all component mapping etc
|
|
186
|
+
// generally using <sc-render-component> which is about like _renderEmbeddedComponent()
|
|
187
|
+
// as a separate component
|
|
188
|
+
this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
|
|
189
|
+
rendering,
|
|
190
|
+
index,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
_renderEmbeddedComponent(rendering, data, index) {
|
|
194
|
+
if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
|
|
195
|
+
rendering.componentImplementation = this.hiddenRenderingComponent;
|
|
196
|
+
}
|
|
197
|
+
if (!rendering.componentImplementation) {
|
|
198
|
+
const componentName = rendering.componentDefinition.componentName;
|
|
199
199
|
console.error(`Placeholder ${this.name} contains unknown component ${componentName}.`, `Ensure component is mapped, like:
|
|
200
200
|
JssModule.withComponents([
|
|
201
201
|
{ name: '${componentName}', type: ${componentName}Component }
|
|
202
|
-
])`);
|
|
203
|
-
rendering.componentImplementation = this.missingComponentComponent;
|
|
204
|
-
}
|
|
205
|
-
// apply the parent style attribute _ngcontent
|
|
206
|
-
// work-around for https://github.com/angular/angular/issues/12215
|
|
207
|
-
const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
|
|
208
|
-
index: index,
|
|
209
|
-
});
|
|
210
|
-
if (this.parentStyleAttribute) {
|
|
211
|
-
this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
|
|
212
|
-
}
|
|
213
|
-
const componentInstance = createdComponentRef.instance;
|
|
214
|
-
componentInstance.rendering = rendering.componentDefinition;
|
|
215
|
-
componentInstance.data = data;
|
|
216
|
-
if (this._inputs) {
|
|
217
|
-
this._setComponentInputs(componentInstance, this._inputs);
|
|
218
|
-
}
|
|
219
|
-
if (this.outputs) {
|
|
220
|
-
this._subscribeComponentOutputs(componentInstance, this.outputs);
|
|
221
|
-
}
|
|
222
|
-
this._componentInstances.push(componentInstance);
|
|
223
|
-
}
|
|
224
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
|
|
202
|
+
])`);
|
|
203
|
+
rendering.componentImplementation = this.missingComponentComponent;
|
|
204
|
+
}
|
|
205
|
+
// apply the parent style attribute _ngcontent
|
|
206
|
+
// work-around for https://github.com/angular/angular/issues/12215
|
|
207
|
+
const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
|
|
208
|
+
index: index,
|
|
209
|
+
});
|
|
210
|
+
if (this.parentStyleAttribute) {
|
|
211
|
+
this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
|
|
212
|
+
}
|
|
213
|
+
const componentInstance = createdComponentRef.instance;
|
|
214
|
+
componentInstance.rendering = rendering.componentDefinition;
|
|
215
|
+
componentInstance.data = data;
|
|
216
|
+
if (this._inputs) {
|
|
217
|
+
this._setComponentInputs(componentInstance, this._inputs);
|
|
218
|
+
}
|
|
219
|
+
if (this.outputs) {
|
|
220
|
+
this._subscribeComponentOutputs(componentInstance, this.outputs);
|
|
221
|
+
}
|
|
222
|
+
this._componentInstances.push(componentInstance);
|
|
223
|
+
}
|
|
224
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
|
|
225
225
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PlaceholderComponent, selector: "sc-placeholder,[sc-placeholder]", inputs: { name: "name", rendering: "rendering", renderings: "renderings", outputs: "outputs", clientOnly: "clientOnly", inputs: "inputs" }, outputs: { loaded: "loaded" }, queries: [{ propertyName: "renderEachTemplate", first: true, predicate: RenderEachDirective, descendants: true, static: true }, { propertyName: "renderEmptyTemplate", first: true, predicate: RenderEmptyDirective, descendants: true, static: true }, { propertyName: "placeholderLoading", first: true, predicate: PlaceholderLoadingDirective, descendants: true, static: true }], viewQueries: [{ propertyName: "view", first: true, predicate: ["view"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
226
226
|
<ng-template
|
|
227
227
|
*ngIf="isLoading"
|
|
228
228
|
[ngTemplateOutlet]="placeholderLoading?.templateRef"
|
|
229
229
|
></ng-template>
|
|
230
230
|
<ng-template #view></ng-template>
|
|
231
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
232
|
-
}
|
|
233
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, decorators: [{
|
|
234
|
-
type: Component,
|
|
235
|
-
args: [{
|
|
236
|
-
selector: 'sc-placeholder,[sc-placeholder]',
|
|
231
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
232
|
+
}
|
|
233
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, decorators: [{
|
|
234
|
+
type: Component,
|
|
235
|
+
args: [{
|
|
236
|
+
selector: 'sc-placeholder,[sc-placeholder]',
|
|
237
237
|
template: `
|
|
238
238
|
<ng-template
|
|
239
239
|
*ngIf="isLoading"
|
|
240
240
|
[ngTemplateOutlet]="placeholderLoading?.templateRef"
|
|
241
241
|
></ng-template>
|
|
242
242
|
<ng-template #view></ng-template>
|
|
243
|
-
`,
|
|
244
|
-
}]
|
|
245
|
-
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
|
|
246
|
-
type: Inject,
|
|
247
|
-
args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
|
|
248
|
-
}] }, { type: i0.Type, decorators: [{
|
|
249
|
-
type: Inject,
|
|
250
|
-
args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
|
|
251
|
-
}] }, { type: undefined, decorators: [{
|
|
252
|
-
type: Inject,
|
|
253
|
-
args: [GUARD_RESOLVER]
|
|
254
|
-
}] }, { type: undefined, decorators: [{
|
|
255
|
-
type: Inject,
|
|
256
|
-
args: [DATA_RESOLVER]
|
|
257
|
-
}] }, { type: Object, decorators: [{
|
|
258
|
-
type: Inject,
|
|
259
|
-
args: [PLATFORM_ID]
|
|
260
|
-
}] }]; }, propDecorators: { name: [{
|
|
261
|
-
type: Input
|
|
262
|
-
}], rendering: [{
|
|
263
|
-
type: Input
|
|
264
|
-
}], renderings: [{
|
|
265
|
-
type: Input
|
|
266
|
-
}], outputs: [{
|
|
267
|
-
type: Input
|
|
268
|
-
}], clientOnly: [{
|
|
269
|
-
type: Input
|
|
270
|
-
}], loaded: [{
|
|
271
|
-
type: Output
|
|
272
|
-
}], renderEachTemplate: [{
|
|
273
|
-
type: ContentChild,
|
|
274
|
-
args: [RenderEachDirective, { static: true }]
|
|
275
|
-
}], renderEmptyTemplate: [{
|
|
276
|
-
type: ContentChild,
|
|
277
|
-
args: [RenderEmptyDirective, { static: true }]
|
|
278
|
-
}], placeholderLoading: [{
|
|
279
|
-
type: ContentChild,
|
|
280
|
-
args: [PlaceholderLoadingDirective, { static: true }]
|
|
281
|
-
}], view: [{
|
|
282
|
-
type: ViewChild,
|
|
283
|
-
args: ['view', { read: ViewContainerRef, static: true }]
|
|
284
|
-
}], inputs: [{
|
|
285
|
-
type: Input
|
|
286
|
-
}] } });
|
|
243
|
+
`,
|
|
244
|
+
}]
|
|
245
|
+
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
|
|
246
|
+
type: Inject,
|
|
247
|
+
args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
|
|
248
|
+
}] }, { type: i0.Type, decorators: [{
|
|
249
|
+
type: Inject,
|
|
250
|
+
args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
|
|
251
|
+
}] }, { type: undefined, decorators: [{
|
|
252
|
+
type: Inject,
|
|
253
|
+
args: [GUARD_RESOLVER]
|
|
254
|
+
}] }, { type: undefined, decorators: [{
|
|
255
|
+
type: Inject,
|
|
256
|
+
args: [DATA_RESOLVER]
|
|
257
|
+
}] }, { type: Object, decorators: [{
|
|
258
|
+
type: Inject,
|
|
259
|
+
args: [PLATFORM_ID]
|
|
260
|
+
}] }]; }, propDecorators: { name: [{
|
|
261
|
+
type: Input
|
|
262
|
+
}], rendering: [{
|
|
263
|
+
type: Input
|
|
264
|
+
}], renderings: [{
|
|
265
|
+
type: Input
|
|
266
|
+
}], outputs: [{
|
|
267
|
+
type: Input
|
|
268
|
+
}], clientOnly: [{
|
|
269
|
+
type: Input
|
|
270
|
+
}], loaded: [{
|
|
271
|
+
type: Output
|
|
272
|
+
}], renderEachTemplate: [{
|
|
273
|
+
type: ContentChild,
|
|
274
|
+
args: [RenderEachDirective, { static: true }]
|
|
275
|
+
}], renderEmptyTemplate: [{
|
|
276
|
+
type: ContentChild,
|
|
277
|
+
args: [RenderEmptyDirective, { static: true }]
|
|
278
|
+
}], placeholderLoading: [{
|
|
279
|
+
type: ContentChild,
|
|
280
|
+
args: [PlaceholderLoadingDirective, { static: true }]
|
|
281
|
+
}], view: [{
|
|
282
|
+
type: ViewChild,
|
|
283
|
+
args: ['view', { read: ViewContainerRef, static: true }]
|
|
284
|
+
}], inputs: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}] } });
|
|
287
287
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGxhY2Vob2xkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFHWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFNTCxNQUFNLEVBQ04sV0FBVyxFQUlYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFRLE9BQU8sRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlFLE9BQU8sRUFFTCxhQUFhLEVBRWIsY0FBYyxFQUNkLHNDQUFzQyxFQUN0Qyx1Q0FBdUMsR0FDeEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQUU3Qzs7O0dBR0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxTQUE2QixFQUFFLElBQVk7SUFDakUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3pGLE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNyQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQWlCRCxNQUFNLE9BQU8sb0JBQW9CO0lBeUJyQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFFQTtJQUNnRDtJQUN4QjtJQUNEO0lBRUY7SUFwQ3RCLElBQUksQ0FBVTtJQUNkLFNBQVMsQ0FBcUI7SUFDOUIsVUFBVSxDQUFvRDtJQUM5RCxPQUFPLENBQWdEO0lBQ3ZELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFbEIsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO0lBRUwsa0JBQWtCLENBQXNCO0lBQ3ZDLG1CQUFtQixDQUF1QjtJQUVoRyxrQkFBa0IsQ0FBK0I7SUFFb0IsSUFBSSxDQUFtQjtJQUVyRixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBRWhCLE9BQU8sQ0FBNkI7SUFDcEMsT0FBTyxDQUFrQztJQUN6QyxtQkFBbUIsR0FBa0MsRUFBRSxDQUFDO0lBQ3hELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0lBRWxDLFlBQ1UsT0FBd0IsRUFDeEIsZ0JBQTRDLEVBQzVDLGlCQUFvQyxFQUNwQyxVQUFzQixFQUN0QixRQUFtQixFQUNuQixNQUFjLEVBRWQseUJBQXdDLEVBQ1Esd0JBQXVDLEVBQy9ELGFBQTRCLEVBQzdCLFlBQTBCO0lBQ3pELHdEQUF3RDtJQUMzQixVQUFrQjtRQVp2QyxZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTRCO1FBQzVDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCw4QkFBeUIsR0FBekIseUJBQXlCLENBQWU7UUFDUSw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWU7UUFDL0Qsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDN0IsaUJBQVksR0FBWixZQUFZLENBQWM7UUFFNUIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtJQUM5QyxDQUFDO0lBRUosSUFDSSxNQUFNLENBQUMsS0FBaUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFO1lBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLG9DQUFvQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUUzQyxJQUFJLElBQUksRUFBRTtZQUNSLE1BQU0sVUFBVSxHQUFpQixJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLElBQUksR0FBZ0IsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUN2QzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUMzQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzRSxPQUFPO1NBQ1I7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU87U0FDUjtRQUNELE1BQU0sT0FBTyxHQUErQixFQUFFLENBQUM7UUFDL0MsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNsRixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQ3JELENBQUM7SUFDSixDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLGlCQUE2QyxFQUM3QyxNQUFrQztRQUVsQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FDNUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFFTywwQkFBMEIsQ0FDaEMsaUJBQTZDLEVBQzdDLE9BQXNEO1FBRXRELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ2pCLE1BQU0sQ0FDTCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLFlBQVksVUFBVSxDQUN6RjthQUNBLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2pCLGlCQUFpQixDQUFDLE1BQU0sQ0FBeUI7YUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN0QyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQzlCLENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQU87UUFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN4RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3ZDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNsQyxPQUFPLENBQUMsSUFBSSxDQUNWLGtKQUFrSixDQUNuSixDQUFDO1lBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsT0FBTztTQUNSO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXZGLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FDVixnQkFBZ0IsSUFBSSxDQUFDLElBQUksK0NBQStDLEVBQ3hFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3hDLENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixPQUFPO1NBQ1I7UUFFRCx5SEFBeUg7UUFDekgsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUMxQyxDQUFDLFNBQW9ELEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FDcEYsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLGtCQUFrQixFQUFFO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRTtnQkFDakUsVUFBVSxFQUFFLFdBQVc7YUFDeEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDeEI7YUFBTTtZQUNMLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUV6RSxJQUFJO2dCQUNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUVyRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUNwQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7d0JBQ3JGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUM5RTt5QkFBTTt3QkFDTCxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUN6RTtnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFlBQVksT0FBTyxFQUFFO29CQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUI7cUJBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0I7cUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekI7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLENBQUM7aUJBQ1Q7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLHlCQUF5QixDQUMvQixTQUFvRCxFQUNwRCxLQUFhO1FBRWIsbUVBQW1FO1FBQ25FLHVGQUF1RjtRQUN2RiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFO1lBQ2hFLFNBQVM7WUFDVCxLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFNBQWlDLEVBQUUsSUFBVSxFQUFFLEtBQWE7UUFDM0YsSUFDRyxTQUFTLENBQUMsbUJBQTBDLENBQUMsYUFBYSxLQUFLLHFCQUFxQixFQUM3RjtZQUNBLFNBQVMsQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFO1lBQ3RDLE1BQU0sYUFBYSxHQUFJLFNBQVMsQ0FBQyxtQkFBMEMsQ0FBQyxhQUFhLENBQUM7WUFDMUYsT0FBTyxDQUFDLEtBQUssQ0FDWCxlQUFlLElBQUksQ0FBQyxJQUFJLCtCQUErQixhQUFhLEdBQUcsRUFDdkU7O3FCQUVhLGFBQWEsWUFBWSxhQUFhO1dBQ2hELENBQ0osQ0FBQztZQUVGLFNBQVMsQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUM7U0FDcEU7UUFDRCw4Q0FBOEM7UUFDOUMsa0VBQWtFO1FBQ2xFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFO1lBQ3ZGLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQ3hCLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQzFDLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsRUFBRSxDQUNILENBQUM7U0FDSDtRQUVELE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDO1FBQ3ZELGlCQUFpQixDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUM7UUFDNUQsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7d0dBdFBVLG9CQUFvQixxTUErQnJCLHVDQUF1QyxhQUV2QyxzQ0FBc0MsYUFDdEMsY0FBYyxhQUNkLGFBQWEsYUFFYixXQUFXOzRGQXJDVixvQkFBb0Isa1NBU2pCLG1CQUFtQixvR0FDbkIsb0JBQW9CLG1HQUNwQiwyQkFBMkIsdUlBR2QsZ0JBQWdCLGdFQXRCakM7Ozs7OztHQU1UOzs0RkFFVSxvQkFBb0I7a0JBVmhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlDQUFpQztvQkFDM0MsUUFBUSxFQUFFOzs7Ozs7R0FNVDtpQkFDRjs7MEJBZ0NJLE1BQU07MkJBQUMsdUNBQXVDOzswQkFFOUMsTUFBTTsyQkFBQyxzQ0FBc0M7OzBCQUM3QyxNQUFNOzJCQUFDLGNBQWM7OzBCQUNyQixNQUFNOzJCQUFDLGFBQWE7OzBCQUVwQixNQUFNOzJCQUFDLFdBQVc7NENBcENaLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksTUFBTTtzQkFBZixNQUFNO2dCQUU4QyxrQkFBa0I7c0JBQXRFLFlBQVk7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNHLG1CQUFtQjtzQkFBeEUsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBELGtCQUFrQjtzQkFEakIsWUFBWTt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR1UsSUFBSTtzQkFBeEUsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkEyQnZELE1BQU07c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGUgKi9cclxuaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBEb0NoZWNrLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBLZXlWYWx1ZURpZmZlcixcclxuICBLZXlWYWx1ZURpZmZlcnMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFBMQVRGT1JNX0lELFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFR5cGUsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGEsIFVybFRyZWUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlcmluZywgSHRtbEVsZW1lbnRSZW5kZXJpbmcgfSBmcm9tICdAc2l0ZWNvcmUtanNzL3NpdGVjb3JlLWpzcy9sYXlvdXQnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRGYWN0b3J5UmVzdWx0LFxyXG4gIEpzc0NvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG59IGZyb20gJy4uL2pzcy1jb21wb25lbnQtZmFjdG9yeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSElEREVOX1JFTkRFUklOR19OQU1FIH0gZnJvbSAnLi9oaWRkZW4tcmVuZGVyaW5nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBsYWNlaG9sZGVyTG9hZGluZ0RpcmVjdGl2ZSB9IGZyb20gJy4vcGxhY2Vob2xkZXItbG9hZGluZy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge1xyXG4gIERhdGFSZXNvbHZlcixcclxuICBEQVRBX1JFU09MVkVSLFxyXG4gIEd1YXJkUmVzb2x2ZXIsXHJcbiAgR1VBUkRfUkVTT0xWRVIsXHJcbiAgUExBQ0VIT0xERVJfSElEREVOX1JFTkRFUklOR19DT01QT05FTlQsXHJcbiAgUExBQ0VIT0xERVJfTUlTU0lOR19DT01QT05FTlRfQ09NUE9ORU5ULFxyXG59IGZyb20gJy4vcGxhY2Vob2xkZXIudG9rZW4nO1xyXG5pbXBvcnQgeyBSZW5kZXJFYWNoRGlyZWN0aXZlIH0gZnJvbSAnLi9yZW5kZXItZWFjaC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBSZW5kZXJFbXB0eURpcmVjdGl2ZSB9IGZyb20gJy4vcmVuZGVyLWVtcHR5LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IGlzUmF3UmVuZGVyaW5nIH0gZnJvbSAnLi9yZW5kZXJpbmcnO1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7Q29tcG9uZW50UmVuZGVyaW5nfSByZW5kZXJpbmdcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcclxuICovXHJcbmZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyKHJlbmRlcmluZzogQ29tcG9uZW50UmVuZGVyaW5nLCBuYW1lOiBzdHJpbmcpIHtcclxuICBpZiAocmVuZGVyaW5nICYmIHJlbmRlcmluZy5wbGFjZWhvbGRlcnMgJiYgT2JqZWN0LmtleXMocmVuZGVyaW5nLnBsYWNlaG9sZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgcmV0dXJuIHJlbmRlcmluZy5wbGFjZWhvbGRlcnNbbmFtZV07XHJcbiAgfVxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZhY3RvcnlXaXRoRGF0YSB7XHJcbiAgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeVJlc3VsdDtcclxuICBkYXRhPzogRGF0YTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzYy1wbGFjZWhvbGRlcixbc2MtcGxhY2Vob2xkZXJdJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICpuZ0lmPVwiaXNMb2FkaW5nXCJcclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicGxhY2Vob2xkZXJMb2FkaW5nPy50ZW1wbGF0ZVJlZlwiXHJcbiAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdmlldz48L25nLXRlbXBsYXRlPlxyXG4gIGAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQbGFjZWhvbGRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBEb0NoZWNrLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIG5hbWU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcmVuZGVyaW5nOiBDb21wb25lbnRSZW5kZXJpbmc7XHJcbiAgQElucHV0KCkgcmVuZGVyaW5ncz86IEFycmF5PENvbXBvbmVudFJlbmRlcmluZyB8IEh0bWxFbGVtZW50UmVuZGVyaW5nPjtcclxuICBASW5wdXQoKSBvdXRwdXRzOiB7IFtrOiBzdHJpbmddOiAoZXZlbnRUeXBlOiB1bmtub3duKSA9PiB2b2lkIH07XHJcbiAgQElucHV0KCkgY2xpZW50T25seSA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgbG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoUmVuZGVyRWFjaERpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgcmVuZGVyRWFjaFRlbXBsYXRlOiBSZW5kZXJFYWNoRGlyZWN0aXZlO1xyXG4gIEBDb250ZW50Q2hpbGQoUmVuZGVyRW1wdHlEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIHJlbmRlckVtcHR5VGVtcGxhdGU6IFJlbmRlckVtcHR5RGlyZWN0aXZlO1xyXG4gIEBDb250ZW50Q2hpbGQoUGxhY2Vob2xkZXJMb2FkaW5nRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHBsYWNlaG9sZGVyTG9hZGluZz86IFBsYWNlaG9sZGVyTG9hZGluZ0RpcmVjdGl2ZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgndmlldycsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdmlldzogVmlld0NvbnRhaW5lclJlZjtcclxuXHJcbiAgcHVibGljIGlzTG9hZGluZyA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgX2lucHV0czogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XHJcbiAgcHJpdmF0ZSBfZGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxzdHJpbmcsIHVua25vd24+O1xyXG4gIHByaXZhdGUgX2NvbXBvbmVudEluc3RhbmNlczogeyBbcHJvcDogc3RyaW5nXTogdW5rbm93biB9W10gPSBbXTtcclxuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcGFyZW50U3R5bGVBdHRyaWJ1dGUgPSAnJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRpZmZlcnM6IEtleVZhbHVlRGlmZmVycyxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeTogSnNzQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBASW5qZWN0KFBMQUNFSE9MREVSX01JU1NJTkdfQ09NUE9ORU5UX0NPTVBPTkVOVClcclxuICAgIHByaXZhdGUgbWlzc2luZ0NvbXBvbmVudENvbXBvbmVudDogVHlwZTx1bmtub3duPixcclxuICAgIEBJbmplY3QoUExBQ0VIT0xERVJfSElEREVOX1JFTkRFUklOR19DT01QT05FTlQpIHByaXZhdGUgaGlkZGVuUmVuZGVyaW5nQ29tcG9uZW50OiBUeXBlPHVua25vd24+LFxyXG4gICAgQEluamVjdChHVUFSRF9SRVNPTFZFUikgcHJpdmF0ZSBndWFyZFJlc29sdmVyOiBHdWFyZFJlc29sdmVyLFxyXG4gICAgQEluamVjdChEQVRBX1JFU09MVkVSKSBwcml2YXRlIGRhdGFSZXNvbHZlcjogRGF0YVJlc29sdmVyLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0XHJcbiAgKSB7fVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBpbnB1dHModmFsdWU6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSB7XHJcbiAgICB0aGlzLl9pbnB1dHMgPSB2YWx1ZTtcclxuICAgIGlmICghdGhpcy5fZGlmZmVyICYmIHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8ganVzdCB0byBlbnN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzXHJcbiAgICBjb25zdCBlbGVtID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgaWYgKGVsZW0pIHtcclxuICAgICAgY29uc3QgYXR0cmlidXRlczogTmFtZWROb2RlTWFwID0gZWxlbS5hdHRyaWJ1dGVzO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBhdHRyOiBBdHRyIHwgbnVsbCA9IGF0dHJpYnV0ZXMuaXRlbShpKTtcclxuICAgICAgICBpZiAoYXR0ciAmJiBhdHRyLm5hbWUuaW5kZXhPZignX25nY29udGVudCcpICE9PSAtMSkge1xyXG4gICAgICAgICAgdGhpcy5wYXJlbnRTdHlsZUF0dHJpYnV0ZSA9IGF0dHIubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5fY29tcG9uZW50SW5zdGFuY2VzID0gW107XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5yZW5kZXJpbmcgfHwgY2hhbmdlcy5yZW5kZXJpbmdzKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdEb0NoZWNrKCkge1xyXG4gICAgaWYgKCF0aGlzLl9kaWZmZXIgfHwgIXRoaXMuX2lucHV0cyB8fCB0aGlzLl9jb21wb25lbnRJbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5faW5wdXRzKTtcclxuICAgIGlmICghY2hhbmdlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB1cGRhdGVzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9O1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKGNoYW5nZSkgPT4gKHVwZGF0ZXNbY2hhbmdlLmtleV0gPSBudWxsKSk7XHJcbiAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKGNoYW5nZSkgPT4gKHVwZGF0ZXNbY2hhbmdlLmtleV0gPSBjaGFuZ2UuY3VycmVudFZhbHVlKSk7XHJcbiAgICBjaGFuZ2VzLmZvckVhY2hDaGFuZ2VkSXRlbSgoY2hhbmdlKSA9PiAodXBkYXRlc1tjaGFuZ2Uua2V5XSA9IGNoYW5nZS5jdXJyZW50VmFsdWUpKTtcclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcy5mb3JFYWNoKChjb21wb25lbnRJbnN0YW5jZSkgPT5cclxuICAgICAgdGhpcy5fc2V0Q29tcG9uZW50SW5wdXRzKGNvbXBvbmVudEluc3RhbmNlLCB1cGRhdGVzKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldENvbXBvbmVudElucHV0cyhcclxuICAgIGNvbXBvbmVudEluc3RhbmNlOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcclxuICAgIGlucHV0czogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1cclxuICApIHtcclxuICAgIE9iamVjdC5lbnRyaWVzKGlucHV0cykuZm9yRWFjaChcclxuICAgICAgKFtpbnB1dCwgaW5wdXRWYWx1ZV0pID0+IChjb21wb25lbnRJbnN0YW5jZVtpbnB1dF0gPSBpbnB1dFZhbHVlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N1YnNjcmliZUNvbXBvbmVudE91dHB1dHMoXHJcbiAgICBjb21wb25lbnRJbnN0YW5jZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sXHJcbiAgICBvdXRwdXRzOiB7IFtrOiBzdHJpbmddOiAoZXZlbnRUeXBlOiB1bmtub3duKSA9PiB2b2lkIH1cclxuICApIHtcclxuICAgIE9iamVjdC5rZXlzKG91dHB1dHMpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG91dHB1dCkgPT4gY29tcG9uZW50SW5zdGFuY2Vbb3V0cHV0XSAmJiBjb21wb25lbnRJbnN0YW5jZVtvdXRwdXRdIGluc3RhbmNlb2YgT2JzZXJ2YWJsZVxyXG4gICAgICApXHJcbiAgICAgIC5mb3JFYWNoKChvdXRwdXQpID0+XHJcbiAgICAgICAgKGNvbXBvbmVudEluc3RhbmNlW291dHB1dF0gYXMgT2JzZXJ2YWJsZTx1bmtub3duPilcclxuICAgICAgICAgIC5waXBlKHRha2VXaGlsZSgoKSA9PiAhdGhpcy5kZXN0cm95ZWQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZShvdXRwdXRzW291dHB1dF0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5jbGllbnRPbmx5ICYmIGlzUGxhdGZvcm1TZXJ2ZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fY29tcG9uZW50SW5zdGFuY2VzID0gW107XHJcbiAgICB0aGlzLnZpZXcuY2xlYXIoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucmVuZGVyaW5nICYmICF0aGlzLnJlbmRlcmluZ3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5uYW1lICYmICF0aGlzLnJlbmRlcmluZ3MpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICdQbGFjZWhvbGRlciBuYW1lIHdhcyBub3Qgc3BlY2lmaWVkLCBhbmQgZXhwbGljaXQgcmVuZGVyaW5ncyBhcnJheSB3YXMgbm90IHBhc3NlZC4gUGxhY2Vob2xkZXIgcmVxdWlyZXMgZWl0aGVyIG5hbWUgYW5kIHJlbmRlcmluZywgb3IgcmVuZGVyaW5ncy4nXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMucmVuZGVyaW5ncyB8fCBnZXRQbGFjZWhvbGRlcih0aGlzLnJlbmRlcmluZywgdGhpcy5uYW1lIHx8ICcnKTtcclxuXHJcbiAgICBpZiAoIXBsYWNlaG9sZGVyKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgUGxhY2Vob2xkZXIgJyR7dGhpcy5uYW1lfScgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCByZW5kZXJpbmcgZGF0YWAsXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5yZW5kZXJpbmcsIG51bGwsIDIpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiB0aGUgcGxhY2Vob2xkZXIgaXMgZW1wdHkgKGNvbnRhaW5zIG9ubHkgcmF3IHJlbmRlcmluZ3MpLCB0aGVuIHdlIG1heSBuZWVkIHRvIHVzZSB0aGUgZW1wdHkgdGVtcGxhdGUgaWYgaXQncyBkZWZpbmVkXHJcbiAgICBjb25zdCBwbGFjZWhvbGRlcklzRW1wdHkgPSBwbGFjZWhvbGRlci5ldmVyeShcclxuICAgICAgKHJlbmRlcmluZzogQ29tcG9uZW50UmVuZGVyaW5nIHwgSHRtbEVsZW1lbnRSZW5kZXJpbmcpID0+IGlzUmF3UmVuZGVyaW5nKHJlbmRlcmluZylcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMucmVuZGVyRW1wdHlUZW1wbGF0ZSAmJiBwbGFjZWhvbGRlcklzRW1wdHkpIHtcclxuICAgICAgdGhpcy52aWV3LmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnJlbmRlckVtcHR5VGVtcGxhdGUudGVtcGxhdGVSZWYsIHtcclxuICAgICAgICByZW5kZXJpbmdzOiBwbGFjZWhvbGRlcixcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBmYWN0b3JpZXMgPSBhd2FpdCB0aGlzLmNvbXBvbmVudEZhY3RvcnkuZ2V0Q29tcG9uZW50cyhwbGFjZWhvbGRlcik7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IG5vbkd1YXJkZWQgPSBhd2FpdCB0aGlzLmd1YXJkUmVzb2x2ZXIoZmFjdG9yaWVzKTtcclxuICAgICAgICBjb25zdCB3aXRoRGF0YSA9IGF3YWl0IHRoaXMuZGF0YVJlc29sdmVyKG5vbkd1YXJkZWQpO1xyXG5cclxuICAgICAgICB3aXRoRGF0YS5mb3JFYWNoKChyZW5kZXJpbmcsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5yZW5kZXJFYWNoVGVtcGxhdGUgJiYgIWlzUmF3UmVuZGVyaW5nKHJlbmRlcmluZy5mYWN0b3J5LmNvbXBvbmVudERlZmluaXRpb24pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRlbXBsYXRlZENvbXBvbmVudChyZW5kZXJpbmcuZmFjdG9yeS5jb21wb25lbnREZWZpbml0aW9uLCBpbmRleCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJFbWJlZGRlZENvbXBvbmVudChyZW5kZXJpbmcuZmFjdG9yeSwgcmVuZGVyaW5nLmRhdGEsIGluZGV4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIHRoaXMubG9hZGVkLmVtaXQodGhpcy5uYW1lKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBVcmxUcmVlKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZV0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW5kZXJUZW1wbGF0ZWRDb21wb25lbnQoXHJcbiAgICByZW5kZXJpbmc6IENvbXBvbmVudFJlbmRlcmluZyB8IEh0bWxFbGVtZW50UmVuZGVyaW5nLFxyXG4gICAgaW5kZXg6IG51bWJlclxyXG4gICkge1xyXG4gICAgLy8gdGhlIHJlbmRlci1lYWNoIHRlbXBsYXRlIHRha2VzIGNhcmUgb2YgYWxsIGNvbXBvbmVudCBtYXBwaW5nIGV0Y1xyXG4gICAgLy8gZ2VuZXJhbGx5IHVzaW5nIDxzYy1yZW5kZXItY29tcG9uZW50PiB3aGljaCBpcyBhYm91dCBsaWtlIF9yZW5kZXJFbWJlZGRlZENvbXBvbmVudCgpXHJcbiAgICAvLyBhcyBhIHNlcGFyYXRlIGNvbXBvbmVudFxyXG4gICAgdGhpcy52aWV3LmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnJlbmRlckVhY2hUZW1wbGF0ZS50ZW1wbGF0ZVJlZiwge1xyXG4gICAgICByZW5kZXJpbmcsXHJcbiAgICAgIGluZGV4LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW5kZXJFbWJlZGRlZENvbXBvbmVudChyZW5kZXJpbmc6IENvbXBvbmVudEZhY3RvcnlSZXN1bHQsIGRhdGE6IERhdGEsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmIChcclxuICAgICAgKHJlbmRlcmluZy5jb21wb25lbnREZWZpbml0aW9uIGFzIENvbXBvbmVudFJlbmRlcmluZykuY29tcG9uZW50TmFtZSA9PT0gSElEREVOX1JFTkRFUklOR19OQU1FXHJcbiAgICApIHtcclxuICAgICAgcmVuZGVyaW5nLmNvbXBvbmVudEltcGxlbWVudGF0aW9uID0gdGhpcy5oaWRkZW5SZW5kZXJpbmdDb21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFyZW5kZXJpbmcuY29tcG9uZW50SW1wbGVtZW50YXRpb24pIHtcclxuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IChyZW5kZXJpbmcuY29tcG9uZW50RGVmaW5pdGlvbiBhcyBDb21wb25lbnRSZW5kZXJpbmcpLmNvbXBvbmVudE5hbWU7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgYFBsYWNlaG9sZGVyICR7dGhpcy5uYW1lfSBjb250YWlucyB1bmtub3duIGNvbXBvbmVudCAke2NvbXBvbmVudE5hbWV9LmAsXHJcbiAgICAgICAgYEVuc3VyZSBjb21wb25lbnQgaXMgbWFwcGVkLCBsaWtlOlxyXG4gICAgICAgIEpzc01vZHVsZS53aXRoQ29tcG9uZW50cyhbXHJcbiAgICAgICAgICB7IG5hbWU6ICcke2NvbXBvbmVudE5hbWV9JywgdHlwZTogJHtjb21wb25lbnROYW1lfUNvbXBvbmVudCB9XHJcbiAgICAgICAgXSlgXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZW5kZXJpbmcuY29tcG9uZW50SW1wbGVtZW50YXRpb24gPSB0aGlzLm1pc3NpbmdDb21wb25lbnRDb21wb25lbnQ7XHJcbiAgICB9XHJcbiAgICAvLyBhcHBseSB0aGUgcGFyZW50IHN0eWxlIGF0dHJpYnV0ZSBfbmdjb250ZW50XHJcbiAgICAvLyB3b3JrLWFyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTIyMTVcclxuICAgIGNvbnN0IGNyZWF0ZWRDb21wb25lbnRSZWYgPSB0aGlzLnZpZXcuY3JlYXRlQ29tcG9uZW50KHJlbmRlcmluZy5jb21wb25lbnRJbXBsZW1lbnRhdGlvbiwge1xyXG4gICAgICBpbmRleDogaW5kZXgsXHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLnBhcmVudFN0eWxlQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgIGNyZWF0ZWRDb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCxcclxuICAgICAgICB0aGlzLnBhcmVudFN0eWxlQXR0cmlidXRlLFxyXG4gICAgICAgICcnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVkQ29tcG9uZW50UmVmLmluc3RhbmNlO1xyXG4gICAgY29tcG9uZW50SW5zdGFuY2UucmVuZGVyaW5nID0gcmVuZGVyaW5nLmNvbXBvbmVudERlZmluaXRpb247XHJcbiAgICBjb21wb25lbnRJbnN0YW5jZS5kYXRhID0gZGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5faW5wdXRzKSB7XHJcbiAgICAgIHRoaXMuX3NldENvbXBvbmVudElucHV0cyhjb21wb25lbnRJbnN0YW5jZSwgdGhpcy5faW5wdXRzKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm91dHB1dHMpIHtcclxuICAgICAgdGhpcy5fc3Vic2NyaWJlQ29tcG9uZW50T3V0cHV0cyhjb21wb25lbnRJbnN0YW5jZSwgdGhpcy5vdXRwdXRzKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcy5wdXNoKGNvbXBvbmVudEluc3RhbmNlKTtcclxuICB9XHJcbn1cclxuIl19
|