@coolon/angular-ui-powerups 16.1.0-alpha.302 → 16.1.0-alpha.304
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/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +25 -3
- package/fesm2022/coolon-angular-ui-powerups.mjs +24 -2
- package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
- package/lib/components/tables/renderer/table-body/table-body.component.d.ts +9 -0
- package/package.json +2 -2
|
@@ -83,8 +83,14 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
83
83
|
columnIds$;
|
|
84
84
|
footerRowDefs$;
|
|
85
85
|
columnsById$;
|
|
86
|
-
|
|
86
|
+
/**
|
|
87
|
+
* The header row's height, which the virtual scroller offsets its rows by and which pins the header
|
|
88
|
+
* cells in virtual mode. Taken from --aup-table-header-row-height (table.scss sets 48px), so a table
|
|
89
|
+
* themed with a shorter header scrolls correctly; 48 when the variable can't be read.
|
|
90
|
+
*/
|
|
87
91
|
headerHeight$ = new MutableValueModel(48);
|
|
92
|
+
// TODO: take the row height from --aup-table-row-height too. Not a drop-in: table.scss sets it to
|
|
93
|
+
// 40px while virtual rows have always been 44, so following it would shrink every virtual row.
|
|
88
94
|
rowHeight$ = new MutableValueModel(44);
|
|
89
95
|
baseCssClass = "aup-table-component";
|
|
90
96
|
get animationsDisabledClass() { return this.animationsDisabled$.value; }
|
|
@@ -118,6 +124,10 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
118
124
|
}, { dependsOn: this.headerHeight$ });
|
|
119
125
|
// performance is terrible if the data changes while we're scrolling, so we postpone updates until
|
|
120
126
|
// scrolling stops.
|
|
127
|
+
// A body inside projected content (a loading container, a card) is initialised before it is in the
|
|
128
|
+
// document, where no theme variable resolves. Its first reported size is the moment it is, so take
|
|
129
|
+
// the header height again then; the report arrives outside change detection, so this is safe.
|
|
130
|
+
when(this.bounds$).changes(() => this.takeHeaderHeightFromTheme());
|
|
121
131
|
const delayedData$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
|
|
122
132
|
when(delayedData$).changes(delatedData => {
|
|
123
133
|
this.animationsDisabled$.value = true;
|
|
@@ -137,6 +147,9 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
137
147
|
this.resetAnimationsAfterFrame();
|
|
138
148
|
}, { initialValue: "evaluate" });
|
|
139
149
|
this.onInit(() => {
|
|
150
|
+
// On init, not after the view: the header height is bound in this view and in a host binding,
|
|
151
|
+
// and changing it after they are checked would trip ExpressionChangedAfterItHasBeenChecked.
|
|
152
|
+
this.takeHeaderHeightFromTheme();
|
|
140
153
|
this.columns$ = chain(this.tableModel.visibleColumns$);
|
|
141
154
|
this.columnIds$ = chain(this.columns$).pluck("columnId");
|
|
142
155
|
this.columnsById$ = chain(this.columns$).indexBy('columnId');
|
|
@@ -146,7 +159,7 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
146
159
|
const footerVisibility$ = (this.footerRows ?? [])
|
|
147
160
|
.map(row => row.visible$)
|
|
148
161
|
.filter((m) => m != null);
|
|
149
|
-
this.viewStateDependsOn(this.tableModel.filteredRows$, this.tableModel.visibleColumns$, this.virtualScrollActive$, this.animationsDisabled$, this.tableModel.selectedItems$, this.tableModel.selectableRows$, this.footerRowDefs$, ...footerVisibility$);
|
|
162
|
+
this.viewStateDependsOn(this.headerHeight$, this.tableModel.filteredRows$, this.tableModel.visibleColumns$, this.virtualScrollActive$, this.animationsDisabled$, this.tableModel.selectedItems$, this.tableModel.selectableRows$, this.footerRowDefs$, ...footerVisibility$);
|
|
150
163
|
});
|
|
151
164
|
}
|
|
152
165
|
ngAfterViewInit() {
|
|
@@ -210,6 +223,15 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
210
223
|
}
|
|
211
224
|
return classes;
|
|
212
225
|
}
|
|
226
|
+
/** Sets [headerHeight$] from --aup-table-header-row-height, keeping the current value when it can't be read. */
|
|
227
|
+
takeHeaderHeightFromTheme() {
|
|
228
|
+
this.headerHeight$.value = this.readCssPixels("--aup-table-header-row-height") ?? this.headerHeight$.value;
|
|
229
|
+
}
|
|
230
|
+
/** A length custom property as resolved on this element, in px; undefined when unset or not a length. */
|
|
231
|
+
readCssPixels(property) {
|
|
232
|
+
const pixels = parseFloat(getComputedStyle(this.elementRef.nativeElement).getPropertyValue(property));
|
|
233
|
+
return Number.isFinite(pixels) && pixels > 0 ? pixels : undefined;
|
|
234
|
+
}
|
|
213
235
|
scheduleTableHeightCheck(waitMillis = 50) {
|
|
214
236
|
setTimeout(() => {
|
|
215
237
|
// Use CDK's internal rendered range to detect a broken virtual scroll state —
|
|
@@ -351,4 +373,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
|
|
|
351
373
|
type: HostBinding,
|
|
352
374
|
args: ["style.--aup-table-row-height"]
|
|
353
375
|
}] } });
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzR0FBc0c7QUFDdEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBSTlELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7QUFFM0YsTUFBTSxDQUFDLE1BQU0sMENBQTBDLEdBQUcsSUFBSSxjQUFj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QkFEbEIsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSUcsV0FBVztzQkFEbkIsS0FBSztnQkFLRyxVQUFVO3NCQUZsQixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGlCQUFpQjtnQkFJOUIsY0FBYztzQkFEYixTQUFTO3VCQUFDLHdCQUF3QjtnQkFlbkMsWUFBWTtzQkFEWCxXQUFXO3VCQUFDLE9BQU87Z0JBSWhCLHVCQUF1QjtzQkFEMUIsV0FBVzt1QkFBQywrQkFBK0I7Z0JBZ0h4QyxVQUFVO3NCQURiLFdBQVc7dUJBQUMsbUJBQW1CO2dCQU01QixrQkFBa0I7c0JBRHJCLFdBQVc7dUJBQUMsaUNBQWlDO2dCQU0xQyxlQUFlO3NCQURsQixXQUFXO3VCQUFDLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gdGFibGUgYm9keSByZW5kZXJzIGFyYml0cmFyeSByb3cvY2VsbCB0eXBlcyAqL1xuaW1wb3J0IHtDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnR9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGQsXG4gIGluamVjdFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgRHNsLFxuICBMaXN0TW9kZWwsXG4gIExpc3RNb2RlbENoYWluLFxuICBNYXBNb2RlbENoYWluLFxuICBNdXRhYmxlVmFsdWVNb2RlbCxcbiAgUHJveGlmeSxcbiAgcHJveGlmeSxcbiAgU3RvcmVJblZhbHVlTW9kZWwsXG4gIFZhbHVlTW9kZWxcbn0gZnJvbSBcIkBjb29sb24vcGVjdGluXCI7XG5pbXBvcnQge1RhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2V9IGZyb20gXCJuZy10YWJsZS12aXJ0dWFsLXNjcm9sbFwiO1xuaW1wb3J0IHtSZXNpemVBd2FyZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3Jlc2l6ZS1hd2FyZS5jb21wb25lbnRcIjtcbmltcG9ydCB7QWJzdHJhY3RUYWJsZU1vZGVsfSBmcm9tIFwiLi4vLi4vYWJzdHJhY3QtdGFibGUtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtDb2x1bW5Nb2RlbH0gZnJvbSBcIi4uLy4uL2NvbHVtbi9jb2x1bW4tbW9kZWxcIjtcbmltcG9ydCB7Rm9vdGVyUm93TW9kZWwsIFJlc29sdmVkRm9vdGVyUm93fSBmcm9tIFwiLi4vLi4vZm9vdGVyL2Zvb3Rlci1yb3ctbW9kZWxcIjtcblxuaW1wb3J0IHtBVVBfREVUQUNIRURfUEFSRU5UX0NEUiwgRGlzcG9zYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3Bvc2FibGUtY29tcG9uZW50XCI7XG5cbmV4cG9ydCBjb25zdCBBVVBfVEFCTEVfVklSVFVBTF9TQ1JPTExfQlVGRkVSX01VTFRJUExJRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcIkFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUlwiKVxuZXhwb3J0IGNvbnN0IEFVUF9UQUJMRV9PUFRJTUlaRURfQ0hBTkdFX0RFVEVDVElPTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPihcIkFVUF9UQUJMRV9PUFRJTUlaRURfQ0hBTkdFX0RFVEVDVElPTlwiKVxuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbYXVwVGFibGVSb3dBdHRyaWJ1dGVzXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVJvd0F0dHJpYnV0ZXNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpXG4gIGF1cFRhYmxlUm93QXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8qKiBBdHRyaWJ1dGUgbmFtZXMgYXBwbGllZCBvbiB0aGUgcHJldmlvdXMgcGFzcywgc28gb25lcyB0aGF0IGRpc2FwcGVhciBjYW4gYmUgcmVtb3ZlZC4gKi9cbiAgcHJpdmF0ZSBhcHBsaWVkQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gIH1cblxuICAvLyBSZS1hcHBseSBvbiBldmVyeSBjaGFuZ2UsIG5vdCBqdXN0IG9uY2UgYXQgaW5pdDogYSByb3cncyBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBjaGFuZ2UgYWZ0ZXIgdGhlXG4gIC8vIHJvdyBoYXMgcmVuZGVyZWQgKGUuZy4gYW4gT1RBUCBkZXZpY2Ugcm93IHdob3NlIGRldmljZSByZWNvcmQgcmVzb2x2ZXMgYWZ0ZXIgaXRzIHNjcmF0Y2hwYWQgcm93XG4gIC8vIHdhcyBjcmVhdGVkKSwgYW5kIHRoZSBlbGVtZW50IG11c3QgcmVmbGVjdCB0aGUgbGF0ZXN0IHZhbHVlcy4gUHJldmlvdXNseSB0aGlzIGltcGxlbWVudGVkIE9uSW5pdCxcbiAgLy8gc28gdGhlIGF0dHJpYnV0ZXMgd2VyZSBmcm96ZW4gYXQgcm93LWNyZWF0aW9uIHRpbWUgYW5kIHdlbnQgc3RhbGUgKGUuZy4gZGV2aWNlSGFyZHdhcmVJZCBzdHVjayBvblxuICAvLyBpdHMgaW5pdGlhbCBcInVuZGVmaW5lZFwiKS5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmF1cFRhYmxlUm93QXR0cmlidXRlcyA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgb2YgdGhpcy5hcHBsaWVkQXR0cmlidXRlTmFtZXMpIHtcbiAgICAgIGlmICghKGF0dHIgaW4gbmV4dCkpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYXBwbGllZEF0dHJpYnV0ZU5hbWVzID0gT2JqZWN0LmtleXMobmV4dCk7XG4gICAgZm9yIChjb25zdCBhdHRyIG9mIHRoaXMuYXBwbGllZEF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBuZXh0W2F0dHJdKTtcbiAgICB9XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF1cC10YWJsZS1ib2R5XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFibGUtYm9keS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGFibGUtYm9keS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBBVVBfREVUQUNIRURfUEFSRU5UX0NEUiwgdXNlRmFjdG9yeTogKCkgPT4gaW5qZWN0KEFVUF9UQUJMRV9PUFRJTUlaRURfQ0hBTkdFX0RFVEVDVElPTiwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZikgOiBudWxsIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlDb21wb25lbnQ8Um93IGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFJlc2l6ZUF3YXJlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIGRhdGEkOiBMaXN0TW9kZWw8Um93PiA9IHByb3hpZnkoTGlzdE1vZGVsPFJvdz4pO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3IgdGFibGVNb2RlbDogQWJzdHJhY3RUYWJsZU1vZGVsPFJvdz4gPSBwcm94aWZ5KEFic3RyYWN0VGFibGVNb2RlbDxSb3c+KTtcblxuICAvLyBGb290ZXIgcm93cyBhcmUgYnVpbHQgb25jZSBpbiB0aGUgVGFibGVNb2RlbCBidWlsZGVyIGNhbGxiYWNrLCBzbyBhIHBsYWluIGlucHV0IGlzIGVub3VnaDtcbiAgLy8gdGhlIHBlci1yb3cgY2VsbCBsYXlvdXQgKGZvb3RlclJvd0RlZnMkKSBpcyBkZXJpdmVkIHJlYWN0aXZlbHkgZnJvbSB0aGUgdmlzaWJsZSBjb2x1bW5zLlxuICBASW5wdXQoKVxuICBmb290ZXJSb3dzOiBGb290ZXJSb3dNb2RlbC5JbXBsW10gPSBbXTtcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIHNob3dIZWFkZXIkOiBWYWx1ZU1vZGVsPGJvb2xlYW4+ID0gcHJveGlmeShWYWx1ZU1vZGVsPGJvb2xlYW4+KTtcblxuICBASW5wdXQoKSBAU3RvcmVJblZhbHVlTW9kZWwoKVxuICBhY2Nlc3NvciBzaG93SGVhZGVyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICB0cmFja0J5OiAoaW5kZXg6IG51bWJlciwgaXRlbTogUm93KSA9PiBhbnlcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIHNjcm9sbE1vZGUkOiBWYWx1ZU1vZGVsPFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlPiA9IHByb3hpZnkoVmFsdWVNb2RlbDxUYWJsZUJvZHlDb21wb25lbnQuU2Nyb2xsTW9kZT4pO1xuXG4gIEBJbnB1dCgpIEBTdG9yZUluVmFsdWVNb2RlbCgpXG4gIEBIb3N0QmluZGluZyhcImF0dHIuc2Nyb2xsTW9kZVwiKVxuICBhY2Nlc3NvciBzY3JvbGxNb2RlOiBUYWJsZUJvZHlDb21wb25lbnQuU2Nyb2xsTW9kZSA9IFwibm9uZVwiO1xuXG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KVxuICBzY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0XG5cbiAgY29sdW1ucyQ6IExpc3RNb2RlbENoYWluPENvbHVtbk1vZGVsPFJvdz4+O1xuICBjb2x1bW5JZHMkOiBMaXN0TW9kZWxDaGFpbjxzdHJpbmc+O1xuICBmb290ZXJSb3dEZWZzJDogVmFsdWVNb2RlbDxSZXNvbHZlZEZvb3RlclJvd1tdPjtcblxuICBwcml2YXRlIGNvbHVtbnNCeUlkJDogTWFwTW9kZWxDaGFpbjxzdHJpbmcsIENvbHVtbk1vZGVsPFJvdz4+O1xuXG5cbiAgLy8gVE9ETzogc3VwcG9ydCB1c2VyIGRlZmluZWQgaGVhZGVyIGFuZCByb3cgaGVpZ2h0cyB2aWEgY3NzIHZhcnMuXG4gIHByb3RlY3RlZCByZWFkb25seSBoZWFkZXJIZWlnaHQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDgpO1xuICBwcm90ZWN0ZWQgcm93SGVpZ2h0JCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxudW1iZXI+KDQ0KTtcblxuICBASG9zdEJpbmRpbmcoXCJjbGFzc1wiKVxuICBiYXNlQ3NzQ2xhc3MgPSBcImF1cC10YWJsZS1jb21wb25lbnRcIjtcblxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5hdXAtYW5pbWF0aW9ucy1kaXNhYmxlZFwiKVxuICBnZXQgYW5pbWF0aW9uc0Rpc2FibGVkQ2xhc3MoKSB7IHJldHVybiB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQudmFsdWU7IH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlydHVhbFNjcm9sbERhdGFTb3VyY2UgPSBuZXcgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZTxSb3c+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSB2aXJ0dWFsU2Nyb2xsQWN0aXZlJCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhbmltYXRpb25zRGlzYWJsZWQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsKGZhbHNlKTtcbiAgcHJpdmF0ZSBzY3JvbGxUaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgYW5pbWF0aW9uc1Jlc2V0UmFmSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjcm9sbEVuZEFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgdmlld0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICBpZiAodGhpcy5vcHRpbWlzZWRDaGFuZ2VEZXRlY3Rpb25FbmFibGVkKSB7XG4gICAgICAvLyBUaGUgdGFibGUtYm9keSBkZXRhY2hlcyBpdHMgb3duIENEUiBhbmQgaGFzIG5vIGRldGFjaGVkIHBhcmVudCAoQVVQX0RFVEFDSEVEX1BBUkVOVF9DRFJcbiAgICAgIC8vIHVzZXMgc2tpcFNlbGYpLCBzbyB0aGUgYmFzZSBtYXJrRm9yQ2hlY2soKSB3b3VsZCBjYWxsIGNkci5tYXJrRm9yQ2hlY2soKSB3aGljaCBpcyBhXG4gICAgICAvLyBuby1vcCBvbiBhIGRldGFjaGVkIHZpZXcuIFNjaGVkdWxlIGFuIGV4cGxpY2l0IGRldGVjdENoYW5nZXMoKSBvbiBvdXJzZWx2ZXMgaW5zdGVhZCBzb1xuICAgICAgLy8gdGhhdCB2aWV3U3RhdGVEZXBlbmRzT24oKSBjb3JyZWN0bHkgdHJpZ2dlcnMgcmUtcmVuZGVycyAoZS5nLiByb3cgc2VsZWN0aW9uIGNsYXNzZXMpLlxuICAgICAgRGlzcG9zYWJsZUNvbXBvbmVudC5zY2hlZHVsZVBhcmVudFN3ZWVwKHRoaXMuY2RyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUikgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGJ1ZmZlck11bHRpcGxpZXI6IG51bWJlciA9IDMpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IHtjaGFpbiwgd2hlbiwgb2JzZXJ2ZX0gPSBEc2wuZGlzcG9zZVdpdGgodGhpcyk7XG5cbiAgICB0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQgPSB0aGlzLmluamVjdChBVVBfVEFCTEVfT1BUSU1JWkVEX0NIQU5HRV9ERVRFQ1RJT04sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgY29uc3QgYWN0dWFsSGVhZGVySGVpZ2h0JCA9IGNoYWluKHRoaXMuc2hvd0hlYWRlciQpLm1hcChzaG93ID0+IHtcbiAgICAgIHJldHVybiBzaG93ID8gdGhpcy5oZWFkZXJIZWlnaHQkLnZhbHVlIDogMDtcbiAgICB9LCB7ZGVwZW5kc09uOiB0aGlzLmhlYWRlckhlaWdodCR9KTtcblxuXG4gICAgLy8gcGVyZm9ybWFuY2UgaXMgdGVycmlibGUgaWYgdGhlIGRhdGEgY2hhbmdlcyB3aGlsZSB3ZSdyZSBzY3JvbGxpbmcsIHNvIHdlIHBvc3Rwb25lIHVwZGF0ZXMgdW50aWxcbiAgICAvLyBzY3JvbGxpbmcgc3RvcHMuXG4gICAgY29uc3QgZGVsYXllZERhdGEkID0gY2hhaW4odGhpcy5kYXRhJCkucG9zdHBvbmVXaGlsZSh0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkKVxuICAgIHdoZW4oZGVsYXllZERhdGEkKS5jaGFuZ2VzKGRlbGF0ZWREYXRhID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZSA9IHRydWU7XG4gICAgICAvLyBVcGRhdGUgdGhlIENESyBkYXRhIHNvdXJjZSBiZWZvcmUgZGV0ZWN0Q2hhbmdlcyBzbyB0aGF0IGJvdGggdGhlIGV4cGxpY2l0IGRldGVjdENoYW5nZXNcbiAgICAgIC8vIGFuZCBhbnkgc3Vic2VxdWVudCBTV0VFUC10cmlnZ2VyZWQgZGV0ZWN0Q2hhbmdlcyBzZWUgdGhlIHNhbWUgZGF0YS4gSWYgd2UgdXBkYXRlIGFmdGVyLFxuICAgICAgLy8gdGhlIFNXRUVQJ3MgZGV0ZWN0Q2hhbmdlcyBzZWVzIGRpZmZlcmVudCByb3cgb2JqZWN0cyBhbmQgdHJpZ2dlcnMgYSBzZWNvbmQgY2FzY2FkZS5cbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbERhdGFTb3VyY2UuZGF0YSA9IGRlbGF0ZWREYXRhO1xuICAgICAgLy8gV2l0aCBkZXRhY2hlZCBDRCwgbWFya0ZvckNoZWNrKCkgYWxvbmUgd29uJ3QgcHVzaCBbQC5kaXNhYmxlZF09XCJ0cnVlXCIgdG8gdGhlIERPTS5cbiAgICAgIC8vIERldGVjdCBzeW5jaHJvbm91c2x5IHNvIENESyByZW5kZXJzIG5ldyByb3dzIHdpdGggYW5pbWF0aW9ucyBhbHJlYWR5IHN1cHByZXNzZWQuXG4gICAgICAvLyBhbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlIGlzIGFscmVhZHkgdHJ1ZSAoc2V0IGFib3ZlKSwgc28gdGhlIHRlbXBsYXRlIGV2YWx1YXRpb25cbiAgICAgIC8vIGluIHRoaXMgZGV0ZWN0Q2hhbmdlcyB3aWxsIHNlZSBbQC5kaXNhYmxlZF09XCJ0cnVlXCIgYmVmb3JlIGFueSBuZXcgcm93cyBhcmUgY3JlYXRlZC5cbiAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHtpbml0aWFsVmFsdWU6XCJldmFsdWF0ZVwifSBmaXJpbmcgZHVyaW5nIGNvbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHZpZXcgZXhpc3RzLlxuICAgICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnZpZXdJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjaGVkdWxlVGFibGVIZWlnaHRDaGVjaygpO1xuICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbnNBZnRlckZyYW1lKCk7XG4gICAgfSwge2luaXRpYWxWYWx1ZTogXCJldmFsdWF0ZVwifSlcblxuXG4gICAgdGhpcy5vbkluaXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zJCA9IGNoYWluKHRoaXMudGFibGVNb2RlbC52aXNpYmxlQ29sdW1ucyQpO1xuICAgICAgdGhpcy5jb2x1bW5JZHMkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkucGx1Y2soXCJjb2x1bW5JZFwiKTtcbiAgICAgIHRoaXMuY29sdW1uc0J5SWQkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkuaW5kZXhCeSgnY29sdW1uSWQnKTtcbiAgICAgIHRoaXMuZm9vdGVyUm93RGVmcyQgPSBjaGFpbih0aGlzLmNvbHVtbklkcyQpLnJlZHVjZUFsbChpZHMgPT5cbiAgICAgICAgKHRoaXMuZm9vdGVyUm93cyA/PyBbXSkubWFwKChyb3csIGkpID0+IHJvdy5yZXNvbHZlKGksIFsuLi5pZHNdKSlcbiAgICAgICk7XG4gICAgICAvLyBGb290ZXIgcm93cyBnYXRlZCB2aWEgdmlzaWJsZVdoaWxlKCkgZmxpcCBpbmRlcGVuZGVudGx5IG9mIHRoZSBjb2x1bW5zIHRoYXQgZHJpdmVcbiAgICAgIC8vIGZvb3RlclJvd0RlZnMkLCBzbyBkZXBlbmQgb24gdGhlaXIgbW9kZWxzIGRpcmVjdGx5IHRvIHJlLXJlbmRlciB0aGUgPHRyPiByZWFjdGl2ZWx5LlxuICAgICAgY29uc3QgZm9vdGVyVmlzaWJpbGl0eSQgPSAodGhpcy5mb290ZXJSb3dzID8/IFtdKVxuICAgICAgICAubWFwKHJvdyA9PiByb3cudmlzaWJsZSQpXG4gICAgICAgIC5maWx0ZXIoKG0pOiBtIGlzIFZhbHVlTW9kZWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD4gPT4gbSAhPSBudWxsKTtcbiAgICAgIHRoaXMudmlld1N0YXRlRGVwZW5kc09uKHRoaXMudGFibGVNb2RlbC5maWx0ZXJlZFJvd3MkLCB0aGlzLnRhYmxlTW9kZWwudmlzaWJsZUNvbHVtbnMkLCB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkLCB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQsIHRoaXMudGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zJCwgdGhpcy50YWJsZU1vZGVsLnNlbGVjdGFibGVSb3dzJCwgdGhpcy5mb290ZXJSb3dEZWZzJCwgLi4uZm9vdGVyVmlzaWJpbGl0eSQpXG4gICAgfSk7XG5cbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLnZpZXdJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHtvYnNlcnZlfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQuZWxlbWVudFNjcm9sbGVkKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMubm90aWZ5U2Nyb2xsZWQoKSk7XG4gICAgICB0aGlzLnNjcm9sbEVuZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdzY3JvbGxlbmQnLFxuICAgICAgICAoKSA9PiB0aGlzLm5vdGlmeVNjcm9sbEVuZGVkKCksXG4gICAgICAgIHtwYXNzaXZlOiB0cnVlLCBzaWduYWw6IHRoaXMuc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyLnNpZ25hbH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgIHRoaXMuY2RyLmRldGFjaCgpO1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgLy8gRGVmZXIgcGFzdCB0aGUgY3VycmVudCBzeW5jIGJhdGNoIHNvIHRoZSBkYXRhIHNvdXJjZSBoYXMgdXBkYXRlZCBfcmVuZGVyZWRJdGVtcyBiZWZvcmUgd2UgcnVuIENELlxuICAgICAgICAgIC8vIE11c3QgY2FsbCBkZXRlY3RDaGFuZ2VzKCkgZGlyZWN0bHkg4oCUIG1hcmtGb3JDaGVjaygpIGFsb25lIGRvZXMgbm90aGluZyBvbiBhIGRldGFjaGVkIHZpZXcuXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRXh0ZW5kIHRoZSBhbmltYXRpb24gc3VwcHJlc3Npb24gd2luZG93IG9uIGVhY2ggQ0RLIHJhbmdlIGNoYW5nZSBzbyBhbmltYXRpb25zIGNhbid0XG4gICAgICAgICAgLy8gZmlyZSBtaWQtcmVuZGVyIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgZnJhbWVzIHRoZSByYW5nZSB1cGRhdGUgc3BhbnMuXG4gICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbnNBZnRlckZyYW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIERlZmVyIHBhc3QgdGhlIGN1cnJlbnQgdGljayBzbyB0aGUgdmlld3BvcnQncyBpbml0aWFsIHJlbmRlcmVkIHJhbmdlIGlzIHN0YWJsZVxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmhpZGUtaGVhZGVyXCIpXG4gIGdldCBoaWRlSGVhZGVyKCkge1xuICAgIHJldHVybiAhdGhpcy5zaG93SGVhZGVyO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuLS1hdXAtdGFibGUtaGVhZGVyLWhlaWdodFwiKVxuICBnZXQgaGVhZGVySGVpZ2h0Q3NzVmFyKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmhlYWRlckhlaWdodCQudmFsdWV9cHhgXG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLWF1cC10YWJsZS1yb3ctaGVpZ2h0XCIpXG4gIGdldCByb3dIZWlnaHRDc3NWYXIoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucm93SGVpZ2h0JC52YWx1ZX1weGBcbiAgfVxuXG4gIG5vdGlmeUNlbGxDbGlja2VkKGNvbHVtbk1vZGVsOiBDb2x1bW5Nb2RlbDxSb3c+LCByb3c6IFJvdykge1xuICAgIHRoaXMudGFibGVNb2RlbC5fbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWwsIHJvdyk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzRmlyc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsLmZpcnN0VmlzaWJsZUNvbHVtbiQucXVlcnkoKS52YWx1ZT8uY29sdW1uSWQgPT09IGNvbHVtbklkO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcblxuICBpc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsLmxhc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICBnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW2BhdXAtY29sLSR7dGhpcy5jb2x1bW5zQnlJZCQuZ2V0KGNvbHVtbklkKS5kYXNoZXJpc2VkQ29sdW1uSWR9YF07XG4gICAgaWYgKHRoaXMuaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQpKSB7XG4gICAgICBjbGFzc2VzLnB1c2goXCJmaXJzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMYXN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImxhc3QtdmlzaWJsZS1jb2x1bW5cIik7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVRhYmxlSGVpZ2h0Q2hlY2sod2FpdE1pbGxpcyA9IDUwKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBVc2UgQ0RLJ3MgaW50ZXJuYWwgcmVuZGVyZWQgcmFuZ2UgdG8gZGV0ZWN0IGEgYnJva2VuIHZpcnR1YWwgc2Nyb2xsIHN0YXRlIOKAlFxuICAgICAgLy8gYXZvaWRzIHJlYWRpbmcgb2Zmc2V0SGVpZ2h0IChmb3JjZWQgbGF5b3V0KSBhbmQgZGlzcGF0Y2hpbmcgYSBnbG9iYWwgcmVzaXplIGV2ZW50XG4gICAgICAvLyAod2hpY2ggdHJpZ2dlcnMgQW5ndWxhcidzIGFuaW1hdGlvbiBlbmdpbmUgdG8gY2FsbCBnZXRDb21wdXRlZFN0eWxlIG9uIGFsbCBlbGVtZW50cykuXG4gICAgICBjb25zdCByZW5kZXJlZFJhbmdlID0gdGhpcy5zY3JvbGxWaWV3cG9ydD8uZ2V0UmVuZGVyZWRSYW5nZSgpO1xuICAgICAgLy8gQSB1c2FibGUgdmlydHVhbCB2aWV3cG9ydCByZW5kZXJzIG1vcmUgdGhhbiBvbmUgcm93IHdoZW5ldmVyIG1vcmUgZGF0YSBleGlzdHMuIFJlbmRlcmluZ1xuICAgICAgLy8gbm9uZSBvciBvbmUgcm93IGF0IHRoZSB0b3Agd2hpbGUgZGF0YSQgaG9sZHMgbW9yZSBtZWFucyB0aGUgdmlld3BvcnQgbWVhc3VyZWQgYVxuICAgICAgLy8gY29sbGFwc2VkL3N0YWxlIGhlaWdodCAoZS5nLiBpdCB3YXMgbWVhc3VyZWQgYmVmb3JlIHRoZSB0YWJsZSB3YXMgc2l6ZWQgdXAsIHRoZW4gbmV2ZXJcbiAgICAgIC8vIHJlLW1lYXN1cmVkIHVuZGVyIGRldGFjaGVkIGNoYW5nZSBkZXRlY3Rpb24pIOKAlCBzbyByZS1tZWFzdXJlIHRvIGV4cGFuZCB0aGUgcmVuZGVyZWQgcmFuZ2UuXG4gICAgICAvLyBDb3ZlcnMgYm90aCB0aGUgemVyby1yb3cgY29sbGFwc2UgYW5kIHRoZSBwYXJ0aWFsIChvbmUtcm93KSB1bmRlci1yZW5kZXIuIERldGVjdGlvbiBzdGF5c1xuICAgICAgLy8gbGF5b3V0LWZyZWUgKGdldFJlbmRlcmVkUmFuZ2Ugb25seSk7IGNvcnJlY3RseS1zaXplZCBhbmQgZ2VudWluZWx5LXZpcnR1YWxpc2VkIGxhcmdlXG4gICAgICAvLyB0YWJsZXMgcmVuZGVyIG1hbnkgcm93cywgc28gdGhleSBuZXZlciByZWFjaCB0aGUgY2hlY2tWaWV3cG9ydFNpemUoKSByZWZsb3cgYmVsb3cuXG4gICAgICBjb25zdCByZW5kZXJlZENvdW50ID0gcmVuZGVyZWRSYW5nZSAhPSBudWxsID8gcmVuZGVyZWRSYW5nZS5lbmQgLSByZW5kZXJlZFJhbmdlLnN0YXJ0IDogMDtcbiAgICAgIGNvbnN0IHVuZGVyUmVuZGVyZWQgPSByZW5kZXJlZFJhbmdlICE9IG51bGwgJiYgcmVuZGVyZWRSYW5nZS5zdGFydCA9PT0gMCAmJiByZW5kZXJlZENvdW50IDw9IDE7XG4gICAgICBpZiAodW5kZXJSZW5kZXJlZCAmJiB0aGlzLmRhdGEkLmxlbmd0aCA+IHJlbmRlcmVkQ291bnQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydD8uY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgaWYgKHdhaXRNaWxsaXMgPCA1MDApIHtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlVGFibGVIZWlnaHRDaGVjayh3YWl0TWlsbGlzICsgNTApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgd2FpdE1pbGxpcylcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5U2Nyb2xsZWQoKSB7XG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlJC52YWx1ZSA9IHRydWU7XG4gICAgdGhpcy5hbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlID0gdHJ1ZTtcbiAgICAvLyBTeW5jIHRoZSBbQC5kaXNhYmxlZF09XCJ0cnVlXCIgdG8gdGhlIERPTSBpbW1lZGlhdGVseSBzbyBDREsncyBwZW5kaW5nIHJhbmdlXG4gICAgLy8gdXBkYXRlICh3aGljaCBpcyBzY2hlZHVsZWQgYXN5bmMpIHNlZXMgYW5pbWF0aW9ucyBzdXBwcmVzc2VkIHdoZW4gaXQgcmVuZGVycyByb3dzLlxuICAgIGlmICh0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhclNjcm9sbFRpbWVvdXQoKTtcbiAgICB0aGlzLnNjcm9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMubm90aWZ5U2Nyb2xsRW5kZWQoKSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5U2Nyb2xsRW5kZWQoKSB7XG4gICAgdGhpcy5jbGVhclNjcm9sbFRpbWVvdXQoKTtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkLnZhbHVlID0gZmFsc2U7XG4gICAgdGhpcy5yZXNldEFuaW1hdGlvbnNBZnRlckZyYW1lKCk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnNjcm9sbEVuZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEFuaW1hdGlvbnNBZnRlckZyYW1lKCkge1xuICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyByZXNldCBzbyByYXBpZCBkYXRhIGNoYW5nZXMgZG9uJ3QgcmUtZW5hYmxlIGFuaW1hdGlvbnMgbWlkLXJlbmRlci5cbiAgICBpZiAodGhpcy5hbmltYXRpb25zUmVzZXRSYWZJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25zUmVzZXRSYWZJZCk7XG4gICAgfVxuICAgIC8vIFJlLWVuYWJsZSBhZnRlciB0aGUgbmV4dCBmcmFtZTogYnkgdGhlbiBDREsgaGFzIGNyZWF0ZWQgcm93cyBhbmQgQ0QgaGFzIHJ1bixcbiAgICAvLyBzbyA6ZW50ZXIgYW5pbWF0aW9ucyB3b24ndCBmaXJlIG9uIHRoZSBuZXdseSBjcmVhdGVkIHJvdyBjb21wb25lbnRzLlxuICAgIHRoaXMuYW5pbWF0aW9uc1Jlc2V0UmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5hbmltYXRpb25zUmVzZXRSYWZJZCA9IG51bGw7XG4gICAgICB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQudmFsdWUgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgLy8gZGV0ZWN0Q2hhbmdlcygpIGRpcmVjdGx5IOKAlCBtYXJrRm9yQ2hlY2soKSBkb2VzIG5vdGhpbmcgb24gYSBkZXRhY2hlZCB2aWV3LlxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2Nyb2xsVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxUaW1lb3V0KTtcbiAgICB9XG4gIH1cblxufVxuXG5cbmV4cG9ydCBuYW1lc3BhY2UgVGFibGVCb2R5Q29tcG9uZW50IHtcbiAgZXhwb3J0IHR5cGUgU2Nyb2xsTW9kZSA9IFwibm9uZVwiIHwgXCJjbGFzc2ljXCIgfCBcInZpcnR1YWxcIjtcbn1cbiIsIlxuPGRpdiBjbGFzcz1cImNsYXNzaWMtc2Nyb2xsLWNvbnRhaW5lclwiICpuZ0lmPVwic2Nyb2xsTW9kZSQudmFsdWUgIT09ICd2aXJ0dWFsJ1wiPlxuICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGEkLnZhbHVlXCIgW3RyYWNrQnldPVwidHJhY2tCeVwiIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnMkLnZhbHVlOyBpbmRleCBhcyBpbmRleDsgZmlyc3QgYXMgZmlyc3Q7IGxhc3QgYXMgbGFzdFwiXG4gICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5jb2x1bW5JZH19XCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIj5cbiAgICAgICAgPGF1cC10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cIiRhbnkoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwibm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICBbY2xhc3MuZW5hYmxlLWN1cnNvcl09XCJ0YWJsZU1vZGVsLmlzQ3Vyc29yRW5hYmxlZEZvclJvdyhjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdXAtdGFibGUtY2VsbCBbY29sdW1uXT1cIiRhbnkoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCIkYW55KHRhYmxlTW9kZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtY2VsbD5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbklkcyQudmFsdWU7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkcyQudmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBbbmdDbGFzc109XCJ0YWJsZU1vZGVsLmdldFJvd0NsYXNzZXMocm93KVwiXG4gICAgICAgIFtjbGFzcy5lbmFibGUtaG92ZXJdPVwidGFibGVNb2RlbC5pc0hvdmVyRW5hYmxlZEZvclJvdyhyb3cpXCJcbiAgICAgICAgW2F1cFRhYmxlUm93QXR0cmlidXRlc109XCJ0YWJsZU1vZGVsLmdldFJvd0F0dHJpYnV0ZXMocm93KVwiXG4gICAgICAgIFthdHRyLmF1cC1yb3ctaWRdPVwidHJhY2tCeShpLCByb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZvb3RlciBvZiBmb290ZXJSb3dEZWZzJC52YWx1ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiBmb290ZXIuY2VsbHNcIiBbbWF0Q29sdW1uRGVmXT1cImNlbGwuZGVmSWRcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhblwiXG4gICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY2VsbC5jb2x1bW5JZFwiIGNsYXNzPVwiZm9vdGVyLWNlbGxcIj5cbiAgICAgICAgICA8YXVwLXRhYmxlLWZvb3Rlci1yb3cgKm5nSWY9XCIhY2VsbC5maWxsZXJcIiBbY2VsbF09XCJjZWxsXCI+PC9hdXAtdGFibGUtZm9vdGVyLXJvdz5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJmb290ZXIuZGVmSWRzOyBzdGlja3k6IHRydWVcIiBbbmdDbGFzc109XCJmb290ZXIucm93Q2xhc3Nlc1wiXG4gICAgICAgICAgW2NsYXNzLmF1cC1mb290ZXItcm93LWhpZGRlbl09XCJmb290ZXIudmlzaWJsZSQgJiYgIWZvb3Rlci52aXNpYmxlJC52YWx1ZVwiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC90YWJsZT5cbjwvZGl2PlxuXG48Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICAqbmdJZj1cInNjcm9sbE1vZGUkLnZhbHVlID09PSAndmlydHVhbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0AuZGlzYWJsZWRdPVwiYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHZzSXRlbVNpemVdPVwicm93SGVpZ2h0JC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVySGVpZ2h0XT1cImhlYWRlckhlaWdodCQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvb3RlckVuYWJsZWRdPVwiKGZvb3RlclJvd0RlZnMkPy52YWx1ZT8ubGVuZ3RoID8/IDApID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVySGVpZ2h0XT1cIjQ4ICogKGZvb3RlclJvd0RlZnMkPy52YWx1ZT8ubGVuZ3RoID8/IDApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJNdWx0aXBsaWVyXT1cImJ1ZmZlck11bHRpcGxpZXJcIlxuPlxuICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInZpcnR1YWxTY3JvbGxEYXRhU291cmNlXCIgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnMkLnZhbHVlOyBpbmRleCBhcyBpbmRleDsgZmlyc3QgYXMgZmlyc3Q7IGxhc3QgYXMgbGFzdFwiXG4gICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5jb2x1bW5JZH19XCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIj5cbiAgICAgICAgPGF1cC10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwibm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICBbY2xhc3MuZW5hYmxlLWN1cnNvcl09XCJ0YWJsZU1vZGVsLmlzQ3Vyc29yRW5hYmxlZEZvclJvdyhjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdXAtdGFibGUtY2VsbCBbY29sdW1uXT1cIiRhbnkoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCIkYW55KHRhYmxlTW9kZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtY2VsbD5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbklkcyQudmFsdWU7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkcyQudmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBbbmdDbGFzc109XCJ0YWJsZU1vZGVsLmdldFJvd0NsYXNzZXMocm93KVwiXG4gICAgICAgIFtjbGFzcy5lbmFibGUtaG92ZXJdPVwidGFibGVNb2RlbC5pc0hvdmVyRW5hYmxlZEZvclJvdyhyb3cpXCJcbiAgICAgICAgW2F1cFRhYmxlUm93QXR0cmlidXRlc109XCJ0YWJsZU1vZGVsLmdldFJvd0F0dHJpYnV0ZXMocm93KVwiXG4gICAgICAgIFthdHRyLmF1cC1yb3ctaWRdPVwidHJhY2tCeShpLCByb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZvb3RlciBvZiBmb290ZXJSb3dEZWZzJC52YWx1ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiBmb290ZXIuY2VsbHNcIiBbbWF0Q29sdW1uRGVmXT1cImNlbGwuZGVmSWRcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhblwiXG4gICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY2VsbC5jb2x1bW5JZFwiIGNsYXNzPVwiZm9vdGVyLWNlbGxcIj5cbiAgICAgICAgICA8YXVwLXRhYmxlLWZvb3Rlci1yb3cgKm5nSWY9XCIhY2VsbC5maWxsZXJcIiBbY2VsbF09XCJjZWxsXCI+PC9hdXAtdGFibGUtZm9vdGVyLXJvdz5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJmb290ZXIuZGVmSWRzOyBzdGlja3k6IHRydWVcIiBbbmdDbGFzc109XCJmb290ZXIucm93Q2xhc3Nlc1wiXG4gICAgICAgICAgW2NsYXNzLmF1cC1mb290ZXItcm93LWhpZGRlbl09XCJmb290ZXIudmlzaWJsZSQgJiYgIWZvb3Rlci52aXNpYmxlJC52YWx1ZVwiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cblxuICA8L3RhYmxlPlxuPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbiJdfQ==
|
|
376
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzR0FBc0c7QUFDdEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBSTlELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7QUFFM0YsTUFBTSxDQUFDLE1BQU0sMENBQTBDLEdBQUcsSUFBSSxjQUFjLENBQVMsNENBQTRDLENBQUMsQ0FBQTtBQUNsSSxNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyxJQUFJLGNBQWMsQ0FBVSxzQ0FBc0MsQ0FBQyxDQUFBO0FBTXZILE1BQU0sT0FBTywyQkFBMkI7SUFRUDtJQUwvQixxQkFBcUIsR0FBMkIsRUFBRSxDQUFDO0lBRW5ELDJGQUEyRjtJQUNuRixxQkFBcUIsR0FBYSxFQUFFLENBQUM7SUFFN0MsWUFBK0IsVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7SUFDbEUsQ0FBQztJQUVELGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsb0dBQW9HO0lBQ3BHLG9HQUFvRztJQUNwRyw0QkFBNEI7SUFDNUIsV0FBVztRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDN0MsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO2dCQUNuQixPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9CO1NBQ0Y7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3QyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7dUdBNUJVLDJCQUEyQjsyRkFBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7aUJBQ3BDO2lHQUlDLHFCQUFxQjtzQkFEcEIsS0FBSzs7QUFxQ1IsTUFBTSxPQUFPLGtCQUF1QyxTQUFRLG9CQUFvQjtJQThFUTtJQTNFN0UsMEJBQXdCLE9BQU8sQ0FBQyxDQUFBLFNBQWMsQ0FBQSxDQUFDLENBQUM7SUFBaEQsSUFBQSxLQUFLLDJDQUEyQztJQUFoRCxJQUFBLEtBQUssaURBQTJDO0lBR2hELCtCQUFzQyxPQUFPLENBQUMsQ0FBQSxrQkFBdUIsQ0FBQSxDQUFDLENBQUM7SUFBdkUsSUFBQSxVQUFVLGdEQUE2RDtJQUF2RSxJQUFBLFVBQVUsc0RBQTZEO0lBRWhGLDZGQUE2RjtJQUM3RiwyRkFBMkY7SUFFM0YsVUFBVSxHQUEwQixFQUFFLENBQUM7SUFHOUIsZ0NBQW1DLE9BQU8sQ0FBQyxDQUFBLFVBQW1CLENBQUEsQ0FBQyxDQUFDO0lBQWhFLElBQUEsV0FBVyxpREFBcUQ7SUFBaEUsSUFBQSxXQUFXLHVEQUFxRDtJQUdoRSwrQkFBYSxJQUFJLENBQUM7SUFBbEIsSUFBQSxVQUFVLGdEQUFRO0lBQWxCLElBQUEsVUFBVSxzREFBUTtJQUczQixPQUFPLENBQW1DO0lBR2pDLGdDQUF5RCxPQUFPLENBQUMsQ0FBQSxVQUF5QyxDQUFBLENBQUMsQ0FBQztJQUE1RyxJQUFBLFdBQVcsaURBQWlHO0lBQTVHLElBQUEsV0FBVyx1REFBaUc7SUFJNUcsK0JBQTRDLE1BQU0sQ0FBQztJQUFuRCxJQUFBLFVBQVUsZ0RBQXlDO0lBQW5ELElBQUEsVUFBVSxzREFBeUM7SUFHNUQsY0FBYyxDQUEwQjtJQUV4QyxRQUFRLENBQW1DO0lBQzNDLFVBQVUsQ0FBeUI7SUFDbkMsY0FBYyxDQUFrQztJQUV4QyxZQUFZLENBQTBDO0lBRzlEOzs7O09BSUc7SUFDZ0IsYUFBYSxHQUFHLElBQUksaUJBQWlCLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDckUsa0dBQWtHO0lBQ2xHLCtGQUErRjtJQUNyRixVQUFVLEdBQUcsSUFBSSxpQkFBaUIsQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUd6RCxZQUFZLEdBQUcscUJBQXFCLENBQUM7SUFFckMsSUFDSSx1QkFBdUIsS0FBSyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRXJELHVCQUF1QixHQUFHLElBQUksNEJBQTRCLEVBQU8sQ0FBQztJQUNsRSxvQkFBb0IsR0FBRyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELG1CQUFtQixHQUFHLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsYUFBYSxDQUFNO0lBQ25CLG9CQUFvQixHQUFrQixJQUFJLENBQUM7SUFDM0Msd0JBQXdCLEdBQTJCLElBQUksQ0FBQztJQUU3QywrQkFBK0IsQ0FBVTtJQUNwRCxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWIsWUFBWTtRQUM3QixJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRTtZQUN4QywwRkFBMEY7WUFDMUYsc0ZBQXNGO1lBQ3RGLHlGQUF5RjtZQUN6Rix3RkFBd0Y7WUFDeEYsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25EO2FBQU07WUFDTCxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBR0QsWUFBc0YsbUJBQTJCLENBQUM7UUFDaEgsS0FBSyxFQUFFLENBQUM7UUFENEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO1FBRWhILE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQztRQUdwQyxrR0FBa0c7UUFDbEcsbUJBQW1CO1FBQ25CLG1HQUFtRztRQUNuRyxtR0FBbUc7UUFDbkcsOEZBQThGO1FBQzlGLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUM7UUFFbkUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDL0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN2QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUN0QywwRkFBMEY7WUFDMUYsMEZBQTBGO1lBQzFGLHNGQUFzRjtZQUN0RixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztZQUNoRCxvRkFBb0Y7WUFDcEYsbUZBQW1GO1lBQ25GLG9GQUFvRjtZQUNwRixzRkFBc0Y7WUFDdEYsaUdBQWlHO1lBQ2pHLElBQUksSUFBSSxDQUFDLCtCQUErQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDMUI7WUFDRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNuQyxDQUFDLEVBQUUsRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUc5QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNmLDhGQUE4RjtZQUM5Riw0RkFBNEY7WUFDNUYsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUMzRCxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDbEUsQ0FBQztZQUNGLG9GQUFvRjtZQUNwRix1RkFBdUY7WUFDdkYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO2lCQUM5QyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2lCQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQXdDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsQ0FBQTtRQUM5USxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFUSxlQUFlO1FBQ3RCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsTUFBTSxFQUFDLE9BQU8sRUFBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUMzRCxXQUFXLEVBQ1gsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQzlCLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBQyxDQUM5RCxDQUFDO1NBQ0g7UUFDRCxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRTtZQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNyRCxvR0FBb0c7b0JBQ3BHLDZGQUE2RjtvQkFDN0YsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQzNCLENBQUMsQ0FBQyxDQUFDO29CQUNILHVGQUF1RjtvQkFDdkYsd0VBQXdFO29CQUN4RSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO3FCQUNsQztnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsaUZBQWlGO1lBQ2pGLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsSUFDSSxVQUFVO1FBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksa0JBQWtCO1FBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFBO0lBQ3hDLENBQUM7SUFFRCxJQUNJLGVBQWU7UUFDakIsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUE7SUFDckMsQ0FBQztJQUVELGlCQUFpQixDQUFDLFdBQTZCLEVBQUUsR0FBUTtRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsV0FBVztJQUVYLG9CQUFvQixDQUFDLFFBQWdCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxLQUFLLFFBQVEsQ0FBQztJQUNsRixDQUFDO0lBRUQsV0FBVztJQUVYLG1CQUFtQixDQUFDLFFBQWdCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxLQUFLLFFBQVEsQ0FBQztJQUNqRixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNsRixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsZ0hBQWdIO0lBQ3RHLHlCQUF5QjtRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLCtCQUErQixDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDN0csQ0FBQztJQUVELHlHQUF5RztJQUNqRyxhQUFhLENBQUMsUUFBZ0I7UUFDcEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFVBQVUsR0FBRyxFQUFFO1FBQzlDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCw4RUFBOEU7WUFDOUUsb0ZBQW9GO1lBQ3BGLHdGQUF3RjtZQUN4RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDOUQsMkZBQTJGO1lBQzNGLGtGQUFrRjtZQUNsRix5RkFBeUY7WUFDekYsNkZBQTZGO1lBQzdGLDRGQUE0RjtZQUM1Rix1RkFBdUY7WUFDdkYscUZBQXFGO1lBQ3JGLE1BQU0sYUFBYSxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFGLE1BQU0sYUFBYSxHQUFHLGFBQWEsSUFBSSxJQUFJLElBQUksYUFBYSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsQ0FBQztZQUMvRixJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxhQUFhLEVBQUU7Z0JBQ3RELElBQUksQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxVQUFVLEdBQUcsR0FBRyxFQUFFO29CQUNwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRDthQUNGO1FBQ0gsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ2hCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLDZFQUE2RTtRQUM3RSxxRkFBcUY7UUFDckYsSUFBSSxJQUFJLENBQUMsK0JBQStCLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDeEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVRLFdBQVc7UUFDbEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8seUJBQXlCO1FBQy9CLHdGQUF3RjtRQUN4RixJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7WUFDdEMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDakQ7UUFDRCwrRUFBK0U7UUFDL0UsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDckQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRTtnQkFDeEMsNkVBQTZFO2dCQUM3RSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQzt1R0FwU1Usa0JBQWtCLGtCQThFVCwwQ0FBMEM7MkZBOUVuRCxrQkFBa0Isc2pCQUpsQjtZQUNULEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtTQUM1SiwwRUErQlUsd0JBQXdCLHVFQ2hIckMsKzdLQTJHQSx5aUdEL0RhLDJCQUEyQjs7QUEwQzdCO0lBREMsT0FBTyxFQUFFOzhCQUNILFNBQVM7K0NBQWdDO0FBR2hEO0lBREMsT0FBTyxFQUFFOzhCQUNFLGtCQUFrQjtvREFBeUM7QUFRdkU7SUFEQyxPQUFPLEVBQUU7OEJBQ0csVUFBVTtxREFBeUM7QUFHaEU7SUFEQyxpQkFBaUIsRUFBRTs7b0RBQ0Y7QUFNbEI7SUFEQyxPQUFPLEVBQUU7OEJBQ0csVUFBVTtxREFBcUY7QUFJNUc7SUFGQyxpQkFBaUIsRUFBRTs7b0RBRStCOzJGQTNCakQsa0JBQWtCO2tCQVI5QixTQUFTOytCQUNFLGdCQUFnQixhQUdmO3dCQUNULEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtxQkFDNUo7OzBCQWdGWSxNQUFNOzJCQUFDLDBDQUEwQzs7MEJBQUcsUUFBUTs0Q0EzRWhFLEtBQUs7c0JBRGIsS0FBSztnQkFJRyxVQUFVO3NCQURsQixLQUFLO2dCQU1OLFVBQVU7c0JBRFQsS0FBSztnQkFJRyxXQUFXO3NCQURuQixLQUFLO2dCQUlHLFVBQVU7c0JBRGxCLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLEtBQUs7Z0JBS0csVUFBVTtzQkFGbEIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBSTlCLGNBQWM7c0JBRGIsU0FBUzt1QkFBQyx3QkFBd0I7Z0JBcUJuQyxZQUFZO3NCQURYLFdBQVc7dUJBQUMsT0FBTztnQkFJaEIsdUJBQXVCO3NCQUQxQixXQUFXO3VCQUFDLCtCQUErQjtnQkF3SHhDLFVBQVU7c0JBRGIsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBTTVCLGtCQUFrQjtzQkFEckIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBTTFDLGVBQWU7c0JBRGxCLFdBQVc7dUJBQUMsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSB0YWJsZSBib2R5IHJlbmRlcnMgYXJiaXRyYXJ5IHJvdy9jZWxsIHR5cGVzICovXG5pbXBvcnQge0Nka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbiAgaW5qZWN0XG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBEc2wsXG4gIExpc3RNb2RlbCxcbiAgTGlzdE1vZGVsQ2hhaW4sXG4gIE1hcE1vZGVsQ2hhaW4sXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBQcm94aWZ5LFxuICBwcm94aWZ5LFxuICBTdG9yZUluVmFsdWVNb2RlbCxcbiAgVmFsdWVNb2RlbFxufSBmcm9tIFwiQGNvb2xvbi9wZWN0aW5cIjtcbmltcG9ydCB7VGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZX0gZnJvbSBcIm5nLXRhYmxlLXZpcnR1YWwtc2Nyb2xsXCI7XG5pbXBvcnQge1Jlc2l6ZUF3YXJlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vcmVzaXplLWF3YXJlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtBYnN0cmFjdFRhYmxlTW9kZWx9IGZyb20gXCIuLi8uLi9hYnN0cmFjdC10YWJsZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge0NvbHVtbk1vZGVsfSBmcm9tIFwiLi4vLi4vY29sdW1uL2NvbHVtbi1tb2RlbFwiO1xuaW1wb3J0IHtGb290ZXJSb3dNb2RlbCwgUmVzb2x2ZWRGb290ZXJSb3d9IGZyb20gXCIuLi8uLi9mb290ZXIvZm9vdGVyLXJvdy1tb2RlbFwiO1xuXG5pbXBvcnQge0FVUF9ERVRBQ0hFRF9QQVJFTlRfQ0RSLCBEaXNwb3NhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vZGlzcG9zYWJsZS1jb21wb25lbnRcIjtcblxuZXhwb3J0IGNvbnN0IEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSXCIpXG5leHBvcnQgY29uc3QgQVVQX1RBQkxFX09QVElNSVpFRF9DSEFOR0VfREVURUNUSU9OID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KFwiQVVQX1RBQkxFX09QVElNSVpFRF9DSEFOR0VfREVURUNUSU9OXCIpXG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIlthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdXCIsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlUm93QXR0cmlidXRlc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KClcbiAgYXVwVGFibGVSb3dBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgLyoqIEF0dHJpYnV0ZSBuYW1lcyBhcHBsaWVkIG9uIHRoZSBwcmV2aW91cyBwYXNzLCBzbyBvbmVzIHRoYXQgZGlzYXBwZWFyIGNhbiBiZSByZW1vdmVkLiAqL1xuICBwcml2YXRlIGFwcGxpZWRBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgfVxuXG4gIC8vIFJlLWFwcGx5IG9uIGV2ZXJ5IGNoYW5nZSwgbm90IGp1c3Qgb25jZSBhdCBpbml0OiBhIHJvdydzIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGNoYW5nZSBhZnRlciB0aGVcbiAgLy8gcm93IGhhcyByZW5kZXJlZCAoZS5nLiBhbiBPVEFQIGRldmljZSByb3cgd2hvc2UgZGV2aWNlIHJlY29yZCByZXNvbHZlcyBhZnRlciBpdHMgc2NyYXRjaHBhZCByb3dcbiAgLy8gd2FzIGNyZWF0ZWQpLCBhbmQgdGhlIGVsZW1lbnQgbXVzdCByZWZsZWN0IHRoZSBsYXRlc3QgdmFsdWVzLiBQcmV2aW91c2x5IHRoaXMgaW1wbGVtZW50ZWQgT25Jbml0LFxuICAvLyBzbyB0aGUgYXR0cmlidXRlcyB3ZXJlIGZyb3plbiBhdCByb3ctY3JlYXRpb24gdGltZSBhbmQgd2VudCBzdGFsZSAoZS5nLiBkZXZpY2VIYXJkd2FyZUlkIHN0dWNrIG9uXG4gIC8vIGl0cyBpbml0aWFsIFwidW5kZWZpbmVkXCIpLlxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuYXVwVGFibGVSb3dBdHRyaWJ1dGVzID8/IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBvZiB0aGlzLmFwcGxpZWRBdHRyaWJ1dGVOYW1lcykge1xuICAgICAgaWYgKCEoYXR0ciBpbiBuZXh0KSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hcHBsaWVkQXR0cmlidXRlTmFtZXMgPSBPYmplY3Qua2V5cyhuZXh0KTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgb2YgdGhpcy5hcHBsaWVkQXR0cmlidXRlTmFtZXMpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIG5leHRbYXR0cl0pO1xuICAgIH1cbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXVwLXRhYmxlLWJvZHlcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi90YWJsZS1ib2R5LmNvbXBvbmVudC5zY3NzXCJdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IEFVUF9ERVRBQ0hFRF9QQVJFTlRfQ0RSLCB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoQVVQX1RBQkxFX09QVElNSVpFRF9DSEFOR0VfREVURUNUSU9OLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSA6IG51bGwgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keUNvbXBvbmVudDxSb3cgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUmVzaXplQXdhcmVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3IgZGF0YSQ6IExpc3RNb2RlbDxSb3c+ID0gcHJveGlmeShMaXN0TW9kZWw8Um93Pik7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciB0YWJsZU1vZGVsOiBBYnN0cmFjdFRhYmxlTW9kZWw8Um93PiA9IHByb3hpZnkoQWJzdHJhY3RUYWJsZU1vZGVsPFJvdz4pO1xuXG4gIC8vIEZvb3RlciByb3dzIGFyZSBidWlsdCBvbmNlIGluIHRoZSBUYWJsZU1vZGVsIGJ1aWxkZXIgY2FsbGJhY2ssIHNvIGEgcGxhaW4gaW5wdXQgaXMgZW5vdWdoO1xuICAvLyB0aGUgcGVyLXJvdyBjZWxsIGxheW91dCAoZm9vdGVyUm93RGVmcyQpIGlzIGRlcml2ZWQgcmVhY3RpdmVseSBmcm9tIHRoZSB2aXNpYmxlIGNvbHVtbnMuXG4gIEBJbnB1dCgpXG4gIGZvb3RlclJvd3M6IEZvb3RlclJvd01vZGVsLkltcGxbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2hvd0hlYWRlciQ6IFZhbHVlTW9kZWw8Ym9vbGVhbj4gPSBwcm94aWZ5KFZhbHVlTW9kZWw8Ym9vbGVhbj4pO1xuXG4gIEBJbnB1dCgpIEBTdG9yZUluVmFsdWVNb2RlbCgpXG4gIGFjY2Vzc29yIHNob3dIZWFkZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHRyYWNrQnk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBSb3cpID0+IGFueVxuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2Nyb2xsTW9kZSQ6IFZhbHVlTW9kZWw8VGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGU+ID0gcHJveGlmeShWYWx1ZU1vZGVsPFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlPik7XG5cbiAgQElucHV0KCkgQFN0b3JlSW5WYWx1ZU1vZGVsKClcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci5zY3JvbGxNb2RlXCIpXG4gIGFjY2Vzc29yIHNjcm9sbE1vZGU6IFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlID0gXCJub25lXCI7XG5cbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpXG4gIHNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnRcblxuICBjb2x1bW5zJDogTGlzdE1vZGVsQ2hhaW48Q29sdW1uTW9kZWw8Um93Pj47XG4gIGNvbHVtbklkcyQ6IExpc3RNb2RlbENoYWluPHN0cmluZz47XG4gIGZvb3RlclJvd0RlZnMkOiBWYWx1ZU1vZGVsPFJlc29sdmVkRm9vdGVyUm93W10+O1xuXG4gIHByaXZhdGUgY29sdW1uc0J5SWQkOiBNYXBNb2RlbENoYWluPHN0cmluZywgQ29sdW1uTW9kZWw8Um93Pj47XG5cblxuICAvKipcbiAgICogVGhlIGhlYWRlciByb3cncyBoZWlnaHQsIHdoaWNoIHRoZSB2aXJ0dWFsIHNjcm9sbGVyIG9mZnNldHMgaXRzIHJvd3MgYnkgYW5kIHdoaWNoIHBpbnMgdGhlIGhlYWRlclxuICAgKiBjZWxscyBpbiB2aXJ0dWFsIG1vZGUuIFRha2VuIGZyb20gLS1hdXAtdGFibGUtaGVhZGVyLXJvdy1oZWlnaHQgKHRhYmxlLnNjc3Mgc2V0cyA0OHB4KSwgc28gYSB0YWJsZVxuICAgKiB0aGVtZWQgd2l0aCBhIHNob3J0ZXIgaGVhZGVyIHNjcm9sbHMgY29ycmVjdGx5OyA0OCB3aGVuIHRoZSB2YXJpYWJsZSBjYW4ndCBiZSByZWFkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhlYWRlckhlaWdodCQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8bnVtYmVyPig0OCk7XG4gIC8vIFRPRE86IHRha2UgdGhlIHJvdyBoZWlnaHQgZnJvbSAtLWF1cC10YWJsZS1yb3ctaGVpZ2h0IHRvby4gTm90IGEgZHJvcC1pbjogdGFibGUuc2NzcyBzZXRzIGl0IHRvXG4gIC8vIDQwcHggd2hpbGUgdmlydHVhbCByb3dzIGhhdmUgYWx3YXlzIGJlZW4gNDQsIHNvIGZvbGxvd2luZyBpdCB3b3VsZCBzaHJpbmsgZXZlcnkgdmlydHVhbCByb3cuXG4gIHByb3RlY3RlZCByb3dIZWlnaHQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDQpO1xuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzXCIpXG4gIGJhc2VDc3NDbGFzcyA9IFwiYXVwLXRhYmxlLWNvbXBvbmVudFwiO1xuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmF1cC1hbmltYXRpb25zLWRpc2FibGVkXCIpXG4gIGdldCBhbmltYXRpb25zRGlzYWJsZWRDbGFzcygpIHsgcmV0dXJuIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZTsgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSB2aXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSA9IG5ldyBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlPFJvdz4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHZpcnR1YWxTY3JvbGxBY3RpdmUkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFuaW1hdGlvbnNEaXNhYmxlZCQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWwoZmFsc2UpO1xuICBwcml2YXRlIHNjcm9sbFRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBhbmltYXRpb25zUmVzZXRSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSB2aWV3SW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbWFya0ZvckNoZWNrKCkge1xuICAgIGlmICh0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgIC8vIFRoZSB0YWJsZS1ib2R5IGRldGFjaGVzIGl0cyBvd24gQ0RSIGFuZCBoYXMgbm8gZGV0YWNoZWQgcGFyZW50IChBVVBfREVUQUNIRURfUEFSRU5UX0NEUlxuICAgICAgLy8gdXNlcyBza2lwU2VsZiksIHNvIHRoZSBiYXNlIG1hcmtGb3JDaGVjaygpIHdvdWxkIGNhbGwgY2RyLm1hcmtGb3JDaGVjaygpIHdoaWNoIGlzIGFcbiAgICAgIC8vIG5vLW9wIG9uIGEgZGV0YWNoZWQgdmlldy4gU2NoZWR1bGUgYW4gZXhwbGljaXQgZGV0ZWN0Q2hhbmdlcygpIG9uIG91cnNlbHZlcyBpbnN0ZWFkIHNvXG4gICAgICAvLyB0aGF0IHZpZXdTdGF0ZURlcGVuZHNPbigpIGNvcnJlY3RseSB0cmlnZ2VycyByZS1yZW5kZXJzIChlLmcuIHJvdyBzZWxlY3Rpb24gY2xhc3NlcykuXG4gICAgICBEaXNwb3NhYmxlQ29tcG9uZW50LnNjaGVkdWxlUGFyZW50U3dlZXAodGhpcy5jZHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSKSBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgYnVmZmVyTXVsdGlwbGllcjogbnVtYmVyID0gMykge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3Qge2NoYWluLCB3aGVuLCBvYnNlcnZlfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcblxuICAgIHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCA9IHRoaXMuaW5qZWN0KEFVUF9UQUJMRV9PUFRJTUlaRURfQ0hBTkdFX0RFVEVDVElPTiwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBjb25zdCBhY3R1YWxIZWFkZXJIZWlnaHQkID0gY2hhaW4odGhpcy5zaG93SGVhZGVyJCkubWFwKHNob3cgPT4ge1xuICAgICAgcmV0dXJuIHNob3cgPyB0aGlzLmhlYWRlckhlaWdodCQudmFsdWUgOiAwO1xuICAgIH0sIHtkZXBlbmRzT246IHRoaXMuaGVhZGVySGVpZ2h0JH0pO1xuXG5cbiAgICAvLyBwZXJmb3JtYW5jZSBpcyB0ZXJyaWJsZSBpZiB0aGUgZGF0YSBjaGFuZ2VzIHdoaWxlIHdlJ3JlIHNjcm9sbGluZywgc28gd2UgcG9zdHBvbmUgdXBkYXRlcyB1bnRpbFxuICAgIC8vIHNjcm9sbGluZyBzdG9wcy5cbiAgICAvLyBBIGJvZHkgaW5zaWRlIHByb2plY3RlZCBjb250ZW50IChhIGxvYWRpbmcgY29udGFpbmVyLCBhIGNhcmQpIGlzIGluaXRpYWxpc2VkIGJlZm9yZSBpdCBpcyBpbiB0aGVcbiAgICAvLyBkb2N1bWVudCwgd2hlcmUgbm8gdGhlbWUgdmFyaWFibGUgcmVzb2x2ZXMuIEl0cyBmaXJzdCByZXBvcnRlZCBzaXplIGlzIHRoZSBtb21lbnQgaXQgaXMsIHNvIHRha2VcbiAgICAvLyB0aGUgaGVhZGVyIGhlaWdodCBhZ2FpbiB0aGVuOyB0aGUgcmVwb3J0IGFycml2ZXMgb3V0c2lkZSBjaGFuZ2UgZGV0ZWN0aW9uLCBzbyB0aGlzIGlzIHNhZmUuXG4gICAgd2hlbih0aGlzLmJvdW5kcyQpLmNoYW5nZXMoKCkgPT4gdGhpcy50YWtlSGVhZGVySGVpZ2h0RnJvbVRoZW1lKCkpO1xuXG4gICAgY29uc3QgZGVsYXllZERhdGEkID0gY2hhaW4odGhpcy5kYXRhJCkucG9zdHBvbmVXaGlsZSh0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkKVxuICAgIHdoZW4oZGVsYXllZERhdGEkKS5jaGFuZ2VzKGRlbGF0ZWREYXRhID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZSA9IHRydWU7XG4gICAgICAvLyBVcGRhdGUgdGhlIENESyBkYXRhIHNvdXJjZSBiZWZvcmUgZGV0ZWN0Q2hhbmdlcyBzbyB0aGF0IGJvdGggdGhlIGV4cGxpY2l0IGRldGVjdENoYW5nZXNcbiAgICAgIC8vIGFuZCBhbnkgc3Vic2VxdWVudCBTV0VFUC10cmlnZ2VyZWQgZGV0ZWN0Q2hhbmdlcyBzZWUgdGhlIHNhbWUgZGF0YS4gSWYgd2UgdXBkYXRlIGFmdGVyLFxuICAgICAgLy8gdGhlIFNXRUVQJ3MgZGV0ZWN0Q2hhbmdlcyBzZWVzIGRpZmZlcmVudCByb3cgb2JqZWN0cyBhbmQgdHJpZ2dlcnMgYSBzZWNvbmQgY2FzY2FkZS5cbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbERhdGFTb3VyY2UuZGF0YSA9IGRlbGF0ZWREYXRhO1xuICAgICAgLy8gV2l0aCBkZXRhY2hlZCBDRCwgbWFya0ZvckNoZWNrKCkgYWxvbmUgd29uJ3QgcHVzaCBbQC5kaXNhYmxlZF09XCJ0cnVlXCIgdG8gdGhlIERPTS5cbiAgICAgIC8vIERldGVjdCBzeW5jaHJvbm91c2x5IHNvIENESyByZW5kZXJzIG5ldyByb3dzIHdpdGggYW5pbWF0aW9ucyBhbHJlYWR5IHN1cHByZXNzZWQuXG4gICAgICAvLyBhbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlIGlzIGFscmVhZHkgdHJ1ZSAoc2V0IGFib3ZlKSwgc28gdGhlIHRlbXBsYXRlIGV2YWx1YXRpb25cbiAgICAgIC8vIGluIHRoaXMgZGV0ZWN0Q2hhbmdlcyB3aWxsIHNlZSBbQC5kaXNhYmxlZF09XCJ0cnVlXCIgYmVmb3JlIGFueSBuZXcgcm93cyBhcmUgY3JlYXRlZC5cbiAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHtpbml0aWFsVmFsdWU6XCJldmFsdWF0ZVwifSBmaXJpbmcgZHVyaW5nIGNvbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHZpZXcgZXhpc3RzLlxuICAgICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnZpZXdJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjaGVkdWxlVGFibGVIZWlnaHRDaGVjaygpO1xuICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbnNBZnRlckZyYW1lKCk7XG4gICAgfSwge2luaXRpYWxWYWx1ZTogXCJldmFsdWF0ZVwifSlcblxuXG4gICAgdGhpcy5vbkluaXQoKCkgPT4ge1xuICAgICAgLy8gT24gaW5pdCwgbm90IGFmdGVyIHRoZSB2aWV3OiB0aGUgaGVhZGVyIGhlaWdodCBpcyBib3VuZCBpbiB0aGlzIHZpZXcgYW5kIGluIGEgaG9zdCBiaW5kaW5nLFxuICAgICAgLy8gYW5kIGNoYW5naW5nIGl0IGFmdGVyIHRoZXkgYXJlIGNoZWNrZWQgd291bGQgdHJpcCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZC5cbiAgICAgIHRoaXMudGFrZUhlYWRlckhlaWdodEZyb21UaGVtZSgpO1xuICAgICAgdGhpcy5jb2x1bW5zJCA9IGNoYWluKHRoaXMudGFibGVNb2RlbC52aXNpYmxlQ29sdW1ucyQpO1xuICAgICAgdGhpcy5jb2x1bW5JZHMkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkucGx1Y2soXCJjb2x1bW5JZFwiKTtcbiAgICAgIHRoaXMuY29sdW1uc0J5SWQkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkuaW5kZXhCeSgnY29sdW1uSWQnKTtcbiAgICAgIHRoaXMuZm9vdGVyUm93RGVmcyQgPSBjaGFpbih0aGlzLmNvbHVtbklkcyQpLnJlZHVjZUFsbChpZHMgPT5cbiAgICAgICAgKHRoaXMuZm9vdGVyUm93cyA/PyBbXSkubWFwKChyb3csIGkpID0+IHJvdy5yZXNvbHZlKGksIFsuLi5pZHNdKSlcbiAgICAgICk7XG4gICAgICAvLyBGb290ZXIgcm93cyBnYXRlZCB2aWEgdmlzaWJsZVdoaWxlKCkgZmxpcCBpbmRlcGVuZGVudGx5IG9mIHRoZSBjb2x1bW5zIHRoYXQgZHJpdmVcbiAgICAgIC8vIGZvb3RlclJvd0RlZnMkLCBzbyBkZXBlbmQgb24gdGhlaXIgbW9kZWxzIGRpcmVjdGx5IHRvIHJlLXJlbmRlciB0aGUgPHRyPiByZWFjdGl2ZWx5LlxuICAgICAgY29uc3QgZm9vdGVyVmlzaWJpbGl0eSQgPSAodGhpcy5mb290ZXJSb3dzID8/IFtdKVxuICAgICAgICAubWFwKHJvdyA9PiByb3cudmlzaWJsZSQpXG4gICAgICAgIC5maWx0ZXIoKG0pOiBtIGlzIFZhbHVlTW9kZWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD4gPT4gbSAhPSBudWxsKTtcbiAgICAgIHRoaXMudmlld1N0YXRlRGVwZW5kc09uKHRoaXMuaGVhZGVySGVpZ2h0JCwgdGhpcy50YWJsZU1vZGVsLmZpbHRlcmVkUm93cyQsIHRoaXMudGFibGVNb2RlbC52aXNpYmxlQ29sdW1ucyQsIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQsIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJCwgdGhpcy50YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMkLCB0aGlzLnRhYmxlTW9kZWwuc2VsZWN0YWJsZVJvd3MkLCB0aGlzLmZvb3RlclJvd0RlZnMkLCAuLi5mb290ZXJWaXNpYmlsaXR5JClcbiAgICB9KTtcblxuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIHRoaXMudmlld0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgY29uc3Qge29ic2VydmV9ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydC5lbGVtZW50U2Nyb2xsZWQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlTY3JvbGxlZCgpKTtcbiAgICAgIHRoaXMuc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ3Njcm9sbGVuZCcsXG4gICAgICAgICgpID0+IHRoaXMubm90aWZ5U2Nyb2xsRW5kZWQoKSxcbiAgICAgICAge3Bhc3NpdmU6IHRydWUsIHNpZ25hbDogdGhpcy5zY3JvbGxFbmRBYm9ydENvbnRyb2xsZXIuc2lnbmFsfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgdGhpcy5jZHIuZGV0YWNoKCk7XG4gICAgICBpZiAodGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0LnJlbmRlcmVkUmFuZ2VTdHJlYW0uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyBEZWZlciBwYXN0IHRoZSBjdXJyZW50IHN5bmMgYmF0Y2ggc28gdGhlIGRhdGEgc291cmNlIGhhcyB1cGRhdGVkIF9yZW5kZXJlZEl0ZW1zIGJlZm9yZSB3ZSBydW4gQ0QuXG4gICAgICAgICAgLy8gTXVzdCBjYWxsIGRldGVjdENoYW5nZXMoKSBkaXJlY3RseSDigJQgbWFya0ZvckNoZWNrKCkgYWxvbmUgZG9lcyBub3RoaW5nIG9uIGEgZGV0YWNoZWQgdmlldy5cbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBFeHRlbmQgdGhlIGFuaW1hdGlvbiBzdXBwcmVzc2lvbiB3aW5kb3cgb24gZWFjaCBDREsgcmFuZ2UgY2hhbmdlIHNvIGFuaW1hdGlvbnMgY2FuJ3RcbiAgICAgICAgICAvLyBmaXJlIG1pZC1yZW5kZXIgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBmcmFtZXMgdGhlIHJhbmdlIHVwZGF0ZSBzcGFucy5cbiAgICAgICAgICBpZiAodGhpcy5hbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0QW5pbWF0aW9uc0FmdGVyRnJhbWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gRGVmZXIgcGFzdCB0aGUgY3VycmVudCB0aWNrIHNvIHRoZSB2aWV3cG9ydCdzIGluaXRpYWwgcmVuZGVyZWQgcmFuZ2UgaXMgc3RhYmxlXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuaGlkZS1oZWFkZXJcIilcbiAgZ2V0IGhpZGVIZWFkZXIoKSB7XG4gICAgcmV0dXJuICF0aGlzLnNob3dIZWFkZXI7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLWF1cC10YWJsZS1oZWFkZXItaGVpZ2h0XCIpXG4gIGdldCBoZWFkZXJIZWlnaHRDc3NWYXIoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuaGVhZGVySGVpZ2h0JC52YWx1ZX1weGBcbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcInN0eWxlLi0tYXVwLXRhYmxlLXJvdy1oZWlnaHRcIilcbiAgZ2V0IHJvd0hlaWdodENzc1ZhcigpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5yb3dIZWlnaHQkLnZhbHVlfXB4YFxuICB9XG5cbiAgbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWw6IENvbHVtbk1vZGVsPFJvdz4sIHJvdzogUm93KSB7XG4gICAgdGhpcy50YWJsZU1vZGVsLl9ub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW5Nb2RlbCwgcm93KTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG5cbiAgaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwuZmlyc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzTGFzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwubGFzdFZpc2libGVDb2x1bW4kLnF1ZXJ5KCkudmFsdWU/LmNvbHVtbklkID09PSBjb2x1bW5JZDtcbiAgfVxuXG4gIGdldENvbHVtbkNsYXNzZXMoY29sdW1uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbYGF1cC1jb2wtJHt0aGlzLmNvbHVtbnNCeUlkJC5nZXQoY29sdW1uSWQpLmRhc2hlcmlzZWRDb2x1bW5JZH1gXTtcbiAgICBpZiAodGhpcy5pc0ZpcnN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImZpcnN0LXZpc2libGUtY29sdW1uXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkKSkge1xuICAgICAgY2xhc3Nlcy5wdXNoKFwibGFzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICAvKiogU2V0cyBbaGVhZGVySGVpZ2h0JF0gZnJvbSAtLWF1cC10YWJsZS1oZWFkZXItcm93LWhlaWdodCwga2VlcGluZyB0aGUgY3VycmVudCB2YWx1ZSB3aGVuIGl0IGNhbid0IGJlIHJlYWQuICovXG4gIHByb3RlY3RlZCB0YWtlSGVhZGVySGVpZ2h0RnJvbVRoZW1lKCkge1xuICAgIHRoaXMuaGVhZGVySGVpZ2h0JC52YWx1ZSA9IHRoaXMucmVhZENzc1BpeGVscyhcIi0tYXVwLXRhYmxlLWhlYWRlci1yb3ctaGVpZ2h0XCIpID8/IHRoaXMuaGVhZGVySGVpZ2h0JC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBBIGxlbmd0aCBjdXN0b20gcHJvcGVydHkgYXMgcmVzb2x2ZWQgb24gdGhpcyBlbGVtZW50LCBpbiBweDsgdW5kZWZpbmVkIHdoZW4gdW5zZXQgb3Igbm90IGEgbGVuZ3RoLiAqL1xuICBwcml2YXRlIHJlYWRDc3NQaXhlbHMocHJvcGVydHk6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGl4ZWxzID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwaXhlbHMpICYmIHBpeGVscyA+IDAgPyBwaXhlbHMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVGFibGVIZWlnaHRDaGVjayh3YWl0TWlsbGlzID0gNTApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFVzZSBDREsncyBpbnRlcm5hbCByZW5kZXJlZCByYW5nZSB0byBkZXRlY3QgYSBicm9rZW4gdmlydHVhbCBzY3JvbGwgc3RhdGUg4oCUXG4gICAgICAvLyBhdm9pZHMgcmVhZGluZyBvZmZzZXRIZWlnaHQgKGZvcmNlZCBsYXlvdXQpIGFuZCBkaXNwYXRjaGluZyBhIGdsb2JhbCByZXNpemUgZXZlbnRcbiAgICAgIC8vICh3aGljaCB0cmlnZ2VycyBBbmd1bGFyJ3MgYW5pbWF0aW9uIGVuZ2luZSB0byBjYWxsIGdldENvbXB1dGVkU3R5bGUgb24gYWxsIGVsZW1lbnRzKS5cbiAgICAgIGNvbnN0IHJlbmRlcmVkUmFuZ2UgPSB0aGlzLnNjcm9sbFZpZXdwb3J0Py5nZXRSZW5kZXJlZFJhbmdlKCk7XG4gICAgICAvLyBBIHVzYWJsZSB2aXJ0dWFsIHZpZXdwb3J0IHJlbmRlcnMgbW9yZSB0aGFuIG9uZSByb3cgd2hlbmV2ZXIgbW9yZSBkYXRhIGV4aXN0cy4gUmVuZGVyaW5nXG4gICAgICAvLyBub25lIG9yIG9uZSByb3cgYXQgdGhlIHRvcCB3aGlsZSBkYXRhJCBob2xkcyBtb3JlIG1lYW5zIHRoZSB2aWV3cG9ydCBtZWFzdXJlZCBhXG4gICAgICAvLyBjb2xsYXBzZWQvc3RhbGUgaGVpZ2h0IChlLmcuIGl0IHdhcyBtZWFzdXJlZCBiZWZvcmUgdGhlIHRhYmxlIHdhcyBzaXplZCB1cCwgdGhlbiBuZXZlclxuICAgICAgLy8gcmUtbWVhc3VyZWQgdW5kZXIgZGV0YWNoZWQgY2hhbmdlIGRldGVjdGlvbikg4oCUIHNvIHJlLW1lYXN1cmUgdG8gZXhwYW5kIHRoZSByZW5kZXJlZCByYW5nZS5cbiAgICAgIC8vIENvdmVycyBib3RoIHRoZSB6ZXJvLXJvdyBjb2xsYXBzZSBhbmQgdGhlIHBhcnRpYWwgKG9uZS1yb3cpIHVuZGVyLXJlbmRlci4gRGV0ZWN0aW9uIHN0YXlzXG4gICAgICAvLyBsYXlvdXQtZnJlZSAoZ2V0UmVuZGVyZWRSYW5nZSBvbmx5KTsgY29ycmVjdGx5LXNpemVkIGFuZCBnZW51aW5lbHktdmlydHVhbGlzZWQgbGFyZ2VcbiAgICAgIC8vIHRhYmxlcyByZW5kZXIgbWFueSByb3dzLCBzbyB0aGV5IG5ldmVyIHJlYWNoIHRoZSBjaGVja1ZpZXdwb3J0U2l6ZSgpIHJlZmxvdyBiZWxvdy5cbiAgICAgIGNvbnN0IHJlbmRlcmVkQ291bnQgPSByZW5kZXJlZFJhbmdlICE9IG51bGwgPyByZW5kZXJlZFJhbmdlLmVuZCAtIHJlbmRlcmVkUmFuZ2Uuc3RhcnQgOiAwO1xuICAgICAgY29uc3QgdW5kZXJSZW5kZXJlZCA9IHJlbmRlcmVkUmFuZ2UgIT0gbnVsbCAmJiByZW5kZXJlZFJhbmdlLnN0YXJ0ID09PSAwICYmIHJlbmRlcmVkQ291bnQgPD0gMTtcbiAgICAgIGlmICh1bmRlclJlbmRlcmVkICYmIHRoaXMuZGF0YSQubGVuZ3RoID4gcmVuZGVyZWRDb3VudCkge1xuICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0Py5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICBpZiAod2FpdE1pbGxpcyA8IDUwMCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVUYWJsZUhlaWdodENoZWNrKHdhaXRNaWxsaXMgKyA1MCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB3YWl0TWlsbGlzKVxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTY3JvbGxlZCgpIHtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkLnZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQudmFsdWUgPSB0cnVlO1xuICAgIC8vIFN5bmMgdGhlIFtALmRpc2FibGVkXT1cInRydWVcIiB0byB0aGUgRE9NIGltbWVkaWF0ZWx5IHNvIENESydzIHBlbmRpbmcgcmFuZ2VcbiAgICAvLyB1cGRhdGUgKHdoaWNoIGlzIHNjaGVkdWxlZCBhc3luYykgc2VlcyBhbmltYXRpb25zIHN1cHByZXNzZWQgd2hlbiBpdCByZW5kZXJzIHJvd3MuXG4gICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyU2Nyb2xsVGltZW91dCgpO1xuICAgIHRoaXMuc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5ub3RpZnlTY3JvbGxFbmRlZCgpLCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTY3JvbGxFbmRlZCgpIHtcbiAgICB0aGlzLmNsZWFyU2Nyb2xsVGltZW91dCgpO1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQudmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2V0QW5pbWF0aW9uc0FmdGVyRnJhbWUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QW5pbWF0aW9uc0FmdGVyRnJhbWUoKSB7XG4gICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlc2V0IHNvIHJhcGlkIGRhdGEgY2hhbmdlcyBkb24ndCByZS1lbmFibGUgYW5pbWF0aW9ucyBtaWQtcmVuZGVyLlxuICAgIGlmICh0aGlzLmFuaW1hdGlvbnNSZXNldFJhZklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbnNSZXNldFJhZklkKTtcbiAgICB9XG4gICAgLy8gUmUtZW5hYmxlIGFmdGVyIHRoZSBuZXh0IGZyYW1lOiBieSB0aGVuIENESyBoYXMgY3JlYXRlZCByb3dzIGFuZCBDRCBoYXMgcnVuLFxuICAgIC8vIHNvIDplbnRlciBhbmltYXRpb25zIHdvbid0IGZpcmUgb24gdGhlIG5ld2x5IGNyZWF0ZWQgcm93IGNvbXBvbmVudHMuXG4gICAgdGhpcy5hbmltYXRpb25zUmVzZXRSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGlvbnNSZXNldFJhZklkID0gbnVsbDtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZSA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAvLyBkZXRlY3RDaGFuZ2VzKCkgZGlyZWN0bHkg4oCUIG1hcmtGb3JDaGVjaygpIGRvZXMgbm90aGluZyBvbiBhIGRldGFjaGVkIHZpZXcuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTY3JvbGxUaW1lb3V0KCkge1xuICAgIGlmICh0aGlzLnNjcm9sbFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG59XG5cblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZUJvZHlDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTY3JvbGxNb2RlID0gXCJub25lXCIgfCBcImNsYXNzaWNcIiB8IFwidmlydHVhbFwiO1xufVxuIiwiXG48ZGl2IGNsYXNzPVwiY2xhc3NpYy1zY3JvbGwtY29udGFpbmVyXCIgKm5nSWY9XCJzY3JvbGxNb2RlJC52YWx1ZSAhPT0gJ3ZpcnR1YWwnXCI+XG4gIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YSQudmFsdWVcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgW211bHRpVGVtcGxhdGVEYXRhUm93c10+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucyQudmFsdWU7IGluZGV4IGFzIGluZGV4OyBmaXJzdCBhcyBmaXJzdDsgbGFzdCBhcyBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLmNvbHVtbklkfX1cIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCIgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiPlxuICAgICAgICA8YXVwLXRhYmxlLWhlYWRlci1jZWxsIFtjb2x1bW5dPVwiJGFueShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5lbmFibGUtY3Vyc29yXT1cInRhYmxlTW9kZWwuaXNDdXJzb3JFbmFibGVkRm9yUm93KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCJcbiAgICAgICAgICBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCJcbiAgICAgID5cbiAgICAgICAgPGF1cC10YWJsZS1jZWxsIFtjb2x1bW5dPVwiJGFueShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZU1vZGVsXT1cIiRhbnkodGFibGVNb2RlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1jZWxsPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzJC52YWx1ZTsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzJC52YWx1ZTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInRhYmxlTW9kZWwuZ2V0Um93Q2xhc3Nlcyhyb3cpXCJcbiAgICAgICAgW2NsYXNzLmVuYWJsZS1ob3Zlcl09XCJ0YWJsZU1vZGVsLmlzSG92ZXJFbmFibGVkRm9yUm93KHJvdylcIlxuICAgICAgICBbYXVwVGFibGVSb3dBdHRyaWJ1dGVzXT1cInRhYmxlTW9kZWwuZ2V0Um93QXR0cmlidXRlcyhyb3cpXCJcbiAgICAgICAgW2F0dHIuYXVwLXJvdy1pZF09XCJ0cmFja0J5KGksIHJvdylcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZm9vdGVyIG9mIGZvb3RlclJvd0RlZnMkLnZhbHVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIGZvb3Rlci5jZWxsc1wiIFttYXRDb2x1bW5EZWZdPVwiY2VsbC5kZWZJZFwiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuXCJcbiAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjZWxsLmNvbHVtbklkXCIgY2xhc3M9XCJmb290ZXItY2VsbFwiPlxuICAgICAgICAgIDxhdXAtdGFibGUtZm9vdGVyLXJvdyAqbmdJZj1cIiFjZWxsLmZpbGxlclwiIFtjZWxsXT1cImNlbGxcIj48L2F1cC10YWJsZS1mb290ZXItcm93PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImZvb3Rlci5kZWZJZHM7IHN0aWNreTogdHJ1ZVwiIFtuZ0NsYXNzXT1cImZvb3Rlci5yb3dDbGFzc2VzXCJcbiAgICAgICAgICBbY2xhc3MuYXVwLWZvb3Rlci1yb3ctaGlkZGVuXT1cImZvb3Rlci52aXNpYmxlJCAmJiAhZm9vdGVyLnZpc2libGUkLnZhbHVlXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICA8L3RhYmxlPlxuPC9kaXY+XG5cbjxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgICpuZ0lmPVwic2Nyb2xsTW9kZSQudmFsdWUgPT09ICd2aXJ0dWFsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQC5kaXNhYmxlZF09XCJhbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dnNJdGVtU2l6ZV09XCJyb3dIZWlnaHQkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJIZWlnaHRdPVwiaGVhZGVySGVpZ2h0JC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVyRW5hYmxlZF09XCIoZm9vdGVyUm93RGVmcyQ/LnZhbHVlPy5sZW5ndGggPz8gMCkgPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb290ZXJIZWlnaHRdPVwiNDggKiAoZm9vdGVyUm93RGVmcyQ/LnZhbHVlPy5sZW5ndGggPz8gMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1ZmZlck11bHRpcGxpZXJdPVwiYnVmZmVyTXVsdGlwbGllclwiXG4+XG4gIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwidmlydHVhbFNjcm9sbERhdGFTb3VyY2VcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucyQudmFsdWU7IGluZGV4IGFzIGluZGV4OyBmaXJzdCBhcyBmaXJzdDsgbGFzdCBhcyBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLmNvbHVtbklkfX1cIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCIgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiPlxuICAgICAgICA8YXVwLXRhYmxlLWhlYWRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5lbmFibGUtY3Vyc29yXT1cInRhYmxlTW9kZWwuaXNDdXJzb3JFbmFibGVkRm9yUm93KGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCJcbiAgICAgICAgICBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCJcbiAgICAgID5cbiAgICAgICAgPGF1cC10YWJsZS1jZWxsIFtjb2x1bW5dPVwiJGFueShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZU1vZGVsXT1cIiRhbnkodGFibGVNb2RlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1jZWxsPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzJC52YWx1ZTsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzJC52YWx1ZTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInRhYmxlTW9kZWwuZ2V0Um93Q2xhc3Nlcyhyb3cpXCJcbiAgICAgICAgW2NsYXNzLmVuYWJsZS1ob3Zlcl09XCJ0YWJsZU1vZGVsLmlzSG92ZXJFbmFibGVkRm9yUm93KHJvdylcIlxuICAgICAgICBbYXVwVGFibGVSb3dBdHRyaWJ1dGVzXT1cInRhYmxlTW9kZWwuZ2V0Um93QXR0cmlidXRlcyhyb3cpXCJcbiAgICAgICAgW2F0dHIuYXVwLXJvdy1pZF09XCJ0cmFja0J5KGksIHJvdylcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZm9vdGVyIG9mIGZvb3RlclJvd0RlZnMkLnZhbHVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIGZvb3Rlci5jZWxsc1wiIFttYXRDb2x1bW5EZWZdPVwiY2VsbC5kZWZJZFwiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuXCJcbiAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjZWxsLmNvbHVtbklkXCIgY2xhc3M9XCJmb290ZXItY2VsbFwiPlxuICAgICAgICAgIDxhdXAtdGFibGUtZm9vdGVyLXJvdyAqbmdJZj1cIiFjZWxsLmZpbGxlclwiIFtjZWxsXT1cImNlbGxcIj48L2F1cC10YWJsZS1mb290ZXItcm93PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImZvb3Rlci5kZWZJZHM7IHN0aWNreTogdHJ1ZVwiIFtuZ0NsYXNzXT1cImZvb3Rlci5yb3dDbGFzc2VzXCJcbiAgICAgICAgICBbY2xhc3MuYXVwLWZvb3Rlci1yb3ctaGlkZGVuXT1cImZvb3Rlci52aXNpYmxlJCAmJiAhZm9vdGVyLnZpc2libGUkLnZhbHVlXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gIDwvdGFibGU+XG48L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuIl19
|
|
@@ -6804,8 +6804,14 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6804
6804
|
columnIds$;
|
|
6805
6805
|
footerRowDefs$;
|
|
6806
6806
|
columnsById$;
|
|
6807
|
-
|
|
6807
|
+
/**
|
|
6808
|
+
* The header row's height, which the virtual scroller offsets its rows by and which pins the header
|
|
6809
|
+
* cells in virtual mode. Taken from --aup-table-header-row-height (table.scss sets 48px), so a table
|
|
6810
|
+
* themed with a shorter header scrolls correctly; 48 when the variable can't be read.
|
|
6811
|
+
*/
|
|
6808
6812
|
headerHeight$ = new MutableValueModel(48);
|
|
6813
|
+
// TODO: take the row height from --aup-table-row-height too. Not a drop-in: table.scss sets it to
|
|
6814
|
+
// 40px while virtual rows have always been 44, so following it would shrink every virtual row.
|
|
6809
6815
|
rowHeight$ = new MutableValueModel(44);
|
|
6810
6816
|
baseCssClass = "aup-table-component";
|
|
6811
6817
|
get animationsDisabledClass() { return this.animationsDisabled$.value; }
|
|
@@ -6839,6 +6845,10 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6839
6845
|
}, { dependsOn: this.headerHeight$ });
|
|
6840
6846
|
// performance is terrible if the data changes while we're scrolling, so we postpone updates until
|
|
6841
6847
|
// scrolling stops.
|
|
6848
|
+
// A body inside projected content (a loading container, a card) is initialised before it is in the
|
|
6849
|
+
// document, where no theme variable resolves. Its first reported size is the moment it is, so take
|
|
6850
|
+
// the header height again then; the report arrives outside change detection, so this is safe.
|
|
6851
|
+
when(this.bounds$).changes(() => this.takeHeaderHeightFromTheme());
|
|
6842
6852
|
const delayedData$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
|
|
6843
6853
|
when(delayedData$).changes(delatedData => {
|
|
6844
6854
|
this.animationsDisabled$.value = true;
|
|
@@ -6858,6 +6868,9 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6858
6868
|
this.resetAnimationsAfterFrame();
|
|
6859
6869
|
}, { initialValue: "evaluate" });
|
|
6860
6870
|
this.onInit(() => {
|
|
6871
|
+
// On init, not after the view: the header height is bound in this view and in a host binding,
|
|
6872
|
+
// and changing it after they are checked would trip ExpressionChangedAfterItHasBeenChecked.
|
|
6873
|
+
this.takeHeaderHeightFromTheme();
|
|
6861
6874
|
this.columns$ = chain(this.tableModel.visibleColumns$);
|
|
6862
6875
|
this.columnIds$ = chain(this.columns$).pluck("columnId");
|
|
6863
6876
|
this.columnsById$ = chain(this.columns$).indexBy('columnId');
|
|
@@ -6867,7 +6880,7 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6867
6880
|
const footerVisibility$ = (this.footerRows ?? [])
|
|
6868
6881
|
.map(row => row.visible$)
|
|
6869
6882
|
.filter((m) => m != null);
|
|
6870
|
-
this.viewStateDependsOn(this.tableModel.filteredRows$, this.tableModel.visibleColumns$, this.virtualScrollActive$, this.animationsDisabled$, this.tableModel.selectedItems$, this.tableModel.selectableRows$, this.footerRowDefs$, ...footerVisibility$);
|
|
6883
|
+
this.viewStateDependsOn(this.headerHeight$, this.tableModel.filteredRows$, this.tableModel.visibleColumns$, this.virtualScrollActive$, this.animationsDisabled$, this.tableModel.selectedItems$, this.tableModel.selectableRows$, this.footerRowDefs$, ...footerVisibility$);
|
|
6871
6884
|
});
|
|
6872
6885
|
}
|
|
6873
6886
|
ngAfterViewInit() {
|
|
@@ -6931,6 +6944,15 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6931
6944
|
}
|
|
6932
6945
|
return classes;
|
|
6933
6946
|
}
|
|
6947
|
+
/** Sets [headerHeight$] from --aup-table-header-row-height, keeping the current value when it can't be read. */
|
|
6948
|
+
takeHeaderHeightFromTheme() {
|
|
6949
|
+
this.headerHeight$.value = this.readCssPixels("--aup-table-header-row-height") ?? this.headerHeight$.value;
|
|
6950
|
+
}
|
|
6951
|
+
/** A length custom property as resolved on this element, in px; undefined when unset or not a length. */
|
|
6952
|
+
readCssPixels(property) {
|
|
6953
|
+
const pixels = parseFloat(getComputedStyle(this.elementRef.nativeElement).getPropertyValue(property));
|
|
6954
|
+
return Number.isFinite(pixels) && pixels > 0 ? pixels : undefined;
|
|
6955
|
+
}
|
|
6934
6956
|
scheduleTableHeightCheck(waitMillis = 50) {
|
|
6935
6957
|
setTimeout(() => {
|
|
6936
6958
|
// Use CDK's internal rendered range to detect a broken virtual scroll state —
|