@c8y/ngx-components 1018.0.271 → 1018.0.273

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.
@@ -68,10 +68,10 @@ export class RepositoryService {
68
68
  case RepositoryType.CONFIGURATION:
69
69
  Object.assign(modal, {
70
70
  selected: {
71
- id: modal.selected?.id || mo.id,
72
- name: modal.version || modal.selected?.name
71
+ id: mo.id,
72
+ name: modal.version
73
73
  },
74
- configurationType: modal.selected ? modal.selected.configurationType : undefined,
74
+ configurationType: modal.configurationType,
75
75
  name: modal.version
76
76
  });
77
77
  if (!modal.deviceType && mo.id) {
@@ -143,13 +143,13 @@ export class RepositoryService {
143
143
  if (deviceType && type !== RepositoryType.CONFIGURATION) {
144
144
  set(mo, 'c8y_Filter.type', deviceType);
145
145
  }
146
- if (deviceType && type === RepositoryType.CONFIGURATION) {
146
+ if ((deviceType || id) && type === RepositoryType.CONFIGURATION) {
147
147
  set(mo, 'deviceType', deviceType);
148
148
  }
149
149
  if (modal.softwareType) {
150
150
  set(mo, 'softwareType', modal.softwareType.softwareType);
151
151
  }
152
- if (modal.configurationType) {
152
+ if ((modal.configurationType || id) && type === RepositoryType.CONFIGURATION) {
153
153
  set(mo, 'configurationType', modal.configurationType);
154
154
  }
155
155
  if (type === RepositoryType.CONFIGURATION) {
@@ -1087,4 +1087,4 @@ RepositoryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", ve
1087
1087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RepositoryService, decorators: [{
1088
1088
  type: Injectable
1089
1089
  }], ctorParameters: function () { return [{ type: i1.InventoryService }, { type: i1.InventoryBinaryService }, { type: i1.OperationService }, { type: i2.AlertService }, { type: i1.EventService }, { type: i2.OperationRealtimeService }, { type: i1.EventBinaryService }, { type: i3.AdvancedSoftwareService }, { type: i2.GlobalConfigService }]; } });
1090
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3NpdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zaGFyZWQvcmVwb3NpdG9yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBT1osc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUloQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFdBQVcsRUFDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsWUFBWSxFQUNaLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsTUFBTSxFQUNOLFNBQVMsRUFDVCxJQUFJLEVBQ0osT0FBTyxFQUNQLEdBQUcsRUFDSCxJQUFJLEVBQ0osS0FBSyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsTUFBTSxFQUNOLElBQUksRUFDSixNQUFNLEVBQ04sR0FBRyxFQUNKLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFRTCx1QkFBdUIsRUFHdkIsY0FBYyxFQUdmLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBRzVCLE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFDVSxTQUEyQixFQUMzQixlQUF1QyxFQUN2QyxT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QUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRXZlbnRCaW5hcnlTZXJ2aWNlLFxuICBFdmVudFNlcnZpY2UsXG4gIElkUmVmZXJlbmNlLFxuICBJRXZlbnQsXG4gIElGZXRjaFJlc3BvbnNlLFxuICBJSWRlbnRpZmllZCxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIElNYW5hZ2VkT2JqZWN0QmluYXJ5LFxuICBJbnZlbnRvcnlCaW5hcnlTZXJ2aWNlLFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBJT3BlcmF0aW9uLFxuICBJUmVzdWx0LFxuICBJUmVzdWx0TGlzdCxcbiAgT3BlcmF0aW9uU2VydmljZSxcbiAgT3BlcmF0aW9uU3RhdHVzLFxuICBRdWVyaWVzVXRpbFxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIGdldHRleHQsXG4gIEdsb2JhbENvbmZpZ1NlcnZpY2UsXG4gIE9wZXJhdGlvblJlYWx0aW1lU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIG1hcCBhcyBfbWFwLFxuICBhc3NpZ24sXG4gIGNsb25lRGVlcCxcbiAgZmluZCxcbiAgZm9yRWFjaCxcbiAgZ2V0LFxuICBoZWFkLFxuICBpc05pbCxcbiAgaXNTdHJpbmcsXG4gIGlzVW5kZWZpbmVkLFxuICBvbWl0QnksXG4gIHBpY2ssXG4gIHJlbW92ZSxcbiAgc2V0XG59IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBkZWZlciwgZnJvbSwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlV2hpbGUsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UgfSBmcm9tICcuL2FkdmFuY2VkLXNvZnR3YXJlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICBEZXZpY2VGaXJtd2FyZSxcbiAgRGV2aWNlU29mdHdhcmUsXG4gIERldmljZVNvZnR3YXJlQ2hhbmdlLFxuICBGaXJtd2FyZUJpbmFyeSxcbiAgRmlybXdhcmVQYXRjaEJpbmFyeSxcbiAgTW9kYWxNb2RlbCxcbiAgUkVQT1NJVE9SWV9CSU5BUllfVFlQRVMsXG4gIFJlcG9zaXRvcnlCaW5hcnksXG4gIFJlcG9zaXRvcnlDYXRlZ29yeSxcbiAgUmVwb3NpdG9yeVR5cGUsXG4gIFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeSxcbiAgU29mdHdhcmVCaW5hcnlcbn0gZnJvbSAnLi9yZXBvc2l0b3J5Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgZGF0ZUZyb20gPSBuZXcgRGF0ZSgwKTtcbiAgcmVhZG9ubHkgZGF0ZVRvID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKTsgLy8gMSBkYXkgaW4gdGhlIGZ1dHVyZVxuICBwcml2YXRlIHF1ZXJpZXNVdGlsOiBRdWVyaWVzVXRpbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeUJpbmFyeTogSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIG9wZXJhdGlvbjogT3BlcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudDogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3BlcmF0aW9uUmVhbHRpbWU6IE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50QmluYXJ5OiBFdmVudEJpbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhZHZhbmNlZFNvZnR3YXJlU2VydmljZTogQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnbG9iYWxDb25maWdTZXJ2aWNlOiBHbG9iYWxDb25maWdTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucXVlcmllc1V0aWwgPSBuZXcgUXVlcmllc1V0aWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyByZXBvc2l0b3J5IGVudHJpZXMgb2YgZ2l2ZW4gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgcmVwb3NpdG9yeSBlbnRyaWVzIHRvIGxpc3QuXG4gICAqIEBwYXJhbSBvcHRpb25zIEV4dHJhIGxpc3Rpbmcgb3B0aW9ucy5cbiAgICovXG4gIGxpc3RSZXBvc2l0b3J5RW50cmllcyhcbiAgICB0eXBlOiBSZXBvc2l0b3J5VHlwZSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgLyoqIEFkZGl0aW9uYWwgcXVlcnkuICovXG4gICAgICBxdWVyeT86IGFueTtcbiAgICAgIC8qKiAoZGVwcmVjYXRlZCAtIHRvIGJlIHJlbW92ZWQpIE9ubHkgaW5jbHVkZSBlbnRyaWVzIHdpdGggbWF0Y2hpbmcgcGFydGlhbCBuYW1lcy4gKi9cbiAgICAgIHBhcnRpYWxOYW1lPzogc3RyaW5nO1xuICAgICAgLyoqIEluY2x1ZGUgZW50cmllcyB3aXRoIG1hdGNoaW5nIHBhcnRpYWwgdGV4dCBpbiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuICovXG4gICAgICBwYXJ0aWFsVGV4dEZpbHRlcj86IHsgcGFydGlhbFRleHQ6IHN0cmluZzsgcHJvcGVydGllczogc3RyaW5nW10gfTtcbiAgICAgIC8qKiBFeGNsdWRlIGxlZ2FjeSBlbnRyaWVzLiAqL1xuICAgICAgc2tpcExlZ2FjeT86IGJvb2xlYW47XG4gICAgICAvKiogRXhjbHVkZSBkZWZhdWx0IG9yZGVyaW5nLiAqL1xuICAgICAgc2tpcERlZmF1bHRPcmRlcj86IGJvb2xlYW47XG4gICAgICAvKiogT3RoZXIgcmVxdWVzdCBwYXJhbXMuICovXG4gICAgICBwYXJhbXM/OiBhbnk7XG4gICAgfVxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0T3JkZXIgPSBbeyBuYW1lOiAxIH1dO1xuICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0geyB0eXBlIH07XG4gICAgY29uc3QgbGVnYWN5RmlsdGVycyA9IHsgX19oYXM6IGB1cmxgIH07XG4gICAgbGV0IGZpbHRlcnMgPSB7fTtcblxuICAgIGxldCBmdWxsUXVlcnkgPSAob3B0aW9ucyAmJiBvcHRpb25zLnF1ZXJ5KSB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMgfHwgKG9wdGlvbnMgJiYgIW9wdGlvbnMuc2tpcERlZmF1bHRPcmRlcikpIHtcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkT3JkZXJieXMoZnVsbFF1ZXJ5LCBkZWZhdWx0T3JkZXIsICdwcmVwZW5kJyk7XG4gICAgfVxuXG4gICAgZnVsbFF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZnVsbFF1ZXJ5LCBkZWZhdWx0RmlsdGVycyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBhcnRpYWxUZXh0RmlsdGVyKSB7XG4gICAgICBjb25zdCB7IHBhcnRpYWxUZXh0LCBwcm9wZXJ0aWVzIH0gPSBvcHRpb25zLnBhcnRpYWxUZXh0RmlsdGVyO1xuICAgICAgY29uc3Qgb3JGaWx0ZXIgPSB7IF9fb3I6IHByb3BlcnRpZXMubWFwKHByb3BlcnR5ID0+ICh7IFtwcm9wZXJ0eV06IGAqJHtwYXJ0aWFsVGV4dH0qYCB9KSkgfTtcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKGZ1bGxRdWVyeSwgb3JGaWx0ZXIpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucGFydGlhbE5hbWUpIHtcbiAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlmXG4gICAgICBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihmdWxsUXVlcnksIHsgbmFtZTogYCoke29wdGlvbnMucGFydGlhbE5hbWV9KmAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5za2lwTGVnYWN5KSB7XG4gICAgICBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihmdWxsUXVlcnksIHsgX19ub3Q6IGxlZ2FjeUZpbHRlcnMgfSk7XG4gICAgfVxuXG4gICAgZmlsdGVycyA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkoZnVsbFF1ZXJ5KSxcbiAgICAgIHBhZ2VTaXplOiA1MCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlLFxuICAgICAgLi4uKChvcHRpb25zICYmIG9wdGlvbnMucGFyYW1zKSB8fCB7fSlcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5saXN0KGZpbHRlcnMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGFsOiBNb2RhbE1vZGVsLCB0eXBlOiBSZXBvc2l0b3J5VHlwZSwgbW86IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+ID0ge30pIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUmVwb3NpdG9yeVR5cGUuRklSTVdBUkU6XG4gICAgICBjYXNlIFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZXBvc2l0b3J5T2JqZWN0KG1vZGFsLCB0eXBlKTtcblxuICAgICAgY2FzZSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OOlxuICAgICAgICBPYmplY3QuYXNzaWduKG1vZGFsLCB7XG4gICAgICAgICAgc2VsZWN0ZWQ6IHtcbiAgICAgICAgICAgIGlkOiBtb2RhbC5zZWxlY3RlZD8uaWQgfHwgbW8uaWQsXG4gICAgICAgICAgICBuYW1lOiBtb2RhbC52ZXJzaW9uIHx8IG1vZGFsLnNlbGVjdGVkPy5uYW1lXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uVHlwZTogbW9kYWwuc2VsZWN0ZWQgPyBtb2RhbC5zZWxlY3RlZC5jb25maWd1cmF0aW9uVHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuYW1lOiBtb2RhbC52ZXJzaW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghbW9kYWwuZGV2aWNlVHlwZSAmJiBtby5pZCkge1xuICAgICAgICAgIG1vZGFsLmRldmljZVR5cGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9kYWwuc2VsZWN0ZWQgJiYgbW8uaWQpIHtcbiAgICAgICAgICBtb2RhbC5jb25maWd1cmF0aW9uVHlwZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXBvc2l0b3J5T2JqZWN0ID0gdGhpcy5jcmVhdGVSZXBvc2l0b3J5T2JqZWN0KG1vZGFsLCB0eXBlKTtcblxuICAgICAgICBpZiAobW8udXJsKSB7XG4gICAgICAgICAgY29uc3QgbmV3QmluYXJ5VXJsID0gKGF3YWl0IHJlcG9zaXRvcnlPYmplY3QpLnVybDtcbiAgICAgICAgICB0aGlzLnJlbW92ZU91dGRhdGVkQmluYXJ5KG5ld0JpbmFyeVVybCwgbW8udXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXBvc2l0b3J5T2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJlcG9zaXRvcnlPYmplY3QoXG4gICAgbW9kYWw6IE1vZGFsTW9kZWwsXG4gICAgdHlwZTogUmVwb3NpdG9yeVR5cGVcbiAgKTogUHJvbWlzZTxSZXBvc2l0b3J5Q2F0ZWdvcnk+IHtcbiAgICBsZXQgYmluYXJ5OiBJTWFuYWdlZE9iamVjdEJpbmFyeTtcbiAgICBsZXQgYmluYXJ5VVJMOiBzdHJpbmc7XG4gICAgbGV0IHJlcG9zaXRvcnlFbnRyeTogUmVwb3NpdG9yeUNhdGVnb3J5O1xuICAgIGxldCByZXBvc2l0b3J5QmluYXJ5OiBGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5O1xuICAgIGNvbnN0IG1vcyA9IFtdO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGVkOiB7IGlkOiBzZWxlY3RlZElkIH0sXG4gICAgICBiaW5hcnk6IHsgZmlsZSwgdXJsIH1cbiAgICB9ID0gbW9kYWw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdsb2JhbFBhcmFtID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxGcmFnbWVudCh0eXBlKTtcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgKHsgZGF0YTogYmluYXJ5IH0gPSBhd2FpdCB0aGlzLnNhdmVCaW5hcnkoZmlsZSwgZ2xvYmFsUGFyYW0pKTtcbiAgICAgICAgKHsgc2VsZjogYmluYXJ5VVJMIH0gPSBiaW5hcnkpO1xuICAgICAgICBpZiAodHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgICAgIG1vZGFsLmJpbmFyeS51cmwgPSBiaW5hcnlVUkw7XG4gICAgICAgIH1cbiAgICAgICAgbW9zLnB1c2goYmluYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpbmFyeVVSTCA9IHVybDtcbiAgICAgIH1cblxuICAgICAgKHsgZGF0YTogcmVwb3NpdG9yeUVudHJ5IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZU9yVXBkYXRlUmVwb3NpdG9yeUVudHJ5KFxuICAgICAgICB7IC4uLm1vZGFsLCAuLi5nbG9iYWxQYXJhbSB9LFxuICAgICAgICB0eXBlXG4gICAgICApKTtcbiAgICAgIGlmIChpc05pbChzZWxlY3RlZElkKSkge1xuICAgICAgICBtb3MucHVzaChyZXBvc2l0b3J5RW50cnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSAhPT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgICAoeyBkYXRhOiByZXBvc2l0b3J5QmluYXJ5IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVJlcG9zaXRvcnlCaW5hcnkoXG4gICAgICAgICAgeyAuLi5tb2RhbCwgLi4uZ2xvYmFsUGFyYW0gfSxcbiAgICAgICAgICBiaW5hcnlVUkwsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXBvc2l0b3J5RW50cnlcbiAgICAgICAgKSk7XG4gICAgICAgIG1vcy5wdXNoKHJlcG9zaXRvcnlCaW5hcnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxpbmtCaW5hcnkocmVwb3NpdG9yeUJpbmFyeSwgYmluYXJ5LCByZXBvc2l0b3J5RW50cnkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVwb3NpdG9yeUVudHJ5O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNsZWFuVXAobW9zKTtcbiAgICAgIHRoaXMuZXJyb3JNc2coKTtcblxuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBzYXZlQmluYXJ5KGZpbGU6IEZpbGUsIGdsb2JhbDogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4pOiBQcm9taXNlPElSZXN1bHQ8SU1hbmFnZWRPYmplY3RCaW5hcnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5QmluYXJ5LmNyZWF0ZShmaWxlLCBnbG9iYWwpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT3JVcGRhdGVSZXBvc2l0b3J5RW50cnkoXG4gICAgbW9kYWw6IE1vZGFsTW9kZWwsXG4gICAgdHlwZTogUmVwb3NpdG9yeVR5cGVcbiAgKTogUHJvbWlzZTxJUmVzdWx0PFJlcG9zaXRvcnlDYXRlZ29yeT4+IHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZDogeyBpZCwgbmFtZSB9LFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBkZXZpY2VUeXBlLFxuICAgICAgYzh5X0dsb2JhbCxcbiAgICAgIGJpbmFyeVxuICAgIH0gPSBtb2RhbDtcblxuICAgIGNvbnN0IG1vID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICB0eXBlLFxuICAgICAgYzh5X0dsb2JhbFxuICAgIH07XG5cbiAgICBpZiAoZGV2aWNlVHlwZSAmJiB0eXBlICE9PSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OKSB7XG4gICAgICBzZXQobW8sICdjOHlfRmlsdGVyLnR5cGUnLCBkZXZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlVHlwZSAmJiB0eXBlID09PSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OKSB7XG4gICAgICBzZXQobW8sICdkZXZpY2VUeXBlJywgZGV2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGFsLnNvZnR3YXJlVHlwZSkge1xuICAgICAgc2V0KG1vLCAnc29mdHdhcmVUeXBlJywgbW9kYWwuc29mdHdhcmVUeXBlLnNvZnR3YXJlVHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGFsLmNvbmZpZ3VyYXRpb25UeXBlKSB7XG4gICAgICBzZXQobW8sICdjb25maWd1cmF0aW9uVHlwZScsIG1vZGFsLmNvbmZpZ3VyYXRpb25UeXBlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgc2V0KG1vLCAndXJsJywgYmluYXJ5Py51cmwpO1xuICAgIH1cblxuICAgIHJldHVybiBpZFxuICAgICAgPyAodGhpcy5pbnZlbnRvcnkudXBkYXRlKG1vKSBhcyBQcm9taXNlPElSZXN1bHQ8UmVwb3NpdG9yeUNhdGVnb3J5Pj4pXG4gICAgICA6ICh0aGlzLmludmVudG9yeS5jcmVhdGUobW8pIGFzIFByb21pc2U8SVJlc3VsdDxSZXBvc2l0b3J5Q2F0ZWdvcnk+Pik7XG4gIH1cblxuICBjcmVhdGVSZXBvc2l0b3J5QmluYXJ5KFxuICAgIG1vZGFsOiBNb2RhbE1vZGVsLFxuICAgIGJpbmFyeVVSTDogc3RyaW5nLFxuICAgIHR5cGU6IFJlcG9zaXRvcnlUeXBlLFxuICAgIHBhcmVudDogUmVwb3NpdG9yeUNhdGVnb3J5XG4gICk6IFByb21pc2U8SVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT4+IHtcbiAgICBjb25zdCBtbyA9IHRoaXMucHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbCwgYmluYXJ5VVJMLCB0eXBlKTtcblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0NyZWF0ZShtbywgcGFyZW50KSBhcyBQcm9taXNlPFxuICAgICAgSVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT5cbiAgICA+O1xuICB9XG5cbiAgcHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbDogTW9kYWxNb2RlbCwgYmluYXJ5VVJMOiBzdHJpbmcsIHR5cGU6IFJlcG9zaXRvcnlUeXBlKSB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBwYXRjaFZlcnNpb24sIGRlcGVuZGVuY3ksIGM4eV9HbG9iYWwgfSA9IG1vZGFsO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHR5cGU6IFJFUE9TSVRPUllfQklOQVJZX1RZUEVTW3R5cGVdLFxuICAgICAgW3R5cGVdOiB7XG4gICAgICAgIHVybDogYmluYXJ5VVJMXG4gICAgICB9LFxuICAgICAgYzh5X0dsb2JhbFxuICAgIH07XG5cbiAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgc2V0KHJlc3VsdCwgW3R5cGUsICd2ZXJzaW9uJ10sIHBhdGNoVmVyc2lvbik7XG4gICAgICBhc3NpZ24ocmVzdWx0LCB7XG4gICAgICAgIGM4eV9QYXRjaDoge1xuICAgICAgICAgIGRlcGVuZGVuY3k6IGRlcGVuZGVuY3kuYzh5X0Zpcm13YXJlLnZlcnNpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldChyZXN1bHQsIFt0eXBlLCAndmVyc2lvbiddLCB2ZXJzaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGxpbmtCaW5hcnkoXG4gICAgcmVwb3NpdG9yeUJpbmFyeSxcbiAgICBiaW5hcnk6IElNYW5hZ2VkT2JqZWN0QmluYXJ5LFxuICAgIHJlcG9zaXRvcnlFbnRyeT86IFJlcG9zaXRvcnlDYXRlZ29yeVxuICApIHtcbiAgICBpZiAocmVwb3NpdG9yeUJpbmFyeSkge1xuICAgICAgY29uc3QgeyBpZDogcmVwb3NpdG9yeUJpbmFyeUlkIH0gPSByZXBvc2l0b3J5QmluYXJ5O1xuICAgICAgaWYgKGJpbmFyeSkge1xuICAgICAgICBjb25zdCB7IGlkOiBiaW5hcnlJZCB9ID0gYmluYXJ5O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkuY2hpbGRBZGRpdGlvbnNBZGQoYmluYXJ5SWQsIHJlcG9zaXRvcnlCaW5hcnlJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0FkZChiaW5hcnksIHJlcG9zaXRvcnlFbnRyeSk7XG4gIH1cblxuICBjbGVhblVwKG1vc1RvRGVsZXRlOiBJSWRlbnRpZmllZFtdKSB7XG4gICAgbW9zVG9EZWxldGUuZm9yRWFjaChtbyA9PiB7XG4gICAgICBjb25zdCB7IGM4eV9Jc0JpbmFyeSB9ID0gbW87XG4gICAgICBpc1VuZGVmaW5lZChjOHlfSXNCaW5hcnkpID8gdGhpcy5kZWxldGUobW8pIDogdGhpcy5pbnZlbnRvcnlCaW5hcnkuZGVsZXRlKG1vKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShlbnRpdHk6IElJZGVudGlmaWVkKTogUHJvbWlzZTxJUmVzdWx0PG51bGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5LmRlbGV0ZShlbnRpdHksIHsgZm9yY2VDYXNjYWRlOiB0cnVlIH0pO1xuICB9XG5cbiAgZXJyb3JNc2coKSB7XG4gICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnRmFpbGVkIHRvIHNhdmUnKTtcbiAgICB0aGlzLmFsZXJ0LmRhbmdlcihtc2cpO1xuICB9XG5cbiAgZ2V0QmFzZVZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBvZigxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20odGhpcy5saXN0QmFzZVZlcnNpb25zKGVudHJ5LCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KSkucGlwZShcbiAgICAgIG1hcCgoeyBwYWdpbmcgfSkgPT4gcGFnaW5nLnRvdGFsUGFnZXMpXG4gICAgKTtcbiAgfVxuXG4gIGdldEJhc2VWZXJzaW9uRnJvbU1PKG1vOiBSZXBvc2l0b3J5QmluYXJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGNoKG1vKSA/IGdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5JykgOiBnZXQobW8sICdjOHlfRmlybXdhcmUudmVyc2lvbicpO1xuICB9XG5cbiAgaXNQYXRjaChtbzogUmVwb3NpdG9yeUJpbmFyeSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5Jyk7XG4gIH1cblxuICBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCwgYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5pc0xlZ2FjeUVudHJ5KGJhc2VWZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIG9mKDApO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMubGlzdFBhdGNoVmVyc2lvbnMoZW50cnksIGJhc2VWZXJzaW9uLCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KVxuICAgICkucGlwZShtYXAoKHsgcGFnaW5nIH0pID0+IHBhZ2luZy50b3RhbFBhZ2VzKSk7XG4gIH1cblxuICBpc0xlZ2FjeUVudHJ5KGVudHJ5OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKGVudHJ5LnVybCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYWxsIHZlcnNpb25zIChiYXNlIGFuZCBwYXRjaCBvbmVzKSBvZiBnaXZlbiB0b3AgbGV2ZWwgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RBbGxWZXJzaW9ucyhlbnRyeTogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4sIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJhc2VWZXJzaW9uUmVzdWx0TGlzdEZvckxlZ2FjeUVudHJ5KGVudHJ5KTtcbiAgICB9XG5cbiAgICBjb25zdCBWRVJTSU9OX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7fSxcbiAgICAgIF9fb3JkZXJieTogW3sgJ2NyZWF0aW9uVGltZS5kYXRlJzogLTEgfV1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpc3RDaGlsZHJlbihlbnRyeSwgVkVSU0lPTl9GSUxURVJfT1JERVIsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYmFzZSB2ZXJzaW9ucyBvZiBnaXZlbiB0b3AgbGV2ZWwgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RCYXNlVmVyc2lvbnMoZW50cnk6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LCBwYXJhbXMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTGVnYWN5RW50cnkoZW50cnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCYXNlVmVyc2lvblJlc3VsdExpc3RGb3JMZWdhY3lFbnRyeShlbnRyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgTk9fUEFUQ0hfRklMVEVSX09SREVSID0ge1xuICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgX19ub3Q6IHsgX19oYXM6ICdjOHlfUGF0Y2gnIH1cbiAgICAgIH0sXG4gICAgICBfX29yZGVyYnk6IFt7ICdjcmVhdGlvblRpbWUuZGF0ZSc6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIE5PX1BBVENIX0ZJTFRFUl9PUkRFUiwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBwYXRjaCB2ZXJzaW9ucyBvZiBnaXZlbiBiYXNlIHZlcnNpb24gdW5kZXIgdGhlIGVudHJ5LlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBAcGFyYW0gZW50cnkgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkuXG4gICAqIEBwYXJhbSBiYXNlVmVyc2lvbiBCYXNlIHZlcnNpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBxdWVyeSBwYXJhbXMuXG4gICAqL1xuICBsaXN0UGF0Y2hWZXJzaW9ucyhlbnRyeTogSU1hbmFnZWRPYmplY3QsIGJhc2VWZXJzaW9uOiBGaXJtd2FyZUJpbmFyeSB8IHN0cmluZywgcGFyYW1zID0ge30pIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gaXNTdHJpbmcoYmFzZVZlcnNpb24pID8gYmFzZVZlcnNpb24gOiBnZXQoYmFzZVZlcnNpb24sICdjOHlfRmlybXdhcmUudmVyc2lvbicpO1xuICAgIGNvbnN0IFBBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgICdjOHlfUGF0Y2guZGVwZW5kZW5jeSc6IHZlcnNpb25cbiAgICAgIH0sXG4gICAgICBfX29yZGVyYnk6IFt7ICdjcmVhdGlvblRpbWUuZGF0ZSc6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIFBBVENIX0ZJTFRFUl9PUkRFUiwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBwYXRjaCB2ZXJzaW9ucyBvZiBnaXZlbiBiYXNlIHZlcnNpb24gdW5kZXIgdGhlIGVudHJ5IGluY2x1ZGluZyB0aGUgYmFzZSB2ZXJzaW9uLlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBJbiB0ZXJtcyBvZiBsZWdhY3kgYmFzZSB2ZXJzaW9uIHRoZSBlbnRyeSBnZXRzIHRyYW5zZm9ybWVkIHRvIGZpdCB0aGUgbmVlZGVkIGRhdGEgbW9kZWwuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIGJhc2VWZXJzaW9uIEJhc2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RCYXNlVmVyc2lvbkFuZFBhdGNoZXMoZW50cnk6IElNYW5hZ2VkT2JqZWN0LCBiYXNlVmVyc2lvbjogSU1hbmFnZWRPYmplY3QsIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYzh5X0Zpcm13YXJlOiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvbixcbiAgICAgICAgICAgICAgICB1cmw6IGVudHJ5LnVybFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IFBBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIF9fb3I6IHtcbiAgICAgICAgICAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbixcbiAgICAgICAgICAnYzh5X0Zpcm13YXJlLnZlcnNpb24nOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiAxIH0sIHsgJ2M4eV9GaXJtd2FyZS52ZXJzaW9uJzogMSB9XVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGlzdENoaWxkcmVuKGVudHJ5LCBQQVRDSF9GSUxURVJfT1JERVIsIHBhcmFtcyk7XG4gIH1cblxuICBsaXN0Q2hpbGRyZW4oZW50cnk6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LCBmaWx0ZXJzID0ge30sIHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb25zdCBjaGlsZHJlbkZpbHRlcnMgPSB7IF9fYnlncm91cGlkOiBlbnRyeS5pZCB9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZmlsdGVycywgY2hpbGRyZW5GaWx0ZXJzKTtcbiAgICAvLyBGSVhNRTogbmVlZGVkIGJlY2F1c2Ugb2YgaXNzdWUgaW4gZm9yT2YgZGlyZWN0aXZlICguLi4pXG4gICAgcGFyYW1zLndpdGhUb3RhbFBhZ2VzID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkubGlzdFF1ZXJ5KHF1ZXJ5LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYWxsIGl0ZW1zIGZyb20gdGhlIGxpc3Qgc3RhcnRpbmcgd2l0aCB0aGUgcHJvdmlkZWQgcGFnZS5cbiAgICogQHBhcmFtIGZpcnN0UGFnZSBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgbGlzdCB0byBmZXRjaCBhbGwgaXRlbXMgZm9yLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBbGxJdGVtc0Zyb21MaXN0KGZpcnN0UGFnZSkge1xuICAgIGxldCBhbGxJdGVtcztcblxuICAgIGlmICghZmlyc3RQYWdlLnRoZW4pIHtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLmZpcnN0UGFnZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IHBhZ2luZywgZGF0YTogaXRlbXMgfSA9IGF3YWl0IGZpcnN0UGFnZTtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLml0ZW1zXTtcblxuICAgICAgd2hpbGUgKHBhZ2luZyAmJiBwYWdpbmcubmV4dFBhZ2UpIHtcbiAgICAgICAgKHsgcGFnaW5nLCBkYXRhOiBpdGVtcyB9ID0gYXdhaXQgcGFnaW5nLm5leHQoKSk7XG4gICAgICAgIGFsbEl0ZW1zID0gWy4uLmFsbEl0ZW1zLCAuLi5pdGVtc107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgbWFuYWdlZCBvYmplY3QgZm9yIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbi5cbiAgICogQHBhcmFtIG1vIEJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdCB3aXRoIHBhcmVudHMuXG4gICAqL1xuICBnZXRSZXBvc2l0b3J5RW50cnlNTyQobW86IElNYW5hZ2VkT2JqZWN0KTogT2JzZXJ2YWJsZTxJTWFuYWdlZE9iamVjdCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghbW8pIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgICBjb25zdCBbcmVmZXJlbmNlXSA9IGdldChtbywgJ2FkZGl0aW9uUGFyZW50cy5yZWZlcmVuY2VzJyk7XG4gICAgY29uc3QgaWQgPSBnZXQocmVmZXJlbmNlLCAnbWFuYWdlZE9iamVjdC5pZCcpO1xuICAgIHJldHVybiBpZFxuICAgICAgPyBmcm9tKHRoaXMuaW52ZW50b3J5LmRldGFpbChpZCwgeyB3aXRoQ2hpbGRyZW46IGZhbHNlIH0pKS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxuICAgICAgOiBvZih1bmRlZmluZWQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdC5cbiAgICogQHBhcmFtIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudCBEZXZpY2UgcmVwb3NpdG9yeSBmcmFnbWVudC5cbiAgICogQHBhcmFtIHR5cGUgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgdHlwZS5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBvYmplY3Qgd2l0aCBvcHRpb25zOlxuICAgKiAtICoqc2tpcExlZ2FjeSoqIC0gYGJvb2xlYW5gIC0gRXhjbHVkZSBsZWdhY3kgZW50cmllcy5cbiAgICogLSAqKmZpbHRlcnMqKiAtIGBvYmplY3RgIC0gRmlsdGVyIG9iamVjdC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgYXMgaXQgZG9lc24ndCBzdXBwb3J0ICdtaXNzaW5nIHVybCcgY2FzZVxuICAgKi9cbiAgZ2V0UmVwb3NpdG9yeUJpbmFyeU1vQnlWZXJzaW9uKFxuICAgIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudDogRGV2aWNlRmlybXdhcmUgfCBEZXZpY2VTb2Z0d2FyZSxcbiAgICB0eXBlOiBSZXBvc2l0b3J5VHlwZSxcbiAgICB7IHNraXBMZWdhY3kgPSBmYWxzZSwgZmlsdGVycyA9IHt9IH06IHsgc2tpcExlZ2FjeT86IGJvb2xlYW47IGZpbHRlcnM/OiBvYmplY3QgfSA9IHt9XG4gICk6IFByb21pc2U8SU1hbmFnZWRPYmplY3Q+IHtcbiAgICBjb25zdCB7IHZlcnNpb24sIHVybCwgbmFtZSB9ID0gZGV2aWNlUmVwb3NpdG9yeUZyYWdtZW50O1xuICAgIGNvbnN0IHJlcG9zaXRvcnlCaW5hcnlUeXBlID0gUkVQT1NJVE9SWV9CSU5BUllfVFlQRVNbdHlwZV07XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGNvbnN0IG5ld01vZGVsQmFzZVZlcnNpb25RdWVyeSA9IHtcbiAgICAgIFtgJHt0eXBlfS52ZXJzaW9uYF06IHZlcnNpb24sXG4gICAgICBbYCR7dHlwZX0udXJsYF06IHVybCxcbiAgICAgIHR5cGU6IHJlcG9zaXRvcnlCaW5hcnlUeXBlXG4gICAgfTtcbiAgICBjb25zdCBsZWdhY3lWZXJzaW9uUXVlcnkgPSB7IHVybCwgdHlwZSwgbmFtZSB9O1xuICAgIGZpbHRlcnMgPSB7IHdpdGhDaGlsZHJlbjogZmFsc2UsIHdpdGhQYXJlbnRzOiB0cnVlLCAuLi5maWx0ZXJzIH07XG5cbiAgICBpZiAoc2tpcExlZ2FjeSkge1xuICAgICAgcXVlcnkgPSB7XG4gICAgICAgIF9fYW5kOiB7XG4gICAgICAgICAgLi4ubmV3TW9kZWxCYXNlVmVyc2lvblF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICBfX29yOiBbeyBfX2FuZDogeyAuLi5uZXdNb2RlbEJhc2VWZXJzaW9uUXVlcnkgfSB9LCB7IF9fYW5kOiB7IC4uLmxlZ2FjeVZlcnNpb25RdWVyeSB9IH1dXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5saXN0UXVlcnkocXVlcnksIGZpbHRlcnMpLnRoZW4oKHsgZGF0YSB9KSA9PiBoZWFkKGRhdGEpKTtcbiAgfVxuXG4gIGdldEJpbmFyeU5hbWUkKGJpbmFyeVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoIWJpbmFyeVVybCkge1xuICAgICAgcmV0dXJuIG9mKCctLS0nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5hcnlJZCA9IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybChiaW5hcnlVcmwpO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIHJldHVybiBvZihiaW5hcnlVcmwpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmZXIoKCkgPT4gdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpLnBpcGUoXG4gICAgICBtYXAobW8gPT4gbW8ubmFtZSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBpbnZlbnRvcnkgcXVlcnkgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmRcbiAgICogcmVwb3NpdG9yeSBlbnRyaWVzIG9mIHNwZWNpZmllZCB0eXBlIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHByb3ZpZGVkIGRldmljZS5cbiAgICogQHBhcmFtIHJlcG9zaXRvcnlUeXBlIFRoZSB0eXBlIG9mIHJlcG9zaXRvcnkgZW50cmllcyB3aGljaCB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cblxuICBnZXREZXZpY2VUeXBlUXVlcnkocmVwb3NpdG9yeVR5cGU6IFJlcG9zaXRvcnlUeXBlLCBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyB0eXBlOiByZXBvc2l0b3J5VHlwZSB9O1xuICAgIGlmIChyZXBvc2l0b3J5VHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgaWYgKGRldmljZS50eXBlKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHJlc3VsdCwge1xuICAgICAgICAgIF9fb3I6IFt7IGRldmljZVR5cGU6IGRldmljZS50eXBlIH0sIHsgX19ub3Q6IHsgX19oYXM6IGBkZXZpY2VUeXBlYCB9IH1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihyZXN1bHQsIHtcbiAgICAgICAgX19vcjogW1xuICAgICAgICAgIHsgJ2M4eV9GaWx0ZXIudHlwZSc6IGRldmljZS50eXBlIH0sXG4gICAgICAgICAgeyAnYzh5X0ZpbHRlci50eXBlJzogJycgfSxcbiAgICAgICAgICB7IF9fbm90OiB7IF9faGFzOiBgYzh5X0ZpbHRlci50eXBlYCB9IH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gaW52ZW50b3J5IHF1ZXJ5IG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaW5kXG4gICAqIHJlcG9zaXRvcnkgZW50cmllcyBtYXRjaGluZyB0aGUgcHJlZGVmaW5lZCBzb2Z0d2FyZSB0eXBlcyBwcm92aWRlZCBpbiB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHdoaWNoIHRoZSBzb2Z0d2FyZSB0eXBlcyBmaWx0ZXJzIHdpbGwgYmUgYXR0YWNoZWQuIERlZmF1bHQgdmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5nIHJlcG9zaXRvcnkgdHlwZSBzb2Z0d2FyZS5cbiAgICovXG4gIGdldFNvZnR3YXJlVHlwZVF1ZXJ5KGRldmljZTogSU1hbmFnZWRPYmplY3QsIHF1ZXJ5Pzogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyAuLi4ocXVlcnkgfHwge30pLCB0eXBlOiBSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSB9O1xuXG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkU29mdHdhcmVUeXBlcykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIocmVzdWx0LCB7XG4gICAgICAgIF9fb3I6IFtkZXZpY2UuYzh5X1N1cHBvcnRlZFNvZnR3YXJlVHlwZXMubWFwKHR5cGUgPT4gKHsgc29mdHdhcmVUeXBlOiB0eXBlIH0pKV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuIGludmVudG9yeSBxdWVyeSBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBjb25maWd1cmF0aW9uIHJlcG9zaXRvcnkgZW50cmllc1xuICAgKiBtYXRjaGluZyB0aGUgdHlwZSBvZiBwcm92aWRlZCBkZXZpY2UgYW5kIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSBlbnRyaWVzIHdpbGwgYmUgcXVlcmllZCB3aXRoIHRoZSBnZW5lcmF0ZWQgcXVlcnkuXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uVHlwZSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nKTogb2JqZWN0IHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0RGV2aWNlVHlwZVF1ZXJ5KFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04sIGRldmljZSk7XG4gICAgcmV0dXJuIHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHF1ZXJ5LCB7XG4gICAgICBfX29yOiBbXG4gICAgICAgIHsgY29uZmlndXJhdGlvblR5cGUgfSxcbiAgICAgICAgeyBjb25maWd1cmF0aW9uVHlwZTogJycgfSxcbiAgICAgICAgeyBfX25vdDogeyBfX2hhczogYGNvbmZpZ3VyYXRpb25UeXBlYCB9IH1cbiAgICAgIF1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNvZnR3YXJlIGluc3RhbGxlZCBpbiB0aGUgZGV2aWNlIGluIHRoZSB1bmlmb3JtIGZvcm1hdC5cbiAgICogU3VwcG9ydHMgYzh5X1NvZnR3YXJlTGlzdCBhbmQgYzh5X1NvZnR3YXJlIGZyYWdtZW50cy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIHdob3NlIHNvZnR3YXJlIGxpc3Qgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKi9cbiAgZ2V0RGV2aWNlU29mdHdhcmVMaXN0KGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBEZXZpY2VTb2Z0d2FyZVtdIHtcbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSkge1xuICAgICAgcmV0dXJuIF9tYXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSwgKHZlcnNpb24sIG5hbWUpID0+ICh7IG5hbWUsIHZlcnNpb24gfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBsaXN0IG9mIGNoYW5nZXMsIGFuZCBzZW5kcyBpdCB0byB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2Ugd2hpY2ggdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGFuZCBzZW50IHRvLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgc29mdHdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjaGFuZ2VzLlxuICAgKiBSZXR1cm5lZCBvcGVyYXRpb24gdHlwZSBkZXBlbmRzIG9uIGRldmljZSdzIHN1cHBvcnRlZCBvcGVyYXRpb25zLlxuICAgKiBTdXBwb3J0cyBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIGFuZCBjOHlfU29mdHdhcmUgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbjogSU9wZXJhdGlvbiA9IHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYEFwcGx5IHNvZnR3YXJlIGNoYW5nZXM6ICR7Y2hhbmdlc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIGNoYW5nZSA9PlxuICAgICAgICAgICAgYCR7Y2hhbmdlLmFjdGlvbn0gXCIke2NoYW5nZS5uYW1lfVwiJHtcbiAgICAgICAgICAgICAgY2hhbmdlLnZlcnNpb24gPyBgICh2ZXJzaW9uOiAke2NoYW5nZS52ZXJzaW9ufSlgIDogJydcbiAgICAgICAgICAgIH1gXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgIH07XG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlVXBkYXRlJykpIHtcbiAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUgPSAoY2xvbmVEZWVwKGNoYW5nZXMpIHx8IFtdKS5tYXAoY2hhbmdlID0+XG4gICAgICAgIG9taXRCeShjaGFuZ2UsIGlzTmlsKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlTGlzdCcpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCA9IGNsb25lRGVlcChcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRDdXJyZW50U29mdHdhcmUoZGV2aWNlLCAnYzh5X1NvZnR3YXJlTGlzdCcsIFtdKVxuICAgICAgKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZTogRGV2aWNlU29mdHdhcmUgPSBwaWNrKG9taXRCeShjaGFuZ2UsIGlzTmlsKSwgW1xuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgJ3NvZnR3YXJlVHlwZSdcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICAgIHJlbW92ZShvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBjb25zdCBzb2Z0d2FyZUl0ZW1Ub1VwZGF0ZUlkeCA9IG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5uYW1lID09PSBjaGFuZ2UubmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBzb2Z0d2FyZVxuICAgICAgICAgICAgb3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZUxpc3Quc3BsaWNlKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4LCAxLCBkZXZpY2VTb2Z0d2FyZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc3RhbGwgc29mdHdhcmVcbiAgICAgICAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LnB1c2goZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChkZXZpY2UuYzh5X1N1cHBvcnRlZE9wZXJhdGlvbnMuaW5jbHVkZXMoJ2M4eV9Tb2Z0d2FyZScpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlID0gY2xvbmVEZWVwKGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZScsIHt9KSk7XG4gICAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZS5hY3Rpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgZGVsZXRlIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVbY2hhbmdlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlW2NoYW5nZS5uYW1lXSA9IGNoYW5nZS52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgbGlzdCBvZiBkZXZpY2Ugc29mdHdhcmUgY2hhbmdlcyBmcm9tIGdpdmVuIG9wZXJhdGlvbiBpbiB0aGUgY29udGV4dCBvZiBnaXZlbiBkZXZpY2UuXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBmcm9tIHdoaWNoIHRoZSBsaXN0IHNob3VsZCBiZSBleHRyYWN0ZWQuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIHRhcmdldCBkZXZpY2Ugb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21PcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uLFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPiB7XG4gICAgaWYgKG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAob3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZVVwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlU29mdHdhcmVDaGFuZ2VzRnJvbVNvZnR3YXJlTGlzdE9wZXJhdGlvbihvcGVyYXRpb24sIGRldmljZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VTb2Z0d2FyZUNoYW5nZXNGcm9tU29mdHdhcmVPcGVyYXRpb24ob3BlcmF0aW9uLCBkZXZpY2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBmaXJtd2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBzZWxlY3RlZCByZXBvc2l0b3J5IGJpbmFyeSwgYW5kIHNlbmRzIGl0IHRvIHRoZSBkZXZpY2UuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB3aGljaCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYW5kIHNlbnQgdG8uXG4gICAqIEBwYXJhbSBzZWxlY3RlZE9wdGlvbiBUaGUgc2VsZWN0ZWQgcmVwb3NpdG9yeSBiaW5hcnkgb3B0aW9uLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRmlybXdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBzZWxlY3RlZE9wdGlvbjogU2VsZWN0ZWRSZXBvc2l0b3J5QmluYXJ5XG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZ2V0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBzZWxlY3RlZE9wdGlvbik7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLm9wZXJhdGlvbi5jcmVhdGUob3BlcmF0aW9uKSkuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGZpcm13YXJlIHVwZGF0ZSBvcGVyYXRpb24gZm9yIGdpdmVuIGRldmljZSBhbmQgc2VsZWN0ZWQgdmVyc2lvbi5cbiAgICogU3VwcG9ydHMgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRPcHRpb24gU2VsZWN0ZWQgZmlybXdhcmUgdmVyc2lvbi5cbiAgICovXG4gIGdldEZpcm13YXJlVXBkYXRlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgc2VsZWN0ZWRPcHRpb246IFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBkZWxldGUgc2VsZWN0ZWRPcHRpb24uaWQ7XG5cbiAgICBjb25zdCBvcGVyYXRpb246IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGBVcGRhdGUgZmlybXdhcmUgdG86IFwiJHtzZWxlY3RlZE9wdGlvbi5uYW1lfVwiJHtcbiAgICAgICAgc2VsZWN0ZWRPcHRpb24udmVyc2lvbiA/IGAgKHZlcnNpb246ICR7c2VsZWN0ZWRPcHRpb24udmVyc2lvbn0pYCA6ICcnXG4gICAgICB9YCxcbiAgICAgIGM4eV9GaXJtd2FyZTogeyAuLi5zZWxlY3RlZE9wdGlvbiB9XG4gICAgfTtcblxuICAgIHJldHVybiBvcGVyYXRpb247XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgdXBsb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGlzTGVnYWN5ICBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXRVcGxvYWRDb25maWd1cmF0aW9uRmlsZU9wZXJhdGlvbihcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbmZpZ3VyYXRpb25UeXBlOiBzdHJpbmcsXG4gICAgaXNMZWdhY3kgPSBmYWxzZVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBpZiAoaXNMZWdhY3kpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmV0cmlldmUgY29uZmlndXJhdGlvbiBzbmFwc2hvdCBmcm9tIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9VcGxvYWRDb25maWdGaWxlOiB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFJldHJpZXZlICR7Y29uZmlndXJhdGlvblR5cGV9IGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZnJvbSBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X1VwbG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgY29uZmlndXJhdGlvbiBmaWxlIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgdXJsIG9mIGEgYmluYXJ5IHRvIGJlIGRvd25sb2FkZWQuXG4gICAqIEBwYXJhbSBpc0xlZ2FjeSBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXREb3dubG9hZENvbmZpZ3VyYXRpb25GaWxlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgY29uZmlndXJhdGlvblR5cGU6IHN0cmluZyxcbiAgICBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICAgIGlzTGVnYWN5ID0gZmFsc2VcbiAgKTogSU9wZXJhdGlvbiB7XG4gICAgaWYgKGlzTGVnYWN5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IHRvIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9Eb3dubG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgICBjOHlfQ29uZmlndXJhdGlvbkR1bXA6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWdTbmFwc2hvdC5pZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IG9mIGNvbmZpZ3VyYXRpb24gdHlwZSAke2NvbmZpZ3VyYXRpb25UeXBlfSB0byBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X0Rvd25sb2FkQ29uZmlnRmlsZToge1xuICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgZmlybXdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSBkZXZpY2VJZCBUaGUgSUQgb2YgdGhlIGRldmljZSB0byBmaW5kIGFuIG9wZXJhdGlvbiBmb3IuXG4gICAqL1xuICBhc3luYyBnZXRMYXN0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLFxuICAgICAgcmV2ZXJ0OiB0cnVlLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oW3sgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X0Zpcm13YXJlJyB9XSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UuXG4gICAqIExvb2tzIGZvciBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIG9yIGM4eV9Tb2Z0d2FyZSBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdFNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uKGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPElPcGVyYXRpb24+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBkYXRlRnJvbTogbmV3IERhdGUoMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAxXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXRlc3RNYXRjaGluZ09wZXJhdGlvbihbXG4gICAgICB7IC4uLmZpbHRlcnMsIGZyYWdtZW50VHlwZTogJ2M4eV9Tb2Z0d2FyZVVwZGF0ZScgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlTGlzdCcgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciB0aGUgbGlzdCBvZiBmaWx0ZXJzIGFuZCBxdWVyaWVzIHRoZSBvcGVyYXRpb25zLlxuICAgKiBJZiBhIHF1ZXJ5IHJldHVybnMgYXQgbGVhc3Qgb25lIG9wZXJhdGlvbiwgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLlxuICAgKiBPdGhlcndpc2UgdGhlIG5leHQgcXVlcnkgd2lsbCBiZSBwZXJmb3JtZWQuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oZmlsdGVyc0xpc3Q6IGFueVtdKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgbGV0IG1hdGNoaW5nT3BlcmF0aW9uID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZmlsdGVycyBvZiBmaWx0ZXJzTGlzdCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID0gb3BlcmF0aW9uc1swXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGxpc3Qgb2YgZmlsdGVycyBhbmQgcXVlcmllcyB0aGUgb3BlcmF0aW9ucy5cbiAgICogSXQgY29tcGFyZXMgdGhlIG9wZXJhdGlvbnMgcmV0cmlldmVkIGJ5IHRoZSBxdWVyaWVzIGJ5ICdjcmVhdGlvblRpbWUnXG4gICAqIGFuZCByZXR1cm4gdGhlIGxhdGVzdCBvbmUuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldExhdGVzdE1hdGNoaW5nT3BlcmF0aW9uKGZpbHRlcnNMaXN0OiBhbnlbXSk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGxldCBtYXRjaGluZ09wZXJhdGlvbjogSU9wZXJhdGlvbiA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlcnMgb2YgZmlsdGVyc0xpc3QpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbikge1xuICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID1cbiAgICAgICAgICAgIG5ldyBEYXRlKG1hdGNoaW5nT3BlcmF0aW9uLmNyZWF0aW9uVGltZSkuZ2V0VGltZSgpIDxcbiAgICAgICAgICAgIG5ldyBEYXRlKG9wZXJhdGlvbnNbMF0uY3JlYXRpb25UaW1lKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgPyBvcGVyYXRpb25zWzBdXG4gICAgICAgICAgICAgIDogbWF0Y2hpbmdPcGVyYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0Y2hpbmdPcGVyYXRpb24gPSBvcGVyYXRpb25zWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIG9wZXJhdGlvbiBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIGl0cyBwcm9ncmVzcy5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gY3JlYXRlIGFuZCB0cmFjay5cbiAgICovXG4gIGNyZWF0ZU9ic2VydmVkT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5waXBlKFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKGNyZWF0ZWRPcGVyYXRpb24gPT4gdGhpcy5vYnNlcnZlT3BlcmF0aW9uKGNyZWF0ZWRPcGVyYXRpb24pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIHByb2dyZXNzIG9mIGdpdmVuIG9wZXJhdGlvbi5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gYmUgb2JzZXJ2ZWQuXG4gICAqL1xuICBvYnNlcnZlT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9ic2VydmVkT3BlcmF0aW9uJCA9IG9mKG9wZXJhdGlvbik7XG4gICAgY29uc3Qgb3BlcmF0aW9uVXBkYXRlcyQgPSBvYnNlcnZlZE9wZXJhdGlvbiQucGlwZShcbiAgICAgIHN3aXRjaE1hcChvYnNlcnZlZE9wZXJhdGlvbiA9PiB0aGlzLm9wZXJhdGlvblJlYWx0aW1lLm9uQWxsJChvYnNlcnZlZE9wZXJhdGlvbi5kZXZpY2VJZCkpLFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSBhcyBJT3BlcmF0aW9uKSxcbiAgICAgIHdpdGhMYXRlc3RGcm9tKG9ic2VydmVkT3BlcmF0aW9uJCksXG4gICAgICBmaWx0ZXIoKFtvcGVyYXRpb25VcGRhdGUsIG9ic2VydmVkT3BlcmF0aW9uXSkgPT4gb3BlcmF0aW9uVXBkYXRlLmlkID09PSBvYnNlcnZlZE9wZXJhdGlvbi5pZCksXG4gICAgICBzd2l0Y2hNYXAoKFtvcGVyYXRpb25VcGRhdGVdKSA9PiB7XG4gICAgICAgIGlmIChvcGVyYXRpb25VcGRhdGUuc3RhdHVzID09PSBPcGVyYXRpb25TdGF0dXMuRkFJTEVEKSB7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3Iob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Yob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVdoaWxlKG9wZXJhdGlvblVwZGF0ZSA9PiBvcGVyYXRpb25VcGRhdGUuc3RhdHVzICE9PSBPcGVyYXRpb25TdGF0dXMuU1VDQ0VTU0ZVTCwgdHJ1ZSlcbiAgICApO1xuICAgIHJldHVybiBtZXJnZShvYnNlcnZlZE9wZXJhdGlvbiQsIG9wZXJhdGlvblVwZGF0ZXMkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2luZ2xlIGV2ZW50IHdpdGggbGF0ZXN0IGNyZWF0aW9uVGltZSBmb3IgdGhlIGdpdmVuIGRldmljZSBJZCBhbmQgZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBldmVudHMgc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUuXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RDb25maWd1cmF0aW9uRXZlbnQoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICB0eXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJRXZlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBldmVudEZpbHRlcjogb2JqZWN0ID0ge1xuICAgICAgc291cmNlOiBkZXZpY2VJZCxcbiAgICAgIHR5cGUsXG4gICAgICBkYXRlRnJvbTogdGhpcy5kYXRlRnJvbS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiB0aGlzLmRhdGVUby50b0lTT1N0cmluZygpLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmV2ZW50Lmxpc3QoZXZlbnRGaWx0ZXIpO1xuICAgIHJldHVybiBkYXRhWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBkZXZpY2UgSWQsIGFuZCBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25UeXBlIE9wZXJhdGlvbiB0eXBlIGZyYWdtZW50LlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnRmlsZU9wZXJhdGlvbkxpc3QoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBvcGVyYXRpb25UeXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJT3BlcmF0aW9uW10+IHtcbiAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXI6IG9iamVjdCA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZnJhZ21lbnRUeXBlOiBvcGVyYXRpb25UeXBlLFxuICAgICAgZGF0ZUZyb206IHRoaXMuZGF0ZUZyb20udG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogdGhpcy5kYXRlVG8udG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAyMDAwXG4gICAgfTtcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5vcGVyYXRpb24ubGlzdChvcGVyYXRpb25GaWx0ZXIpKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbGF0ZXN0IHVwbG9hZGVkIGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZm9yIHRoZSBnaXZlbiBkZXZpY2UsIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gc25hcHNob3Qgd2FzIHVwbG9hZGVkLlxuICAgKiBAcGFyYW0gY29uZmlndXJhdGlvblR5cGUgU2VsZWN0ZWQgY29uZmlndXJhdGlvbiB0eXBlLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnU25hcHNob3QoXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nXG4gICk6IFByb21pc2U8Q29uZmlndXJhdGlvblNuYXBzaG90IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXZlbnQ6IElFdmVudCA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkV2ZW50KGRldmljZS5pZCwgY29uZmlndXJhdGlvblR5cGUpO1xuICAgIGxldCBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90O1xuICAgIGlmIChldmVudCkge1xuICAgICAgY29uZmlnU25hcHNob3QgPSB7XG4gICAgICAgIHRpbWU6IGV2ZW50LnRpbWUsXG4gICAgICAgIG5hbWU6IGV2ZW50LnRleHQsXG4gICAgICAgIGRldmljZVR5cGU6IGRldmljZS50eXBlLFxuICAgICAgICBjb25maWd1cmF0aW9uVHlwZVxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZ1NuYXBzaG90LmJpbmFyeSA9IGF3YWl0IChhd2FpdCB0aGlzLmV2ZW50QmluYXJ5LmRvd25sb2FkKGV2ZW50KSkudGV4dCgpO1xuICAgICAgICBpZiAoZXZlbnQuYzh5X0lzQmluYXJ5KSB7XG4gICAgICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5VHlwZSA9IGV2ZW50LmM4eV9Jc0JpbmFyeS50eXBlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBjb25zdCBtc2cgPSBnZXR0ZXh0KCdDb3VsZCBub3QgZ2V0IHRoZSBiaW5hcnkuJyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWdTbmFwc2hvdDtcbiAgfVxuXG4gIGFzeW5jIGdldExlZ2FjeUNvbmZpZ1NuYXBzaG90KGRldmljZUlkKSB7XG4gICAgbGV0IGNvbmZpZ1NuYXBzaG90OiBDb25maWd1cmF0aW9uU25hcHNob3Q7XG4gICAgbGV0IG1vO1xuICAgIGNvbnN0IGRldmljZSA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoZGV2aWNlSWQsIHsgd2l0aENoaWxkcmVuOiBmYWxzZSB9KSkuZGF0YTtcbiAgICBjb25zdCBzbmFwc2hvdElkID0gZGV2aWNlLmM4eV9Db25maWd1cmF0aW9uRHVtcCAmJiBkZXZpY2UuYzh5X0NvbmZpZ3VyYXRpb25EdW1wLmlkO1xuICAgIGlmICghc25hcHNob3RJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBtbyA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoc25hcHNob3RJZCkpLmRhdGE7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgaWYgKG1vKSB7XG4gICAgICBjb25maWdTbmFwc2hvdCA9IHtcbiAgICAgICAgdGltZTogbW8uY3JlYXRpb25UaW1lLFxuICAgICAgICBuYW1lOiBtby5uYW1lXG4gICAgICB9O1xuICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5ID0gYXdhaXQgdGhpcy5nZXRCaW5hcnlUZXh0KG1vLnVybCwgeyBhbGxvd0V4dGVybmFsOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1NuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0IGFzIHRleHQuXG4gICAqIEBwYXJhbSBiaW5hcnlVcmwgVGhlIFVSTCB0byBmaW5kIGJpbmFyeVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb2JqZWN0IHdpdGggYWRkaXRpb25hbCBvcHRpb25zOlxuICAgKiAtICoqYWxsb3dFeHRlcm5hbCoqIC0gYGJvb2xlYW5gIC0gYWxsb3dzIGRvd25sb2FkaW5nIGV4dGVybmFsIGJpbmFyeSBmaWxlXG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgYXN5bmMgZ2V0QmluYXJ5VGV4dChcbiAgICBiaW5hcnlVcmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGFsbG93RXh0ZXJuYWw6IGJvb2xlYW47IG5vQWxlcnRzPzogYm9vbGVhbiB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIGlmIChvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJpbmFyeSBvYmplY3QgYXMgRmlsZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKiphbGxvd0V4dGVybmFsKiogLSBgYm9vbGVhbmAgLSBhbGxvd3MgZG93bmxvYWRpbmcgZXh0ZXJuYWwgYmluYXJ5IGZpbGVcbiAgICovXG4gIGFzeW5jIGdldEJpbmFyeUZpbGUoYmluYXJ5VXJsOiBzdHJpbmcsIG9wdGlvbnM6IHsgYWxsb3dFeHRlcm5hbDogYm9vbGVhbiB9KTogUHJvbWlzZTxGaWxlPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBpZiAoIWJpbmFyeUlkICYmICFvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBAVE9ETzogbm90ZSB0aGF0IGl0IGRvZXNuJ3Qgc29sdmUgaXNzdWUgd2l0aCBleHRlcm5hbCBiaW5hcnkgaGVyZSwgc3VjaCB1cmwgd29uJ3QgaGF2ZSBiaW5hcnlJZCwgc28gd2Ugd29uJ3Qga25vdyB0aGUgbmFtZSBvciBjb250ZW50VHlwZSB0byB1c2UgaW4gRmlsZSBjb25zdHJ1Y3RvciwgbGV0J3MgYWRkIGEgQEZJWE1FIGNvbW1lbnQgZm9yIG5vdz9cbiAgICBjb25zdCB7IG5hbWUsIGNvbnRlbnRUeXBlIH0gPSAoYXdhaXQgdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKSkuZGF0YTtcbiAgICBjb25zdCByZXMgPSAhIWJpbmFyeUlkXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZClcbiAgICAgIDogYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCk7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gbmV3IEZpbGUoW2FycmF5QnVmZmVyXSwgbmFtZSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXN0IGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0NvbmZpZ3VyYXRpb24gYW5kIGM4eV9TZW5kQ29uZmlndXJhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdENvbmZpZ1VwZGF0ZU9wZXJhdGlvbihkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZGF0ZUZyb206IG5ldyBEYXRlKDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBkYXRlVG86IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXZlcnQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGF0ZXN0TWF0Y2hpbmdPcGVyYXRpb24oW1xuICAgICAgeyAuLi5maWx0ZXJzLCBmcmFnbWVudFR5cGU6ICdjOHlfQ29uZmlndXJhdGlvbicgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NlbmRDb25maWd1cmF0aW9uJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBpdHMgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBTdXBwb3J0cyBjOHlfU2VuZENvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqL1xuICBjcmVhdGVUZXh0QmFzZWRDb25maWd1cmF0aW9uUmVsb2FkT3BlcmF0aW9uKGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdSZXF1ZXN0ZWQgY3VycmVudCBjb25maWd1cmF0aW9uJyksXG4gICAgICBjOHlfU2VuZENvbmZpZ3VyYXRpb246IHt9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogU3VwcG9ydHMgYzh5X0NvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gd2hpY2ggd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIG9uZS5cbiAgICovXG4gIGNyZWF0ZVRleHRCYXNlZENvbmZpZ3VyYXRpb25VcGRhdGVPcGVyYXRpb24oZGV2aWNlOiBJTWFuYWdlZE9iamVjdCwgY29uZmlnOiBzdHJpbmcpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIHVwZGF0ZScpLFxuICAgICAgYzh5X0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgY29uZmlnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEJpbmFyeShiaW5hcnlJZDogSWRSZWZlcmVuY2UpOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kb3dubG9hZChiaW5hcnlJZCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGF2YWlsYWJsZSBzbmFwc2hvdHMgZnJvbSB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgc25hcHNob3RzIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICovXG4gIGFzeW5jIGdldFNuYXBzaG90c0Zyb21SZXBvc2l0b3J5KGRldmljZSwgY29uZmlndXJhdGlvblR5cGUpIHtcbiAgICBjb25zdCBzZWFyY2hRdWVyeSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2UsIGNvbmZpZ3VyYXRpb25UeXBlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxpc3RSZXBvc2l0b3J5RW50cmllcyhSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OLCB7XG4gICAgICBxdWVyeTogc2VhcmNoUXVlcnksXG4gICAgICBwYXJhbXM6IHsgcGFnZVNpemU6IDEwMCB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRldmljZSBhbHJlYWR5IGhhdmUgYSBnaXZlbiBzb2Z0d2FyZSBpbnN0YWxsZWRcbiAgICogQHBhcmFtIGRldmljZUlkIElkIG9mIHRoZSBkZXZpY2UgdG8gYmUgY2hlY2tlZFxuICAgKiBAcGFyYW0gc29mdHdhcmUgVGhlIHNvZnR3YXJlIHRvIGJlIGNoZWNrZWRcbiAgICovXG4gIGFzeW5jIGlzU29mdHdhcmVJbnN0YWxsZWRPbkRldmljZShcbiAgICBkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHNvZnR3YXJlOiBEZXZpY2VTb2Z0d2FyZVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlLmlzQVNNQXZhaWxhYmxlKCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlGaWx0ZXIgPSB7IGRldmljZUlkIH07XG4gICAgaWYgKHNvZnR3YXJlPy5uYW1lKSB7XG4gICAgICBzZXQocXVlcnlGaWx0ZXIsICduYW1lJywgc29mdHdhcmUubmFtZSk7XG4gICAgfVxuICAgIGlmIChzb2Z0d2FyZT8udmVyc2lvbikge1xuICAgICAgc2V0KHF1ZXJ5RmlsdGVyLCAndmVyc2lvbicsIHNvZnR3YXJlLnZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KHF1ZXJ5RmlsdGVyKS50aGVuKHJlc3VsdCA9PiAhIXJlc3VsdC5kYXRhPy5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0LlxuICAgKiBAcGFyYW0gYmluYXJ5SWQgYmluYXJ5IElEXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRJbnRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeUlkOiBJZFJlZmVyZW5jZSxcbiAgICBvcHRpb25zOiB7IG5vQWxlcnRzPzogYm9vbGVhbiB9ID0ge31cbiAgKTogUHJvbWlzZTxJRmV0Y2hSZXNwb25zZT4ge1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmRvd25sb2FkKGJpbmFyeUlkKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKCFvcHRpb25zLm5vQWxlcnRzKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgICAgdGhpcy5hbGVydC5kYW5nZXIobXNnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYmluYXJ5IG9iamVjdC5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeVVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgbm9BbGVydHM/OiBib29sZWFuIH0gPSB7fVxuICApOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmV0Y2hSZXMgPSBhd2FpdCBmZXRjaChiaW5hcnlVcmwpO1xuICAgICAgaWYgKGZldGNoUmVzLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgdGhyb3cgcmVzO1xuICAgICAgfVxuICAgICAgcmVzID0gZmV0Y2hSZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICBpZiAoIW9wdGlvbnMubm9BbGVydHMpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnQ291bGQgbm90IGdldCB0aGUgZXh0ZXJuYWwgYmluYXJ5Jyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGdldEJhc2VWZXJzaW9uUmVzdWx0TGlzdEZvckxlZ2FjeUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICByZXM6IHt9IGFzIElGZXRjaFJlc3BvbnNlLFxuICAgICAgZGF0YTogW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgW2VudHJ5LnR5cGVdOiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBlbnRyeS51cmxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9IGFzIElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21Tb2Z0d2FyZUxpc3RPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uLFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPiB7XG4gICAgY29uc3QgY2hhbmdlczogRGV2aWNlU29mdHdhcmVDaGFuZ2VbXSA9IFtdO1xuICAgIGNvbnN0IGRldmljZVNvZnR3YXJlTGlzdCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCBbXSk7XG4gICAgZm9yRWFjaChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgb3BlcmF0aW9uU29mdHdhcmUgPT4ge1xuICAgICAgY29uc3QgZGV2aWNlU29mdHdhcmUgPSBmaW5kKGRldmljZVNvZnR3YXJlTGlzdCwgeyBuYW1lOiBvcGVyYXRpb25Tb2Z0d2FyZS5uYW1lIH0pO1xuICAgICAgaWYgKFxuICAgICAgICAob3BlcmF0aW9uU29mdHdhcmUgJiYgb3BlcmF0aW9uU29mdHdhcmUudmVyc2lvbikgIT09XG4gICAgICAgIChkZXZpY2VTb2Z0d2FyZSAmJiBkZXZpY2VTb2Z0d2FyZS52ZXJzaW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uU29mdHdhcmUsXG4gICAgICAgICAgYWN0aW9uOiAnaW5zdGFsbCdcbiAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yRWFjaChkZXZpY2VTb2Z0d2FyZUxpc3QsIGRldmljZVNvZnR3YXJlID0+IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvblNvZnR3YXJlID0gZmluZChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgeyBuYW1lOiBkZXZpY2VTb2Z0d2FyZS5uYW1lIH0pO1xuICAgICAgaWYgKFxuICAgICAgICAob3BlcmF0aW9uU29mdHdhcmUgJiYgb3BlcmF0aW9uU29mdHdhcmUudmVyc2lvbikgIT09XG4gICAgICAgIChkZXZpY2VTb2Z0d2FyZSAmJiBkZXZpY2VTb2Z0d2FyZS52ZXJzaW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxDaGFuZ2UgPSBjaGFuZ2VzLmZpbmQoXG4gICAgICAgICAgY2hhbmdlID0+IGRldmljZVNvZnR3YXJlLm5hbWUgPT09IGNoYW5nZS5uYW1lICYmIGNoYW5nZS5hY3Rpb24gPT09ICdpbnN0YWxsJ1xuICAgICAgICApO1xuICAgICAgICAvLyBjaGVjayB0aGF0IHRoaXMgc29mdHdhcmUgaXMgbm90IGFuIGluc3RhbGxhdGlvbiBzb2Z0d2FyZSBjaGFuZ2UsIG90aGVyd2lzZSBpdCdzIGFuIHVwZGF0ZSBhbmQgbm90IGEgcmVtb3ZhbFxuICAgICAgICBpZiAoIWluc3RhbGxDaGFuZ2UpIHtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgLi4uZGV2aWNlU29mdHdhcmUsXG4gICAgICAgICAgICBhY3Rpb246ICdkZWxldGUnXG4gICAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0RGV2aWNlU29mdHdhcmVDaGFuZ2VzRnJvbVNvZnR3YXJlT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogSU9wZXJhdGlvbixcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0XG4gICk6IFByb21pc2U8RGV2aWNlU29mdHdhcmVDaGFuZ2VbXT4ge1xuICAgIGNvbnN0IGNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW10gPSBbXTtcbiAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZScsIHt9KTtcbiAgICBmb3JFYWNoKGRldmljZVNvZnR3YXJlLCAoZGV2aWNlU29mdHdhcmVWZXJzaW9uLCBkZXZpY2VTb2Z0d2FyZU5hbWUpID0+IHtcbiAgICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlW2RldmljZVNvZnR3YXJlTmFtZV0gIT09IGRldmljZVNvZnR3YXJlVmVyc2lvbikge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGRldmljZVNvZnR3YXJlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBkZXZpY2VTb2Z0d2FyZVZlcnNpb24sXG4gICAgICAgICAgYWN0aW9uOiAnZGVsZXRlJ1xuICAgICAgICB9IGFzIERldmljZVNvZnR3YXJlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3JFYWNoKG9wZXJhdGlvbi5jOHlfU29mdHdhcmUsIChvcGVyYXRpb25Tb2Z0d2FyZVZlcnNpb24sIG9wZXJhdGlvblNvZnR3YXJlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZGV2aWNlU29mdHdhcmVWZXJzaW9uID0gZGV2aWNlU29mdHdhcmUgJiYgZGV2aWNlU29mdHdhcmVbb3BlcmF0aW9uU29mdHdhcmVOYW1lXTtcbiAgICAgIGlmIChkZXZpY2VTb2Z0d2FyZVZlcnNpb24gIT09IG9wZXJhdGlvblNvZnR3YXJlVmVyc2lvbikge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IG9wZXJhdGlvblNvZnR3YXJlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBvcGVyYXRpb25Tb2Z0d2FyZVZlcnNpb24sXG4gICAgICAgICAgYWN0aW9uOiAnaW5zdGFsbCdcbiAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEN1cnJlbnRTb2Z0d2FyZShcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIHN3RnJhZ21lbnQ6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IG9iamVjdFxuICApOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IGlzQVNNQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5pc0FTTUF2YWlsYWJsZSgpO1xuICAgIGlmIChpc0FTTUF2YWlsYWJsZSkge1xuICAgICAgbGV0IHNvZnR3YXJlUmVzdWx0TGlzdDogSVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+ID0gYXdhaXQgdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KFxuICAgICAgICB7IGRldmljZUlkOiBkZXZpY2UuaWQsIHBhZ2VTaXplOiAxMDAgfVxuICAgICAgKTtcbiAgICAgIGxldCBsaXN0ID0gKHNvZnR3YXJlUmVzdWx0TGlzdD8uZGF0YSB8fCBbXSkubWFwKHN3ID0+XG4gICAgICAgIHBpY2sob21pdEJ5KHN3LCBpc05pbCksIFsnbmFtZScsICd2ZXJzaW9uJywgJ3VybCcsICdzb2Z0d2FyZVR5cGUnXSlcbiAgICAgICk7XG5cbiAgICAgIHdoaWxlIChzb2Z0d2FyZVJlc3VsdExpc3QucGFnaW5nPy5uZXh0UGFnZSkge1xuICAgICAgICBzb2Z0d2FyZVJlc3VsdExpc3QgPSBhd2FpdCBzb2Z0d2FyZVJlc3VsdExpc3QucGFnaW5nLm5leHQoKTtcbiAgICAgICAgbGlzdCA9IFtcbiAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgIC4uLihzb2Z0d2FyZVJlc3VsdExpc3Q/LmRhdGEgfHwgW10pLm1hcChzdyA9PlxuICAgICAgICAgICAgcGljayhvbWl0Qnkoc3csIGlzTmlsKSwgWyduYW1lJywgJ3ZlcnNpb24nLCAndXJsJywgJ3NvZnR3YXJlVHlwZSddKVxuICAgICAgICAgIClcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGxpc3QgOiB0aGlzLnNvZnR3YXJlTGlzdFRvTGVnYWN5KGxpc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGV2aWNlW3N3RnJhZ21lbnRdIHx8IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNvZnR3YXJlTGlzdFRvTGVnYWN5KGxpc3Q6IElNYW5hZ2VkT2JqZWN0W10pOiBvYmplY3Qge1xuICAgIHJldHVybiAobGlzdCB8fCBbXSkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3Vyci5uYW1lXTogY3Vyci52ZXJzaW9uIH0pLCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEdsb2JhbEZyYWdtZW50KHR5cGU6IFJlcG9zaXRvcnlUeXBlKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdsb2JhbENvbmZpZ1NlcnZpY2UuZ2V0R2xvYmFsUGFyYW0odHlwZSkpID8geyBjOHlfR2xvYmFsOiB7fSB9IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVPdXRkYXRlZEJpbmFyeShuZXdCaW5hcnlVUkwsIG9sZEJpbmFyeVVSTCkge1xuICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5SWQgPSBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21Vcmwob2xkQmluYXJ5VVJMKTtcbiAgICBjb25zdCBuZXdCaW5hcnlJZCA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybChuZXdCaW5hcnlVUkwpO1xuICAgIGlmIChleGlzdGluZ0JpbmFyeUlkICYmIGV4aXN0aW5nQmluYXJ5SWQgIT09IG5ld0JpbmFyeUlkKSB7XG4gICAgICBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kZWxldGUoZXhpc3RpbmdCaW5hcnlJZCk7XG4gICAgfVxuICB9XG59XG4iXX0=
1090
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3NpdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zaGFyZWQvcmVwb3NpdG9yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBT1osc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUloQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFdBQVcsRUFDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsWUFBWSxFQUNaLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsTUFBTSxFQUNOLFNBQVMsRUFDVCxJQUFJLEVBQ0osT0FBTyxFQUNQLEdBQUcsRUFDSCxJQUFJLEVBQ0osS0FBSyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsTUFBTSxFQUNOLElBQUksRUFDSixNQUFNLEVBQ04sR0FBRyxFQUNKLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFRTCx1QkFBdUIsRUFHdkIsY0FBYyxFQUdmLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBRzVCLE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFDVSxTQUEyQixFQUMzQixlQUF1QyxFQUN2QyxT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aW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRXZlbnRCaW5hcnlTZXJ2aWNlLFxuICBFdmVudFNlcnZpY2UsXG4gIElkUmVmZXJlbmNlLFxuICBJRXZlbnQsXG4gIElGZXRjaFJlc3BvbnNlLFxuICBJSWRlbnRpZmllZCxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIElNYW5hZ2VkT2JqZWN0QmluYXJ5LFxuICBJbnZlbnRvcnlCaW5hcnlTZXJ2aWNlLFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBJT3BlcmF0aW9uLFxuICBJUmVzdWx0LFxuICBJUmVzdWx0TGlzdCxcbiAgT3BlcmF0aW9uU2VydmljZSxcbiAgT3BlcmF0aW9uU3RhdHVzLFxuICBRdWVyaWVzVXRpbFxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIGdldHRleHQsXG4gIEdsb2JhbENvbmZpZ1NlcnZpY2UsXG4gIE9wZXJhdGlvblJlYWx0aW1lU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIG1hcCBhcyBfbWFwLFxuICBhc3NpZ24sXG4gIGNsb25lRGVlcCxcbiAgZmluZCxcbiAgZm9yRWFjaCxcbiAgZ2V0LFxuICBoZWFkLFxuICBpc05pbCxcbiAgaXNTdHJpbmcsXG4gIGlzVW5kZWZpbmVkLFxuICBvbWl0QnksXG4gIHBpY2ssXG4gIHJlbW92ZSxcbiAgc2V0XG59IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBkZWZlciwgZnJvbSwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlV2hpbGUsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UgfSBmcm9tICcuL2FkdmFuY2VkLXNvZnR3YXJlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICBEZXZpY2VGaXJtd2FyZSxcbiAgRGV2aWNlU29mdHdhcmUsXG4gIERldmljZVNvZnR3YXJlQ2hhbmdlLFxuICBGaXJtd2FyZUJpbmFyeSxcbiAgRmlybXdhcmVQYXRjaEJpbmFyeSxcbiAgTW9kYWxNb2RlbCxcbiAgUkVQT1NJVE9SWV9CSU5BUllfVFlQRVMsXG4gIFJlcG9zaXRvcnlCaW5hcnksXG4gIFJlcG9zaXRvcnlDYXRlZ29yeSxcbiAgUmVwb3NpdG9yeVR5cGUsXG4gIFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeSxcbiAgU29mdHdhcmVCaW5hcnlcbn0gZnJvbSAnLi9yZXBvc2l0b3J5Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgZGF0ZUZyb20gPSBuZXcgRGF0ZSgwKTtcbiAgcmVhZG9ubHkgZGF0ZVRvID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKTsgLy8gMSBkYXkgaW4gdGhlIGZ1dHVyZVxuICBwcml2YXRlIHF1ZXJpZXNVdGlsOiBRdWVyaWVzVXRpbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeUJpbmFyeTogSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIG9wZXJhdGlvbjogT3BlcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudDogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3BlcmF0aW9uUmVhbHRpbWU6IE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50QmluYXJ5OiBFdmVudEJpbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhZHZhbmNlZFNvZnR3YXJlU2VydmljZTogQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnbG9iYWxDb25maWdTZXJ2aWNlOiBHbG9iYWxDb25maWdTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucXVlcmllc1V0aWwgPSBuZXcgUXVlcmllc1V0aWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyByZXBvc2l0b3J5IGVudHJpZXMgb2YgZ2l2ZW4gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgcmVwb3NpdG9yeSBlbnRyaWVzIHRvIGxpc3QuXG4gICAqIEBwYXJhbSBvcHRpb25zIEV4dHJhIGxpc3Rpbmcgb3B0aW9ucy5cbiAgICovXG4gIGxpc3RSZXBvc2l0b3J5RW50cmllcyhcbiAgICB0eXBlOiBSZXBvc2l0b3J5VHlwZSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgLyoqIEFkZGl0aW9uYWwgcXVlcnkuICovXG4gICAgICBxdWVyeT86IGFueTtcbiAgICAgIC8qKiAoZGVwcmVjYXRlZCAtIHRvIGJlIHJlbW92ZWQpIE9ubHkgaW5jbHVkZSBlbnRyaWVzIHdpdGggbWF0Y2hpbmcgcGFydGlhbCBuYW1lcy4gKi9cbiAgICAgIHBhcnRpYWxOYW1lPzogc3RyaW5nO1xuICAgICAgLyoqIEluY2x1ZGUgZW50cmllcyB3aXRoIG1hdGNoaW5nIHBhcnRpYWwgdGV4dCBpbiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuICovXG4gICAgICBwYXJ0aWFsVGV4dEZpbHRlcj86IHsgcGFydGlhbFRleHQ6IHN0cmluZzsgcHJvcGVydGllczogc3RyaW5nW10gfTtcbiAgICAgIC8qKiBFeGNsdWRlIGxlZ2FjeSBlbnRyaWVzLiAqL1xuICAgICAgc2tpcExlZ2FjeT86IGJvb2xlYW47XG4gICAgICAvKiogRXhjbHVkZSBkZWZhdWx0IG9yZGVyaW5nLiAqL1xuICAgICAgc2tpcERlZmF1bHRPcmRlcj86IGJvb2xlYW47XG4gICAgICAvKiogT3RoZXIgcmVxdWVzdCBwYXJhbXMuICovXG4gICAgICBwYXJhbXM/OiBhbnk7XG4gICAgfVxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0T3JkZXIgPSBbeyBuYW1lOiAxIH1dO1xuICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0geyB0eXBlIH07XG4gICAgY29uc3QgbGVnYWN5RmlsdGVycyA9IHsgX19oYXM6IGB1cmxgIH07XG4gICAgbGV0IGZpbHRlcnMgPSB7fTtcblxuICAgIGxldCBmdWxsUXVlcnkgPSAob3B0aW9ucyAmJiBvcHRpb25zLnF1ZXJ5KSB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMgfHwgKG9wdGlvbnMgJiYgIW9wdGlvbnMuc2tpcERlZmF1bHRPcmRlcikpIHtcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkT3JkZXJieXMoZnVsbFF1ZXJ5LCBkZWZhdWx0T3JkZXIsICdwcmVwZW5kJyk7XG4gICAgfVxuXG4gICAgZnVsbFF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZnVsbFF1ZXJ5LCBkZWZhdWx0RmlsdGVycyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBhcnRpYWxUZXh0RmlsdGVyKSB7XG4gICAgICBjb25zdCB7IHBhcnRpYWxUZXh0LCBwcm9wZXJ0aWVzIH0gPSBvcHRpb25zLnBhcnRpYWxUZXh0RmlsdGVyO1xuICAgICAgY29uc3Qgb3JGaWx0ZXIgPSB7IF9fb3I6IHByb3BlcnRpZXMubWFwKHByb3BlcnR5ID0+ICh7IFtwcm9wZXJ0eV06IGAqJHtwYXJ0aWFsVGV4dH0qYCB9KSkgfTtcbiAgICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKGZ1bGxRdWVyeSwgb3JGaWx0ZXIpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucGFydGlhbE5hbWUpIHtcbiAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlmXG4gICAgICBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihmdWxsUXVlcnksIHsgbmFtZTogYCoke29wdGlvbnMucGFydGlhbE5hbWV9KmAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5za2lwTGVnYWN5KSB7XG4gICAgICBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihmdWxsUXVlcnksIHsgX19ub3Q6IGxlZ2FjeUZpbHRlcnMgfSk7XG4gICAgfVxuXG4gICAgZmlsdGVycyA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkoZnVsbFF1ZXJ5KSxcbiAgICAgIHBhZ2VTaXplOiA1MCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlLFxuICAgICAgLi4uKChvcHRpb25zICYmIG9wdGlvbnMucGFyYW1zKSB8fCB7fSlcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5saXN0KGZpbHRlcnMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGFsOiBNb2RhbE1vZGVsLCB0eXBlOiBSZXBvc2l0b3J5VHlwZSwgbW86IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+ID0ge30pIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUmVwb3NpdG9yeVR5cGUuRklSTVdBUkU6XG4gICAgICBjYXNlIFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZXBvc2l0b3J5T2JqZWN0KG1vZGFsLCB0eXBlKTtcblxuICAgICAgY2FzZSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OOlxuICAgICAgICBPYmplY3QuYXNzaWduKG1vZGFsLCB7XG4gICAgICAgICAgc2VsZWN0ZWQ6IHtcbiAgICAgICAgICAgIGlkOiBtby5pZCxcbiAgICAgICAgICAgIG5hbWU6IG1vZGFsLnZlcnNpb25cbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25UeXBlOiBtb2RhbC5jb25maWd1cmF0aW9uVHlwZSxcbiAgICAgICAgICBuYW1lOiBtb2RhbC52ZXJzaW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghbW9kYWwuZGV2aWNlVHlwZSAmJiBtby5pZCkge1xuICAgICAgICAgIG1vZGFsLmRldmljZVR5cGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9kYWwuc2VsZWN0ZWQgJiYgbW8uaWQpIHtcbiAgICAgICAgICBtb2RhbC5jb25maWd1cmF0aW9uVHlwZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXBvc2l0b3J5T2JqZWN0ID0gdGhpcy5jcmVhdGVSZXBvc2l0b3J5T2JqZWN0KG1vZGFsLCB0eXBlKTtcblxuICAgICAgICBpZiAobW8udXJsKSB7XG4gICAgICAgICAgY29uc3QgbmV3QmluYXJ5VXJsID0gKGF3YWl0IHJlcG9zaXRvcnlPYmplY3QpLnVybDtcbiAgICAgICAgICB0aGlzLnJlbW92ZU91dGRhdGVkQmluYXJ5KG5ld0JpbmFyeVVybCwgbW8udXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXBvc2l0b3J5T2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJlcG9zaXRvcnlPYmplY3QoXG4gICAgbW9kYWw6IE1vZGFsTW9kZWwsXG4gICAgdHlwZTogUmVwb3NpdG9yeVR5cGVcbiAgKTogUHJvbWlzZTxSZXBvc2l0b3J5Q2F0ZWdvcnk+IHtcbiAgICBsZXQgYmluYXJ5OiBJTWFuYWdlZE9iamVjdEJpbmFyeTtcbiAgICBsZXQgYmluYXJ5VVJMOiBzdHJpbmc7XG4gICAgbGV0IHJlcG9zaXRvcnlFbnRyeTogUmVwb3NpdG9yeUNhdGVnb3J5O1xuICAgIGxldCByZXBvc2l0b3J5QmluYXJ5OiBGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5O1xuICAgIGNvbnN0IG1vcyA9IFtdO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGVkOiB7IGlkOiBzZWxlY3RlZElkIH0sXG4gICAgICBiaW5hcnk6IHsgZmlsZSwgdXJsIH1cbiAgICB9ID0gbW9kYWw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdsb2JhbFBhcmFtID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxGcmFnbWVudCh0eXBlKTtcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgKHsgZGF0YTogYmluYXJ5IH0gPSBhd2FpdCB0aGlzLnNhdmVCaW5hcnkoZmlsZSwgZ2xvYmFsUGFyYW0pKTtcbiAgICAgICAgKHsgc2VsZjogYmluYXJ5VVJMIH0gPSBiaW5hcnkpO1xuICAgICAgICBpZiAodHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgICAgIG1vZGFsLmJpbmFyeS51cmwgPSBiaW5hcnlVUkw7XG4gICAgICAgIH1cbiAgICAgICAgbW9zLnB1c2goYmluYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpbmFyeVVSTCA9IHVybDtcbiAgICAgIH1cblxuICAgICAgKHsgZGF0YTogcmVwb3NpdG9yeUVudHJ5IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZU9yVXBkYXRlUmVwb3NpdG9yeUVudHJ5KFxuICAgICAgICB7IC4uLm1vZGFsLCAuLi5nbG9iYWxQYXJhbSB9LFxuICAgICAgICB0eXBlXG4gICAgICApKTtcbiAgICAgIGlmIChpc05pbChzZWxlY3RlZElkKSkge1xuICAgICAgICBtb3MucHVzaChyZXBvc2l0b3J5RW50cnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSAhPT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgICAoeyBkYXRhOiByZXBvc2l0b3J5QmluYXJ5IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVJlcG9zaXRvcnlCaW5hcnkoXG4gICAgICAgICAgeyAuLi5tb2RhbCwgLi4uZ2xvYmFsUGFyYW0gfSxcbiAgICAgICAgICBiaW5hcnlVUkwsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXBvc2l0b3J5RW50cnlcbiAgICAgICAgKSk7XG4gICAgICAgIG1vcy5wdXNoKHJlcG9zaXRvcnlCaW5hcnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxpbmtCaW5hcnkocmVwb3NpdG9yeUJpbmFyeSwgYmluYXJ5LCByZXBvc2l0b3J5RW50cnkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVwb3NpdG9yeUVudHJ5O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNsZWFuVXAobW9zKTtcbiAgICAgIHRoaXMuZXJyb3JNc2coKTtcblxuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBzYXZlQmluYXJ5KGZpbGU6IEZpbGUsIGdsb2JhbDogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4pOiBQcm9taXNlPElSZXN1bHQ8SU1hbmFnZWRPYmplY3RCaW5hcnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5QmluYXJ5LmNyZWF0ZShmaWxlLCBnbG9iYWwpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT3JVcGRhdGVSZXBvc2l0b3J5RW50cnkoXG4gICAgbW9kYWw6IE1vZGFsTW9kZWwsXG4gICAgdHlwZTogUmVwb3NpdG9yeVR5cGVcbiAgKTogUHJvbWlzZTxJUmVzdWx0PFJlcG9zaXRvcnlDYXRlZ29yeT4+IHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZDogeyBpZCwgbmFtZSB9LFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBkZXZpY2VUeXBlLFxuICAgICAgYzh5X0dsb2JhbCxcbiAgICAgIGJpbmFyeVxuICAgIH0gPSBtb2RhbDtcblxuICAgIGNvbnN0IG1vID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICB0eXBlLFxuICAgICAgYzh5X0dsb2JhbFxuICAgIH07XG5cbiAgICBpZiAoZGV2aWNlVHlwZSAmJiB0eXBlICE9PSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OKSB7XG4gICAgICBzZXQobW8sICdjOHlfRmlsdGVyLnR5cGUnLCBkZXZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoKGRldmljZVR5cGUgfHwgaWQpICYmIHR5cGUgPT09IFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04pIHtcbiAgICAgIHNldChtbywgJ2RldmljZVR5cGUnLCBkZXZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAobW9kYWwuc29mdHdhcmVUeXBlKSB7XG4gICAgICBzZXQobW8sICdzb2Z0d2FyZVR5cGUnLCBtb2RhbC5zb2Z0d2FyZVR5cGUuc29mdHdhcmVUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoKG1vZGFsLmNvbmZpZ3VyYXRpb25UeXBlIHx8IGlkKSAmJiB0eXBlID09PSBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OKSB7XG4gICAgICBzZXQobW8sICdjb25maWd1cmF0aW9uVHlwZScsIG1vZGFsLmNvbmZpZ3VyYXRpb25UeXBlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgc2V0KG1vLCAndXJsJywgYmluYXJ5Py51cmwpO1xuICAgIH1cblxuICAgIHJldHVybiBpZFxuICAgICAgPyAodGhpcy5pbnZlbnRvcnkudXBkYXRlKG1vKSBhcyBQcm9taXNlPElSZXN1bHQ8UmVwb3NpdG9yeUNhdGVnb3J5Pj4pXG4gICAgICA6ICh0aGlzLmludmVudG9yeS5jcmVhdGUobW8pIGFzIFByb21pc2U8SVJlc3VsdDxSZXBvc2l0b3J5Q2F0ZWdvcnk+Pik7XG4gIH1cblxuICBjcmVhdGVSZXBvc2l0b3J5QmluYXJ5KFxuICAgIG1vZGFsOiBNb2RhbE1vZGVsLFxuICAgIGJpbmFyeVVSTDogc3RyaW5nLFxuICAgIHR5cGU6IFJlcG9zaXRvcnlUeXBlLFxuICAgIHBhcmVudDogUmVwb3NpdG9yeUNhdGVnb3J5XG4gICk6IFByb21pc2U8SVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT4+IHtcbiAgICBjb25zdCBtbyA9IHRoaXMucHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbCwgYmluYXJ5VVJMLCB0eXBlKTtcblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0NyZWF0ZShtbywgcGFyZW50KSBhcyBQcm9taXNlPFxuICAgICAgSVJlc3VsdDxGaXJtd2FyZUJpbmFyeSB8IFNvZnR3YXJlQmluYXJ5IHwgRmlybXdhcmVQYXRjaEJpbmFyeT5cbiAgICA+O1xuICB9XG5cbiAgcHJlcGFyZVJlcG9zaXRvcnlCaW5hcnlNTyhtb2RhbDogTW9kYWxNb2RlbCwgYmluYXJ5VVJMOiBzdHJpbmcsIHR5cGU6IFJlcG9zaXRvcnlUeXBlKSB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBwYXRjaFZlcnNpb24sIGRlcGVuZGVuY3ksIGM4eV9HbG9iYWwgfSA9IG1vZGFsO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHR5cGU6IFJFUE9TSVRPUllfQklOQVJZX1RZUEVTW3R5cGVdLFxuICAgICAgW3R5cGVdOiB7XG4gICAgICAgIHVybDogYmluYXJ5VVJMXG4gICAgICB9LFxuICAgICAgYzh5X0dsb2JhbFxuICAgIH07XG5cbiAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgc2V0KHJlc3VsdCwgW3R5cGUsICd2ZXJzaW9uJ10sIHBhdGNoVmVyc2lvbik7XG4gICAgICBhc3NpZ24ocmVzdWx0LCB7XG4gICAgICAgIGM4eV9QYXRjaDoge1xuICAgICAgICAgIGRlcGVuZGVuY3k6IGRlcGVuZGVuY3kuYzh5X0Zpcm13YXJlLnZlcnNpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldChyZXN1bHQsIFt0eXBlLCAndmVyc2lvbiddLCB2ZXJzaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGxpbmtCaW5hcnkoXG4gICAgcmVwb3NpdG9yeUJpbmFyeSxcbiAgICBiaW5hcnk6IElNYW5hZ2VkT2JqZWN0QmluYXJ5LFxuICAgIHJlcG9zaXRvcnlFbnRyeT86IFJlcG9zaXRvcnlDYXRlZ29yeVxuICApIHtcbiAgICBpZiAocmVwb3NpdG9yeUJpbmFyeSkge1xuICAgICAgY29uc3QgeyBpZDogcmVwb3NpdG9yeUJpbmFyeUlkIH0gPSByZXBvc2l0b3J5QmluYXJ5O1xuICAgICAgaWYgKGJpbmFyeSkge1xuICAgICAgICBjb25zdCB7IGlkOiBiaW5hcnlJZCB9ID0gYmluYXJ5O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkuY2hpbGRBZGRpdGlvbnNBZGQoYmluYXJ5SWQsIHJlcG9zaXRvcnlCaW5hcnlJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHJldHVybiB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0FkZChiaW5hcnksIHJlcG9zaXRvcnlFbnRyeSk7XG4gIH1cblxuICBjbGVhblVwKG1vc1RvRGVsZXRlOiBJSWRlbnRpZmllZFtdKSB7XG4gICAgbW9zVG9EZWxldGUuZm9yRWFjaChtbyA9PiB7XG4gICAgICBjb25zdCB7IGM4eV9Jc0JpbmFyeSB9ID0gbW87XG4gICAgICBpc1VuZGVmaW5lZChjOHlfSXNCaW5hcnkpID8gdGhpcy5kZWxldGUobW8pIDogdGhpcy5pbnZlbnRvcnlCaW5hcnkuZGVsZXRlKG1vKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShlbnRpdHk6IElJZGVudGlmaWVkKTogUHJvbWlzZTxJUmVzdWx0PG51bGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5LmRlbGV0ZShlbnRpdHksIHsgZm9yY2VDYXNjYWRlOiB0cnVlIH0pO1xuICB9XG5cbiAgZXJyb3JNc2coKSB7XG4gICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnRmFpbGVkIHRvIHNhdmUnKTtcbiAgICB0aGlzLmFsZXJ0LmRhbmdlcihtc2cpO1xuICB9XG5cbiAgZ2V0QmFzZVZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBvZigxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20odGhpcy5saXN0QmFzZVZlcnNpb25zKGVudHJ5LCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KSkucGlwZShcbiAgICAgIG1hcCgoeyBwYWdpbmcgfSkgPT4gcGFnaW5nLnRvdGFsUGFnZXMpXG4gICAgKTtcbiAgfVxuXG4gIGdldEJhc2VWZXJzaW9uRnJvbU1PKG1vOiBSZXBvc2l0b3J5QmluYXJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGNoKG1vKSA/IGdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5JykgOiBnZXQobW8sICdjOHlfRmlybXdhcmUudmVyc2lvbicpO1xuICB9XG5cbiAgaXNQYXRjaChtbzogUmVwb3NpdG9yeUJpbmFyeSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWdldChtbywgJ2M4eV9QYXRjaC5kZXBlbmRlbmN5Jyk7XG4gIH1cblxuICBnZXRQYXRjaFZlcnNpb25zQ291bnQkKGVudHJ5OiBJTWFuYWdlZE9iamVjdCwgYmFzZVZlcnNpb246IEZpcm13YXJlQmluYXJ5KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5pc0xlZ2FjeUVudHJ5KGJhc2VWZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIG9mKDApO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMubGlzdFBhdGNoVmVyc2lvbnMoZW50cnksIGJhc2VWZXJzaW9uLCB7IHBhZ2VTaXplOiAxLCB3aXRoVG90YWxQYWdlczogdHJ1ZSB9KVxuICAgICkucGlwZShtYXAoKHsgcGFnaW5nIH0pID0+IHBhZ2luZy50b3RhbFBhZ2VzKSk7XG4gIH1cblxuICBpc0xlZ2FjeUVudHJ5KGVudHJ5OiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKGVudHJ5LnVybCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYWxsIHZlcnNpb25zIChiYXNlIGFuZCBwYXRjaCBvbmVzKSBvZiBnaXZlbiB0b3AgbGV2ZWwgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RBbGxWZXJzaW9ucyhlbnRyeTogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4sIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJhc2VWZXJzaW9uUmVzdWx0TGlzdEZvckxlZ2FjeUVudHJ5KGVudHJ5KTtcbiAgICB9XG5cbiAgICBjb25zdCBWRVJTSU9OX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7fSxcbiAgICAgIF9fb3JkZXJieTogW3sgJ2NyZWF0aW9uVGltZS5kYXRlJzogLTEgfV1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpc3RDaGlsZHJlbihlbnRyeSwgVkVSU0lPTl9GSUxURVJfT1JERVIsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgYmFzZSB2ZXJzaW9ucyBvZiBnaXZlbiB0b3AgbGV2ZWwgZW50cnkuXG4gICAqIFZlcnNpb25zIGFyZSBvcmRlcmVkIGJ5IGNyZWF0aW9uIHRpbWUgKGFzc3VtaW5nIHRoZSBlYXJsaWVyIGNyZWF0ZWQsIHRoZSBvbGRlciB0aGUgdmVyc2lvbikuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RCYXNlVmVyc2lvbnMoZW50cnk6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LCBwYXJhbXMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTGVnYWN5RW50cnkoZW50cnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCYXNlVmVyc2lvblJlc3VsdExpc3RGb3JMZWdhY3lFbnRyeShlbnRyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgTk9fUEFUQ0hfRklMVEVSX09SREVSID0ge1xuICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgX19ub3Q6IHsgX19oYXM6ICdjOHlfUGF0Y2gnIH1cbiAgICAgIH0sXG4gICAgICBfX29yZGVyYnk6IFt7ICdjcmVhdGlvblRpbWUuZGF0ZSc6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIE5PX1BBVENIX0ZJTFRFUl9PUkRFUiwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBwYXRjaCB2ZXJzaW9ucyBvZiBnaXZlbiBiYXNlIHZlcnNpb24gdW5kZXIgdGhlIGVudHJ5LlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBAcGFyYW0gZW50cnkgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkuXG4gICAqIEBwYXJhbSBiYXNlVmVyc2lvbiBCYXNlIHZlcnNpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBxdWVyeSBwYXJhbXMuXG4gICAqL1xuICBsaXN0UGF0Y2hWZXJzaW9ucyhlbnRyeTogSU1hbmFnZWRPYmplY3QsIGJhc2VWZXJzaW9uOiBGaXJtd2FyZUJpbmFyeSB8IHN0cmluZywgcGFyYW1zID0ge30pIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gaXNTdHJpbmcoYmFzZVZlcnNpb24pID8gYmFzZVZlcnNpb24gOiBnZXQoYmFzZVZlcnNpb24sICdjOHlfRmlybXdhcmUudmVyc2lvbicpO1xuICAgIGNvbnN0IFBBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgICdjOHlfUGF0Y2guZGVwZW5kZW5jeSc6IHZlcnNpb25cbiAgICAgIH0sXG4gICAgICBfX29yZGVyYnk6IFt7ICdjcmVhdGlvblRpbWUuZGF0ZSc6IC0xIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXN0Q2hpbGRyZW4oZW50cnksIFBBVENIX0ZJTFRFUl9PUkRFUiwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBwYXRjaCB2ZXJzaW9ucyBvZiBnaXZlbiBiYXNlIHZlcnNpb24gdW5kZXIgdGhlIGVudHJ5IGluY2x1ZGluZyB0aGUgYmFzZSB2ZXJzaW9uLlxuICAgKiBWZXJzaW9ucyBhcmUgb3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lIChhc3N1bWluZyB0aGUgZWFybGllciBjcmVhdGVkLCB0aGUgb2xkZXIgdGhlIHZlcnNpb24pLlxuICAgKiBJbiB0ZXJtcyBvZiBsZWdhY3kgYmFzZSB2ZXJzaW9uIHRoZSBlbnRyeSBnZXRzIHRyYW5zZm9ybWVkIHRvIGZpdCB0aGUgbmVlZGVkIGRhdGEgbW9kZWwuXG4gICAqIEBwYXJhbSBlbnRyeSBUb3AgbGV2ZWwgcmVwb3NpdG9yeSBlbnRyeS5cbiAgICogQHBhcmFtIGJhc2VWZXJzaW9uIEJhc2UgdmVyc2lvbi5cbiAgICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIGxpc3RCYXNlVmVyc2lvbkFuZFBhdGNoZXMoZW50cnk6IElNYW5hZ2VkT2JqZWN0LCBiYXNlVmVyc2lvbjogSU1hbmFnZWRPYmplY3QsIHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNMZWdhY3lFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYzh5X0Zpcm13YXJlOiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvbixcbiAgICAgICAgICAgICAgICB1cmw6IGVudHJ5LnVybFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IFBBVENIX0ZJTFRFUl9PUkRFUiA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIF9fb3I6IHtcbiAgICAgICAgICAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvbixcbiAgICAgICAgICAnYzh5X0Zpcm13YXJlLnZlcnNpb24nOiBiYXNlVmVyc2lvbi5jOHlfRmlybXdhcmUudmVyc2lvblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyAnYzh5X1BhdGNoLmRlcGVuZGVuY3knOiAxIH0sIHsgJ2M4eV9GaXJtd2FyZS52ZXJzaW9uJzogMSB9XVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGlzdENoaWxkcmVuKGVudHJ5LCBQQVRDSF9GSUxURVJfT1JERVIsIHBhcmFtcyk7XG4gIH1cblxuICBsaXN0Q2hpbGRyZW4oZW50cnk6IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+LCBmaWx0ZXJzID0ge30sIHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb25zdCBjaGlsZHJlbkZpbHRlcnMgPSB7IF9fYnlncm91cGlkOiBlbnRyeS5pZCB9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIoZmlsdGVycywgY2hpbGRyZW5GaWx0ZXJzKTtcbiAgICAvLyBGSVhNRTogbmVlZGVkIGJlY2F1c2Ugb2YgaXNzdWUgaW4gZm9yT2YgZGlyZWN0aXZlICguLi4pXG4gICAgcGFyYW1zLndpdGhUb3RhbFBhZ2VzID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnkubGlzdFF1ZXJ5KHF1ZXJ5LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYWxsIGl0ZW1zIGZyb20gdGhlIGxpc3Qgc3RhcnRpbmcgd2l0aCB0aGUgcHJvdmlkZWQgcGFnZS5cbiAgICogQHBhcmFtIGZpcnN0UGFnZSBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgbGlzdCB0byBmZXRjaCBhbGwgaXRlbXMgZm9yLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBbGxJdGVtc0Zyb21MaXN0KGZpcnN0UGFnZSkge1xuICAgIGxldCBhbGxJdGVtcztcblxuICAgIGlmICghZmlyc3RQYWdlLnRoZW4pIHtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLmZpcnN0UGFnZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IHBhZ2luZywgZGF0YTogaXRlbXMgfSA9IGF3YWl0IGZpcnN0UGFnZTtcbiAgICAgIGFsbEl0ZW1zID0gWy4uLml0ZW1zXTtcblxuICAgICAgd2hpbGUgKHBhZ2luZyAmJiBwYWdpbmcubmV4dFBhZ2UpIHtcbiAgICAgICAgKHsgcGFnaW5nLCBkYXRhOiBpdGVtcyB9ID0gYXdhaXQgcGFnaW5nLm5leHQoKSk7XG4gICAgICAgIGFsbEl0ZW1zID0gWy4uLmFsbEl0ZW1zLCAuLi5pdGVtc107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgbWFuYWdlZCBvYmplY3QgZm9yIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbi5cbiAgICogQHBhcmFtIG1vIEJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdCB3aXRoIHBhcmVudHMuXG4gICAqL1xuICBnZXRSZXBvc2l0b3J5RW50cnlNTyQobW86IElNYW5hZ2VkT2JqZWN0KTogT2JzZXJ2YWJsZTxJTWFuYWdlZE9iamVjdCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghbW8pIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgICBjb25zdCBbcmVmZXJlbmNlXSA9IGdldChtbywgJ2FkZGl0aW9uUGFyZW50cy5yZWZlcmVuY2VzJyk7XG4gICAgY29uc3QgaWQgPSBnZXQocmVmZXJlbmNlLCAnbWFuYWdlZE9iamVjdC5pZCcpO1xuICAgIHJldHVybiBpZFxuICAgICAgPyBmcm9tKHRoaXMuaW52ZW50b3J5LmRldGFpbChpZCwgeyB3aXRoQ2hpbGRyZW46IGZhbHNlIH0pKS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxuICAgICAgOiBvZih1bmRlZmluZWQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGJhc2Ugb3IgcGF0Y2ggdmVyc2lvbiBtYW5hZ2VkIG9iamVjdC5cbiAgICogQHBhcmFtIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudCBEZXZpY2UgcmVwb3NpdG9yeSBmcmFnbWVudC5cbiAgICogQHBhcmFtIHR5cGUgVG9wIGxldmVsIHJlcG9zaXRvcnkgZW50cnkgdHlwZS5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBvYmplY3Qgd2l0aCBvcHRpb25zOlxuICAgKiAtICoqc2tpcExlZ2FjeSoqIC0gYGJvb2xlYW5gIC0gRXhjbHVkZSBsZWdhY3kgZW50cmllcy5cbiAgICogLSAqKmZpbHRlcnMqKiAtIGBvYmplY3RgIC0gRmlsdGVyIG9iamVjdC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgYXMgaXQgZG9lc24ndCBzdXBwb3J0ICdtaXNzaW5nIHVybCcgY2FzZVxuICAgKi9cbiAgZ2V0UmVwb3NpdG9yeUJpbmFyeU1vQnlWZXJzaW9uKFxuICAgIGRldmljZVJlcG9zaXRvcnlGcmFnbWVudDogRGV2aWNlRmlybXdhcmUgfCBEZXZpY2VTb2Z0d2FyZSxcbiAgICB0eXBlOiBSZXBvc2l0b3J5VHlwZSxcbiAgICB7IHNraXBMZWdhY3kgPSBmYWxzZSwgZmlsdGVycyA9IHt9IH06IHsgc2tpcExlZ2FjeT86IGJvb2xlYW47IGZpbHRlcnM/OiBvYmplY3QgfSA9IHt9XG4gICk6IFByb21pc2U8SU1hbmFnZWRPYmplY3Q+IHtcbiAgICBjb25zdCB7IHZlcnNpb24sIHVybCwgbmFtZSB9ID0gZGV2aWNlUmVwb3NpdG9yeUZyYWdtZW50O1xuICAgIGNvbnN0IHJlcG9zaXRvcnlCaW5hcnlUeXBlID0gUkVQT1NJVE9SWV9CSU5BUllfVFlQRVNbdHlwZV07XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGNvbnN0IG5ld01vZGVsQmFzZVZlcnNpb25RdWVyeSA9IHtcbiAgICAgIFtgJHt0eXBlfS52ZXJzaW9uYF06IHZlcnNpb24sXG4gICAgICBbYCR7dHlwZX0udXJsYF06IHVybCxcbiAgICAgIHR5cGU6IHJlcG9zaXRvcnlCaW5hcnlUeXBlXG4gICAgfTtcbiAgICBjb25zdCBsZWdhY3lWZXJzaW9uUXVlcnkgPSB7IHVybCwgdHlwZSwgbmFtZSB9O1xuICAgIGZpbHRlcnMgPSB7IHdpdGhDaGlsZHJlbjogZmFsc2UsIHdpdGhQYXJlbnRzOiB0cnVlLCAuLi5maWx0ZXJzIH07XG5cbiAgICBpZiAoc2tpcExlZ2FjeSkge1xuICAgICAgcXVlcnkgPSB7XG4gICAgICAgIF9fYW5kOiB7XG4gICAgICAgICAgLi4ubmV3TW9kZWxCYXNlVmVyc2lvblF1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0ge1xuICAgICAgICBfX29yOiBbeyBfX2FuZDogeyAuLi5uZXdNb2RlbEJhc2VWZXJzaW9uUXVlcnkgfSB9LCB7IF9fYW5kOiB7IC4uLmxlZ2FjeVZlcnNpb25RdWVyeSB9IH1dXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmludmVudG9yeS5saXN0UXVlcnkocXVlcnksIGZpbHRlcnMpLnRoZW4oKHsgZGF0YSB9KSA9PiBoZWFkKGRhdGEpKTtcbiAgfVxuXG4gIGdldEJpbmFyeU5hbWUkKGJpbmFyeVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoIWJpbmFyeVVybCkge1xuICAgICAgcmV0dXJuIG9mKCctLS0nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5hcnlJZCA9IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybChiaW5hcnlVcmwpO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIHJldHVybiBvZihiaW5hcnlVcmwpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmZXIoKCkgPT4gdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQuZGF0YSkpLnBpcGUoXG4gICAgICBtYXAobW8gPT4gbW8ubmFtZSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBpbnZlbnRvcnkgcXVlcnkgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmRcbiAgICogcmVwb3NpdG9yeSBlbnRyaWVzIG9mIHNwZWNpZmllZCB0eXBlIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHByb3ZpZGVkIGRldmljZS5cbiAgICogQHBhcmFtIHJlcG9zaXRvcnlUeXBlIFRoZSB0eXBlIG9mIHJlcG9zaXRvcnkgZW50cmllcyB3aGljaCB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cblxuICBnZXREZXZpY2VUeXBlUXVlcnkocmVwb3NpdG9yeVR5cGU6IFJlcG9zaXRvcnlUeXBlLCBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyB0eXBlOiByZXBvc2l0b3J5VHlwZSB9O1xuICAgIGlmIChyZXBvc2l0b3J5VHlwZSA9PT0gUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTikge1xuICAgICAgaWYgKGRldmljZS50eXBlKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHJlc3VsdCwge1xuICAgICAgICAgIF9fb3I6IFt7IGRldmljZVR5cGU6IGRldmljZS50eXBlIH0sIHsgX19ub3Q6IHsgX19oYXM6IGBkZXZpY2VUeXBlYCB9IH1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcihyZXN1bHQsIHtcbiAgICAgICAgX19vcjogW1xuICAgICAgICAgIHsgJ2M4eV9GaWx0ZXIudHlwZSc6IGRldmljZS50eXBlIH0sXG4gICAgICAgICAgeyAnYzh5X0ZpbHRlci50eXBlJzogJycgfSxcbiAgICAgICAgICB7IF9fbm90OiB7IF9faGFzOiBgYzh5X0ZpbHRlci50eXBlYCB9IH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gaW52ZW50b3J5IHF1ZXJ5IG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaW5kXG4gICAqIHJlcG9zaXRvcnkgZW50cmllcyBtYXRjaGluZyB0aGUgcHJlZGVmaW5lZCBzb2Z0d2FyZSB0eXBlcyBwcm92aWRlZCBpbiB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHdoaWNoIHRoZSBzb2Z0d2FyZSB0eXBlcyBmaWx0ZXJzIHdpbGwgYmUgYXR0YWNoZWQuIERlZmF1bHQgdmFsdWUgaXMgYW4gb2JqZWN0IGNvbnRhaW5nIHJlcG9zaXRvcnkgdHlwZSBzb2Z0d2FyZS5cbiAgICovXG4gIGdldFNvZnR3YXJlVHlwZVF1ZXJ5KGRldmljZTogSU1hbmFnZWRPYmplY3QsIHF1ZXJ5Pzogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBsZXQgcmVzdWx0ID0geyAuLi4ocXVlcnkgfHwge30pLCB0eXBlOiBSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSB9O1xuXG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkU29mdHdhcmVUeXBlcykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5xdWVyaWVzVXRpbC5hZGRBbmRGaWx0ZXIocmVzdWx0LCB7XG4gICAgICAgIF9fb3I6IFtkZXZpY2UuYzh5X1N1cHBvcnRlZFNvZnR3YXJlVHlwZXMubWFwKHR5cGUgPT4gKHsgc29mdHdhcmVUeXBlOiB0eXBlIH0pKV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuIGludmVudG9yeSBxdWVyeSBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBjb25maWd1cmF0aW9uIHJlcG9zaXRvcnkgZW50cmllc1xuICAgKiBtYXRjaGluZyB0aGUgdHlwZSBvZiBwcm92aWRlZCBkZXZpY2UgYW5kIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSBlbnRyaWVzIHdpbGwgYmUgcXVlcmllZCB3aXRoIHRoZSBnZW5lcmF0ZWQgcXVlcnkuXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uVHlwZSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIHdoaWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgZW50cmllcyB3aWxsIGJlIHF1ZXJpZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIHF1ZXJ5LlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nKTogb2JqZWN0IHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0RGV2aWNlVHlwZVF1ZXJ5KFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04sIGRldmljZSk7XG4gICAgcmV0dXJuIHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKHF1ZXJ5LCB7XG4gICAgICBfX29yOiBbXG4gICAgICAgIHsgY29uZmlndXJhdGlvblR5cGUgfSxcbiAgICAgICAgeyBjb25maWd1cmF0aW9uVHlwZTogJycgfSxcbiAgICAgICAgeyBfX25vdDogeyBfX2hhczogYGNvbmZpZ3VyYXRpb25UeXBlYCB9IH1cbiAgICAgIF1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNvZnR3YXJlIGluc3RhbGxlZCBpbiB0aGUgZGV2aWNlIGluIHRoZSB1bmlmb3JtIGZvcm1hdC5cbiAgICogU3VwcG9ydHMgYzh5X1NvZnR3YXJlTGlzdCBhbmQgYzh5X1NvZnR3YXJlIGZyYWdtZW50cy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIHdob3NlIHNvZnR3YXJlIGxpc3Qgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKi9cbiAgZ2V0RGV2aWNlU29mdHdhcmVMaXN0KGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBEZXZpY2VTb2Z0d2FyZVtdIHtcbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZUxpc3QpO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSkge1xuICAgICAgcmV0dXJuIF9tYXAoZGV2aWNlLmM4eV9Tb2Z0d2FyZSwgKHZlcnNpb24sIG5hbWUpID0+ICh7IG5hbWUsIHZlcnNpb24gfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBsaXN0IG9mIGNoYW5nZXMsIGFuZCBzZW5kcyBpdCB0byB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2Ugd2hpY2ggdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGFuZCBzZW50IHRvLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgc29mdHdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjaGFuZ2VzLlxuICAgKiBSZXR1cm5lZCBvcGVyYXRpb24gdHlwZSBkZXBlbmRzIG9uIGRldmljZSdzIHN1cHBvcnRlZCBvcGVyYXRpb25zLlxuICAgKiBTdXBwb3J0cyBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIGFuZCBjOHlfU29mdHdhcmUgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgbGlzdCBvZiBzb2Z0d2FyZSBjaGFuZ2VzIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYXN5bmMgZ2V0U29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdXG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbjogSU9wZXJhdGlvbiA9IHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYEFwcGx5IHNvZnR3YXJlIGNoYW5nZXM6ICR7Y2hhbmdlc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIGNoYW5nZSA9PlxuICAgICAgICAgICAgYCR7Y2hhbmdlLmFjdGlvbn0gXCIke2NoYW5nZS5uYW1lfVwiJHtcbiAgICAgICAgICAgICAgY2hhbmdlLnZlcnNpb24gPyBgICh2ZXJzaW9uOiAke2NoYW5nZS52ZXJzaW9ufSlgIDogJydcbiAgICAgICAgICAgIH1gXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgIH07XG4gICAgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlVXBkYXRlJykpIHtcbiAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUgPSAoY2xvbmVEZWVwKGNoYW5nZXMpIHx8IFtdKS5tYXAoY2hhbmdlID0+XG4gICAgICAgIG9taXRCeShjaGFuZ2UsIGlzTmlsKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucy5pbmNsdWRlcygnYzh5X1NvZnR3YXJlTGlzdCcpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCA9IGNsb25lRGVlcChcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRDdXJyZW50U29mdHdhcmUoZGV2aWNlLCAnYzh5X1NvZnR3YXJlTGlzdCcsIFtdKVxuICAgICAgKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZTogRGV2aWNlU29mdHdhcmUgPSBwaWNrKG9taXRCeShjaGFuZ2UsIGlzTmlsKSwgW1xuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgJ3NvZnR3YXJlVHlwZSdcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICAgIHJlbW92ZShvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBjb25zdCBzb2Z0d2FyZUl0ZW1Ub1VwZGF0ZUlkeCA9IG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5uYW1lID09PSBjaGFuZ2UubmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBzb2Z0d2FyZVxuICAgICAgICAgICAgb3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZUxpc3Quc3BsaWNlKHNvZnR3YXJlSXRlbVRvVXBkYXRlSWR4LCAxLCBkZXZpY2VTb2Z0d2FyZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc3RhbGwgc29mdHdhcmVcbiAgICAgICAgICAgIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVMaXN0LnB1c2goZGV2aWNlU29mdHdhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChkZXZpY2UuYzh5X1N1cHBvcnRlZE9wZXJhdGlvbnMuaW5jbHVkZXMoJ2M4eV9Tb2Z0d2FyZScpKSB7XG4gICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlID0gY2xvbmVEZWVwKGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZScsIHt9KSk7XG4gICAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZS5hY3Rpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgZGVsZXRlIG9wZXJhdGlvbi5jOHlfU29mdHdhcmVbY2hhbmdlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSAnaW5zdGFsbCcpIHtcbiAgICAgICAgICBvcGVyYXRpb24uYzh5X1NvZnR3YXJlW2NoYW5nZS5uYW1lXSA9IGNoYW5nZS52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgbGlzdCBvZiBkZXZpY2Ugc29mdHdhcmUgY2hhbmdlcyBmcm9tIGdpdmVuIG9wZXJhdGlvbiBpbiB0aGUgY29udGV4dCBvZiBnaXZlbiBkZXZpY2UuXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBmcm9tIHdoaWNoIHRoZSBsaXN0IHNob3VsZCBiZSBleHRyYWN0ZWQuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIHRhcmdldCBkZXZpY2Ugb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21PcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uLFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPiB7XG4gICAgaWYgKG9wZXJhdGlvbi5jOHlfU29mdHdhcmVVcGRhdGUpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAob3BlcmF0aW9uLmM4eV9Tb2Z0d2FyZVVwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlU29mdHdhcmVDaGFuZ2VzRnJvbVNvZnR3YXJlTGlzdE9wZXJhdGlvbihvcGVyYXRpb24sIGRldmljZSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VTb2Z0d2FyZUNoYW5nZXNGcm9tU29mdHdhcmVPcGVyYXRpb24ob3BlcmF0aW9uLCBkZXZpY2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBmaXJtd2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UgYW5kIHRoZSBzZWxlY3RlZCByZXBvc2l0b3J5IGJpbmFyeSwgYW5kIHNlbmRzIGl0IHRvIHRoZSBkZXZpY2UuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB3aGljaCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYW5kIHNlbnQgdG8uXG4gICAqIEBwYXJhbSBzZWxlY3RlZE9wdGlvbiBUaGUgc2VsZWN0ZWQgcmVwb3NpdG9yeSBiaW5hcnkgb3B0aW9uLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRmlybXdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBzZWxlY3RlZE9wdGlvbjogU2VsZWN0ZWRSZXBvc2l0b3J5QmluYXJ5XG4gICk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZ2V0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlLCBzZWxlY3RlZE9wdGlvbik7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLm9wZXJhdGlvbi5jcmVhdGUob3BlcmF0aW9uKSkuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGZpcm13YXJlIHVwZGF0ZSBvcGVyYXRpb24gZm9yIGdpdmVuIGRldmljZSBhbmQgc2VsZWN0ZWQgdmVyc2lvbi5cbiAgICogU3VwcG9ydHMgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCBvcGVyYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRPcHRpb24gU2VsZWN0ZWQgZmlybXdhcmUgdmVyc2lvbi5cbiAgICovXG4gIGdldEZpcm13YXJlVXBkYXRlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgc2VsZWN0ZWRPcHRpb246IFNlbGVjdGVkUmVwb3NpdG9yeUJpbmFyeVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBkZWxldGUgc2VsZWN0ZWRPcHRpb24uaWQ7XG5cbiAgICBjb25zdCBvcGVyYXRpb246IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGBVcGRhdGUgZmlybXdhcmUgdG86IFwiJHtzZWxlY3RlZE9wdGlvbi5uYW1lfVwiJHtcbiAgICAgICAgc2VsZWN0ZWRPcHRpb24udmVyc2lvbiA/IGAgKHZlcnNpb246ICR7c2VsZWN0ZWRPcHRpb24udmVyc2lvbn0pYCA6ICcnXG4gICAgICB9YCxcbiAgICAgIGM4eV9GaXJtd2FyZTogeyAuLi5zZWxlY3RlZE9wdGlvbiB9XG4gICAgfTtcblxuICAgIHJldHVybiBvcGVyYXRpb247XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgdXBsb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGlzTGVnYWN5ICBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXRVcGxvYWRDb25maWd1cmF0aW9uRmlsZU9wZXJhdGlvbihcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIGNvbmZpZ3VyYXRpb25UeXBlOiBzdHJpbmcsXG4gICAgaXNMZWdhY3kgPSBmYWxzZVxuICApOiBJT3BlcmF0aW9uIHtcbiAgICBpZiAoaXNMZWdhY3kpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmV0cmlldmUgY29uZmlndXJhdGlvbiBzbmFwc2hvdCBmcm9tIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9VcGxvYWRDb25maWdGaWxlOiB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFJldHJpZXZlICR7Y29uZmlndXJhdGlvblR5cGV9IGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZnJvbSBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X1VwbG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgY29uZmlndXJhdGlvbiBmaWxlIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggb3BlcmF0aW9uIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgdXJsIG9mIGEgYmluYXJ5IHRvIGJlIGRvd25sb2FkZWQuXG4gICAqIEBwYXJhbSBpc0xlZ2FjeSBBIGxlZ2FjeSBvcGVyYXRpb24gaXMgY3JlYXRlZCB3aXRob3V0IGEgY29uZmlndXJhdGlvblR5cGUuXG4gICAqL1xuICBnZXREb3dubG9hZENvbmZpZ3VyYXRpb25GaWxlT3BlcmF0aW9uKFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3QsXG4gICAgY29uZmlndXJhdGlvblR5cGU6IHN0cmluZyxcbiAgICBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90LFxuICAgIGlzTGVnYWN5ID0gZmFsc2VcbiAgKTogSU9wZXJhdGlvbiB7XG4gICAgaWYgKGlzTGVnYWN5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VJZDogZGV2aWNlLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IHRvIGRldmljZSAke2RldmljZS5uYW1lfWAsXG4gICAgICAgIGM4eV9Eb3dubG9hZENvbmZpZ0ZpbGU6IHtcbiAgICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgICBjOHlfQ29uZmlndXJhdGlvbkR1bXA6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWdTbmFwc2hvdC5pZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlbmQgY29uZmlndXJhdGlvbiBzbmFwc2hvdCAke2NvbmZpZ1NuYXBzaG90Lm5hbWV9IG9mIGNvbmZpZ3VyYXRpb24gdHlwZSAke2NvbmZpZ3VyYXRpb25UeXBlfSB0byBkZXZpY2UgJHtkZXZpY2UubmFtZX1gLFxuICAgICAgYzh5X0Rvd25sb2FkQ29uZmlnRmlsZToge1xuICAgICAgICB1cmw6IGNvbmZpZ1NuYXBzaG90LmJpbmFyeVVybCxcbiAgICAgICAgdHlwZTogY29uZmlndXJhdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3QgZmlybXdhcmUgdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0Zpcm13YXJlIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSBkZXZpY2VJZCBUaGUgSUQgb2YgdGhlIGRldmljZSB0byBmaW5kIGFuIG9wZXJhdGlvbiBmb3IuXG4gICAqL1xuICBhc3luYyBnZXRMYXN0RmlybXdhcmVVcGRhdGVPcGVyYXRpb24oZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiBuZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLFxuICAgICAgcmV2ZXJ0OiB0cnVlLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oW3sgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X0Zpcm13YXJlJyB9XSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBzb2Z0d2FyZSB1cGRhdGUgb3BlcmF0aW9uIGZvciBnaXZlbiBkZXZpY2UuXG4gICAqIExvb2tzIGZvciBjOHlfU29mdHdhcmVVcGRhdGUsIGM4eV9Tb2Z0d2FyZUxpc3QsIG9yIGM4eV9Tb2Z0d2FyZSBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdFNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uKGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPElPcGVyYXRpb24+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBkYXRlRnJvbTogbmV3IERhdGUoMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAxXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXRlc3RNYXRjaGluZ09wZXJhdGlvbihbXG4gICAgICB7IC4uLmZpbHRlcnMsIGZyYWdtZW50VHlwZTogJ2M4eV9Tb2Z0d2FyZVVwZGF0ZScgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlTGlzdCcgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NvZnR3YXJlJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciB0aGUgbGlzdCBvZiBmaWx0ZXJzIGFuZCBxdWVyaWVzIHRoZSBvcGVyYXRpb25zLlxuICAgKiBJZiBhIHF1ZXJ5IHJldHVybnMgYXQgbGVhc3Qgb25lIG9wZXJhdGlvbiwgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLlxuICAgKiBPdGhlcndpc2UgdGhlIG5leHQgcXVlcnkgd2lsbCBiZSBwZXJmb3JtZWQuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldEZpcnN0TWF0Y2hpbmdPcGVyYXRpb24oZmlsdGVyc0xpc3Q6IGFueVtdKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgbGV0IG1hdGNoaW5nT3BlcmF0aW9uID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZmlsdGVycyBvZiBmaWx0ZXJzTGlzdCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID0gb3BlcmF0aW9uc1swXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGxpc3Qgb2YgZmlsdGVycyBhbmQgcXVlcmllcyB0aGUgb3BlcmF0aW9ucy5cbiAgICogSXQgY29tcGFyZXMgdGhlIG9wZXJhdGlvbnMgcmV0cmlldmVkIGJ5IHRoZSBxdWVyaWVzIGJ5ICdjcmVhdGlvblRpbWUnXG4gICAqIGFuZCByZXR1cm4gdGhlIGxhdGVzdCBvbmUuXG4gICAqIElmIG5vbmUgb2YgdGhlIHF1ZXJpZXMgcmV0dXJucyBhbnkgb3BlcmF0aW9uLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBmaWx0ZXJzTGlzdCBUaGUgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgcXVlcmllcy5cbiAgICovXG4gIGFzeW5jIGdldExhdGVzdE1hdGNoaW5nT3BlcmF0aW9uKGZpbHRlcnNMaXN0OiBhbnlbXSk6IFByb21pc2U8SU9wZXJhdGlvbj4ge1xuICAgIGxldCBtYXRjaGluZ09wZXJhdGlvbjogSU9wZXJhdGlvbiA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlcnMgb2YgZmlsdGVyc0xpc3QpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSA9IChhd2FpdCB0aGlzLm9wZXJhdGlvbi5saXN0KGZpbHRlcnMpKS5kYXRhO1xuICAgICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbikge1xuICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID1cbiAgICAgICAgICAgIG5ldyBEYXRlKG1hdGNoaW5nT3BlcmF0aW9uLmNyZWF0aW9uVGltZSkuZ2V0VGltZSgpIDxcbiAgICAgICAgICAgIG5ldyBEYXRlKG9wZXJhdGlvbnNbMF0uY3JlYXRpb25UaW1lKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgPyBvcGVyYXRpb25zWzBdXG4gICAgICAgICAgICAgIDogbWF0Y2hpbmdPcGVyYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0Y2hpbmdPcGVyYXRpb24gPSBvcGVyYXRpb25zWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoaW5nT3BlcmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIG9wZXJhdGlvbiBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIGl0cyBwcm9ncmVzcy5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gY3JlYXRlIGFuZCB0cmFjay5cbiAgICovXG4gIGNyZWF0ZU9ic2VydmVkT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMub3BlcmF0aW9uLmNyZWF0ZShvcGVyYXRpb24pKS5waXBlKFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKGNyZWF0ZWRPcGVyYXRpb24gPT4gdGhpcy5vYnNlcnZlT3BlcmF0aW9uKGNyZWF0ZWRPcGVyYXRpb24pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRvIHRyYWNrIHByb2dyZXNzIG9mIGdpdmVuIG9wZXJhdGlvbi5cbiAgICogRmFpbHMgdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMgRkFJTEVEIHN0YXR1cy5cbiAgICogQ29tcGxldGVzIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zIFNVQ0NFU1NGVUwgc3RhdHVzLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gYmUgb2JzZXJ2ZWQuXG4gICAqL1xuICBvYnNlcnZlT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbik6IE9ic2VydmFibGU8SU9wZXJhdGlvbj4ge1xuICAgIGNvbnN0IG9ic2VydmVkT3BlcmF0aW9uJCA9IG9mKG9wZXJhdGlvbik7XG4gICAgY29uc3Qgb3BlcmF0aW9uVXBkYXRlcyQgPSBvYnNlcnZlZE9wZXJhdGlvbiQucGlwZShcbiAgICAgIHN3aXRjaE1hcChvYnNlcnZlZE9wZXJhdGlvbiA9PiB0aGlzLm9wZXJhdGlvblJlYWx0aW1lLm9uQWxsJChvYnNlcnZlZE9wZXJhdGlvbi5kZXZpY2VJZCkpLFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSBhcyBJT3BlcmF0aW9uKSxcbiAgICAgIHdpdGhMYXRlc3RGcm9tKG9ic2VydmVkT3BlcmF0aW9uJCksXG4gICAgICBmaWx0ZXIoKFtvcGVyYXRpb25VcGRhdGUsIG9ic2VydmVkT3BlcmF0aW9uXSkgPT4gb3BlcmF0aW9uVXBkYXRlLmlkID09PSBvYnNlcnZlZE9wZXJhdGlvbi5pZCksXG4gICAgICBzd2l0Y2hNYXAoKFtvcGVyYXRpb25VcGRhdGVdKSA9PiB7XG4gICAgICAgIGlmIChvcGVyYXRpb25VcGRhdGUuc3RhdHVzID09PSBPcGVyYXRpb25TdGF0dXMuRkFJTEVEKSB7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3Iob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Yob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVdoaWxlKG9wZXJhdGlvblVwZGF0ZSA9PiBvcGVyYXRpb25VcGRhdGUuc3RhdHVzICE9PSBPcGVyYXRpb25TdGF0dXMuU1VDQ0VTU0ZVTCwgdHJ1ZSlcbiAgICApO1xuICAgIHJldHVybiBtZXJnZShvYnNlcnZlZE9wZXJhdGlvbiQsIG9wZXJhdGlvblVwZGF0ZXMkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2luZ2xlIGV2ZW50IHdpdGggbGF0ZXN0IGNyZWF0aW9uVGltZSBmb3IgdGhlIGdpdmVuIGRldmljZSBJZCBhbmQgZXZlbnQgdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBldmVudHMgc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUuXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RDb25maWd1cmF0aW9uRXZlbnQoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICB0eXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJRXZlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBldmVudEZpbHRlcjogb2JqZWN0ID0ge1xuICAgICAgc291cmNlOiBkZXZpY2VJZCxcbiAgICAgIHR5cGUsXG4gICAgICBkYXRlRnJvbTogdGhpcy5kYXRlRnJvbS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiB0aGlzLmRhdGVUby50b0lTT1N0cmluZygpLFxuICAgICAgcGFnZVNpemU6IDFcbiAgICB9O1xuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmV2ZW50Lmxpc3QoZXZlbnRGaWx0ZXIpO1xuICAgIHJldHVybiBkYXRhWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBkZXZpY2UgSWQsIGFuZCBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGRldmljZUlkIFRoZSBkZXZpY2UgSWQgZm9yIHdoaWNoIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHF1ZXJpZWQuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25UeXBlIE9wZXJhdGlvbiB0eXBlIGZyYWdtZW50LlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnRmlsZU9wZXJhdGlvbkxpc3QoXG4gICAgZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBvcGVyYXRpb25UeXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJT3BlcmF0aW9uW10+IHtcbiAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXI6IG9iamVjdCA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZnJhZ21lbnRUeXBlOiBvcGVyYXRpb25UeXBlLFxuICAgICAgZGF0ZUZyb206IHRoaXMuZGF0ZUZyb20udG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogdGhpcy5kYXRlVG8udG9JU09TdHJpbmcoKSxcbiAgICAgIHJldmVydDogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiAyMDAwXG4gICAgfTtcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5vcGVyYXRpb24ubGlzdChvcGVyYXRpb25GaWx0ZXIpKS5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbGF0ZXN0IHVwbG9hZGVkIGNvbmZpZ3VyYXRpb24gc25hcHNob3QgZm9yIHRoZSBnaXZlbiBkZXZpY2UsIGFuZCBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSBmb3Igd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gc25hcHNob3Qgd2FzIHVwbG9hZGVkLlxuICAgKiBAcGFyYW0gY29uZmlndXJhdGlvblR5cGUgU2VsZWN0ZWQgY29uZmlndXJhdGlvbiB0eXBlLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlnU25hcHNob3QoXG4gICAgZGV2aWNlOiBJTWFuYWdlZE9iamVjdCxcbiAgICBjb25maWd1cmF0aW9uVHlwZTogc3RyaW5nXG4gICk6IFByb21pc2U8Q29uZmlndXJhdGlvblNuYXBzaG90IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXZlbnQ6IElFdmVudCA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkV2ZW50KGRldmljZS5pZCwgY29uZmlndXJhdGlvblR5cGUpO1xuICAgIGxldCBjb25maWdTbmFwc2hvdDogQ29uZmlndXJhdGlvblNuYXBzaG90O1xuICAgIGlmIChldmVudCkge1xuICAgICAgY29uZmlnU25hcHNob3QgPSB7XG4gICAgICAgIHRpbWU6IGV2ZW50LnRpbWUsXG4gICAgICAgIG5hbWU6IGV2ZW50LnRleHQsXG4gICAgICAgIGRldmljZVR5cGU6IGRldmljZS50eXBlLFxuICAgICAgICBjb25maWd1cmF0aW9uVHlwZVxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZ1NuYXBzaG90LmJpbmFyeSA9IGF3YWl0IChhd2FpdCB0aGlzLmV2ZW50QmluYXJ5LmRvd25sb2FkKGV2ZW50KSkudGV4dCgpO1xuICAgICAgICBpZiAoZXZlbnQuYzh5X0lzQmluYXJ5KSB7XG4gICAgICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5VHlwZSA9IGV2ZW50LmM4eV9Jc0JpbmFyeS50eXBlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBjb25zdCBtc2cgPSBnZXR0ZXh0KCdDb3VsZCBub3QgZ2V0IHRoZSBiaW5hcnkuJyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWdTbmFwc2hvdDtcbiAgfVxuXG4gIGFzeW5jIGdldExlZ2FjeUNvbmZpZ1NuYXBzaG90KGRldmljZUlkKSB7XG4gICAgbGV0IGNvbmZpZ1NuYXBzaG90OiBDb25maWd1cmF0aW9uU25hcHNob3Q7XG4gICAgbGV0IG1vO1xuICAgIGNvbnN0IGRldmljZSA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoZGV2aWNlSWQsIHsgd2l0aENoaWxkcmVuOiBmYWxzZSB9KSkuZGF0YTtcbiAgICBjb25zdCBzbmFwc2hvdElkID0gZGV2aWNlLmM4eV9Db25maWd1cmF0aW9uRHVtcCAmJiBkZXZpY2UuYzh5X0NvbmZpZ3VyYXRpb25EdW1wLmlkO1xuICAgIGlmICghc25hcHNob3RJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBtbyA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoc25hcHNob3RJZCkpLmRhdGE7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgaWYgKG1vKSB7XG4gICAgICBjb25maWdTbmFwc2hvdCA9IHtcbiAgICAgICAgdGltZTogbW8uY3JlYXRpb25UaW1lLFxuICAgICAgICBuYW1lOiBtby5uYW1lXG4gICAgICB9O1xuICAgICAgY29uZmlnU25hcHNob3QuYmluYXJ5ID0gYXdhaXQgdGhpcy5nZXRCaW5hcnlUZXh0KG1vLnVybCwgeyBhbGxvd0V4dGVybmFsOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1NuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0IGFzIHRleHQuXG4gICAqIEBwYXJhbSBiaW5hcnlVcmwgVGhlIFVSTCB0byBmaW5kIGJpbmFyeVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb2JqZWN0IHdpdGggYWRkaXRpb25hbCBvcHRpb25zOlxuICAgKiAtICoqYWxsb3dFeHRlcm5hbCoqIC0gYGJvb2xlYW5gIC0gYWxsb3dzIGRvd25sb2FkaW5nIGV4dGVybmFsIGJpbmFyeSBmaWxlXG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgYXN5bmMgZ2V0QmluYXJ5VGV4dChcbiAgICBiaW5hcnlVcmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGFsbG93RXh0ZXJuYWw6IGJvb2xlYW47IG5vQWxlcnRzPzogYm9vbGVhbiB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBsZXQgcmVzO1xuICAgIGlmICghYmluYXJ5SWQpIHtcbiAgICAgIGlmIChvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJpbmFyeSBvYmplY3QgYXMgRmlsZS5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKiphbGxvd0V4dGVybmFsKiogLSBgYm9vbGVhbmAgLSBhbGxvd3MgZG93bmxvYWRpbmcgZXh0ZXJuYWwgYmluYXJ5IGZpbGVcbiAgICovXG4gIGFzeW5jIGdldEJpbmFyeUZpbGUoYmluYXJ5VXJsOiBzdHJpbmcsIG9wdGlvbnM6IHsgYWxsb3dFeHRlcm5hbDogYm9vbGVhbiB9KTogUHJvbWlzZTxGaWxlPiB7XG4gICAgY29uc3QgYmluYXJ5SWQgPSB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21VcmwoYmluYXJ5VXJsKTtcbiAgICBpZiAoIWJpbmFyeUlkICYmICFvcHRpb25zLmFsbG93RXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBAVE9ETzogbm90ZSB0aGF0IGl0IGRvZXNuJ3Qgc29sdmUgaXNzdWUgd2l0aCBleHRlcm5hbCBiaW5hcnkgaGVyZSwgc3VjaCB1cmwgd29uJ3QgaGF2ZSBiaW5hcnlJZCwgc28gd2Ugd29uJ3Qga25vdyB0aGUgbmFtZSBvciBjb250ZW50VHlwZSB0byB1c2UgaW4gRmlsZSBjb25zdHJ1Y3RvciwgbGV0J3MgYWRkIGEgQEZJWE1FIGNvbW1lbnQgZm9yIG5vdz9cbiAgICBjb25zdCB7IG5hbWUsIGNvbnRlbnRUeXBlIH0gPSAoYXdhaXQgdGhpcy5pbnZlbnRvcnkuZGV0YWlsKGJpbmFyeUlkKSkuZGF0YTtcbiAgICBjb25zdCByZXMgPSAhIWJpbmFyeUlkXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxCaW5hcnlSZXNwb25zZShiaW5hcnlJZClcbiAgICAgIDogYXdhaXQgdGhpcy5nZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKGJpbmFyeVVybCk7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gbmV3IEZpbGUoW2FycmF5QnVmZmVyXSwgbmFtZSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXN0IGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlLlxuICAgKiBMb29rcyBmb3IgYzh5X0NvbmZpZ3VyYXRpb24gYW5kIGM4eV9TZW5kQ29uZmlndXJhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgVGhlIElEIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBhbiBvcGVyYXRpb24gZm9yLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdENvbmZpZ1VwZGF0ZU9wZXJhdGlvbihkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxJT3BlcmF0aW9uPiB7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZGF0ZUZyb206IG5ldyBEYXRlKDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBkYXRlVG86IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXZlcnQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGF0ZXN0TWF0Y2hpbmdPcGVyYXRpb24oW1xuICAgICAgeyAuLi5maWx0ZXJzLCBmcmFnbWVudFR5cGU6ICdjOHlfQ29uZmlndXJhdGlvbicgfSxcbiAgICAgIHsgLi4uZmlsdGVycywgZnJhZ21lbnRUeXBlOiAnYzh5X1NlbmRDb25maWd1cmF0aW9uJyB9XG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBjb25maWd1cmF0aW9uIGRvd25sb2FkIG9wZXJhdGlvbiBmb3IgZ2l2ZW4gZGV2aWNlIGFuZCBpdHMgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBTdXBwb3J0cyBjOHlfU2VuZENvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqL1xuICBjcmVhdGVUZXh0QmFzZWRDb25maWd1cmF0aW9uUmVsb2FkT3BlcmF0aW9uKGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdSZXF1ZXN0ZWQgY3VycmVudCBjb25maWd1cmF0aW9uJyksXG4gICAgICBjOHlfU2VuZENvbmZpZ3VyYXRpb246IHt9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIGNvbmZpZ3VyYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogU3VwcG9ydHMgYzh5X0NvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJlcGFyZWQuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gd2hpY2ggd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIG9uZS5cbiAgICovXG4gIGNyZWF0ZVRleHRCYXNlZENvbmZpZ3VyYXRpb25VcGRhdGVPcGVyYXRpb24oZGV2aWNlOiBJTWFuYWdlZE9iamVjdCwgY29uZmlnOiBzdHJpbmcpOiBJT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIHVwZGF0ZScpLFxuICAgICAgYzh5X0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgY29uZmlnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEJpbmFyeShiaW5hcnlJZDogSWRSZWZlcmVuY2UpOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kb3dubG9hZChiaW5hcnlJZCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGF2YWlsYWJsZSBzbmFwc2hvdHMgZnJvbSB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGRldmljZS5cbiAgICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgc25hcHNob3RzIHNob3VsZCBiZSBwcmVwYXJlZC5cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25UeXBlIFNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICovXG4gIGFzeW5jIGdldFNuYXBzaG90c0Zyb21SZXBvc2l0b3J5KGRldmljZSwgY29uZmlndXJhdGlvblR5cGUpIHtcbiAgICBjb25zdCBzZWFyY2hRdWVyeSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblR5cGVRdWVyeShkZXZpY2UsIGNvbmZpZ3VyYXRpb25UeXBlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxpc3RSZXBvc2l0b3J5RW50cmllcyhSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OLCB7XG4gICAgICBxdWVyeTogc2VhcmNoUXVlcnksXG4gICAgICBwYXJhbXM6IHsgcGFnZVNpemU6IDEwMCB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRldmljZSBhbHJlYWR5IGhhdmUgYSBnaXZlbiBzb2Z0d2FyZSBpbnN0YWxsZWRcbiAgICogQHBhcmFtIGRldmljZUlkIElkIG9mIHRoZSBkZXZpY2UgdG8gYmUgY2hlY2tlZFxuICAgKiBAcGFyYW0gc29mdHdhcmUgVGhlIHNvZnR3YXJlIHRvIGJlIGNoZWNrZWRcbiAgICovXG4gIGFzeW5jIGlzU29mdHdhcmVJbnN0YWxsZWRPbkRldmljZShcbiAgICBkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHNvZnR3YXJlOiBEZXZpY2VTb2Z0d2FyZVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlLmlzQVNNQXZhaWxhYmxlKCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlGaWx0ZXIgPSB7IGRldmljZUlkIH07XG4gICAgaWYgKHNvZnR3YXJlPy5uYW1lKSB7XG4gICAgICBzZXQocXVlcnlGaWx0ZXIsICduYW1lJywgc29mdHdhcmUubmFtZSk7XG4gICAgfVxuICAgIGlmIChzb2Z0d2FyZT8udmVyc2lvbikge1xuICAgICAgc2V0KHF1ZXJ5RmlsdGVyLCAndmVyc2lvbicsIHNvZnR3YXJlLnZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KHF1ZXJ5RmlsdGVyKS50aGVuKHJlc3VsdCA9PiAhIXJlc3VsdC5kYXRhPy5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBiaW5hcnkgb2JqZWN0LlxuICAgKiBAcGFyYW0gYmluYXJ5SWQgYmluYXJ5IElEXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRJbnRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeUlkOiBJZFJlZmVyZW5jZSxcbiAgICBvcHRpb25zOiB7IG5vQWxlcnRzPzogYm9vbGVhbiB9ID0ge31cbiAgKTogUHJvbWlzZTxJRmV0Y2hSZXNwb25zZT4ge1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmRvd25sb2FkKGJpbmFyeUlkKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKCFvcHRpb25zLm5vQWxlcnRzKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgICAgdGhpcy5hbGVydC5kYW5nZXIobXNnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYmluYXJ5IG9iamVjdC5cbiAgICogQHBhcmFtIGJpbmFyeVVybCBUaGUgVVJMIHRvIGZpbmQgYmluYXJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAqIC0gKipub0FsZXJ0cyoqIC0gYGJvb2xlYW5gIC0gZG8gbm90IGRpc3BsYXkgYW4gYWxlcnQgbWVzc2FnZTsgZGVmYXVsdHMgdG8gYGZhbHNlYFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeHRlcm5hbEJpbmFyeVJlc3BvbnNlKFxuICAgIGJpbmFyeVVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgbm9BbGVydHM/OiBib29sZWFuIH0gPSB7fVxuICApOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmV0Y2hSZXMgPSBhd2FpdCBmZXRjaChiaW5hcnlVcmwpO1xuICAgICAgaWYgKGZldGNoUmVzLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgdGhyb3cgcmVzO1xuICAgICAgfVxuICAgICAgcmVzID0gZmV0Y2hSZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICBpZiAoIW9wdGlvbnMubm9BbGVydHMpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnQ291bGQgbm90IGdldCB0aGUgZXh0ZXJuYWwgYmluYXJ5Jyk7XG4gICAgICAgIHRoaXMuYWxlcnQuZGFuZ2VyKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGdldEJhc2VWZXJzaW9uUmVzdWx0TGlzdEZvckxlZ2FjeUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICByZXM6IHt9IGFzIElGZXRjaFJlc3BvbnNlLFxuICAgICAgZGF0YTogW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgW2VudHJ5LnR5cGVdOiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBlbnRyeS51cmxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9IGFzIElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21Tb2Z0d2FyZUxpc3RPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBJT3BlcmF0aW9uLFxuICAgIGRldmljZTogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPiB7XG4gICAgY29uc3QgY2hhbmdlczogRGV2aWNlU29mdHdhcmVDaGFuZ2VbXSA9IFtdO1xuICAgIGNvbnN0IGRldmljZVNvZnR3YXJlTGlzdCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCBbXSk7XG4gICAgZm9yRWFjaChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgb3BlcmF0aW9uU29mdHdhcmUgPT4ge1xuICAgICAgY29uc3QgZGV2aWNlU29mdHdhcmUgPSBmaW5kKGRldmljZVNvZnR3YXJlTGlzdCwgeyBuYW1lOiBvcGVyYXRpb25Tb2Z0d2FyZS5uYW1lIH0pO1xuICAgICAgaWYgKFxuICAgICAgICAob3BlcmF0aW9uU29mdHdhcmUgJiYgb3BlcmF0aW9uU29mdHdhcmUudmVyc2lvbikgIT09XG4gICAgICAgIChkZXZpY2VTb2Z0d2FyZSAmJiBkZXZpY2VTb2Z0d2FyZS52ZXJzaW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uU29mdHdhcmUsXG4gICAgICAgICAgYWN0aW9uOiAnaW5zdGFsbCdcbiAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yRWFjaChkZXZpY2VTb2Z0d2FyZUxpc3QsIGRldmljZVNvZnR3YXJlID0+IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvblNvZnR3YXJlID0gZmluZChvcGVyYXRpb24uYzh5X1NvZnR3YXJlTGlzdCwgeyBuYW1lOiBkZXZpY2VTb2Z0d2FyZS5uYW1lIH0pO1xuICAgICAgaWYgKFxuICAgICAgICAob3BlcmF0aW9uU29mdHdhcmUgJiYgb3BlcmF0aW9uU29mdHdhcmUudmVyc2lvbikgIT09XG4gICAgICAgIChkZXZpY2VTb2Z0d2FyZSAmJiBkZXZpY2VTb2Z0d2FyZS52ZXJzaW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxDaGFuZ2UgPSBjaGFuZ2VzLmZpbmQoXG4gICAgICAgICAgY2hhbmdlID0+IGRldmljZVNvZnR3YXJlLm5hbWUgPT09IGNoYW5nZS5uYW1lICYmIGNoYW5nZS5hY3Rpb24gPT09ICdpbnN0YWxsJ1xuICAgICAgICApO1xuICAgICAgICAvLyBjaGVjayB0aGF0IHRoaXMgc29mdHdhcmUgaXMgbm90IGFuIGluc3RhbGxhdGlvbiBzb2Z0d2FyZSBjaGFuZ2UsIG90aGVyd2lzZSBpdCdzIGFuIHVwZGF0ZSBhbmQgbm90IGEgcmVtb3ZhbFxuICAgICAgICBpZiAoIWluc3RhbGxDaGFuZ2UpIHtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgLi4uZGV2aWNlU29mdHdhcmUsXG4gICAgICAgICAgICBhY3Rpb246ICdkZWxldGUnXG4gICAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0RGV2aWNlU29mdHdhcmVDaGFuZ2VzRnJvbVNvZnR3YXJlT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogSU9wZXJhdGlvbixcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0XG4gICk6IFByb21pc2U8RGV2aWNlU29mdHdhcmVDaGFuZ2VbXT4ge1xuICAgIGNvbnN0IGNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW10gPSBbXTtcbiAgICBjb25zdCBkZXZpY2VTb2Z0d2FyZSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFNvZnR3YXJlKGRldmljZSwgJ2M4eV9Tb2Z0d2FyZScsIHt9KTtcbiAgICBmb3JFYWNoKGRldmljZVNvZnR3YXJlLCAoZGV2aWNlU29mdHdhcmVWZXJzaW9uLCBkZXZpY2VTb2Z0d2FyZU5hbWUpID0+IHtcbiAgICAgIGlmIChvcGVyYXRpb24uYzh5X1NvZnR3YXJlW2RldmljZVNvZnR3YXJlTmFtZV0gIT09IGRldmljZVNvZnR3YXJlVmVyc2lvbikge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGRldmljZVNvZnR3YXJlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBkZXZpY2VTb2Z0d2FyZVZlcnNpb24sXG4gICAgICAgICAgYWN0aW9uOiAnZGVsZXRlJ1xuICAgICAgICB9IGFzIERldmljZVNvZnR3YXJlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3JFYWNoKG9wZXJhdGlvbi5jOHlfU29mdHdhcmUsIChvcGVyYXRpb25Tb2Z0d2FyZVZlcnNpb24sIG9wZXJhdGlvblNvZnR3YXJlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZGV2aWNlU29mdHdhcmVWZXJzaW9uID0gZGV2aWNlU29mdHdhcmUgJiYgZGV2aWNlU29mdHdhcmVbb3BlcmF0aW9uU29mdHdhcmVOYW1lXTtcbiAgICAgIGlmIChkZXZpY2VTb2Z0d2FyZVZlcnNpb24gIT09IG9wZXJhdGlvblNvZnR3YXJlVmVyc2lvbikge1xuICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IG9wZXJhdGlvblNvZnR3YXJlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBvcGVyYXRpb25Tb2Z0d2FyZVZlcnNpb24sXG4gICAgICAgICAgYWN0aW9uOiAnaW5zdGFsbCdcbiAgICAgICAgfSBhcyBEZXZpY2VTb2Z0d2FyZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEN1cnJlbnRTb2Z0d2FyZShcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LFxuICAgIHN3RnJhZ21lbnQ6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IG9iamVjdFxuICApOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IGlzQVNNQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5pc0FTTUF2YWlsYWJsZSgpO1xuICAgIGlmIChpc0FTTUF2YWlsYWJsZSkge1xuICAgICAgbGV0IHNvZnR3YXJlUmVzdWx0TGlzdDogSVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+ID0gYXdhaXQgdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KFxuICAgICAgICB7IGRldmljZUlkOiBkZXZpY2UuaWQsIHBhZ2VTaXplOiAxMDAgfVxuICAgICAgKTtcbiAgICAgIGxldCBsaXN0ID0gKHNvZnR3YXJlUmVzdWx0TGlzdD8uZGF0YSB8fCBbXSkubWFwKHN3ID0+XG4gICAgICAgIHBpY2sob21pdEJ5KHN3LCBpc05pbCksIFsnbmFtZScsICd2ZXJzaW9uJywgJ3VybCcsICdzb2Z0d2FyZVR5cGUnXSlcbiAgICAgICk7XG5cbiAgICAgIHdoaWxlIChzb2Z0d2FyZVJlc3VsdExpc3QucGFnaW5nPy5uZXh0UGFnZSkge1xuICAgICAgICBzb2Z0d2FyZVJlc3VsdExpc3QgPSBhd2FpdCBzb2Z0d2FyZVJlc3VsdExpc3QucGFnaW5nLm5leHQoKTtcbiAgICAgICAgbGlzdCA9IFtcbiAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgIC4uLihzb2Z0d2FyZVJlc3VsdExpc3Q/LmRhdGEgfHwgW10pLm1hcChzdyA9PlxuICAgICAgICAgICAgcGljayhvbWl0Qnkoc3csIGlzTmlsKSwgWyduYW1lJywgJ3ZlcnNpb24nLCAndXJsJywgJ3NvZnR3YXJlVHlwZSddKVxuICAgICAgICAgIClcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGxpc3QgOiB0aGlzLnNvZnR3YXJlTGlzdFRvTGVnYWN5KGxpc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGV2aWNlW3N3RnJhZ21lbnRdIHx8IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNvZnR3YXJlTGlzdFRvTGVnYWN5KGxpc3Q6IElNYW5hZ2VkT2JqZWN0W10pOiBvYmplY3Qge1xuICAgIHJldHVybiAobGlzdCB8fCBbXSkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3Vyci5uYW1lXTogY3Vyci52ZXJzaW9uIH0pLCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEdsb2JhbEZyYWdtZW50KHR5cGU6IFJlcG9zaXRvcnlUeXBlKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdsb2JhbENvbmZpZ1NlcnZpY2UuZ2V0R2xvYmFsUGFyYW0odHlwZSkpID8geyBjOHlfR2xvYmFsOiB7fSB9IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVPdXRkYXRlZEJpbmFyeShuZXdCaW5hcnlVUkwsIG9sZEJpbmFyeVVSTCkge1xuICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5SWQgPSBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5nZXRJZEZyb21Vcmwob2xkQmluYXJ5VVJMKTtcbiAgICBjb25zdCBuZXdCaW5hcnlJZCA9IGF3YWl0IHRoaXMuaW52ZW50b3J5QmluYXJ5LmdldElkRnJvbVVybChuZXdCaW5hcnlVUkwpO1xuICAgIGlmIChleGlzdGluZ0JpbmFyeUlkICYmIGV4aXN0aW5nQmluYXJ5SWQgIT09IG5ld0JpbmFyeUlkKSB7XG4gICAgICBhd2FpdCB0aGlzLmludmVudG9yeUJpbmFyeS5kZWxldGUoZXhpc3RpbmdCaW5hcnlJZCk7XG4gICAgfVxuICB9XG59XG4iXX0=