@huntsman-cancer-institute/cod 16.1.0 → 16.1.1
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.
|
@@ -829,7 +829,7 @@ export class AttributeService {
|
|
|
829
829
|
let avs = this.attributeValueSetSubject.getValue();
|
|
830
830
|
//Remove all old values for row
|
|
831
831
|
let index = avs.attributeValues.findIndex((av) => (av.groupAttributeRowId === groupAttributeRowId && av.idGroupAttribute === idGroupAttribute));
|
|
832
|
-
while (index
|
|
832
|
+
while (index >= 0) {
|
|
833
833
|
//Remove value
|
|
834
834
|
avs.attributeValues.splice(index, 1);
|
|
835
835
|
//Find the next one
|
|
@@ -878,6 +878,46 @@ export class AttributeService {
|
|
|
878
878
|
this.loadingSubject.next(false);
|
|
879
879
|
});
|
|
880
880
|
}
|
|
881
|
+
/**
|
|
882
|
+
* Used to refresh a grid row after plugin execution without affecting other attribute values
|
|
883
|
+
* Normally saving the grid row updates the values, but some applications execute a subsequent plugin and need an extra refresh to pick up changes.
|
|
884
|
+
*
|
|
885
|
+
* @param {AttributeValueGridRow} avgr
|
|
886
|
+
*/
|
|
887
|
+
refreshGridRow(avgr) {
|
|
888
|
+
let url = this.attributeEndpoint + "attribute-value-grid-row/";
|
|
889
|
+
let ac = this.attributeConfigurationSubject.getValue();
|
|
890
|
+
let queryParams = new HttpParams()
|
|
891
|
+
.set("idGroupAttribute", avgr.idGroupAttribute)
|
|
892
|
+
.set("groupAttributeRowId", avgr.groupAttributeRowId)
|
|
893
|
+
.set("idAttributeValueSet", avgr.idAttributeValueSet)
|
|
894
|
+
.set("codeAttributeSecurityContext", ac.codeAttributeSecurityContext)
|
|
895
|
+
.set("codeAttributeContext", ac.codeAttributeContext)
|
|
896
|
+
.set("idParentObject", (this.idParentObject) ? this.idParentObject.toString() : "");
|
|
897
|
+
this.loadingSubject.next(true);
|
|
898
|
+
this.http.get(url, { params: queryParams }).subscribe((attributeValueGridRow) => {
|
|
899
|
+
//Note that the sliced and updated values for the grid row were already cleaned up during the save
|
|
900
|
+
//Remove the grid row from the original attribute values
|
|
901
|
+
let avs = this.attributeValueSetSubject.getValue();
|
|
902
|
+
//Remove all old values for row
|
|
903
|
+
let index = avs.attributeValues.findIndex((av) => (av.groupAttributeRowId === attributeValueGridRow.groupAttributeRowId && av.idGroupAttribute === attributeValueGridRow.idGroupAttribute));
|
|
904
|
+
while (index >= 0) {
|
|
905
|
+
//Remove value
|
|
906
|
+
avs.attributeValues.splice(index, 1);
|
|
907
|
+
//Find the next one
|
|
908
|
+
index = avs.attributeValues.findIndex((av) => (av.groupAttributeRowId === attributeValueGridRow.groupAttributeRowId && av.idGroupAttribute === attributeValueGridRow.idGroupAttribute));
|
|
909
|
+
}
|
|
910
|
+
//Add all the current values
|
|
911
|
+
for (let i = 0; i < attributeValueGridRow.attributeValues.length; i++) {
|
|
912
|
+
avs.attributeValues.push(attributeValueGridRow.attributeValues[i]);
|
|
913
|
+
}
|
|
914
|
+
this.attributeValueSetSubject.next(avs);
|
|
915
|
+
this.loadingSubject.next(false);
|
|
916
|
+
}, (error) => {
|
|
917
|
+
console.error(error);
|
|
918
|
+
this.loadingSubject.next(false);
|
|
919
|
+
});
|
|
920
|
+
}
|
|
881
921
|
/**
|
|
882
922
|
* Push an attribute to the attribute map.
|
|
883
923
|
*
|
|
@@ -1209,4 +1249,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1209
1249
|
type: Inject,
|
|
1210
1250
|
args: [ATTRIBUTE_ENDPOINT]
|
|
1211
1251
|
}] }]; } });
|
|
1212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE4QzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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QUFLLFNBQVMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7K0dBbjVDVSxnQkFBZ0IsbUdBaURQLGtCQUFrQjttSEFqRDNCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7MEJBa0RJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBpc0Rldk1vZGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cFBhcmFtc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7Um91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIFN1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tIFwiQGh1bnRzbWFuLWNhbmNlci1pbnN0aXR1dGUvZGljdGlvbmFyeS1zZXJ2aWNlXCI7XHJcblxyXG5pbXBvcnQge0F0dHJpYnV0ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDaG9pY2V9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY2hvaWNlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZVZhbHVlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZVNldH0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS1zZXQuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT30gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb25maWd1cmF0aW9uLmR0b1wiO1xyXG5pbXBvcnQge0dyYXBoaWNhbEF0dHJpYnV0ZX0gZnJvbSBcIi4uL21vZGVsL2dyYXBoaWNhbC1hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ29udGFpbmVyfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbnRhaW5lci5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZUdyaWRSb3d9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cuZW50aXR5XCI7XHJcbmltcG9ydCB7UHJlRXZhbERUT30gZnJvbSBcIi4uL21vZGVsL3ByZS1ldmFsLmR0b1wiO1xyXG5pbXBvcnQge0RpY3Rpb25hcnlFbnRyaWVzRFRPfSBmcm9tIFwiLi4vbW9kZWwvZGljdGlvbmFyeS1lbnRyaWVzLmR0b1wiO1xyXG5cclxuXHJcbmV4cG9ydCBsZXQgQVRUUklCVVRFX0VORFBPSU5UID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdHRyaWJ1dGVFbmRwb2ludFwiKTtcclxuZXhwb3J0IGNvbnN0IEJPT0xFQU46IHN0cmluZ1tdID0gW1wiTlwiLCBcIllcIl07XHJcbmV4cG9ydCBjb25zdCBFWFRFTkRFRF9CT09MRUFOOiBzdHJpbmdbXSA9IFtcIk5cIiwgXCJZXCIsIFwiVVwiXTtcclxuXHJcbi8qKlxyXG4gKiBBIHNlcnZpY2UgY3JlYXRlZCBmb3IgZWFjaCBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBpbnN0YW5jZS4gIFRoaXMgbWFrZXMgY2FsbHMgdG8gdGhlIGJhY2tlbmQgdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uXHJcbiAqIGFuZCB2YWx1ZSBzZXQuICBJdCBhbHNvIHN0b3JlcyBjb21tb24gZGF0YSB0aGF0IGRpZmZlcmVudCBhdHRyaWJ1dGVzIG1pZ2h0IG5lZWQgKGUuZy4gYSBsaXN0IG9mIGF0dHJpYnV0ZSBjaG9pY2VzKS5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZVNlcnZpY2Uge1xyXG5cclxuICBuZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG4gIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogbnVtYmVyO1xyXG4gIGlkRmlsdGVyMTogbnVtYmVyO1xyXG4gIGlkRmlsdGVyMjogbnVtYmVyO1xyXG4gIGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlcjtcclxuICBpZFBhcmVudE9iamVjdDogbnVtYmVyO1xyXG4gIGJvdW5kRGF0YTogYW55O1xyXG5cclxuICBhdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBhdHRyaWJ1dGVDb250ZXh0TGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBmaWx0ZXIxTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGZpbHRlcjJMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZGljdGlvbmFyeUxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuXHJcblxyXG4gIHBvc3RDb25maWd1cmF0aW9uU3ViamVjdDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkRpbWVuc2lvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9bXT4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz4odW5kZWZpbmVkKTtcclxuXHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0Pih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT4oKTtcclxuXHJcbiAgbG9hZGluZ1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBhdHRyaWJ1dGVNYXA6IE1hcDxudW1iZXIsIEF0dHJpYnV0ZT4gPSBuZXcgTWFwPG51bWJlciwgQXR0cmlidXRlPigpO1xyXG5cclxuICB3aWR0aDogbnVtYmVyO1xyXG5cclxuICBjb250YWluZXJVcGRhdGVkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBncmlkUm93U2F2ZWQ6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4oKTtcclxuICBncmlkUm93RGVsZXRlZDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PigpO1xyXG4gIGRpcnR5OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICB1cGRhdGVkQXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdID0gW107XHJcbiAgc2xpY2VkQXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdID0gW107XHJcblxyXG4gIHByaXZhdGUgdW5pcXVlSWQ6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGljdGlvbmFyeVNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVRUUklCVVRFX0VORFBPSU5UKSBwcml2YXRlIGF0dHJpYnV0ZUVuZHBvaW50OiBzdHJpbmcpIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQ3JlYXRlZCBOZXcgQXR0cmlidXRlU2VydmljZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEJvdW5kRGF0YShib3VuZERhdGE6IGFueSkge1xyXG4gICAgdGhpcy5ib3VuZERhdGEgPSBib3VuZERhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuICAgICAgdGhpcy5ub3RpZnlBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZUNvdW50QnlBdHRyaWJ1dGUoaWRBdHRyaWJ1dGU6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxudW1iZXI+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlXCIsIGlkQXR0cmlidXRlLnRvU3RyaW5nKCkpfSk7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZUNvdW50QnlDb250YWluZXIoaWRBdHRyaWJ1dGVDb250YWluZXI6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxudW1iZXI+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlQ29udGFpbmVyXCIsIGlkQXR0cmlidXRlQ29udGFpbmVyLnRvU3RyaW5nKCkpfSk7XHJcbiAgfVxyXG5cclxuICBnZXREaWN0aW9uYXJ5VmFsdWVDb3VudChpZEF0dHJpYnV0ZURpY3Rpb25hcnk6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxudW1iZXI+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS1kaWN0aW9uYXJ5LWNvdW50XCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5XCIsIGlkQXR0cmlidXRlRGljdGlvbmFyeS50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb250ZXh0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBmb3JrSm9pbihbXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5BdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5BdHRyaWJ1dGVDb250ZXh0XCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuRmlsdGVyMVwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkZpbHRlcjJcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5BdHRyaWJ1dGVEaWN0aW9uYXJ5XCIpXHJcbiAgICBdKS5zdWJzY3JpYmUoKHJlc3BvbnNlczogYW55W10pID0+IHtcclxuXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeUxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzRdKTtcclxuICAgICAgdGhpcy5maWx0ZXIxTGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbMl0pO1xyXG4gICAgICB0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1szXSk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzFdKTtcclxuXHJcbiAgICAgIHJlc3BvbnNlc1swXS5zb3J0KHRoaXMuc29ydEF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3QpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzBdKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL0dldHMgdGhlIGRpY3Rpb25hcnkgZW50cmllcyBmcm9tIHRoZSBtYXAgKHNvIHdlIGRvbid0IGxvYWQgb3ZlciBhbmQgb3ZlciBhbmQgb3ZlciBmb3IgdGhlIHNhbWUgZGljdGlvbmFyeSlcclxuICBnZXREaWN0aW9uYXJ5RW50cmllcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdLCBncm91cEF0dHJpYnV0ZVJvd0lkPzogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU/OiBBdHRyaWJ1dGVWYWx1ZSk6IE9ic2VydmFibGU8RGljdGlvbmFyeUVudHJpZXNEVE8+IHtcclxuICAgIGxldCBicyA9IG5ldyBTdWJqZWN0PERpY3Rpb25hcnlFbnRyaWVzRFRPPigpO1xyXG5cclxuICAgIC8vSGFuZGxlIFhQQVRIXHJcbiAgICBpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGgpIHtcclxuICAgICAgbGV0IGVudHJpZXNEVE8gPSBuZXcgRGljdGlvbmFyeUVudHJpZXNEVE8oKTtcclxuICAgICAgbGV0IHhwYXRoID0gYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGg7XHJcblxyXG4gICAgICAvL0ZpbHRlcmVkIGJ5IGFub3RoZXIgZGljdGlvbmFyeT8gUGFyc2UgdG8gZ2V0IGFycmF5IG9mIGFsbCBkaWN0aW9uYXJ5IGNsYXNzIG5hbWVzIG5lZWRlZFxyXG4gICAgICBsZXQgZGljdENsYXNzZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICB3aGlsZSAoeHBhdGguaW5kZXhPZihcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVwiLCBwb3MpID49IDApIHtcclxuICAgICAgICBsZXQgc3RhcnQgPSB4cGF0aC5pbmRleE9mKFwiL0RpY3Rpb25hcmllcy9EaWN0aW9uYXJ5XCIsIHBvcyk7XHJcbiAgICAgICAgc3RhcnQgPSB4cGF0aC5pbmRleE9mKFwiJ1wiLCBzdGFydCk7XHJcbiAgICAgICAgbGV0IGVuZCA9IHhwYXRoLmluZGV4T2YoXCInXCIsIHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgZGljdENsYXNzZXMucHVzaChhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aC5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKVxyXG4gICAgICAgIHBvcyA9IGVuZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9Qb3RlbnRpYWxseSBsb2FkIG11bHRpcGxlIGRpY3Rpb25hcmllc1xyXG4gICAgICBsZXQgZm9ya0NhbGxzID0gW107XHJcbiAgICAgIGZvciAobGV0IGNsYXNzTmFtZSBvZiBkaWN0Q2xhc3Nlcykge1xyXG4gICAgICAgIGZvcmtDYWxscy5wdXNoKHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXNBc1hNTChjbGFzc05hbWUpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9EZWFsIHdpdGggdGhlIHJlc3VsdHMgdG9nZXRoZXJcclxuICAgICAgZm9ya0pvaW4oZm9ya0NhbGxzKS5zdWJzY3JpYmUoKHJlc3BvbnNlczogYW55W10pID0+IHtcclxuICAgICAgICAvL1dlJ3JlIG9ubHkgZ29pbmcgdG8gZG8geHBhdGggb24gdGhlIHhtbCBmb3IgdGhlIGZpcnN0IGRpY3Rpb25hcnlcclxuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgICAgbGV0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcG9uc2VzWzBdLCBcImFwcGxpY2F0aW9uL3htbFwiKTtcclxuXHJcbiAgICAgICAgLy9IYXZlIHRvIGV2YWx1YXRlIHN1Yi1leHByZXNzaW9uLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgc3VwcG9ydCBleHByZXNzaW9ucyBsaWtlIFtAeCA9ICgveHBhdGgtc3ViLWV4cHJlc3Npb24pXVxyXG4gICAgICAgIGxldCBzZWNvbmRhcnlYbWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBzZWNvbmRhcnlYbWwgPSByZXNwb25zZXNbMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1ByZS1ldmFsdWF0ZSBhbmQgc2ltcGxpZnkgWFBBVEhcclxuICAgICAgICBsZXQgZHRvOlByZUV2YWxEVE8gPSB0aGlzLnByZUV2YWx1YXRlWHBhdGgoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGgsIHNlY29uZGFyeVhtbCwgZ3JvdXBBdHRyaWJ1dGVSb3dJZCwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKTtcclxuXHJcbiAgICAgICAgLy9FdmFsdWF0ZSBYUEFUSCBleHByZXNzaW9uXHJcbiAgICAgICAgbGV0IGVudHJpZXMgPSBbXTtcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXNJbmNsdWRlU2VsZWN0ZWRWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICBsZXQgeFBhdGhSZXN1bHQgPSBkb2N1bWVudC5ldmFsdWF0ZShkdG8uZXhwcmVzc2lvbiwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcblxyXG4gICAgICAgICAgLy9JdGVyYXRlIHhwYXRoIHJlc3VsdHMgKG5vZGVzKVxyXG4gICAgICAgICAgdmFyIG5vZGUgPSBudWxsO1xyXG4gICAgICAgICAgd2hpbGUobm9kZSA9IHhQYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZ2V0SnNvbkVudHJ5RnJvbU5vZGUobm9kZSk7XHJcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyBObyBtYXRjaGluZyBlbnRyaWVzIGhlcmUuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1doYXQgYWJvdXQgZGljdGlvbmFyeSBlbnRyaWVzIHdoZXJlIGlzQWN0aXZlPSdOJywgYnV0IHRoZSBpZCB3YXMgdXNlZCBpbiBhIHByZXZpb3VzbHkgc2F2ZWQgdmFsdWU/XHJcbiAgICAgICAgLy9XZSBhZGQgdGhhdCB2YWx1ZSB0byB0aGUgZHJvcGRvd24sIGluIHRoYXQgY2FzZSwgc28gaXQgY2FuIGJlIHNlbGVjdGVkXHJcbiAgICAgICAgLy9SZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUgb25seSBnZXRzIHBhc3NlZCBpbiB3aGVuIHRoZSBmaWx0ZXIgYXR0cmlidXRlIGNoYW5nZXMuIEluIHRoYXQgc2NlbmFyaW8gd2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoZSBvbGQgdmFsdWUgdG8gdGhlIGxpc3RcclxuICAgICAgICBpZiAoYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSAhPT0gXCJZXCIpIHtcclxuICAgICAgICAgIGZvciAobGV0IGF2IG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICBsZXQgcHJlc2VudDpib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGF2ICYmICEgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9yKHZhciBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVudHJpZXNbaV0udmFsdWUgPT09IGF2LnZhbHVlSWREaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgIHByZXNlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgLy9JZiB0aGUgY3VycmVudGx5IHNhdmVkIHZhbHVlIGlzIG5vdCBpbiB0aGUgbGlzdCwgYWRkIGl0LlxyXG4gICAgICAgICAgICAgIGlmICghIHByZXNlbnQpIHtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCB4cGF0aCA9IFwiL0RpY3Rpb25hcmllcy9EaWN0aW9uYXJ5W0BjbGFzc05hbWU9J1wiICsgYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkuY2xhc3NOYW1lICsgXCInXS9EaWN0aW9uYXJ5RW50cnlbQHZhbHVlPSdcIiArIGF2LnZhbHVlSWREaWN0aW9uYXJ5ICsgXCInXVwiO1xyXG4gICAgICAgICAgICAgICAgLy9UaGUgZW50cnkgd2FzIHByb2JhYmx5IGFscmVhZHkgbG9hZGVkLCBidXQgZXhjbHVkZWQgYnkgdGhlIHhwYXRoLiBXZSBjYW4gdXNlIHRoYXQuXHJcbiAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5ldmFsdWF0ZSh4cGF0aCwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVU5PUkRFUkVEX05PREVfVFlQRSwgbnVsbCkuc2luZ2xlTm9kZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHRoaXMuZ2V0SnNvbkVudHJ5RnJvbU5vZGUobm9kZSkpO1xyXG4gICAgICAgICAgICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXNJbmNsdWRlU2VsZWN0ZWRWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy9TZXQgdGhlIGJlaGF2aW9yIHN1YmplY3Qgd2l0aCB0aGUgZmlsdGVyZWQgdmFsdWVzIGZvciB0aGUgZGljdGlvbmFyeVxyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgZW50cmllc0RUTy5yZWZlcmVuY2VkQXR0cmlidXRlID0gZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGU7XHJcbiAgICAgICAgYnMubmV4dChlbnRyaWVzRFRPKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gICAgLy9Ob24teHBhdGhcclxuICAgIGVsc2Uge1xyXG4gICAgICAvL0RpY3Rpb25heVNlcnZpY2UganVzdCB1c2VkIGh0dHAgZ2V0LCBzbyBzaG91bGQgbm90IG5lZWQgdG8gdW5zdWJzY3JpYmUsIHNpbmNlIGh0dHAgZG9lcyB0aGF0XHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeURyb3Bkb3duRW50cmllcyhhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS5jbGFzc05hbWUpLnN1YnNjcmliZSgoZW50cmllczogYW55W10pID0+IHtcclxuICAgICAgICAvL01ha2UgdmFsdWUgZmllbGRzXHJcbiAgICAgICAgZm9yKHZhciBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgZW50cmllc1tpXS52YWx1ZSA9IGVudHJpZXNbaV0uaWQudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbnRyaWVzRFRPID0gbmV3IERpY3Rpb25hcnlFbnRyaWVzRFRPKCk7XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzID0gZW50cmllcztcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXNJbmNsdWRlU2VsZWN0ZWRWYWx1ZSA9IHRydWU7IC8vQSBiaXQgb2YgYW4gYXNzdW1wdGlvbiwgYnV0IGlmIGl0IGlzbid0IGZpbHRlcmVkLCBpdCBoYWQgYmV0dGVyIGluY2x1ZGUgYWxsIHRoZSB2YWx1ZXMhXHJcbiAgICAgICAgYnMubmV4dChlbnRyaWVzRFRPKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJzO1xyXG4gIH1cclxuXHJcbiAgZ2V0SnNvbkVudHJ5RnJvbU5vZGUobm9kZTogYW55KTogYW55IHtcclxuICAgIC8vQ3JlYXRlIEpTT04gb2JqZWN0cyBmcm9tIHRoZSBub2Rlc1xyXG4gICAgbGV0IGVudHJ5OiBhbnkgPSB7fTtcclxuICAgIGZvcih2YXIgaSA9IG5vZGUuYXR0cmlidXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBlbnRyeVtub2RlLmF0dHJpYnV0ZXNbaV0ubmFtZV0gPSBub2RlLmF0dHJpYnV0ZXNbaV0udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGVudHJ5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVFdmFsdWF0ZVhwYXRoKHhwYXRoOiBzdHJpbmcsIHNlY29uZGFyeVhtbDogc3RyaW5nLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiBQcmVFdmFsRFRPIHtcclxuICAgIGxldCBkdG86UHJlRXZhbERUTyA9IG5ldyBQcmVFdmFsRFRPKCk7XHJcblxyXG4gICAgLy9TZWN1cml0eUFkdmlzb3IvQGNvZGVDYW5jZXJHcm91cFxyXG4gICAgd2hpbGUgKHhwYXRoLmluZGV4T2YoXCIvU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcIikgPj0gMCkge1xyXG4gICAgICB4cGF0aCA9IHhwYXRoLnJlcGxhY2UoXCIvU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcIiwgXCInXCIgKyB0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0KCkudmFsdWUuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCArIFwiJ1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlcGxhY2Ugc29tZSBvZiB0aGUgY29udGV4dCBwYXJhbWV0ZXJzICR7eC52YWx1ZX0gLSBUaGlzIGlzIG1vcmUgQWx0aW8gc3BlY2lmaWMgc3R1ZmYgdGhhdCB3YXMgdXNlZCBpbiBDQ1JcclxuICAgIGxldCBwYXJhbVBvcyA9IHhwYXRoLnNlYXJjaChcIlxcXFwke1tBLVphLXowLTlfXStcXFxcLnZhbHVlfVwiKTtcclxuICAgIHdoaWxlIChwYXJhbVBvcyA+PSAwKSB7XHJcbiAgICAgIGxldCBwcmVmaXggPSB4cGF0aC5zdWJzdHJpbmcoMCwgcGFyYW1Qb3MpO1xyXG4gICAgICBsZXQgdmFyTmFtZSA9IHhwYXRoLnN1YnN0cmluZyhwYXJhbVBvcyArIDIsIHhwYXRoLmluZGV4T2YoXCIuXCIsIHBhcmFtUG9zKSk7XHJcbiAgICAgIGxldCBzdWZmaXggPSB4cGF0aC5zdWJzdHJpbmcoeHBhdGguaW5kZXhPZihcIn1cIiwgcGFyYW1Qb3MpICsgMSk7XHJcblxyXG4gICAgICB2YXIgYXY7XHJcblxyXG4gICAgICAvL0lmIHRoZXJlIElTIGEgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlLCB3ZSBjYW4gdXNlIHRoZSB2YWx1ZSBkaXJlY3RseS4gT3RoZXJ3aXNlIHdlIHRyeSB0byBmaW5kIGl0IGluIHRoZSBBVlNcclxuICAgICAgaWYgKCEgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKSB7XHJcblxyXG4gICAgICAgIC8vRmluZCB0aGUgYXR0cmlidXRlLCBtYXRjaGluZyB0aGUgdmFyTmFtZS5cclxuICAgICAgICAvL0RvIHRoaXMgZmlyc3QsIHNvIHdlIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgcmVsYXRlZCBhdHRyaWJ1dGUsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWVcclxuXHJcbiAgICAgICAgLy9JdGVyYXRlIGF0dHJpYnV0ZXMgdG8gZmluZCBvbmUgdGhhdCBtYXRjaGVzIHRoZSB2YWx1ZVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTWFwLmZvckVhY2goKGF0dHJpYnV0ZTogQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgICAgICAvL0F0dHJpYnV0ZXMgdGhhdCBtYXRjaCB0aGUgbmFtZVxyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lID09PSB2YXJOYW1lKSB7XHJcbiAgICAgICAgICAgIGR0by5yZWZlcmVuY2VkQXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy9JZiB0aGlzIGlzIGEgZ3JpZCwgbG9vayBmb3IgYXR0cmlidXRlcyBpbiB0aGUgcm93XHJcbiAgICAgICAgICBpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgZ3JpZENvbHVtbkF0dHJpYnV0ZSAgb2YgYXR0cmlidXRlLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAvL0lmIHRoZSBuYW1lIG1hdGNoZXMgQU5EIHRoZSB2YWx1ZSBpbiB0aGUgQVZTIHdhcyBwYXJ0IG9mIHRoZSBTQU1FIFJPVyB3ZSBhcmUgZXZhbHVhdGluZyBYUEFUSCBmb3IsIHdlIGNhbiB1c2UgdGhlIHZhbHVlIGZvciBldmFsdWF0aW9uXHJcbiAgICAgICAgICAgICAgaWYgKGdyaWRDb2x1bW5BdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBncmlkQ29sdW1uQXR0cmlidXRlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgICAgIGxldCBhdnMgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIC8vSWYgd2UgZm91bmQgdGhlIGF0dHJpYnV0ZSBhbmQgaGF2ZSB2YWx1ZXMuLi5cclxuICAgICAgICBpZiAoZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUgJiYgYXZzKSB7XHJcblxyXG4gICAgICAgICAgLy9Mb29rIHRocm91Z2ggYWxsIHRoZSB2YWx1ZXMgdG8gZmluZCB0aGUgb25lIGZvciB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgKGFuZCBTQU1FIGdyaWQgcm93IGlmIGluIGEgZ3JpZCByb3cpXHJcbiAgICAgICAgICBhdiA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmluZCgoYXYpID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vSWYgdGhpcyBpcyBhbiBBViBmb3IgYSBncmlkIHJvdywgaXQgbXVzdCBiZSBmb3IgdGhlIHNhbWUgZ3JpZCByb3cgd2UgYXJlIGxvb2tpbmcgZm9yXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdyb3VwQXR0cmlidXRlUm93SWQgIT09ICd1bmRlZmluZWQnICYmIGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvL0lmIHdlIGxvb2tlZCB1cCB0aGUgYXR0cmlidXRlIG1hdGNoaW5nIHRoZSB2YWx1ZSBieSBpZCBBTkQgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyB0aGUgb25lIHdlIGFyIGxvb2tpbmcgZm9yIGZyb20gdGhlIFhQQVRILCB3ZSBjYW4gdXNlIGl0IGZvciBldmFsdWF0aW9uXHJcbiAgICAgICAgICAgICAvL0ZvdW5kIGFuIEF0dHJpYnV0ZVZhbHVlIHRoYXQgdGhlIGRpY3Rpb25hcnkgaXMgZmlsdGVyZWQgYnlcclxuICAgICAgICAgICAgaWYgKGR0by5yZWZlcmVuY2VkQXR0cmlidXRlLmlkQXR0cmlidXRlID09PSBhdi5pZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vVXNlIHRoZSByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUgaWYgcHJvdmlkZWQgKHRoaXMgaGFwcGVucyB3aGVuIGFscmVhZHkga25vd24sIGR1cmluZyBjaGFuZ2VzIHRvIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSlcclxuICAgICAgaWYgKHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUudmFsdWUgKyBcIidcIiArIHN1ZmZpeDtcclxuICAgICAgfVxyXG4gICAgICAvL0ZvdW5kIHRoZSBBdHRyaWJ1dGVWYWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB0aGF0IHRoZSBkaWN0aW9uYXJ5IGlzIGZpbHRlcmVkIGJ5XHJcbiAgICAgIGVsc2UgaWYgKGF2KSB7XHJcbiAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIidcIiArIGF2LnZhbHVlICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgIH1cclxuICAgICAgLy9EaWRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgZm9yIHZhck5hbWVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy9NYXliZSB0aGUgdmFyTmFtZSBpcyBmcm9tIGVsc2V3aGVyZSBpbiB0aGUgYXBwIChub24tQ09EKSwgYW5kIHByb3ZpZGVkIGluIGJvdW5kRGF0YVxyXG4gICAgICAgIGlmICh0aGlzLmJvdW5kRGF0YSAmJiB0aGlzLmJvdW5kRGF0YVt2YXJOYW1lXSkge1xyXG4gICAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIidcIiArIHRoaXMuYm91bmREYXRhW3Zhck5hbWVdICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vTm90aGluZyBtYXRjaGVzLiBDaGFuZ2UgdG8gZW1wdHkgc3RyaW5nLiBXaWxsIHByb2JhYmx5IHJlc3VsdCBpbiBOTyBlbnRyaWVzLCB3aGljaCB3b3VsZCBiZSBjb3JyZWN0LlxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIicnXCIgKyBzdWZmaXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbVBvcyA9IHhwYXRoLnNlYXJjaChcIlxcXFwke1tBLVphLXowLTlfXStcXFxcLnZhbHVlfVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0hhdmUgdG8gZXZhbHVhdGUgc3ViLWV4cHJlc3Npb24uIFRoaXMgaGFuZGxlcyBleHByZXNzaW9ucyBsaWtlIFtAeCA9ICgveHBhdGgtc3ViLWV4cHJlc3Npb24pXVxyXG4gICAgbGV0IGluRXhwcmVzc2lvblBvcyA9IHhwYXRoLnNlYXJjaChcIlxcXFxbQFtBLVphLXowLTlfXStcXFxccyo9XFxcXHMqXFxcXChcIik7XHJcblxyXG4gICAgaWYgKGluRXhwcmVzc2lvblBvcyA+IDAgJiYgc2Vjb25kYXJ5WG1sKSB7XHJcbiAgICAgIGxldCBwcmVmaXggPSB4cGF0aC5zdWJzdHJpbmcoMCwgaW5FeHByZXNzaW9uUG9zICsgMSk7XHJcbiAgICAgIGxldCBleHByZXNzaW9uRW5kID0geHBhdGguaW5kZXhPZihcIilcIiwgaW5FeHByZXNzaW9uUG9zKTtcclxuICAgICAgbGV0IHZhcmlhYmxlID0geHBhdGguc3Vic3RyaW5nKGluRXhwcmVzc2lvblBvcyArIDEsIHhwYXRoLmluZGV4T2YoXCI9XCIsIGluRXhwcmVzc2lvblBvcykpO1xyXG4gICAgICBsZXQgc3ViRXhwcmVzc2lvbiA9IHhwYXRoLnN1YnN0cmluZyh4cGF0aC5pbmRleE9mKFwiKFwiLCBpbkV4cHJlc3Npb25Qb3MpICsgMSwgZXhwcmVzc2lvbkVuZCk7XHJcbiAgICAgIGxldCBzdWZmaXggPSB4cGF0aC5zdWJzdHJpbmcoZXhwcmVzc2lvbkVuZCArIDEpO1xyXG5cclxuICAgICAgeHBhdGggPSBwcmVmaXg7XHJcblxyXG4gICAgICAvL0V2YWx1YXRlIFhQQVRIIGV4cHJlc3Npb25cclxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICBsZXQgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhzZWNvbmRhcnlYbWwsIFwiYXBwbGljYXRpb24veG1sXCIpO1xyXG4gICAgICBsZXQgeFBhdGhSZXN1bHQgPSBkb2N1bWVudC5ldmFsdWF0ZShzdWJFeHByZXNzaW9uLCBkb2MsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTtcclxuXHJcbiAgICAgIC8vSXRlcmF0ZSB4cGF0aCByZXN1bHRzIChub2RlcylcclxuICAgICAgdmFyIG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xyXG5cclxuICAgICAgd2hpbGUobm9kZSkge1xyXG4gICAgICAgIHhwYXRoID0geHBhdGggKyB2YXJpYWJsZSArIFwiPSdcIiArIG5vZGUubm9kZVZhbHVlICsgXCInXCJcclxuXHJcbiAgICAgICAgbm9kZSA9IHhQYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XHJcblxyXG4gICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICB4cGF0aCA9IHhwYXRoICsgXCIgb3IgXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB4cGF0aCA9IHhwYXRoICsgc3VmZml4O1xyXG4gICAgfVxyXG5cclxuICAgIGR0by5leHByZXNzaW9uID0geHBhdGg7XHJcbiAgICByZXR1cm4gZHRvO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0QXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdChhOiBhbnksIGI6IGFueSkge1xyXG4gICAgcmV0dXJuIGEuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICBmZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdDogXCIgKyBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0TG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9uc1wiO1xyXG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAoY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25bXT4odXJsLCB7cGFyYW1zOiBwYXJhbXN9KS5zdWJzY3JpYmUoKGNvbmZpZ3VyYXRpb25MaXN0OiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uW10pID0+IHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgbGV0IGR0b3M6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9bXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjZmcgb2YgY29uZmlndXJhdGlvbkxpc3QpIHtcclxuICAgICAgICBsZXQgZHRvOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPID0gdGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKGNmZyk7XHJcbiAgICAgICAgaWYgKGR0bykge1xyXG4gICAgICAgICAgZHRvcy5wdXNoKGR0byk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBkdG9zLnNvcnQodGhpcy5zb3J0QXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3QpO1xyXG5cclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdFN1YmplY3QubmV4dChkdG9zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0QXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3QoYTogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTywgYjogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTykge1xyXG4gICAgY29uc3QgZGlzcGxheWEgPSBhLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHREaXNwbGF5XHJcbiAgICAgICsgYS5leHRlbnNpb25EZXNjcmlwdGlvblxyXG4gICAgICArIChhLmZpbHRlcjFEaXNwbGF5IHx8IFwiXCIpXHJcbiAgICAgICsgKGEuZmlsdGVyMkRpc3BsYXkgfHwgXCJcIik7XHJcblxyXG4gICAgY29uc3QgZGlzcGxheWIgPSBiLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHREaXNwbGF5XHJcbiAgICAgICsgYi5leHRlbnNpb25EZXNjcmlwdGlvblxyXG4gICAgICArIChiLmZpbHRlcjFEaXNwbGF5IHx8IFwiXCIpXHJcbiAgICAgICsgKGIuZmlsdGVyMkRpc3BsYXkgfHwgXCJcIik7XHJcblxyXG4gICAgcmV0dXJuIGRpc3BsYXlhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShkaXNwbGF5Yi50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIC8vVXNlZCBieSBjb2QtZWRpdG9yXHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIxID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5pZEZpbHRlcjIgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnNcIiwgYXR0cmlidXRlQ29uZmlndXJhdGlvbikuc3Vic2NyaWJlKChhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcblxyXG4gICAgICB0aGlzLnBvc3RDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXCIvZWRpdG9yL2F0dHJpYnV0ZS1jb25maWd1cmF0aW9uL1wiICsgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uQnlJZChpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IG51bWJlciwgaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyLCBpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uICE9PSAtMSkge1xyXG4gICAgICB0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IGxvYWQgaWYgdGhlIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWRcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAhPT0gaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIC8vQ2xlYXIgQVNBUFxyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuICAgICAgdGhpcy5pZEZpbHRlcjEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuaWRGaWx0ZXIyID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5jbGVhcigpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICB0aGlzLmZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbihpZEF0dHJpYnV0ZVZhbHVlU2V0LCBpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgICAvL09yIGxvYWQgdGhlIEF0dHJpYnV0ZVZhbHVlU2V0IGlmIHRoYXQgY2hhbmdlZCAocG9zc2libGUgdG8gc3dpdGNoIGZyb20gb25lIGV2ZW50IHRvIGFub3RoZXIgb2YgdGhlIHNhbWUgdHlwZSwgZm9yIGV4YW1wbGVcclxuICAgIC8vVGhlIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gbXVzdCBhbHNvIGhhdmUgZmluaXNoZWQgbG9hZGluZyBhbmQgbm90IGFscmVhZHkgd29ya2luZyBvbiBsb2FkaW5nIHRoZSB2YWx1ZXNcclxuICAgIGVsc2UgaWYgKHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCAhPT0gaWRBdHRyaWJ1dGVWYWx1ZVNldCAmJiB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVWYWx1ZVNldChpZEF0dHJpYnV0ZVZhbHVlU2V0LCBpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGlkZW50aWZpZXJzIHRvIGJlIHVzZWQgYnkgdGhpcyBzZXJ2aWNlLiAgVGhpcyBwcm9tcHRzIGEgbmV3IGNvbmZpZ3VyYXRpb25cclxuICAgKiByZXF1ZXN0IHRvIGJlIG1hZGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRGaWx0ZXIxXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkRmlsdGVyMlxyXG4gICAqL1xyXG4vKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgZm9yIG5vdyBiZWNhdXNlIGl0IGlzIGJvdGggdW5pbXBsZW1lbnRlZCBhbmQgaW5jb21wbGV0ZSAobG9hZGluZyBhIGNvbmZpZ3VyYXRpb25cclxuICogZmlsdGVyIHdvdWxkIHJlYWxseSBhbHNvIHJlcXVpcmUgdGhlIGF0dHJpYnV0ZSBjb250ZXh0IGFuZCBhdHRyaWJ1dGVzZWN1cml0eSBjb250ZXh0IHBsdXMgYSBzZXJ2aWNlIG9uXHJcbiAqIHRoZSBiYWNrIGVuZCB0aGF0IGFjdHVhbGx5IGRvZXMgdGhpcyB3b3JrLiBGb3Igbm93LCBvbmx5IGxvYWRpbmcgYnkgaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uXHJcbiAqXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5RmlsdGVyKGlkRmlsdGVyMTogbnVtYmVyLCBpZEZpbHRlcjI/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5RmlsdGVyOiBcIiArIGlkRmlsdGVyMSArIFwiIFwiICsgaWRGaWx0ZXIyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAvL3RoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5pZEZpbHRlcjEgPSBpZEZpbHRlcjE7XHJcbiAgICB0aGlzLmlkRmlsdGVyMiA9IGlkRmlsdGVyMjtcclxuXHJcbiAgICB0aGlzLmZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbigpO1xyXG4gIH1cclxuKi9cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgaWQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzZXQuICBUaGlzIHdpbGwgcHJvbXB0IGEgcmVxdWVzdCB0byBwdWxsIHRoaXMgZnJvbSB0aGUgYmFja2VuZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVZhbHVlU2V0XHJcbiAgICovXHJcbiAgc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyLCBpZFBhcmVudE9iamVjdDogbnVtYmVyKSB7XHJcbiAgICAvL09ubHkgbG9hZCB0aGUgQXR0cmlidXRlVmFsdWVTZXQgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZFxyXG4gICAgaWYgKHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCAhPT0gaWRBdHRyaWJ1dGVWYWx1ZVNldCkge1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgPSBpZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG5cclxuICAgICAgdGhpcy5mZXRjaEF0dHJpYnV0ZVZhbHVlU2V0KGlkUGFyZW50T2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByZXF1ZXN0IHRvIGRvd25sb2FkIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbi5cclxuICAgKi9cclxuICBmZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyLCBpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPT09IC0xKSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoPEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+e1xyXG4gICAgICAgIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogLTJcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uICYmIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID4gLTEpIHtcclxuICAgICAgdXJsID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnMvXCIgKyB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vVGhpcyBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWRcclxuXHQgIC8vdXJsID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnMvZmlsdGVyL1wiICsgdGhpcy5pZEZpbHRlcjE7XHJcbiAgICAgIC8vaWYgKHRoaXMuaWRGaWx0ZXIyKSB7XHJcbiAgICAgICAgLy91cmwgKz0gXCIvXCIgKyB0aGlzLmlkRmlsdGVyMjtcclxuICAgICAgLy99XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih1cmwpLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICAvL05vdyBsb2FkIHRoZSBhdHRyaWJ1dGVWYWx1ZVNldCAtIFRoaXMgd2lsbCBhbHdheXMgaGFwcGVuIHdoZW4gYSBuZXcgY29uZmlndXJhdGlvbiBpcyBsb2FkZWRcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gdW5kZWZpbmVkOyAvL0ZvcmNlIGl0IHRvIGNoYW5nZSBpbiB0aGlzIHNjZW5hcmlvXHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKHVuZGVmaW5lZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVNYXAuY2xlYXIoKTtcclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZVNlcnZpY2Uuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvblwiKTtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICBpZiAoYXR0cmlidXRlQ29uZmlndXJhdGlvbi5iYXNlV2luZG93VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmdldEJhc2VXaW5kb3dEaW1lbnNpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbi5iYXNlV2luZG93VGVtcGxhdGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzLnNvcnQoKGE6IEF0dHJpYnV0ZUNvbnRhaW5lciwgYjogQXR0cmlidXRlQ29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS5zb3J0T3JkZXIgPCBiLnNvcnRPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGEuc29ydE9yZGVyID4gYi5zb3J0T3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlQ29udGFpbmVyIG9mIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZpcnN0IHNvcnQgYXR0cmlidXRlcyB1c2luZyB0aGUgeSBhbmQgeCBwb3NpdGlvbmluZy4gIElmIHVzaW5nIGFic29sdXRlIHBvc2l0aW9uLCB0aGUgb3JkZXIgZG9lc24ndCBtYXR0ZXIsXHJcbiAgICAgICAgICogYnV0IGlmIHdlIHdhbnQgdGhlIGFic29sdXRlIHBvc2l0aW9uaW5nIHRvIGd1aWRlIGF1dG8gbGF5b3V0LCB0aGVuIHVzZSB0aGlzIG9yZGVyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzLnNvcnQoKGE6IEdyYXBoaWNhbEF0dHJpYnV0ZSwgYjogR3JhcGhpY2FsQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS50YWJPcmRlciA8IGIudGFiT3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLnRhYk9yZGVyID4gYi50YWJPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlQ29udGFpbmVyLmdyYXBoaWNhbEF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIHRoaXMuYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyhhdHRyaWJ1dGVDb25maWd1cmF0aW9uKSk7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVxdWVzdCB0byBwdWxsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LlxyXG4gICAqIFJlcXVpcmVkIHRoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIHRvIGJlIHByZS1sb2FkZWRcclxuICAgKi9cclxuICBmZXRjaEF0dHJpYnV0ZVZhbHVlU2V0KGlkUGFyZW50T2JqZWN0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuaWRQYXJlbnRPYmplY3QgPSBpZFBhcmVudE9iamVjdDtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtc2V0L1wiICsgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsIChpZFBhcmVudE9iamVjdCk/aWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICAvL0NsZWFyIEFTQVBcclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZVZhbHVlU2V0Pih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZVNldDogQXR0cmlidXRlVmFsdWVTZXQpID0+IHtcclxuICAgICAgLy9Jbml0aWFsaXplIGF0dHJpYnV0ZVZhbHVlcyBpZiBpdCBkb2VzIG5vdCBleGlzdFxyXG4gICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJhc2VXaW5kb3dEaW1lbnNpb24oYmFzZVdpbmRvd1RlbXBsYXRlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuaHR0cC5nZXQodGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYmFzZS13aW5kb3ctZGltZW5zaW9uXCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiYmFzZVdpbmRvd1RlbXBsYXRlXCIsIGJhc2VXaW5kb3dUZW1wbGF0ZSl9KVxyXG4gICAgICAuc3Vic2NyaWJlKChkaW1lbnNpb246IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRpbWVuc2lvblN1YmplY3QubmV4dChkaW1lbnNpb24pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEN1cnJlbnRseSBhIHNpbXBsZSBub3RpZmllciB0aGF0IHRoZSBjb25maWd1cmF0aW9uIG9yIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgaGFzIGNoYW5nZWQgYW5kIGNvbXBvbmVudHMgbWF5IG5lZWQgdG8gYmUgcmVmcmVzaGVkLlxyXG4gICAqXHJcbiAgICovXHJcbiAgbm90aWZ5QXR0cmlidXRlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udGFpbmVyVXBkYXRlZC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9zdCB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgZWRpdGluZy4gIFBvc3QgdGhlIGVudGlyZSB0aGluZyBhcyBpdCBjYXNjYWRlcyBkb3duLiAgVGhlIGVkaXRvciBhbGxvd3MgeW91XHJcbiAgICogdG8gbW9kaWZ5IGV2ZXJ5IGNvbnRhaW5lciBhbmQgb25seSB0aGVuIHNhdmUgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBhdHRyaWJ1dGVDb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgcG9zdEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnMvXCIgKyBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5zZXROZWdhdGl2ZUlkc1RvVW5kZWZpbmVkKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYXR0cmlidXRlQ29uZmlndXJhdGlvbikuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgIC8vIFByZXZlbnQgZXJyb3IgaW4gc3Vic2VxdWVudCBzYXZlcy4gU2VlIE1ldGFidWlsZGVyIC8gTUItMjNcclxuICAgICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih1cmwpLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucG9zdENvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHV0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LiAgV2hlbiBlZGl0aW5nLCBhdHRyaWJ1dGVzIGFscmVhZHkgcG9zdCB0aGVpciB1cGRhdGVkIHZhbHVlcyB0byB0aGlzIHNlcnZpY2VzIHVuZGVyXHJcbiAgICogYSBzZXBhcmF0ZSBhcnJheS4gIFdoYXQgd2UgZG8gaXMgbWVyZ2UgaW4gdGhlc2UgdXBkYXRlZCBvciBjcmVhdGVkIHZhbHVlcyB3aXRoIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB2YWx1ZSBzZXQgKGF2cykuXHJcbiAgICogV2hpbGUgZG9pbmcgdGhpcywgc2V0IHRoZSBpZCBvZiB0aGUgYXZzIGFuZCBudWxsaWZ5IGFueSBuZWdhdGl2ZSBpZHMuXHJcbiAgICovXHJcbiAgdXBkYXRlQXR0cmlidXRlVmFsdWVTZXQoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4ge1xyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLXNldC9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZzOiBBdHRyaWJ1dGVWYWx1ZVNldCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkpO1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlIDwgMCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF2cy5hdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzW2pdID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF2cy5hdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnNwbGljZShqLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXZzLmF0dHJpYnV0ZVZhbHVlcyA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuY29uY2F0KHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCByZXN1bHRTdWJqZWN0OiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PigpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wdXQodXJsLCBhdnMsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZVNldDogQXR0cmlidXRlVmFsdWVTZXQpID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9Jbml0aWFsaXplIGF0dHJpYnV0ZVZhbHVlcyBpZiBpdCBkb2VzIG5vdCBleGlzdFxyXG4gICAgICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy9TZW5kIHRoZSByZXN1bHRzIHRvIHRoZSBvYnNlcnZlciAoaWYgYW55KSwgdGhlbiBjb21wbGV0ZVxyXG4gICAgICAgIHJlc3VsdFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHJlc3VsdFN1YmplY3QuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0U3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7QmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+fVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldERpcnR5U3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlydHk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdDtcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+fVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlU2V0KCk6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q7XHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7U3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgYXR0cmlidXRlIHZhbHVlcyBiYXNlZCB1cG9uIHRoZSBpZEF0dHJpYnV0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZXNcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlVmFsdWVbXX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZXMoaWRBdHRyaWJ1dGU6IG51bWJlciwgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogQXR0cmlidXRlVmFsdWVbXSB7XHJcblxyXG4gICAgbGV0IGF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG5cclxuICAgIGlmKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuXHJcbiAgICAgIC8vR28gdGhyb3VnaCBhbGwgdGhlIHVwZGF0ZWQgYXR0cmlidXRlIHZhbHVlcyBmaXJzdCAoc28gd2UgcHJlc2VydmUgYWNyb3NzIGNoYW5naW5nIHRhYnMsIGV0YylcclxuICAgICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSAmJiAoIWdyb3VwQXR0cmlidXRlUm93SWQgfHwgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmdyb3VwQXR0cmlidXRlUm93SWQpKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlICYmICghZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBncm91cEF0dHJpYnV0ZVJvd0lkID09PSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9HbyB0aHJvdWdoIGFsbCB0aGUgcmVndWxhciBhdHRyaWJ1dGVzXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZVZhbHVlIG9mIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgLy9SZWd1bGFyIGF0dHJpYnV0ZXMgKG5vcm1hbCBhbmQgZ3JvdXAsIHdoaWNoIGdldCBtdWx0aXBsZSlcclxuICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlIHx8IGF0dHJpYnV0ZVZhbHVlLmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlKSB7XHJcbiAgICAgICAgICAvL0lmIHJvdyBpZCBzcGVjaWZpZWQsIG9ubHkgY2FyZSBhYm91dCB2YWx1ZXMgZm9yIHRoYXQgcm93XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGdyb3VwQXR0cmlidXRlUm93SWQgPT09ICd1bmRlZmluZWQnIHx8IGF0dHJpYnV0ZVZhbHVlLmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQpIHtcclxuXHJcbiAgICAgICAgICAgIC8vSWYgbm90IGFscmVhZHkgYWRkZWQuLi5cclxuICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVzLmZpbmQoKGV4aXN0aW5nKSA9PiBleGlzdGluZy5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSkge1xyXG5cclxuICAgICAgICAgICAgICAvL0Rvbid0IHdhbnQgdGhlIG9yaWdpbmFsIGlmIGl0IHdhcyByZW1vdmVkIChzbGljZWQpXHJcbiAgICAgICAgICAgICAgaWYgKCEgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmluZCgoc2F2KSA9PiBzYXYuaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGVWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGF0dHJpYnV0ZVZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgY2hpbGQgYXR0cmlidXRlcyBvZiB0aGUgaWRBdHRyaWJ1dGUuICBNb3N0IGxpa2VseSBmb3IgYXR0cmlidXRlcyB0aGF0IGRlZmluZSBjb2x1bW5zIG9mIGEgZ3JpZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX1cclxuICAgKi9cclxuICBnZXRHcm91cEF0dHJpYnV0ZXMoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZVtdIHtcclxuICAgIGxldCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLmZvckVhY2goKGF0dHJpYnV0ZTogQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHdpZHRoIHdoaWNoIGlzIGEgcmVxdWlyZW1lbnQgb2YgdGhlIGFic29sdXRlIHBvc2l0aW9uaW5nLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXHJcbiAgICovXHJcbiAgc2V0V2lkdGgod2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSB3aWR0aC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICovXHJcbiAgZ2V0V2lkdGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLndpZHRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhcnJheSBvZiBhdHRyaWJ1dGUgY2hvaWNlcyBmb3IgdGhlIGlkQXR0cmlidXRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZUNob2ljZVtdfVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZUNob2ljZXMoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZUNob2ljZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcC5nZXQoaWRBdHRyaWJ1dGUpLmF0dHJpYnV0ZUNob2ljZXM7XHJcbiAgfVxyXG5cclxuICBnZXRMb2FkaW5nU3ViamVjdCgpOiBTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjb250YWluZXJVcGRhdGVkIHN1YmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7U3ViamVjdDxudW1iZXI+fVxyXG4gICAqL1xyXG4gIGdldENvbnRhaW5lclVwZGF0ZWQoKTogU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJVcGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFJvd1NhdmVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZFJvd1NhdmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFJvd0RlbGV0ZWRTdWJqZWN0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkUm93RGVsZXRlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSB1cGRhdGVkIGFuZCBkZWxldGVkIGF0dHJpYnV0ZSB2YWx1ZSBhcnJheXMuXHJcbiAgICpcclxuICAgKi9cclxuICBjbGVhclVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5ub3RpZnlBdHRyaWJ1dGVzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgdXBkYXRlZCBhbmQgZGVsZXRlZCBncmlkIHJvdyBhdHRyaWJ1dGVzIGZvciB0aGUgc3BlY2lmaWVkIGdyaWQgcm93XHJcbiAgICpcclxuICAgKi9cclxuICBjbGVhclVwZGF0ZWRHcmlkUm93QXR0cmlidXRlVmFsdWVzKGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlbWFpbmluZ0F0dHJpYnV0ZXMgPSBbXTtcclxuXHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuXHJcbiAgICAvL1Nob3VsZG4ndCBiZSBhIG5lZWQgdG8gY2hhbmdlIGRpcnR5IG9yIG5vdGlmeSBhdHRyaWJ1dGVzXHJcbiAgfVxyXG5cclxuICBzYXZlR3JpZFJvd0F0dHJpYnV0ZVZhbHVlcyhpZEdyb3VwQXR0cmlidXRlOiBudW1iZXIsIGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJvd1ZhbHVlcyA9IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpO1xyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93VmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIC8vc2V0IHRoZSBpZEF0dHJpYnV0ZVZhbHVlU2V0IGlmIG5lY2Vzc2FyeVxyXG4gICAgICBpZiAoISByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZVNldCkge1xyXG4gICAgICAgIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL3JlbW92ZSBhbGwgbmVnYXRpdmUgaWRzIChuZXcgdmFsdWVzKVxyXG4gICAgICBpZiAocm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUgPCAwKSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0ZvciBtdWx0aSB2YWx1ZXMgdGhhdCB3ZXJlIHNsaWNlZCAoZGUtc2VsZWN0ZWQpIHdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlbSBhbmQgbnVsbCBvdXQgdGhlIHZhbHVlLCBpbnN0ZWFkIG9mIHJlbW92aW5nLlxyXG4gICAgLy9UaGF0IG1lYW5zIHRoZXkgYWN0YXVsbHkgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgcm93VmFsdWVzXHJcbiAgICAvL1JlbW92ZWQgbXVsdGkgdmFsdWVzIHdpdGhpbiBhbiBleGlzdGluZyByb3dcclxuICAgIGxldCByZW1vdmVkVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCAmJiBhdi5pZEdyb3VwQXR0cmlidXRlID09PSBpZEdyb3VwQXR0cmlidXRlKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlID0gdW5kZWZpbmVkO1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICByb3dWYWx1ZXMucHVzaChyZW1vdmVkVmFsdWVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogcm93VmFsdWVzXHJcbiAgICAgIH07XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgLy9TYXZlIG5ldyByb3dcclxuICAgIGlmIChncm91cEF0dHJpYnV0ZVJvd0lkIDwgMCkge1xyXG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1JlbW92ZSB0aGUgdXBkYXRlZCBhbmQgc2xpY2VkIHZhbHVlcyBmb3IgdGhlIGdyaWQgcm93LCBub3cgKHRoZXNlIGFyZSB0aGUgb2xkIG9uZXMgd2l0aCB0aGUgbmVnYXRpdmUgcm93aWQpXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiAoYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBhdi5pZEdyb3VwQXR0cmlidXRlICE9PSBpZEdyb3VwQXR0cmlidXRlKSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiAoYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBhdi5pZEdyb3VwQXR0cmlidXRlICE9PSBpZEdyb3VwQXR0cmlidXRlKSk7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQoYXZzKTtcclxuICAgICAgICB0aGlzLmdyaWRSb3dTYXZlZC5uZXh0KGF0dHJpYnV0ZVZhbHVlR3JpZFJvdyk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL1VwZGF0ZSBleGlzdGluZyByb3dcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmh0dHAucHV0KHVybCwgYXZnciwge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdzogQXR0cmlidXRlVmFsdWVHcmlkUm93KSA9PiB7XHJcblxyXG4gICAgICAgIC8vQWRkIHRoZSBncmlkIHJvdyB0byB0aGUgb3JpZ2luYWwgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAgICAgIGxldCBhdnM6QXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAvL1JlbW92ZSBhbGwgb2xkIHZhbHVlcyBmb3Igcm93XHJcbiAgICAgICAgbGV0IGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSBzbGljZWQgYW5kIHVwZGF0ZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3dcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIC8vRmlsdGVyIHRvIG9ubHkgYXR0cmlidXRlcyB0byBLRUVQIC0gKGkuZS4gbm90IHRoZSBzYW1lIGdyaWQgb3Igbm90IHRoZSByb3cgYmVpbmcgZGVsZXRlZClcclxuICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcyA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gKGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUgfHwgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgbWFwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlTXVsdGlDaG9pY2UoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpRGljdChhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGlmIHByZXNlbnRcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGUgJiYgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vIGxvbmdlciByZW1vdmluZylcclxuICAgIGlmIChpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8vT3RoZXJ3aXNlIHB1c2ggdGhlIHZhbHVlLCBzbyBpdCB3aWxsIGJlIHNhdmVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wdXNoQXR0cmlidXRlVmFsdWUoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVzaCBhIG5ldyBvciB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBjdXJyZW50IG9uZSBpcyBqdXN0IHJlbW92ZWQgYW5kIHRoZSBuZXcgb25lIGFwcGVuZGVkIHRvIHRoZSBhcnJheS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWV9IGF0dHJpYnV0ZVZhbHVlXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHB1c2hpbmcgbXVsdGlwbGUgYXR0cmlidXRlIHZhbHVlcyBhdCBvbmNlLiAgVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgZm9yIGEgbXVsdGkgY2hvaWNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVbXX0gYXR0cmlidXRlVmFsdWVzXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInB1c2hBdHRyaWJ1dGVWYWx1ZXNcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGUgIT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0gPSBhdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSB2YWx1ZSBpbiB0aGUgY2FzZSB3aGVyZSBhbiBhdHRyaWJ1dGUgdmFsdWUgZG9lc24ndCBleGlzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBwdXNoVmFsdWUoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUgPSA8QXR0cmlidXRlVmFsdWU+e1xyXG4gICAgICBpZEF0dHJpYnV0ZTogYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiVFhUXCIpIHtcclxuICAgICAgYXR0cmlidXRlVmFsdWUudmFsdWVMb25nVGV4dCA9IHtcclxuICAgICAgICBpZExvbmdUZXh0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dERhdGE6IHZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZUNob2ljZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlQ2hvaWNlOiBBdHRyaWJ1dGVDaG9pY2UpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgJiYgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPT09IGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYW4gYXR0cmlidXRlIHZhbHVlLiAgVHlwaWNhbGx5IGluIHRoZSBjYXNlIG9mIGEgbXVsdGkgc2VsZWN0IHdoZXJlIHRoZSB1bnNlbGVjdGVkIHZhbHVlIGlzIHJlbW92ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDaG9pY2V9IGF0dHJpYnV0ZUNob2ljZVxyXG4gICAqL1xyXG4gIHNwbGljZUF0dHJpYnV0ZVZhbHVlRGljdChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJzbGljZUF0dHJpYnV0ZVZhbHVlOiBcIiArIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSArIFwiLCBcIiArIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUlkRGljdGlvbmFyeSA9PT0gdmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBmbGFnZ2luZyBkaXJ0eSBmb3Igbm9uLWdyaWQgcm93cyAodGhvc2UgYXJlIHNhdmVkIGltbWVkaWF0ZWx5KVxyXG4gICAgaWYgKCEgYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGUgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuICBUaGlzIGlzIGZyb20gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGUoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24sIHNldCBhbGwgb2YgdGhlIG5lZ2F0aXZlIGlkcyB0byB1bmRlZmluZWQgcHJpb3IgdG8gcG9zdGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uIDwgMCkge1xyXG4gICAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGVDb250YWluZXIgb2YgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgIDwgMCkge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRhaW5lci5pZEF0dHJpYnV0ZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgYXR0cmlidXRlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGVDaG9pY2Ugb2YgYXR0cmlidXRlLmF0dHJpYnV0ZUNob2ljZXMpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZVtcInZhbHVlXCJdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSAgPCAwKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBjb250ZXh0IGNvZGUgYW5kIGlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBjb25maWd1cmF0aW9uXHJcbiAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgKi9cclxuICBnZXRDb25maWd1cmF0aW9uTmFtZShjb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKTogc3RyaW5nIHtcclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFwiTmV3XCI7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IGNvbmZpZ3VyYXRpb24uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgKyBcIjogXCIgKyBjb25maWd1cmF0aW9uLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG5cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMSkge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjFEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZ3VyYXRpb24uaWRGaWx0ZXIyKSB7XHJcbiAgICAgIG5hbWUgKz0gXCIgLSBcIiArIGNvbmZpZ3VyYXRpb24uZmlsdGVyMkRpc3BsYXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oY2ZnOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyB7XHJcbiAgICBpZiAoIWNmZykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkdG86IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8gPSA8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz57XHJcbiAgICAgIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogY2ZnLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbixcclxuICAgICAgY29kZUF0dHJpYnV0ZUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dCxcclxuICAgICAgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQsXHJcbiAgICAgIGlkRmlsdGVyMTogY2ZnLmlkRmlsdGVyMSxcclxuICAgICAgaWRGaWx0ZXIyOiBjZmcuaWRGaWx0ZXIyXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGR0by5leHRlbnNpb25EZXNjcmlwdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChjdHg6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdHguY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dDtcclxuICAgICAgfSlbMF0uZXh0ZW5zaW9uRGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgICAgfSk7XHJcbiAgICAgIGR0by5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheSA9IChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApID8gcmVzdWx0WzBdLmRlc2NyaXB0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjE7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMURpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjFcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjIgPT09IGNmZy5pZEZpbHRlcjI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMkRpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkdG87XHJcbiAgfVxyXG5cclxuICBnZXRTZWN1cml0eUNvZGVDb250ZXh0KGNvZGU6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlO1xyXG4gICAgfSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjFGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0ICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyMkZvcihjb2RlQXR0cmlidXRlQ29udGV4dDogc3RyaW5nLCBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0OiBzdHJpbmcsIGlkRmlsdGVyMTogbnVtYmVyKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5pZEZpbHRlcjEgPT09IGlkRmlsdGVyMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgbmV3IGlkQXR0cmlidXRlVmFsdWVzIHZpYSBhIG5lZ2F0aXZlIG51bWJlciBmb3IgaW50ZXJuYWwgdHJhY2tpbmcuICBSZW1vdmUgdGhpcyBmYWtlIGlkIHByaW9yIHRvIHBvc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFVuaXF1ZUlkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gLS10aGlzLnVuaXF1ZUlkO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE4QzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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Q0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQzsrR0F6OENVLGdCQUFnQixtR0FpRFAsa0JBQWtCO21IQWpEM0IsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOzswQkFrREksTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIGlzRGV2TW9kZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmltcG9ydCB7RGljdGlvbmFyeVNlcnZpY2V9IGZyb20gXCJAaHVudHNtYW4tY2FuY2VyLWluc3RpdHV0ZS9kaWN0aW9uYXJ5LXNlcnZpY2VcIjtcclxuXHJcbmltcG9ydCB7QXR0cmlidXRlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNob2ljZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jaG9pY2UuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb25maWd1cmF0aW9uLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZVZhbHVlU2V0fSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLXNldC5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24uZHRvXCI7XHJcbmltcG9ydCB7R3JhcGhpY2FsQXR0cmlidXRlfSBmcm9tIFwiLi4vbW9kZWwvZ3JhcGhpY2FsLWF0dHJpYnV0ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb250YWluZXJ9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29udGFpbmVyLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZVZhbHVlR3JpZFJvd30gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy5lbnRpdHlcIjtcclxuaW1wb3J0IHtQcmVFdmFsRFRPfSBmcm9tIFwiLi4vbW9kZWwvcHJlLWV2YWwuZHRvXCI7XHJcbmltcG9ydCB7RGljdGlvbmFyeUVudHJpZXNEVE99IGZyb20gXCIuLi9tb2RlbC9kaWN0aW9uYXJ5LWVudHJpZXMuZHRvXCI7XHJcblxyXG5cclxuZXhwb3J0IGxldCBBVFRSSUJVVEVfRU5EUE9JTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF0dHJpYnV0ZUVuZHBvaW50XCIpO1xyXG5leHBvcnQgY29uc3QgQk9PTEVBTjogc3RyaW5nW10gPSBbXCJOXCIsIFwiWVwiXTtcclxuZXhwb3J0IGNvbnN0IEVYVEVOREVEX0JPT0xFQU46IHN0cmluZ1tdID0gW1wiTlwiLCBcIllcIiwgXCJVXCJdO1xyXG5cclxuLyoqXHJcbiAqIEEgc2VydmljZSBjcmVhdGVkIGZvciBlYWNoIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLiAgVGhpcyBtYWtlcyBjYWxscyB0byB0aGUgYmFja2VuZCB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb25cclxuICogYW5kIHZhbHVlIHNldC4gIEl0IGFsc28gc3RvcmVzIGNvbW1vbiBkYXRhIHRoYXQgZGlmZmVyZW50IGF0dHJpYnV0ZXMgbWlnaHQgbmVlZCAoZS5nLiBhIGxpc3Qgb2YgYXR0cmlidXRlIGNob2ljZXMpLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlU2VydmljZSB7XHJcblxyXG4gIG5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBudW1iZXI7XHJcbiAgaWRGaWx0ZXIxOiBudW1iZXI7XHJcbiAgaWRGaWx0ZXIyOiBudW1iZXI7XHJcbiAgaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyO1xyXG4gIGlkUGFyZW50T2JqZWN0OiBudW1iZXI7XHJcbiAgYm91bmREYXRhOiBhbnk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGZpbHRlcjFMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZmlsdGVyMkxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBkaWN0aW9uYXJ5TGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG5cclxuXHJcbiAgcG9zdENvbmZpZ3VyYXRpb25TdWJqZWN0OiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uRGltZW5zaW9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4odW5kZWZpbmVkKTtcclxuXHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1tdPih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0TG9hZGluZ1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPPih1bmRlZmluZWQpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0OiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPigpO1xyXG5cclxuICBsb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZU1hcDogTWFwPG51bWJlciwgQXR0cmlidXRlPiA9IG5ldyBNYXA8bnVtYmVyLCBBdHRyaWJ1dGU+KCk7XHJcblxyXG4gIHdpZHRoOiBudW1iZXI7XHJcblxyXG4gIGNvbnRhaW5lclVwZGF0ZWQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIGdyaWRSb3dTYXZlZDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PigpO1xyXG4gIGdyaWRSb3dEZWxldGVkOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+KCk7XHJcbiAgZGlydHk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuICBzbGljZWRBdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSB1bmlxdWVJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChBVFRSSUJVVEVfRU5EUE9JTlQpIHByaXZhdGUgYXR0cmlidXRlRW5kcG9pbnQ6IHN0cmluZykge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJDcmVhdGVkIE5ldyBBdHRyaWJ1dGVTZXJ2aWNlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Qm91bmREYXRhKGJvdW5kRGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmJvdW5kRGF0YSA9IGJvdW5kRGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICB0aGlzLm5vdGlmeUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZVZhbHVlQ291bnRCeUF0dHJpYnV0ZShpZEF0dHJpYnV0ZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWNvdW50XCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiaWRBdHRyaWJ1dGVcIiwgaWRBdHRyaWJ1dGUudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZVZhbHVlQ291bnRCeUNvbnRhaW5lcihpZEF0dHJpYnV0ZUNvbnRhaW5lcjogbnVtYmVyKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWNvdW50XCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiaWRBdHRyaWJ1dGVDb250YWluZXJcIiwgaWRBdHRyaWJ1dGVDb250YWluZXIudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGdldERpY3Rpb25hcnlWYWx1ZUNvdW50KGlkQXR0cmlidXRlRGljdGlvbmFyeTogbnVtYmVyKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLWRpY3Rpb25hcnktY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZURpY3Rpb25hcnlcIiwgaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5LnRvU3RyaW5nKCkpfSk7XHJcbiAgfVxyXG5cclxuICBmZXRjaEF0dHJpYnV0ZUNvbnRleHQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkF0dHJpYnV0ZUNvbnRleHRcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5GaWx0ZXIxXCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuRmlsdGVyMlwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkF0dHJpYnV0ZURpY3Rpb25hcnlcIilcclxuICAgIF0pLnN1YnNjcmliZSgocmVzcG9uc2VzOiBhbnlbXSkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5TGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbNF0pO1xyXG4gICAgICB0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1syXSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzNdKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb250ZXh0TGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbMV0pO1xyXG5cclxuICAgICAgcmVzcG9uc2VzWzBdLnNvcnQodGhpcy5zb3J0QXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbMF0pO1xyXG5cclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vR2V0cyB0aGUgZGljdGlvbmFyeSBlbnRyaWVzIGZyb20gdGhlIG1hcCAoc28gd2UgZG9uJ3QgbG9hZCBvdmVyIGFuZCBvdmVyIGFuZCBvdmVyIGZvciB0aGUgc2FtZSBkaWN0aW9uYXJ5KVxyXG4gIGdldERpY3Rpb25hcnlFbnRyaWVzKGF0dHJpYnV0ZTogQXR0cmlidXRlLCB2YWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10sIGdyb3VwQXR0cmlidXRlUm93SWQ/OiBudW1iZXIsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZT86IEF0dHJpYnV0ZVZhbHVlKTogT2JzZXJ2YWJsZTxEaWN0aW9uYXJ5RW50cmllc0RUTz4ge1xyXG4gICAgbGV0IGJzID0gbmV3IFN1YmplY3Q8RGljdGlvbmFyeUVudHJpZXNEVE8+KCk7XHJcblxyXG4gICAgLy9IYW5kbGUgWFBBVEhcclxuICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aCkge1xyXG4gICAgICBsZXQgZW50cmllc0RUTyA9IG5ldyBEaWN0aW9uYXJ5RW50cmllc0RUTygpO1xyXG4gICAgICBsZXQgeHBhdGggPSBhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aDtcclxuXHJcbiAgICAgIC8vRmlsdGVyZWQgYnkgYW5vdGhlciBkaWN0aW9uYXJ5PyBQYXJzZSB0byBnZXQgYXJyYXkgb2YgYWxsIGRpY3Rpb25hcnkgY2xhc3MgbmFtZXMgbmVlZGVkXHJcbiAgICAgIGxldCBkaWN0Q2xhc3Nlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgbGV0IHBvcyA9IDA7XHJcbiAgICAgIHdoaWxlICh4cGF0aC5pbmRleE9mKFwiL0RpY3Rpb25hcmllcy9EaWN0aW9uYXJ5XCIsIHBvcykgPj0gMCkge1xyXG4gICAgICAgIGxldCBzdGFydCA9IHhwYXRoLmluZGV4T2YoXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlcIiwgcG9zKTtcclxuICAgICAgICBzdGFydCA9IHhwYXRoLmluZGV4T2YoXCInXCIsIHN0YXJ0KTtcclxuICAgICAgICBsZXQgZW5kID0geHBhdGguaW5kZXhPZihcIidcIiwgc3RhcnQgKyAxKTtcclxuICAgICAgICBkaWN0Q2xhc3Nlcy5wdXNoKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoLnN1YnN0cmluZyhzdGFydCArIDEsIGVuZCkpXHJcbiAgICAgICAgcG9zID0gZW5kO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1BvdGVudGlhbGx5IGxvYWQgbXVsdGlwbGUgZGljdGlvbmFyaWVzXHJcbiAgICAgIGxldCBmb3JrQ2FsbHMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgY2xhc3NOYW1lIG9mIGRpY3RDbGFzc2VzKSB7XHJcbiAgICAgICAgZm9ya0NhbGxzLnB1c2godGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllc0FzWE1MKGNsYXNzTmFtZSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL0RlYWwgd2l0aCB0aGUgcmVzdWx0cyB0b2dldGhlclxyXG4gICAgICBmb3JrSm9pbihmb3JrQ2FsbHMpLnN1YnNjcmliZSgocmVzcG9uc2VzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIC8vV2UncmUgb25seSBnb2luZyB0byBkbyB4cGF0aCBvbiB0aGUgeG1sIGZvciB0aGUgZmlyc3QgZGljdGlvbmFyeVxyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgICBsZXQgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwb25zZXNbMF0sIFwiYXBwbGljYXRpb24veG1sXCIpO1xyXG5cclxuICAgICAgICAvL0hhdmUgdG8gZXZhbHVhdGUgc3ViLWV4cHJlc3Npb24uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBzdXBwb3J0IGV4cHJlc3Npb25zIGxpa2UgW0B4ID0gKC94cGF0aC1zdWItZXhwcmVzc2lvbildXHJcbiAgICAgICAgbGV0IHNlY29uZGFyeVhtbCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAocmVzcG9uc2VzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIHNlY29uZGFyeVhtbCA9IHJlc3BvbnNlc1sxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUHJlLWV2YWx1YXRlIGFuZCBzaW1wbGlmeSBYUEFUSFxyXG4gICAgICAgIGxldCBkdG86UHJlRXZhbERUTyA9IHRoaXMucHJlRXZhbHVhdGVYcGF0aChhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aCwgc2Vjb25kYXJ5WG1sLCBncm91cEF0dHJpYnV0ZVJvd0lkLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpO1xyXG5cclxuICAgICAgICAvL0V2YWx1YXRlIFhQQVRIIGV4cHJlc3Npb25cclxuICAgICAgICBsZXQgZW50cmllcyA9IFtdO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllc0luY2x1ZGVTZWxlY3RlZFZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgIGxldCB4UGF0aFJlc3VsdCA9IGRvY3VtZW50LmV2YWx1YXRlKGR0by5leHByZXNzaW9uLCBkb2MsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAvL0l0ZXJhdGUgeHBhdGggcmVzdWx0cyAobm9kZXMpXHJcbiAgICAgICAgICB2YXIgbm9kZSA9IG51bGw7XHJcbiAgICAgICAgICB3aGlsZShub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSkge1xyXG5cclxuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRKc29uRW50cnlGcm9tTm9kZShub2RlKTtcclxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9Y2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIE5vIG1hdGNoaW5nIGVudHJpZXMgaGVyZS5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vV2hhdCBhYm91dCBkaWN0aW9uYXJ5IGVudHJpZXMgd2hlcmUgaXNBY3RpdmU9J04nLCBidXQgdGhlIGlkIHdhcyB1c2VkIGluIGEgcHJldmlvdXNseSBzYXZlZCB2YWx1ZT9cclxuICAgICAgICAvL1dlIGFkZCB0aGF0IHZhbHVlIHRvIHRoZSBkcm9wZG93biwgaW4gdGhhdCBjYXNlLCBzbyBpdCBjYW4gYmUgc2VsZWN0ZWRcclxuICAgICAgICAvL1JlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSBvbmx5IGdldHMgcGFzc2VkIGluIHdoZW4gdGhlIGZpbHRlciBhdHRyaWJ1dGUgY2hhbmdlcy4gSW4gdGhhdCBzY2VuYXJpbyB3ZSBkbyBub3Qgd2FudCB0byBhZGQgdGhlIG9sZCB2YWx1ZSB0byB0aGUgbGlzdFxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaXNNdWx0aVZhbHVlICE9PSBcIllcIikge1xyXG4gICAgICAgICAgZm9yIChsZXQgYXYgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGxldCBwcmVzZW50OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYXYgJiYgISByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb3IodmFyIGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllc1tpXS52YWx1ZSA9PT0gYXYudmFsdWVJZERpY3Rpb25hcnkpIHtcclxuICAgICAgICAgICAgICAgICAgcHJlc2VudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAvL0lmIHRoZSBjdXJyZW50bHkgc2F2ZWQgdmFsdWUgaXMgbm90IGluIHRoZSBsaXN0LCBhZGQgaXQuXHJcbiAgICAgICAgICAgICAgaWYgKCEgcHJlc2VudCkge1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IHhwYXRoID0gXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlbQGNsYXNzTmFtZT0nXCIgKyBhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS5jbGFzc05hbWUgKyBcIiddL0RpY3Rpb25hcnlFbnRyeVtAdmFsdWU9J1wiICsgYXYudmFsdWVJZERpY3Rpb25hcnkgKyBcIiddXCI7XHJcbiAgICAgICAgICAgICAgICAvL1RoZSBlbnRyeSB3YXMgcHJvYmFibHkgYWxyZWFkeSBsb2FkZWQsIGJ1dCBleGNsdWRlZCBieSB0aGUgeHBhdGguIFdlIGNhbiB1c2UgdGhhdC5cclxuICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LmV2YWx1YXRlKHhwYXRoLCBkb2MsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9VTk9SREVSRURfTk9ERV9UWVBFLCBudWxsKS5zaW5nbGVOb2RlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2godGhpcy5nZXRKc29uRW50cnlGcm9tTm9kZShub2RlKSk7XHJcbiAgICAgICAgICAgICAgICAgIGVudHJpZXNEVE8uZW50cmllc0luY2x1ZGVTZWxlY3RlZFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvL1NldCB0aGUgYmVoYXZpb3Igc3ViamVjdCB3aXRoIHRoZSBmaWx0ZXJlZCB2YWx1ZXMgZm9yIHRoZSBkaWN0aW9uYXJ5XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzID0gZW50cmllcztcclxuICAgICAgICBlbnRyaWVzRFRPLnJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZTtcclxuICAgICAgICBicy5uZXh0KGVudHJpZXNEVE8pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcbiAgICAvL05vbi14cGF0aFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vRGljdGlvbmF5U2VydmljZSBqdXN0IHVzZWQgaHR0cCBnZXQsIHNvIHNob3VsZCBub3QgbmVlZCB0byB1bnN1YnNjcmliZSwgc2luY2UgaHR0cCBkb2VzIHRoYXRcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RHJvcGRvd25FbnRyaWVzKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LmNsYXNzTmFtZSkuc3Vic2NyaWJlKChlbnRyaWVzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIC8vTWFrZSB2YWx1ZSBmaWVsZHNcclxuICAgICAgICBmb3IodmFyIGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICBlbnRyaWVzW2ldLnZhbHVlID0gZW50cmllc1tpXS5pZC50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVudHJpZXNEVE8gPSBuZXcgRGljdGlvbmFyeUVudHJpZXNEVE8oKTtcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXMgPSBlbnRyaWVzO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllc0luY2x1ZGVTZWxlY3RlZFZhbHVlID0gdHJ1ZTsgLy9BIGJpdCBvZiBhbiBhc3N1bXB0aW9uLCBidXQgaWYgaXQgaXNuJ3QgZmlsdGVyZWQsIGl0IGhhZCBiZXR0ZXIgaW5jbHVkZSBhbGwgdGhlIHZhbHVlcyFcclxuICAgICAgICBicy5uZXh0KGVudHJpZXNEVE8pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYnM7XHJcbiAgfVxyXG5cclxuICBnZXRKc29uRW50cnlGcm9tTm9kZShub2RlOiBhbnkpOiBhbnkge1xyXG4gICAgLy9DcmVhdGUgSlNPTiBvYmplY3RzIGZyb20gdGhlIG5vZGVzXHJcbiAgICBsZXQgZW50cnk6IGFueSA9IHt9O1xyXG4gICAgZm9yKHZhciBpID0gbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGVudHJ5W25vZGUuYXR0cmlidXRlc1tpXS5uYW1lXSA9IG5vZGUuYXR0cmlidXRlc1tpXS52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZW50cnk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZUV2YWx1YXRlWHBhdGgoeHBhdGg6IHN0cmluZywgc2Vjb25kYXJ5WG1sOiBzdHJpbmcsIGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlciwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IFByZUV2YWxEVE8ge1xyXG4gICAgbGV0IGR0bzpQcmVFdmFsRFRPID0gbmV3IFByZUV2YWxEVE8oKTtcclxuXHJcbiAgICAvL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXHJcbiAgICB3aGlsZSAoeHBhdGguaW5kZXhPZihcIi9TZWN1cml0eUFkdmlzb3IvQGNvZGVDYW5jZXJHcm91cFwiKSA+PSAwKSB7XHJcbiAgICAgIHhwYXRoID0geHBhdGgucmVwbGFjZShcIi9TZWN1cml0eUFkdmlzb3IvQGNvZGVDYW5jZXJHcm91cFwiLCBcIidcIiArIHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QoKS52YWx1ZS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ICsgXCInXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVwbGFjZSBzb21lIG9mIHRoZSBjb250ZXh0IHBhcmFtZXRlcnMgJHt4LnZhbHVlfSAtIFRoaXMgaXMgbW9yZSBBbHRpbyBzcGVjaWZpYyBzdHVmZiB0aGF0IHdhcyB1c2VkIGluIENDUlxyXG4gICAgbGV0IHBhcmFtUG9zID0geHBhdGguc2VhcmNoKFwiXFxcXCR7W0EtWmEtejAtOV9dK1xcXFwudmFsdWV9XCIpO1xyXG4gICAgd2hpbGUgKHBhcmFtUG9zID49IDApIHtcclxuICAgICAgbGV0IHByZWZpeCA9IHhwYXRoLnN1YnN0cmluZygwLCBwYXJhbVBvcyk7XHJcbiAgICAgIGxldCB2YXJOYW1lID0geHBhdGguc3Vic3RyaW5nKHBhcmFtUG9zICsgMiwgeHBhdGguaW5kZXhPZihcIi5cIiwgcGFyYW1Qb3MpKTtcclxuICAgICAgbGV0IHN1ZmZpeCA9IHhwYXRoLnN1YnN0cmluZyh4cGF0aC5pbmRleE9mKFwifVwiLCBwYXJhbVBvcykgKyAxKTtcclxuXHJcbiAgICAgIHZhciBhdjtcclxuXHJcbiAgICAgIC8vSWYgdGhlcmUgSVMgYSByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUsIHdlIGNhbiB1c2UgdGhlIHZhbHVlIGRpcmVjdGx5LiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGZpbmQgaXQgaW4gdGhlIEFWU1xyXG4gICAgICBpZiAoISByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuXHJcbiAgICAgICAgLy9GaW5kIHRoZSBhdHRyaWJ1dGUsIG1hdGNoaW5nIHRoZSB2YXJOYW1lLlxyXG4gICAgICAgIC8vRG8gdGhpcyBmaXJzdCwgc28gd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSByZWxhdGVkIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgYSB2YWx1ZVxyXG5cclxuICAgICAgICAvL0l0ZXJhdGUgYXR0cmlidXRlcyB0byBmaW5kIG9uZSB0aGF0IG1hdGNoZXMgdGhlIHZhbHVlXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuZm9yRWFjaCgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpID0+IHtcclxuICAgICAgICAgIC8vQXR0cmlidXRlcyB0aGF0IG1hdGNoIHRoZSBuYW1lXHJcbiAgICAgICAgICBpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWUgPT09IHZhck5hbWUpIHtcclxuICAgICAgICAgICAgZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL0lmIHRoaXMgaXMgYSBncmlkLCBsb29rIGZvciBhdHRyaWJ1dGVzIGluIHRoZSByb3dcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBncmlkQ29sdW1uQXR0cmlidXRlICBvZiBhdHRyaWJ1dGUuYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgIC8vSWYgdGhlIG5hbWUgbWF0Y2hlcyBBTkQgdGhlIHZhbHVlIGluIHRoZSBBVlMgd2FzIHBhcnQgb2YgdGhlIFNBTUUgUk9XIHdlIGFyZSBldmFsdWF0aW5nIFhQQVRIIGZvciwgd2UgY2FuIHVzZSB0aGUgdmFsdWUgZm9yIGV2YWx1YXRpb25cclxuICAgICAgICAgICAgICBpZiAoZ3JpZENvbHVtbkF0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lID09PSB2YXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGdyaWRDb2x1bW5BdHRyaWJ1dGU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgbGV0IGF2cyA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgLy9JZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIGFuZCBoYXZlIHZhbHVlcy4uLlxyXG4gICAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSAmJiBhdnMpIHtcclxuXHJcbiAgICAgICAgICAvL0xvb2sgdGhyb3VnaCBhbGwgdGhlIHZhbHVlcyB0byBmaW5kIHRoZSBvbmUgZm9yIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSAoYW5kIFNBTUUgZ3JpZCByb3cgaWYgaW4gYSBncmlkIHJvdylcclxuICAgICAgICAgIGF2ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kKChhdikgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy9JZiB0aGlzIGlzIGFuIEFWIGZvciBhIGdyaWQgcm93LCBpdCBtdXN0IGJlIGZvciB0aGUgc2FtZSBncmlkIHJvdyB3ZSBhcmUgbG9va2luZyBmb3JcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vSWYgd2UgbG9va2VkIHVwIHRoZSBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHZhbHVlIGJ5IGlkIEFORCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGlzIHRoZSBvbmUgd2UgYXIgbG9va2luZyBmb3IgZnJvbSB0aGUgWFBBVEgsIHdlIGNhbiB1c2UgaXQgZm9yIGV2YWx1YXRpb25cclxuICAgICAgICAgICAgIC8vRm91bmQgYW4gQXR0cmlidXRlVmFsdWUgdGhhdCB0aGUgZGljdGlvbmFyeSBpcyBmaWx0ZXJlZCBieVxyXG4gICAgICAgICAgICBpZiAoZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgPT09IGF2LmlkQXR0cmlidXRlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9Vc2UgdGhlIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSBpZiBwcm92aWRlZCAodGhpcyBoYXBwZW5zIHdoZW4gYWxyZWFkeSBrbm93biwgZHVyaW5nIGNoYW5nZXMgdG8gdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlKVxyXG4gICAgICBpZiAocmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIidcIiArIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZS52YWx1ZSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICB9XHJcbiAgICAgIC8vRm91bmQgdGhlIEF0dHJpYnV0ZVZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHRoYXQgdGhlIGRpY3Rpb25hcnkgaXMgZmlsdGVyZWQgYnlcclxuICAgICAgZWxzZSBpZiAoYXYpIHtcclxuICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgYXYudmFsdWUgKyBcIidcIiArIHN1ZmZpeDtcclxuICAgICAgfVxyXG4gICAgICAvL0RpZG4ndCBmaW5kIGFuIGF0dHJpYnV0ZSBmb3IgdmFyTmFtZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvL01heWJlIHRoZSB2YXJOYW1lIGlzIGZyb20gZWxzZXdoZXJlIGluIHRoZSBhcHAgKG5vbi1DT0QpLCBhbmQgcHJvdmlkZWQgaW4gYm91bmREYXRhXHJcbiAgICAgICAgaWYgKHRoaXMuYm91bmREYXRhICYmIHRoaXMuYm91bmREYXRhW3Zhck5hbWVdKSB7XHJcbiAgICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgdGhpcy5ib3VuZERhdGFbdmFyTmFtZV0gKyBcIidcIiArIHN1ZmZpeDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9Ob3RoaW5nIG1hdGNoZXMuIENoYW5nZSB0byBlbXB0eSBzdHJpbmcuIFdpbGwgcHJvYmFibHkgcmVzdWx0IGluIE5PIGVudHJpZXMsIHdoaWNoIHdvdWxkIGJlIGNvcnJlY3QuXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJydcIiArIHN1ZmZpeDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBhcmFtUG9zID0geHBhdGguc2VhcmNoKFwiXFxcXCR7W0EtWmEtejAtOV9dK1xcXFwudmFsdWV9XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSGF2ZSB0byBldmFsdWF0ZSBzdWItZXhwcmVzc2lvbi4gVGhpcyBoYW5kbGVzIGV4cHJlc3Npb25zIGxpa2UgW0B4ID0gKC94cGF0aC1zdWItZXhwcmVzc2lvbildXHJcbiAgICBsZXQgaW5FeHByZXNzaW9uUG9zID0geHBhdGguc2VhcmNoKFwiXFxcXFtAW0EtWmEtejAtOV9dK1xcXFxzKj1cXFxccypcXFxcKFwiKTtcclxuXHJcbiAgICBpZiAoaW5FeHByZXNzaW9uUG9zID4gMCAmJiBzZWNvbmRhcnlYbWwpIHtcclxuICAgICAgbGV0IHByZWZpeCA9IHhwYXRoLnN1YnN0cmluZygwLCBpbkV4cHJlc3Npb25Qb3MgKyAxKTtcclxuICAgICAgbGV0IGV4cHJlc3Npb25FbmQgPSB4cGF0aC5pbmRleE9mKFwiKVwiLCBpbkV4cHJlc3Npb25Qb3MpO1xyXG4gICAgICBsZXQgdmFyaWFibGUgPSB4cGF0aC5zdWJzdHJpbmcoaW5FeHByZXNzaW9uUG9zICsgMSwgeHBhdGguaW5kZXhPZihcIj1cIiwgaW5FeHByZXNzaW9uUG9zKSk7XHJcbiAgICAgIGxldCBzdWJFeHByZXNzaW9uID0geHBhdGguc3Vic3RyaW5nKHhwYXRoLmluZGV4T2YoXCIoXCIsIGluRXhwcmVzc2lvblBvcykgKyAxLCBleHByZXNzaW9uRW5kKTtcclxuICAgICAgbGV0IHN1ZmZpeCA9IHhwYXRoLnN1YnN0cmluZyhleHByZXNzaW9uRW5kICsgMSk7XHJcblxyXG4gICAgICB4cGF0aCA9IHByZWZpeDtcclxuXHJcbiAgICAgIC8vRXZhbHVhdGUgWFBBVEggZXhwcmVzc2lvblxyXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgIGxldCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHNlY29uZGFyeVhtbCwgXCJhcHBsaWNhdGlvbi94bWxcIik7XHJcbiAgICAgIGxldCB4UGF0aFJlc3VsdCA9IGRvY3VtZW50LmV2YWx1YXRlKHN1YkV4cHJlc3Npb24sIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xyXG5cclxuICAgICAgLy9JdGVyYXRlIHhwYXRoIHJlc3VsdHMgKG5vZGVzKVxyXG4gICAgICB2YXIgbm9kZSA9IHhQYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XHJcblxyXG4gICAgICB3aGlsZShub2RlKSB7XHJcbiAgICAgICAgeHBhdGggPSB4cGF0aCArIHZhcmlhYmxlICsgXCI9J1wiICsgbm9kZS5ub2RlVmFsdWUgKyBcIidcIlxyXG5cclxuICAgICAgICBub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKTtcclxuXHJcbiAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgIHhwYXRoID0geHBhdGggKyBcIiBvciBcIjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHhwYXRoID0geHBhdGggKyBzdWZmaXg7XHJcbiAgICB9XHJcblxyXG4gICAgZHRvLmV4cHJlc3Npb24gPSB4cGF0aDtcclxuICAgIHJldHVybiBkdG87XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnRBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0KGE6IGFueSwgYjogYW55KSB7XHJcbiAgICByZXR1cm4gYS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIGZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3QoY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJmZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0OiBcIiArIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zXCI7XHJcbiAgICBsZXQgcGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbltdPih1cmwsIHtwYXJhbXM6IHBhcmFtc30pLnN1YnNjcmliZSgoY29uZmlndXJhdGlvbkxpc3Q6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25bXSkgPT4ge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0TG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICBsZXQgZHRvczogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNmZyBvZiBjb25maWd1cmF0aW9uTGlzdCkge1xyXG4gICAgICAgIGxldCBkdG86IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8gPSB0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oY2ZnKTtcclxuICAgICAgICBpZiAoZHRvKSB7XHJcbiAgICAgICAgICBkdG9zLnB1c2goZHRvKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGR0b3Muc29ydCh0aGlzLnNvcnRBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdCk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0U3ViamVjdC5uZXh0KGR0b3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnRBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdChhOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPLCBiOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKSB7XHJcbiAgICBjb25zdCBkaXNwbGF5YSA9IGEuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXlcclxuICAgICAgKyBhLmV4dGVuc2lvbkRlc2NyaXB0aW9uXHJcbiAgICAgICsgKGEuZmlsdGVyMURpc3BsYXkgfHwgXCJcIilcclxuICAgICAgKyAoYS5maWx0ZXIyRGlzcGxheSB8fCBcIlwiKTtcclxuXHJcbiAgICBjb25zdCBkaXNwbGF5YiA9IGIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXlcclxuICAgICAgKyBiLmV4dGVuc2lvbkRlc2NyaXB0aW9uXHJcbiAgICAgICsgKGIuZmlsdGVyMURpc3BsYXkgfHwgXCJcIilcclxuICAgICAgKyAoYi5maWx0ZXIyRGlzcGxheSB8fCBcIlwiKTtcclxuXHJcbiAgICByZXR1cm4gZGlzcGxheWEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGRpc3BsYXliLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgLy9Vc2VkIGJ5IGNvZC1lZGl0b3JcclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5pZEZpbHRlcjEgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlQXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9uc1wiLCBhdHRyaWJ1dGVDb25maWd1cmF0aW9uKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgICAgIHRoaXMucG9zdENvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcIi9lZGl0b3IvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24vXCIgKyBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUlkKGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogbnVtYmVyLCBpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXIsIGlkUGFyZW50T2JqZWN0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gIT09IC0xKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgbG9hZCBpZiB0aGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZFxyXG4gICAgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uICE9PSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgLy9DbGVhciBBU0FQXHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgPSBpZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG4gICAgICB0aGlzLmlkRmlsdGVyMSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5pZEZpbHRlcjIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlTWFwLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuXHJcbiAgICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgIH1cclxuICAgIC8vT3IgbG9hZCB0aGUgQXR0cmlidXRlVmFsdWVTZXQgaWYgdGhhdCBjaGFuZ2VkIChwb3NzaWJsZSB0byBzd2l0Y2ggZnJvbSBvbmUgZXZlbnQgdG8gYW5vdGhlciBvZiB0aGUgc2FtZSB0eXBlLCBmb3IgZXhhbXBsZVxyXG4gICAgLy9UaGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiBtdXN0IGFsc28gaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIGFuZCBub3QgYWxyZWFkeSB3b3JraW5nIG9uIGxvYWRpbmcgdGhlIHZhbHVlc1xyXG4gICAgZWxzZSBpZiAodGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ICE9PSBpZEF0dHJpYnV0ZVZhbHVlU2V0ICYmIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gaWRlbnRpZmllcnMgdG8gYmUgdXNlZCBieSB0aGlzIHNlcnZpY2UuICBUaGlzIHByb21wdHMgYSBuZXcgY29uZmlndXJhdGlvblxyXG4gICAqIHJlcXVlc3QgdG8gYmUgbWFkZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEZpbHRlcjFcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRGaWx0ZXIyXHJcbiAgICovXHJcbi8qIFRoaXMgaXMgY29tbWVudGVkIG91dCBmb3Igbm93IGJlY2F1c2UgaXQgaXMgYm90aCB1bmltcGxlbWVudGVkIGFuZCBpbmNvbXBsZXRlIChsb2FkaW5nIGEgY29uZmlndXJhdGlvblxyXG4gKiBmaWx0ZXIgd291bGQgcmVhbGx5IGFsc28gcmVxdWlyZSB0aGUgYXR0cmlidXRlIGNvbnRleHQgYW5kIGF0dHJpYnV0ZXNlY3VyaXR5IGNvbnRleHQgcGx1cyBhIHNlcnZpY2Ugb25cclxuICogdGhlIGJhY2sgZW5kIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGlzIHdvcmsuIEZvciBub3csIG9ubHkgbG9hZGluZyBieSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICpcclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uQnlGaWx0ZXIoaWRGaWx0ZXIxOiBudW1iZXIsIGlkRmlsdGVyMj86IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uQnlGaWx0ZXI6IFwiICsgaWRGaWx0ZXIxICsgXCIgXCIgKyBpZEZpbHRlcjIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIC8vdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMSA9IGlkRmlsdGVyMTtcclxuICAgIHRoaXMuaWRGaWx0ZXIyID0gaWRGaWx0ZXIyO1xyXG5cclxuICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKCk7XHJcbiAgfVxyXG4qL1xyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBpZCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC4gIFRoaXMgd2lsbCBwcm9tcHQgYSByZXF1ZXN0IHRvIHB1bGwgdGhpcyBmcm9tIHRoZSBiYWNrZW5kLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlVmFsdWVTZXRcclxuICAgKi9cclxuICBzZXRBdHRyaWJ1dGVWYWx1ZVNldChpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXIsIGlkUGFyZW50T2JqZWN0OiBudW1iZXIpIHtcclxuICAgIC8vT25seSBsb2FkIHRoZSBBdHRyaWJ1dGVWYWx1ZVNldCBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkXHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ICE9PSBpZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IGlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcblxyXG4gICAgICB0aGlzLmZldGNoQXR0cmlidXRlVmFsdWVTZXQoaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlcXVlc3QgdG8gZG93bmxvYWQgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uLlxyXG4gICAqL1xyXG4gIGZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbihpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXIsIGlkUGFyZW50T2JqZWN0OiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9PT0gLTEpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCg8QXR0cmlidXRlQ29uZmlndXJhdGlvbj57XHJcbiAgICAgICAgaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiAtMlxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmc7XHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gJiYgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPiAtMSkge1xyXG4gICAgICB1cmwgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9ucy9cIiArIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9UaGlzIGlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZFxyXG5cdCAgLy91cmwgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9ucy9maWx0ZXIvXCIgKyB0aGlzLmlkRmlsdGVyMTtcclxuICAgICAgLy9pZiAodGhpcy5pZEZpbHRlcjIpIHtcclxuICAgICAgICAvL3VybCArPSBcIi9cIiArIHRoaXMuaWRGaWx0ZXIyO1xyXG4gICAgICAvL31cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVybCkuc3Vic2NyaWJlKChhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgIC8vTm93IGxvYWQgdGhlIGF0dHJpYnV0ZVZhbHVlU2V0IC0gVGhpcyB3aWxsIGFsd2F5cyBoYXBwZW4gd2hlbiBhIG5ldyBjb25maWd1cmF0aW9uIGlzIGxvYWRlZFxyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB1bmRlZmluZWQ7IC8vRm9yY2UgaXQgdG8gY2hhbmdlIGluIHRoaXMgc2NlbmFyaW9cclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVWYWx1ZVNldChpZEF0dHJpYnV0ZVZhbHVlU2V0LCBpZFBhcmVudE9iamVjdCk7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24odW5kZWZpbmVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5jbGVhcigpO1xyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQXR0cmlidXRlU2VydmljZS5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmJhc2VXaW5kb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0QmFzZVdpbmRvd0RpbWVuc2lvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmJhc2VXaW5kb3dUZW1wbGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMpIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMuc29ydCgoYTogQXR0cmlidXRlQ29udGFpbmVyLCBiOiBBdHRyaWJ1dGVDb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGlmIChhLnNvcnRPcmRlciA8IGIuc29ydE9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS5zb3J0T3JkZXIgPiBiLnNvcnRPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVDb250YWluZXIgb2YgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRmlyc3Qgc29ydCBhdHRyaWJ1dGVzIHVzaW5nIHRoZSB5IGFuZCB4IHBvc2l0aW9uaW5nLiAgSWYgdXNpbmcgYWJzb2x1dGUgcG9zaXRpb24sIHRoZSBvcmRlciBkb2Vzbid0IG1hdHRlcixcclxuICAgICAgICAgKiBidXQgaWYgd2Ugd2FudCB0aGUgYWJzb2x1dGUgcG9zaXRpb25pbmcgdG8gZ3VpZGUgYXV0byBsYXlvdXQsIHRoZW4gdXNlIHRoaXMgb3JkZXIuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYXR0cmlidXRlQ29udGFpbmVyLmdyYXBoaWNhbEF0dHJpYnV0ZXMuc29ydCgoYTogR3JhcGhpY2FsQXR0cmlidXRlLCBiOiBHcmFwaGljYWxBdHRyaWJ1dGUpID0+IHtcclxuICAgICAgICAgIGlmIChhLnRhYk9yZGVyIDwgYi50YWJPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGEudGFiT3JkZXIgPiBiLnRhYk9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuc2V0KGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSwgYXR0cmlidXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pKTtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByZXF1ZXN0IHRvIHB1bGwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzZXQuXHJcbiAgICogUmVxdWlyZWQgdGhlIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gdG8gYmUgcHJlLWxvYWRlZFxyXG4gICAqL1xyXG4gIGZldGNoQXR0cmlidXRlVmFsdWVTZXQoaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5pZFBhcmVudE9iamVjdCA9IGlkUGFyZW50T2JqZWN0O1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1zZXQvXCIgKyB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKGlkUGFyZW50T2JqZWN0KT9pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuICAgIC8vQ2xlYXIgQVNBUFxyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlVmFsdWVTZXQ+KHVybCwge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlU2V0OiBBdHRyaWJ1dGVWYWx1ZVNldCkgPT4ge1xyXG4gICAgICAvL0luaXRpYWxpemUgYXR0cmlidXRlVmFsdWVzIGlmIGl0IGRvZXMgbm90IGV4aXN0XHJcbiAgICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFzZVdpbmRvd0RpbWVuc2lvbihiYXNlV2luZG93VGVtcGxhdGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5odHRwLmdldCh0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJiYXNlLXdpbmRvdy1kaW1lbnNpb25cIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJiYXNlV2luZG93VGVtcGxhdGVcIiwgYmFzZVdpbmRvd1RlbXBsYXRlKX0pXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRpbWVuc2lvbjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRGltZW5zaW9uU3ViamVjdC5uZXh0KGRpbWVuc2lvbik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3VycmVudGx5IGEgc2ltcGxlIG5vdGlmaWVyIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gb3IgYXR0cmlidXRlIHZhbHVlIHNldCBoYXMgY2hhbmdlZCBhbmQgY29tcG9uZW50cyBtYXkgbmVlZCB0byBiZSByZWZyZXNoZWQuXHJcbiAgICpcclxuICAgKi9cclxuICBub3RpZnlBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb250YWluZXJVcGRhdGVkLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQb3N0IHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBhZnRlciBlZGl0aW5nLiAgUG9zdCB0aGUgZW50aXJlIHRoaW5nIGFzIGl0IGNhc2NhZGVzIGRvd24uICBUaGUgZWRpdG9yIGFsbG93cyB5b3VcclxuICAgKiB0byBtb2RpZnkgZXZlcnkgY29udGFpbmVyIGFuZCBvbmx5IHRoZW4gc2F2ZSB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwb3N0QXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9ucy9cIiArIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLnNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBhdHRyaWJ1dGVDb25maWd1cmF0aW9uKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy8gUHJldmVudCBlcnJvciBpbiBzdWJzZXF1ZW50IHNhdmVzLiBTZWUgTWV0YWJ1aWxkZXIgLyBNQi0yM1xyXG4gICAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVybCkuc3Vic2NyaWJlKChhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Q29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzZXQuICBXaGVuIGVkaXRpbmcsIGF0dHJpYnV0ZXMgYWxyZWFkeSBwb3N0IHRoZWlyIHVwZGF0ZWQgdmFsdWVzIHRvIHRoaXMgc2VydmljZXMgdW5kZXJcclxuICAgKiBhIHNlcGFyYXRlIGFycmF5LiAgV2hhdCB3ZSBkbyBpcyBtZXJnZSBpbiB0aGVzZSB1cGRhdGVkIG9yIGNyZWF0ZWQgdmFsdWVzIHdpdGggdGhlIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlIHNldCAoYXZzKS5cclxuICAgKiBXaGlsZSBkb2luZyB0aGlzLCBzZXQgdGhlIGlkIG9mIHRoZSBhdnMgYW5kIG51bGxpZnkgYW55IG5lZ2F0aXZlIGlkcy5cclxuICAgKi9cclxuICB1cGRhdGVBdHRyaWJ1dGVWYWx1ZVNldCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtc2V0L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuICAgIGxldCBhdnM6IEF0dHJpYnV0ZVZhbHVlU2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSk7XHJcbiAgICBmb3IgKGxldCBpID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPCAwKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXNbal0gPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhdnMuYXR0cmlidXRlVmFsdWVzID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5jb25jYXQodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzKTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHJlc3VsdFN1YmplY3Q6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+KCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnB1dCh1cmwsIGF2cywge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlU2V0OiBBdHRyaWJ1dGVWYWx1ZVNldCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL0luaXRpYWxpemUgYXR0cmlidXRlVmFsdWVzIGlmIGl0IGRvZXMgbm90IGV4aXN0XHJcbiAgICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgICAvL1NlbmQgdGhlIHJlc3VsdHMgdG8gdGhlIG9ic2VydmVyIChpZiBhbnkpLCB0aGVuIGNvbXBsZXRlXHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICByZXN1bHRTdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5lcnJvcihlcnJvcik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlydHlTdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXJ0eTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0O1xyXG4gICAqXHJcbiAgICogQHJldHVybnMge0JlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVTZXQoKTogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdDtcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGJhc2VkIHVwb24gdGhlIGlkQXR0cmlidXRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlc1xyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVWYWx1ZVtdfVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlcyhpZEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiBBdHRyaWJ1dGVWYWx1ZVtdIHtcclxuXHJcbiAgICBsZXQgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdID0gW107XHJcblxyXG4gICAgaWYodGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG5cclxuICAgICAgLy9HbyB0aHJvdWdoIGFsbCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIGZpcnN0IChzbyB3ZSBwcmVzZXJ2ZSBhY3Jvc3MgY2hhbmdpbmcgdGFicywgZXRjKVxyXG4gICAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlICYmICghZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBncm91cEF0dHJpYnV0ZVJvd0lkID09PSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgJiYgKCFncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5ncm91cEF0dHJpYnV0ZVJvd0lkKSkge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL0dvIHRocm91Z2ggYWxsIHRoZSByZWd1bGFyIGF0dHJpYnV0ZXNcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlVmFsdWUgb2YgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICAvL1JlZ3VsYXIgYXR0cmlidXRlcyAobm9ybWFsIGFuZCBncm91cCwgd2hpY2ggZ2V0IG11bHRpcGxlKVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgfHwgYXR0cmlidXRlVmFsdWUuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIC8vSWYgcm93IGlkIHNwZWNpZmllZCwgb25seSBjYXJlIGFib3V0IHZhbHVlcyBmb3IgdGhhdCByb3dcclxuICAgICAgICAgIGlmICh0eXBlb2YgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gJ3VuZGVmaW5lZCcgfHwgYXR0cmlidXRlVmFsdWUuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkge1xyXG5cclxuICAgICAgICAgICAgLy9JZiBub3QgYWxyZWFkeSBhZGRlZC4uLlxyXG4gICAgICAgICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZXMuZmluZCgoZXhpc3RpbmcpID0+IGV4aXN0aW5nLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpKSB7XHJcblxyXG4gICAgICAgICAgICAgIC8vRG9uJ3Qgd2FudCB0aGUgb3JpZ2luYWwgaWYgaXQgd2FzIHJlbW92ZWQgKHNsaWNlZClcclxuICAgICAgICAgICAgICBpZiAoISB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maW5kKChzYXYpID0+IHNhdi5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgYXR0cmlidXRlVmFsdWUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBjaGlsZCBhdHRyaWJ1dGVzIG9mIHRoZSBpZEF0dHJpYnV0ZS4gIE1vc3QgbGlrZWx5IGZvciBhdHRyaWJ1dGVzIHRoYXQgZGVmaW5lIGNvbHVtbnMgb2YgYSBncmlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZVtdfVxyXG4gICAqL1xyXG4gIGdldEdyb3VwQXR0cmlidXRlcyhpZEF0dHJpYnV0ZTogbnVtYmVyKTogQXR0cmlidXRlW10ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZVtdID0gW107XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVNYXAuZm9yRWFjaCgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpID0+IHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYXR0cmlidXRlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgd2lkdGggd2hpY2ggaXMgYSByZXF1aXJlbWVudCBvZiB0aGUgYWJzb2x1dGUgcG9zaXRpb25pbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcclxuICAgKi9cclxuICBzZXRXaWR0aCh3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHdpZHRoLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cclxuICBnZXRXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMud2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGFycmF5IG9mIGF0dHJpYnV0ZSBjaG9pY2VzIGZvciB0aGUgaWRBdHRyaWJ1dGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlQ2hvaWNlW119XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlQ2hvaWNlcyhpZEF0dHJpYnV0ZTogbnVtYmVyKTogQXR0cmlidXRlQ2hvaWNlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwLmdldChpZEF0dHJpYnV0ZSkuYXR0cmlidXRlQ2hvaWNlcztcclxuICB9XHJcblxyXG4gIGdldExvYWRpbmdTdWJqZWN0KCk6IFN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGNvbnRhaW5lclVwZGF0ZWQgc3ViamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtTdWJqZWN0PG51bWJlcj59XHJcbiAgICovXHJcbiAgZ2V0Q29udGFpbmVyVXBkYXRlZCgpOiBTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93U2F2ZWRTdWJqZWN0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkUm93U2F2ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93RGVsZXRlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRSb3dEZWxldGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgYXR0cmlidXRlIHZhbHVlIGFycmF5cy5cclxuICAgKlxyXG4gICAqL1xyXG4gIGNsZWFyVXBkYXRlZEF0dHJpYnV0ZVZhbHVlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB0aGlzLm5vdGlmeUF0dHJpYnV0ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSB1cGRhdGVkIGFuZCBkZWxldGVkIGdyaWQgcm93IGF0dHJpYnV0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZ3JpZCByb3dcclxuICAgKlxyXG4gICAqL1xyXG4gIGNsZWFyVXBkYXRlZEdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVtYWluaW5nQXR0cmlidXRlcyA9IFtdO1xyXG5cclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgIC8vU2hvdWxkbid0IGJlIGEgbmVlZCB0byBjaGFuZ2UgZGlydHkgb3Igbm90aWZ5IGF0dHJpYnV0ZXNcclxuICB9XHJcblxyXG4gIHNhdmVHcmlkUm93QXR0cmlidXRlVmFsdWVzKGlkR3JvdXBBdHRyaWJ1dGU6IG51bWJlciwgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcm93VmFsdWVzID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQgJiYgYXYuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRHcm91cEF0dHJpYnV0ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgLy9zZXQgdGhlIGlkQXR0cmlidXRlVmFsdWVTZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIGlmICghIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vcmVtb3ZlIGFsbCBuZWdhdGl2ZSBpZHMgKG5ldyB2YWx1ZXMpXHJcbiAgICAgIGlmIChyb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRm9yIG11bHRpIHZhbHVlcyB0aGF0IHdlcmUgc2xpY2VkIChkZS1zZWxlY3RlZCkgd2UncmUgZ29pbmcgdG8gZmluZCB0aGVtIGFuZCBudWxsIG91dCB0aGUgdmFsdWUsIGluc3RlYWQgb2YgcmVtb3ZpbmcuXHJcbiAgICAvL1RoYXQgbWVhbnMgdGhleSBhY3RhdWxseSBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSByb3dWYWx1ZXNcclxuICAgIC8vUmVtb3ZlZCBtdWx0aSB2YWx1ZXMgd2l0aGluIGFuIGV4aXN0aW5nIHJvd1xyXG4gICAgbGV0IHJlbW92ZWRWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlbW92ZWRWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJlbW92ZWRWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJvd1ZhbHVlcy5wdXNoKHJlbW92ZWRWYWx1ZXNbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhdmdyOkF0dHJpYnV0ZVZhbHVlR3JpZFJvdyA9IDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+e1xyXG4gICAgICAgIGlkQXR0cmlidXRlVmFsdWVTZXQ6IHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCxcclxuICAgICAgICBpZEdyb3VwQXR0cmlidXRlOiBpZEdyb3VwQXR0cmlidXRlLFxyXG4gICAgICAgIGdyb3VwQXR0cmlidXRlUm93SWQ6IGdyb3VwQXR0cmlidXRlUm93SWQsXHJcbiAgICAgICAgYXR0cmlidXRlVmFsdWVzOiByb3dWYWx1ZXNcclxuICAgICAgfTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsICh0aGlzLmlkUGFyZW50T2JqZWN0KT90aGlzLmlkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICAvL1NhdmUgbmV3IHJvd1xyXG4gICAgaWYgKGdyb3VwQXR0cmlidXRlUm93SWQgPCAwKSB7XHJcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYXZnciwge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdzogQXR0cmlidXRlVmFsdWVHcmlkUm93KSA9PiB7XHJcblxyXG4gICAgICAgIC8vQWRkIHRoZSBncmlkIHJvdyB0byB0aGUgb3JpZ2luYWwgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAgICAgIGxldCBhdnM6QXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSB1cGRhdGVkIGFuZCBzbGljZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3csIG5vdyAodGhlc2UgYXJlIHRoZSBvbGQgb25lcyB3aXRoIHRoZSBuZWdhdGl2ZSByb3dpZClcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vVXBkYXRlIGV4aXN0aW5nIHJvd1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaHR0cC5wdXQodXJsLCBhdmdyLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVHcmlkUm93OiBBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cpID0+IHtcclxuXHJcbiAgICAgICAgLy9BZGQgdGhlIGdyaWQgcm93IHRvIHRoZSBvcmlnaW5hbCBhdHRyaWJ1dGUgdmFsdWVzXHJcbiAgICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIGFsbCBvbGQgdmFsdWVzIGZvciByb3dcclxuICAgICAgICBsZXQgaW5kZXggPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmRJbmRleCgoYXYpPT4gKGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQgJiYgYXYuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRHcm91cEF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSBzbGljZWQgYW5kIHVwZGF0ZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3dcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIC8vRmlsdGVyIHRvIG9ubHkgYXR0cmlidXRlcyB0byBLRUVQIC0gKGkuZS4gbm90IHRoZSBzYW1lIGdyaWQgb3Igbm90IHRoZSByb3cgYmVpbmcgZGVsZXRlZClcclxuICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcyA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gKGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUgfHwgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gcmVmcmVzaCBhIGdyaWQgcm93IGFmdGVyIHBsdWdpbiBleGVjdXRpb24gd2l0aG91dCBhZmZlY3Rpbmcgb3RoZXIgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAqIE5vcm1hbGx5IHNhdmluZyB0aGUgZ3JpZCByb3cgdXBkYXRlcyB0aGUgdmFsdWVzLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgZXhlY3V0ZSBhIHN1YnNlcXVlbnQgcGx1Z2luIGFuZCBuZWVkIGFuIGV4dHJhIHJlZnJlc2ggdG8gcGljayB1cCBjaGFuZ2VzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVHcmlkUm93fSBhdmdyXHJcbiAgICovXHJcbiAgcmVmcmVzaEdyaWRSb3coYXZncjogQXR0cmlidXRlVmFsdWVHcmlkUm93KSB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuICBcclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJpZEdyb3VwQXR0cmlidXRlXCIsIGF2Z3IuaWRHcm91cEF0dHJpYnV0ZSlcclxuICAgIC5zZXQoXCJncm91cEF0dHJpYnV0ZVJvd0lkXCIsIGF2Z3IuZ3JvdXBBdHRyaWJ1dGVSb3dJZClcclxuICAgIC5zZXQoXCJpZEF0dHJpYnV0ZVZhbHVlU2V0XCIsIGF2Z3IuaWRBdHRyaWJ1dGVWYWx1ZVNldClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuICBcclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuICBcclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlVmFsdWVHcmlkUm93Pih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG4gICAgICBcclxuICAgICAgLy9Ob3RlIHRoYXQgdGhlIHNsaWNlZCBhbmQgdXBkYXRlZCB2YWx1ZXMgZm9yIHRoZSBncmlkIHJvdyB3ZXJlIGFscmVhZHkgY2xlYW5lZCB1cCBkdXJpbmcgdGhlIHNhdmVcclxuICBcclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICBcclxuICAgICAgLy9SZW1vdmUgYWxsIG9sZCB2YWx1ZXMgZm9yIHJvd1xyXG4gICAgICBsZXQgaW5kZXggPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmRJbmRleCgoYXYpPT4gKGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5ncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5pZEdyb3VwQXR0cmlidXRlKSk7XHJcbiAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgLy9SZW1vdmUgdmFsdWVcclxuICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgXHJcbiAgICAgICAgLy9GaW5kIHRoZSBuZXh0IG9uZVxyXG4gICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAmJiBhdi5pZEdyb3VwQXR0cmlidXRlID09PSBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuaWRHcm91cEF0dHJpYnV0ZSkpO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIG1hcC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKi9cclxuICBwdXNoQXR0cmlidXRlKGF0dHJpYnV0ZTogQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5zZXQoYXR0cmlidXRlLmlkQXR0cmlidXRlLCBhdHRyaWJ1dGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpQ2hvaWNlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgLy9SZW1vdmUgZnJvbSBzbGljZWQgaWYgcHJlc2VudFxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZSAmJiB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9PT0gYXR0cmlidXRlVmFsdWUudmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSBzbGljZWQgYXR0cmlidXRlIHZhbHVlcyAobm8gbG9uZ2VyIHJlbW92aW5nKVxyXG4gICAgaWYgKGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9PdGhlcndpc2UgcHVzaCB0aGUgdmFsdWUsIHNvIGl0IHdpbGwgYmUgc2F2ZWRcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnB1c2hBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdXNoQXR0cmlidXRlVmFsdWVNdWx0aURpY3QoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSBuZXcgb3IgdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWUuICBUaGUgY3VycmVudCBvbmUgaXMganVzdCByZW1vdmVkIGFuZCB0aGUgbmV3IG9uZSBhcHBlbmRlZCB0byB0aGUgYXJyYXkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZVZhbHVlfSBhdHRyaWJ1dGVWYWx1ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwicHVzaEF0dHJpYnV0ZVZhbHVlXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWUpO1xyXG5cclxuICAgIC8vT25seSBzZXR0aW5nIGRpcnR5IGZvciBub24gZ3JpZC1yb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciBwdXNoaW5nIG11bHRpcGxlIGF0dHJpYnV0ZSB2YWx1ZXMgYXQgb25jZS4gIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGZvciBhIG11bHRpIGNob2ljZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZVZhbHVlW119IGF0dHJpYnV0ZVZhbHVlc1xyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIGF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVzXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlICE9PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdID0gYXR0cmlidXRlVmFsdWVzW2ldO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBzZXR0aW5nIGRpcnR5IGZvciBub24gZ3JpZC1yb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIGEgdmFsdWUgaW4gdGhlIGNhc2Ugd2hlcmUgYW4gYXR0cmlidXRlIHZhbHVlIGRvZXNuJ3QgZXhpc3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHZhbHVlXHJcbiAgICovXHJcbiAgcHVzaFZhbHVlKGF0dHJpYnV0ZTogQXR0cmlidXRlLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlID0gPEF0dHJpYnV0ZVZhbHVlPntcclxuICAgICAgaWRBdHRyaWJ1dGU6IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSxcclxuICAgICAgaWRBdHRyaWJ1dGVWYWx1ZVNldDogdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIlRYVFwiKSB7XHJcbiAgICAgIGF0dHJpYnV0ZVZhbHVlLnZhbHVlTG9uZ1RleHQgPSB7XHJcbiAgICAgICAgaWRMb25nVGV4dDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHRleHREYXRhOiB2YWx1ZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgdmFsdWUuICBUeXBpY2FsbHkgaW4gdGhlIGNhc2Ugb2YgYSBtdWx0aSBzZWxlY3Qgd2hlcmUgdGhlIHVuc2VsZWN0ZWQgdmFsdWUgaXMgcmVtb3ZlZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNob2ljZX0gYXR0cmlidXRlQ2hvaWNlXHJcbiAgICovXHJcbiAgc3BsaWNlQXR0cmlidXRlVmFsdWVDaG9pY2UoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIGF0dHJpYnV0ZUNob2ljZTogQXR0cmlidXRlQ2hvaWNlKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInNsaWNlQXR0cmlidXRlVmFsdWU6IFwiICsgYXR0cmlidXRlLmlkQXR0cmlidXRlICsgXCIsIFwiICsgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9PT0gYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIChub3QgcHJldmlvdXNseSBzYXZlZClcclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9BZGQgdG8gc2xpY2VkIHZhbHVlcyAocHJldmlvdXNseSBzYXZlZCAtIG5lZWQgdG8gcmVtb3ZlKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICYmIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnB1c2godGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IGZsYWdnaW5nIGRpcnR5IGZvciBub24tZ3JpZCByb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZURpY3QoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSAmJiB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIChub3QgcHJldmlvdXNseSBzYXZlZClcclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9BZGQgdG8gc2xpY2VkIHZhbHVlcyAocHJldmlvdXNseSBzYXZlZCAtIG5lZWQgdG8gcmVtb3ZlKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICYmIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlIGJhc2VkIHVwb24gdGhlIGlkQXR0cmlidXRlLiAgVGhpcyBpcyBmcm9tIHRoZSBtYXAgb2YgYXR0cmlidXRlcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGV9XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwLmdldChpZEF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uLCBzZXQgYWxsIG9mIHRoZSBuZWdhdGl2ZSBpZHMgdG8gdW5kZWZpbmVkIHByaW9yIHRvIHBvc3RpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBzZXROZWdhdGl2ZUlkc1RvVW5kZWZpbmVkKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA8IDApIHtcclxuICAgICAgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgYXR0cmlidXRlQ29udGFpbmVyIG9mIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICBpZiAoYXR0cmlidXRlQ29udGFpbmVyLmlkQXR0cmlidXRlQ29udGFpbmVyICA8IDApIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcykge1xyXG5cclxuICAgICAgICBpZiAoYXR0cmlidXRlLmlkQXR0cmlidXRlICA8IDApIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlQ2hvaWNlcykge1xyXG4gICAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlQ2hvaWNlIG9mIGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVbXCJ2YWx1ZVwiXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlICA8IDApIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgY29udGV4dCBjb2RlIGFuZCBpZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gY29uZmlndXJhdGlvblxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgZ2V0Q29uZmlndXJhdGlvbk5hbWUoY29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyk6IHN0cmluZyB7XHJcbiAgICBpZiAoY29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBcIk5ld1wiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBjb25maWd1cmF0aW9uLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHREaXNwbGF5ICsgXCI6IFwiICsgY29uZmlndXJhdGlvbi5leHRlbnNpb25EZXNjcmlwdGlvbjtcclxuXHJcbiAgICBpZiAoY29uZmlndXJhdGlvbi5pZEZpbHRlcjEpIHtcclxuICAgICAgbmFtZSArPSBcIiAtIFwiICsgY29uZmlndXJhdGlvbi5maWx0ZXIxRGlzcGxheTtcclxuICAgIH1cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMikge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjJEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKGNmZzogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8ge1xyXG4gICAgaWYgKCFjZmcpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZHRvOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPID0gPEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+e1xyXG4gICAgICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IGNmZy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24sXHJcbiAgICAgIGNvZGVBdHRyaWJ1dGVDb250ZXh0OiBjZmcuY29kZUF0dHJpYnV0ZUNvbnRleHQsXHJcbiAgICAgIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0LFxyXG4gICAgICBpZEZpbHRlcjE6IGNmZy5pZEZpbHRlcjEsXHJcbiAgICAgIGlkRmlsdGVyMjogY2ZnLmlkRmlsdGVyMlxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBkdG8uZXh0ZW5zaW9uRGVzY3JpcHRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoY3R4OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY3R4LmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZUNvbnRleHQ7XHJcbiAgICAgIH0pWzBdLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuICAgICAgbGV0IHJlc3VsdDogYW55W10gPSB0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICAgJiYgZmlsdGVyLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIxID09PSBjZmcuaWRGaWx0ZXIxO1xyXG4gICAgICB9KTtcclxuICAgICAgZHRvLmZpbHRlcjFEaXNwbGF5ID0gKHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCkgPyByZXN1bHRbMF0uZGlzcGxheSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICAgJiYgZmlsdGVyLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIxID09PSBjZmcuaWRGaWx0ZXIxXHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIyID09PSBjZmcuaWRGaWx0ZXIyO1xyXG4gICAgICB9KTtcclxuICAgICAgZHRvLmZpbHRlcjJEaXNwbGF5ID0gKHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCkgPyByZXN1bHRbMF0uZGlzcGxheSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHRvO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VjdXJpdHlDb2RlQ29udGV4dChjb2RlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZTtcclxuICAgIH0pWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXRGaWx0ZXIxRm9yKGNvZGVBdHRyaWJ1dGVDb250ZXh0OiBzdHJpbmcsIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtLmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlQ29udGV4dCAmJiBpdGVtLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjJGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nLCBpZEZpbHRlcjE6IG51bWJlcik6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtLmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFxyXG4gICAgICAgICYmIGl0ZW0uaWRGaWx0ZXIxID09PSBpZEZpbHRlcjE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYWNrIG5ldyBpZEF0dHJpYnV0ZVZhbHVlcyB2aWEgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIGludGVybmFsIHRyYWNraW5nLiAgUmVtb3ZlIHRoaXMgZmFrZSBpZCBwcmlvciB0byBwb3N0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cclxuICBnZXRVbmlxdWVJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIC0tdGhpcy51bmlxdWVJZDtcclxuICB9XHJcbn1cclxuIl19
|