@coolon/angular-ui-powerups 16.1.0-alpha.303 → 16.1.0-alpha.305
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 +8 -4
- package/esm2022/lib/directives/highlight.pipe.mjs +19 -5
- package/fesm2022/coolon-angular-ui-powerups.mjs +25 -7
- package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
- package/lib/components/tables/renderer/table-body/table-body.component.d.ts +2 -2
- package/lib/directives/highlight.pipe.d.ts +8 -0
- package/package.json +1 -1
|
@@ -85,8 +85,8 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
85
85
|
columnsById$;
|
|
86
86
|
/**
|
|
87
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
|
|
89
|
-
*
|
|
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
90
|
*/
|
|
91
91
|
headerHeight$ = new MutableValueModel(48);
|
|
92
92
|
// TODO: take the row height from --aup-table-row-height too. Not a drop-in: table.scss sets it to
|
|
@@ -124,6 +124,10 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
124
124
|
}, { dependsOn: this.headerHeight$ });
|
|
125
125
|
// performance is terrible if the data changes while we're scrolling, so we postpone updates until
|
|
126
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());
|
|
127
131
|
const delayedData$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
|
|
128
132
|
when(delayedData$).changes(delatedData => {
|
|
129
133
|
this.animationsDisabled$.value = true;
|
|
@@ -155,7 +159,7 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
155
159
|
const footerVisibility$ = (this.footerRows ?? [])
|
|
156
160
|
.map(row => row.visible$)
|
|
157
161
|
.filter((m) => m != null);
|
|
158
|
-
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$);
|
|
159
163
|
});
|
|
160
164
|
}
|
|
161
165
|
ngAfterViewInit() {
|
|
@@ -369,4 +373,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
|
|
|
369
373
|
type: HostBinding,
|
|
370
374
|
args: ["style.--aup-table-row-height"]
|
|
371
375
|
}] } });
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzR0FBc0c7QUFDdEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBSTlELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7QUFFM0YsTUFBTSxDQUFDLE1BQU0sMENBQTBDLEdBQUcsSUFBSSxjQUFjLENBQVMsNENBQTRDLENBQUMsQ0FBQTtBQUNsSSxNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyxJQUFJLGNBQWMsQ0FBVSxzQ0FBc0MsQ0FBQyxDQUFBO0FBTXZILE1BQU0sT0FBTywyQkFBMkI7SUFRUDtJQUwvQixxQkFBcUIsR0FBMkIsRUFBRSxDQUFDO0lBRW5ELDJGQUEyRjtJQUNuRixxQkFBcUIsR0FBYSxFQUFFLENBQUM7SUFFN0MsWUFBK0IsVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7SUFDbEUsQ0FBQztJQUVELGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsb0dBQW9HO0lBQ3BHLG9HQUFvRztJQUNwRyw0QkFBNEI7SUFDNUIsV0FBVztRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDN0MsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO2dCQUNuQixPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9CO1NBQ0Y7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3QyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7dUdBNUJVLDJCQUEyQjsyRkFBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7aUJBQ3BDO2lHQUlDLHFCQUFxQjtzQkFEcEIsS0FBSzs7QUFxQ1IsTUFBTSxPQUFPLGtCQUF1QyxTQUFRLG9CQUFvQjtJQThFUTtJQTNFN0UsMEJBQXdCLE9BQU8sQ0FBQyxDQUFBLFNBQWMsQ0FBQSxDQUFDLENBQUM7SUFBaEQsSUFBQSxLQUFLLDJDQUEyQztJQUFoRCxJQUFBLEtBQUssaURBQTJDO0lBR2hELCtCQUFzQyxPQUFPLENBQUMsQ0FBQSxrQkFBdUIsQ0FBQSxDQUFDLENBQUM7SUFBdkUsSUFBQSxVQUFVLGdEQUE2RDtJQUF2RSxJQUFBLFVBQVUsc0RBQTZEO0lBRWhGLDZGQUE2RjtJQUM3RiwyRkFBMkY7SUFFM0YsVUFBVSxHQUEwQixFQUFFLENBQUM7SUFHOUIsZ0NBQW1DLE9BQU8sQ0FBQyxDQUFBLFVBQW1CLENBQUEsQ0FBQyxDQUFDO0lBQWhFLElBQUEsV0FBVyxpREFBcUQ7SUFBaEUsSUFBQSxXQUFXLHVEQUFxRDtJQUdoRSwrQkFBYSxJQUFJLENBQUM7SUFBbEIsSUFBQSxVQUFVLGdEQUFRO0lBQWxCLElBQUEsVUFBVSxzREFBUTtJQUczQixPQUFPLENBQW1DO0lBR2pDLGdDQUF5RCxPQUFPLENBQUMsQ0FBQSxVQUF5QyxDQUFBLENBQUMsQ0FBQztJQUE1RyxJQUFBLFdBQVcsaURBQWlHO0lBQTVHLElBQUEsV0FBVyx1REFBaUc7SUFJNUcsK0JBQTRDLE1BQU0sQ0FBQztJQUFuRCxJQUFBLFVBQVUsZ0RBQXlDO0lBQW5ELElBQUEsVUFBVSxzREFBeUM7SUFHNUQsY0FBYyxDQUEwQjtJQUV4QyxRQUFRLENBQW1DO0lBQzNDLFVBQVUsQ0FBeUI7SUFDbkMsY0FBYyxDQUFrQztJQUV4QyxZQUFZLENBQTBDO0lBRzlEOzs7O09BSUc7SUFDZ0IsYUFBYSxHQUFHLElBQUksaUJBQWlCLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDckUsa0dBQWtHO0lBQ2xHLCtGQUErRjtJQUNyRixVQUFVLEdBQUcsSUFBSSxpQkFBaUIsQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUd6RCxZQUFZLEdBQUcscUJBQXFCLENBQUM7SUFFckMsSUFDSSx1QkFBdUIsS0FBSyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRXJELHVCQUF1QixHQUFHLElBQUksNEJBQTRCLEVBQU8sQ0FBQztJQUNsRSxvQkFBb0IsR0FBRyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELG1CQUFtQixHQUFHLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsYUFBYSxDQUFNO0lBQ25CLG9CQUFvQixHQUFrQixJQUFJLENBQUM7SUFDM0Msd0JBQXdCLEdBQTJCLElBQUksQ0FBQztJQUU3QywrQkFBK0IsQ0FBVTtJQUNwRCxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWIsWUFBWTtRQUM3QixJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRTtZQUN4QywwRkFBMEY7WUFDMUYsc0ZBQXNGO1lBQ3RGLHlGQUF5RjtZQUN6Rix3RkFBd0Y7WUFDeEYsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25EO2FBQU07WUFDTCxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBR0QsWUFBc0YsbUJBQTJCLENBQUM7UUFDaEgsS0FBSyxFQUFFLENBQUM7UUFENEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO1FBRWhILE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQztRQUdwQyxrR0FBa0c7UUFDbEcsbUJBQW1CO1FBQ25CLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQy9FLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDdEMsMEZBQTBGO1lBQzFGLDBGQUEwRjtZQUMxRixzRkFBc0Y7WUFDdEYsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7WUFDaEQsb0ZBQW9GO1lBQ3BGLG1GQUFtRjtZQUNuRixvRkFBb0Y7WUFDcEYsc0ZBQXNGO1lBQ3RGLGlHQUFpRztZQUNqRyxJQUFJLElBQUksQ0FBQywrQkFBK0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQzFCO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDbkMsQ0FBQyxFQUFFLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFHOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDZiw4RkFBOEY7WUFDOUYsNEZBQTRGO1lBQzVGLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDM0QsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ2xFLENBQUM7WUFDRixvRkFBb0Y7WUFDcEYsdUZBQXVGO1lBQ3ZGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztpQkFDOUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztpQkFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUF3QyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFBO1FBQzFQLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVRLGVBQWU7UUFDdEIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQzNELFdBQVcsRUFDWCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFDOUIsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFDLENBQzlELENBQUM7U0FDSDtRQUNELElBQUksSUFBSSxDQUFDLCtCQUErQixFQUFFO1lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ3JELG9HQUFvRztvQkFDcEcsNkZBQTZGO29CQUM3RixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDM0IsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsdUZBQXVGO29CQUN2Rix3RUFBd0U7b0JBQ3hFLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRTt3QkFDbEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7cUJBQ2xDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxpRkFBaUY7WUFDakYsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxJQUNJLFVBQVU7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFDSSxrQkFBa0I7UUFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFJLENBQUE7SUFDeEMsQ0FBQztJQUVELElBQ0ksZUFBZTtRQUNqQixPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQTtJQUNyQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsV0FBNkIsRUFBRSxHQUFRO1FBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxXQUFXO0lBRVgsb0JBQW9CLENBQUMsUUFBZ0I7UUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDO0lBQ2xGLENBQUM7SUFFRCxXQUFXO0lBRVgsbUJBQW1CLENBQUMsUUFBZ0I7UUFDbEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDO0lBQ2pGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUMvQixNQUFNLE9BQU8sR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztTQUN0QztRQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNyQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxnSEFBZ0g7SUFDdEcseUJBQXlCO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsK0JBQStCLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUM3RyxDQUFDO0lBRUQseUdBQXlHO0lBQ2pHLGFBQWEsQ0FBQyxRQUFnQjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sd0JBQXdCLENBQUMsVUFBVSxHQUFHLEVBQUU7UUFDOUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLDhFQUE4RTtZQUM5RSxvRkFBb0Y7WUFDcEYsd0ZBQXdGO1lBQ3hGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5RCwyRkFBMkY7WUFDM0Ysa0ZBQWtGO1lBQ2xGLHlGQUF5RjtZQUN6Riw2RkFBNkY7WUFDN0YsNEZBQTRGO1lBQzVGLHVGQUF1RjtZQUN2RixxRkFBcUY7WUFDckYsTUFBTSxhQUFhLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUYsTUFBTSxhQUFhLEdBQUcsYUFBYSxJQUFJLElBQUksSUFBSSxhQUFhLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxhQUFhLElBQUksQ0FBQyxDQUFDO1lBQy9GLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLFVBQVUsR0FBRyxHQUFHLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUM7aUJBQ2hEO2FBQ0Y7UUFDSCxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDaEIsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDdEMsNkVBQTZFO1FBQzdFLHFGQUFxRjtRQUNyRixJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRTtZQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN4QyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRVEsV0FBVztRQUNsQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdkMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyx5QkFBeUI7UUFDL0Isd0ZBQXdGO1FBQ3hGLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksRUFBRTtZQUN0QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUNqRDtRQUNELCtFQUErRTtRQUMvRSx1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUNyRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLCtCQUErQixFQUFFO2dCQUN4Qyw2RUFBNkU7Z0JBQzdFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDO3VHQS9SVSxrQkFBa0Isa0JBOEVULDBDQUEwQzsyRkE5RW5ELGtCQUFrQixzakJBSmxCO1lBQ1QsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1NBQzVKLDBFQStCVSx3QkFBd0IsdUVDaEhyQywrN0tBMkdBLHlpR0QvRGEsMkJBQTJCOztBQTBDN0I7SUFEQyxPQUFPLEVBQUU7OEJBQ0gsU0FBUzsrQ0FBZ0M7QUFHaEQ7SUFEQyxPQUFPLEVBQUU7OEJBQ0Usa0JBQWtCO29EQUF5QztBQVF2RTtJQURDLE9BQU8sRUFBRTs4QkFDRyxVQUFVO3FEQUF5QztBQUdoRTtJQURDLGlCQUFpQixFQUFFOztvREFDRjtBQU1sQjtJQURDLE9BQU8sRUFBRTs4QkFDRyxVQUFVO3FEQUFxRjtBQUk1RztJQUZDLGlCQUFpQixFQUFFOztvREFFK0I7MkZBM0JqRCxrQkFBa0I7a0JBUjlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGFBR2Y7d0JBQ1QsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO3FCQUM1Sjs7MEJBZ0ZZLE1BQU07MkJBQUMsMENBQTBDOzswQkFBRyxRQUFROzRDQTNFaEUsS0FBSztzQkFEYixLQUFLO2dCQUlHLFVBQVU7c0JBRGxCLEtBQUs7Z0JBTU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLEtBQUs7Z0JBSUcsVUFBVTtzQkFEbEIsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSUcsV0FBVztzQkFEbkIsS0FBSztnQkFLRyxVQUFVO3NCQUZsQixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGlCQUFpQjtnQkFJOUIsY0FBYztzQkFEYixTQUFTO3VCQUFDLHdCQUF3QjtnQkFxQm5DLFlBQVk7c0JBRFgsV0FBVzt1QkFBQyxPQUFPO2dCQUloQix1QkFBdUI7c0JBRDFCLFdBQVc7dUJBQUMsK0JBQStCO2dCQW1IeEMsVUFBVTtzQkFEYixXQUFXO3VCQUFDLG1CQUFtQjtnQkFNNUIsa0JBQWtCO3NCQURyQixXQUFXO3VCQUFDLGlDQUFpQztnQkFNMUMsZUFBZTtzQkFEbEIsV0FBVzt1QkFBQyw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIHRhYmxlIGJvZHkgcmVuZGVycyBhcmJpdHJhcnkgcm93L2NlbGwgdHlwZXMgKi9cbmltcG9ydCB7Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxuICBpbmplY3Rcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIERzbCxcbiAgTGlzdE1vZGVsLFxuICBMaXN0TW9kZWxDaGFpbixcbiAgTWFwTW9kZWxDaGFpbixcbiAgTXV0YWJsZVZhbHVlTW9kZWwsXG4gIFByb3hpZnksXG4gIHByb3hpZnksXG4gIFN0b3JlSW5WYWx1ZU1vZGVsLFxuICBWYWx1ZU1vZGVsXG59IGZyb20gXCJAY29vbG9uL3BlY3RpblwiO1xuaW1wb3J0IHtUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlfSBmcm9tIFwibmctdGFibGUtdmlydHVhbC1zY3JvbGxcIjtcbmltcG9ydCB7UmVzaXplQXdhcmVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi9yZXNpemUtYXdhcmUuY29tcG9uZW50XCI7XG5pbXBvcnQge0Fic3RyYWN0VGFibGVNb2RlbH0gZnJvbSBcIi4uLy4uL2Fic3RyYWN0LXRhYmxlLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7Q29sdW1uTW9kZWx9IGZyb20gXCIuLi8uLi9jb2x1bW4vY29sdW1uLW1vZGVsXCI7XG5pbXBvcnQge0Zvb3RlclJvd01vZGVsLCBSZXNvbHZlZEZvb3RlclJvd30gZnJvbSBcIi4uLy4uL2Zvb3Rlci9mb290ZXItcm93LW1vZGVsXCI7XG5cbmltcG9ydCB7QVVQX0RFVEFDSEVEX1BBUkVOVF9DRFIsIERpc3Bvc2FibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi9kaXNwb3NhYmxlLWNvbXBvbmVudFwiO1xuXG5leHBvcnQgY29uc3QgQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSID0gbmV3IEluamVjdGlvblRva2VuPG51bWJlcj4oXCJBVVBfVEFCTEVfVklSVFVBTF9TQ1JPTExfQlVGRkVSX01VTFRJUExJRVJcIilcbmV4cG9ydCBjb25zdCBBVVBfVEFCTEVfT1BUSU1JWkVEX0NIQU5HRV9ERVRFQ1RJT04gPSBuZXcgSW5qZWN0aW9uVG9rZW48Ym9vbGVhbj4oXCJBVVBfVEFCTEVfT1BUSU1JWkVEX0NIQU5HRV9ERVRFQ1RJT05cIilcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2F1cFRhYmxlUm93QXR0cmlidXRlc11cIixcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVSb3dBdHRyaWJ1dGVzRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKVxuICBhdXBUYWJsZVJvd0F0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvKiogQXR0cmlidXRlIG5hbWVzIGFwcGxpZWQgb24gdGhlIHByZXZpb3VzIHBhc3MsIHNvIG9uZXMgdGhhdCBkaXNhcHBlYXIgY2FuIGJlIHJlbW92ZWQuICovXG4gIHByaXZhdGUgYXBwbGllZEF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICB9XG5cbiAgLy8gUmUtYXBwbHkgb24gZXZlcnkgY2hhbmdlLCBub3QganVzdCBvbmNlIGF0IGluaXQ6IGEgcm93J3MgYXR0cmlidXRlIHZhbHVlcyBjYW4gY2hhbmdlIGFmdGVyIHRoZVxuICAvLyByb3cgaGFzIHJlbmRlcmVkIChlLmcuIGFuIE9UQVAgZGV2aWNlIHJvdyB3aG9zZSBkZXZpY2UgcmVjb3JkIHJlc29sdmVzIGFmdGVyIGl0cyBzY3JhdGNocGFkIHJvd1xuICAvLyB3YXMgY3JlYXRlZCksIGFuZCB0aGUgZWxlbWVudCBtdXN0IHJlZmxlY3QgdGhlIGxhdGVzdCB2YWx1ZXMuIFByZXZpb3VzbHkgdGhpcyBpbXBsZW1lbnRlZCBPbkluaXQsXG4gIC8vIHNvIHRoZSBhdHRyaWJ1dGVzIHdlcmUgZnJvemVuIGF0IHJvdy1jcmVhdGlvbiB0aW1lIGFuZCB3ZW50IHN0YWxlIChlLmcuIGRldmljZUhhcmR3YXJlSWQgc3R1Y2sgb25cbiAgLy8gaXRzIGluaXRpYWwgXCJ1bmRlZmluZWRcIikuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5hdXBUYWJsZVJvd0F0dHJpYnV0ZXMgPz8ge307XG4gICAgZm9yIChjb25zdCBhdHRyIG9mIHRoaXMuYXBwbGllZEF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgICBpZiAoIShhdHRyIGluIG5leHQpKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFwcGxpZWRBdHRyaWJ1dGVOYW1lcyA9IE9iamVjdC5rZXlzKG5leHQpO1xuICAgIGZvciAoY29uc3QgYXR0ciBvZiB0aGlzLmFwcGxpZWRBdHRyaWJ1dGVOYW1lcykge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgbmV4dFthdHRyXSk7XG4gICAgfVxuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhdXAtdGFibGUtYm9keVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3RhYmxlLWJvZHkuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL3RhYmxlLWJvZHkuY29tcG9uZW50LnNjc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHsgcHJvdmlkZTogQVVQX0RFVEFDSEVEX1BBUkVOVF9DRFIsIHVzZUZhY3Rvcnk6ICgpID0+IGluamVjdChBVVBfVEFCTEVfT1BUSU1JWkVEX0NIQU5HRV9ERVRFQ1RJT04sIHsgb3B0aW9uYWw6IHRydWUgfSkgPyBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpIDogbnVsbCB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5Q29tcG9uZW50PFJvdyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBSZXNpemVBd2FyZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBkYXRhJDogTGlzdE1vZGVsPFJvdz4gPSBwcm94aWZ5KExpc3RNb2RlbDxSb3c+KTtcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIHRhYmxlTW9kZWw6IEFic3RyYWN0VGFibGVNb2RlbDxSb3c+ID0gcHJveGlmeShBYnN0cmFjdFRhYmxlTW9kZWw8Um93Pik7XG5cbiAgLy8gRm9vdGVyIHJvd3MgYXJlIGJ1aWx0IG9uY2UgaW4gdGhlIFRhYmxlTW9kZWwgYnVpbGRlciBjYWxsYmFjaywgc28gYSBwbGFpbiBpbnB1dCBpcyBlbm91Z2g7XG4gIC8vIHRoZSBwZXItcm93IGNlbGwgbGF5b3V0IChmb290ZXJSb3dEZWZzJCkgaXMgZGVyaXZlZCByZWFjdGl2ZWx5IGZyb20gdGhlIHZpc2libGUgY29sdW1ucy5cbiAgQElucHV0KClcbiAgZm9vdGVyUm93czogRm9vdGVyUm93TW9kZWwuSW1wbFtdID0gW107XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBzaG93SGVhZGVyJDogVmFsdWVNb2RlbDxib29sZWFuPiA9IHByb3hpZnkoVmFsdWVNb2RlbDxib29sZWFuPik7XG5cbiAgQElucHV0KCkgQFN0b3JlSW5WYWx1ZU1vZGVsKClcbiAgYWNjZXNzb3Igc2hvd0hlYWRlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgdHJhY2tCeTogKGluZGV4OiBudW1iZXIsIGl0ZW06IFJvdykgPT4gYW55XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBzY3JvbGxNb2RlJDogVmFsdWVNb2RlbDxUYWJsZUJvZHlDb21wb25lbnQuU2Nyb2xsTW9kZT4gPSBwcm94aWZ5KFZhbHVlTW9kZWw8VGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGU+KTtcblxuICBASW5wdXQoKSBAU3RvcmVJblZhbHVlTW9kZWwoKVxuICBASG9zdEJpbmRpbmcoXCJhdHRyLnNjcm9sbE1vZGVcIilcbiAgYWNjZXNzb3Igc2Nyb2xsTW9kZTogVGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGUgPSBcIm5vbmVcIjtcblxuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydClcbiAgc2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydFxuXG4gIGNvbHVtbnMkOiBMaXN0TW9kZWxDaGFpbjxDb2x1bW5Nb2RlbDxSb3c+PjtcbiAgY29sdW1uSWRzJDogTGlzdE1vZGVsQ2hhaW48c3RyaW5nPjtcbiAgZm9vdGVyUm93RGVmcyQ6IFZhbHVlTW9kZWw8UmVzb2x2ZWRGb290ZXJSb3dbXT47XG5cbiAgcHJpdmF0ZSBjb2x1bW5zQnlJZCQ6IE1hcE1vZGVsQ2hhaW48c3RyaW5nLCBDb2x1bW5Nb2RlbDxSb3c+PjtcblxuXG4gIC8qKlxuICAgKiBUaGUgaGVhZGVyIHJvdydzIGhlaWdodCwgd2hpY2ggdGhlIHZpcnR1YWwgc2Nyb2xsZXIgb2Zmc2V0cyBpdHMgcm93cyBieSBhbmQgd2hpY2ggcGlucyB0aGUgaGVhZGVyXG4gICAqIGNlbGxzIGluIHZpcnR1YWwgbW9kZS4gVGFrZW4gZnJvbSAtLWF1cC10YWJsZS1oZWFkZXItcm93LWhlaWdodCBhdCBpbml0ICh0YWJsZS5zY3NzIHNldHMgNDhweCksIHNvXG4gICAqIGEgdGFibGUgdGhlbWVkIHdpdGggYSBzaG9ydGVyIGhlYWRlciBzY3JvbGxzIGNvcnJlY3RseTsgNDggd2hlbiB0aGUgdmFyaWFibGUgY2FuJ3QgYmUgcmVhZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBoZWFkZXJIZWlnaHQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDgpO1xuICAvLyBUT0RPOiB0YWtlIHRoZSByb3cgaGVpZ2h0IGZyb20gLS1hdXAtdGFibGUtcm93LWhlaWdodCB0b28uIE5vdCBhIGRyb3AtaW46IHRhYmxlLnNjc3Mgc2V0cyBpdCB0b1xuICAvLyA0MHB4IHdoaWxlIHZpcnR1YWwgcm93cyBoYXZlIGFsd2F5cyBiZWVuIDQ0LCBzbyBmb2xsb3dpbmcgaXQgd291bGQgc2hyaW5rIGV2ZXJ5IHZpcnR1YWwgcm93LlxuICBwcm90ZWN0ZWQgcm93SGVpZ2h0JCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxudW1iZXI+KDQ0KTtcblxuICBASG9zdEJpbmRpbmcoXCJjbGFzc1wiKVxuICBiYXNlQ3NzQ2xhc3MgPSBcImF1cC10YWJsZS1jb21wb25lbnRcIjtcblxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5hdXAtYW5pbWF0aW9ucy1kaXNhYmxlZFwiKVxuICBnZXQgYW5pbWF0aW9uc0Rpc2FibGVkQ2xhc3MoKSB7IHJldHVybiB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQudmFsdWU7IH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlydHVhbFNjcm9sbERhdGFTb3VyY2UgPSBuZXcgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZTxSb3c+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSB2aXJ0dWFsU2Nyb2xsQWN0aXZlJCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhbmltYXRpb25zRGlzYWJsZWQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsKGZhbHNlKTtcbiAgcHJpdmF0ZSBzY3JvbGxUaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgYW5pbWF0aW9uc1Jlc2V0UmFmSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjcm9sbEVuZEFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgdmlld0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICBpZiAodGhpcy5vcHRpbWlzZWRDaGFuZ2VEZXRlY3Rpb25FbmFibGVkKSB7XG4gICAgICAvLyBUaGUgdGFibGUtYm9keSBkZXRhY2hlcyBpdHMgb3duIENEUiBhbmQgaGFzIG5vIGRldGFjaGVkIHBhcmVudCAoQVVQX0RFVEFDSEVEX1BBUkVOVF9DRFJcbiAgICAgIC8vIHVzZXMgc2tpcFNlbGYpLCBzbyB0aGUgYmFzZSBtYXJrRm9yQ2hlY2soKSB3b3VsZCBjYWxsIGNkci5tYXJrRm9yQ2hlY2soKSB3aGljaCBpcyBhXG4gICAgICAvLyBuby1vcCBvbiBhIGRldGFjaGVkIHZpZXcuIFNjaGVkdWxlIGFuIGV4cGxpY2l0IGRldGVjdENoYW5nZXMoKSBvbiBvdXJzZWx2ZXMgaW5zdGVhZCBzb1xuICAgICAgLy8gdGhhdCB2aWV3U3RhdGVEZXBlbmRzT24oKSBjb3JyZWN0bHkgdHJpZ2dlcnMgcmUtcmVuZGVycyAoZS5nLiByb3cgc2VsZWN0aW9uIGNsYXNzZXMpLlxuICAgICAgRGlzcG9zYWJsZUNvbXBvbmVudC5zY2hlZHVsZVBhcmVudFN3ZWVwKHRoaXMuY2RyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUikgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGJ1ZmZlck11bHRpcGxpZXI6IG51bWJlciA9IDMpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IHtjaGFpbiwgd2hlbiwgb2JzZXJ2ZX0gPSBEc2wuZGlzcG9zZVdpdGgodGhpcyk7XG5cbiAgICB0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQgPSB0aGlzLmluamVjdChBVVBfVEFCTEVfT1BUSU1JWkVEX0NIQU5HRV9ERVRFQ1RJT04sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgY29uc3QgYWN0dWFsSGVhZGVySGVpZ2h0JCA9IGNoYWluKHRoaXMuc2hvd0hlYWRlciQpLm1hcChzaG93ID0+IHtcbiAgICAgIHJldHVybiBzaG93ID8gdGhpcy5oZWFkZXJIZWlnaHQkLnZhbHVlIDogMDtcbiAgICB9LCB7ZGVwZW5kc09uOiB0aGlzLmhlYWRlckhlaWdodCR9KTtcblxuXG4gICAgLy8gcGVyZm9ybWFuY2UgaXMgdGVycmlibGUgaWYgdGhlIGRhdGEgY2hhbmdlcyB3aGlsZSB3ZSdyZSBzY3JvbGxpbmcsIHNvIHdlIHBvc3Rwb25lIHVwZGF0ZXMgdW50aWxcbiAgICAvLyBzY3JvbGxpbmcgc3RvcHMuXG4gICAgY29uc3QgZGVsYXllZERhdGEkID0gY2hhaW4odGhpcy5kYXRhJCkucG9zdHBvbmVXaGlsZSh0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkKVxuICAgIHdoZW4oZGVsYXllZERhdGEkKS5jaGFuZ2VzKGRlbGF0ZWREYXRhID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZSA9IHRydWU7XG4gICAgICAvLyBVcGRhdGUgdGhlIENESyBkYXRhIHNvdXJjZSBiZWZvcmUgZGV0ZWN0Q2hhbmdlcyBzbyB0aGF0IGJvdGggdGhlIGV4cGxpY2l0IGRldGVjdENoYW5nZXNcbiAgICAgIC8vIGFuZCBhbnkgc3Vic2VxdWVudCBTV0VFUC10cmlnZ2VyZWQgZGV0ZWN0Q2hhbmdlcyBzZWUgdGhlIHNhbWUgZGF0YS4gSWYgd2UgdXBkYXRlIGFmdGVyLFxuICAgICAgLy8gdGhlIFNXRUVQJ3MgZGV0ZWN0Q2hhbmdlcyBzZWVzIGRpZmZlcmVudCByb3cgb2JqZWN0cyBhbmQgdHJpZ2dlcnMgYSBzZWNvbmQgY2FzY2FkZS5cbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbERhdGFTb3VyY2UuZGF0YSA9IGRlbGF0ZWREYXRhO1xuICAgICAgLy8gV2l0aCBkZXRhY2hlZCBDRCwgbWFya0ZvckNoZWNrKCkgYWxvbmUgd29uJ3QgcHVzaCBbQC5kaXNhYmxlZF09XCJ0cnVlXCIgdG8gdGhlIERPTS5cbiAgICAgIC8vIERldGVjdCBzeW5jaHJvbm91c2x5IHNvIENESyByZW5kZXJzIG5ldyByb3dzIHdpdGggYW5pbWF0aW9ucyBhbHJlYWR5IHN1cHByZXNzZWQuXG4gICAgICAvLyBhbmltYXRpb25zRGlzYWJsZWQkLnZhbHVlIGlzIGFscmVhZHkgdHJ1ZSAoc2V0IGFib3ZlKSwgc28gdGhlIHRlbXBsYXRlIGV2YWx1YXRpb25cbiAgICAgIC8vIGluIHRoaXMgZGV0ZWN0Q2hhbmdlcyB3aWxsIHNlZSBbQC5kaXNhYmxlZF09XCJ0cnVlXCIgYmVmb3JlIGFueSBuZXcgcm93cyBhcmUgY3JlYXRlZC5cbiAgICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHtpbml0aWFsVmFsdWU6XCJldmFsdWF0ZVwifSBmaXJpbmcgZHVyaW5nIGNvbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHZpZXcgZXhpc3RzLlxuICAgICAgaWYgKHRoaXMub3B0aW1pc2VkQ2hhbmdlRGV0ZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnZpZXdJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjaGVkdWxlVGFibGVIZWlnaHRDaGVjaygpO1xuICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbnNBZnRlckZyYW1lKCk7XG4gICAgfSwge2luaXRpYWxWYWx1ZTogXCJldmFsdWF0ZVwifSlcblxuXG4gICAgdGhpcy5vbkluaXQoKCkgPT4ge1xuICAgICAgLy8gT24gaW5pdCwgbm90IGFmdGVyIHRoZSB2aWV3OiB0aGUgaGVhZGVyIGhlaWdodCBpcyBib3VuZCBpbiB0aGlzIHZpZXcgYW5kIGluIGEgaG9zdCBiaW5kaW5nLFxuICAgICAgLy8gYW5kIGNoYW5naW5nIGl0IGFmdGVyIHRoZXkgYXJlIGNoZWNrZWQgd291bGQgdHJpcCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZC5cbiAgICAgIHRoaXMudGFrZUhlYWRlckhlaWdodEZyb21UaGVtZSgpO1xuICAgICAgdGhpcy5jb2x1bW5zJCA9IGNoYWluKHRoaXMudGFibGVNb2RlbC52aXNpYmxlQ29sdW1ucyQpO1xuICAgICAgdGhpcy5jb2x1bW5JZHMkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkucGx1Y2soXCJjb2x1bW5JZFwiKTtcbiAgICAgIHRoaXMuY29sdW1uc0J5SWQkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkuaW5kZXhCeSgnY29sdW1uSWQnKTtcbiAgICAgIHRoaXMuZm9vdGVyUm93RGVmcyQgPSBjaGFpbih0aGlzLmNvbHVtbklkcyQpLnJlZHVjZUFsbChpZHMgPT5cbiAgICAgICAgKHRoaXMuZm9vdGVyUm93cyA/PyBbXSkubWFwKChyb3csIGkpID0+IHJvdy5yZXNvbHZlKGksIFsuLi5pZHNdKSlcbiAgICAgICk7XG4gICAgICAvLyBGb290ZXIgcm93cyBnYXRlZCB2aWEgdmlzaWJsZVdoaWxlKCkgZmxpcCBpbmRlcGVuZGVudGx5IG9mIHRoZSBjb2x1bW5zIHRoYXQgZHJpdmVcbiAgICAgIC8vIGZvb3RlclJvd0RlZnMkLCBzbyBkZXBlbmQgb24gdGhlaXIgbW9kZWxzIGRpcmVjdGx5IHRvIHJlLXJlbmRlciB0aGUgPHRyPiByZWFjdGl2ZWx5LlxuICAgICAgY29uc3QgZm9vdGVyVmlzaWJpbGl0eSQgPSAodGhpcy5mb290ZXJSb3dzID8/IFtdKVxuICAgICAgICAubWFwKHJvdyA9PiByb3cudmlzaWJsZSQpXG4gICAgICAgIC5maWx0ZXIoKG0pOiBtIGlzIFZhbHVlTW9kZWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD4gPT4gbSAhPSBudWxsKTtcbiAgICAgIHRoaXMudmlld1N0YXRlRGVwZW5kc09uKHRoaXMudGFibGVNb2RlbC5maWx0ZXJlZFJvd3MkLCB0aGlzLnRhYmxlTW9kZWwudmlzaWJsZUNvbHVtbnMkLCB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkLCB0aGlzLmFuaW1hdGlvbnNEaXNhYmxlZCQsIHRoaXMudGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zJCwgdGhpcy50YWJsZU1vZGVsLnNlbGVjdGFibGVSb3dzJCwgdGhpcy5mb290ZXJSb3dEZWZzJCwgLi4uZm9vdGVyVmlzaWJpbGl0eSQpXG4gICAgfSk7XG5cbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLnZpZXdJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHtvYnNlcnZlfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQuZWxlbWVudFNjcm9sbGVkKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMubm90aWZ5U2Nyb2xsZWQoKSk7XG4gICAgICB0aGlzLnNjcm9sbEVuZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdzY3JvbGxlbmQnLFxuICAgICAgICAoKSA9PiB0aGlzLm5vdGlmeVNjcm9sbEVuZGVkKCksXG4gICAgICAgIHtwYXNzaXZlOiB0cnVlLCBzaWduYWw6IHRoaXMuc2Nyb2xsRW5kQWJvcnRDb250cm9sbGVyLnNpZ25hbH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGltaXNlZENoYW5nZURldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgIHRoaXMuY2RyLmRldGFjaCgpO1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgLy8gRGVmZXIgcGFzdCB0aGUgY3VycmVudCBzeW5jIGJhdGNoIHNvIHRoZSBkYXRhIHNvdXJjZSBoYXMgdXBkYXRlZCBfcmVuZGVyZWRJdGVtcyBiZWZvcmUgd2UgcnVuIENELlxuICAgICAgICAgIC8vIE11c3QgY2FsbCBkZXRlY3RDaGFuZ2VzKCkgZGlyZWN0bHkg4oCUIG1hcmtGb3JDaGVjaygpIGFsb25lIGRvZXMgbm90aGluZyBvbiBhIGRldGFjaGVkIHZpZXcuXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRXh0ZW5kIHRoZSBhbmltYXRpb24gc3VwcHJlc3Npb24gd2luZG93IG9uIGVhY2ggQ0RLIHJhbmdlIGNoYW5nZSBzbyBhbmltYXRpb25zIGNhbid0XG4gICAgICAgICAgLy8gZmlyZSBtaWQtcmVuZGVyIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgZnJhbWVzIHRoZSByYW5nZSB1cGRhdGUgc3BhbnMuXG4gICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uc0Rpc2FibGVkJC52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbnNBZnRlckZyYW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIERlZmVyIHBhc3QgdGhlIGN1cnJlbnQgdGljayBzbyB0aGUgdmlld3BvcnQncyBpbml0aWFsIHJlbmRlcmVkIHJhbmdlIGlzIHN0YWJsZVxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmhpZGUtaGVhZGVyXCIpXG4gIGdldCBoaWRlSGVhZGVyKCkge1xuICAgIHJldHVybiAhdGhpcy5zaG93SGVhZGVyO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuLS1hdXAtdGFibGUtaGVhZGVyLWhlaWdodFwiKVxuICBnZXQgaGVhZGVySGVpZ2h0Q3NzVmFyKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmhlYWRlckhlaWdodCQudmFsdWV9cHhgXG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLWF1cC10YWJsZS1yb3ctaGVpZ2h0XCIpXG4gIGdldCByb3dIZWlnaHRDc3NWYXIoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucm93SGVpZ2h0JC52YWx1ZX1weGBcbiAgfVxuXG4gIG5vdGlmeUNlbGxDbGlja2VkKGNvbHVtbk1vZGVsOiBDb2x1bW5Nb2RlbDxSb3c+LCByb3c6IFJvdykge1xuICAgIHRoaXMudGFibGVNb2RlbC5fbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWwsIHJvdyk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzRmlyc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsLmZpcnN0VmlzaWJsZUNvbHVtbiQucXVlcnkoKS52YWx1ZT8uY29sdW1uSWQgPT09IGNvbHVtbklkO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcblxuICBpc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsLmxhc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICBnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW2BhdXAtY29sLSR7dGhpcy5jb2x1bW5zQnlJZCQuZ2V0KGNvbHVtbklkKS5kYXNoZXJpc2VkQ29sdW1uSWR9YF07XG4gICAgaWYgKHRoaXMuaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQpKSB7XG4gICAgICBjbGFzc2VzLnB1c2goXCJmaXJzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMYXN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImxhc3QtdmlzaWJsZS1jb2x1bW5cIik7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgLyoqIFNldHMgW2hlYWRlckhlaWdodCRdIGZyb20gLS1hdXAtdGFibGUtaGVhZGVyLXJvdy1oZWlnaHQsIGtlZXBpbmcgdGhlIGN1cnJlbnQgdmFsdWUgd2hlbiBpdCBjYW4ndCBiZSByZWFkLiAqL1xuICBwcm90ZWN0ZWQgdGFrZUhlYWRlckhlaWdodEZyb21UaGVtZSgpIHtcbiAgICB0aGlzLmhlYWRlckhlaWdodCQudmFsdWUgPSB0aGlzLnJlYWRDc3NQaXhlbHMoXCItLWF1cC10YWJsZS1oZWFkZXItcm93LWhlaWdodFwiKSA/PyB0aGlzLmhlYWRlckhlaWdodCQudmFsdWU7XG4gIH1cblxuICAvKiogQSBsZW5ndGggY3VzdG9tIHByb3BlcnR5IGFzIHJlc29sdmVkIG9uIHRoaXMgZWxlbWVudCwgaW4gcHg7IHVuZGVmaW5lZCB3aGVuIHVuc2V0IG9yIG5vdCBhIGxlbmd0aC4gKi9cbiAgcHJpdmF0ZSByZWFkQ3NzUGl4ZWxzKHByb3BlcnR5OiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBpeGVscyA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkpO1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGl4ZWxzKSAmJiBwaXhlbHMgPiAwID8gcGl4ZWxzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVRhYmxlSGVpZ2h0Q2hlY2sod2FpdE1pbGxpcyA9IDUwKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBVc2UgQ0RLJ3MgaW50ZXJuYWwgcmVuZGVyZWQgcmFuZ2UgdG8gZGV0ZWN0IGEgYnJva2VuIHZpcnR1YWwgc2Nyb2xsIHN0YXRlIOKAlFxuICAgICAgLy8gYXZvaWRzIHJlYWRpbmcgb2Zmc2V0SGVpZ2h0IChmb3JjZWQgbGF5b3V0KSBhbmQgZGlzcGF0Y2hpbmcgYSBnbG9iYWwgcmVzaXplIGV2ZW50XG4gICAgICAvLyAod2hpY2ggdHJpZ2dlcnMgQW5ndWxhcidzIGFuaW1hdGlvbiBlbmdpbmUgdG8gY2FsbCBnZXRDb21wdXRlZFN0eWxlIG9uIGFsbCBlbGVtZW50cykuXG4gICAgICBjb25zdCByZW5kZXJlZFJhbmdlID0gdGhpcy5zY3JvbGxWaWV3cG9ydD8uZ2V0UmVuZGVyZWRSYW5nZSgpO1xuICAgICAgLy8gQSB1c2FibGUgdmlydHVhbCB2aWV3cG9ydCByZW5kZXJzIG1vcmUgdGhhbiBvbmUgcm93IHdoZW5ldmVyIG1vcmUgZGF0YSBleGlzdHMuIFJlbmRlcmluZ1xuICAgICAgLy8gbm9uZSBvciBvbmUgcm93IGF0IHRoZSB0b3Agd2hpbGUgZGF0YSQgaG9sZHMgbW9yZSBtZWFucyB0aGUgdmlld3BvcnQgbWVhc3VyZWQgYVxuICAgICAgLy8gY29sbGFwc2VkL3N0YWxlIGhlaWdodCAoZS5nLiBpdCB3YXMgbWVhc3VyZWQgYmVmb3JlIHRoZSB0YWJsZSB3YXMgc2l6ZWQgdXAsIHRoZW4gbmV2ZXJcbiAgICAgIC8vIHJlLW1lYXN1cmVkIHVuZGVyIGRldGFjaGVkIGNoYW5nZSBkZXRlY3Rpb24pIOKAlCBzbyByZS1tZWFzdXJlIHRvIGV4cGFuZCB0aGUgcmVuZGVyZWQgcmFuZ2UuXG4gICAgICAvLyBDb3ZlcnMgYm90aCB0aGUgemVyby1yb3cgY29sbGFwc2UgYW5kIHRoZSBwYXJ0aWFsIChvbmUtcm93KSB1bmRlci1yZW5kZXIuIERldGVjdGlvbiBzdGF5c1xuICAgICAgLy8gbGF5b3V0LWZyZWUgKGdldFJlbmRlcmVkUmFuZ2Ugb25seSk7IGNvcnJlY3RseS1zaXplZCBhbmQgZ2VudWluZWx5LXZpcnR1YWxpc2VkIGxhcmdlXG4gICAgICAvLyB0YWJsZXMgcmVuZGVyIG1hbnkgcm93cywgc28gdGhleSBuZXZlciByZWFjaCB0aGUgY2hlY2tWaWV3cG9ydFNpemUoKSByZWZsb3cgYmVsb3cuXG4gICAgICBjb25zdCByZW5kZXJlZENvdW50ID0gcmVuZGVyZWRSYW5nZSAhPSBudWxsID8gcmVuZGVyZWRSYW5nZS5lbmQgLSByZW5kZXJlZFJhbmdlLnN0YXJ0IDogMDtcbiAgICAgIGNvbnN0IHVuZGVyUmVuZGVyZWQgPSByZW5kZXJlZFJhbmdlICE9IG51bGwgJiYgcmVuZGVyZWRSYW5nZS5zdGFydCA9PT0gMCAmJiByZW5kZXJlZENvdW50IDw9IDE7XG4gICAgICBpZiAodW5kZXJSZW5kZXJlZCAmJiB0aGlzLmRhdGEkLmxlbmd0aCA+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
|
|
@@ -19,29 +19,43 @@ export class HighlightPipe extends GarbageCollector {
|
|
|
19
19
|
ngOnDestroy() {
|
|
20
20
|
this.dispose();
|
|
21
21
|
}
|
|
22
|
+
/** The markup last produced, and the trusted value wrapping it. */
|
|
23
|
+
lastHtml;
|
|
24
|
+
lastResult;
|
|
22
25
|
/**
|
|
23
26
|
* Highlights occurrences of `searchModel` within `value`.
|
|
24
27
|
*
|
|
28
|
+
* The pipe is impure, so it runs on every change detection of its view. It hands back the same
|
|
29
|
+
* trusted value while the markup is unchanged: a fresh one each time would read as a new binding,
|
|
30
|
+
* and an `[innerHTML]` would replace its text on every pass though nothing about it had changed.
|
|
31
|
+
*
|
|
25
32
|
* @param value The string to search within.
|
|
26
33
|
* @param searchTextFilter Intercept the search text to allow matching against substrings.
|
|
27
34
|
*/
|
|
28
35
|
transform(value, searchTextFilter) {
|
|
36
|
+
const html = this.highlight(value, searchTextFilter);
|
|
37
|
+
if (html !== this.lastHtml) {
|
|
38
|
+
this.lastHtml = html;
|
|
39
|
+
this.lastResult = this.sanitizer.bypassSecurityTrustHtml(html);
|
|
40
|
+
}
|
|
41
|
+
return this.lastResult;
|
|
42
|
+
}
|
|
43
|
+
highlight(value, searchTextFilter) {
|
|
29
44
|
const sanitisedValue = escape(value);
|
|
30
45
|
const rawModelValue = this.highlightContext?.aupHighlightTextModel?.value ?? '';
|
|
31
46
|
const filtered = searchTextFilter ? searchTextFilter(rawModelValue) : rawModelValue;
|
|
32
47
|
const searchText = escape(filtered ?? '');
|
|
33
48
|
if (isEmpty(searchText) || !isString(value)) {
|
|
34
|
-
return
|
|
49
|
+
return sanitisedValue;
|
|
35
50
|
}
|
|
36
51
|
// Match in a case insensitive manner
|
|
37
52
|
const re = new RegExp(escapeStringRegexp(searchText), 'gi');
|
|
38
53
|
const match = sanitisedValue.match(re);
|
|
39
54
|
// If there's no match, just return the original value.
|
|
40
55
|
if (!match) {
|
|
41
|
-
return
|
|
56
|
+
return sanitisedValue;
|
|
42
57
|
}
|
|
43
|
-
|
|
44
|
-
return this.sanitizer.bypassSecurityTrustHtml(result);
|
|
58
|
+
return sanitisedValue.replace(re, '<mark>' + match[0] + '</mark>');
|
|
45
59
|
}
|
|
46
60
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: HighlightPipe, deps: [{ token: i1.DomSanitizer }, { token: i2.HighlightTextModelDirective, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
47
61
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.9", ngImport: i0, type: HighlightPipe, name: "aupHighlight", pure: false });
|
|
@@ -55,4 +69,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
|
|
|
55
69
|
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i2.HighlightTextModelDirective, decorators: [{
|
|
56
70
|
type: Optional
|
|
57
71
|
}] }]; } });
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9kaXJlY3RpdmVzL2hpZ2hsaWdodC5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtIQUFrSDtBQUNsSCxPQUFPLEVBQWEsUUFBUSxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sa0JBQWtCLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDOzs7O0FBTzdFLE1BQU0sT0FBTyxhQUFjLFNBQVEsZ0JBQWdCO0lBRTdCO0lBQ3FCO0lBRHpDLFlBQW9CLFNBQXVCLEVBQ0YsZ0JBQThDO1FBQ3JGLEtBQUssRUFBRSxDQUFDO1FBRlUsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUNGLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBOEI7SUFFdkYsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELG1FQUFtRTtJQUMzRCxRQUFRLENBQVU7SUFDbEIsVUFBVSxDQUFNO0lBRXhCOzs7Ozs7Ozs7T0FTRztJQUNILFNBQVMsQ0FBQyxLQUFVLEVBQUUsZ0JBQTREO1FBQ2hGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEU7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFVLEVBQUUsZ0JBQTREO1FBQ3hGLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyQyxNQUFNLGFBQWEsR0FBVyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNwRixNQUFNLFVBQVUsR0FBVyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWxELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNDLE9BQU8sY0FBYyxDQUFDO1NBQ3ZCO1FBRUQscUNBQXFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkMsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLGNBQWMsQ0FBQztTQUN2QjtRQUVELE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNyRSxDQUFDO3VHQXZEVSxhQUFhO3FHQUFiLGFBQWE7OzJGQUFiLGFBQWE7a0JBSnpCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLElBQUksRUFBRSxLQUFLO2lCQUNaOzswQkFJYyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBBbmd1bGFyIFBpcGUgdHJhbnNmb3JtIHNpZ25hdHVyZSB1c2VzIGFueSBieSBjb252ZW50aW9uICovXG5pbXBvcnQgeyBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEdhcmJhZ2VDb2xsZWN0b3IsIFZhbHVlTW9kZWwgfSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgZXNjYXBlU3RyaW5nUmVnZXhwIGZyb20gJ2VzY2FwZS1zdHJpbmctcmVnZXhwJztcbmltcG9ydCB7IGVzY2FwZSwgaXNFbXB0eSwgaXNTdHJpbmcgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtIaWdobGlnaHRUZXh0TW9kZWxEaXJlY3RpdmV9IGZyb20gJy4vaGlnaGxpZ2h0LXRleHQtbW9kZWwuZGlyZWN0aXZlJztcblxuXG5AUGlwZSh7XG4gIG5hbWU6ICdhdXBIaWdobGlnaHQnLFxuICBwdXJlOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBIaWdobGlnaHRQaXBlIGV4dGVuZHMgR2FyYmFnZUNvbGxlY3RvciBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0sIE9uRGVzdHJveSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBoaWdobGlnaHRDb250ZXh0PzogSGlnaGxpZ2h0VGV4dE1vZGVsRGlyZWN0aXZlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqIFRoZSBtYXJrdXAgbGFzdCBwcm9kdWNlZCwgYW5kIHRoZSB0cnVzdGVkIHZhbHVlIHdyYXBwaW5nIGl0LiAqL1xuICBwcml2YXRlIGxhc3RIdG1sPzogc3RyaW5nO1xuICBwcml2YXRlIGxhc3RSZXN1bHQ6IGFueTtcblxuICAvKipcbiAgICogSGlnaGxpZ2h0cyBvY2N1cnJlbmNlcyBvZiBgc2VhcmNoTW9kZWxgIHdpdGhpbiBgdmFsdWVgLlxuICAgKlxuICAgKiBUaGUgcGlwZSBpcyBpbXB1cmUsIHNvIGl0IHJ1bnMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBvZiBpdHMgdmlldy4gSXQgaGFuZHMgYmFjayB0aGUgc2FtZVxuICAgKiB0cnVzdGVkIHZhbHVlIHdoaWxlIHRoZSBtYXJrdXAgaXMgdW5jaGFuZ2VkOiBhIGZyZXNoIG9uZSBlYWNoIHRpbWUgd291bGQgcmVhZCBhcyBhIG5ldyBiaW5kaW5nLFxuICAgKiBhbmQgYW4gYFtpbm5lckhUTUxdYCB3b3VsZCByZXBsYWNlIGl0cyB0ZXh0IG9uIGV2ZXJ5IHBhc3MgdGhvdWdoIG5vdGhpbmcgYWJvdXQgaXQgaGFkIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHNlYXJjaCB3aXRoaW4uXG4gICAqIEBwYXJhbSBzZWFyY2hUZXh0RmlsdGVyIEludGVyY2VwdCB0aGUgc2VhcmNoIHRleHQgdG8gYWxsb3cgbWF0Y2hpbmcgYWdhaW5zdCBzdWJzdHJpbmdzLlxuICAgKi9cbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIHNlYXJjaFRleHRGaWx0ZXI/OiAocmF3OnN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGFueSB7XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuaGlnaGxpZ2h0KHZhbHVlLCBzZWFyY2hUZXh0RmlsdGVyKTtcbiAgICBpZiAoaHRtbCAhPT0gdGhpcy5sYXN0SHRtbCkge1xuICAgICAgdGhpcy5sYXN0SHRtbCA9IGh0bWw7XG4gICAgICB0aGlzLmxhc3RSZXN1bHQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChodG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0KHZhbHVlOiBhbnksIHNlYXJjaFRleHRGaWx0ZXI/OiAocmF3OnN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2FuaXRpc2VkVmFsdWUgPSBlc2NhcGUodmFsdWUpO1xuXG4gICAgY29uc3QgcmF3TW9kZWxWYWx1ZTogc3RyaW5nID0gdGhpcy5oaWdobGlnaHRDb250ZXh0Py5hdXBIaWdobGlnaHRUZXh0TW9kZWw/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gc2VhcmNoVGV4dEZpbHRlciA/IHNlYXJjaFRleHRGaWx0ZXIocmF3TW9kZWxWYWx1ZSkgOiByYXdNb2RlbFZhbHVlO1xuICAgIGNvbnN0IHNlYXJjaFRleHQ6IHN0cmluZyA9IGVzY2FwZShmaWx0ZXJlZCA/PyAnJyk7XG5cbiAgICBpZiAoaXNFbXB0eShzZWFyY2hUZXh0KSB8fCAhaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gc2FuaXRpc2VkVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggaW4gYSBjYXNlIGluc2Vuc2l0aXZlIG1hbm5lclxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChlc2NhcGVTdHJpbmdSZWdleHAoc2VhcmNoVGV4dCksICdnaScpO1xuICAgIGNvbnN0IG1hdGNoID0gc2FuaXRpc2VkVmFsdWUubWF0Y2gocmUpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBzYW5pdGlzZWRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FuaXRpc2VkVmFsdWUucmVwbGFjZShyZSwgJzxtYXJrPicgKyBtYXRjaFswXSArICc8L21hcms+Jyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -673,29 +673,43 @@ class HighlightPipe extends GarbageCollector {
|
|
|
673
673
|
ngOnDestroy() {
|
|
674
674
|
this.dispose();
|
|
675
675
|
}
|
|
676
|
+
/** The markup last produced, and the trusted value wrapping it. */
|
|
677
|
+
lastHtml;
|
|
678
|
+
lastResult;
|
|
676
679
|
/**
|
|
677
680
|
* Highlights occurrences of `searchModel` within `value`.
|
|
678
681
|
*
|
|
682
|
+
* The pipe is impure, so it runs on every change detection of its view. It hands back the same
|
|
683
|
+
* trusted value while the markup is unchanged: a fresh one each time would read as a new binding,
|
|
684
|
+
* and an `[innerHTML]` would replace its text on every pass though nothing about it had changed.
|
|
685
|
+
*
|
|
679
686
|
* @param value The string to search within.
|
|
680
687
|
* @param searchTextFilter Intercept the search text to allow matching against substrings.
|
|
681
688
|
*/
|
|
682
689
|
transform(value, searchTextFilter) {
|
|
690
|
+
const html = this.highlight(value, searchTextFilter);
|
|
691
|
+
if (html !== this.lastHtml) {
|
|
692
|
+
this.lastHtml = html;
|
|
693
|
+
this.lastResult = this.sanitizer.bypassSecurityTrustHtml(html);
|
|
694
|
+
}
|
|
695
|
+
return this.lastResult;
|
|
696
|
+
}
|
|
697
|
+
highlight(value, searchTextFilter) {
|
|
683
698
|
const sanitisedValue = escape(value);
|
|
684
699
|
const rawModelValue = this.highlightContext?.aupHighlightTextModel?.value ?? '';
|
|
685
700
|
const filtered = searchTextFilter ? searchTextFilter(rawModelValue) : rawModelValue;
|
|
686
701
|
const searchText = escape(filtered ?? '');
|
|
687
702
|
if (isEmpty(searchText) || !isString(value)) {
|
|
688
|
-
return
|
|
703
|
+
return sanitisedValue;
|
|
689
704
|
}
|
|
690
705
|
// Match in a case insensitive manner
|
|
691
706
|
const re = new RegExp(escapeStringRegexp(searchText), 'gi');
|
|
692
707
|
const match = sanitisedValue.match(re);
|
|
693
708
|
// If there's no match, just return the original value.
|
|
694
709
|
if (!match) {
|
|
695
|
-
return
|
|
710
|
+
return sanitisedValue;
|
|
696
711
|
}
|
|
697
|
-
|
|
698
|
-
return this.sanitizer.bypassSecurityTrustHtml(result);
|
|
712
|
+
return sanitisedValue.replace(re, '<mark>' + match[0] + '</mark>');
|
|
699
713
|
}
|
|
700
714
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: HighlightPipe, deps: [{ token: i1.DomSanitizer }, { token: HighlightTextModelDirective, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
701
715
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.9", ngImport: i0, type: HighlightPipe, name: "aupHighlight", pure: false });
|
|
@@ -6806,8 +6820,8 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6806
6820
|
columnsById$;
|
|
6807
6821
|
/**
|
|
6808
6822
|
* 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
|
|
6810
|
-
*
|
|
6823
|
+
* cells in virtual mode. Taken from --aup-table-header-row-height (table.scss sets 48px), so a table
|
|
6824
|
+
* themed with a shorter header scrolls correctly; 48 when the variable can't be read.
|
|
6811
6825
|
*/
|
|
6812
6826
|
headerHeight$ = new MutableValueModel(48);
|
|
6813
6827
|
// TODO: take the row height from --aup-table-row-height too. Not a drop-in: table.scss sets it to
|
|
@@ -6845,6 +6859,10 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6845
6859
|
}, { dependsOn: this.headerHeight$ });
|
|
6846
6860
|
// performance is terrible if the data changes while we're scrolling, so we postpone updates until
|
|
6847
6861
|
// scrolling stops.
|
|
6862
|
+
// A body inside projected content (a loading container, a card) is initialised before it is in the
|
|
6863
|
+
// document, where no theme variable resolves. Its first reported size is the moment it is, so take
|
|
6864
|
+
// the header height again then; the report arrives outside change detection, so this is safe.
|
|
6865
|
+
when(this.bounds$).changes(() => this.takeHeaderHeightFromTheme());
|
|
6848
6866
|
const delayedData$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
|
|
6849
6867
|
when(delayedData$).changes(delatedData => {
|
|
6850
6868
|
this.animationsDisabled$.value = true;
|
|
@@ -6876,7 +6894,7 @@ class TableBodyComponent extends ResizeAwareComponent {
|
|
|
6876
6894
|
const footerVisibility$ = (this.footerRows ?? [])
|
|
6877
6895
|
.map(row => row.visible$)
|
|
6878
6896
|
.filter((m) => m != null);
|
|
6879
|
-
this.viewStateDependsOn(this.tableModel.filteredRows$, this.tableModel.visibleColumns$, this.virtualScrollActive$, this.animationsDisabled$, this.tableModel.selectedItems$, this.tableModel.selectableRows$, this.footerRowDefs$, ...footerVisibility$);
|
|
6897
|
+
this.viewStateDependsOn(this.headerHeight$, this.tableModel.filteredRows$, this.tableModel.visibleColumns$, this.virtualScrollActive$, this.animationsDisabled$, this.tableModel.selectedItems$, this.tableModel.selectableRows$, this.footerRowDefs$, ...footerVisibility$);
|
|
6880
6898
|
});
|
|
6881
6899
|
}
|
|
6882
6900
|
ngAfterViewInit() {
|