@netgrif/components-core 6.0.3 → 6.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/netgrif-components-core.umd.js +166 -61
- package/bundles/netgrif-components-core.umd.js.map +1 -1
- package/bundles/netgrif-components-core.umd.min.js +2 -2
- package/bundles/netgrif-components-core.umd.min.js.map +1 -1
- package/esm2015/lib/data-fields/file-field/abstract-file-field.component.js +2 -2
- package/esm2015/lib/groups/services/next-group.service.js +3 -2
- package/esm2015/lib/resources/abstract-endpoint/abstract-resource.service.js +3 -2
- package/esm2015/lib/resources/engine-endpoint/public/public-task-resource.service.js +1 -1
- package/esm2015/lib/search/models/category/case/case-dataset.js +3 -6
- package/esm2015/lib/search/models/category/case/case-simple-dataset.js +3 -3
- package/esm2015/lib/search/models/category/case/case-title.js +13 -3
- package/esm2015/lib/search/models/category/case/case-visual-id.js +13 -3
- package/esm2015/lib/search/models/category/category.js +10 -2
- package/esm2015/lib/search/models/operator/substring.js +3 -3
- package/esm2015/lib/search/search-keyword-resolver-service/search-index-resolver.service.js +18 -3
- package/esm2015/lib/search/search-service/search.service.js +3 -2
- package/esm2015/lib/side-menu/content-components/new-case/abstract-new-case.component.js +6 -1
- package/esm2015/lib/task/services/finish-task.service.js +18 -13
- package/esm2015/lib/task/services/task-data.service.js +2 -1
- package/esm2015/lib/user/services/user-list.service.js +4 -3
- package/esm2015/lib/utility/pagination/load-all-pages.js +4 -3
- package/esm2015/lib/utility/pagination/pagination-params.js +19 -0
- package/esm2015/lib/utility/pagination/pagination-sort.js +17 -0
- package/esm2015/lib/utility/public-api.js +3 -1
- package/esm2015/lib/utility/tests/mocks/mock-endpoint.js +4 -3
- package/esm2015/lib/view/abstract/sortable-view.js +4 -3
- package/esm2015/lib/view/case-view/service/case-view-service.js +6 -4
- package/esm2015/lib/view/public-api.js +3 -1
- package/esm2015/lib/view/task-view/service/task-view.service.js +6 -4
- package/esm2015/lib/view/tree-case-view/tree-component/case-tree.service.js +19 -5
- package/esm2015/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.js +2 -0
- package/esm2015/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.js +3 -0
- package/esm2015/lib/view/workflow-view/workflow-view.service.js +4 -11
- package/esm5/lib/data-fields/file-field/abstract-file-field.component.js +2 -2
- package/esm5/lib/groups/services/next-group.service.js +3 -2
- package/esm5/lib/resources/abstract-endpoint/abstract-resource.service.js +3 -2
- package/esm5/lib/resources/engine-endpoint/public/public-task-resource.service.js +1 -1
- package/esm5/lib/search/models/category/case/case-dataset.js +3 -6
- package/esm5/lib/search/models/category/case/case-simple-dataset.js +3 -3
- package/esm5/lib/search/models/category/case/case-title.js +19 -4
- package/esm5/lib/search/models/category/case/case-visual-id.js +19 -4
- package/esm5/lib/search/models/category/category.js +10 -2
- package/esm5/lib/search/models/operator/substring.js +3 -3
- package/esm5/lib/search/search-keyword-resolver-service/search-index-resolver.service.js +17 -2
- package/esm5/lib/search/search-service/search.service.js +3 -2
- package/esm5/lib/side-menu/content-components/new-case/abstract-new-case.component.js +6 -1
- package/esm5/lib/task/services/finish-task.service.js +18 -13
- package/esm5/lib/task/services/task-data.service.js +2 -1
- package/esm5/lib/user/services/user-list.service.js +4 -3
- package/esm5/lib/utility/pagination/load-all-pages.js +4 -3
- package/esm5/lib/utility/pagination/pagination-params.js +19 -0
- package/esm5/lib/utility/pagination/pagination-sort.js +17 -0
- package/esm5/lib/utility/public-api.js +3 -1
- package/esm5/lib/utility/tests/mocks/mock-endpoint.js +4 -3
- package/esm5/lib/view/abstract/sortable-view.js +4 -3
- package/esm5/lib/view/case-view/service/case-view-service.js +6 -4
- package/esm5/lib/view/public-api.js +3 -1
- package/esm5/lib/view/task-view/service/task-view.service.js +6 -4
- package/esm5/lib/view/tree-case-view/tree-component/case-tree.service.js +19 -5
- package/esm5/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.js +2 -0
- package/esm5/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.js +3 -0
- package/esm5/lib/view/workflow-view/workflow-view.service.js +4 -11
- package/fesm2015/netgrif-components-core.js +154 -61
- package/fesm2015/netgrif-components-core.js.map +1 -1
- package/fesm5/netgrif-components-core.js +165 -62
- package/fesm5/netgrif-components-core.js.map +1 -1
- package/lib/search/models/category/case/case-dataset.d.ts +0 -2
- package/lib/search/models/category/case/case-title.d.ts +4 -1
- package/lib/search/models/category/case/case-visual-id.d.ts +4 -1
- package/lib/search/models/category/category.d.ts +7 -0
- package/lib/search/search-keyword-resolver-service/search-index-resolver.service.d.ts +12 -0
- package/lib/side-menu/content-components/new-case/abstract-new-case.component.d.ts +1 -0
- package/lib/task/services/finish-task.service.d.ts +5 -0
- package/lib/utility/pagination/pagination-params.d.ts +17 -0
- package/lib/utility/pagination/pagination-sort.d.ts +13 -0
- package/lib/utility/public-api.d.ts +2 -0
- package/lib/view/public-api.d.ts +2 -0
- package/lib/view/tree-case-view/tree-component/case-tree.service.d.ts +4 -1
- package/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.d.ts +9 -0
- package/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.d.ts +3 -0
- package/lib/view/workflow-view/workflow-view.service.d.ts +0 -1
- package/netgrif-components-core.metadata.json +1 -1
- package/package.json +2 -2
- package/schematics/collection.json +0 -3
|
@@ -274,7 +274,7 @@ var Category = /** @class */ (function () {
|
|
|
274
274
|
if (!this.isOperatorSelected()) {
|
|
275
275
|
throw new Error('Category cannot generate a Query if no Operator is selected');
|
|
276
276
|
}
|
|
277
|
-
return this._operatorFormControl.value.createQuery(this.
|
|
277
|
+
return this._operatorFormControl.value.createQuery(this.elasticKeywords, userInput);
|
|
278
278
|
};
|
|
279
279
|
/**
|
|
280
280
|
* Calls the [generateQuery]{@link Category#generateQuery} method and creates an {@link ElementaryPredicate} with the result.
|
|
@@ -575,6 +575,14 @@ var Category = /** @class */ (function () {
|
|
|
575
575
|
}
|
|
576
576
|
return { segment: segment, bold: true };
|
|
577
577
|
};
|
|
578
|
+
/**
|
|
579
|
+
* Checks for selected operator
|
|
580
|
+
* @param operatorClass the operator to be checked
|
|
581
|
+
* @return boolean of the statement
|
|
582
|
+
*/
|
|
583
|
+
Category.prototype.isSelectedOperator = function (operatorClass) {
|
|
584
|
+
return this.selectedOperator === this._operatorService.getOperator(operatorClass);
|
|
585
|
+
};
|
|
578
586
|
/**
|
|
579
587
|
* The {@link CategoryMetadataConfiguration} key for this Category's {@link Operator}
|
|
580
588
|
*/
|
|
@@ -582,4 +590,4 @@ var Category = /** @class */ (function () {
|
|
|
582
590
|
return Category;
|
|
583
591
|
}());
|
|
584
592
|
export { Category };
|
|
585
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL21vZGVscy9jYXRlZ29yeS9jYXRlZ29yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRzlDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLGFBQWEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUsxRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFaEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFekY7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSDtJQTZDSTs7Ozs7Ozs7OztPQVVHO0lBQ0gsa0JBQXlDLGdCQUErQixFQUMvQixpQkFBdUMsRUFDMUMsZUFBdUIsRUFDcEIsVUFBMkIsRUFDcEMsSUFBbUIsRUFDbkIsZ0JBQWlDO1FBTGpFLGlCQStDQztRQS9Dd0MscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFlO1FBQy9CLHNCQUFpQixHQUFqQixpQkFB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IjpbImltcG9ydCB7T3BlcmF0b3J9IGZyb20gJy4uL29wZXJhdG9yL29wZXJhdG9yJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL3F1ZXJ5L3F1ZXJ5JztcbmltcG9ydCB7RWxlbWVudGFyeVByZWRpY2F0ZX0gZnJvbSAnLi4vcHJlZGljYXRlL2VsZW1lbnRhcnktcHJlZGljYXRlJztcbmltcG9ydCB7U2VhcmNoSW5wdXRUeXBlfSBmcm9tICcuL3NlYXJjaC1pbnB1dC10eXBlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRlZmF1bHRJZkVtcHR5LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7T3BlcmF0b3JUZW1wbGF0ZVBhcnR9IGZyb20gJy4uL29wZXJhdG9yLXRlbXBsYXRlLXBhcnQnO1xuaW1wb3J0IHtJbmNyZW1lbnRpbmdDb3VudGVyfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L2luY3JlbWVudGluZy1jb3VudGVyJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbklucHV0fSBmcm9tICcuLi9jb25maWd1cmF0aW9uLWlucHV0JztcbmltcG9ydCB7Q2F0ZWdvcnlHZW5lcmF0b3JNZXRhZGF0YSwgQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb259IGZyb20gJy4uL3BlcnNpc3RhbmNlL2dlbmVyYXRvci1tZXRhZGF0YSc7XG5pbXBvcnQge0NhdGVnb3JpZXN9IGZyb20gJy4vY2F0ZWdvcmllcyc7XG5pbXBvcnQge09wZXJhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vb3BlcmF0b3Itc2VydmljZS9vcGVyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7T3BlcmF0b3JzfSBmcm9tICcuLi9vcGVyYXRvci9vcGVyYXRvcnMnO1xuaW1wb3J0IHtvZlZvaWR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvb2Ytdm9pZCc7XG5pbXBvcnQge0ZpbHRlclRleHRTZWdtZW50fSBmcm9tICcuLi9wZXJzaXN0YW5jZS9maWx0ZXItdGV4dC1zZWdtZW50JztcbmltcG9ydCB7REFURV9GT1JNQVRfU1RSSU5HLCBEQVRFX1RJTUVfRk9STUFUX1NUUklOR30gZnJvbSAnLi4vLi4vLi4vbW9tZW50L3RpbWUtZm9ybWF0cyc7XG5cbi8qKlxuICogVGhlIHRvcCBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpbiBzZWFyY2ggcXVlcnkgZ2VuZXJhdGlvbi4gUmVwcmVzZW50cyBhIHNldCBvZiBpbmRleGVkIGZpZWxkcyB0aGF0IGNhbiBiZSBzZWFyY2hlZC5cbiAqIEVuY2Fwc3VsYXRlcyB0aGUgdGhlIHN0YXRlIGFuZCBsb2dpYyBvZiB0aGUgcXVlcnkgY29uc3RydWN0aW9uIHByb2Nlc3MuXG4gKlxuICogQXMgb3Bwb3NlZCB0byB7QGxpbmsgT3BlcmF0b3J9cyBDYXRlZ29yaWVzIGFyZSBub3Qgc3RhdGVsZXNzIGFuZCBzaG91bGRuJ3QgYmUgc2hhcmVkLlxuICogQSBzaW5nbGUgQ2F0ZWdvcnkgaW5zdGFuY2UgaXMgY2FwYWJsZSBvZiBob2xkaW5nIHRoZSBzdGF0ZSBvZiBvbmUge0BsaW5rIEVkaXRhYmxlUHJlZGljYXRlfSxcbiAqIG9yIGNhbiBiZSB1c2VkIGFzIGEgYnVpbGRlciB0byBmb3JtIGFuIHVubGltaXRlZCBhbW91bnQgb2YgW0VsZW1lbnRhcnlQcmVkaWNhdGVzXXtAbGluayBFbGVtZW50YXJ5UHJlZGljYXRlfS5cbiAqXG4gKiBZb3UgY2FuIHVzZSB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSB0byBnZXQgaW5zdGFuY2VzIG9mIENhdGVnb3J5IGNsYXNzZXMuXG4gKiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIHRoZSBbY2xvbmUoKV17QExpbmsgQ2F0ZWdvcnkjY2xvbmV9IG1ldGhvZCB0byBkdXBsaWNhdGUgYW4gZXhpc3RpbmcgaW5zdGFuY2UuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gbWFrZSB5b3VyIG93biBDYXRlZ29yeSBjbGFzcyB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29uc3RydWN0b3IgdGFrZXMge0BsaW5rIE9wZXJhdG9yU2VydmljZX0gYXMgaXQncyBmaXJzdFxuICogYXJndW1lbnQgYW5kIHtAbGluayBMb2dnZXJTZXJ2aWNlfSBhcyBpdCdzIHNlY29uZCBhcmd1bWVudC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIG1ha2UgeW91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgdGhlXG4gKiB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSBzbywgdGhhdCB5b3VyIHN0eWxlIG9mIGNvbnN0cnVjdG9ycyBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIHR5cGUgb2Ygb2JqZWN0cyB0aGUgY2F0ZWdvcnkgZXhwZWN0cyB0byBnZW5lcmF0ZSBxdWVyaWVzIGZyb21cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENhdGVnb3J5PFQ+IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb259IGtleSBmb3IgdGhpcyBDYXRlZ29yeSdzIHtAbGluayBPcGVyYXRvcn1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IE9QRVJBVE9SX01FVEFEQVRBID0gJ29wZXJhdG9yJztcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBgRm9ybUNvbnRyb2xgIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZHJpdmUgdGhlIG9wZXJhdG9yIHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBjYXRlZ29yeSBjYW4gc3Vic2NyaWJlIHRvIGl0IGlmIGl0IHdpc2hlcyB0byByZWFjdCB0byB0aGUgc2VsZWN0aW9uIGNoYW5nZSBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX29wZXJhdG9yRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gICAgLyoqXG4gICAgICogU3RvcmVzIHRoZSBgRm9ybUNvbnRyb2xgIG9iamVjdHMgdGhhdCBhcmUgcHVzaGVkIGludG8gdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIGNoYW5nZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYW5kc0Zvcm1Db250cm9sczogQXJyYXk8Rm9ybUNvbnRyb2w+O1xuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGBGb3JtQ29udHJvbGAgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlucHV0IHNlYXJjaCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYW5kc0Zvcm1Db250cm9scyQ6IFJlcGxheVN1YmplY3Q8QXJyYXk8Rm9ybUNvbnRyb2w+IHwgdW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBvcGVyYXRvciB0ZW1wbGF0ZSBwYXJ0cyB0aGF0IG1ha2UgdXAgdGhlIG9wZXJhbmRzIEdVSS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX29wZXJhdG9yVGVtcGxhdGUkOiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8T3BlcmF0b3JUZW1wbGF0ZVBhcnQ+IHwgdW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBJRHMgZm9yIHRlbXBsYXRlIHBhcnRzIHN1cHBsaWVkIHRvIG5nIGZvci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3RyYWNrQnlJZEdlbmVyYXRvcjogSW5jcmVtZW50aW5nQ291bnRlcjtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgYSBuZXcgYFByZWRpY2F0ZWAgaWYgdGhlIGBDYXRlZ29yeWAgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbiBiZSBjcmVhdGVkLlxuICAgICAqIEVtaXRzIGB1bmRlZmluZWRgIGlmIHRoZSBgQ2F0ZWdvcnlgIGlzIG5vdCBpbiBzdWNoIHN0YXRlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ2VuZXJhdGVkUHJlZGljYXRlJDogQmVoYXZpb3JTdWJqZWN0PEVsZW1lbnRhcnlQcmVkaWNhdGUgfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqXG4gICAgICogVXRpbGl0eSB2YXJpYWJsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHZhbHVlIGZvciB0aGUgW2NvbmZpZ3VyYXRpb25JbnB1dHMkXXtAbGluayBDYXRlZ29yeSNjb25maWd1cmF0aW9uSW5wdXRzJH0gYE9ic2VydmFibGVgLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfT1BFUkFUT1JfSU5QVVQ6IENvbmZpZ3VyYXRpb25JbnB1dDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBmaWxscyB0aGUgdmFsdWVzIG9mIGFsbCBwcm90ZWN0ZWQgZmllbGRzIGFuZCB0aGVuIGNhbGxzIHRoZSBbaW5pdGlhbGl6ZUNhdGVnb3J5KClde0BsaW5rIENhdGVnb3J5I2luaXRpYWxpemVDYXRlZ29yeX1cbiAgICAgKiBtZXRob2QuIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBjYXRlZ29yeSBjcmVhdGlvbiBiZWhhdmlvciBvdmVycmlkZSB0aGF0IG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfZWxhc3RpY0tleXdvcmRzIEVsYXN0aWNzZWFyY2gga2V5d29yZHMgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBieSBxdWVyaWVzIGdlbmVyYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnlcbiAgICAgKiBAcGFyYW0gX2FsbG93ZWRPcGVyYXRvcnMgT3BlcmF0b3JzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGVkIHF1ZXJpZXMgb24gdGhlIGFib3ZlIGtleXdvcmRzXG4gICAgICogQHBhcmFtIHRyYW5zbGF0aW9uUGF0aCBwYXRoIHRvIHRoZSB0cmFuc2xhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0gX2lucHV0VHlwZSBpbnB1dCBmaWVsZCB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZW50ZXIgb3BlcmF0b3IgYXJndW1lbnRzIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgICogQHBhcmFtIF9sb2cgdXNlZCB0byByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgaW5jb3JyZWN0IHVzZSBvZiB0aGlzIGNsYXNzXG4gICAgICogQHBhcmFtIF9vcGVyYXRvclNlcnZpY2UgdXNlZCB0byByZXNvbHZlIHNlcmlhbGl6ZWQgb3BlcmF0b3JzIGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IF9lbGFzdGljS2V5d29yZHM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBfYWxsb3dlZE9wZXJhdG9yczogQXJyYXk8T3BlcmF0b3I8YW55Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSB0cmFuc2xhdGlvblBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pbnB1dFR5cGU6IFNlYXJjaElucHV0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfb3BlcmF0b3JTZXJ2aWNlOiBPcGVyYXRvclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fT1BFUkFUT1JfSU5QVVQgPSBuZXcgQ29uZmlndXJhdGlvbklucHV0KFxuICAgICAgICAgICAgU2VhcmNoSW5wdXRUeXBlLk9QRVJBVE9SLFxuICAgICAgICAgICAgJ3NlYXJjaC5vcGVyYXRvci5uYW1lJyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIEFycmF5PHVua25vd24+PigpLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbklucHV0IG9mIHR5cGUgT1BFUkFUT1IgaXMgYSBwbGFjZWhvbGRlciEnXG4gICAgICAgICAgICAgICAgICAgICsgJyBVc2Ugb3BlcmF0b3IgcmVsYXRlZCBtZXRob2RzIGZyb20gdGhlIENhdGVnb3J5IGNsYXNzIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbCA9IHRoaXMuX09QRVJBVE9SX0lOUFVULmZvcm1Db250cm9sO1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxGb3JtQ29udHJvbD4gfCB1bmRlZmluZWQ+KDEpO1xuICAgICAgICB0aGlzLl9vcGVyYXRvclRlbXBsYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8T3BlcmF0b3JUZW1wbGF0ZVBhcnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyA9IFtdO1xuICAgICAgICB0aGlzLl90cmFja0J5SWRHZW5lcmF0b3IgPSBuZXcgSW5jcmVtZW50aW5nQ291bnRlcigpO1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbGVtZW50YXJ5UHJlZGljYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVDYXRlZ29yeSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmFuZHNGb3JtQ29udHJvbHMkLnBpcGUoXG4gICAgICAgICAgICBtYXAoZm9ybUNvbnRyb2xzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1Db250cm9scykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5zZWxlY3RlZE9wZXJhdG9yLmdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmNzID0gWy4uLmZvcm1Db250cm9sc107XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHMubWFwKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IG5ldyBPcGVyYXRvclRlbXBsYXRlUGFydChwYXJ0ID8gcGFydCA6IGZjcy5zaGlmdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCeUlkR2VuZXJhdG9yLm5leHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPyB1bmRlZmluZWQgOiBmaXJzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApLnN1YnNjcmliZSh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcGVyYXRvclRlbXBsYXRlJC5uZXh0KHRlbXBsYXRlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0IGJlZm9yZSBpdHMgZGVzdHJ1Y3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgZGV2ZWxvcGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCBhdCBhbiBhcHByb3ByaWF0ZSBtb21lbnQsIGFzIHRoaXMgb2JqZWN0IGNhbm5vdCBob29rIGludG8gdGhlIEFuZ3VsYXIgbGlmZWN5Y2xlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JUZW1wbGF0ZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gaW5wdXQgcmVwcmVzZW50IHRoZSBzdGVwcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBUaGUgbGFzdCBpbnB1dCBtdXN0IGFsd2F5cyBiZSBvZiB0eXBlIFtPUEVSQVRPUl17QGxpbmsgU2VhcmNoSW5wdXRUeXBlI09QRVJBVE9SfS5cbiAgICAgKiBTZWxlY3RpbmcgdGhlIG9wZXJhdG9yIGNvbXBsZXRlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2F0ZWdvcnkgYW5kIHRoZSBhcmd1bWVudHMgaW5wdXRzXG4gICAgICogKGJhc2VkIG9uIGNhdGVnb3J5IGlucHV0IHR5cGUgYW5kIG9wZXJhdG9yIGFyaXR5KSBhcmUgZGlzcGxheWVkLlxuICAgICAqXG4gICAgICogQmV3YXJlIHRoYXQgd2hpbGUgbW9zdCBjYXRlZ29yaWVzIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgY29uc3RhbnQgaXQgbXVzdCBub3QgYWx3YXlzIGJlIHRoZSBjYXNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdGhlIHJlcXVpcmVkIGlucHV0IHR5cGUgZm9yIGNvbmZpZ3VyYXRpb24gc3RlcHMgb2YgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgY29uZmlndXJhdGlvbklucHV0cyQoKTogT2JzZXJ2YWJsZTxBcnJheTxDb25maWd1cmF0aW9uSW5wdXQ+PjtcblxuICAgIC8qKlxuICAgICAqIElmIHlvdSB1c2UgdGhlIGBDYXRlZ29yeWAgY2xhc3MgYXMgYSBzb3J0IG9mIFByZWRpY2F0ZUJ1aWxkZXIsIHRoZW4geW91IHdhbnQgdG8gdXNlIHRoZVxuICAgICAqIFtnZW5lcmF0ZVByZWRpY2F0ZSgpXXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVByZWRpY2F0ZX0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBUaGlzIHN0cmVhbSBwdWJsaXNoZXMgZWl0aGVyIGEgbmV3IGBQcmVkaWNhdGVgIG9iamVjdCBvciBgdW5kZWZpbmVkYCBiYXNlZCBvbiBjaGFuZ2VzIHRvIHRoZSBgRm9ybUNvbnRyb2xzYCB0aGF0IGFyZVxuICAgICAqIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gSWYgKGJhc2VkIG9uIHVzZXIgaW5wdXQpIHRoZSBgQ2F0ZWdvcnlgIHJlYWNoZXMgYSBzdGF0ZSB3aGVuIGNvbnN0cnVjdGlvbiBvZiBhIGBQcmVkaWNhdGVgIGlzIHBvc3NpYmxlXG4gICAgICogaXQgd2lsbCBlbWl0IHRoaXMgYFByZWRpY2F0ZWAuIElmIGl0IHJlYWNoZXMgYSBzdGF0ZSB3aGVuIHRoZSBgUHJlZGljYXRlYCBjYW4gbm90IGxvbmdlciBiZSBjcmVhdGVkIGB1bmRlZmluZWRgIGlzIGVtaXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBnZW5lcmF0ZWRQcmVkaWNhdGUkKCk6IE9ic2VydmFibGU8RWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZGljYXRlfSBjdXJyZW50bHkgZ2VuZXJhdGVkIGJ5IHRoZSBDYXRlZ29yeS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbZ2VuZXJhdGVkUHJlZGljYXRlJF17QGxpbmsgQ2F0ZWdvcnkjZ2VuZXJhdGVkUHJlZGljYXRlJH0uXG4gICAgICovXG4gICAgcHVibGljIGdldCBnZW5lcmF0ZWRQcmVkaWNhdGUoKTogRWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmV3YXJlIHRoYXQgd2hpbGUgbW9zdCBjYXRlZ29yaWVzIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgY29uc3RhbnQgaXQgaXMgbm90IGEgcmVxdWlyZW1lbnQuXG4gICAgICogQW4gZXhhbXBsZSBmb3Igc3VjaCBiZWhhdmlvciBpcyB0aGUge0BsaW5rIENhc2VEYXRhc2V0fSBjYXRlZ29yeSwgd2hlcmUgdGhlIGFyZ3VtZW50IGlucHV0IHR5cGUgZGVwZW5kc1xuICAgICAqIG9uIHRoZSBzZWxlY3RlZCBkYXRhIGZpZWxkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5wdXQgdHlwZSBmb3IgYXJndW1lbnRzIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgICovXG4gICAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogU2VhcmNoSW5wdXRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0VHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgc2V0IG9mIE9wZXJhdG9ycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhpcyBjYXRlZ29yeS4gSXRlcmF0aW9uIG9yZGVyIGRldGVybWluZXMgdGhlIGRpc3BsYXkgb3JkZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhbGxvd2VkT3BlcmF0b3JzKCk6IEFycmF5PE9wZXJhdG9yPGFueT4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2FsbG93ZWRPcGVyYXRvcnMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3BlcmF0b3Igb3IgYHVuZGVmaW5lZGAgaWYgbm8gb3BlcmF0b3IgaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZE9wZXJhdG9yKCk6IE9wZXJhdG9yPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBgRm9ybUNvbnRyb2xgIG9iamVjdHMgdGhhdCBjb250YWlucyBhcyBtYW55IGNvbnRyb2xzIGFzIGlzIHRoZSBhcml0eSBvZiB0aGUgc2VsZWN0ZWQgb3BlcmF0b3IuXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB3aWxsIHJldHVybiB0aGUgc2FtZSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlcy5cbiAgICAgKiBXaGVuIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkIGB1bmRlZmluZWRgIGlzIGVtaXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBvcGVyYW5kc0Zvcm1Db250cm9scyQoKTogT2JzZXJ2YWJsZTxBcnJheTxGb3JtQ29udHJvbD4gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG5ldyB2YWx1ZSBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBzZWxlY3RlZCBvcGVyYXRvciBjaGFuZ2VzLiBgdW5kZWZpbmVkYCBpcyBlbWl0dGVkIGlmIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgW29wZXJhdG9ycyB0ZW1wbGF0ZV17QGxpbmsgT3BlcmF0b3IjZ2V0T3BlcmF0b3JOYW1lVGVtcGxhdGV9IGluIHByb2Nlc3NlZCBmb3JtIGZpdCBmb3IgR1VJIHJlbmRlcmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3BlcmF0b3JUZW1wbGF0ZSQoKTogT2JzZXJ2YWJsZTxBcnJheTxPcGVyYXRvclRlbXBsYXRlUGFydD4gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhdG9yVGVtcGxhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGNhdGVnb3J5IGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYW5kIHJlcHJlc2VudHMgYSB2YWxpZCBwcmVkaWNhdGUgb3Igbm90XG4gICAgICovXG4gICAgcHVibGljIGdldCBwcm92aWRlc1ByZWRpY2F0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBzZXQgb2YgRWxhc3RpY3NlYXJjaCBrZXl3b3JkcyB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGJ5IHF1ZXJpZXMgZ2VuZXJhdGVkIHdpdGggdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIHRoZSBrZXl3b3JkcyBhcmUgbm90IHN0YXRpYyBhbmQgY2hhbmdlIGJhc2VkIG9uIHNvbWUgYWRkaXRpb25hbCBzZWxlY3Rpb24gKGVnLiBEYXRhIGZpZWxkcylcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGVsYXN0aWNLZXl3b3JkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2VsYXN0aWNLZXl3b3Jkcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIGFyaXR5IG9mIHRoZSBzZWxlY3RlZCBvcGVyYXRvci4gVGhyb3dzIGFuIGVycm9yIGlmIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgc2VsZWN0ZWRPcGVyYXRvckFyaXR5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZXJhdG9yU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvcGVyYXRvciBtdXMgYmUgc2VsZWN0ZWQgYmVmb3JlIGl0cyBhcml0eSBjYW4gYmUgcmVzb2x2ZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcGVyYXRvci5udW1iZXJPZk9wZXJhbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBDYXRlZ29yeS4gQ2F0ZWdvcnkgY2FuIGNyZWF0ZSBxdWVyaWVzIHdoZW4gYW4ge0BsaW5rIE9wZXJhdG9yfSBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIENhdGVnb3J5IGNsYXNzIGFzIHByZWRpY2F0ZSBidWlsZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZXJhdG9ySW5kZXggaW5kZXggaW4gdGhlIFthbGxvd2VkT3BlcmF0b3JzXXtAbGluayBDYXRlZ29yeSNhbGxvd2VkT3BlcmF0b3JzfSBhcnJheSBvZiB0aGUge0BsaW5rIE9wZXJhdG9yfSB0aGF0XG4gICAgICogc2hvdWxkIGJlIHNlbGVjdGVkXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdE9wZXJhdG9yKG9wZXJhdG9ySW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBvcGVyYXRvcnMgPSB0aGlzLmFsbG93ZWRPcGVyYXRvcnM7XG4gICAgICAgIGlmIChvcGVyYXRvckluZGV4IDwgMCB8fCBvcGVyYXRvckluZGV4ID49IG9wZXJhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKGBUaGUgcHJvdmlkZWQgJ29wZXJhdG9ySW5kZXgnIGlzIG91dCBvZiByYW5nZS5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnNldFZhbHVlKG9wZXJhdG9yc1tvcGVyYXRvckluZGV4XSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIENhdGVnb3J5IGFuZCBnZW5lcmF0ZXMgYSBxdWVyeSBpZiBhbGwgbmVjZXNzYXJ5IG9wZXJhbmRzIHdlcmUgc2V0LlxuICAgICAqXG4gICAgICogSWYgeW91IGFyZSB1c2luZyB0aGUgY2F0ZWdvcnkgYXMgYSBidWlsZGVyLiBDb25zaWRlciB1c2luZyB0aGUgW2dlbmVyYXRlUHJlZGljYXRlKClde0BsaW5rIENhdGVnb3J5I2dlbmVyYXRlUHJlZGljYXRlfVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJbnB1dCB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlci4gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZVxuICAgICAqIFthcml0eV17QGxpbmsgT3BlcmF0b3IjX251bWJlck9mT3BlcmFuZHN9IG9mIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0T3BlcmFuZHModXNlcklucHV0OiBBcnJheTxUPik6IHZvaWQge1xuICAgICAgICBjb25zdCByYW5nZSA9IE1hdGgubWluKHVzZXJJbnB1dC5sZW5ndGgsIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aCk7XG4gICAgICAgIGlmIChyYW5nZSA8IHVzZXJJbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKGAke3VzZXJJbnB1dC5sZW5ndGh9IG9wZXJhbmRzIGFyZSBiZWluZyBzZXQsIGJ1dCBvbmx5ICR7cmFuZ2V9IGlucHV0cyBhcmUgYXZhaWxhYmxlIWBcbiAgICAgICAgICAgICAgICArICcgRXh0cmEgb3BlcmFuZHMgd2lsbCBiZSBpZ25vcmVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2U7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHNbaV0uc2V0VmFsdWUodXNlcklucHV0W2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2UgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmFuZFZhbHVlQ2hhbmdlcyhyYW5nZSAtIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgQ2F0ZWdvcnksIGRlc2VsZWN0aW5nIGFueSBzZWxlY3RlZCBjYXRlZ29yeSBhbmQgcmVtb3Zpbmcgb3RoZXIgc3RhdGVcbiAgICAgKiBpbmZvcm1hdGlvbiBpZiB0aGUgQ2F0ZWdvcnkgZGVmaW5lcyB0aGVtLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBjYXRlZ29yeSBhZnRlciBlYWNoIHByZWRpY2F0ZSBjb25zdHJ1Y3RlZCxcbiAgICAgKiBlZmZlY3RpdmVseSB0dXJuaW5nIHRoZSBjYXRlZ29yeSBpbnN0YW5jZSBpbnRvIGEgcHJlZGljYXRlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyT3BlcmF0b3JTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMuZm9yRWFjaChmYyA9PiB7XG4gICAgICAgICAgICBmYy5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgW2NyZWF0ZVF1ZXJ5XXtAbGluayBPcGVyYXRvciNjcmVhdGVRdWVyeX0gbWV0aG9kIG9uIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBFcnJvciBpZiBubyBPcGVyYXRvciBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBxdWVyeSBzaG91bGQgYmUgZ2VuZXJhdGVkIGluIHNvbWUgb3RoZXIgd2F5LlxuICAgICAqIEBwYXJhbSB1c2VySW5wdXQgdmFsdWVzIGVudGVyZWQgYnkgdGhlIHVzZXIuIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHNob3VsZCBtYXRjaCB0aGVcbiAgICAgKiBbYXJpdHlde0BsaW5rIE9wZXJhdG9yI19udW1iZXJPZk9wZXJhbmRzfSBvZiB0aGUgc2VsZWN0ZWQgT3BlcmF0b3IuXG4gICAgICogQHJldHVybnMgdGhlIFF1ZXJ5IGdlbmVyYXRlZCBieSB0aGUgc2VsZWN0ZWQgT3BlcmF0b3JcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVRdWVyeSh1c2VySW5wdXQ6IEFycmF5PFQ+KTogUXVlcnkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgY2Fubm90IGdlbmVyYXRlIGEgUXVlcnkgaWYgbm8gT3BlcmF0b3IgaXMgc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZS5jcmVhdGVRdWVyeSh0aGlzLl9lbGFzdGljS2V5d29yZHMsIHVzZXJJbnB1dCBhcyB1bmtub3duIGFzIEFycmF5PHN0cmluZz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBbZ2VuZXJhdGVRdWVyeV17QGxpbmsgQ2F0ZWdvcnkjZ2VuZXJhdGVRdWVyeX0gbWV0aG9kIGFuZCBjcmVhdGVzIGFuIHtAbGluayBFbGVtZW50YXJ5UHJlZGljYXRlfSB3aXRoIHRoZSByZXN1bHQuXG4gICAgICogQHBhcmFtIHVzZXJJbnB1dCB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlci4gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZVxuICAgICAqIFthcml0eV17QGxpbmsgT3BlcmF0b3IjX251bWJlck9mT3BlcmFuZHN9IG9mIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKiBAcmV0dXJucyBQcmVkaWNhdGUgd2l0aCB7QGxpbmsgUXVlcnl9IGdlbmVyYXRlZCBieSB0aGlzIG9iamVjdCdzIFtnZW5lcmF0ZVF1ZXJ5XXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVF1ZXJ5fSBtZXRob2RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVQcmVkaWNhdGUodXNlcklucHV0OiBBcnJheTxUPik6IEVsZW1lbnRhcnlQcmVkaWNhdGUge1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRhcnlQcmVkaWNhdGUodGhpcy5nZW5lcmF0ZVF1ZXJ5KHVzZXJJbnB1dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgdGhlIGRlZmF1bHQgb3BlcmF0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgZ2VuZXJhdGlvbiwgd2hlbiBubyBPcGVyYXRvciBzZWxlY3Rpb24gaXMgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZWxlY3RzIHRoZSBmaXJzdCBvcGVyYXRvciBpbiB0aGUgW19hbGxvd2VkT3BlcmF0b3JzXXtAbGluayBDYXRlZ29yeSNhbGxvd2VkT3BlcmF0b3JzfSBhcnJheS5cbiAgICAgKlxuICAgICAqIFNlZSBbc2VsZWN0T3BlcmF0b3IoKV17QGxpbmsgQ2F0ZWdvcnkjc2VsZWN0T3BlcmF0b3J9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3REZWZhdWx0T3BlcmF0b3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0T3BlcmF0b3IoMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHN0cmluZyBwYXRoIGZvciB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGlucHV0IHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldCBpbnB1dFBsYWNlaG9sZGVyKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGNhdGVnb3J5IHRleHQgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGggYm9sZCB0ZXh0IHdoZW4gc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGRpc3BsYXlCb2xkKCk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGFuIG9wZXJhdG9yIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBvciBub3QuXG4gICAgICovXG4gICAgcHVibGljIGlzT3BlcmF0b3JTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcGVyYXRvciAoaWYgYW55KVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhck9wZXJhdG9yU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCBjYXRlZ29yeSBvYmplY3QuIE5vdGUgdGhhdCBhIGR1cGxpY2F0ZSBpcyBOT1QgYSBjbG9uZS5cbiAgICAgKiBUaGUgc3RhdGUgb2YgdGhlIHJldHVybmVkIGNhdGVnb3J5IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgc3RhdGUgb2YgdGhpcyBjYXRlZ29yeS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgY2F0ZWdvcnkgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIGNhdGVnb3J5IGluIGl0cyBpbml0aWFsIHN0YXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBkdXBsaWNhdGUoKTogQ2F0ZWdvcnk8VD47XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgc2VyaWFsaXNhdGlvbiBvZiB0aGlzIGNhdGVnb3J5J3Mgc3RhdGUuXG4gICAgICpcbiAgICAgKiBOb3QgZXZlcnkgc3RhdGUgbXVzdCBiZSBwcmVzZXJ2YWJsZS4gVGhlIGRlZmF1bHQgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBwcmVzZXJ2YXRpb24gb2YgdGhlIGZpbmFsIHN0YXRlIHdoZW4gdGhlXG4gICAgICogQ2F0ZWdvcnkgaXMgZ2VuZXJhdGluZyBhIHByZWRpY2F0ZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlY29uc3RydWN0aW9uIG9mIHRoaXMgY2F0ZWdvcnkncyBzdGF0ZSxcbiAgICAgKiBiYXJyaW5nIGluZm9ybWF0aW9uIGFib3V0IGFsbG93ZWQgbmV0cy4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgY2F0ZWdvcnkgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBnZW5lcmF0ZXMgYSBwcmVkaWNhdGUuXG4gICAgICogU2VlIFtwcm92aWRlc1ByZWRpY2F0ZSgpXXtAbGluayBDYXRlZ29yeSNwcm92aWRlc1ByZWRpY2F0ZX0uXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU1ldGFkYXRhKCk6IENhdGVnb3J5R2VuZXJhdG9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXNQcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLnNlcmlhbGl6ZUNsYXNzKCksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNyZWF0ZU1ldGFkYXRhQ29uZmlndXJhdGlvbigpLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmNyZWF0ZU1ldGFkYXRhVmFsdWVzKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgc2F2ZWQgc3RhdGUgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgbWV0YWRhdGEgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBbY3JlYXRlTWV0YWRhdGEoKV17QGxpbmsgQ2F0ZWdvcnkjY3JlYXRlTWV0YWRhdGF9IG1ldGhvZFxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZS4gV2hlbiB0aGUgT2JzZXJ2YWJsZSBlbWl0cyB0aGUgY2F0ZWdvcnkgaGFzIGZpbmlzaGVkIHJlc3RvcmluZyBpdHMgc3RhdGUuXG4gICAgICovXG4gICAgcHVibGljIGxvYWRGcm9tTWV0YWRhdGEobWV0YWRhdGE6IENhdGVnb3J5R2VuZXJhdG9yTWV0YWRhdGEpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICB0aGlzLmxvYWRDb25maWd1cmF0aW9uRnJvbU1ldGFkYXRhKG1ldGFkYXRhLmNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRWYWx1ZXNGcm9tTWV0YWRhdGEobWV0YWRhdGEudmFsdWVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGUgaW4gdGhlIGNvbnN0cnVjdG9yLiBBcGFydCBmcm9tIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBjb25zdHJ1Y3RvciBvbmx5IGNyZWF0ZXMgaW5zdGFuY2VzIHRvIGZpbGwgdGhlIHByb3RlY3RlZFxuICAgICAqIGZpZWxkcyBvZiB0aGlzIGNsYXNzLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbWFuYWdlcyBjcmVhdGlvbiBvZiBvcGVyYW5kIGBGb3JtQ29udHJvbGAgaW5zdGFuY2VzIGFuZCBtYW5hZ2VzIHN1YnNjcmlwdGlvbnMgdG8gdGhlbS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB5b3VyIGNhdGVnb3J5IHdpdGhvdXQgaGF2aW5nIHRvIHJld3JpdGUgdGhlIGJhc2VcbiAgICAgKiBjb25zdHJ1Y3RvciBmcm9tIHNjcmF0Y2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemVDYXRlZ29yeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChuZXdPcGVyYXRvcjogT3BlcmF0b3I8YW55PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMuZm9yRWFjaChmYyA9PiB7XG4gICAgICAgICAgICAgICAgZmMuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW5ld09wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkIGlzIG5leHQtZWQgaW50byB0aGUgc3RyZWFtLiBNYXJrZWQgYXMgY29kZSBzbWVsbCBieSBzb25hciB3aGVuIGV4cGxpY2l0bHkgc3RhdGVkXG4gICAgICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMkLm5leHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdPcGVyYXRvci5udW1iZXJPZk9wZXJhbmRzID4gdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aCA8IG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmMgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlbmd0aCA9IHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZmMudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDYwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZXJhbmRWYWx1ZUNoYW5nZXMoY3VycmVudExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scy5wdXNoKGZjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzJC5uZXh0KHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLnNsaWNlKDAsIG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMpKTtcblxuICAgICAgICAgICAgaWYgKG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLm5leHQodGhpcy5nZW5lcmF0ZVByZWRpY2F0ZShbXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kIHRoYXQgaXMgKGJ5IGRlZmF1bHQpIGNhbGxlZCB3aGVuZXZlciBhbiBvcGVyYW5kIGBGb3JtQ29udHJvbGAgY2hhbmdlcyBpdHMgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3BlcmFuZEluZGV4IHRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZCB0aGF0IGNoYW5nZWQgaXRzIHZhbHVlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9wZXJhbmRWYWx1ZUNoYW5nZXMob3BlcmFuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlcmF0b3JTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlcmFuZEluZGV4ID49IHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5OyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc09wZXJhbmRWYWx1ZVNlbGVjdGVkKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzW2ldLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh0aGlzLmdlbmVyYXRlUHJlZGljYXRlKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLm1hcChmYyA9PiB0aGlzLnRyYW5zZm9ybUNhdGVnb3J5VmFsdWUoZmMudmFsdWUpKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBjYXRlZ29yeSBjbGFzcyBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiA1LjYuMCAtIENhdGVnb3J5IHNlcmlhbGlzYXRpb24gc2hvdWxkIGJlIGRvbmUgYnkgdXRpbGlzaW5nIHRoZSB7QGxpbmsgQ2F0ZWdvcnlSZXNvbHZlclNlcnZpY2V9IGluc3RlYWRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCBzZXJpYWxpemVDbGFzcygpOiBDYXRlZ29yaWVzIHwgc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2VyaWFsaXplcyBvbmx5IHRoZSBvcGVyYXRvci5cbiAgICAgKiBJZiB0aGUgY2F0ZWdvcnkgY29udGFpbnMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGV4dGVuZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGNhdGVnb3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1ldGFkYXRhQ29uZmlndXJhdGlvbigpOiBDYXRlZ29yeU1ldGFkYXRhQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbQ2F0ZWdvcnkuT1BFUkFUT1JfTUVUQURBVEFdOiB0aGlzLnNlbGVjdGVkT3BlcmF0b3Iuc2VyaWFsaXplKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhbGwgb3BlcmFuZCBmb3JtIGNvbnRyb2wgb2JqZWN0cyB1cCB0byB0aGUgY3VycmVudCBudW1iZXIgb2Ygb3BlcmFuZHMuXG4gICAgICogVG8gc2VyaWFsaXplIHZhbHVlIG9mIGVhY2ggb3BlcmFuZCB0aGUgW3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZSgpXXtAbGluayBDYXRlZ29yeSNzZXJpYWxpemVPcGVyYW5kVmFsdWV9IG1ldGhvZCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogSWYgdGhlIHZhbHVlcyB1c2VkIGJ5IHRoaXMgY2F0ZWdvcnkgYXJlIG5vdCBzZXJpYWxpemFibGUsIHRoZW4gZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYHNlcmlhbGl6ZU9wZXJhbmRWYWx1ZWAgbWV0aG9kLFxuICAgICAqIG11c3QgYmUgb3ZlcnJpZGRlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIGlucHV0IGJ5IHRoZSB1c2VyIGluIGEgc2VyaWFsaXphYmxlIGZvcm1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTWV0YWRhdGFWYWx1ZXMoKTogQXJyYXk8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkT3BlcmF0b3JBcml0eTsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9sc1tpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlRm9ybUNvbnRyb2wgRm9ybUNvbnRyb2wgb2JqZWN0IG9mIG9uZSBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kIGluIGEgc2VyaWFsaXplZCBmb3JtLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBGb3JtQ29udHJvbHMgYHZhbHVlYCBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh2YWx1ZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbCk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gdmFsdWVGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlZCB0aGUgc2F2ZWQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIFtjcmVhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb24oKV17QGxpbmsgQ2F0ZWdvcnkjY3JlYXRlTWV0YWRhdGFDb25maWd1cmF0aW9ufSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXN0b3JlcyBvbmx5IHRoZSBzYXZlZCBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIElmIHRoZSBDYXRlZ29yeSBvdmVycmlkZXMgdGhlIHNlcmlhbGl6YXRpb24gbWV0aG9kLCBpdCBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgc2VyaWFsaXplZCBjb25maWd1cmF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlLiBXaGVuIHRoZSBPYnNlcnZhYmxlIGVtaXRzIHRoZSBjYXRlZ29yeSBoYXMgZmluaXNoZWQgbG9hZGluZyBpdHMgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZENvbmZpZ3VyYXRpb25Gcm9tTWV0YWRhdGEoY29uZmlndXJhdGlvbjogQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb24pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yU2VydmljZS5nZXRGcm9tTWV0YWRhdGEoY29uZmlndXJhdGlvbltDYXRlZ29yeS5PUEVSQVRPUl9NRVRBREFUQV0gYXMgT3BlcmF0b3JzIHwgc3RyaW5nKTtcbiAgICAgICAgdGhpcy5zZWxlY3RPcGVyYXRvcih0aGlzLmFsbG93ZWRPcGVyYXRvcnMuZmluZEluZGV4KG9wID0+IG9wID09PSByZXNvbHZlZE9wZXJhdG9yKSk7XG4gICAgICAgIHJldHVybiBvZlZvaWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSBwcm92aWRlZCB2YWx1ZXMgaW50byB0aGlzIENhdGVnb3J5J3Mgb3BlcmFuZCBmb3JtIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogQW4gb3BlcmF0b3IgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QhIE90aGVyd2lzZSBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKlxuICAgICAqIElmIHRoZSBudW1iZXIgb2YgdmFsdWVzIGRvZXNuJ3QgbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSBzZWxlY3RlZCBvcGVyYXRvciBhbiBlcnJvciB3aWxsIGJlIHRocm93biFcbiAgICAgKlxuICAgICAqIElmIHRoaXMgQ2F0ZWdvcnkgb3ZlcnJpZGVzIHRoZSBbc2VyaWFsaXplT3BlcmFuZFZhbHVlKClde0BsaW5rIENhdGVnb3J5I3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZX0sIGl0IG11c3QgYWxzb1xuICAgICAqIG92ZXJyaWRlIGl0cyBkZXNlcmlhbGl6YXRpb24gY291bnRlcnBhcnQgLSBbZGVzZXJpYWxpemVPcGVyYW5kVmFsdWUoKV17QGxpbmsgI0NhdGVnb3J5I2Rlc2VyaWFsaXplT3BlcmFuZFZhbHVlfSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHNlcmlhbGl6ZWQgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGxvYWRlZCBpbnRvIHRoaXMgQ2F0ZWdvcnkgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUuIFdoZW4gdGhlIE9ic2VydmFibGUgZW1pdHMgdGhlIGNhdGVnb3J5IGhhcyBmaW5pc2hlZCBsb2FkaW5nIGl0cyB2YWx1ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRWYWx1ZXNGcm9tTWV0YWRhdGEodmFsdWVzOiBBcnJheTx1bmtub3duPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb3BlcmF0b3IgbXVzdCBiZSBzZWxlY3RlZCBiZWZvcmUgQ2F0ZWdvcnkgdmFsdWVzIGNhbiBiZSByZXNvbHZlZCBmcm9tIG1ldGFkYXRhIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3BlcmF0b3JBcml0eSAhPT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYXJpdHkgb2YgdGhlIHNlbGVjdGVkIG9wZXJhdG9yICgke3RoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5XG4gICAgICAgICAgICB9KSBkb2Vzbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgdGhlIHByb3ZpZGVkIHZhbHVlcyAoJHt2YWx1ZXMubGVuZ3RofSkhYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkVmFsdWVzT2JzZXJ2YWJsZXMgPSB2YWx1ZXMubWFwKHYgPT4gdGhpcy5kZXNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh2KSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcbiAgICAgICAgZm9ya0pvaW4oZGVzZXJpYWxpemVkVmFsdWVzT2JzZXJ2YWJsZXMpLnBpcGUoZGVmYXVsdElmRW1wdHkoW10pKS5zdWJzY3JpYmUoZGVzZXJpYWxpemVkVmFsdWVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0T3BlcmFuZHMoZGVzZXJpYWxpemVkVmFsdWVzKTtcbiAgICAgICAgICAgIHJlc3VsdCQubmV4dCgpO1xuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBzZXJpYWxpemVkIG91dHB1dCBvZiB0aGUgW3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZSgpXXtAbGluayBDYXRlZ29yeSNzZXJpYWxpemVPcGVyYW5kVmFsdWV9IG1ldGhvZFxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB0aGF0IGVtaXRzIHRoZSBkZXNlcmlhbGl6ZWQgdmFsdWUsIHRoYXQgY2FuIGJlIHNldCBhcyBGb3JtQ29udHJvbCB2YWx1ZSBhbmQgdGhlbiBjb21wbGV0ZXNcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG1heSB0aHJvdyBuYSBlcnJvciBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRlc2VyaWFsaXplZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVzZXJpYWxpemVPcGVyYW5kVmFsdWUodmFsdWU6IHVua25vd24pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gb2YodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGBGb3JtQ29udHJvbGAgb2JqZWN0IHRoYXQgd2Ugd2FudCB0byB0ZXN0XG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuZXdseSBzZWxlY3RlZCB2YWx1ZSBpcyBhIHZhbGlkIHZhbHVlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXNPcGVyYW5kVmFsdWVTZWxlY3RlZChuZXdWYWx1ZTogYW55KTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGBGb3JtQ29udHJvbGAgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgaW50byB0aGUgc2VsZWN0ZWQgYE9wZXJhdG9yYCBmb3IgcXVlcnkgZ2VuZXJhdGlvbi5cbiAgICAgKiBJdCBpcyBtb3N0bHkgdXNlZnVsIG9ubHkgZm9yIEF1dG9jb21wbGV0ZUNhdGVnb3JpZXMsIHdoZXJlIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGUgRm9ybUNvbnRyb2wgaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24gLSByZXR1cm5zIHRoZSBpbnB1dC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIEZvcm1Db250cm9sVmFsdWVcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgdXNlZCBmb3IgcXVlcnkgZ2VuZXJhdGlvblxuICAgICAqL1xuICAgIHByb3RlY3RlZCB0cmFuc2Zvcm1DYXRlZ29yeVZhbHVlKHZhbHVlOiBhbnkpOiBUIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGV4dCBzZWdtZW50cyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHByZWRpY2F0ZSBnZW5lcmF0ZWQgYnkgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGaWx0ZXJUZXh0U2VnbWVudHMoKTogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3ZpZGVzUHJlZGljYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtzZWdtZW50OiB0aGlzLnRyYW5zbGF0aW9uUGF0aCwgYm9sZDogdGhpcy5kaXNwbGF5Qm9sZH0sXG4gICAgICAgICAgICAuLi50aGlzLmNyZWF0ZUNvbmZpZ3VyYXRpb25GaWx0ZXJUZXh0U2VnbWVudHMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY3JlYXRlT3BlcmF0b3JGaWx0ZXJUZXh0U2VnbWVudHMoKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGV4dCBzZWdtZW50cyByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaW5wdXRzIG9mIHRoaXMgY2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlQ29uZmlndXJhdGlvbkZpbHRlclRleHRTZWdtZW50cygpOiBBcnJheTxGaWx0ZXJUZXh0U2VnbWVudD47XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBBcnJheSBjb250YWluaW5nIHRleHQgc2VnbWVudHMgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRvcnMgd2l0aCBvcGVyYW5kcyBvZiB0aGlzIGNhdGVnb3J5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU9wZXJhdG9yRmlsdGVyVGV4dFNlZ21lbnRzKCk6IEFycmF5PEZpbHRlclRleHRTZWdtZW50PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+ID0gW107XG4gICAgICAgIGxldCBvcGVyYW5kSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWxlY3RlZE9wZXJhdG9yLmdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSBPcGVyYXRvci5JTlBVVF9QTEFDRUhPTERFUikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlT3BlcmFuZEZpbHRlclRleHRTZWdtZW50KG9wZXJhbmRJbmRleCkpO1xuICAgICAgICAgICAgICAgIG9wZXJhbmRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7c2VnbWVudH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgZmlsdGVyIHRleHQgc2VnbWVudCByZXByZXNlbnRpbmcgdGhlIG9wZXJhbmQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVPcGVyYW5kRmlsdGVyVGV4dFNlZ21lbnQob3BlcmFuZEluZGV4OiBudW1iZXIpOiBGaWx0ZXJUZXh0U2VnbWVudCB7XG4gICAgICAgIGxldCBzZWdtZW50O1xuICAgICAgICBjb25zdCBvcGVyYW5kID0gdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHNbb3BlcmFuZEluZGV4XS52YWx1ZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTZWFyY2hJbnB1dFR5cGUuQVVUT0NPTVBMRVRFOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLnRleHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNlYXJjaElucHV0VHlwZS5EQVRFOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLmZvcm1hdChEQVRFX0ZPUk1BVF9TVFJJTkcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTZWFyY2hJbnB1dFR5cGUuREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLmZvcm1hdChEQVRFX1RJTUVfRk9STUFUX1NUUklORyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7c2VnbWVudCwgYm9sZDogdHJ1ZX07XG4gICAgfVxufVxuIl19
|
|
593
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL21vZGVscy9jYXRlZ29yeS9jYXRlZ29yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRzlDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLGFBQWEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUsxRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFaEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFHekY7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSDtJQTZDSTs7Ozs7Ozs7OztPQVVHO0lBQ0gsa0JBQXlDLGdCQUErQixFQUMvQixpQkFBdUMsRUFDMUMsZUFBdUIsRUFDcEIsVUFBMkIsRUFDcEMsSUFBbUIsRUFDbkIsZ0JBQWlDO1FBTGpFLGlCQStDQztRQS9Dd0MscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFlO1FBQy9CLHNCQUFpQixHQUFqQixpQkFB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QUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUEvbkJEOztPQUVHO0lBQ3VCLDBCQUFpQixHQUFHLFVBQVUsQ0FBQztJQTZuQjdELGVBQUM7Q0FBQSxBQWxvQkQsSUFrb0JDO1NBbG9CcUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3BlcmF0b3J9IGZyb20gJy4uL29wZXJhdG9yL29wZXJhdG9yJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL3F1ZXJ5L3F1ZXJ5JztcbmltcG9ydCB7RWxlbWVudGFyeVByZWRpY2F0ZX0gZnJvbSAnLi4vcHJlZGljYXRlL2VsZW1lbnRhcnktcHJlZGljYXRlJztcbmltcG9ydCB7U2VhcmNoSW5wdXRUeXBlfSBmcm9tICcuL3NlYXJjaC1pbnB1dC10eXBlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRlZmF1bHRJZkVtcHR5LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7T3BlcmF0b3JUZW1wbGF0ZVBhcnR9IGZyb20gJy4uL29wZXJhdG9yLXRlbXBsYXRlLXBhcnQnO1xuaW1wb3J0IHtJbmNyZW1lbnRpbmdDb3VudGVyfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L2luY3JlbWVudGluZy1jb3VudGVyJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbklucHV0fSBmcm9tICcuLi9jb25maWd1cmF0aW9uLWlucHV0JztcbmltcG9ydCB7Q2F0ZWdvcnlHZW5lcmF0b3JNZXRhZGF0YSwgQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb259IGZyb20gJy4uL3BlcnNpc3RhbmNlL2dlbmVyYXRvci1tZXRhZGF0YSc7XG5pbXBvcnQge0NhdGVnb3JpZXN9IGZyb20gJy4vY2F0ZWdvcmllcyc7XG5pbXBvcnQge09wZXJhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vb3BlcmF0b3Itc2VydmljZS9vcGVyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7T3BlcmF0b3JzfSBmcm9tICcuLi9vcGVyYXRvci9vcGVyYXRvcnMnO1xuaW1wb3J0IHtvZlZvaWR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvb2Ytdm9pZCc7XG5pbXBvcnQge0ZpbHRlclRleHRTZWdtZW50fSBmcm9tICcuLi9wZXJzaXN0YW5jZS9maWx0ZXItdGV4dC1zZWdtZW50JztcbmltcG9ydCB7REFURV9GT1JNQVRfU1RSSU5HLCBEQVRFX1RJTUVfRk9STUFUX1NUUklOR30gZnJvbSAnLi4vLi4vLi4vbW9tZW50L3RpbWUtZm9ybWF0cyc7XG5pbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRoZSB0b3AgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaW4gc2VhcmNoIHF1ZXJ5IGdlbmVyYXRpb24uIFJlcHJlc2VudHMgYSBzZXQgb2YgaW5kZXhlZCBmaWVsZHMgdGhhdCBjYW4gYmUgc2VhcmNoZWQuXG4gKiBFbmNhcHN1bGF0ZXMgdGhlIHRoZSBzdGF0ZSBhbmQgbG9naWMgb2YgdGhlIHF1ZXJ5IGNvbnN0cnVjdGlvbiBwcm9jZXNzLlxuICpcbiAqIEFzIG9wcG9zZWQgdG8ge0BsaW5rIE9wZXJhdG9yfXMgQ2F0ZWdvcmllcyBhcmUgbm90IHN0YXRlbGVzcyBhbmQgc2hvdWxkbid0IGJlIHNoYXJlZC5cbiAqIEEgc2luZ2xlIENhdGVnb3J5IGluc3RhbmNlIGlzIGNhcGFibGUgb2YgaG9sZGluZyB0aGUgc3RhdGUgb2Ygb25lIHtAbGluayBFZGl0YWJsZVByZWRpY2F0ZX0sXG4gKiBvciBjYW4gYmUgdXNlZCBhcyBhIGJ1aWxkZXIgdG8gZm9ybSBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIFtFbGVtZW50YXJ5UHJlZGljYXRlc117QGxpbmsgRWxlbWVudGFyeVByZWRpY2F0ZX0uXG4gKlxuICogWW91IGNhbiB1c2Uge0BsaW5rIENhdGVnb3J5RmFjdG9yeX0gdG8gZ2V0IGluc3RhbmNlcyBvZiBDYXRlZ29yeSBjbGFzc2VzLlxuICogQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSB0aGUgW2Nsb25lKClde0BMaW5rIENhdGVnb3J5I2Nsb25lfSBtZXRob2QgdG8gZHVwbGljYXRlIGFuIGV4aXN0aW5nIGluc3RhbmNlLlxuICpcbiAqIElmIHlvdSB3YW50IHRvIG1ha2UgeW91ciBvd24gQ2F0ZWdvcnkgY2xhc3MgeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbnN0cnVjdG9yIHRha2VzIHtAbGluayBPcGVyYXRvclNlcnZpY2V9IGFzIGl0J3MgZmlyc3RcbiAqIGFyZ3VtZW50IGFuZCB7QGxpbmsgTG9nZ2VyU2VydmljZX0gYXMgaXQncyBzZWNvbmQgYXJndW1lbnQuIEFsdGVybmF0aXZlbHkgeW91IGNhbiBtYWtlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZVxuICoge0BsaW5rIENhdGVnb3J5RmFjdG9yeX0gc28sIHRoYXQgeW91ciBzdHlsZSBvZiBjb25zdHJ1Y3RvcnMgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCB0eXBlIG9mIG9iamVjdHMgdGhlIGNhdGVnb3J5IGV4cGVjdHMgdG8gZ2VuZXJhdGUgcXVlcmllcyBmcm9tXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYXRlZ29yeTxUPiB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUge0BsaW5rIENhdGVnb3J5TWV0YWRhdGFDb25maWd1cmF0aW9ufSBrZXkgZm9yIHRoaXMgQ2F0ZWdvcnkncyB7QGxpbmsgT3BlcmF0b3J9XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBPUEVSQVRPUl9NRVRBREFUQSA9ICdvcGVyYXRvcic7XG5cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgYEZvcm1Db250cm9sYCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGRyaXZlIHRoZSBvcGVyYXRvciBzZWxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgY2F0ZWdvcnkgY2FuIHN1YnNjcmliZSB0byBpdCBpZiBpdCB3aXNoZXMgdG8gcmVhY3QgdG8gdGhlIHNlbGVjdGlvbiBjaGFuZ2UgYnkgdGhlIHVzZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYXRvckZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcblxuICAgIC8qKlxuICAgICAqIFN0b3JlcyB0aGUgYEZvcm1Db250cm9sYCBvYmplY3RzIHRoYXQgYXJlIHB1c2hlZCBpbnRvIHRoZSBvYnNlcnZhYmxlIHdoZW4gdGhlIG51bWJlciBvZiBvcGVyYW5kcyBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfb3BlcmFuZHNGb3JtQ29udHJvbHM6IEFycmF5PEZvcm1Db250cm9sPjtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBgRm9ybUNvbnRyb2xgIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnB1dCBzZWFyY2ggYXJndW1lbnRzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfb3BlcmFuZHNGb3JtQ29udHJvbHMkOiBSZXBsYXlTdWJqZWN0PEFycmF5PEZvcm1Db250cm9sPiB8IHVuZGVmaW5lZD47XG5cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgb3BlcmF0b3IgdGVtcGxhdGUgcGFydHMgdGhhdCBtYWtlIHVwIHRoZSBvcGVyYW5kcyBHVUkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYXRvclRlbXBsYXRlJDogQmVoYXZpb3JTdWJqZWN0PEFycmF5PE9wZXJhdG9yVGVtcGxhdGVQYXJ0PiB8IHVuZGVmaW5lZD47XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgSURzIGZvciB0ZW1wbGF0ZSBwYXJ0cyBzdXBwbGllZCB0byBuZyBmb3IuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF90cmFja0J5SWRHZW5lcmF0b3I6IEluY3JlbWVudGluZ0NvdW50ZXI7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IGEgbmV3IGBQcmVkaWNhdGVgIGlmIHRoZSBgQ2F0ZWdvcnlgIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4gYmUgY3JlYXRlZC5cbiAgICAgKiBFbWl0cyBgdW5kZWZpbmVkYCBpZiB0aGUgYENhdGVnb3J5YCBpcyBub3QgaW4gc3VjaCBzdGF0ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2dlbmVyYXRlZFByZWRpY2F0ZSQ6IEJlaGF2aW9yU3ViamVjdDxFbGVtZW50YXJ5UHJlZGljYXRlIHwgdW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIFV0aWxpdHkgdmFyaWFibGUgdGhhdCBjYW4gYmUgdXNlZCBhcyB2YWx1ZSBmb3IgdGhlIFtjb25maWd1cmF0aW9uSW5wdXRzJF17QGxpbmsgQ2F0ZWdvcnkjY29uZmlndXJhdGlvbklucHV0cyR9IGBPYnNlcnZhYmxlYC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX09QRVJBVE9SX0lOUFVUOiBDb25maWd1cmF0aW9uSW5wdXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgZmlsbHMgdGhlIHZhbHVlcyBvZiBhbGwgcHJvdGVjdGVkIGZpZWxkcyBhbmQgdGhlbiBjYWxscyB0aGUgW2luaXRpYWxpemVDYXRlZ29yeSgpXXtAbGluayBDYXRlZ29yeSNpbml0aWFsaXplQ2F0ZWdvcnl9XG4gICAgICogbWV0aG9kLiBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgY2F0ZWdvcnkgY3JlYXRpb24gYmVoYXZpb3Igb3ZlcnJpZGUgdGhhdCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX2VsYXN0aWNLZXl3b3JkcyBFbGFzdGljc2VhcmNoIGtleXdvcmRzIHRoYXQgc2hvdWxkIGJlIHF1ZXJpZWQgYnkgcXVlcmllcyBnZW5lcmF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5XG4gICAgICogQHBhcmFtIF9hbGxvd2VkT3BlcmF0b3JzIE9wZXJhdG9ycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlZCBxdWVyaWVzIG9uIHRoZSBhYm92ZSBrZXl3b3Jkc1xuICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvblBhdGggcGF0aCB0byB0aGUgdHJhbnNsYXRpb24gc3RyaW5nXG4gICAgICogQHBhcmFtIF9pbnB1dFR5cGUgaW5wdXQgZmllbGQgdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGVudGVyIG9wZXJhdG9yIGFyZ3VtZW50cyBmb3IgdGhpcyBjYXRlZ29yeVxuICAgICAqIEBwYXJhbSBfbG9nIHVzZWQgdG8gcmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IGluY29ycmVjdCB1c2Ugb2YgdGhpcyBjbGFzc1xuICAgICAqIEBwYXJhbSBfb3BlcmF0b3JTZXJ2aWNlIHVzZWQgdG8gcmVzb2x2ZSBzZXJpYWxpemVkIG9wZXJhdG9ycyBkdXJpbmcgZGVzZXJpYWxpemF0aW9uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBfZWxhc3RpY0tleXdvcmRzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2FsbG93ZWRPcGVyYXRvcnM6IEFycmF5PE9wZXJhdG9yPGFueT4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdHJhbnNsYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBfaW5wdXRUeXBlOiBTZWFyY2hJbnB1dFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX29wZXJhdG9yU2VydmljZTogT3BlcmF0b3JTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX09QRVJBVE9SX0lOUFVUID0gbmV3IENvbmZpZ3VyYXRpb25JbnB1dChcbiAgICAgICAgICAgIFNlYXJjaElucHV0VHlwZS5PUEVSQVRPUixcbiAgICAgICAgICAgICdzZWFyY2gub3BlcmF0b3IubmFtZScsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBBcnJheTx1bmtub3duPj4oKSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZ3VyYXRpb25JbnB1dCBvZiB0eXBlIE9QRVJBVE9SIGlzIGEgcGxhY2Vob2xkZXIhJ1xuICAgICAgICAgICAgICAgICAgICArICcgVXNlIG9wZXJhdG9yIHJlbGF0ZWQgbWV0aG9kcyBmcm9tIHRoZSBDYXRlZ29yeSBjbGFzcyBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX29wZXJhdG9yRm9ybUNvbnRyb2wgPSB0aGlzLl9PUEVSQVRPUl9JTlBVVC5mb3JtQ29udHJvbDtcbiAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMkID0gbmV3IFJlcGxheVN1YmplY3Q8QXJyYXk8Rm9ybUNvbnRyb2w+IHwgdW5kZWZpbmVkPigxKTtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JUZW1wbGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PE9wZXJhdG9yVGVtcGxhdGVQYXJ0PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMgPSBbXTtcbiAgICAgICAgdGhpcy5fdHJhY2tCeUlkR2VuZXJhdG9yID0gbmV3IEluY3JlbWVudGluZ0NvdW50ZXIoKTtcbiAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoKTtcblxuICAgICAgICB0aGlzLm9wZXJhbmRzRm9ybUNvbnRyb2xzJC5waXBlKFxuICAgICAgICAgICAgbWFwKGZvcm1Db250cm9scyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3JtQ29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHRoaXMuc2VsZWN0ZWRPcGVyYXRvci5nZXRPcGVyYXRvck5hbWVUZW1wbGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZjcyA9IFsuLi5mb3JtQ29udHJvbHNdO1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgT3BlcmF0b3JUZW1wbGF0ZVBhcnQocGFydCA/IHBhcnQgOiBmY3Muc2hpZnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrQnlJZEdlbmVyYXRvci5uZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID8gdW5kZWZpbmVkIDogZmlyc3QpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKS5zdWJzY3JpYmUodGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb3BlcmF0b3JUZW1wbGF0ZSQubmV4dCh0ZW1wbGF0ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFucyB1cCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG9iamVjdCBiZWZvcmUgaXRzIGRlc3RydWN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGRldmVsb3BlciBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYXQgYW4gYXBwcm9wcmlhdGUgbW9tZW50LCBhcyB0aGlzIG9iamVjdCBjYW5ub3QgaG9vayBpbnRvIHRoZSBBbmd1bGFyIGxpZmVjeWNsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX29wZXJhdG9yVGVtcGxhdGUkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGlucHV0IHJlcHJlc2VudCB0aGUgc3RlcHMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSB0aGUgY2F0ZWdvcnkuXG4gICAgICogVGhlIGxhc3QgaW5wdXQgbXVzdCBhbHdheXMgYmUgb2YgdHlwZSBbT1BFUkFUT1Jde0BsaW5rIFNlYXJjaElucHV0VHlwZSNPUEVSQVRPUn0uXG4gICAgICogU2VsZWN0aW5nIHRoZSBvcGVyYXRvciBjb21wbGV0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNhdGVnb3J5IGFuZCB0aGUgYXJndW1lbnRzIGlucHV0c1xuICAgICAqIChiYXNlZCBvbiBjYXRlZ29yeSBpbnB1dCB0eXBlIGFuZCBvcGVyYXRvciBhcml0eSkgYXJlIGRpc3BsYXllZC5cbiAgICAgKlxuICAgICAqIEJld2FyZSB0aGF0IHdoaWxlIG1vc3QgY2F0ZWdvcmllcyBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGNvbnN0YW50IGl0IG11c3Qgbm90IGFsd2F5cyBiZSB0aGUgY2FzZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRoZSByZXF1aXJlZCBpbnB1dCB0eXBlIGZvciBjb25maWd1cmF0aW9uIHN0ZXBzIG9mIHRoaXMgY2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGNvbmZpZ3VyYXRpb25JbnB1dHMkKCk6IE9ic2VydmFibGU8QXJyYXk8Q29uZmlndXJhdGlvbklucHV0Pj47XG5cbiAgICAvKipcbiAgICAgKiBJZiB5b3UgdXNlIHRoZSBgQ2F0ZWdvcnlgIGNsYXNzIGFzIGEgc29ydCBvZiBQcmVkaWNhdGVCdWlsZGVyLCB0aGVuIHlvdSB3YW50IHRvIHVzZSB0aGVcbiAgICAgKiBbZ2VuZXJhdGVQcmVkaWNhdGUoKV17QGxpbmsgQ2F0ZWdvcnkjZ2VuZXJhdGVQcmVkaWNhdGV9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogVGhpcyBzdHJlYW0gcHVibGlzaGVzIGVpdGhlciBhIG5ldyBgUHJlZGljYXRlYCBvYmplY3Qgb3IgYHVuZGVmaW5lZGAgYmFzZWQgb24gY2hhbmdlcyB0byB0aGUgYEZvcm1Db250cm9sc2AgdGhhdCBhcmVcbiAgICAgKiBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuIElmIChiYXNlZCBvbiB1c2VyIGlucHV0KSB0aGUgYENhdGVnb3J5YCByZWFjaGVzIGEgc3RhdGUgd2hlbiBjb25zdHJ1Y3Rpb24gb2YgYSBgUHJlZGljYXRlYCBpcyBwb3NzaWJsZVxuICAgICAqIGl0IHdpbGwgZW1pdCB0aGlzIGBQcmVkaWNhdGVgLiBJZiBpdCByZWFjaGVzIGEgc3RhdGUgd2hlbiB0aGUgYFByZWRpY2F0ZWAgY2FuIG5vdCBsb25nZXIgYmUgY3JlYXRlZCBgdW5kZWZpbmVkYCBpcyBlbWl0dGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ2VuZXJhdGVkUHJlZGljYXRlJCgpOiBPYnNlcnZhYmxlPEVsZW1lbnRhcnlQcmVkaWNhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFByZWRpY2F0ZX0gY3VycmVudGx5IGdlbmVyYXRlZCBieSB0aGUgQ2F0ZWdvcnkuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgW2dlbmVyYXRlZFByZWRpY2F0ZSRde0BsaW5rIENhdGVnb3J5I2dlbmVyYXRlZFByZWRpY2F0ZSR9LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ2VuZXJhdGVkUHJlZGljYXRlKCk6IEVsZW1lbnRhcnlQcmVkaWNhdGUgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJld2FyZSB0aGF0IHdoaWxlIG1vc3QgY2F0ZWdvcmllcyBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGNvbnN0YW50IGl0IGlzIG5vdCBhIHJlcXVpcmVtZW50LlxuICAgICAqIEFuIGV4YW1wbGUgZm9yIHN1Y2ggYmVoYXZpb3IgaXMgdGhlIHtAbGluayBDYXNlRGF0YXNldH0gY2F0ZWdvcnksIHdoZXJlIHRoZSBhcmd1bWVudCBpbnB1dCB0eXBlIGRlcGVuZHNcbiAgICAgKiBvbiB0aGUgc2VsZWN0ZWQgZGF0YSBmaWVsZCB0eXBlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdGhlIHJlcXVpcmVkIGlucHV0IHR5cGUgZm9yIGFyZ3VtZW50cyBmb3IgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IFNlYXJjaElucHV0VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIHNldCBvZiBPcGVyYXRvcnMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoaXMgY2F0ZWdvcnkuIEl0ZXJhdGlvbiBvcmRlciBkZXRlcm1pbmVzIHRoZSBkaXNwbGF5IG9yZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWxsb3dlZE9wZXJhdG9ycygpOiBBcnJheTxPcGVyYXRvcjxhbnk+PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLl9hbGxvd2VkT3BlcmF0b3JzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wZXJhdG9yIG9yIGB1bmRlZmluZWRgIGlmIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRPcGVyYXRvcigpOiBPcGVyYXRvcjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhdG9yRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgYEZvcm1Db250cm9sYCBvYmplY3RzIHRoYXQgY29udGFpbnMgYXMgbWFueSBjb250cm9scyBhcyBpcyB0aGUgYXJpdHkgb2YgdGhlIHNlbGVjdGVkIG9wZXJhdG9yLlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgd2lsbCByZXR1cm4gdGhlIHNhbWUgYEZvcm1Db250cm9sYCBpbnN0YW5jZXMuXG4gICAgICogV2hlbiBubyBvcGVyYXRvciBpcyBzZWxlY3RlZCBgdW5kZWZpbmVkYCBpcyBlbWl0dGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3BlcmFuZHNGb3JtQ29udHJvbHMkKCk6IE9ic2VydmFibGU8QXJyYXk8Rm9ybUNvbnRyb2w+IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBuZXcgdmFsdWUgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgc2VsZWN0ZWQgb3BlcmF0b3IgY2hhbmdlcy4gYHVuZGVmaW5lZGAgaXMgZW1pdHRlZCBpZiBubyBvcGVyYXRvciBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFtvcGVyYXRvcnMgdGVtcGxhdGVde0BsaW5rIE9wZXJhdG9yI2dldE9wZXJhdG9yTmFtZVRlbXBsYXRlfSBpbiBwcm9jZXNzZWQgZm9ybSBmaXQgZm9yIEdVSSByZW5kZXJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG9wZXJhdG9yVGVtcGxhdGUkKCk6IE9ic2VydmFibGU8QXJyYXk8T3BlcmF0b3JUZW1wbGF0ZVBhcnQ+IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcGVyYXRvclRlbXBsYXRlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBjYXRlZ29yeSBpcyBmdWxseSBjb25maWd1cmVkIGFuZCByZXByZXNlbnRzIGEgdmFsaWQgcHJlZGljYXRlIG9yIG5vdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJvdmlkZXNQcmVkaWNhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgc2V0IG9mIEVsYXN0aWNzZWFyY2gga2V5d29yZHMgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBieSBxdWVyaWVzIGdlbmVyYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogVGhlIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB0aGUga2V5d29yZHMgYXJlIG5vdCBzdGF0aWMgYW5kIGNoYW5nZSBiYXNlZCBvbiBzb21lIGFkZGl0aW9uYWwgc2VsZWN0aW9uIChlZy4gRGF0YSBmaWVsZHMpXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBlbGFzdGljS2V5d29yZHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLl9lbGFzdGljS2V5d29yZHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBhcml0eSBvZiB0aGUgc2VsZWN0ZWQgb3BlcmF0b3IuIFRocm93cyBhbiBlcnJvciBpZiBubyBvcGVyYXRvciBpcyBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHNlbGVjdGVkT3BlcmF0b3JBcml0eSgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb3BlcmF0b3IgbXVzIGJlIHNlbGVjdGVkIGJlZm9yZSBpdHMgYXJpdHkgY2FuIGJlIHJlc29sdmVkIScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3BlcmF0b3IubnVtYmVyT2ZPcGVyYW5kcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgQ2F0ZWdvcnkuIENhdGVnb3J5IGNhbiBjcmVhdGUgcXVlcmllcyB3aGVuIGFuIHtAbGluayBPcGVyYXRvcn0gaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBDYXRlZ29yeSBjbGFzcyBhcyBwcmVkaWNhdGUgYnVpbGRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVyYXRvckluZGV4IGluZGV4IGluIHRoZSBbYWxsb3dlZE9wZXJhdG9yc117QGxpbmsgQ2F0ZWdvcnkjYWxsb3dlZE9wZXJhdG9yc30gYXJyYXkgb2YgdGhlIHtAbGluayBPcGVyYXRvcn0gdGhhdFxuICAgICAqIHNob3VsZCBiZSBzZWxlY3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RPcGVyYXRvcihvcGVyYXRvckluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0gdGhpcy5hbGxvd2VkT3BlcmF0b3JzO1xuICAgICAgICBpZiAob3BlcmF0b3JJbmRleCA8IDAgfHwgb3BlcmF0b3JJbmRleCA+PSBvcGVyYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cud2FybihgVGhlIHByb3ZpZGVkICdvcGVyYXRvckluZGV4JyBpcyBvdXQgb2YgcmFuZ2UuYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC5zZXRWYWx1ZShvcGVyYXRvcnNbb3BlcmF0b3JJbmRleF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBDYXRlZ29yeSBhbmQgZ2VuZXJhdGVzIGEgcXVlcnkgaWYgYWxsIG5lY2Vzc2FyeSBvcGVyYW5kcyB3ZXJlIHNldC5cbiAgICAgKlxuICAgICAqIElmIHlvdSBhcmUgdXNpbmcgdGhlIGNhdGVnb3J5IGFzIGEgYnVpbGRlci4gQ29uc2lkZXIgdXNpbmcgdGhlIFtnZW5lcmF0ZVByZWRpY2F0ZSgpXXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVByZWRpY2F0ZX1cbiAgICAgKiBtZXRob2QgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1c2VySW5wdXQgdmFsdWVzIGVudGVyZWQgYnkgdGhlIHVzZXIuIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHNob3VsZCBtYXRjaCB0aGVcbiAgICAgKiBbYXJpdHlde0BsaW5rIE9wZXJhdG9yI19udW1iZXJPZk9wZXJhbmRzfSBvZiB0aGUgc2VsZWN0ZWQgT3BlcmF0b3IuXG4gICAgICovXG4gICAgcHVibGljIHNldE9wZXJhbmRzKHVzZXJJbnB1dDogQXJyYXk8VD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBNYXRoLm1pbih1c2VySW5wdXQubGVuZ3RoLCB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scy5sZW5ndGgpO1xuICAgICAgICBpZiAocmFuZ2UgPCB1c2VySW5wdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cud2FybihgJHt1c2VySW5wdXQubGVuZ3RofSBvcGVyYW5kcyBhcmUgYmVpbmcgc2V0LCBidXQgb25seSAke3JhbmdlfSBpbnB1dHMgYXJlIGF2YWlsYWJsZSFgXG4gICAgICAgICAgICAgICAgKyAnIEV4dHJhIG9wZXJhbmRzIHdpbGwgYmUgaWdub3JlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzW2ldLnNldFZhbHVlKHVzZXJJbnB1dFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wZXJhbmRWYWx1ZUNoYW5nZXMocmFuZ2UgLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhlIENhdGVnb3J5LCBkZXNlbGVjdGluZyBhbnkgc2VsZWN0ZWQgY2F0ZWdvcnkgYW5kIHJlbW92aW5nIG90aGVyIHN0YXRlXG4gICAgICogaW5mb3JtYXRpb24gaWYgdGhlIENhdGVnb3J5IGRlZmluZXMgdGhlbS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgY2F0ZWdvcnkgYWZ0ZXIgZWFjaCBwcmVkaWNhdGUgY29uc3RydWN0ZWQsXG4gICAgICogZWZmZWN0aXZlbHkgdHVybmluZyB0aGUgY2F0ZWdvcnkgaW5zdGFuY2UgaW50byBhIHByZWRpY2F0ZSBidWlsZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhck9wZXJhdG9yU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmZvckVhY2goZmMgPT4ge1xuICAgICAgICAgICAgZmMuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIFtjcmVhdGVRdWVyeV17QGxpbmsgT3BlcmF0b3IjY3JlYXRlUXVlcnl9IG1ldGhvZCBvbiB0aGUgc2VsZWN0ZWQgT3BlcmF0b3IuXG4gICAgICpcbiAgICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgbm8gT3BlcmF0b3IgaXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgcXVlcnkgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiBzb21lIG90aGVyIHdheS5cbiAgICAgKiBAcGFyYW0gdXNlcklucHV0IHZhbHVlcyBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBzaG91bGQgbWF0Y2ggdGhlXG4gICAgICogW2FyaXR5XXtAbGluayBPcGVyYXRvciNfbnVtYmVyT2ZPcGVyYW5kc30gb2YgdGhlIHNlbGVjdGVkIE9wZXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHRoZSBRdWVyeSBnZW5lcmF0ZWQgYnkgdGhlIHNlbGVjdGVkIE9wZXJhdG9yXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlUXVlcnkodXNlcklucHV0OiBBcnJheTxUPik6IFF1ZXJ5IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlcmF0b3JTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhdGVnb3J5IGNhbm5vdCBnZW5lcmF0ZSBhIFF1ZXJ5IGlmIG5vIE9wZXJhdG9yIGlzIHNlbGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhdG9yRm9ybUNvbnRyb2wudmFsdWUuY3JlYXRlUXVlcnkodGhpcy5lbGFzdGljS2V5d29yZHMsIHVzZXJJbnB1dCBhcyB1bmtub3duIGFzIEFycmF5PHN0cmluZz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBbZ2VuZXJhdGVRdWVyeV17QGxpbmsgQ2F0ZWdvcnkjZ2VuZXJhdGVRdWVyeX0gbWV0aG9kIGFuZCBjcmVhdGVzIGFuIHtAbGluayBFbGVtZW50YXJ5UHJlZGljYXRlfSB3aXRoIHRoZSByZXN1bHQuXG4gICAgICogQHBhcmFtIHVzZXJJbnB1dCB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlci4gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZVxuICAgICAqIFthcml0eV17QGxpbmsgT3BlcmF0b3IjX251bWJlck9mT3BlcmFuZHN9IG9mIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKiBAcmV0dXJucyBQcmVkaWNhdGUgd2l0aCB7QGxpbmsgUXVlcnl9IGdlbmVyYXRlZCBieSB0aGlzIG9iamVjdCdzIFtnZW5lcmF0ZVF1ZXJ5XXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVF1ZXJ5fSBtZXRob2RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVQcmVkaWNhdGUodXNlcklucHV0OiBBcnJheTxUPik6IEVsZW1lbnRhcnlQcmVkaWNhdGUge1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRhcnlQcmVkaWNhdGUodGhpcy5nZW5lcmF0ZVF1ZXJ5KHVzZXJJbnB1dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgdGhlIGRlZmF1bHQgb3BlcmF0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgZ2VuZXJhdGlvbiwgd2hlbiBubyBPcGVyYXRvciBzZWxlY3Rpb24gaXMgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZWxlY3RzIHRoZSBmaXJzdCBvcGVyYXRvciBpbiB0aGUgW19hbGxvd2VkT3BlcmF0b3JzXXtAbGluayBDYXRlZ29yeSNhbGxvd2VkT3BlcmF0b3JzfSBhcnJheS5cbiAgICAgKlxuICAgICAqIFNlZSBbc2VsZWN0T3BlcmF0b3IoKV17QGxpbmsgQ2F0ZWdvcnkjc2VsZWN0T3BlcmF0b3J9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3REZWZhdWx0T3BlcmF0b3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0T3BlcmF0b3IoMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHN0cmluZyBwYXRoIGZvciB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGlucHV0IHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldCBpbnB1dFBsYWNlaG9sZGVyKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGNhdGVnb3J5IHRleHQgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGggYm9sZCB0ZXh0IHdoZW4gc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGRpc3BsYXlCb2xkKCk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGFuIG9wZXJhdG9yIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBvciBub3QuXG4gICAgICovXG4gICAgcHVibGljIGlzT3BlcmF0b3JTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcGVyYXRvciAoaWYgYW55KVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhck9wZXJhdG9yU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCBjYXRlZ29yeSBvYmplY3QuIE5vdGUgdGhhdCBhIGR1cGxpY2F0ZSBpcyBOT1QgYSBjbG9uZS5cbiAgICAgKiBUaGUgc3RhdGUgb2YgdGhlIHJldHVybmVkIGNhdGVnb3J5IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgc3RhdGUgb2YgdGhpcyBjYXRlZ29yeS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgY2F0ZWdvcnkgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIGNhdGVnb3J5IGluIGl0cyBpbml0aWFsIHN0YXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBkdXBsaWNhdGUoKTogQ2F0ZWdvcnk8VD47XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgc2VyaWFsaXNhdGlvbiBvZiB0aGlzIGNhdGVnb3J5J3Mgc3RhdGUuXG4gICAgICpcbiAgICAgKiBOb3QgZXZlcnkgc3RhdGUgbXVzdCBiZSBwcmVzZXJ2YWJsZS4gVGhlIGRlZmF1bHQgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBwcmVzZXJ2YXRpb24gb2YgdGhlIGZpbmFsIHN0YXRlIHdoZW4gdGhlXG4gICAgICogQ2F0ZWdvcnkgaXMgZ2VuZXJhdGluZyBhIHByZWRpY2F0ZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlY29uc3RydWN0aW9uIG9mIHRoaXMgY2F0ZWdvcnkncyBzdGF0ZSxcbiAgICAgKiBiYXJyaW5nIGluZm9ybWF0aW9uIGFib3V0IGFsbG93ZWQgbmV0cy4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgY2F0ZWdvcnkgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBnZW5lcmF0ZXMgYSBwcmVkaWNhdGUuXG4gICAgICogU2VlIFtwcm92aWRlc1ByZWRpY2F0ZSgpXXtAbGluayBDYXRlZ29yeSNwcm92aWRlc1ByZWRpY2F0ZX0uXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU1ldGFkYXRhKCk6IENhdGVnb3J5R2VuZXJhdG9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXNQcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLnNlcmlhbGl6ZUNsYXNzKCksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNyZWF0ZU1ldGFkYXRhQ29uZmlndXJhdGlvbigpLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmNyZWF0ZU1ldGFkYXRhVmFsdWVzKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgc2F2ZWQgc3RhdGUgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgbWV0YWRhdGEgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBbY3JlYXRlTWV0YWRhdGEoKV17QGxpbmsgQ2F0ZWdvcnkjY3JlYXRlTWV0YWRhdGF9IG1ldGhvZFxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZS4gV2hlbiB0aGUgT2JzZXJ2YWJsZSBlbWl0cyB0aGUgY2F0ZWdvcnkgaGFzIGZpbmlzaGVkIHJlc3RvcmluZyBpdHMgc3RhdGUuXG4gICAgICovXG4gICAgcHVibGljIGxvYWRGcm9tTWV0YWRhdGEobWV0YWRhdGE6IENhdGVnb3J5R2VuZXJhdG9yTWV0YWRhdGEpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICB0aGlzLmxvYWRDb25maWd1cmF0aW9uRnJvbU1ldGFkYXRhKG1ldGFkYXRhLmNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRWYWx1ZXNGcm9tTWV0YWRhdGEobWV0YWRhdGEudmFsdWVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGUgaW4gdGhlIGNvbnN0cnVjdG9yLiBBcGFydCBmcm9tIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBjb25zdHJ1Y3RvciBvbmx5IGNyZWF0ZXMgaW5zdGFuY2VzIHRvIGZpbGwgdGhlIHByb3RlY3RlZFxuICAgICAqIGZpZWxkcyBvZiB0aGlzIGNsYXNzLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbWFuYWdlcyBjcmVhdGlvbiBvZiBvcGVyYW5kIGBGb3JtQ29udHJvbGAgaW5zdGFuY2VzIGFuZCBtYW5hZ2VzIHN1YnNjcmlwdGlvbnMgdG8gdGhlbS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB5b3VyIGNhdGVnb3J5IHdpdGhvdXQgaGF2aW5nIHRvIHJld3JpdGUgdGhlIGJhc2VcbiAgICAgKiBjb25zdHJ1Y3RvciBmcm9tIHNjcmF0Y2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemVDYXRlZ29yeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChuZXdPcGVyYXRvcjogT3BlcmF0b3I8YW55PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMuZm9yRWFjaChmYyA9PiB7XG4gICAgICAgICAgICAgICAgZmMuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW5ld09wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkIGlzIG5leHQtZWQgaW50byB0aGUgc3RyZWFtLiBNYXJrZWQgYXMgY29kZSBzbWVsbCBieSBzb25hciB3aGVuIGV4cGxpY2l0bHkgc3RhdGVkXG4gICAgICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMkLm5leHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdPcGVyYXRvci5udW1iZXJPZk9wZXJhbmRzID4gdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aCA8IG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmMgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlbmd0aCA9IHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZmMudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDYwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZXJhbmRWYWx1ZUNoYW5nZXMoY3VycmVudExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scy5wdXNoKGZjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzJC5uZXh0KHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLnNsaWNlKDAsIG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMpKTtcblxuICAgICAgICAgICAgaWYgKG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLm5leHQodGhpcy5nZW5lcmF0ZVByZWRpY2F0ZShbXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kIHRoYXQgaXMgKGJ5IGRlZmF1bHQpIGNhbGxlZCB3aGVuZXZlciBhbiBvcGVyYW5kIGBGb3JtQ29udHJvbGAgY2hhbmdlcyBpdHMgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3BlcmFuZEluZGV4IHRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZCB0aGF0IGNoYW5nZWQgaXRzIHZhbHVlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9wZXJhbmRWYWx1ZUNoYW5nZXMob3BlcmFuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlcmF0b3JTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlcmFuZEluZGV4ID49IHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5OyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc09wZXJhbmRWYWx1ZVNlbGVjdGVkKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzW2ldLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh0aGlzLmdlbmVyYXRlUHJlZGljYXRlKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLm1hcChmYyA9PiB0aGlzLnRyYW5zZm9ybUNhdGVnb3J5VmFsdWUoZmMudmFsdWUpKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBjYXRlZ29yeSBjbGFzcyBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiA1LjYuMCAtIENhdGVnb3J5IHNlcmlhbGlzYXRpb24gc2hvdWxkIGJlIGRvbmUgYnkgdXRpbGlzaW5nIHRoZSB7QGxpbmsgQ2F0ZWdvcnlSZXNvbHZlclNlcnZpY2V9IGluc3RlYWRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCBzZXJpYWxpemVDbGFzcygpOiBDYXRlZ29yaWVzIHwgc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2VyaWFsaXplcyBvbmx5IHRoZSBvcGVyYXRvci5cbiAgICAgKiBJZiB0aGUgY2F0ZWdvcnkgY29udGFpbnMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGV4dGVuZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGNhdGVnb3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1ldGFkYXRhQ29uZmlndXJhdGlvbigpOiBDYXRlZ29yeU1ldGFkYXRhQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbQ2F0ZWdvcnkuT1BFUkFUT1JfTUVUQURBVEFdOiB0aGlzLnNlbGVjdGVkT3BlcmF0b3Iuc2VyaWFsaXplKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhbGwgb3BlcmFuZCBmb3JtIGNvbnRyb2wgb2JqZWN0cyB1cCB0byB0aGUgY3VycmVudCBudW1iZXIgb2Ygb3BlcmFuZHMuXG4gICAgICogVG8gc2VyaWFsaXplIHZhbHVlIG9mIGVhY2ggb3BlcmFuZCB0aGUgW3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZSgpXXtAbGluayBDYXRlZ29yeSNzZXJpYWxpemVPcGVyYW5kVmFsdWV9IG1ldGhvZCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogSWYgdGhlIHZhbHVlcyB1c2VkIGJ5IHRoaXMgY2F0ZWdvcnkgYXJlIG5vdCBzZXJpYWxpemFibGUsIHRoZW4gZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYHNlcmlhbGl6ZU9wZXJhbmRWYWx1ZWAgbWV0aG9kLFxuICAgICAqIG11c3QgYmUgb3ZlcnJpZGRlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIGlucHV0IGJ5IHRoZSB1c2VyIGluIGEgc2VyaWFsaXphYmxlIGZvcm1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTWV0YWRhdGFWYWx1ZXMoKTogQXJyYXk8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkT3BlcmF0b3JBcml0eTsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9sc1tpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlRm9ybUNvbnRyb2wgRm9ybUNvbnRyb2wgb2JqZWN0IG9mIG9uZSBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kIGluIGEgc2VyaWFsaXplZCBmb3JtLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBGb3JtQ29udHJvbHMgYHZhbHVlYCBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh2YWx1ZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbCk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gdmFsdWVGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlZCB0aGUgc2F2ZWQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIFtjcmVhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb24oKV17QGxpbmsgQ2F0ZWdvcnkjY3JlYXRlTWV0YWRhdGFDb25maWd1cmF0aW9ufSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXN0b3JlcyBvbmx5IHRoZSBzYXZlZCBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIElmIHRoZSBDYXRlZ29yeSBvdmVycmlkZXMgdGhlIHNlcmlhbGl6YXRpb24gbWV0aG9kLCBpdCBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgc2VyaWFsaXplZCBjb25maWd1cmF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlLiBXaGVuIHRoZSBPYnNlcnZhYmxlIGVtaXRzIHRoZSBjYXRlZ29yeSBoYXMgZmluaXNoZWQgbG9hZGluZyBpdHMgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZENvbmZpZ3VyYXRpb25Gcm9tTWV0YWRhdGEoY29uZmlndXJhdGlvbjogQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb24pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yU2VydmljZS5nZXRGcm9tTWV0YWRhdGEoY29uZmlndXJhdGlvbltDYXRlZ29yeS5PUEVSQVRPUl9NRVRBREFUQV0gYXMgT3BlcmF0b3JzIHwgc3RyaW5nKTtcbiAgICAgICAgdGhpcy5zZWxlY3RPcGVyYXRvcih0aGlzLmFsbG93ZWRPcGVyYXRvcnMuZmluZEluZGV4KG9wID0+IG9wID09PSByZXNvbHZlZE9wZXJhdG9yKSk7XG4gICAgICAgIHJldHVybiBvZlZvaWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSBwcm92aWRlZCB2YWx1ZXMgaW50byB0aGlzIENhdGVnb3J5J3Mgb3BlcmFuZCBmb3JtIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogQW4gb3BlcmF0b3IgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QhIE90aGVyd2lzZSBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKlxuICAgICAqIElmIHRoZSBudW1iZXIgb2YgdmFsdWVzIGRvZXNuJ3QgbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSBzZWxlY3RlZCBvcGVyYXRvciBhbiBlcnJvciB3aWxsIGJlIHRocm93biFcbiAgICAgKlxuICAgICAqIElmIHRoaXMgQ2F0ZWdvcnkgb3ZlcnJpZGVzIHRoZSBbc2VyaWFsaXplT3BlcmFuZFZhbHVlKClde0BsaW5rIENhdGVnb3J5I3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZX0sIGl0IG11c3QgYWxzb1xuICAgICAqIG92ZXJyaWRlIGl0cyBkZXNlcmlhbGl6YXRpb24gY291bnRlcnBhcnQgLSBbZGVzZXJpYWxpemVPcGVyYW5kVmFsdWUoKV17QGxpbmsgI0NhdGVnb3J5I2Rlc2VyaWFsaXplT3BlcmFuZFZhbHVlfSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHNlcmlhbGl6ZWQgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGxvYWRlZCBpbnRvIHRoaXMgQ2F0ZWdvcnkgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUuIFdoZW4gdGhlIE9ic2VydmFibGUgZW1pdHMgdGhlIGNhdGVnb3J5IGhhcyBmaW5pc2hlZCBsb2FkaW5nIGl0cyB2YWx1ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRWYWx1ZXNGcm9tTWV0YWRhdGEodmFsdWVzOiBBcnJheTx1bmtub3duPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb3BlcmF0b3IgbXVzdCBiZSBzZWxlY3RlZCBiZWZvcmUgQ2F0ZWdvcnkgdmFsdWVzIGNhbiBiZSByZXNvbHZlZCBmcm9tIG1ldGFkYXRhIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3BlcmF0b3JBcml0eSAhPT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYXJpdHkgb2YgdGhlIHNlbGVjdGVkIG9wZXJhdG9yICgke3RoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5XG4gICAgICAgICAgICB9KSBkb2Vzbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgdGhlIHByb3ZpZGVkIHZhbHVlcyAoJHt2YWx1ZXMubGVuZ3RofSkhYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkVmFsdWVzT2JzZXJ2YWJsZXMgPSB2YWx1ZXMubWFwKHYgPT4gdGhpcy5kZXNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh2KSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcbiAgICAgICAgZm9ya0pvaW4oZGVzZXJpYWxpemVkVmFsdWVzT2JzZXJ2YWJsZXMpLnBpcGUoZGVmYXVsdElmRW1wdHkoW10pKS5zdWJzY3JpYmUoZGVzZXJpYWxpemVkVmFsdWVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0T3BlcmFuZHMoZGVzZXJpYWxpemVkVmFsdWVzKTtcbiAgICAgICAgICAgIHJlc3VsdCQubmV4dCgpO1xuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBzZXJpYWxpemVkIG91dHB1dCBvZiB0aGUgW3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZSgpXXtAbGluayBDYXRlZ29yeSNzZXJpYWxpemVPcGVyYW5kVmFsdWV9IG1ldGhvZFxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB0aGF0IGVtaXRzIHRoZSBkZXNlcmlhbGl6ZWQgdmFsdWUsIHRoYXQgY2FuIGJlIHNldCBhcyBGb3JtQ29udHJvbCB2YWx1ZSBhbmQgdGhlbiBjb21wbGV0ZXNcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG1heSB0aHJvdyBuYSBlcnJvciBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRlc2VyaWFsaXplZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVzZXJpYWxpemVPcGVyYW5kVmFsdWUodmFsdWU6IHVua25vd24pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gb2YodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGBGb3JtQ29udHJvbGAgb2JqZWN0IHRoYXQgd2Ugd2FudCB0byB0ZXN0XG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuZXdseSBzZWxlY3RlZCB2YWx1ZSBpcyBhIHZhbGlkIHZhbHVlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXNPcGVyYW5kVmFsdWVTZWxlY3RlZChuZXdWYWx1ZTogYW55KTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGBGb3JtQ29udHJvbGAgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgaW50byB0aGUgc2VsZWN0ZWQgYE9wZXJhdG9yYCBmb3IgcXVlcnkgZ2VuZXJhdGlvbi5cbiAgICAgKiBJdCBpcyBtb3N0bHkgdXNlZnVsIG9ubHkgZm9yIEF1dG9jb21wbGV0ZUNhdGVnb3JpZXMsIHdoZXJlIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGUgRm9ybUNvbnRyb2wgaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24gLSByZXR1cm5zIHRoZSBpbnB1dC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIEZvcm1Db250cm9sVmFsdWVcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgdXNlZCBmb3IgcXVlcnkgZ2VuZXJhdGlvblxuICAgICAqL1xuICAgIHByb3RlY3RlZCB0cmFuc2Zvcm1DYXRlZ29yeVZhbHVlKHZhbHVlOiBhbnkpOiBUIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGV4dCBzZWdtZW50cyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHByZWRpY2F0ZSBnZW5lcmF0ZWQgYnkgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGaWx0ZXJUZXh0U2VnbWVudHMoKTogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3ZpZGVzUHJlZGljYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtzZWdtZW50OiB0aGlzLnRyYW5zbGF0aW9uUGF0aCwgYm9sZDogdGhpcy5kaXNwbGF5Qm9sZH0sXG4gICAgICAgICAgICAuLi50aGlzLmNyZWF0ZUNvbmZpZ3VyYXRpb25GaWx0ZXJUZXh0U2VnbWVudHMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY3JlYXRlT3BlcmF0b3JGaWx0ZXJUZXh0U2VnbWVudHMoKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGV4dCBzZWdtZW50cyByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaW5wdXRzIG9mIHRoaXMgY2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlQ29uZmlndXJhdGlvbkZpbHRlclRleHRTZWdtZW50cygpOiBBcnJheTxGaWx0ZXJUZXh0U2VnbWVudD47XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBBcnJheSBjb250YWluaW5nIHRleHQgc2VnbWVudHMgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRvcnMgd2l0aCBvcGVyYW5kcyBvZiB0aGlzIGNhdGVnb3J5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU9wZXJhdG9yRmlsdGVyVGV4dFNlZ21lbnRzKCk6IEFycmF5PEZpbHRlclRleHRTZWdtZW50PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+ID0gW107XG4gICAgICAgIGxldCBvcGVyYW5kSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWxlY3RlZE9wZXJhdG9yLmdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSBPcGVyYXRvci5JTlBVVF9QTEFDRUhPTERFUikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlT3BlcmFuZEZpbHRlclRleHRTZWdtZW50KG9wZXJhbmRJbmRleCkpO1xuICAgICAgICAgICAgICAgIG9wZXJhbmRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7c2VnbWVudH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgZmlsdGVyIHRleHQgc2VnbWVudCByZXByZXNlbnRpbmcgdGhlIG9wZXJhbmQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVPcGVyYW5kRmlsdGVyVGV4dFNlZ21lbnQob3BlcmFuZEluZGV4OiBudW1iZXIpOiBGaWx0ZXJUZXh0U2VnbWVudCB7XG4gICAgICAgIGxldCBzZWdtZW50O1xuICAgICAgICBjb25zdCBvcGVyYW5kID0gdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHNbb3BlcmFuZEluZGV4XS52YWx1ZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTZWFyY2hJbnB1dFR5cGUuQVVUT0NPTVBMRVRFOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLnRleHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNlYXJjaElucHV0VHlwZS5EQVRFOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLmZvcm1hdChEQVRFX0ZPUk1BVF9TVFJJTkcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTZWFyY2hJbnB1dFR5cGUuREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLmZvcm1hdChEQVRFX1RJTUVfRk9STUFUX1NUUklORyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7c2VnbWVudCwgYm9sZDogdHJ1ZX07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGZvciBzZWxlY3RlZCBvcGVyYXRvclxuICAgICAqIEBwYXJhbSBvcGVyYXRvckNsYXNzIHRoZSBvcGVyYXRvciB0byBiZSBjaGVja2VkXG4gICAgICogQHJldHVybiBib29sZWFuIG9mIHRoZSBzdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaXNTZWxlY3RlZE9wZXJhdG9yKG9wZXJhdG9yQ2xhc3M6IFR5cGU8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wZXJhdG9yID09PSB0aGlzLl9vcGVyYXRvclNlcnZpY2UuZ2V0T3BlcmF0b3Iob3BlcmF0b3JDbGFzcyk7XG4gICAgfVxufVxuIl19
|
|
@@ -16,8 +16,8 @@ var Substring = /** @class */ (function (_super) {
|
|
|
16
16
|
// TODO IMPROVEMENT 27.4.2020 - we could use regular expressions to search for substrings which would solve the unintuitive
|
|
17
17
|
// behavior that occurs when we search for strings that contain spaces. We need to escape the input string in a special way
|
|
18
18
|
// if we choose to do this
|
|
19
|
-
var escapedValue = Operator.escapeInput(args[0]).value;
|
|
20
|
-
return Operator.forEachKeyword(elasticKeywords, function (keyword) { return new Query("(" + keyword + "
|
|
19
|
+
var escapedValue = Operator.escapeInput(args[0]).value.replace(' ', '\\ ');
|
|
20
|
+
return Operator.forEachKeyword(elasticKeywords, function (keyword) { return new Query("(" + keyword + ":*" + escapedValue + "*)"); });
|
|
21
21
|
};
|
|
22
22
|
Substring.prototype.getOperatorNameTemplate = function () {
|
|
23
23
|
return ['search.operator.substring', Operator.INPUT_PLACEHOLDER];
|
|
@@ -28,4 +28,4 @@ var Substring = /** @class */ (function (_super) {
|
|
|
28
28
|
return Substring;
|
|
29
29
|
}(Operator));
|
|
30
30
|
export { Substring };
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic3RyaW5nLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlYXJjaC9tb2RlbHMvb3BlcmF0b3Ivc3Vic3RyaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDOzs7R0FHRztBQUNIO0lBQStCLDZCQUFnQjtJQUMzQztlQUNJLGtCQUFNLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCwrQkFBVyxHQUFYLFVBQVksZUFBOEIsRUFBRSxJQUFtQjtRQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsMkhBQTJIO1FBQzNILDRIQUE0SDtRQUM1SCwyQkFBMkI7UUFDM0IsSUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RSxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLFVBQUEsT0FBTyxJQUFJLE9BQUEsSUFBSSxLQUFLLENBQUMsTUFBSSxPQUFPLFVBQUssWUFBWSxPQUFJLENBQUMsRUFBM0MsQ0FBMkMsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRCwyQ0FBdUIsR0FBdkI7UUFDSSxPQUFPLENBQUMsMkJBQTJCLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELDZCQUFTLEdBQVQ7UUFDSSxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUNMLGdCQUFDO0FBQUQsQ0FBQyxBQXJCRCxDQUErQixRQUFRLEdBcUJ0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3BlcmF0b3J9IGZyb20gJy4vb3BlcmF0b3InO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vcXVlcnkvcXVlcnknO1xuaW1wb3J0IHtPcGVyYXRvcnN9IGZyb20gJy4vb3BlcmF0b3JzJztcblxuLyoqXG4gKiBPcGVyYXRvciB0aGF0IG1hdGNoZXMgaWYgdGhlIGlucHV0IGlzIGEgc3Vic3RyaW5nIG9mIHNvbWUgdmFsdWUuXG4gKiBDYW4gb25seSBiZSB1c2VkIG9uIGZpZWxkcyB0aGF0IGFyZSB0ZXh0cyBhbmQgYXJlIG5vdCBpbmRleGVkIGFzIGtleXdvcmRzLlxuICovXG5leHBvcnQgY2xhc3MgU3Vic3RyaW5nIGV4dGVuZHMgT3BlcmF0b3I8c3RyaW5nPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDEpO1xuICAgIH1cblxuICAgIGNyZWF0ZVF1ZXJ5KGVsYXN0aWNLZXl3b3JkczogQXJyYXk8c3RyaW5nPiwgYXJnczogQXJyYXk8c3RyaW5nPik6IFF1ZXJ5IHtcbiAgICAgICAgdGhpcy5jaGVja0FyZ3VtZW50c0NvdW50KGFyZ3MpO1xuICAgICAgICAvLyBUT0RPIElNUFJPVkVNRU5UIDI3LjQuMjAyMCAtIHdlIGNvdWxkIHVzZSByZWd1bGFyIGV4cHJlc3Npb25zIHRvIHNlYXJjaCBmb3Igc3Vic3RyaW5ncyB3aGljaCB3b3VsZCBzb2x2ZSB0aGUgdW5pbnR1aXRpdmVcbiAgICAgICAgLy8gIGJlaGF2aW9yIHRoYXQgb2NjdXJzIHdoZW4gd2Ugc2VhcmNoIGZvciBzdHJpbmdzIHRoYXQgY29udGFpbiBzcGFjZXMuIFdlIG5lZWQgdG8gZXNjYXBlIHRoZSBpbnB1dCBzdHJpbmcgaW4gYSBzcGVjaWFsIHdheVxuICAgICAgICAvLyAgaWYgd2UgY2hvb3NlIHRvIGRvIHRoaXNcbiAgICAgICAgY29uc3QgZXNjYXBlZFZhbHVlID0gT3BlcmF0b3IuZXNjYXBlSW5wdXQoYXJnc1swXSkudmFsdWUucmVwbGFjZSgnICcsICdcXFxcICcpO1xuICAgICAgICByZXR1cm4gT3BlcmF0b3IuZm9yRWFjaEtleXdvcmQoZWxhc3RpY0tleXdvcmRzLCBrZXl3b3JkID0+IG5ldyBRdWVyeShgKCR7a2V5d29yZH06KiR7ZXNjYXBlZFZhbHVlfSopYCkpO1xuICAgIH1cblxuICAgIGdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gWydzZWFyY2gub3BlcmF0b3Iuc3Vic3RyaW5nJywgT3BlcmF0b3IuSU5QVVRfUExBQ0VIT0xERVJdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBPcGVyYXRvcnMgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gT3BlcmF0b3JzLlNVQlNUUklORztcbiAgICB9XG59XG4iXX0=
|
|
@@ -11,6 +11,7 @@ import * as i0 from "@angular/core";
|
|
|
11
11
|
*/
|
|
12
12
|
var SearchIndexResolverService = /** @class */ (function () {
|
|
13
13
|
function SearchIndexResolverService() {
|
|
14
|
+
this.KEYWORD = '.keyword';
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Constructs the index name for the specified field.
|
|
@@ -25,7 +26,21 @@ var SearchIndexResolverService = /** @class */ (function () {
|
|
|
25
26
|
*/
|
|
26
27
|
SearchIndexResolverService.prototype.getIndex = function (dataFieldIdentifier, index, keyword) {
|
|
27
28
|
if (keyword === void 0) { keyword = false; }
|
|
28
|
-
return "dataSet." + dataFieldIdentifier + "." + index + (keyword ?
|
|
29
|
+
return "dataSet." + dataFieldIdentifier + "." + index + (keyword ? this.KEYWORD : '');
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Constructs the index name for the specified core field.
|
|
33
|
+
*
|
|
34
|
+
* Note that almost all combinations are valid and will not throw an error when used to query the database, but not all combinations are
|
|
35
|
+
* used by the application engine. The {@link SearchIndex} class has some information about which field types map to which indices, but
|
|
36
|
+
* you should consult the backend documentation for more reliable information.
|
|
37
|
+
* @param index the queried index
|
|
38
|
+
* @param keyword whether the keyword of a TEXT index should be queried
|
|
39
|
+
* @returns the full name of the specified index
|
|
40
|
+
*/
|
|
41
|
+
SearchIndexResolverService.prototype.getCoreIndex = function (index, keyword) {
|
|
42
|
+
if (keyword === void 0) { keyword = false; }
|
|
43
|
+
return "" + index + (keyword ? this.KEYWORD : '');
|
|
29
44
|
};
|
|
30
45
|
SearchIndexResolverService.ɵprov = i0.ɵɵdefineInjectable({ factory: function SearchIndexResolverService_Factory() { return new SearchIndexResolverService(); }, token: SearchIndexResolverService, providedIn: "root" });
|
|
31
46
|
SearchIndexResolverService.decorators = [
|
|
@@ -37,4 +52,4 @@ var SearchIndexResolverService = /** @class */ (function () {
|
|
|
37
52
|
return SearchIndexResolverService;
|
|
38
53
|
}());
|
|
39
54
|
export { SearchIndexResolverService };
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWluZGV4LXJlc29sdmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL3NlYXJjaC1rZXl3b3JkLXJlc29sdmVyLXNlcnZpY2Uvc2VhcmNoLWluZGV4LXJlc29sdmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFHekM7Ozs7Ozs7O0dBUUc7QUFDSDtJQU9JO1FBRmdCLFlBQU8sR0FBRyxVQUFVLENBQUM7SUFFckIsQ0FBQztJQUVqQjs7Ozs7Ozs7OztPQVVHO0lBQ0UsNkNBQVEsR0FBZixVQUFnQixtQkFBMkIsRUFBRSxLQUFrQixFQUFFLE9BQWU7UUFBZix3QkFBQSxFQUFBLGVBQWU7UUFDNUUsT0FBTyxhQUFXLG1CQUFtQixTQUFJLEtBQUssSUFBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFDO0lBQ25GLENBQUM7SUFFQzs7Ozs7Ozs7O09BU0c7SUFDRSxpREFBWSxHQUFuQixVQUFvQixLQUFhLEVBQUUsT0FBZTtRQUFmLHdCQUFBLEVBQUEsZUFBZTtRQUM5QyxPQUFPLEtBQUcsS0FBSyxJQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQUM7SUFDcEQsQ0FBQzs7O2dCQXBDRixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7cUNBZEQ7Q0FpREMsQUFyQ0QsSUFxQ0M7U0FsQ1ksMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2VhcmNoSW5kZXh9IGZyb20gJy4uL21vZGVscy9zZWFyY2gtaW5kZXgnO1xuXG4vKipcbiAqIEEgdXRpbGl0eSBzZXJ2aWNlIHRoYXQgYWltcyB0byBwcm92aWRlIGVsYXN0aWNzZWFyY2ggcXVlcnkgc3RyaW5nIHF1ZXJ5IGluZGV4IG5hbWVzIGZvciBkYXRhIHNldCBxdWVyaWVzLlxuICpcbiAqIElmIHlvdXIgYXBwIHVzZXMgYSBjdXN0b21pc2VkIGVsYXN0aWNzZWFyY2ggZGF0YWJhc2UgbWFwcGluZyBmb3IgQ2FzZSBvYmplY3RzLCB0aGF0IGFmZmVjdHMgdGhlIHdheSBkYXRhIGZpZWxkcyBhcmUgaW5kZXhlZCB5b3UgbXVzdFxuICogcHJvdmlkZSBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhpcyBzZXJ2aWNlLCBzbyB0aGF0IHNlYXJjaCBjYW4gZ2VuZXJhdGUgY29ycmVjdCBxdWVyaWVzLlxuICpcbiAqIFlvdSBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhpcyBzZXJ2aWNlIHdoZW4gY3JlYXRpbmcge0BsaW5rIEZpbHRlcn1zLCB3aXRoIGVsYXN0aWMgcXVlcnkgc3RyaW5nIHF1ZXJpZXMsIHNvIHRoYXQgZnV0dXJlIGNoYW5nZXMgdG8gdGhlXG4gKiBkZWZhdWx0IG1hcHBpbmcgZG9uJ3QgYWZmZWN0IHlvdXIgZXhpc3RpbmcgY29kZS5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoSW5kZXhSZXNvbHZlclNlcnZpY2Uge1xuXG4gICAgcHVibGljIHJlYWRvbmx5IEtFWVdPUkQgPSAnLmtleXdvcmQnO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhlIGluZGV4IG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYWxtb3N0IGFsbCBjb21iaW5hdGlvbnMgYXJlIHZhbGlkIGFuZCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciB3aGVuIHVzZWQgdG8gcXVlcnkgdGhlIGRhdGFiYXNlLCBidXQgbm90IGFsbCBjb21iaW5hdGlvbnMgYXJlXG4gICAgICogdXNlZCBieSB0aGUgYXBwbGljYXRpb24gZW5naW5lLiBUaGUge0BsaW5rIFNlYXJjaEluZGV4fSBjbGFzcyBoYXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmaWVsZCB0eXBlcyBtYXAgdG8gd2hpY2ggaW5kaWNlcywgYnV0XG4gICAgICogeW91IHNob3VsZCBjb25zdWx0IHRoZSBiYWNrZW5kIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgcmVsaWFibGUgaW5mb3JtYXRpb24uXG4gICAgICogQHBhcmFtIGRhdGFGaWVsZElkZW50aWZpZXIgaW1wb3J0IElEIG9mIHRoZSBxdWVyaWVkIGRhdGEgZmllbGRcbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHF1ZXJpZWQgaW5kZXhcbiAgICAgKiBAcGFyYW0ga2V5d29yZCB3aGV0aGVyIHRoZSBrZXl3b3JkIG9mIGEgVEVYVCBpbmRleCBzaG91bGQgYmUgcXVlcmllZFxuICAgICAqIEByZXR1cm5zIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgICAqL1xuICBwdWJsaWMgZ2V0SW5kZXgoZGF0YUZpZWxkSWRlbnRpZmllcjogc3RyaW5nLCBpbmRleDogU2VhcmNoSW5kZXgsIGtleXdvcmQgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gYGRhdGFTZXQuJHtkYXRhRmllbGRJZGVudGlmaWVyfS4ke2luZGV4fSR7a2V5d29yZCA/IHRoaXMuS0VZV09SRCA6ICcnfWA7XG4gIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhlIGluZGV4IG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY29yZSBmaWVsZC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBhbG1vc3QgYWxsIGNvbWJpbmF0aW9ucyBhcmUgdmFsaWQgYW5kIHdpbGwgbm90IHRocm93IGFuIGVycm9yIHdoZW4gdXNlZCB0byBxdWVyeSB0aGUgZGF0YWJhc2UsIGJ1dCBub3QgYWxsIGNvbWJpbmF0aW9ucyBhcmVcbiAgICAgKiB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBlbmdpbmUuIFRoZSB7QGxpbmsgU2VhcmNoSW5kZXh9IGNsYXNzIGhhcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZpZWxkIHR5cGVzIG1hcCB0byB3aGljaCBpbmRpY2VzLCBidXRcbiAgICAgKiB5b3Ugc2hvdWxkIGNvbnN1bHQgdGhlIGJhY2tlbmQgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSByZWxpYWJsZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHF1ZXJpZWQgaW5kZXhcbiAgICAgKiBAcGFyYW0ga2V5d29yZCB3aGV0aGVyIHRoZSBrZXl3b3JkIG9mIGEgVEVYVCBpbmRleCBzaG91bGQgYmUgcXVlcmllZFxuICAgICAqIEByZXR1cm5zIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgICAqL1xuICBwdWJsaWMgZ2V0Q29yZUluZGV4KGluZGV4OiBzdHJpbmcsIGtleXdvcmQgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gYCR7aW5kZXh9JHtrZXl3b3JkID8gdGhpcy5LRVlXT1JEIDogJyd9YDtcbiAgfVxufVxuIl19
|
|
@@ -266,7 +266,8 @@ var SearchService = /** @class */ (function () {
|
|
|
266
266
|
* @param searchedSubstring value that should be searched on all full text fields
|
|
267
267
|
*/
|
|
268
268
|
SearchService.prototype.setFullTextFilter = function (searchedSubstring) {
|
|
269
|
-
|
|
269
|
+
var whiteSpacedSubstring = searchedSubstring.replace(' ', '\\ ');
|
|
270
|
+
this._fullTextFilter = new SimpleFilter('', this._baseFilter.type, { fullText: whiteSpacedSubstring });
|
|
270
271
|
this.updateActiveFilter();
|
|
271
272
|
};
|
|
272
273
|
/**
|
|
@@ -402,4 +403,4 @@ var SearchService = /** @class */ (function () {
|
|
|
402
403
|
return SearchService;
|
|
403
404
|
}());
|
|
404
405
|
export { SearchService };
|
|
405
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL3NlYXJjaC1zZXJ2aWNlL3NlYXJjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRWxGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFHakUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMscUNBQXFDLEVBQUMsTUFBTSwrREFBK0QsQ0FBQztBQUdwSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUVyRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFJN0Q7O0dBRUc7QUFDSDtJQThCSTs7Ozs7OztPQU9HO0lBQ0gsdUJBQXNCLElBQW1CLEVBQ1AsZ0JBQWlDLEVBQzlCLFVBQXNCO1FBRjNELGlCQTJCQztRQTNCcUIsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUNQLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7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SUFFRDs7T0FFRztJQUNJLGdEQUF3QixHQUEvQjtRQUNJLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQzFELENBQUM7O2dCQS9TMkIsYUFBYTtnQkFDVyxlQUFlLHVCQUF0RCxRQUFRO2dEQUNSLE1BQU0sU0FBQyxlQUFlOzs7Z0JBeEN0QyxVQUFVOzs7Z0JBVkgsYUFBYTtnQkFDYixlQUFlLHVCQWdETixRQUFRO2dEQUNSLE1BQU0sU0FBQyxlQUFlOztJQThTdkMsb0JBQUM7Q0FBQSxBQXRWRCxJQXNWQztTQXJWWSxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCb29sZWFuT3BlcmF0b3J9IGZyb20gJy4uL21vZGVscy9ib29sZWFuLW9wZXJhdG9yJztcbmltcG9ydCB7RmlsdGVyfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL2ZpbHRlcic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnLi4vbW9kZWxzL3ByZWRpY2F0ZS9wcmVkaWNhdGUnO1xuaW1wb3J0IHtTaW1wbGVGaWx0ZXJ9IGZyb20gJy4uLy4uL2ZpbHRlci9tb2RlbHMvc2ltcGxlLWZpbHRlcic7XG5pbXBvcnQge01lcmdlT3BlcmF0b3J9IGZyb20gJy4uLy4uL2ZpbHRlci9tb2RlbHMvbWVyZ2Utb3BlcmF0b3InO1xuaW1wb3J0IHtQcmVkaWNhdGVSZW1vdmFsRXZlbnR9IGZyb20gJy4uL21vZGVscy9wcmVkaWNhdGUtcmVtb3ZhbC1ldmVudCc7XG5pbXBvcnQge1F1ZXJ5fSBmcm9tICcuLi9tb2RlbHMvcXVlcnkvcXVlcnknO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RWRpdGFibGVDbGF1c2VQcmVkaWNhdGVXaXRoR2VuZXJhdG9yc30gZnJvbSAnLi4vbW9kZWxzL3ByZWRpY2F0ZS9lZGl0YWJsZS1jbGF1c2UtcHJlZGljYXRlLXdpdGgtZ2VuZXJhdG9ycyc7XG5pbXBvcnQge0NhdGVnb3J5fSBmcm9tICcuLi9tb2RlbHMvY2F0ZWdvcnkvY2F0ZWdvcnknO1xuaW1wb3J0IHtQcmVkaWNhdGVUcmVlTWV0YWRhdGF9IGZyb20gJy4uL21vZGVscy9wZXJzaXN0YW5jZS9nZW5lcmF0b3ItbWV0YWRhdGEnO1xuaW1wb3J0IHtOQUVfQkFTRV9GSUxURVJ9IGZyb20gJy4uL21vZGVscy9iYXNlLWZpbHRlci1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtCYXNlRmlsdGVyfSBmcm9tICcuLi9tb2RlbHMvYmFzZS1maWx0ZXInO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXRlZ29yeUZhY3Rvcnl9IGZyb20gJy4uL2NhdGVnb3J5LWZhY3RvcnkvY2F0ZWdvcnktZmFjdG9yeSc7XG5pbXBvcnQge0ZpbHRlclR5cGV9IGZyb20gJy4uLy4uL2ZpbHRlci9tb2RlbHMvZmlsdGVyLXR5cGUnO1xuaW1wb3J0IHtMb2FkaW5nRW1pdHRlcn0gZnJvbSAnLi4vLi4vdXRpbGl0eS9sb2FkaW5nLWVtaXR0ZXInO1xuaW1wb3J0IHtGaWx0ZXJNZXRhZGF0YX0gZnJvbSAnLi4vbW9kZWxzL3BlcnNpc3RhbmNlL2ZpbHRlci1tZXRhZGF0YSc7XG5pbXBvcnQge0ZpbHRlclRleHRTZWdtZW50fSBmcm9tICcuLi9tb2RlbHMvcGVyc2lzdGFuY2UvZmlsdGVyLXRleHQtc2VnbWVudCc7XG5cbi8qKlxuICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbHRlciB0aGF0IGlzIGN1cnJlbnRseSBhcHBsaWVkIHRvIHRoZSB2aWV3IGNvbXBvbmVudCwgdGhhdCBwcm92aWRlcyB0aGlzIHNlcnZpY2VzLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2VhcmNoU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgRmlsdGVyfSB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIHZpZXcsIGV2ZW4gaWYgdGhlIHVzZXIgZG9lc24ndCBzZWFyY2ggYW55dGhpbmcuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9iYXNlRmlsdGVyOiBGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogSG9sZHMgdGhlIHtAbGluayBQcmVkaWNhdGV9IHRyZWUgcm9vdCBmb3IgdXNlciBzZWFyY2ggcXVlcmllcy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jvb3RQcmVkaWNhdGU6IEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnM7XG4gICAgLyoqXG4gICAgICogSG9sZHMgdGhlIHtAbGluayBGaWx0ZXJ9IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGFwcGxpZWQgdG8gdGhlIHZpZXcuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9hY3RpdmVGaWx0ZXI6IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXI+O1xuICAgIC8qKlxuICAgICAqIEhvbGRzIHRoZSBmdWxsIHRleHQge0BsaW5rIEZpbHRlcn0gaWYgc2V0LCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9mdWxsVGV4dEZpbHRlcjogU2ltcGxlRmlsdGVyIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiBhIHJlbW92ZWQge0BsaW5rIFByZWRpY2F0ZX0gaXMgZW1taXRlZCBpbnRvIHRoaXMgc3RyZWFtXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9wcmVkaWNhdGVSZW1vdmVkJDogU3ViamVjdDxQcmVkaWNhdGVSZW1vdmFsRXZlbnQ+O1xuICAgIHByb3RlY3RlZCBfbG9hZGluZ0Zyb21NZXRhZGF0YSQ6IExvYWRpbmdFbWl0dGVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcm9vdFByZWRpY2F0ZWAgdXNlcyB0aGlzIHN0cmVhbSB0byBub3RpZnkgdGhlIHNlYXJjaCBzZXJ2aWNlIGFib3V0IGNoYW5nZXMgdG8gdGhlIGhlbGQgcXVlcnlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wcmVkaWNhdGVRdWVyeUNoYW5nZWQkOiBTdWJqZWN0PHZvaWQ+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3ViRmlsdGVyOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUge0BsaW5rIFByZWRpY2F0ZX0gdHJlZSByb290IHVzZXMgYW4gW0FORF17QGxpbmsgQm9vbGVhbk9wZXJhdG9yI0FORH0gb3BlcmF0b3IgdG8gY29tYmluZSB0aGUgUHJlZGljYXRlcy5cbiAgICAgKiBAcGFyYW0gX2xvZyB7QGxpbmsgTG9nZ2VyU2VydmljZX1cbiAgICAgKiBAcGFyYW0gX2NhdGVnb3J5RmFjdG9yeSBhIHtAbGluayBDYXRlZ29yeUZhY3Rvcnl9IGluc3RhbmNlLiBUaGlzIGRlcGVuZGVuY3kgaXMgb3B0aW9uYWwuXG4gICAgICogSXQgaXMgcmVxdWlyZWQgaWYgd2Ugd2FudCB0byBsb2FkIHByZWRpY2F0ZSBmaWx0ZXIgZnJvbSBzYXZlZCBtZXRhZGF0YVxuICAgICAqIEBwYXJhbSBiYXNlRmlsdGVyIEZpbHRlciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSB2aWV3IHdoZW4gbm8gc2VhcmNoaW5nIGlzIGJlaW5nIHBlcmZvcm1lZC5cbiAgICAgKiBJbmplY3RlZCB0cm91Z2ggdGhlIHtAbGluayBOQUVfQkFTRV9GSUxURVJ9IGluamVjdGlvbiB0b2tlbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgX2NhdGVnb3J5RmFjdG9yeTogQ2F0ZWdvcnlGYWN0b3J5LFxuICAgICAgICAgICAgICAgIEBJbmplY3QoTkFFX0JBU0VfRklMVEVSKSBiYXNlRmlsdGVyOiBCYXNlRmlsdGVyKSB7XG4gICAgICAgIGlmIChiYXNlRmlsdGVyLmZpbHRlciBpbnN0YW5jZW9mIEZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fYmFzZUZpbHRlciA9IGJhc2VGaWx0ZXIuZmlsdGVyLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmFzZUZpbHRlci5maWx0ZXIgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlRmlsdGVyID0gbmV3IFNpbXBsZUZpbHRlcignJywgYmFzZUZpbHRlci5maWx0ZXJUeXBlLCB7cHJvY2Vzczoge2lkZW50aWZpZXI6ICdfX0VNUFRZX18nfX0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBCYXNlRmlsdGVyIGlucHV0ISBZb3UgbXVzdCBwcm92aWRlIHRoZSBOQUVfQkFTRV9GSUxURVIgaW5qZWN0aW9uIHRva2VuIHdpdGggcHJvcGVyIHZhbHVlcyEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICB0aGlzLl9yb290UHJlZGljYXRlID0gbmV3IEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnMoQm9vbGVhbk9wZXJhdG9yLkFORCwgdGhpcy5fcHJlZGljYXRlUXVlcnlDaGFuZ2VkJCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlRmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXI+KHRoaXMuX2Jhc2VGaWx0ZXIpO1xuICAgICAgICB0aGlzLl9wcmVkaWNhdGVSZW1vdmVkJCA9IG5ldyBTdWJqZWN0PFByZWRpY2F0ZVJlbW92YWxFdmVudD4oKTtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQgPSBuZXcgTG9hZGluZ0VtaXR0ZXIoKTtcblxuICAgICAgICBpZiAoYmFzZUZpbHRlci5maWx0ZXIgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnN1YkZpbHRlciA9IGJhc2VGaWx0ZXIuZmlsdGVyLnN1YnNjcmliZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmFzZUZpbHRlciA9IGZpbHRlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJlZGljYXRlUXVlcnlDaGFuZ2VkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZVJlbW92ZWQkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlci5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9wcmVkaWNhdGVRdWVyeUNoYW5nZWQkLmNvbXBsZXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnN1YkZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5zdWJGaWx0ZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sb2FkaW5nRnJvbU1ldGFkYXRhJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9yb290UHJlZGljYXRlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgRmlsdGVyIHRoYXQgaXMgY3VycmVudGx5IGFwcGxpZWQgdG8gdGhlIHZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlcigpOiBGaWx0ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVyLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgdXBkYXRlcyBldmVyeSB0aW1lIHRoZSBhY3RpdmUgRmlsdGVyIGNoYW5nZXMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhY3RpdmVGaWx0ZXIkKCk6IE9ic2VydmFibGU8RmlsdGVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXIuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIGEgZmlsdGVyIG90aGVyIHRoYW4gdGhlIGJhc2UgZmlsdGVyIGlzIGN1cnJlbnRseSBhcHBsaWVkLlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBpZiBvbmx5IHRoZSBiYXNlIGZpbHRlciBpcyBjdXJyZW50bHkgYXBwbGllZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFkZGl0aW9uYWxGaWx0ZXJzQXBwbGllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9yb290UHJlZGljYXRlLnF1ZXJ5LmlzRW1wdHkgfHwgISF0aGlzLl9mdWxsVGV4dEZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYW55IHZpc2libGUgcHJlZGljYXRlcyBhcmUgYXBwbGllZC5cbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgdGhlcmUgYXJlIG5vIHByZWRpY2F0ZXMsIG9yIGlmIHRoZXJlIGFyZSBvbmx5IGhpZGRlbiBwcmVkaWNhdGVzIGFwcGxpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1Zpc2libGVQcmVkaWNhdGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByZWRpY2F0ZSBvZiB0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlLmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhIGNvcHkgb2YgdGhlIGJhc2UgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBiYXNlRmlsdGVyKCk6IEZpbHRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlRmlsdGVyLmNsb25lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBpbmRleCBvZiB0aGUgcmVtb3ZlZCBwcmVkaWNhdGUgd2hlbmV2ZXIgYSBwcmVkaWNhdGUgaXMgcmVtb3ZlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJlZGljYXRlUmVtb3ZlZCQoKTogT2JzZXJ2YWJsZTxQcmVkaWNhdGVSZW1vdmFsRXZlbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZWRpY2F0ZVJlbW92ZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSByb290IHByZWRpY2F0ZSBvZiB0aGUgc2VhcmNoIHNlcnZpY2UsIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgc2VhcmNoIHJlcXVlc3RzIHdpdGggY3VzdG9tIHF1ZXJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3RQcmVkaWNhdGUoKTogRWRpdGFibGVDbGF1c2VQcmVkaWNhdGVXaXRoR2VuZXJhdG9ycyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290UHJlZGljYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIgaGVsZCBpbiB0aGlzIHNlYXJjaCBzZXJ2aWNlIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJUeXBlKCk6IEZpbHRlclR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlRmlsdGVyLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgd2hldGhlciB0aGUgc2VhcmNoIHNlcnZpY2UgaXMgY3VycmVudGx5IGxvYWRpbmcgaXRzIHN0YXRlIGZyb20gbWV0YWRhdGEgb3Igbm90LlxuICAgICAqXG4gICAgICogU2VlIFtsb2FkRnJvbU1ldGFkYXRhKClde0BsaW5rIFNlYXJjaFNlcnZpY2UjbG9hZEZyb21NZXRhZGF0YX1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmdGcm9tTWV0YWRhdGEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nRnJvbU1ldGFkYXRhJC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgaWYgdGhlIHNlYXJjaCBzZXJ2aWNlIGlzIGN1cnJlbnRseSBsb2FkaW5nIGl0cyBzdGF0ZSBmcm9tIG1ldGFkYXRhLFxuICAgICAqIGVtaXRzIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogU2VlIFtsb2FkRnJvbU1ldGFkYXRhKClde0BsaW5rIFNlYXJjaFNlcnZpY2UjbG9hZEZyb21NZXRhZGF0YX1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmdGcm9tTWV0YWRhdGEkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW5ldmVyIHRoZSByb290IHByZWRpY2F0ZXMgcXVlcnkgY2hhbmdlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgcHJlZGljYXRlUXVlcnlDaGFuZ2VkJCgpOiBPYnNlcnZhYmxlPFF1ZXJ5PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVkaWNhdGVRdWVyeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5fcm9vdFByZWRpY2F0ZS5xdWVyeSksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gcHJldiAmJiBwcmV2LmVxdWFscyhjdXJyKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEge0BsaW5rIFByZWRpY2F0ZX0gdG8gdGhlIFByZWRpY2F0ZSByb290IGFuZCB1cGRhdGVzIHRoZSBhY3RpdmUgRmlsdGVyLlxuICAgICAqXG4gICAgICogUHJlZGljYXRlcyBhZGRlZCB0aGlzIHdheSB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIHRoZSBzZWFyY2ggR1VJLlxuICAgICAqIElmIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB5b3VyIHByZWRpY2F0ZXMgYXJlIHZpc2libGUgKGFuZCBlZGl0YWJsZSlcbiAgICAgKiB1c2UgdGhlIFthZGRHZW5lcmF0ZWRMZWFmUHJlZGljYXRlKClde0BsaW5rIFNlYXJjaFNlcnZpY2UjYWRkR2VuZXJhdGVkTGVhZlByZWRpY2F0ZX0gbWV0aG9kIGluc3RlYWQuXG4gICAgICogQHBhcmFtIG5ld1ByZWRpY2F0ZSBQcmVkaWNhdGUgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNlYXJjaCBxdWVyaWVzLlxuICAgICAqIEByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYWRkZWQgUHJlZGljYXRlXG4gICAgICovXG4gICAgcHVibGljIGFkZFByZWRpY2F0ZShuZXdQcmVkaWNhdGU6IFByZWRpY2F0ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290UHJlZGljYXRlLmFkZFByZWRpY2F0ZShuZXdQcmVkaWNhdGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbmV3IGhpZGRlbiBicmFuY2ggb2YgdGhlIHByZWRpY2F0ZSB0cmVlIHdpdGggYSBzaW5ndWxhciBsZWFmIG5vZGUgY29udGFpbmluZyB0aGUgcHJvdmlkZWQgUXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBwcmVkaWNhdGVzIHRvIHRoZSBzZWFyY2ggdHJlZSAodGhpbmsgaGVhZGVyIHNlYXJjaCksXG4gICAgICogd2hpY2ggY2FuIGJlIG1hZGUgdmlzaWJsZSBhbmQgZWRpdGFibGUgaW4gdGhlIHNlYXJjaCBHVUkgbGF0ZXIuXG4gICAgICogQHBhcmFtIGdlbmVyYXRvciB0aGUgZ2VuZXJhdG9yIHRoYXQgaXMgaW4gc3VjaCBzdGF0ZSwgdGhhdCBpdCBnZW5lcmF0ZXMgdGhlIFF1ZXJ5LCB0aGF0IHNob3VsZCBiZSBhZGRlZCBhcyBicmFuY2gvbGVhZi5cbiAgICAgKiBJZiB0aGUgZ2VuZXJhdG9yIGRvZXNuJ3QgY3VycmVudGx5IGdlbmVyYXRlIGEgcXVlcnkgYSBub2RlIHdpdGggYW4gZW1wdHkgcXVlcnkgd2lsbCBiZSBhZGRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR2VuZXJhdGVkTGVhZlByZWRpY2F0ZShnZW5lcmF0b3I6IENhdGVnb3J5PGFueT4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBicmFuY2hJZCA9IHRoaXMuX3Jvb3RQcmVkaWNhdGUuYWRkTmV3Q2xhdXNlUHJlZGljYXRlKEJvb2xlYW5PcGVyYXRvci5PUiwgZmFsc2UpO1xuICAgICAgICBjb25zdCBicmFuY2ggPSAoXG4gICAgICAgICAgICB0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLmdldChicmFuY2hJZCkuZ2V0V3JhcHBlZFByZWRpY2F0ZSgpIGFzIHVua25vd24gYXMgRWRpdGFibGVDbGF1c2VQcmVkaWNhdGVXaXRoR2VuZXJhdG9yc1xuICAgICAgICApO1xuICAgICAgICBicmFuY2guYWRkTmV3UHJlZGljYXRlRnJvbUdlbmVyYXRvcihnZW5lcmF0b3IpO1xuICAgICAgICByZXR1cm4gYnJhbmNoSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUge0BsaW5rIFByZWRpY2F0ZX0gb2JqZWN0IGZyb20gdGhlIHByb3ZpZGVkIGluZGV4LiBJZiB0aGUgaW5kZXggaXMgaW52YWxpZCBkb2VzIG5vdGhpbmcuXG4gICAgICogVXBkYXRlcyB0aGUgdGhlIGFjdGl2ZSBGaWx0ZXIgaWYgdGhlIFByZWRpY2F0ZSB0cmVlIHdhcyBhZmZlY3RlZC5cbiAgICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIFByZWRpY2F0ZSB0aGF0IHNob3VsZCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIGNsZWFySW5wdXQgd2hldGhlciB0aGUgaW5wdXQsIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHByZWRpY2F0ZSBzaG91bGQgYmUgY2xlYXJlZFxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVQcmVkaWNhdGUoaW5kZXg6IG51bWJlciwgY2xlYXJJbnB1dCA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3RQcmVkaWNhdGUucmVtb3ZlUHJlZGljYXRlKGluZGV4KSkge1xuICAgICAgICAgICAgdGhpcy5fcHJlZGljYXRlUmVtb3ZlZCQubmV4dCh7aW5kZXgsIGNsZWFySW5wdXR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHtAbGluayBQcmVkaWNhdGV9IG9iamVjdHMgdGhhdCBjb250cmlidXRlIHRvIHRoZSBzZWFyY2guIFVwZGF0ZXMgdGhlIGFjdGl2ZSBGaWx0ZXIgaWYgaXQgd2FzIGFmZmVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNsZWFySGlkZGVuIHdoZXRoZXIgdGhlIGhpZGRlbiBwcmVkaWNhdGVzIHNob3VsZCBiZSBjbGVhcmVkIGFzIHdlbGxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJQcmVkaWNhdGVzKGNsZWFySGlkZGVuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3RQcmVkaWNhdGUuZ2V0UHJlZGljYXRlTWFwKCkuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2lkLCBwcmVkaWNhdGVdIG9mIHRoaXMuX3Jvb3RQcmVkaWNhdGUuZ2V0UHJlZGljYXRlTWFwKCkuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsZWFySGlkZGVuIHx8IHByZWRpY2F0ZS5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVQcmVkaWNhdGUoaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEge0BsaW5rIEZpbHRlcn0gd2l0aCB0aGUgW2Z1bGxUZXh0XXtAbGluayBDYXNlU2VhcmNoUmVxdWVzdEJvZHkjZnVsbFRleHR9IGF0dHJpYnV0ZSBzZXQgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqIElmIGZ1bGwgdGV4dCBmaWx0ZXIgaXMgYWxyZWFkeSBzZXQsIGl0IHdpbGwgYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIHNlYXJjaGVkU3Vic3RyaW5nIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIG9uIGFsbCBmdWxsIHRleHQgZmllbGRzXG4gICAgICovXG4gICAgcHVibGljIHNldEZ1bGxUZXh0RmlsdGVyKHNlYXJjaGVkU3Vic3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZnVsbFRleHRGaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyKCcnLCB0aGlzLl9iYXNlRmlsdGVyLnR5cGUsIHtmdWxsVGV4dDogc2VhcmNoZWRTdWJzdHJpbmd9KTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZ1bGwgdGV4dCBmaWx0ZXIgKGlmIHNldCkuIElmIHRoZSBmdWxsIHRleHQgZmlsdGVyIGlzIG5vdCBzZXQsIGRvZXMgbm90aGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGdWxsVGV4dEZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgd2FzRnVsbHRleHRTZXQgPSB0aGlzLl9mdWxsVGV4dEZpbHRlciAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9mdWxsVGV4dEZpbHRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHdhc0Z1bGx0ZXh0U2V0KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIHByZWRpY2F0ZXMgd2l0aCB0aGUgZ2l2ZW4gaWRzLiBTa2lwcyBpZHMgdGhhdCBkb24ndCBleGlzdC5cbiAgICAgKiBAcGFyYW0gcHJlZGljYXRlSWRzIHRoZSBpZHMgb2YgdGhlIHByZWRpY2F0ZXMgdGhhdCBzaG91bGQgYmUgc2hvd24uXG4gICAgICovXG4gICAgcHVibGljIHNob3cocHJlZGljYXRlSWRzOiBBcnJheTxudW1iZXI+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jvb3RQcmVkaWNhdGUuc2hvd1ByZWRpY2F0ZXMocHJlZGljYXRlSWRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgY3VycmVudCBxdWVyeSBmcm9tIHRoZSBwcmVkaWNhdGUgdHJlZSwgY29tYmluZXMgaXQgd2l0aCB0aGUgYmFzZSBGaWx0ZXIgYW5kIGZ1bGwgdGV4dCBGaWx0ZXIgKGlmIHNldClcbiAgICAgKiBhbmQgdXBkYXRlcyB0aGUgYWN0aXZlIEZpbHRlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlQWN0aXZlRmlsdGVyKCk6IHZvaWQge1xuICAgICAgICBsZXQgYWRkaXRpb25hbEZpbHRlcjogRmlsdGVyO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RQcmVkaWNhdGUucXVlcnkuaXNFbXB0eSkge1xuICAgICAgICAgICAgYWRkaXRpb25hbEZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXIoJycsIHRoaXMuX2Jhc2VGaWx0ZXIudHlwZSwge3F1ZXJ5OiB0aGlzLl9yb290UHJlZGljYXRlLnF1ZXJ5LnZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Z1bGxUZXh0RmlsdGVyKSB7XG4gICAgICAgICAgICBpZiAoYWRkaXRpb25hbEZpbHRlcikge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWx0ZXIgPSBhZGRpdGlvbmFsRmlsdGVyLm1lcmdlKHRoaXMuX2Z1bGxUZXh0RmlsdGVyLCBNZXJnZU9wZXJhdG9yLkFORCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWx0ZXIgPSB0aGlzLl9mdWxsVGV4dEZpbHRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkaXRpb25hbEZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRmlsdGVyLm5leHQodGhpcy5fYmFzZUZpbHRlci5tZXJnZShhZGRpdGlvbmFsRmlsdGVyLCBNZXJnZU9wZXJhdG9yLkFORCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRmlsdGVyLm5leHQodGhpcy5fYmFzZUZpbHRlci5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBwcmVkaWNhdGUgdHJlZSBjb250YWlucyBubyBjb21wbGV0ZSBxdWVyeS5cbiAgICAgKiBPdGhlcndpc2UgcmV0dXJucyB0aGUgc2VyaWFsaXplZCBmb3JtIG9mIHRoZSBjb21wbGV0ZWQgcXVlcmllcyBpbiB0aGUgcHJlZGljYXRlIHRyZWUuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVByZWRpY2F0ZU1ldGFkYXRhKCk6IFByZWRpY2F0ZVRyZWVNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290UHJlZGljYXRlLmNyZWF0ZUdlbmVyYXRvck1ldGFkYXRhKCkgYXMgUHJlZGljYXRlVHJlZU1ldGFkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHByZWRpY2F0ZSBmaWx0ZXIgYnkgdGhlIG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBnZW5lcmF0b3IgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBUaGUge0BsaW5rIENhdGVnb3J5RmFjdG9yeX0gaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhpcyBzZXJ2aWNlIGlmIHdlIHdhbnQgdG8gdXNlIHRoaXMgbWV0aG9kLiBMb2dzIGFuIGVycm9yIGFuZCBkb2VzIG5vdGhpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgYGZpbHRlclR5cGVgIG9mIHRoaXMgc2VhcmNoIHNlcnZpY2UgbXVzdCBtYXRjaCB0aGUgYGZpbHRlclR5cGVgIG9mIHRoZSBwcm92aWRlZCBtZXRhZGF0YS4gT3RoZXJ3aXNlIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgc2VyaWFsaXplZCBzdGF0ZSBvZiB0aGUgcHJlZGljYXRlIHRyZWUgdGhhdCBzaG91bGQgYmUgcmVzdG9yZWQgdG8gdGhpcyBzZWFyY2ggc2VydmljZVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkRnJvbU1ldGFkYXRhKG1ldGFkYXRhOiBGaWx0ZXJNZXRhZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5fY2F0ZWdvcnlGYWN0b3J5ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0EgQ2F0ZWdvcnlGYWN0b3J5IGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSBTZWFyY2hTZXJ2aWNlJ1xuICAgICAgICAgICAgICAgICsgJyBpZiB5b3Ugd2FudCB0byByZWNvbnN0cnVjdCBhIHByZWRpY2F0ZSBmaWx0ZXIgZnJvbSBzYXZlZCBtZXRhZGF0YScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGFkYXRhLmZpbHRlclR5cGUgIT09IHRoaXMuZmlsdGVyVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFRoZSBmaWx0ZXIgdHlwZSBvZiB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgKCR7bWV0YWRhdGEuZmlsdGVyVHlwZVxuICAgICAgICAgICAgfSkgZG9lcyBub3QgbWF0Y2ggdGhlIGZpbHRlciB0eXBlIG9mIHRoZSBzZWFyY2ggc2VydmljZSAoJHt0aGlzLmZpbHRlclR5cGV9KSFgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJQcmVkaWNhdGVzKHRydWUpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nRnJvbU1ldGFkYXRhJC5vbigpO1xuXG4gICAgICAgIGNvbnN0IGdlbmVyYXRvck9ic2VydmFibGVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjbGF1c2Ugb2YgbWV0YWRhdGEucHJlZGljYXRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaElkID0gdGhpcy5fcm9vdFByZWRpY2F0ZS5hZGROZXdDbGF1c2VQcmVkaWNhdGUoQm9vbGVhbk9wZXJhdG9yLk9SKTtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaFByZWRpY2F0ZSA9IChcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLmdldChicmFuY2hJZClcbiAgICAgICAgICAgICAgICAgICAgLmdldFdyYXBwZWRQcmVkaWNhdGUoKSBhcyB1bmtub3duIGFzIEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByZWRpY2F0ZSBvZiBjbGF1c2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEJyYW5jaFJlZmVyZW5jZSA9IGJyYW5jaFByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3JPYnNlcnZhYmxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYXRlZ29yeUZhY3RvcnkuZ2V0RnJvbU1ldGFkYXRhKHByZWRpY2F0ZSkucGlwZSh0YXAoZ2VuZXJhdG9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQnJhbmNoUmVmZXJlbmNlLmFkZE5ld1ByZWRpY2F0ZUZyb21HZW5lcmF0b3IoZ2VuZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcmtKb2luKGdlbmVyYXRvck9ic2VydmFibGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQub2ZmKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBBcnJheSBvZiBmaWx0ZXIgdGV4dCBzZWdtZW50cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY29tcGxldGVkIHByZWRpY2F0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyVGV4dFNlZ21lbnRzKCk6IEFycmF5PEZpbHRlclRleHRTZWdtZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290UHJlZGljYXRlLmNyZWF0ZUZpbHRlclRleHRTZWdtZW50cygpO1xuICAgIH1cbn1cbiJdfQ==
|
|
406
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL3NlYXJjaC1zZXJ2aWNlL3NlYXJjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRWxGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFHakUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMscUNBQXFDLEVBQUMsTUFBTSwrREFBK0QsQ0FBQztBQUdwSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUVyRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFJN0Q7O0dBRUc7QUFDSDtJQThCSTs7Ozs7OztPQU9HO0lBQ0gsdUJBQXNCLElBQW1CLEVBQ1AsZ0JBQWlDLEVBQzlCLFVBQXNCO1FBRjNELGlCQTJCQztRQTNCcUIsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUNQLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7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LENBQUM7WUFDakMsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnREFBd0IsR0FBL0I7UUFDSSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUMxRCxDQUFDOztnQkFoVDJCLGFBQWE7Z0JBQ1csZUFBZSx1QkFBdEQsUUFBUTtnREFDUixNQUFNLFNBQUMsZUFBZTs7O2dCQXhDdEMsVUFBVTs7O2dCQVZILGFBQWE7Z0JBQ2IsZUFBZSx1QkFnRE4sUUFBUTtnREFDUixNQUFNLFNBQUMsZUFBZTs7SUErU3ZDLG9CQUFDO0NBQUEsQUF2VkQsSUF1VkM7U0F0VlksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Qm9vbGVhbk9wZXJhdG9yfSBmcm9tICcuLi9tb2RlbHMvYm9vbGVhbi1vcGVyYXRvcic7XG5pbXBvcnQge0ZpbHRlcn0gZnJvbSAnLi4vLi4vZmlsdGVyL21vZGVscy9maWx0ZXInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtQcmVkaWNhdGV9IGZyb20gJy4uL21vZGVscy9wcmVkaWNhdGUvcHJlZGljYXRlJztcbmltcG9ydCB7U2ltcGxlRmlsdGVyfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL3NpbXBsZS1maWx0ZXInO1xuaW1wb3J0IHtNZXJnZU9wZXJhdG9yfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL21lcmdlLW9wZXJhdG9yJztcbmltcG9ydCB7UHJlZGljYXRlUmVtb3ZhbEV2ZW50fSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlLXJlbW92YWwtZXZlbnQnO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vbW9kZWxzL3F1ZXJ5L3F1ZXJ5JztcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0VkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnN9IGZyb20gJy4uL21vZGVscy9wcmVkaWNhdGUvZWRpdGFibGUtY2xhdXNlLXByZWRpY2F0ZS13aXRoLWdlbmVyYXRvcnMnO1xuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2NhdGVnb3J5JztcbmltcG9ydCB7UHJlZGljYXRlVHJlZU1ldGFkYXRhfSBmcm9tICcuLi9tb2RlbHMvcGVyc2lzdGFuY2UvZ2VuZXJhdG9yLW1ldGFkYXRhJztcbmltcG9ydCB7TkFFX0JBU0VfRklMVEVSfSBmcm9tICcuLi9tb2RlbHMvYmFzZS1maWx0ZXItaW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7QmFzZUZpbHRlcn0gZnJvbSAnLi4vbW9kZWxzL2Jhc2UtZmlsdGVyJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7Q2F0ZWdvcnlGYWN0b3J5fSBmcm9tICcuLi9jYXRlZ29yeS1mYWN0b3J5L2NhdGVnb3J5LWZhY3RvcnknO1xuaW1wb3J0IHtGaWx0ZXJUeXBlfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL2ZpbHRlci10eXBlJztcbmltcG9ydCB7TG9hZGluZ0VtaXR0ZXJ9IGZyb20gJy4uLy4uL3V0aWxpdHkvbG9hZGluZy1lbWl0dGVyJztcbmltcG9ydCB7RmlsdGVyTWV0YWRhdGF9IGZyb20gJy4uL21vZGVscy9wZXJzaXN0YW5jZS9maWx0ZXItbWV0YWRhdGEnO1xuaW1wb3J0IHtGaWx0ZXJUZXh0U2VnbWVudH0gZnJvbSAnLi4vbW9kZWxzL3BlcnNpc3RhbmNlL2ZpbHRlci10ZXh0LXNlZ21lbnQnO1xuXG4vKipcbiAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWx0ZXIgdGhhdCBpcyBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgdmlldyBjb21wb25lbnQsIHRoYXQgcHJvdmlkZXMgdGhpcyBzZXJ2aWNlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlYXJjaFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIEZpbHRlcn0gdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSB2aWV3LCBldmVuIGlmIHRoZSB1c2VyIGRvZXNuJ3Qgc2VhcmNoIGFueXRoaW5nLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYmFzZUZpbHRlcjogRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIEhvbGRzIHRoZSB7QGxpbmsgUHJlZGljYXRlfSB0cmVlIHJvb3QgZm9yIHVzZXIgc2VhcmNoIHF1ZXJpZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yb290UHJlZGljYXRlOiBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzO1xuICAgIC8qKlxuICAgICAqIEhvbGRzIHRoZSB7QGxpbmsgRmlsdGVyfSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBhcHBsaWVkIHRvIHRoZSB2aWV3LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYWN0aXZlRmlsdGVyOiBCZWhhdmlvclN1YmplY3Q8RmlsdGVyPjtcbiAgICAvKipcbiAgICAgKiBIb2xkcyB0aGUgZnVsbCB0ZXh0IHtAbGluayBGaWx0ZXJ9IGlmIHNldCwgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZnVsbFRleHRGaWx0ZXI6IFNpbXBsZUZpbHRlciB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgYSByZW1vdmVkIHtAbGluayBQcmVkaWNhdGV9IGlzIGVtbWl0ZWQgaW50byB0aGlzIHN0cmVhbVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcHJlZGljYXRlUmVtb3ZlZCQ6IFN1YmplY3Q8UHJlZGljYXRlUmVtb3ZhbEV2ZW50PjtcbiAgICBwcm90ZWN0ZWQgX2xvYWRpbmdGcm9tTWV0YWRhdGEkOiBMb2FkaW5nRW1pdHRlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHJvb3RQcmVkaWNhdGVgIHVzZXMgdGhpcyBzdHJlYW0gdG8gbm90aWZ5IHRoZSBzZWFyY2ggc2VydmljZSBhYm91dCBjaGFuZ2VzIHRvIHRoZSBoZWxkIHF1ZXJ5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcHJlZGljYXRlUXVlcnlDaGFuZ2VkJDogU3ViamVjdDx2b2lkPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YkZpbHRlcjogU3Vic2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHtAbGluayBQcmVkaWNhdGV9IHRyZWUgcm9vdCB1c2VzIGFuIFtBTkRde0BsaW5rIEJvb2xlYW5PcGVyYXRvciNBTkR9IG9wZXJhdG9yIHRvIGNvbWJpbmUgdGhlIFByZWRpY2F0ZXMuXG4gICAgICogQHBhcmFtIF9sb2cge0BsaW5rIExvZ2dlclNlcnZpY2V9XG4gICAgICogQHBhcmFtIF9jYXRlZ29yeUZhY3RvcnkgYSB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSBpbnN0YW5jZS4gVGhpcyBkZXBlbmRlbmN5IGlzIG9wdGlvbmFsLlxuICAgICAqIEl0IGlzIHJlcXVpcmVkIGlmIHdlIHdhbnQgdG8gbG9hZCBwcmVkaWNhdGUgZmlsdGVyIGZyb20gc2F2ZWQgbWV0YWRhdGFcbiAgICAgKiBAcGFyYW0gYmFzZUZpbHRlciBGaWx0ZXIgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdmlldyB3aGVuIG5vIHNlYXJjaGluZyBpcyBiZWluZyBwZXJmb3JtZWQuXG4gICAgICogSW5qZWN0ZWQgdHJvdWdoIHRoZSB7QGxpbmsgTkFFX0JBU0VfRklMVEVSfSBpbmplY3Rpb24gdG9rZW4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIF9jYXRlZ29yeUZhY3Rvcnk6IENhdGVnb3J5RmFjdG9yeSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9CQVNFX0ZJTFRFUikgYmFzZUZpbHRlcjogQmFzZUZpbHRlcikge1xuICAgICAgICBpZiAoYmFzZUZpbHRlci5maWx0ZXIgaW5zdGFuY2VvZiBGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIgPSBiYXNlRmlsdGVyLmZpbHRlci5jbG9uZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJhc2VGaWx0ZXIuZmlsdGVyIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZUZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXIoJycsIGJhc2VGaWx0ZXIuZmlsdGVyVHlwZSwge3Byb2Nlc3M6IHtpZGVudGlmaWVyOiAnX19FTVBUWV9fJ319KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgQmFzZUZpbHRlciBpbnB1dCEgWW91IG11c3QgcHJvdmlkZSB0aGUgTkFFX0JBU0VfRklMVEVSIGluamVjdGlvbiB0b2tlbiB3aXRoIHByb3BlciB2YWx1ZXMhJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmVkaWNhdGVRdWVyeUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZSA9IG5ldyBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzKEJvb2xlYW5PcGVyYXRvci5BTkQsIHRoaXMuX3ByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsdGVyPih0aGlzLl9iYXNlRmlsdGVyKTtcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlUmVtb3ZlZCQgPSBuZXcgU3ViamVjdDxQcmVkaWNhdGVSZW1vdmFsRXZlbnQ+KCk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG5cbiAgICAgICAgaWYgKGJhc2VGaWx0ZXIuZmlsdGVyIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zdWJGaWx0ZXIgPSBiYXNlRmlsdGVyLmZpbHRlci5zdWJzY3JpYmUoKGZpbHRlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIgPSBmaWx0ZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wcmVkaWNhdGVSZW1vdmVkJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlUXVlcnlDaGFuZ2VkJC5jb21wbGV0ZSgpO1xuICAgICAgICBpZiAodGhpcy5zdWJGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViRmlsdGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZS5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIEZpbHRlciB0aGF0IGlzIGN1cnJlbnRseSBhcHBsaWVkIHRvIHRoZSB2aWV3XG4gICAgICovXG4gICAgcHVibGljIGdldCBhY3RpdmVGaWx0ZXIoKTogRmlsdGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlci5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB0aGF0IHVwZGF0ZXMgZXZlcnkgdGltZSB0aGUgYWN0aXZlIEZpbHRlciBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWN0aXZlRmlsdGVyJCgpOiBPYnNlcnZhYmxlPEZpbHRlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVyLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIGZpbHRlciBvdGhlciB0aGFuIHRoZSBiYXNlIGZpbHRlciBpcyBjdXJyZW50bHkgYXBwbGllZC5cbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgb25seSB0aGUgYmFzZSBmaWx0ZXIgaXMgY3VycmVudGx5IGFwcGxpZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhZGRpdGlvbmFsRmlsdGVyc0FwcGxpZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fcm9vdFByZWRpY2F0ZS5xdWVyeS5pc0VtcHR5IHx8ICEhdGhpcy5fZnVsbFRleHRGaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIGFueSB2aXNpYmxlIHByZWRpY2F0ZXMgYXJlIGFwcGxpZWQuXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGlmIHRoZXJlIGFyZSBubyBwcmVkaWNhdGVzLCBvciBpZiB0aGVyZSBhcmUgb25seSBoaWRkZW4gcHJlZGljYXRlcyBhcHBsaWVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNWaXNpYmxlUHJlZGljYXRlcygpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBwcmVkaWNhdGUgb2YgdGhpcy5fcm9vdFByZWRpY2F0ZS5nZXRQcmVkaWNhdGVNYXAoKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYSBjb3B5IG9mIHRoZSBiYXNlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYmFzZUZpbHRlcigpOiBGaWx0ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZUZpbHRlci5jbG9uZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgaW5kZXggb2YgdGhlIHJlbW92ZWQgcHJlZGljYXRlIHdoZW5ldmVyIGEgcHJlZGljYXRlIGlzIHJlbW92ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByZWRpY2F0ZVJlbW92ZWQkKCk6IE9ic2VydmFibGU8UHJlZGljYXRlUmVtb3ZhbEV2ZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVkaWNhdGVSZW1vdmVkJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgcm9vdCBwcmVkaWNhdGUgb2YgdGhlIHNlYXJjaCBzZXJ2aWNlLCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHNlYXJjaCByZXF1ZXN0cyB3aXRoIGN1c3RvbSBxdWVyaWVzXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290UHJlZGljYXRlKCk6IEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnMge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFByZWRpY2F0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyIGhlbGQgaW4gdGhpcyBzZWFyY2ggc2VydmljZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyVHlwZSgpOiBGaWx0ZXJUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUZpbHRlci50eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHNlYXJjaCBzZXJ2aWNlIGlzIGN1cnJlbnRseSBsb2FkaW5nIGl0cyBzdGF0ZSBmcm9tIG1ldGFkYXRhIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIFNlZSBbbG9hZEZyb21NZXRhZGF0YSgpXXtAbGluayBTZWFyY2hTZXJ2aWNlI2xvYWRGcm9tTWV0YWRhdGF9XG4gICAgICovXG4gICAgcHVibGljIGdldCBsb2FkaW5nRnJvbU1ldGFkYXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgZW1pdHMgYHRydWVgIGlmIHRoZSBzZWFyY2ggc2VydmljZSBpcyBjdXJyZW50bHkgbG9hZGluZyBpdHMgc3RhdGUgZnJvbSBtZXRhZGF0YSxcbiAgICAgKiBlbWl0cyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIFNlZSBbbG9hZEZyb21NZXRhZGF0YSgpXXtAbGluayBTZWFyY2hTZXJ2aWNlI2xvYWRGcm9tTWV0YWRhdGF9XG4gICAgICovXG4gICAgcHVibGljIGdldCBsb2FkaW5nRnJvbU1ldGFkYXRhJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcm9vdCBwcmVkaWNhdGVzIHF1ZXJ5IGNoYW5nZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQoKTogT2JzZXJ2YWJsZTxRdWVyeT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJlZGljYXRlUXVlcnlDaGFuZ2VkJC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuX3Jvb3RQcmVkaWNhdGUucXVlcnkpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IHByZXYgJiYgcHJldi5lcXVhbHMoY3VycikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHtAbGluayBQcmVkaWNhdGV9IHRvIHRoZSBQcmVkaWNhdGUgcm9vdCBhbmQgdXBkYXRlcyB0aGUgYWN0aXZlIEZpbHRlci5cbiAgICAgKlxuICAgICAqIFByZWRpY2F0ZXMgYWRkZWQgdGhpcyB3YXkgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiB0aGUgc2VhcmNoIEdVSS5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91ciBwcmVkaWNhdGVzIGFyZSB2aXNpYmxlIChhbmQgZWRpdGFibGUpXG4gICAgICogdXNlIHRoZSBbYWRkR2VuZXJhdGVkTGVhZlByZWRpY2F0ZSgpXXtAbGluayBTZWFyY2hTZXJ2aWNlI2FkZEdlbmVyYXRlZExlYWZQcmVkaWNhdGV9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqIEBwYXJhbSBuZXdQcmVkaWNhdGUgUHJlZGljYXRlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggcXVlcmllcy5cbiAgICAgKiBAcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGFkZGVkIFByZWRpY2F0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRQcmVkaWNhdGUobmV3UHJlZGljYXRlOiBQcmVkaWNhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFByZWRpY2F0ZS5hZGRQcmVkaWNhdGUobmV3UHJlZGljYXRlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBoaWRkZW4gYnJhbmNoIG9mIHRoZSBwcmVkaWNhdGUgdHJlZSB3aXRoIGEgc2luZ3VsYXIgbGVhZiBub2RlIGNvbnRhaW5pbmcgdGhlIHByb3ZpZGVkIFF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgcHJlZGljYXRlcyB0byB0aGUgc2VhcmNoIHRyZWUgKHRoaW5rIGhlYWRlciBzZWFyY2gpLFxuICAgICAqIHdoaWNoIGNhbiBiZSBtYWRlIHZpc2libGUgYW5kIGVkaXRhYmxlIGluIHRoZSBzZWFyY2ggR1VJIGxhdGVyLlxuICAgICAqIEBwYXJhbSBnZW5lcmF0b3IgdGhlIGdlbmVyYXRvciB0aGF0IGlzIGluIHN1Y2ggc3RhdGUsIHRoYXQgaXQgZ2VuZXJhdGVzIHRoZSBRdWVyeSwgdGhhdCBzaG91bGQgYmUgYWRkZWQgYXMgYnJhbmNoL2xlYWYuXG4gICAgICogSWYgdGhlIGdlbmVyYXRvciBkb2Vzbid0IGN1cnJlbnRseSBnZW5lcmF0ZSBhIHF1ZXJ5IGEgbm9kZSB3aXRoIGFuIGVtcHR5IHF1ZXJ5IHdpbGwgYmUgYWRkZWQuXG4gICAgICovXG4gICAgcHVibGljIGFkZEdlbmVyYXRlZExlYWZQcmVkaWNhdGUoZ2VuZXJhdG9yOiBDYXRlZ29yeTxhbnk+KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYnJhbmNoSWQgPSB0aGlzLl9yb290UHJlZGljYXRlLmFkZE5ld0NsYXVzZVByZWRpY2F0ZShCb29sZWFuT3BlcmF0b3IuT1IsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgYnJhbmNoID0gKFxuICAgICAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZS5nZXRQcmVkaWNhdGVNYXAoKS5nZXQoYnJhbmNoSWQpLmdldFdyYXBwZWRQcmVkaWNhdGUoKSBhcyB1bmtub3duIGFzIEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnNcbiAgICAgICAgKTtcbiAgICAgICAgYnJhbmNoLmFkZE5ld1ByZWRpY2F0ZUZyb21HZW5lcmF0b3IoZ2VuZXJhdG9yKTtcbiAgICAgICAgcmV0dXJuIGJyYW5jaElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHtAbGluayBQcmVkaWNhdGV9IG9iamVjdCBmcm9tIHRoZSBwcm92aWRlZCBpbmRleC4gSWYgdGhlIGluZGV4IGlzIGludmFsaWQgZG9lcyBub3RoaW5nLlxuICAgICAqIFVwZGF0ZXMgdGhlIHRoZSBhY3RpdmUgRmlsdGVyIGlmIHRoZSBQcmVkaWNhdGUgdHJlZSB3YXMgYWZmZWN0ZWQuXG4gICAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBQcmVkaWNhdGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBjbGVhcklucHV0IHdoZXRoZXIgdGhlIGlucHV0LCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwcmVkaWNhdGUgc2hvdWxkIGJlIGNsZWFyZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlUHJlZGljYXRlKGluZGV4OiBudW1iZXIsIGNsZWFySW5wdXQgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9yb290UHJlZGljYXRlLnJlbW92ZVByZWRpY2F0ZShpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZVJlbW92ZWQkLm5leHQoe2luZGV4LCBjbGVhcklucHV0fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB7QGxpbmsgUHJlZGljYXRlfSBvYmplY3RzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgc2VhcmNoLiBVcGRhdGVzIHRoZSBhY3RpdmUgRmlsdGVyIGlmIGl0IHdhcyBhZmZlY3RlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbGVhckhpZGRlbiB3aGV0aGVyIHRoZSBoaWRkZW4gcHJlZGljYXRlcyBzaG91bGQgYmUgY2xlYXJlZCBhcyB3ZWxsXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyUHJlZGljYXRlcyhjbGVhckhpZGRlbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwgcHJlZGljYXRlXSBvZiB0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChjbGVhckhpZGRlbiB8fCBwcmVkaWNhdGUuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlUHJlZGljYXRlKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHtAbGluayBGaWx0ZXJ9IHdpdGggdGhlIFtmdWxsVGV4dF17QGxpbmsgQ2FzZVNlYXJjaFJlcXVlc3RCb2R5I2Z1bGxUZXh0fSBhdHRyaWJ1dGUgc2V0IHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKiBJZiBmdWxsIHRleHQgZmlsdGVyIGlzIGFscmVhZHkgc2V0LCBpdCB3aWxsIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBzZWFyY2hlZFN1YnN0cmluZyB2YWx1ZSB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBvbiBhbGwgZnVsbCB0ZXh0IGZpZWxkc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGdWxsVGV4dEZpbHRlcihzZWFyY2hlZFN1YnN0cmluZzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdoaXRlU3BhY2VkU3Vic3RyaW5nID0gc2VhcmNoZWRTdWJzdHJpbmcucmVwbGFjZSgnICcsICdcXFxcICcpO1xuICAgICAgICB0aGlzLl9mdWxsVGV4dEZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXIoJycsIHRoaXMuX2Jhc2VGaWx0ZXIudHlwZSwge2Z1bGxUZXh0OiB3aGl0ZVNwYWNlZFN1YnN0cmluZ30pO1xuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZnVsbCB0ZXh0IGZpbHRlciAoaWYgc2V0KS4gSWYgdGhlIGZ1bGwgdGV4dCBmaWx0ZXIgaXMgbm90IHNldCwgZG9lcyBub3RoaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZ1bGxUZXh0RmlsdGVyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB3YXNGdWxsdGV4dFNldCA9IHRoaXMuX2Z1bGxUZXh0RmlsdGVyICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2Z1bGxUZXh0RmlsdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAod2FzRnVsbHRleHRTZXQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgcHJlZGljYXRlcyB3aXRoIHRoZSBnaXZlbiBpZHMuIFNraXBzIGlkcyB0aGF0IGRvbid0IGV4aXN0LlxuICAgICAqIEBwYXJhbSBwcmVkaWNhdGVJZHMgdGhlIGlkcyBvZiB0aGUgcHJlZGljYXRlcyB0aGF0IHNob3VsZCBiZSBzaG93bi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvdyhwcmVkaWNhdGVJZHM6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZS5zaG93UHJlZGljYXRlcyhwcmVkaWNhdGVJZHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWRzIHRoZSBjdXJyZW50IHF1ZXJ5IGZyb20gdGhlIHByZWRpY2F0ZSB0cmVlLCBjb21iaW5lcyBpdCB3aXRoIHRoZSBiYXNlIEZpbHRlciBhbmQgZnVsbCB0ZXh0IEZpbHRlciAoaWYgc2V0KVxuICAgICAqIGFuZCB1cGRhdGVzIHRoZSBhY3RpdmUgRmlsdGVyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVBY3RpdmVGaWx0ZXIoKTogdm9pZCB7XG4gICAgICAgIGxldCBhZGRpdGlvbmFsRmlsdGVyOiBGaWx0ZXI7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdFByZWRpY2F0ZS5xdWVyeS5pc0VtcHR5KSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsRmlsdGVyID0gbmV3IFNpbXBsZUZpbHRlcignJywgdGhpcy5fYmFzZUZpbHRlci50eXBlLCB7cXVlcnk6IHRoaXMuX3Jvb3RQcmVkaWNhdGUucXVlcnkudmFsdWV9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZnVsbFRleHRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpbHRlciA9IGFkZGl0aW9uYWxGaWx0ZXIubWVyZ2UodGhpcy5fZnVsbFRleHRGaWx0ZXIsIE1lcmdlT3BlcmF0b3IuQU5EKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpbHRlciA9IHRoaXMuX2Z1bGxUZXh0RmlsdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhZGRpdGlvbmFsRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIubmV4dCh0aGlzLl9iYXNlRmlsdGVyLm1lcmdlKGFkZGl0aW9uYWxGaWx0ZXIsIE1lcmdlT3BlcmF0b3IuQU5EKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIubmV4dCh0aGlzLl9iYXNlRmlsdGVyLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHByZWRpY2F0ZSB0cmVlIGNvbnRhaW5zIG5vIGNvbXBsZXRlIHF1ZXJ5LlxuICAgICAqIE90aGVyd2lzZSByZXR1cm5zIHRoZSBzZXJpYWxpemVkIGZvcm0gb2YgdGhlIGNvbXBsZXRlZCBxdWVyaWVzIGluIHRoZSBwcmVkaWNhdGUgdHJlZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUHJlZGljYXRlTWV0YWRhdGEoKTogUHJlZGljYXRlVHJlZU1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RQcmVkaWNhdGUuY3JlYXRlR2VuZXJhdG9yTWV0YWRhdGEoKSBhcyBQcmVkaWNhdGVUcmVlTWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcHJlZGljYXRlIGZpbHRlciBieSB0aGUgb25lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIGdlbmVyYXRvciBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIFRoZSB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGlzIHNlcnZpY2UgaWYgd2Ugd2FudCB0byB1c2UgdGhpcyBtZXRob2QuIExvZ3MgYW4gZXJyb3IgYW5kIGRvZXMgbm90aGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgZmlsdGVyVHlwZWAgb2YgdGhpcyBzZWFyY2ggc2VydmljZSBtdXN0IG1hdGNoIHRoZSBgZmlsdGVyVHlwZWAgb2YgdGhlIHByb3ZpZGVkIG1ldGFkYXRhLiBPdGhlcndpc2UgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGFkYXRhIHRoZSBzZXJpYWxpemVkIHN0YXRlIG9mIHRoZSBwcmVkaWNhdGUgdHJlZSB0aGF0IHNob3VsZCBiZSByZXN0b3JlZCB0byB0aGlzIHNlYXJjaCBzZXJ2aWNlXG4gICAgICovXG4gICAgcHVibGljIGxvYWRGcm9tTWV0YWRhdGEobWV0YWRhdGE6IEZpbHRlck1ldGFkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYXRlZ29yeUZhY3RvcnkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcignQSBDYXRlZ29yeUZhY3RvcnkgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlIFNlYXJjaFNlcnZpY2UnXG4gICAgICAgICAgICAgICAgKyAnIGlmIHlvdSB3YW50IHRvIHJlY29uc3RydWN0IGEgcHJlZGljYXRlIGZpbHRlciBmcm9tIHNhdmVkIG1ldGFkYXRhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyVHlwZSAhPT0gdGhpcy5maWx0ZXJUeXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgVGhlIGZpbHRlciB0eXBlIG9mIHRoZSBwcm92aWRlZCBtZXRhZGF0YSAoJHttZXRhZGF0YS5maWx0ZXJUeXBlXG4gICAgICAgICAgICB9KSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsdGVyIHR5cGUgb2YgdGhlIHNlYXJjaCBzZXJ2aWNlICgke3RoaXMuZmlsdGVyVHlwZX0pIWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclByZWRpY2F0ZXModHJ1ZSk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkLm9uKCk7XG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdG9yT2JzZXJ2YWJsZXMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBtZXRhZGF0YS5wcmVkaWNhdGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYnJhbmNoSWQgPSB0aGlzLl9yb290UHJlZGljYXRlLmFkZE5ld0NsYXVzZVByZWRpY2F0ZShCb29sZWFuT3BlcmF0b3IuT1IpO1xuICAgICAgICAgICAgY29uc3QgYnJhbmNoUHJlZGljYXRlID0gKFxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RQcmVkaWNhdGUuZ2V0UHJlZGljYXRlTWFwKCkuZ2V0KGJyYW5jaElkKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0V3JhcHBlZFByZWRpY2F0ZSgpIGFzIHVua25vd24gYXMgRWRpdGFibGVDbGF1c2VQcmVkaWNhdGVXaXRoR2VuZXJhdG9yc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJlZGljYXRlIG9mIGNsYXVzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsQnJhbmNoUmVmZXJlbmNlID0gYnJhbmNoUHJlZGljYXRlO1xuICAgICAgICAgICAgICAgIGdlbmVyYXRvck9ic2VydmFibGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhdGVnb3J5RmFjdG9yeS5nZXRGcm9tTWV0YWRhdGEocHJlZGljYXRlKS5waXBlKHRhcChnZW5lcmF0b3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxCcmFuY2hSZWZlcmVuY2UuYWRkTmV3UHJlZGljYXRlRnJvbUdlbmVyYXRvcihnZW5lcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9ya0pvaW4oZ2VuZXJhdG9yT2JzZXJ2YWJsZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nRnJvbU1ldGFkYXRhJC5vZmYoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IG9mIGZpbHRlciB0ZXh0IHNlZ21lbnRzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBjb21wbGV0ZWQgcHJlZGljYXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGaWx0ZXJUZXh0U2VnbWVudHMoKTogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RQcmVkaWNhdGUuY3JlYXRlRmlsdGVyVGV4dFNlZ21lbnRzKCk7XG4gICAgfVxufVxuIl19
|