@c8y/ngx-components 1021.56.5 → 1021.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/context-dashboard/context-dashboard.component.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.service.d.ts +1 -1
- package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
- package/core/dashboard/dashboard.model.d.ts +1 -1
- package/core/dashboard/dashboard.model.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard.component.d.ts +3 -2
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/ecosystem/microservices/add-microservice.component.d.ts.map +1 -1
- package/esm2022/context-dashboard/context-dashboard.component.mjs +2 -6
- package/esm2022/context-dashboard/context-dashboard.service.mjs +14 -8
- package/esm2022/context-dashboard/dashboard-detail.component.mjs +2 -2
- package/esm2022/core/dashboard/dashboard.model.mjs +2 -2
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -8
- package/esm2022/ecosystem/microservices/add-microservice.component.mjs +2 -2
- package/esm2022/upgrade/upgraded-services/roles.service.mjs +1 -1
- package/esm2022/user-roles/roles-asset-tree/roles-asset-tree.component.mjs +2 -2
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +14 -12
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs +1 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +8 -7
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/upgrade/upgraded-services/roles.service.d.ts +1 -1
- package/upgrade/upgraded-services/roles.service.d.ts.map +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { Router } from '@angular/router';
|
|
3
3
|
import { InventoryService, QueriesUtil } from '@c8y/client';
|
|
4
|
-
import { AlertService, DynamicComponentService, getActivatedRoute, gettext, GroupService, ModalService, NavigatorNode, NavigatorService,
|
|
4
|
+
import { AlertService, DynamicComponentService, getActivatedRoute, gettext, GroupService, ModalService, NavigatorNode, NavigatorService, NEW_DASHBOARD_ROUTER_STATE_PROP, OptionsService, Permissions, Status, TabsService, ViewContext } from '@c8y/ngx-components';
|
|
5
5
|
import { TranslateService } from '@ngx-translate/core';
|
|
6
6
|
import { assign, cloneDeep, forEach, get, has, keyBy, keys, pick, reduce, set, some } from 'lodash-es';
|
|
7
7
|
import { combineLatest, from, of, Subject } from 'rxjs';
|
|
@@ -175,24 +175,30 @@ export class ContextDashboardService {
|
|
|
175
175
|
this.navigator.add(nodeToAdd);
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
|
-
async navigateToDashboard(dashboardMO) {
|
|
178
|
+
async navigateToDashboard(dashboardMO, isNewDashboard = false) {
|
|
179
179
|
if (/dashboard/.test(this.router.url)) {
|
|
180
180
|
this.router.navigate(['..', dashboardMO.id], {
|
|
181
181
|
relativeTo: getActivatedRoute(this.router),
|
|
182
|
-
|
|
183
|
-
[
|
|
184
|
-
}
|
|
182
|
+
...(isNewDashboard && {
|
|
183
|
+
state: { [NEW_DASHBOARD_ROUTER_STATE_PROP]: true }
|
|
184
|
+
})
|
|
185
185
|
});
|
|
186
186
|
}
|
|
187
187
|
else if (/^\/(device|group)\/[0-9]+$/.test(this.router.url)) {
|
|
188
188
|
// in case the add dashboard button is the only tab on that route
|
|
189
189
|
this.router.navigate(['.', this.DASHBOARD_ROUTE_PATH, dashboardMO.id], {
|
|
190
|
-
relativeTo: getActivatedRoute(this.router)
|
|
190
|
+
relativeTo: getActivatedRoute(this.router),
|
|
191
|
+
...(isNewDashboard && {
|
|
192
|
+
state: { [NEW_DASHBOARD_ROUTER_STATE_PROP]: true }
|
|
193
|
+
})
|
|
191
194
|
});
|
|
192
195
|
}
|
|
193
196
|
else {
|
|
194
197
|
this.router.navigate(['..', this.DASHBOARD_ROUTE_PATH, dashboardMO.id], {
|
|
195
|
-
relativeTo: getActivatedRoute(this.router)
|
|
198
|
+
relativeTo: getActivatedRoute(this.router),
|
|
199
|
+
...(isNewDashboard && {
|
|
200
|
+
state: { [NEW_DASHBOARD_ROUTER_STATE_PROP]: true }
|
|
201
|
+
})
|
|
196
202
|
});
|
|
197
203
|
}
|
|
198
204
|
}
|
|
@@ -693,4 +699,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
693
699
|
type: Injectable,
|
|
694
700
|
args: [{ providedIn: 'root' }]
|
|
695
701
|
}], ctorParameters: () => [{ type: i1.InventoryService }, { type: i2.TabsService }, { type: i2.ModalService }, { type: i3.TranslateService }, { type: i4.Router }, { type: i2.NavigatorService }, { type: i2.Permissions }, { type: i2.AlertService }, { type: i2.DynamicComponentService }, { type: i2.GroupService }, { type: i2.OptionsService }] });
|
|
696
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1kYXNoYm9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL2NvbnRleHQtZGFzaGJvYXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQTBCLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQWUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pGLE9BQU8sRUFDTCxZQUFZLEVBR1osdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsWUFBWSxFQUNaLFlBQVksRUFDWixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixjQUFjLEVBQ2QsV0FBVyxFQUNYLE1BQU0sRUFFTixXQUFXLEVBQ1gsV0FBVyxFQUVaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsT0FBTyxFQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osTUFBTSxFQUNOLEdBQUcsRUFDSCxJQUFJLEVBQ0wsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUNMLHlCQUF5QixFQUl6QixvQkFBb0IsRUFHcEIsa0JBQWtCLEVBQ2xCLHNC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QUNOLEtBQUssR0FBRyxJQUFJLEtBQUssb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQy9ELENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ3RGLENBQUM7SUFFTyxlQUFlLENBQUMsU0FBaUQsRUFBRSxPQUFRO1FBQ2pGLElBQ0UsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUM1QixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8scUJBQXFCLENBQUMsWUFBOEI7UUFDMUQsT0FBTztZQUNMLGFBQWEsRUFBRTtnQkFDYixHQUFHLFlBQVk7Z0JBQ2YsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLElBQUkscUJBQXFCO2dCQUNoRCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsV0FBVyxFQUFFLE9BQU8sQ0FDbEIsd0ZBQXdGLENBQ3pGO2FBQ0Y7WUFDRCxDQUFDLHNCQUFzQixZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1NBQ2YsQ0FBQztJQUNyQyxDQUFDOytHQTc3QlUsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FEVixNQUFNOzs0RkFDbkIsdUJBQXVCO2tCQURuQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCwgSW52ZW50b3J5U2VydmljZSwgSVJlc3VsdExpc3QsIFF1ZXJpZXNVdGlsIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBcHBsaWNhdGlvbk9wdGlvbnMsXG4gIENvbnRleHREYXRhLFxuICBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgZ2V0QWN0aXZhdGVkUm91dGUsXG4gIGdldHRleHQsXG4gIEdyb3VwU2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLFxuICBOYXZpZ2F0b3JOb2RlLFxuICBOYXZpZ2F0b3JTZXJ2aWNlLFxuICBORVdfREFTSEJPQVJEX1FVRVJZX1BBUkFNLFxuICBPcHRpb25zU2VydmljZSxcbiAgUGVybWlzc2lvbnMsXG4gIFN0YXR1cyxcbiAgVGFiLFxuICBUYWJzU2VydmljZSxcbiAgVmlld0NvbnRleHQsXG4gIFdpZGdldFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gIGFzc2lnbixcbiAgY2xvbmVEZWVwLFxuICBmb3JFYWNoLFxuICBnZXQsXG4gIGhhcyxcbiAga2V5QnksXG4gIGtleXMsXG4gIHBpY2ssXG4gIHJlZHVjZSxcbiAgc2V0LFxuICBzb21lXG59IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCB0YXAsIHRocm93SWZFbXB0eSwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEFMTF9HTE9CQUxfUk9MRVNfU0VMRUNURUQsXG4gIEFsbG93VHlwZURhc2hib2FyZCxcbiAgQ29udGV4dERhc2hib2FyZCxcbiAgQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3QsXG4gIENvbnRleHREYXNoYm9hcmRUeXBlLFxuICBEYXNoYm9hcmRDb250ZXh0LFxuICBEYXNoYm9hcmRDb3B5Q2xpcGJvYXJkLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0UsXG4gIFNUWUxJTkdfQ0xBU1NfUFJFRklYRVNcbn0gZnJvbSAnLi9jb250ZXh0LWRhc2hib2FyZC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ29udGV4dERhc2hib2FyZFNlcnZpY2Uge1xuICBkYXNoYm9hcmRUYWJzJDogT2JzZXJ2YWJsZTxUYWJbXT47XG4gIGZvcm1EaXNhYmxlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IFJFUE9SVF9QQVJUSUFMX05BTUUgPSAncmVwb3J0Xyc7XG4gIGNvcHlDbGlwYm9hcmQ6IERhc2hib2FyZENvcHlDbGlwYm9hcmQ7XG4gIHF1ZXJpZXNVdGlsOiBRdWVyaWVzVXRpbDtcbiAgcmVhZG9ubHkgVkVSU0lPTl9ISVNUT1JZX1NJWkVfTElNSVQgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBJTlZFTlRPUllfUk9MRVMgPSBbXG4gICAgUGVybWlzc2lvbnMuUk9MRV9JTlZFTlRPUllfQURNSU4sXG4gICAgUGVybWlzc2lvbnMuUk9MRV9NQU5BR0VEX09CSkVDVF9BRE1JTlxuICBdO1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfUEFHRVNJWkUgPSAxMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZSQUdNRU5UX05BTUUgPSAnYzh5X0Rhc2hib2FyZCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFTSEJPQVJEX1JPVVRFX1BBVEggPSAnZGFzaGJvYXJkJztcbiAgcHJpdmF0ZSByZWFkb25seSBJTkRFWF9TUExJVCA9ICchJztcbiAgcHJpdmF0ZSByZWFkb25seSBDQUNIRV9USU1FT1VUID0gNTAwO1xuICBwcml2YXRlIF9mb3JtRGlzYWJsZWQgPSB0cnVlO1xuICBwcml2YXRlIGZvcm1EaXNhYmxlZFN1YmplY3QgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIGNvbnRleHREYXNoYm9hcmRzQ2FjaGU6IHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHJlc3VsdDogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+O1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IEhJREVfVFlQRV9EQVNIQk9BUkRfRk9SX0FTU0VUUzoga2V5b2YgQXBwbGljYXRpb25PcHRpb25zID1cbiAgICAnaGlkZVR5cGVEYXNoYm9hcmRGb3JBc3NldHMnO1xuXG4gIGdldCBmb3JtRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1EaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBmb3JtRGlzYWJsZWQodmFsdWUpIHtcbiAgICB0aGlzLl9mb3JtRGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmZvcm1EaXNhYmxlZFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHRhYnM6IFRhYnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIG5hdmlnYXRvcjogTmF2aWdhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucyxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50OiBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgICBwcml2YXRlIGdyb3VwU2VydmljZTogR3JvdXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZm9ybURpc2FibGVkJCA9IHRoaXMuZm9ybURpc2FibGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnF1ZXJpZXNVdGlsID0gbmV3IFF1ZXJpZXNVdGlsKCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoZGFzaGJvYXJkQ2ZnOiBDb250ZXh0RGFzaGJvYXJkLCBjb250ZXh0PzogQ29udGV4dERhdGEsIG5hbWUgPSAnJykge1xuICAgIGxldCBkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+ID0ge307XG4gICAgYXNzaWduKFxuICAgICAgZGFzaGJvYXJkLFxuICAgICAgdGhpcy5hZGp1c3REYXNoYm9hcmRGb3IyNENvbHVtbnMoeyBjOHlfRGFzaGJvYXJkOiBkYXNoYm9hcmRDZmcgfSksXG4gICAgICB0aGlzLnVwZGF0ZURhc2hib2FyZEhpc3RvcnkoZGFzaGJvYXJkLCBkYXNoYm9hcmRDZmcpXG4gICAgKTtcblxuICAgIGNvbnN0IFtkYXNoYm9hcmRUeXBlLCBkYXNoYm9hcmRGcmFnbWVudHNdID0gdGhpcy5nZXREYXNoYm9hcmRGcmFnbWVudHMoXG4gICAgICB7IGM4eV9EYXNoYm9hcmQ6IGRhc2hib2FyZENmZyB9IGFzIENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LFxuICAgICAgY29udGV4dCxcbiAgICAgIG5hbWUsXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgZGFzaGJvYXJkID0geyAuLi5kYXNoYm9hcmQsIC4uLmRhc2hib2FyZEZyYWdtZW50cyB9O1xuXG4gICAgaWYgKHRoaXMuc2hvdWxkU2V0R2xvYmFsKGRhc2hib2FyZCwgY29udGV4dCkpIHtcbiAgICAgIGFzc2lnbihkYXNoYm9hcmQsIHsgYzh5X0dsb2JhbDoge30gfSk7XG4gICAgfVxuICAgIGRhc2hib2FyZC5uYW1lID0gZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQubmFtZTtcbiAgICBjb25zdCB7IGRhdGEgfSA9XG4gICAgICBkYXNoYm9hcmRUeXBlID09PSBDb250ZXh0RGFzaGJvYXJkVHlwZS5Hcm91cCB8fFxuICAgICAgZGFzaGJvYXJkVHlwZSA9PT0gQ29udGV4dERhc2hib2FyZFR5cGUuRGV2aWNlIHx8XG4gICAgICAoY29udGV4dCAmJiBkYXNoYm9hcmRUeXBlID09PSBDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZClcbiAgICAgICAgPyBhd2FpdCB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0NyZWF0ZShcbiAgICAgICAgICAgIGRhc2hib2FyZCxcbiAgICAgICAgICAgIChjb250ZXh0Py5jb250ZXh0RGF0YS5pZCBhcyBzdHJpbmcpIHx8ICcnXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuaW52ZW50b3J5LmNyZWF0ZShkYXNoYm9hcmQpO1xuICAgIHJldHVybiBkYXRhIGFzIENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0O1xuICB9XG5cbiAgYXN5bmMgZGV0YWlsKGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCkge1xuICAgIGxldCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbChkYXNoYm9hcmRNTyk7XG4gICAgZGF0YSA9IHRoaXMuYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zKGRhdGEgYXMgQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3QpO1xuICAgIHRoaXMuY2FjaGUuc2V0KGRhc2hib2FyZE1PLmlkLCBkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbnRleHQ/OiBDb250ZXh0RGF0YVxuICApOiBQcm9taXNlPENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0PiB7XG4gICAgY29uc3QgZGFzaGJvYXJkQ2ZnID0gZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQ7XG4gICAgZGFzaGJvYXJkLm5hbWUgPSBkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZC5uYW1lO1xuICAgIGFzc2lnbihcbiAgICAgIGRhc2hib2FyZCxcbiAgICAgIHRoaXMuYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zKHsgYzh5X0Rhc2hib2FyZDogZGFzaGJvYXJkQ2ZnIH0pLFxuICAgICAgdGhpcy51cGRhdGVEYXNoYm9hcmRIaXN0b3J5KGRhc2hib2FyZCwgZGFzaGJvYXJkQ2ZnKVxuICAgICk7XG5cbiAgICBjb25zdCBrZWVwRnJhZ21lbnRzID0gdGhpcy5jbGVhbihwaWNrKGRhc2hib2FyZCwgW3RoaXMuRlJBR01FTlRfTkFNRSwgJ2lkJywgJ25hbWUnXSkpO1xuICAgIGtlZXBGcmFnbWVudHMuYzh5X0Rhc2hib2FyZEhpc3RvcnkgPSBkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZEhpc3Rvcnk7XG4gICAgYXdhaXQgdGhpcy5zZXJpYWxpemVXaWRnZXRDb25maWdzKGtlZXBGcmFnbWVudHMpO1xuXG4gICAgY29uc3QgWywgZGFzaGJvYXJkVHlwZUZyYWdtZW50c10gPSB0aGlzLmdldERhc2hib2FyZEZyYWdtZW50cyhkYXNoYm9hcmQsIGNvbnRleHQsICcnLCB0cnVlKTtcbiAgICBrZWVwRnJhZ21lbnRzLmM4eV9HbG9iYWwgPSB0aGlzLnNob3VsZFNldEdsb2JhbCh7IC4uLmRhc2hib2FyZCwgLi4uZGFzaGJvYXJkVHlwZUZyYWdtZW50cyB9KTtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LnVwZGF0ZSh7IC4uLmtlZXBGcmFnbWVudHMsIC4uLmRhc2hib2FyZFR5cGVGcmFnbWVudHMgfSk7XG4gICAgdGhpcy5jYWNoZS5zZXQoZGFzaGJvYXJkLmlkLCBkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LCB3aXRoQ29uZmlybWF0aW9uID0gdHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBpZiAod2l0aENvbmZpcm1hdGlvbikge1xuICAgICAgICBsZXQgbXNnOiBzdHJpbmcgPSBnZXR0ZXh0KFxuICAgICAgICAgIGBZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSB0aGUgZGFzaGJvYXJkIFwie3sgZGFzaGJvYXJkTmFtZSB9fVwiLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP2BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEZXZpY2VUeXBlKGRhc2hib2FyZCkpIHtcbiAgICAgICAgICBtc2cgPSBnZXR0ZXh0KFxuICAgICAgICAgICAgYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIHRoZSBkYXNoYm9hcmQgXCJ7eyBkYXNoYm9hcmROYW1lIH19XCIgZnJvbSBhbGwgZGV2aWNlcyBvZiB0aGUgdHlwZSBcInt7IGRldmljZVR5cGUgfX1cIi5cbiAgICAgICAgICAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD9gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLm1vZGFsLmNvbmZpcm0oXG4gICAgICAgICAgZ2V0dGV4dCgnRGVsZXRlIGRhc2hib2FyZCcpLFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KG1zZywge1xuICAgICAgICAgICAgZGFzaGJvYXJkTmFtZTogZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQubmFtZSxcbiAgICAgICAgICAgIGRldmljZVR5cGU6IGRhc2hib2FyZC5jOHlfRGFzaGJvYXJkLmRldmljZVR5cGVWYWx1ZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIFN0YXR1cy5EQU5HRVIsXG4gICAgICAgICAgeyBvazogZ2V0dGV4dCgnRGVsZXRlJyksIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJykgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnkuZGVsZXRlKGRhc2hib2FyZCk7XG4gICAgICBjb25zdCB0YWJUb1JlbW92ZSA9IEFycmF5LmZyb20odGhpcy50YWJzLnN0YXRlKS5maW5kKHRhYiA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFiLnBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHRhYi5wYXRoLmVuZHNXaXRoKGAke3RoaXMuREFTSEJPQVJEX1JPVVRFX1BBVEh9LyR7ZGFzaGJvYXJkLmlkfWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFicy5yZW1vdmUodGFiVG9SZW1vdmUpO1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnRhYnMucmVmcmVzaCgpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGludGVuZGVkIGVtcHR5XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRGFzaGJvYXJkSGlzdG9yeShcbiAgICBkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+LFxuICAgIGRhc2hib2FyZENmZzogQ29udGV4dERhc2hib2FyZFxuICApOiBQYXJ0aWFsPENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0PiB7XG4gICAgaWYgKCFkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZEhpc3RvcnkpIHtcbiAgICAgIGRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWRhc2hib2FyZENmZy5oaXN0b3J5RGVzY3JpcHRpb24pIHtcbiAgICAgIGRhc2hib2FyZENmZy5oaXN0b3J5RGVzY3JpcHRpb24gPSB7IGNoYW5nZVR5cGU6ICdjcmVhdGUnIH07XG4gICAgfVxuXG4gICAgZGFzaGJvYXJkQ2ZnLmNyZWF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmRIaXN0b3J5ID0gY2xvbmVEZWVwKFtkYXNoYm9hcmRDZmcsIC4uLmRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeV0pO1xuXG4gICAgaWYgKGRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeS5sZW5ndGggPiB0aGlzLlZFUlNJT05fSElTVE9SWV9TSVpFX0xJTUlUKSB7XG4gICAgICBkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZEhpc3RvcnkgPSBbXG4gICAgICAgIC4uLmRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeS5zbGljZSgwLCB0aGlzLlZFUlNJT05fSElTVE9SWV9TSVpFX0xJTUlUKVxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGFzaGJvYXJkO1xuICB9XG5cbiAgYWN0aXZhdGVEYXNoYm9hcmRzKFxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICAgIHR5cGVzOiBDb250ZXh0RGFzaGJvYXJkVHlwZVtdXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFRhYltdPiB7XG4gICAgY29uc3QgeyBkYXNoYm9hcmRJZCB9ID0gcm91dGUucGFyYW1zO1xuICAgIGlmIChkYXNoYm9hcmRJZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGFzaGJvYXJkJChkYXNoYm9hcmRJZCwgdHlwZXMsIHJvdXRlLnBhcmVudC5kYXRhLmNvbnRleHREYXRhKS5waXBlKFxuICAgICAgICB0YXAoZGFzaGJvYXJkID0+IHtcbiAgICAgICAgICByb3V0ZS5kYXRhID0geyBkYXNoYm9hcmQgfTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXNoYm9hcmRUYWJzJCA9IHRoaXMuZ2V0VGFicyQoXG4gICAgICByb3V0ZS5kYXRhLmNvbnRleHREYXRhLFxuICAgICAgdHlwZXMsXG4gICAgICByb3V0ZT8ucGFyZW50Py5kYXRhIGFzIENvbnRleHREYXRhXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmRUYWJzJDtcbiAgfVxuXG4gIGdldE5hbWVkRGFzaGJvYXJkT3JDcmVhdGUobmFtZTogc3RyaW5nLCBkZWZhdWx0V2lkZ2V0czogV2lkZ2V0W10sIGNvbnRleHQ/OiBDb250ZXh0RGF0YSkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5tYXBXaWRnZXRzKGRlZmF1bHRXaWRnZXRzKTtcbiAgICByZXR1cm4gdGhpcy5nZXREYXNoYm9hcmQkKG5hbWUsIFtDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZF0pLnBpcGUoXG4gICAgICB0aHJvd0lmRW1wdHkoKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUGVybWlzc2lvbnNUb0NvcHlEYXNoYm9hcmQoKSkge1xuICAgICAgICAgIHRoaXMuYWxlcnQud2FybmluZyhcbiAgICAgICAgICAgIGdldHRleHQoXG4gICAgICAgICAgICAgICdZb3UgYXJlIHZpZXdpbmcgYSByZWFkLW9ubHkgZGFzaGJvYXJkIGJlY2F1c2UgeW91IGRvbuKAmXQgaGF2ZSB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIHRvIG1vZGlmeSBpdC4nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gb2YoXG4gICAgICAgICAgICB0aGlzLmdldFRlbXBvcmFyeURhc2hib2FyZCh7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICB3aWRnZXRDbGFzc2VzOiB7ICdkYXNoYm9hcmQtdGhlbWUtbGlnaHQnOiB0cnVlLCAncGFuZWwtdGl0bGUtcmVndWxhcic6IHRydWUgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgd2lkZ2V0Q2xhc3NlczogeyAnZGFzaGJvYXJkLXRoZW1lLWxpZ2h0JzogdHJ1ZSwgJ3BhbmVsLXRpdGxlLXJlZ3VsYXInOiB0cnVlIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1cGRhdGVOYXZpZ2F0b3JJdGVtKG1vOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHRoaXMubmF2aWdhdG9yLnN0YXRlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS5wYXRoID09PSBgcmVwb3J0cy8ke21vLmlkfWApIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3IucmVtb3ZlKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChtby5jOHlfSXNOYXZpZ2F0b3JOb2RlKSB7XG4gICAgICBjb25zdCBub2RlVG9BZGQgPSBuZXcgTmF2aWdhdG9yTm9kZSh7XG4gICAgICAgIGxhYmVsOiBtby5uYW1lLFxuICAgICAgICBwYXRoOiBgcmVwb3J0cy8ke21vLmlkfWAsXG4gICAgICAgIGljb246IG1vLmljb24sXG4gICAgICAgIHByaW9yaXR5OiBtby5wcmlvcml0eVxuICAgICAgfSk7XG4gICAgICB0aGlzLm5hdmlnYXRvci5hZGQobm9kZVRvQWRkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvRGFzaGJvYXJkKGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCkge1xuICAgIGlmICgvZGFzaGJvYXJkLy50ZXN0KHRoaXMucm91dGVyLnVybCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4nLCBkYXNoYm9hcmRNTy5pZF0sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogZ2V0QWN0aXZhdGVkUm91dGUodGhpcy5yb3V0ZXIpLFxuICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgIFtORVdfREFTSEJPQVJEX1FVRVJZX1BBUkFNXTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKC9eXFwvKGRldmljZXxncm91cClcXC9bMC05XSskLy50ZXN0KHRoaXMucm91dGVyLnVybCkpIHtcbiAgICAgIC8vIGluIGNhc2UgdGhlIGFkZCBkYXNoYm9hcmQgYnV0dG9uIGlzIHRoZSBvbmx5IHRhYiBvbiB0aGF0IHJvdXRlXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nLCB0aGlzLkRBU0hCT0FSRF9ST1VURV9QQVRILCBkYXNoYm9hcmRNTy5pZF0sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogZ2V0QWN0aXZhdGVkUm91dGUodGhpcy5yb3V0ZXIpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLicsIHRoaXMuREFTSEJPQVJEX1JPVVRFX1BBVEgsIGRhc2hib2FyZE1PLmlkXSwge1xuICAgICAgICByZWxhdGl2ZVRvOiBnZXRBY3RpdmF0ZWRSb3V0ZSh0aGlzLnJvdXRlcilcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdXNlciBpcyBhYmxlIHRvIGVkaXQgZGFzaGJvYXJkIGFjY29yZGluZyB0byBoaXMgcm9sZXMgYW5kIGRhc2hib2FyZCBvd25lcnNoaXAuXG4gICAqXG4gICAqIEBwYXJhbSBtbyAtIERhc2hib2FyZCBtYW5hZ2VkIG9iamVjdC5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB1c2VyIGlzIGFibGUgdG8gZWRpdCBkYXNoYm9hcmQsIGZhbHNlIGlmIGhlIGNhbm5vdC5cbiAgICovXG4gIGFzeW5jIGNhbkVkaXREYXNoYm9hcmQobW86IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucGVybWlzc2lvbnMuY2FuRWRpdCh0aGlzLklOVkVOVE9SWV9ST0xFUywgbW8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB1c2VyIGhhcyBwZXJtaXNzaW9ucyB0byBjb3B5IGRhc2hib2FyZCBhY2NvcmRpbmcgdG8gaGlzIHJvbGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHVzZXIgaGFzIHBlcm1pc3Npb25zIHRvIGNvcHkgZGFzaGJvYXJkLCBmYWxzZSBpZiBoZSBjYW5ub3QuXG4gICAqL1xuICBoYXNQZXJtaXNzaW9uc1RvQ29weURhc2hib2FyZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5oYXNBbnlSb2xlKFtcbiAgICAgIFBlcm1pc3Npb25zLlJPTEVfSU5WRU5UT1JZX0FETUlOLFxuICAgICAgUGVybWlzc2lvbnMuUk9MRV9JTlZFTlRPUllfQ1JFQVRFLFxuICAgICAgUGVybWlzc2lvbnMuUk9MRV9NQU5BR0VEX09CSkVDVF9BRE1JTixcbiAgICAgIFBlcm1pc3Npb25zLlJPTEVfTUFOQUdFRF9PQkpFQ1RfQ1JFQVRFXG4gICAgXSk7XG4gIH1cblxuICBpc05hbWVkKGRhc2hib2FyZDogUGFydGlhbDxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4pIHtcbiAgICByZXR1cm4gc29tZShrZXlzKGRhc2hib2FyZCksIHByb3AgPT5cbiAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgIGBeJHt0aGlzLkZSQUdNRU5UX05BTUV9JHt0aGlzLklOREVYX1NQTElUfSR7Q29udGV4dERhc2hib2FyZFR5cGUuTmFtZWR9JHt0aGlzLklOREVYX1NQTElUfWBcbiAgICAgICkudGVzdChwcm9wKVxuICAgICk7XG4gIH1cblxuICBpc1JlcG9ydChkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+KSB7XG4gICAgcmV0dXJuIHNvbWUoa2V5cyhkYXNoYm9hcmQpLCBwcm9wID0+XG4gICAgICBuZXcgUmVnRXhwKFxuICAgICAgICBgXiR7dGhpcy5GUkFHTUVOVF9OQU1FfSR7dGhpcy5JTkRFWF9TUExJVH0ke0NvbnRleHREYXNoYm9hcmRUeXBlLk5hbWVkfSR7dGhpcy5JTkRFWF9TUExJVH0ke3RoaXMuUkVQT1JUX1BBUlRJQUxfTkFNRX1gXG4gICAgICApLnRlc3QocHJvcClcbiAgICApO1xuICB9XG5cbiAgaXNEZXZpY2VUeXBlKGRhc2hib2FyZDogUGFydGlhbDxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4pIHtcbiAgICByZXR1cm4gc29tZShrZXlzKGRhc2hib2FyZCksIHByb3AgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdQcm9wID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYF4ke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5UeXBlfSR7dGhpcy5JTkRFWF9TUExJVH1gXG4gICAgICApLnRlc3QocHJvcCk7XG4gICAgICBpZiAoIW1hdGNoaW5nUHJvcCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBtYXRjaGluZyBrZXksIGJ1dCBpdHMgdmFsdWUgY2FuIGJlIHt9IG9yIG51bGxcbiAgICAgICAgcmV0dXJuICEhZGFzaGJvYXJkW3Byb3BdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaXNEZXZpY2VEYXNoYm9hcmQoZGFzaGJvYXJkOiBQYXJ0aWFsPENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb21lKGtleXMoZGFzaGJvYXJkKSwgcHJvcCA9PlxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgYF4ke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5EZXZpY2V9JHt0aGlzLklOREVYX1NQTElUfWBcbiAgICAgICkudGVzdChwcm9wKVxuICAgICk7XG4gIH1cblxuICBpc0dyb3VwRGFzaGJvYXJkKGRhc2hib2FyZDogUGFydGlhbDxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc29tZShrZXlzKGRhc2hib2FyZCksIHByb3AgPT5cbiAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgIGBeJHt0aGlzLkZSQUdNRU5UX05BTUV9JHt0aGlzLklOREVYX1NQTElUfSR7Q29udGV4dERhc2hib2FyZFR5cGUuR3JvdXB9JHt0aGlzLklOREVYX1NQTElUfWBcbiAgICAgICkudGVzdChwcm9wKVxuICAgICk7XG4gIH1cblxuICBnZXRGaWx0ZXJlZERhc2hib2FyZFN0eWxlcyhzdHlsZUxpc3Q6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHN0eWxlTGlzdC5maWx0ZXIoYyA9PlxuICAgICAgU1RZTElOR19DTEFTU19QUkVGSVhFUy5zb21lKGNsYXNzUHJlZml4ID0+IGMuc3RhcnRzV2l0aChjbGFzc1ByZWZpeCkpXG4gICAgKTtcbiAgfVxuXG4gIGdldFN0eWxpbmcoc3R5bGVMaXN0LCBzdHlsZU5hbWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IHN0eWxpbmcgPSBzdHlsZUxpc3QuZmluZChcbiAgICAgIHN0eWxlID0+IHN0eWxlICYmIG5ldyBSZWdFeHAoYC0ke3N0eWxlTmFtZX0kYCwgJ2knKS50ZXN0KHN0eWxlLmNsYXNzKVxuICAgICk7XG4gICAgcmV0dXJuIHN0eWxpbmcgPyBzdHlsaW5nLmNsYXNzIDogZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgbWFwV2lkZ2V0cyh3aWRnZXRzOiBXaWRnZXRbXSkge1xuICAgIHJldHVybiBrZXlCeShcbiAgICAgIHdpZGdldHMubWFwKHdpZGdldCA9PiB7XG4gICAgICAgIHdpZGdldC5pZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zdWJzdHIoMik7XG4gICAgICAgIHJldHVybiB3aWRnZXQ7XG4gICAgICB9KSxcbiAgICAgICdpZCdcbiAgICApO1xuICB9XG5cbiAgZ2V0RGFzaGJvYXJkJChkYXNoYm9hcmRJZE9yTmFtZSwgZGFzaGJvYXJkVHlwZTogQ29udGV4dERhc2hib2FyZFR5cGVbXSwgbW8/OiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXQoZGFzaGJvYXJkSWRPck5hbWUpO1xuXG4gICAgY29uc3QgZGFzaGJvYXJkcyA9IG1vXG4gICAgICA/IHRoaXMuZ2V0Q29udGV4dERhc2hib2FyZHMobW8sIGRhc2hib2FyZFR5cGUpXG4gICAgICA6IHRoaXMuZ2V0TmFtZWREYXNoYm9hcmQoZGFzaGJvYXJkSWRPck5hbWUpO1xuXG4gICAgY29uc3QgY2FjaGVSZWZyZXNoID0gdGhpcy5nZXRDb250ZXh0RGFzaGJvYXJkcyQoZGFzaGJvYXJkcykucGlwZShcbiAgICAgIHRhcChkYXNoYm9hcmQgPT4gdGhpcy5jYWNoZURhc2hib2FyZChkYXNoYm9hcmQpKSxcbiAgICAgIGZpbHRlcihcbiAgICAgICAgZGFzaGJvYXJkID0+XG4gICAgICAgICAgZGFzaGJvYXJkLmlkID09PSBkYXNoYm9hcmRJZE9yTmFtZSB8fFxuICAgICAgICAgIGhhcyhcbiAgICAgICAgICAgIGRhc2hib2FyZCxcbiAgICAgICAgICAgIGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZH0ke3RoaXMuSU5ERVhfU1BMSVR9JHtkYXNoYm9hcmRJZE9yTmFtZX1gXG4gICAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNhY2hlID8gb2YoY2FjaGUpIDogY2FjaGVSZWZyZXNoO1xuICB9XG5cbiAgYXN5bmMgcGFzdGVEYXNoYm9hcmQobmV3Q29udGV4dDogRGFzaGJvYXJkQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvcHlDbGlwYm9hcmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZFRvUGFzdGUgPSB0aGlzLmNyZWF0ZUNvbnRleHREYXNoYm9hcmRDb3B5KFxuICAgICAgICAgIHRoaXMuY29weUNsaXBib2FyZC5kYXNoYm9hcmQsXG4gICAgICAgICAgbmV3Q29udGV4dC5jb250ZXh0RGF0YSxcbiAgICAgICAgICB0aGlzLmNvcHlDbGlwYm9hcmQuY29udGV4dC5jb250ZXh0RGF0YVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkYXNoYm9hcmQgPSBhd2FpdCB0aGlzLmNyZWF0ZSh0aGlzLmNsZWFuKGRhc2hib2FyZFRvUGFzdGUpLCBuZXdDb250ZXh0KTtcblxuICAgICAgICAvLyBsaW5raW5nIGNoaWxkQWRkaXRpb25zIGZvciBlLmcuIHRvIGdyYW50IGFjY2VzcyB0byB0aGUgaW1hZ2VzIHVwbG9hZGVkIGJ5IHRoZSBpbWFnZSB3aWRnZXQgZm9yIHVzZXJzIHdpdGggb25seSBpbnZlbnRvcnkgcm9sZXMuXG4gICAgICAgIGNvbnN0IHsgZGF0YTogY2hpbGRBZGRpdGlvbnMgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LmNoaWxkQWRkaXRpb25zTGlzdChcbiAgICAgICAgICB0aGlzLmNvcHlDbGlwYm9hcmQuZGFzaGJvYXJkSWQsXG4gICAgICAgICAgeyBwYWdlU2l6ZTogMjAwMCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChjaGlsZEFkZGl0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0J1bGtBZGQoY2hpbGRBZGRpdGlvbnMsIGRhc2hib2FyZC5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvcHlDbGlwYm9hcmQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb0Rhc2hib2FyZChkYXNoYm9hcmQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMuYWxlcnQud2FybmluZyhnZXR0ZXh0KCdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgZm9yIHRoaXMgYWN0aW9uLicpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBmcmFnbWVudCB0aGF0IGFzc29jaWF0ZXMgZGFzaGJvYXJkcyB3aXRoIGRldmljZS9hc3NldC4gSXQgY29uc2lzdHMgb2YgdGhyZWUgZWxlbWVudHM6XG4gICAqIC0gRlJBR01FTlRfTkFNRSAtIHN0YXRpYyBzdHJpbmdcbiAgICogLSBkYXNoYm9hcmQgdHlwZSAoZS5nLiAnZ3JvdXAnLCAnZGV2aWNlJylcbiAgICogLSBmcmFnbWVudCB2YWx1ZSAoIGlkIG9mIGRldmljZS9hc3NldCBpZiBpdCBpcyBub3QgdHlwZWQgZGFzaGJvYXJkOyBkZXZpY2VUeXBlVmFsdWUgcHJvcGVydHkgb2YgZGFzaGJvYXJkIGlmIGl0IGlzIHR5cGUgZGFzaGJvYXJkKVxuICAgKiBFeGFtcGxlIGZyYWdtZW50IGZvciBkZXZpY2UgZGFzaGJvYXJkOiAnYzh5X0Rhc2hib2FyZCFkZXZpY2UhNzczMjAwJ1xuICAgKiBFeGFtcGxlIGZyYWdtZW50IGZvciBncm91cCBkYXNoYm9hcmQ6ICdjOHlfRGFzaGJvYXJkIWdyb3VwITg0MTI5MjA4J1xuICAgKiBFeGFtcGxlIGZyYWdtZW50IGZvciB0eXBlZCBkZXZpY2UgZGFzaGJvYXJkOiAnYzh5X0Rhc2hib2FyZCF0eXBlIWM4eV9sd20ybV9jb25uZWN0b3JfZGV2aWNlJ1xuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dERhc2hib2FyZFR5cGUgVHlwZSBvZiBkYXNoYm9hcmRcbiAgICogQHBhcmFtIHZhbHVlIEZyYWdtZW50IHZhbHVlXG4gICAqIEByZXR1cm5zIEZyYWdtZW50IGZvciBkYXNoYm9hcmRcbiAgICovXG4gIGNyZWF0ZUZyYWdtZW50S2V5PFQgZXh0ZW5kcyBDb250ZXh0RGFzaGJvYXJkVHlwZSwgViBleHRlbmRzIHN0cmluZz4oXG4gICAgY29udGV4dERhc2hib2FyZFR5cGU6IFQsXG4gICAgdmFsdWU6IFZcbiAgKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtjb250ZXh0RGFzaGJvYXJkVHlwZX0ke3RoaXMuSU5ERVhfU1BMSVR9JHt2YWx1ZX1gIGFzIGNvbnN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBkYXNoYm9hcmQgY2FuIGJlIHNldCB0byB0eXBlIGRhc2hib2FyZC5cbiAgICogRmlyc3QsIGl0IGNoZWNrcyBpZiBkZXZpY2VUeXBlVmFsdWUgZXhpc3RzIGFuZCBpZiB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNldCBkYXNoYm9hcmQgdHlwZS5cbiAgICogVGhlbiwgY2FzZSBmcm9tIHNlbnNvciBhcHAgaXMgY2hlY2tlZC0gZGFzaGJvYXJkIGNyZWF0ZWQgd2l0aCBzZW5zb3IgYXBwIGhhcyBkZXZpY2VUeXBlIHNldCB0byB0cnVlIGJ1dFxuICAgKiB0eXBlIGZyYWdtZW50IGlzIG1pc3NpbmctIHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgY29tYmluYXRpb24uXG4gICAqIEBwYXJhbSBtbyBEYXNoYm9hcmQgbWFuYWdlZCBvYmplY3RcbiAgICogQHBhcmFtIGNvbnRleHQge0NvbnRleHREYXRhfSBDdXJyZW50IGNvbnRleHRcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBkYXNoYm9hcmQgY2FuIGJlIHNldCB0byB0eXBlIGRhc2hib2FyZCwgZmFsc2UgaWYgaXQgaXMgZm9yYmlkZGVuLlxuICAgKi9cbiAgc2hvdWxkQWxsb3dUb1NldERhc2hib2FyZFR5cGUoXG4gICAgbW86IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbnRleHQ6IENvbnRleHREYXRhXG4gICk6IEFsbG93VHlwZURhc2hib2FyZCB7XG4gICAgLy8gZGlzYWxsb3cgaWYgZGFzaGJvYXJkIG1hbmFnZWQgb2JqZWN0IG9yIGNvbnRleHQgaXMgbWlzc2luZyBvciBjb250ZXh0IGlzIG5vdCBkZXZpY2UvYXNzZXQvZ3JvdXBcbiAgICBpZiAoXG4gICAgICAhbW8gfHxcbiAgICAgICFjb250ZXh0Py5jb250ZXh0RGF0YSB8fFxuICAgICAgKGNvbnRleHQuY29udGV4dCAhPT0gVmlld0NvbnRleHQuRGV2aWNlICYmIGNvbnRleHQuY29udGV4dCAhPT0gVmlld0NvbnRleHQuR3JvdXApXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FsbG93JztcbiAgICB9XG5cbiAgICAvLyBpZiBjb250ZXh0IGlzIGFzc2V0L2dyb3VwIGFuZCB0eXBlIGRhc2hib2FyZCBmZWF0dXJlIGlzIGhpZGRlbiBmb3IgYXNzZXRzL2dyb3VwcyBvciBhc3NldC9ncm91cCBoYXMgbm8gdHlwLCByZXR1cm4gZGlzYWxsb3dcbiAgICBjb25zdCB0eXBlRGFzaGJvYXJkSGlkZGVuRm9yQXNzZXRzID0gdGhpcy5vcHRpb25zU2VydmljZS5nZXQoXG4gICAgICB0aGlzLkhJREVfVFlQRV9EQVNIQk9BUkRfRk9SX0FTU0VUUyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGlmIChcbiAgICAgIGNvbnRleHQuY29udGV4dCA9PT0gVmlld0NvbnRleHQuR3JvdXAgJiZcbiAgICAgICh0eXBlRGFzaGJvYXJkSGlkZGVuRm9yQXNzZXRzIHx8ICFjb250ZXh0LmNvbnRleHREYXRhLnR5cGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FsbG93JztcbiAgICB9XG5cbiAgICAvLyBpZiB1c2VyIGhhcyBubyBwZXJtaXNzaW9uIHRvIGNoYW5nZSBkYXNoYm9hcmQsIHJldHVybiBkaXNhbGxvd1xuICAgIGlmICghdGhpcy5wZXJtaXNzaW9ucy5oYXNBbnlSb2xlKHRoaXMuSU5WRU5UT1JZX1JPTEVTKSkge1xuICAgICAgcmV0dXJuICdkaXNhbGxvdyc7XG4gICAgfVxuXG4gICAgLy8gY2FzZSBmcm9tIHNlbnNvciBhcHAgaXMgY2hlY2tlZC0gZGFzaGJvYXJkIGNyZWF0ZWQgd2l0aCBzZW5zb3IgYXBwIGhhcyBkZXZpY2VUeXBlIHNldCB0byB0cnVlIGJ1dFxuICAgIC8vIHR5cGUgZnJhZ21lbnQgaXMgbWlzc2luZy0gd2UgZG8gbm90IHN1cHBvcnQgdGhpcyBjb21iaW5hdGlvbi5cbiAgICBjb25zdCB0eXBlRnJhZ21lbnQgPSB0aGlzLmNyZWF0ZUZyYWdtZW50S2V5KFxuICAgICAgQ29udGV4dERhc2hib2FyZFR5cGUuVHlwZSxcbiAgICAgIGNvbnRleHQ/LmNvbnRleHREYXRhPy50eXBlXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICBtbz8uYzh5X0Rhc2hib2FyZCAmJlxuICAgICAgbW8/LmM4eV9EYXNoYm9hcmQuZGV2aWNlVHlwZSAmJlxuICAgICAgY29udGV4dD8uY29udGV4dERhdGE/LnR5cGUgJiZcbiAgICAgICFtb1t0eXBlRnJhZ21lbnRdXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FsbG93JztcbiAgICB9XG5cbiAgICAvLyBpZiB2aWV3IGNvbnRleHQgaXMgRGV2aWNlIGFuZCBjb250ZXh0RGF0YSBvZiB0aGlzIGRldmljZSBoYXMgbm8gdHlwZSB5ZXQgYnV0IHR5cGUgZGFzaGJvYXJkIGNhbiBiZSBzZXQgd2hlbiB0eXBlIGlzIGZpbGxlZCxcbiAgICAvLyByZXR1cm4gYWxsb3dfaWZfdHlwZV9maWxsZWRcbiAgICBpZiAoXG4gICAgICAhY29udGV4dD8uY29udGV4dERhdGE/LnR5cGUgJiZcbiAgICAgIGNvbnRleHQuY29udGV4dCA9PT0gVmlld0NvbnRleHQuRGV2aWNlICYmXG4gICAgICB0aGlzLnBlcm1pc3Npb25zLmhhc0FueVJvbGUodGhpcy5JTlZFTlRPUllfUk9MRVMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2FsbG93X2lmX3R5cGVfZmlsbGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ2FsbG93JztcbiAgfVxuXG4gIGNyZWF0ZVJlcG9ydChyZXBvcnRDZmc6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+KSB7XG4gICAgY29uc3QgcmVwb3J0OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PiA9IHt9O1xuICAgIE9iamVjdC5hc3NpZ24ocmVwb3J0LCByZXBvcnRDZmcpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVwb3J0LCB7IGM4eV9SZXBvcnQ6IHt9IH0pO1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5jcmVhdGUocmVwb3J0KTtcbiAgfVxuXG4gIGFkZFJlcG9ydE5hdmlnYXRvck5vZGUocmVwb3J0OiBJTWFuYWdlZE9iamVjdCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGUgPSBuZXcgTmF2aWdhdG9yTm9kZSh7XG4gICAgICBsYWJlbDogcmVwb3J0Lm5hbWUsXG4gICAgICBwYXRoOiBgcmVwb3J0cy8ke3JlcG9ydC5pZH1gLFxuICAgICAgaWNvbjogcmVwb3J0Lmljb24sXG4gICAgICBwcmlvcml0eTogcmVwb3J0LnByaW9yaXR5XG4gICAgfSk7XG4gICAgdGhpcy5uYXZpZ2F0b3IuYWRkKG5vZGUpO1xuICB9XG5cbiAgZ2V0Q29udGV4dEZvckdTKG1vOiBJTWFuYWdlZE9iamVjdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmdyb3VwU2VydmljZS5pc0RldmljZShtbykpIHtcbiAgICAgIHJldHVybiBQUk9EVUNUX0VYUEVSSUVOQ0UuREFTSEJPQVJELkNPTlRFWFQuREVWSUNFO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncm91cFNlcnZpY2UuaXNBc3NldChtbykpIHtcbiAgICAgIHJldHVybiBQUk9EVUNUX0VYUEVSSUVOQ0UuREFTSEJPQVJELkNPTlRFWFQuQVNTRVQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLmdyb3VwU2VydmljZS5pc0dyb3VwKG1vKSkge1xuICAgICAgcmV0dXJuIFBST0RVQ1RfRVhQRVJJRU5DRS5EQVNIQk9BUkQuQ09OVEVYVC5HUk9VUDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q29udGV4dERhc2hib2FyZHMoXG4gICAgbW86IElNYW5hZ2VkT2JqZWN0LFxuICAgIGRhc2hib2FyZFR5cGU6IENvbnRleHREYXNoYm9hcmRUeXBlW11cbiAgKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBmaWx0ZXJDcml0ZXJpYSA9IGRhc2hib2FyZFR5cGUubWFwKHQgPT4gKHtcbiAgICAgIC8vIGl0J3MgbmVjZXNzYXJ5IHRvIHdyYXAgZnJhZ21lbnQgaW4gcXVvdGVzIGJlY2F1c2UgZGFzaGJvYXJkIHR5cGUgY2FuIGNvbnRhaW4gc3BhY2VzXG4gICAgICBfX2hhczogYCcke3RoaXMuY3JlYXRlRGFzaGJvYXJkRnJhZ21lbnQobW8sIHQpfSdgXG4gICAgfSkpO1xuXG4gICAgLy8gdGhlIGhhcyBxdWVyeSBhYm92ZSBkb2VzIG5vdCB3b3JrIGZvciBkZXZpY2UgdHlwZSBkYXNoYm9hcmRzIHdoZXJlIHRoZSB0eXBlIGNvbnRhaW5zIGEgZG90XG4gICAgY29uc3QgdHlwZUZpbHRlckNyaXRlcmlhID1cbiAgICAgIGRhc2hib2FyZFR5cGUuaW5jbHVkZXMoQ29udGV4dERhc2hib2FyZFR5cGUuVHlwZSkgJiYgbW8udHlwZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIF9fYW5kOiBbXG4gICAgICAgICAgICAgIHsgJ2M4eV9EYXNoYm9hcmQuZGV2aWNlVHlwZSc6IHsgX19lcTogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAgIHsgJ2M4eV9EYXNoYm9hcmQuZGV2aWNlVHlwZVZhbHVlJzogeyBfX2VxOiBtby50eXBlIH0gfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmluYWxGaWx0ZXJDcml0ZXJpYSA9IHR5cGVGaWx0ZXJDcml0ZXJpYVxuICAgICAgPyBbLi4uZmlsdGVyQ3JpdGVyaWEsIHR5cGVGaWx0ZXJDcml0ZXJpYV1cbiAgICAgIDogZmlsdGVyQ3JpdGVyaWE7XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYnVpbGRRdWVyeSh7IF9fZmlsdGVyOiB7IF9fb3I6IGZpbmFsRmlsdGVyQ3JpdGVyaWEgfSB9KTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGNhY2hlSGFzVmFsaWRSZXNwb25zZSA9XG4gICAgICB0aGlzLmNvbnRleHREYXNoYm9hcmRzQ2FjaGUgJiZcbiAgICAgIHRoaXMuY29udGV4dERhc2hib2FyZHNDYWNoZS5xdWVyeSA9PT0gcXVlcnkgJiZcbiAgICAgIG5vdyAtIHRoaXMuY29udGV4dERhc2hib2FyZHNDYWNoZS50aW1lc3RhbXAgPCB0aGlzLkNBQ0hFX1RJTUVPVVQ7XG5cbiAgICBpZiAoY2FjaGVIYXNWYWxpZFJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0RGFzaGJvYXJkc0NhY2hlLnJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0RGFzaGJvYXJkc0NhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHREYXNoYm9hcmRzQ2FjaGUgPSB7XG4gICAgICBxdWVyeSxcbiAgICAgIHJlc3VsdDogdGhpcy5pbnZlbnRvcnkubGlzdCh7IHF1ZXJ5LCBwYWdlU2l6ZTogdGhpcy5ERUZBVUxUX1BBR0VTSVpFIH0pLFxuICAgICAgdGltZXN0YW1wOiBub3dcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvbnRleHREYXNoYm9hcmRzQ2FjaGUucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0dXBsZSBkZXNjcmliaW5nIHRoZSBkYXNoYm9hcmQgdHlwZSBhbmQgaXRzIGZyYWdtZW50cy4gRm9yIGFzc2V0cyBsaWtlIGRldmljZXMgYW5kIGdyb3VwcywgaXQncyBwb3NzaWJsZVxuICAgKiB0byBoYXZlIHR3byBmcmFnbWVudHM6IG9uZSBpbmRpY2F0aW5nIHRoaXMgcGFydGljdWxhciBkZXZpY2UvYXNzZXQgd2l0aCBpdHMgSUQsIGFuZCB0aGUgc2Vjb25kIGluZGljYXRpbmdcbiAgICogdGhlIGRldmljZS9hc3NldCB0eXBlIChpZiB0aGUgZGFzaGJvYXJkIGlzIG1lYW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGFzc2V0cyBvZiB0aGlzIHR5cGUpLlxuICAgKlxuICAgKiBAcGFyYW0gZGFzaGJvYXJkTU8gLSBEYXNoYm9hcmQgbWFuYWdlZCBvYmplY3QuXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gQ29udGV4dCBkYXRhIG9mIGFzc2V0LlxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGRhc2hib2FyZC5cbiAgICogQHBhcmFtIGlzRWRpdCAtIFRydWUgaWYgZXhpc3RpbmcgZGFzaGJvYXJkIGlzIHVwZGF0ZWQsIGZhbHNlIHdoZW4gaXQncyBjcmVhdGlvbiBvZiBuZXcgZGFzaGJvYXJkLlxuICAgKiBAcmV0dXJucyBUdXBsZSBvZiBkYXNoYm9hcmQgdHlwZSBhbmQgb2JqZWN0IGNvbnRhaW5pbmcgZGFzaGJvYXJkIGZyYWdtZW50cy5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGFzaGJvYXJkRnJhZ21lbnRzKFxuICAgIGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCxcbiAgICBjb250ZXh0OiBDb250ZXh0RGF0YSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaXNFZGl0OiBib29sZWFuXG4gICk6IFtDb250ZXh0RGFzaGJvYXJkVHlwZSwgUmVjb3JkPHN0cmluZywgb2JqZWN0Pl0ge1xuICAgIGxldCBkYXNoYm9hcmRUeXBlOiBDb250ZXh0RGFzaGJvYXJkVHlwZTtcbiAgICBjb25zdCBpZCA9IChjb250ZXh0Py5jb250ZXh0RGF0YT8uaWQgYXMgc3RyaW5nKSB8fCAnJztcbiAgICBjb25zdCBmcmFnbWVudHM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4gPSB7fTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICAvLyBhIG5hbWVkIGRhc2hib2FyZCBzaG91bGQgbm90IHJlY2VpdmUgYW55IG90aGVyIGZyYWdtZW50c1xuICAgICAgZGFzaGJvYXJkVHlwZSA9IENvbnRleHREYXNoYm9hcmRUeXBlLk5hbWVkO1xuICAgICAgY29uc3QgbmFtZWRGcmFnbWVudEtleSA9IHRoaXMuY3JlYXRlRnJhZ21lbnRLZXkoQ29udGV4dERhc2hib2FyZFR5cGUuTmFtZWQsIG5hbWUpO1xuICAgICAgZnJhZ21lbnRzW25hbWVkRnJhZ21lbnRLZXldID0ge307XG4gICAgfSBlbHNlIGlmIChjb250ZXh0Py5jb250ZXh0ID09PSBWaWV3Q29udGV4dC5EZXZpY2UgfHwgY29udGV4dD8uY29udGV4dCA9PT0gVmlld0NvbnRleHQuR3JvdXApIHtcbiAgICAgIC8vIGdldCBiYXNlIHR5cGUgZm9yIGRldmljZSBvciBncm91cFxuICAgICAgY29uc3QgZGVmYXVsdFR5cGUgPVxuICAgICAgICBjb250ZXh0LmNvbnRleHQgPT09IFZpZXdDb250ZXh0LkRldmljZVxuICAgICAgICAgID8gQ29udGV4dERhc2hib2FyZFR5cGUuRGV2aWNlXG4gICAgICAgICAgOiBDb250ZXh0RGFzaGJvYXJkVHlwZS5Hcm91cDtcbiAgICAgIGRhc2hib2FyZFR5cGUgPSBkYXNoYm9hcmRNTy5jOHlfRGFzaGJvYXJkLmRldmljZVR5cGVcbiAgICAgICAgPyBDb250ZXh0RGFzaGJvYXJkVHlwZS5UeXBlXG4gICAgICAgIDogZGVmYXVsdFR5cGU7XG5cbiAgICAgIC8vIGNsZWFyIGZyYWdtZW50cyBmcm9tIG90aGVyIGFzc2V0IGlmIGN1cnJlbnQgYXNzZXQgaXMgbm90IG9yaWdpbiBvZiB0aGlzIGRhc2hib2FyZFxuICAgICAgdGhpcy5jbGVhclJlZHVuZGFudEZyYWdtZW50KGRhc2hib2FyZE1PLCBkZWZhdWx0VHlwZSwgZnJhZ21lbnRzKTtcblxuICAgICAgLy8gYWRkIGJhc2UgZnJhZ21lbnQgZm9yIHBhcnRpY3VsYXIgYXNzZXRcbiAgICAgIGNvbnN0IGRldmljZU9yR3JvdXBGcmFnbWVudEtleSA9IHRoaXMuY3JlYXRlRnJhZ21lbnRLZXkoZGVmYXVsdFR5cGUsIGlkKTtcbiAgICAgIGZyYWdtZW50c1tkZXZpY2VPckdyb3VwRnJhZ21lbnRLZXldID0ge307XG5cbiAgICAgIC8vIGFkZCBvciBjbGVhciB0eXBlIGZyYWdtZW50XG4gICAgICBpZiAoZGFzaGJvYXJkTU8uYzh5X0Rhc2hib2FyZC5kZXZpY2VUeXBlIHx8IGlzRWRpdCkge1xuICAgICAgICBjb25zdCB0eXBlRnJhZ21lbnRLZXkgPSB0aGlzLmNyZWF0ZUZyYWdtZW50S2V5KFxuICAgICAgICAgIENvbnRleHREYXNoYm9hcmRUeXBlLlR5cGUsXG4gICAgICAgICAgZGFzaGJvYXJkTU8uYzh5X0Rhc2hib2FyZC5kZXZpY2VUeXBlVmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgZnJhZ21lbnRzW3R5cGVGcmFnbWVudEtleV0gPSBkYXNoYm9hcmRNTy5jOHlfRGFzaGJvYXJkLmRldmljZVR5cGUgPyB7fSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtkYXNoYm9hcmRUeXBlLCBmcmFnbWVudHNdO1xuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgZnJhZ21lbnRzIHRoYXQgb3JpZ2luYXRlcyBmcm9tIG90aGVyIG1hbmFnZWQgb2JqZWN0LlxuICAgKiBFLmcuIHR5cGVkIGRhc2hib2FyZCBpcyBjcmVhdGVkIGZvciBkZXZpY2UgQSBvZiB0eXBlIGM4eV9NUVRURGV2aWNlIGFuZCBpZCAxLCBzbyBpdCBnZXRzIGZyYWdtZW50cyBvYmplY3RcbiAgICogYGBgdHNcbiAgICoge1xuICAgKiBjOHlfRGFzaGJvYXJkIWRldmljZSExOiB7fSxcbiAgICogYzh5X0Rhc2hib2FyZCF0eXBlIWM4eV9NUVRURGV2aWNlOiB7fVxuICAgKiB9XG4gICAqYGBgXG4gICAqIHRoZW4sIG9uIGRldmljZSBCIG9mIHR5cGUgYzh5X01RVFREZXZpY2UgYW5kIGlkIDIsIHdoaWNoIGFsc28gaGFzIGFjY2VzcyB0byB0aGlzIGRhc2hib2FyZCwgZGV2aWNlVHlwZSBpcyBzZXQgdG9cbiAgICogZmFsc2UsIHNvIGRhc2hib2FyZCBpcyBub3QgdHlwZWQgZGFzaGJvYXJkIGFueW1vcmUgYW5kIG5vdyBiZWxvbmdzIHRvIGRldmljZSBCLCB0aGVyZWZvcmUgZnJhZ21lbnRzIHNob3VsZCBsb29rIGxpa2VcbiAgICogYGBgdHNcbiAgICoge1xuICAgKiBjOHlfRGFzaGJvYXJkIWRldmljZSExOiBudWxsLCAvLyB0aGlzIHZhbHVlIGlzIGNsZWFyZWQgYmVjYXVzZSBkYXNoYm9hcmQgaXMgZG9lc24ndCBiZWxvbmcgdG8gZGV2aWNlIEEgYW55bW9yZVxuICAgKiBjOHlfRGFzaGJvYXJkIWRldmljZSEyOiB7fSwgLy8gYXNzaWduIGRhc2hib2FyZCB0byBkZXZpY2UgQlxuICAgKiBjOHlfRGFzaGJvYXJkIXR5cGUhYzh5X01RVFREZXZpY2U6IG51bGwgLy8gdGhpcyB2YWx1ZSBpcyBjbGVhcmVkIGluIGdldERhc2hib2FyZEZyYWdtZW50cyBtZXRob2QgYXMgaXQncyBub3QgdHlwZWQgZGFzaGJvYXJkIGFueW1vcmVcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE1PIC0gRGFzaGJvYXJkIG1hbmFnZWQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdHlwZSAtIENvbnRleHQgZGFzaGJvYXJkIHR5cGUuXG4gICAqIEBwYXJhbSBmcmFnbWVudHMgLSBGcmFnbWVudHMgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhclJlZHVuZGFudEZyYWdtZW50KFxuICAgIGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCxcbiAgICB0eXBlOiBDb250ZXh0RGFzaGJvYXJkVHlwZSxcbiAgICBmcmFnbWVudHM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD5cbiAgKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXMoZGFzaGJvYXJkTU8pXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCh0aGlzLmNyZWF0ZUZyYWdtZW50S2V5KHR5cGUsICcnKSkpXG4gICAgICAuZm9yRWFjaChrZXkgPT4gKGZyYWdtZW50c1trZXldID0gbnVsbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWlncmF0ZSBkYXNoYm9hcmRzIGZyb20gcHJldmlvdXMgMTIgY29sdW1ucyBsYXlvdXQgdG8gMjQgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zPFQgZXh0ZW5kcyB7IGM4eV9EYXNoYm9hcmQ/OiBDb250ZXh0RGFzaGJvYXJkIH0+KFxuICAgIGRhc2hib2FyZHM6IFRbXVxuICApOiBUW107XG4gIHByaXZhdGUgYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zPFQgZXh0ZW5kcyB7IGM4eV9EYXNoYm9hcmQ/OiBDb250ZXh0RGFzaGJvYXJkIH0+KFxuICAgIGRhc2hib2FyZHM6IFRcbiAgKTogVDtcbiAgcHJpdmF0ZSBhZGp1c3REYXNoYm9hcmRGb3IyNENvbHVtbnM8VCBleHRlbmRzIHsgYzh5X0Rhc2hib2FyZD86IENvbnRleHREYXNoYm9hcmQgfT4oXG4gICAgZGFzaGJvYXJkczogVCB8IFRbXVxuICApOiBUIHwgVFtdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXNoYm9hcmRzKSkge1xuICAgICAgcmV0dXJuIGRhc2hib2FyZHMubWFwKGRhc2hib2FyZCA9PiB0aGlzLmFkanVzdERhc2hib2FyZEZvcjI0Q29sdW1ucyhkYXNoYm9hcmQpKTtcbiAgICB9XG4gICAgLy8gaWYgYGNvbHVtbnNgIGF0dHJpYnV0ZSBleGlzdHMsIGRhc2hib2FyZCB3YXMgYWxyZWFkeSBhZGp1c3RlZC5cbiAgICBpZiAoZGFzaGJvYXJkcy5jOHlfRGFzaGJvYXJkLmNvbHVtbnMpIHtcbiAgICAgIHJldHVybiBkYXNoYm9hcmRzO1xuICAgIH1cblxuICAgIGRhc2hib2FyZHMuYzh5X0Rhc2hib2FyZC5jb2x1bW5zID0gMjQ7XG4gICAgaWYgKCFkYXNoYm9hcmRzLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBkYXNoYm9hcmRzO1xuICAgIH1cblxuICAgIC8vIE5ld2x5IGNyZWF0ZWQgTmFtZWRDb250ZXh0RGFzaGJvYXJkcyBhcmUgc3RpbGwgY3JlYXRlZCB3aXRoIDEyIGNvbHVtbnMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIC8vIERlZmF1bHQgd2lkZ2V0cyBtaWdodCBiZSBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIDI0IGNvbHVtbnMuXG4gICAgLy8gSWYgYSB3aWRnZXQgaXMgYWxyZWFkeSBjb25maWd1cmVkIGZvciBtb3JlIHRoYW4gMTIgY29sdW1ucywgd2Ugc2hvdWxkIG5vdCBhZGp1c3QgaXQuXG4gICAgY29uc3QgYWxyZWFkeUhhc1dpZGdldHNDb25maWd1cmVkRm9yTW9yZVRoYW4xMkNvbHVtbnMgPSBPYmplY3QudmFsdWVzKFxuICAgICAgZGFzaGJvYXJkcy5jOHlfRGFzaGJvYXJkLmNoaWxkcmVuXG4gICAgKS5zb21lKHdpZGdldCA9PiB3aWRnZXQuX3ggKyB3aWRnZXQuX3dpZHRoID4gMTIpO1xuICAgIGlmIChhbHJlYWR5SGFzV2lkZ2V0c0NvbmZpZ3VyZWRGb3JNb3JlVGhhbjEyQ29sdW1ucykge1xuICAgICAgcmV0dXJuIGRhc2hib2FyZHM7XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBtdWx0aXBseSBib3RoIF93aWR0aCBhbmQgX3ggYXR0cmlidXRlcyB3aXRoIDIgdG8gbWlncmF0ZSBmcm9tIDEyIHRvIDI0IGNvbHVtbnMuXG4gICAgT2JqZWN0LnZhbHVlcyhkYXNoYm9hcmRzLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4pLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgIGlmICh3aWRnZXQuX3dpZHRoKSB7XG4gICAgICAgIHdpZGdldC5fd2lkdGggPSB3aWRnZXQuX3dpZHRoICogMjtcbiAgICAgIH1cbiAgICAgIGlmICh3aWRnZXQuX3gpIHtcbiAgICAgICAgd2lkZ2V0Ll94ID0gd2lkZ2V0Ll94ICogMjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGFzaGJvYXJkcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VyaWFsaXplV2lkZ2V0Q29uZmlncyhkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjbG9uZURlZXAoZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4pO1xuICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlncyA9IE9iamVjdC52YWx1ZXMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IGRldGFpbHMgPSBjb25maWdzLm1hcCgoeyBjb21wb25lbnRJZCwgY29uZmlnIH0pID0+ICh7IGNvbXBvbmVudElkLCBjb25maWcgfSkpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmR5bmFtaWNDb21wb25lbnQuc2VyaWFsaXplQ29uZmlncyhkZXRhaWxzKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaW5kZXgpID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHNldChkZXRhaWxzW2luZGV4XS5jb25maWcsIGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29udGV4dERhc2hib2FyZENvcHkoXG4gICAgZGFzaDogQ29udGV4dERhc2hib2FyZCxcbiAgICBuZXdDb250ZXh0OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PixcbiAgICBvbGRDb250ZXh0OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PlxuICApOiBDb250ZXh0RGFzaGJvYXJkIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHJlZHVjZShcbiAgICAgIGRhc2guY2hpbGRyZW4sXG4gICAgICAoX2NoaWxkcmVuLCBjaGlsZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGlkIH0gPSBjaGlsZDtcbiAgICAgICAgY29uc3QgY2ZnID0gY2hpbGQuY29uZmlnO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVG9Db3B5ID0ge1xuICAgICAgICAgIGRldmljZTogZGV2aWNlID0+IHRoaXMucmVwbGFjZUNvbnRleHRJbk9iaihkZXZpY2UsIG5ld0NvbnRleHQsIG9sZENvbnRleHQpLFxuICAgICAgICAgIGRhdGFwb2ludHM6IGRhdGFQb2ludHMgPT5cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUNvbnRleHRJbkRhdGFQb2ludHMoZGF0YVBvaW50cywgbmV3Q29udGV4dCwgb2xkQ29udGV4dCksXG4gICAgICAgICAgZGF0YVBvaW50czogZGF0YVBvaW50cyA9PlxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ29udGV4dEluRGF0YVBvaW50cyhkYXRhUG9pbnRzLCBuZXdDb250ZXh0LCBvbGRDb250ZXh0KSxcbiAgICAgICAgICBkYXRhcG9pbnRzR2F1Z2U6IGRhdGFQb2ludHMgPT5cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUNvbnRleHRJbkRhdGFQb2ludHMoZGF0YVBvaW50cywgbmV3Q29udGV4dCwgb2xkQ29udGV4dCksXG4gICAgICAgICAgZGF0YXBvaW50c0xhYmVsczogZGF0YVBvaW50cyA9PlxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ29udGV4dEluRGF0YVBvaW50cyhkYXRhUG9pbnRzLCBuZXdDb250ZXh0LCBvbGRDb250ZXh0KVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKGNmZywgcHJvcGVydGllc1RvQ29weSk7XG4gICAgICAgICAgaWYgKGNmZy5vcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKGNmZy5vcHRpb25zLCBwcm9wZXJ0aWVzVG9Db3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfY2hpbGRyZW5baWRdID0gY2xvbmVEZWVwKGNoaWxkKTtcbiAgICAgICAgcmV0dXJuIF9jaGlsZHJlbjtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG5cbiAgICBkYXNoLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICBjb25zdCBpc1R5cGVEYXNoYm9hcmQgPSBkYXNoLmRldmljZVR5cGUgJiYgISFkYXNoLmRldmljZVR5cGVWYWx1ZTtcbiAgICBpZiAoaXNUeXBlRGFzaGJvYXJkKSB7XG4gICAgICBkYXNoLmRldmljZVR5cGVWYWx1ZSA9IG5ld0NvbnRleHQudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhc2g7XG4gIH1cblxuICBwcml2YXRlIGNvcHlQcm9wZXJ0aWVzKG9iaiwgcHJvcGVydGllc1RvQ29weSkge1xuICAgIGZvckVhY2gocHJvcGVydGllc1RvQ29weSwgKGNvcHlGbiwgcHJvcGVydHkpID0+IHtcbiAgICAgIGlmIChvYmpbcHJvcGVydHldKSB7XG4gICAgICAgIG9ialtwcm9wZXJ0eV0gPSBjb3B5Rm4ob2JqW3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VDb250ZXh0SW5EYXRhUG9pbnRzKFxuICAgIGRhdGFQb2ludHMsXG4gICAgbmV3Q29udGV4dDogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4sXG4gICAgb2xkQ29udGV4dDogUGFydGlhbDxJTWFuYWdlZE9iamVjdD5cbiAgKSB7XG4gICAgZGF0YVBvaW50cy5mb3JFYWNoKGRwID0+IHtcbiAgICAgIGRwLl9fdGFyZ2V0ID0gdGhpcy5yZXBsYWNlQ29udGV4dEluT2JqKGRwLl9fdGFyZ2V0LCBuZXdDb250ZXh0LCBvbGRDb250ZXh0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YVBvaW50cztcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZUNvbnRleHRJbk9iaihcbiAgICBvYmo6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LFxuICAgIG5ld0NvbnRleHQ6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LFxuICAgIG9sZENvbnRleHQ6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+XG4gICkge1xuICAgIGlmIChvYmogJiYgb2JqLmlkID09PSBvbGRDb250ZXh0LmlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwgcGljayhuZXdDb250ZXh0LCBbJ2lkJywgJ25hbWUnXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWJzJChcbiAgICBtbzogQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3QsXG4gICAgZGFzaGJvYXJkVHlwZTogQ29udGV4dERhc2hib2FyZFR5cGVbXSxcbiAgICBjb250ZXh0PzogQ29udGV4dERhdGFcbiAgKSB7XG4gICAgY29uc3QgZGFzaGJvYXJkcyA9IHRoaXMuZ2V0Q29udGV4dERhc2hib2FyZHMobW8sIGRhc2hib2FyZFR5cGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERhc2hib2FyZHMkKGRhc2hib2FyZHMpLnBpcGUoXG4gICAgICBtZXJnZU1hcChkYXNoYm9hcmQgPT4gdGhpcy52ZXJpZnlEYXNoYm9hcmRBdmFpbGFiaWxpdHkkKGRhc2hib2FyZCkpLFxuICAgICAgLy8gRHVlIHRvIE1UTS02MjMyMSBuYW1lZCBjb250ZXh0IGRhc2hib2FyZHMgaW5jbHVkZWQgZnJhZ21lbnRzIGZvciBkZXZpY2UgYW5kIGdyb3Vwcy5cbiAgICAgIC8vIHRoZXJlZm9yZSBzb21lIGRldmljZS1pbmZvIGRhc2hib2FyZHMgKGZyb20gRE0gYXBwKSBtaWdodCBvY2N1ciBpbiBjb2NrcGl0IG9uIGRldmljZSBsZXZlbC5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZmlsdGVyIHRob3NlIG91dC4uXG4gICAgICBmaWx0ZXIoKFtkYXNoYm9hcmRdKSA9PiB7XG4gICAgICAgIC8vIGxpc3QgYWxsIGlkZW50aWZpZXJzIG9mIHRoZSBkYXNoYm9hcmQgKG5hbWUsIGRldmljZSwgZ3JvdXAsIHR5cGUpXG4gICAgICAgIGNvbnN0IGRhc2hib2FyZElkZW50aWZpZXJzID0gT2JqZWN0LmtleXMoZGFzaGJvYXJkKVxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9YCkpXG4gICAgICAgICAgLm1hcChrZXkgPT4ga2V5LnNwbGl0KHRoaXMuSU5ERVhfU1BMSVQpWzFdKTtcbiAgICAgICAgLy8gaWYgZGFzaGJvYXJkIGlzIG5vdCBuYW1lZCwgaXQncyBzYWZlIHRvIGluY2x1ZGUgaXRcbiAgICAgICAgaWYgKCFkYXNoYm9hcmRJZGVudGlmaWVycy5pbmNsdWRlcyhDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBkYXNoYm9hcmQgaXMgbmFtZWQsIGJ1dCBhbHNvIGhhcyBhIGNvbnRleHQgaWRlbnRpZmllciwgd2Ugc2tpcCBpdFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGFzaGJvYXJkSWRlbnRpZmllcnMuaW5jbHVkZXMoQ29udGV4dERhc2hib2FyZFR5cGUuRGV2aWNlKSB8fFxuICAgICAgICAgIGRhc2hib2FyZElkZW50aWZpZXJzLmluY2x1ZGVzKENvbnRleHREYXNoYm9hcmRUeXBlLkdyb3VwKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbGwgb3RoZXJzIGFyZSBnb29kLi5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KSxcbiAgICAgIG1lcmdlTWFwKChbZGFzaGJvYXJkXSkgPT4gdGhpcy5yZW1vdmVEYXNoYm9hcmRNb1Byb3BlcnR5KGRhc2hib2FyZCkpLFxuICAgICAgdGFwKGRhc2hib2FyZCA9PiB0aGlzLmNhY2hlRGFzaGJvYXJkKGRhc2hib2FyZCkpLFxuICAgICAgbWFwKGRhc2hib2FyZCA9PiB0aGlzLmNyZWF0ZURhc2hib2FyZFRhYihkYXNoYm9hcmQsIGNvbnRleHQpKSxcbiAgICAgIHRvQXJyYXkoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeURhc2hib2FyZEF2YWlsYWJpbGl0eSQoZGFzaGJvYXJkOiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IGdsb2JhbFJvbGVzSWRzID0gZGFzaGJvYXJkPy5jOHlfRGFzaGJvYXJkPy5nbG9iYWxSb2xlc0lkcztcbiAgICBjb25zdCBjYW5FZGl0ID0gZnJvbShcbiAgICAgIHRoaXMucGVybWlzc2lvbnMuY2FuRWRpdCh0aGlzLklOVkVOVE9SWV9ST0xFUywgZGFzaGJvYXJkLCB7IHNraXBSZXF1ZXN0Q2hlY2s6IHRydWUgfSlcbiAgICApO1xuICAgIGNvbnN0IGhhc0FueUdsb2JhbFJvbGUgPVxuICAgICAgIWdsb2JhbFJvbGVzSWRzIHx8IGdsb2JhbFJvbGVzSWRzID09PSBBTExfR0xPQkFMX1JPTEVTX1NFTEVDVEVEXG4gICAgICAgID8gb2YodHJ1ZSlcbiAgICAgICAgOiBvZih0aGlzLnBlcm1pc3Npb25zLmhhc0FueUdsb2JhbFJvbGUoZ2xvYmFsUm9sZXNJZHMpKTtcblxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtvZihkYXNoYm9hcmQpLCBjYW5FZGl0LCBoYXNBbnlHbG9iYWxSb2xlXSkucGlwZShcbiAgICAgIGZpbHRlcigoWywgY2FuRWRpdCwgaGFzQW55R2xvYmFsUm9sZV0pID0+IGNhbkVkaXQgfHwgaGFzQW55R2xvYmFsUm9sZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZXh0RGFzaGJvYXJkcyQocmVxdWVzdDogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+KSB7XG4gICAgcmV0dXJuIGZyb20ocmVxdWVzdCkucGlwZShcbiAgICAgIG1lcmdlTWFwKHJlc3BvbnNlID0+XG4gICAgICAgIHRoaXMuYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zKHJlc3BvbnNlLmRhdGEgYXMgQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3RbXSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhbHJlYWR5IGNvcnJ1cHRlZCBkYXNoYm9hcmRzIGZyb20gZGFzaGJvYXJkTW8gcHJvcGVydHkuXG4gICAqIEFkZGVkIHRvIGZpeCBkYXNoYm9hcmRzIG9uIHRoZSBjbG91ZCBpbnN0YW5jZSAoZXUtbGF0ZXN0KS5cbiAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBnb2luZyB0byBiZSByZW1vdmVkIGFmdGVyIDEwMDcuNy4wLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVEYXNoYm9hcmRNb1Byb3BlcnR5KFxuICAgIGRhc2hib2FyZDogQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4ge1xuICAgIGNvbnN0IGRhc2hib2FyZENvcHkgPSBjbG9uZURlZXAoZGFzaGJvYXJkKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGdldChkYXNoYm9hcmRDb3B5LCAnYzh5X0Rhc2hib2FyZC5jaGlsZHJlbicpO1xuICAgIGxldCB1cGRhdGVEYXNoYm9hcmQgPSBmYWxzZTtcblxuICAgIGZvckVhY2goY2hpbGRyZW4sIGNoaWxkID0+IHtcbiAgICAgIGlmIChnZXQoY2hpbGQsICdjb21wb25lbnRUcmFuc2Zvcm1Db25maWdXaXRoQ29udGV4dCcpKSB7XG4gICAgICAgIGRlbGV0ZSBjaGlsZC5jb21wb25lbnRUcmFuc2Zvcm1Db25maWdXaXRoQ29udGV4dDtcbiAgICAgICAgdXBkYXRlRGFzaGJvYXJkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnZXQoY2hpbGQsICdjb25maWcuZGFzaGJvYXJkTW8nKSkge1xuICAgICAgICBkZWxldGUgY2hpbGQuY29uZmlnLmRhc2hib2FyZE1vO1xuICAgICAgICB1cGRhdGVEYXNoYm9hcmQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHVwZGF0ZURhc2hib2FyZCkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGUoZGFzaGJvYXJkQ29weSk7XG4gICAgfVxuICAgIHJldHVybiBkYXNoYm9hcmRDb3B5O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZURhc2hib2FyZChkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0KSB7XG4gICAgdGhpcy5jYWNoZS5zZXQoZGFzaGJvYXJkLmlkLCBkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXNoYm9hcmRUYWIoZGFzaGJvYXJkOiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCwgY29udGV4dD86IENvbnRleHREYXRhKSB7XG4gICAgY29uc3QgeyBjOHlfRGFzaGJvYXJkOiBfZGFzaGJvYXJkLCBpZCB9ID0gZGFzaGJvYXJkO1xuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBfZGFzaGJvYXJkLmljb24sXG4gICAgICBwYXRoOiBgJHt0aGlzLkRBU0hCT0FSRF9ST1VURV9QQVRIfS8ke2lkfWAsXG4gICAgICBsYWJlbDogX2Rhc2hib2FyZC5uYW1lLFxuICAgICAgcHJpb3JpdHk6IF9kYXNoYm9hcmQucHJpb3JpdHksXG4gICAgICBoaWRlOiB0aGlzLmlzUmVwb3J0KGRhc2hib2FyZCksXG4gICAgICBiYWRnZTpcbiAgICAgICAgX2Rhc2hib2FyZC5kZXZpY2VUeXBlICYmIHRoaXMuc2hvdWxkQWxsb3dUb1NldERhc2hib2FyZFR5cGUoZGFzaGJvYXJkLCBjb250ZXh0KVxuICAgICAgICAgID8gZ2V0dGV4dCgnRGFzaGJvYXJkIHRlbXBsYXRlJylcbiAgICAgICAgICA6IG51bGwsXG4gICAgICB0b29sdGlwVGV4dDogX2Rhc2hib2FyZC5kZXNjcmlwdGlvbiB8fCBnZXR0ZXh0KCdEYXNoYm9hcmQgdGVtcGxhdGUnKVxuICAgIH0gYXMgVGFiO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbihkYXNoYm9hcmQpIHtcbiAgICBjb25zdCBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGFzaGJvYXJkLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gJyQkaGFzaEtleScgfHwga2V5ID09PSAna2xhc3NlcycpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROYW1lZERhc2hib2FyZChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkubGlzdCh7XG4gICAgICBmcmFnbWVudFR5cGU6IGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZH0ke3RoaXMuSU5ERVhfU1BMSVR9JHtuYW1lfWAsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXNoYm9hcmRGcmFnbWVudChtbzogSU1hbmFnZWRPYmplY3QsIHR5cGU6IENvbnRleHREYXNoYm9hcmRUeXBlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChtby5jOHlfUmVwb3J0KSB7XG4gICAgICB2YWx1ZSA9IGAke3RoaXMuUkVQT1JUX1BBUlRJQUxfTkFNRX0ke21vLmlkfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdHlwZSA9PT0gQ29udGV4dERhc2hib2FyZFR5cGUuVHlwZSA/IG1vLnR5cGUgOiBtby5pZDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHt0eXBlfSR7dGhpcy5JTkRFWF9TUExJVH0ke3ZhbHVlfWA7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFNldEdsb2JhbChkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+LCBjb250ZXh0Pykge1xuICAgIGlmIChcbiAgICAgICghY29udGV4dCAmJiB0aGlzLmlzTmFtZWQoZGFzaGJvYXJkKSAmJiAhdGhpcy5pc1JlcG9ydChkYXNoYm9hcmQpKSB8fFxuICAgICAgdGhpcy5pc0RldmljZVR5cGUoZGFzaGJvYXJkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGVtcG9yYXJ5RGFzaGJvYXJkKGRhc2hib2FyZENmZzogQ29udGV4dERhc2hib2FyZCk6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgYzh5X0Rhc2hib2FyZDoge1xuICAgICAgICAuLi5kYXNoYm9hcmRDZmcsXG4gICAgICAgIG5hbWU6IGRhc2hib2FyZENmZy5uYW1lIHx8ICdUZW1wb3JhcnkgRGFzaGJvYXJkJyxcbiAgICAgICAgaXNUcmFuc2llbnQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KFxuICAgICAgICAgICdUaGlzIGlzIGEgdGVtcG9yYXJ5LCBub24tZWRpdGFibGUgZGFzaGJvYXJkIGRpc3BsYXllZCBkdWUgdG8gaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLidcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIFtgYzh5X0Rhc2hib2FyZCFuYW1lISR7ZGFzaGJvYXJkQ2ZnLm5hbWV9YF06IHt9XG4gICAgfSBhcyBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdDtcbiAgfVxufVxuIl19
|
|
702
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1kYXNoYm9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL2NvbnRleHQtZGFzaGJvYXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQTBCLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQWUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pGLE9BQU8sRUFDTCxZQUFZLEVBR1osdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsWUFBWSxFQUNaLFlBQVksRUFDWixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLCtCQUErQixFQUMvQixjQUFjLEVBQ2QsV0FBVyxFQUNYLE1BQU0sRUFFTixXQUFXLEVBQ1gsV0FBVyxFQUVaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsT0FBTyxFQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osTUFBTSxFQUNOLEdBQUcsRUFDSCxJQUFJLEVBQ0wsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUNMLHlCQUF5QixFQUl6QixvQkFBb0IsRUFHcEIsa0JBQWtCLEVBQ2xCLHNC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QUFzQixZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1NBQ2YsQ0FBQztJQUNyQyxDQUFDOytHQW44QlUsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FEVixNQUFNOzs0RkFDbkIsdUJBQXVCO2tCQURuQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCwgSW52ZW50b3J5U2VydmljZSwgSVJlc3VsdExpc3QsIFF1ZXJpZXNVdGlsIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBcHBsaWNhdGlvbk9wdGlvbnMsXG4gIENvbnRleHREYXRhLFxuICBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgZ2V0QWN0aXZhdGVkUm91dGUsXG4gIGdldHRleHQsXG4gIEdyb3VwU2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLFxuICBOYXZpZ2F0b3JOb2RlLFxuICBOYXZpZ2F0b3JTZXJ2aWNlLFxuICBORVdfREFTSEJPQVJEX1JPVVRFUl9TVEFURV9QUk9QLFxuICBPcHRpb25zU2VydmljZSxcbiAgUGVybWlzc2lvbnMsXG4gIFN0YXR1cyxcbiAgVGFiLFxuICBUYWJzU2VydmljZSxcbiAgVmlld0NvbnRleHQsXG4gIFdpZGdldFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gIGFzc2lnbixcbiAgY2xvbmVEZWVwLFxuICBmb3JFYWNoLFxuICBnZXQsXG4gIGhhcyxcbiAga2V5QnksXG4gIGtleXMsXG4gIHBpY2ssXG4gIHJlZHVjZSxcbiAgc2V0LFxuICBzb21lXG59IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCB0YXAsIHRocm93SWZFbXB0eSwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEFMTF9HTE9CQUxfUk9MRVNfU0VMRUNURUQsXG4gIEFsbG93VHlwZURhc2hib2FyZCxcbiAgQ29udGV4dERhc2hib2FyZCxcbiAgQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3QsXG4gIENvbnRleHREYXNoYm9hcmRUeXBlLFxuICBEYXNoYm9hcmRDb250ZXh0LFxuICBEYXNoYm9hcmRDb3B5Q2xpcGJvYXJkLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0UsXG4gIFNUWUxJTkdfQ0xBU1NfUFJFRklYRVNcbn0gZnJvbSAnLi9jb250ZXh0LWRhc2hib2FyZC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ29udGV4dERhc2hib2FyZFNlcnZpY2Uge1xuICBkYXNoYm9hcmRUYWJzJDogT2JzZXJ2YWJsZTxUYWJbXT47XG4gIGZvcm1EaXNhYmxlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IFJFUE9SVF9QQVJUSUFMX05BTUUgPSAncmVwb3J0Xyc7XG4gIGNvcHlDbGlwYm9hcmQ6IERhc2hib2FyZENvcHlDbGlwYm9hcmQ7XG4gIHF1ZXJpZXNVdGlsOiBRdWVyaWVzVXRpbDtcbiAgcmVhZG9ubHkgVkVSU0lPTl9ISVNUT1JZX1NJWkVfTElNSVQgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBJTlZFTlRPUllfUk9MRVMgPSBbXG4gICAgUGVybWlzc2lvbnMuUk9MRV9JTlZFTlRPUllfQURNSU4sXG4gICAgUGVybWlzc2lvbnMuUk9MRV9NQU5BR0VEX09CSkVDVF9BRE1JTlxuICBdO1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfUEFHRVNJWkUgPSAxMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZSQUdNRU5UX05BTUUgPSAnYzh5X0Rhc2hib2FyZCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFTSEJPQVJEX1JPVVRFX1BBVEggPSAnZGFzaGJvYXJkJztcbiAgcHJpdmF0ZSByZWFkb25seSBJTkRFWF9TUExJVCA9ICchJztcbiAgcHJpdmF0ZSByZWFkb25seSBDQUNIRV9USU1FT1VUID0gNTAwO1xuICBwcml2YXRlIF9mb3JtRGlzYWJsZWQgPSB0cnVlO1xuICBwcml2YXRlIGZvcm1EaXNhYmxlZFN1YmplY3QgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIGNvbnRleHREYXNoYm9hcmRzQ2FjaGU6IHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHJlc3VsdDogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+O1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IEhJREVfVFlQRV9EQVNIQk9BUkRfRk9SX0FTU0VUUzoga2V5b2YgQXBwbGljYXRpb25PcHRpb25zID1cbiAgICAnaGlkZVR5cGVEYXNoYm9hcmRGb3JBc3NldHMnO1xuXG4gIGdldCBmb3JtRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1EaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBmb3JtRGlzYWJsZWQodmFsdWUpIHtcbiAgICB0aGlzLl9mb3JtRGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmZvcm1EaXNhYmxlZFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHRhYnM6IFRhYnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIG5hdmlnYXRvcjogTmF2aWdhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucyxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50OiBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgICBwcml2YXRlIGdyb3VwU2VydmljZTogR3JvdXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZm9ybURpc2FibGVkJCA9IHRoaXMuZm9ybURpc2FibGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnF1ZXJpZXNVdGlsID0gbmV3IFF1ZXJpZXNVdGlsKCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoZGFzaGJvYXJkQ2ZnOiBDb250ZXh0RGFzaGJvYXJkLCBjb250ZXh0PzogQ29udGV4dERhdGEsIG5hbWUgPSAnJykge1xuICAgIGxldCBkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+ID0ge307XG4gICAgYXNzaWduKFxuICAgICAgZGFzaGJvYXJkLFxuICAgICAgdGhpcy5hZGp1c3REYXNoYm9hcmRGb3IyNENvbHVtbnMoeyBjOHlfRGFzaGJvYXJkOiBkYXNoYm9hcmRDZmcgfSksXG4gICAgICB0aGlzLnVwZGF0ZURhc2hib2FyZEhpc3RvcnkoZGFzaGJvYXJkLCBkYXNoYm9hcmRDZmcpXG4gICAgKTtcblxuICAgIGNvbnN0IFtkYXNoYm9hcmRUeXBlLCBkYXNoYm9hcmRGcmFnbWVudHNdID0gdGhpcy5nZXREYXNoYm9hcmRGcmFnbWVudHMoXG4gICAgICB7IGM4eV9EYXNoYm9hcmQ6IGRhc2hib2FyZENmZyB9IGFzIENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LFxuICAgICAgY29udGV4dCxcbiAgICAgIG5hbWUsXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgZGFzaGJvYXJkID0geyAuLi5kYXNoYm9hcmQsIC4uLmRhc2hib2FyZEZyYWdtZW50cyB9O1xuXG4gICAgaWYgKHRoaXMuc2hvdWxkU2V0R2xvYmFsKGRhc2hib2FyZCwgY29udGV4dCkpIHtcbiAgICAgIGFzc2lnbihkYXNoYm9hcmQsIHsgYzh5X0dsb2JhbDoge30gfSk7XG4gICAgfVxuICAgIGRhc2hib2FyZC5uYW1lID0gZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQubmFtZTtcbiAgICBjb25zdCB7IGRhdGEgfSA9XG4gICAgICBkYXNoYm9hcmRUeXBlID09PSBDb250ZXh0RGFzaGJvYXJkVHlwZS5Hcm91cCB8fFxuICAgICAgZGFzaGJvYXJkVHlwZSA9PT0gQ29udGV4dERhc2hib2FyZFR5cGUuRGV2aWNlIHx8XG4gICAgICAoY29udGV4dCAmJiBkYXNoYm9hcmRUeXBlID09PSBDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZClcbiAgICAgICAgPyBhd2FpdCB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0NyZWF0ZShcbiAgICAgICAgICAgIGRhc2hib2FyZCxcbiAgICAgICAgICAgIChjb250ZXh0Py5jb250ZXh0RGF0YS5pZCBhcyBzdHJpbmcpIHx8ICcnXG4gICAgICAgICAgKVxuICAgICAgICA6IGF3YWl0IHRoaXMuaW52ZW50b3J5LmNyZWF0ZShkYXNoYm9hcmQpO1xuICAgIHJldHVybiBkYXRhIGFzIENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0O1xuICB9XG5cbiAgYXN5bmMgZGV0YWlsKGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCkge1xuICAgIGxldCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbChkYXNoYm9hcmRNTyk7XG4gICAgZGF0YSA9IHRoaXMuYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zKGRhdGEgYXMgQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3QpO1xuICAgIHRoaXMuY2FjaGUuc2V0KGRhc2hib2FyZE1PLmlkLCBkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbnRleHQ/OiBDb250ZXh0RGF0YVxuICApOiBQcm9taXNlPENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0PiB7XG4gICAgY29uc3QgZGFzaGJvYXJkQ2ZnID0gZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQ7XG4gICAgZGFzaGJvYXJkLm5hbWUgPSBkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZC5uYW1lO1xuICAgIGFzc2lnbihcbiAgICAgIGRhc2hib2FyZCxcbiAgICAgIHRoaXMuYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zKHsgYzh5X0Rhc2hib2FyZDogZGFzaGJvYXJkQ2ZnIH0pLFxuICAgICAgdGhpcy51cGRhdGVEYXNoYm9hcmRIaXN0b3J5KGRhc2hib2FyZCwgZGFzaGJvYXJkQ2ZnKVxuICAgICk7XG5cbiAgICBjb25zdCBrZWVwRnJhZ21lbnRzID0gdGhpcy5jbGVhbihwaWNrKGRhc2hib2FyZCwgW3RoaXMuRlJBR01FTlRfTkFNRSwgJ2lkJywgJ25hbWUnXSkpO1xuICAgIGtlZXBGcmFnbWVudHMuYzh5X0Rhc2hib2FyZEhpc3RvcnkgPSBkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZEhpc3Rvcnk7XG4gICAgYXdhaXQgdGhpcy5zZXJpYWxpemVXaWRnZXRDb25maWdzKGtlZXBGcmFnbWVudHMpO1xuXG4gICAgY29uc3QgWywgZGFzaGJvYXJkVHlwZUZyYWdtZW50c10gPSB0aGlzLmdldERhc2hib2FyZEZyYWdtZW50cyhkYXNoYm9hcmQsIGNvbnRleHQsICcnLCB0cnVlKTtcbiAgICBrZWVwRnJhZ21lbnRzLmM4eV9HbG9iYWwgPSB0aGlzLnNob3VsZFNldEdsb2JhbCh7IC4uLmRhc2hib2FyZCwgLi4uZGFzaGJvYXJkVHlwZUZyYWdtZW50cyB9KTtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LnVwZGF0ZSh7IC4uLmtlZXBGcmFnbWVudHMsIC4uLmRhc2hib2FyZFR5cGVGcmFnbWVudHMgfSk7XG4gICAgdGhpcy5jYWNoZS5zZXQoZGFzaGJvYXJkLmlkLCBkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LCB3aXRoQ29uZmlybWF0aW9uID0gdHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBpZiAod2l0aENvbmZpcm1hdGlvbikge1xuICAgICAgICBsZXQgbXNnOiBzdHJpbmcgPSBnZXR0ZXh0KFxuICAgICAgICAgIGBZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSB0aGUgZGFzaGJvYXJkIFwie3sgZGFzaGJvYXJkTmFtZSB9fVwiLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP2BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEZXZpY2VUeXBlKGRhc2hib2FyZCkpIHtcbiAgICAgICAgICBtc2cgPSBnZXR0ZXh0KFxuICAgICAgICAgICAgYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIHRoZSBkYXNoYm9hcmQgXCJ7eyBkYXNoYm9hcmROYW1lIH19XCIgZnJvbSBhbGwgZGV2aWNlcyBvZiB0aGUgdHlwZSBcInt7IGRldmljZVR5cGUgfX1cIi5cbiAgICAgICAgICAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD9gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLm1vZGFsLmNvbmZpcm0oXG4gICAgICAgICAgZ2V0dGV4dCgnRGVsZXRlIGRhc2hib2FyZCcpLFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KG1zZywge1xuICAgICAgICAgICAgZGFzaGJvYXJkTmFtZTogZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQubmFtZSxcbiAgICAgICAgICAgIGRldmljZVR5cGU6IGRhc2hib2FyZC5jOHlfRGFzaGJvYXJkLmRldmljZVR5cGVWYWx1ZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIFN0YXR1cy5EQU5HRVIsXG4gICAgICAgICAgeyBvazogZ2V0dGV4dCgnRGVsZXRlJyksIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJykgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnkuZGVsZXRlKGRhc2hib2FyZCk7XG4gICAgICBjb25zdCB0YWJUb1JlbW92ZSA9IEFycmF5LmZyb20odGhpcy50YWJzLnN0YXRlKS5maW5kKHRhYiA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFiLnBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHRhYi5wYXRoLmVuZHNXaXRoKGAke3RoaXMuREFTSEJPQVJEX1JPVVRFX1BBVEh9LyR7ZGFzaGJvYXJkLmlkfWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFicy5yZW1vdmUodGFiVG9SZW1vdmUpO1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnRhYnMucmVmcmVzaCgpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGludGVuZGVkIGVtcHR5XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRGFzaGJvYXJkSGlzdG9yeShcbiAgICBkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+LFxuICAgIGRhc2hib2FyZENmZzogQ29udGV4dERhc2hib2FyZFxuICApOiBQYXJ0aWFsPENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0PiB7XG4gICAgaWYgKCFkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZEhpc3RvcnkpIHtcbiAgICAgIGRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWRhc2hib2FyZENmZy5oaXN0b3J5RGVzY3JpcHRpb24pIHtcbiAgICAgIGRhc2hib2FyZENmZy5oaXN0b3J5RGVzY3JpcHRpb24gPSB7IGNoYW5nZVR5cGU6ICdjcmVhdGUnIH07XG4gICAgfVxuXG4gICAgZGFzaGJvYXJkQ2ZnLmNyZWF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmRIaXN0b3J5ID0gY2xvbmVEZWVwKFtkYXNoYm9hcmRDZmcsIC4uLmRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeV0pO1xuXG4gICAgaWYgKGRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeS5sZW5ndGggPiB0aGlzLlZFUlNJT05fSElTVE9SWV9TSVpFX0xJTUlUKSB7XG4gICAgICBkYXNoYm9hcmQuYzh5X0Rhc2hib2FyZEhpc3RvcnkgPSBbXG4gICAgICAgIC4uLmRhc2hib2FyZC5jOHlfRGFzaGJvYXJkSGlzdG9yeS5zbGljZSgwLCB0aGlzLlZFUlNJT05fSElTVE9SWV9TSVpFX0xJTUlUKVxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGFzaGJvYXJkO1xuICB9XG5cbiAgYWN0aXZhdGVEYXNoYm9hcmRzKFxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICAgIHR5cGVzOiBDb250ZXh0RGFzaGJvYXJkVHlwZVtdXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFRhYltdPiB7XG4gICAgY29uc3QgeyBkYXNoYm9hcmRJZCB9ID0gcm91dGUucGFyYW1zO1xuICAgIGlmIChkYXNoYm9hcmRJZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGFzaGJvYXJkJChkYXNoYm9hcmRJZCwgdHlwZXMsIHJvdXRlLnBhcmVudC5kYXRhLmNvbnRleHREYXRhKS5waXBlKFxuICAgICAgICB0YXAoZGFzaGJvYXJkID0+IHtcbiAgICAgICAgICByb3V0ZS5kYXRhID0geyBkYXNoYm9hcmQgfTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXNoYm9hcmRUYWJzJCA9IHRoaXMuZ2V0VGFicyQoXG4gICAgICByb3V0ZS5kYXRhLmNvbnRleHREYXRhLFxuICAgICAgdHlwZXMsXG4gICAgICByb3V0ZT8ucGFyZW50Py5kYXRhIGFzIENvbnRleHREYXRhXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmRUYWJzJDtcbiAgfVxuXG4gIGdldE5hbWVkRGFzaGJvYXJkT3JDcmVhdGUobmFtZTogc3RyaW5nLCBkZWZhdWx0V2lkZ2V0czogV2lkZ2V0W10sIGNvbnRleHQ/OiBDb250ZXh0RGF0YSkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5tYXBXaWRnZXRzKGRlZmF1bHRXaWRnZXRzKTtcbiAgICByZXR1cm4gdGhpcy5nZXREYXNoYm9hcmQkKG5hbWUsIFtDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZF0pLnBpcGUoXG4gICAgICB0aHJvd0lmRW1wdHkoKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUGVybWlzc2lvbnNUb0NvcHlEYXNoYm9hcmQoKSkge1xuICAgICAgICAgIHRoaXMuYWxlcnQud2FybmluZyhcbiAgICAgICAgICAgIGdldHRleHQoXG4gICAgICAgICAgICAgICdZb3UgYXJlIHZpZXdpbmcgYSByZWFkLW9ubHkgZGFzaGJvYXJkIGJlY2F1c2UgeW91IGRvbuKAmXQgaGF2ZSB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIHRvIG1vZGlmeSBpdC4nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gb2YoXG4gICAgICAgICAgICB0aGlzLmdldFRlbXBvcmFyeURhc2hib2FyZCh7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICB3aWRnZXRDbGFzc2VzOiB7ICdkYXNoYm9hcmQtdGhlbWUtbGlnaHQnOiB0cnVlLCAncGFuZWwtdGl0bGUtcmVndWxhcic6IHRydWUgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgd2lkZ2V0Q2xhc3NlczogeyAnZGFzaGJvYXJkLXRoZW1lLWxpZ2h0JzogdHJ1ZSwgJ3BhbmVsLXRpdGxlLXJlZ3VsYXInOiB0cnVlIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1cGRhdGVOYXZpZ2F0b3JJdGVtKG1vOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHRoaXMubmF2aWdhdG9yLnN0YXRlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS5wYXRoID09PSBgcmVwb3J0cy8ke21vLmlkfWApIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3IucmVtb3ZlKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChtby5jOHlfSXNOYXZpZ2F0b3JOb2RlKSB7XG4gICAgICBjb25zdCBub2RlVG9BZGQgPSBuZXcgTmF2aWdhdG9yTm9kZSh7XG4gICAgICAgIGxhYmVsOiBtby5uYW1lLFxuICAgICAgICBwYXRoOiBgcmVwb3J0cy8ke21vLmlkfWAsXG4gICAgICAgIGljb246IG1vLmljb24sXG4gICAgICAgIHByaW9yaXR5OiBtby5wcmlvcml0eVxuICAgICAgfSk7XG4gICAgICB0aGlzLm5hdmlnYXRvci5hZGQobm9kZVRvQWRkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvRGFzaGJvYXJkKGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCwgaXNOZXdEYXNoYm9hcmQgPSBmYWxzZSkge1xuICAgIGlmICgvZGFzaGJvYXJkLy50ZXN0KHRoaXMucm91dGVyLnVybCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4nLCBkYXNoYm9hcmRNTy5pZF0sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogZ2V0QWN0aXZhdGVkUm91dGUodGhpcy5yb3V0ZXIpLFxuICAgICAgICAuLi4oaXNOZXdEYXNoYm9hcmQgJiYge1xuICAgICAgICAgIHN0YXRlOiB7IFtORVdfREFTSEJPQVJEX1JPVVRFUl9TVEFURV9QUk9QXTogdHJ1ZSB9XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKC9eXFwvKGRldmljZXxncm91cClcXC9bMC05XSskLy50ZXN0KHRoaXMucm91dGVyLnVybCkpIHtcbiAgICAgIC8vIGluIGNhc2UgdGhlIGFkZCBkYXNoYm9hcmQgYnV0dG9uIGlzIHRoZSBvbmx5IHRhYiBvbiB0aGF0IHJvdXRlXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nLCB0aGlzLkRBU0hCT0FSRF9ST1VURV9QQVRILCBkYXNoYm9hcmRNTy5pZF0sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogZ2V0QWN0aXZhdGVkUm91dGUodGhpcy5yb3V0ZXIpLFxuICAgICAgICAuLi4oaXNOZXdEYXNoYm9hcmQgJiYge1xuICAgICAgICAgIHN0YXRlOiB7IFtORVdfREFTSEJPQVJEX1JPVVRFUl9TVEFURV9QUk9QXTogdHJ1ZSB9XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLicsIHRoaXMuREFTSEJPQVJEX1JPVVRFX1BBVEgsIGRhc2hib2FyZE1PLmlkXSwge1xuICAgICAgICByZWxhdGl2ZVRvOiBnZXRBY3RpdmF0ZWRSb3V0ZSh0aGlzLnJvdXRlciksXG4gICAgICAgIC4uLihpc05ld0Rhc2hib2FyZCAmJiB7XG4gICAgICAgICAgc3RhdGU6IHsgW05FV19EQVNIQk9BUkRfUk9VVEVSX1NUQVRFX1BST1BdOiB0cnVlIH1cbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdXNlciBpcyBhYmxlIHRvIGVkaXQgZGFzaGJvYXJkIGFjY29yZGluZyB0byBoaXMgcm9sZXMgYW5kIGRhc2hib2FyZCBvd25lcnNoaXAuXG4gICAqXG4gICAqIEBwYXJhbSBtbyAtIERhc2hib2FyZCBtYW5hZ2VkIG9iamVjdC5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB1c2VyIGlzIGFibGUgdG8gZWRpdCBkYXNoYm9hcmQsIGZhbHNlIGlmIGhlIGNhbm5vdC5cbiAgICovXG4gIGFzeW5jIGNhbkVkaXREYXNoYm9hcmQobW86IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucGVybWlzc2lvbnMuY2FuRWRpdCh0aGlzLklOVkVOVE9SWV9ST0xFUywgbW8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB1c2VyIGhhcyBwZXJtaXNzaW9ucyB0byBjb3B5IGRhc2hib2FyZCBhY2NvcmRpbmcgdG8gaGlzIHJvbGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHVzZXIgaGFzIHBlcm1pc3Npb25zIHRvIGNvcHkgZGFzaGJvYXJkLCBmYWxzZSBpZiBoZSBjYW5ub3QuXG4gICAqL1xuICBoYXNQZXJtaXNzaW9uc1RvQ29weURhc2hib2FyZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5oYXNBbnlSb2xlKFtcbiAgICAgIFBlcm1pc3Npb25zLlJPTEVfSU5WRU5UT1JZX0FETUlOLFxuICAgICAgUGVybWlzc2lvbnMuUk9MRV9JTlZFTlRPUllfQ1JFQVRFLFxuICAgICAgUGVybWlzc2lvbnMuUk9MRV9NQU5BR0VEX09CSkVDVF9BRE1JTixcbiAgICAgIFBlcm1pc3Npb25zLlJPTEVfTUFOQUdFRF9PQkpFQ1RfQ1JFQVRFXG4gICAgXSk7XG4gIH1cblxuICBpc05hbWVkKGRhc2hib2FyZDogUGFydGlhbDxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4pIHtcbiAgICByZXR1cm4gc29tZShrZXlzKGRhc2hib2FyZCksIHByb3AgPT5cbiAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgIGBeJHt0aGlzLkZSQUdNRU5UX05BTUV9JHt0aGlzLklOREVYX1NQTElUfSR7Q29udGV4dERhc2hib2FyZFR5cGUuTmFtZWR9JHt0aGlzLklOREVYX1NQTElUfWBcbiAgICAgICkudGVzdChwcm9wKVxuICAgICk7XG4gIH1cblxuICBpc1JlcG9ydChkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+KSB7XG4gICAgcmV0dXJuIHNvbWUoa2V5cyhkYXNoYm9hcmQpLCBwcm9wID0+XG4gICAgICBuZXcgUmVnRXhwKFxuICAgICAgICBgXiR7dGhpcy5GUkFHTUVOVF9OQU1FfSR7dGhpcy5JTkRFWF9TUExJVH0ke0NvbnRleHREYXNoYm9hcmRUeXBlLk5hbWVkfSR7dGhpcy5JTkRFWF9TUExJVH0ke3RoaXMuUkVQT1JUX1BBUlRJQUxfTkFNRX1gXG4gICAgICApLnRlc3QocHJvcClcbiAgICApO1xuICB9XG5cbiAgaXNEZXZpY2VUeXBlKGRhc2hib2FyZDogUGFydGlhbDxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4pIHtcbiAgICByZXR1cm4gc29tZShrZXlzKGRhc2hib2FyZCksIHByb3AgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdQcm9wID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYF4ke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5UeXBlfSR7dGhpcy5JTkRFWF9TUExJVH1gXG4gICAgICApLnRlc3QocHJvcCk7XG4gICAgICBpZiAoIW1hdGNoaW5nUHJvcCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBtYXRjaGluZyBrZXksIGJ1dCBpdHMgdmFsdWUgY2FuIGJlIHt9IG9yIG51bGxcbiAgICAgICAgcmV0dXJuICEhZGFzaGJvYXJkW3Byb3BdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaXNEZXZpY2VEYXNoYm9hcmQoZGFzaGJvYXJkOiBQYXJ0aWFsPENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb21lKGtleXMoZGFzaGJvYXJkKSwgcHJvcCA9PlxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgYF4ke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5EZXZpY2V9JHt0aGlzLklOREVYX1NQTElUfWBcbiAgICAgICkudGVzdChwcm9wKVxuICAgICk7XG4gIH1cblxuICBpc0dyb3VwRGFzaGJvYXJkKGRhc2hib2FyZDogUGFydGlhbDxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc29tZShrZXlzKGRhc2hib2FyZCksIHByb3AgPT5cbiAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgIGBeJHt0aGlzLkZSQUdNRU5UX05BTUV9JHt0aGlzLklOREVYX1NQTElUfSR7Q29udGV4dERhc2hib2FyZFR5cGUuR3JvdXB9JHt0aGlzLklOREVYX1NQTElUfWBcbiAgICAgICkudGVzdChwcm9wKVxuICAgICk7XG4gIH1cblxuICBnZXRGaWx0ZXJlZERhc2hib2FyZFN0eWxlcyhzdHlsZUxpc3Q6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHN0eWxlTGlzdC5maWx0ZXIoYyA9PlxuICAgICAgU1RZTElOR19DTEFTU19QUkVGSVhFUy5zb21lKGNsYXNzUHJlZml4ID0+IGMuc3RhcnRzV2l0aChjbGFzc1ByZWZpeCkpXG4gICAgKTtcbiAgfVxuXG4gIGdldFN0eWxpbmcoc3R5bGVMaXN0LCBzdHlsZU5hbWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IHN0eWxpbmcgPSBzdHlsZUxpc3QuZmluZChcbiAgICAgIHN0eWxlID0+IHN0eWxlICYmIG5ldyBSZWdFeHAoYC0ke3N0eWxlTmFtZX0kYCwgJ2knKS50ZXN0KHN0eWxlLmNsYXNzKVxuICAgICk7XG4gICAgcmV0dXJuIHN0eWxpbmcgPyBzdHlsaW5nLmNsYXNzIDogZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgbWFwV2lkZ2V0cyh3aWRnZXRzOiBXaWRnZXRbXSkge1xuICAgIHJldHVybiBrZXlCeShcbiAgICAgIHdpZGdldHMubWFwKHdpZGdldCA9PiB7XG4gICAgICAgIHdpZGdldC5pZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zdWJzdHIoMik7XG4gICAgICAgIHJldHVybiB3aWRnZXQ7XG4gICAgICB9KSxcbiAgICAgICdpZCdcbiAgICApO1xuICB9XG5cbiAgZ2V0RGFzaGJvYXJkJChkYXNoYm9hcmRJZE9yTmFtZSwgZGFzaGJvYXJkVHlwZTogQ29udGV4dERhc2hib2FyZFR5cGVbXSwgbW8/OiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXQoZGFzaGJvYXJkSWRPck5hbWUpO1xuXG4gICAgY29uc3QgZGFzaGJvYXJkcyA9IG1vXG4gICAgICA/IHRoaXMuZ2V0Q29udGV4dERhc2hib2FyZHMobW8sIGRhc2hib2FyZFR5cGUpXG4gICAgICA6IHRoaXMuZ2V0TmFtZWREYXNoYm9hcmQoZGFzaGJvYXJkSWRPck5hbWUpO1xuXG4gICAgY29uc3QgY2FjaGVSZWZyZXNoID0gdGhpcy5nZXRDb250ZXh0RGFzaGJvYXJkcyQoZGFzaGJvYXJkcykucGlwZShcbiAgICAgIHRhcChkYXNoYm9hcmQgPT4gdGhpcy5jYWNoZURhc2hib2FyZChkYXNoYm9hcmQpKSxcbiAgICAgIGZpbHRlcihcbiAgICAgICAgZGFzaGJvYXJkID0+XG4gICAgICAgICAgZGFzaGJvYXJkLmlkID09PSBkYXNoYm9hcmRJZE9yTmFtZSB8fFxuICAgICAgICAgIGhhcyhcbiAgICAgICAgICAgIGRhc2hib2FyZCxcbiAgICAgICAgICAgIGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZH0ke3RoaXMuSU5ERVhfU1BMSVR9JHtkYXNoYm9hcmRJZE9yTmFtZX1gXG4gICAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNhY2hlID8gb2YoY2FjaGUpIDogY2FjaGVSZWZyZXNoO1xuICB9XG5cbiAgYXN5bmMgcGFzdGVEYXNoYm9hcmQobmV3Q29udGV4dDogRGFzaGJvYXJkQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvcHlDbGlwYm9hcmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZFRvUGFzdGUgPSB0aGlzLmNyZWF0ZUNvbnRleHREYXNoYm9hcmRDb3B5KFxuICAgICAgICAgIHRoaXMuY29weUNsaXBib2FyZC5kYXNoYm9hcmQsXG4gICAgICAgICAgbmV3Q29udGV4dC5jb250ZXh0RGF0YSxcbiAgICAgICAgICB0aGlzLmNvcHlDbGlwYm9hcmQuY29udGV4dC5jb250ZXh0RGF0YVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkYXNoYm9hcmQgPSBhd2FpdCB0aGlzLmNyZWF0ZSh0aGlzLmNsZWFuKGRhc2hib2FyZFRvUGFzdGUpLCBuZXdDb250ZXh0KTtcblxuICAgICAgICAvLyBsaW5raW5nIGNoaWxkQWRkaXRpb25zIGZvciBlLmcuIHRvIGdyYW50IGFjY2VzcyB0byB0aGUgaW1hZ2VzIHVwbG9hZGVkIGJ5IHRoZSBpbWFnZSB3aWRnZXQgZm9yIHVzZXJzIHdpdGggb25seSBpbnZlbnRvcnkgcm9sZXMuXG4gICAgICAgIGNvbnN0IHsgZGF0YTogY2hpbGRBZGRpdGlvbnMgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LmNoaWxkQWRkaXRpb25zTGlzdChcbiAgICAgICAgICB0aGlzLmNvcHlDbGlwYm9hcmQuZGFzaGJvYXJkSWQsXG4gICAgICAgICAgeyBwYWdlU2l6ZTogMjAwMCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChjaGlsZEFkZGl0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0J1bGtBZGQoY2hpbGRBZGRpdGlvbnMsIGRhc2hib2FyZC5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvcHlDbGlwYm9hcmQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb0Rhc2hib2FyZChkYXNoYm9hcmQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMuYWxlcnQud2FybmluZyhnZXR0ZXh0KCdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgZm9yIHRoaXMgYWN0aW9uLicpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBmcmFnbWVudCB0aGF0IGFzc29jaWF0ZXMgZGFzaGJvYXJkcyB3aXRoIGRldmljZS9hc3NldC4gSXQgY29uc2lzdHMgb2YgdGhyZWUgZWxlbWVudHM6XG4gICAqIC0gRlJBR01FTlRfTkFNRSAtIHN0YXRpYyBzdHJpbmdcbiAgICogLSBkYXNoYm9hcmQgdHlwZSAoZS5nLiAnZ3JvdXAnLCAnZGV2aWNlJylcbiAgICogLSBmcmFnbWVudCB2YWx1ZSAoIGlkIG9mIGRldmljZS9hc3NldCBpZiBpdCBpcyBub3QgdHlwZWQgZGFzaGJvYXJkOyBkZXZpY2VUeXBlVmFsdWUgcHJvcGVydHkgb2YgZGFzaGJvYXJkIGlmIGl0IGlzIHR5cGUgZGFzaGJvYXJkKVxuICAgKiBFeGFtcGxlIGZyYWdtZW50IGZvciBkZXZpY2UgZGFzaGJvYXJkOiAnYzh5X0Rhc2hib2FyZCFkZXZpY2UhNzczMjAwJ1xuICAgKiBFeGFtcGxlIGZyYWdtZW50IGZvciBncm91cCBkYXNoYm9hcmQ6ICdjOHlfRGFzaGJvYXJkIWdyb3VwITg0MTI5MjA4J1xuICAgKiBFeGFtcGxlIGZyYWdtZW50IGZvciB0eXBlZCBkZXZpY2UgZGFzaGJvYXJkOiAnYzh5X0Rhc2hib2FyZCF0eXBlIWM4eV9sd20ybV9jb25uZWN0b3JfZGV2aWNlJ1xuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dERhc2hib2FyZFR5cGUgVHlwZSBvZiBkYXNoYm9hcmRcbiAgICogQHBhcmFtIHZhbHVlIEZyYWdtZW50IHZhbHVlXG4gICAqIEByZXR1cm5zIEZyYWdtZW50IGZvciBkYXNoYm9hcmRcbiAgICovXG4gIGNyZWF0ZUZyYWdtZW50S2V5PFQgZXh0ZW5kcyBDb250ZXh0RGFzaGJvYXJkVHlwZSwgViBleHRlbmRzIHN0cmluZz4oXG4gICAgY29udGV4dERhc2hib2FyZFR5cGU6IFQsXG4gICAgdmFsdWU6IFZcbiAgKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtjb250ZXh0RGFzaGJvYXJkVHlwZX0ke3RoaXMuSU5ERVhfU1BMSVR9JHt2YWx1ZX1gIGFzIGNvbnN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBkYXNoYm9hcmQgY2FuIGJlIHNldCB0byB0eXBlIGRhc2hib2FyZC5cbiAgICogRmlyc3QsIGl0IGNoZWNrcyBpZiBkZXZpY2VUeXBlVmFsdWUgZXhpc3RzIGFuZCBpZiB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNldCBkYXNoYm9hcmQgdHlwZS5cbiAgICogVGhlbiwgY2FzZSBmcm9tIHNlbnNvciBhcHAgaXMgY2hlY2tlZC0gZGFzaGJvYXJkIGNyZWF0ZWQgd2l0aCBzZW5zb3IgYXBwIGhhcyBkZXZpY2VUeXBlIHNldCB0byB0cnVlIGJ1dFxuICAgKiB0eXBlIGZyYWdtZW50IGlzIG1pc3NpbmctIHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgY29tYmluYXRpb24uXG4gICAqIEBwYXJhbSBtbyBEYXNoYm9hcmQgbWFuYWdlZCBvYmplY3RcbiAgICogQHBhcmFtIGNvbnRleHQge0NvbnRleHREYXRhfSBDdXJyZW50IGNvbnRleHRcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBkYXNoYm9hcmQgY2FuIGJlIHNldCB0byB0eXBlIGRhc2hib2FyZCwgZmFsc2UgaWYgaXQgaXMgZm9yYmlkZGVuLlxuICAgKi9cbiAgc2hvdWxkQWxsb3dUb1NldERhc2hib2FyZFR5cGUoXG4gICAgbW86IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbnRleHQ6IENvbnRleHREYXRhXG4gICk6IEFsbG93VHlwZURhc2hib2FyZCB7XG4gICAgLy8gZGlzYWxsb3cgaWYgZGFzaGJvYXJkIG1hbmFnZWQgb2JqZWN0IG9yIGNvbnRleHQgaXMgbWlzc2luZyBvciBjb250ZXh0IGlzIG5vdCBkZXZpY2UvYXNzZXQvZ3JvdXBcbiAgICBpZiAoXG4gICAgICAhbW8gfHxcbiAgICAgICFjb250ZXh0Py5jb250ZXh0RGF0YSB8fFxuICAgICAgKGNvbnRleHQuY29udGV4dCAhPT0gVmlld0NvbnRleHQuRGV2aWNlICYmIGNvbnRleHQuY29udGV4dCAhPT0gVmlld0NvbnRleHQuR3JvdXApXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FsbG93JztcbiAgICB9XG5cbiAgICAvLyBpZiBjb250ZXh0IGlzIGFzc2V0L2dyb3VwIGFuZCB0eXBlIGRhc2hib2FyZCBmZWF0dXJlIGlzIGhpZGRlbiBmb3IgYXNzZXRzL2dyb3VwcyBvciBhc3NldC9ncm91cCBoYXMgbm8gdHlwLCByZXR1cm4gZGlzYWxsb3dcbiAgICBjb25zdCB0eXBlRGFzaGJvYXJkSGlkZGVuRm9yQXNzZXRzID0gdGhpcy5vcHRpb25zU2VydmljZS5nZXQoXG4gICAgICB0aGlzLkhJREVfVFlQRV9EQVNIQk9BUkRfRk9SX0FTU0VUUyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGlmIChcbiAgICAgIGNvbnRleHQuY29udGV4dCA9PT0gVmlld0NvbnRleHQuR3JvdXAgJiZcbiAgICAgICh0eXBlRGFzaGJvYXJkSGlkZGVuRm9yQXNzZXRzIHx8ICFjb250ZXh0LmNvbnRleHREYXRhLnR5cGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FsbG93JztcbiAgICB9XG5cbiAgICAvLyBpZiB1c2VyIGhhcyBubyBwZXJtaXNzaW9uIHRvIGNoYW5nZSBkYXNoYm9hcmQsIHJldHVybiBkaXNhbGxvd1xuICAgIGlmICghdGhpcy5wZXJtaXNzaW9ucy5oYXNBbnlSb2xlKHRoaXMuSU5WRU5UT1JZX1JPTEVTKSkge1xuICAgICAgcmV0dXJuICdkaXNhbGxvdyc7XG4gICAgfVxuXG4gICAgLy8gY2FzZSBmcm9tIHNlbnNvciBhcHAgaXMgY2hlY2tlZC0gZGFzaGJvYXJkIGNyZWF0ZWQgd2l0aCBzZW5zb3IgYXBwIGhhcyBkZXZpY2VUeXBlIHNldCB0byB0cnVlIGJ1dFxuICAgIC8vIHR5cGUgZnJhZ21lbnQgaXMgbWlzc2luZy0gd2UgZG8gbm90IHN1cHBvcnQgdGhpcyBjb21iaW5hdGlvbi5cbiAgICBjb25zdCB0eXBlRnJhZ21lbnQgPSB0aGlzLmNyZWF0ZUZyYWdtZW50S2V5KFxuICAgICAgQ29udGV4dERhc2hib2FyZFR5cGUuVHlwZSxcbiAgICAgIGNvbnRleHQ/LmNvbnRleHREYXRhPy50eXBlXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICBtbz8uYzh5X0Rhc2hib2FyZCAmJlxuICAgICAgbW8/LmM4eV9EYXNoYm9hcmQuZGV2aWNlVHlwZSAmJlxuICAgICAgY29udGV4dD8uY29udGV4dERhdGE/LnR5cGUgJiZcbiAgICAgICFtb1t0eXBlRnJhZ21lbnRdXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FsbG93JztcbiAgICB9XG5cbiAgICAvLyBpZiB2aWV3IGNvbnRleHQgaXMgRGV2aWNlIGFuZCBjb250ZXh0RGF0YSBvZiB0aGlzIGRldmljZSBoYXMgbm8gdHlwZSB5ZXQgYnV0IHR5cGUgZGFzaGJvYXJkIGNhbiBiZSBzZXQgd2hlbiB0eXBlIGlzIGZpbGxlZCxcbiAgICAvLyByZXR1cm4gYWxsb3dfaWZfdHlwZV9maWxsZWRcbiAgICBpZiAoXG4gICAgICAhY29udGV4dD8uY29udGV4dERhdGE/LnR5cGUgJiZcbiAgICAgIGNvbnRleHQuY29udGV4dCA9PT0gVmlld0NvbnRleHQuRGV2aWNlICYmXG4gICAgICB0aGlzLnBlcm1pc3Npb25zLmhhc0FueVJvbGUodGhpcy5JTlZFTlRPUllfUk9MRVMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2FsbG93X2lmX3R5cGVfZmlsbGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ2FsbG93JztcbiAgfVxuXG4gIGNyZWF0ZVJlcG9ydChyZXBvcnRDZmc6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+KSB7XG4gICAgY29uc3QgcmVwb3J0OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PiA9IHt9O1xuICAgIE9iamVjdC5hc3NpZ24ocmVwb3J0LCByZXBvcnRDZmcpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVwb3J0LCB7IGM4eV9SZXBvcnQ6IHt9IH0pO1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5jcmVhdGUocmVwb3J0KTtcbiAgfVxuXG4gIGFkZFJlcG9ydE5hdmlnYXRvck5vZGUocmVwb3J0OiBJTWFuYWdlZE9iamVjdCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGUgPSBuZXcgTmF2aWdhdG9yTm9kZSh7XG4gICAgICBsYWJlbDogcmVwb3J0Lm5hbWUsXG4gICAgICBwYXRoOiBgcmVwb3J0cy8ke3JlcG9ydC5pZH1gLFxuICAgICAgaWNvbjogcmVwb3J0Lmljb24sXG4gICAgICBwcmlvcml0eTogcmVwb3J0LnByaW9yaXR5XG4gICAgfSk7XG4gICAgdGhpcy5uYXZpZ2F0b3IuYWRkKG5vZGUpO1xuICB9XG5cbiAgZ2V0Q29udGV4dEZvckdTKG1vOiBJTWFuYWdlZE9iamVjdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmdyb3VwU2VydmljZS5pc0RldmljZShtbykpIHtcbiAgICAgIHJldHVybiBQUk9EVUNUX0VYUEVSSUVOQ0UuREFTSEJPQVJELkNPTlRFWFQuREVWSUNFO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncm91cFNlcnZpY2UuaXNBc3NldChtbykpIHtcbiAgICAgIHJldHVybiBQUk9EVUNUX0VYUEVSSUVOQ0UuREFTSEJPQVJELkNPTlRFWFQuQVNTRVQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLmdyb3VwU2VydmljZS5pc0dyb3VwKG1vKSkge1xuICAgICAgcmV0dXJuIFBST0RVQ1RfRVhQRVJJRU5DRS5EQVNIQk9BUkQuQ09OVEVYVC5HUk9VUDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q29udGV4dERhc2hib2FyZHMoXG4gICAgbW86IElNYW5hZ2VkT2JqZWN0LFxuICAgIGRhc2hib2FyZFR5cGU6IENvbnRleHREYXNoYm9hcmRUeXBlW11cbiAgKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBmaWx0ZXJDcml0ZXJpYSA9IGRhc2hib2FyZFR5cGUubWFwKHQgPT4gKHtcbiAgICAgIC8vIGl0J3MgbmVjZXNzYXJ5IHRvIHdyYXAgZnJhZ21lbnQgaW4gcXVvdGVzIGJlY2F1c2UgZGFzaGJvYXJkIHR5cGUgY2FuIGNvbnRhaW4gc3BhY2VzXG4gICAgICBfX2hhczogYCcke3RoaXMuY3JlYXRlRGFzaGJvYXJkRnJhZ21lbnQobW8sIHQpfSdgXG4gICAgfSkpO1xuXG4gICAgLy8gdGhlIGhhcyBxdWVyeSBhYm92ZSBkb2VzIG5vdCB3b3JrIGZvciBkZXZpY2UgdHlwZSBkYXNoYm9hcmRzIHdoZXJlIHRoZSB0eXBlIGNvbnRhaW5zIGEgZG90XG4gICAgY29uc3QgdHlwZUZpbHRlckNyaXRlcmlhID1cbiAgICAgIGRhc2hib2FyZFR5cGUuaW5jbHVkZXMoQ29udGV4dERhc2hib2FyZFR5cGUuVHlwZSkgJiYgbW8udHlwZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIF9fYW5kOiBbXG4gICAgICAgICAgICAgIHsgJ2M4eV9EYXNoYm9hcmQuZGV2aWNlVHlwZSc6IHsgX19lcTogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAgIHsgJ2M4eV9EYXNoYm9hcmQuZGV2aWNlVHlwZVZhbHVlJzogeyBfX2VxOiBtby50eXBlIH0gfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmluYWxGaWx0ZXJDcml0ZXJpYSA9IHR5cGVGaWx0ZXJDcml0ZXJpYVxuICAgICAgPyBbLi4uZmlsdGVyQ3JpdGVyaWEsIHR5cGVGaWx0ZXJDcml0ZXJpYV1cbiAgICAgIDogZmlsdGVyQ3JpdGVyaWE7XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYnVpbGRRdWVyeSh7IF9fZmlsdGVyOiB7IF9fb3I6IGZpbmFsRmlsdGVyQ3JpdGVyaWEgfSB9KTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGNhY2hlSGFzVmFsaWRSZXNwb25zZSA9XG4gICAgICB0aGlzLmNvbnRleHREYXNoYm9hcmRzQ2FjaGUgJiZcbiAgICAgIHRoaXMuY29udGV4dERhc2hib2FyZHNDYWNoZS5xdWVyeSA9PT0gcXVlcnkgJiZcbiAgICAgIG5vdyAtIHRoaXMuY29udGV4dERhc2hib2FyZHNDYWNoZS50aW1lc3RhbXAgPCB0aGlzLkNBQ0hFX1RJTUVPVVQ7XG5cbiAgICBpZiAoY2FjaGVIYXNWYWxpZFJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0RGFzaGJvYXJkc0NhY2hlLnJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0RGFzaGJvYXJkc0NhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHREYXNoYm9hcmRzQ2FjaGUgPSB7XG4gICAgICBxdWVyeSxcbiAgICAgIHJlc3VsdDogdGhpcy5pbnZlbnRvcnkubGlzdCh7IHF1ZXJ5LCBwYWdlU2l6ZTogdGhpcy5ERUZBVUxUX1BBR0VTSVpFIH0pLFxuICAgICAgdGltZXN0YW1wOiBub3dcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvbnRleHREYXNoYm9hcmRzQ2FjaGUucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0dXBsZSBkZXNjcmliaW5nIHRoZSBkYXNoYm9hcmQgdHlwZSBhbmQgaXRzIGZyYWdtZW50cy4gRm9yIGFzc2V0cyBsaWtlIGRldmljZXMgYW5kIGdyb3VwcywgaXQncyBwb3NzaWJsZVxuICAgKiB0byBoYXZlIHR3byBmcmFnbWVudHM6IG9uZSBpbmRpY2F0aW5nIHRoaXMgcGFydGljdWxhciBkZXZpY2UvYXNzZXQgd2l0aCBpdHMgSUQsIGFuZCB0aGUgc2Vjb25kIGluZGljYXRpbmdcbiAgICogdGhlIGRldmljZS9hc3NldCB0eXBlIChpZiB0aGUgZGFzaGJvYXJkIGlzIG1lYW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGFzc2V0cyBvZiB0aGlzIHR5cGUpLlxuICAgKlxuICAgKiBAcGFyYW0gZGFzaGJvYXJkTU8gLSBEYXNoYm9hcmQgbWFuYWdlZCBvYmplY3QuXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gQ29udGV4dCBkYXRhIG9mIGFzc2V0LlxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGRhc2hib2FyZC5cbiAgICogQHBhcmFtIGlzRWRpdCAtIFRydWUgaWYgZXhpc3RpbmcgZGFzaGJvYXJkIGlzIHVwZGF0ZWQsIGZhbHNlIHdoZW4gaXQncyBjcmVhdGlvbiBvZiBuZXcgZGFzaGJvYXJkLlxuICAgKiBAcmV0dXJucyBUdXBsZSBvZiBkYXNoYm9hcmQgdHlwZSBhbmQgb2JqZWN0IGNvbnRhaW5pbmcgZGFzaGJvYXJkIGZyYWdtZW50cy5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGFzaGJvYXJkRnJhZ21lbnRzKFxuICAgIGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCxcbiAgICBjb250ZXh0OiBDb250ZXh0RGF0YSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaXNFZGl0OiBib29sZWFuXG4gICk6IFtDb250ZXh0RGFzaGJvYXJkVHlwZSwgUmVjb3JkPHN0cmluZywgb2JqZWN0Pl0ge1xuICAgIGxldCBkYXNoYm9hcmRUeXBlOiBDb250ZXh0RGFzaGJvYXJkVHlwZTtcbiAgICBjb25zdCBpZCA9IChjb250ZXh0Py5jb250ZXh0RGF0YT8uaWQgYXMgc3RyaW5nKSB8fCAnJztcbiAgICBjb25zdCBmcmFnbWVudHM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4gPSB7fTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICAvLyBhIG5hbWVkIGRhc2hib2FyZCBzaG91bGQgbm90IHJlY2VpdmUgYW55IG90aGVyIGZyYWdtZW50c1xuICAgICAgZGFzaGJvYXJkVHlwZSA9IENvbnRleHREYXNoYm9hcmRUeXBlLk5hbWVkO1xuICAgICAgY29uc3QgbmFtZWRGcmFnbWVudEtleSA9IHRoaXMuY3JlYXRlRnJhZ21lbnRLZXkoQ29udGV4dERhc2hib2FyZFR5cGUuTmFtZWQsIG5hbWUpO1xuICAgICAgZnJhZ21lbnRzW25hbWVkRnJhZ21lbnRLZXldID0ge307XG4gICAgfSBlbHNlIGlmIChjb250ZXh0Py5jb250ZXh0ID09PSBWaWV3Q29udGV4dC5EZXZpY2UgfHwgY29udGV4dD8uY29udGV4dCA9PT0gVmlld0NvbnRleHQuR3JvdXApIHtcbiAgICAgIC8vIGdldCBiYXNlIHR5cGUgZm9yIGRldmljZSBvciBncm91cFxuICAgICAgY29uc3QgZGVmYXVsdFR5cGUgPVxuICAgICAgICBjb250ZXh0LmNvbnRleHQgPT09IFZpZXdDb250ZXh0LkRldmljZVxuICAgICAgICAgID8gQ29udGV4dERhc2hib2FyZFR5cGUuRGV2aWNlXG4gICAgICAgICAgOiBDb250ZXh0RGFzaGJvYXJkVHlwZS5Hcm91cDtcbiAgICAgIGRhc2hib2FyZFR5cGUgPSBkYXNoYm9hcmRNTy5jOHlfRGFzaGJvYXJkLmRldmljZVR5cGVcbiAgICAgICAgPyBDb250ZXh0RGFzaGJvYXJkVHlwZS5UeXBlXG4gICAgICAgIDogZGVmYXVsdFR5cGU7XG5cbiAgICAgIC8vIGNsZWFyIGZyYWdtZW50cyBmcm9tIG90aGVyIGFzc2V0IGlmIGN1cnJlbnQgYXNzZXQgaXMgbm90IG9yaWdpbiBvZiB0aGlzIGRhc2hib2FyZFxuICAgICAgdGhpcy5jbGVhclJlZHVuZGFudEZyYWdtZW50KGRhc2hib2FyZE1PLCBkZWZhdWx0VHlwZSwgZnJhZ21lbnRzKTtcblxuICAgICAgLy8gYWRkIGJhc2UgZnJhZ21lbnQgZm9yIHBhcnRpY3VsYXIgYXNzZXRcbiAgICAgIGNvbnN0IGRldmljZU9yR3JvdXBGcmFnbWVudEtleSA9IHRoaXMuY3JlYXRlRnJhZ21lbnRLZXkoZGVmYXVsdFR5cGUsIGlkKTtcbiAgICAgIGZyYWdtZW50c1tkZXZpY2VPckdyb3VwRnJhZ21lbnRLZXldID0ge307XG5cbiAgICAgIC8vIGFkZCBvciBjbGVhciB0eXBlIGZyYWdtZW50XG4gICAgICBpZiAoZGFzaGJvYXJkTU8uYzh5X0Rhc2hib2FyZC5kZXZpY2VUeXBlIHx8IGlzRWRpdCkge1xuICAgICAgICBjb25zdCB0eXBlRnJhZ21lbnRLZXkgPSB0aGlzLmNyZWF0ZUZyYWdtZW50S2V5KFxuICAgICAgICAgIENvbnRleHREYXNoYm9hcmRUeXBlLlR5cGUsXG4gICAgICAgICAgZGFzaGJvYXJkTU8uYzh5X0Rhc2hib2FyZC5kZXZpY2VUeXBlVmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgZnJhZ21lbnRzW3R5cGVGcmFnbWVudEtleV0gPSBkYXNoYm9hcmRNTy5jOHlfRGFzaGJvYXJkLmRldmljZVR5cGUgPyB7fSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtkYXNoYm9hcmRUeXBlLCBmcmFnbWVudHNdO1xuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgZnJhZ21lbnRzIHRoYXQgb3JpZ2luYXRlcyBmcm9tIG90aGVyIG1hbmFnZWQgb2JqZWN0LlxuICAgKiBFLmcuIHR5cGVkIGRhc2hib2FyZCBpcyBjcmVhdGVkIGZvciBkZXZpY2UgQSBvZiB0eXBlIGM4eV9NUVRURGV2aWNlIGFuZCBpZCAxLCBzbyBpdCBnZXRzIGZyYWdtZW50cyBvYmplY3RcbiAgICogYGBgdHNcbiAgICoge1xuICAgKiBjOHlfRGFzaGJvYXJkIWRldmljZSExOiB7fSxcbiAgICogYzh5X0Rhc2hib2FyZCF0eXBlIWM4eV9NUVRURGV2aWNlOiB7fVxuICAgKiB9XG4gICAqYGBgXG4gICAqIHRoZW4sIG9uIGRldmljZSBCIG9mIHR5cGUgYzh5X01RVFREZXZpY2UgYW5kIGlkIDIsIHdoaWNoIGFsc28gaGFzIGFjY2VzcyB0byB0aGlzIGRhc2hib2FyZCwgZGV2aWNlVHlwZSBpcyBzZXQgdG9cbiAgICogZmFsc2UsIHNvIGRhc2hib2FyZCBpcyBub3QgdHlwZWQgZGFzaGJvYXJkIGFueW1vcmUgYW5kIG5vdyBiZWxvbmdzIHRvIGRldmljZSBCLCB0aGVyZWZvcmUgZnJhZ21lbnRzIHNob3VsZCBsb29rIGxpa2VcbiAgICogYGBgdHNcbiAgICoge1xuICAgKiBjOHlfRGFzaGJvYXJkIWRldmljZSExOiBudWxsLCAvLyB0aGlzIHZhbHVlIGlzIGNsZWFyZWQgYmVjYXVzZSBkYXNoYm9hcmQgaXMgZG9lc24ndCBiZWxvbmcgdG8gZGV2aWNlIEEgYW55bW9yZVxuICAgKiBjOHlfRGFzaGJvYXJkIWRldmljZSEyOiB7fSwgLy8gYXNzaWduIGRhc2hib2FyZCB0byBkZXZpY2UgQlxuICAgKiBjOHlfRGFzaGJvYXJkIXR5cGUhYzh5X01RVFREZXZpY2U6IG51bGwgLy8gdGhpcyB2YWx1ZSBpcyBjbGVhcmVkIGluIGdldERhc2hib2FyZEZyYWdtZW50cyBtZXRob2QgYXMgaXQncyBub3QgdHlwZWQgZGFzaGJvYXJkIGFueW1vcmVcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE1PIC0gRGFzaGJvYXJkIG1hbmFnZWQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdHlwZSAtIENvbnRleHQgZGFzaGJvYXJkIHR5cGUuXG4gICAqIEBwYXJhbSBmcmFnbWVudHMgLSBGcmFnbWVudHMgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhclJlZHVuZGFudEZyYWdtZW50KFxuICAgIGRhc2hib2FyZE1POiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCxcbiAgICB0eXBlOiBDb250ZXh0RGFzaGJvYXJkVHlwZSxcbiAgICBmcmFnbWVudHM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD5cbiAgKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXMoZGFzaGJvYXJkTU8pXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCh0aGlzLmNyZWF0ZUZyYWdtZW50S2V5KHR5cGUsICcnKSkpXG4gICAgICAuZm9yRWFjaChrZXkgPT4gKGZyYWdtZW50c1trZXldID0gbnVsbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWlncmF0ZSBkYXNoYm9hcmRzIGZyb20gcHJldmlvdXMgMTIgY29sdW1ucyBsYXlvdXQgdG8gMjQgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zPFQgZXh0ZW5kcyB7IGM4eV9EYXNoYm9hcmQ/OiBDb250ZXh0RGFzaGJvYXJkIH0+KFxuICAgIGRhc2hib2FyZHM6IFRbXVxuICApOiBUW107XG4gIHByaXZhdGUgYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zPFQgZXh0ZW5kcyB7IGM4eV9EYXNoYm9hcmQ/OiBDb250ZXh0RGFzaGJvYXJkIH0+KFxuICAgIGRhc2hib2FyZHM6IFRcbiAgKTogVDtcbiAgcHJpdmF0ZSBhZGp1c3REYXNoYm9hcmRGb3IyNENvbHVtbnM8VCBleHRlbmRzIHsgYzh5X0Rhc2hib2FyZD86IENvbnRleHREYXNoYm9hcmQgfT4oXG4gICAgZGFzaGJvYXJkczogVCB8IFRbXVxuICApOiBUIHwgVFtdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXNoYm9hcmRzKSkge1xuICAgICAgcmV0dXJuIGRhc2hib2FyZHMubWFwKGRhc2hib2FyZCA9PiB0aGlzLmFkanVzdERhc2hib2FyZEZvcjI0Q29sdW1ucyhkYXNoYm9hcmQpKTtcbiAgICB9XG4gICAgLy8gaWYgYGNvbHVtbnNgIGF0dHJpYnV0ZSBleGlzdHMsIGRhc2hib2FyZCB3YXMgYWxyZWFkeSBhZGp1c3RlZC5cbiAgICBpZiAoZGFzaGJvYXJkcy5jOHlfRGFzaGJvYXJkLmNvbHVtbnMpIHtcbiAgICAgIHJldHVybiBkYXNoYm9hcmRzO1xuICAgIH1cblxuICAgIGRhc2hib2FyZHMuYzh5X0Rhc2hib2FyZC5jb2x1bW5zID0gMjQ7XG4gICAgaWYgKCFkYXNoYm9hcmRzLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBkYXNoYm9hcmRzO1xuICAgIH1cblxuICAgIC8vIE5ld2x5IGNyZWF0ZWQgTmFtZWRDb250ZXh0RGFzaGJvYXJkcyBhcmUgc3RpbGwgY3JlYXRlZCB3aXRoIDEyIGNvbHVtbnMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIC8vIERlZmF1bHQgd2lkZ2V0cyBtaWdodCBiZSBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIDI0IGNvbHVtbnMuXG4gICAgLy8gSWYgYSB3aWRnZXQgaXMgYWxyZWFkeSBjb25maWd1cmVkIGZvciBtb3JlIHRoYW4gMTIgY29sdW1ucywgd2Ugc2hvdWxkIG5vdCBhZGp1c3QgaXQuXG4gICAgY29uc3QgYWxyZWFkeUhhc1dpZGdldHNDb25maWd1cmVkRm9yTW9yZVRoYW4xMkNvbHVtbnMgPSBPYmplY3QudmFsdWVzKFxuICAgICAgZGFzaGJvYXJkcy5jOHlfRGFzaGJvYXJkLmNoaWxkcmVuXG4gICAgKS5zb21lKHdpZGdldCA9PiB3aWRnZXQuX3ggKyB3aWRnZXQuX3dpZHRoID4gMTIpO1xuICAgIGlmIChhbHJlYWR5SGFzV2lkZ2V0c0NvbmZpZ3VyZWRGb3JNb3JlVGhhbjEyQ29sdW1ucykge1xuICAgICAgcmV0dXJuIGRhc2hib2FyZHM7XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBtdWx0aXBseSBib3RoIF93aWR0aCBhbmQgX3ggYXR0cmlidXRlcyB3aXRoIDIgdG8gbWlncmF0ZSBmcm9tIDEyIHRvIDI0IGNvbHVtbnMuXG4gICAgT2JqZWN0LnZhbHVlcyhkYXNoYm9hcmRzLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4pLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgIGlmICh3aWRnZXQuX3dpZHRoKSB7XG4gICAgICAgIHdpZGdldC5fd2lkdGggPSB3aWRnZXQuX3dpZHRoICogMjtcbiAgICAgIH1cbiAgICAgIGlmICh3aWRnZXQuX3gpIHtcbiAgICAgICAgd2lkZ2V0Ll94ID0gd2lkZ2V0Ll94ICogMjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGFzaGJvYXJkcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VyaWFsaXplV2lkZ2V0Q29uZmlncyhkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjbG9uZURlZXAoZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4pO1xuICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlncyA9IE9iamVjdC52YWx1ZXMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IGRldGFpbHMgPSBjb25maWdzLm1hcCgoeyBjb21wb25lbnRJZCwgY29uZmlnIH0pID0+ICh7IGNvbXBvbmVudElkLCBjb25maWcgfSkpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmR5bmFtaWNDb21wb25lbnQuc2VyaWFsaXplQ29uZmlncyhkZXRhaWxzKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaW5kZXgpID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHNldChkZXRhaWxzW2luZGV4XS5jb25maWcsIGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGFzaGJvYXJkLmM4eV9EYXNoYm9hcmQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29udGV4dERhc2hib2FyZENvcHkoXG4gICAgZGFzaDogQ29udGV4dERhc2hib2FyZCxcbiAgICBuZXdDb250ZXh0OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PixcbiAgICBvbGRDb250ZXh0OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PlxuICApOiBDb250ZXh0RGFzaGJvYXJkIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHJlZHVjZShcbiAgICAgIGRhc2guY2hpbGRyZW4sXG4gICAgICAoX2NoaWxkcmVuLCBjaGlsZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGlkIH0gPSBjaGlsZDtcbiAgICAgICAgY29uc3QgY2ZnID0gY2hpbGQuY29uZmlnO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVG9Db3B5ID0ge1xuICAgICAgICAgIGRldmljZTogZGV2aWNlID0+IHRoaXMucmVwbGFjZUNvbnRleHRJbk9iaihkZXZpY2UsIG5ld0NvbnRleHQsIG9sZENvbnRleHQpLFxuICAgICAgICAgIGRhdGFwb2ludHM6IGRhdGFQb2ludHMgPT5cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUNvbnRleHRJbkRhdGFQb2ludHMoZGF0YVBvaW50cywgbmV3Q29udGV4dCwgb2xkQ29udGV4dCksXG4gICAgICAgICAgZGF0YVBvaW50czogZGF0YVBvaW50cyA9PlxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ29udGV4dEluRGF0YVBvaW50cyhkYXRhUG9pbnRzLCBuZXdDb250ZXh0LCBvbGRDb250ZXh0KSxcbiAgICAgICAgICBkYXRhcG9pbnRzR2F1Z2U6IGRhdGFQb2ludHMgPT5cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUNvbnRleHRJbkRhdGFQb2ludHMoZGF0YVBvaW50cywgbmV3Q29udGV4dCwgb2xkQ29udGV4dCksXG4gICAgICAgICAgZGF0YXBvaW50c0xhYmVsczogZGF0YVBvaW50cyA9PlxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ29udGV4dEluRGF0YVBvaW50cyhkYXRhUG9pbnRzLCBuZXdDb250ZXh0LCBvbGRDb250ZXh0KVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKGNmZywgcHJvcGVydGllc1RvQ29weSk7XG4gICAgICAgICAgaWYgKGNmZy5vcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKGNmZy5vcHRpb25zLCBwcm9wZXJ0aWVzVG9Db3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfY2hpbGRyZW5baWRdID0gY2xvbmVEZWVwKGNoaWxkKTtcbiAgICAgICAgcmV0dXJuIF9jaGlsZHJlbjtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG5cbiAgICBkYXNoLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICBjb25zdCBpc1R5cGVEYXNoYm9hcmQgPSBkYXNoLmRldmljZVR5cGUgJiYgISFkYXNoLmRldmljZVR5cGVWYWx1ZTtcbiAgICBpZiAoaXNUeXBlRGFzaGJvYXJkKSB7XG4gICAgICBkYXNoLmRldmljZVR5cGVWYWx1ZSA9IG5ld0NvbnRleHQudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhc2g7XG4gIH1cblxuICBwcml2YXRlIGNvcHlQcm9wZXJ0aWVzKG9iaiwgcHJvcGVydGllc1RvQ29weSkge1xuICAgIGZvckVhY2gocHJvcGVydGllc1RvQ29weSwgKGNvcHlGbiwgcHJvcGVydHkpID0+IHtcbiAgICAgIGlmIChvYmpbcHJvcGVydHldKSB7XG4gICAgICAgIG9ialtwcm9wZXJ0eV0gPSBjb3B5Rm4ob2JqW3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VDb250ZXh0SW5EYXRhUG9pbnRzKFxuICAgIGRhdGFQb2ludHMsXG4gICAgbmV3Q29udGV4dDogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4sXG4gICAgb2xkQ29udGV4dDogUGFydGlhbDxJTWFuYWdlZE9iamVjdD5cbiAgKSB7XG4gICAgZGF0YVBvaW50cy5mb3JFYWNoKGRwID0+IHtcbiAgICAgIGRwLl9fdGFyZ2V0ID0gdGhpcy5yZXBsYWNlQ29udGV4dEluT2JqKGRwLl9fdGFyZ2V0LCBuZXdDb250ZXh0LCBvbGRDb250ZXh0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YVBvaW50cztcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZUNvbnRleHRJbk9iaihcbiAgICBvYmo6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LFxuICAgIG5ld0NvbnRleHQ6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LFxuICAgIG9sZENvbnRleHQ6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+XG4gICkge1xuICAgIGlmIChvYmogJiYgb2JqLmlkID09PSBvbGRDb250ZXh0LmlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwgcGljayhuZXdDb250ZXh0LCBbJ2lkJywgJ25hbWUnXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWJzJChcbiAgICBtbzogQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3QsXG4gICAgZGFzaGJvYXJkVHlwZTogQ29udGV4dERhc2hib2FyZFR5cGVbXSxcbiAgICBjb250ZXh0PzogQ29udGV4dERhdGFcbiAgKSB7XG4gICAgY29uc3QgZGFzaGJvYXJkcyA9IHRoaXMuZ2V0Q29udGV4dERhc2hib2FyZHMobW8sIGRhc2hib2FyZFR5cGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERhc2hib2FyZHMkKGRhc2hib2FyZHMpLnBpcGUoXG4gICAgICBtZXJnZU1hcChkYXNoYm9hcmQgPT4gdGhpcy52ZXJpZnlEYXNoYm9hcmRBdmFpbGFiaWxpdHkkKGRhc2hib2FyZCkpLFxuICAgICAgLy8gRHVlIHRvIE1UTS02MjMyMSBuYW1lZCBjb250ZXh0IGRhc2hib2FyZHMgaW5jbHVkZWQgZnJhZ21lbnRzIGZvciBkZXZpY2UgYW5kIGdyb3Vwcy5cbiAgICAgIC8vIHRoZXJlZm9yZSBzb21lIGRldmljZS1pbmZvIGRhc2hib2FyZHMgKGZyb20gRE0gYXBwKSBtaWdodCBvY2N1ciBpbiBjb2NrcGl0IG9uIGRldmljZSBsZXZlbC5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZmlsdGVyIHRob3NlIG91dC4uXG4gICAgICBmaWx0ZXIoKFtkYXNoYm9hcmRdKSA9PiB7XG4gICAgICAgIC8vIGxpc3QgYWxsIGlkZW50aWZpZXJzIG9mIHRoZSBkYXNoYm9hcmQgKG5hbWUsIGRldmljZSwgZ3JvdXAsIHR5cGUpXG4gICAgICAgIGNvbnN0IGRhc2hib2FyZElkZW50aWZpZXJzID0gT2JqZWN0LmtleXMoZGFzaGJvYXJkKVxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9YCkpXG4gICAgICAgICAgLm1hcChrZXkgPT4ga2V5LnNwbGl0KHRoaXMuSU5ERVhfU1BMSVQpWzFdKTtcbiAgICAgICAgLy8gaWYgZGFzaGJvYXJkIGlzIG5vdCBuYW1lZCwgaXQncyBzYWZlIHRvIGluY2x1ZGUgaXRcbiAgICAgICAgaWYgKCFkYXNoYm9hcmRJZGVudGlmaWVycy5pbmNsdWRlcyhDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBkYXNoYm9hcmQgaXMgbmFtZWQsIGJ1dCBhbHNvIGhhcyBhIGNvbnRleHQgaWRlbnRpZmllciwgd2Ugc2tpcCBpdFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGFzaGJvYXJkSWRlbnRpZmllcnMuaW5jbHVkZXMoQ29udGV4dERhc2hib2FyZFR5cGUuRGV2aWNlKSB8fFxuICAgICAgICAgIGRhc2hib2FyZElkZW50aWZpZXJzLmluY2x1ZGVzKENvbnRleHREYXNoYm9hcmRUeXBlLkdyb3VwKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbGwgb3RoZXJzIGFyZSBnb29kLi5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KSxcbiAgICAgIG1lcmdlTWFwKChbZGFzaGJvYXJkXSkgPT4gdGhpcy5yZW1vdmVEYXNoYm9hcmRNb1Byb3BlcnR5KGRhc2hib2FyZCkpLFxuICAgICAgdGFwKGRhc2hib2FyZCA9PiB0aGlzLmNhY2hlRGFzaGJvYXJkKGRhc2hib2FyZCkpLFxuICAgICAgbWFwKGRhc2hib2FyZCA9PiB0aGlzLmNyZWF0ZURhc2hib2FyZFRhYihkYXNoYm9hcmQsIGNvbnRleHQpKSxcbiAgICAgIHRvQXJyYXkoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeURhc2hib2FyZEF2YWlsYWJpbGl0eSQoZGFzaGJvYXJkOiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IGdsb2JhbFJvbGVzSWRzID0gZGFzaGJvYXJkPy5jOHlfRGFzaGJvYXJkPy5nbG9iYWxSb2xlc0lkcztcbiAgICBjb25zdCBjYW5FZGl0ID0gZnJvbShcbiAgICAgIHRoaXMucGVybWlzc2lvbnMuY2FuRWRpdCh0aGlzLklOVkVOVE9SWV9ST0xFUywgZGFzaGJvYXJkLCB7IHNraXBSZXF1ZXN0Q2hlY2s6IHRydWUgfSlcbiAgICApO1xuICAgIGNvbnN0IGhhc0FueUdsb2JhbFJvbGUgPVxuICAgICAgIWdsb2JhbFJvbGVzSWRzIHx8IGdsb2JhbFJvbGVzSWRzID09PSBBTExfR0xPQkFMX1JPTEVTX1NFTEVDVEVEXG4gICAgICAgID8gb2YodHJ1ZSlcbiAgICAgICAgOiBvZih0aGlzLnBlcm1pc3Npb25zLmhhc0FueUdsb2JhbFJvbGUoZ2xvYmFsUm9sZXNJZHMpKTtcblxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtvZihkYXNoYm9hcmQpLCBjYW5FZGl0LCBoYXNBbnlHbG9iYWxSb2xlXSkucGlwZShcbiAgICAgIGZpbHRlcigoWywgY2FuRWRpdCwgaGFzQW55R2xvYmFsUm9sZV0pID0+IGNhbkVkaXQgfHwgaGFzQW55R2xvYmFsUm9sZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZXh0RGFzaGJvYXJkcyQocmVxdWVzdDogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+KSB7XG4gICAgcmV0dXJuIGZyb20ocmVxdWVzdCkucGlwZShcbiAgICAgIG1lcmdlTWFwKHJlc3BvbnNlID0+XG4gICAgICAgIHRoaXMuYWRqdXN0RGFzaGJvYXJkRm9yMjRDb2x1bW5zKHJlc3BvbnNlLmRhdGEgYXMgQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3RbXSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhbHJlYWR5IGNvcnJ1cHRlZCBkYXNoYm9hcmRzIGZyb20gZGFzaGJvYXJkTW8gcHJvcGVydHkuXG4gICAqIEFkZGVkIHRvIGZpeCBkYXNoYm9hcmRzIG9uIHRoZSBjbG91ZCBpbnN0YW5jZSAoZXUtbGF0ZXN0KS5cbiAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBnb2luZyB0byBiZSByZW1vdmVkIGFmdGVyIDEwMDcuNy4wLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVEYXNoYm9hcmRNb1Byb3BlcnR5KFxuICAgIGRhc2hib2FyZDogQ29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdD4ge1xuICAgIGNvbnN0IGRhc2hib2FyZENvcHkgPSBjbG9uZURlZXAoZGFzaGJvYXJkKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGdldChkYXNoYm9hcmRDb3B5LCAnYzh5X0Rhc2hib2FyZC5jaGlsZHJlbicpO1xuICAgIGxldCB1cGRhdGVEYXNoYm9hcmQgPSBmYWxzZTtcblxuICAgIGZvckVhY2goY2hpbGRyZW4sIGNoaWxkID0+IHtcbiAgICAgIGlmIChnZXQoY2hpbGQsICdjb21wb25lbnRUcmFuc2Zvcm1Db25maWdXaXRoQ29udGV4dCcpKSB7XG4gICAgICAgIGRlbGV0ZSBjaGlsZC5jb21wb25lbnRUcmFuc2Zvcm1Db25maWdXaXRoQ29udGV4dDtcbiAgICAgICAgdXBkYXRlRGFzaGJvYXJkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnZXQoY2hpbGQsICdjb25maWcuZGFzaGJvYXJkTW8nKSkge1xuICAgICAgICBkZWxldGUgY2hpbGQuY29uZmlnLmRhc2hib2FyZE1vO1xuICAgICAgICB1cGRhdGVEYXNoYm9hcmQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHVwZGF0ZURhc2hib2FyZCkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGUoZGFzaGJvYXJkQ29weSk7XG4gICAgfVxuICAgIHJldHVybiBkYXNoYm9hcmRDb3B5O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZURhc2hib2FyZChkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0KSB7XG4gICAgdGhpcy5jYWNoZS5zZXQoZGFzaGJvYXJkLmlkLCBkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXNoYm9hcmRUYWIoZGFzaGJvYXJkOiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCwgY29udGV4dD86IENvbnRleHREYXRhKSB7XG4gICAgY29uc3QgeyBjOHlfRGFzaGJvYXJkOiBfZGFzaGJvYXJkLCBpZCB9ID0gZGFzaGJvYXJkO1xuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBfZGFzaGJvYXJkLmljb24sXG4gICAgICBwYXRoOiBgJHt0aGlzLkRBU0hCT0FSRF9ST1VURV9QQVRIfS8ke2lkfWAsXG4gICAgICBsYWJlbDogX2Rhc2hib2FyZC5uYW1lLFxuICAgICAgcHJpb3JpdHk6IF9kYXNoYm9hcmQucHJpb3JpdHksXG4gICAgICBoaWRlOiB0aGlzLmlzUmVwb3J0KGRhc2hib2FyZCksXG4gICAgICBiYWRnZTpcbiAgICAgICAgX2Rhc2hib2FyZC5kZXZpY2VUeXBlICYmIHRoaXMuc2hvdWxkQWxsb3dUb1NldERhc2hib2FyZFR5cGUoZGFzaGJvYXJkLCBjb250ZXh0KVxuICAgICAgICAgID8gZ2V0dGV4dCgnRGFzaGJvYXJkIHRlbXBsYXRlJylcbiAgICAgICAgICA6IG51bGwsXG4gICAgICB0b29sdGlwVGV4dDogX2Rhc2hib2FyZC5kZXNjcmlwdGlvbiB8fCBnZXR0ZXh0KCdEYXNoYm9hcmQgdGVtcGxhdGUnKVxuICAgIH0gYXMgVGFiO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbihkYXNoYm9hcmQpIHtcbiAgICBjb25zdCBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGFzaGJvYXJkLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gJyQkaGFzaEtleScgfHwga2V5ID09PSAna2xhc3NlcycpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROYW1lZERhc2hib2FyZChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkubGlzdCh7XG4gICAgICBmcmFnbWVudFR5cGU6IGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHtDb250ZXh0RGFzaGJvYXJkVHlwZS5OYW1lZH0ke3RoaXMuSU5ERVhfU1BMSVR9JHtuYW1lfWAsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXNoYm9hcmRGcmFnbWVudChtbzogSU1hbmFnZWRPYmplY3QsIHR5cGU6IENvbnRleHREYXNoYm9hcmRUeXBlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChtby5jOHlfUmVwb3J0KSB7XG4gICAgICB2YWx1ZSA9IGAke3RoaXMuUkVQT1JUX1BBUlRJQUxfTkFNRX0ke21vLmlkfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdHlwZSA9PT0gQ29udGV4dERhc2hib2FyZFR5cGUuVHlwZSA/IG1vLnR5cGUgOiBtby5pZDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuRlJBR01FTlRfTkFNRX0ke3RoaXMuSU5ERVhfU1BMSVR9JHt0eXBlfSR7dGhpcy5JTkRFWF9TUExJVH0ke3ZhbHVlfWA7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFNldEdsb2JhbChkYXNoYm9hcmQ6IFBhcnRpYWw8Q29udGV4dERhc2hib2FyZE1hbmFnZWRPYmplY3Q+LCBjb250ZXh0Pykge1xuICAgIGlmIChcbiAgICAgICghY29udGV4dCAmJiB0aGlzLmlzTmFtZWQoZGFzaGJvYXJkKSAmJiAhdGhpcy5pc1JlcG9ydChkYXNoYm9hcmQpKSB8fFxuICAgICAgdGhpcy5pc0RldmljZVR5cGUoZGFzaGJvYXJkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGVtcG9yYXJ5RGFzaGJvYXJkKGRhc2hib2FyZENmZzogQ29udGV4dERhc2hib2FyZCk6IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgYzh5X0Rhc2hib2FyZDoge1xuICAgICAgICAuLi5kYXNoYm9hcmRDZmcsXG4gICAgICAgIG5hbWU6IGRhc2hib2FyZENmZy5uYW1lIHx8ICdUZW1wb3JhcnkgRGFzaGJvYXJkJyxcbiAgICAgICAgaXNUcmFuc2llbnQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KFxuICAgICAgICAgICdUaGlzIGlzIGEgdGVtcG9yYXJ5LCBub24tZWRpdGFibGUgZGFzaGJvYXJkIGRpc3BsYXllZCBkdWUgdG8gaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLidcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIFtgYzh5X0Rhc2hib2FyZCFuYW1lISR7ZGFzaGJvYXJkQ2ZnLm5hbWV9YF06IHt9XG4gICAgfSBhcyBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdDtcbiAgfVxufVxuIl19
|