occam-languages 0.0.134 → 0.0.136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/context/release.js +5 -1
- package/lib/utilities/verification.js +76 -110
- package/package.json +1 -2
- package/src/context/release.js +6 -0
- package/src/utilities/verification.js +114 -184
package/lib/context/release.js
CHANGED
|
@@ -61,6 +61,10 @@ class ReleaseContext {
|
|
|
61
61
|
getDependencyReleaseContexts() {
|
|
62
62
|
return this.dependencyReleaseContexts;
|
|
63
63
|
}
|
|
64
|
+
matchDependencyName(dependencyName) {
|
|
65
|
+
const dependencyNameMatches = this.name === dependencyName;
|
|
66
|
+
return dependencyNameMatches;
|
|
67
|
+
}
|
|
64
68
|
getReleaseContext() {
|
|
65
69
|
const releaseContext = this; ///
|
|
66
70
|
return releaseContext;
|
|
@@ -333,4 +337,4 @@ class ReleaseContext {
|
|
|
333
337
|
}
|
|
334
338
|
}
|
|
335
339
|
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L3JlbGVhc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5pbXBvcnQgeyB2ZXJpZnlUeXBlUHJlZml4ZXMsIHZlcmlmeUZpbGVDb250ZXh0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvdmVyaWZ5XCI7XG5pbXBvcnQgeyBjb21iaW5lZEN1c3RvbUdyYW1tYXJGcm9tUmVsZWFzZUNvbnRleHRzIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jdXN0b21HcmFtbWFyXCI7XG5pbXBvcnQgeyBmaWxlQ29udGV4dHNGcm9tSlNPTiwgZmlsZUNvbnRleHRzRnJvbUVudHJpZXMgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2ZpbGVDb250ZXh0XCI7XG5pbXBvcnQgeyBUUkFDRV9MRVZFTCwgREVCVUdfTEVWRUwsIElORk9fTEVWRUwsIFdBUk5JTkdfTEVWRUwsIEVSUk9SX0xFVkVMLCBCUkVBS19NRVNTQUdFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCB7IHB1c2gsIHRhaWwsIGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVsZWFzZUNvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihsb2csIG5hbWUsIGpzb24sIGVudHJpZXMsIGNhbGxiYWNrLCBjdXN0b21HcmFtbWFyLCB2ZXJpZmllcywgaW5pdGlhbGlzZWQsIGZpbGVDb250ZXh0cywgY29tYmluZWRDdXN0b21HcmFtbWFyLCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKSB7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmpzb24gPSBqc29uO1xuICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuY3VzdG9tR3JhbW1hciA9IGN1c3RvbUdyYW1tYXI7XG4gICAgdGhpcy52ZXJpZmllcyA9IHZlcmlmaWVzO1xuICAgIHRoaXMuaW5pdGlhbGlzZWQgPSBpbml0aWFsaXNlZDtcbiAgICB0aGlzLmZpbGVDb250ZXh0cyA9IGZpbGVDb250ZXh0cztcbiAgICB0aGlzLmNvbWJpbmVkQ3VzdG9tR3JhbW1hciA9IGNvbWJpbmVkQ3VzdG9tR3JhbW1hcjtcbiAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzO1xuICB9XG5cbiAgZ2V0TG9nKCkge1xuICAgIHJldHVybiB0aGlzLmxvZztcbiAgfVxuXG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIGdldEpTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuanNvbjtcbiAgfVxuXG4gIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcztcbiAgfVxuXG4gIGdldENhbGxiYWNrKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrO1xuICB9XG5cbiAgZ2V0Q3VzdG9tR3JhbW1hcigpIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21HcmFtbWFyO1xuICB9XG5cbiAgZ2V0VmVyaWZpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyaWZpZXM7XG4gIH1cblxuICBpc0luaXRpYWxpc2VkKCkge1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxpc2VkO1xuICB9XG5cbiAgZ2V0RmlsZUNvbnRleHRzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZXh0cztcbiAgfVxuXG4gIGdldENvbWJpbmVkQ3VzdG9tR3JhbW1hcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEN1c3RvbUdyYW1tYXI7XG4gIH1cblxuICBnZXREZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKCkge1xuICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHM7XG4gIH1cblxuICBnZXRSZWxlYXNlQ29udGV4dCgpIHtcbiAgICBjb25zdCByZWxlYXNlQ29udGV4dCA9IHRoaXM7ICAvLy9cblxuICAgIHJldHVybiByZWxlYXNlQ29udGV4dDtcbiAgfVxuXG4gIGdldERlcHRoKCkge1xuICAgIGNvbnN0IGRlcHRoID0gMDtcblxuICAgIHJldHVybiBkZXB0aDtcbiAgfVxuXG4gIGhhc1ZlcmlmaWVkKCkge1xuICAgIGNvbnN0IHZlcmlmaWVkID0gdGhpcy52ZXJpZmllczsgLy8vXG5cbiAgICByZXR1cm4gdmVyaWZpZWQ7XG4gIH1cblxuICBpc1JlbGVhc2VkKCkge1xuICAgIGNvbnN0IHJlbGVhc2VkID0gKHRoaXMuanNvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gcmVsZWFzZWQ7XG4gIH1cblxuICBnZXRUeXBlUHJlZml4KCkge1xuICAgIGxldCB0eXBlUHJlZml4ID0gbnVsbDtcblxuICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICB0eXBlUHJlZml4ZXMgPSB0aGlzLmdldFR5cGVQcmVmaXhlcyhpbmNsdWRlRGVwZW5kZW5jaWVzKSxcbiAgICAgICAgICB0eXBlUHJlZml4ZXNMZW5ndGggPSB0eXBlUHJlZml4ZXMubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVQcmVmaXhlc0xlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3RUeXBlUHJlZml4ID0gZmlyc3QodHlwZVByZWZpeGVzKTtcblxuICAgICAgdHlwZVByZWZpeCA9IGZpcnN0VHlwZVByZWZpeDsgLy8vXG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVQcmVmaXg7XG4gIH1cblxuICBnZXRMYWJlbHMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBsYWJlbHMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRMYWJlbHMgPSBmaWxlQ29udGV4dC5nZXRMYWJlbHMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKGxhYmVscywgZmlsZUNvbnRleHRMYWJlbHMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0TGFiZWxzID0gcmVsZWFzZUNvbnRleHQuZ2V0TGFiZWxzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2gobGFiZWxzLCByZWxlYXNlQ29udGV4dExhYmVscyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgZ2V0VHlwZXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCB0eXBlcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dFR5cGVzID0gZmlsZUNvbnRleHQuZ2V0VHlwZXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKHR5cGVzLCBmaWxlQ29udGV4dFR5cGVzKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dFR5cGVzID0gcmVsZWFzZUNvbnRleHQuZ2V0VHlwZXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaCh0eXBlcywgcmVsZWFzZUNvbnRleHRUeXBlcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZXM7XG4gIH1cblxuICBnZXRSdWxlcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHJ1bGVzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0UnVsZXMgPSBmaWxlQ29udGV4dC5nZXRSdWxlcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2gocnVsZXMsIGZpbGVDb250ZXh0UnVsZXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0UnVsZXMgPSByZWxlYXNlQ29udGV4dC5nZXRSdWxlcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKHJ1bGVzLCByZWxlYXNlQ29udGV4dFJ1bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBydWxlcztcbiAgfVxuXG4gIGdldEF4aW9tcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGF4aW9tcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dEF4aW9tcyA9IGZpbGVDb250ZXh0LmdldEF4aW9tcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2goYXhpb21zLCBmaWxlQ29udGV4dEF4aW9tcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRBeGlvbXMgPSByZWxlYXNlQ29udGV4dC5nZXRBeGlvbXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaChheGlvbXMsIHJlbGVhc2VDb250ZXh0QXhpb21zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBheGlvbXM7XG4gIH1cblxuICBnZXRMZW1tYXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBsZW1tYXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRMZW1tYXMgPSBmaWxlQ29udGV4dC5nZXRMZW1tYXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKGxlbW1hcywgZmlsZUNvbnRleHRMZW1tYXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxlbW1hcztcbiAgfVxuXG4gIGdldFRoZW9yZW1zKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgdGhlb3JlbXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRUaGVvcmVtcyA9IGZpbGVDb250ZXh0LmdldFRoZW9yZW1zKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaCh0aGVvcmVtcywgZmlsZUNvbnRleHRUaGVvcmVtcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRUaGVvcmVtcyA9IHJlbGVhc2VDb250ZXh0LmdldFRoZW9yZW1zKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2godGhlb3JlbXMsIHJlbGVhc2VDb250ZXh0VGhlb3JlbXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoZW9yZW1zO1xuICB9XG5cbiAgZ2V0UHJvY2VkdXJlcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHByb2NlZHVyZXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRQcm9jZWR1cmVzID0gZmlsZUNvbnRleHQuZ2V0UHJvY2VkdXJlcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2gocHJvY2VkdXJlcywgZmlsZUNvbnRleHRQcm9jZWR1cmVzKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dFByb2NlZHVyZXMgPSByZWxlYXNlQ29udGV4dC5nZXRQcm9jZWR1cmVzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2gocHJvY2VkdXJlcywgcmVsZWFzZUNvbnRleHRQcm9jZWR1cmVzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZWR1cmVzO1xuICB9XG5cbiAgZ2V0TWV0YUxlbW1hcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRNZXRhTGVtbWFzID0gZmlsZUNvbnRleHQuZ2V0TWV0YUxlbW1hcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2gobWV0YUxlbW1hcywgZmlsZUNvbnRleHRNZXRhTGVtbWFzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZXRhTGVtbWFzO1xuICB9XG5cbiAgZ2V0Q29uamVjdHVyZXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBjb25qZWN0dXJlcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dENvbmplY3R1cmVzID0gZmlsZUNvbnRleHQuZ2V0Q29uamVjdHVyZXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKGNvbmplY3R1cmVzLCBmaWxlQ29udGV4dENvbmplY3R1cmVzKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dENvbmplY3R1cmVzID0gcmVsZWFzZUNvbnRleHQuZ2V0Q29uamVjdHVyZXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaChjb25qZWN0dXJlcywgcmVsZWFzZUNvbnRleHRDb25qZWN0dXJlcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uamVjdHVyZXM7XG4gIH1cblxuICBnZXRDb21iaW5hdG9ycyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbWJpbmF0b3JzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0Q29tYmluYXRvcnMgPSBmaWxlQ29udGV4dC5nZXRDb21iaW5hdG9ycyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2goY29tYmluYXRvcnMsIGZpbGVDb250ZXh0Q29tYmluYXRvcnMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q29tYmluYXRvcnMgPSByZWxlYXNlQ29udGV4dC5nZXRDb21iaW5hdG9ycyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKGNvbWJpbmF0b3JzLCByZWxlYXNlQ29udGV4dENvbWJpbmF0b3JzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb21iaW5hdG9ycztcbiAgfVxuXG4gIGdldFR5cGVQcmVmaXhlcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVQcmVmaXhlcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dFR5cGVQcmVmaXhlcyA9IGZpbGVDb250ZXh0LmdldFR5cGVQcmVmaXhlcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2godHlwZVByZWZpeGVzLCBmaWxlQ29udGV4dFR5cGVQcmVmaXhlcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRUeXBlUHJlZml4ZXMgPSByZWxlYXNlQ29udGV4dC5nZXRUeXBlUHJlZml4ZXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaCh0eXBlUHJlZml4ZXMsIHJlbGVhc2VDb250ZXh0VHlwZVByZWZpeGVzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlUHJlZml4ZXM7XG4gIH1cblxuICBnZXRDb25zdHJ1Y3RvcnMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRDb25zdHJ1Y3RvcnMgPSBmaWxlQ29udGV4dC5nZXRDb25zdHJ1Y3RvcnMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKGNvbnN0cnVjdG9ycywgZmlsZUNvbnRleHRDb25zdHJ1Y3RvcnMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q29uc3RydWN0b3JzID0gcmVsZWFzZUNvbnRleHQuZ2V0Q29uc3RydWN0b3JzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2goY29uc3RydWN0b3JzLCByZWxlYXNlQ29udGV4dENvbnN0cnVjdG9ycyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc3RydWN0b3JzO1xuICB9XG5cbiAgZ2V0TWV0YXRoZW9yZW1zKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgbWV0YXRoZW9yZW1zID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0TWV0YXRoZW9yZW1zID0gZmlsZUNvbnRleHQuZ2V0TWV0YXRoZW9yZW1zKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChtZXRhdGhlb3JlbXMsIGZpbGVDb250ZXh0TWV0YXRoZW9yZW1zKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dE1ldGF0aGVvcmVtcyA9IHJlbGVhc2VDb250ZXh0LmdldE1ldGF0aGVvcmVtcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKG1ldGF0aGVvcmVtcywgcmVsZWFzZUNvbnRleHRNZXRhdGhlb3JlbXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtcztcbiAgfVxuXG4gIGdldERlcGVuZGVuY2llcygpIHsgcmV0dXJuIHRoaXMuZW50cmllcy5nZXREZXBlbmRlbmNpZXMoKTsgfVxuXG4gIG1hdGNoU2hvcnRlbmVkVmVyc2lvbihzaG9ydGVuZWRWZXJzaW9uKSB7IHJldHVybiB0aGlzLmVudHJpZXMubWF0Y2hTaG9ydGVuZWRWZXJzaW9uKHNob3J0ZW5lZFZlcnNpb24pOyB9XG5cbiAgdHJhY2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGxldmVsID0gVFJBQ0VfTEVWRUw7XG5cbiAgICB0aGlzLndyaXRlVG9Mb2cobGV2ZWwsIG1lc3NhZ2UpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZSkge1xuICAgIGNvbnN0IGxldmVsID0gREVCVUdfTEVWRUw7XG5cbiAgICB0aGlzLndyaXRlVG9Mb2cobGV2ZWwsIG1lc3NhZ2UpO1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlKSB7XG4gICAgY29uc3QgbGV2ZWwgPSBJTkZPX0xFVkVMO1xuXG4gICAgdGhpcy53cml0ZVRvTG9nKGxldmVsLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHdhcm5pbmcobWVzc2FnZSkge1xuICAgIGNvbnN0IGxldmVsID0gV0FSTklOR19MRVZFTDtcblxuICAgIHRoaXMud3JpdGVUb0xvZyhsZXZlbCwgbWVzc2FnZSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgbGV2ZWwgPSBFUlJPUl9MRVZFTDtcblxuICAgIHRoaXMud3JpdGVUb0xvZyhsZXZlbCwgbWVzc2FnZSk7XG4gIH1cblxuICB3cml0ZVRvTG9nKGxldmVsLCBtZXNzYWdlLCBmaWxlUGF0aCA9IG51bGwsIGxpbmVJbmRleCA9IG51bGwpIHtcbiAgICB0aGlzLmxvZy53cml0ZShsZXZlbCwgbWVzc2FnZSwgZmlsZVBhdGgsIGxpbmVJbmRleCk7XG4gIH1cblxuICBpbml0aWFsaXNlKHJlbGVhc2VDb250ZXh0cywgRmlsZUNvbnRleHRGcm9tRmlsZVBhdGgpIHtcbiAgICBjb25zdCByZWxlYXNlZCA9IHRoaXMuaXNSZWxlYXNlZCgpLFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gdGhpcywgIC8vL1xuICAgICAgICAgIHJlbGVhc2VDb250ZXh0c1RhaWwgPSB0YWlsKHJlbGVhc2VDb250ZXh0cyk7XG5cbiAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSByZWxlYXNlQ29udGV4dHNUYWlsOyAvLy9cblxuICAgIHRoaXMuY29tYmluZWRDdXN0b21HcmFtbWFyID0gY29tYmluZWRDdXN0b21HcmFtbWFyRnJvbVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dHMpO1xuXG4gICAgcmVsZWFzZWQgP1xuICAgICAgZmlsZUNvbnRleHRzRnJvbUpTT04odGhpcy5qc29uLCB0aGlzLmZpbGVDb250ZXh0cywgcmVsZWFzZUNvbnRleHQsIEZpbGVDb250ZXh0RnJvbUZpbGVQYXRoKSA6XG4gICAgICAgIGZpbGVDb250ZXh0c0Zyb21FbnRyaWVzKHRoaXMuZW50cmllcywgdGhpcy5maWxlQ29udGV4dHMsIHJlbGVhc2VDb250ZXh0LCBGaWxlQ29udGV4dEZyb21GaWxlUGF0aCk7XG5cbiAgICB0aGlzLmluaXRpYWxpc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGJyZWFrKGZpbGVQYXRoLCBsaW5lSW5kZXgpIHtcbiAgICBjb25zdCBsZXZlbCA9IFRSQUNFX0xFVkVMLFxuICAgICAgICAgIG1lc3NhZ2UgPSBCUkVBS19NRVNTQUdFO1xuXG4gICAgdGhpcy53cml0ZVRvTG9nKGxldmVsLCBtZXNzYWdlLCBmaWxlUGF0aCwgbGluZUluZGV4KTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzOyAvLy9cblxuICAgIGF3YWl0IHRoaXMuY2FsbGJhY2soY29udGV4dCwgZmlsZVBhdGgsIGxpbmVJbmRleCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnkoKSB7XG4gICAgbGV0IHZlcmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCB0eXBlUHJlZml4ZXMgPSB0aGlzLmdldFR5cGVQcmVmaXhlcygpLFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgdHlwZVByZWZpeGVzVmVyaWZ5ID0gdmVyaWZ5VHlwZVByZWZpeGVzKHR5cGVQcmVmaXhlcywgcmVsZWFzZUNvbnRleHQpO1xuXG4gICAgaWYgKHR5cGVQcmVmaXhlc1ZlcmlmeSkge1xuICAgICAgY29uc3QgdmVyaWZpZWRGaWxlQ29udGV4dHMgPSBbXSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0c1ZlcmlmeSA9IGF3YWl0IHZlcmlmeUZpbGVDb250ZXh0cyh0aGlzLmZpbGVDb250ZXh0cywgdmVyaWZpZWRGaWxlQ29udGV4dHMpO1xuXG4gICAgICBpZiAoZmlsZUNvbnRleHRzVmVyaWZ5KSB7XG4gICAgICAgIHZlcmlmaWVzID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnZlcmlmaWVzID0gdmVyaWZpZXM7XG5cbiAgICAgICAgdGhpcy5maWxlQ29udGV4dHMgPSB2ZXJpZmllZEZpbGVDb250ZXh0czsgLy8vXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVzO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IGZpbGVDb250ZXh0c0pTT04gPSB0aGlzLmZpbGVDb250ZXh0cy5tYXAoKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQ29udGV4dEpTT04gPSBmaWxlQ29udGV4dC50b0pTT04oKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZpbGVDb250ZXh0SlNPTjtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBqc29uID0gZmlsZUNvbnRleHRzSlNPTjsgIC8vL1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgZnJvbUxvZ05hbWVKU09ORW50cmllc0NhbGxiYWNrQW5kQ3VzdG9tR3JhbW1hcihDbGFzcywgbG9nLCBuYW1lLCBqc29uLCBlbnRyaWVzLCBjYWxsYmFjaywgY3VzdG9tR3JhbW1hcikge1xuICAgIGlmIChjdXN0b21HcmFtbWFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1c3RvbUdyYW1tYXIgPSBjYWxsYmFjazsgLy8vXG5cbiAgICAgIGNhbGxiYWNrID0gZW50cmllczsgLy8vXG5cbiAgICAgIGVudHJpZXMgPSBqc29uOyAvLy9cblxuICAgICAganNvbiA9IG5hbWU7ICAvLy9cblxuICAgICAgbmFtZSA9IGxvZzsgLy8vXG5cbiAgICAgIGxvZyA9IENsYXNzOyAgLy8vXG5cbiAgICAgIENsYXNzID0gUmVsZWFzZUNvbnRleHQ7IC8vL1xuICAgIH1cblxuICAgIGNvbnN0IHZlcmlmaWVzID0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbGlzZWQgPSBmYWxzZSxcbiAgICAgICAgICBmaWxlQ29udGV4dHMgPSBbXSxcbiAgICAgICAgICBjb21iaW5lZEN1c3RvbUdyYW1tYXIgPSBudWxsLFxuICAgICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSBudWxsLFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gbmV3IENsYXNzKGxvZywgbmFtZSwganNvbiwgZW50cmllcywgY2FsbGJhY2ssIGN1c3RvbUdyYW1tYXIsIHZlcmlmaWVzLCBpbml0aWFsaXNlZCwgZmlsZUNvbnRleHRzLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIsIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMpO1xuXG4gICAgcmV0dXJuIHJlbGVhc2VDb250ZXh0O1xuICB9XG59XG4iXSwibmFtZXMiOlsiUmVsZWFzZUNvbnRleHQiLCJwdXNoIiwidGFpbCIsImZpcnN0IiwiYXJyYXlVdGlsaXRpZXMiLCJsb2ciLCJuYW1lIiwianNvbiIsImVudHJpZXMiLCJjYWxsYmFjayIsImN1c3RvbUdyYW1tYXIiLCJ2ZXJpZmllcyIsImluaXRpYWxpc2VkIiwiZmlsZUNvbnRleHRzIiwiY29tYmluZWRDdXN0b21HcmFtbWFyIiwiZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsImdldExvZyIsImdldE5hbWUiLCJnZXRKU09OIiwiZ2V0RW50cmllcyIsImdldENhbGxiYWNrIiwiZ2V0Q3VzdG9tR3JhbW1hciIsImdldFZlcmlmaWVzIiwiaXNJbml0aWFsaXNlZCIsImdldEZpbGVDb250ZXh0cyIsImdldENvbWJpbmVkQ3VzdG9tR3JhbW1hciIsImdldERlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMiLCJnZXRSZWxlYXNlQ29udGV4dCIsInJlbGVhc2VDb250ZXh0IiwiZ2V0RGVwdGgiLCJkZXB0aCIsImhhc1ZlcmlmaWVkIiwidmVyaWZpZWQiLCJpc1JlbGVhc2VkIiwicmVsZWFzZWQiLCJnZXRUeXBlUHJlZml4IiwidHlwZVByZWZpeCIsImluY2x1ZGVEZXBlbmRlbmNpZXMiLCJ0eXBlUHJlZml4ZXMiLCJnZXRUeXBlUHJlZml4ZXMiLCJ0eXBlUHJlZml4ZXNMZW5ndGgiLCJsZW5ndGgiLCJmaXJzdFR5cGVQcmVmaXgiLCJnZXRMYWJlbHMiLCJsYWJlbHMiLCJmb3JFYWNoIiwiZmlsZUNvbnRleHQiLCJpbmNsdWRlUmVsZWFzZSIsImZpbGVDb250ZXh0TGFiZWxzIiwicmVsZWFzZUNvbnRleHRMYWJlbHMiLCJnZXRUeXBlcyIsInR5cGVzIiwiZmlsZUNvbnRleHRUeXBlcyIsInJlbGVhc2VDb250ZXh0VHlwZXMiLCJnZXRSdWxlcyIsInJ1bGVzIiwiZmlsZUNvbnRleHRSdWxlcyIsInJlbGVhc2VDb250ZXh0UnVsZXMiLCJnZXRBeGlvbXMiLCJheGlvbXMiLCJmaWxlQ29udGV4dEF4aW9tcyIsInJlbGVhc2VDb250ZXh0QXhpb21zIiwiZ2V0TGVtbWFzIiwibGVtbWFzIiwiZmlsZUNvbnRleHRMZW1tYXMiLCJnZXRUaGVvcmVtcyIsInRoZW9yZW1zIiwiZmlsZUNvbnRleHRUaGVvcmVtcyIsInJlbGVhc2VDb250ZXh0VGhlb3JlbXMiLCJnZXRQcm9jZWR1cmVzIiwicHJvY2VkdXJlcyIsImZpbGVDb250ZXh0UHJvY2VkdXJlcyIsInJlbGVhc2VDb250ZXh0UHJvY2VkdXJlcyIsImdldE1ldGFMZW1tYXMiLCJtZXRhTGVtbWFzIiwiZmlsZUNvbnRleHRNZXRhTGVtbWFzIiwiZ2V0Q29uamVjdHVyZXMiLCJjb25qZWN0dXJlcyIsImZpbGVDb250ZXh0Q29uamVjdHVyZXMiLCJyZWxlYXNlQ29udGV4dENvbmplY3R1cmVzIiwiZ2V0Q29tYmluYXRvcnMiLCJjb21iaW5hdG9ycyIsImZpbGVDb250ZXh0Q29tYmluYXRvcnMiLCJyZWxlYXNlQ29udGV4dENvbWJpbmF0b3JzIiwiZmlsZUNvbnRleHRUeXBlUHJlZml4ZXMiLCJyZWxlYXNlQ29udGV4dFR5cGVQcmVmaXhlcyIsImdldENvbnN0cnVjdG9ycyIsImNvbnN0cnVjdG9ycyIsImZpbGVDb250ZXh0Q29uc3RydWN0b3JzIiwicmVsZWFzZUNvbnRleHRDb25zdHJ1Y3RvcnMiLCJnZXRNZXRhdGhlb3JlbXMiLCJtZXRhdGhlb3JlbXMiLCJmaWxlQ29udGV4dE1ldGF0aGVvcmVtcyIsInJlbGVhc2VDb250ZXh0TWV0YXRoZW9yZW1zIiwiZ2V0RGVwZW5kZW5jaWVzIiwibWF0Y2hTaG9ydGVuZWRWZXJzaW9uIiwic2hvcnRlbmVkVmVyc2lvbiIsInRyYWNlIiwibWVzc2FnZSIsImxldmVsIiwiVFJBQ0VfTEVWRUwiLCJ3cml0ZVRvTG9nIiwiZGVidWciLCJERUJVR19MRVZFTCIsImluZm8iLCJJTkZPX0xFVkVMIiwid2FybmluZyIsIldBUk5JTkdfTEVWRUwiLCJlcnJvciIsIkVSUk9SX0xFVkVMIiwiZmlsZVBhdGgiLCJsaW5lSW5kZXgiLCJ3cml0ZSIsImluaXRpYWxpc2UiLCJyZWxlYXNlQ29udGV4dHMiLCJGaWxlQ29udGV4dEZyb21GaWxlUGF0aCIsInJlbGVhc2VDb250ZXh0c1RhaWwiLCJjb21iaW5lZEN1c3RvbUdyYW1tYXJGcm9tUmVsZWFzZUNvbnRleHRzIiwiZmlsZUNvbnRleHRzRnJvbUpTT04iLCJmaWxlQ29udGV4dHNGcm9tRW50cmllcyIsImJyZWFrIiwiQlJFQUtfTUVTU0FHRSIsImNvbnRleHQiLCJ2ZXJpZnkiLCJ0eXBlUHJlZml4ZXNWZXJpZnkiLCJ2ZXJpZnlUeXBlUHJlZml4ZXMiLCJ2ZXJpZmllZEZpbGVDb250ZXh0cyIsImZpbGVDb250ZXh0c1ZlcmlmeSIsInZlcmlmeUZpbGVDb250ZXh0cyIsInRvSlNPTiIsImZpbGVDb250ZXh0c0pTT04iLCJtYXAiLCJmaWxlQ29udGV4dEpTT04iLCJmcm9tTG9nTmFtZUpTT05FbnRyaWVzQ2FsbGJhY2tBbmRDdXN0b21HcmFtbWFyIiwiQ2xhc3MiLCJ1bmRlZmluZWQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVdBOzs7ZUFBcUJBOzs7MkJBVFU7d0JBRXdCOytCQUNFOzZCQUNLOzJCQUNrQztBQUVoRyxNQUFNLEVBQUVDLElBQUksRUFBRUMsSUFBSSxFQUFFQyxLQUFLLEVBQUUsR0FBR0MseUJBQWM7QUFFN0IsTUFBTUo7SUFDbkIsWUFBWUssR0FBRyxFQUFFQyxJQUFJLEVBQUVDLElBQUksRUFBRUMsT0FBTyxFQUFFQyxRQUFRLEVBQUVDLGFBQWEsRUFBRUMsUUFBUSxFQUFFQyxXQUFXLEVBQUVDLFlBQVksRUFBRUMscUJBQXFCLEVBQUVDLHlCQUF5QixDQUFFO1FBQ3BKLElBQUksQ0FBQ1YsR0FBRyxHQUFHQTtRQUNYLElBQUksQ0FBQ0MsSUFBSSxHQUFHQTtRQUNaLElBQUksQ0FBQ0MsSUFBSSxHQUFHQTtRQUNaLElBQUksQ0FBQ0MsT0FBTyxHQUFHQTtRQUNmLElBQUksQ0FBQ0MsUUFBUSxHQUFHQTtRQUNoQixJQUFJLENBQUNDLGFBQWEsR0FBR0E7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
|
|
340
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L3JlbGVhc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5pbXBvcnQgeyB2ZXJpZnlUeXBlUHJlZml4ZXMsIHZlcmlmeUZpbGVDb250ZXh0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvdmVyaWZ5XCI7XG5pbXBvcnQgeyBjb21iaW5lZEN1c3RvbUdyYW1tYXJGcm9tUmVsZWFzZUNvbnRleHRzIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jdXN0b21HcmFtbWFyXCI7XG5pbXBvcnQgeyBmaWxlQ29udGV4dHNGcm9tSlNPTiwgZmlsZUNvbnRleHRzRnJvbUVudHJpZXMgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2ZpbGVDb250ZXh0XCI7XG5pbXBvcnQgeyBUUkFDRV9MRVZFTCwgREVCVUdfTEVWRUwsIElORk9fTEVWRUwsIFdBUk5JTkdfTEVWRUwsIEVSUk9SX0xFVkVMLCBCUkVBS19NRVNTQUdFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCB7IHB1c2gsIHRhaWwsIGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVsZWFzZUNvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihsb2csIG5hbWUsIGpzb24sIGVudHJpZXMsIGNhbGxiYWNrLCBjdXN0b21HcmFtbWFyLCB2ZXJpZmllcywgaW5pdGlhbGlzZWQsIGZpbGVDb250ZXh0cywgY29tYmluZWRDdXN0b21HcmFtbWFyLCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKSB7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmpzb24gPSBqc29uO1xuICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuY3VzdG9tR3JhbW1hciA9IGN1c3RvbUdyYW1tYXI7XG4gICAgdGhpcy52ZXJpZmllcyA9IHZlcmlmaWVzO1xuICAgIHRoaXMuaW5pdGlhbGlzZWQgPSBpbml0aWFsaXNlZDtcbiAgICB0aGlzLmZpbGVDb250ZXh0cyA9IGZpbGVDb250ZXh0cztcbiAgICB0aGlzLmNvbWJpbmVkQ3VzdG9tR3JhbW1hciA9IGNvbWJpbmVkQ3VzdG9tR3JhbW1hcjtcbiAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzO1xuICB9XG5cbiAgZ2V0TG9nKCkge1xuICAgIHJldHVybiB0aGlzLmxvZztcbiAgfVxuXG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIGdldEpTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuanNvbjtcbiAgfVxuXG4gIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcztcbiAgfVxuXG4gIGdldENhbGxiYWNrKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrO1xuICB9XG5cbiAgZ2V0Q3VzdG9tR3JhbW1hcigpIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21HcmFtbWFyO1xuICB9XG5cbiAgZ2V0VmVyaWZpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyaWZpZXM7XG4gIH1cblxuICBpc0luaXRpYWxpc2VkKCkge1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxpc2VkO1xuICB9XG5cbiAgZ2V0RmlsZUNvbnRleHRzKCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZXh0cztcbiAgfVxuXG4gIGdldENvbWJpbmVkQ3VzdG9tR3JhbW1hcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEN1c3RvbUdyYW1tYXI7XG4gIH1cblxuICBnZXREZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKCkge1xuICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHM7XG4gIH1cblxuICBtYXRjaERlcGVuZGVuY3lOYW1lKGRlcGVuZGVuY3lOYW1lKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeU5hbWVNYXRjaGVzID0gKHRoaXMubmFtZSA9PT0gZGVwZW5kZW5jeU5hbWUpO1xuXG4gICAgcmV0dXJuIGRlcGVuZGVuY3lOYW1lTWF0Y2hlcztcbiAgfVxuXG4gIGdldFJlbGVhc2VDb250ZXh0KCkge1xuICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0ID0gdGhpczsgIC8vL1xuXG4gICAgcmV0dXJuIHJlbGVhc2VDb250ZXh0O1xuICB9XG5cbiAgZ2V0RGVwdGgoKSB7XG4gICAgY29uc3QgZGVwdGggPSAwO1xuXG4gICAgcmV0dXJuIGRlcHRoO1xuICB9XG5cbiAgaGFzVmVyaWZpZWQoKSB7XG4gICAgY29uc3QgdmVyaWZpZWQgPSB0aGlzLnZlcmlmaWVzOyAvLy9cblxuICAgIHJldHVybiB2ZXJpZmllZDtcbiAgfVxuXG4gIGlzUmVsZWFzZWQoKSB7XG4gICAgY29uc3QgcmVsZWFzZWQgPSAodGhpcy5qc29uICE9PSBudWxsKTtcblxuICAgIHJldHVybiByZWxlYXNlZDtcbiAgfVxuXG4gIGdldFR5cGVQcmVmaXgoKSB7XG4gICAgbGV0IHR5cGVQcmVmaXggPSBudWxsO1xuXG4gICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IHRoaXMuZ2V0VHlwZVByZWZpeGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMpLFxuICAgICAgICAgIHR5cGVQcmVmaXhlc0xlbmd0aCA9IHR5cGVQcmVmaXhlcy5sZW5ndGg7XG5cbiAgICBpZiAodHlwZVByZWZpeGVzTGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdFR5cGVQcmVmaXggPSBmaXJzdCh0eXBlUHJlZml4ZXMpO1xuXG4gICAgICB0eXBlUHJlZml4ID0gZmlyc3RUeXBlUHJlZml4OyAvLy9cbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVByZWZpeDtcbiAgfVxuXG4gIGdldExhYmVscyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dExhYmVscyA9IGZpbGVDb250ZXh0LmdldExhYmVscyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2gobGFiZWxzLCBmaWxlQ29udGV4dExhYmVscyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRMYWJlbHMgPSByZWxlYXNlQ29udGV4dC5nZXRMYWJlbHMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIHJlbGVhc2VDb250ZXh0TGFiZWxzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsYWJlbHM7XG4gIH1cblxuICBnZXRUeXBlcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0VHlwZXMgPSBmaWxlQ29udGV4dC5nZXRUeXBlcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2godHlwZXMsIGZpbGVDb250ZXh0VHlwZXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VHlwZXMgPSByZWxlYXNlQ29udGV4dC5nZXRUeXBlcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKHR5cGVzLCByZWxlYXNlQ29udGV4dFR5cGVzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIGdldFJ1bGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRSdWxlcyA9IGZpbGVDb250ZXh0LmdldFJ1bGVzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChydWxlcywgZmlsZUNvbnRleHRSdWxlcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRSdWxlcyA9IHJlbGVhc2VDb250ZXh0LmdldFJ1bGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2gocnVsZXMsIHJlbGVhc2VDb250ZXh0UnVsZXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bGVzO1xuICB9XG5cbiAgZ2V0QXhpb21zKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgYXhpb21zID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0QXhpb21zID0gZmlsZUNvbnRleHQuZ2V0QXhpb21zKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChheGlvbXMsIGZpbGVDb250ZXh0QXhpb21zKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dEF4aW9tcyA9IHJlbGVhc2VDb250ZXh0LmdldEF4aW9tcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKGF4aW9tcywgcmVsZWFzZUNvbnRleHRBeGlvbXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF4aW9tcztcbiAgfVxuXG4gIGdldExlbW1hcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGxlbW1hcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dExlbW1hcyA9IGZpbGVDb250ZXh0LmdldExlbW1hcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2gobGVtbWFzLCBmaWxlQ29udGV4dExlbW1hcyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGVtbWFzO1xuICB9XG5cbiAgZ2V0VGhlb3JlbXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCB0aGVvcmVtcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dFRoZW9yZW1zID0gZmlsZUNvbnRleHQuZ2V0VGhlb3JlbXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKHRoZW9yZW1zLCBmaWxlQ29udGV4dFRoZW9yZW1zKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dFRoZW9yZW1zID0gcmVsZWFzZUNvbnRleHQuZ2V0VGhlb3JlbXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaCh0aGVvcmVtcywgcmVsZWFzZUNvbnRleHRUaGVvcmVtcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhlb3JlbXM7XG4gIH1cblxuICBnZXRQcm9jZWR1cmVzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgcHJvY2VkdXJlcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dFByb2NlZHVyZXMgPSBmaWxlQ29udGV4dC5nZXRQcm9jZWR1cmVzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChwcm9jZWR1cmVzLCBmaWxlQ29udGV4dFByb2NlZHVyZXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0UHJvY2VkdXJlcyA9IHJlbGVhc2VDb250ZXh0LmdldFByb2NlZHVyZXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaChwcm9jZWR1cmVzLCByZWxlYXNlQ29udGV4dFByb2NlZHVyZXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2NlZHVyZXM7XG4gIH1cblxuICBnZXRNZXRhTGVtbWFzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dE1ldGFMZW1tYXMgPSBmaWxlQ29udGV4dC5nZXRNZXRhTGVtbWFzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChtZXRhTGVtbWFzLCBmaWxlQ29udGV4dE1ldGFMZW1tYXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1ldGFMZW1tYXM7XG4gIH1cblxuICBnZXRDb25qZWN0dXJlcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbmplY3R1cmVzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0Q29uamVjdHVyZXMgPSBmaWxlQ29udGV4dC5nZXRDb25qZWN0dXJlcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2goY29uamVjdHVyZXMsIGZpbGVDb250ZXh0Q29uamVjdHVyZXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q29uamVjdHVyZXMgPSByZWxlYXNlQ29udGV4dC5nZXRDb25qZWN0dXJlcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKGNvbmplY3R1cmVzLCByZWxlYXNlQ29udGV4dENvbmplY3R1cmVzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb25qZWN0dXJlcztcbiAgfVxuXG4gIGdldENvbWJpbmF0b3JzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgY29tYmluYXRvcnMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRDb21iaW5hdG9ycyA9IGZpbGVDb250ZXh0LmdldENvbWJpbmF0b3JzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChjb21iaW5hdG9ycywgZmlsZUNvbnRleHRDb21iaW5hdG9ycyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRDb21iaW5hdG9ycyA9IHJlbGVhc2VDb250ZXh0LmdldENvbWJpbmF0b3JzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2goY29tYmluYXRvcnMsIHJlbGVhc2VDb250ZXh0Q29tYmluYXRvcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbWJpbmF0b3JzO1xuICB9XG5cbiAgZ2V0VHlwZVByZWZpeGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgdHlwZVByZWZpeGVzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0VHlwZVByZWZpeGVzID0gZmlsZUNvbnRleHQuZ2V0VHlwZVByZWZpeGVzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaCh0eXBlUHJlZml4ZXMsIGZpbGVDb250ZXh0VHlwZVByZWZpeGVzKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dFR5cGVQcmVmaXhlcyA9IHJlbGVhc2VDb250ZXh0LmdldFR5cGVQcmVmaXhlcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKHR5cGVQcmVmaXhlcywgcmVsZWFzZUNvbnRleHRUeXBlUHJlZml4ZXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVQcmVmaXhlcztcbiAgfVxuXG4gIGdldENvbnN0cnVjdG9ycyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9ycyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dENvbnN0cnVjdG9ycyA9IGZpbGVDb250ZXh0LmdldENvbnN0cnVjdG9ycyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2goY29uc3RydWN0b3JzLCBmaWxlQ29udGV4dENvbnN0cnVjdG9ycyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRDb25zdHJ1Y3RvcnMgPSByZWxlYXNlQ29udGV4dC5nZXRDb25zdHJ1Y3RvcnMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaChjb25zdHJ1Y3RvcnMsIHJlbGVhc2VDb250ZXh0Q29uc3RydWN0b3JzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zdHJ1Y3RvcnM7XG4gIH1cblxuICBnZXRNZXRhdGhlb3JlbXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBtZXRhdGhlb3JlbXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRNZXRhdGhlb3JlbXMgPSBmaWxlQ29udGV4dC5nZXRNZXRhdGhlb3JlbXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKG1ldGF0aGVvcmVtcywgZmlsZUNvbnRleHRNZXRhdGhlb3JlbXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0TWV0YXRoZW9yZW1zID0gcmVsZWFzZUNvbnRleHQuZ2V0TWV0YXRoZW9yZW1zKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2gobWV0YXRoZW9yZW1zLCByZWxlYXNlQ29udGV4dE1ldGF0aGVvcmVtcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YXRoZW9yZW1zO1xuICB9XG5cbiAgZ2V0RGVwZW5kZW5jaWVzKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzLmdldERlcGVuZGVuY2llcygpOyB9XG5cbiAgbWF0Y2hTaG9ydGVuZWRWZXJzaW9uKHNob3J0ZW5lZFZlcnNpb24pIHsgcmV0dXJuIHRoaXMuZW50cmllcy5tYXRjaFNob3J0ZW5lZFZlcnNpb24oc2hvcnRlbmVkVmVyc2lvbik7IH1cblxuICB0cmFjZShtZXNzYWdlKSB7XG4gICAgY29uc3QgbGV2ZWwgPSBUUkFDRV9MRVZFTDtcblxuICAgIHRoaXMud3JpdGVUb0xvZyhsZXZlbCwgbWVzc2FnZSk7XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlKSB7XG4gICAgY29uc3QgbGV2ZWwgPSBERUJVR19MRVZFTDtcblxuICAgIHRoaXMud3JpdGVUb0xvZyhsZXZlbCwgbWVzc2FnZSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBsZXZlbCA9IElORk9fTEVWRUw7XG5cbiAgICB0aGlzLndyaXRlVG9Mb2cobGV2ZWwsIG1lc3NhZ2UpO1xuICB9XG5cbiAgd2FybmluZyhtZXNzYWdlKSB7XG4gICAgY29uc3QgbGV2ZWwgPSBXQVJOSU5HX0xFVkVMO1xuXG4gICAgdGhpcy53cml0ZVRvTG9nKGxldmVsLCBtZXNzYWdlKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBsZXZlbCA9IEVSUk9SX0xFVkVMO1xuXG4gICAgdGhpcy53cml0ZVRvTG9nKGxldmVsLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHdyaXRlVG9Mb2cobGV2ZWwsIG1lc3NhZ2UsIGZpbGVQYXRoID0gbnVsbCwgbGluZUluZGV4ID0gbnVsbCkge1xuICAgIHRoaXMubG9nLndyaXRlKGxldmVsLCBtZXNzYWdlLCBmaWxlUGF0aCwgbGluZUluZGV4KTtcbiAgfVxuXG4gIGluaXRpYWxpc2UocmVsZWFzZUNvbnRleHRzLCBGaWxlQ29udGV4dEZyb21GaWxlUGF0aCkge1xuICAgIGNvbnN0IHJlbGVhc2VkID0gdGhpcy5pc1JlbGVhc2VkKCksXG4gICAgICAgICAgcmVsZWFzZUNvbnRleHQgPSB0aGlzLCAgLy8vXG4gICAgICAgICAgcmVsZWFzZUNvbnRleHRzVGFpbCA9IHRhaWwocmVsZWFzZUNvbnRleHRzKTtcblxuICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyA9IHJlbGVhc2VDb250ZXh0c1RhaWw7IC8vL1xuXG4gICAgdGhpcy5jb21iaW5lZEN1c3RvbUdyYW1tYXIgPSBjb21iaW5lZEN1c3RvbUdyYW1tYXJGcm9tUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0cyk7XG5cbiAgICByZWxlYXNlZCA/XG4gICAgICBmaWxlQ29udGV4dHNGcm9tSlNPTih0aGlzLmpzb24sIHRoaXMuZmlsZUNvbnRleHRzLCByZWxlYXNlQ29udGV4dCwgRmlsZUNvbnRleHRGcm9tRmlsZVBhdGgpIDpcbiAgICAgICAgZmlsZUNvbnRleHRzRnJvbUVudHJpZXModGhpcy5lbnRyaWVzLCB0aGlzLmZpbGVDb250ZXh0cywgcmVsZWFzZUNvbnRleHQsIEZpbGVDb250ZXh0RnJvbUZpbGVQYXRoKTtcblxuICAgIHRoaXMuaW5pdGlhbGlzZWQgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgYnJlYWsoZmlsZVBhdGgsIGxpbmVJbmRleCkge1xuICAgIGNvbnN0IGxldmVsID0gVFJBQ0VfTEVWRUwsXG4gICAgICAgICAgbWVzc2FnZSA9IEJSRUFLX01FU1NBR0U7XG5cbiAgICB0aGlzLndyaXRlVG9Mb2cobGV2ZWwsIG1lc3NhZ2UsIGZpbGVQYXRoLCBsaW5lSW5kZXgpO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXM7IC8vL1xuXG4gICAgYXdhaXQgdGhpcy5jYWxsYmFjayhjb250ZXh0LCBmaWxlUGF0aCwgbGluZUluZGV4KTtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeSgpIHtcbiAgICBsZXQgdmVyaWZpZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHR5cGVQcmVmaXhlcyA9IHRoaXMuZ2V0VHlwZVByZWZpeGVzKCksXG4gICAgICAgICAgcmVsZWFzZUNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICB0eXBlUHJlZml4ZXNWZXJpZnkgPSB2ZXJpZnlUeXBlUHJlZml4ZXModHlwZVByZWZpeGVzLCByZWxlYXNlQ29udGV4dCk7XG5cbiAgICBpZiAodHlwZVByZWZpeGVzVmVyaWZ5KSB7XG4gICAgICBjb25zdCB2ZXJpZmllZEZpbGVDb250ZXh0cyA9IFtdLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRzVmVyaWZ5ID0gYXdhaXQgdmVyaWZ5RmlsZUNvbnRleHRzKHRoaXMuZmlsZUNvbnRleHRzLCB2ZXJpZmllZEZpbGVDb250ZXh0cyk7XG5cbiAgICAgIGlmIChmaWxlQ29udGV4dHNWZXJpZnkpIHtcbiAgICAgICAgdmVyaWZpZXMgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMudmVyaWZpZXMgPSB2ZXJpZmllcztcblxuICAgICAgICB0aGlzLmZpbGVDb250ZXh0cyA9IHZlcmlmaWVkRmlsZUNvbnRleHRzOyAvLy9cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmVyaWZpZXM7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgZmlsZUNvbnRleHRzSlNPTiA9IHRoaXMuZmlsZUNvbnRleHRzLm1hcCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZXh0SlNPTiA9IGZpbGVDb250ZXh0LnRvSlNPTigpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsZUNvbnRleHRKU09OO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGpzb24gPSBmaWxlQ29udGV4dHNKU09OOyAgLy8vXG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTG9nTmFtZUpTT05FbnRyaWVzQ2FsbGJhY2tBbmRDdXN0b21HcmFtbWFyKENsYXNzLCBsb2csIG5hbWUsIGpzb24sIGVudHJpZXMsIGNhbGxiYWNrLCBjdXN0b21HcmFtbWFyKSB7XG4gICAgaWYgKGN1c3RvbUdyYW1tYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY3VzdG9tR3JhbW1hciA9IGNhbGxiYWNrOyAvLy9cblxuICAgICAgY2FsbGJhY2sgPSBlbnRyaWVzOyAvLy9cblxuICAgICAgZW50cmllcyA9IGpzb247IC8vL1xuXG4gICAgICBqc29uID0gbmFtZTsgIC8vL1xuXG4gICAgICBuYW1lID0gbG9nOyAvLy9cblxuICAgICAgbG9nID0gQ2xhc3M7ICAvLy9cblxuICAgICAgQ2xhc3MgPSBSZWxlYXNlQ29udGV4dDsgLy8vXG4gICAgfVxuXG4gICAgY29uc3QgdmVyaWZpZXMgPSBmYWxzZSxcbiAgICAgICAgICBpbml0aWFsaXNlZCA9IGZhbHNlLFxuICAgICAgICAgIGZpbGVDb250ZXh0cyA9IFtdLFxuICAgICAgICAgIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciA9IG51bGwsXG4gICAgICAgICAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyA9IG51bGwsXG4gICAgICAgICAgcmVsZWFzZUNvbnRleHQgPSBuZXcgQ2xhc3MobG9nLCBuYW1lLCBqc29uLCBlbnRyaWVzLCBjYWxsYmFjaywgY3VzdG9tR3JhbW1hciwgdmVyaWZpZXMsIGluaXRpYWxpc2VkLCBmaWxlQ29udGV4dHMsIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciwgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyk7XG5cbiAgICByZXR1cm4gcmVsZWFzZUNvbnRleHQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJSZWxlYXNlQ29udGV4dCIsInB1c2giLCJ0YWlsIiwiZmlyc3QiLCJhcnJheVV0aWxpdGllcyIsImxvZyIsIm5hbWUiLCJqc29uIiwiZW50cmllcyIsImNhbGxiYWNrIiwiY3VzdG9tR3JhbW1hciIsInZlcmlmaWVzIiwiaW5pdGlhbGlzZWQiLCJmaWxlQ29udGV4dHMiLCJjb21iaW5lZEN1c3RvbUdyYW1tYXIiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzIiwiZ2V0TG9nIiwiZ2V0TmFtZSIsImdldEpTT04iLCJnZXRFbnRyaWVzIiwiZ2V0Q2FsbGJhY2siLCJnZXRDdXN0b21HcmFtbWFyIiwiZ2V0VmVyaWZpZXMiLCJpc0luaXRpYWxpc2VkIiwiZ2V0RmlsZUNvbnRleHRzIiwiZ2V0Q29tYmluZWRDdXN0b21HcmFtbWFyIiwiZ2V0RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsIm1hdGNoRGVwZW5kZW5jeU5hbWUiLCJkZXBlbmRlbmN5TmFtZSIsImRlcGVuZGVuY3lOYW1lTWF0Y2hlcyIsImdldFJlbGVhc2VDb250ZXh0IiwicmVsZWFzZUNvbnRleHQiLCJnZXREZXB0aCIsImRlcHRoIiwiaGFzVmVyaWZpZWQiLCJ2ZXJpZmllZCIsImlzUmVsZWFzZWQiLCJyZWxlYXNlZCIsImdldFR5cGVQcmVmaXgiLCJ0eXBlUHJlZml4IiwiaW5jbHVkZURlcGVuZGVuY2llcyIsInR5cGVQcmVmaXhlcyIsImdldFR5cGVQcmVmaXhlcyIsInR5cGVQcmVmaXhlc0xlbmd0aCIsImxlbmd0aCIsImZpcnN0VHlwZVByZWZpeCIsImdldExhYmVscyIsImxhYmVscyIsImZvckVhY2giLCJmaWxlQ29udGV4dCIsImluY2x1ZGVSZWxlYXNlIiwiZmlsZUNvbnRleHRMYWJlbHMiLCJyZWxlYXNlQ29udGV4dExhYmVscyIsImdldFR5cGVzIiwidHlwZXMiLCJmaWxlQ29udGV4dFR5cGVzIiwicmVsZWFzZUNvbnRleHRUeXBlcyIsImdldFJ1bGVzIiwicnVsZXMiLCJmaWxlQ29udGV4dFJ1bGVzIiwicmVsZWFzZUNvbnRleHRSdWxlcyIsImdldEF4aW9tcyIsImF4aW9tcyIsImZpbGVDb250ZXh0QXhpb21zIiwicmVsZWFzZUNvbnRleHRBeGlvbXMiLCJnZXRMZW1tYXMiLCJsZW1tYXMiLCJmaWxlQ29udGV4dExlbW1hcyIsImdldFRoZW9yZW1zIiwidGhlb3JlbXMiLCJmaWxlQ29udGV4dFRoZW9yZW1zIiwicmVsZWFzZUNvbnRleHRUaGVvcmVtcyIsImdldFByb2NlZHVyZXMiLCJwcm9jZWR1cmVzIiwiZmlsZUNvbnRleHRQcm9jZWR1cmVzIiwicmVsZWFzZUNvbnRleHRQcm9jZWR1cmVzIiwiZ2V0TWV0YUxlbW1hcyIsIm1ldGFMZW1tYXMiLCJmaWxlQ29udGV4dE1ldGFMZW1tYXMiLCJnZXRDb25qZWN0dXJlcyIsImNvbmplY3R1cmVzIiwiZmlsZUNvbnRleHRDb25qZWN0dXJlcyIsInJlbGVhc2VDb250ZXh0Q29uamVjdHVyZXMiLCJnZXRDb21iaW5hdG9ycyIsImNvbWJpbmF0b3JzIiwiZmlsZUNvbnRleHRDb21iaW5hdG9ycyIsInJlbGVhc2VDb250ZXh0Q29tYmluYXRvcnMiLCJmaWxlQ29udGV4dFR5cGVQcmVmaXhlcyIsInJlbGVhc2VDb250ZXh0VHlwZVByZWZpeGVzIiwiZ2V0Q29uc3RydWN0b3JzIiwiY29uc3RydWN0b3JzIiwiZmlsZUNvbnRleHRDb25zdHJ1Y3RvcnMiLCJyZWxlYXNlQ29udGV4dENvbnN0cnVjdG9ycyIsImdldE1ldGF0aGVvcmVtcyIsIm1ldGF0aGVvcmVtcyIsImZpbGVDb250ZXh0TWV0YXRoZW9yZW1zIiwicmVsZWFzZUNvbnRleHRNZXRhdGhlb3JlbXMiLCJnZXREZXBlbmRlbmNpZXMiLCJtYXRjaFNob3J0ZW5lZFZlcnNpb24iLCJzaG9ydGVuZWRWZXJzaW9uIiwidHJhY2UiLCJtZXNzYWdlIiwibGV2ZWwiLCJUUkFDRV9MRVZFTCIsIndyaXRlVG9Mb2ciLCJkZWJ1ZyIsIkRFQlVHX0xFVkVMIiwiaW5mbyIsIklORk9fTEVWRUwiLCJ3YXJuaW5nIiwiV0FSTklOR19MRVZFTCIsImVycm9yIiwiRVJST1JfTEVWRUwiLCJmaWxlUGF0aCIsImxpbmVJbmRleCIsIndyaXRlIiwiaW5pdGlhbGlzZSIsInJlbGVhc2VDb250ZXh0cyIsIkZpbGVDb250ZXh0RnJvbUZpbGVQYXRoIiwicmVsZWFzZUNvbnRleHRzVGFpbCIsImNvbWJpbmVkQ3VzdG9tR3JhbW1hckZyb21SZWxlYXNlQ29udGV4dHMiLCJmaWxlQ29udGV4dHNGcm9tSlNPTiIsImZpbGVDb250ZXh0c0Zyb21FbnRyaWVzIiwiYnJlYWsiLCJCUkVBS19NRVNTQUdFIiwiY29udGV4dCIsInZlcmlmeSIsInR5cGVQcmVmaXhlc1ZlcmlmeSIsInZlcmlmeVR5cGVQcmVmaXhlcyIsInZlcmlmaWVkRmlsZUNvbnRleHRzIiwiZmlsZUNvbnRleHRzVmVyaWZ5IiwidmVyaWZ5RmlsZUNvbnRleHRzIiwidG9KU09OIiwiZmlsZUNvbnRleHRzSlNPTiIsIm1hcCIsImZpbGVDb250ZXh0SlNPTiIsImZyb21Mb2dOYW1lSlNPTkVudHJpZXNDYWxsYmFja0FuZEN1c3RvbUdyYW1tYXIiLCJDbGFzcyIsInVuZGVmaW5lZCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBV0E7OztlQUFxQkE7OzsyQkFUVTt3QkFFd0I7K0JBQ0U7NkJBQ0s7MkJBQ2tDO0FBRWhHLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRSxHQUFHQyx5QkFBYztBQUU3QixNQUFNSjtJQUNuQixZQUFZSyxHQUFHLEVBQUVDLElBQUksRUFBRUMsSUFBSSxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsYUFBYSxFQUFFQyxRQUFRLEVB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
|
|
@@ -22,11 +22,10 @@ _export(exports, {
|
|
|
22
22
|
return verifyReleaseContexts;
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
|
-
const _occamdirectedgraphs = require("occam-directed-graphs");
|
|
26
25
|
const _necessary = require("necessary");
|
|
27
26
|
const _constants = require("../constants");
|
|
28
27
|
const _dependency = require("../utilities/dependency");
|
|
29
|
-
const {
|
|
28
|
+
const { last } = _necessary.arrayUtilities;
|
|
30
29
|
async function createReleaseContexts(dependency, context) {
|
|
31
30
|
let releaseContextsCreated = false;
|
|
32
31
|
const dependentNames = [], releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
@@ -35,24 +34,15 @@ async function createReleaseContexts(dependency, context) {
|
|
|
35
34
|
}
|
|
36
35
|
return releaseContextsCreated;
|
|
37
36
|
}
|
|
38
|
-
function initialiseReleaseContexts(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (!cyclicDependenciesPresent) {
|
|
44
|
-
const { releaseContextMap } = context, releaseNames = Object.keys(releaseContextMap), orderedVertexNames = directedGraph.getOrderedVertexNames(), orderedDependencyNames = orderedVertexNames.reverse(); ///
|
|
45
|
-
releaseNames.forEach((releaseName)=>{
|
|
46
|
-
const releaseContext = releaseContextMap[releaseName];
|
|
47
|
-
initialiseReleaseContext(releaseContext, orderedDependencyNames, context);
|
|
48
|
-
});
|
|
49
|
-
releaseContextsInitialised = true;
|
|
50
|
-
}
|
|
51
|
-
return releaseContextsInitialised;
|
|
37
|
+
function initialiseReleaseContexts(context) {
|
|
38
|
+
const { releaseContexts } = context;
|
|
39
|
+
releaseContexts.forEach((releaseContext)=>{
|
|
40
|
+
initialiseReleaseContext(releaseContext, context);
|
|
41
|
+
});
|
|
52
42
|
}
|
|
53
43
|
async function verifyReleaseContexts(dependency, context) {
|
|
54
44
|
let releaseContextsVerify = false;
|
|
55
|
-
const
|
|
45
|
+
const dependentName = null, dependentReleased = false, releaseContextVerifies = await verifyReleaseContext(dependency, dependentName, dependentReleased, context);
|
|
56
46
|
if (releaseContextVerifies) {
|
|
57
47
|
releaseContextsVerify = true;
|
|
58
48
|
}
|
|
@@ -63,47 +53,13 @@ const _default = {
|
|
|
63
53
|
initialiseReleaseContexts,
|
|
64
54
|
verifyReleaseContexts
|
|
65
55
|
};
|
|
66
|
-
function addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context) {
|
|
67
|
-
const dependencyName = dependency.getName(), visitedDependencyNameIncludesDependencyName = visitedDependencyNames.includes(dependencyName);
|
|
68
|
-
if (visitedDependencyNameIncludesDependencyName) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const visiteddependencyName = dependencyName; ///
|
|
72
|
-
visitedDependencyNames.push(visiteddependencyName);
|
|
73
|
-
const { log, releaseContextMap } = context, releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
|
|
74
|
-
if (releaseContext === null) {
|
|
75
|
-
const dependencyString = dependency.getString();
|
|
76
|
-
log.warning(`No package context has been created for the '${dependencyString}' dependency. `);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
const dependencies = releaseContext.getDependencies(), targetVertexName = dependencyName; ///
|
|
80
|
-
dependencies.forEachDependency((dependency)=>{
|
|
81
|
-
const dependencyName = dependency.getName(), sourceVertexName = dependencyName; ///
|
|
82
|
-
directedGraph.addEdgeBySourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
|
|
83
|
-
addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
function initialiseReleaseContext(releaseContext, orderedDependencyNames, context) {
|
|
87
|
-
const { log, releaseContextMap, FileContextFromFilePath } = context, releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap), releaseContextName = releaseContext.getName();
|
|
88
|
-
releaseContexts.sort((releaseContextA, releaseContextB)=>{
|
|
89
|
-
const releaseContextAName = releaseContextA.getName(), releaseContextBName = releaseContextB.getName(), dependencyNameA = releaseContextAName, dependencyNameB = releaseContextBName, indexA = orderedDependencyNames.indexOf(dependencyNameA), indexB = orderedDependencyNames.indexOf(dependencyNameB);
|
|
90
|
-
return indexA - indexB;
|
|
91
|
-
});
|
|
92
|
-
log.info(`Initialising the '${releaseContextName}' package context...`);
|
|
93
|
-
releaseContext.initialise(releaseContexts, FileContextFromFilePath);
|
|
94
|
-
log.debug(`...initialised the '${releaseContextName}' package context.`);
|
|
95
|
-
}
|
|
96
56
|
async function createReleaseContext(dependency, dependentNames, context) {
|
|
97
57
|
let releaseContextCreated = false;
|
|
98
|
-
const { log,
|
|
58
|
+
const { log, releaseContextFromDependency } = context, releaseContext = findReleaseContext(dependency, context);
|
|
99
59
|
if (releaseContext !== null) {
|
|
100
|
-
|
|
101
|
-
if (releaseMatchesDependency) {
|
|
102
|
-
log.debug(`The '${releaseName}' package context has already been created.`);
|
|
103
|
-
releaseContextCreated = true;
|
|
104
|
-
}
|
|
60
|
+
releaseContextCreated = true;
|
|
105
61
|
} else {
|
|
106
|
-
const dependencyString = dependency.asString(),
|
|
62
|
+
const dependentNamesLength = dependentNames.length, dependencyString = dependency.asString(), dependencyName = dependency.getName(), releaseName = dependencyName; ///
|
|
107
63
|
if (dependentNamesLength === 0) {
|
|
108
64
|
log.info(`Creating the '${releaseName}' package context...`);
|
|
109
65
|
} else {
|
|
@@ -111,47 +67,40 @@ async function createReleaseContext(dependency, dependentNames, context) {
|
|
|
111
67
|
log.info(`Creating the '${releaseName}' package context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
|
|
112
68
|
}
|
|
113
69
|
const releaseContext = await releaseContextFromDependency(dependency, context);
|
|
114
|
-
if (releaseContext
|
|
70
|
+
if (releaseContext === null) {
|
|
71
|
+
log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid..`);
|
|
72
|
+
} else {
|
|
115
73
|
const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
|
|
116
74
|
if (releaseMatchesDependency) {
|
|
117
|
-
releaseContextMap[releaseName] = releaseContext;
|
|
118
75
|
const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context);
|
|
119
76
|
if (dependencyReleaseContextsCreated) {
|
|
77
|
+
const { releaseContexts } = context;
|
|
78
|
+
releaseContexts.push(releaseContext);
|
|
120
79
|
releaseContextCreated = true;
|
|
121
80
|
}
|
|
122
81
|
}
|
|
123
|
-
} else {
|
|
124
|
-
const dependencyName = dependency.getName(), releaseName = dependencyName; ///
|
|
125
|
-
log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
|
|
126
82
|
}
|
|
127
83
|
releaseContextCreated ? log.debug(`...created the '${releaseName}' package context.`) : log.warning(`...unable to create the '${releaseName}' package context.`);
|
|
128
84
|
}
|
|
129
85
|
return releaseContextCreated;
|
|
130
86
|
}
|
|
131
|
-
async function verifyReleaseContext(
|
|
87
|
+
async function verifyReleaseContext(dependency, dependentName, dependentReleased, context) {
|
|
132
88
|
let releaseContextVerifies = false;
|
|
133
|
-
const releaseContext =
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
89
|
+
const { log } = context, releaseContext = findReleaseContext(dependency, context), name = releaseContext.getName(), released = releaseContext.isReleased(), releaseName = name; ///
|
|
90
|
+
if (dependentReleased && !released) {
|
|
91
|
+
log.warning(`The '${releaseName}' project cannot be verified because its '${dependentName}' dependent is a package.`);
|
|
92
|
+
} else {
|
|
93
|
+
const dependencies = releaseContext.getDependencies(), dependentName = releaseName, dependentReleased = released, dependencyReleaseContextsVerify = await verifyDependencyReleaseContexts(dependencies, dependentName, dependentReleased, context);
|
|
94
|
+
if (dependencyReleaseContextsVerify) {
|
|
95
|
+
const verified = releaseContext.hasVerified();
|
|
96
|
+
if (verified || released) {
|
|
97
|
+
releaseContextVerifies = true;
|
|
141
98
|
} else {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
} else {
|
|
148
|
-
releaseContext.info(`Verifying the '${releaseName}' project...`);
|
|
149
|
-
const verifies = await releaseContext.verify();
|
|
150
|
-
if (verifies) {
|
|
151
|
-
releaseContext.info(`...verified the '${releaseName}' project.`);
|
|
152
|
-
releaseContextVerifies = true;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
99
|
+
log.info(`Verifying the '${releaseName}' project...`);
|
|
100
|
+
const verifies = await releaseContext.verify();
|
|
101
|
+
if (verifies) {
|
|
102
|
+
log.info(`...verified the '${releaseName}' project.`);
|
|
103
|
+
releaseContextVerifies = true;
|
|
155
104
|
}
|
|
156
105
|
}
|
|
157
106
|
}
|
|
@@ -166,35 +115,65 @@ async function createDependencyReleaseContexts(releaseContext, dependency, depen
|
|
|
166
115
|
dependencyName
|
|
167
116
|
]; ///
|
|
168
117
|
dependencyReleaseContextsCreated = await (0, _dependency.asyncEveryDependency)(dependencies, async (dependency)=>{
|
|
169
|
-
const
|
|
170
|
-
if (
|
|
171
|
-
|
|
118
|
+
const cyclicDependencPresent = checkCyclicDependencyPresent(dependency, dependentNames, context);
|
|
119
|
+
if (!cyclicDependencPresent) {
|
|
120
|
+
const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
121
|
+
if (releaseContextCreated) {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
172
124
|
}
|
|
173
125
|
});
|
|
174
126
|
return dependencyReleaseContextsCreated;
|
|
175
127
|
}
|
|
176
|
-
async function verifyDependencyReleaseContexts(
|
|
177
|
-
const
|
|
178
|
-
const
|
|
128
|
+
async function verifyDependencyReleaseContexts(dependencies, dependentName, dependentReleased, context) {
|
|
129
|
+
const dependencyReleaseContextsVerify = await (0, _dependency.asyncEveryDependency)(dependencies, async (dependency)=>{
|
|
130
|
+
const releaseContextVerifies = await verifyReleaseContext(dependency, dependentName, dependentReleased, context);
|
|
179
131
|
if (releaseContextVerifies) {
|
|
180
132
|
return true;
|
|
181
133
|
}
|
|
182
134
|
});
|
|
183
135
|
return dependencyReleaseContextsVerify;
|
|
184
136
|
}
|
|
185
|
-
function
|
|
137
|
+
function findReleaseContext(dependency, context) {
|
|
138
|
+
const { releaseContexts } = context, dependencyName = dependency.getName(), releaseContext = releaseContexts.find((releaseContext)=>{
|
|
139
|
+
const dependencyNameMatches = releaseContext.matchDependencyName(dependencyName);
|
|
140
|
+
if (dependencyNameMatches) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
}) || null;
|
|
144
|
+
return releaseContext;
|
|
145
|
+
}
|
|
146
|
+
function retrieveReleaseContexts(releaseContext, context, releaseContexts = []) {
|
|
186
147
|
const releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext);
|
|
187
|
-
if (releaseContextsIncludesReleaseContext) {
|
|
188
|
-
|
|
148
|
+
if (!releaseContextsIncludesReleaseContext) {
|
|
149
|
+
const dependencies = releaseContext.getDependencies();
|
|
150
|
+
dependencies.forEachDependency((dependency)=>{
|
|
151
|
+
const releaseContext = findReleaseContext(dependency, context);
|
|
152
|
+
retrieveReleaseContexts(releaseContext, context, releaseContexts);
|
|
153
|
+
});
|
|
154
|
+
releaseContexts.unshift(releaseContext);
|
|
189
155
|
}
|
|
190
|
-
releaseContexts.push(releaseContext);
|
|
191
|
-
const dependencies = releaseContext.getDependencies();
|
|
192
|
-
dependencies.forEachDependency((dependency)=>{
|
|
193
|
-
const dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName];
|
|
194
|
-
retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts);
|
|
195
|
-
});
|
|
196
156
|
return releaseContexts;
|
|
197
157
|
}
|
|
158
|
+
function initialiseReleaseContext(releaseContext, context) {
|
|
159
|
+
const { log, FileContextFromFilePath } = context, name = releaseContext.getName(), releaseName = name, releaseContexts = retrieveReleaseContexts(releaseContext, context);
|
|
160
|
+
log.info(`Initialising the '${releaseName}' package context...`);
|
|
161
|
+
releaseContext.initialise(releaseContexts, FileContextFromFilePath);
|
|
162
|
+
log.debug(`...initialised the '${releaseName}' package context.`);
|
|
163
|
+
}
|
|
164
|
+
function checkCyclicDependencyPresent(dependency, dependentNames, context) {
|
|
165
|
+
let cyclicDependencPresent = false;
|
|
166
|
+
const dependencyName = dependency.getName(), index = dependentNames.indexOf(dependencyName);
|
|
167
|
+
if (index > -1) {
|
|
168
|
+
const { log } = context, circularDependentNames = dependentNames.slice(index), circularDependencyNames = [
|
|
169
|
+
...circularDependentNames,
|
|
170
|
+
dependencyName
|
|
171
|
+
], circularDependencyNamesString = circularDependencyNames.join(_constants.SINGLE_SPACE);
|
|
172
|
+
log.warning(`There is a cyclic dependency, '${circularDependencyNamesString}'.`);
|
|
173
|
+
cyclicDependencPresent = true;
|
|
174
|
+
}
|
|
175
|
+
return cyclicDependencPresent;
|
|
176
|
+
}
|
|
198
177
|
function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
|
|
199
178
|
let releaseMatchesDependency = true;
|
|
200
179
|
const shortenedVersion = dependency.getShortenedVersion();
|
|
@@ -208,18 +187,5 @@ function checkReleaseMatchesDependency(releaseContext, dependency, dependentName
|
|
|
208
187
|
}
|
|
209
188
|
return releaseMatchesDependency;
|
|
210
189
|
}
|
|
211
|
-
function checkCyclicDependenciesPresent(directedGraph, context) {
|
|
212
|
-
let cyclicDependenciesPresent = false;
|
|
213
|
-
const firstCycle = directedGraph.getFirstCycle();
|
|
214
|
-
if (firstCycle !== null) {
|
|
215
|
-
const { log } = context, vertexNames = firstCycle.getVertexNames(), dependencyNames = vertexNames, firstDependencyName = first(dependencyNames), cyclicDependencyNames = [
|
|
216
|
-
...dependencyNames,
|
|
217
|
-
firstDependencyName
|
|
218
|
-
], cycleString = cyclicDependencyNames.join(_constants.SINGLE_SPACE);
|
|
219
|
-
log.warning(`There is at least one '${cycleString}'. cyclic dependency`);
|
|
220
|
-
cyclicDependenciesPresent = true;
|
|
221
|
-
}
|
|
222
|
-
return cyclicDependenciesPresent;
|
|
223
|
-
}
|
|
224
190
|
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmVyaWZpY2F0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBEaXJlY3RlZEdyYXBoIH0gZnJvbSBcIm9jY2FtLWRpcmVjdGVkLWdyYXBoc1wiO1xuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7ICBTSU5HTEVfU1BBQ0V9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFzeW5jRXZlcnlEZXBlbmRlbmN5IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9kZXBlbmRlbmN5XCI7XG5cbmNvbnN0IHsgZmlyc3QsIGxhc3QgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdCBkZXBlbmRlbnROYW1lcyA9IFtdLFxuICAgICAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSBhd2FpdCBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0Q3JlYXRlZCkge1xuICAgIHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXNlUmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c0luaXRpYWxpc2VkID0gZmFsc2U7XG5cbiAgY29uc3QgZGlyZWN0ZWRHcmFwaCA9IERpcmVjdGVkR3JhcGguZnJvbU5vdGhpbmcoKSxcbiAgICAgICAgdmlzaXRlZERlcGVuZGVuY3lOYW1lcyA9IFtdO1xuXG4gIGFkZERlcGVuZGVuY3lSZWxhdGlvbnMoZGVwZW5kZW5jeSwgZGlyZWN0ZWRHcmFwaCwgdmlzaXRlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCk7XG5cbiAgY29uc3QgY3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudCA9IGNoZWNrQ3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudChkaXJlY3RlZEdyYXBoLCBjb250ZXh0KTtcblxuICBpZiAoIWN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQpIHtcbiAgICBjb25zdCB7IHJlbGVhc2VDb250ZXh0TWFwIH0gPSBjb250ZXh0LFxuICAgICAgICAgIHJlbGVhc2VOYW1lcyA9IE9iamVjdC5rZXlzKHJlbGVhc2VDb250ZXh0TWFwKSxcbiAgICAgICAgICBvcmRlcmVkVmVydGV4TmFtZXMgPSBkaXJlY3RlZEdyYXBoLmdldE9yZGVyZWRWZXJ0ZXhOYW1lcygpLFxuICAgICAgICAgIG9yZGVyZWREZXBlbmRlbmN5TmFtZXMgPSBvcmRlcmVkVmVydGV4TmFtZXMucmV2ZXJzZSgpOyAgLy8vXG5cbiAgICByZWxlYXNlTmFtZXMuZm9yRWFjaCgocmVsZWFzZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdO1xuXG4gICAgICBpbml0aWFsaXNlUmVsZWFzZUNvbnRleHQocmVsZWFzZUNvbnRleHQsIG9yZGVyZWREZXBlbmRlbmN5TmFtZXMsIGNvbnRleHQpO1xuICAgIH0pO1xuXG4gICAgcmVsZWFzZUNvbnRleHRzSW5pdGlhbGlzZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0c0luaXRpYWxpc2VkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c1ZlcmlmeSA9IGZhbHNlO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgIHJlbGVhc2VOYW1lID0gZGVwZW5kZW5jeU5hbWUsIC8vL1xuICAgICAgICBkZXBlbmRlbnROYW1lID0gbnVsbCxcbiAgICAgICAgZGVwZW5kZW50UmVsZWFzZWQgPSBmYWxzZSxcbiAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IGF3YWl0IHZlcmlmeVJlbGVhc2VDb250ZXh0KHJlbGVhc2VOYW1lLCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgY29udGV4dCk7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0VmVyaWZpZXMpIHtcbiAgICByZWxlYXNlQ29udGV4dHNWZXJpZnkgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0c1ZlcmlmeTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBjcmVhdGVSZWxlYXNlQ29udGV4dHMsXG4gIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dHMsXG4gIHZlcmlmeVJlbGVhc2VDb250ZXh0c1xufTtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVJlbGF0aW9ucyhkZXBlbmRlbmN5LCBkaXJlY3RlZEdyYXBoLCB2aXNpdGVkRGVwZW5kZW5jeU5hbWVzLCBjb250ZXh0KSB7XG4gIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgIHZpc2l0ZWREZXBlbmRlbmN5TmFtZUluY2x1ZGVzRGVwZW5kZW5jeU5hbWUgPSB2aXNpdGVkRGVwZW5kZW5jeU5hbWVzLmluY2x1ZGVzKGRlcGVuZGVuY3lOYW1lKTtcblxuICBpZiAodmlzaXRlZERlcGVuZGVuY3lOYW1lSW5jbHVkZXNEZXBlbmRlbmN5TmFtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHZpc2l0ZWRkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3lOYW1lOyAvLy9cblxuICB2aXNpdGVkRGVwZW5kZW5jeU5hbWVzLnB1c2godmlzaXRlZGRlcGVuZGVuY3lOYW1lKTtcblxuICBjb25zdCB7IGxvZywgcmVsZWFzZUNvbnRleHRNYXAgfSA9IGNvbnRleHQsXG4gICAgICAgIHJlbGVhc2VOYW1lID0gZGVwZW5kZW5jeU5hbWUsIC8vL1xuICAgICAgICByZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXSB8fCBudWxsO1xuXG4gIGlmIChyZWxlYXNlQ29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lTdHJpbmcgPSBkZXBlbmRlbmN5LmdldFN0cmluZygpO1xuXG4gICAgbG9nLndhcm5pbmcoYE5vIHBhY2thZ2UgY29udGV4dCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgJyR7ZGVwZW5kZW5jeVN0cmluZ30nIGRlcGVuZGVuY3kuIGApO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCksXG4gICAgICAgIHRhcmdldFZlcnRleE5hbWUgPSBkZXBlbmRlbmN5TmFtZTsgIC8vL1xuXG4gIGRlcGVuZGVuY2llcy5mb3JFYWNoRGVwZW5kZW5jeSgoZGVwZW5kZW5jeSkgPT4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgICAgc291cmNlVmVydGV4TmFtZSA9IGRlcGVuZGVuY3lOYW1lOyAgLy8vXG5cbiAgICBkaXJlY3RlZEdyYXBoLmFkZEVkZ2VCeVNvdXJjZVZlcnRleE5hbWVBbmRUYXJnZXRWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUsIHRhcmdldFZlcnRleE5hbWUpO1xuXG4gICAgYWRkRGVwZW5kZW5jeVJlbGF0aW9ucyhkZXBlbmRlbmN5LCBkaXJlY3RlZEdyYXBoLCB2aXNpdGVkRGVwZW5kZW5jeU5hbWVzLCBjb250ZXh0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dChyZWxlYXNlQ29udGV4dCwgb3JkZXJlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCkge1xuICBjb25zdCB7IGxvZywgcmVsZWFzZUNvbnRleHRNYXAsIEZpbGVDb250ZXh0RnJvbUZpbGVQYXRoIH0gPSBjb250ZXh0LFxuICAgICAgICByZWxlYXNlQ29udGV4dHMgPSByZXRyaWV2ZVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgcmVsZWFzZUNvbnRleHRNYXApLFxuICAgICAgICByZWxlYXNlQ29udGV4dE5hbWUgPSByZWxlYXNlQ29udGV4dC5nZXROYW1lKCk7XG5cbiAgcmVsZWFzZUNvbnRleHRzLnNvcnQoKHJlbGVhc2VDb250ZXh0QSwgcmVsZWFzZUNvbnRleHRCKSA9PiB7XG4gICAgY29uc3QgcmVsZWFzZUNvbnRleHRBTmFtZSA9IHJlbGVhc2VDb250ZXh0QS5nZXROYW1lKCksXG4gICAgICAgICAgcmVsZWFzZUNvbnRleHRCTmFtZSA9IHJlbGVhc2VDb250ZXh0Qi5nZXROYW1lKCksXG4gICAgICAgICAgZGVwZW5kZW5jeU5hbWVBID0gcmVsZWFzZUNvbnRleHRBTmFtZSwgIC8vL1xuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lQiA9IHJlbGVhc2VDb250ZXh0Qk5hbWUsICAvLy9cbiAgICAgICAgICBpbmRleEEgPSBvcmRlcmVkRGVwZW5kZW5jeU5hbWVzLmluZGV4T2YoZGVwZW5kZW5jeU5hbWVBKSxcbiAgICAgICAgICBpbmRleEIgPSBvcmRlcmVkRGVwZW5kZW5jeU5hbWVzLmluZGV4T2YoZGVwZW5kZW5jeU5hbWVCKTtcblxuICAgIHJldHVybiAoaW5kZXhBIC0gaW5kZXhCKTtcbiAgfSk7XG5cbiAgbG9nLmluZm8oYEluaXRpYWxpc2luZyB0aGUgJyR7cmVsZWFzZUNvbnRleHROYW1lfScgcGFja2FnZSBjb250ZXh0Li4uYCk7XG5cbiAgcmVsZWFzZUNvbnRleHQuaW5pdGlhbGlzZShyZWxlYXNlQ29udGV4dHMsIEZpbGVDb250ZXh0RnJvbUZpbGVQYXRoKTtcblxuICBsb2cuZGVidWcoYC4uLmluaXRpYWxpc2VkIHRoZSAnJHtyZWxlYXNlQ29udGV4dE5hbWV9JyBwYWNrYWdlIGNvbnRleHQuYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGxldCByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdCB7IGxvZywgcmVsZWFzZUNvbnRleHRNYXAsIHJlbGVhc2VDb250ZXh0RnJvbURlcGVuZGVuY3kgfSA9IGNvbnRleHQsXG4gICAgICAgIGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgIHJlbGVhc2VOYW1lID0gZGVwZW5kZW5jeU5hbWUsIC8vL1xuICAgICAgICByZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXSB8fCBudWxsO1xuXG4gIGlmIChyZWxlYXNlQ29udGV4dCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IGNoZWNrUmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5KHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgICBpZiAocmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5KSB7XG4gICAgICBsb2cuZGVidWcoYFRoZSAnJHtyZWxlYXNlTmFtZX0nIHBhY2thZ2UgY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuYCk7XG5cbiAgICAgIHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lTdHJpbmcgPSBkZXBlbmRlbmN5LmFzU3RyaW5nKCksXG4gICAgICAgICAgZGVwZW5kZW50TmFtZXNMZW5ndGggPSBkZXBlbmRlbnROYW1lcy5sZW5ndGg7XG5cbiAgICBpZiAoZGVwZW5kZW50TmFtZXNMZW5ndGggPT09IDApIHtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGluZyB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQuLi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFzdERlcGVuZGVudE5hbWUgPSBsYXN0KGRlcGVuZGVudE5hbWVzKSxcbiAgICAgICAgICAgIGRlcGVuZGVudE5hbWUgPSBsYXN0RGVwZW5kZW50TmFtZTsgIC8vL1xuXG4gICAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0IGdpdmVuIHRoZSAnJHtkZXBlbmRlbnROYW1lfScgZGVwZW5kYW50J3MgJyR7ZGVwZW5kZW5jeVN0cmluZ30nIGRlcGVuZGVuY3kuLi5gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlQ29udGV4dCA9IGF3YWl0IHJlbGVhc2VDb250ZXh0RnJvbURlcGVuZGVuY3koZGVwZW5kZW5jeSwgY29udGV4dCk7XG5cbiAgICBpZiAocmVsZWFzZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IGNoZWNrUmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5KHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgICAgIGlmIChyZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kpIHtcbiAgICAgICAgcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdID0gcmVsZWFzZUNvbnRleHQ7XG5cbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBhd2FpdCBjcmVhdGVEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkKSB7XG4gICAgICAgICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZTsgLy8vXG5cbiAgICAgIGxvZy53YXJuaW5nKGBUaGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBlcmhhcHMgdGhlICdtZXRhLmpzb24nIGZpbGUgaXMgbWlzc2luZyBvciBpbnZhbGlkLiBPciB0aGVyZSBjb3VsZCBiZSBhIGRlcGVuZGVuY3kgbWlzbWF0Y2guYCk7XG4gICAgfVxuXG4gICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID9cbiAgICAgIGxvZy5kZWJ1ZyhgLi4uY3JlYXRlZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQuYCkgOlxuICAgICAgICBsb2cud2FybmluZyhgLi4udW5hYmxlIHRvIGNyZWF0ZSB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQuYCk7XG4gIH1cblxuICByZXR1cm4gcmVsZWFzZUNvbnRleHRDcmVhdGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlSZWxlYXNlQ29udGV4dChyZWxlYXNlTmFtZSwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIHJlbGVhc2VDb250ZXh0TWFwKSB7XG4gIGxldCByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gZmFsc2U7XG5cbiAgY29uc3QgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV0gfHwgbnVsbDtcblxuICBpZiAocmVsZWFzZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICBjb25zdCByZWxlYXNlZCA9IHJlbGVhc2VDb250ZXh0LmlzUmVsZWFzZWQoKTtcblxuICAgIGlmIChyZWxlYXNlZCkge1xuICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZXBlbmRlbnRSZWxlYXNlZCkge1xuICAgICAgICByZWxlYXNlQ29udGV4dC53YXJuaW5nKGBUaGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0IGNhbm5vdCBiZSB2ZXJpZmllZCBiZWNhdXNlIGl0cyAnJHtkZXBlbmRlbnROYW1lfScgZGVwZW5kZW50IGlzIGEgcGFja2FnZS5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVudE5hbWUgPSByZWxlYXNlTmFtZSwgIC8vL1xuICAgICAgICAgICAgICBkZXBlbmRlbnRSZWxlYXNlZCA9IHJlbGVhc2VkLCAvLy9cbiAgICAgICAgICAgICAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c1ZlcmlmeSA9IGF3YWl0IHZlcmlmeURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCByZWxlYXNlQ29udGV4dE1hcCk7XG5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkpIHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlQ29udGV4dFZlcmlmaWVkID0gcmVsZWFzZUNvbnRleHQuaGFzVmVyaWZpZWQoKTtcblxuICAgICAgICAgIGlmIChyZWxlYXNlQ29udGV4dFZlcmlmaWVkKSB7XG4gICAgICAgICAgICByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVsZWFzZUNvbnRleHQuaW5mbyhgVmVyaWZ5aW5nIHRoZSAnJHtyZWxlYXNlTmFtZX0nIHByb2plY3QuLi5gKTtcblxuICAgICAgICAgICAgY29uc3QgdmVyaWZpZXMgPSBhd2FpdCByZWxlYXNlQ29udGV4dC52ZXJpZnkoKTtcblxuICAgICAgICAgICAgaWYgKHZlcmlmaWVzKSB7XG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0LmluZm8oYC4uLnZlcmlmaWVkIHRoZSAnJHtyZWxlYXNlTmFtZX0nIHByb2plY3QuYCk7XG5cbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0VmVyaWZpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGxldCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZDtcblxuICBjb25zdCBuYW1lID0gcmVsZWFzZUNvbnRleHQuZ2V0TmFtZSgpLFxuICAgICAgICBkZXBlbmRlbmNpZXMgPSByZWxlYXNlQ29udGV4dC5nZXREZXBlbmRlbmNpZXMoKSxcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUgPSBuYW1lOyAgLy8vXG5cbiAgZGVwZW5kZW50TmFtZXMgPSBbIC4uLmRlcGVuZGVudE5hbWVzLCBkZXBlbmRlbmN5TmFtZSBdOyAgLy8vXG5cbiAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBhd2FpdCBhc3luY0V2ZXJ5RGVwZW5kZW5jeShkZXBlbmRlbmNpZXMsIGFzeW5jIChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gYXdhaXQgY3JlYXRlUmVsZWFzZUNvbnRleHQoZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlbGVhc2VDb250ZXh0Q3JlYXRlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCByZWxlYXNlQ29udGV4dE1hcCkge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSByZWxlYXNlQ29udGV4dC5nZXREZXBlbmRlbmNpZXMoKSxcbiAgICAgICAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c1ZlcmlmeSA9IGF3YWl0IGFzeW5jRXZlcnlEZXBlbmRlbmN5KGRlcGVuZGVuY2llcywgYXN5bmMgKGRlcGVuZGVuY3kpID0+IHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgICAgICAgICAgcmVsZWFzZU5hbWUgPSBuYW1lLCAvLy9cbiAgICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gYXdhaXQgdmVyaWZ5UmVsZWFzZUNvbnRleHQocmVsZWFzZU5hbWUsIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCByZWxlYXNlQ29udGV4dE1hcCk7XG5cbiAgICAgICAgICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICByZXR1cm4gZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c1ZlcmlmeTtcbn1cblxuZnVuY3Rpb24gcmV0cmlldmVSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIHJlbGVhc2VDb250ZXh0TWFwLCByZWxlYXNlQ29udGV4dHMgPSBbXSkge1xuICBjb25zdCByZWxlYXNlQ29udGV4dHNJbmNsdWRlc1JlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRzLmluY2x1ZGVzKHJlbGVhc2VDb250ZXh0KTtcblxuICBpZiAocmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlbGVhc2VDb250ZXh0cy5wdXNoKHJlbGVhc2VDb250ZXh0KTtcblxuICBjb25zdCBkZXBlbmRlbmNpZXMgPSByZWxlYXNlQ29udGV4dC5nZXREZXBlbmRlbmNpZXMoKTtcblxuICBkZXBlbmRlbmNpZXMuZm9yRWFjaERlcGVuZGVuY3koKGRlcGVuZGVuY3kpID0+IHtcbiAgICBjb25zdCBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICAgIHJlbGVhc2VOYW1lID0gZGVwZW5kZW5jeU5hbWUsIC8vL1xuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdO1xuXG4gICAgcmV0cmlldmVSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIHJlbGVhc2VDb250ZXh0TWFwLCByZWxlYXNlQ29udGV4dHMpO1xuICB9KTtcblxuICByZXR1cm4gcmVsZWFzZUNvbnRleHRzO1xufVxuXG5mdW5jdGlvbiBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IHRydWU7XG5cbiAgY29uc3Qgc2hvcnRlbmVkVmVyc2lvbiA9IGRlcGVuZGVuY3kuZ2V0U2hvcnRlbmVkVmVyc2lvbigpO1xuXG4gIGlmIChzaG9ydGVuZWRWZXJzaW9uICE9PSBudWxsKSB7XG4gICAgY29uc3QgZW50cmllc01hdGNoU2hvcnRlbmVkVmVyc2lvbiA9IHJlbGVhc2VDb250ZXh0Lm1hdGNoU2hvcnRlbmVkVmVyc2lvbihzaG9ydGVuZWRWZXJzaW9uKTtcblxuICAgIGlmICghZW50cmllc01hdGNoU2hvcnRlbmVkVmVyc2lvbikge1xuICAgICAgY29uc3QgeyBsb2cgfSA9IGNvbnRleHQsXG4gICAgICAgICAgICB2ZXJzaW9uID0gcmVsZWFzZUNvbnRleHQuZ2V0VmVyc2lvbigpLFxuICAgICAgICAgICAgbGFzdERlcGVuZGVudE5hbWUgPSBsYXN0KGRlcGVuZGVudE5hbWVzKSxcbiAgICAgICAgICAgIGRlcGVuZGVudE5hbWUgPSBsYXN0RGVwZW5kZW50TmFtZSwgIC8vL1xuICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9IHZlcnNpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRlcGVuZGVuY3lTdHJpbmcgPSBkZXBlbmRlbmN5LmFzU3RyaW5nKCk7XG5cbiAgICAgIGxvZy53YXJuaW5nKGBUaGUgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGVudCByZXF1aXJlcyB0aGUgJyR7ZGVwZW5kZW5jeVN0cmluZ30nIGRlcGVuZGVuY3kgYnV0IGEgY29udGV4dCB3aXRoIHZlcnNpb24gJyR7dmVyc2lvblN0cmluZ30nIHdhcyBwcm92aWRlZC5gKTtcblxuICAgICAgcmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDeWNsaWNEZXBlbmRlbmNpZXNQcmVzZW50KGRpcmVjdGVkR3JhcGgsIGNvbnRleHQpIHtcbiAgbGV0IGN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQgPSBmYWxzZTtcblxuICBjb25zdCBmaXJzdEN5Y2xlID0gZGlyZWN0ZWRHcmFwaC5nZXRGaXJzdEN5Y2xlKCk7XG5cbiAgaWYgKGZpcnN0Q3ljbGUgIT09IG51bGwpIHtcbiAgICBjb25zdCB7IGxvZyB9ID0gY29udGV4dCxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lcyA9IGZpcnN0Q3ljbGUuZ2V0VmVydGV4TmFtZXMoKSxcbiAgICAgICAgICBkZXBlbmRlbmN5TmFtZXMgPSB2ZXJ0ZXhOYW1lcywgIC8vL1xuICAgICAgICAgIGZpcnN0RGVwZW5kZW5jeU5hbWUgPSBmaXJzdChkZXBlbmRlbmN5TmFtZXMpLFxuICAgICAgICAgIGN5Y2xpY0RlcGVuZGVuY3lOYW1lcyA9IFtcbiAgICAgICAgICAgIC4uLmRlcGVuZGVuY3lOYW1lcyxcbiAgICAgICAgICAgIGZpcnN0RGVwZW5kZW5jeU5hbWVcbiAgICAgICAgICBdLFxuICAgICAgICAgIGN5Y2xlU3RyaW5nID0gY3ljbGljRGVwZW5kZW5jeU5hbWVzLmpvaW4oU0lOR0xFX1NQQUNFKTtcblxuICAgIGxvZy53YXJuaW5nKGBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgJyR7Y3ljbGVTdHJpbmd9Jy4gY3ljbGljIGRlcGVuZGVuY3lgKTtcblxuICAgIGN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQ7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlUmVsZWFzZUNvbnRleHRzIiwiaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0cyIsInZlcmlmeVJlbGVhc2VDb250ZXh0cyIsImZpcnN0IiwibGFzdCIsImFycmF5VXRpbGl0aWVzIiwiZGVwZW5kZW5jeSIsImNvbnRleHQiLCJyZWxlYXNlQ29udGV4dHNDcmVhdGVkIiwiZGVwZW5kZW50TmFtZXMiLCJyZWxlYXNlQ29udGV4dENyZWF0ZWQiLCJjcmVhdGVSZWxlYXNlQ29udGV4dCIsInJlbGVhc2VDb250ZXh0c0luaXRpYWxpc2VkIiwiZGlyZWN0ZWRHcmFwaCIsIkRpcmVjdGVkR3JhcGgiLCJmcm9tTm90aGluZyIsInZpc2l0ZWREZXBlbmRlbmN5TmFtZXMiLCJhZGREZXBlbmRlbmN5UmVsYXRpb25zIiwiY3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudCIsImNoZWNrQ3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudCIsInJlbGVhc2VDb250ZXh0TWFwIiwicmVsZWFzZU5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsIm9yZGVyZWRWZXJ0ZXhOYW1lcyIsImdldE9yZGVyZWRWZXJ0ZXhOYW1lcyIsIm9yZGVyZWREZXBlbmRlbmN5TmFtZXMiLCJyZXZlcnNlIiwiZm9yRWFjaCIsInJlbGVhc2VOYW1lIiwicmVsZWFzZUNvbnRleHQiLCJpbml0aWFsaXNlUmVsZWFzZUNvbnRleHQiLCJyZWxlYXNlQ29udGV4dHNWZXJpZnkiLCJkZXBlbmRlbmN5TmFtZSIsImdldE5hbWUiLCJkZXBlbmRlbnROYW1lIiwiZGVwZW5kZW50UmVsZWFzZWQiLCJyZWxlYXNlQ29udGV4dFZlcmlmaWVzIiwidmVyaWZ5UmVsZWFzZUNvbnRleHQiLCJ2aXNpdGVkRGVwZW5kZW5jeU5hbWVJbmNsdWRlc0RlcGVuZGVuY3lOYW1lIiwiaW5jbHVkZXMiLCJ2aXNpdGVkZGVwZW5kZW5jeU5hbWUiLCJwdXNoIiwibG9nIiwiZGVwZW5kZW5jeVN0cmluZyIsImdldFN0cmluZyIsIndhcm5pbmciLCJkZXBlbmRlbmNpZXMiLCJnZXREZXBlbmRlbmNpZXMiLCJ0YXJnZXRWZXJ0ZXhOYW1lIiwiZm9yRWFjaERlcGVuZGVuY3kiLCJzb3VyY2VWZXJ0ZXhOYW1lIiwiYWRkRWRnZUJ5U291cmNlVmVydGV4TmFtZUFuZFRhcmdldFZlcnRleE5hbWUiLCJGaWxlQ29udGV4dEZyb21GaWxlUGF0aCIsInJlbGVhc2VDb250ZXh0cyIsInJldHJpZXZlUmVsZWFzZUNvbnRleHRzIiwicmVsZWFzZUNvbnRleHROYW1lIiwic29ydCIsInJlbGVhc2VDb250ZXh0QSIsInJlbGVhc2VDb250ZXh0QiIsInJlbGVhc2VDb250ZXh0QU5hbWUiLCJyZWxlYXNlQ29udGV4dEJOYW1lIiwiZGVwZW5kZW5jeU5hbWVBIiwiZGVwZW5kZW5jeU5hbWVCIiwiaW5kZXhBIiwiaW5kZXhPZiIsImluZGV4QiIsImluZm8iLCJpbml0aWFsaXNlIiwiZGVidWciLCJyZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5IiwicmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5IiwiY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kiLCJhc1N0cmluZyIsImRlcGVuZGVudE5hbWVzTGVuZ3RoIiwibGVuZ3RoIiwibGFzdERlcGVuZGVudE5hbWUiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCIsImNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMiLCJyZWxlYXNlZCIsImlzUmVsZWFzZWQiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5IiwidmVyaWZ5RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsInJlbGVhc2VDb250ZXh0VmVyaWZpZWQiLCJoYXNWZXJpZmllZCIsInZlcmlmaWVzIiwidmVyaWZ5IiwibmFtZSIsImFzeW5jRXZlcnlEZXBlbmRlbmN5IiwicmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCIsInNob3J0ZW5lZFZlcnNpb24iLCJnZXRTaG9ydGVuZWRWZXJzaW9uIiwiZW50cmllc01hdGNoU2hvcnRlbmVkVmVyc2lvbiIsIm1hdGNoU2hvcnRlbmVkVmVyc2lvbiIsInZlcnNpb24iLCJnZXRWZXJzaW9uIiwidmVyc2lvblN0cmluZyIsInRvU3RyaW5nIiwiZmlyc3RDeWNsZSIsImdldEZpcnN0Q3ljbGUiLCJ2ZXJ0ZXhOYW1lcyIsImdldFZlcnRleE5hbWVzIiwiZGVwZW5kZW5jeU5hbWVzIiwiZmlyc3REZXBlbmRlbmN5TmFtZSIsImN5Y2xpY0RlcGVuZGVuY3lOYW1lcyIsImN5Y2xlU3RyaW5nIiwiam9pbiIsIlNJTkdMRV9TUEFDRSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBVXNCQTtlQUFBQTs7UUF5RHRCO2VBQUE7O1FBNUNnQkM7ZUFBQUE7O1FBNEJNQztlQUFBQTs7O3FDQWpEUTsyQkFDQzsyQkFFRjs0QkFDUTtBQUVyQyxNQUFNLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFLEdBQUdDLHlCQUFjO0FBRS9CLGVBQWVMLHNCQUFzQk0sVUFBVSxFQUFFQyxPQUFPO0lBQzdELElBQUlDLHlCQUF5QjtJQUU3QixNQUFNQyxpQkFBaUIsRUFBRSxFQUNuQkMsd0JBQXdCLE1BQU1DLHFCQUFxQkwsWUFBWUcsZ0JBQWdCRjtJQUVyRixJQUFJRyx1QkFBdUI7UUFDekJGLHlCQUF5QjtJQUMzQjtJQUVBLE9BQU9B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
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmVyaWZpY2F0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IHsgU0lOR0xFX1NQQUNFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXN5bmNFdmVyeURlcGVuZGVuY3kgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2RlcGVuZGVuY3lcIjtcblxuY29uc3QgeyBsYXN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlbGVhc2VDb250ZXh0cyhkZXBlbmRlbmN5LCBjb250ZXh0KSB7XG4gIGxldCByZWxlYXNlQ29udGV4dHNDcmVhdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW50TmFtZXMgPSBbXSxcbiAgICAgICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gYXdhaXQgY3JlYXRlUmVsZWFzZUNvbnRleHQoZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gIGlmIChyZWxlYXNlQ29udGV4dENyZWF0ZWQpIHtcbiAgICByZWxlYXNlQ29udGV4dHNDcmVhdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dHNDcmVhdGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0cyhjb250ZXh0KSB7XG4gIGNvbnN0IHsgcmVsZWFzZUNvbnRleHRzIH0gPSBjb250ZXh0O1xuXG4gIHJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dChyZWxlYXNlQ29udGV4dCwgY29udGV4dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c1ZlcmlmeSA9IGZhbHNlO1xuXG4gIGNvbnN0IGRlcGVuZGVudE5hbWUgPSBudWxsLFxuICAgICAgICBkZXBlbmRlbnRSZWxlYXNlZCA9IGZhbHNlLFxuICAgICAgICByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gYXdhaXQgdmVyaWZ5UmVsZWFzZUNvbnRleHQoZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIGNvbnRleHQpO1xuXG4gIGlmIChyZWxlYXNlQ29udGV4dFZlcmlmaWVzKSB7XG4gICAgcmVsZWFzZUNvbnRleHRzVmVyaWZ5ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dHNWZXJpZnk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY3JlYXRlUmVsZWFzZUNvbnRleHRzLFxuICBpbml0aWFsaXNlUmVsZWFzZUNvbnRleHRzLFxuICB2ZXJpZnlSZWxlYXNlQ29udGV4dHNcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGxldCByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdCB7IGxvZywgcmVsZWFzZUNvbnRleHRGcm9tRGVwZW5kZW5jeSB9ID0gY29udGV4dCxcbiAgICAgICAgcmVsZWFzZUNvbnRleHQgPSBmaW5kUmVsZWFzZUNvbnRleHQoZGVwZW5kZW5jeSwgY29udGV4dCk7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZXBlbmRlbnROYW1lc0xlbmd0aCA9IGRlcGVuZGVudE5hbWVzLmxlbmd0aCxcbiAgICAgICAgICBkZXBlbmRlbmN5U3RyaW5nID0gZGVwZW5kZW5jeS5hc1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZTsgLy8vXG5cbiAgICBpZiAoZGVwZW5kZW50TmFtZXNMZW5ndGggPT09IDApIHtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGluZyB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQuLi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFzdERlcGVuZGVudE5hbWUgPSBsYXN0KGRlcGVuZGVudE5hbWVzKSxcbiAgICAgICAgICAgIGRlcGVuZGVudE5hbWUgPSBsYXN0RGVwZW5kZW50TmFtZTsgIC8vL1xuXG4gICAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0IGdpdmVuIHRoZSAnJHtkZXBlbmRlbnROYW1lfScgZGVwZW5kYW50J3MgJyR7ZGVwZW5kZW5jeVN0cmluZ30nIGRlcGVuZGVuY3kuLi5gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlQ29udGV4dCA9IGF3YWl0IHJlbGVhc2VDb250ZXh0RnJvbURlcGVuZGVuY3koZGVwZW5kZW5jeSwgY29udGV4dCk7XG5cbiAgICBpZiAocmVsZWFzZUNvbnRleHQgPT09IG51bGwpIHtcbiAgICAgIGxvZy53YXJuaW5nKGBUaGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBlcmhhcHMgdGhlICdtZXRhLmpzb24nIGZpbGUgaXMgbWlzc2luZyBvciBpbnZhbGlkLi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5ID0gY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSkge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCA9IGF3YWl0IGNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQpIHtcbiAgICAgICAgICBjb25zdCB7IHJlbGVhc2VDb250ZXh0cyB9ID0gY29udGV4dDtcblxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0cy5wdXNoKHJlbGVhc2VDb250ZXh0KTtcblxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgP1xuICAgICAgbG9nLmRlYnVnKGAuLi5jcmVhdGVkIHRoZSAnJHtyZWxlYXNlTmFtZX0nIHBhY2thZ2UgY29udGV4dC5gKSA6XG4gICAgICAgIGxvZy53YXJuaW5nKGAuLi51bmFibGUgdG8gY3JlYXRlIHRoZSAnJHtyZWxlYXNlTmFtZX0nIHBhY2thZ2UgY29udGV4dC5gKTtcbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dENyZWF0ZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCBjb250ZXh0KSB7XG4gIGxldCByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gZmFsc2U7XG5cbiAgY29uc3QgeyBsb2cgfSA9IGNvbnRleHQsXG4gICAgICAgIHJlbGVhc2VDb250ZXh0ID0gZmluZFJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGNvbnRleHQpLFxuICAgICAgICBuYW1lID0gcmVsZWFzZUNvbnRleHQuZ2V0TmFtZSgpLFxuICAgICAgICByZWxlYXNlZCA9IHJlbGVhc2VDb250ZXh0LmlzUmVsZWFzZWQoKSxcbiAgICAgICAgcmVsZWFzZU5hbWUgPSBuYW1lOyAvLy9cblxuICBpZiAoZGVwZW5kZW50UmVsZWFzZWQgJiYgIXJlbGVhc2VkKSB7XG4gICAgbG9nLndhcm5pbmcoYFRoZSAnJHtyZWxlYXNlTmFtZX0nIHByb2plY3QgY2Fubm90IGJlIHZlcmlmaWVkIGJlY2F1c2UgaXRzICcke2RlcGVuZGVudE5hbWV9JyBkZXBlbmRlbnQgaXMgYSBwYWNrYWdlLmApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHJlbGVhc2VDb250ZXh0LmdldERlcGVuZGVuY2llcygpLFxuICAgICAgICAgIGRlcGVuZGVudE5hbWUgPSByZWxlYXNlTmFtZSwgIC8vL1xuICAgICAgICAgIGRlcGVuZGVudFJlbGVhc2VkID0gcmVsZWFzZWQsIC8vL1xuICAgICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkgPSBhd2FpdCB2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY2llcywgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIGNvbnRleHQpO1xuXG4gICAgaWYgKGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkpIHtcbiAgICAgIGNvbnN0IHZlcmlmaWVkID0gcmVsZWFzZUNvbnRleHQuaGFzVmVyaWZpZWQoKTtcblxuICAgICAgaWYgKHZlcmlmaWVkIHx8IHJlbGVhc2VkKSB7XG4gICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmluZm8oYFZlcmlmeWluZyB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0Li4uYCk7XG5cbiAgICAgICAgY29uc3QgdmVyaWZpZXMgPSBhd2FpdCByZWxlYXNlQ29udGV4dC52ZXJpZnkoKTtcblxuICAgICAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgLi4udmVyaWZpZWQgdGhlICcke3JlbGVhc2VOYW1lfScgcHJvamVjdC5gKTtcblxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0VmVyaWZpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGxldCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZDtcblxuICBjb25zdCBuYW1lID0gcmVsZWFzZUNvbnRleHQuZ2V0TmFtZSgpLFxuICAgICAgICBkZXBlbmRlbmNpZXMgPSByZWxlYXNlQ29udGV4dC5nZXREZXBlbmRlbmNpZXMoKSxcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUgPSBuYW1lOyAgLy8vXG5cbiAgZGVwZW5kZW50TmFtZXMgPSBbIC4uLmRlcGVuZGVudE5hbWVzLCBkZXBlbmRlbmN5TmFtZSBdOyAgLy8vXG5cbiAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBhd2FpdCBhc3luY0V2ZXJ5RGVwZW5kZW5jeShkZXBlbmRlbmNpZXMsIGFzeW5jIChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgY3ljbGljRGVwZW5kZW5jUHJlc2VudCA9IGNoZWNrQ3ljbGljRGVwZW5kZW5jeVByZXNlbnQoZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgaWYgKCFjeWNsaWNEZXBlbmRlbmNQcmVzZW50KSB7XG4gICAgICBjb25zdCByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSBhd2FpdCBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgICAgIGlmIChyZWxlYXNlQ29udGV4dENyZWF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMoZGVwZW5kZW5jaWVzLCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgY29udGV4dCkge1xuICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5ID0gYXdhaXQgYXN5bmNFdmVyeURlcGVuZGVuY3koZGVwZW5kZW5jaWVzLCBhc3luYyAoZGVwZW5kZW5jeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSBhd2FpdCB2ZXJpZnlSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICByZXR1cm4gZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c1ZlcmlmeTtcbn1cblxuZnVuY3Rpb24gZmluZFJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgY29uc3QgeyByZWxlYXNlQ29udGV4dHMgfSA9IGNvbnRleHQsXG4gICAgICAgIGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRzLmZpbmQoKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGVwZW5kZW5jeU5hbWVNYXRjaGVzID0gcmVsZWFzZUNvbnRleHQubWF0Y2hEZXBlbmRlbmN5TmFtZShkZXBlbmRlbmN5TmFtZSk7XG5cbiAgICAgICAgICBpZiAoZGVwZW5kZW5jeU5hbWVNYXRjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pIHx8IG51bGw7XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0O1xufVxuXG5mdW5jdGlvbiByZXRyaWV2ZVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgY29udGV4dCwgcmVsZWFzZUNvbnRleHRzID0gW10pIHtcbiAgY29uc3QgcmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0cy5pbmNsdWRlcyhyZWxlYXNlQ29udGV4dCk7XG5cbiAgaWYgKCFyZWxlYXNlQ29udGV4dHNJbmNsdWRlc1JlbGVhc2VDb250ZXh0KSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaERlcGVuZGVuY3koKGRlcGVuZGVuY3kpID0+IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0ID0gZmluZFJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGNvbnRleHQpO1xuXG4gICAgICByZXRyaWV2ZVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgY29udGV4dCwgcmVsZWFzZUNvbnRleHRzKTtcbiAgICB9KTtcblxuICAgIHJlbGVhc2VDb250ZXh0cy51bnNoaWZ0KHJlbGVhc2VDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dHM7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dChyZWxlYXNlQ29udGV4dCwgY29udGV4dCkge1xuICBjb25zdCB7IGxvZywgRmlsZUNvbnRleHRGcm9tRmlsZVBhdGggfSA9IGNvbnRleHQsXG4gICAgICAgIG5hbWUgPSByZWxlYXNlQ29udGV4dC5nZXROYW1lKCksXG4gICAgICAgIHJlbGVhc2VOYW1lID0gbmFtZSwgLy8vXG4gICAgICAgIHJlbGVhc2VDb250ZXh0cyA9IHJldHJpZXZlUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBjb250ZXh0KTtcblxuICBsb2cuaW5mbyhgSW5pdGlhbGlzaW5nIHRoZSAnJHtyZWxlYXNlTmFtZX0nIHBhY2thZ2UgY29udGV4dC4uLmApO1xuXG4gIHJlbGVhc2VDb250ZXh0LmluaXRpYWxpc2UocmVsZWFzZUNvbnRleHRzLCBGaWxlQ29udGV4dEZyb21GaWxlUGF0aCk7XG5cbiAgbG9nLmRlYnVnKGAuLi5pbml0aWFsaXNlZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQuYCk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ3ljbGljRGVwZW5kZW5jeVByZXNlbnQoZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpIHtcbiAgbGV0IGN5Y2xpY0RlcGVuZGVuY1ByZXNlbnQgPSBmYWxzZTtcblxuICBjb25zdCBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICBpbmRleCA9IGRlcGVuZGVudE5hbWVzLmluZGV4T2YoZGVwZW5kZW5jeU5hbWUpO1xuXG4gIGlmIChpbmRleCA+IC0xKSB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGNvbnRleHQsXG4gICAgICAgICAgY2lyY3VsYXJEZXBlbmRlbnROYW1lcyA9IGRlcGVuZGVudE5hbWVzLnNsaWNlKGluZGV4KSxcbiAgICAgICAgICBjaXJjdWxhckRlcGVuZGVuY3lOYW1lcyA9IFtcbiAgICAgICAgICAgIC4uLmNpcmN1bGFyRGVwZW5kZW50TmFtZXMsXG4gICAgICAgICAgICBkZXBlbmRlbmN5TmFtZVxuICAgICAgICAgIF0sXG4gICAgICAgICAgY2lyY3VsYXJEZXBlbmRlbmN5TmFtZXNTdHJpbmcgPSBjaXJjdWxhckRlcGVuZGVuY3lOYW1lcy5qb2luKFNJTkdMRV9TUEFDRSk7XG5cbiAgICBsb2cud2FybmluZyhgVGhlcmUgaXMgYSBjeWNsaWMgZGVwZW5kZW5jeSwgJyR7Y2lyY3VsYXJEZXBlbmRlbmN5TmFtZXNTdHJpbmd9Jy5gKTtcblxuICAgIGN5Y2xpY0RlcGVuZGVuY1ByZXNlbnQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGN5Y2xpY0RlcGVuZGVuY1ByZXNlbnQ7XG59XG5cbmZ1bmN0aW9uIGNoZWNrUmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5KHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgcmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5ID0gdHJ1ZTtcblxuICBjb25zdCBzaG9ydGVuZWRWZXJzaW9uID0gZGVwZW5kZW5jeS5nZXRTaG9ydGVuZWRWZXJzaW9uKCk7XG5cbiAgaWYgKHNob3J0ZW5lZFZlcnNpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBlbnRyaWVzTWF0Y2hTaG9ydGVuZWRWZXJzaW9uID0gcmVsZWFzZUNvbnRleHQubWF0Y2hTaG9ydGVuZWRWZXJzaW9uKHNob3J0ZW5lZFZlcnNpb24pO1xuXG4gICAgaWYgKCFlbnRyaWVzTWF0Y2hTaG9ydGVuZWRWZXJzaW9uKSB7XG4gICAgICBjb25zdCB7IGxvZyB9ID0gY29udGV4dCxcbiAgICAgICAgICAgIHZlcnNpb24gPSByZWxlYXNlQ29udGV4dC5nZXRWZXJzaW9uKCksXG4gICAgICAgICAgICBsYXN0RGVwZW5kZW50TmFtZSA9IGxhc3QoZGVwZW5kZW50TmFtZXMpLFxuICAgICAgICAgICAgZGVwZW5kZW50TmFtZSA9IGxhc3REZXBlbmRlbnROYW1lLCAgLy8vXG4gICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvbi50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVwZW5kZW5jeVN0cmluZyA9IGRlcGVuZGVuY3kuYXNTdHJpbmcoKTtcblxuICAgICAgbG9nLndhcm5pbmcoYFRoZSAnJHtkZXBlbmRlbnROYW1lfScgZGVwZW5kZW50IHJlcXVpcmVzIHRoZSAnJHtkZXBlbmRlbmN5U3RyaW5nfScgZGVwZW5kZW5jeSBidXQgYSBjb250ZXh0IHdpdGggdmVyc2lvbiAnJHt2ZXJzaW9uU3RyaW5nfScgd2FzIHByb3ZpZGVkLmApO1xuXG4gICAgICByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5O1xufVxuIl0sIm5hbWVzIjpbImNyZWF0ZVJlbGVhc2VDb250ZXh0cyIsImluaXRpYWxpc2VSZWxlYXNlQ29udGV4dHMiLCJ2ZXJpZnlSZWxlYXNlQ29udGV4dHMiLCJsYXN0IiwiYXJyYXlVdGlsaXRpZXMiLCJkZXBlbmRlbmN5IiwiY29udGV4dCIsInJlbGVhc2VDb250ZXh0c0NyZWF0ZWQiLCJkZXBlbmRlbnROYW1lcyIsInJlbGVhc2VDb250ZXh0Q3JlYXRlZCIsImNyZWF0ZVJlbGVhc2VDb250ZXh0IiwicmVsZWFzZUNvbnRleHRzIiwiZm9yRWFjaCIsInJlbGVhc2VDb250ZXh0IiwiaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0IiwicmVsZWFzZUNvbnRleHRzVmVyaWZ5IiwiZGVwZW5kZW50TmFtZSIsImRlcGVuZGVudFJlbGVhc2VkIiwicmVsZWFzZUNvbnRleHRWZXJpZmllcyIsInZlcmlmeVJlbGVhc2VDb250ZXh0IiwibG9nIiwicmVsZWFzZUNvbnRleHRGcm9tRGVwZW5kZW5jeSIsImZpbmRSZWxlYXNlQ29udGV4dCIsImRlcGVuZGVudE5hbWVzTGVuZ3RoIiwibGVuZ3RoIiwiZGVwZW5kZW5jeVN0cmluZyIsImFzU3RyaW5nIiwiZGVwZW5kZW5jeU5hbWUiLCJnZXROYW1lIiwicmVsZWFzZU5hbWUiLCJpbmZvIiwibGFzdERlcGVuZGVudE5hbWUiLCJ3YXJuaW5nIiwicmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5IiwiY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCIsImNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMiLCJwdXNoIiwiZGVidWciLCJuYW1lIiwicmVsZWFzZWQiLCJpc1JlbGVhc2VkIiwiZGVwZW5kZW5jaWVzIiwiZ2V0RGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c1ZlcmlmeSIsInZlcmlmeURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMiLCJ2ZXJpZmllZCIsImhhc1ZlcmlmaWVkIiwidmVyaWZpZXMiLCJ2ZXJpZnkiLCJhc3luY0V2ZXJ5RGVwZW5kZW5jeSIsImN5Y2xpY0RlcGVuZGVuY1ByZXNlbnQiLCJjaGVja0N5Y2xpY0RlcGVuZGVuY3lQcmVzZW50IiwiZmluZCIsImRlcGVuZGVuY3lOYW1lTWF0Y2hlcyIsIm1hdGNoRGVwZW5kZW5jeU5hbWUiLCJyZXRyaWV2ZVJlbGVhc2VDb250ZXh0cyIsInJlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQiLCJpbmNsdWRlcyIsImZvckVhY2hEZXBlbmRlbmN5IiwidW5zaGlmdCIsIkZpbGVDb250ZXh0RnJvbUZpbGVQYXRoIiwiaW5pdGlhbGlzZSIsImluZGV4IiwiaW5kZXhPZiIsImNpcmN1bGFyRGVwZW5kZW50TmFtZXMiLCJzbGljZSIsImNpcmN1bGFyRGVwZW5kZW5jeU5hbWVzIiwiY2lyY3VsYXJEZXBlbmRlbmN5TmFtZXNTdHJpbmciLCJqb2luIiwiU0lOR0xFX1NQQUNFIiwic2hvcnRlbmVkVmVyc2lvbiIsImdldFNob3J0ZW5lZFZlcnNpb24iLCJlbnRyaWVzTWF0Y2hTaG9ydGVuZWRWZXJzaW9uIiwibWF0Y2hTaG9ydGVuZWRWZXJzaW9uIiwidmVyc2lvbiIsImdldFZlcnNpb24iLCJ2ZXJzaW9uU3RyaW5nIiwidG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQVNzQkE7ZUFBQUE7O1FBbUN0QjtlQUFBOztRQXRCZ0JDO2VBQUFBOztRQVFNQztlQUFBQTs7OzJCQTVCUzsyQkFFRjs0QkFDUTtBQUVyQyxNQUFNLEVBQUVDLElBQUksRUFBRSxHQUFHQyx5QkFBYztBQUV4QixlQUFlSixzQkFBc0JLLFVBQVUsRUFBRUMsT0FBTztJQUM3RCxJQUFJQyx5QkFBeUI7SUFFN0IsTUFBTUMsaUJBQWlCLEVBQUUsRUFDbkJDLHdCQUF3QixNQUFNQyxxQkFBcUJMLFlBQVlHLGdCQUFnQkY7SUFFckYsSUFBSUcsdUJBQXVCO1FBQ3pCRix5QkFBeUI7SUFDM0I7SUFFQSxPQUFPQTtBQUNUO0FBRU8sU0FBU04sMEJBQTBCSyxPQUFPO0lBQy9DLE1BQU0sRUFBRUssZUFBZSxFQUFFLEdBQUdMO0lBRTVCSyxnQkFBZ0JDLE9BQU8sQ0FBQyxDQUFDQztRQUN2QkMseUJBQXlCRCxnQkFBZ0JQO0lBQzNDO0FBQ0Y7QUFFTyxlQUFlSixzQkFBc0JHLFVBQVUsRUFBRUMsT0FBTztJQUM3RCxJQUFJUyx3QkFBd0I7SUFFNUIsTUFBTUMsZ0JBQWdCLE1BQ2hCQyxvQkFBb0IsT0FDcEJDLHlCQUF5QixNQUFNQyxxQkFBcUJkLFlBQVlXLGVBQWVDLG1CQUFtQlg7SUFFeEcsSUFBSVksd0JBQXdCO1FBQzFCSCx3QkFBd0I7SUFDMUI7SUFFQSxPQUFPQTtBQUNUO01BRUEsV0FBZTtJQUNiZjtJQUNBQztJQUNBQztBQUNGO0FBRUEsZUFBZVEscUJBQXFCTCxVQUFVLEVBQUVHLGNBQWMsRUFBRUYsT0FBTztJQUNyRSxJQUFJRyx3QkFBd0I7SUFFNUIsTUFBTSxFQUFFVyxHQUFHLEVBQUVDLDRCQUE0QixFQUFFLEdBQUdmLFNBQ3hDTyxpQkFBaUJTLG1CQUFtQmpCLFlBQVlDO0lBRXRELElBQUlPLG1CQUFtQixNQUFNO1FBQzNCSix3QkFBd0I7SUFDMUIsT0FBTztRQUNMLE1BQU1jLHVCQUF1QmYsZUFBZWdCLE1BQU0sRUFDNUNDLG1CQUFtQnBCLFdBQVdxQixRQUFRLElBQ3RDQyxpQkFBaUJ0QixXQUFXdUIsT0FBTyxJQUNuQ0MsY0FBY0YsZ0JBQWdCLEdBQUc7UUFFdkMsSUFBSUoseUJBQXlCLEdBQUc7WUFDOUJILElBQUlVLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRUQsWUFBWSxvQkFBb0IsQ0FBQztRQUM3RCxPQUFPO1lBQ0wsTUFBTUUsb0JBQW9CNUIsS0FBS0ssaUJBQ3pCUSxnQkFBZ0JlLG1CQUFvQixHQUFHO1lBRTdDWCxJQUFJVSxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUVELFlBQVksNkJBQTZCLEVBQUViLGNBQWMsZUFBZSxFQUFFUyxpQkFBaUIsZUFBZSxDQUFDO1FBQ3ZJO1FBRUEsTUFBTVosaUJBQWlCLE1BQU1RLDZCQUE2QmhCLFlBQVlDO1FBRXRFLElBQUlPLG1CQUFtQixNQUFNO1lBQzNCTyxJQUFJWSxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUVILFlBQVksNEZBQTRGLENBQUM7UUFDL0gsT0FBTztZQUNMLE1BQU1JLDJCQUEyQkMsOEJBQThCckIsZ0JBQWdCUixZQUFZRyxnQkFBZ0JGO1lBRTNHLElBQUkyQiwwQkFBMEI7Z0JBQzVCLE1BQU1FLG1DQUFtQyxNQUFNQyxnQ0FBZ0N2QixnQkFBZ0JSLFlBQVlHLGdCQUFnQkY7Z0JBRTNILElBQUk2QixrQ0FBa0M7b0JBQ3BDLE1BQU0sRUFBRXhCLGVBQWUsRUFBRSxHQUFHTDtvQkFFNUJLLGdCQUFnQjBCLElBQUksQ0FBQ3hCO29CQUVyQkosd0JBQXdCO2dCQUMxQjtZQUNGO1FBQ0Y7UUFFQUEsd0JBQ0VXLElBQUlrQixLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRVQsWUFBWSxrQkFBa0IsQ0FBQyxJQUMxRFQsSUFBSVksT0FBTyxDQUFDLENBQUMseUJBQXlCLEVBQUVILFlBQVksa0JBQWtCLENBQUM7SUFDN0U7SUFFQSxPQUFPcEI7QUFDVDtBQUVBLGVBQWVVLHFCQUFxQmQsVUFBVSxFQUFFVyxhQUFhLEVBQUVDLGlCQUFpQixFQUFFWCxPQUFPO0lBQ3ZGLElBQUlZLHlCQUF5QjtJQUU3QixNQUFNLEVBQUVFLEdBQUcsRUFBRSxHQUFHZCxTQUNWTyxpQkFBaUJTLG1CQUFtQmpCLFlBQVlDLFVBQ2hEaUMsT0FBTzFCLGVBQWVlLE9BQU8sSUFDN0JZLFdBQVczQixlQUFlNEIsVUFBVSxJQUNwQ1osY0FBY1UsTUFBTSxHQUFHO0lBRTdCLElBQUl0QixxQkFBcUIsQ0FBQ3VCLFVBQVU7UUFDbENwQixJQUFJWSxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUVILFlBQVksMENBQTBDLEVBQUViLGNBQWMseUJBQXlCLENBQUM7SUFDdEgsT0FBTztRQUNMLE1BQU0wQixlQUFlN0IsZUFBZThCLGVBQWUsSUFDN0MzQixnQkFBZ0JhLGFBQ2hCWixvQkFBb0J1QixVQUNwQkksa0NBQWtDLE1BQU1DLGdDQUFnQ0gsY0FBYzFCLGVBQWVDLG1CQUFtQlg7UUFFOUgsSUFBSXNDLGlDQUFpQztZQUNuQyxNQUFNRSxXQUFXakMsZUFBZWtDLFdBQVc7WUFFM0MsSUFBSUQsWUFBWU4sVUFBVTtnQkFDeEJ0Qix5QkFBeUI7WUFDM0IsT0FBTztnQkFDTEUsSUFBSVUsSUFBSSxDQUFDLENBQUMsZUFBZSxFQUFFRCxZQUFZLFlBQVksQ0FBQztnQkFFcEQsTUFBTW1CLFdBQVcsTUFBTW5DLGVBQWVvQyxNQUFNO2dCQUU1QyxJQUFJRCxVQUFVO29CQUNaNUIsSUFBSVUsSUFBSSxDQUFDLENBQUMsaUJBQWlCLEVBQUVELFlBQVksVUFBVSxDQUFDO29CQUVwRFgseUJBQXlCO2dCQUMzQjtZQUNGO1FBQ0Y7SUFDRjtJQUVBLE9BQU9BO0FBQ1Q7QUFFQSxlQUFla0IsZ0NBQWdDdkIsY0FBYyxFQUFFUixVQUFVLEVBQUVHLGNBQWMsRUFBRUYsT0FBTztJQUNoRyxJQUFJNkI7SUFFSixNQUFNSSxPQUFPMUIsZUFBZWUsT0FBTyxJQUM3QmMsZUFBZTdCLGVBQWU4QixlQUFlLElBQzdDaEIsaUJBQWlCWSxNQUFPLEdBQUc7SUFFakMvQixpQkFBaUI7V0FBS0E7UUFBZ0JtQjtLQUFnQixFQUFHLEdBQUc7SUFFNURRLG1DQUFtQyxNQUFNZSxJQUFBQSxnQ0FBb0IsRUFBQ1IsY0FBYyxPQUFPckM7UUFDakYsTUFBTThDLHlCQUF5QkMsNkJBQTZCL0MsWUFBWUcsZ0JBQWdCRjtRQUV4RixJQUFJLENBQUM2Qyx3QkFBd0I7WUFDM0IsTUFBTTFDLHdCQUF3QixNQUFNQyxxQkFBcUJMLFlBQVlHLGdCQUFnQkY7WUFFckYsSUFBSUcsdUJBQXVCO2dCQUN6QixPQUFPO1lBQ1Q7UUFDRjtJQUNGO0lBRUEsT0FBTzBCO0FBQ1Q7QUFFQSxlQUFlVSxnQ0FBZ0NILFlBQVksRUFBRTFCLGFBQWEsRUFBRUMsaUJBQWlCLEVBQUVYLE9BQU87SUFDcEcsTUFBTXNDLGtDQUFrQyxNQUFNTSxJQUFBQSxnQ0FBb0IsRUFBQ1IsY0FBYyxPQUFPckM7UUFDaEYsTUFBTWEseUJBQXlCLE1BQU1DLHFCQUFxQmQsWUFBWVcsZUFBZUMsbUJBQW1CWDtRQUV4RyxJQUFJWSx3QkFBd0I7WUFDMUIsT0FBTztRQUNUO0lBQ0Y7SUFFTixPQUFPMEI7QUFDVDtBQUVBLFNBQVN0QixtQkFBbUJqQixVQUFVLEVBQUVDLE9BQU87SUFDN0MsTUFBTSxFQUFFSyxlQUFlLEVBQUUsR0FBR0wsU0FDdEJxQixpQkFBaUJ0QixXQUFXdUIsT0FBTyxJQUNuQ2YsaUJBQWlCRixnQkFBZ0IwQyxJQUFJLENBQUMsQ0FBQ3hDO1FBQ3JDLE1BQU15Qyx3QkFBd0J6QyxlQUFlMEMsbUJBQW1CLENBQUM1QjtRQUVqRSxJQUFJMkIsdUJBQXVCO1lBQ3pCLE9BQU87UUFDVDtJQUNGLE1BQU07SUFFWixPQUFPekM7QUFDVDtBQUVBLFNBQVMyQyx3QkFBd0IzQyxjQUFjLEVBQUVQLE9BQU8sRUFBRUssa0JBQWtCLEVBQUU7SUFDNUUsTUFBTThDLHdDQUF3QzlDLGdCQUFnQitDLFFBQVEsQ0FBQzdDO0lBRXZFLElBQUksQ0FBQzRDLHVDQUF1QztRQUMxQyxNQUFNZixlQUFlN0IsZUFBZThCLGVBQWU7UUFFbkRELGFBQWFpQixpQkFBaUIsQ0FBQyxDQUFDdEQ7WUFDOUIsTUFBTVEsaUJBQWlCUyxtQkFBbUJqQixZQUFZQztZQUV0RGtELHdCQUF3QjNDLGdCQUFnQlAsU0FBU0s7UUFDbkQ7UUFFQUEsZ0JBQWdCaUQsT0FBTyxDQUFDL0M7SUFDMUI7SUFFQSxPQUFPRjtBQUNUO0FBRUEsU0FBU0cseUJBQXlCRCxjQUFjLEVBQUVQLE9BQU87SUFDdkQsTUFBTSxFQUFFYyxHQUFHLEVBQUV5Qyx1QkFBdUIsRUFBRSxHQUFHdkQsU0FDbkNpQyxPQUFPMUIsZUFBZWUsT0FBTyxJQUM3QkMsY0FBY1UsTUFDZDVCLGtCQUFrQjZDLHdCQUF3QjNDLGdCQUFnQlA7SUFFaEVjLElBQUlVLElBQUksQ0FBQyxDQUFDLGtCQUFrQixFQUFFRCxZQUFZLG9CQUFvQixDQUFDO0lBRS9EaEIsZUFBZWlELFVBQVUsQ0FBQ25ELGlCQUFpQmtEO0lBRTNDekMsSUFBSWtCLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixFQUFFVCxZQUFZLGtCQUFrQixDQUFDO0FBQ2xFO0FBRUEsU0FBU3VCLDZCQUE2Qi9DLFVBQVUsRUFBRUcsY0FBYyxFQUFFRixPQUFPO0lBQ3ZFLElBQUk2Qyx5QkFBeUI7SUFFN0IsTUFBTXhCLGlCQUFpQnRCLFdBQVd1QixPQUFPLElBQ25DbUMsUUFBUXZELGVBQWV3RCxPQUFPLENBQUNyQztJQUVyQyxJQUFJb0MsUUFBUSxDQUFDLEdBQUc7UUFDZCxNQUFNLEVBQUUzQyxHQUFHLEVBQUUsR0FBR2QsU0FDVjJELHlCQUF5QnpELGVBQWUwRCxLQUFLLENBQUNILFFBQzlDSSwwQkFBMEI7ZUFDckJGO1lBQ0h0QztTQUNELEVBQ0R5QyxnQ0FBZ0NELHdCQUF3QkUsSUFBSSxDQUFDQyx1QkFBWTtRQUUvRWxELElBQUlZLE9BQU8sQ0FBQyxDQUFDLCtCQUErQixFQUFFb0MsOEJBQThCLEVBQUUsQ0FBQztRQUUvRWpCLHlCQUF5QjtJQUMzQjtJQUVBLE9BQU9BO0FBQ1Q7QUFFQSxTQUFTakIsOEJBQThCckIsY0FBYyxFQUFFUixVQUFVLEVBQUVHLGNBQWMsRUFBRUYsT0FBTztJQUN4RixJQUFJMkIsMkJBQTJCO0lBRS9CLE1BQU1zQyxtQkFBbUJsRSxXQUFXbUUsbUJBQW1CO0lBRXZELElBQUlELHFCQUFxQixNQUFNO1FBQzdCLE1BQU1FLCtCQUErQjVELGVBQWU2RCxxQkFBcUIsQ0FBQ0g7UUFFMUUsSUFBSSxDQUFDRSw4QkFBOEI7WUFDakMsTUFBTSxFQUFFckQsR0FBRyxFQUFFLEdBQUdkLFNBQ1ZxRSxVQUFVOUQsZUFBZStELFVBQVUsSUFDbkM3QyxvQkFBb0I1QixLQUFLSyxpQkFDekJRLGdCQUFnQmUsbUJBQ2hCOEMsZ0JBQWdCRixRQUFRRyxRQUFRLElBQ2hDckQsbUJBQW1CcEIsV0FBV3FCLFFBQVE7WUFFNUNOLElBQUlZLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRWhCLGNBQWMsMEJBQTBCLEVBQUVTLGlCQUFpQix5Q0FBeUMsRUFBRW9ELGNBQWMsZUFBZSxDQUFDO1lBRXhKNUMsMkJBQTJCO1FBQzdCO0lBQ0Y7SUFFQSxPQUFPQTtBQUNUIn0=
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "occam-languages",
|
|
3
3
|
"author": "James Smith",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.136",
|
|
5
5
|
"license": "MIT, Anti-996",
|
|
6
6
|
"homepage": "https://github.com/djalbat/occam-languages",
|
|
7
7
|
"description": "Occam's common language functionality.",
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"necessary": "^17.1.7",
|
|
14
14
|
"occam-custom-grammars": "^6.0.17",
|
|
15
|
-
"occam-directed-graphs": "^3.0.87",
|
|
16
15
|
"occam-parsers": "^23.1.50"
|
|
17
16
|
},
|
|
18
17
|
"devDependencies": {
|
package/src/context/release.js
CHANGED
|
@@ -68,6 +68,12 @@ export default class ReleaseContext {
|
|
|
68
68
|
return this.dependencyReleaseContexts;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
matchDependencyName(dependencyName) {
|
|
72
|
+
const dependencyNameMatches = (this.name === dependencyName);
|
|
73
|
+
|
|
74
|
+
return dependencyNameMatches;
|
|
75
|
+
}
|
|
76
|
+
|
|
71
77
|
getReleaseContext() {
|
|
72
78
|
const releaseContext = this; ///
|
|
73
79
|
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { DirectedGraph } from "occam-directed-graphs";
|
|
4
3
|
import { arrayUtilities } from "necessary";
|
|
5
4
|
|
|
6
|
-
import {
|
|
5
|
+
import { SINGLE_SPACE } from "../constants";
|
|
7
6
|
import { asyncEveryDependency } from "../utilities/dependency";
|
|
8
7
|
|
|
9
|
-
const {
|
|
8
|
+
const { last } = arrayUtilities;
|
|
10
9
|
|
|
11
10
|
export async function createReleaseContexts(dependency, context) {
|
|
12
11
|
let releaseContextsCreated = false;
|
|
@@ -21,42 +20,20 @@ export async function createReleaseContexts(dependency, context) {
|
|
|
21
20
|
return releaseContextsCreated;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
export function initialiseReleaseContexts(
|
|
25
|
-
|
|
23
|
+
export function initialiseReleaseContexts(context) {
|
|
24
|
+
const { releaseContexts } = context;
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
|
|
31
|
-
|
|
32
|
-
const cyclicDependenciesPresent = checkCyclicDependenciesPresent(directedGraph, context);
|
|
33
|
-
|
|
34
|
-
if (!cyclicDependenciesPresent) {
|
|
35
|
-
const { releaseContextMap } = context,
|
|
36
|
-
releaseNames = Object.keys(releaseContextMap),
|
|
37
|
-
orderedVertexNames = directedGraph.getOrderedVertexNames(),
|
|
38
|
-
orderedDependencyNames = orderedVertexNames.reverse(); ///
|
|
39
|
-
|
|
40
|
-
releaseNames.forEach((releaseName) => {
|
|
41
|
-
const releaseContext = releaseContextMap[releaseName];
|
|
42
|
-
|
|
43
|
-
initialiseReleaseContext(releaseContext, orderedDependencyNames, context);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
releaseContextsInitialised = true;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return releaseContextsInitialised;
|
|
26
|
+
releaseContexts.forEach((releaseContext) => {
|
|
27
|
+
initialiseReleaseContext(releaseContext, context);
|
|
28
|
+
});
|
|
50
29
|
}
|
|
51
30
|
|
|
52
31
|
export async function verifyReleaseContexts(dependency, context) {
|
|
53
32
|
let releaseContextsVerify = false;
|
|
54
33
|
|
|
55
|
-
const
|
|
56
|
-
releaseName = dependencyName, ///
|
|
57
|
-
dependentName = null,
|
|
34
|
+
const dependentName = null,
|
|
58
35
|
dependentReleased = false,
|
|
59
|
-
releaseContextVerifies = await verifyReleaseContext(
|
|
36
|
+
releaseContextVerifies = await verifyReleaseContext(dependency, dependentName, dependentReleased, context);
|
|
60
37
|
|
|
61
38
|
if (releaseContextVerifies) {
|
|
62
39
|
releaseContextsVerify = true;
|
|
@@ -71,85 +48,19 @@ export default {
|
|
|
71
48
|
verifyReleaseContexts
|
|
72
49
|
};
|
|
73
50
|
|
|
74
|
-
function addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context) {
|
|
75
|
-
const dependencyName = dependency.getName(),
|
|
76
|
-
visitedDependencyNameIncludesDependencyName = visitedDependencyNames.includes(dependencyName);
|
|
77
|
-
|
|
78
|
-
if (visitedDependencyNameIncludesDependencyName) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const visiteddependencyName = dependencyName; ///
|
|
83
|
-
|
|
84
|
-
visitedDependencyNames.push(visiteddependencyName);
|
|
85
|
-
|
|
86
|
-
const { log, releaseContextMap } = context,
|
|
87
|
-
releaseName = dependencyName, ///
|
|
88
|
-
releaseContext = releaseContextMap[releaseName] || null;
|
|
89
|
-
|
|
90
|
-
if (releaseContext === null) {
|
|
91
|
-
const dependencyString = dependency.getString();
|
|
92
|
-
|
|
93
|
-
log.warning(`No package context has been created for the '${dependencyString}' dependency. `);
|
|
94
|
-
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const dependencies = releaseContext.getDependencies(),
|
|
99
|
-
targetVertexName = dependencyName; ///
|
|
100
|
-
|
|
101
|
-
dependencies.forEachDependency((dependency) => {
|
|
102
|
-
const dependencyName = dependency.getName(),
|
|
103
|
-
sourceVertexName = dependencyName; ///
|
|
104
|
-
|
|
105
|
-
directedGraph.addEdgeBySourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
|
|
106
|
-
|
|
107
|
-
addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function initialiseReleaseContext(releaseContext, orderedDependencyNames, context) {
|
|
112
|
-
const { log, releaseContextMap, FileContextFromFilePath } = context,
|
|
113
|
-
releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap),
|
|
114
|
-
releaseContextName = releaseContext.getName();
|
|
115
|
-
|
|
116
|
-
releaseContexts.sort((releaseContextA, releaseContextB) => {
|
|
117
|
-
const releaseContextAName = releaseContextA.getName(),
|
|
118
|
-
releaseContextBName = releaseContextB.getName(),
|
|
119
|
-
dependencyNameA = releaseContextAName, ///
|
|
120
|
-
dependencyNameB = releaseContextBName, ///
|
|
121
|
-
indexA = orderedDependencyNames.indexOf(dependencyNameA),
|
|
122
|
-
indexB = orderedDependencyNames.indexOf(dependencyNameB);
|
|
123
|
-
|
|
124
|
-
return (indexA - indexB);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
log.info(`Initialising the '${releaseContextName}' package context...`);
|
|
128
|
-
|
|
129
|
-
releaseContext.initialise(releaseContexts, FileContextFromFilePath);
|
|
130
|
-
|
|
131
|
-
log.debug(`...initialised the '${releaseContextName}' package context.`);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
51
|
async function createReleaseContext(dependency, dependentNames, context) {
|
|
135
52
|
let releaseContextCreated = false;
|
|
136
53
|
|
|
137
|
-
const { log,
|
|
138
|
-
|
|
139
|
-
releaseName = dependencyName, ///
|
|
140
|
-
releaseContext = releaseContextMap[releaseName] || null;
|
|
54
|
+
const { log, releaseContextFromDependency } = context,
|
|
55
|
+
releaseContext = findReleaseContext(dependency, context);
|
|
141
56
|
|
|
142
57
|
if (releaseContext !== null) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (releaseMatchesDependency) {
|
|
146
|
-
log.debug(`The '${releaseName}' package context has already been created.`);
|
|
147
|
-
|
|
148
|
-
releaseContextCreated = true;
|
|
149
|
-
}
|
|
58
|
+
releaseContextCreated = true;
|
|
150
59
|
} else {
|
|
151
|
-
const
|
|
152
|
-
|
|
60
|
+
const dependentNamesLength = dependentNames.length,
|
|
61
|
+
dependencyString = dependency.asString(),
|
|
62
|
+
dependencyName = dependency.getName(),
|
|
63
|
+
releaseName = dependencyName; ///
|
|
153
64
|
|
|
154
65
|
if (dependentNamesLength === 0) {
|
|
155
66
|
log.info(`Creating the '${releaseName}' package context...`);
|
|
@@ -162,23 +73,22 @@ async function createReleaseContext(dependency, dependentNames, context) {
|
|
|
162
73
|
|
|
163
74
|
const releaseContext = await releaseContextFromDependency(dependency, context);
|
|
164
75
|
|
|
165
|
-
if (releaseContext
|
|
76
|
+
if (releaseContext === null) {
|
|
77
|
+
log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid..`);
|
|
78
|
+
} else {
|
|
166
79
|
const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
|
|
167
80
|
|
|
168
81
|
if (releaseMatchesDependency) {
|
|
169
|
-
releaseContextMap[releaseName] = releaseContext;
|
|
170
|
-
|
|
171
82
|
const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context);
|
|
172
83
|
|
|
173
84
|
if (dependencyReleaseContextsCreated) {
|
|
85
|
+
const { releaseContexts } = context;
|
|
86
|
+
|
|
87
|
+
releaseContexts.push(releaseContext);
|
|
88
|
+
|
|
174
89
|
releaseContextCreated = true;
|
|
175
90
|
}
|
|
176
91
|
}
|
|
177
|
-
} else {
|
|
178
|
-
const dependencyName = dependency.getName(),
|
|
179
|
-
releaseName = dependencyName; ///
|
|
180
|
-
|
|
181
|
-
log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
|
|
182
92
|
}
|
|
183
93
|
|
|
184
94
|
releaseContextCreated ?
|
|
@@ -189,40 +99,37 @@ async function createReleaseContext(dependency, dependentNames, context) {
|
|
|
189
99
|
return releaseContextCreated;
|
|
190
100
|
}
|
|
191
101
|
|
|
192
|
-
async function verifyReleaseContext(
|
|
102
|
+
async function verifyReleaseContext(dependency, dependentName, dependentReleased, context) {
|
|
193
103
|
let releaseContextVerifies = false;
|
|
194
104
|
|
|
195
|
-
const
|
|
105
|
+
const { log } = context,
|
|
106
|
+
releaseContext = findReleaseContext(dependency, context),
|
|
107
|
+
name = releaseContext.getName(),
|
|
108
|
+
released = releaseContext.isReleased(),
|
|
109
|
+
releaseName = name; ///
|
|
196
110
|
|
|
197
|
-
if (
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
releaseContext.warning(`The '${releaseName}' project cannot be verified because its '${dependentName}' dependent is a package.`);
|
|
205
|
-
} else {
|
|
206
|
-
const dependentName = releaseName, ///
|
|
207
|
-
dependentReleased = released, ///
|
|
208
|
-
dependencyReleaseContextsVerify = await verifyDependencyReleaseContexts(releaseContext, dependentName, dependentReleased, releaseContextMap);
|
|
111
|
+
if (dependentReleased && !released) {
|
|
112
|
+
log.warning(`The '${releaseName}' project cannot be verified because its '${dependentName}' dependent is a package.`);
|
|
113
|
+
} else {
|
|
114
|
+
const dependencies = releaseContext.getDependencies(),
|
|
115
|
+
dependentName = releaseName, ///
|
|
116
|
+
dependentReleased = released, ///
|
|
117
|
+
dependencyReleaseContextsVerify = await verifyDependencyReleaseContexts(dependencies, dependentName, dependentReleased, context);
|
|
209
118
|
|
|
210
|
-
|
|
211
|
-
|
|
119
|
+
if (dependencyReleaseContextsVerify) {
|
|
120
|
+
const verified = releaseContext.hasVerified();
|
|
212
121
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
122
|
+
if (verified || released) {
|
|
123
|
+
releaseContextVerifies = true;
|
|
124
|
+
} else {
|
|
125
|
+
log.info(`Verifying the '${releaseName}' project...`);
|
|
217
126
|
|
|
218
|
-
|
|
127
|
+
const verifies = await releaseContext.verify();
|
|
219
128
|
|
|
220
|
-
|
|
221
|
-
|
|
129
|
+
if (verifies) {
|
|
130
|
+
log.info(`...verified the '${releaseName}' project.`);
|
|
222
131
|
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
}
|
|
132
|
+
releaseContextVerifies = true;
|
|
226
133
|
}
|
|
227
134
|
}
|
|
228
135
|
}
|
|
@@ -241,22 +148,23 @@ async function createDependencyReleaseContexts(releaseContext, dependency, depen
|
|
|
241
148
|
dependentNames = [ ...dependentNames, dependencyName ]; ///
|
|
242
149
|
|
|
243
150
|
dependencyReleaseContextsCreated = await asyncEveryDependency(dependencies, async (dependency) => {
|
|
244
|
-
const
|
|
151
|
+
const cyclicDependencPresent = checkCyclicDependencyPresent(dependency, dependentNames, context);
|
|
152
|
+
|
|
153
|
+
if (!cyclicDependencPresent) {
|
|
154
|
+
const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
245
155
|
|
|
246
|
-
|
|
247
|
-
|
|
156
|
+
if (releaseContextCreated) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
248
159
|
}
|
|
249
160
|
});
|
|
250
161
|
|
|
251
162
|
return dependencyReleaseContextsCreated;
|
|
252
163
|
}
|
|
253
164
|
|
|
254
|
-
async function verifyDependencyReleaseContexts(
|
|
255
|
-
const
|
|
256
|
-
|
|
257
|
-
const name = dependency.getName(),
|
|
258
|
-
releaseName = name, ///
|
|
259
|
-
releaseContextVerifies = await verifyReleaseContext(releaseName, dependentName, dependentReleased, releaseContextMap);
|
|
165
|
+
async function verifyDependencyReleaseContexts(dependencies, dependentName, dependentReleased, context) {
|
|
166
|
+
const dependencyReleaseContextsVerify = await asyncEveryDependency(dependencies, async (dependency) => {
|
|
167
|
+
const releaseContextVerifies = await verifyReleaseContext(dependency, dependentName, dependentReleased, context);
|
|
260
168
|
|
|
261
169
|
if (releaseContextVerifies) {
|
|
262
170
|
return true;
|
|
@@ -266,26 +174,72 @@ async function verifyDependencyReleaseContexts(releaseContext, dependentName, de
|
|
|
266
174
|
return dependencyReleaseContextsVerify;
|
|
267
175
|
}
|
|
268
176
|
|
|
269
|
-
function
|
|
177
|
+
function findReleaseContext(dependency, context) {
|
|
178
|
+
const { releaseContexts } = context,
|
|
179
|
+
dependencyName = dependency.getName(),
|
|
180
|
+
releaseContext = releaseContexts.find((releaseContext) => {
|
|
181
|
+
const dependencyNameMatches = releaseContext.matchDependencyName(dependencyName);
|
|
182
|
+
|
|
183
|
+
if (dependencyNameMatches) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
}) || null;
|
|
187
|
+
|
|
188
|
+
return releaseContext;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function retrieveReleaseContexts(releaseContext, context, releaseContexts = []) {
|
|
270
192
|
const releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext);
|
|
271
193
|
|
|
272
|
-
if (releaseContextsIncludesReleaseContext) {
|
|
273
|
-
|
|
194
|
+
if (!releaseContextsIncludesReleaseContext) {
|
|
195
|
+
const dependencies = releaseContext.getDependencies();
|
|
196
|
+
|
|
197
|
+
dependencies.forEachDependency((dependency) => {
|
|
198
|
+
const releaseContext = findReleaseContext(dependency, context);
|
|
199
|
+
|
|
200
|
+
retrieveReleaseContexts(releaseContext, context, releaseContexts);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
releaseContexts.unshift(releaseContext);
|
|
274
204
|
}
|
|
275
205
|
|
|
276
|
-
releaseContexts
|
|
206
|
+
return releaseContexts;
|
|
207
|
+
}
|
|
277
208
|
|
|
278
|
-
|
|
209
|
+
function initialiseReleaseContext(releaseContext, context) {
|
|
210
|
+
const { log, FileContextFromFilePath } = context,
|
|
211
|
+
name = releaseContext.getName(),
|
|
212
|
+
releaseName = name, ///
|
|
213
|
+
releaseContexts = retrieveReleaseContexts(releaseContext, context);
|
|
279
214
|
|
|
280
|
-
|
|
281
|
-
const dependencyName = dependency.getName(),
|
|
282
|
-
releaseName = dependencyName, ///
|
|
283
|
-
releaseContext = releaseContextMap[releaseName];
|
|
215
|
+
log.info(`Initialising the '${releaseName}' package context...`);
|
|
284
216
|
|
|
285
|
-
|
|
286
|
-
});
|
|
217
|
+
releaseContext.initialise(releaseContexts, FileContextFromFilePath);
|
|
287
218
|
|
|
288
|
-
|
|
219
|
+
log.debug(`...initialised the '${releaseName}' package context.`);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function checkCyclicDependencyPresent(dependency, dependentNames, context) {
|
|
223
|
+
let cyclicDependencPresent = false;
|
|
224
|
+
|
|
225
|
+
const dependencyName = dependency.getName(),
|
|
226
|
+
index = dependentNames.indexOf(dependencyName);
|
|
227
|
+
|
|
228
|
+
if (index > -1) {
|
|
229
|
+
const { log } = context,
|
|
230
|
+
circularDependentNames = dependentNames.slice(index),
|
|
231
|
+
circularDependencyNames = [
|
|
232
|
+
...circularDependentNames,
|
|
233
|
+
dependencyName
|
|
234
|
+
],
|
|
235
|
+
circularDependencyNamesString = circularDependencyNames.join(SINGLE_SPACE);
|
|
236
|
+
|
|
237
|
+
log.warning(`There is a cyclic dependency, '${circularDependencyNamesString}'.`);
|
|
238
|
+
|
|
239
|
+
cyclicDependencPresent = true;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return cyclicDependencPresent;
|
|
289
243
|
}
|
|
290
244
|
|
|
291
245
|
function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
|
|
@@ -312,27 +266,3 @@ function checkReleaseMatchesDependency(releaseContext, dependency, dependentName
|
|
|
312
266
|
|
|
313
267
|
return releaseMatchesDependency;
|
|
314
268
|
}
|
|
315
|
-
|
|
316
|
-
function checkCyclicDependenciesPresent(directedGraph, context) {
|
|
317
|
-
let cyclicDependenciesPresent = false;
|
|
318
|
-
|
|
319
|
-
const firstCycle = directedGraph.getFirstCycle();
|
|
320
|
-
|
|
321
|
-
if (firstCycle !== null) {
|
|
322
|
-
const { log } = context,
|
|
323
|
-
vertexNames = firstCycle.getVertexNames(),
|
|
324
|
-
dependencyNames = vertexNames, ///
|
|
325
|
-
firstDependencyName = first(dependencyNames),
|
|
326
|
-
cyclicDependencyNames = [
|
|
327
|
-
...dependencyNames,
|
|
328
|
-
firstDependencyName
|
|
329
|
-
],
|
|
330
|
-
cycleString = cyclicDependencyNames.join(SINGLE_SPACE);
|
|
331
|
-
|
|
332
|
-
log.warning(`There is at least one '${cycleString}'. cyclic dependency`);
|
|
333
|
-
|
|
334
|
-
cyclicDependenciesPresent = true;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
return cyclicDependenciesPresent;
|
|
338
|
-
}
|