@eo-sdk/client 10.6.38 → 10.6.40

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.
@@ -184,6 +184,25 @@ export class ObjectFormHelperService {
184
184
  break;
185
185
  }
186
186
  case 'EDIT': {
187
+ // we need to check, if the values have been changed and skip sending them to the backend, if nothing has changed
188
+ // the datetime fields need some extra logic to make the comparison work
189
+ if (fc._eoFormElement.type === 'DATETIME') {
190
+ const date = new Date(val);
191
+ if (!initialData[fc._eoFormElement.name].includes('T')) {
192
+ const isoDateWithoutTime = new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().split('T')[0];
193
+ if (isoDateWithoutTime === initialData[fc._eoFormElement.name]) {
194
+ break;
195
+ }
196
+ }
197
+ else {
198
+ if (date.toISOString() === initialData[fc._eoFormElement.name]) {
199
+ break;
200
+ }
201
+ }
202
+ }
203
+ else if (val === initialData[fc._eoFormElement.name]) {
204
+ break;
205
+ }
187
206
  // in edit situation we have to compare new values against the initial values
188
207
  // If a property that is contained in the forms initial data is removed (e.g. set to null)
189
208
  // then we have to set this null value, because otherwise the server will ignore the changes
@@ -714,4 +733,4 @@ ObjectFormHelperService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.
714
733
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ObjectFormHelperService, decorators: [{
715
734
  type: Injectable
716
735
  }], ctorParameters: function () { return [{ type: i1.Logger }, { type: i2.ReferenceService }, { type: i1.SearchService }, { type: i3.PluginsService }, { type: i1.SystemService }]; } });
717
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWZvcm0taGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2VvLWZyYW1ld29yay9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQWMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFTLFVBQVUsRUFBZ0IsYUFBYSxFQUFpQixLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkcsT0FBTyxFQUFDLFFBQVEsRUFBYyxFQUFFLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDN0UsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRXRFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDhEQUE4RCxDQUFDOzs7OztBQXlCdEcsTUFBTSxPQUFPLHVCQUF1QjtJQUlsQyxZQUFvQixNQUFjLEVBQ3hCLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixhQUE2QixFQUM3QixhQUE0QjtRQUpsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ3hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixh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QUFFLENBQUM7UUFDbkQsSUFBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQ2hDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0YsQ0FBQztJQUVPLDZCQUE2QjtRQUNuQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUk7WUFDRixNQUFNLE9BQU8sR0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUFFLEdBQUcsR0FBRyxPQUFPLENBQUM7U0FDM0M7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDakI7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sNEJBQTRCLENBQUMsQ0FBQztRQUMvRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O29IQWp3QlUsdUJBQXVCO3dIQUF2Qix1QkFBdUI7MkZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0ZVBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtWYWxpZGF0b3JGbiwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtMb2dnZXIsIFJhbmdlVmFsdWUsIFNlYXJjaEZpbHRlciwgU2VhcmNoU2VydmljZSwgU3lzdGVtU2VydmljZSwgVXRpbHN9IGZyb20gJ0Blby1zZGsvY29yZSc7XG5pbXBvcnQge2ZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtQbHVnaW5zU2VydmljZX0gZnJvbSAnLi4vLi4vZW8tZnJhbWV3b3JrLWNvcmUvYXBpL3BsdWdpbnMuc2VydmljZSc7XG5pbXBvcnQge1JlZmVyZW5jZVNlcnZpY2V9IGZyb20gJy4uLy4uL2VvLWZyYW1ld29yay1jb3JlL3JlZmVyZW5jZXMvcmVmZXJlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtPYmplY3RGb3JtT3B0aW9uc30gZnJvbSAnLi9vYmplY3QtZm9ybS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQge0Zvcm1WYWxpZGF0aW9ufSBmcm9tICcuL29iamVjdC1mb3JtL2Zvcm0tdmFsaWRhdGlvbi9mb3JtLXZhbGlkYXRpb24nO1xuaW1wb3J0IHtPYmplY3RGb3JtQ29udHJvbH0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1jb250cm9sJztcbmltcG9ydCB7T2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyfSBmcm9tICcuL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWNvbnRyb2wtd3JhcHBlcic7XG5pbXBvcnQge09iamVjdEZvcm1Hcm91cH0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1ncm91cC5tb2RlbCc7XG5pbXBvcnQge09iamVjdEZvcm1TY3JpcHRTZXJ2aWNlfSBmcm9tICcuL29iamVjdC1mb3JtL29iamVjdC1mb3JtLXNjcmlwdC9vYmplY3QtZm9ybS1zY3JpcHQuc2VydmljZSc7XG5pbXBvcnQge09iamVjdEZvcm1TY3JpcHRpbmdTY29wZX0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1zY3JpcHQvb2JqZWN0LWZvcm0tc2NyaXB0aW5nLXNjb3BlJztcbmltcG9ydCB7T2JqZWN0Rm9ybU1vZGVsfSBmcm9tICcuL29iamVjdC1mb3JtL29iamVjdC1mb3JtLm1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR2VuU2NvcGUge1xuICBnQ291bnQ6IG51bWJlcjtcbiAgZm9ybU9wdGlvbnM6IE9iamVjdEZvcm1PcHRpb25zO1xuICBpc0lubmVyVGFibGVGb3JtOiBib29sZWFuO1xuICBpbml0aWFsVmFsaWRhdG9yczoge1tuYW1lOiBzdHJpbmddOiBWYWxpZGF0b3JGbiB8IG51bGx9O1xuICBmb3JtR2VuUmVzdWx0OiBGb3JtR2VuUmVzdWx0O1xufVxuZXhwb3J0IGludGVyZmFjZSBGb3JtR2VuUmVzdWx0IHtcbiAgLy8gRm9ybSBjb250cm9scyBnZW5lcmF0ZWQgZnJvbSB0aGUgbW9kZWwgYXMgJ1F1aWNrIGFjY2VzcyBvYmplY3QnXG4gIC8vIEZvcm0gZWxlbWVudHMgbmFtZSBpcyBrZXkgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgZm9ybSBjb250cm9sIGl0c2VsZlxuICBmb3JtQ29udHJvbHM6IHtbbmFtZTogc3RyaW5nXTogT2JqZWN0Rm9ybUNvbnRyb2x9O1xuICBmb3JtTW9kZWw6IGFueSxcbiAgLy8gU3Vic2NyaXB0aW9ucyB0byB2YWx1ZSBjaGFuZ2VzIG9mIHRoZSBnZW5lcmF0ZWQgZm9ybSBjb250cm9sc1xuICAvLyBZb3Ugc2hvdWxkIGFsd2F5cyB1bnN1YnNjcmliZSBmcm9tIGFsbCBvZiB0aGVtIHdoZW4gY29uc3VtaW5nXG4gIC8vIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcbiAgY29udHJvbFZhbHVlU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW107XG4gIHNjcmlwdGluZ1Njb3BlOiBPYmplY3RGb3JtU2NyaXB0aW5nU2NvcGU7XG4gIHNjcmlwdE1vZGVsOiB7W25hbWU6IHN0cmluZ106IGFueX07XG4gIGZvcm06IE9iamVjdEZvcm1Hcm91cDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9iamVjdEZvcm1IZWxwZXJTZXJ2aWNlIHtcblxuICBwcml2YXRlIGRhdGVQaXBlID0gbmV3IERhdGVQaXBlKCdlbicpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWZlcmVuY2VTZXJ2aWNlOiBSZWZlcmVuY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIHBsdWdpblNlcnZpY2U6IFBsdWdpbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3lzdGVtU2VydmljZTogU3lzdGVtU2VydmljZSkge1xuICAgIHRoaXMuX2NsZWFyVGVtcG9yYXJ5U3RvcmFnZUVudHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZWFjdGl2ZSBmb3JtIGJhc2VkIG9uIGEgZm9ybSBtb2RlbCB0aGF0IG1heSBhbHNvIGluY2x1ZGUgZm9ybSBzY3JpcHRzLlxuICAgKiBAcGFyYW0gZm9ybU9wdGlvbnMgYE9iamVjdEZvcm1PcHRpb25zYCBkZWZpbmluZyB0aGUgZm9ybVxuICAgKiBAcGFyYW0gZm9ybVNjcmlwdFNlcnZpY2UgSW5zdGFuY2Ugb2YgYSBgT2JqZWN0Rm9ybVNjcmlwdFNlcnZpY2VgLiBUaGlzIHNlcnZpY2UgaXMgc3VwcG9zZWQgdG8gYmVcbiAgICogc2NvcGVkIHRvIHRoZSBjb21wb25lbnQgcmVuZGVyaW5nIHRoZSBmb3JtIChwcm92aWRlcnMgYXJyYXkgaW4gY29tcG9uZW50IGRlY29yYXRvcikuXG4gICAqIEBwYXJhbSBpc0lubmVyVGFibGVGb3JtIHdoZXRoZXIgb3Igbm90IHRoZSBmb3JtIGlzIHBhcnQgb2YgYW5vdGhlciBmb3JtIChhcyBpcyB3aXRoIHRhYmxlIGVkaXQgZm9ybXMpXG4gICAqIEByZXR1cm5zIEFuIGBGb3JtR2VuUmVzdWx0YCBvYmplY3RcbiAgICovXG4gIGJ1aWxkUmVhY3RpdmVGb3JtKFxuICAgIGZvcm1PcHRpb25zOiBPYmplY3RGb3JtT3B0aW9ucyxcbiAgICBmb3JtU2NyaXB0U2VydmljZTogT2JqZWN0Rm9ybVNjcmlwdFNlcnZpY2UsXG4gICAgaXNJbm5lclRhYmxlRm9ybT86IGJvb2xlYW4pOiBGb3JtR2VuUmVzdWx0IHtcblxuICAgIGNvbnN0IF9zY29wZTogRm9ybUdlblNjb3BlID0ge1xuICAgICAgZ0NvdW50OiAwLFxuICAgICAgZm9ybU9wdGlvbnMsXG4gICAgICBpc0lubmVyVGFibGVGb3JtLFxuICAgICAgaW5pdGlhbFZhbGlkYXRvcnM6IHt9LFxuICAgICAgZm9ybUdlblJlc3VsdDoge1xuICAgICAgICBmb3JtQ29udHJvbHM6IHt9LFxuICAgICAgICBmb3JtTW9kZWw6IHt9LFxuICAgICAgICBjb250cm9sVmFsdWVTdWJzY3JpcHRpb25zOiBbXSxcbiAgICAgICAgc2NyaXB0aW5nU2NvcGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NyaXB0TW9kZWw6IHt9LFxuICAgICAgICBmb3JtOiBudWxsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybU1vZGVsID0gdGhpcy5fZGF0YVRvRm9ybShfc2NvcGUsIGZvcm1PcHRpb25zLmZvcm1Nb2RlbCwgZm9ybU9wdGlvbnMuZGF0YSk7XG4gICAgX3Njb3BlLmZvcm1HZW5SZXN1bHQuZm9ybU1vZGVsID0gZm9ybU1vZGVsO1xuICAgIGlmICghZm9ybU1vZGVsKSByZXR1cm47XG5cbiAgICAvLyBpZiBhIHNjcmlwdCBpcyBhdmFpbGFibGUsIHdlJ2xsIGluaXQgdGhlIGZvcm0gc2NyaXB0aW5nIGZvciB0aGVcbiAgICAvLyBjdXJyZW50IGZvcm1cbiAgICBsZXQgc2NyaXB0aW5nU2NvcGU6IE9iamVjdEZvcm1TY3JpcHRpbmdTY29wZTtcbiAgICBpZiAoX3Njb3BlLmlzSW5uZXJUYWJsZUZvcm0gfHwgKGZvcm1Nb2RlbC5zY3JpcHQgJiYgZm9ybU1vZGVsLnNjcmlwdC5sZW5ndGggPiAwKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FkZGluZyBmb3JtIHNjcmlwdGluZyBzY29wZScpO1xuICAgICAgc2NyaXB0aW5nU2NvcGUgPSBuZXcgT2JqZWN0Rm9ybVNjcmlwdGluZ1Njb3BlKFxuICAgICAgICBmb3JtTW9kZWwuc2l0dWF0aW9uLFxuICAgICAgICB0aGlzLl9nZXRTY3JpcHRpbmdNb2RlbENoYW5nZWQoX3Njb3BlKSxcbiAgICAgICAgdGhpcy5wbHVnaW5TZXJ2aWNlLmdldEFwaSgpLFxuICAgICAgICBfc2NvcGUuaXNJbm5lclRhYmxlRm9ybVxuICAgICAgKTtcbiAgICAgIHNjcmlwdGluZ1Njb3BlLm9iamVjdElkID0gZm9ybU9wdGlvbnMub2JqZWN0SWQ7XG4gICAgfVxuICAgIF9zY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlID0gc2NyaXB0aW5nU2NvcGU7XG5cblxuICAgIGxldCBmb3JtID0gbmV3IE9iamVjdEZvcm1Hcm91cCh7fSk7XG4gICAgaWYgKGZvcm1Nb2RlbC5lbGVtZW50c1swXSAmJiBmb3JtTW9kZWwuZWxlbWVudHNbMF0uZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuX2FkZEZvcm1Db250cm9sKF9zY29wZSwgZm9ybSwgZm9ybU1vZGVsLmVsZW1lbnRzWzBdLCAnY29yZScpO1xuICAgIH1cbiAgICBpZiAoZm9ybU1vZGVsLmVsZW1lbnRzWzFdICYmIGZvcm1Nb2RlbC5lbGVtZW50c1sxXS5lbGVtZW50cykge1xuICAgICAgdGhpcy5fYWRkRm9ybUNvbnRyb2woX3Njb3BlLCBmb3JtLCBmb3JtTW9kZWwuZWxlbWVudHNbMV0sICdkYXRhJyk7XG4gICAgfVxuICAgIF9zY29wZS5mb3JtR2VuUmVzdWx0LmZvcm0gPSBmb3JtO1xuICAgIHRoaXMuX2luaXRWYWxpZGF0b3JzKF9zY29wZS5mb3JtR2VuUmVzdWx0LmZvcm0sIF9zY29wZSk7XG4gICAgdGhpcy5faW5pdFNjcmlwdGluZ1Njb3BlKF9zY29wZSwgZm9ybVNjcmlwdFNlcnZpY2UpO1xuICAgIHJldHVybiBfc2NvcGUuZm9ybUdlblJlc3VsdDtcbiAgfVxuXG5cblxuICAvKipcbiAgICogQ29udmVydHMgYSBmb3JtIGVsZW1lbnQgb2JqZWN0IHRvIGFuIE9iamVjdEZvcm1Db250cm9sV3JhcHBlciB3aGljaCB0aGVuIGNhbiBiZSB1c2VkIHRvXG4gICAqIHJlbmRlciBhIGZyb20gY29udHJvbC4gUmVzdWx0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBGb3JtRWxlbWVudENvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSB0aGUgZWxlbWVudCBvYmplY3Qgb3IgYSBqc29uIHN0cmluZ1xuICAgKiBAcGFyYW0gc2l0dWF0aW9uIC0gb3B0aW9uYWwgcHJvcGVydHkgdG8gc2V0IHVwIGEgZm9ybSBzaXR1YXRpb24gZm9yIHRoZSBjb250cm9sIChkZWZhdWx0IGlzIEVESVQpXG4gICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIgb3IgbnVsbCBpbiBjYXNlIG9mIGFuIGVycm9yXG4gICAqL1xuICBlbGVtZW50VG9Gb3JtQ29udHJvbChlbGVtZW50OiBhbnksIHNpdHVhdGlvbj86IHN0cmluZyk6IE9iamVjdEZvcm1Db250cm9sV3JhcHBlciB7XG5cbiAgICBsZXQgZm9ybUVsZW1lbnQ7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9ybUVsZW1lbnQgPSBKU09OLnBhcnNlKGVsZW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHBhcnNlIGZvcm0gZWxlbWVudCBmcm9tIGpzb24gJywgZm9ybUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXJcbiAgICBsZXQgd3JhcHBlciA9IG5ldyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIoe30pO1xuICAgIGxldCBmb3JtU2l0dWF0aW9uID0gc2l0dWF0aW9uID8gc2l0dWF0aW9uIDogJ0VESVQnO1xuXG4gICAgd3JhcHBlci5fZW9Gb3JtQ29udHJvbFdyYXBwZXIgPSB7XG4gICAgICBjb250cm9sTmFtZTogZm9ybUVsZW1lbnQubmFtZSxcbiAgICAgIHNpdHVhdGlvbjogZm9ybVNpdHVhdGlvblxuICAgIH07XG5cbiAgICAvLyBmb3IgY29kZXN5c3RlbSBlbGVtZW50cyBhZGQgZW50cmllcyBpZiBub3QgeWV0IHByb3ZpZGVkXG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJyAmJiAoIWZvcm1FbGVtZW50LmNvZGVzeXN0ZW0gfHwgIWZvcm1FbGVtZW50LmNvZGVzeXN0ZW0uZW50cmllcykpIHtcbiAgICAgIGZvcm1FbGVtZW50LmNvZGVzeXN0ZW0gPSB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Q29kZXN5c3RlbShmb3JtRWxlbWVudC5jb2Rlc3lzdGVtLmlkKTtcbiAgICB9XG4gICAgLy8gY3JlYXRlIHRoZSBhY3R1YWwgZm9ybSBjb250cm9sXG4gICAgbGV0IGNvbnRyb2xEaXNhYmxlZCA9ICEhZm9ybUVsZW1lbnQucmVhZG9ubHk7XG4gICAgbGV0IGZvcm1Db250cm9sID0gbmV3IE9iamVjdEZvcm1Db250cm9sKHtcbiAgICAgIHZhbHVlOiBmb3JtRWxlbWVudC52YWx1ZSxcbiAgICAgIGRpc2FibGVkOiBjb250cm9sRGlzYWJsZWRcbiAgICB9LCBGb3JtVmFsaWRhdGlvbi5nZXRWYWxpZGF0b3JzKGZvcm1FbGVtZW50LCBmb3JtU2l0dWF0aW9uKSk7XG5cbiAgICAvLyBGb3JtIGVsZW1lbnRzIGluIFNFQVJDSCBzaXR1YXRpb24gbWF5IGFycml2ZSB3aXRoIGEgdmFsdWUgc2V0IHRvIE5VTEwgKGV4cGxpY2l0IHNlYXJjaCBmb3JcbiAgICAvLyBmaWVsZHMgdGhhdCBhcmUgTk9UIHNldCkuIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHByZXBhcmUgdGhlIGZvcm0gY29udHJvbFxuICAgIGlmIChmb3JtU2l0dWF0aW9uID09PSAnU0VBUkNIJyAmJiBmb3JtRWxlbWVudC52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQgPSBmb3JtRWxlbWVudDtcbiAgICB3cmFwcGVyLmFkZENvbnRyb2woZm9ybUVsZW1lbnQubmFtZSwgZm9ybUNvbnRyb2wpO1xuXG4gICAgcmV0dXJuIHdyYXBwZXI7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBkYXRhIGZyb20gYW4gb2JqZWN0IGZvcm0gYmFzZWQgb24gc2l0dWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAtIGZvcm0gdG8gZXh0cmFjdCBkYXRhIGZyb21cbiAgICogQHBhcmFtIHNpdHVhdGlvbiAtIGZvcm0gc2l0dWF0aW9uXG4gICAqIEBwYXJhbSBbaW5pdGlhbERhdGFdIC0gb3B0aW9uYWwgZm9ybSBkYXRhIHRvIG1hdGNoIHRoZSBjdXJyZW50IHZhbHVlcyBhZ2FpbnN0XG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGVkaXRpZyBpbmRleGRhdGEgKEVESVQgc2l0dWF0aW9uKSwgYmVjYXVzZSB3ZSBoYXZlIHRvIGNvbXBhcmUgbmV3IHZhbHVlc1xuICAgKiBhZ2FpbnN0IHRoZSBpbml0aWFsIHZhbHVlcy4gSWYgYSBwcm9wZXJ0eSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgZm9ybXMgaW5pdGlhbCBkYXRhIGlzIHJlbW92ZWRcbiAgICogKGUuZy4gc2V0IHRvIG51bGwpIHRoZW4gd2UgaGF2ZSB0byBzZXQgdGhpcyBudWxsIHZhbHVlLCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgc2VydmVyIHdvdWxkXG4gICAqIGlnbm9yZSB0aGUgY2hhbmdlcy5cbiAgICogQHBhcmFtIGlzVGFibGVSb3dFZGl0Rm9ybSBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgcHJvdmlkZWQgZm9ybSBpcyBhbiBpbmxpbmUgZm9ybSB1c2VkIGJ5XG4gICAqIGEgZm9ybXMgdGFibGUgZWxlbWVudCBmb3IgZWRpdGluZyByb3dzLiBUaG9zZSBuZWVkIGEgc3BlY2lhbCBoYW5kbGluZy5cbiAgICogQHJldHVybiBleHRyYWN0ZWQgZGF0YSBhcyBvYmplY3RcbiAgICovXG4gIGV4dHJhY3RGb3JtRGF0YShmb3JtOiBPYmplY3RGb3JtR3JvdXAsIHNpdHVhdGlvbjogc3RyaW5nLCBpbml0aWFsRGF0YT86IGFueSwgaXNUYWJsZVJvd0VkaXRGb3JtPzogYm9vbGVhbikge1xuICAgIGxldCBleHRyYWN0ZWREYXRhID0ge307XG4gICAgdGhpcy5nZXRFbGVtZW50VmFsdWVzKGV4dHJhY3RlZERhdGEsIGZvcm0sIHNpdHVhdGlvbiB8fCAnRURJVCcsIGluaXRpYWxEYXRhLCBpc1RhYmxlUm93RWRpdEZvcm0pO1xuICAgIHJldHVybiBleHRyYWN0ZWREYXRhO1xuICB9XG5cbiAgLy8gUmVjdXJzaXZlIG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlcyBmcm9tIGVhY2ggZm9ybSBjb250cm9sLlxuICBwcml2YXRlIGdldEVsZW1lbnRWYWx1ZXMoZGF0YTogYW55LCBmb3JtQ29udHJvbDogT2JqZWN0Rm9ybU1vZGVsLCBzaXR1YXRpb246IHN0cmluZywgaW5pdGlhbERhdGE/OiBhbnksIGlzVGFibGVSb3dFZGl0Rm9ybT86IGJvb2xlYW4pIHtcblxuICAgIGlmICghZm9ybUNvbnRyb2wgfHwgIWZvcm1Db250cm9sLmNvbnRyb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvcm1Db250cm9sIGluc3RhbmNlb2YgT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyKSB7XG5cbiAgICAgIGNvbnN0IGZjOiBhbnkgPSBmb3JtQ29udHJvbC5jb250cm9sc1tmb3JtQ29udHJvbC5fZW9Gb3JtQ29udHJvbFdyYXBwZXIuY29udHJvbE5hbWVdO1xuXG4gICAgICBpZiAoZmMuX2VvRm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBmb3JtIGVsZW1lbnRzIG1heSBleHBsaWNpdGx5IHNldCB0byBoYXZlIE5VTEwgdmFsdWUgKGUuZy4gZnJvbSBTZWFyY2ggZm9ybSBpZiB2YWx1ZXMgYXJlIHJlcXVlc3RlZCB0aGF0IGhhdmUgbm8gdmFsdWVzKVxuICAgICAgICBpZiAoaXNUYWJsZVJvd0VkaXRGb3JtKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQubmFtZSwgbnVsbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQucW5hbWUsIG51bGwsIGRhdGEsIGZjLl9lb0Zvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZmMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgdmFsID0gZmMudmFsdWU7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgbWV0YSBkYXRhIGFyZSBhbHNvIHVwIHRvIGRhdGVcbiAgICAgICAgaWYgKGZjLl9lb0Zvcm1FbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJykge1xuICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldENvZGVzeXN0ZW0oZmMuX2VvRm9ybUVsZW1lbnQuY29kZXN5c3RlbS5pZCk7XG4gICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQuZGF0YU1ldGEgPSBjcy5lbnRyaWVzLmZpbmQoZSA9PiBlLmRhdGEgPT09IHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHNpdHVhdGlvbikge1xuICAgICAgICAgIGNhc2UgJ1NFQVJDSCc6IHtcbiAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gcm93IGVkaXRpbmcgZm9ybXMgdXNlIHRoZSBuYW1lIGluc3RlYWQgb2YgdGhlIHFuYW1lIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAvLyB0YWJsZXMgZ3JpZCBpc24ndCBhYmxlIHRvIG1hcCB0aGUgZmllbGRzXG4gICAgICAgICAgICAgIGlmICghaXNUYWJsZVJvd0VkaXRGb3JtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQucW5hbWUsIHZhbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFWYWx1ZShmYy5fZW9Gb3JtRWxlbWVudC5uYW1lLCB2YWwsIGRhdGEsIGZjLl9lb0Zvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdDUkVBVEUnOiB7XG4gICAgICAgICAgICAvLyBhbHNvIGFkZCBOVUxMIHZhbHVlcyAob3ZlcnJpZGUgZXhpc3RpbmcgZGVmYXVsdHZhbHVlcylcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50Lm5hbWUsIHZhbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdFRElUJzoge1xuICAgICAgICAgICAgLy8gaW4gZWRpdCBzaXR1YXRpb24gd2UgaGF2ZSB0byBjb21wYXJlIG5ldyB2YWx1ZXMgYWdhaW5zdCB0aGUgaW5pdGlhbCB2YWx1ZXNcbiAgICAgICAgICAgIC8vIElmIGEgcHJvcGVydHkgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIGZvcm1zIGluaXRpYWwgZGF0YSBpcyByZW1vdmVkIChlLmcuIHNldCB0byBudWxsKVxuICAgICAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIHRvIHNldCB0aGlzIG51bGwgdmFsdWUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBzZXJ2ZXIgd2lsbCBpZ25vcmUgdGhlIGNoYW5nZXNcbiAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwgfHwgKGluaXRpYWxEYXRhICYmIGluaXRpYWxEYXRhW2ZjLl9lb0Zvcm1FbGVtZW50Lm5hbWVdICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgIC8vIGRhdGFbZmMuX2VvRm9ybUVsZW1lbnQubmFtZV0gPSB2YWw7XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50Lm5hbWUsIHZhbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyhmb3JtQ29udHJvbC5jb250cm9scylcbiAgICAgICAgLmZvckVhY2goY29udHJvbEtleSA9PiB7XG4gICAgICAgICAgbGV0IGZvcm1Db250cm9sS2V5ZWQgPSA8T2JqZWN0Rm9ybUdyb3VwPmZvcm1Db250cm9sLmNvbnRyb2xzW2NvbnRyb2xLZXldO1xuICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudFZhbHVlcyhkYXRhLCBmb3JtQ29udHJvbEtleWVkLCBzaXR1YXRpb24sIGluaXRpYWxEYXRhLCBpc1RhYmxlUm93RWRpdEZvcm0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldERhdGFWYWx1ZShrZXksIHZhbHVlLCBkYXRhLCBmb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKSB7XG4gICAgZGF0YVtrZXldID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSwgZm9ybUVsZW1lbnQpO1xuXG4gICAgaWYgKGlzVGFibGVSb3dFZGl0Rm9ybSAmJiBmb3JtRWxlbWVudC5kYXRhTWV0YSkge1xuICAgICAgLy8gaW5uZXIgdGFibGVzIG5lZWQgdG8gc2V0IHVwIHRoZSBtZXRhIGRhdGEgYXMgd2VsbFxuICAgICAgZGF0YVtrZXkgKyAnX21ldGEnXSA9IGZvcm1FbGVtZW50LmRhdGFNZXRhO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFZhbHVlKHZhbHVlLCBmb3JtRWxlbWVudCkge1xuICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnREFURVRJTUUnICYmICFmb3JtRWxlbWVudC53aXRodGltZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAneXl5eS1NTS1kZCcpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJhbmdlVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVZhbHVlKFxuICAgICAgICAgIHZhbHVlLm9wZXJhdG9yLFxuICAgICAgICAgIHZhbHVlLmZpcnN0VmFsdWUgJiYgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUuZmlyc3RWYWx1ZSwgJ3l5eXktTU0tZGQnKSxcbiAgICAgICAgICB2YWx1ZS5zZWNvbmRWYWx1ZSAmJiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZS5zZWNvbmRWYWx1ZSwgJ3l5eXktTU0tZGQnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAoZm9ybUVsZW1lbnQuZWxlbWVudHMgfHwgW10pLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAodmFsdWUgfHwgW10pLmZvckVhY2godiA9PiB2W2VsLm5hbWVdID0gdGhpcy5mb3JtYXRWYWx1ZSh2W2VsLm5hbWVdLCBlbCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG5cbiAgLy8gRnVuY3Rpb25zIGludm9sdmVkIGluIGJ1aWxkaW5nIGFuIG9iamVjdCBmb3JtXG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBtZXRob2QgYWRkaW5nIGEgbmV3IFVudHlwZWRGb3JtQ29udHJvbCAoZ3JvdXAgb3IgY29udHJvbCkgdG8gYSBwYXJlbnQgZm9ybSBncm91cFxuICAgKlxuICAgKiBAcGFyYW0gcGFyZW50R3JvdXAgLSB0aGUgcGFyZW50IGdyb3VwIHRvIGFkZCB0aGUgY29udHJvbCB0b1xuICAgKiBAcGFyYW0gZm9ybUVsZW1lbnQgLSB0aGUgZW5haW8gZm9ybSBtb2RlbCBlbGVtZW50IHRvIGNyZWF0ZSB0aGUgY2hpbGQgY29udHJvbCBmcm9tXG4gICAqIEBwYXJhbSBbdXNlTmFtZV0gLSB1c2UgdGhpcyBuYW1lIGluc3RlYWQgb2YgdGhlIG9uZSBmcm9tIHRoZSBtb2RlbFxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkRm9ybUNvbnRyb2woc2NvcGU6IEZvcm1HZW5TY29wZSwgcGFyZW50R3JvdXA6IE9iamVjdEZvcm1Hcm91cCwgZm9ybUVsZW1lbnQ6IGFueSwgdXNlTmFtZT86IHN0cmluZykge1xuXG4gICAgbGV0IGN0cmw7XG4gICAgbGV0IG5hbWU7XG5cbiAgICAvLyBhZGQgYSBmb3JtIGdyb3VwXG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdvMm1Hcm91cCcgfHwgZm9ybUVsZW1lbnQudHlwZSA9PT0gJ28ybUdyb3VwU3RhY2snKSB7XG5cbiAgICAgIC8vIGRvIG5vdCBhZGQgZ3JvdXBzIHRoYXQgYXJlIGVtcHR5XG4gICAgICBpZiAoIWZvcm1FbGVtZW50LmVsZW1lbnRzIHx8IGZvcm1FbGVtZW50LmVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRm91bmQgZW1wdHkgZm9ybSBncm91cCcsIGZvcm1FbGVtZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjdHJsID0gbmV3IE9iamVjdEZvcm1Hcm91cCh7fSk7XG4gICAgICBjdHJsLl9lb0Zvcm1Hcm91cCA9IHtcbiAgICAgICAgbGFiZWw6IGZvcm1FbGVtZW50LmxhYmVsLFxuICAgICAgICBsYXlvdXQ6IGZvcm1FbGVtZW50LmxheW91dCxcbiAgICAgICAgdHlwZTogZm9ybUVsZW1lbnQudHlwZVxuICAgICAgfTtcblxuICAgICAgaWYgKHVzZU5hbWUgPT09ICdjb3JlJyB8fCB1c2VOYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgY3RybC5fZW9Gb3JtR3JvdXAubGFiZWwgPSB1c2VOYW1lO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBlIG9mIGZvcm1FbGVtZW50LmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuX2FkZEZvcm1Db250cm9sKHNjb3BlLCBjdHJsLCBlKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSB1c2VOYW1lIHx8ICdmZycgKyBzY29wZS5nQ291bnQrKztcbiAgICAgIGN0cmwuX2VvRm9ybUdyb3VwLmlkID0gYCR7c2NvcGUuZm9ybU9wdGlvbnMubGF5b3V0U2V0dGluZ3NJRCB8fCBzY29wZS5mb3JtT3B0aW9ucy5mb3JtTW9kZWwubmFtZX0uJHtuYW1lfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkZCBmb3JtIGNvbnRyb2xcbiAgICAgIC8vIFRvIGJlIGFibGUgdG8gaW50ZWdyYXRlIHJlY3Vyc2l2ZSBmb3JtIGNvbnRyb2xzIGludG8gdGhlIG1haW4gZm9ybSxcbiAgICAgIC8vIHdlIGhhdmUgdG8gd3JhcCB0aGVtIGluIGEgZm9ybSBncm91cFxuICAgICAgY3RybCA9IG5ldyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIoe30pO1xuICAgICAgY3RybC5fZW9Gb3JtQ29udHJvbFdyYXBwZXIgPSB7XG4gICAgICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIFVudHlwZWRGb3JtQ29udHJvbFxuICAgICAgICBjb250cm9sTmFtZTogZm9ybUVsZW1lbnQubmFtZSxcbiAgICAgICAgc2l0dWF0aW9uOiBzY29wZS5mb3JtT3B0aW9ucy5mb3JtTW9kZWwuc2l0dWF0aW9uXG4gICAgICB9O1xuICAgICAgaWYgKHNjb3BlLmZvcm1PcHRpb25zLmZvcm1Nb2RlbC5zaXR1YXRpb24gPT09ICdTRUFSQ0gnICYmIGZvcm1FbGVtZW50LnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGZvcm1FbGVtZW50LmlzTm90U2V0VmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gZG8gbm90IHNldCBhIHJlZmVyZW5jZSBhcyB0aGUgZm9ybSBjb250cm9scyB2YWx1ZVxuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGNvdWxkIG5vdCByZXNldCB0aGUgZm9ybVxuICAgICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtRWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgLy8gY29weSBieSB2YWx1ZSBmb3IgYXJyYXlzIG9mIG9iamVjdHMgKGUuZy4gdGFibGUgZGF0YSlcbiAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgZm9ybUVsZW1lbnQudmFsdWUuZm9yRWFjaCgobykgPT4ge1xuICAgICAgICAgIHZhbHVlLnB1c2goVXRpbHMuZm9ybURhdGFQYXJzZShVdGlscy5mb3JtRGF0YVN0cmluZ2lmeShvKSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZm9ybUVsZW1lbnQudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGZvciBjb2Rlc3lzdGVtIGVsZW1lbnRzIGFkZCBlbnRyaWVzIGlmIG5vdCB5ZXQgcHJvdmlkZWRcbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnQ09ERVNZU1RFTScgJiYgIWZvcm1FbGVtZW50LmNvZGVzeXN0ZW0uZW50cmllcykge1xuICAgICAgICBmb3JtRWxlbWVudC5jb2Rlc3lzdGVtID0gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldENvZGVzeXN0ZW0oZm9ybUVsZW1lbnQuY29kZXN5c3RlbS5pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZSB0aGUgYWN0dWFsIGZvcm0gY29udHJvbFxuICAgICAgbGV0IGNvbnRyb2xEaXNhYmxlZCA9IHNjb3BlLmZvcm1PcHRpb25zLmRpc2FibGVkIHx8ICEhZm9ybUVsZW1lbnQucmVhZG9ubHk7XG4gICAgICBsZXQgZm9ybUNvbnRyb2wgPSBuZXcgT2JqZWN0Rm9ybUNvbnRyb2woe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGRpc2FibGVkOiBjb250cm9sRGlzYWJsZWRcbiAgICAgIH0pO1xuXG4gICAgICBmb3JtRWxlbWVudC5yZWFkb25seSA9IGNvbnRyb2xEaXNhYmxlZDtcblxuICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQgPSBmb3JtRWxlbWVudDtcbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybUNvbnRyb2xzW2Zvcm1FbGVtZW50Lm5hbWVdID0gZm9ybUNvbnRyb2w7XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnQ09ERVNZU1RFTScgfHwgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdTVFJJTkcnICYmIGZvcm1FbGVtZW50LmNsYXNzaWZpY2F0aW9uID09PSAnc2VsZWN0b3InKSkge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5hcHBseUZpbHRlciA9IChmdW5jOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmZpbHRlckZ1bmN0aW9uID0gZnVuYztcbiAgICAgICAgfTtcbiAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuYXBwbHlEaXNhYmxpbmdGaWx0ZXIgPSAoZnVuYzogRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5kaXNhYmxpbmdGaWx0ZXJGdW5jdGlvbiA9IGZ1bmM7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnU1RSSU5HJyAmJiBmb3JtRWxlbWVudC5jbGFzc2lmaWNhdGlvbiA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5zZXRMaXN0ID0gKGxpc3RPYmplY3Q6IGFueSkgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50Lmxpc3QgPSBsaXN0T2JqZWN0O1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ09SR0FOSVpBVElPTicpIHtcbiAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuc2V0RmlsdGVyID0gKGZpbHRlck9iamVjdDogYW55KSA9PiB7XG4gICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZmlsdGVyID0gZmlsdGVyT2JqZWN0O1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ1RBQkxFJykge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5vYmplY3QgPSBzY29wZS5mb3JtT3B0aW9ucy5vYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnUkVGRVJFTkNFJykge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5zZXRRdWVyeUZpbHRlcnMgPSAocXVlcnlGaWx0ZXJzT2JqZWN0OiB7W2ZpZWxkUW5hbWU6IHN0cmluZ106IHtvOiBzdHJpbmcsIHYxOiBhbnksIHYyOiBhbnl9fSwgb2JqZWN0VHlwZXM/OiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnF1ZXJ5RmlsdGVycyA9IHF1ZXJ5RmlsdGVyc09iamVjdDtcbiAgICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5vYmplY3RUeXBlc0ZpbHRlciA9IG9iamVjdFR5cGVzO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcGUuZm9ybU9wdGlvbnMuZm9ybU1vZGVsLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgICAgLy8gaW4gc2VhcmNoIHNpdHVhdGlvbiBldmVuIHJlYWRvbmx5IGZpZWxkcyBzaG91bGQgYmUgZWRpdGFibGUgLi4uXG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnJlYWRvbmx5ID0gZmFsc2U7XG4gICAgICAgIC8vIC4uLiBhbmQgcmVxdWlyZWQgbWFrZXMgbm8gc2Vuc2UgaGVyZVxuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5yZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyByZW1vdmUgZW1wdHkgZGVzY3JpcHRpb25zXG4gICAgICBsZXQgZGVzYyA9IGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uO1xuICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmb3JtIGVsZW1lbnQgdG8gdGhlIHNjcmlwdCBtb2RlbCB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgaW50b1xuICAgICAgLy8gdGhlIGZvcm1zIHNjcmlwdGluZyBzY29wZSBsYXRlciBvblxuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRNb2RlbFtmb3JtRWxlbWVudC5uYW1lXSA9IGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50O1xuXG4gICAgICAvLyBhcHBseSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhlIGZvcm0gY29udHJvbCwgdGhhdCB3aWxsIHRyaWdnZXJcbiAgICAgIC8vIHRoZSBmb3JtIGVsZW1lbnRzIG9uQ2hhbmdlIGxpc3RlbmVyXG4gICAgICBsZXQgY29udHJvbFdhdGNoID0gY3RybC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ1RBQkxFJyA/IDAgOiA1MDApKTtcbiAgICAgIGNvbnRyb2xXYXRjaC5zdWJzY3JpYmUoKHYpID0+IHtcbiAgICAgICAgaWYgKGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnR5cGUgPT09ICdSRUZFUkVOQ0UnKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0RGF0YU1ldGEoZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQsIHZbZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQubmFtZV0pLnN1YnNjcmliZShtID0+IHtcbiAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRhdGFNZXRhID0gZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQubXVsdGlzZWxlY3QgPyBtIDogbVswXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5kYXRhTWV0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZSkge1xuICAgICAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUubW9kZWxDaGFuZ2VkKHYpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuY29udHJvbFZhbHVlU3Vic2NyaXB0aW9ucy5wdXNoKGNvbnRyb2xXYXRjaCk7XG5cbiAgICAgIGN0cmwuYWRkQ29udHJvbChmb3JtRWxlbWVudC5uYW1lLCBmb3JtQ29udHJvbCk7XG4gICAgICBuYW1lID0gJ2ZnXycgKyBmb3JtRWxlbWVudC5uYW1lO1xuICAgIH1cbiAgICBwYXJlbnRHcm91cC5hZGRDb250cm9sKG5hbWUsIGN0cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGRhdGEgaW50byBhIGZvcm0gbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIGZvcm0gbW9kZWxcbiAgICogQHBhcmFtIGRhdGEgLSBkYXRhIG9iamVjdCBvciBhcnJheSBvZiBTZWFyY2hGaWx0ZXIgb2JqZWN0cyBpbiBjYXNlIG9mIGEgc2VhcmNoIGZvcm1cbiAgICovXG4gIHByaXZhdGUgX2RhdGFUb0Zvcm0oc2NvcGU6IEZvcm1HZW5TY29wZSwgbW9kZWw6IGFueSwgZGF0YTogYW55KSB7XG4gICAgaWYgKG1vZGVsICYmIGRhdGEpIHtcbiAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZXMoc2NvcGUsIG1vZGVsLmVsZW1lbnRzLCBkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlIG1ldGhvZCBmb3IgYWRkaW5nIHZhbHVlcyB0byBtb2RlbCBlbGVtZW50c1xuICBwcml2YXRlIF9zZXRFbGVtZW50VmFsdWVzKHNjb3BlOiBGb3JtR2VuU2NvcGUsIGVsZW1lbnRzLCBkYXRhKSB7XG5cbiAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKHRoaXMuX2hhc1ZhbHVlKGRhdGEsIGVsZW1lbnQpKSB7XG5cbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IHRoaXMuX2dldFZhbHVlKHNjb3BlLCBkYXRhLCBlbGVtZW50KTtcbiAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAvLyBhZGQgbWV0YSBkYXRhIGZvciBzb21lIG9mIHRoZSB0eXBlc1xuICAgICAgICAgIHRoaXMuX2ZldGNoTWV0YURhdGEoc2NvcGUsIGRhdGEsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZWxlbWVudC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50LnR5cGUgIT09ICdUQUJMRScgJiYgZWxlbWVudC5lbGVtZW50cyAmJiBlbGVtZW50LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlcyhzY29wZSwgZWxlbWVudC5lbGVtZW50cywgZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBpbiBzb21lIGNhc2VzIHJlcXVpcmVkIG1ldGEgZGF0YSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGUgZWxlbWVudCBpdHNlbGZcbiAgLy8gc28gdGhleSBoYXZlIHRvIGJlIGZldGNoZWQgYW5kIGFkZGVkIHRvIHRoZSBlbGVtZW50IGZvciB0aGUgZm9ybSB0byBiZSBhYmxlXG4gIC8vIHRvIHJlbmRlciB0aGUgZWxlbWVudCBjb3JyZWN0bHlcbiAgcHJpdmF0ZSBfZmV0Y2hNZXRhRGF0YShzY29wZTogRm9ybUdlblNjb3BlLCBkYXRhLCBlbGVtZW50KSB7XG5cbiAgICBpZiAoc2NvcGUuZm9ybU9wdGlvbnMuZm9ybU1vZGVsLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgIC8vIHRvZG86IGhvdyB0byBmZXRjaCBtZXRhIGRhdGEgaW4gc2VhcmNoIHNpdHVhdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnT1JHQU5JWkFUSU9OJyAmJiBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddKSB7XG4gICAgICAgIGVsZW1lbnQuZGF0YU1ldGEgPSBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJyAmJiBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddKSB7XG4gICAgICAgIGVsZW1lbnQuZGF0YU1ldGEgPSBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddO1xuICAgICAgICBlbGVtZW50LmRlZmF1bHRyZXByZXNlbnRhdGlvbiA9IGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ10uZGVmYXVsdHJlcHJlc2VudGF0aW9uO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdSRUZFUkVOQ0UnICYmIGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ10pIHtcbiAgICAgICAgZWxlbWVudC5kYXRhTWV0YSA9IGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGF0YU1ldGEoZm9ybUVsZW1lbnQ6IGFueSwgbmV3VmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgIHN3aXRjaCAoZm9ybUVsZW1lbnQudHlwZSkge1xuICAgICAgICBjYXNlICdPUkdBTklaQVRJT04nOiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uT2JqZWN0KG5ld1ZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3lzdGVtU2VydmljZS5nZXRPcmdhbml6YXRpb25PYmplY3QobmV3VmFsdWVbMF0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3lzdGVtU2VydmljZS5nZXRPcmdhbml6YXRpb25PYmplY3RzKG5ld1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUkVGRVJFTkNFJzoge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZVNlcnZpY2UuZmV0Y2hJRFJlZmVyZW5jZU1ldGFEYXRhKEFycmF5LmlzQXJyYXkobmV3VmFsdWUpID8gbmV3VmFsdWUgOiBbbmV3VmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDT0RFU1lTVEVNJzoge1xuICAgICAgICAgIHJldHVybiBvZih0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Q29kZXN5c3RlbShmb3JtRWxlbWVudC5jb2Rlc3lzdGVtLmlkKS5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkuZGVmYXVsdHJlcHJlc2VudGF0aW9uID09PSBuZXdWYWx1ZTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9mKG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFzVmFsdWUoZGF0YSwgZWxlbWVudCkge1xuXG4gICAgLy8gZGlmZmVyIGJldHdlZW4gYXJyYXkgb2YgU2VhcmNoRmlsdGVycyBhbmQgYSBmb3JtIGRhdGEgb2JqZWN0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdUQUJMRScpIHtcbiAgICAgICAgcmV0dXJuICEhKGRhdGEuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIucHJvcGVydHkuc3RhcnRzV2l0aChlbGVtZW50LnFuYW1lKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICEhKGRhdGEuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIucHJvcGVydHkgPT09IGVsZW1lbnQucW5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRhdGEuaGFzT3duUHJvcGVydHkoZWxlbWVudC5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRWYWx1ZShzY29wZTogRm9ybUdlblNjb3BlLCBkYXRhLCBlbGVtZW50KSB7XG5cbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKHNjb3BlLmZvcm1PcHRpb25zLmZvcm1Nb2RlbC5zaXR1YXRpb24gPT09ICdTRUFSQ0gnKSB7XG4gICAgICBpZiAoc2NvcGUuaXNJbm5lclRhYmxlRm9ybSkge1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnREFURVRJTUUnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ05VTUJFUicpIHtcbiAgICAgICAgICB2YWx1ZSA9IFNlYXJjaFNlcnZpY2UudG9SYW5nZVZhbHVlKGRhdGFbZWxlbWVudC5uYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBkYXRhW2VsZW1lbnQubmFtZV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnRhYmxlRmlsdGVyc1RvRWxlbWVudFZhbHVlKHRoaXMuX2dldFRhYmxlRmlsdGVycyhkYXRhLCBlbGVtZW50LnFuYW1lKSwgZWxlbWVudC5lbGVtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBkYXRhLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBlbGVtZW50LnFuYW1lKTtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnNlYXJjaFNlcnZpY2UuZmlsdGVyVG9FbGVtZW50VmFsdWUoZmlsdGVyLCBlbGVtZW50LnR5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdEQVRFVElNRScgJiYgZGF0YVtlbGVtZW50Lm5hbWVdKSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUoYCR7ZGF0YVtlbGVtZW50Lm5hbWVdfSR7KHR5cGVvZiBkYXRhW2VsZW1lbnQubmFtZV0gPT09ICdzdHJpbmcnID8gZGF0YVtlbGVtZW50Lm5hbWVdLmluZGV4T2YoJ1QnKSA6IGRhdGFbZWxlbWVudC5uYW1lXS50b0lTT1N0cmluZygpLmluZGV4T2YoJ1QnKSkgIT09IC0xID8gJycgOiAnVDAwOjAwOjAwJ31gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGF0YVtlbGVtZW50Lm5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUYWJsZUZpbHRlcnMoZmlsdGVyczogU2VhcmNoRmlsdGVyW10sIHByb3BlcnR5TmFtZTogc3RyaW5nKTogU2VhcmNoRmlsdGVyW10ge1xuICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcihmID0+IGYucHJvcGVydHkuc3RhcnRzV2l0aChwcm9wZXJ0eU5hbWUgKyAnLicpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRWYWxpZGF0b3JzKGZvcm1Db250cm9sOiBPYmplY3RGb3JtR3JvdXAsIHNjb3BlOiBGb3JtR2VuU2NvcGUpIHtcbiAgICBpZiAoZm9ybUNvbnRyb2wpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBmb3JtQ29udHJvbC5jb250cm9scykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUNvbnRyb2wuY29udHJvbHNba2V5XSBhcyBhbnk7XG4gICAgICAgIGlmIChjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgICAgdGhpcy5faW5pdFZhbGlkYXRvcnMoY29udHJvbCwgc2NvcGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjb3BlLmluaXRpYWxWYWxpZGF0b3JzW2NvbnRyb2wuX2VvRm9ybUVsZW1lbnQubmFtZV0gPSBjb250cm9sLnZhbGlkYXRvcjtcbiAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKFxuICAgICAgICAgICAgdGhpcy5fZ2V0VmFsaWRhdG9ycyhzY29wZSwgY29udHJvbC5fZW9Gb3JtRWxlbWVudCkuY29uY2F0KFxuICAgICAgICAgICAgICBbc2NvcGUuaW5pdGlhbFZhbGlkYXRvcnNbY29udHJvbC5fZW9Gb3JtRWxlbWVudC5uYW1lXV0pXG4gICAgICAgICAgKSk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgKiBCdWlsZCB2YWxpZGF0b3JzIGZvciB0aGUgZ2l2ZW4gZm9ybSBlbGVtZW50IHRvIGJlIGF0dGFjaGVkIHRvXG4gICogYSByZWFjdGl2ZSBmb3JtQ29udHJvbC5cbiAgKlxuICAqIEBwYXJhbSBmb3JtRWxlbWVudCAtIGZvcm0gZWxlbWVudCBvYmplY3RcbiAgKi9cbiAgcHJpdmF0ZSBfZ2V0VmFsaWRhdG9ycyhzY29wZTogRm9ybUdlblNjb3BlLCBmb3JtRWxlbWVudDogYW55KTogVmFsaWRhdG9yRm5bXSB7XG4gICAgbGV0IGVsbVZhbGlkYXRvcnMgPSBGb3JtVmFsaWRhdGlvbi5nZXRWYWxpZGF0b3JzKGZvcm1FbGVtZW50LCBzY29wZS5mb3JtT3B0aW9ucy5mb3JtTW9kZWwuc2l0dWF0aW9uKTtcbiAgICAvLyBhZGQgY3VzdG9tIHZhbGlkYXRvciBmb3Igc2NyaXB0IGVuYWJsZWQgZm9ybXNcbiAgICBpZiAoc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZSkge1xuICAgICAgZWxtVmFsaWRhdG9ycy5wdXNoKEZvcm1WYWxpZGF0aW9uLmN1c3RvbVNjcmlwdGluZ1ZhbGlkYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBlbG1WYWxpZGF0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFNjcmlwdGluZ1Njb3BlKHNjb3BlOiBGb3JtR2VuU2NvcGUsIGZvcm1TY3JpcHRTZXJ2aWNlOiBPYmplY3RGb3JtU2NyaXB0U2VydmljZSkge1xuICAgIGxldCB7ZGF0YSwgYWN0aW9ucywgb2JqZWN0cywgY29udGV4dH0gPSA8T2JqZWN0Rm9ybU9wdGlvbnM+KHNjb3BlLmZvcm1PcHRpb25zIHx8IHt9KTtcblxuICAgIGlmIChzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlKSB7XG4gICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlLnNldE1vZGVsKHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0TW9kZWwpO1xuICAgICAgLyoqIHByb3ZpZGUgYWNjZXNzIHRvIGFjdGlvbnMgKHVzZWQgaW5zaWRlIG9mIEJQTS1Gb3JtcykgKi9cbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUuYWN0aW9ucyA9IGFjdGlvbnM7XG4gICAgICAvKiogcHJvdmlkZSBhY2Nlc3MgdG8gYWRkaXRpb25hbCBvYmplY3RzICh1c2VkIGZvciBleGFtcGxlIGluIEJQTS1TdGFydC1Gb3JtcyB0b1xuICAgICAgICogYWRkIGRhdGEgb2YgRE1TLU9iamVjdHMgdG8gc3RhcnQgdGhlIHByb2Nlc3MgZm9yKVxuICAgICAgICovXG4gICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlLm9iamVjdHMgPSBvYmplY3RzO1xuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIC8qKiBwcm92aWRlIHJlYWRvbmx5IGFjY2VzcyB0byBpbml0aWFsIGZvcm0gZGF0YSAod2hpY2ggbWF5IGFsc28gY29udGFpbiB2YWx1ZXMgdGhhdFxuICAgICAgICogYXJlIG5vdCByZW5kZXJlZCBhcyBmb3JtIGVsZW1lbnRzIChpbnZpc2libGUgdmFsdWVzKSlcbiAgICAgICAqL1xuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZS5kYXRhID0gZGF0YTtcblxuICAgICAgLyoqIGJ5IGRlZmF1bHQsIHNjcmlwdGluZyBzY29wZXMgYXJlIGFwcGxpZWQgdG8gZm9ybXMuIEJ1dCB0YWJsZSBlbGVtZW50cyBjcmVhdGUgdGhlaXIgb3duIHNjb3BlXG4gICAgICAgKiBmb3IgZWRpdGluZyByb3dzLiBCZWluZyBvbmUgb2YgdGhvc2UgaW5uZXIgZm9ybXMgc2hvdWxkIG5vdCBydW4gdGhlIGZvcm0gc2NyaXB0IGFnYWluLCBidXRcbiAgICAgICAqIGluc3RlYWQganVzdCBwcm92aWRlIHRoZSBvYnNlcnZpbmcgYWJpbGl0aWVzIG9mIHRoZSBzY3JpcHRpbmcgc2NvcGUuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2NvcGUuZm9ybU9wdGlvbnMuZGlzYWJsZWQgJiYgIXNjb3BlLmlzSW5uZXJUYWJsZUZvcm0gJiYgc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtTW9kZWwpIHtcbiAgICAgICAgY29uc3Qgc2NyaXB0TmFtZSA9IHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybU1vZGVsLm5hbWUgKyAnXycgKyBzY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Nb2RlbC5zaXR1YXRpb247XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdleGVjdXRpbmcgZm9ybSBzY3JpcHQgJyArIHNjcmlwdE5hbWUpO1xuICAgICAgICBmb3JtU2NyaXB0U2VydmljZS5ydW5Gb3JtU2NyaXB0KFxuICAgICAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUsXG4gICAgICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtTW9kZWwuc2NyaXB0LFxuICAgICAgICAgIHNjcmlwdE5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlIHNjcmlwdCBjaGFuZ2VzIGl0cyBpbnRlcm5hbCBtb2RlbC5cbiAgICAgKiBJdCBpcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBzY3JpcHQgY2hhbmdlcyB0byB0aGUgYWN0dWFsIGZvcm0gbW9kZWwuXG4gICAgICpcbiAgICAgKiBUbyBlbnN1cmUgdGhlIHJpZ2h0IGNvbnRleHQsIHdlIGRlZmluZSBhbiBpbnN0YW5jZSBtZXRob2QgYXMgY2FsbGJhY2sgZm9yIHRoZSBzY3JpcHRpbmcgc2NvcGVcbiAgICAgKiBAc2VlOiBodHRwczovL2Jsb2cuam9obm55cmVpbGx5LmNvbS8yMDE0LzA0L3R5cGVzY3JpcHQtaW5zdGFuY2UtbWV0aG9kcy5odG1sXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9ybUNvbnRyb2xOYW1lXG4gICAgICogQHBhcmFtIGNoYW5nZVxuICAgICAqL1xuXG4gIHByaXZhdGUgX2dldFNjcmlwdGluZ01vZGVsQ2hhbmdlZChzY29wZTogRm9ybUdlblNjb3BlKTogRnVuY3Rpb24ge1xuICAgIHJldHVybiAoZm9ybUNvbnRyb2xOYW1lLCBjaGFuZ2UpID0+IHtcblxuICAgICAgLy8gZmluZCB0aGUgdGFyZ2V0IGNvbnRyb2xcbiAgICAgIGxldCBmYzogT2JqZWN0Rm9ybUNvbnRyb2wgPSBzY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Db250cm9sc1tmb3JtQ29udHJvbE5hbWVdIGFzIE9iamVjdEZvcm1Db250cm9sO1xuICAgICAgaWYgKGZjKSB7XG5cbiAgICAgICAgLy8gY2hhbmdlIG9ubHkgYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgIHN3aXRjaCAoY2hhbmdlLm5hbWUpIHtcbiAgICAgICAgICBjYXNlICd2YWx1ZSc6IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoYW5nZS5uZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0FycmF5VmFsdWVDaGFuZ2UoZmMsIGNoYW5nZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC52YWx1ZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGZjLnZhbHVlICE9PSBjaGFuZ2UubmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmYy5wYXRjaFZhbHVlKGNoYW5nZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgZmMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgIGZjLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlcXVpcmVkJzoge1xuICAgICAgICAgICAgaWYgKGZjLl9lb0Zvcm1FbGVtZW50LnJlcXVpcmVkICE9PSBjaGFuZ2UubmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQucmVxdWlyZWQgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICAgIC8vIGFwcGx5IG5ldyB2YWxpZGF0b3JzXG4gICAgICAgICAgICAgIC8vIEBzZWU6IGh0dHBzOi8vc2NvdGNoLmlvL3R1dG9yaWFscy9ob3ctdG8taW1wbGVtZW50LWNvbmRpdGlvbmFsLXZhbGlkYXRpb24taW4tYW5ndWxhci0yLW1vZGVsLWRyaXZlbi1mb3Jtc1xuICAgICAgICAgICAgICBmYy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZSh0aGlzLl9nZXRWYWxpZGF0b3JzKHNjb3BlLCBmYy5fZW9Gb3JtRWxlbWVudCkuY29uY2F0KFtzY29wZS5pbml0aWFsVmFsaWRhdG9yc1tmYy5fZW9Gb3JtRWxlbWVudC5uYW1lXV0pKSk7XG4gICAgICAgICAgICAgIC8vIG5lZWQgdG8gbWFyayBmb3JtIGNvbnRyb2wgYXMgdG91Y2hlZCBiZWNhdXNlIG90aGVyd2lzZSBmb3JtIHZhbGlkYXRpb24gd2lsbCBub3Qgc2hvd1xuICAgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlc1xuICAgICAgICAgICAgICBmYy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICAgIGZjLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdyZWFkb25seSc6IHtcbiAgICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnJlYWRvbmx5ID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgaWYgKGNoYW5nZS5uZXdWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBmYy5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmYy5lbmFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShmYy5fZW9Gb3JtRWxlbWVudC5lcnJvcikgIT09IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5uZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQuZXJyb3IgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICAgIGZjLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgICAgZmMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG5ldyBvbnJvd2VkaXQgZnVuY3Rpb24gd2FzIGFwcGxpZWQgYnkgdGhlIHNjcmlwdFxuICAgICAgICAgIGNhc2UgJ29ucm93ZWRpdCc6IHtcbiAgICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50Lm9ucm93ZWRpdCA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBuZXcgb25jaGFuZ2UgZnVuY3Rpb24gd2FzIGFwcGxpZWQgYnkgdGhlIHNjcmlwdFxuICAgICAgICAgIGNhc2UgJ29uY2hhbmdlJzoge1xuICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQub25jaGFuZ2UgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbmV3IGNvbnRleHRJZCB3YXMgYXBwbGllZCBieSB0aGUgc2NyaXB0XG4gICAgICAgICAgY2FzZSAnY29udGV4dElkJzoge1xuICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQuY29udGV4dElkID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc0FycmF5VmFsdWVDaGFuZ2UoZmMsIGNoYW5nZSkge1xuICAgIGNvbnN0IG5ld1ZhbCA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICBjb25zdCB0YXJnZXRUeXBlID0gZmMuX2VvRm9ybUVsZW1lbnQudHlwZTtcbiAgICAvLyBmb3Igc29tZSB0eXBlcyB3ZSBoYXZlIHRvIGVuc3VyZSB0aGF0IG1ldGEgZGF0YSBhcmUgcHJvdmlkZWQgYXMgd2VsbFxuICAgIHN3aXRjaCAodGFyZ2V0VHlwZSkge1xuICAgICAgY2FzZSAnT1JHQU5JWkFUSU9OJzoge1xuICAgICAgICB0aGlzLl9nZXREYXRhTWV0YShmYy5fZW9Gb3JtRWxlbWVudCwgbmV3VmFsKS5zdWJzY3JpYmUobSA9PiB7XG4gICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQuZGF0YU1ldGEgPSBtO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDT0RFU1lTVEVNJzoge1xuICAgICAgICBpZiAoIWZjLl9lb0Zvcm1FbGVtZW50LmNvZGVzeXN0ZW0uZW50cmllcykge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmNvZGVzeXN0ZW0gPSB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Q29kZXN5c3RlbShmYy5fZW9Gb3JtRWxlbWVudC5jb2Rlc3lzdGVtLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1RBQkxFJzoge1xuICAgICAgICBjb25zdCBkYXRhVG9CZVByb2Nlc3NlZCA9IHt9O1xuICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5lbGVtZW50cy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdPUkdBTklaQVRJT04nIHx8IGUudHlwZSA9PT0gJ0NPREVTWVNURU0nKSB7XG4gICAgICAgICAgICBkYXRhVG9CZVByb2Nlc3NlZFtlLm5hbWVdID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YVRvQmVQcm9jZXNzZWQpLmxlbmd0aCkge1xuICAgICAgICAgIGxldCBvYnMgPSBbXTtcbiAgICAgICAgICBuZXdWYWwuZm9yRWFjaChyb3dEYXRhID0+IHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJvd0RhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRhdGFUb0JlUHJvY2Vzc2VkW2tleV0pIHtcbiAgICAgICAgICAgICAgICBvYnMucHVzaCh0aGlzLl9nZXREYXRhTWV0YShkYXRhVG9CZVByb2Nlc3NlZFtrZXldLCByb3dEYXRhW2tleV0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICB0YXAobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtrZXkgKyAnX21ldGEnXSA9IG07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvd0RhdGFba2V5ICsgJ19tZXRhJ107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvcmtKb2luKG9icykuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3VwZGF0ZUFycmF5VmFsdWUoZmMsIG5ld1ZhbCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl91cGRhdGVBcnJheVZhbHVlKGZjLCBuZXdWYWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQXJyYXlWYWx1ZShmYywgbmV3VmFsdWUpIHtcbiAgICBmYy5fZW9Gb3JtRWxlbWVudC52YWx1ZSA9IFtdLmNvbmNhdChuZXdWYWx1ZSk7XG4gICAgZmMucGF0Y2hWYWx1ZShbXS5jb25jYXQobmV3VmFsdWUpKTtcbiAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgZmMubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgVEVNUF9TVE9SQUdFX0VOVFJJRVNfS0VZID0gJ2VvLmNtcC5vYmplY3Rmb3JtLnRtcHN0b3JhZ2UuZW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEFkZCBhIHJlZmVyZW5jZSB0byBhIHRlbXBvcmFyeSBsb2NhbHN0b3JhZ2UgZW50cnkgdGhhdCBzaG91bGQgYmUgY2xlYXJlZCB3aGVuIGFcbiAgICogbmV3IGJyb3dzZXIgc2Vzc2lvbiBzdGFydHMuIEluIGNvbnRleHQgb2YgZm9ybXMgdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2xlYW51cCB0aGVcbiAgICogbGF5b3V0IHN0YXRlIG9mIGZvcm1zIChzZWxlY3RlZCB0YWJzIGV0Yy4pIHRoYXQgYXJlIHN0b3JlZCBsb2NhbGx5IGJ1dCBzaG91bGQgb25seVxuICAgKiBiZSBwZXNpc3RlZCBmb3Igb25lIGJyb3dzZXIgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHN0b3JhZ2VLZXkgS2V5IG9mIHRoZSBsb2NhbHN0b3JhZ2UgaXRlbVxuICAgKi9cbiAgYWRkVGVtcG9yYXJ5U3RvcmFnZUVudHJ5KHN0b3JhZ2VLZXk6IHN0cmluZykge1xuICAgIC8vIGVudHJpZXMgd2lsbCB0aGVtc2VsdmVzIGJlIHN0b3JlZCBpbiBsb2NhbHN0b3JhZ2Ugc28gd2UgY2FuIGNoZWNrIGZvciBlbnRyaWVzXG4gICAgLy8gdG8gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHNcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ2V0VGVtcG9yYXJ5U3RvcmFnZUVudHJpZXMoKTtcbiAgICBpZighY3VycmVudC5pbmNsdWRlcyhzdG9yYWdlS2V5KSlcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlRFTVBfU1RPUkFHRV9FTlRSSUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkoWy4uLmN1cnJlbnQsIHN0b3JhZ2VLZXldKSlcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyVGVtcG9yYXJ5U3RvcmFnZUVudHJpZXMoKSB7XG4gICAgdGhpcy5fZ2V0VGVtcG9yYXJ5U3RvcmFnZUVudHJpZXMoKS5mb3JFYWNoKGUgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZSkpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuVEVNUF9TVE9SQUdFX0VOVFJJRVNfS0VZKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRlbXBvcmFyeVN0b3JhZ2VFbnRyaWVzKCk6IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlRFTVBfU1RPUkFHRV9FTlRSSUVTX0tFWSkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cmllcykpIHJlcyA9IGVudHJpZXM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5kZWJ1ZyhlKVxuICAgIH1cbiAgICBjb25zb2xlLmRlYnVnKGBGb3VuZCAke3Jlcy5sZW5ndGh9IHRtcCBlbnRyaWVzIHRvIGJlIHJlbW92ZWRgKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG4iXX0=
736
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWZvcm0taGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2VvLWZyYW1ld29yay9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQWMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFTLFVBQVUsRUFBZ0IsYUFBYSxFQUFpQixLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkcsT0FBTyxFQUFDLFFBQVEsRUFBYyxFQUFFLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDN0UsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRXRFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDhEQUE4RCxDQUFDOzs7OztBQXlCdEcsTUFBTSxPQUFPLHVCQUF1QjtJQUlsQyxZQUFvQixNQUFjLEVBQ3hCLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixhQUE2QixFQUM3QixhQUE0QjtRQUpsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ3hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixh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TyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLDJCQUEyQjtRQUNqQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJO1lBQ0YsTUFBTSxPQUFPLEdBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7WUFDMUYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDO1NBQzNDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2pCO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxNQUFNLDRCQUE0QixDQUFDLENBQUM7UUFDL0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztvSEFseEJVLHVCQUF1Qjt3SEFBdkIsdUJBQXVCOzJGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RhdGVQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VmFsaWRhdG9yRm4sIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TG9nZ2VyLCBSYW5nZVZhbHVlLCBTZWFyY2hGaWx0ZXIsIFNlYXJjaFNlcnZpY2UsIFN5c3RlbVNlcnZpY2UsIFV0aWxzfSBmcm9tICdAZW8tc2RrL2NvcmUnO1xuaW1wb3J0IHtmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7UGx1Z2luc1NlcnZpY2V9IGZyb20gJy4uLy4uL2VvLWZyYW1ld29yay1jb3JlL2FwaS9wbHVnaW5zLnNlcnZpY2UnO1xuaW1wb3J0IHtSZWZlcmVuY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9lby1mcmFtZXdvcmstY29yZS9yZWZlcmVuY2VzL3JlZmVyZW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7T2JqZWN0Rm9ybU9wdGlvbnN9IGZyb20gJy4vb2JqZWN0LWZvcm0tb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtGb3JtVmFsaWRhdGlvbn0gZnJvbSAnLi9vYmplY3QtZm9ybS9mb3JtLXZhbGlkYXRpb24vZm9ybS12YWxpZGF0aW9uJztcbmltcG9ydCB7T2JqZWN0Rm9ybUNvbnRyb2x9IGZyb20gJy4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tY29udHJvbCc7XG5pbXBvcnQge09iamVjdEZvcm1Db250cm9sV3JhcHBlcn0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1jb250cm9sLXdyYXBwZXInO1xuaW1wb3J0IHtPYmplY3RGb3JtR3JvdXB9IGZyb20gJy4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tZ3JvdXAubW9kZWwnO1xuaW1wb3J0IHtPYmplY3RGb3JtU2NyaXB0U2VydmljZX0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1zY3JpcHQvb2JqZWN0LWZvcm0tc2NyaXB0LnNlcnZpY2UnO1xuaW1wb3J0IHtPYmplY3RGb3JtU2NyaXB0aW5nU2NvcGV9IGZyb20gJy4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tc2NyaXB0L29iamVjdC1mb3JtLXNjcmlwdGluZy1zY29wZSc7XG5pbXBvcnQge09iamVjdEZvcm1Nb2RlbH0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS5tb2RlbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdlblNjb3BlIHtcbiAgZ0NvdW50OiBudW1iZXI7XG4gIGZvcm1PcHRpb25zOiBPYmplY3RGb3JtT3B0aW9ucztcbiAgaXNJbm5lclRhYmxlRm9ybTogYm9vbGVhbjtcbiAgaW5pdGlhbFZhbGlkYXRvcnM6IHtbbmFtZTogc3RyaW5nXTogVmFsaWRhdG9yRm4gfCBudWxsfTtcbiAgZm9ybUdlblJlc3VsdDogRm9ybUdlblJlc3VsdDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdlblJlc3VsdCB7XG4gIC8vIEZvcm0gY29udHJvbHMgZ2VuZXJhdGVkIGZyb20gdGhlIG1vZGVsIGFzICdRdWljayBhY2Nlc3Mgb2JqZWN0J1xuICAvLyBGb3JtIGVsZW1lbnRzIG5hbWUgaXMga2V5IGFuZCB0aGUgdmFsdWUgaXMgdGhlIGZvcm0gY29udHJvbCBpdHNlbGZcbiAgZm9ybUNvbnRyb2xzOiB7W25hbWU6IHN0cmluZ106IE9iamVjdEZvcm1Db250cm9sfTtcbiAgZm9ybU1vZGVsOiBhbnksXG4gIC8vIFN1YnNjcmlwdGlvbnMgdG8gdmFsdWUgY2hhbmdlcyBvZiB0aGUgZ2VuZXJhdGVkIGZvcm0gY29udHJvbHNcbiAgLy8gWW91IHNob3VsZCBhbHdheXMgdW5zdWJzY3JpYmUgZnJvbSBhbGwgb2YgdGhlbSB3aGVuIGNvbnN1bWluZ1xuICAvLyBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gIGNvbnRyb2xWYWx1ZVN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xuICBzY3JpcHRpbmdTY29wZTogT2JqZWN0Rm9ybVNjcmlwdGluZ1Njb3BlO1xuICBzY3JpcHRNb2RlbDoge1tuYW1lOiBzdHJpbmddOiBhbnl9O1xuICBmb3JtOiBPYmplY3RGb3JtR3JvdXA7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPYmplY3RGb3JtSGVscGVyU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4nKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVmZXJlbmNlU2VydmljZTogUmVmZXJlbmNlU2VydmljZSxcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwbHVnaW5TZXJ2aWNlOiBQbHVnaW5zU2VydmljZSxcbiAgICBwcml2YXRlIHN5c3RlbVNlcnZpY2U6IFN5c3RlbVNlcnZpY2UpIHtcbiAgICB0aGlzLl9jbGVhclRlbXBvcmFyeVN0b3JhZ2VFbnRyaWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVhY3RpdmUgZm9ybSBiYXNlZCBvbiBhIGZvcm0gbW9kZWwgdGhhdCBtYXkgYWxzbyBpbmNsdWRlIGZvcm0gc2NyaXB0cy5cbiAgICogQHBhcmFtIGZvcm1PcHRpb25zIGBPYmplY3RGb3JtT3B0aW9uc2AgZGVmaW5pbmcgdGhlIGZvcm1cbiAgICogQHBhcmFtIGZvcm1TY3JpcHRTZXJ2aWNlIEluc3RhbmNlIG9mIGEgYE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlYC4gVGhpcyBzZXJ2aWNlIGlzIHN1cHBvc2VkIHRvIGJlXG4gICAqIHNjb3BlZCB0byB0aGUgY29tcG9uZW50IHJlbmRlcmluZyB0aGUgZm9ybSAocHJvdmlkZXJzIGFycmF5IGluIGNvbXBvbmVudCBkZWNvcmF0b3IpLlxuICAgKiBAcGFyYW0gaXNJbm5lclRhYmxlRm9ybSB3aGV0aGVyIG9yIG5vdCB0aGUgZm9ybSBpcyBwYXJ0IG9mIGFub3RoZXIgZm9ybSAoYXMgaXMgd2l0aCB0YWJsZSBlZGl0IGZvcm1zKVxuICAgKiBAcmV0dXJucyBBbiBgRm9ybUdlblJlc3VsdGAgb2JqZWN0XG4gICAqL1xuICBidWlsZFJlYWN0aXZlRm9ybShcbiAgICBmb3JtT3B0aW9uczogT2JqZWN0Rm9ybU9wdGlvbnMsXG4gICAgZm9ybVNjcmlwdFNlcnZpY2U6IE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlLFxuICAgIGlzSW5uZXJUYWJsZUZvcm0/OiBib29sZWFuKTogRm9ybUdlblJlc3VsdCB7XG5cbiAgICBjb25zdCBfc2NvcGU6IEZvcm1HZW5TY29wZSA9IHtcbiAgICAgIGdDb3VudDogMCxcbiAgICAgIGZvcm1PcHRpb25zLFxuICAgICAgaXNJbm5lclRhYmxlRm9ybSxcbiAgICAgIGluaXRpYWxWYWxpZGF0b3JzOiB7fSxcbiAgICAgIGZvcm1HZW5SZXN1bHQ6IHtcbiAgICAgICAgZm9ybUNvbnRyb2xzOiB7fSxcbiAgICAgICAgZm9ybU1vZGVsOiB7fSxcbiAgICAgICAgY29udHJvbFZhbHVlU3Vic2NyaXB0aW9uczogW10sXG4gICAgICAgIHNjcmlwdGluZ1Njb3BlOiB1bmRlZmluZWQsXG4gICAgICAgIHNjcmlwdE1vZGVsOiB7fSxcbiAgICAgICAgZm9ybTogbnVsbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1Nb2RlbCA9IHRoaXMuX2RhdGFUb0Zvcm0oX3Njb3BlLCBmb3JtT3B0aW9ucy5mb3JtTW9kZWwsIGZvcm1PcHRpb25zLmRhdGEpO1xuICAgIF9zY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Nb2RlbCA9IGZvcm1Nb2RlbDtcbiAgICBpZiAoIWZvcm1Nb2RlbCkgcmV0dXJuO1xuXG4gICAgLy8gaWYgYSBzY3JpcHQgaXMgYXZhaWxhYmxlLCB3ZSdsbCBpbml0IHRoZSBmb3JtIHNjcmlwdGluZyBmb3IgdGhlXG4gICAgLy8gY3VycmVudCBmb3JtXG4gICAgbGV0IHNjcmlwdGluZ1Njb3BlOiBPYmplY3RGb3JtU2NyaXB0aW5nU2NvcGU7XG4gICAgaWYgKF9zY29wZS5pc0lubmVyVGFibGVGb3JtIHx8IChmb3JtTW9kZWwuc2NyaXB0ICYmIGZvcm1Nb2RlbC5zY3JpcHQubGVuZ3RoID4gMCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGRpbmcgZm9ybSBzY3JpcHRpbmcgc2NvcGUnKTtcbiAgICAgIHNjcmlwdGluZ1Njb3BlID0gbmV3IE9iamVjdEZvcm1TY3JpcHRpbmdTY29wZShcbiAgICAgICAgZm9ybU1vZGVsLnNpdHVhdGlvbixcbiAgICAgICAgdGhpcy5fZ2V0U2NyaXB0aW5nTW9kZWxDaGFuZ2VkKF9zY29wZSksXG4gICAgICAgIHRoaXMucGx1Z2luU2VydmljZS5nZXRBcGkoKSxcbiAgICAgICAgX3Njb3BlLmlzSW5uZXJUYWJsZUZvcm1cbiAgICAgICk7XG4gICAgICBzY3JpcHRpbmdTY29wZS5vYmplY3RJZCA9IGZvcm1PcHRpb25zLm9iamVjdElkO1xuICAgIH1cbiAgICBfc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZSA9IHNjcmlwdGluZ1Njb3BlO1xuXG5cbiAgICBsZXQgZm9ybSA9IG5ldyBPYmplY3RGb3JtR3JvdXAoe30pO1xuICAgIGlmIChmb3JtTW9kZWwuZWxlbWVudHNbMF0gJiYgZm9ybU1vZGVsLmVsZW1lbnRzWzBdLmVsZW1lbnRzKSB7XG4gICAgICB0aGlzLl9hZGRGb3JtQ29udHJvbChfc2NvcGUsIGZvcm0sIGZvcm1Nb2RlbC5lbGVtZW50c1swXSwgJ2NvcmUnKTtcbiAgICB9XG4gICAgaWYgKGZvcm1Nb2RlbC5lbGVtZW50c1sxXSAmJiBmb3JtTW9kZWwuZWxlbWVudHNbMV0uZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuX2FkZEZvcm1Db250cm9sKF9zY29wZSwgZm9ybSwgZm9ybU1vZGVsLmVsZW1lbnRzWzFdLCAnZGF0YScpO1xuICAgIH1cbiAgICBfc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtID0gZm9ybTtcbiAgICB0aGlzLl9pbml0VmFsaWRhdG9ycyhfc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtLCBfc2NvcGUpO1xuICAgIHRoaXMuX2luaXRTY3JpcHRpbmdTY29wZShfc2NvcGUsIGZvcm1TY3JpcHRTZXJ2aWNlKTtcbiAgICByZXR1cm4gX3Njb3BlLmZvcm1HZW5SZXN1bHQ7XG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgZm9ybSBlbGVtZW50IG9iamVjdCB0byBhbiBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIgd2hpY2ggdGhlbiBjYW4gYmUgdXNlZCB0b1xuICAgKiByZW5kZXIgYSBmcm9tIGNvbnRyb2wuIFJlc3VsdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgRm9ybUVsZW1lbnRDb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gdGhlIGVsZW1lbnQgb2JqZWN0IG9yIGEganNvbiBzdHJpbmdcbiAgICogQHBhcmFtIHNpdHVhdGlvbiAtIG9wdGlvbmFsIHByb3BlcnR5IHRvIHNldCB1cCBhIGZvcm0gc2l0dWF0aW9uIGZvciB0aGUgY29udHJvbCAoZGVmYXVsdCBpcyBFRElUKVxuICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyIG9yIG51bGwgaW4gY2FzZSBvZiBhbiBlcnJvclxuICAgKi9cbiAgZWxlbWVudFRvRm9ybUNvbnRyb2woZWxlbWVudDogYW55LCBzaXR1YXRpb24/OiBzdHJpbmcpOiBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIge1xuXG4gICAgbGV0IGZvcm1FbGVtZW50O1xuICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvcm1FbGVtZW50ID0gSlNPTi5wYXJzZShlbGVtZW50KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBmb3JtIGVsZW1lbnQgZnJvbSBqc29uICcsIGZvcm1FbGVtZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybUVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIGlmICghZm9ybUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyXG4gICAgbGV0IHdyYXBwZXIgPSBuZXcgT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyKHt9KTtcbiAgICBsZXQgZm9ybVNpdHVhdGlvbiA9IHNpdHVhdGlvbiA/IHNpdHVhdGlvbiA6ICdFRElUJztcblxuICAgIHdyYXBwZXIuX2VvRm9ybUNvbnRyb2xXcmFwcGVyID0ge1xuICAgICAgY29udHJvbE5hbWU6IGZvcm1FbGVtZW50Lm5hbWUsXG4gICAgICBzaXR1YXRpb246IGZvcm1TaXR1YXRpb25cbiAgICB9O1xuXG4gICAgLy8gZm9yIGNvZGVzeXN0ZW0gZWxlbWVudHMgYWRkIGVudHJpZXMgaWYgbm90IHlldCBwcm92aWRlZFxuICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnQ09ERVNZU1RFTScgJiYgKCFmb3JtRWxlbWVudC5jb2Rlc3lzdGVtIHx8ICFmb3JtRWxlbWVudC5jb2Rlc3lzdGVtLmVudHJpZXMpKSB7XG4gICAgICBmb3JtRWxlbWVudC5jb2Rlc3lzdGVtID0gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldENvZGVzeXN0ZW0oZm9ybUVsZW1lbnQuY29kZXN5c3RlbS5pZCk7XG4gICAgfVxuICAgIC8vIGNyZWF0ZSB0aGUgYWN0dWFsIGZvcm0gY29udHJvbFxuICAgIGxldCBjb250cm9sRGlzYWJsZWQgPSAhIWZvcm1FbGVtZW50LnJlYWRvbmx5O1xuICAgIGxldCBmb3JtQ29udHJvbCA9IG5ldyBPYmplY3RGb3JtQ29udHJvbCh7XG4gICAgICB2YWx1ZTogZm9ybUVsZW1lbnQudmFsdWUsXG4gICAgICBkaXNhYmxlZDogY29udHJvbERpc2FibGVkXG4gICAgfSwgRm9ybVZhbGlkYXRpb24uZ2V0VmFsaWRhdG9ycyhmb3JtRWxlbWVudCwgZm9ybVNpdHVhdGlvbikpO1xuXG4gICAgLy8gRm9ybSBlbGVtZW50cyBpbiBTRUFSQ0ggc2l0dWF0aW9uIG1heSBhcnJpdmUgd2l0aCBhIHZhbHVlIHNldCB0byBOVUxMIChleHBsaWNpdCBzZWFyY2ggZm9yXG4gICAgLy8gZmllbGRzIHRoYXQgYXJlIE5PVCBzZXQpLiBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBwcmVwYXJlIHRoZSBmb3JtIGNvbnRyb2xcbiAgICBpZiAoZm9ybVNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcgJiYgZm9ybUVsZW1lbnQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGZvcm1FbGVtZW50LmlzTm90U2V0VmFsdWUgPSB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50ID0gZm9ybUVsZW1lbnQ7XG4gICAgd3JhcHBlci5hZGRDb250cm9sKGZvcm1FbGVtZW50Lm5hbWUsIGZvcm1Db250cm9sKTtcblxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgZGF0YSBmcm9tIGFuIG9iamVjdCBmb3JtIGJhc2VkIG9uIHNpdHVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcm0gLSBmb3JtIHRvIGV4dHJhY3QgZGF0YSBmcm9tXG4gICAqIEBwYXJhbSBzaXR1YXRpb24gLSBmb3JtIHNpdHVhdGlvblxuICAgKiBAcGFyYW0gW2luaXRpYWxEYXRhXSAtIG9wdGlvbmFsIGZvcm0gZGF0YSB0byBtYXRjaCB0aGUgY3VycmVudCB2YWx1ZXMgYWdhaW5zdFxuICAgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBlZGl0aWcgaW5kZXhkYXRhIChFRElUIHNpdHVhdGlvbiksIGJlY2F1c2Ugd2UgaGF2ZSB0byBjb21wYXJlIG5ldyB2YWx1ZXNcbiAgICogYWdhaW5zdCB0aGUgaW5pdGlhbCB2YWx1ZXMuIElmIGEgcHJvcGVydHkgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIGZvcm1zIGluaXRpYWwgZGF0YSBpcyByZW1vdmVkXG4gICAqIChlLmcuIHNldCB0byBudWxsKSB0aGVuIHdlIGhhdmUgdG8gc2V0IHRoaXMgbnVsbCB2YWx1ZSwgYmVjYXVzZSBvdGhlcndpc2UgdGhlIHNlcnZlciB3b3VsZFxuICAgKiBpZ25vcmUgdGhlIGNoYW5nZXMuXG4gICAqIEBwYXJhbSBpc1RhYmxlUm93RWRpdEZvcm0gRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHByb3ZpZGVkIGZvcm0gaXMgYW4gaW5saW5lIGZvcm0gdXNlZCBieVxuICAgKiBhIGZvcm1zIHRhYmxlIGVsZW1lbnQgZm9yIGVkaXRpbmcgcm93cy4gVGhvc2UgbmVlZCBhIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAqIEByZXR1cm4gZXh0cmFjdGVkIGRhdGEgYXMgb2JqZWN0XG4gICAqL1xuICBleHRyYWN0Rm9ybURhdGEoZm9ybTogT2JqZWN0Rm9ybUdyb3VwLCBzaXR1YXRpb246IHN0cmluZywgaW5pdGlhbERhdGE/OiBhbnksIGlzVGFibGVSb3dFZGl0Rm9ybT86IGJvb2xlYW4pIHtcbiAgICBsZXQgZXh0cmFjdGVkRGF0YSA9IHt9O1xuICAgIHRoaXMuZ2V0RWxlbWVudFZhbHVlcyhleHRyYWN0ZWREYXRhLCBmb3JtLCBzaXR1YXRpb24gfHwgJ0VESVQnLCBpbml0aWFsRGF0YSwgaXNUYWJsZVJvd0VkaXRGb3JtKTtcbiAgICByZXR1cm4gZXh0cmFjdGVkRGF0YTtcbiAgfVxuXG4gIC8vIFJlY3Vyc2l2ZSBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZXMgZnJvbSBlYWNoIGZvcm0gY29udHJvbC5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50VmFsdWVzKGRhdGE6IGFueSwgZm9ybUNvbnRyb2w6IE9iamVjdEZvcm1Nb2RlbCwgc2l0dWF0aW9uOiBzdHJpbmcsIGluaXRpYWxEYXRhPzogYW55LCBpc1RhYmxlUm93RWRpdEZvcm0/OiBib29sZWFuKSB7XG5cbiAgICBpZiAoIWZvcm1Db250cm9sIHx8ICFmb3JtQ29udHJvbC5jb250cm9scykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JtQ29udHJvbCBpbnN0YW5jZW9mIE9iamVjdEZvcm1Db250cm9sV3JhcHBlcikge1xuXG4gICAgICBjb25zdCBmYzogYW55ID0gZm9ybUNvbnRyb2wuY29udHJvbHNbZm9ybUNvbnRyb2wuX2VvRm9ybUNvbnRyb2xXcmFwcGVyLmNvbnRyb2xOYW1lXTtcblxuICAgICAgaWYgKGZjLl9lb0Zvcm1FbGVtZW50LmlzTm90U2V0VmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgLy8gZm9ybSBlbGVtZW50cyBtYXkgZXhwbGljaXRseSBzZXQgdG8gaGF2ZSBOVUxMIHZhbHVlIChlLmcuIGZyb20gU2VhcmNoIGZvcm0gaWYgdmFsdWVzIGFyZSByZXF1ZXN0ZWQgdGhhdCBoYXZlIG5vIHZhbHVlcylcbiAgICAgICAgaWYgKGlzVGFibGVSb3dFZGl0Rm9ybSkge1xuICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50Lm5hbWUsIG51bGwsIGRhdGEsIGZjLl9lb0Zvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50LnFuYW1lLCBudWxsLCBkYXRhLCBmYy5fZW9Gb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGZjLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IHZhbCA9IGZjLnZhbHVlO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG1ldGEgZGF0YSBhcmUgYWxzbyB1cCB0byBkYXRlXG4gICAgICAgIGlmIChmYy5fZW9Gb3JtRWxlbWVudC50eXBlID09PSAnQ09ERVNZU1RFTScpIHtcbiAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuc3lzdGVtU2VydmljZS5nZXRDb2Rlc3lzdGVtKGZjLl9lb0Zvcm1FbGVtZW50LmNvZGVzeXN0ZW0uaWQpO1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmRhdGFNZXRhID0gY3MuZW50cmllcy5maW5kKGUgPT4gZS5kYXRhID09PSB2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChzaXR1YXRpb24pIHtcbiAgICAgICAgICBjYXNlICdTRUFSQ0gnOiB7XG4gICAgICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIHJvdyBlZGl0aW5nIGZvcm1zIHVzZSB0aGUgbmFtZSBpbnN0ZWFkIG9mIHRoZSBxbmFtZSBiZWNhdXNlIG90aGVyd2lzZSB0aGVcbiAgICAgICAgICAgICAgLy8gdGFibGVzIGdyaWQgaXNuJ3QgYWJsZSB0byBtYXAgdGhlIGZpZWxkc1xuICAgICAgICAgICAgICBpZiAoIWlzVGFibGVSb3dFZGl0Rm9ybSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50LnFuYW1lLCB2YWwsIGRhdGEsIGZjLl9lb0Zvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQubmFtZSwgdmFsLCBkYXRhLCBmYy5fZW9Gb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnQ1JFQVRFJzoge1xuICAgICAgICAgICAgLy8gYWxzbyBhZGQgTlVMTCB2YWx1ZXMgKG92ZXJyaWRlIGV4aXN0aW5nIGRlZmF1bHR2YWx1ZXMpXG4gICAgICAgICAgICB0aGlzLnNldERhdGFWYWx1ZShmYy5fZW9Gb3JtRWxlbWVudC5uYW1lLCB2YWwsIGRhdGEsIGZjLl9lb0Zvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnRURJVCc6IHtcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2ssIGlmIHRoZSB2YWx1ZXMgaGF2ZSBiZWVuIGNoYW5nZWQgYW5kIHNraXAgc2VuZGluZyB0aGVtIHRvIHRoZSBiYWNrZW5kLCBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkXG4gICAgICAgICAgICAvLyB0aGUgZGF0ZXRpbWUgZmllbGRzIG5lZWQgc29tZSBleHRyYSBsb2dpYyB0byBtYWtlIHRoZSBjb21wYXJpc29uIHdvcmtcbiAgICAgICAgICAgIGlmIChmYy5fZW9Gb3JtRWxlbWVudC50eXBlID09PSAnREFURVRJTUUnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICAgICAgICBpZiAoIWluaXRpYWxEYXRhW2ZjLl9lb0Zvcm1FbGVtZW50Lm5hbWVdLmluY2x1ZGVzKCdUJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc29EYXRlV2l0aG91dFRpbWUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVXaXRob3V0VGltZSA9PT0gaW5pdGlhbERhdGFbZmMuX2VvRm9ybUVsZW1lbnQubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZS50b0lTT1N0cmluZygpID09PSBpbml0aWFsRGF0YVtmYy5fZW9Gb3JtRWxlbWVudC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gaW5pdGlhbERhdGFbZmMuX2VvRm9ybUVsZW1lbnQubmFtZV0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpbiBlZGl0IHNpdHVhdGlvbiB3ZSBoYXZlIHRvIGNvbXBhcmUgbmV3IHZhbHVlcyBhZ2FpbnN0IHRoZSBpbml0aWFsIHZhbHVlc1xuICAgICAgICAgICAgLy8gSWYgYSBwcm9wZXJ0eSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgZm9ybXMgaW5pdGlhbCBkYXRhIGlzIHJlbW92ZWQgKGUuZy4gc2V0IHRvIG51bGwpXG4gICAgICAgICAgICAvLyB0aGVuIHdlIGhhdmUgdG8gc2V0IHRoaXMgbnVsbCB2YWx1ZSwgYmVjYXVzZSBvdGhlcndpc2UgdGhlIHNlcnZlciB3aWxsIGlnbm9yZSB0aGUgY2hhbmdlc1xuICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCB8fCAoaW5pdGlhbERhdGEgJiYgaW5pdGlhbERhdGFbZmMuX2VvRm9ybUVsZW1lbnQubmFtZV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgLy8gZGF0YVtmYy5fZW9Gb3JtRWxlbWVudC5uYW1lXSA9IHZhbDtcbiAgICAgICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQubmFtZSwgdmFsLCBkYXRhLCBmYy5fZW9Gb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5rZXlzKGZvcm1Db250cm9sLmNvbnRyb2xzKVxuICAgICAgICAuZm9yRWFjaChjb250cm9sS2V5ID0+IHtcbiAgICAgICAgICBsZXQgZm9ybUNvbnRyb2xLZXllZCA9IDxPYmplY3RGb3JtR3JvdXA+Zm9ybUNvbnRyb2wuY29udHJvbHNbY29udHJvbEtleV07XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50VmFsdWVzKGRhdGEsIGZvcm1Db250cm9sS2V5ZWQsIHNpdHVhdGlvbiwgaW5pdGlhbERhdGEsIGlzVGFibGVSb3dFZGl0Rm9ybSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0YVZhbHVlKGtleSwgdmFsdWUsIGRhdGEsIGZvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pIHtcbiAgICBkYXRhW2tleV0gPSB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlLCBmb3JtRWxlbWVudCk7XG5cbiAgICBpZiAoaXNUYWJsZVJvd0VkaXRGb3JtICYmIGZvcm1FbGVtZW50LmRhdGFNZXRhKSB7XG4gICAgICAvLyBpbm5lciB0YWJsZXMgbmVlZCB0byBzZXQgdXAgdGhlIG1ldGEgZGF0YSBhcyB3ZWxsXG4gICAgICBkYXRhW2tleSArICdfbWV0YSddID0gZm9ybUVsZW1lbnQuZGF0YU1ldGE7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0VmFsdWUodmFsdWUsIGZvcm1FbGVtZW50KSB7XG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdEQVRFVElNRScgJiYgIWZvcm1FbGVtZW50LndpdGh0aW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmFuZ2VWYWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlVmFsdWUoXG4gICAgICAgICAgdmFsdWUub3BlcmF0b3IsXG4gICAgICAgICAgdmFsdWUuZmlyc3RWYWx1ZSAmJiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZS5maXJzdFZhbHVlLCAneXl5eS1NTS1kZCcpLFxuICAgICAgICAgIHZhbHVlLnNlY29uZFZhbHVlICYmIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLnNlY29uZFZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdUQUJMRScpIHtcbiAgICAgIChmb3JtRWxlbWVudC5lbGVtZW50cyB8fCBbXSkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICh2YWx1ZSB8fCBbXSkuZm9yRWFjaCh2ID0+IHZbZWwubmFtZV0gPSB0aGlzLmZvcm1hdFZhbHVlKHZbZWwubmFtZV0sIGVsKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cblxuICAvLyBGdW5jdGlvbnMgaW52b2x2ZWQgaW4gYnVpbGRpbmcgYW4gb2JqZWN0IGZvcm1cblxuICAvKipcbiAgICogUmVjdXJzaXZlIG1ldGhvZCBhZGRpbmcgYSBuZXcgVW50eXBlZEZvcm1Db250cm9sIChncm91cCBvciBjb250cm9sKSB0byBhIHBhcmVudCBmb3JtIGdyb3VwXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnRHcm91cCAtIHRoZSBwYXJlbnQgZ3JvdXAgdG8gYWRkIHRoZSBjb250cm9sIHRvXG4gICAqIEBwYXJhbSBmb3JtRWxlbWVudCAtIHRoZSBlbmFpbyBmb3JtIG1vZGVsIGVsZW1lbnQgdG8gY3JlYXRlIHRoZSBjaGlsZCBjb250cm9sIGZyb21cbiAgICogQHBhcmFtIFt1c2VOYW1lXSAtIHVzZSB0aGlzIG5hbWUgaW5zdGVhZCBvZiB0aGUgb25lIGZyb20gdGhlIG1vZGVsXG4gICAqL1xuICBwcml2YXRlIF9hZGRGb3JtQ29udHJvbChzY29wZTogRm9ybUdlblNjb3BlLCBwYXJlbnRHcm91cDogT2JqZWN0Rm9ybUdyb3VwLCBmb3JtRWxlbWVudDogYW55LCB1c2VOYW1lPzogc3RyaW5nKSB7XG5cbiAgICBsZXQgY3RybDtcbiAgICBsZXQgbmFtZTtcblxuICAgIC8vIGFkZCBhIGZvcm0gZ3JvdXBcbiAgICBpZiAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ28ybUdyb3VwJyB8fCBmb3JtRWxlbWVudC50eXBlID09PSAnbzJtR3JvdXBTdGFjaycpIHtcblxuICAgICAgLy8gZG8gbm90IGFkZCBncm91cHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIGlmICghZm9ybUVsZW1lbnQuZWxlbWVudHMgfHwgZm9ybUVsZW1lbnQuZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGb3VuZCBlbXB0eSBmb3JtIGdyb3VwJywgZm9ybUVsZW1lbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGN0cmwgPSBuZXcgT2JqZWN0Rm9ybUdyb3VwKHt9KTtcbiAgICAgIGN0cmwuX2VvRm9ybUdyb3VwID0ge1xuICAgICAgICBsYWJlbDogZm9ybUVsZW1lbnQubGFiZWwsXG4gICAgICAgIGxheW91dDogZm9ybUVsZW1lbnQubGF5b3V0LFxuICAgICAgICB0eXBlOiBmb3JtRWxlbWVudC50eXBlXG4gICAgICB9O1xuXG4gICAgICBpZiAodXNlTmFtZSA9PT0gJ2NvcmUnIHx8IHVzZU5hbWUgPT09ICdkYXRhJykge1xuICAgICAgICBjdHJsLl9lb0Zvcm1Hcm91cC5sYWJlbCA9IHVzZU5hbWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGUgb2YgZm9ybUVsZW1lbnQuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5fYWRkRm9ybUNvbnRyb2woc2NvcGUsIGN0cmwsIGUpO1xuICAgICAgfVxuICAgICAgbmFtZSA9IHVzZU5hbWUgfHwgJ2ZnJyArIHNjb3BlLmdDb3VudCsrO1xuICAgICAgY3RybC5fZW9Gb3JtR3JvdXAuaWQgPSBgJHtzY29wZS5mb3JtT3B0aW9ucy5sYXlvdXRTZXR0aW5nc0lEIHx8IHNjb3BlLmZvcm1PcHRpb25zLmZvcm1Nb2RlbC5uYW1lfS4ke25hbWV9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWRkIGZvcm0gY29udHJvbFxuICAgICAgLy8gVG8gYmUgYWJsZSB0byBpbnRlZ3JhdGUgcmVjdXJzaXZlIGZvcm0gY29udHJvbHMgaW50byB0aGUgbWFpbiBmb3JtLFxuICAgICAgLy8gd2UgaGF2ZSB0byB3cmFwIHRoZW0gaW4gYSBmb3JtIGdyb3VwXG4gICAgICBjdHJsID0gbmV3IE9iamVjdEZvcm1Db250cm9sV3JhcHBlcih7fSk7XG4gICAgICBjdHJsLl9lb0Zvcm1Db250cm9sV3JhcHBlciA9IHtcbiAgICAgICAgLy8gdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgVW50eXBlZEZvcm1Db250cm9sXG4gICAgICAgIGNvbnRyb2xOYW1lOiBmb3JtRWxlbWVudC5uYW1lLFxuICAgICAgICBzaXR1YXRpb246IHNjb3BlLmZvcm1PcHRpb25zLmZvcm1Nb2RlbC5zaXR1YXRpb25cbiAgICAgIH07XG4gICAgICBpZiAoc2NvcGUuZm9ybU9wdGlvbnMuZm9ybU1vZGVsLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcgJiYgZm9ybUVsZW1lbnQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICAvLyBkbyBub3Qgc2V0IGEgcmVmZXJlbmNlIGFzIHRoZSBmb3JtIGNvbnRyb2xzIHZhbHVlXG4gICAgICAvLyBvdGhlcndpc2Ugd2UgY291bGQgbm90IHJlc2V0IHRoZSBmb3JtXG4gICAgICBsZXQgdmFsdWU6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1FbGVtZW50LnZhbHVlKSkge1xuICAgICAgICAvLyBjb3B5IGJ5IHZhbHVlIGZvciBhcnJheXMgb2Ygb2JqZWN0cyAoZS5nLiB0YWJsZSBkYXRhKVxuICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICBmb3JtRWxlbWVudC52YWx1ZS5mb3JFYWNoKChvKSA9PiB7XG4gICAgICAgICAgdmFsdWUucHVzaChVdGlscy5mb3JtRGF0YVBhcnNlKFV0aWxzLmZvcm1EYXRhU3RyaW5naWZ5KG8pKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBmb3JtRWxlbWVudC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZm9yIGNvZGVzeXN0ZW0gZWxlbWVudHMgYWRkIGVudHJpZXMgaWYgbm90IHlldCBwcm92aWRlZFxuICAgICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJyAmJiAhZm9ybUVsZW1lbnQuY29kZXN5c3RlbS5lbnRyaWVzKSB7XG4gICAgICAgIGZvcm1FbGVtZW50LmNvZGVzeXN0ZW0gPSB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Q29kZXN5c3RlbShmb3JtRWxlbWVudC5jb2Rlc3lzdGVtLmlkKTtcbiAgICAgIH1cblxuICAgICAgLy8gY3JlYXRlIHRoZSBhY3R1YWwgZm9ybSBjb250cm9sXG4gICAgICBsZXQgY29udHJvbERpc2FibGVkID0gc2NvcGUuZm9ybU9wdGlvbnMuZGlzYWJsZWQgfHwgISFmb3JtRWxlbWVudC5yZWFkb25seTtcbiAgICAgIGxldCBmb3JtQ29udHJvbCA9IG5ldyBPYmplY3RGb3JtQ29udHJvbCh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZGlzYWJsZWQ6IGNvbnRyb2xEaXNhYmxlZFxuICAgICAgfSk7XG5cbiAgICAgIGZvcm1FbGVtZW50LnJlYWRvbmx5ID0gY29udHJvbERpc2FibGVkO1xuXG4gICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudCA9IGZvcm1FbGVtZW50O1xuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtQ29udHJvbHNbZm9ybUVsZW1lbnQubmFtZV0gPSBmb3JtQ29udHJvbDtcblxuICAgICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJyB8fCAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ1NUUklORycgJiYgZm9ybUVsZW1lbnQuY2xhc3NpZmljYXRpb24gPT09ICdzZWxlY3RvcicpKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmFwcGx5RmlsdGVyID0gKGZ1bmM6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZmlsdGVyRnVuY3Rpb24gPSBmdW5jO1xuICAgICAgICB9O1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5hcHBseURpc2FibGluZ0ZpbHRlciA9IChmdW5jOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRpc2FibGluZ0ZpbHRlckZ1bmN0aW9uID0gZnVuYztcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdTVFJJTkcnICYmIGZvcm1FbGVtZW50LmNsYXNzaWZpY2F0aW9uID09PSAnc2VsZWN0b3InKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnNldExpc3QgPSAobGlzdE9iamVjdDogYW55KSA9PiB7XG4gICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQubGlzdCA9IGxpc3RPYmplY3Q7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnT1JHQU5JWkFUSU9OJykge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5zZXRGaWx0ZXIgPSAoZmlsdGVyT2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5maWx0ZXIgPSBmaWx0ZXJPYmplY3Q7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50Lm9iamVjdCA9IHNjb3BlLmZvcm1PcHRpb25zLm9iamVjdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdSRUZFUkVOQ0UnKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnNldFF1ZXJ5RmlsdGVycyA9IChxdWVyeUZpbHRlcnNPYmplY3Q6IHtbZmllbGRRbmFtZTogc3RyaW5nXToge286IHN0cmluZywgdjE6IGFueSwgdjI6IGFueX19LCBvYmplY3RUeXBlcz86IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQucXVlcnlGaWx0ZXJzID0gcXVlcnlGaWx0ZXJzT2JqZWN0O1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50Lm9iamVjdFR5cGVzRmlsdGVyID0gb2JqZWN0VHlwZXM7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzY29wZS5mb3JtT3B0aW9ucy5mb3JtTW9kZWwuc2l0dWF0aW9uID09PSAnU0VBUkNIJykge1xuICAgICAgICAvLyBpbiBzZWFyY2ggc2l0dWF0aW9uIGV2ZW4gcmVhZG9ubHkgZmllbGRzIHNob3VsZCBiZSBlZGl0YWJsZSAuLi5cbiAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQucmVhZG9ubHkgPSBmYWxzZTtcbiAgICAgICAgLy8gLi4uIGFuZCByZXF1aXJlZCBtYWtlcyBubyBzZW5zZSBoZXJlXG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbW92ZSBlbXB0eSBkZXNjcmlwdGlvbnNcbiAgICAgIGxldCBkZXNjID0gZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZGVzY3JpcHRpb247XG4gICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZGVzY3JpcHRpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgdGhlIGZvcm0gZWxlbWVudCB0byB0aGUgc2NyaXB0IG1vZGVsIHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvXG4gICAgICAvLyB0aGUgZm9ybXMgc2NyaXB0aW5nIHNjb3BlIGxhdGVyIG9uXG4gICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdE1vZGVsW2Zvcm1FbGVtZW50Lm5hbWVdID0gZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQ7XG5cbiAgICAgIC8vIGFwcGx5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgZm9ybSBjb250cm9sLCB0aGF0IHdpbGwgdHJpZ2dlclxuICAgICAgLy8gdGhlIGZvcm0gZWxlbWVudHMgb25DaGFuZ2UgbGlzdGVuZXJcbiAgICAgIGxldCBjb250cm9sV2F0Y2ggPSBjdHJsLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZShmb3JtRWxlbWVudC50eXBlID09PSAnVEFCTEUnID8gMCA6IDUwMCkpO1xuICAgICAgY29udHJvbFdhdGNoLnN1YnNjcmliZSgodikgPT4ge1xuICAgICAgICBpZiAoZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQudHlwZSA9PT0gJ1JFRkVSRU5DRScpIHtcbiAgICAgICAgICB0aGlzLl9nZXREYXRhTWV0YShmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudCwgdltmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5uYW1lXSkuc3Vic2NyaWJlKG0gPT4ge1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZGF0YU1ldGEgPSBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5tdWx0aXNlbGVjdCA/IG0gOiBtWzBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRhdGFNZXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlKSB7XG4gICAgICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZS5tb2RlbENoYW5nZWQodik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5jb250cm9sVmFsdWVTdWJzY3JpcHRpb25zLnB1c2goY29udHJvbFdhdGNoKTtcblxuICAgICAgY3RybC5hZGRDb250cm9sKGZvcm1FbGVtZW50Lm5hbWUsIGZvcm1Db250cm9sKTtcbiAgICAgIG5hbWUgPSAnZmdfJyArIGZvcm1FbGVtZW50Lm5hbWU7XG4gICAgfVxuICAgIHBhcmVudEdyb3VwLmFkZENvbnRyb2wobmFtZSwgY3RybCk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgZGF0YSBpbnRvIGEgZm9ybSBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gZm9ybSBtb2RlbFxuICAgKiBAcGFyYW0gZGF0YSAtIGRhdGEgb2JqZWN0IG9yIGFycmF5IG9mIFNlYXJjaEZpbHRlciBvYmplY3RzIGluIGNhc2Ugb2YgYSBzZWFyY2ggZm9ybVxuICAgKi9cbiAgcHJpdmF0ZSBfZGF0YVRvRm9ybShzY29wZTogRm9ybUdlblNjb3BlLCBtb2RlbDogYW55LCBkYXRhOiBhbnkpIHtcbiAgICBpZiAobW9kZWwgJiYgZGF0YSkge1xuICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlcyhzY29wZSwgbW9kZWwuZWxlbWVudHMsIGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvLyByZWN1cnNpdmUgbWV0aG9kIGZvciBhZGRpbmcgdmFsdWVzIHRvIG1vZGVsIGVsZW1lbnRzXG4gIHByaXZhdGUgX3NldEVsZW1lbnRWYWx1ZXMoc2NvcGU6IEZvcm1HZW5TY29wZSwgZWxlbWVudHMsIGRhdGEpIHtcblxuICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAodGhpcy5faGFzVmFsdWUoZGF0YSwgZWxlbWVudCkpIHtcblxuICAgICAgICBlbGVtZW50LnZhbHVlID0gdGhpcy5fZ2V0VmFsdWUoc2NvcGUsIGRhdGEsIGVsZW1lbnQpO1xuICAgICAgICBpZiAoZWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgIC8vIGFkZCBtZXRhIGRhdGEgZm9yIHNvbWUgb2YgdGhlIHR5cGVzXG4gICAgICAgICAgdGhpcy5fZmV0Y2hNZXRhRGF0YShzY29wZSwgZGF0YSwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBlbGVtZW50LnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ1RBQkxFJyAmJiBlbGVtZW50LmVsZW1lbnRzICYmIGVsZW1lbnQuZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9zZXRFbGVtZW50VmFsdWVzKHNjb3BlLCBlbGVtZW50LmVsZW1lbnRzLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGluIHNvbWUgY2FzZXMgcmVxdWlyZWQgbWV0YSBkYXRhIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIHRoZSBlbGVtZW50IGl0c2VsZlxuICAvLyBzbyB0aGV5IGhhdmUgdG8gYmUgZmV0Y2hlZCBhbmQgYWRkZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBmb3JtIHRvIGJlIGFibGVcbiAgLy8gdG8gcmVuZGVyIHRoZSBlbGVtZW50IGNvcnJlY3RseVxuICBwcml2YXRlIF9mZXRjaE1ldGFEYXRhKHNjb3BlOiBGb3JtR2VuU2NvcGUsIGRhdGEsIGVsZW1lbnQpIHtcblxuICAgIGlmIChzY29wZS5mb3JtT3B0aW9ucy5mb3JtTW9kZWwuc2l0dWF0aW9uID09PSAnU0VBUkNIJykge1xuICAgICAgLy8gdG9kbzogaG93IHRvIGZldGNoIG1ldGEgZGF0YSBpbiBzZWFyY2ggc2l0dWF0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdPUkdBTklaQVRJT04nICYmIGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ10pIHtcbiAgICAgICAgZWxlbWVudC5kYXRhTWV0YSA9IGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ107XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ0NPREVTWVNURU0nICYmIGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ10pIHtcbiAgICAgICAgZWxlbWVudC5kYXRhTWV0YSA9IGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ107XG4gICAgICAgIGVsZW1lbnQuZGVmYXVsdHJlcHJlc2VudGF0aW9uID0gZGF0YVtlbGVtZW50Lm5hbWUgKyAnX21ldGEnXS5kZWZhdWx0cmVwcmVzZW50YXRpb247XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1JFRkVSRU5DRScgJiYgZGF0YVtlbGVtZW50Lm5hbWUgKyAnX21ldGEnXSkge1xuICAgICAgICBlbGVtZW50LmRhdGFNZXRhID0gZGF0YVtlbGVtZW50Lm5hbWUgKyAnX21ldGEnXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXREYXRhTWV0YShmb3JtRWxlbWVudDogYW55LCBuZXdWYWx1ZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgc3dpdGNoIChmb3JtRWxlbWVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ09SR0FOSVpBVElPTic6IHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5ld1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3lzdGVtU2VydmljZS5nZXRPcmdhbml6YXRpb25PYmplY3QobmV3VmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldE9yZ2FuaXphdGlvbk9iamVjdChuZXdWYWx1ZVswXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldE9yZ2FuaXphdGlvbk9iamVjdHMobmV3VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdSRUZFUkVOQ0UnOiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlU2VydmljZS5mZXRjaElEUmVmZXJlbmNlTWV0YURhdGEoQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgPyBuZXdWYWx1ZSA6IFtuZXdWYWx1ZV0pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0NPREVTWVNURU0nOiB7XG4gICAgICAgICAgcmV0dXJuIG9mKHRoaXMuc3lzdGVtU2VydmljZS5nZXRDb2Rlc3lzdGVtKGZvcm1FbGVtZW50LmNvZGVzeXN0ZW0uaWQpLmVudHJpZXMuZmluZCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5kZWZhdWx0cmVwcmVzZW50YXRpb24gPT09IG5ld1ZhbHVlO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9oYXNWYWx1ZShkYXRhLCBlbGVtZW50KSB7XG5cbiAgICAvLyBkaWZmZXIgYmV0d2VlbiBhcnJheSBvZiBTZWFyY2hGaWx0ZXJzIGFuZCBhIGZvcm0gZGF0YSBvYmplY3RcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1RBQkxFJykge1xuICAgICAgICByZXR1cm4gISEoZGF0YS5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5wcm9wZXJ0eS5zdGFydHNXaXRoKGVsZW1lbnQucW5hbWUpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gISEoZGF0YS5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5wcm9wZXJ0eSA9PT0gZWxlbWVudC5xbmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF0YS5oYXNPd25Qcm9wZXJ0eShlbGVtZW50Lm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFZhbHVlKHNjb3BlOiBGb3JtR2VuU2NvcGUsIGRhdGEsIGVsZW1lbnQpIHtcblxuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoc2NvcGUuZm9ybU9wdGlvbnMuZm9ybU1vZGVsLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgIGlmIChzY29wZS5pc0lubmVyVGFibGVGb3JtKSB7XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdEQVRFVElNRScgfHwgZWxlbWVudC50eXBlID09PSAnTlVNQkVSJykge1xuICAgICAgICAgIHZhbHVlID0gU2VhcmNoU2VydmljZS50b1JhbmdlVmFsdWUoZGF0YVtlbGVtZW50Lm5hbWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IGRhdGFbZWxlbWVudC5uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdUQUJMRScpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnNlYXJjaFNlcnZpY2UudGFibGVGaWx0ZXJzVG9FbGVtZW50VmFsdWUodGhpcy5fZ2V0VGFibGVGaWx0ZXJzKGRhdGEsIGVsZW1lbnQucW5hbWUpLCBlbGVtZW50LmVsZW1lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGRhdGEuZmluZChmID0+IGYucHJvcGVydHkgPT09IGVsZW1lbnQucW5hbWUpO1xuICAgICAgICB2YWx1ZSA9IHRoaXMuc2VhcmNoU2VydmljZS5maWx0ZXJUb0VsZW1lbnRWYWx1ZShmaWx0ZXIsIGVsZW1lbnQudHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcblxuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ0RBVEVUSU1FJyAmJiBkYXRhW2VsZW1lbnQubmFtZV0pIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZShgJHtkYXRhW2VsZW1lbnQubmFtZV19JHsodHlwZW9mIGRhdGFbZWxlbWVudC5uYW1lXSA9PT0gJ3N0cmluZycgPyBkYXRhW2VsZW1lbnQubmFtZV0uaW5kZXhPZignVCcpIDogZGF0YVtlbGVtZW50Lm5hbWVdLnRvSVNPU3RyaW5nKCkuaW5kZXhPZignVCcpKSAhPT0gLTEgPyAnJyA6ICdUMDA6MDA6MDAnfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBkYXRhW2VsZW1lbnQubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRhYmxlRmlsdGVycyhmaWx0ZXJzOiBTZWFyY2hGaWx0ZXJbXSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBTZWFyY2hGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKGYgPT4gZi5wcm9wZXJ0eS5zdGFydHNXaXRoKHByb3BlcnR5TmFtZSArICcuJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZhbGlkYXRvcnMoZm9ybUNvbnRyb2w6IE9iamVjdEZvcm1Hcm91cCwgc2NvcGU6IEZvcm1HZW5TY29wZSkge1xuICAgIGlmIChmb3JtQ29udHJvbCkge1xuICAgICAgZm9yIChsZXQga2V5IGluIGZvcm1Db250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtQ29udHJvbC5jb250cm9sc1trZXldIGFzIGFueTtcbiAgICAgICAgaWYgKGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICB0aGlzLl9pbml0VmFsaWRhdG9ycyhjb250cm9sLCBzY29wZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NvcGUuaW5pdGlhbFZhbGlkYXRvcnNbY29udHJvbC5fZW9Gb3JtRWxlbWVudC5uYW1lXSA9IGNvbnRyb2wudmFsaWRhdG9yO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UoXG4gICAgICAgICAgICB0aGlzLl9nZXRWYWxpZGF0b3JzKHNjb3BlLCBjb250cm9sLl9lb0Zvcm1FbGVtZW50KS5jb25jYXQoXG4gICAgICAgICAgICAgIFtzY29wZS5pbml0aWFsVmFsaWRhdG9yc1tjb250cm9sLl9lb0Zvcm1FbGVtZW50Lm5hbWVdXSlcbiAgICAgICAgICApKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIEJ1aWxkIHZhbGlkYXRvcnMgZm9yIHRoZSBnaXZlbiBmb3JtIGVsZW1lbnQgdG8gYmUgYXR0YWNoZWQgdG9cbiAgKiBhIHJlYWN0aXZlIGZvcm1Db250cm9sLlxuICAqXG4gICogQHBhcmFtIGZvcm1FbGVtZW50IC0gZm9ybSBlbGVtZW50IG9iamVjdFxuICAqL1xuICBwcml2YXRlIF9nZXRWYWxpZGF0b3JzKHNjb3BlOiBGb3JtR2VuU2NvcGUsIGZvcm1FbGVtZW50OiBhbnkpOiBWYWxpZGF0b3JGbltdIHtcbiAgICBsZXQgZWxtVmFsaWRhdG9ycyA9IEZvcm1WYWxpZGF0aW9uLmdldFZhbGlkYXRvcnMoZm9ybUVsZW1lbnQsIHNjb3BlLmZvcm1PcHRpb25zLmZvcm1Nb2RlbC5zaXR1YXRpb24pO1xuICAgIC8vIGFkZCBjdXN0b20gdmFsaWRhdG9yIGZvciBzY3JpcHQgZW5hYmxlZCBmb3Jtc1xuICAgIGlmIChzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlKSB7XG4gICAgICBlbG1WYWxpZGF0b3JzLnB1c2goRm9ybVZhbGlkYXRpb24uY3VzdG9tU2NyaXB0aW5nVmFsaWRhdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsbVZhbGlkYXRvcnM7XG4gIH1cblxuICBwcml2YXRlIF9pbml0U2NyaXB0aW5nU2NvcGUoc2NvcGU6IEZvcm1HZW5TY29wZSwgZm9ybVNjcmlwdFNlcnZpY2U6IE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlKSB7XG4gICAgbGV0IHtkYXRhLCBhY3Rpb25zLCBvYmplY3RzLCBjb250ZXh0fSA9IDxPYmplY3RGb3JtT3B0aW9ucz4oc2NvcGUuZm9ybU9wdGlvbnMgfHwge30pO1xuXG4gICAgaWYgKHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUpIHtcbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUuc2V0TW9kZWwoc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRNb2RlbCk7XG4gICAgICAvKiogcHJvdmlkZSBhY2Nlc3MgdG8gYWN0aW9ucyAodXNlZCBpbnNpZGUgb2YgQlBNLUZvcm1zKSAqL1xuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZS5hY3Rpb25zID0gYWN0aW9ucztcbiAgICAgIC8qKiBwcm92aWRlIGFjY2VzcyB0byBhZGRpdGlvbmFsIG9iamVjdHMgKHVzZWQgZm9yIGV4YW1wbGUgaW4gQlBNLVN0YXJ0LUZvcm1zIHRvXG4gICAgICAgKiBhZGQgZGF0YSBvZiBETVMtT2JqZWN0cyB0byBzdGFydCB0aGUgcHJvY2VzcyBmb3IpXG4gICAgICAgKi9cbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUub2JqZWN0cyA9IG9iamVjdHM7XG4gICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgLyoqIHByb3ZpZGUgcmVhZG9ubHkgYWNjZXNzIHRvIGluaXRpYWwgZm9ybSBkYXRhICh3aGljaCBtYXkgYWxzbyBjb250YWluIHZhbHVlcyB0aGF0XG4gICAgICAgKiBhcmUgbm90IHJlbmRlcmVkIGFzIGZvcm0gZWxlbWVudHMgKGludmlzaWJsZSB2YWx1ZXMpKVxuICAgICAgICovXG4gICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlLmRhdGEgPSBkYXRhO1xuXG4gICAgICAvKiogYnkgZGVmYXVsdCwgc2NyaXB0aW5nIHNjb3BlcyBhcmUgYXBwbGllZCB0byBmb3Jtcy4gQnV0IHRhYmxlIGVsZW1lbnRzIGNyZWF0ZSB0aGVpciBvd24gc2NvcGVcbiAgICAgICAqIGZvciBlZGl0aW5nIHJvd3MuIEJlaW5nIG9uZSBvZiB0aG9zZSBpbm5lciBmb3JtcyBzaG91bGQgbm90IHJ1biB0aGUgZm9ybSBzY3JpcHQgYWdhaW4sIGJ1dFxuICAgICAgICogaW5zdGVhZCBqdXN0IHByb3ZpZGUgdGhlIG9ic2VydmluZyBhYmlsaXRpZXMgb2YgdGhlIHNjcmlwdGluZyBzY29wZS5cbiAgICAgICAqL1xuICAgICAgaWYgKCFzY29wZS5mb3JtT3B0aW9ucy5kaXNhYmxlZCAmJiAhc2NvcGUuaXNJbm5lclRhYmxlRm9ybSAmJiBzY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Nb2RlbCkge1xuICAgICAgICBjb25zdCBzY3JpcHROYW1lID0gc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtTW9kZWwubmFtZSArICdfJyArIHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybU1vZGVsLnNpdHVhdGlvbjtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2V4ZWN1dGluZyBmb3JtIHNjcmlwdCAnICsgc2NyaXB0TmFtZSk7XG4gICAgICAgIGZvcm1TY3JpcHRTZXJ2aWNlLnJ1bkZvcm1TY3JpcHQoXG4gICAgICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZSxcbiAgICAgICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Nb2RlbC5zY3JpcHQsXG4gICAgICAgICAgc2NyaXB0TmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUgc2NyaXB0IGNoYW5nZXMgaXRzIGludGVybmFsIG1vZGVsLlxuICAgICAqIEl0IGlzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIHNjcmlwdCBjaGFuZ2VzIHRvIHRoZSBhY3R1YWwgZm9ybSBtb2RlbC5cbiAgICAgKlxuICAgICAqIFRvIGVuc3VyZSB0aGUgcmlnaHQgY29udGV4dCwgd2UgZGVmaW5lIGFuIGluc3RhbmNlIG1ldGhvZCBhcyBjYWxsYmFjayBmb3IgdGhlIHNjcmlwdGluZyBzY29wZVxuICAgICAqIEBzZWU6IGh0dHBzOi8vYmxvZy5qb2hubnlyZWlsbHkuY29tLzIwMTQvMDQvdHlwZXNjcmlwdC1pbnN0YW5jZS1tZXRob2RzLmh0bWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JtQ29udHJvbE5hbWVcbiAgICAgKiBAcGFyYW0gY2hhbmdlXG4gICAgICovXG5cbiAgcHJpdmF0ZSBfZ2V0U2NyaXB0aW5nTW9kZWxDaGFuZ2VkKHNjb3BlOiBGb3JtR2VuU2NvcGUpOiBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIChmb3JtQ29udHJvbE5hbWUsIGNoYW5nZSkgPT4ge1xuXG4gICAgICAvLyBmaW5kIHRoZSB0YXJnZXQgY29udHJvbFxuICAgICAgbGV0IGZjOiBPYmplY3RGb3JtQ29udHJvbCA9IHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybUNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0gYXMgT2JqZWN0Rm9ybUNvbnRyb2w7XG4gICAgICBpZiAoZmMpIHtcblxuICAgICAgICAvLyBjaGFuZ2Ugb25seSBhbGxvd2VkIHByb3BlcnRpZXNcbiAgICAgICAgc3dpdGNoIChjaGFuZ2UubmFtZSkge1xuICAgICAgICAgIGNhc2UgJ3ZhbHVlJzoge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlLm5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzQXJyYXlWYWx1ZUNoYW5nZShmYywgY2hhbmdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZmMudmFsdWUgIT09IGNoYW5nZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZjLnBhdGNoVmFsdWUoY2hhbmdlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgZmMubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVxdWlyZWQnOiB7XG4gICAgICAgICAgICBpZiAoZmMuX2VvRm9ybUVsZW1lbnQucmVxdWlyZWQgIT09IGNoYW5nZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5yZXF1aXJlZCA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgICAgLy8gYXBwbHkgbmV3IHZhbGlkYXRvcnNcbiAgICAgICAgICAgICAgLy8gQHNlZTogaHR0cHM6Ly9zY290Y2guaW8vdHV0b3JpYWxzL2hvdy10by1pbXBsZW1lbnQtY29uZGl0aW9uYWwtdmFsaWRhdGlvbi1pbi1hbmd1bGFyLTItbW9kZWwtZHJpdmVuLWZvcm1zXG4gICAgICAgICAgICAgIGZjLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKHRoaXMuX2dldFZhbGlkYXRvcnMoc2NvcGUsIGZjLl9lb0Zvcm1FbGVtZW50KS5jb25jYXQoW3Njb3BlLmluaXRpYWxWYWxpZGF0b3JzW2ZjLl9lb0Zvcm1FbGVtZW50Lm5hbWVdXSkpKTtcbiAgICAgICAgICAgICAgLy8gbmVlZCB0byBtYXJrIGZvcm0gY29udHJvbCBhcyB0b3VjaGVkIGJlY2F1c2Ugb3RoZXJ3aXNlIGZvcm0gdmFsaWRhdGlvbiB3aWxsIG5vdCBzaG93XG4gICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICAgIGZjLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgICAgZmMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlYWRvbmx5Jzoge1xuICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQucmVhZG9ubHkgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLm5ld1ZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGZjLmRpc2FibGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZjLmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGZjLl9lb0Zvcm1FbGVtZW50LmVycm9yKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlLm5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5lcnJvciA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgICAgZmMubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbmV3IG9ucm93ZWRpdCBmdW5jdGlvbiB3YXMgYXBwbGllZCBieSB0aGUgc2NyaXB0XG4gICAgICAgICAgY2FzZSAnb25yb3dlZGl0Jzoge1xuICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQub25yb3dlZGl0ID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG5ldyBvbmNoYW5nZSBmdW5jdGlvbiB3YXMgYXBwbGllZCBieSB0aGUgc2NyaXB0XG4gICAgICAgICAgY2FzZSAnb25jaGFuZ2UnOiB7XG4gICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5vbmNoYW5nZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBuZXcgY29udGV4dElkIHdhcyBhcHBsaWVkIGJ5IHRoZSBzY3JpcHRcbiAgICAgICAgICBjYXNlICdjb250ZXh0SWQnOiB7XG4gICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5jb250ZXh0SWQgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzQXJyYXlWYWx1ZUNoYW5nZShmYywgY2hhbmdlKSB7XG4gICAgY29uc3QgbmV3VmFsID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBmYy5fZW9Gb3JtRWxlbWVudC50eXBlO1xuICAgIC8vIGZvciBzb21lIHR5cGVzIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgbWV0YSBkYXRhIGFyZSBwcm92aWRlZCBhcyB3ZWxsXG4gICAgc3dpdGNoICh0YXJnZXRUeXBlKSB7XG4gICAgICBjYXNlICdPUkdBTklaQVRJT04nOiB7XG4gICAgICAgIHRoaXMuX2dldERhdGFNZXRhKGZjLl9lb0Zvcm1FbGVtZW50LCBuZXdWYWwpLnN1YnNjcmliZShtID0+IHtcbiAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5kYXRhTWV0YSA9IG07XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NPREVTWVNURU0nOiB7XG4gICAgICAgIGlmICghZmMuX2VvRm9ybUVsZW1lbnQuY29kZXN5c3RlbS5lbnRyaWVzKSB7XG4gICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQuY29kZXN5c3RlbSA9IHRoaXMuc3lzdGVtU2VydmljZS5nZXRDb2Rlc3lzdGVtKGZjLl9lb0Zvcm1FbGVtZW50LmNvZGVzeXN0ZW0uaWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVEFCTEUnOiB7XG4gICAgICAgIGNvbnN0IGRhdGFUb0JlUHJvY2Vzc2VkID0ge307XG4gICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmVsZW1lbnRzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ09SR0FOSVpBVElPTicgfHwgZS50eXBlID09PSAnQ09ERVNZU1RFTScpIHtcbiAgICAgICAgICAgIGRhdGFUb0JlUHJvY2Vzc2VkW2UubmFtZV0gPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhVG9CZVByb2Nlc3NlZCkubGVuZ3RoKSB7XG4gICAgICAgICAgbGV0IG9icyA9IFtdO1xuICAgICAgICAgIG5ld1ZhbC5mb3JFYWNoKHJvd0RhdGEgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocm93RGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YVRvQmVQcm9jZXNzZWRba2V5XSkge1xuICAgICAgICAgICAgICAgIG9icy5wdXNoKHRoaXMuX2dldERhdGFNZXRhKGRhdGFUb0JlUHJvY2Vzc2VkW2tleV0sIHJvd0RhdGFba2V5XSkucGlwZShcbiAgICAgICAgICAgICAgICAgIHRhcChtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2tleSArICdfbWV0YSddID0gbTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm93RGF0YVtrZXkgKyAnX21ldGEnXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9ya0pvaW4ob2JzKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fdXBkYXRlQXJyYXlWYWx1ZShmYywgbmV3VmFsKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUFycmF5VmFsdWUoZmMsIG5ld1ZhbCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVBcnJheVZhbHVlKGZjLCBuZXdWYWx1ZSkge1xuICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gW10uY29uY2F0KG5ld1ZhbHVlKTtcbiAgICBmYy5wYXRjaFZhbHVlKFtdLmNvbmNhdChuZXdWYWx1ZSkpO1xuICAgIGZjLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICBmYy5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBURU1QX1NUT1JBR0VfRU5UUklFU19LRVkgPSAnZW8uY21wLm9iamVjdGZvcm0udG1wc3RvcmFnZS5lbnRyaWVzJztcblxuICAvKipcbiAgICogQWRkIGEgcmVmZXJlbmNlIHRvIGEgdGVtcG9yYXJ5IGxvY2Fsc3RvcmFnZSBlbnRyeSB0aGF0IHNob3VsZCBiZSBjbGVhcmVkIHdoZW4gYVxuICAgKiBuZXcgYnJvd3NlciBzZXNzaW9uIHN0YXJ0cy4gSW4gY29udGV4dCBvZiBmb3JtcyB0aGlzIHdpbGwgYmUgdXNlZCB0byBjbGVhbnVwIHRoZVxuICAgKiBsYXlvdXQgc3RhdGUgb2YgZm9ybXMgKHNlbGVjdGVkIHRhYnMgZXRjLikgdGhhdCBhcmUgc3RvcmVkIGxvY2FsbHkgYnV0IHNob3VsZCBvbmx5XG4gICAqIGJlIHBlc2lzdGVkIGZvciBvbmUgYnJvd3NlciBzZXNzaW9uLlxuICAgKiBAcGFyYW0gc3RvcmFnZUtleSBLZXkgb2YgdGhlIGxvY2Fsc3RvcmFnZSBpdGVtXG4gICAqL1xuICBhZGRUZW1wb3JhcnlTdG9yYWdlRW50cnkoc3RvcmFnZUtleTogc3RyaW5nKSB7XG4gICAgLy8gZW50cmllcyB3aWxsIHRoZW1zZWx2ZXMgYmUgc3RvcmVkIGluIGxvY2Fsc3RvcmFnZSBzbyB3ZSBjYW4gY2hlY2sgZm9yIGVudHJpZXNcbiAgICAvLyB0byBiZSByZW1vdmVkIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9nZXRUZW1wb3JhcnlTdG9yYWdlRW50cmllcygpO1xuICAgIGlmKCFjdXJyZW50LmluY2x1ZGVzKHN0b3JhZ2VLZXkpKVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVEVNUF9TVE9SQUdFX0VOVFJJRVNfS0VZLCBKU09OLnN0cmluZ2lmeShbLi4uY3VycmVudCwgc3RvcmFnZUtleV0pKVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJUZW1wb3JhcnlTdG9yYWdlRW50cmllcygpIHtcbiAgICB0aGlzLl9nZXRUZW1wb3JhcnlTdG9yYWdlRW50cmllcygpLmZvckVhY2goZSA9PiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShlKSk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5URU1QX1NUT1JBR0VfRU5UUklFU19LRVkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VGVtcG9yYXJ5U3RvcmFnZUVudHJpZXMoKTogc3RyaW5nW10ge1xuICAgIGxldCByZXMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllczogc3RyaW5nW10gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVEVNUF9TVE9SQUdFX0VOVFJJRVNfS0VZKSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgcmVzID0gZW50cmllcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGUpXG4gICAgfVxuICAgIGNvbnNvbGUuZGVidWcoYEZvdW5kICR7cmVzLmxlbmd0aH0gdG1wIGVudHJpZXMgdG8gYmUgcmVtb3ZlZGApO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbiJdfQ==