@ogidor/dashboard 1.0.16 → 1.0.18
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/README.md +83 -13
- package/app/custom-grid.component.d.ts +2 -1
- package/app/dashboard-persistence.d.ts +37 -0
- package/app/dashboard-state.service.d.ts +10 -37
- package/esm2020/app/app.module.mjs +10 -3
- package/esm2020/app/custom-grid.component.mjs +30 -5
- package/esm2020/app/dashboard-persistence.mjs +78 -0
- package/esm2020/app/dashboard-state.service.mjs +54 -87
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/ogidor-dashboard.mjs +184 -93
- package/fesm2015/ogidor-dashboard.mjs.map +1 -1
- package/fesm2020/ogidor-dashboard.mjs +165 -93
- package/fesm2020/ogidor-dashboard.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A lightweight, content-agnostic drag-and-drop dashboard library for Angular 15.
|
|
4
4
|
Drop it into any project, supply your own card content, and get a fully featured
|
|
5
|
-
multi-workspace grid with
|
|
5
|
+
multi-workspace grid with pluggable persistence, pop-out windows, and live cross-tab
|
|
6
6
|
sync — out of the box.
|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -30,7 +30,7 @@ sync — out of the box.
|
|
|
30
30
|
- **Multi-Workspace** — unlimited tabbed workspaces, each with its own independent layout.
|
|
31
31
|
- **Independent Pop-out Layouts** — pop a workspace into its own window; dragging there never affects the main window.
|
|
32
32
|
- **Structural Sync** — adding, removing, or renaming a widget in any window instantly appears in all open windows via `BroadcastChannel`.
|
|
33
|
-
- **
|
|
33
|
+
- **Pluggable Persistence** — localStorage by default, or inject your own DB/API adapter.
|
|
34
34
|
- **Content-Agnostic Cards** — you own the card body; stamp any Angular component, chart, or markup inside via `ng-template`.
|
|
35
35
|
- **Fully Themeable** — 36 colour tokens plus font family, controllable via a typed `DashboardTheme` input or CSS custom properties.
|
|
36
36
|
|
|
@@ -252,6 +252,13 @@ export { WidgetRendererComponent } from '@ogidor/dashboard';
|
|
|
252
252
|
export { CustomGridComponent } from '@ogidor/dashboard';
|
|
253
253
|
export { GridCellDirective } from '@ogidor/dashboard';
|
|
254
254
|
export { DashboardStateService } from '@ogidor/dashboard';
|
|
255
|
+
export {
|
|
256
|
+
DashboardPersistence,
|
|
257
|
+
LocalStorageDashboardPersistence,
|
|
258
|
+
DASHBOARD_PERSISTENCE,
|
|
259
|
+
DASHBOARD_PERSISTENCE_CONTEXT,
|
|
260
|
+
PositionMap,
|
|
261
|
+
} from '@ogidor/dashboard';
|
|
255
262
|
export { Widget, Page, DashboardConfig, DashboardTheme } from '@ogidor/dashboard';
|
|
256
263
|
```
|
|
257
264
|
|
|
@@ -505,26 +512,89 @@ this.state.popOutPage(pageId);
|
|
|
505
512
|
|
|
506
513
|
## Persisting Layouts
|
|
507
514
|
|
|
508
|
-
|
|
515
|
+
By default, state is saved to `localStorage` automatically on every change.
|
|
509
516
|
|
|
510
517
|
| Key | Contents |
|
|
511
518
|
|---|---|
|
|
512
|
-
| `ogidor_shared` | Page list and widget metadata
|
|
513
|
-
| `ogidor_positions_main` | Grid positions for the main window. |
|
|
514
|
-
| `ogidor_positions_<pageId>` | Grid positions for each pop-out window. |
|
|
519
|
+
| `ogidor_shared` | Page list and widget metadata for the default dashboard context. |
|
|
520
|
+
| `ogidor_positions_main` | Grid positions for the main window (default context). |
|
|
521
|
+
| `ogidor_positions_<pageId>` | Grid positions for each pop-out window (default context). |
|
|
522
|
+
|
|
523
|
+
For multi-tenant scenarios, provide `DASHBOARD_PERSISTENCE_CONTEXT` with a custom `dashboardId`; keys are namespaced automatically in the default localStorage adapter.
|
|
524
|
+
|
|
525
|
+
### Use a database/API instead of localStorage
|
|
515
526
|
|
|
516
|
-
|
|
527
|
+
Provide your own implementation of `DashboardPersistence` and override the `DASHBOARD_PERSISTENCE` token.
|
|
517
528
|
|
|
518
529
|
```typescript
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
530
|
+
import { Injectable, NgModule } from '@angular/core';
|
|
531
|
+
import { HttpClient } from '@angular/common/http';
|
|
532
|
+
import {
|
|
533
|
+
DashboardConfig,
|
|
534
|
+
DashboardModule,
|
|
535
|
+
DashboardPersistence,
|
|
536
|
+
DASHBOARD_PERSISTENCE,
|
|
537
|
+
DASHBOARD_PERSISTENCE_CONTEXT,
|
|
538
|
+
PositionMap,
|
|
539
|
+
} from '@ogidor/dashboard';
|
|
540
|
+
|
|
541
|
+
@Injectable()
|
|
542
|
+
export class HttpDashboardPersistence extends DashboardPersistence {
|
|
543
|
+
constructor(private http: HttpClient) { super(); }
|
|
544
|
+
|
|
545
|
+
loadShared(dashboardId: string) {
|
|
546
|
+
return this.http
|
|
547
|
+
.get<DashboardConfig | null>(`/api/dashboards/${encodeURIComponent(dashboardId)}/shared`)
|
|
548
|
+
.toPromise();
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
saveShared(dashboardId: string, shared: DashboardConfig) {
|
|
552
|
+
return this.http
|
|
553
|
+
.put<void>(`/api/dashboards/${encodeURIComponent(dashboardId)}/shared`, shared)
|
|
554
|
+
.toPromise()
|
|
555
|
+
.then(() => undefined);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
loadPositions(dashboardId: string, windowId: string) {
|
|
559
|
+
return this.http
|
|
560
|
+
.get<PositionMap | null>(`/api/dashboards/${encodeURIComponent(dashboardId)}/positions/${encodeURIComponent(windowId)}`)
|
|
561
|
+
.toPromise();
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
savePositions(dashboardId: string, windowId: string, positions: PositionMap) {
|
|
565
|
+
return this.http
|
|
566
|
+
.put<void>(`/api/dashboards/${encodeURIComponent(dashboardId)}/positions/${encodeURIComponent(windowId)}`, positions)
|
|
567
|
+
.toPromise()
|
|
568
|
+
.then(() => undefined);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
522
571
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
572
|
+
@NgModule({
|
|
573
|
+
imports: [DashboardModule],
|
|
574
|
+
providers: [
|
|
575
|
+
{ provide: DASHBOARD_PERSISTENCE, useClass: HttpDashboardPersistence },
|
|
576
|
+
{ provide: DASHBOARD_PERSISTENCE_CONTEXT, useValue: { dashboardId: 'customer-123' } },
|
|
577
|
+
],
|
|
578
|
+
})
|
|
579
|
+
export class AppModule {}
|
|
526
580
|
```
|
|
527
581
|
|
|
582
|
+
Recommended backend endpoints:
|
|
583
|
+
|
|
584
|
+
- `GET /api/dashboards/:dashboardId/shared`
|
|
585
|
+
- `PUT /api/dashboards/:dashboardId/shared`
|
|
586
|
+
- `GET /api/dashboards/:dashboardId/positions/:windowId`
|
|
587
|
+
- `PUT /api/dashboards/:dashboardId/positions/:windowId`
|
|
588
|
+
|
|
589
|
+
### Migration tip
|
|
590
|
+
|
|
591
|
+
If users already have data in localStorage, run a one-time migration in your app:
|
|
592
|
+
|
|
593
|
+
1. Read `ogidor_shared` and `ogidor_positions_*` from localStorage.
|
|
594
|
+
2. Upload them to your backend using the new API.
|
|
595
|
+
3. Set a migration flag (for example `ogidor_migrated=true`).
|
|
596
|
+
4. Use your HTTP persistence adapter as the source of truth from then on.
|
|
597
|
+
|
|
528
598
|
---
|
|
529
599
|
|
|
530
600
|
## Full Integration Example
|
|
@@ -64,7 +64,7 @@ export declare class CustomGridComponent implements OnInit, OnDestroy, OnChanges
|
|
|
64
64
|
private boundMouseUp;
|
|
65
65
|
constructor(zone: NgZone, cdr: ChangeDetectorRef);
|
|
66
66
|
ngOnInit(): void;
|
|
67
|
-
ngOnChanges(
|
|
67
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
68
68
|
ngOnDestroy(): void;
|
|
69
69
|
trackByFn(_index: number, item: Widget): string;
|
|
70
70
|
private get cellWidth();
|
|
@@ -87,6 +87,7 @@ export declare class CustomGridComponent implements OnInit, OnDestroy, OnChanges
|
|
|
87
87
|
private handleResizeMove;
|
|
88
88
|
private finalizeResize;
|
|
89
89
|
private compactAndApply;
|
|
90
|
+
private applyCompactionAndSync;
|
|
90
91
|
private updateContainerHeight;
|
|
91
92
|
static ɵfac: i0.ɵɵFactoryDeclaration<CustomGridComponent, never>;
|
|
92
93
|
static ɵcmp: i0.ɵɵComponentDeclaration<CustomGridComponent, "app-grid", never, { "widgets": "widgets"; "columns": "columns"; "gap": "gap"; "rowHeight": "rowHeight"; "minItemCols": "minItemCols"; "minItemRows": "minItemRows"; }, { "itemChanged": "itemChanged"; "layoutChanged": "layoutChanged"; }, ["cellTemplate"], never, false, never>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { DashboardConfig } from './models';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export type PositionMap = Record<string, {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
cols: number;
|
|
8
|
+
rows: number;
|
|
9
|
+
}>;
|
|
10
|
+
export interface DashboardPersistenceContext {
|
|
11
|
+
dashboardId: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const DASHBOARD_PERSISTENCE: InjectionToken<DashboardPersistence>;
|
|
14
|
+
export declare const DASHBOARD_PERSISTENCE_CONTEXT: InjectionToken<DashboardPersistenceContext>;
|
|
15
|
+
export declare abstract class DashboardPersistence {
|
|
16
|
+
abstract loadShared(dashboardId: string): Promise<DashboardConfig | null>;
|
|
17
|
+
abstract saveShared(dashboardId: string, shared: DashboardConfig): Promise<void>;
|
|
18
|
+
abstract loadPositions(dashboardId: string, windowId: string): Promise<PositionMap | null>;
|
|
19
|
+
abstract savePositions(dashboardId: string, windowId: string, positions: PositionMap): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare class LocalStorageDashboardPersistence implements DashboardPersistence {
|
|
22
|
+
loadShared(dashboardId: string): Promise<DashboardConfig | null>;
|
|
23
|
+
saveShared(dashboardId: string, shared: DashboardConfig): Promise<void>;
|
|
24
|
+
loadPositions(dashboardId: string, windowId: string): Promise<PositionMap | null>;
|
|
25
|
+
savePositions(dashboardId: string, windowId: string, positions: PositionMap): Promise<void>;
|
|
26
|
+
private _sharedKey;
|
|
27
|
+
private _positionsKey;
|
|
28
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LocalStorageDashboardPersistence, never>;
|
|
29
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<LocalStorageDashboardPersistence>;
|
|
30
|
+
}
|
|
31
|
+
export declare function resolveDefaultDashboardId(): string;
|
|
32
|
+
export declare class DashboardPersistenceFacade {
|
|
33
|
+
readonly dashboardId: string;
|
|
34
|
+
constructor(context: DashboardPersistenceContext | null);
|
|
35
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DashboardPersistenceFacade, [{ optional: true; }]>;
|
|
36
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DashboardPersistenceFacade>;
|
|
37
|
+
}
|
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
import { NgZone, OnDestroy } from '@angular/core';
|
|
2
2
|
import { Page, Widget } from './models';
|
|
3
|
+
import { DashboardPersistence, DashboardPersistenceFacade, LocalStorageDashboardPersistence } from './dashboard-persistence';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
export declare class DashboardStateService implements OnDestroy {
|
|
5
6
|
private zone;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
private readonly
|
|
11
|
-
/**
|
|
12
|
-
* Per-window positions key — stores {pageId:widgetId → {x,y,cols,rows}}.
|
|
13
|
-
* Pop-out windows get a key scoped to their pageId so they never overwrite
|
|
14
|
-
* the main window or each other.
|
|
15
|
-
* main window → ogidor_positions_main
|
|
16
|
-
* pop-out #abc → ogidor_positions_abc
|
|
17
|
-
*/
|
|
18
|
-
private readonly positionsKey;
|
|
7
|
+
private persistenceFacade;
|
|
8
|
+
private localPersistence;
|
|
9
|
+
private persistence;
|
|
10
|
+
private readonly windowId;
|
|
11
|
+
private readonly dashboardId;
|
|
19
12
|
private readonly CHANNEL_NAME;
|
|
20
13
|
private channel;
|
|
21
14
|
private readonly initialPages;
|
|
@@ -23,7 +16,7 @@ export declare class DashboardStateService implements OnDestroy {
|
|
|
23
16
|
private activePageIdSubject;
|
|
24
17
|
pages$: import("rxjs").Observable<Page[]>;
|
|
25
18
|
activePageId$: import("rxjs").Observable<string>;
|
|
26
|
-
constructor(zone: NgZone);
|
|
19
|
+
constructor(zone: NgZone, persistenceFacade: DashboardPersistenceFacade, localPersistence: LocalStorageDashboardPersistence, persistence: DashboardPersistence | null);
|
|
27
20
|
ngOnDestroy(): void;
|
|
28
21
|
getActivePage(): Page | undefined;
|
|
29
22
|
setActivePage(id: string): void;
|
|
@@ -34,37 +27,17 @@ export declare class DashboardStateService implements OnDestroy {
|
|
|
34
27
|
}): Widget;
|
|
35
28
|
updateWidget(widgetId: string, patch: Partial<Omit<Widget, 'id' | 'x' | 'y' | 'cols' | 'rows'>>): void;
|
|
36
29
|
removeWidget(widgetId: string): void;
|
|
37
|
-
/**
|
|
38
|
-
* Update a widget's grid position/size.
|
|
39
|
-
* Saved only for this window — never broadcast to others.
|
|
40
|
-
*/
|
|
41
30
|
updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number): void;
|
|
42
31
|
serializeLayout(): string;
|
|
43
32
|
loadLayout(config: any): void;
|
|
44
33
|
popOutPage(pageId: string): void;
|
|
45
|
-
/**
|
|
46
|
-
* Save page list + widget metadata (titles, cardColor, data) — no positions.
|
|
47
|
-
*/
|
|
48
34
|
private _saveShared;
|
|
49
|
-
/**
|
|
50
|
-
* Save this window's grid positions (x, y, cols, rows) per widget.
|
|
51
|
-
*/
|
|
52
35
|
private _savePositions;
|
|
53
|
-
|
|
54
|
-
* Overlay the positions saved for THIS window on top of the current pages.
|
|
55
|
-
*/
|
|
56
|
-
private _restorePositions;
|
|
57
|
-
/**
|
|
58
|
-
* Apply a shared config object (page list + metadata) without touching
|
|
59
|
-
* this window's saved positions.
|
|
60
|
-
*/
|
|
36
|
+
private _applyPositions;
|
|
61
37
|
private _applyShared;
|
|
62
|
-
/**
|
|
63
|
-
* Handle a structural sync event arriving from another window.
|
|
64
|
-
* Position changes are never sent so we never receive them here.
|
|
65
|
-
*/
|
|
66
38
|
private _onSyncEvent;
|
|
67
39
|
private _broadcast;
|
|
68
|
-
|
|
40
|
+
private _bootstrapFromPersistence;
|
|
41
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DashboardStateService, [null, null, null, { optional: true; }]>;
|
|
69
42
|
static ɵprov: i0.ɵɵInjectableDeclaration<DashboardStateService>;
|
|
70
43
|
}
|
|
@@ -5,6 +5,7 @@ import { DashboardComponent, OverflowActivePipe } from './dashboard.component';
|
|
|
5
5
|
import { WidgetRendererComponent } from './widget-renderer.component';
|
|
6
6
|
import { CustomGridComponent, GridCellDirective } from './custom-grid.component';
|
|
7
7
|
import { DashboardStateService } from './dashboard-state.service';
|
|
8
|
+
import { DASHBOARD_PERSISTENCE, LocalStorageDashboardPersistence, } from './dashboard-persistence';
|
|
8
9
|
import * as i0 from "@angular/core";
|
|
9
10
|
export class DashboardModule {
|
|
10
11
|
}
|
|
@@ -18,7 +19,10 @@ DashboardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
|
|
|
18
19
|
WidgetRendererComponent,
|
|
19
20
|
CustomGridComponent,
|
|
20
21
|
GridCellDirective] });
|
|
21
|
-
DashboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, providers: [
|
|
22
|
+
DashboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, providers: [
|
|
23
|
+
DashboardStateService,
|
|
24
|
+
{ provide: DASHBOARD_PERSISTENCE, useExisting: LocalStorageDashboardPersistence },
|
|
25
|
+
], imports: [CommonModule] });
|
|
22
26
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, decorators: [{
|
|
23
27
|
type: NgModule,
|
|
24
28
|
args: [{
|
|
@@ -32,7 +36,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
32
36
|
imports: [
|
|
33
37
|
CommonModule,
|
|
34
38
|
],
|
|
35
|
-
providers: [
|
|
39
|
+
providers: [
|
|
40
|
+
DashboardStateService,
|
|
41
|
+
{ provide: DASHBOARD_PERSISTENCE, useExisting: LocalStorageDashboardPersistence },
|
|
42
|
+
],
|
|
36
43
|
exports: [
|
|
37
44
|
DashboardComponent,
|
|
38
45
|
OverflowActivePipe,
|
|
@@ -58,4 +65,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
58
65
|
bootstrap: [DashboardComponent],
|
|
59
66
|
}]
|
|
60
67
|
}] });
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvYXBwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixnQ0FBZ0MsR0FDakMsTUFBTSx5QkFBeUIsQ0FBQzs7QUF5QmpDLE1BQU0sT0FBTyxlQUFlOzs2R0FBZixlQUFlOzhHQUFmLGVBQWUsaUJBckJ4QixrQkFBa0I7UUFDbEIsa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsaUJBQWlCLGFBR2pCLFlBQVksYUFPWixrQkFBa0I7UUFDbEIsa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsaUJBQWlCOzhHQUdSLGVBQWUsYUFaZjtRQUNULHFCQUFxQjtRQUNyQixFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsZ0NBQWdDLEVBQUU7S0FDbEYsWUFMQyxZQUFZOzRGQWNILGVBQWU7a0JBdkIzQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7cUJBQ2I7b0JBQ0QsU0FBUyxFQUFFO3dCQUNULHFCQUFxQjt3QkFDckIsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLGdDQUFnQyxFQUFFO3FCQUNsRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixpQkFBaUI7cUJBQ2xCO2lCQUNGOztBQUdEOzs7R0FHRztBQUtILE1BQU0sT0FBTyxTQUFTOzt1R0FBVCxTQUFTO3dHQUFULFNBQVMsY0FGUixrQkFBa0IsYUFEcEIsYUFBYSxFQVBaLGVBQWU7d0dBVWYsU0FBUyxZQUhWLGFBQWEsRUFBRSxlQUFlOzRGQUc3QixTQUFTO2tCQUpyQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUM7b0JBQ3pDLFNBQVMsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2lCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQsIE92ZXJmbG93QWN0aXZlUGlwZSB9IGZyb20gJy4vZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaWRnZXRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vd2lkZ2V0LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXN0b21HcmlkQ29tcG9uZW50LCBHcmlkQ2VsbERpcmVjdGl2ZSB9IGZyb20gJy4vY3VzdG9tLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IERhc2hib2FyZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZGFzaGJvYXJkLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgREFTSEJPQVJEX1BFUlNJU1RFTkNFLFxuICBMb2NhbFN0b3JhZ2VEYXNoYm9hcmRQZXJzaXN0ZW5jZSxcbn0gZnJvbSAnLi9kYXNoYm9hcmQtcGVyc2lzdGVuY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgT3ZlcmZsb3dBY3RpdmVQaXBlLFxuICAgIFdpZGdldFJlbmRlcmVyQ29tcG9uZW50LFxuICAgIEN1c3RvbUdyaWRDb21wb25lbnQsXG4gICAgR3JpZENlbGxEaXJlY3RpdmUsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIERhc2hib2FyZFN0YXRlU2VydmljZSxcbiAgICB7IHByb3ZpZGU6IERBU0hCT0FSRF9QRVJTSVNURU5DRSwgdXNlRXhpc3Rpbmc6IExvY2FsU3RvcmFnZURhc2hib2FyZFBlcnNpc3RlbmNlIH0sXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgT3ZlcmZsb3dBY3RpdmVQaXBlLFxuICAgIFdpZGdldFJlbmRlcmVyQ29tcG9uZW50LFxuICAgIEN1c3RvbUdyaWRDb21wb25lbnQsXG4gICAgR3JpZENlbGxEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZE1vZHVsZSB7fVxuXG4vKipcbiAqIFJvb3QgbW9kdWxlIGZvciBsb2NhbCBkZW1vIC8gdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuICogTGlicmFyeSBjb25zdW1lcnMgaW1wb3J0IERhc2hib2FyZE1vZHVsZSwgbm90IEFwcE1vZHVsZS5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGUsIERhc2hib2FyZE1vZHVsZV0sXG4gIGJvb3RzdHJhcDogW0Rhc2hib2FyZENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuIl19
|
|
@@ -140,15 +140,23 @@ export class CustomGridComponent {
|
|
|
140
140
|
this.boundMouseUp = this.onMouseUp.bind(this);
|
|
141
141
|
}
|
|
142
142
|
ngOnInit() {
|
|
143
|
-
this.
|
|
143
|
+
this.applyCompactionAndSync();
|
|
144
144
|
this.updateContainerHeight();
|
|
145
145
|
this.zone.runOutsideAngular(() => {
|
|
146
146
|
window.addEventListener('mousemove', this.boundMouseMove);
|
|
147
147
|
window.addEventListener('mouseup', this.boundMouseUp);
|
|
148
148
|
});
|
|
149
149
|
}
|
|
150
|
-
ngOnChanges(
|
|
150
|
+
ngOnChanges(changes) {
|
|
151
|
+
if (this.dragging || this.resizing) {
|
|
152
|
+
this.updateContainerHeight();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (changes['widgets'] || changes['columns']) {
|
|
156
|
+
this.applyCompactionAndSync();
|
|
157
|
+
}
|
|
151
158
|
this.updateContainerHeight();
|
|
159
|
+
this.cdr.markForCheck();
|
|
152
160
|
}
|
|
153
161
|
ngOnDestroy() {
|
|
154
162
|
window.removeEventListener('mousemove', this.boundMouseMove);
|
|
@@ -367,15 +375,32 @@ export class CustomGridComponent {
|
|
|
367
375
|
// ── Utilities ──
|
|
368
376
|
compactAndApply() {
|
|
369
377
|
if (!this.widgets?.length)
|
|
370
|
-
return;
|
|
378
|
+
return [];
|
|
371
379
|
const compacted = GridEngine.compact(this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })), this.columns);
|
|
380
|
+
const changedWidgets = [];
|
|
372
381
|
for (const rw of compacted) {
|
|
373
382
|
const w = this.widgets.find(ww => ww.id === rw.id);
|
|
374
|
-
if (w)
|
|
383
|
+
if (!w)
|
|
384
|
+
continue;
|
|
385
|
+
const changed = w.x !== rw.x || w.y !== rw.y || w.cols !== rw.cols || w.rows !== rw.rows;
|
|
386
|
+
if (changed) {
|
|
375
387
|
w.x = rw.x;
|
|
376
388
|
w.y = rw.y;
|
|
389
|
+
w.cols = rw.cols;
|
|
390
|
+
w.rows = rw.rows;
|
|
391
|
+
changedWidgets.push(w);
|
|
377
392
|
}
|
|
378
393
|
}
|
|
394
|
+
return changedWidgets;
|
|
395
|
+
}
|
|
396
|
+
applyCompactionAndSync() {
|
|
397
|
+
const changedWidgets = this.compactAndApply();
|
|
398
|
+
if (!changedWidgets.length)
|
|
399
|
+
return;
|
|
400
|
+
for (const widget of changedWidgets) {
|
|
401
|
+
this.itemChanged.emit(widget);
|
|
402
|
+
}
|
|
403
|
+
this.layoutChanged.emit(this.widgets);
|
|
379
404
|
}
|
|
380
405
|
updateContainerHeight() {
|
|
381
406
|
if (!this.widgets?.length) {
|
|
@@ -506,4 +531,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
506
531
|
type: ContentChild,
|
|
507
532
|
args: [GridCellDirective, { read: TemplateRef }]
|
|
508
533
|
}] } });
|
|
509
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jdXN0b20tZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDdEMsU0FBUyxFQUNULFlBQVksRUFBRSxXQUFXLEVBQ3pCLFNBQVMsRUFBRSx1QkFBdUIsRUFDbkMsTUFBTSxlQUFlLENBQUM7OztBQUd2Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFBbUIsV0FBNEM7UUFBNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWlDO0lBQUcsQ0FBQzs7K0dBRHhELGlCQUFpQjttR0FBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztBQW1CckMsTUFBTSxVQUFVO0lBRWQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3RDLE9BQU8sQ0FBQyxDQUNOLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQW1CLEVBQUUsSUFBYztRQUN6RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQW1CO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FDZixVQUFzQixFQUN0QixNQUFnQixFQUNoQixJQUFZLEVBQ1osSUFBWSxFQUNaLE9BQWU7UUFFZixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sT0FBTyxDQUFDO1FBRTVCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFN0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxVQUFVLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FDakIsVUFBc0IsRUFDdEIsTUFBZ0IsRUFDaEIsT0FBZSxFQUNmLE9BQWUsRUFDZixPQUFlO1FBRWYsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUU5QixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFtQixFQUFFLFdBQXFCO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckUsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDakMsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDOUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBbUIsRUFBRSxRQUFnQjtRQUNsRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFlLEVBQUUsQ0FBQztRQUU5QixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sRUFBRTtZQUMzQixNQUFNLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQWtCLEVBQUUsTUFBZ0I7UUFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsT0FBTyxJQUFJLEVBQUU7WUFDWCxNQUFNLElBQUksR0FBYSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pCLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQW1CO1FBQ3RDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztDQUNGO0FBRUQ7OzZFQUU2RTtBQStHN0UsTUFBTSxPQUFPLG1CQUFtQjtJQXlDOUIsWUFBb0IsSUFBWSxFQUFVLEdBQXNCO1FBQTVDLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXhDdkQsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLFFBQUcsR0FBVyxFQUFFLENBQUM7UUFDakIsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUV2QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDekMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBT3ZELGdCQUFXLEdBQXdFLElBQUksQ0FBQztRQUN4RixvQkFBZSxHQUFHLEdBQUcsQ0FBQztRQUV0QixhQUFRLEdBTUcsSUFBSSxDQUFDO1FBRWhCLGFBQVEsR0FRRyxJQUFJLENBQUM7UUFFUixtQkFBYyxHQUFlLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFa0IsQ0FBQztJQUVwRSxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUF1QjtRQUNqQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLElBQVksSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNELGlCQUFpQjtJQUVqQixJQUFZLFNBQVM7UUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsV0FBVyxJQUFJLEdBQUcsQ0FBQztRQUN6RSxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNyRSxDQUFDO0lBRU8sVUFBVSxDQUFDLEdBQVc7UUFDNUIsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sVUFBVSxDQUFDLEdBQVc7UUFDNUIsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sVUFBVSxDQUFDLEVBQVU7UUFDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLFVBQVUsQ0FBQyxFQUFVO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQ25DLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN2RCxDQUFDO0lBRU8saUJBQWlCLENBQUMsSUFBWTtRQUNwQyxPQUFPLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDdkQsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFTO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsWUFBWSxDQUFDLENBQVM7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsYUFBYSxDQUFDLENBQVM7UUFDckIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsYUFBYTtJQUViLFdBQVcsQ0FBQyxLQUFpQixFQUFFLE1BQWM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLG9EQUFvRCxDQUFDO1lBQUUsT0FBTztRQUNqRixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNiLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUTtZQUM3QyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU87WUFDM0MsYUFBYSxFQUFFLFFBQVE7WUFDdkIsYUFBYSxFQUFFLE9BQU87U0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPO1lBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN6QyxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDNUMsQ0FBQztRQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFpQixFQUFFLE1BQWM7UUFDN0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsT0FBTztZQUMxQixTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDdEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ3RCLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNqRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDbkQsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMvRCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDekMsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQzVDLENBQUM7UUFDRixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBaUI7UUFDbkMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDekMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sU0FBUyxDQUFDLE1BQWtCO1FBQ2xDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQzthQUN2RCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFpQjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFTLENBQUMsRUFBRSxDQUFFLENBQUM7UUFDbkUsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXBCLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUMzRCxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDMUQsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFFakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQ3BDLElBQUksQ0FBQyxjQUFjLEVBQ25CLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFDakYsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUNuQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDakUsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztTQUM1QyxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2pCLEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFO2dCQUN6QixJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUU7b0JBQUUsU0FBUztnQkFDbEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLEVBQUU7b0JBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFBRTthQUNuQztZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUyxDQUFDLEVBQUUsQ0FBRSxDQUFDO1FBQ25FLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEgsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFFNUUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQ2pGLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFDakYsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUNuQyxDQUFDO1FBQ0YsS0FBSyxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUU7WUFDekIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsRUFBRTtnQkFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztnQkFBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFBRTtTQUNqRztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFpQjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUyxDQUFDLEVBQUUsQ0FBRSxDQUFDO1FBQ25FLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUVwQixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3JELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFFckQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxSSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQ3RDLElBQUksQ0FBQyxjQUFjLEVBQ25CLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFDakYsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUMvQixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMvRCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztZQUNyQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztTQUN4QyxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2pCLEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFO2dCQUN6QixJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUU7b0JBQUUsU0FBUztnQkFDbEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLEVBQUU7b0JBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFBRTthQUNuQztZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUyxDQUFDLEVBQUUsQ0FBRSxDQUFDO1FBRW5FLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hILElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hILE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFDakYsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxFQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQy9CLENBQUM7UUFDRixLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVEsRUFBRTtZQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxFQUFFO2dCQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztnQkFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUFFO1NBQ2pHO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtJQUVWLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFDbEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQ2pGLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztRQUNGLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUU7Z0JBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUFFO1NBQ25DO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7WUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQztZQUFDLE9BQU87U0FBRTtRQUNsRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsYUFBYSxDQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDbEYsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDN0UsQ0FBQzs7aUhBM1RVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLG1UQWNoQixpQkFBaUIsMkJBQVUsV0FBVyxnTEF6SDFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENUOzRGQTZEVSxtQkFBbUI7a0JBN0cvQixTQUFTOytCQUNFLFVBQVUsWUFDVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDVCxtQkEyRGdCLHVCQUF1QixDQUFDLE1BQU07NkhBR3RDLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdZLFlBQVk7c0JBQW5FLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCwgT25EZXN0cm95LCBPbkluaXQsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsXG4gIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4vbW9kZWxzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgc3RhbXBlZCBpbnNpZGUgZWFjaCBncmlkIGNlbGwuXG4gKiBVc2FnZTpcbiAqICAgPGFwcC1ncmlkIFt3aWRnZXRzXT1cIi4uLlwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBncmlkQ2VsbCBsZXQtd2lkZ2V0PVwid2lkZ2V0XCI+XG4gKiAgICAgICA8YXBwLXdpZGdldC1yZW5kZXJlciBbd2lkZ2V0XT1cIndpZGdldFwiIC4uLj48L2FwcC13aWRnZXQtcmVuZGVyZXI+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9hcHAtZ3JpZD5cbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2dyaWRDZWxsXScgfSlcbmV4cG9ydCBjbGFzcyBHcmlkQ2VsbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8eyB3aWRnZXQ6IFdpZGdldCB9Pikge31cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBHUklEIEVOR0lORSDigJQgcHVyZSBkYXRhLCB6ZXJvIERPTVxuICAgSGFuZGxlcyBjb2xsaXNpb24gZGV0ZWN0aW9uLCByZXNvbHV0aW9uLCBhbmQgY29tcGFjdGlvbi5cbiAgIEluc3BpcmVkIGJ5IHJlYWN0LWdyaWQtbGF5b3V0IC8gZ3JpZHN0ZXIgYWxnb3JpdGhtcy5cbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5pbnRlcmZhY2UgR3JpZFJlY3Qge1xuICBpZDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG59XG5cbmNsYXNzIEdyaWRFbmdpbmUge1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdHMgb3ZlcmxhcC5cbiAgICovXG4gIHN0YXRpYyBjb2xsaWRlcyhhOiBHcmlkUmVjdCwgYjogR3JpZFJlY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIGEueCArIGEuY29scyA8PSBiLnggfHxcbiAgICAgIGIueCArIGIuY29scyA8PSBhLnggfHxcbiAgICAgIGEueSArIGEucm93cyA8PSBiLnkgfHxcbiAgICAgIGIueSArIGIucm93cyA8PSBhLnlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBTEwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgcmVjdGAuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxsQ29sbGlzaW9ucyh3aWRnZXRzOiBHcmlkUmVjdFtdLCByZWN0OiBHcmlkUmVjdCk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiB3aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHJlY3QuaWQgJiYgR3JpZEVuZ2luZS5jb2xsaWRlcyh3LCByZWN0KSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCB3aWRnZXRzIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQuXG4gICAqL1xuICBzdGF0aWMgc29ydEJ5UG9zaXRpb24od2lkZ2V0czogR3JpZFJlY3RbXSk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiBbLi4ud2lkZ2V0c10uc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIHdpZGdldCB0byAoeCwgeSkgYW5kIHB1c2ggYW55IGNvbGxpZGluZyB3aWRnZXRzIGRvd253YXJkLlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIGxpc3Qgd2l0aCByZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbW92ZVdpZGdldChcbiAgICBhbGxXaWRnZXRzOiBHcmlkUmVjdFtdLFxuICAgIHdpZGdldDogR3JpZFJlY3QsXG4gICAgbmV3WDogbnVtYmVyLFxuICAgIG5ld1k6IG51bWJlcixcbiAgICBjb2x1bW5zOiBudW1iZXJcbiAgKTogR3JpZFJlY3RbXSB7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IGFsbFdpZGdldHMubWFwKHcgPT4gKHsgLi4udyB9KSk7XG4gICAgY29uc3QgbW92aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIW1vdmluZykgcmV0dXJuIHdpZGdldHM7XG5cbiAgICBtb3ZpbmcueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld1gsIGNvbHVtbnMgLSBtb3ZpbmcuY29scykpO1xuICAgIG1vdmluZy55ID0gTWF0aC5tYXgoMCwgbmV3WSk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBHcmlkRW5naW5lLnNvcnRCeVBvc2l0aW9uKHdpZGdldHMpO1xuICAgIEdyaWRFbmdpbmUucmVzb2x2ZUNvbGxpc2lvbnMoc29ydGVkLCBtb3ZpbmcpO1xuICAgIHJldHVybiBHcmlkRW5naW5lLmNvbXBhY3Qoc29ydGVkLCBjb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgYSB3aWRnZXQgYW5kIHB1c2ggY29sbGlkaW5nIHdpZGdldHMgZG93bi5cbiAgICovXG4gIHN0YXRpYyByZXNpemVXaWRnZXQoXG4gICAgYWxsV2lkZ2V0czogR3JpZFJlY3RbXSxcbiAgICB3aWRnZXQ6IEdyaWRSZWN0LFxuICAgIG5ld0NvbHM6IG51bWJlcixcbiAgICBuZXdSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uczogbnVtYmVyXG4gICk6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHdpZGdldHMgPSBhbGxXaWRnZXRzLm1hcCh3ID0+ICh7IC4uLncgfSkpO1xuICAgIGNvbnN0IHJlc2l6aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIXJlc2l6aW5nKSByZXR1cm4gd2lkZ2V0cztcblxuICAgIHJlc2l6aW5nLmNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihuZXdDb2xzLCBjb2x1bW5zIC0gcmVzaXppbmcueCkpO1xuICAgIHJlc2l6aW5nLnJvd3MgPSBNYXRoLm1heCgxLCBuZXdSb3dzKTtcblxuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyhzb3J0ZWQsIHJlc2l6aW5nKTtcbiAgICByZXR1cm4gR3JpZEVuZ2luZS5jb21wYWN0KHNvcnRlZCwgY29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhbGwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgbW92ZWRXaWRnZXRgIGRvd253YXJkLCByZWN1cnNpdmVseS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVDb2xsaXNpb25zKHdpZGdldHM6IEdyaWRSZWN0W10sIG1vdmVkV2lkZ2V0OiBHcmlkUmVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBHcmlkRW5naW5lLmdldEFsbENvbGxpc2lvbnMod2lkZ2V0cywgbW92ZWRXaWRnZXQpO1xuICAgIGZvciAoY29uc3QgY29sbGlkZXIgb2YgY29sbGlzaW9ucykge1xuICAgICAgY29sbGlkZXIueSA9IG1vdmVkV2lkZ2V0LnkgKyBtb3ZlZFdpZGdldC5yb3dzO1xuICAgICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyh3aWRnZXRzLCBjb2xsaWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhY3QgdGhlIGdyaWQ6IG1vdmUgZXZlcnkgd2lkZ2V0IGFzIGZhciB1cCBhcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhY3Qod2lkZ2V0czogR3JpZFJlY3RbXSwgX2NvbHVtbnM6IG51bWJlcik6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgY29uc3QgcGxhY2VkOiBHcmlkUmVjdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBzb3J0ZWQpIHtcbiAgICAgIHdpZGdldC55ID0gR3JpZEVuZ2luZS5maW5kQ29tcGFjdFkocGxhY2VkLCB3aWRnZXQpO1xuICAgICAgcGxhY2VkLnB1c2god2lkZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhY2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGhpZ2hlc3QgWSBwb3NpdGlvbiBhIHdpZGdldCBjYW4gb2NjdXB5IHdpdGhvdXQgb3ZlcmxhcHBpbmcgYW55IGFscmVhZHktcGxhY2VkIHdpZGdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb21wYWN0WShwbGFjZWQ6IEdyaWRSZWN0W10sIHdpZGdldDogR3JpZFJlY3QpOiBudW1iZXIge1xuICAgIGxldCB5ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGVzdDogR3JpZFJlY3QgPSB7IC4uLndpZGdldCwgeSB9O1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gcGxhY2VkLmZpbmQocCA9PiBHcmlkRW5naW5lLmNvbGxpZGVzKHAsIHRlc3QpKTtcbiAgICAgIGlmICghY29sbGlzaW9uKSByZXR1cm4geTtcbiAgICAgIHkgPSBjb2xsaXNpb24ueSArIGNvbGxpc2lvbi5yb3dzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyB0aGUgZ3JpZCBuZWVkcy5cbiAgICovXG4gIHN0YXRpYyBnZXRHcmlkSGVpZ2h0KHdpZGdldHM6IEdyaWRSZWN0W10pOiBudW1iZXIge1xuICAgIGlmICh3aWRnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLndpZGdldHMubWFwKHcgPT4gdy55ICsgdy5yb3dzKSk7XG4gIH1cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBDVVNUT00gR1JJRCBDT01QT05FTlRcbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI2dyaWRDb250YWluZXJcbiAgICAgIGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb250YWluZXJIZWlnaHRcIlxuICAgID5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgcHJldmlldyAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJncmlkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgKm5nSWY9XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBsYWNlaG9sZGVyLmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInBsYWNlaG9sZGVyLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbGFjZWhvbGRlci53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicGxhY2Vob2xkZXIuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPCEtLSBXaWRnZXQgaXRlbXMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgY2xhc3M9XCJncmlkLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuaXMtZHJhZ2dpbmddPVwiZHJhZ2dpbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbY2xhc3MuaXMtcmVzaXppbmddPVwicmVzaXppbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRJdGVtTGVmdCh3aWRnZXQpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJnZXRJdGVtVG9wKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0SXRlbVdpZHRoKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdldEl0ZW1IZWlnaHQod2lkZ2V0KVwiXG4gICAgICAgIFtzdHlsZS56LWluZGV4XT1cIihkcmFnZ2luZz8uaWQgPT09IHdpZGdldC5pZCB8fCByZXNpemluZz8uaWQgPT09IHdpZGdldC5pZCkgPyAxMDAgOiAxXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQsIHdpZGdldClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgc3RhbXBlZCBmcm9tIHBhcmVudCB0ZW1wbGF0ZSwgY29udGV4dCBjYXJyaWVzIHRoZSB3aWRnZXQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB3aWRnZXQ6IHdpZGdldCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVzaXplIGhhbmRsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCB3aWRnZXQpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDF2MTBIMVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgNXY2SDVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDl2Mkg5XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfVxuXG4gICAgLmdyaWQtY29udGFpbmVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ncmlkLXBsYWNlaG9sZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtcGxhY2Vob2xkZXItY29sb3IsIHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKSk7XG4gICAgICBvcGFjaXR5OiAwLjEyO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1kYXNoLXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZikpO1xuICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cyBlYXNlLCB0b3AgMC4xNXMgZWFzZSwgd2lkdGggMC4xNXMgZWFzZSwgaGVpZ2h0IDAuMTVzIGVhc2U7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDA7XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4yNXMgZWFzZSwgdG9wIDAuMjVzIGVhc2UsIHdpZHRoIDAuMjVzIGVhc2UsIGhlaWdodCAwLjI1cyBlYXNlO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbS5pcy1kcmFnZ2luZyxcbiAgICAuZ3JpZC1pdGVtLmlzLXJlc2l6aW5nIHtcbiAgICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG9wYWNpdHk6IDAuODg7XG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKiBSZXNpemUgSGFuZGxlICovXG4gICAgLnJlc2l6ZS1oYW5kbGUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcmlnaHQ6IDRweDtcbiAgICAgIGJvdHRvbTogNHB4O1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICBjdXJzb3I6IG53c2UtcmVzaXplO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLXJlc2l6ZS1oYW5kbGUtY29sb3IsIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycywgYmFja2dyb3VuZCAwLjJzO1xuICAgICAgei1pbmRleDogMjA7XG4gICAgfVxuICAgIC5yZXNpemUtaGFuZGxlOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZik7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgd2lkZ2V0czogV2lkZ2V0W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogbnVtYmVyID0gMTI7XG4gIEBJbnB1dCgpIGdhcDogbnVtYmVyID0gMTY7XG4gIEBJbnB1dCgpIHJvd0hlaWdodDogbnVtYmVyID0gODA7XG4gIEBJbnB1dCgpIG1pbkl0ZW1Db2xzOiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSBtaW5JdGVtUm93czogbnVtYmVyID0gMTtcblxuICBAT3V0cHV0KCkgaXRlbUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldD4oKTtcbiAgQE91dHB1dCgpIGxheW91dENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldFtdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBncmlkQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgLyoqIFRoZSBuZy10ZW1wbGF0ZSBkZWNvcmF0ZWQgd2l0aCBncmlkQ2VsbCBmcm9tIHRoZSBwYXJlbnQgKi9cbiAgQENvbnRlbnRDaGlsZChHcmlkQ2VsbERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBjZWxsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx7IHdpZGdldDogV2lkZ2V0IH0+O1xuXG4gIHBsYWNlaG9sZGVyOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgY29udGFpbmVySGVpZ2h0ID0gNDAwO1xuXG4gIGRyYWdnaW5nOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBvZmZzZXRYOiBudW1iZXI7XG4gICAgb2Zmc2V0WTogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFg6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxZOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICByZXNpemluZzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc3RhcnRNb3VzZVg6IG51bWJlcjtcbiAgICBzdGFydE1vdXNlWTogbnVtYmVyO1xuICAgIHN0YXJ0Q29sczogbnVtYmVyO1xuICAgIHN0YXJ0Um93czogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFc6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxIOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHByZXZpZXdXaWRnZXRzOiBHcmlkUmVjdFtdID0gW107XG4gIHByaXZhdGUgYm91bmRNb3VzZU1vdmUgPSB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgYm91bmRNb3VzZVVwID0gdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcGFjdEFuZEFwcGx5KCk7XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRNb3VzZU1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmJvdW5kTW91c2VVcCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhfY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5ib3VuZE1vdXNlTW92ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmJvdW5kTW91c2VVcCk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIGl0ZW06IFdpZGdldCkgeyByZXR1cm4gaXRlbS5pZDsgfVxuXG4gIC8vIOKUgOKUgCBHZW9tZXRyeSDilIDilIBcblxuICBwcml2YXRlIGdldCBjZWxsV2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250YWluZXJXID0gdGhpcy5ncmlkQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCA/PyA4MDA7XG4gICAgcmV0dXJuIChjb250YWluZXJXIC0gKHRoaXMuY29sdW1ucyAtIDEpICogdGhpcy5nYXApIC8gdGhpcy5jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xUb1BpeGVsKGNvbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29sICogKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dUb1BpeGVsKHJvdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93ICogKHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSBwaXhlbFRvQ29sKHB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHB4IC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKTtcbiAgfVxuXG4gIHByaXZhdGUgcGl4ZWxUb1JvdyhweDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChweCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbHNUb1BpeGVsV2lkdGgoY29sczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29scyAqIHRoaXMuY2VsbFdpZHRoICsgKGNvbHMgLSAxKSAqIHRoaXMuZ2FwO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dzVG9QaXhlbEhlaWdodChyb3dzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByb3dzICogdGhpcy5yb3dIZWlnaHQgKyAocm93cyAtIDEpICogdGhpcy5nYXA7XG4gIH1cblxuICBnZXRJdGVtTGVmdCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA6IHRoaXMuY29sVG9QaXhlbCh3LngpO1xuICB9XG5cbiAgZ2V0SXRlbVRvcCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA6IHRoaXMucm93VG9QaXhlbCh3LnkpO1xuICB9XG5cbiAgZ2V0SXRlbVdpZHRoKHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHcuY29scyk7XG4gIH1cblxuICBnZXRJdGVtSGVpZ2h0KHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIIDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3LnJvd3MpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERyYWcg4pSA4pSAXG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHdpZGdldDogV2lkZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYSwgLnJlc2l6ZS1oYW5kbGUnKSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5ncmlkQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXRlbUxlZnQgPSB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpO1xuICAgIGNvbnN0IGl0ZW1Ub3AgPSB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IHtcbiAgICAgIGlkOiB3aWRnZXQuaWQsXG4gICAgICBvZmZzZXRYOiBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gaXRlbUxlZnQsXG4gICAgICBvZmZzZXRZOiBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBpdGVtVG9wLFxuICAgICAgY3VycmVudFBpeGVsWDogaXRlbUxlZnQsXG4gICAgICBjdXJyZW50UGl4ZWxZOiBpdGVtVG9wLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogaXRlbUxlZnQsIHRvcDogaXRlbVRvcCxcbiAgICAgIHdpZHRoOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHdpZGdldC5yb3dzKSxcbiAgICB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25SZXNpemVTdGFydChldmVudDogTW91c2VFdmVudCwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzaXppbmcgPSB7XG4gICAgICBpZDogd2lkZ2V0LmlkLFxuICAgICAgc3RhcnRNb3VzZVg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBzdGFydE1vdXNlWTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHN0YXJ0Q29sczogd2lkZ2V0LmNvbHMsXG4gICAgICBzdGFydFJvd3M6IHdpZGdldC5yb3dzLFxuICAgICAgY3VycmVudFBpeGVsVzogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSxcbiAgICAgIGN1cnJlbnRQaXhlbEg6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogdGhpcy5jb2xUb1BpeGVsKHdpZGdldC54KSwgdG9wOiB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHRoaXMuaGFuZGxlRHJhZ01vdmUoZXZlbnQpO1xuICAgIGVsc2UgaWYgKHRoaXMucmVzaXppbmcpIHRoaXMuaGFuZGxlUmVzaXplTW92ZShldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VVcChfZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmZpbmFsaXplRHJhZygpKTtcbiAgICBlbHNlIGlmICh0aGlzLnJlc2l6aW5nKSB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuZmluYWxpemVSZXNpemUoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ3JpZENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5kcmFnZ2luZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgbGV0IHB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIHRoaXMuZHJhZ2dpbmcub2Zmc2V0WDtcbiAgICBsZXQgcHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSB0aGlzLmRyYWdnaW5nLm9mZnNldFk7XG4gICAgcHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihweCwgcmVjdC53aWR0aCAtIHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scykpKTtcbiAgICBweSA9IE1hdGgubWF4KDAsIHB5KTtcblxuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA9IHB4O1xuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA9IHB5O1xuXG4gICAgY29uc3QgdGFyZ2V0Q29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5waXhlbFRvQ29sKHB4KSwgdGhpcy5jb2x1bW5zIC0gd2lkZ2V0LmNvbHMpKTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSBNYXRoLm1heCgwLCB0aGlzLnBpeGVsVG9Sb3cocHkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyxcbiAgICAgIHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCBjb2xzOiB3aWRnZXQuY29scywgcm93czogd2lkZ2V0LnJvd3MgfSxcbiAgICAgIHRhcmdldENvbCwgdGFyZ2V0Um93LCB0aGlzLmNvbHVtbnNcbiAgICApO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHtcbiAgICAgIGxlZnQ6IHRoaXMuY29sVG9QaXhlbCh0YXJnZXRDb2wpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh0YXJnZXRSb3cpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZURyYWcoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQodyA9PiB3LmlkID09PSB0aGlzLmRyYWdnaW5nIS5pZCkhO1xuICAgIGNvbnN0IHRhcmdldENvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMucGl4ZWxUb0NvbCh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFgpLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQuY29scykpO1xuICAgIGNvbnN0IHRhcmdldFJvdyA9IE1hdGgubWF4KDAsIHRoaXMucGl4ZWxUb1Jvdyh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgdGFyZ2V0Q29sLCB0YXJnZXRSb3csIHRoaXMuY29sdW1uc1xuICAgICk7XG4gICAgZm9yIChjb25zdCBydyBvZiByZXNvbHZlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB3LmNvbHMgPSBydy5jb2xzOyB3LnJvd3MgPSBydy5yb3dzOyB0aGlzLml0ZW1DaGFuZ2VkLmVtaXQodyk7IH1cbiAgICB9XG4gICAgdGhpcy5kcmFnZ2luZyA9IG51bGw7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IFtdO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQodGhpcy53aWRnZXRzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVzaXplTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemluZykgcmV0dXJuO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5yZXNpemluZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHggPSBldmVudC5jbGllbnRYIC0gdGhpcy5yZXNpemluZy5zdGFydE1vdXNlWDtcbiAgICBjb25zdCBkeSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnJlc2l6aW5nLnN0YXJ0TW91c2VZO1xuXG4gICAgbGV0IG5ld0NvbHMgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Db2xzLCBNYXRoLnJvdW5kKCh0aGlzLmNvbHNUb1BpeGVsV2lkdGgodGhpcy5yZXNpemluZy5zdGFydENvbHMpICsgZHgpIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKCh0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHRoaXMucmVzaXppbmcuc3RhcnRSb3dzKSArIGR5KSAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICB0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbFcgPSB0aGlzLmNvbHNUb1BpeGVsV2lkdGgobmV3Q29scyk7XG4gICAgdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIID0gdGhpcy5yb3dzVG9QaXhlbEhlaWdodChuZXdSb3dzKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5yZXNpemVXaWRnZXQoXG4gICAgICB0aGlzLnByZXZpZXdXaWRnZXRzLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcblxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB7XG4gICAgICBsZWZ0OiB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh3aWRnZXQueSksXG4gICAgICB3aWR0aDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKG5ld0NvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KG5ld1Jvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZVJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMucmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHRoaXMucmVzaXppbmchLmlkKSE7XG5cbiAgICBsZXQgbmV3Q29scyA9IE1hdGgubWF4KHRoaXMubWluSXRlbUNvbHMsIE1hdGgucm91bmQodGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsSCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IEdyaWRFbmdpbmUucmVzaXplV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIHJlc29sdmVkKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IHcuY29scyA9IHJ3LmNvbHM7IHcucm93cyA9IHJ3LnJvd3M7IHRoaXMuaXRlbUNoYW5nZWQuZW1pdCh3KTsgfVxuICAgIH1cbiAgICB0aGlzLnJlc2l6aW5nID0gbnVsbDtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDtcbiAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gW107XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCh0aGlzLndpZGdldHMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFV0aWxpdGllcyDilIDilIBcblxuICBwcml2YXRlIGNvbXBhY3RBbmRBcHBseSgpIHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0cz8ubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY29tcGFjdGVkID0gR3JpZEVuZ2luZS5jb21wYWN0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgdGhpcy5jb2x1bW5zXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIGNvbXBhY3RlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb250YWluZXJIZWlnaHQoKSB7XG4gICAgaWYgKCF0aGlzLndpZGdldHM/Lmxlbmd0aCkgeyB0aGlzLmNvbnRhaW5lckhlaWdodCA9IDQwMDsgcmV0dXJuOyB9XG4gICAgY29uc3QgbWF4Um93ID0gR3JpZEVuZ2luZS5nZXRHcmlkSGVpZ2h0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpXG4gICAgKTtcbiAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMucm93VG9QaXhlbChtYXhSb3cpICsgdGhpcy5yb3dIZWlnaHQgKyB0aGlzLmdhcDtcbiAgfVxufVxuIl19
|
|
534
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jdXN0b20tZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDdEMsU0FBUyxFQUNULFlBQVksRUFBRSxXQUFXLEVBQ3pCLFNBQVMsRUFBRSx1QkFBdUIsRUFDbkMsTUFBTSxlQUFlLENBQUM7OztBQUd2Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFBbUIsV0FBNEM7UUFBNUMsZ0JBQVcsR0FBWCxXQUFXLENBQWlDO0lBQUcsQ0FBQzs7K0dBRHhELGlCQUFpQjttR0FBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztBQW1CckMsTUFBTSxVQUFVO0lBRWQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3RDLE9BQU8sQ0FBQyxDQUNOLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQW1CLEVBQUUsSUFBYztRQUN6RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUs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Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDVCxtQkEyRGdCLHVCQUF1QixDQUFDLE1BQU07NkhBR3RDLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdZLFlBQVk7c0JBQW5FLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCwgT25EZXN0cm95LCBPbkluaXQsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsXG4gIERpcmVjdGl2ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4vbW9kZWxzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgc3RhbXBlZCBpbnNpZGUgZWFjaCBncmlkIGNlbGwuXG4gKiBVc2FnZTpcbiAqICAgPGFwcC1ncmlkIFt3aWRnZXRzXT1cIi4uLlwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBncmlkQ2VsbCBsZXQtd2lkZ2V0PVwid2lkZ2V0XCI+XG4gKiAgICAgICA8YXBwLXdpZGdldC1yZW5kZXJlciBbd2lkZ2V0XT1cIndpZGdldFwiIC4uLj48L2FwcC13aWRnZXQtcmVuZGVyZXI+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgPC9hcHAtZ3JpZD5cbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2dyaWRDZWxsXScgfSlcbmV4cG9ydCBjbGFzcyBHcmlkQ2VsbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8eyB3aWRnZXQ6IFdpZGdldCB9Pikge31cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBHUklEIEVOR0lORSDigJQgcHVyZSBkYXRhLCB6ZXJvIERPTVxuICAgSGFuZGxlcyBjb2xsaXNpb24gZGV0ZWN0aW9uLCByZXNvbHV0aW9uLCBhbmQgY29tcGFjdGlvbi5cbiAgIEluc3BpcmVkIGJ5IHJlYWN0LWdyaWQtbGF5b3V0IC8gZ3JpZHN0ZXIgYWxnb3JpdGhtcy5cbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5pbnRlcmZhY2UgR3JpZFJlY3Qge1xuICBpZDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG59XG5cbmNsYXNzIEdyaWRFbmdpbmUge1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gcmVjdHMgb3ZlcmxhcC5cbiAgICovXG4gIHN0YXRpYyBjb2xsaWRlcyhhOiBHcmlkUmVjdCwgYjogR3JpZFJlY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIGEueCArIGEuY29scyA8PSBiLnggfHxcbiAgICAgIGIueCArIGIuY29scyA8PSBhLnggfHxcbiAgICAgIGEueSArIGEucm93cyA8PSBiLnkgfHxcbiAgICAgIGIueSArIGIucm93cyA8PSBhLnlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBTEwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgcmVjdGAuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxsQ29sbGlzaW9ucyh3aWRnZXRzOiBHcmlkUmVjdFtdLCByZWN0OiBHcmlkUmVjdCk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiB3aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHJlY3QuaWQgJiYgR3JpZEVuZ2luZS5jb2xsaWRlcyh3LCByZWN0KSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCB3aWRnZXRzIHRvcC10by1ib3R0b20sIGxlZnQtdG8tcmlnaHQuXG4gICAqL1xuICBzdGF0aWMgc29ydEJ5UG9zaXRpb24od2lkZ2V0czogR3JpZFJlY3RbXSk6IEdyaWRSZWN0W10ge1xuICAgIHJldHVybiBbLi4ud2lkZ2V0c10uc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIHdpZGdldCB0byAoeCwgeSkgYW5kIHB1c2ggYW55IGNvbGxpZGluZyB3aWRnZXRzIGRvd253YXJkLlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIGxpc3Qgd2l0aCByZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbW92ZVdpZGdldChcbiAgICBhbGxXaWRnZXRzOiBHcmlkUmVjdFtdLFxuICAgIHdpZGdldDogR3JpZFJlY3QsXG4gICAgbmV3WDogbnVtYmVyLFxuICAgIG5ld1k6IG51bWJlcixcbiAgICBjb2x1bW5zOiBudW1iZXJcbiAgKTogR3JpZFJlY3RbXSB7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IGFsbFdpZGdldHMubWFwKHcgPT4gKHsgLi4udyB9KSk7XG4gICAgY29uc3QgbW92aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIW1vdmluZykgcmV0dXJuIHdpZGdldHM7XG5cbiAgICBtb3ZpbmcueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld1gsIGNvbHVtbnMgLSBtb3ZpbmcuY29scykpO1xuICAgIG1vdmluZy55ID0gTWF0aC5tYXgoMCwgbmV3WSk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBHcmlkRW5naW5lLnNvcnRCeVBvc2l0aW9uKHdpZGdldHMpO1xuICAgIEdyaWRFbmdpbmUucmVzb2x2ZUNvbGxpc2lvbnMoc29ydGVkLCBtb3ZpbmcpO1xuICAgIHJldHVybiBHcmlkRW5naW5lLmNvbXBhY3Qoc29ydGVkLCBjb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgYSB3aWRnZXQgYW5kIHB1c2ggY29sbGlkaW5nIHdpZGdldHMgZG93bi5cbiAgICovXG4gIHN0YXRpYyByZXNpemVXaWRnZXQoXG4gICAgYWxsV2lkZ2V0czogR3JpZFJlY3RbXSxcbiAgICB3aWRnZXQ6IEdyaWRSZWN0LFxuICAgIG5ld0NvbHM6IG51bWJlcixcbiAgICBuZXdSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uczogbnVtYmVyXG4gICk6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHdpZGdldHMgPSBhbGxXaWRnZXRzLm1hcCh3ID0+ICh7IC4uLncgfSkpO1xuICAgIGNvbnN0IHJlc2l6aW5nID0gd2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0LmlkKTtcbiAgICBpZiAoIXJlc2l6aW5nKSByZXR1cm4gd2lkZ2V0cztcblxuICAgIHJlc2l6aW5nLmNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihuZXdDb2xzLCBjb2x1bW5zIC0gcmVzaXppbmcueCkpO1xuICAgIHJlc2l6aW5nLnJvd3MgPSBNYXRoLm1heCgxLCBuZXdSb3dzKTtcblxuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyhzb3J0ZWQsIHJlc2l6aW5nKTtcbiAgICByZXR1cm4gR3JpZEVuZ2luZS5jb21wYWN0KHNvcnRlZCwgY29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhbGwgd2lkZ2V0cyB0aGF0IGNvbGxpZGUgd2l0aCBgbW92ZWRXaWRnZXRgIGRvd253YXJkLCByZWN1cnNpdmVseS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVDb2xsaXNpb25zKHdpZGdldHM6IEdyaWRSZWN0W10sIG1vdmVkV2lkZ2V0OiBHcmlkUmVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBHcmlkRW5naW5lLmdldEFsbENvbGxpc2lvbnMod2lkZ2V0cywgbW92ZWRXaWRnZXQpO1xuICAgIGZvciAoY29uc3QgY29sbGlkZXIgb2YgY29sbGlzaW9ucykge1xuICAgICAgY29sbGlkZXIueSA9IG1vdmVkV2lkZ2V0LnkgKyBtb3ZlZFdpZGdldC5yb3dzO1xuICAgICAgR3JpZEVuZ2luZS5yZXNvbHZlQ29sbGlzaW9ucyh3aWRnZXRzLCBjb2xsaWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhY3QgdGhlIGdyaWQ6IG1vdmUgZXZlcnkgd2lkZ2V0IGFzIGZhciB1cCBhcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhY3Qod2lkZ2V0czogR3JpZFJlY3RbXSwgX2NvbHVtbnM6IG51bWJlcik6IEdyaWRSZWN0W10ge1xuICAgIGNvbnN0IHNvcnRlZCA9IEdyaWRFbmdpbmUuc29ydEJ5UG9zaXRpb24od2lkZ2V0cyk7XG4gICAgY29uc3QgcGxhY2VkOiBHcmlkUmVjdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBzb3J0ZWQpIHtcbiAgICAgIHdpZGdldC55ID0gR3JpZEVuZ2luZS5maW5kQ29tcGFjdFkocGxhY2VkLCB3aWRnZXQpO1xuICAgICAgcGxhY2VkLnB1c2god2lkZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhY2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGhpZ2hlc3QgWSBwb3NpdGlvbiBhIHdpZGdldCBjYW4gb2NjdXB5IHdpdGhvdXQgb3ZlcmxhcHBpbmcgYW55IGFscmVhZHktcGxhY2VkIHdpZGdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb21wYWN0WShwbGFjZWQ6IEdyaWRSZWN0W10sIHdpZGdldDogR3JpZFJlY3QpOiBudW1iZXIge1xuICAgIGxldCB5ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGVzdDogR3JpZFJlY3QgPSB7IC4uLndpZGdldCwgeSB9O1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gcGxhY2VkLmZpbmQocCA9PiBHcmlkRW5naW5lLmNvbGxpZGVzKHAsIHRlc3QpKTtcbiAgICAgIGlmICghY29sbGlzaW9uKSByZXR1cm4geTtcbiAgICAgIHkgPSBjb2xsaXNpb24ueSArIGNvbGxpc2lvbi5yb3dzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyB0aGUgZ3JpZCBuZWVkcy5cbiAgICovXG4gIHN0YXRpYyBnZXRHcmlkSGVpZ2h0KHdpZGdldHM6IEdyaWRSZWN0W10pOiBudW1iZXIge1xuICAgIGlmICh3aWRnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLndpZGdldHMubWFwKHcgPT4gdy55ICsgdy5yb3dzKSk7XG4gIH1cbn1cblxuLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICBDVVNUT00gR1JJRCBDT01QT05FTlRcbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI2dyaWRDb250YWluZXJcbiAgICAgIGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb250YWluZXJIZWlnaHRcIlxuICAgID5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgcHJldmlldyAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJncmlkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgKm5nSWY9XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBsYWNlaG9sZGVyLmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInBsYWNlaG9sZGVyLnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbGFjZWhvbGRlci53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicGxhY2Vob2xkZXIuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPCEtLSBXaWRnZXQgaXRlbXMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0czsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgY2xhc3M9XCJncmlkLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuaXMtZHJhZ2dpbmddPVwiZHJhZ2dpbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbY2xhc3MuaXMtcmVzaXppbmddPVwicmVzaXppbmc/LmlkID09PSB3aWRnZXQuaWRcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRJdGVtTGVmdCh3aWRnZXQpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJnZXRJdGVtVG9wKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0SXRlbVdpZHRoKHdpZGdldClcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdldEl0ZW1IZWlnaHQod2lkZ2V0KVwiXG4gICAgICAgIFtzdHlsZS56LWluZGV4XT1cIihkcmFnZ2luZz8uaWQgPT09IHdpZGdldC5pZCB8fCByZXNpemluZz8uaWQgPT09IHdpZGdldC5pZCkgPyAxMDAgOiAxXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQsIHdpZGdldClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgc3RhbXBlZCBmcm9tIHBhcmVudCB0ZW1wbGF0ZSwgY29udGV4dCBjYXJyaWVzIHRoZSB3aWRnZXQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB3aWRnZXQ6IHdpZGdldCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVzaXplIGhhbmRsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCB3aWRnZXQpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDF2MTBIMVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgNXY2SDVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDl2Mkg5XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfVxuXG4gICAgLmdyaWQtY29udGFpbmVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ncmlkLXBsYWNlaG9sZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRhc2gtcGxhY2Vob2xkZXItY29sb3IsIHZhcigtLWRhc2gtYWNjZW50LWNvbG9yLCAjMGE4NGZmKSk7XG4gICAgICBvcGFjaXR5OiAwLjEyO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1kYXNoLXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZikpO1xuICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cyBlYXNlLCB0b3AgMC4xNXMgZWFzZSwgd2lkdGggMC4xNXMgZWFzZSwgaGVpZ2h0IDAuMTVzIGVhc2U7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDA7XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4yNXMgZWFzZSwgdG9wIDAuMjVzIGVhc2UsIHdpZHRoIDAuMjVzIGVhc2UsIGhlaWdodCAwLjI1cyBlYXNlO1xuICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLmdyaWQtaXRlbS5pcy1kcmFnZ2luZyxcbiAgICAuZ3JpZC1pdGVtLmlzLXJlc2l6aW5nIHtcbiAgICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG9wYWNpdHk6IDAuODg7XG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKiBSZXNpemUgSGFuZGxlICovXG4gICAgLnJlc2l6ZS1oYW5kbGUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcmlnaHQ6IDRweDtcbiAgICAgIGJvdHRvbTogNHB4O1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICBjdXJzb3I6IG53c2UtcmVzaXplO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLXJlc2l6ZS1oYW5kbGUtY29sb3IsIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycywgYmFja2dyb3VuZCAwLjJzO1xuICAgICAgei1pbmRleDogMjA7XG4gICAgfVxuICAgIC5yZXNpemUtaGFuZGxlOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXNoLWFjY2VudC1jb2xvciwgIzBhODRmZik7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgd2lkZ2V0czogV2lkZ2V0W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogbnVtYmVyID0gMTI7XG4gIEBJbnB1dCgpIGdhcDogbnVtYmVyID0gMTY7XG4gIEBJbnB1dCgpIHJvd0hlaWdodDogbnVtYmVyID0gODA7XG4gIEBJbnB1dCgpIG1pbkl0ZW1Db2xzOiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSBtaW5JdGVtUm93czogbnVtYmVyID0gMTtcblxuICBAT3V0cHV0KCkgaXRlbUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldD4oKTtcbiAgQE91dHB1dCgpIGxheW91dENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldFtdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBncmlkQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgLyoqIFRoZSBuZy10ZW1wbGF0ZSBkZWNvcmF0ZWQgd2l0aCBncmlkQ2VsbCBmcm9tIHRoZSBwYXJlbnQgKi9cbiAgQENvbnRlbnRDaGlsZChHcmlkQ2VsbERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBjZWxsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx7IHdpZGdldDogV2lkZ2V0IH0+O1xuXG4gIHBsYWNlaG9sZGVyOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgY29udGFpbmVySGVpZ2h0ID0gNDAwO1xuXG4gIGRyYWdnaW5nOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBvZmZzZXRYOiBudW1iZXI7XG4gICAgb2Zmc2V0WTogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFg6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxZOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICByZXNpemluZzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc3RhcnRNb3VzZVg6IG51bWJlcjtcbiAgICBzdGFydE1vdXNlWTogbnVtYmVyO1xuICAgIHN0YXJ0Q29sczogbnVtYmVyO1xuICAgIHN0YXJ0Um93czogbnVtYmVyO1xuICAgIGN1cnJlbnRQaXhlbFc6IG51bWJlcjtcbiAgICBjdXJyZW50UGl4ZWxIOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHByZXZpZXdXaWRnZXRzOiBHcmlkUmVjdFtdID0gW107XG4gIHByaXZhdGUgYm91bmRNb3VzZU1vdmUgPSB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgYm91bmRNb3VzZVVwID0gdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYXBwbHlDb21wYWN0aW9uQW5kU3luYygpO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ib3VuZE1vdXNlVXApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nIHx8IHRoaXMucmVzaXppbmcpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3dpZGdldHMnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlDb21wYWN0aW9uQW5kU3luYygpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5ib3VuZE1vdXNlTW92ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmJvdW5kTW91c2VVcCk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIGl0ZW06IFdpZGdldCkgeyByZXR1cm4gaXRlbS5pZDsgfVxuXG4gIC8vIOKUgOKUgCBHZW9tZXRyeSDilIDilIBcblxuICBwcml2YXRlIGdldCBjZWxsV2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250YWluZXJXID0gdGhpcy5ncmlkQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCA/PyA4MDA7XG4gICAgcmV0dXJuIChjb250YWluZXJXIC0gKHRoaXMuY29sdW1ucyAtIDEpICogdGhpcy5nYXApIC8gdGhpcy5jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xUb1BpeGVsKGNvbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29sICogKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dUb1BpeGVsKHJvdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93ICogKHRoaXMucm93SGVpZ2h0ICsgdGhpcy5nYXApO1xuICB9XG5cbiAgcHJpdmF0ZSBwaXhlbFRvQ29sKHB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHB4IC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKTtcbiAgfVxuXG4gIHByaXZhdGUgcGl4ZWxUb1JvdyhweDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChweCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbHNUb1BpeGVsV2lkdGgoY29sczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29scyAqIHRoaXMuY2VsbFdpZHRoICsgKGNvbHMgLSAxKSAqIHRoaXMuZ2FwO1xuICB9XG5cbiAgcHJpdmF0ZSByb3dzVG9QaXhlbEhlaWdodChyb3dzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByb3dzICogdGhpcy5yb3dIZWlnaHQgKyAocm93cyAtIDEpICogdGhpcy5nYXA7XG4gIH1cblxuICBnZXRJdGVtTGVmdCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA6IHRoaXMuY29sVG9QaXhlbCh3LngpO1xuICB9XG5cbiAgZ2V0SXRlbVRvcCh3OiBXaWRnZXQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nPy5pZCA9PT0gdy5pZCA/IHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA6IHRoaXMucm93VG9QaXhlbCh3LnkpO1xuICB9XG5cbiAgZ2V0SXRlbVdpZHRoKHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHcuY29scyk7XG4gIH1cblxuICBnZXRJdGVtSGVpZ2h0KHc6IFdpZGdldCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVzaXppbmc/LmlkID09PSB3LmlkID8gdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIIDogdGhpcy5yb3dzVG9QaXhlbEhlaWdodCh3LnJvd3MpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERyYWcg4pSA4pSAXG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHdpZGdldDogV2lkZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYSwgLnJlc2l6ZS1oYW5kbGUnKSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5ncmlkQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXRlbUxlZnQgPSB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpO1xuICAgIGNvbnN0IGl0ZW1Ub3AgPSB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IHtcbiAgICAgIGlkOiB3aWRnZXQuaWQsXG4gICAgICBvZmZzZXRYOiBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gaXRlbUxlZnQsXG4gICAgICBvZmZzZXRZOiBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBpdGVtVG9wLFxuICAgICAgY3VycmVudFBpeGVsWDogaXRlbUxlZnQsXG4gICAgICBjdXJyZW50UGl4ZWxZOiBpdGVtVG9wLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogaXRlbUxlZnQsIHRvcDogaXRlbVRvcCxcbiAgICAgIHdpZHRoOiB0aGlzLmNvbHNUb1BpeGVsV2lkdGgod2lkZ2V0LmNvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHdpZGdldC5yb3dzKSxcbiAgICB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25SZXNpemVTdGFydChldmVudDogTW91c2VFdmVudCwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzaXppbmcgPSB7XG4gICAgICBpZDogd2lkZ2V0LmlkLFxuICAgICAgc3RhcnRNb3VzZVg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBzdGFydE1vdXNlWTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHN0YXJ0Q29sczogd2lkZ2V0LmNvbHMsXG4gICAgICBzdGFydFJvd3M6IHdpZGdldC5yb3dzLFxuICAgICAgY3VycmVudFBpeGVsVzogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKHdpZGdldC5jb2xzKSxcbiAgICAgIGN1cnJlbnRQaXhlbEg6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0ge1xuICAgICAgbGVmdDogdGhpcy5jb2xUb1BpeGVsKHdpZGdldC54KSwgdG9wOiB0aGlzLnJvd1RvUGl4ZWwod2lkZ2V0LnkpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHRoaXMuaGFuZGxlRHJhZ01vdmUoZXZlbnQpO1xuICAgIGVsc2UgaWYgKHRoaXMucmVzaXppbmcpIHRoaXMuaGFuZGxlUmVzaXplTW92ZShldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VVcChfZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmZpbmFsaXplRHJhZygpKTtcbiAgICBlbHNlIGlmICh0aGlzLnJlc2l6aW5nKSB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMuZmluYWxpemVSZXNpemUoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ3JpZENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5kcmFnZ2luZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgbGV0IHB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIHRoaXMuZHJhZ2dpbmcub2Zmc2V0WDtcbiAgICBsZXQgcHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSB0aGlzLmRyYWdnaW5nLm9mZnNldFk7XG4gICAgcHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihweCwgcmVjdC53aWR0aCAtIHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scykpKTtcbiAgICBweSA9IE1hdGgubWF4KDAsIHB5KTtcblxuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWCA9IHB4O1xuICAgIHRoaXMuZHJhZ2dpbmcuY3VycmVudFBpeGVsWSA9IHB5O1xuXG4gICAgY29uc3QgdGFyZ2V0Q29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5waXhlbFRvQ29sKHB4KSwgdGhpcy5jb2x1bW5zIC0gd2lkZ2V0LmNvbHMpKTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSBNYXRoLm1heCgwLCB0aGlzLnBpeGVsVG9Sb3cocHkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyxcbiAgICAgIHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCBjb2xzOiB3aWRnZXQuY29scywgcm93czogd2lkZ2V0LnJvd3MgfSxcbiAgICAgIHRhcmdldENvbCwgdGFyZ2V0Um93LCB0aGlzLmNvbHVtbnNcbiAgICApO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHtcbiAgICAgIGxlZnQ6IHRoaXMuY29sVG9QaXhlbCh0YXJnZXRDb2wpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh0YXJnZXRSb3cpLFxuICAgICAgd2lkdGg6IHRoaXMuY29sc1RvUGl4ZWxXaWR0aCh3aWRnZXQuY29scyksXG4gICAgICBoZWlnaHQ6IHRoaXMucm93c1RvUGl4ZWxIZWlnaHQod2lkZ2V0LnJvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZURyYWcoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQodyA9PiB3LmlkID09PSB0aGlzLmRyYWdnaW5nIS5pZCkhO1xuICAgIGNvbnN0IHRhcmdldENvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMucGl4ZWxUb0NvbCh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFgpLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQuY29scykpO1xuICAgIGNvbnN0IHRhcmdldFJvdyA9IE1hdGgubWF4KDAsIHRoaXMucGl4ZWxUb1Jvdyh0aGlzLmRyYWdnaW5nLmN1cnJlbnRQaXhlbFkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5tb3ZlV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgdGFyZ2V0Q29sLCB0YXJnZXRSb3csIHRoaXMuY29sdW1uc1xuICAgICk7XG4gICAgZm9yIChjb25zdCBydyBvZiByZXNvbHZlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAodykgeyB3LnggPSBydy54OyB3LnkgPSBydy55OyB3LmNvbHMgPSBydy5jb2xzOyB3LnJvd3MgPSBydy5yb3dzOyB0aGlzLml0ZW1DaGFuZ2VkLmVtaXQodyk7IH1cbiAgICB9XG4gICAgdGhpcy5kcmFnZ2luZyA9IG51bGw7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5wcmV2aWV3V2lkZ2V0cyA9IFtdO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XG4gICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQodGhpcy53aWRnZXRzKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVzaXplTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemluZykgcmV0dXJuO1xuICAgIGNvbnN0IHdpZGdldCA9IHRoaXMud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gdGhpcy5yZXNpemluZyEuaWQpITtcbiAgICBpZiAoIXdpZGdldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHggPSBldmVudC5jbGllbnRYIC0gdGhpcy5yZXNpemluZy5zdGFydE1vdXNlWDtcbiAgICBjb25zdCBkeSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnJlc2l6aW5nLnN0YXJ0TW91c2VZO1xuXG4gICAgbGV0IG5ld0NvbHMgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Db2xzLCBNYXRoLnJvdW5kKCh0aGlzLmNvbHNUb1BpeGVsV2lkdGgodGhpcy5yZXNpemluZy5zdGFydENvbHMpICsgZHgpIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKCh0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KHRoaXMucmVzaXppbmcuc3RhcnRSb3dzKSArIGR5KSAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICB0aGlzLnJlc2l6aW5nLmN1cnJlbnRQaXhlbFcgPSB0aGlzLmNvbHNUb1BpeGVsV2lkdGgobmV3Q29scyk7XG4gICAgdGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxIID0gdGhpcy5yb3dzVG9QaXhlbEhlaWdodChuZXdSb3dzKTtcblxuICAgIGNvbnN0IHJlc29sdmVkID0gR3JpZEVuZ2luZS5yZXNpemVXaWRnZXQoXG4gICAgICB0aGlzLnByZXZpZXdXaWRnZXRzLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcblxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB7XG4gICAgICBsZWZ0OiB0aGlzLmNvbFRvUGl4ZWwod2lkZ2V0LngpLCB0b3A6IHRoaXMucm93VG9QaXhlbCh3aWRnZXQueSksXG4gICAgICB3aWR0aDogdGhpcy5jb2xzVG9QaXhlbFdpZHRoKG5ld0NvbHMpLFxuICAgICAgaGVpZ2h0OiB0aGlzLnJvd3NUb1BpeGVsSGVpZ2h0KG5ld1Jvd3MpLFxuICAgIH07XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgcncgb2YgcmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHJ3LmlkID09PSB3aWRnZXQuaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgICAgaWYgKHcpIHsgdy54ID0gcncueDsgdy55ID0gcncueTsgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5hbGl6ZVJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMucmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHRoaXMucmVzaXppbmchLmlkKSE7XG5cbiAgICBsZXQgbmV3Q29scyA9IE1hdGgubWF4KHRoaXMubWluSXRlbUNvbHMsIE1hdGgucm91bmQodGhpcy5yZXNpemluZy5jdXJyZW50UGl4ZWxXIC8gKHRoaXMuY2VsbFdpZHRoICsgdGhpcy5nYXApKSk7XG4gICAgbGV0IG5ld1Jvd3MgPSBNYXRoLm1heCh0aGlzLm1pbkl0ZW1Sb3dzLCBNYXRoLnJvdW5kKHRoaXMucmVzaXppbmcuY3VycmVudFBpeGVsSCAvICh0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwKSkpO1xuICAgIG5ld0NvbHMgPSBNYXRoLm1pbihuZXdDb2xzLCB0aGlzLmNvbHVtbnMgLSB3aWRnZXQueCk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IEdyaWRFbmdpbmUucmVzaXplV2lkZ2V0KFxuICAgICAgdGhpcy53aWRnZXRzLm1hcCh3ID0+ICh7IGlkOiB3LmlkLCB4OiB3LngsIHk6IHcueSwgY29sczogdy5jb2xzLCByb3dzOiB3LnJvd3MgfSkpLFxuICAgICAgeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIGNvbHM6IHdpZGdldC5jb2xzLCByb3dzOiB3aWRnZXQucm93cyB9LFxuICAgICAgbmV3Q29scywgbmV3Um93cywgdGhpcy5jb2x1bW5zXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIHJlc29sdmVkKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy53aWRnZXRzLmZpbmQod3cgPT4gd3cuaWQgPT09IHJ3LmlkKTtcbiAgICAgIGlmICh3KSB7IHcueCA9IHJ3Lng7IHcueSA9IHJ3Lnk7IHcuY29scyA9IHJ3LmNvbHM7IHcucm93cyA9IHJ3LnJvd3M7IHRoaXMuaXRlbUNoYW5nZWQuZW1pdCh3KTsgfVxuICAgIH1cbiAgICB0aGlzLnJlc2l6aW5nID0gbnVsbDtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gbnVsbDtcbiAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gW107XG4gICAgdGhpcy51cGRhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCh0aGlzLndpZGdldHMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFV0aWxpdGllcyDilIDilIBcblxuICBwcml2YXRlIGNvbXBhY3RBbmRBcHBseSgpOiBXaWRnZXRbXSB7XG4gICAgaWYgKCF0aGlzLndpZGdldHM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbXBhY3RlZCA9IEdyaWRFbmdpbmUuY29tcGFjdChcbiAgICAgIHRoaXMud2lkZ2V0cy5tYXAodyA9PiAoeyBpZDogdy5pZCwgeDogdy54LCB5OiB3LnksIGNvbHM6IHcuY29scywgcm93czogdy5yb3dzIH0pKSxcbiAgICAgIHRoaXMuY29sdW1uc1xuICAgICk7XG5cbiAgICBjb25zdCBjaGFuZ2VkV2lkZ2V0czogV2lkZ2V0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJ3IG9mIGNvbXBhY3RlZCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMud2lkZ2V0cy5maW5kKHd3ID0+IHd3LmlkID09PSBydy5pZCk7XG4gICAgICBpZiAoIXcpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjaGFuZ2VkID0gdy54ICE9PSBydy54IHx8IHcueSAhPT0gcncueSB8fCB3LmNvbHMgIT09IHJ3LmNvbHMgfHwgdy5yb3dzICE9PSBydy5yb3dzO1xuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgdy54ID0gcncueDtcbiAgICAgICAgdy55ID0gcncueTtcbiAgICAgICAgdy5jb2xzID0gcncuY29scztcbiAgICAgICAgdy5yb3dzID0gcncucm93cztcbiAgICAgICAgY2hhbmdlZFdpZGdldHMucHVzaCh3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZFdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q29tcGFjdGlvbkFuZFN5bmMoKSB7XG4gICAgY29uc3QgY2hhbmdlZFdpZGdldHMgPSB0aGlzLmNvbXBhY3RBbmRBcHBseSgpO1xuICAgIGlmICghY2hhbmdlZFdpZGdldHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiBjaGFuZ2VkV2lkZ2V0cykge1xuICAgICAgdGhpcy5pdGVtQ2hhbmdlZC5lbWl0KHdpZGdldCk7XG4gICAgfVxuICAgIHRoaXMubGF5b3V0Q2hhbmdlZC5lbWl0KHRoaXMud2lkZ2V0cyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRhaW5lckhlaWdodCgpIHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0cz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IDQwMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhSb3cgPSBHcmlkRW5naW5lLmdldEdyaWRIZWlnaHQoXG4gICAgICB0aGlzLndpZGdldHMubWFwKHcgPT4gKHsgaWQ6IHcuaWQsIHg6IHcueCwgeTogdy55LCBjb2xzOiB3LmNvbHMsIHJvd3M6IHcucm93cyB9KSlcbiAgICApO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5yb3dUb1BpeGVsKG1heFJvdykgKyB0aGlzLnJvd0hlaWdodCArIHRoaXMuZ2FwO1xuICB9XG59XG4iXX0=
|