@ieeesa-npm/groups 0.15.26 → 0.15.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/interested-rosters/interested-rosters.component.mjs +2 -2
- package/esm2022/lib/components/tree-view/tree-view.component.mjs +25 -6
- package/esm2022/lib/groups.component.mjs +26 -4
- package/esm2022/lib/models/feature-flag.model.mjs +6 -0
- package/esm2022/lib/models/permission-type.model.mjs +2 -2
- package/esm2022/lib/models/tenant-feature.model.mjs +2 -0
- package/esm2022/lib/services/group-permissions-map-service.mjs +10 -1
- package/esm2022/lib/services/groups.service.mjs +66 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ieeesa-npm-groups.mjs +130 -10
- package/fesm2022/ieeesa-npm-groups.mjs.map +1 -1
- package/lib/components/tree-view/tree-view.component.d.ts +11 -1
- package/lib/groups.component.d.ts +15 -1
- package/lib/models/feature-flag.model.d.ts +3 -0
- package/lib/models/permission-type.model.d.ts +1 -1
- package/lib/models/tenant-feature.model.d.ts +16 -0
- package/lib/services/groups.service.d.ts +45 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -49,6 +49,15 @@ export class GroupPermissionsMapService {
|
|
|
49
49
|
permissionName: 'Manage Group Member',
|
|
50
50
|
permissionId: 'PERM_1969fecb-6383-446e-9276-b6a7b7265cb4',
|
|
51
51
|
},
|
|
52
|
+
{
|
|
53
|
+
// SP3M-380: Per-group permission gating the "Manage Interest Form" action.
|
|
54
|
+
// permissionId is the FE join key and MUST match the backend DB seed;
|
|
55
|
+
// permissionName is the BE guard-match string and MUST equal the DB
|
|
56
|
+
// permission_name (groups-api changelog + PermissionConstants).
|
|
57
|
+
permissionType: PermissionType.VIEW_AND_MANAGE_GROUP_INTEREST,
|
|
58
|
+
permissionName: 'View and Manage Group Interest Form',
|
|
59
|
+
permissionId: 'PERM_VIEW_AND_MANAGE_GROUP_INTEREST',
|
|
60
|
+
},
|
|
52
61
|
];
|
|
53
62
|
this.globalGroupPermissions = [
|
|
54
63
|
{
|
|
@@ -109,4 +118,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
109
118
|
providedIn: 'root',
|
|
110
119
|
}]
|
|
111
120
|
}] });
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtcGVybWlzc2lvbnMtbWFwLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9zZXJ2aWNlcy9ncm91cC1wZXJtaXNzaW9ucy1tYXAtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFLakUsTUFBTSxPQUFPLDBCQUEwQjtJQUh2QztRQUlFLHFCQUFnQixHQUFzQjtZQUNwQztnQkFDRSxjQUFjLEVBQUUsY0FBYyxDQUFDLFdBQVc7Z0JBQzFDLGNBQWMsRUFBRSxhQUFhO2dCQUM3QixZQUFZLEVBQUUsMkNBQTJDO2FBQzFEO1lBQ0Q7Z0JBQ0UsY0FBYyxFQUFFLGNBQWMsQ0FBQyxpQkFBaUI7Z0JBQ2hELGNBQWMsRUFBRSxxQkFBcUI7Z0JBQ3JDLFlBQVksRUFBRSwyQ0FBMkM7YUFDMUQ7WUFDRDtnQkFDRSxjQUFjLEVBQUUsY0FBYyxDQUFDLGVBQWU7Z0JBQzlDLGNBQWMsRUFBRSxpQkFBaUI7Z0JBQ2pDLFlBQVksRUFBRSwyQ0FBMkM7YUFDMUQ7WUFDRDtnQkFDRSxjQUFjLEVBQUUsY0FBYyxDQUFDLFlBQVk7Z0JBQzNDLGNBQWMsRUFBRSxjQUFjO2dCQUM5QixZQUFZLEVBQUUsMkNBQTJDO2FBQzFEO1lBQ0Q7Z0JBQ0UsY0FBYyxFQUFFLGNBQWMsQ0FBQyxVQUFVO2dCQUN6QyxjQUFjLEVBQUUsb0JBQW9CO2dCQUNwQyxZQUFZLEVBQUUsMkNBQTJDO2FBQzFEO1lBQ0Q7Z0JBQ0UsY0FBYyxFQUFFLGNBQWMsQ0FBQyxtQkFBbUI7Z0JBQ2xELGNBQWMsRUFBRSxxQkFBcUI7Z0JBQ3JDLFlBQVksRUFBRSwyQ0FBMkM7YUFDMUQ7WUFDRDtnQkFDRSxjQUFjLEVBQUUsY0FBYyxDQUFDLHFCQUFxQjtnQkFDcEQsY0FBYyxFQUFFLHVCQUF1QjtnQkFDdkMsWUFBWSxFQUFFLDJDQUEyQzthQUMxRDtZQUNEO2dCQUNFLGNBQWMsRUFBRSxjQUFjLENBQUMsa0JBQWtCO2dCQUNqRCxjQUFjLEVBQUUsb0JBQW9CO2dCQUNwQyxZQUFZLEVBQUUsMkNBQTJDO2FBQzFEO1lBQ0Q7Z0JBQ0UsY0FBYyxFQUFFLGNBQWMsQ0FBQyxvQkFBb0I7Z0JBQ25ELGNBQWMsRUFBRSxxQkFBcUI7Z0JBQ3JDLFlBQVksRUFBRSwyQ0FBMkM7YUFDMUQ7WUFDRDtnQkFDRSwyRUFBMkU7Z0JBQzNFLHNFQUFzRTtnQkFDdEUsb0VBQW9FO2dCQUNwRSxnRUFBZ0U7Z0JBQ2hFLGNBQWMsRUFBRSxjQUFjLENBQUMsOEJBQThCO2dCQUM3RCxjQUFjLEVBQUUscUNBQXFDO2dCQUNyRCxZQUFZLEVBQUUscUNBQXFDO2FBQ3BEO1NBQ0YsQ0FBQztRQUNGLDJCQUFzQixHQUFzQjtZQUMxQztnQkFDRSxjQUFjLEVBQUUsY0FBYyxDQUFDLG1CQUFtQjtnQkFDbEQsY0FBYyxFQUFFLHFCQUFxQjtnQkFDckMsWUFBWSxFQUFFLDJDQUEyQzthQUMxRDtZQUNEO2dCQUNFLGNBQWMsRUFBRSxjQUFjLENBQUMsZUFBZTtnQkFDOUMsY0FBYyxFQUFFLHdCQUF3QjtnQkFDeEMsWUFBWSxFQUFFLDJDQUEyQzthQUMxRDtZQUNEO2dCQUNFLGNBQWMsRUFBRSxjQUFjLENBQUMsaUJBQWlCO2dCQUNoRCxjQUFjLEVBQUUsMEJBQTBCO2dCQUMxQyxZQUFZLEVBQUUsMkNBQTJDO2FBQzFEO1lBQ0Q7Z0JBQ0UsY0FBYyxFQUFFLGNBQWMsQ0FBQyxnQkFBZ0I7Z0JBQy9DLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFlBQVksRUFBRSwyQ0FBMkM7YUFDMUQ7WUFDRDtnQkFDRSxjQUFjLEVBQUUsY0FBYyxDQUFDLGtCQUFrQjtnQkFDakQsY0FBYyxFQUFFLG9CQUFvQjtnQkFDcEMsWUFBWSxFQUFFLDJDQUEyQzthQUMxRDtZQUNEO2dCQUNFLGNBQWMsRUFBRSxjQUFjLENBQUMsMkJBQTJCO2dCQUMxRCxjQUFjLEVBQUUsb0NBQW9DO2dCQUNwRCxZQUFZLEVBQUUseUNBQXlDO2FBQ3hEO1NBQ0YsQ0FBQztLQWtCSDtJQWpCQzs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNILHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDOytHQXpHVSwwQkFBMEI7bUhBQTFCLDBCQUEwQixjQUZ6QixNQUFNOzs0RkFFUCwwQkFBMEI7a0JBSHRDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBHcm91cFBlcm1pc3Npb24gfSBmcm9tICcuLi9tb2RlbHMvZ3JvdXAtcGVybWlzc2lvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9wZXJtaXNzaW9uLXR5cGUubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEdyb3VwUGVybWlzc2lvbnNNYXBTZXJ2aWNlIHtcclxuICBncm91cFBlcm1pc3Npb25zOiBHcm91cFBlcm1pc3Npb25bXSA9IFtcclxuICAgIHtcclxuICAgICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLlZJRVdfR1JPVVBTLFxyXG4gICAgICBwZXJtaXNzaW9uTmFtZTogJ1ZpZXcgR3JvdXBzJyxcclxuICAgICAgcGVybWlzc2lvbklkOiAnUEVSTV9jMDVmZjU5Mi03MTc4LTQ2MTQtYjczMC03YTdhODgyODgyNGUnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLkNSRUFURV9ST09UX0dST1VQLFxyXG4gICAgICBwZXJtaXNzaW9uTmFtZTogJ0NyZWF0ZSBQYXJlbnQgR3JvdXAnLFxyXG4gICAgICBwZXJtaXNzaW9uSWQ6ICdQRVJNX2ZjNTIyNzQ4LWUyZDQtNDQwYy1iNmM2LTQxYWFjYTc1YTgwZicsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwZXJtaXNzaW9uVHlwZTogUGVybWlzc2lvblR5cGUuQ1JFQVRFX1NVQkdST1VQLFxyXG4gICAgICBwZXJtaXNzaW9uTmFtZTogJ0NyZWF0ZSBTdWJncm91cCcsXHJcbiAgICAgIHBlcm1pc3Npb25JZDogJ1BFUk1fOGY4YTIwM2UtZDk5Mi00NTU1LTljNDItYWM2OTcwZjJkMzc2JyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZS5ERUxFVEVfR1JPVVAsXHJcbiAgICAgIHBlcm1pc3Npb25OYW1lOiAnRGVsZXRlIEdyb3VwJyxcclxuICAgICAgcGVybWlzc2lvbklkOiAnUEVSTV8wMDgyMjliZi02YTEyLTQyODEtODhkOC00YTJiYzk1OTc1NzMnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLkVESVRfR1JPVVAsXHJcbiAgICAgIHBlcm1pc3Npb25OYW1lOiAnRWRpdCBHcm91cCBEZXRhaWxzJyxcclxuICAgICAgcGVybWlzc2lvbklkOiAnUEVSTV9kNjRlMWYwOS1kM2Y3LTRmODYtYTk0Yy00NzgyYTJmNjA1NzEnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLlZJRVdfR1JPVVBfT0ZGSUNFUlMsXHJcbiAgICAgIHBlcm1pc3Npb25OYW1lOiAnVmlldyBHcm91cCBPZmZpY2VycycsXHJcbiAgICAgIHBlcm1pc3Npb25JZDogJ1BFUk1fZjgwYWM4YTMtNjBiOC00YWU0LWJlZGYtY2UxZDg5YzU0MzU0JyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZS5NQU5BR0VfR1JPVVBfT0ZGSUNFUlMsXHJcbiAgICAgIHBlcm1pc3Npb25OYW1lOiAnTWFuYWdlIEdyb3VwIE9mZmljZXJzJyxcclxuICAgICAgcGVybWlzc2lvbklkOiAnUEVSTV85ZGRkNTFkYi1mNDgxLTQ3ZWEtOTQ2Yi1lODg4MTU5NzNjZmInLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLlZJRVdfR1JPVVBfTUVNQkVSUyxcclxuICAgICAgcGVybWlzc2lvbk5hbWU6ICdWaWV3IEdyb3VwIE1lbWJlcnMnLFxyXG4gICAgICBwZXJtaXNzaW9uSWQ6ICdQRVJNXzVhOGVkYjkxLWExMzItNDY3MC05MGEzLTI1ZmI2OTgyMzA3YScsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwZXJtaXNzaW9uVHlwZTogUGVybWlzc2lvblR5cGUuTUFOQUdFX0dST1VQX01FTUJFUlMsXHJcbiAgICAgIHBlcm1pc3Npb25OYW1lOiAnTWFuYWdlIEdyb3VwIE1lbWJlcicsXHJcbiAgICAgIHBlcm1pc3Npb25JZDogJ1BFUk1fMTk2OWZlY2ItNjM4My00NDZlLTkyNzYtYjZhN2I3MjY1Y2I0JyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIC8vIFNQM00tMzgwOiBQZXItZ3JvdXAgcGVybWlzc2lvbiBnYXRpbmcgdGhlIFwiTWFuYWdlIEludGVyZXN0IEZvcm1cIiBhY3Rpb24uXHJcbiAgICAgIC8vIHBlcm1pc3Npb25JZCBpcyB0aGUgRkUgam9pbiBrZXkgYW5kIE1VU1QgbWF0Y2ggdGhlIGJhY2tlbmQgREIgc2VlZDtcclxuICAgICAgLy8gcGVybWlzc2lvbk5hbWUgaXMgdGhlIEJFIGd1YXJkLW1hdGNoIHN0cmluZyBhbmQgTVVTVCBlcXVhbCB0aGUgREJcclxuICAgICAgLy8gcGVybWlzc2lvbl9uYW1lIChncm91cHMtYXBpIGNoYW5nZWxvZyArIFBlcm1pc3Npb25Db25zdGFudHMpLlxyXG4gICAgICBwZXJtaXNzaW9uVHlwZTogUGVybWlzc2lvblR5cGUuVklFV19BTkRfTUFOQUdFX0dST1VQX0lOVEVSRVNULFxyXG4gICAgICBwZXJtaXNzaW9uTmFtZTogJ1ZpZXcgYW5kIE1hbmFnZSBHcm91cCBJbnRlcmVzdCBGb3JtJyxcclxuICAgICAgcGVybWlzc2lvbklkOiAnUEVSTV9WSUVXX0FORF9NQU5BR0VfR1JPVVBfSU5URVJFU1QnLFxyXG4gICAgfSxcclxuICBdO1xyXG4gIGdsb2JhbEdyb3VwUGVybWlzc2lvbnM6IEdyb3VwUGVybWlzc2lvbltdID0gW1xyXG4gICAge1xyXG4gICAgICBwZXJtaXNzaW9uVHlwZTogUGVybWlzc2lvblR5cGUuTUFOQUdFX1NZU1RFTV9VU0VSUyxcclxuICAgICAgcGVybWlzc2lvbk5hbWU6ICdNYW5hZ2UgU3lzdGVtIFVzZXJzJyxcclxuICAgICAgcGVybWlzc2lvbklkOiAnUEVSTV9kMmMxMDNlOS0yMGM2LTRkZDUtYjMyMC1mN2Q0ZDAxN2M1NzQnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLlZJRVdfQUxMX0dST1VQUyxcclxuICAgICAgcGVybWlzc2lvbk5hbWU6ICdWaWV3IEFsbCBHcm91cCBEZXRhaWxzJyxcclxuICAgICAgcGVybWlzc2lvbklkOiAnUEVSTV83NDFkNzUwNC03NTk1LTRiZWMtODExZi04ZDYwMTMzM2U3YzQnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLk1BTkFHRV9BTExfR1JPVVBTLFxyXG4gICAgICBwZXJtaXNzaW9uTmFtZTogJ01hbmFnZSBBbGwgR3JvdXAgRGV0YWlscycsXHJcbiAgICAgIHBlcm1pc3Npb25JZDogJ1BFUk1fZWViZGUxMDUtMGI1My00NGM4LWJhYmMtMDY2YmU5MDMyMjlmJyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZS5WSUVXX0FMTF9ST1NURVJTLFxyXG4gICAgICBwZXJtaXNzaW9uTmFtZTogJ1ZpZXcgQWxsIFJvc3RlcnMnLFxyXG4gICAgICBwZXJtaXNzaW9uSWQ6ICdQRVJNXzAxMDlkN2M3LTZkNjQtNDY3My1iNjNiLTNhMjNmMzMyMzUzMCcsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwZXJtaXNzaW9uVHlwZTogUGVybWlzc2lvblR5cGUuTUFOQUdFX0FMTF9ST1NURVJTLFxyXG4gICAgICBwZXJtaXNzaW9uTmFtZTogJ01hbmFnZSBBbGwgUm9zdGVycycsXHJcbiAgICAgIHBlcm1pc3Npb25JZDogJ1BFUk1fNmZlYzJlOGMtMWI0OC00NmE5LWIzOTQtMzRkMzY0OGQ2ZmU4JyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZS5SRVNUUklDVF9HUk9VUFNfQU5EX1JPU1RFUlMsXHJcbiAgICAgIHBlcm1pc3Npb25OYW1lOiAnUmVzdHJpY3QgTWFuYWdlIEdyb3VwcyBBbmQgUm9zdGVycycsXHJcbiAgICAgIHBlcm1pc3Npb25JZDogJ1BFUk1fUkVTVFJJQ1RfTUFOQUdFX0dST1VQU19BTkRfUk9TVEVSUycsXHJcbiAgICB9LFxyXG4gIF07XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBncm91cC13aXNlIHBlcm1pc3Npb24gbWFwcGluZ3MuXHJcbiAgICogQHJldHVybiB7R3JvdXBQZXJtaXNzaW9uW119XHJcbiAgICogQG1lbWJlcm9mIEdyb3VwUGVybWlzc2lvbnNNYXBTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0R3JvdXBQZXJtaXNzaW9ucygpOiBHcm91cFBlcm1pc3Npb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncm91cFBlcm1pc3Npb25zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGdsb2JhbCBwZXJtaXNzaW9ucyBtYXBwaW5nIGZvciBncm91cHMuXHJcbiAgICogR2xvYmFsIHBlcm1pc3Npb25zIGFyZSBtYWludGFpbmVkIHNlcGFyYXRlbHkgYXMgZ2xvYmFsIHBlcm1pc3Npb25zIGFsc28gaW5jbHVkZSByb2xlIGJhc2VkIGdyb3VwIHdpc2UgcGVybWlzc2lvbnMgaXJyZXNwZWN0aXZlIG9mIHRoZSBhdHRhY2hlZCBncm91cC5cclxuICAgKiBAcmV0dXJuIHtHcm91cFBlcm1pc3Npb25bXX1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBQZXJtaXNzaW9uc01hcFNlcnZpY2VcclxuICAgKi9cclxuICBnZXRHbG9iYWxHcm91cFBlcm1pc3Npb25zKCk6IEdyb3VwUGVybWlzc2lvbltdIHtcclxuICAgIHJldHVybiB0aGlzLmdsb2JhbEdyb3VwUGVybWlzc2lvbnM7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -7,6 +7,7 @@ import { GroupRosterType } from '../models/roster-type.model';
|
|
|
7
7
|
import { FormStatus, AlertType, } from '@ieeesa-npm/models';
|
|
8
8
|
import { COUNTRY_DIAL_CODES } from '@ieeesa-npm/presentation';
|
|
9
9
|
import { PermissionType } from '../models/permission-type.model';
|
|
10
|
+
import { FeatureFlag } from '../models/feature-flag.model';
|
|
10
11
|
import { RoleType } from '../models/role-type.model';
|
|
11
12
|
import * as i0 from "@angular/core";
|
|
12
13
|
import * as i1 from "@ieeesa-npm/utility";
|
|
@@ -19,6 +20,13 @@ import * as i3 from "./group-permissions-map-service";
|
|
|
19
20
|
* always reflect the tenant configuration regardless of @Input/resolver timing.
|
|
20
21
|
*/
|
|
21
22
|
const REQUIRED_PROFILE_FIELDS_STORAGE_KEY = 'REQUIRED_PROFILE_FIELDS';
|
|
23
|
+
/**
|
|
24
|
+
* Local storage key under which the hosting application caches the tenant's
|
|
25
|
+
* feature flags at login (shape: a bare `TenantFeature[]`). The interest-form
|
|
26
|
+
* gate reads this cache as the source of truth so it reflects the tenant
|
|
27
|
+
* configuration regardless of @Input/resolver timing.
|
|
28
|
+
*/
|
|
29
|
+
const TENANT_FEATURES_STORAGE_KEY = 'TENANT_FEATURES';
|
|
22
30
|
/**
|
|
23
31
|
* Groups service is an abstract layer and responsible for managing groups REST API calls.
|
|
24
32
|
* @class GroupsService
|
|
@@ -50,6 +58,12 @@ export class GroupsService {
|
|
|
50
58
|
* list and the sample file. Empty when the tenant has none configured.
|
|
51
59
|
*/
|
|
52
60
|
this.requiredProfileFields = [];
|
|
61
|
+
/**
|
|
62
|
+
* Tenant feature flags supplied by the host app. Used by
|
|
63
|
+
* {@link isInterestFormFeatureEnabled} to gate interest-form UI. Empty when
|
|
64
|
+
* the host has not provided any features (fail-closed).
|
|
65
|
+
*/
|
|
66
|
+
this.tenantFeatures = [];
|
|
53
67
|
this.openModalNotifier = new BehaviorSubject(GroupFunctionType.VIEW_ROSTER);
|
|
54
68
|
this.canShowMessage = false;
|
|
55
69
|
this.isParentGroupChanged = false;
|
|
@@ -86,6 +100,44 @@ export class GroupsService {
|
|
|
86
100
|
setRequiredProfileFields(requiredProfileFields) {
|
|
87
101
|
this.requiredProfileFields = requiredProfileFields ?? [];
|
|
88
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Stores the tenant feature flags provided by the host app. Consumed by
|
|
105
|
+
* {@link isInterestFormFeatureEnabled} to gate interest-form UI.
|
|
106
|
+
* @param {TenantFeature[]} tenantFeatures - Tenant feature flags.
|
|
107
|
+
* @memberof GroupsService
|
|
108
|
+
*/
|
|
109
|
+
setTenantFeatures(tenantFeatures) {
|
|
110
|
+
this.tenantFeatures = tenantFeatures ?? [];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns the tenant feature flags (never null).
|
|
114
|
+
*
|
|
115
|
+
* Reads the local storage cache the hosting application writes at login (key
|
|
116
|
+
* `TENANT_FEATURES`, a bare `TenantFeature[]`) as the source of truth, so the
|
|
117
|
+
* interest-form gate reflects the tenant configuration regardless of the
|
|
118
|
+
* @Input/resolver timing.
|
|
119
|
+
*
|
|
120
|
+
* The cache is only trusted when it is well-formed for the active
|
|
121
|
+
* application: it must be an array and its entries must belong to the current
|
|
122
|
+
* user's `appId`. The `TENANT_FEATURES` key is origin-wide, so a cache written
|
|
123
|
+
* by another application on the same origin could otherwise flip the
|
|
124
|
+
* interest-form gate with a different tenant's flags. When the cache is
|
|
125
|
+
* missing, malformed, or scoped to another app, it falls back to the in-memory
|
|
126
|
+
* value set via {@link setTenantFeatures} (the host @Input), then to an empty
|
|
127
|
+
* list.
|
|
128
|
+
* @return {TenantFeature[]}
|
|
129
|
+
* @memberof GroupsService
|
|
130
|
+
*/
|
|
131
|
+
getTenantFeatures() {
|
|
132
|
+
const cached = this.storageService?.getValue(TENANT_FEATURES_STORAGE_KEY);
|
|
133
|
+
const activeAppId = this.getUserInfo()?.appId;
|
|
134
|
+
const isCacheUsable = Array.isArray(cached) &&
|
|
135
|
+
(!activeAppId ||
|
|
136
|
+
cached.every((feature) => !feature?.appId || feature.appId === activeAppId));
|
|
137
|
+
if (isCacheUsable)
|
|
138
|
+
return cached;
|
|
139
|
+
return this.tenantFeatures ?? [];
|
|
140
|
+
}
|
|
89
141
|
/**
|
|
90
142
|
* Returns the tenant-level required profile fields (never null).
|
|
91
143
|
*
|
|
@@ -664,6 +716,19 @@ export class GroupsService {
|
|
|
664
716
|
}
|
|
665
717
|
return this.userPermissionsService.validateAccessPermission(permissionType, this.getUserGroupPermissions());
|
|
666
718
|
}
|
|
719
|
+
/**
|
|
720
|
+
* SP3M-380: Returns true when the interest-form feature
|
|
721
|
+
* (`FEATURE_INTEREST_FORM`) is enabled for the current tenant. A single
|
|
722
|
+
* boolean capability check the UI gates on. Reads the tenant features from
|
|
723
|
+
* {@link getTenantFeatures} (local storage cache first, then the host
|
|
724
|
+
* @Input). Fail-closed: an empty/undefined feature list, or a feature marked
|
|
725
|
+
* deleted, yields false.
|
|
726
|
+
* @return {boolean}
|
|
727
|
+
* @memberof GroupsService
|
|
728
|
+
*/
|
|
729
|
+
isInterestFormFeatureEnabled() {
|
|
730
|
+
return this.getTenantFeatures().some((feature) => feature?.featureId === FeatureFlag.INTEREST_FORM && !feature?.isDeleted);
|
|
731
|
+
}
|
|
667
732
|
/**
|
|
668
733
|
* Store the loaded group types.
|
|
669
734
|
* @param {GroupTypeConfiguration[]} groupTypes
|
|
@@ -922,4 +987,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
922
987
|
providedIn: 'root',
|
|
923
988
|
}]
|
|
924
989
|
}], ctorParameters: function () { return [{ type: i1.HttpService }, { type: i2.UserPermissionsService }, { type: i3.GroupPermissionsMapService }, { type: i1.AlertsService }, { type: i1.StorageService }]; } });
|
|
925
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9zZXJ2aWNlcy9ncm91cHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVdwRSxPQUFPLEVBQThCLFdBQVcsRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RixPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDO0FBa0J4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQW1CeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFDTCxVQUFVLEVBRVYsU0FBUyxHQUVWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFNOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSWpFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7QUFVckQ7Ozs7O0dBS0c7QUFDSCxNQUFNLG1DQUFtQyxHQUFHLHlCQUF5QixDQUFDO0FBRXRFOzs7R0FHRztBQUlILE1BQU0sT0FBTyxhQUFhO0lBNkJ4Qiw2REFBNkQ7SUFDN0Q7SUFDRSwwQ0FBMEM7SUFDbEMsV0FBd0I7SUFDaEMsMENBQTBDO0lBQ2xDLHNCQUE4QztJQUN0RCwwQ0FBMEM7SUFDbEMsdUJBQW1EO0lBQzNELDBDQUEwQztJQUNuQyxZQUEyQjtJQUNsQywwQ0FBMEM7SUFDbEMsY0FBOEIsQ0FBQyw2Q0FBNkM7O1FBUjVFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBRXhCLDJCQUFz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UUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFDM0IsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQzsrR0FybENVLGFBQWE7bUhBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAsIGNhdGNoRXJyb3IsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIENyZWF0ZUdyb3VwUGF5bG9hZCxcclxuICBDcmVhdGVHcm91cFJlc3BvbnNlLFxyXG59IGZyb20gJy4uL21vZGVscy9jcmVhdGUtZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEJ1c2luZXNzUnVsZSxcclxuICBHcm91cFR5cGVDb25maWd1cmF0aW9uLFxyXG4gIEdyb3VwVHlwZUNvbmZpZ1ZhbHVlLFxyXG4gIEdyb3VwVHlwZVJlc3BvbnNlLFxyXG59IGZyb20gJy4uL21vZGVscy9ncm91cC10eXBlcy5tb2RlbCc7XHJcbmltcG9ydCB7IEFsZXJ0c1NlcnZpY2UsIEh0dHBTZXJ2aWNlLCBTdG9yYWdlS2V5cywgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdAaWVlZXNhLW5wbS91dGlsaXR5JztcclxuaW1wb3J0IHsgR2V0R3JvdXBSZXNwb25zZSwgR2V0R3JvdXBzUGF5bG9hZCB9IGZyb20gJy4uL21vZGVscy92aWV3LWdyb3VwLm1vZGVsJztcclxuaW1wb3J0ICogYXMgc2NyZWVuVGV4dHMgZnJvbSAnLi4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgRGVsZXRlR3JvdXBQYXlsb2FkIH0gZnJvbSAnLi4vbW9kZWxzL2RlbGV0ZS1ncm91cC5tb2RlbCc7XHJcbmltcG9ydCB7IEdyb3VwSW5mbyB9IGZyb20gJy4uL21vZGVscy9ncm91cC1pbmZvLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBTZWFyY2hVc2Vyc1BheWxvYWQsXHJcbiAgRmlsdGVyVXNlcnNQYXlsb2FkLFxyXG4gIEdldEdyb3VwVXNlcnNSZXNwb25zZSxcclxuICBVc2VyLFxyXG4gIExvZ2dlZEluVXNlckluZm8sXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3VzZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBSb2xlIH0gZnJvbSAnLi4vbW9kZWxzL3JvbGUubW9kZWwnO1xyXG5pbXBvcnQgeyBFZGl0R3JvdXBQYXlsb2FkIH0gZnJvbSAnLi4vbW9kZWxzL2VkaXQtZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEF2YWlsYWJsZUZvcmVpZ25Hcm91cCxcclxuICBSZWNpcHJvY2FsQ3JlZGl0Q29uZmlnUm93LFxyXG4gIFJlY2lwcm9jYWxDcmVkaXRSZXNwb25zZSxcclxuICBTYXZlUmVjaXByb2NhbENyZWRpdFBheWxvYWQsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3JlY2lwcm9jYWwtY3JlZGl0Lm1vZGVsJztcclxuaW1wb3J0IHsgR3JvdXBGdW5jdGlvblR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZ3JvdXAtZnVuY3Rpb24tdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IFJvc3RlckZ1bmN0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9yb3N0ZXItZnVuY3Rpb24tdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IEdyb3VwVXNlckluZm8gfSBmcm9tICcuLi9tb2RlbHMvZ3JvdXAtdXNlci1pbmZvLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBBZGRPckVkaXRVc2VyUGF5bG9hZCxcclxuICBBZGRPckVkaXRHcm91cFVzZXJEZXRhaWxzUmVzcG9uc2UsXHJcbiAgQWRkT3JFZGl0VXNlckluZGl2aWR1YWxSb3N0ZXJQYXlsb2FkLFxyXG4gIFJlcHJlc2VudGluZ09yZ2FuaXphdGlvbixcclxufSBmcm9tICcuLi9tb2RlbHMvYWRkLW9yLWVkaXQtdXNlci1ncm91cC5tb2RlbCc7XHJcbmltcG9ydCB7IERlbGV0ZVVzZXJHcm91cFBheWxvYWQgfSBmcm9tICcuLi9tb2RlbHMvZGVsZXRlLXVzZXItZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdldFVzZXJEZXRhaWxzUGF5bG9hZCxcclxuICBTZWFyY2hVc2VyQnlFbWFpbFJlc3BvbnNlLFxyXG59IGZyb20gJy4uL21vZGVscy9hZGQtbmV3LXVzZXIubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIE9yZ2FuaXphdGlvblJlcXVlc3RQYXlsb2FkLFxyXG4gIE9yZ2FuaXphdGlvblJlc3BvbnNlLFxyXG59IGZyb20gJy4uL21vZGVscy9vcmdhbml6YXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBDbGFzc2lmaWNhdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzaWZpY2F0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgR3JvdXBSb3N0ZXJUeXBlIH0gZnJvbSAnLi4vbW9kZWxzL3Jvc3Rlci10eXBlLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBGb3JtU3RhdHVzLFxyXG4gIENoZWNrYm94T3B0aW9uLFxyXG4gIEFsZXJ0VHlwZSxcclxuICBTZWxlY3RPcHRpb24sXHJcbn0gZnJvbSAnQGllZWVzYS1ucG0vbW9kZWxzJztcclxuaW1wb3J0IHsgQ09VTlRSWV9ESUFMX0NPREVTIH0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xTdGF0dXMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgR3JvdXBQZXJtaXNzaW9uLFxyXG4gIFVzZXJQZXJtaXNzaW9uLFxyXG59IGZyb20gJy4uL21vZGVscy9ncm91cC1wZXJtaXNzaW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IFBlcm1pc3Npb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL3Blcm1pc3Npb24tdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IFVzZXJQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICcuL3VzZXItcGVybWlzc2lvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyb3VwUGVybWlzc2lvbnNNYXBTZXJ2aWNlIH0gZnJvbSAnLi9ncm91cC1wZXJtaXNzaW9ucy1tYXAtc2VydmljZSc7XHJcbmltcG9ydCB7IFBhcmVudEdyb3Vwc0luZm8gfSBmcm9tICcuLi9tb2RlbHMvcGFyZW50LWdyb3Vwcy1pbmZvLm1vZGVsJztcclxuaW1wb3J0IHsgUm9sZVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvcm9sZS10eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgQ2FjaGVkUmVxdWlyZWRQcm9maWxlRmllbGRzIH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVpcmVkLXByb2ZpbGUtZmllbGRzLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBHcm91cEludGVyZXN0UmVzcG9uc2VWaWV3LFxyXG4gIEludGVyZXN0ZWRSb3N0ZXJzUmVxdWVzdFBheWxvYWQsXHJcbiAgSW50ZXJlc3RlZFJvc3RlcnNSZXNwb25zZSxcclxuICBJbnRlcmVzdEZvcm1SZXNwb25zZSxcclxuICBVcGRhdGVNZW1iZXJMZXZlbFBheWxvYWQsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2ludGVyZXN0LXJlc3BvbnNlLm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBMb2NhbCBzdG9yYWdlIGtleSB1bmRlciB3aGljaCB0aGUgaG9zdGluZyBhcHBsaWNhdGlvbiBjYWNoZXMgdGhlIHRlbmFudCdzXHJcbiAqIHJlcXVpcmVkIHByb2ZpbGUgZmllbGRzIGF0IGxvZ2luIChzaGFwZTogYHsgYXBwSWQsIHJlcXVpcmVkRmllbGRzIH1gKS4gVGhlXHJcbiAqIGFkZC11c2VyIC8gZWRpdC11c2VyIGZvcm1zIHJlYWQgdGhpcyBjYWNoZSBhcyB0aGUgc291cmNlIG9mIHRydXRoIHNvIHRoZXlcclxuICogYWx3YXlzIHJlZmxlY3QgdGhlIHRlbmFudCBjb25maWd1cmF0aW9uIHJlZ2FyZGxlc3Mgb2YgQElucHV0L3Jlc29sdmVyIHRpbWluZy5cclxuICovXHJcbmNvbnN0IFJFUVVJUkVEX1BST0ZJTEVfRklFTERTX1NUT1JBR0VfS0VZID0gJ1JFUVVJUkVEX1BST0ZJTEVfRklFTERTJztcclxuXHJcbi8qKlxyXG4gKiBHcm91cHMgc2VydmljZSBpcyBhbiBhYnN0cmFjdCBsYXllciBhbmQgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGdyb3VwcyBSRVNUIEFQSSBjYWxscy5cclxuICogQGNsYXNzIEdyb3Vwc1NlcnZpY2VcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcm91cHNTZXJ2aWNlIHtcclxuICBncm91cHNUZXh0ID0gc2NyZWVuVGV4dHM/LmVycm9ycztcclxuICBhcGlCYXNlVXJsITogc3RyaW5nO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgdXNlclBlcm1pc3Npb246IGFueTtcclxuICAvKipcclxuICAgKiBUZW5hbnQtbGV2ZWwgcmVxdWlyZWQgcHJvZmlsZSBmaWVsZHMgKGUuZy4gWydwaG9uZScsJ2FkZHJlc3MnLCdlbXBsb3llciddKVxyXG4gICAqIHN1cHBsaWVkIGJ5IHRoZSBob3N0IGFwcCBmcm9tIGl0cyBjYWNoZWQgdGVuYW50IGNvbmZpZ3VyYXRpb24uIENvbnN1bWVkIGJ5XHJcbiAgICogdGhlIHJvc3RlciBpbXBvcnQgdG8gYXBwZW5kIHRlbmFudC1tYW5kYXRlZCBjb2x1bW5zIHRvIHRoZSByZXF1aXJlZC1jb2x1bW5cclxuICAgKiBsaXN0IGFuZCB0aGUgc2FtcGxlIGZpbGUuIEVtcHR5IHdoZW4gdGhlIHRlbmFudCBoYXMgbm9uZSBjb25maWd1cmVkLlxyXG4gICAqL1xyXG4gIHJlcXVpcmVkUHJvZmlsZUZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICBzZWxlY3RlZEdyb3VwSW5mbyE6IEdyb3VwSW5mbyB8IHVuZGVmaW5lZDtcclxuICBncm91cEZ1bmN0aW9uVHlwZSE6IEdyb3VwRnVuY3Rpb25UeXBlO1xyXG4gIHNlbGVjdGVkR3JvdXBQYXJlbnRJbmZvITogR3JvdXBJbmZvIHwgdW5kZWZpbmVkO1xyXG4gIG9wZW5Nb2RhbE5vdGlmaWVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxHcm91cEZ1bmN0aW9uVHlwZT4oXHJcbiAgICBHcm91cEZ1bmN0aW9uVHlwZS5WSUVXX1JPU1RFUlxyXG4gICk7XHJcbiAgZ3JvdXBUeXBlUm9sZXMhOiBDaGVja2JveE9wdGlvbltdO1xyXG4gIHNlbGVjdGVkVXNlckluZm8hOiBHcm91cFVzZXJJbmZvO1xyXG4gIGNhblNob3dNZXNzYWdlID0gZmFsc2U7XHJcbiAgcm9zdGVyRnVuY3Rpb25UeXBlITogUm9zdGVyRnVuY3Rpb25UeXBlO1xyXG4gIHVzZXJHcm91cFBlcm1pc3Npb25zITogR3JvdXBQZXJtaXNzaW9uW107XHJcbiAgZ3JvdXBUeXBlcyE6IEdyb3VwVHlwZUNvbmZpZ3VyYXRpb25bXTtcclxuICBpc1BhcmVudEdyb3VwQ2hhbmdlZCA9IGZhbHNlO1xyXG4gIHVzZXJJbmZvITogTG9nZ2VkSW5Vc2VySW5mbztcclxuICBtZW1iZXJUeXBlcyE6IFJvbGVbXTtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHJlcHJlc2VudGluZ09yZ2FuaXphdGlvbnM6IFJlcHJlc2VudGluZ09yZ2FuaXphdGlvbltdID0gW107XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uLCBuby11bnVzZWQtdmFyc1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGh0dHBTZXJ2aWNlOiBIdHRwU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSB1c2VyUGVybWlzc2lvbnNTZXJ2aWNlOiBVc2VyUGVybWlzc2lvbnNTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGdyb3VwUGVybWlzc2lvbnNTZXJ2aWNlOiBHcm91cFBlcm1pc3Npb25zTWFwU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIGFsZXJ0U2VydmljZTogQWxlcnRzU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgKSB7fVxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgc2V0QXBwQ29uZmlnKGFwaUJhc2VVcmw6IHN0cmluZywgdXNlclBlcm1pc3Npb246IGFueSkge1xyXG4gICAgdGhpcy5hcGlCYXNlVXJsID0gYXBpQmFzZVVybDtcclxuICAgIHRoaXMudXNlclBlcm1pc3Npb24gPSB1c2VyUGVybWlzc2lvbjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIHRoZSB0ZW5hbnQtbGV2ZWwgcmVxdWlyZWQgcHJvZmlsZSBmaWVsZHMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHJlcXVpcmVkUHJvZmlsZUZpZWxkcyAtIEZpZWxkIGtleXMgKGUuZy4gJ3Bob25lJykuXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRSZXF1aXJlZFByb2ZpbGVGaWVsZHMocmVxdWlyZWRQcm9maWxlRmllbGRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXF1aXJlZFByb2ZpbGVGaWVsZHMgPSByZXF1aXJlZFByb2ZpbGVGaWVsZHMgPz8gW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRlbmFudC1sZXZlbCByZXF1aXJlZCBwcm9maWxlIGZpZWxkcyAobmV2ZXIgbnVsbCkuXHJcbiAgICpcclxuICAgKiBSZWFkcyB0aGUgbG9jYWwgc3RvcmFnZSBjYWNoZSB0aGUgaG9zdGluZyBhcHBsaWNhdGlvbiB3cml0ZXMgYXQgbG9naW4gKGtleVxyXG4gICAqIGBSRVFVSVJFRF9QUk9GSUxFX0ZJRUxEU2ApIGFzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgsIHNvIHRoZSBhZGQtdXNlciAvXHJcbiAgICogZWRpdC11c2VyIGZvcm1zIGFsd2F5cyByZWZsZWN0IHRoZSB0ZW5hbnQgY29uZmlndXJhdGlvbiByZWdhcmRsZXNzIG9mIHRoZVxyXG4gICAqIEBJbnB1dC9yZXNvbHZlciB0aW1pbmcuXHJcbiAgICpcclxuICAgKiBUaGUgY2FjaGUgaXMgb25seSB0cnVzdGVkIHdoZW4gaXQgaXMgd2VsbC1mb3JtZWQgZm9yIHRoZSBhY3RpdmVcclxuICAgKiBhcHBsaWNhdGlvbjogaXRzIGBhcHBJZGAgbXVzdCBtYXRjaCB0aGUgY3VycmVudCB1c2VyJ3MgYGFwcElkYCBhbmQgaXRzXHJcbiAgICogYHJlcXVpcmVkRmllbGRzYCBtdXN0IGJlIGFuIGFycmF5LiBUaGlzIGd1YXJkcyBhZ2FpbnN0IChhKSBhIHN0YWxlIGNhY2hlXHJcbiAgICogZnJvbSBhIHByZXZpb3VzbHkgb3BlbmVkIGFwcGxpY2F0aW9uIGFwcGx5aW5nIGFub3RoZXIgdGVuYW50J3MgZmllbGRzLCBhbmRcclxuICAgKiAoYikgYSBtYWxmb3JtZWQgY2FjaGUgY3Jhc2hpbmcgdGhlIGZvcm1zIHdoZW4gY2FsbGVycyBydW5cclxuICAgKiBgcmVxdWlyZWRGaWVsZHMuaW5jbHVkZXMoLi4uKWAgb24gYSBub24tYXJyYXkgdmFsdWUuIFdoZW4gdGhlIGNhY2hlIGlzXHJcbiAgICogbWlzc2luZywgZm9yIGFub3RoZXIgYXBwLCBvciBtYWxmb3JtZWQsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGluLW1lbW9yeVxyXG4gICAqIHZhbHVlIHNldCB2aWEge0BsaW5rIHNldFJlcXVpcmVkUHJvZmlsZUZpZWxkc30gKHRoZSBob3N0IEBJbnB1dCksIHRoZW4gdG9cclxuICAgKiBhbiBlbXB0eSBsaXN0LlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0UmVxdWlyZWRQcm9maWxlRmllbGRzKCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3RvcmFnZVNlcnZpY2U/LmdldFZhbHVlKFxyXG4gICAgICBSRVFVSVJFRF9QUk9GSUxFX0ZJRUxEU19TVE9SQUdFX0tFWVxyXG4gICAgKSBhcyBDYWNoZWRSZXF1aXJlZFByb2ZpbGVGaWVsZHMgfCBudWxsO1xyXG4gICAgY29uc3QgYWN0aXZlQXBwSWQgPSB0aGlzLmdldFVzZXJJbmZvKCk/LmFwcElkO1xyXG4gICAgY29uc3QgaXNDYWNoZVVzYWJsZSA9XHJcbiAgICAgICEhY2FjaGVkICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkoY2FjaGVkLnJlcXVpcmVkRmllbGRzKSAmJlxyXG4gICAgICAoIWFjdGl2ZUFwcElkIHx8IGNhY2hlZC5hcHBJZCA9PT0gYWN0aXZlQXBwSWQpO1xyXG4gICAgaWYgKGlzQ2FjaGVVc2FibGUpIHJldHVybiBjYWNoZWQucmVxdWlyZWRGaWVsZHM7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZFByb2ZpbGVGaWVsZHMgPz8gW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgYXBwbGljYXRpb24gZ3JvdXAgdHlwZXMgZnJvbSBBUEkgYW5kIHJldHVybnMgaXQgYXMgYW4gb2JzZXJ2YWJsZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdyb3VwVHlwZVJlc3BvbnNlPn0gLUl0IHJldHVybnMgZ3JvdXAgdHlwZXMgaWYgc3VjY2VzcyBlbHNlIGVycm9yLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBnZXRHcm91cFR5cGVzKCk6IE9ic2VydmFibGU8R3JvdXBUeXBlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL2NvbmZpZy9ncm91cFR5cGVDb25maWdJbmZvYClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXRMb2FkZWRHcm91cFR5cGVzKHJlc3BvbnNlPy5ib2R5KTtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGxvd2VkIHBhcmVudCBncm91cHMgZnJvbSBBUEkgYW5kIHJldHVybnMgaXQgYXMgYW4gb2JzZXJ2YWJsZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R3JvdXBUeXBlUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0QWxsb3dlZFBhcmVudEdyb3Vwcyhncm91cElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFBhcmVudEdyb3Vwc0luZm9bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvYWxsb3dlZFBhcmVudEdyb3Vwcy8ke2dyb3VwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlPy5ib2R5O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbGwgdGhlIGdyb3VwcyBiYXNlZCBvbiBwYXNzZWQgZ3JvdXAgSWQgYW5kIGdyb3VwIHR5cGUuXHJcbiAgICogQHBhcmFtIHtHZXRHcm91cHNQYXlsb2FkfSBnZXRHcm91cHNQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxHZXRHcm91cFJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwcyhnZXRHcm91cHNQYXlsb2FkOiBHZXRHcm91cHNQYXlsb2FkKTogT2JzZXJ2YWJsZTxHZXRHcm91cFJlc3BvbnNlPiB7XHJcbiAgICBsZXQgdXJsID0gJ3Jvb3RHcm91cHMnO1xyXG4gICAgaWYgKGdldEdyb3Vwc1BheWxvYWQuZ3JvdXBJZClcclxuICAgICAgdXJsID0gJ2ltbUNoaWxkR3JvdXBzQnlHcm91cElkLycgKyBnZXRHcm91cHNQYXlsb2FkLmdyb3VwSWQ7XHJcbiAgICBlbHNlIGlmIChnZXRHcm91cHNQYXlsb2FkLmdyb3VwVHlwZUlkKVxyXG4gICAgICB1cmwgPSAnZ3JvdXBzQnlHcm91cFR5cGUvJyArIGdldEdyb3Vwc1BheWxvYWQuZ3JvdXBUeXBlSWQ7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy8ke3VybH1gKS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnJvclJlcztcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgYSBncm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb25cclxuICAgKiBAcGFyYW0ge2dyb3VwSWR9IHN0cmluZyAtZ3JvdXBJZCBvZiB0aGUgZ3JvdXAgd2hpY2ggaXMgdG8gYmUgZGVsZXRlZFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxhbnk+fSAtT2JzZXJ2YWJsZSByZXByZXNlbnRpbmcgdGhlIGdyb3VwIGRlbGV0aW9uIHJlc3BvbnNlXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGRlbGV0ZUdyb3VwKGRlbGV0ZUdyb3VwUGF5bG9hZDogRGVsZXRlR3JvdXBQYXlsb2FkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL2RlbGV0ZWAsIGRlbGV0ZUdyb3VwUGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEZWxldGVzIGEgdXNlciBmcm9tIGdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvblxyXG4gICAqIEBwYXJhbSB7Z3JvdXBJZH0gc3RyaW5nIC1ncm91cElkIG9mIHRoZSBzZWxlY3RlZCBncm91cCBmcm9tIHdoZXJlIHNlbGVjdGVkIHVzZXIgdG8gYmUgZGVsZXRlZC5cclxuICAgKiBAcGFyYW0ge3VzZXJJZH0gQXJyYXkgLXVzZXIgaWRzIG9mIHNlbGVjdGVkIHVzZXJzIHdobyBhcmUgZGVsZXRlZCBmcm9tIHRoZSBzZWxlY3RlZCBncm91cFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxhbnk+fSAtT2JzZXJ2YWJsZSByZXByZXNlbnRpbmcgdGhlIGdyb3VwIGRlbGV0aW9uIHJlc3BvbnNlXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGRlbGV0ZVVzZXJzR3JvdXAoXHJcbiAgICBkZWxldGVVc2VyR3JvdXBQYXlsb2FkOiBEZWxldGVVc2VyR3JvdXBQYXlsb2FkXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvZGVsZXRlR3JvdXBVc2Vyc2AsXHJcbiAgICAgICAgZGVsZXRlVXNlckdyb3VwUGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3RzIGNyZWF0ZSBncm91cCBmb3JtIGRhdGEgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlIGZvciBjcmVhdGluZyBuZXcgZ3JvdXAuXHJcbiAgICogQHBhcmFtIHtDcmVhdGVHcm91cFBheWxvYWR9IGNyZWF0ZUdyb3VwUGF5bG9hZCAtY3JlYXRlIGdyb3VwIGZvcm0gZGF0YSB3aGljaCBpbmNsdWRlcyBncm91cCBuYW1lLCB0eXBlLCBzaG9ydCBuYW1lLCBzY29wZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENyZWF0ZUdyb3VwUmVzcG9uc2U+fSAtcmV0dXJucyBjcmVhdGUgZ3JvdXAgQVBJIHJlc3BvbnNlIChzdWNjZXNzIG9yIGVycm9yKSBhcyBhbiBvYnNlcnZhYmxlLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjcmVhdGVHcm91cChcclxuICAgIGNyZWF0ZUdyb3VwUGF5bG9hZDogQ3JlYXRlR3JvdXBQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVHcm91cFJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvY3JlYXRlYCwgY3JlYXRlR3JvdXBQYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGdyb3VwIGZvcm0gZGF0YSB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHBhcmFtIHtFZGl0R3JvdXBQYXlsb2FkfSBlZGl0R3JvdXBQYXlsb2FkIC1lZGl0IGdyb3VwIGZvcm0gZGF0YSB3aGljaCBpbmNsdWRlcyBncm91cCBuYW1lLCBzaG9ydCBuYW1lLCBzY29wZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEVkaXRHcm91cFBheWxvYWQ+fSAtcmV0dXJucyBlZGl0IGdyb3VwIEFQSSByZXNwb25zZSAoc3VjY2VzcyBvciBlcnJvcikgYXMgYW4gb2JzZXJ2YWJsZS5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGVkaXRHcm91cChcclxuICAgIGVkaXRHcm91cFBheWxvYWQ6IEVkaXRHcm91cFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPENyZWF0ZUdyb3VwUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL2VkaXRgLCBlZGl0R3JvdXBQYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHBhcnNlIHRoZSBlcnJvciBjb2RlcyBhbmQgcmV0dXJuIHRoZSByZXNwZWN0aXZlIGVycm9yIG1lc3NhZ2UgZm9yIGVhY2ggY29kZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBlcnJvckNvZGVzXHJcbiAgICogQHJldHVybiB7c3RyaW5nW119IGVycm9yTWVzc2FnZVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgcGFyc2VFcnJvck1lc3NhZ2UoZXJyb3JDb2Rlczogc3RyaW5nW10pIHtcclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZTogc3RyaW5nW10gPSBbXTtcclxuICAgIGVycm9yQ29kZXM/LmZvckVhY2goKGl0ZW06IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXkgPSBlcnJvckNvZGVzW2luZGV4XSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5ncm91cHNUZXh0O1xyXG4gICAgICBlcnJvck1lc3NhZ2UucHVzaChcclxuICAgICAgICB0aGlzLmdyb3Vwc1RleHRbZXJyb3JNZXNzYWdlS2V5XSA/PyB0aGlzLmdyb3Vwc1RleHQ/LmRlZmF1bHRcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGVycm9yTWVzc2FnZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgY3VzdG9tIEFQSSBlcnJvcnM6IG1hcHMgQkUgZXJyb3IgY29kZXMgdG8gbWVzc2FnZXMgYW5kIHNob3dzIGFuXHJcbiAgICogYWxlcnQuIE1pcnJvcnMgdGhlIGV2ZW50cy1hbmQtbWVldGluZ3MgZXJyb3IgaGFuZGxpbmcgc28gcmVjaXByb2NhbC1jcmVkaXRcclxuICAgKiBmYWlsdXJlcyAoZS5nLiBNVEctMDExIGR1cGxpY2F0ZSwgTVRHLTAxMiBwZXJtaXNzaW9uKSBzdXJmYWNlIGNvbnNpc3RlbnRseS5cclxuICAgKiBAcGFyYW0geyp9IGVycm9yIHRoZSBIdHRwRXJyb3JSZXNwb25zZSBmcm9tIGEgZmFpbGVkIGNhbGxcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG93QWxlcnQ9dHJ1ZV0gd2hldGhlciB0byBkaXNwbGF5IHRoZSBhbGVydFxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBoYW5kbGVFcnJvcnMoZXJyb3I6IGFueSwgc2hvd0FsZXJ0ID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZXJyb3JDb2RlcyA9IGVycm9yPy5lcnJvcj8uYm9keT8uZXJyb3JDb2RlcztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGVycm9yQ29kZXMpICYmICFlcnJvcj8uZXJyb3I/LnN0YXR1cykge1xyXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLnBhcnNlRXJyb3JNZXNzYWdlKGVycm9yQ29kZXMpO1xyXG4gICAgICBpZiAoc2hvd0FsZXJ0KSB7XHJcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2U/LnNob3dNZXNzYWdlKHtcclxuICAgICAgICAgIHN0YXR1czogJ2N1c3RvbScsXHJcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICBhbGVydFR5cGU6IEFsZXJ0VHlwZS5FUlJPUixcclxuICAgICAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgc2VsZWN0ZWQgZ3JvdXAgaW5mby5cclxuICAgKiBAcGFyYW0geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSBzZWxlY3RlZEdyb3VwSW5mbyAtc2VsZWN0ZWQgZ3JvdXAgaW5mby5cclxuICAgKiBAcGFyYW0geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSBbc2VsZWN0ZWRHcm91cFBhcmVudEluZm9dIC1zZWxlY3RlZCBwYXJlbnQgZ3JvdXAgaW5mby5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFNlbGVjdGVkR3JvdXBJbmZvKFxyXG4gICAgc2VsZWN0ZWRHcm91cEluZm86IEdyb3VwSW5mbyB8IHVuZGVmaW5lZCxcclxuICAgIHNlbGVjdGVkR3JvdXBQYXJlbnRJbmZvPzogR3JvdXBJbmZvIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBJbmZvID0gc2VsZWN0ZWRHcm91cEluZm87XHJcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBQYXJlbnRJbmZvID0gc2VsZWN0ZWRHcm91cFBhcmVudEluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBncm91cCBpbmZvLlxyXG4gICAqIEByZXR1cm4geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSAtZ3JvdXAgaW5mby5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkR3JvdXBJbmZvKCk6IEdyb3VwSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEdyb3VwSW5mbztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGdyb3VwIHBhcmVudCBncm91cCBpbmZvLlxyXG4gICAqIEByZXR1cm4geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSAtZ3JvdXAgaW5mby5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkR3JvdXBQYXJlbnRJbmZvKCk6IEdyb3VwSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEdyb3VwUGFyZW50SW5mbztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgZ3JvdXAgZnVuY3Rpb24gdHlwZS5cclxuICAgKiBAcGFyYW0ge0dyb3VwRnVuY3Rpb25UeXBlfSBncm91cEZ1bmN0aW9uVHlwZSAtZ3JvdXAgZnVuY3Rpb24gdHlwZS5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldEdyb3VwRnVuY3Rpb25UeXBlKGdyb3VwRnVuY3Rpb25UeXBlOiBHcm91cEZ1bmN0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy5ncm91cEZ1bmN0aW9uVHlwZSA9IGdyb3VwRnVuY3Rpb25UeXBlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBncm91cCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqIEByZXR1cm4ge0dyb3VwRnVuY3Rpb25UeXBlfSAtZ3JvdXAgZnVuY3Rpb24gdHlwZS5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwRnVuY3Rpb25UeXBlKCk6IEdyb3VwRnVuY3Rpb25UeXBlIHtcclxuICAgIHJldHVybiB0aGlzLmdyb3VwRnVuY3Rpb25UeXBlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgZ3JvdXAgdXNlcnMgZm9yIHRoZSBnaXZlbiBncm91cCBpZC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIGdldEdyb3VwVXNlcnMoXHJcbiAgICBncm91cElkOiBzdHJpbmcsXHJcbiAgICBzb3J0Q29sdW1uOiBzdHJpbmcsXHJcbiAgICBzb3J0RGlyZWN0aW9uOiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRHcm91cFVzZXJzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKFxyXG4gICAgICAgIGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci8ke2dyb3VwSWR9P3NvcnRDb2x1bW49JHtzb3J0Q29sdW1ufSZhc2NlbmRpbmdPcmRlcj0ke3NvcnREaXJlY3Rpb259YFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdyb3VwIHVzZXJzIGJhc2VkIG9uIHRoZSBmaWx0ZXJlZCByb2xlcy5cclxuICAgKiBAcGFyYW0ge0ZpbHRlclVzZXJzUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwVXNlcnNCeVJvbGVzKFxyXG4gICAgcGF5bG9hZDogRmlsdGVyVXNlcnNQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRHcm91cFVzZXJzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvZ3JvdXBVc2Vyc0ZpbHRlcmAsIHBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdyb3VwIHVzZXJzIGJhc2VkIG9uIHNlYXJjaGVkIG5hbWUgb3IgZW1haWxcclxuICAgKiBAcGFyYW0ge1NlYXJjaFVzZXJzUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNlYXJjaEdyb3VwVXNlcnMoXHJcbiAgICBwYXlsb2FkOiBTZWFyY2hVc2Vyc1BheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPEdldEdyb3VwVXNlcnNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci9ncm91cFVzZXJzU2VhcmNoYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yUmVzKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvclJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgZ3JvdXAgcm9sZXMgYmFzZWQgb24gdGhlIGdyb3VwIHR5cGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGdyb3VwVHlwZUlkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDaGVja2JveE9wdGlvbltdPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgZ2V0R3JvdXBUeXBlUm9sZXMoZ3JvdXBUeXBlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hlY2tib3hPcHRpb25bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvY29uZmlnL3JvbGVzQnlHcm91cFR5cGUvJHtncm91cFR5cGVJZH1gXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm9sZXNPcHRpb246IENoZWNrYm94T3B0aW9uW10gPSBbXTtcclxuICAgICAgICAgIGNvbnN0IG1lbWJlclR5cGVzOiBSb2xlW10gPSBbXTtcclxuICAgICAgICAgIHJlc3BvbnNlPy5ib2R5Py5mb3JFYWNoKChyb2xlOiBSb2xlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyb2xlPy5yb2xlVHlwZU5hbWUgPT09IFJvbGVUeXBlLk1FTUJFUl9MRVZFTCkge1xyXG4gICAgICAgICAgICAgIG1lbWJlclR5cGVzLnB1c2gocm9sZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcm9sZXNPcHRpb24ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBpZDogcm9sZS5yb2xlSWQsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiByb2xlLnJvbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5zZXRHcm91cFR5cGVVc2VyUm9sZXMocm9sZXNPcHRpb24pO1xyXG4gICAgICAgICAgdGhpcy5zZXRNZW1iZXJUeXBlcyhtZW1iZXJUeXBlcyk7XHJcbiAgICAgICAgICByZXR1cm4gcm9sZXNPcHRpb247XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yUmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGNsYXNzaWZpY2F0aW9ucyBtYXN0ZXIgZGF0YSBmcm9tIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybnMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDbGFzc2lmaWNhdGlvblJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldENsYXNzaWZpY2F0aW9ucygpOiBPYnNlcnZhYmxlPENsYXNzaWZpY2F0aW9uUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci9jbGFzc2lmaWNhdGlvbmApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdHJ1ZSBpZiBsb2dnZWQgaW4gdXNlciBpcyBhZG1pbi5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgaXNBZG1pblVzZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFjY2VzcyhQZXJtaXNzaW9uVHlwZS5NQU5BR0VfU1lTVEVNX1VTRVJTKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHVzZXIgaG9sZHMgdGhlIG5lZ2F0aXZlIHBlcm1pc3Npb24gdGhhdCByZXN0cmljdHMgYWxsXHJcbiAgICogZ3JvdXAgYW5kIHJvc3RlciB3cml0ZSBhY3Rpb25zLCByZWdhcmRsZXNzIG9mIGFueSBvdGhlciBncmFudGVkIHBlcm1pc3Npb24uXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGlzR3JvdXBzQW5kUm9zdGVyc1Jlc3RyaWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFjY2VzcyhQZXJtaXNzaW9uVHlwZS5SRVNUUklDVF9HUk9VUFNfQU5EX1JPU1RFUlMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25jYXRlbmF0ZXMgdGhlIGdyb3VwIHVzZXJzIGFzc2lnbmVkIHJvbGVzIG5hbWUgc2VwYXJhdGVkIGJ5IGNvbW1hIGFzIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgZ3JvdXAgdXNlcnMgaW4gYW4gYXJyYXkuXHJcbiAgICogQHBhcmFtIHtHZXRHcm91cFVzZXJzUmVzcG9uc2V9IHJlc3BvbnNlXHJcbiAgICogQHJldHVybiB7VXNlcltdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgdHJhbnNmb3JtVXNlclJvbGVzTmFtZUFzU3RyaW5nKHJlc3BvbnNlOiBHZXRHcm91cFVzZXJzUmVzcG9uc2UpOiBVc2VyW10ge1xyXG4gICAgY29uc3QgdXNlcnM6IFVzZXJbXSA9IFtdO1xyXG4gICAgdGhpcy5yZXByZXNlbnRpbmdPcmdhbml6YXRpb25zID0gW107XHJcbiAgICByZXNwb25zZT8uYm9keT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBjbGFzc2lmaWNhdGlvbkRlc2MgPVxyXG4gICAgICAgIGl0ZW0uY2xhc3NpZmljYXRpb24/LmNsYXNzaWZpY2F0aW9uTmFtZSArXHJcbiAgICAgICAgJyAoJyArXHJcbiAgICAgICAgaXRlbS5jbGFzc2lmaWNhdGlvbj8uY2xhc3NpZmljYXRpb25EZXNjICtcclxuICAgICAgICAnKSc7XHJcbiAgICAgIGNvbnN0IHJvbGVzTGlzdCA9IGl0ZW0/LnJvbGVzTGlzdD8ucmVkdWNlKFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgKHJvbGVMaXN0OiBhbnksIHJvbGU6IFJvbGUpID0+IHtcclxuICAgICAgICAgIHJvbGVMaXN0W1xyXG4gICAgICAgICAgICByb2xlLnJvbGVUeXBlTmFtZSA9PT0gUm9sZVR5cGUuTUVNQkVSX0xFVkVMID8gJ21lbWJlclR5cGUnIDogJ3JvbGVzJ1xyXG4gICAgICAgICAgXS5wdXNoKHJvbGU/LnJvbGVOYW1lKTtcclxuICAgICAgICAgIHJldHVybiByb2xlTGlzdDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgbWVtYmVyVHlwZTogW10sIHJvbGVzOiBbXSB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVwcmVzZW50aW5nT3JnYW5pemF0aW9ucz8ucHVzaCh7XHJcbiAgICAgICAgdXNlcklkOiBpdGVtPy51c2VySWQsXHJcbiAgICAgICAgb3JnYW5pemF0aW9uczogaXRlbT8ub3JnYW5pemF0aW9ucyxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IG9yZ2FuaXphdGlvbnMgPSBpdGVtPy5vcmdhbml6YXRpb25zXHJcbiAgICAgICAgPyBpdGVtPy5vcmdhbml6YXRpb25zPy5tYXAoKG9yZykgPT4gb3JnPy5vcmdOYW1lKS5qb2luKCc7ICcpXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgICB1c2Vycy5wdXNoKHtcclxuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxyXG4gICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcclxuICAgICAgICBlbWFpbDogaXRlbS5lbWFpbCxcclxuICAgICAgICByb2xlOiByb2xlc0xpc3Q/LnJvbGVzPy5sZW5ndGggPyByb2xlc0xpc3Q/LnJvbGVzPy5qb2luKCcsICcpIDogbnVsbCxcclxuICAgICAgICBjbGFzc2lmaWNhdGlvbjogaXRlbS5jbGFzc2lmaWNhdGlvbj8uY2xhc3NpZmljYXRpb25JZFxyXG4gICAgICAgICAgPyBjbGFzc2lmaWNhdGlvbkRlc2NcclxuICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICBtZW1iZXJTdGF0dXM6IHJvbGVzTGlzdD8ubWVtYmVyVHlwZT8ubGVuZ3RoXHJcbiAgICAgICAgICA/IHJvbGVzTGlzdD8ubWVtYmVyVHlwZVswXVxyXG4gICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgIG9yZ2FuaXphdGlvbjogb3JnYW5pemF0aW9ucyxcclxuICAgICAgICBlbXBsb3llcjogaXRlbS5lbXBsb3llcj8ub3JnTmFtZSA/PyBudWxsLFxyXG4gICAgICAgIHBob25lQ291bnRyeUNvZGU6IGl0ZW0ucGhvbmVDb3VudHJ5Q29kZSA/PyBudWxsLFxyXG4gICAgICAgIHBob25lTnVtYmVyOiBpdGVtLnBob25lTnVtYmVyID8/IG51bGwsXHJcbiAgICAgICAgYWRkcmVzczogaXRlbS5hZGRyZXNzID8/IG51bGwsXHJcbiAgICAgICAgY2FuRGVsZXRlOiAhKFxyXG4gICAgICAgICAgaXRlbT8udXNlcklkID09PSB0aGlzLnVzZXJJbmZvPy51c2VySWQgJiZcclxuICAgICAgICAgIHRoaXMuaXNBZG1pblVzZXIoKSAmJlxyXG4gICAgICAgICAgdGhpcy5nZXRCdXNpbmVzc1J1bGVPZlNlbGVjdGVkR3JvdXAoKT8uaXNBZG1pblxyXG4gICAgICAgICksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgZm9ybWF0dGVkIGdyb3VwIHR5cGVzLlxyXG4gICAqIEBwYXJhbSB7R3JvdXBUeXBlQ29uZmlndXJhdGlvbltdfSBncm91cFR5cGVSZXNwb25zZVxyXG4gICAqIEByZXR1cm4ge0dyb3VwVHlwZUNvbmZpZ1ZhbHVlfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Rm9ybWF0dGVkR3JvdXBUeXBlcyhcclxuICAgIGdyb3VwVHlwZVJlc3BvbnNlOiBHcm91cFR5cGVDb25maWd1cmF0aW9uW11cclxuICApOiBHcm91cFR5cGVDb25maWdWYWx1ZSB7XHJcbiAgICBjb25zdCBncm91cFR5cGVzOiBHcm91cFR5cGVDb25maWdWYWx1ZSA9IHt9O1xyXG4gICAgZ3JvdXBUeXBlUmVzcG9uc2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBncm91cFR5cGVzW2l0ZW0uY29uZmlnRmllbGRJZF0gPSBpdGVtLmNvbmZpZ0ZpZWxkVmFsdWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBncm91cFR5cGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBncm91cCB1c2VyIGRldGFpbHMgaWYgZW1haWwgaXMgZm91bmQsIGVsc2UgdGhyb3dzIGVycm9yLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8U2VhcmNoVXNlckJ5RW1haWxSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRVc2VyQnlFbWFpbChlbWFpbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZWFyY2hVc2VyQnlFbWFpbFJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy91c2Vycy91c2VyQnlFbWFpbC8ke2VtYWlsfWApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIHVzZXIgZGV0YWlscyBmb3IgdGhlIHNlbGVjdGVkIGdyb3VwXHJcbiAgICogQHBhcmFtIHtHZXRVc2VyRGV0YWlsc1BheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFkZE9yRWRpdEdyb3VwVXNlckRldGFpbHNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRHcm91cFVzZXJEZXRhaWxzKFxyXG4gICAgcGF5bG9hZDogR2V0VXNlckRldGFpbHNQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxBZGRPckVkaXRHcm91cFVzZXJEZXRhaWxzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvdXNlckRldGFpbHNgLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBvc3RzIGFkZCBuZXcgdXNlciBmb3JtIGRhdGEgdG8gdGhlIEFQSSBmb3IgdGhlIHNlbGVjdGVkIGdyb3VwIGFuZCByZXR1cm5zIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgcmVzcG9uc2UuXHJcbiAgICogQHBhcmFtIHsoQWRkT3JFZGl0VXNlclBheWxvYWRcclxuICAgKiAgICAgICB8IEFkZE9yRWRpdFVzZXJJbmRpdmlkdWFsUm9zdGVyUGF5bG9hZCl9IEFkZE9yRWRpdFVzZXJQYXlsb2FkXHJcbiAgICogQHBhcmFtIHtHcm91cFJvc3RlclR5cGV9IGdyb3VwUm9zdGVyVHlwZVxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QWRkT3JFZGl0R3JvdXBVc2VyRGV0YWlsc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGFkZE5ld0dyb3VwVXNlcihcclxuICAgIEFkZE9yRWRpdFVzZXJQYXlsb2FkOlxyXG4gICAgICB8IEFkZE9yRWRpdFVzZXJQYXlsb2FkXHJcbiAgICAgIHwgQWRkT3JFZGl0VXNlckluZGl2aWR1YWxSb3N0ZXJQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxBZGRPckVkaXRHcm91cFVzZXJEZXRhaWxzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvY3JlYXRlR3JvdXBVc2VyUm9sZWAsXHJcbiAgICAgICAgQWRkT3JFZGl0VXNlclBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBsb2FkZWQgZ3JvdXAgdHlwZSB1c2VyIHJvbGVzXHJcbiAgICogQHBhcmFtIHtDaGVja2JveE9wdGlvbltdfSB1c2VyUm9sZXNcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldEdyb3VwVHlwZVVzZXJSb2xlcyh1c2VyUm9sZXM6IENoZWNrYm94T3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBUeXBlUm9sZXMgPSB1c2VyUm9sZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBncm91cCB0eXBlIHVzZXIgcm9sZXMuXHJcbiAgICogQHJldHVybiB7Q2hlY2tib3hPcHRpb25bXX1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwVHlwZVVzZXJSb2xlcygpOiBDaGVja2JveE9wdGlvbltdIHtcclxuICAgIHRoaXMuZ3JvdXBUeXBlUm9sZXM/Lm1hcCgob3B0aW9uKSA9PiAob3B0aW9uLmNoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBUeXBlUm9sZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBzZWxlY3RlZCB1c2VyIGluZm8uXHJcbiAgICogQHBhcmFtIHtHcm91cFVzZXJJbmZvfSB1c2VySW5mb1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0U2VsZWN0ZWRVc2VySW5mbyh1c2VySW5mbzogR3JvdXBVc2VySW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdXNlckluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHNlbGVjdGVkIHVzZXIgaW5mby5cclxuICAgKiBAcmV0dXJuIHtHcm91cFVzZXJJbmZvfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0U2VsZWN0ZWRVc2VySW5mbygpOiBHcm91cFVzZXJJbmZvIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVXNlckluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGdyb3VwIHVzZXIgcm9sZXMgYW5kIG90aGVyIGRldGFpbHMgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7KEFkZE9yRWRpdFVzZXJQYXlsb2FkIHwgQWRkT3JFZGl0VXNlckluZGl2aWR1YWxSb3N0ZXJQYXlsb2FkKX0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QWRkT3JFZGl0R3JvdXBVc2VyRGV0YWlsc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGVkaXRHcm91cHNVc2VyUm9sZShcclxuICAgIHBheWxvYWQ6IEFkZE9yRWRpdFVzZXJQYXlsb2FkIHwgQWRkT3JFZGl0VXNlckluZGl2aWR1YWxSb3N0ZXJQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxBZGRPckVkaXRHcm91cFVzZXJEZXRhaWxzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci9lZGl0R3JvdXBVc2VyUm9sZWAsIHBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgcm9zdGVyIGZ1bmN0aW9uIHR5cGUuXHJcbiAgICogQHBhcmFtIHtSb3N0ZXJGdW5jdGlvblR5cGV9IHJvc3RlckZ1bmN0aW9uVHlwZVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0Um9zdGVyRnVuY3Rpb25UeXBlKHJvc3RlckZ1bmN0aW9uVHlwZTogUm9zdGVyRnVuY3Rpb25UeXBlKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvc3RlckZ1bmN0aW9uVHlwZSA9IHJvc3RlckZ1bmN0aW9uVHlwZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgcm9zdGVyIGZ1bmN0aW9uIHR5cGUuXHJcbiAgICogQHJldHVybiB7Um9zdGVyRnVuY3Rpb25UeXBlfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9zdGVyRnVuY3Rpb25UeXBlKCk6IFJvc3RlckZ1bmN0aW9uVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3N0ZXJGdW5jdGlvblR5cGU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdyb3VwcyBiYXNlZCBvbiB0aGUgc2VhcmNoIGJ5IGdyb3VwIG5hbWUgb3IgYWNyb255bS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoVGVybVxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdyb3Vwc0J5TmFtZUFjcm9ueW0oXHJcbiAgICBzZWFyY2hUZXJtOiBzdHJpbmcsXHJcbiAgICBmaWx0ZXJlZEdyb3VwVHlwZT86IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8R2V0R3JvdXBSZXNwb25zZT4ge1xyXG4gICAgY29uc3Qgc2VhcmNoR3JvdXBzVXJsID0gYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvZ3JvdXBzQnlOYW1lQWNyb255bT9uYW1lPSR7c2VhcmNoVGVybX1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoXHJcbiAgICAgICAgZmlsdGVyZWRHcm91cFR5cGVcclxuICAgICAgICAgID8gc2VhcmNoR3JvdXBzVXJsICsgYCZncm91cFR5cGU9JHtmaWx0ZXJlZEdyb3VwVHlwZX1gXHJcbiAgICAgICAgICA6IHNlYXJjaEdyb3Vwc1VybFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdXNlciBncm91cCBwZXJtaXNzaW9uc1xyXG4gICAqIEBwYXJhbSB7R3JvdXBQZXJtaXNzaW9uW119IHVzZXJHcm91cFBlcm1pc3Npb25zXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRVc2VyR3JvdXBQZXJtaXNzaW9ucyh1c2VyR3JvdXBQZXJtaXNzaW9uczogR3JvdXBQZXJtaXNzaW9uW10pIHtcclxuICAgIHRoaXMudXNlckdyb3VwUGVybWlzc2lvbnMgPSB1c2VyR3JvdXBQZXJtaXNzaW9ucztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdXNlciBncm91cCBwZXJtaXNzaW9uc1xyXG4gICAqIEByZXR1cm4ge0dyb3VwUGVybWlzc2lvbltdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0VXNlckdyb3VwUGVybWlzc2lvbnMoKTogR3JvdXBQZXJtaXNzaW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckdyb3VwUGVybWlzc2lvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGxvZ2dlZCBJbiB1c2VyIGluZm9ybWF0aW9uLlxyXG4gICAqIEBwYXJhbSB7TG9nZ2VkSW5Vc2VySW5mb30gdXNlckluZm9cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFVzZXJJbmZvKHVzZXJJbmZvOiBMb2dnZWRJblVzZXJJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXJJbmZvID0gdXNlckluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxvZ2dlZCBpbiB1c2VyIGluZm9ybWF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSBVU0VSX0lORk8gYmxvYlxyXG4gICAqIHRoZSBob3N0IGFwcCBwZXJzaXN0cyB0byBsb2NhbCBzdG9yYWdlIHdoZW4gdGhlIHVzZXJJbmZvIGlucHV0IGhhc24ndFxyXG4gICAqIGJlZW4gc2V0IHlldCAoZS5nLiBob3N0IHdpcmluZyBub3QgY29tcGxldGVkIG9yIHRpbWluZyByYWNlIG9uIGluaXQpLlxyXG4gICAqIEByZXR1cm4ge0xvZ2dlZEluVXNlckluZm99XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRVc2VySW5mbygpOiBMb2dnZWRJblVzZXJJbmZvIHtcclxuICAgIGlmICh0aGlzLnVzZXJJbmZvPy5hcHBJZCkgcmV0dXJuIHRoaXMudXNlckluZm87XHJcbiAgICBjb25zdCBzdG9yZWRVc2VySW5mbyA9IHRoaXMuc3RvcmFnZVNlcnZpY2U/LmdldFZhbHVlKFN0b3JhZ2VLZXlzLlVTRVJfSU5GTyk7XHJcbiAgICByZXR1cm4gc3RvcmVkVXNlckluZm8/LmFwcElkID8gc3RvcmVkVXNlckluZm8gOiB0aGlzLnVzZXJJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgcGVybWlzc2lvbiBiYXNlZCBhY2Nlc3MgZm9yIHByb3ZpZGVkIGZlYXR1cmUuXHJcbiAgICogQ2hlY2tzIGZvciBncm91cCBsZXZlbCBwZXJtaXNzaW9ucywgYW5kIHByb3ZpZGVzIGFjY2VzcyBiYXNlZCBvbiBpbmRpdmlkdWFsIGdyb3VwIHBlcm1pc3Npb25zLlxyXG4gICAqIEZvciBnbG9iYWwgcGVybWlzc2lvbnMgcHJvdmlkZXMgYWNjZXNzIGFjcm9zcyB0aGUgaW5kaXZpZHVhbCBncm91cHMgb3IgU3lzdGVtIGdyb3Vwcy5cclxuICAgKiBAcGFyYW0ge1Blcm1pc3Npb25UeXBlfSBwZXJtaXNzaW9uVHlwZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICB2YWxpZGF0ZUFjY2VzcyhcclxuICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZSxcclxuICAgIHBlcm1pc3Npb25zPzogVXNlclBlcm1pc3Npb25bXSB8IG51bGxcclxuICApOiBib29sZWFuIHtcclxuICAgIGlmIChwZXJtaXNzaW9ucykge1xyXG4gICAgICBjb25zdCB1c2VyUGVybWlzc2lvbnNUb0dyb3VwID1cclxuICAgICAgICB0aGlzLnVzZXJQZXJtaXNzaW9uc1NlcnZpY2UuZmlsdGVyVXNlckdyb3VwUGVybWlzc2lvbnMoXHJcbiAgICAgICAgICBwZXJtaXNzaW9ucyxcclxuICAgICAgICAgIHRoaXMuZ3JvdXBQZXJtaXNzaW9uc1NlcnZpY2UuZ2V0R3JvdXBQZXJtaXNzaW9ucygpXHJcbiAgICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXMudXNlclBlcm1pc3Npb25zU2VydmljZS52YWxpZGF0ZUFjY2Vzc1Blcm1pc3Npb24oXHJcbiAgICAgICAgcGVybWlzc2lvblR5cGUsXHJcbiAgICAgICAgdXNlclBlcm1pc3Npb25zVG9Hcm91cFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudXNlclBlcm1pc3Npb25zU2VydmljZS52YWxpZGF0ZUFjY2Vzc1Blcm1pc3Npb24oXHJcbiAgICAgIHBlcm1pc3Npb25UeXBlLFxyXG4gICAgICB0aGlzLmdldFVzZXJHcm91cFBlcm1pc3Npb25zKClcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIHRoZSBsb2FkZWQgZ3JvdXAgdHlwZXMuXHJcbiAgICogQHBhcmFtIHtHcm91cFR5cGVDb25maWd1cmF0aW9uW119IGdyb3VwVHlwZXNcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldExvYWRlZEdyb3VwVHlwZXMoZ3JvdXBUeXBlczogR3JvdXBUeXBlQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICB0aGlzLmdyb3VwVHlwZXMgPSBncm91cFR5cGVzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGxvYWRlZCBncm91cCB0eXBlcy5cclxuICAgKiBAcmV0dXJuIHtHcm91cFR5cGVDb25maWd1cmF0aW9uW119XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRMb2FkZWRHcm91cFR5cGVzKCk6IEdyb3VwVHlwZUNvbmZpZ3VyYXRpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncm91cFR5cGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09yZ2FuaXphdGlvblJlcXVlc3RQYXlsb2FkfSBvcmdSZXF1ZXN0UGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8T3JnYW5pemF0aW9uUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0T3JnYW5pemF0aW9ucyhcclxuICAgIG9yZ1JlcXVlc3RQYXlsb2FkOiBPcmdhbml6YXRpb25SZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8T3JnYW5pemF0aW9uUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvb3JnYW5pemF0aW9uc2AsXHJcbiAgICAgICAgb3JnUmVxdWVzdFBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yUmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGdyb3VwIHR5cGUgY29uZmlndXJhdGlvbiBCdXNpbmVzcyBydWxlIGZvciB0aGUgc2VsZWN0ZWQgZ3JvdXAuXHJcbiAgICogQHJldHVybiB7KEJ1c2luZXNzUnVsZSAgfCB1bmRlZmluZWQpfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0QnVzaW5lc3NSdWxlT2ZTZWxlY3RlZEdyb3VwKCk6IEJ1c2luZXNzUnVsZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBidXNpbmVzc1J1bGUgPSB0aGlzLmdldExvYWRlZEdyb3VwVHlwZXMoKT8uZmluZChcclxuICAgICAgKGdyb3VwKSA9PiBncm91cD8uY29uZmlnRmllbGRJZCA9PT0gdGhpcy5nZXRTZWxlY3RlZEdyb3VwSW5mbygpPy5ncm91cFR5cGVcclxuICAgICk/LmNvbmZpZ0ZpZWxkVmFsdWU/LmJ1c2luZXNzUnVsZTtcclxuICAgIGlmKGJ1c2luZXNzUnVsZT8ucm9zdGVyVHlwZSA9PT0gR3JvdXBSb3N0ZXJUeXBlLkVOVElUWSlcclxuICAgICAgYnVzaW5lc3NSdWxlLnJvc3RlclR5cGUgPSBHcm91cFJvc3RlclR5cGUuSU5ESVZJRFVBTDtcclxuICAgIHJldHVybiBidXNpbmVzc1J1bGU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvcm0gc3VibWl0IGJ1dHRvbiBiYXNlZCBvbiBwYXNzZWQgcGFyYW1ldGVycy5cclxuICAgKiBAcGFyYW0ge0dyb3VwUm9zdGVyVHlwZX0gZ3JvdXBSb3N0ZXJUeXBlXHJcbiAgICogQHBhcmFtIHtGb3JtQ29udHJvbFN0YXR1c30gZm9ybVN0YXR1c1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNlbGVjdGVkVXNlclJvbGVzXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGlzU3VibWl0QnV0dG9uRGlzYWJsZWQoXHJcbiAgICBncm91cFJvc3RlclR5cGU6IEdyb3VwUm9zdGVyVHlwZSxcclxuICAgIGZvcm1TdGF0dXM6IEZvcm1Db250cm9sU3RhdHVzLFxyXG4gICAgc2VsZWN0ZWRVc2VyUm9sZXM6IHN0cmluZ1tdXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZ3JvdXBSb3N0ZXJUeXBlID09PSBHcm91cFJvc3RlclR5cGUuSU5ESVZJRFVBTClcclxuICAgICAgcmV0dXJuIGZvcm1TdGF0dXMgPT09IEZvcm1TdGF0dXMuSU5WQUxJRDtcclxuICAgIHJldHVybiBzZWxlY3RlZFVzZXJSb2xlcz8ubGVuZ3RoID09PSAwIHx8IGZvcm1TdGF0dXMgPT09IEZvcm1TdGF0dXMuSU5WQUxJRDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgaXNQYXJlbnRHcm91cENoYW5nZWQgdHJ1ZSBvciBmYWxzZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzUGFyZW50R3JvdXBDaGFuZ2VkXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRQYXJlbnRHcm91cENoYW5nZVN0YXR1cyhpc1BhcmVudEdyb3VwQ2hhbmdlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5pc1BhcmVudEdyb3VwQ2hhbmdlZCA9IGlzUGFyZW50R3JvdXBDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBpc1BhcmVudEdyb3VwQ2hhbmdlZCB2YWx1ZS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0UGFyZW50R3JvdXBDaGFuZ2VTdGF0dXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1BhcmVudEdyb3VwQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIG1lbWJlciB0eXBlcy5cclxuICAgKiBAcGFyYW0ge1JvbGVbXX0gbWVtYmVyVHlwZXNcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldE1lbWJlclR5cGVzKG1lbWJlclR5cGVzOiBSb2xlW10pOiB2b2lkIHtcclxuICAgIHRoaXMubWVtYmVyVHlwZXMgPSBtZW1iZXJUeXBlcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbWVtYmVyIHR5cGVzLlxyXG4gICAqIEByZXR1cm4ge1JvbGVbXX1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldE1lbWJlclR5cGVzKCk6IFJvbGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZW1iZXJUeXBlcztcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRoZSB1bmlxdWUgY2FsbGluZyBjb2RlcyBkZXJpdmVkIGZyb20gcGhvbmUgY291bnRyeSBtZXRhZGF0YS4gKi9cclxuICBnZXRDb3VudHJ5Q2FsbGluZ0NvZGVzKCk6IFNlbGVjdE9wdGlvbltdIHtcclxuICAgIGNvbnN0IGRpYWxDb2RlcyA9IFtcclxuICAgICAgLi4ubmV3IFNldChDT1VOVFJZX0RJQUxfQ09ERVMubWFwKChjb3VudHJ5KSA9PiBjb3VudHJ5LmRpYWxDb2RlKSksXHJcbiAgICBdLnNvcnQoXHJcbiAgICAgIChmaXJzdCwgc2Vjb25kKSA9PlxyXG4gICAgICAgIE51bWJlcihmaXJzdC5zbGljZSgxKSkgLSBOdW1iZXIoc2Vjb25kLnNsaWNlKDEpKVxyXG4gICAgKTtcclxuICAgIHJldHVybiBkaWFsQ29kZXMubWFwKChkaWFsQ29kZSkgPT4gKHsgaWQ6IGRpYWxDb2RlLCBuYW1lOiBkaWFsQ29kZSB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBzdG9yZWQgaW50ZXJlc3QtZm9ybSByZXNwb25zZXMgZm9yIGFuIGludGVyZXN0IHJlY29yZCwgZm9yIHRoZVxyXG4gICAqIFJvc3RlciBNYW5hZ2VtZW50IGFkbWluIFwiVmlldyBSZXNwb25zZXNcIiB2aWV3IChTUDNNLTQyOCwgUjguNykuXHJcbiAgICpcclxuICAgKiBHRVQge2FwaUJhc2VVcmx9L2dyb3Vwcy9pbnRlcmVzdC97aW50ZXJlc3RJZH0vcmVzcG9uc2VzXHJcbiAgICpcclxuICAgKiBUaGUgZW5kcG9pbnQgaXMga2V5ZWQgYnkgdGhlIGludGVyZXN0IHJlY29yZCBpZCAoe0Bjb2RlIEdJTlRfU0FBUFBTXy4uLn0pLFxyXG4gICAqIE5PVCB0aGUgZ3JvdXAgaWQsIGFuZCBpcyBndWFyZGVkIHNlcnZlci1zaWRlIGJ5IHJvc3Rlci12aWV3IHBlcm1pc3Npb25zXHJcbiAgICogKFZJRVdfR1JPVVBfTUVNQkVSUyBvbiB0aGUgZ3JvdXAgb3IgdGhlIHRlbmFudC13aWRlIFZJRVdfQUxMX1JPU1RFUlMpLiBUaGVcclxuICAgKiBiYXNlIFVSTCBhbHJlYWR5IGNhcnJpZXMgdGhlIHZlcnNpb24gc2VnbWVudCAoZS5nLiBgLi4uL3YxYCksIG1hdGNoaW5nIGV2ZXJ5XHJcbiAgICogb3RoZXIgR3JvdXBzU2VydmljZSBjYWxsIGJ1aWx0IGFzIGAke2FwaUJhc2VVcmx9L2dyb3Vwcy8uLi5gLCBzbyB0aGUgdmVyc2lvblxyXG4gICAqIGlzIG5vdCByZXBlYXRlZC4gVGhlIHJlc3BvbnNlIGVudmVsb3BlJ3MgYm9keSBpcyB0aGUgbGlzdCBvZiByZXNwb25zZXNcclxuICAgKiAobmV2ZXIgbnVsbCDigJQgYW4gZW1wdHkgbGlzdCBtZWFucyBubyBhbnN3ZXJzIHdlcmUgc3VibWl0dGVkKS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJlc3RJZCAtIFRoZSBpbnRlcmVzdCByZWNvcmQgd2hvc2UgcmVzcG9uc2VzIGFyZSByZWFkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8SW50ZXJlc3RGb3JtUmVzcG9uc2VbXT59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRJbnRlcmVzdFJlc3BvbnNlcyhcclxuICAgIGludGVyZXN0SWQ6IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8SW50ZXJlc3RGb3JtUmVzcG9uc2VbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvaW50ZXJlc3QvJHtpbnRlcmVzdElkfS9yZXNwb25zZXNgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiAocmVzcG9uc2U/LmJvZHkgYXMgSW50ZXJlc3RGb3JtUmVzcG9uc2VbXSkgPz8gW10pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yUmVzKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvclJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgaW50ZXJlc3RlZC11c2VycyByb3N0ZXIgZm9yIGEgZ3JvdXAg4oCUIG9uZSByb3cgcGVyIGludGVyZXN0XHJcbiAgICogY2FycnlpbmcgdGhlIHVzZXIncyBuYW1lL2VtYWlsLCBvcmdhbml6YXRpb24gYWZmaWxpYXRpb25zLCBzdWJtaXR0ZWRcclxuICAgKiB0aW1lc3RhbXAsIHRoZSBncm91cCdzIGRlZmF1bHQgbWVtYmVyc2hpcCBsZXZlbCwgYW5kIHRoZSBncm91cCB0eXBlIGlkIOKAlCBzb1xyXG4gICAqIHRoZSBSb3N0ZXIgTWFuYWdlbWVudCBhZG1pbiBcIkludGVyZXN0ZWQgUm9zdGVyc1wiIHRhYiByZW5kZXJzIHRoZSB3aG9sZSBncm91cFxyXG4gICAqIGluIGEgc2luZ2xlIGNhbGwgKFNQM00tNDI4LCBSOC43KS5cclxuICAgKlxyXG4gICAqIFBPU1Qge2FwaUJhc2VVcmx9L2dyb3Vwcy9pbnRlcmVzdC9ncm91cC97Z3JvdXBJZH0vcmVzcG9uc2VzXHJcbiAgICpcclxuICAgKiBUaGUgc2VhcmNoIHRlcm0sIHBhZ2luYXRpb24gYW5kIHNvcnQgb3B0aW9ucyBhcmUgc2VudCBpbiB0aGUgcmVxdWVzdCBib2R5XHJcbiAgICogKHtAbGluayBJbnRlcmVzdGVkUm9zdGVyc1JlcXVlc3RQYXlsb2FkfSkgc28gdGhlIGJhY2tlbmQgY2FuIGZpbHRlciwgcGFnZVxyXG4gICAqIGFuZCBzb3J0IHRoZSByb3N0ZXIgc2VydmVyLXNpZGUuIEd1YXJkZWQgc2VydmVyLXNpZGUgYnkgcm9zdGVyLXZpZXdcclxuICAgKiBwZXJtaXNzaW9ucyAoVklFV19HUk9VUF9NRU1CRVJTIG9uIHRoZSBncm91cCBvciB0aGUgdGVuYW50LXdpZGVcclxuICAgKiBWSUVXX0FMTF9ST1NURVJTKS4gVGhlIGJhc2UgVVJMIGFscmVhZHkgY2FycmllcyB0aGUgdmVyc2lvbiBzZWdtZW50LFxyXG4gICAqIG1hdGNoaW5nIGV2ZXJ5IG90aGVyIEdyb3Vwc1NlcnZpY2UgY2FsbCBidWlsdCBhcyBgJHthcGlCYXNlVXJsfS9ncm91cHMvLi4uYCxcclxuICAgKiBzbyB0aGUgdmVyc2lvbiBpcyBub3QgcmVwZWF0ZWQuIFRoZSByZXNwb25zZSBlbnZlbG9wZSdzIGJvZHkgaXMgYW5cclxuICAgKiB7QGxpbmsgSW50ZXJlc3RlZFJvc3RlcnNSZXNwb25zZX06IHRoZSByb3N0ZXIgcm93cyBsaXZlIHVuZGVyIGBkYXRhYCAobmV2ZXJcclxuICAgKiBudWxsIOKAlCBhbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBncm91cCBoYXMgbm8gaW50ZXJlc3RzKSBhbG9uZ3NpZGUgdGhlIHBhZ2luZ1xyXG4gICAqIG1ldGFkYXRhIChgdG90YWxSZWNvcmRzYCwgYG9mZnNldGAsIGBwYWdlU2l6ZWApLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBncm91cElkIC0gVGhlIGdyb3VwIHdob3NlIGludGVyZXN0ZWQtdXNlcnMgcm9zdGVyIGlzIHJlYWQuXHJcbiAgICogQHBhcmFtIHtJbnRlcmVzdGVkUm9zdGVyc1JlcXVlc3RQYXlsb2FkfSBwYXlsb2FkIC0gU2VhcmNoL3BhZ2luYXRpb24vc29ydCBvcHRpb25zLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8SW50ZXJlc3RlZFJvc3RlcnNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRJbnRlcmVzdFJlc3BvbnNlc0J5R3JvdXAoXHJcbiAgICBncm91cElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBJbnRlcmVzdGVkUm9zdGVyc1JlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxJbnRlcmVzdGVkUm9zdGVyc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvaW50ZXJlc3QvZ3JvdXAvJHtncm91cElkfS9yZXNwb25zZXNgLFxyXG4gICAgICAgIHBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2U/LmJvZHkgYXMgSW50ZXJlc3RlZFJvc3RlcnNSZXNwb25zZSB8IG51bGw7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkYXRhOiBib2R5Py5kYXRhID8/IFtdLFxyXG4gICAgICAgICAgICB0b3RhbFJlY29yZHM6IGJvZHk/LnRvdGFsUmVjb3JkcyA/PyAwLFxyXG4gICAgICAgICAgICBvZmZzZXQ6IGJvZHk/Lm9mZnNldCA/PyAwLFxyXG4gICAgICAgICAgICBwYWdlU2l6ZTogYm9keT8ucGFnZVNpemUgPz8gMCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yUmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzL292ZXJyaWRlcyB0aGUgbWVtYmVyc2hpcCBsZXZlbCBmb3IgYW4gaW50ZXJlc3RlZCB1c2VyIGZyb20gdGhlIFJvc3RlclxyXG4gICAqIE1hbmFnZW1lbnQgYWRtaW4gXCJJbnRlcmVzdGVkIFJvc3RlcnNcIiB0YWIgKFNQM00tNDI4KS4gQ2FsbGVkIHdoZW4gdGhlIGFkbWluXHJcbiAgICogcGlja3MgYSB2YWx1ZSBpbiBhIHJvdydzIE1lbWJlciBMZXZlbCBkcm9wZG93bi5cclxuICAgKlxyXG4gICAqIFBVVCB7YXBpQmFzZVVybH0vZ3JvdXBzL2ludGVyZXN0L21lbWJlci1sZXZlbFxyXG4gICAqXHJcbiAgICogVGhlIGdyb3VwLCB1c2VyIGFuZCBzZWxlY3RlZCByb2xlIGlkIGFyZSBzZW50IGluIHRoZSByZXF1ZXN0IGJvZHlcclxuICAgKiAoe0BsaW5rIFVwZGF0ZU1lbWJlckxldmVsUGF5bG9hZH0pLiBHdWFyZGVkIHNlcnZlci1zaWRlIGJ5IHJvc3Rlci1tYW5hZ2VtZW50XHJcbiAgICogcGVybWlzc2lvbnMuIFRoZSBiYXNlIFVSTCBhbHJlYWR5IGNhcnJpZXMgdGhlIHZlcnNpb24gc2VnbWVudCwgbWF0Y2hpbmdcclxuICAgKiBldmVyeSBvdGhlciBHcm91cHNTZXJ2aWNlIGNhbGwgYnVpbHQgYXMgYCR7YXBpQmFzZVVybH0vZ3JvdXBzLy4uLmAsIHNvIHRoZVxyXG4gICAqIHZlcnNpb24gaXMgbm90IHJlcGVhdGVkLiBUaGUgcmVzcG9uc2UgZW52ZWxvcGUncyBib2R5IGlzIHJldHVybmVkIGFzLWlzLlxyXG4gICAqIEBwYXJhbSB7VXBkYXRlTWVtYmVyTGV2ZWxQYXlsb2FkfSBwYXlsb2FkIC0gR3JvdXAgKyB1c2VyICsgc2VsZWN0ZWQgcm9sZSBpZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPHVua25vd24+fVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgdXBkYXRlSW50ZXJlc3RNZW1iZXJMZXZlbChcclxuICAgIHBheWxvYWQ6IFVwZGF0ZU1lbWJlckxldmVsUGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnB1dERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvaW50ZXJlc3QvbWVtYmVyLWxldmVsYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2U/LmJvZHkgPz8gbnVsbCksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yUmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBSZWNpcHJvY2FsIENyZWRpdCAoU1AzTS0yMilcclxuICAvLyBUaGUgcmVjaXByb2NhbCBjb250cm9sbGVyIGxpdmVzIG9uIHRoZSBNRUVUSU5HUyBzZXJ2aWNlLCByZWFjaGVkIHRocm91Z2ggdGhlXHJcbiAgLy8gZ2F0ZXdheS4gYXBpQmFzZVVybCA9IGFwcENvbmZpZy5iYXNlQXBpVXJsIChlbmRzIGluIGAvdjFgKSwgYW5kIHRoZSBnYXRld2F5XHJcbiAgLy8gcm91dGVzIHRoZSBtZWV0aW5ncyBzZXJ2aWNlIHVuZGVyIGAke2FwaUJhc2VVcmx9L21lZXRpbmdzYCAoc2FtZSBhcyBldmVyeSBvdGhlclxyXG4gIC8vIG1lZXRpbmdzL2V2ZW50cyBjYWxsLCBlLmcuIGAke2FwaUJhc2VVcmx9L21lZXRpbmdzL2V2ZW50Ly4uLmApLlxyXG4gIC8vXHJcbiAgLy8gVGhlIHJlY2lwcm9jYWwgY29udHJvbGxlciBzaXRzIG9uIHRoZSBtZWV0aW5ncyBzZXJ2aWNlIHVuZGVyIGBhZG1pbi9yZWNpcHJvY2FsLWNyZWRpdGAuXHJcbiAgLy8gYXBpQmFzZVVybCBhbHJlYWR5IGNhcnJpZXMgdGhlIHZlcnNpb24gc2VnbWVudCAoYC4uLi92MWApLCBhbmQgdGhlIGdhdGV3YXkgcm91dGVzXHJcbiAgLy8gdGhlIG1lZXRpbmdzIHNlcnZpY2UgdW5kZXIgYCR7YXBpQmFzZVVybH0vbWVldGluZ3NgLCBzbyB0aGUgdmVyc2lvbiBpcyBOT1QgcmVwZWF0ZWRcclxuICAvLyAobm8gc2Vjb25kIGAvdjFgIG9yIGAvYXBpL3YxYCkuIFRoZSBmdWxsIHBhdGggaXM6XHJcbiAgLy8gICBgJHthcGlCYXNlVXJsfS9tZWV0aW5ncy9hZG1pbi9yZWNpcHJvY2FsLWNyZWRpdC8uLi5gXHJcbiAgLy8gICA9IGh0dHBzOi8vc2FhcHBzYXBpZGV2LmllZWUub3JnL3YxL21lZXRpbmdzL2FkbWluL3JlY2lwcm9jYWwtY3JlZGl0Ly4uLlxyXG4gIC8vIEV2ZXJ5IG1ldGhvZCBidWlsZHMgVVJMcyBmcm9tIFJFQ0lQUk9DQUxfQkFTRV9QQVRIIGJlbG93LlxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogUGF0aCBwcmVmaXggKHJlbGF0aXZlIHRvIGFwaUJhc2VVcmwpIGZvciB0aGUgcmVjaXByb2NhbC1jcmVkaXQgZW5kcG9pbnRzLiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgUkVDSVBST0NBTF9CQVNFX1BBVEggPSAnbWVldGluZ3MvYWRtaW4vcmVjaXByb2NhbC1jcmVkaXQnO1xyXG5cclxuICAvKipcclxuICAgKiBCdWlsZCBhIHJlY2lwcm9jYWwtY3JlZGl0IGVuZHBvaW50IFVSTCBmcm9tIGFwaUJhc2VVcmwgKyB0aGUgYmFzZSBwYXRoLFxyXG4gICAqIGd1YXJkaW5nIGFnYWluc3QgYWNjaWRlbnRhbCBkb3VibGUgc2xhc2hlcyBpZiBhcGlCYXNlVXJsIGhhcyBhIHRyYWlsaW5nIHNsYXNoLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3VmZml4XSBleHRyYSBwYXRoL3F1ZXJ5IGFwcGVuZGVkIGFmdGVyIHRoZSBiYXNlIHBhdGguXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRSZWNpcHJvY2FsVXJsKHN1ZmZpeCA9ICcnKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaUJhc2VVcmw/LnJlcGxhY2UoL1xcLyskLywgJycpID8/ICcnO1xyXG4gICAgcmV0dXJuIGAke2Jhc2V9LyR7dGhpcy5SRUNJUFJPQ0FMX0JBU0VfUEFUSH0ke3N1ZmZpeH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2ggdGhlIGZvcmVpZ24gZ3JvdXBzIGF2YWlsYWJsZSBmb3IgcmVjaXByb2NhbCBjcmVkaXQgZm9yIGEgaG9tZSBncm91cC5cclxuICAgKiBHRVQge2FwaUJhc2VVcmx9L21lZXRpbmdzL2FkbWluL3JlY2lwcm9jYWwtY3JlZGl0L3tob21lR3JvdXBJZH0vYXZhaWxhYmxlLWdyb3Vwc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBob21lR3JvdXBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UmVjaXByb2NhbENyZWRpdFJlc3BvbnNlPEF2YWlsYWJsZUZvcmVpZ25Hcm91cFtdPj59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRBdmFpbGFibGVSZWNpcHJvY2FsR3JvdXBzKFxyXG4gICAgaG9tZUdyb3VwSWQ6IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8UmVjaXByb2NhbENyZWRpdFJlc3BvbnNlPEF2YWlsYWJsZUZvcmVpZ25Hcm91cFtdPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEodGhpcy5idWlsZFJlY2lwcm9jYWxVcmwoYC8ke2hvbWVHcm91cElkfS9hdmFpbGFibGUtZ3JvdXBzYCkpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHJlc3BvbnNlKSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgZXhpc3RpbmcgcmVjaXByb2NhbC1jcmVkaXQgY29uZmlnIHJvd3MgZm9yIGEgaG9tZSBncm91cCAoZWRpdCBwcmVmaWxsKS5cclxuICAgKiBHRVQge2FwaUJhc2VVcmx9L21lZXRpbmdzL2FkbWluL3JlY2lwcm9jYWwtY3JlZGl0L3tob21lR3JvdXBJZH1bP2V2ZW50SWQ9Li4uXVxyXG4gICAqIFJldHVybnMgb25lIHJvdyBwZXIgZm9yZWlnbiBncm91cDsgYW4gZW1wdHkgYXJyYXkgbWVhbnMgcmVjaXByb2NhbCBjcmVkaXQgaXMgb2ZmLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBob21lR3JvdXBJZFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRJZF0gb3B0aW9uYWwg4oCUIGZpbHRlcnMgdG8gYW4gZXZlbnQtc2NvcGVkIGNvbmZpZy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFJlY2lwcm9jYWxDcmVkaXRSZXNwb25zZTxSZWNpcHJvY2FsQ3JlZGl0Q29uZmlnUm93W10+Pn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJlY2lwcm9jYWxDb25maWcoXHJcbiAgICBob21lR3JvdXBJZDogc3RyaW5nLFxyXG4gICAgZXZlbnRJZD86IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8UmVjaXByb2NhbENyZWRpdFJlc3BvbnNlPFJlY2lwcm9jYWxDcmVkaXRDb25maWdSb3dbXT4+IHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gZXZlbnRJZCA/IGA/ZXZlbnRJZD0ke2VuY29kZVVSSUNvbXBvbmVudChldmVudElkKX1gIDogJyc7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YSh0aGlzLmJ1aWxkUmVjaXByb2NhbFVybChgLyR7aG9tZUdyb3VwSWR9JHtxdWVyeX1gKSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSBhIHJlY2lwcm9jYWwtY3JlZGl0IGNvbmZpZyAoY3JlYXRlcy9yZWFjdGl2YXRlcyBvbmUgcm93IHBlciBmb3JlaWduIGdyb3VwKS5cclxuICAgKiBQT1NUIHthcGlCYXNlVXJsfS9tZWV0aW5ncy9hZG1pbi9yZWNpcHJvY2FsLWNyZWRpdFxyXG4gICAqIEBwYXJhbSB7U2F2ZVJlY2lwcm9jYWxDcmVkaXRQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxSZWNpcHJvY2FsQ3JlZGl0UmVzcG9uc2U8UmVjaXByb2NhbENyZWRpdENvbmZpZ1Jvd1tdPj59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBzYXZlUmVjaXByb2NhbENyZWRpdChcclxuICAgIHBheWxvYWQ6IFNhdmVSZWNpcHJvY2FsQ3JlZGl0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8UmVjaXByb2NhbENyZWRpdFJlc3BvbnNlPFJlY2lwcm9jYWxDcmVkaXRDb25maWdSb3dbXT4+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YSh0aGlzLmJ1aWxkUmVjaXByb2NhbFVybCgpLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgKHNvZnQgZGVsZXRlKSBhIHNpbmdsZSByZWNpcHJvY2FsLWNyZWRpdCBjb25maWcgcm93IGJ5IGl0cyBjb25maWdJZC5cclxuICAgKiBQT1NUIHthcGlCYXNlVXJsfS9tZWV0aW5ncy9hZG1pbi9yZWNpcHJvY2FsLWNyZWRpdC97Y29uZmlnSWR9L3JlbW92ZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UmVjaXByb2NhbENyZWRpdFJlc3BvbnNlPG51bGw+Pn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHJlbW92ZVJlY2lwcm9jYWxDb25maWcoXHJcbiAgICBjb25maWdJZDogc3RyaW5nXHJcbiAgKTogT2JzZXJ2YWJsZTxSZWNpcHJvY2FsQ3JlZGl0UmVzcG9uc2U8bnVsbD4+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YSh0aGlzLmJ1aWxkUmVjaXByb2NhbFVybChgLyR7Y29uZmlnSWR9L3JlbW92ZWApLCB7fSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
990
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9zZXJ2aWNlcy9ncm91cHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVdwRSxPQUFPLEVBQThCLFdBQVcsRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RixPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDO0FBa0J4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQW1CeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFDTCxVQUFVLEVBRVYsU0FBUyxHQUVWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFNOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUszRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7O0FBVXJEOzs7OztHQUtHO0FBQ0gsTUFBTSxtQ0FBbUMsR0FBRyx5QkFBeUIsQ0FBQztBQUV0RTs7Ozs7R0FLRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsaUJBQWlCLENBQUM7QUFFdEQ7OztHQUdHO0FBSUgsTUFBTSxPQUFPLGFBQWE7SUFtQ3hCLDZEQUE2RDtJQUM3RDtJQUNFLDBDQUEwQztJQUNsQyxXQUF3QjtJQUNoQywwQ0FBMEM7SUFDbEMsc0JBQThDO0lBQ3RELDBDQUEwQztJQUNsQyx1QkFBbUQ7SUFDM0QsMENB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Q0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDOytHQXJwQ1UsYUFBYTttSEFBYixhQUFhLGNBRlosTUFBTTs7NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgY2F0Y2hFcnJvciwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgQ3JlYXRlR3JvdXBQYXlsb2FkLFxyXG4gIENyZWF0ZUdyb3VwUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2NyZWF0ZS1ncm91cC5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgQnVzaW5lc3NSdWxlLFxyXG4gIEdyb3VwVHlwZUNvbmZpZ3VyYXRpb24sXHJcbiAgR3JvdXBUeXBlQ29uZmlnVmFsdWUsXHJcbiAgR3JvdXBUeXBlUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2dyb3VwLXR5cGVzLm1vZGVsJztcclxuaW1wb3J0IHsgQWxlcnRzU2VydmljZSwgSHR0cFNlcnZpY2UsIFN0b3JhZ2VLZXlzLCBTdG9yYWdlU2VydmljZSB9IGZyb20gJ0BpZWVlc2EtbnBtL3V0aWxpdHknO1xyXG5pbXBvcnQgeyBHZXRHcm91cFJlc3BvbnNlLCBHZXRHcm91cHNQYXlsb2FkIH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXctZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQgKiBhcyBzY3JlZW5UZXh0cyBmcm9tICcuLi9hc3NldHMvY29uc3RhbnRzLmpzb24nO1xyXG5pbXBvcnQgeyBEZWxldGVHcm91cFBheWxvYWQgfSBmcm9tICcuLi9tb2RlbHMvZGVsZXRlLWdyb3VwLm1vZGVsJztcclxuaW1wb3J0IHsgR3JvdXBJbmZvIH0gZnJvbSAnLi4vbW9kZWxzL2dyb3VwLWluZm8ubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIFNlYXJjaFVzZXJzUGF5bG9hZCxcclxuICBGaWx0ZXJVc2Vyc1BheWxvYWQsXHJcbiAgR2V0R3JvdXBVc2Vyc1Jlc3BvbnNlLFxyXG4gIFVzZXIsXHJcbiAgTG9nZ2VkSW5Vc2VySW5mbyxcclxufSBmcm9tICcuLi9tb2RlbHMvdXNlci5tb2RlbCc7XHJcbmltcG9ydCB7IFJvbGUgfSBmcm9tICcuLi9tb2RlbHMvcm9sZS5tb2RlbCc7XHJcbmltcG9ydCB7IEVkaXRHcm91cFBheWxvYWQgfSBmcm9tICcuLi9tb2RlbHMvZWRpdC1ncm91cC5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgQXZhaWxhYmxlRm9yZWlnbkdyb3VwLFxyXG4gIFJlY2lwcm9jYWxDcmVkaXRDb25maWdSb3csXHJcbiAgUmVjaXByb2NhbENyZWRpdFJlc3BvbnNlLFxyXG4gIFNhdmVSZWNpcHJvY2FsQ3JlZGl0UGF5bG9hZCxcclxufSBmcm9tICcuLi9tb2RlbHMvcmVjaXByb2NhbC1jcmVkaXQubW9kZWwnO1xyXG5pbXBvcnQgeyBHcm91cEZ1bmN0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9ncm91cC1mdW5jdGlvbi10eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgUm9zdGVyRnVuY3Rpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL3Jvc3Rlci1mdW5jdGlvbi10eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgR3JvdXBVc2VySW5mbyB9IGZyb20gJy4uL21vZGVscy9ncm91cC11c2VyLWluZm8ubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEFkZE9yRWRpdFVzZXJQYXlsb2FkLFxyXG4gIEFkZE9yRWRpdEdyb3VwVXNlckRldGFpbHNSZXNwb25zZSxcclxuICBBZGRPckVkaXRVc2VySW5kaXZpZHVhbFJvc3RlclBheWxvYWQsXHJcbiAgUmVwcmVzZW50aW5nT3JnYW5pemF0aW9uLFxyXG59IGZyb20gJy4uL21vZGVscy9hZGQtb3ItZWRpdC11c2VyLWdyb3VwLm1vZGVsJztcclxuaW1wb3J0IHsgRGVsZXRlVXNlckdyb3VwUGF5bG9hZCB9IGZyb20gJy4uL21vZGVscy9kZWxldGUtdXNlci1ncm91cC5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgR2V0VXNlckRldGFpbHNQYXlsb2FkLFxyXG4gIFNlYXJjaFVzZXJCeUVtYWlsUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2FkZC1uZXctdXNlci5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgT3JnYW5pemF0aW9uUmVxdWVzdFBheWxvYWQsXHJcbiAgT3JnYW5pemF0aW9uUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL29yZ2FuaXphdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IENsYXNzaWZpY2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvY2xhc3NpZmljYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBHcm91cFJvc3RlclR5cGUgfSBmcm9tICcuLi9tb2RlbHMvcm9zdGVyLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1TdGF0dXMsXHJcbiAgQ2hlY2tib3hPcHRpb24sXHJcbiAgQWxlcnRUeXBlLFxyXG4gIFNlbGVjdE9wdGlvbixcclxufSBmcm9tICdAaWVlZXNhLW5wbS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBDT1VOVFJZX0RJQUxfQ09ERVMgfSBmcm9tICdAaWVlZXNhLW5wbS9wcmVzZW50YXRpb24nO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbFN0YXR1cyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICBHcm91cFBlcm1pc3Npb24sXHJcbiAgVXNlclBlcm1pc3Npb24sXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2dyb3VwLXBlcm1pc3Npb25zLm1vZGVsJztcclxuaW1wb3J0IHsgUGVybWlzc2lvblR5cGUgfSBmcm9tICcuLi9tb2RlbHMvcGVybWlzc2lvbi10eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgRmVhdHVyZUZsYWcgfSBmcm9tICcuLi9tb2RlbHMvZmVhdHVyZS1mbGFnLm1vZGVsJztcclxuaW1wb3J0IHsgVGVuYW50RmVhdHVyZSB9IGZyb20gJy4uL21vZGVscy90ZW5hbnQtZmVhdHVyZS5tb2RlbCc7XHJcbmltcG9ydCB7IFVzZXJQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICcuL3VzZXItcGVybWlzc2lvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyb3VwUGVybWlzc2lvbnNNYXBTZXJ2aWNlIH0gZnJvbSAnLi9ncm91cC1wZXJtaXNzaW9ucy1tYXAtc2VydmljZSc7XHJcbmltcG9ydCB7IFBhcmVudEdyb3Vwc0luZm8gfSBmcm9tICcuLi9tb2RlbHMvcGFyZW50LWdyb3Vwcy1pbmZvLm1vZGVsJztcclxuaW1wb3J0IHsgUm9sZVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvcm9sZS10eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgQ2FjaGVkUmVxdWlyZWRQcm9maWxlRmllbGRzIH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVpcmVkLXByb2ZpbGUtZmllbGRzLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBHcm91cEludGVyZXN0UmVzcG9uc2VWaWV3LFxyXG4gIEludGVyZXN0ZWRSb3N0ZXJzUmVxdWVzdFBheWxvYWQsXHJcbiAgSW50ZXJlc3RlZFJvc3RlcnNSZXNwb25zZSxcclxuICBJbnRlcmVzdEZvcm1SZXNwb25zZSxcclxuICBVcGRhdGVNZW1iZXJMZXZlbFBheWxvYWQsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2ludGVyZXN0LXJlc3BvbnNlLm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBMb2NhbCBzdG9yYWdlIGtleSB1bmRlciB3aGljaCB0aGUgaG9zdGluZyBhcHBsaWNhdGlvbiBjYWNoZXMgdGhlIHRlbmFudCdzXHJcbiAqIHJlcXVpcmVkIHByb2ZpbGUgZmllbGRzIGF0IGxvZ2luIChzaGFwZTogYHsgYXBwSWQsIHJlcXVpcmVkRmllbGRzIH1gKS4gVGhlXHJcbiAqIGFkZC11c2VyIC8gZWRpdC11c2VyIGZvcm1zIHJlYWQgdGhpcyBjYWNoZSBhcyB0aGUgc291cmNlIG9mIHRydXRoIHNvIHRoZXlcclxuICogYWx3YXlzIHJlZmxlY3QgdGhlIHRlbmFudCBjb25maWd1cmF0aW9uIHJlZ2FyZGxlc3Mgb2YgQElucHV0L3Jlc29sdmVyIHRpbWluZy5cclxuICovXHJcbmNvbnN0IFJFUVVJUkVEX1BST0ZJTEVfRklFTERTX1NUT1JBR0VfS0VZID0gJ1JFUVVJUkVEX1BST0ZJTEVfRklFTERTJztcclxuXHJcbi8qKlxyXG4gKiBMb2NhbCBzdG9yYWdlIGtleSB1bmRlciB3aGljaCB0aGUgaG9zdGluZyBhcHBsaWNhdGlvbiBjYWNoZXMgdGhlIHRlbmFudCdzXHJcbiAqIGZlYXR1cmUgZmxhZ3MgYXQgbG9naW4gKHNoYXBlOiBhIGJhcmUgYFRlbmFudEZlYXR1cmVbXWApLiBUaGUgaW50ZXJlc3QtZm9ybVxyXG4gKiBnYXRlIHJlYWRzIHRoaXMgY2FjaGUgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBzbyBpdCByZWZsZWN0cyB0aGUgdGVuYW50XHJcbiAqIGNvbmZpZ3VyYXRpb24gcmVnYXJkbGVzcyBvZiBASW5wdXQvcmVzb2x2ZXIgdGltaW5nLlxyXG4gKi9cclxuY29uc3QgVEVOQU5UX0ZFQVRVUkVTX1NUT1JBR0VfS0VZID0gJ1RFTkFOVF9GRUFUVVJFUyc7XHJcblxyXG4vKipcclxuICogR3JvdXBzIHNlcnZpY2UgaXMgYW4gYWJzdHJhY3QgbGF5ZXIgYW5kIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBncm91cHMgUkVTVCBBUEkgY2FsbHMuXHJcbiAqIEBjbGFzcyBHcm91cHNTZXJ2aWNlXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JvdXBzU2VydmljZSB7XHJcbiAgZ3JvdXBzVGV4dCA9IHNjcmVlblRleHRzPy5lcnJvcnM7XHJcbiAgYXBpQmFzZVVybCE6IHN0cmluZztcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHVzZXJQZXJtaXNzaW9uOiBhbnk7XHJcbiAgLyoqXHJcbiAgICogVGVuYW50LWxldmVsIHJlcXVpcmVkIHByb2ZpbGUgZmllbGRzIChlLmcuIFsncGhvbmUnLCdhZGRyZXNzJywnZW1wbG95ZXInXSlcclxuICAgKiBzdXBwbGllZCBieSB0aGUgaG9zdCBhcHAgZnJvbSBpdHMgY2FjaGVkIHRlbmFudCBjb25maWd1cmF0aW9uLiBDb25zdW1lZCBieVxyXG4gICAqIHRoZSByb3N0ZXIgaW1wb3J0IHRvIGFwcGVuZCB0ZW5hbnQtbWFuZGF0ZWQgY29sdW1ucyB0byB0aGUgcmVxdWlyZWQtY29sdW1uXHJcbiAgICogbGlzdCBhbmQgdGhlIHNhbXBsZSBmaWxlLiBFbXB0eSB3aGVuIHRoZSB0ZW5hbnQgaGFzIG5vbmUgY29uZmlndXJlZC5cclxuICAgKi9cclxuICByZXF1aXJlZFByb2ZpbGVGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcbiAgLyoqXHJcbiAgICogVGVuYW50IGZlYXR1cmUgZmxhZ3Mgc3VwcGxpZWQgYnkgdGhlIGhvc3QgYXBwLiBVc2VkIGJ5XHJcbiAgICoge0BsaW5rIGlzSW50ZXJlc3RGb3JtRmVhdHVyZUVuYWJsZWR9IHRvIGdhdGUgaW50ZXJlc3QtZm9ybSBVSS4gRW1wdHkgd2hlblxyXG4gICAqIHRoZSBob3N0IGhhcyBub3QgcHJvdmlkZWQgYW55IGZlYXR1cmVzIChmYWlsLWNsb3NlZCkuXHJcbiAgICovXHJcbiAgdGVuYW50RmVhdHVyZXM6IFRlbmFudEZlYXR1cmVbXSA9IFtdO1xyXG4gIHNlbGVjdGVkR3JvdXBJbmZvITogR3JvdXBJbmZvIHwgdW5kZWZpbmVkO1xyXG4gIGdyb3VwRnVuY3Rpb25UeXBlITogR3JvdXBGdW5jdGlvblR5cGU7XHJcbiAgc2VsZWN0ZWRHcm91cFBhcmVudEluZm8hOiBHcm91cEluZm8gfCB1bmRlZmluZWQ7XHJcbiAgb3Blbk1vZGFsTm90aWZpZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEdyb3VwRnVuY3Rpb25UeXBlPihcclxuICAgIEdyb3VwRnVuY3Rpb25UeXBlLlZJRVdfUk9TVEVSXHJcbiAgKTtcclxuICBncm91cFR5cGVSb2xlcyE6IENoZWNrYm94T3B0aW9uW107XHJcbiAgc2VsZWN0ZWRVc2VySW5mbyE6IEdyb3VwVXNlckluZm87XHJcbiAgY2FuU2hvd01lc3NhZ2UgPSBmYWxzZTtcclxuICByb3N0ZXJGdW5jdGlvblR5cGUhOiBSb3N0ZXJGdW5jdGlvblR5cGU7XHJcbiAgdXNlckdyb3VwUGVybWlzc2lvbnMhOiBHcm91cFBlcm1pc3Npb25bXTtcclxuICBncm91cFR5cGVzITogR3JvdXBUeXBlQ29uZmlndXJhdGlvbltdO1xyXG4gIGlzUGFyZW50R3JvdXBDaGFuZ2VkID0gZmFsc2U7XHJcbiAgdXNlckluZm8hOiBMb2dnZWRJblVzZXJJbmZvO1xyXG4gIG1lbWJlclR5cGVzITogUm9sZVtdO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcmVwcmVzZW50aW5nT3JnYW5pemF0aW9uczogUmVwcmVzZW50aW5nT3JnYW5pemF0aW9uW10gPSBbXTtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktZnVuY3Rpb24sIG5vLXVudXNlZC12YXJzXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgaHR0cFNlcnZpY2U6IEh0dHBTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIHVzZXJQZXJtaXNzaW9uc1NlcnZpY2U6IFVzZXJQZXJtaXNzaW9uc1NlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgZ3JvdXBQZXJtaXNzaW9uc1NlcnZpY2U6IEdyb3VwUGVybWlzc2lvbnNNYXBTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwdWJsaWMgYWxlcnRTZXJ2aWNlOiBBbGVydHNTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktZnVuY3Rpb25cclxuICApIHt9XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBzZXRBcHBDb25maWcoYXBpQmFzZVVybDogc3RyaW5nLCB1c2VyUGVybWlzc2lvbjogYW55KSB7XHJcbiAgICB0aGlzLmFwaUJhc2VVcmwgPSBhcGlCYXNlVXJsO1xyXG4gICAgdGhpcy51c2VyUGVybWlzc2lvbiA9IHVzZXJQZXJtaXNzaW9uO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTdG9yZXMgdGhlIHRlbmFudC1sZXZlbCByZXF1aXJlZCBwcm9maWxlIGZpZWxkcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHAuXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcmVxdWlyZWRQcm9maWxlRmllbGRzIC0gRmllbGQga2V5cyAoZS5nLiAncGhvbmUnKS5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFJlcXVpcmVkUHJvZmlsZUZpZWxkcyhyZXF1aXJlZFByb2ZpbGVGaWVsZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlcXVpcmVkUHJvZmlsZUZpZWxkcyA9IHJlcXVpcmVkUHJvZmlsZUZpZWxkcyA/PyBbXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIHRoZSB0ZW5hbnQgZmVhdHVyZSBmbGFncyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHAuIENvbnN1bWVkIGJ5XHJcbiAgICoge0BsaW5rIGlzSW50ZXJlc3RGb3JtRmVhdHVyZUVuYWJsZWR9IHRvIGdhdGUgaW50ZXJlc3QtZm9ybSBVSS5cclxuICAgKiBAcGFyYW0ge1RlbmFudEZlYXR1cmVbXX0gdGVuYW50RmVhdHVyZXMgLSBUZW5hbnQgZmVhdHVyZSBmbGFncy5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFRlbmFudEZlYXR1cmVzKHRlbmFudEZlYXR1cmVzOiBUZW5hbnRGZWF0dXJlW10pOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50RmVhdHVyZXMgPSB0ZW5hbnRGZWF0dXJlcyA/PyBbXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGVuYW50IGZlYXR1cmUgZmxhZ3MgKG5ldmVyIG51bGwpLlxyXG4gICAqXHJcbiAgICogUmVhZHMgdGhlIGxvY2FsIHN0b3JhZ2UgY2FjaGUgdGhlIGhvc3RpbmcgYXBwbGljYXRpb24gd3JpdGVzIGF0IGxvZ2luIChrZXlcclxuICAgKiBgVEVOQU5UX0ZFQVRVUkVTYCwgYSBiYXJlIGBUZW5hbnRGZWF0dXJlW11gKSBhcyB0aGUgc291cmNlIG9mIHRydXRoLCBzbyB0aGVcclxuICAgKiBpbnRlcmVzdC1mb3JtIGdhdGUgcmVmbGVjdHMgdGhlIHRlbmFudCBjb25maWd1cmF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlXHJcbiAgICogQElucHV0L3Jlc29sdmVyIHRpbWluZy5cclxuICAgKlxyXG4gICAqIFRoZSBjYWNoZSBpcyBvbmx5IHRydXN0ZWQgd2hlbiBpdCBpcyB3ZWxsLWZvcm1lZCBmb3IgdGhlIGFjdGl2ZVxyXG4gICAqIGFwcGxpY2F0aW9uOiBpdCBtdXN0IGJlIGFuIGFycmF5IGFuZCBpdHMgZW50cmllcyBtdXN0IGJlbG9uZyB0byB0aGUgY3VycmVudFxyXG4gICAqIHVzZXIncyBgYXBwSWRgLiBUaGUgYFRFTkFOVF9GRUFUVVJFU2Aga2V5IGlzIG9yaWdpbi13aWRlLCBzbyBhIGNhY2hlIHdyaXR0ZW5cclxuICAgKiBieSBhbm90aGVyIGFwcGxpY2F0aW9uIG9uIHRoZSBzYW1lIG9yaWdpbiBjb3VsZCBvdGhlcndpc2UgZmxpcCB0aGVcclxuICAgKiBpbnRlcmVzdC1mb3JtIGdhdGUgd2l0aCBhIGRpZmZlcmVudCB0ZW5hbnQncyBmbGFncy4gV2hlbiB0aGUgY2FjaGUgaXNcclxuICAgKiBtaXNzaW5nLCBtYWxmb3JtZWQsIG9yIHNjb3BlZCB0byBhbm90aGVyIGFwcCwgaXQgZmFsbHMgYmFjayB0byB0aGUgaW4tbWVtb3J5XHJcbiAgICogdmFsdWUgc2V0IHZpYSB7QGxpbmsgc2V0VGVuYW50RmVhdHVyZXN9ICh0aGUgaG9zdCBASW5wdXQpLCB0aGVuIHRvIGFuIGVtcHR5XHJcbiAgICogbGlzdC5cclxuICAgKiBAcmV0dXJuIHtUZW5hbnRGZWF0dXJlW119XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRUZW5hbnRGZWF0dXJlcygpOiBUZW5hbnRGZWF0dXJlW10ge1xyXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zdG9yYWdlU2VydmljZT8uZ2V0VmFsdWUoXHJcbiAgICAgIFRFTkFOVF9GRUFUVVJFU19TVE9SQUdFX0tFWVxyXG4gICAgKSBhcyBUZW5hbnRGZWF0dXJlW10gfCBudWxsO1xyXG4gICAgY29uc3QgYWN0aXZlQXBwSWQgPSB0aGlzLmdldFVzZXJJbmZvKCk/LmFwcElkO1xyXG4gICAgY29uc3QgaXNDYWNoZVVzYWJsZSA9XHJcbiAgICAgIEFycmF5LmlzQXJyYXkoY2FjaGVkKSAmJlxyXG4gICAgICAoIWFjdGl2ZUFwcElkIHx8XHJcbiAgICAgICAgY2FjaGVkLmV2ZXJ5KFxyXG4gICAgICAgICAgKGZlYXR1cmUpID0+ICFmZWF0dXJlPy5hcHBJZCB8fCBmZWF0dXJlLmFwcElkID09PSBhY3RpdmVBcHBJZFxyXG4gICAgICAgICkpO1xyXG4gICAgaWYgKGlzQ2FjaGVVc2FibGUpIHJldHVybiBjYWNoZWQgYXMgVGVuYW50RmVhdHVyZVtdO1xyXG4gICAgcmV0dXJuIHRoaXMudGVuYW50RmVhdHVyZXMgPz8gW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRlbmFudC1sZXZlbCByZXF1aXJlZCBwcm9maWxlIGZpZWxkcyAobmV2ZXIgbnVsbCkuXHJcbiAgICpcclxuICAgKiBSZWFkcyB0aGUgbG9jYWwgc3RvcmFnZSBjYWNoZSB0aGUgaG9zdGluZyBhcHBsaWNhdGlvbiB3cml0ZXMgYXQgbG9naW4gKGtleVxyXG4gICAqIGBSRVFVSVJFRF9QUk9GSUxFX0ZJRUxEU2ApIGFzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgsIHNvIHRoZSBhZGQtdXNlciAvXHJcbiAgICogZWRpdC11c2VyIGZvcm1zIGFsd2F5cyByZWZsZWN0IHRoZSB0ZW5hbnQgY29uZmlndXJhdGlvbiByZWdhcmRsZXNzIG9mIHRoZVxyXG4gICAqIEBJbnB1dC9yZXNvbHZlciB0aW1pbmcuXHJcbiAgICpcclxuICAgKiBUaGUgY2FjaGUgaXMgb25seSB0cnVzdGVkIHdoZW4gaXQgaXMgd2VsbC1mb3JtZWQgZm9yIHRoZSBhY3RpdmVcclxuICAgKiBhcHBsaWNhdGlvbjogaXRzIGBhcHBJZGAgbXVzdCBtYXRjaCB0aGUgY3VycmVudCB1c2VyJ3MgYGFwcElkYCBhbmQgaXRzXHJcbiAgICogYHJlcXVpcmVkRmllbGRzYCBtdXN0IGJlIGFuIGFycmF5LiBUaGlzIGd1YXJkcyBhZ2FpbnN0IChhKSBhIHN0YWxlIGNhY2hlXHJcbiAgICogZnJvbSBhIHByZXZpb3VzbHkgb3BlbmVkIGFwcGxpY2F0aW9uIGFwcGx5aW5nIGFub3RoZXIgdGVuYW50J3MgZmllbGRzLCBhbmRcclxuICAgKiAoYikgYSBtYWxmb3JtZWQgY2FjaGUgY3Jhc2hpbmcgdGhlIGZvcm1zIHdoZW4gY2FsbGVycyBydW5cclxuICAgKiBgcmVxdWlyZWRGaWVsZHMuaW5jbHVkZXMoLi4uKWAgb24gYSBub24tYXJyYXkgdmFsdWUuIFdoZW4gdGhlIGNhY2hlIGlzXHJcbiAgICogbWlzc2luZywgZm9yIGFub3RoZXIgYXBwLCBvciBtYWxmb3JtZWQsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGluLW1lbW9yeVxyXG4gICAqIHZhbHVlIHNldCB2aWEge0BsaW5rIHNldFJlcXVpcmVkUHJvZmlsZUZpZWxkc30gKHRoZSBob3N0IEBJbnB1dCksIHRoZW4gdG9cclxuICAgKiBhbiBlbXB0eSBsaXN0LlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0UmVxdWlyZWRQcm9maWxlRmllbGRzKCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3RvcmFnZVNlcnZpY2U/LmdldFZhbHVlKFxyXG4gICAgICBSRVFVSVJFRF9QUk9GSUxFX0ZJRUxEU19TVE9SQUdFX0tFWVxyXG4gICAgKSBhcyBDYWNoZWRSZXF1aXJlZFByb2ZpbGVGaWVsZHMgfCBudWxsO1xyXG4gICAgY29uc3QgYWN0aXZlQXBwSWQgPSB0aGlzLmdldFVzZXJJbmZvKCk/LmFwcElkO1xyXG4gICAgY29uc3QgaXNDYWNoZVVzYWJsZSA9XHJcbiAgICAgICEhY2FjaGVkICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkoY2FjaGVkLnJlcXVpcmVkRmllbGRzKSAmJlxyXG4gICAgICAoIWFjdGl2ZUFwcElkIHx8IGNhY2hlZC5hcHBJZCA9PT0gYWN0aXZlQXBwSWQpO1xyXG4gICAgaWYgKGlzQ2FjaGVVc2FibGUpIHJldHVybiBjYWNoZWQucmVxdWlyZWRGaWVsZHM7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZFByb2ZpbGVGaWVsZHMgPz8gW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgYXBwbGljYXRpb24gZ3JvdXAgdHlwZXMgZnJvbSBBUEkgYW5kIHJldHVybnMgaXQgYXMgYW4gb2JzZXJ2YWJsZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdyb3VwVHlwZVJlc3BvbnNlPn0gLUl0IHJldHVybnMgZ3JvdXAgdHlwZXMgaWYgc3VjY2VzcyBlbHNlIGVycm9yLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBnZXRHcm91cFR5cGVzKCk6IE9ic2VydmFibGU8R3JvdXBUeXBlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL2NvbmZpZy9ncm91cFR5cGVDb25maWdJbmZvYClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXRMb2FkZWRHcm91cFR5cGVzKHJlc3BvbnNlPy5ib2R5KTtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGxvd2VkIHBhcmVudCBncm91cHMgZnJvbSBBUEkgYW5kIHJldHVybnMgaXQgYXMgYW4gb2JzZXJ2YWJsZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R3JvdXBUeXBlUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0QWxsb3dlZFBhcmVudEdyb3Vwcyhncm91cElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFBhcmVudEdyb3Vwc0luZm9bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvYWxsb3dlZFBhcmVudEdyb3Vwcy8ke2dyb3VwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlPy5ib2R5O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbGwgdGhlIGdyb3VwcyBiYXNlZCBvbiBwYXNzZWQgZ3JvdXAgSWQgYW5kIGdyb3VwIHR5cGUuXHJcbiAgICogQHBhcmFtIHtHZXRHcm91cHNQYXlsb2FkfSBnZXRHcm91cHNQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxHZXRHcm91cFJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwcyhnZXRHcm91cHNQYXlsb2FkOiBHZXRHcm91cHNQYXlsb2FkKTogT2JzZXJ2YWJsZTxHZXRHcm91cFJlc3BvbnNlPiB7XHJcbiAgICBsZXQgdXJsID0gJ3Jvb3RHcm91cHMnO1xyXG4gICAgaWYgKGdldEdyb3Vwc1BheWxvYWQuZ3JvdXBJZClcclxuICAgICAgdXJsID0gJ2ltbUNoaWxkR3JvdXBzQnlHcm91cElkLycgKyBnZXRHcm91cHNQYXlsb2FkLmdyb3VwSWQ7XHJcbiAgICBlbHNlIGlmIChnZXRHcm91cHNQYXlsb2FkLmdyb3VwVHlwZUlkKVxyXG4gICAgICB1cmwgPSAnZ3JvdXBzQnlHcm91cFR5cGUvJyArIGdldEdyb3Vwc1BheWxvYWQuZ3JvdXBUeXBlSWQ7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy8ke3VybH1gKS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnJvclJlcztcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgYSBncm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb25cclxuICAgKiBAcGFyYW0ge2dyb3VwSWR9IHN0cmluZyAtZ3JvdXBJZCBvZiB0aGUgZ3JvdXAgd2hpY2ggaXMgdG8gYmUgZGVsZXRlZFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxhbnk+fSAtT2JzZXJ2YWJsZSByZXByZXNlbnRpbmcgdGhlIGdyb3VwIGRlbGV0aW9uIHJlc3BvbnNlXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGRlbGV0ZUdyb3VwKGRlbGV0ZUdyb3VwUGF5bG9hZDogRGVsZXRlR3JvdXBQYXlsb2FkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL2RlbGV0ZWAsIGRlbGV0ZUdyb3VwUGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEZWxldGVzIGEgdXNlciBmcm9tIGdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvblxyXG4gICAqIEBwYXJhbSB7Z3JvdXBJZH0gc3RyaW5nIC1ncm91cElkIG9mIHRoZSBzZWxlY3RlZCBncm91cCBmcm9tIHdoZXJlIHNlbGVjdGVkIHVzZXIgdG8gYmUgZGVsZXRlZC5cclxuICAgKiBAcGFyYW0ge3VzZXJJZH0gQXJyYXkgLXVzZXIgaWRzIG9mIHNlbGVjdGVkIHVzZXJzIHdobyBhcmUgZGVsZXRlZCBmcm9tIHRoZSBzZWxlY3RlZCBncm91cFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxhbnk+fSAtT2JzZXJ2YWJsZSByZXByZXNlbnRpbmcgdGhlIGdyb3VwIGRlbGV0aW9uIHJlc3BvbnNlXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGRlbGV0ZVVzZXJzR3JvdXAoXHJcbiAgICBkZWxldGVVc2VyR3JvdXBQYXlsb2FkOiBEZWxldGVVc2VyR3JvdXBQYXlsb2FkXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvZGVsZXRlR3JvdXBVc2Vyc2AsXHJcbiAgICAgICAgZGVsZXRlVXNlckdyb3VwUGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3RzIGNyZWF0ZSBncm91cCBmb3JtIGRhdGEgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlIGZvciBjcmVhdGluZyBuZXcgZ3JvdXAuXHJcbiAgICogQHBhcmFtIHtDcmVhdGVHcm91cFBheWxvYWR9IGNyZWF0ZUdyb3VwUGF5bG9hZCAtY3JlYXRlIGdyb3VwIGZvcm0gZGF0YSB3aGljaCBpbmNsdWRlcyBncm91cCBuYW1lLCB0eXBlLCBzaG9ydCBuYW1lLCBzY29wZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENyZWF0ZUdyb3VwUmVzcG9uc2U+fSAtcmV0dXJucyBjcmVhdGUgZ3JvdXAgQVBJIHJlc3BvbnNlIChzdWNjZXNzIG9yIGVycm9yKSBhcyBhbiBvYnNlcnZhYmxlLlxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjcmVhdGVHcm91cChcclxuICAgIGNyZWF0ZUdyb3VwUGF5bG9hZDogQ3JlYXRlR3JvdXBQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVHcm91cFJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvY3JlYXRlYCwgY3JlYXRlR3JvdXBQYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGdyb3VwIGZvcm0gZGF0YSB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHBhcmFtIHtFZGl0R3JvdXBQYXlsb2FkfSBlZGl0R3JvdXBQYXlsb2FkIC1lZGl0IGdyb3VwIGZvcm0gZGF0YSB3aGljaCBpbmNsdWRlcyBncm91cCBuYW1lLCBzaG9ydCBuYW1lLCBzY29wZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEVkaXRHcm91cFBheWxvYWQ+fSAtcmV0dXJucyBlZGl0IGdyb3VwIEFQSSByZXNwb25zZSAoc3VjY2VzcyBvciBlcnJvcikgYXMgYW4gb2JzZXJ2YWJsZS5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGVkaXRHcm91cChcclxuICAgIGVkaXRHcm91cFBheWxvYWQ6IEVkaXRHcm91cFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPENyZWF0ZUdyb3VwUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL2VkaXRgLCBlZGl0R3JvdXBQYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHBhcnNlIHRoZSBlcnJvciBjb2RlcyBhbmQgcmV0dXJuIHRoZSByZXNwZWN0aXZlIGVycm9yIG1lc3NhZ2UgZm9yIGVhY2ggY29kZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBlcnJvckNvZGVzXHJcbiAgICogQHJldHVybiB7c3RyaW5nW119IGVycm9yTWVzc2FnZVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgcGFyc2VFcnJvck1lc3NhZ2UoZXJyb3JDb2Rlczogc3RyaW5nW10pIHtcclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZTogc3RyaW5nW10gPSBbXTtcclxuICAgIGVycm9yQ29kZXM/LmZvckVhY2goKGl0ZW06IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXkgPSBlcnJvckNvZGVzW2luZGV4XSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5ncm91cHNUZXh0O1xyXG4gICAgICBlcnJvck1lc3NhZ2UucHVzaChcclxuICAgICAgICB0aGlzLmdyb3Vwc1RleHRbZXJyb3JNZXNzYWdlS2V5XSA/PyB0aGlzLmdyb3Vwc1RleHQ/LmRlZmF1bHRcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGVycm9yTWVzc2FnZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgY3VzdG9tIEFQSSBlcnJvcnM6IG1hcHMgQkUgZXJyb3IgY29kZXMgdG8gbWVzc2FnZXMgYW5kIHNob3dzIGFuXHJcbiAgICogYWxlcnQuIE1pcnJvcnMgdGhlIGV2ZW50cy1hbmQtbWVldGluZ3MgZXJyb3IgaGFuZGxpbmcgc28gcmVjaXByb2NhbC1jcmVkaXRcclxuICAgKiBmYWlsdXJlcyAoZS5nLiBNVEctMDExIGR1cGxpY2F0ZSwgTVRHLTAxMiBwZXJtaXNzaW9uKSBzdXJmYWNlIGNvbnNpc3RlbnRseS5cclxuICAgKiBAcGFyYW0geyp9IGVycm9yIHRoZSBIdHRwRXJyb3JSZXNwb25zZSBmcm9tIGEgZmFpbGVkIGNhbGxcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG93QWxlcnQ9dHJ1ZV0gd2hldGhlciB0byBkaXNwbGF5IHRoZSBhbGVydFxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBoYW5kbGVFcnJvcnMoZXJyb3I6IGFueSwgc2hvd0FsZXJ0ID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZXJyb3JDb2RlcyA9IGVycm9yPy5lcnJvcj8uYm9keT8uZXJyb3JDb2RlcztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGVycm9yQ29kZXMpICYmICFlcnJvcj8uZXJyb3I/LnN0YXR1cykge1xyXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLnBhcnNlRXJyb3JNZXNzYWdlKGVycm9yQ29kZXMpO1xyXG4gICAgICBpZiAoc2hvd0FsZXJ0KSB7XHJcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2U/LnNob3dNZXNzYWdlKHtcclxuICAgICAgICAgIHN0YXR1czogJ2N1c3RvbScsXHJcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICBhbGVydFR5cGU6IEFsZXJ0VHlwZS5FUlJPUixcclxuICAgICAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgc2VsZWN0ZWQgZ3JvdXAgaW5mby5cclxuICAgKiBAcGFyYW0geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSBzZWxlY3RlZEdyb3VwSW5mbyAtc2VsZWN0ZWQgZ3JvdXAgaW5mby5cclxuICAgKiBAcGFyYW0geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSBbc2VsZWN0ZWRHcm91cFBhcmVudEluZm9dIC1zZWxlY3RlZCBwYXJlbnQgZ3JvdXAgaW5mby5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFNlbGVjdGVkR3JvdXBJbmZvKFxyXG4gICAgc2VsZWN0ZWRHcm91cEluZm86IEdyb3VwSW5mbyB8IHVuZGVmaW5lZCxcclxuICAgIHNlbGVjdGVkR3JvdXBQYXJlbnRJbmZvPzogR3JvdXBJbmZvIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBJbmZvID0gc2VsZWN0ZWRHcm91cEluZm87XHJcbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBQYXJlbnRJbmZvID0gc2VsZWN0ZWRHcm91cFBhcmVudEluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBncm91cCBpbmZvLlxyXG4gICAqIEByZXR1cm4geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSAtZ3JvdXAgaW5mby5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkR3JvdXBJbmZvKCk6IEdyb3VwSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEdyb3VwSW5mbztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGdyb3VwIHBhcmVudCBncm91cCBpbmZvLlxyXG4gICAqIEByZXR1cm4geyhHcm91cEluZm8gfCB1bmRlZmluZWQpfSAtZ3JvdXAgaW5mby5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkR3JvdXBQYXJlbnRJbmZvKCk6IEdyb3VwSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEdyb3VwUGFyZW50SW5mbztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgZ3JvdXAgZnVuY3Rpb24gdHlwZS5cclxuICAgKiBAcGFyYW0ge0dyb3VwRnVuY3Rpb25UeXBlfSBncm91cEZ1bmN0aW9uVHlwZSAtZ3JvdXAgZnVuY3Rpb24gdHlwZS5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldEdyb3VwRnVuY3Rpb25UeXBlKGdyb3VwRnVuY3Rpb25UeXBlOiBHcm91cEZ1bmN0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy5ncm91cEZ1bmN0aW9uVHlwZSA9IGdyb3VwRnVuY3Rpb25UeXBlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBncm91cCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqIEByZXR1cm4ge0dyb3VwRnVuY3Rpb25UeXBlfSAtZ3JvdXAgZnVuY3Rpb24gdHlwZS5cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwRnVuY3Rpb25UeXBlKCk6IEdyb3VwRnVuY3Rpb25UeXBlIHtcclxuICAgIHJldHVybiB0aGlzLmdyb3VwRnVuY3Rpb25UeXBlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgZ3JvdXAgdXNlcnMgZm9yIHRoZSBnaXZlbiBncm91cCBpZC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gIGdldEdyb3VwVXNlcnMoXHJcbiAgICBncm91cElkOiBzdHJpbmcsXHJcbiAgICBzb3J0Q29sdW1uOiBzdHJpbmcsXHJcbiAgICBzb3J0RGlyZWN0aW9uOiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRHcm91cFVzZXJzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKFxyXG4gICAgICAgIGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci8ke2dyb3VwSWR9P3NvcnRDb2x1bW49JHtzb3J0Q29sdW1ufSZhc2NlbmRpbmdPcmRlcj0ke3NvcnREaXJlY3Rpb259YFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdyb3VwIHVzZXJzIGJhc2VkIG9uIHRoZSBmaWx0ZXJlZCByb2xlcy5cclxuICAgKiBAcGFyYW0ge0ZpbHRlclVzZXJzUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwVXNlcnNCeVJvbGVzKFxyXG4gICAgcGF5bG9hZDogRmlsdGVyVXNlcnNQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRHcm91cFVzZXJzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvZ3JvdXBVc2Vyc0ZpbHRlcmAsIHBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdyb3VwIHVzZXJzIGJhc2VkIG9uIHNlYXJjaGVkIG5hbWUgb3IgZW1haWxcclxuICAgKiBAcGFyYW0ge1NlYXJjaFVzZXJzUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNlYXJjaEdyb3VwVXNlcnMoXHJcbiAgICBwYXlsb2FkOiBTZWFyY2hVc2Vyc1BheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPEdldEdyb3VwVXNlcnNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci9ncm91cFVzZXJzU2VhcmNoYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yUmVzKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvclJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgZ3JvdXAgcm9sZXMgYmFzZWQgb24gdGhlIGdyb3VwIHR5cGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGdyb3VwVHlwZUlkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDaGVja2JveE9wdGlvbltdPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgZ2V0R3JvdXBUeXBlUm9sZXMoZ3JvdXBUeXBlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hlY2tib3hPcHRpb25bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvY29uZmlnL3JvbGVzQnlHcm91cFR5cGUvJHtncm91cFR5cGVJZH1gXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm9sZXNPcHRpb246IENoZWNrYm94T3B0aW9uW10gPSBbXTtcclxuICAgICAgICAgIGNvbnN0IG1lbWJlclR5cGVzOiBSb2xlW10gPSBbXTtcclxuICAgICAgICAgIHJlc3BvbnNlPy5ib2R5Py5mb3JFYWNoKChyb2xlOiBSb2xlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyb2xlPy5yb2xlVHlwZU5hbWUgPT09IFJvbGVUeXBlLk1FTUJFUl9MRVZFTCkge1xyXG4gICAgICAgICAgICAgIG1lbWJlclR5cGVzLnB1c2gocm9sZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcm9sZXNPcHRpb24ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBpZDogcm9sZS5yb2xlSWQsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiByb2xlLnJvbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5zZXRHcm91cFR5cGVVc2VyUm9sZXMocm9sZXNPcHRpb24pO1xyXG4gICAgICAgICAgdGhpcy5zZXRNZW1iZXJUeXBlcyhtZW1iZXJUeXBlcyk7XHJcbiAgICAgICAgICByZXR1cm4gcm9sZXNPcHRpb247XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yUmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGNsYXNzaWZpY2F0aW9ucyBtYXN0ZXIgZGF0YSBmcm9tIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybnMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDbGFzc2lmaWNhdGlvblJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldENsYXNzaWZpY2F0aW9ucygpOiBPYnNlcnZhYmxlPENsYXNzaWZpY2F0aW9uUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci9jbGFzc2lmaWNhdGlvbmApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdHJ1ZSBpZiBsb2dnZWQgaW4gdXNlciBpcyBhZG1pbi5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgaXNBZG1pblVzZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFjY2VzcyhQZXJtaXNzaW9uVHlwZS5NQU5BR0VfU1lTVEVNX1VTRVJTKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHVzZXIgaG9sZHMgdGhlIG5lZ2F0aXZlIHBlcm1pc3Npb24gdGhhdCByZXN0cmljdHMgYWxsXHJcbiAgICogZ3JvdXAgYW5kIHJvc3RlciB3cml0ZSBhY3Rpb25zLCByZWdhcmRsZXNzIG9mIGFueSBvdGhlciBncmFudGVkIHBlcm1pc3Npb24uXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGlzR3JvdXBzQW5kUm9zdGVyc1Jlc3RyaWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFjY2VzcyhQZXJtaXNzaW9uVHlwZS5SRVNUUklDVF9HUk9VUFNfQU5EX1JPU1RFUlMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25jYXRlbmF0ZXMgdGhlIGdyb3VwIHVzZXJzIGFzc2lnbmVkIHJvbGVzIG5hbWUgc2VwYXJhdGVkIGJ5IGNvbW1hIGFzIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgZ3JvdXAgdXNlcnMgaW4gYW4gYXJyYXkuXHJcbiAgICogQHBhcmFtIHtHZXRHcm91cFVzZXJzUmVzcG9uc2V9IHJlc3BvbnNlXHJcbiAgICogQHJldHVybiB7VXNlcltdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgdHJhbnNmb3JtVXNlclJvbGVzTmFtZUFzU3RyaW5nKHJlc3BvbnNlOiBHZXRHcm91cFVzZXJzUmVzcG9uc2UpOiBVc2VyW10ge1xyXG4gICAgY29uc3QgdXNlcnM6IFVzZXJbXSA9IFtdO1xyXG4gICAgdGhpcy5yZXByZXNlbnRpbmdPcmdhbml6YXRpb25zID0gW107XHJcbiAgICByZXNwb25zZT8uYm9keT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBjbGFzc2lmaWNhdGlvbkRlc2MgPVxyXG4gICAgICAgIGl0ZW0uY2xhc3NpZmljYXRpb24/LmNsYXNzaWZpY2F0aW9uTmFtZSArXHJcbiAgICAgICAgJyAoJyArXHJcbiAgICAgICAgaXRlbS5jbGFzc2lmaWNhdGlvbj8uY2xhc3NpZmljYXRpb25EZXNjICtcclxuICAgICAgICAnKSc7XHJcbiAgICAgIGNvbnN0IHJvbGVzTGlzdCA9IGl0ZW0/LnJvbGVzTGlzdD8ucmVkdWNlKFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgKHJvbGVMaXN0OiBhbnksIHJvbGU6IFJvbGUpID0+IHtcclxuICAgICAgICAgIHJvbGVMaXN0W1xyXG4gICAgICAgICAgICByb2xlLnJvbGVUeXBlTmFtZSA9PT0gUm9sZVR5cGUuTUVNQkVSX0xFVkVMID8gJ21lbWJlclR5cGUnIDogJ3JvbGVzJ1xyXG4gICAgICAgICAgXS5wdXNoKHJvbGU/LnJvbGVOYW1lKTtcclxuICAgICAgICAgIHJldHVybiByb2xlTGlzdDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgbWVtYmVyVHlwZTogW10sIHJvbGVzOiBbXSB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVwcmVzZW50aW5nT3JnYW5pemF0aW9ucz8ucHVzaCh7XHJcbiAgICAgICAgdXNlcklkOiBpdGVtPy51c2VySWQsXHJcbiAgICAgICAgb3JnYW5pemF0aW9uczogaXRlbT8ub3JnYW5pemF0aW9ucyxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IG9yZ2FuaXphdGlvbnMgPSBpdGVtPy5vcmdhbml6YXRpb25zXHJcbiAgICAgICAgPyBpdGVtPy5vcmdhbml6YXRpb25zPy5tYXAoKG9yZykgPT4gb3JnPy5vcmdOYW1lKS5qb2luKCc7ICcpXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgICB1c2Vycy5wdXNoKHtcclxuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxyXG4gICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcclxuICAgICAgICBlbWFpbDogaXRlbS5lbWFpbCxcclxuICAgICAgICByb2xlOiByb2xlc0xpc3Q/LnJvbGVzPy5sZW5ndGggPyByb2xlc0xpc3Q/LnJvbGVzPy5qb2luKCcsICcpIDogbnVsbCxcclxuICAgICAgICBjbGFzc2lmaWNhdGlvbjogaXRlbS5jbGFzc2lmaWNhdGlvbj8uY2xhc3NpZmljYXRpb25JZFxyXG4gICAgICAgICAgPyBjbGFzc2lmaWNhdGlvbkRlc2NcclxuICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICBtZW1iZXJTdGF0dXM6IHJvbGVzTGlzdD8ubWVtYmVyVHlwZT8ubGVuZ3RoXHJcbiAgICAgICAgICA/IHJvbGVzTGlzdD8ubWVtYmVyVHlwZVswXVxyXG4gICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgIG9yZ2FuaXphdGlvbjogb3JnYW5pemF0aW9ucyxcclxuICAgICAgICBlbXBsb3llcjogaXRlbS5lbXBsb3llcj8ub3JnTmFtZSA/PyBudWxsLFxyXG4gICAgICAgIHBob25lQ291bnRyeUNvZGU6IGl0ZW0ucGhvbmVDb3VudHJ5Q29kZSA/PyBudWxsLFxyXG4gICAgICAgIHBob25lTnVtYmVyOiBpdGVtLnBob25lTnVtYmVyID8/IG51bGwsXHJcbiAgICAgICAgYWRkcmVzczogaXRlbS5hZGRyZXNzID8/IG51bGwsXHJcbiAgICAgICAgY2FuRGVsZXRlOiAhKFxyXG4gICAgICAgICAgaXRlbT8udXNlcklkID09PSB0aGlzLnVzZXJJbmZvPy51c2VySWQgJiZcclxuICAgICAgICAgIHRoaXMuaXNBZG1pblVzZXIoKSAmJlxyXG4gICAgICAgICAgdGhpcy5nZXRCdXNpbmVzc1J1bGVPZlNlbGVjdGVkR3JvdXAoKT8uaXNBZG1pblxyXG4gICAgICAgICksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgZm9ybWF0dGVkIGdyb3VwIHR5cGVzLlxyXG4gICAqIEBwYXJhbSB7R3JvdXBUeXBlQ29uZmlndXJhdGlvbltdfSBncm91cFR5cGVSZXNwb25zZVxyXG4gICAqIEByZXR1cm4ge0dyb3VwVHlwZUNvbmZpZ1ZhbHVlfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Rm9ybWF0dGVkR3JvdXBUeXBlcyhcclxuICAgIGdyb3VwVHlwZVJlc3BvbnNlOiBHcm91cFR5cGVDb25maWd1cmF0aW9uW11cclxuICApOiBHcm91cFR5cGVDb25maWdWYWx1ZSB7XHJcbiAgICBjb25zdCBncm91cFR5cGVzOiBHcm91cFR5cGVDb25maWdWYWx1ZSA9IHt9O1xyXG4gICAgZ3JvdXBUeXBlUmVzcG9uc2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBncm91cFR5cGVzW2l0ZW0uY29uZmlnRmllbGRJZF0gPSBpdGVtLmNvbmZpZ0ZpZWxkVmFsdWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBncm91cFR5cGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBncm91cCB1c2VyIGRldGFpbHMgaWYgZW1haWwgaXMgZm91bmQsIGVsc2UgdGhyb3dzIGVycm9yLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8U2VhcmNoVXNlckJ5RW1haWxSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRVc2VyQnlFbWFpbChlbWFpbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZWFyY2hVc2VyQnlFbWFpbFJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy91c2Vycy91c2VyQnlFbWFpbC8ke2VtYWlsfWApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIHVzZXIgZGV0YWlscyBmb3IgdGhlIHNlbGVjdGVkIGdyb3VwXHJcbiAgICogQHBhcmFtIHtHZXRVc2VyRGV0YWlsc1BheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFkZE9yRWRpdEdyb3VwVXNlckRldGFpbHNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRHcm91cFVzZXJEZXRhaWxzKFxyXG4gICAgcGF5bG9hZDogR2V0VXNlckRldGFpbHNQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxBZGRPckVkaXRHcm91cFVzZXJEZXRhaWxzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvdXNlckRldGFpbHNgLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBvc3RzIGFkZCBuZXcgdXNlciBmb3JtIGRhdGEgdG8gdGhlIEFQSSBmb3IgdGhlIHNlbGVjdGVkIGdyb3VwIGFuZCByZXR1cm5zIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgcmVzcG9uc2UuXHJcbiAgICogQHBhcmFtIHsoQWRkT3JFZGl0VXNlclBheWxvYWRcclxuICAgKiAgICAgICB8IEFkZE9yRWRpdFVzZXJJbmRpdmlkdWFsUm9zdGVyUGF5bG9hZCl9IEFkZE9yRWRpdFVzZXJQYXlsb2FkXHJcbiAgICogQHBhcmFtIHtHcm91cFJvc3RlclR5cGV9IGdyb3VwUm9zdGVyVHlwZVxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QWRkT3JFZGl0R3JvdXBVc2VyRGV0YWlsc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGFkZE5ld0dyb3VwVXNlcihcclxuICAgIEFkZE9yRWRpdFVzZXJQYXlsb2FkOlxyXG4gICAgICB8IEFkZE9yRWRpdFVzZXJQYXlsb2FkXHJcbiAgICAgIHwgQWRkT3JFZGl0VXNlckluZGl2aWR1YWxSb3N0ZXJQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxBZGRPckVkaXRHcm91cFVzZXJEZXRhaWxzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb3N0ZXIvY3JlYXRlR3JvdXBVc2VyUm9sZWAsXHJcbiAgICAgICAgQWRkT3JFZGl0VXNlclBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBsb2FkZWQgZ3JvdXAgdHlwZSB1c2VyIHJvbGVzXHJcbiAgICogQHBhcmFtIHtDaGVja2JveE9wdGlvbltdfSB1c2VyUm9sZXNcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldEdyb3VwVHlwZVVzZXJSb2xlcyh1c2VyUm9sZXM6IENoZWNrYm94T3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBUeXBlUm9sZXMgPSB1c2VyUm9sZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBncm91cCB0eXBlIHVzZXIgcm9sZXMuXHJcbiAgICogQHJldHVybiB7Q2hlY2tib3hPcHRpb25bXX1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwVHlwZVVzZXJSb2xlcygpOiBDaGVja2JveE9wdGlvbltdIHtcclxuICAgIHRoaXMuZ3JvdXBUeXBlUm9sZXM/Lm1hcCgob3B0aW9uKSA9PiAob3B0aW9uLmNoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBUeXBlUm9sZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBzZWxlY3RlZCB1c2VyIGluZm8uXHJcbiAgICogQHBhcmFtIHtHcm91cFVzZXJJbmZvfSB1c2VySW5mb1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0U2VsZWN0ZWRVc2VySW5mbyh1c2VySW5mbzogR3JvdXBVc2VySW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXJJbmZvID0gdXNlckluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHNlbGVjdGVkIHVzZXIgaW5mby5cclxuICAgKiBAcmV0dXJuIHtHcm91cFVzZXJJbmZvfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0U2VsZWN0ZWRVc2VySW5mbygpOiBHcm91cFVzZXJJbmZvIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVXNlckluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGdyb3VwIHVzZXIgcm9sZXMgYW5kIG90aGVyIGRldGFpbHMgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7KEFkZE9yRWRpdFVzZXJQYXlsb2FkIHwgQWRkT3JFZGl0VXNlckluZGl2aWR1YWxSb3N0ZXJQYXlsb2FkKX0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QWRkT3JFZGl0R3JvdXBVc2VyRGV0YWlsc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGVkaXRHcm91cHNVc2VyUm9sZShcclxuICAgIHBheWxvYWQ6IEFkZE9yRWRpdFVzZXJQYXlsb2FkIHwgQWRkT3JFZGl0VXNlckluZGl2aWR1YWxSb3N0ZXJQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxBZGRPckVkaXRHcm91cFVzZXJEZXRhaWxzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci9lZGl0R3JvdXBVc2VyUm9sZWAsIHBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgcm9zdGVyIGZ1bmN0aW9uIHR5cGUuXHJcbiAgICogQHBhcmFtIHtSb3N0ZXJGdW5jdGlvblR5cGV9IHJvc3RlckZ1bmN0aW9uVHlwZVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0Um9zdGVyRnVuY3Rpb25UeXBlKHJvc3RlckZ1bmN0aW9uVHlwZTogUm9zdGVyRnVuY3Rpb25UeXBlKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvc3RlckZ1bmN0aW9uVHlwZSA9IHJvc3RlckZ1bmN0aW9uVHlwZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgcm9zdGVyIGZ1bmN0aW9uIHR5cGUuXHJcbiAgICogQHJldHVybiB7Um9zdGVyRnVuY3Rpb25UeXBlfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9zdGVyRnVuY3Rpb25UeXBlKCk6IFJvc3RlckZ1bmN0aW9uVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3N0ZXJGdW5jdGlvblR5cGU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdyb3VwcyBiYXNlZCBvbiB0aGUgc2VhcmNoIGJ5IGdyb3VwIG5hbWUgb3IgYWNyb255bS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoVGVybVxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0R3JvdXBVc2Vyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdyb3Vwc0J5TmFtZUFjcm9ueW0oXHJcbiAgICBzZWFyY2hUZXJtOiBzdHJpbmcsXHJcbiAgICBmaWx0ZXJlZEdyb3VwVHlwZT86IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8R2V0R3JvdXBSZXNwb25zZT4ge1xyXG4gICAgY29uc3Qgc2VhcmNoR3JvdXBzVXJsID0gYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvZ3JvdXBzQnlOYW1lQWNyb255bT9uYW1lPSR7c2VhcmNoVGVybX1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoXHJcbiAgICAgICAgZmlsdGVyZWRHcm91cFR5cGVcclxuICAgICAgICAgID8gc2VhcmNoR3JvdXBzVXJsICsgYCZncm91cFR5cGU9JHtmaWx0ZXJlZEdyb3VwVHlwZX1gXHJcbiAgICAgICAgICA6IHNlYXJjaEdyb3Vwc1VybFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdXNlciBncm91cCBwZXJtaXNzaW9uc1xyXG4gICAqIEBwYXJhbSB7R3JvdXBQZXJtaXNzaW9uW119IHVzZXJHcm91cFBlcm1pc3Npb25zXHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRVc2VyR3JvdXBQZXJtaXNzaW9ucyh1c2VyR3JvdXBQZXJtaXNzaW9uczogR3JvdXBQZXJtaXNzaW9uW10pIHtcclxuICAgIHRoaXMudXNlckdyb3VwUGVybWlzc2lvbnMgPSB1c2VyR3JvdXBQZXJtaXNzaW9ucztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdXNlciBncm91cCBwZXJtaXNzaW9uc1xyXG4gICAqIEByZXR1cm4ge0dyb3VwUGVybWlzc2lvbltdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0VXNlckdyb3VwUGVybWlzc2lvbnMoKTogR3JvdXBQZXJtaXNzaW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckdyb3VwUGVybWlzc2lvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGxvZ2dlZCBJbiB1c2VyIGluZm9ybWF0aW9uLlxyXG4gICAqIEBwYXJhbSB7TG9nZ2VkSW5Vc2VySW5mb30gdXNlckluZm9cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFVzZXJJbmZvKHVzZXJJbmZvOiBMb2dnZWRJblVzZXJJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXJJbmZvID0gdXNlckluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGxvZ2dlZCBpbiB1c2VyIGluZm9ybWF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSBVU0VSX0lORk8gYmxvYlxyXG4gICAqIHRoZSBob3N0IGFwcCBwZXJzaXN0cyB0byBsb2NhbCBzdG9yYWdlIHdoZW4gdGhlIHVzZXJJbmZvIGlucHV0IGhhc24ndFxyXG4gICAqIGJlZW4gc2V0IHlldCAoZS5nLiBob3N0IHdpcmluZyBub3QgY29tcGxldGVkIG9yIHRpbWluZyByYWNlIG9uIGluaXQpLlxyXG4gICAqIEByZXR1cm4ge0xvZ2dlZEluVXNlckluZm99XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRVc2VySW5mbygpOiBMb2dnZWRJblVzZXJJbmZvIHtcclxuICAgIGlmICh0aGlzLnVzZXJJbmZvPy5hcHBJZCkgcmV0dXJuIHRoaXMudXNlckluZm87XHJcbiAgICBjb25zdCBzdG9yZWRVc2VySW5mbyA9IHRoaXMuc3RvcmFnZVNlcnZpY2U/LmdldFZhbHVlKFN0b3JhZ2VLZXlzLlVTRVJfSU5GTyk7XHJcbiAgICByZXR1cm4gc3RvcmVkVXNlckluZm8/LmFwcElkID8gc3RvcmVkVXNlckluZm8gOiB0aGlzLnVzZXJJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgcGVybWlzc2lvbiBiYXNlZCBhY2Nlc3MgZm9yIHByb3ZpZGVkIGZlYXR1cmUuXHJcbiAgICogQ2hlY2tzIGZvciBncm91cCBsZXZlbCBwZXJtaXNzaW9ucywgYW5kIHByb3ZpZGVzIGFjY2VzcyBiYXNlZCBvbiBpbmRpdmlkdWFsIGdyb3VwIHBlcm1pc3Npb25zLlxyXG4gICAqIEZvciBnbG9iYWwgcGVybWlzc2lvbnMgcHJvdmlkZXMgYWNjZXNzIGFjcm9zcyB0aGUgaW5kaXZpZHVhbCBncm91cHMgb3IgU3lzdGVtIGdyb3Vwcy5cclxuICAgKiBAcGFyYW0ge1Blcm1pc3Npb25UeXBlfSBwZXJtaXNzaW9uVHlwZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICB2YWxpZGF0ZUFjY2VzcyhcclxuICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZSxcclxuICAgIHBlcm1pc3Npb25zPzogVXNlclBlcm1pc3Npb25bXSB8IG51bGxcclxuICApOiBib29sZWFuIHtcclxuICAgIGlmIChwZXJtaXNzaW9ucykge1xyXG4gICAgICBjb25zdCB1c2VyUGVybWlzc2lvbnNUb0dyb3VwID1cclxuICAgICAgICB0aGlzLnVzZXJQZXJtaXNzaW9uc1NlcnZpY2UuZmlsdGVyVXNlckdyb3VwUGVybWlzc2lvbnMoXHJcbiAgICAgICAgICBwZXJtaXNzaW9ucyxcclxuICAgICAgICAgIHRoaXMuZ3JvdXBQZXJtaXNzaW9uc1NlcnZpY2UuZ2V0R3JvdXBQZXJtaXNzaW9ucygpXHJcbiAgICAgICAgKTtcclxuICAgICAgcmV0dXJuIHRoaXMudXNlclBlcm1pc3Npb25zU2VydmljZS52YWxpZGF0ZUFjY2Vzc1Blcm1pc3Npb24oXHJcbiAgICAgICAgcGVybWlzc2lvblR5cGUsXHJcbiAgICAgICAgdXNlclBlcm1pc3Npb25zVG9Hcm91cFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudXNlclBlcm1pc3Npb25zU2VydmljZS52YWxpZGF0ZUFjY2Vzc1Blcm1pc3Npb24oXHJcbiAgICAgIHBlcm1pc3Npb25UeXBlLFxyXG4gICAgICB0aGlzLmdldFVzZXJHcm91cFBlcm1pc3Npb25zKClcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNQM00tMzgwOiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgaW50ZXJlc3QtZm9ybSBmZWF0dXJlXHJcbiAgICogKGBGRUFUVVJFX0lOVEVSRVNUX0ZPUk1gKSBpcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCB0ZW5hbnQuIEEgc2luZ2xlXHJcbiAgICogYm9vbGVhbiBjYXBhYmlsaXR5IGNoZWNrIHRoZSBVSSBnYXRlcyBvbi4gUmVhZHMgdGhlIHRlbmFudCBmZWF0dXJlcyBmcm9tXHJcbiAgICoge0BsaW5rIGdldFRlbmFudEZlYXR1cmVzfSAobG9jYWwgc3RvcmFnZSBjYWNoZSBmaXJzdCwgdGhlbiB0aGUgaG9zdFxyXG4gICAqIEBJbnB1dCkuIEZhaWwtY2xvc2VkOiBhbiBlbXB0eS91bmRlZmluZWQgZmVhdHVyZSBsaXN0LCBvciBhIGZlYXR1cmUgbWFya2VkXHJcbiAgICogZGVsZXRlZCwgeWllbGRzIGZhbHNlLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBpc0ludGVyZXN0Rm9ybUZlYXR1cmVFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGVuYW50RmVhdHVyZXMoKS5zb21lKFxyXG4gICAgICAoZmVhdHVyZSkgPT5cclxuICAgICAgICBmZWF0dXJlPy5mZWF0dXJlSWQgPT09IEZlYXR1cmVGbGFnLklOVEVSRVNUX0ZPUk0gJiYgIWZlYXR1cmU/LmlzRGVsZXRlZFxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3RvcmUgdGhlIGxvYWRlZCBncm91cCB0eXBlcy5cclxuICAgKiBAcGFyYW0ge0dyb3VwVHlwZUNvbmZpZ3VyYXRpb25bXX0gZ3JvdXBUeXBlc1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0TG9hZGVkR3JvdXBUeXBlcyhncm91cFR5cGVzOiBHcm91cFR5cGVDb25maWd1cmF0aW9uW10pIHtcclxuICAgIHRoaXMuZ3JvdXBUeXBlcyA9IGdyb3VwVHlwZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbG9hZGVkIGdyb3VwIHR5cGVzLlxyXG4gICAqIEByZXR1cm4ge0dyb3VwVHlwZUNvbmZpZ3VyYXRpb25bXX1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldExvYWRlZEdyb3VwVHlwZXMoKTogR3JvdXBUeXBlQ29uZmlndXJhdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLmdyb3VwVHlwZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T3JnYW5pemF0aW9uUmVxdWVzdFBheWxvYWR9IG9yZ1JlcXVlc3RQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxPcmdhbml6YXRpb25SZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRPcmdhbml6YXRpb25zKFxyXG4gICAgb3JnUmVxdWVzdFBheWxvYWQ6IE9yZ2FuaXphdGlvblJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxPcmdhbml6YXRpb25SZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKFxyXG4gICAgICAgIGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Jvc3Rlci9vcmdhbml6YXRpb25zYCxcclxuICAgICAgICBvcmdSZXF1ZXN0UGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZ3JvdXAgdHlwZSBjb25maWd1cmF0aW9uIEJ1c2luZXNzIHJ1bGUgZm9yIHRoZSBzZWxlY3RlZCBncm91cC5cclxuICAgKiBAcmV0dXJuIHsoQnVzaW5lc3NSdWxlICB8IHVuZGVmaW5lZCl9XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRCdXNpbmVzc1J1bGVPZlNlbGVjdGVkR3JvdXAoKTogQnVzaW5lc3NSdWxlIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGJ1c2luZXNzUnVsZSA9IHRoaXMuZ2V0TG9hZGVkR3JvdXBUeXBlcygpPy5maW5kKFxyXG4gICAgICAoZ3JvdXApID0+IGdyb3VwPy5jb25maWdGaWVsZElkID09PSB0aGlzLmdldFNlbGVjdGVkR3JvdXBJbmZvKCk/Lmdyb3VwVHlwZVxyXG4gICAgKT8uY29uZmlnRmllbGRWYWx1ZT8uYnVzaW5lc3NSdWxlO1xyXG4gICAgaWYoYnVzaW5lc3NSdWxlPy5yb3N0ZXJUeXBlID09PSBHcm91cFJvc3RlclR5cGUuRU5USVRZKVxyXG4gICAgICBidXNpbmVzc1J1bGUucm9zdGVyVHlwZSA9IEdyb3VwUm9zdGVyVHlwZS5JTkRJVklEVUFMO1xyXG4gICAgcmV0dXJuIGJ1c2luZXNzUnVsZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybSBzdWJtaXQgYnV0dG9uIGJhc2VkIG9uIHBhc3NlZCBwYXJhbWV0ZXJzLlxyXG4gICAqIEBwYXJhbSB7R3JvdXBSb3N0ZXJUeXBlfSBncm91cFJvc3RlclR5cGVcclxuICAgKiBAcGFyYW0ge0Zvcm1Db250cm9sU3RhdHVzfSBmb3JtU3RhdHVzXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2VsZWN0ZWRVc2VyUm9sZXNcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgaXNTdWJtaXRCdXR0b25EaXNhYmxlZChcclxuICAgIGdyb3VwUm9zdGVyVHlwZTogR3JvdXBSb3N0ZXJUeXBlLFxyXG4gICAgZm9ybVN0YXR1czogRm9ybUNvbnRyb2xTdGF0dXMsXHJcbiAgICBzZWxlY3RlZFVzZXJSb2xlczogc3RyaW5nW11cclxuICApOiBib29sZWFuIHtcclxuICAgIGlmIChncm91cFJvc3RlclR5cGUgPT09IEdyb3VwUm9zdGVyVHlwZS5JTkRJVklEVUFMKVxyXG4gICAgICByZXR1cm4gZm9ybVN0YXR1cyA9PT0gRm9ybVN0YXR1cy5JTlZBTElEO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkVXNlclJvbGVzPy5sZW5ndGggPT09IDAgfHwgZm9ybVN0YXR1cyA9PT0gRm9ybVN0YXR1cy5JTlZBTElEO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBpc1BhcmVudEdyb3VwQ2hhbmdlZCB0cnVlIG9yIGZhbHNlLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNQYXJlbnRHcm91cENoYW5nZWRcclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFBhcmVudEdyb3VwQ2hhbmdlU3RhdHVzKGlzUGFyZW50R3JvdXBDaGFuZ2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzUGFyZW50R3JvdXBDaGFuZ2VkID0gaXNQYXJlbnRHcm91cENoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGlzUGFyZW50R3JvdXBDaGFuZ2VkIHZhbHVlLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRQYXJlbnRHcm91cENoYW5nZVN0YXR1cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzUGFyZW50R3JvdXBDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgbWVtYmVyIHR5cGVzLlxyXG4gICAqIEBwYXJhbSB7Um9sZVtdfSBtZW1iZXJUeXBlc1xyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0TWVtYmVyVHlwZXMobWVtYmVyVHlwZXM6IFJvbGVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgdHlwZXMuXHJcbiAgICogQHJldHVybiB7Um9sZVtdfVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0TWVtYmVyVHlwZXMoKTogUm9sZVtdIHtcclxuICAgIHJldHVybiB0aGlzLm1lbWJlclR5cGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIHVuaXF1ZSBjYWxsaW5nIGNvZGVzIGRlcml2ZWQgZnJvbSBwaG9uZSBjb3VudHJ5IG1ldGFkYXRhLiAqL1xyXG4gIGdldENvdW50cnlDYWxsaW5nQ29kZXMoKTogU2VsZWN0T3B0aW9uW10ge1xyXG4gICAgY29uc3QgZGlhbENvZGVzID0gW1xyXG4gICAgICAuLi5uZXcgU2V0KENPVU5UUllfRElBTF9DT0RFUy5tYXAoKGNvdW50cnkpID0+IGNvdW50cnkuZGlhbENvZGUpKSxcclxuICAgIF0uc29ydChcclxuICAgICAgKGZpcnN0LCBzZWNvbmQpID0+XHJcbiAgICAgICAgTnVtYmVyKGZpcnN0LnNsaWNlKDEpKSAtIE51bWJlcihzZWNvbmQuc2xpY2UoMSkpXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGRpYWxDb2Rlcy5tYXAoKGRpYWxDb2RlKSA9PiAoeyBpZDogZGlhbENvZGUsIG5hbWU6IGRpYWxDb2RlIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHN0b3JlZCBpbnRlcmVzdC1mb3JtIHJlc3BvbnNlcyBmb3IgYW4gaW50ZXJlc3QgcmVjb3JkLCBmb3IgdGhlXHJcbiAgICogUm9zdGVyIE1hbmFnZW1lbnQgYWRtaW4gXCJWaWV3IFJlc3BvbnNlc1wiIHZpZXcgKFNQM00tNDI4LCBSOC43KS5cclxuICAgKlxyXG4gICAqIEdFVCB7YXBpQmFzZVVybH0vZ3JvdXBzL2ludGVyZXN0L3tpbnRlcmVzdElkfS9yZXNwb25zZXNcclxuICAgKlxyXG4gICAqIFRoZSBlbmRwb2ludCBpcyBrZXllZCBieSB0aGUgaW50ZXJlc3QgcmVjb3JkIGlkICh7QGNvZGUgR0lOVF9TQUFQUFNfLi4ufSksXHJcbiAgICogTk9UIHRoZSBncm91cCBpZCwgYW5kIGlzIGd1YXJkZWQgc2VydmVyLXNpZGUgYnkgcm9zdGVyLXZpZXcgcGVybWlzc2lvbnNcclxuICAgKiAoVklFV19HUk9VUF9NRU1CRVJTIG9uIHRoZSBncm91cCBvciB0aGUgdGVuYW50LXdpZGUgVklFV19BTExfUk9TVEVSUykuIFRoZVxyXG4gICAqIGJhc2UgVVJMIGFscmVhZHkgY2FycmllcyB0aGUgdmVyc2lvbiBzZWdtZW50IChlLmcuIGAuLi4vdjFgKSwgbWF0Y2hpbmcgZXZlcnlcclxuICAgKiBvdGhlciBHcm91cHNTZXJ2aWNlIGNhbGwgYnVpbHQgYXMgYCR7YXBpQmFzZVVybH0vZ3JvdXBzLy4uLmAsIHNvIHRoZSB2ZXJzaW9uXHJcbiAgICogaXMgbm90IHJlcGVhdGVkLiBUaGUgcmVzcG9uc2UgZW52ZWxvcGUncyBib2R5IGlzIHRoZSBsaXN0IG9mIHJlc3BvbnNlc1xyXG4gICAqIChuZXZlciBudWxsIOKAlCBhbiBlbXB0eSBsaXN0IG1lYW5zIG5vIGFuc3dlcnMgd2VyZSBzdWJtaXR0ZWQpLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlcmVzdElkIC0gVGhlIGludGVyZXN0IHJlY29yZCB3aG9zZSByZXNwb25zZXMgYXJlIHJlYWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxJbnRlcmVzdEZvcm1SZXNwb25zZVtdPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEludGVyZXN0UmVzcG9uc2VzKFxyXG4gICAgaW50ZXJlc3RJZDogc3RyaW5nXHJcbiAgKTogT2JzZXJ2YWJsZTxJbnRlcmVzdEZvcm1SZXNwb25zZVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9pbnRlcmVzdC8ke2ludGVyZXN0SWR9L3Jlc3BvbnNlc2ApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IChyZXNwb25zZT8uYm9keSBhcyBJbnRlcmVzdEZvcm1SZXNwb25zZVtdKSA/PyBbXSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JSZXMpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yUmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBpbnRlcmVzdGVkLXVzZXJzIHJvc3RlciBmb3IgYSBncm91cCDigJQgb25lIHJvdyBwZXIgaW50ZXJlc3RcclxuICAgKiBjYXJyeWluZyB0aGUgdXNlcidzIG5hbWUvZW1haWwsIG9yZ2FuaXphdGlvbiBhZmZpbGlhdGlvbnMsIHN1Ym1pdHRlZFxyXG4gICAqIHRpbWVzdGFtcCwgdGhlIGdyb3VwJ3MgZGVmYXVsdCBtZW1iZXJzaGlwIGxldmVsLCBhbmQgdGhlIGdyb3VwIHR5cGUgaWQg4oCUIHNvXHJcbiAgICogdGhlIFJvc3RlciBNYW5hZ2VtZW50IGFkbWluIFwiSW50ZXJlc3RlZCBSb3N0ZXJzXCIgdGFiIHJlbmRlcnMgdGhlIHdob2xlIGdyb3VwXHJcbiAgICogaW4gYSBzaW5nbGUgY2FsbCAoU1AzTS00MjgsIFI4LjcpLlxyXG4gICAqXHJcbiAgICogUE9TVCB7YXBpQmFzZVVybH0vZ3JvdXBzL2ludGVyZXN0L2dyb3VwL3tncm91cElkfS9yZXNwb25zZXNcclxuICAgKlxyXG4gICAqIFRoZSBzZWFyY2ggdGVybSwgcGFnaW5hdGlvbiBhbmQgc29ydCBvcHRpb25zIGFyZSBzZW50IGluIHRoZSByZXF1ZXN0IGJvZHlcclxuICAgKiAoe0BsaW5rIEludGVyZXN0ZWRSb3N0ZXJzUmVxdWVzdFBheWxvYWR9KSBzbyB0aGUgYmFja2VuZCBjYW4gZmlsdGVyLCBwYWdlXHJcbiAgICogYW5kIHNvcnQgdGhlIHJvc3RlciBzZXJ2ZXItc2lkZS4gR3VhcmRlZCBzZXJ2ZXItc2lkZSBieSByb3N0ZXItdmlld1xyXG4gICAqIHBlcm1pc3Npb25zIChWSUVXX0dST1VQX01FTUJFUlMgb24gdGhlIGdyb3VwIG9yIHRoZSB0ZW5hbnQtd2lkZVxyXG4gICAqIFZJRVdfQUxMX1JPU1RFUlMpLiBUaGUgYmFzZSBVUkwgYWxyZWFkeSBjYXJyaWVzIHRoZSB2ZXJzaW9uIHNlZ21lbnQsXHJcbiAgICogbWF0Y2hpbmcgZXZlcnkgb3RoZXIgR3JvdXBzU2VydmljZSBjYWxsIGJ1aWx0IGFzIGAke2FwaUJhc2VVcmx9L2dyb3Vwcy8uLi5gLFxyXG4gICAqIHNvIHRoZSB2ZXJzaW9uIGlzIG5vdCByZXBlYXRlZC4gVGhlIHJlc3BvbnNlIGVudmVsb3BlJ3MgYm9keSBpcyBhblxyXG4gICAqIHtAbGluayBJbnRlcmVzdGVkUm9zdGVyc1Jlc3BvbnNlfTogdGhlIHJvc3RlciByb3dzIGxpdmUgdW5kZXIgYGRhdGFgIChuZXZlclxyXG4gICAqIG51bGwg4oCUIGFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIGdyb3VwIGhhcyBubyBpbnRlcmVzdHMpIGFsb25nc2lkZSB0aGUgcGFnaW5nXHJcbiAgICogbWV0YWRhdGEgKGB0b3RhbFJlY29yZHNgLCBgb2Zmc2V0YCwgYHBhZ2VTaXplYCkuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGdyb3VwSWQgLSBUaGUgZ3JvdXAgd2hvc2UgaW50ZXJlc3RlZC11c2VycyByb3N0ZXIgaXMgcmVhZC5cclxuICAgKiBAcGFyYW0ge0ludGVyZXN0ZWRSb3N0ZXJzUmVxdWVzdFBheWxvYWR9IHBheWxvYWQgLSBTZWFyY2gvcGFnaW5hdGlvbi9zb3J0IG9wdGlvbnMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxJbnRlcmVzdGVkUm9zdGVyc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEludGVyZXN0UmVzcG9uc2VzQnlHcm91cChcclxuICAgIGdyb3VwSWQ6IHN0cmluZyxcclxuICAgIHBheWxvYWQ6IEludGVyZXN0ZWRSb3N0ZXJzUmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPEludGVyZXN0ZWRSb3N0ZXJzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9pbnRlcmVzdC9ncm91cC8ke2dyb3VwSWR9L3Jlc3BvbnNlc2AsXHJcbiAgICAgICAgcGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZT8uYm9keSBhcyBJbnRlcmVzdGVkUm9zdGVyc1Jlc3BvbnNlIHwgbnVsbDtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRhdGE6IGJvZHk/LmRhdGEgPz8gW10sXHJcbiAgICAgICAgICAgIHRvdGFsUmVjb3JkczogYm9keT8udG90YWxSZWNvcmRzID8/IDAsXHJcbiAgICAgICAgICAgIG9mZnNldDogYm9keT8ub2Zmc2V0ID8/IDAsXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiBib2R5Py5wYWdlU2l6ZSA/PyAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMvb3ZlcnJpZGVzIHRoZSBtZW1iZXJzaGlwIGxldmVsIGZvciBhbiBpbnRlcmVzdGVkIHVzZXIgZnJvbSB0aGUgUm9zdGVyXHJcbiAgICogTWFuYWdlbWVudCBhZG1pbiBcIkludGVyZXN0ZWQgUm9zdGVyc1wiIHRhYiAoU1AzTS00MjgpLiBDYWxsZWQgd2hlbiB0aGUgYWRtaW5cclxuICAgKiBwaWNrcyBhIHZhbHVlIGluIGEgcm93J3MgTWVtYmVyIExldmVsIGRyb3Bkb3duLlxyXG4gICAqXHJcbiAgICogUFVUIHthcGlCYXNlVXJsfS9ncm91cHMvaW50ZXJlc3QvbWVtYmVyLWxldmVsXHJcbiAgICpcclxuICAgKiBUaGUgZ3JvdXAsIHVzZXIgYW5kIHNlbGVjdGVkIHJvbGUgaWQgYXJlIHNlbnQgaW4gdGhlIHJlcXVlc3QgYm9keVxyXG4gICAqICh7QGxpbmsgVXBkYXRlTWVtYmVyTGV2ZWxQYXlsb2FkfSkuIEd1YXJkZWQgc2VydmVyLXNpZGUgYnkgcm9zdGVyLW1hbmFnZW1lbnRcclxuICAgKiBwZXJtaXNzaW9ucy4gVGhlIGJhc2UgVVJMIGFscmVhZHkgY2FycmllcyB0aGUgdmVyc2lvbiBzZWdtZW50LCBtYXRjaGluZ1xyXG4gICAqIGV2ZXJ5IG90aGVyIEdyb3Vwc1NlcnZpY2UgY2FsbCBidWlsdCBhcyBgJHthcGlCYXNlVXJsfS9ncm91cHMvLi4uYCwgc28gdGhlXHJcbiAgICogdmVyc2lvbiBpcyBub3QgcmVwZWF0ZWQuIFRoZSByZXNwb25zZSBlbnZlbG9wZSdzIGJvZHkgaXMgcmV0dXJuZWQgYXMtaXMuXHJcbiAgICogQHBhcmFtIHtVcGRhdGVNZW1iZXJMZXZlbFBheWxvYWR9IHBheWxvYWQgLSBHcm91cCArIHVzZXIgKyBzZWxlY3RlZCByb2xlIGlkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8dW5rbm93bj59XHJcbiAgICogQG1lbWJlcm9mIEdyb3Vwc1NlcnZpY2VcclxuICAgKi9cclxuICB1cGRhdGVJbnRlcmVzdE1lbWJlckxldmVsKFxyXG4gICAgcGF5bG9hZDogVXBkYXRlTWVtYmVyTGV2ZWxQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9pbnRlcmVzdC9tZW1iZXItbGV2ZWxgLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZT8uYm9keSA/PyBudWxsKSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvclJlcykgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3JSZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIFJlY2lwcm9jYWwgQ3JlZGl0IChTUDNNLTIyKVxyXG4gIC8vIFRoZSByZWNpcHJvY2FsIGNvbnRyb2xsZXIgbGl2ZXMgb24gdGhlIE1FRVRJTkdTIHNlcnZpY2UsIHJlYWNoZWQgdGhyb3VnaCB0aGVcclxuICAvLyBnYXRld2F5LiBhcGlCYXNlVXJsID0gYXBwQ29uZmlnLmJhc2VBcGlVcmwgKGVuZHMgaW4gYC92MWApLCBhbmQgdGhlIGdhdGV3YXlcclxuICAvLyByb3V0ZXMgdGhlIG1lZXRpbmdzIHNlcnZpY2UgdW5kZXIgYCR7YXBpQmFzZVVybH0vbWVldGluZ3NgIChzYW1lIGFzIGV2ZXJ5IG90aGVyXHJcbiAgLy8gbWVldGluZ3MvZXZlbnRzIGNhbGwsIGUuZy4gYCR7YXBpQmFzZVVybH0vbWVldGluZ3MvZXZlbnQvLi4uYCkuXHJcbiAgLy9cclxuICAvLyBUaGUgcmVjaXByb2NhbCBjb250cm9sbGVyIHNpdHMgb24gdGhlIG1lZXRpbmdzIHNlcnZpY2UgdW5kZXIgYGFkbWluL3JlY2lwcm9jYWwtY3JlZGl0YC5cclxuICAvLyBhcGlCYXNlVXJsIGFscmVhZHkgY2FycmllcyB0aGUgdmVyc2lvbiBzZWdtZW50IChgLi4uL3YxYCksIGFuZCB0aGUgZ2F0ZXdheSByb3V0ZXNcclxuICAvLyB0aGUgbWVldGluZ3Mgc2VydmljZSB1bmRlciBgJHthcGlCYXNlVXJsfS9tZWV0aW5nc2AsIHNvIHRoZSB2ZXJzaW9uIGlzIE5PVCByZXBlYXRlZFxyXG4gIC8vIChubyBzZWNvbmQgYC92MWAgb3IgYC9hcGkvdjFgKS4gVGhlIGZ1bGwgcGF0aCBpczpcclxuICAvLyAgIGAke2FwaUJhc2VVcmx9L21lZXRpbmdzL2FkbWluL3JlY2lwcm9jYWwtY3JlZGl0Ly4uLmBcclxuICAvLyAgID0gaHR0cHM6Ly9zYWFwcHNhcGlkZXYuaWVlZS5vcmcvdjEvbWVldGluZ3MvYWRtaW4vcmVjaXByb2NhbC1jcmVkaXQvLi4uXHJcbiAgLy8gRXZlcnkgbWV0aG9kIGJ1aWxkcyBVUkxzIGZyb20gUkVDSVBST0NBTF9CQVNFX1BBVEggYmVsb3cuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBQYXRoIHByZWZpeCAocmVsYXRpdmUgdG8gYXBpQmFzZVVybCkgZm9yIHRoZSByZWNpcHJvY2FsLWNyZWRpdCBlbmRwb2ludHMuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBSRUNJUFJPQ0FMX0JBU0VfUEFUSCA9ICdtZWV0aW5ncy9hZG1pbi9yZWNpcHJvY2FsLWNyZWRpdCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIGEgcmVjaXByb2NhbC1jcmVkaXQgZW5kcG9pbnQgVVJMIGZyb20gYXBpQmFzZVVybCArIHRoZSBiYXNlIHBhdGgsXHJcbiAgICogZ3VhcmRpbmcgYWdhaW5zdCBhY2NpZGVudGFsIGRvdWJsZSBzbGFzaGVzIGlmIGFwaUJhc2VVcmwgaGFzIGEgdHJhaWxpbmcgc2xhc2guXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdWZmaXhdIGV4dHJhIHBhdGgvcXVlcnkgYXBwZW5kZWQgYWZ0ZXIgdGhlIGJhc2UgcGF0aC5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZFJlY2lwcm9jYWxVcmwoc3VmZml4ID0gJycpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYmFzZSA9IHRoaXMuYXBpQmFzZVVybD8ucmVwbGFjZSgvXFwvKyQvLCAnJykgPz8gJyc7XHJcbiAgICByZXR1cm4gYCR7YmFzZX0vJHt0aGlzLlJFQ0lQUk9DQUxfQkFTRV9QQVRIfSR7c3VmZml4fWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaCB0aGUgZm9yZWlnbiBncm91cHMgYXZhaWxhYmxlIGZvciByZWNpcHJvY2FsIGNyZWRpdCBmb3IgYSBob21lIGdyb3VwLlxyXG4gICAqIEdFVCB7YXBpQmFzZVVybH0vbWVldGluZ3MvYWRtaW4vcmVjaXByb2NhbC1jcmVkaXQve2hvbWVHcm91cElkfS9hdmFpbGFibGUtZ3JvdXBzXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhvbWVHcm91cElkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxSZWNpcHJvY2FsQ3JlZGl0UmVzcG9uc2U8QXZhaWxhYmxlRm9yZWlnbkdyb3VwW10+Pn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEF2YWlsYWJsZVJlY2lwcm9jYWxHcm91cHMoXHJcbiAgICBob21lR3JvdXBJZDogc3RyaW5nXHJcbiAgKTogT2JzZXJ2YWJsZTxSZWNpcHJvY2FsQ3JlZGl0UmVzcG9uc2U8QXZhaWxhYmxlRm9yZWlnbkdyb3VwW10+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YSh0aGlzLmJ1aWxkUmVjaXByb2NhbFVybChgLyR7aG9tZUdyb3VwSWR9L2F2YWlsYWJsZS1ncm91cHNgKSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBleGlzdGluZyByZWNpcHJvY2FsLWNyZWRpdCBjb25maWcgcm93cyBmb3IgYSBob21lIGdyb3VwIChlZGl0IHByZWZpbGwpLlxyXG4gICAqIEdFVCB7YXBpQmFzZVVybH0vbWVldGluZ3MvYWRtaW4vcmVjaXByb2NhbC1jcmVkaXQve2hvbWVHcm91cElkfVs/ZXZlbnRJZD0uLi5dXHJcbiAgICogUmV0dXJucyBvbmUgcm93IHBlciBmb3JlaWduIGdyb3VwOyBhbiBlbXB0eSBhcnJheSBtZWFucyByZWNpcHJvY2FsIGNyZWRpdCBpcyBvZmYuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhvbWVHcm91cElkXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudElkXSBvcHRpb25hbCDigJQgZmlsdGVycyB0byBhbiBldmVudC1zY29wZWQgY29uZmlnLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UmVjaXByb2NhbENyZWRpdFJlc3BvbnNlPFJlY2lwcm9jYWxDcmVkaXRDb25maWdSb3dbXT4+fVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0UmVjaXByb2NhbENvbmZpZyhcclxuICAgIGhvbWVHcm91cElkOiBzdHJpbmcsXHJcbiAgICBldmVudElkPzogc3RyaW5nXHJcbiAgKTogT2JzZXJ2YWJsZTxSZWNpcHJvY2FsQ3JlZGl0UmVzcG9uc2U8UmVjaXByb2NhbENyZWRpdENvbmZpZ1Jvd1tdPj4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSBldmVudElkID8gYD9ldmVudElkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV2ZW50SWQpfWAgOiAnJztcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKHRoaXMuYnVpbGRSZWNpcHJvY2FsVXJsKGAvJHtob21lR3JvdXBJZH0ke3F1ZXJ5fWApKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYXZlIGEgcmVjaXByb2NhbC1jcmVkaXQgY29uZmlnIChjcmVhdGVzL3JlYWN0aXZhdGVzIG9uZSByb3cgcGVyIGZvcmVpZ24gZ3JvdXApLlxyXG4gICAqIFBPU1Qge2FwaUJhc2VVcmx9L21lZXRpbmdzL2FkbWluL3JlY2lwcm9jYWwtY3JlZGl0XHJcbiAgICogQHBhcmFtIHtTYXZlUmVjaXByb2NhbENyZWRpdFBheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFJlY2lwcm9jYWxDcmVkaXRSZXNwb25zZTxSZWNpcHJvY2FsQ3JlZGl0Q29uZmlnUm93W10+Pn1cclxuICAgKiBAbWVtYmVyb2YgR3JvdXBzU2VydmljZVxyXG4gICAqL1xyXG4gIHNhdmVSZWNpcHJvY2FsQ3JlZGl0KFxyXG4gICAgcGF5bG9hZDogU2F2ZVJlY2lwcm9jYWxDcmVkaXRQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxSZWNpcHJvY2FsQ3JlZGl0UmVzcG9uc2U8UmVjaXByb2NhbENyZWRpdENvbmZpZ1Jvd1tdPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKHRoaXMuYnVpbGRSZWNpcHJvY2FsVXJsKCksIHBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHJlc3BvbnNlKSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSAoc29mdCBkZWxldGUpIGEgc2luZ2xlIHJlY2lwcm9jYWwtY3JlZGl0IGNvbmZpZyByb3cgYnkgaXRzIGNvbmZpZ0lkLlxyXG4gICAqIFBPU1Qge2FwaUJhc2VVcmx9L21lZXRpbmdzL2FkbWluL3JlY2lwcm9jYWwtY3JlZGl0L3tjb25maWdJZH0vcmVtb3ZlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ0lkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxSZWNpcHJvY2FsQ3JlZGl0UmVzcG9uc2U8bnVsbD4+fVxyXG4gICAqIEBtZW1iZXJvZiBHcm91cHNTZXJ2aWNlXHJcbiAgICovXHJcbiAgcmVtb3ZlUmVjaXByb2NhbENvbmZpZyhcclxuICAgIGNvbmZpZ0lkOiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPFJlY2lwcm9jYWxDcmVkaXRSZXNwb25zZTxudWxsPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKHRoaXMuYnVpbGRSZWNpcHJvY2FsVXJsKGAvJHtjb25maWdJZH0vcmVtb3ZlYCksIHt9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -37,6 +37,7 @@ export * from './lib/models/table-column-schema-user-group.model';
|
|
|
37
37
|
export * from './lib/models/parent-groups-info.model';
|
|
38
38
|
export * from './lib/models/reciprocal-credit.model';
|
|
39
39
|
export * from './lib/models/required-profile-fields.model';
|
|
40
|
+
export * from './lib/models/tenant-feature.model';
|
|
40
41
|
export * from './lib/services/groups.service';
|
|
41
42
|
export * from './lib/services/roster-export.service';
|
|
42
43
|
export * from './lib/services/roster-import-api.service';
|
|
@@ -44,4 +45,4 @@ export * from './lib/models/roster-import.model';
|
|
|
44
45
|
export * from './lib/models/interest-response.model';
|
|
45
46
|
export * from './lib/assets/form-validations';
|
|
46
47
|
export * from './lib/groups.module';
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2dyb3Vwcy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILGNBQWMsc0RBQXNELENBQUM7QUFDckUsY0FBYyxnREFBZ0QsQ0FBQztBQUMvRCxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsZ0ZBQWdGLENBQUM7QUFDL0YsY0FBYyxrRUFBa0UsQ0FBQztBQUNqRixjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsd0VBQXdFLENBQUM7QUFDdkYsY0FBYyw4RUFBOEUsQ0FBQztBQUM3RixjQUFjLGtFQUFrRSxDQUFDO0FBQ2pGLGNBQWMsa0VBQWtFLENBQUM7QUFDakYsY0FBYyx3REFBd0QsQ0FBQztBQUN2RSxjQUFjLDBFQUEwRSxDQUFDO0FBQ3pGLGNBQWMsd0VBQXdFLENBQUM7QUFDdkYsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYywyQ0FBMkMsQ0FBQztBQUMxRCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsbUNBQW1DLENBQUM7QUFFbEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsMENBQTBDLENBQUM7QUFFekQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLHNDQUFzQyxDQUFDO0FBRXJELGNBQWMsK0JBQStCLENBQUM7QUFFOUMsY0FBYyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBncm91cHNcclxuICovXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvY3JlYXRlLWdyb3VwL2NyZWF0ZS1ncm91cC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3RyZWUtdmlldy90cmVlLXZpZXcuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9lZGl0LXVzZXItcm9sZXMvZWRpdC11c2VyLXJvbGVzLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcmVjaXByb2NhbC1jcmVkaXQtc2VjdGlvbi9yZWNpcHJvY2FsLWNyZWRpdC1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYWRkLXdvcmtpbmctZ3JvdXBzL2FkZC13b3JraW5nLWdyb3Vwcy5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQvcm9zdGVyLWltcG9ydC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQtaGlzdG9yeS9yb3N0ZXItaW1wb3J0LWhpc3RvcnkuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9pbnRlcmVzdC1mb3JtLW1hbmFnZW1lbnQvaW50ZXJlc3QtZm9ybS1tYW5hZ2VtZW50LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvaW50ZXJlc3RlZC1yb3N0ZXJzL2ludGVyZXN0ZWQtcm9zdGVycy5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2ludGVyZXN0LXJlc3BvbnNlcy9pbnRlcmVzdC1yZXNwb25zZXMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9pbnRlcmVzdC1mb3JtL2ludGVyZXN0LWZvcm0uY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9jdXN0b20tcXVlc3Rpb24tZWRpdG9yL2N1c3RvbS1xdWVzdGlvbi1lZGl0b3IuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9pbnRlcmVzdC1mb3JtLXByZXZpZXcvaW50ZXJlc3QtZm9ybS1wcmV2aWV3LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9jdXN0b20tcXVlc3Rpb24ubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9pbnRlcmVzdC1mb3JtLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9ncm91cHMuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9jcmVhdGUtZ3JvdXAubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZ3JvdXAtYWN0aW9uLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2dyb3VwLWZ1bmN0aW9uLXR5cGUubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZ3JvdXAtaW5mby5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9ncm91cC10eXBlcy5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy92aWV3LWdyb3VwLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2VkaXQtZ3JvdXAubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvZGVsZXRlLWdyb3VwLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2dyb3VwLXVzZXItaW5mby5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9hZGQtb3ItZWRpdC11c2VyLWdyb3VwLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL3Jvc3Rlci1mdW5jdGlvbi10eXBlLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2NsYXNzaWZpY2F0aW9uLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2ZpbHRlci10eXBlLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL29yZ2FuaXphdGlvbi5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9yb2xlLXR5cGUubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvcm9zdGVyLXR5cGUubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvdGFibGUtY29sdW1uLXNjaGVtYS11c2VyLWdyb3VwLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL3BhcmVudC1ncm91cHMtaW5mby5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9yZWNpcHJvY2FsLWNyZWRpdC5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9yZXF1aXJlZC1wcm9maWxlLWZpZWxkcy5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy90ZW5hbnQtZmVhdHVyZS5tb2RlbCc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9ncm91cHMuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3Jvc3Rlci1leHBvcnQuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3Jvc3Rlci1pbXBvcnQtYXBpLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL3Jvc3Rlci1pbXBvcnQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvaW50ZXJlc3QtcmVzcG9uc2UubW9kZWwnO1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvYXNzZXRzL2Zvcm0tdmFsaWRhdGlvbnMnO1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3JvdXBzLm1vZHVsZSc7XHJcbiJdfQ==
|