@dbx-tools/appkit-mastra 0.4.0 → 0.5.0

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/src/genie.js CHANGED
@@ -966,4 +966,4 @@ export async function collectSpaceSuggestions(opts) {
966
966
  }
967
967
  return merged;
968
968
  }
969
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQXdDLE1BQU0sMEJBQTBCLENBQUM7QUFFdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVyQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxt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QyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNqRCxDQUFDLENBQUM7Z0JBQ0gsU0FBUyxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkQsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ3JDLE9BQU87b0JBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2lCQUMvQixDQUFDLENBQUM7Z0JBQ0gsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxTQUFTO1lBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSztnQkFBRSxPQUFPLE1BQU0sQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmllIHRvb2xzIGZvciBNYXN0cmEuXG4gKlxuICogU3VyZmFjZXMgZWFjaCBjb25maWd1cmVkIEdlbmllIHNwYWNlIGFzIGEgc21hbGwgc2V0IG9mIGZsYXQgTWFzdHJhXG4gKiB0b29scyB0aGUgY2FsbGluZyBhZ2VudCBkcml2ZXMgZGlyZWN0bHkgLSBubyBpbm5lciBvcmNoZXN0cmF0b3JcbiAqIGFnZW50LiBUaGUgY2VudHJhbCBhZ2VudCBkZWNvbXBvc2VzIHVzZXIgcXVlc3Rpb25zLCBwaWNrcyB3aGljaFxuICogc3BhY2UgdG8gYXNrLCBzdHJlYW1zIHRoZSBwZXItdHVybiB3aXJlIGV2ZW50cyAoc3RhdHVzLCB0aGlua2luZyxcbiAqIHNxbCwgcm93cykgdGhyb3VnaCBgY3R4LndyaXRlcmAsIGFuZCBjb21wb3NlcyB0aGUgZmluYWwgcmVwbHkuXG4gKiBSb3dzIGFyZSBuZXZlciBmZXRjaGVkIGVhZ2VybHk6IHRoZSBhZ2VudCByZWFkcyBhIHN0YXRlbWVudCdzXG4gKiB2YWx1ZXMgb25seSB3aGVuIGl0IG5lZWRzIHRvIHJlYXNvbiBhYm91dCB0aGVtLCBvdGhlcndpc2UgaXQgZW1iZWRzXG4gKiBhIGBbZGF0YTo8c3RhdGVtZW50X2lkPl1gIG1hcmtlciBpbiBwcm9zZSBhbmQgbGV0cyB0aGUgaG9zdCBVSVxuICogcmVzb2x2ZSB0aGUgZGF0YS4gQ2hhcnRzIGFyZSBtaW50ZWQgYXN5bmNocm9ub3VzbHkgYW5kIHJlZmVyZW5jZWRcbiAqIGJ5IGBbY2hhcnQ6PGNoYXJ0SWQ+XWAgbWFya2VycyBzbyBwcm9zZSBpc24ndCBibG9ja2VkIG9uIGNoYXJ0XG4gKiBnZW5lcmF0aW9uOyB0aGUgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgc3BlYyBieSBpZCBvbmNlIHJlYWR5LlxuICogU3BhY2UgZGVzY3JpcHRpb24gYW5kIHNlcmlhbGl6ZWQtc3BhY2UgbG9va3VwcyBhcmUgYXZhaWxhYmxlIGZvclxuICogZ3JvdW5kaW5nIHdoZW4gdGhlIGFnZW50IG5lZWRzIHNjaGVtYSBjb250ZXh0LlxuICpcbiAqIEVhY2ggdG9vbCdzIGBleGVjdXRlYCBwdWxscyB0aGUgcGVyLXJlcXVlc3RcbiAqIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9IG9mZiBgY3R4LnJlcXVlc3RDb250ZXh0YCAoc3RhbXBlZCBieVxuICogYE1hc3RyYVNlcnZlcmAgdW5kZXIge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX0pIGFuZCB0aGUgcGVyLWNhbGxcbiAqIGB3cml0ZXJgIC8gYGFib3J0U2lnbmFsYCBvZmYgYGN0eGAsIHNvIHRoZSB0b29scyBhcmUgc3RhdGVsZXNzXG4gKiBhY3Jvc3MgcmVxdWVzdHMgYW5kIHRoZSBjZW50cmFsIGFnZW50IG93bnMgdGhlIGxvb3AuXG4gKlxuICogVGhlIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdmlhIGBAZGJ4LXRvb2xzL2dlbmllYFxuICogKGBnZW5pZUV2ZW50Q2hhdGApOyBzdGF0ZW1lbnQtcm93IGZldGNoaW5nIGlzIGRlbGVnYXRlZCB0b1xuICoge0BsaW5rIGZldGNoU3RhdGVtZW50RGF0YX0gZnJvbSBgLi9zdGF0ZW1lbnQuanNgLCB3aGljaCB3cmFwc1xuICogdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGAgQVBJLiBBcHBLaXQnc1xuICogc3RvY2sgYGdlbmllYCBwbHVnaW4gaXMgaG9ub3JlZCBvbmx5IGZvciBpdHMgYHNwYWNlc2AgY29uZmlnXG4gKiBzbyBleGlzdGluZyBBcHBLaXQtc3R5bGUgd2lyaW5nIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBjaGFuZ2UuXG4gKlxuICogU3VnZ2VzdGVkIG9yY2hlc3RyYXRpb24gcHJvbXB0IGZvciB0aGUgY2VudHJhbCBhZ2VudCBsaXZlcyBpblxuICoge0BsaW5rIEdFTklFX0lOU1RSVUNUSU9OU307IGNvbXBvc2UgaXQgaW50byB0aGUgYWdlbnQncyBvd25cbiAqIGBpbnN0cnVjdGlvbnNgIHdoZW4geW91IHdhbnQgdGhlIGNhbm9uaWNhbCBcImhvdyB0byBkcml2ZSB0aGVcbiAqIEdlbmllIHRvb2xzXCIgZ3VpZGFuY2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENhY2hlTWFuYWdlcixcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2VuaWUsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxcIjtcbmltcG9ydCB7IHBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2hhdCwgc3BhY2UgYXMgZ2VuaWVTcGFjZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2dlbmllXCI7XG5pbXBvcnQgeyBlcnJvciwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZ2VuaWVNb2RlbCwgdHlwZSBHZW5pZU1lc3NhZ2UgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWVcIjtcbmltcG9ydCB7IHdpcmUsIHR5cGUgTWFzdHJhV3JpdGVyLCB0eXBlIFN0YXJ0ZWRFdmVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMgfSBmcm9tIFwiLi9hZ2VudHNcIjtcbmltcG9ydCB7IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsIHByZXBhcmVDaGFydCB9IGZyb20gXCIuL2NoYXJ0XCI7XG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHJlc29sdmVVc2VyS2V5IH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZywgVXNlciB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnREYXRhIH0gZnJvbSBcIi4vc3RhdGVtZW50XCI7XG5pbXBvcnQgeyBzYWZlV3JpdGUgfSBmcm9tIFwiLi93cml0ZXJcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9nZW5pZVwiKTtcblxuLyoqIERlZmF1bHQgYWxpYXMgdXNlZCB3aGVuIGEgc2luZ2xlIHVubmFtZWQgR2VuaWUgc3BhY2UgaXMgd2lyZWQgdXAuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9HRU5JRV9BTElBUyA9IFwiZGVmYXVsdFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uZmlnIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUGVyLXNwYWNlIEdlbmllIGFnZW50IGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmllU3BhY2VDb25maWcge1xuICAvKiogR2VuaWUgYHNwYWNlX2lkYC4gUmVxdWlyZWQ7IHJlc29sdmVzIHZpYSBgY2xpZW50LmdlbmllLmdldFNwYWNlYC4gKi9cbiAgc3BhY2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYXBwZW5kZWQgdG8gdGhlIHBlci1zcGFjZVxuICAgKiB0b29sIGRlc2NyaXB0aW9ucyBzbyB0aGUgY2FsbGluZyBMTE0gaGFzIGhpbnRzIGFib3V0ICp3aGF0XG4gICAqIGRhdGEqIHRoaXMgc3BhY2UgY292ZXJzIChlLmcuIFwib3JkZXJzLCByZXR1cm5zLFxuICAgKiBmdWxmaWxsbWVudFwiKS4gV2hlbiBvbWl0dGVkLCBvbmx5IHRoZSBzcGFjZSdzIG93blxuICAgKiBgZGVzY3JpcHRpb25gIChmZXRjaGVkIG9uIGZpcnN0IHVzZSBvZiBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYClcbiAgICogaXMgc2hvd24uXG4gICAqL1xuICBoaW50Pzogc3RyaW5nO1xufVxuXG4vKiogTWFwIG9mIGFsaWFzIC0+IHNwYWNlIGNvbmZpZy4gQWNjZXB0cyBlaXRoZXIgZXhwbGljaXQgb2JqZWN0cyBvciBiYXJlIHNwYWNlIGlkcy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllU3BhY2VzQ29uZmlnID0gUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZyB8IHN0cmluZz47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3R4IGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5hcnJvdyB2aWV3IG9mIHRoZSBzZWNvbmQgYXJnIE1hc3RyYSBwYXNzZXMgdG8gYSB0b29sJ3NcbiAqIGBleGVjdXRlKGlucHV0LCBjdHgpYC4gQ2FwdHVyZXMgdGhlIGZpZWxkcyB0aGUgR2VuaWUgdG9vbHNcbiAqIGFjdHVhbGx5IHJlYWQgLSBgcmVxdWVzdENvbnRleHRgIChmb3IgdXNlciAvIGNvbnZlcnNhdGlvblxuICogc3RhdGUpLCBgd3JpdGVyYCAoZm9yIHN0cmVhbWluZyBldmVudHMgdG8gdGhlIGhvc3QgVUkpLCBhbmRcbiAqIGBhYm9ydFNpZ25hbGAgKGZvciBwZXItY2FsbCBjYW5jZWxsYXRpb24pLlxuICovXG50eXBlIFRvb2xFeGVjdXRlQ3R4ID1cbiAgfCB7XG4gICAgICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAgICAgd3JpdGVyPzogTWFzdHJhV3JpdGVyO1xuICAgICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgICB9XG4gIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFB1bGwgdGhlIHBlci1yZXF1ZXN0IHtAbGluayBXb3Jrc3BhY2VDbGllbnR9IG9mZiB0aGUgYWN0aXZlXG4gKiBgUmVxdWVzdENvbnRleHRgLiBUaGUgTWFzdHJhIHBsdWdpbidzIHNlcnZlciBtaWRkbGV3YXJlIHN0YW1wc1xuICogYSB7QGxpbmsgVXNlcn0gb24gdGhlIGNvbnRleHQgdW5kZXIge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX1cbiAqIGZvciBldmVyeSByZXF1ZXN0OyB0b29scyBmYWlsIGxvdWRseSB3aGVuIGl0J3MgbWlzc2luZyBiZWNhdXNlXG4gKiB0aGF0IG1lYW5zIHRoZSBNYXN0cmEgcGx1Z2luIGlzbid0IHJ1bm5pbmcgKGUuZy4gYSB0b29sIHdhc1xuICogaW52b2tlZCBvdXRzaWRlIHRoZSBjaGF0IHJvdXRlKS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZUNsaWVudChcbiAgY3R4OiBUb29sRXhlY3V0ZUN0eCxcbiAgdG9vbElkOiBzdHJpbmcsXG4pOiB7XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQ7XG59IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjdHg/LnJlcXVlc3RDb250ZXh0O1xuICBpZiAoIXJlcXVlc3RDb250ZXh0KSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgJHt0b29sSWR9IHJlcXVlc3QgY29udGV4dGAsXG4gICAgICBcIkludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGlmICghdXNlcikge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYCR7dG9vbElkfSB1c2VyIGNvbnRleHRgLFxuICAgICAgXCJJbnZva2UgdGhlIHRvb2wgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpbiwgd2hpY2ggc3RhbXBzIHRoZSBBcHBLaXQgdXNlciBvbiB0aGUgTWFzdHJhIHJlcXVlc3QgY29udGV4dC5cIixcbiAgICApO1xuICB9XG4gIHJldHVybiB7IGNsaWVudDogdXNlci5leGVjdXRpb25Db250ZXh0LmNsaWVudCwgcmVxdWVzdENvbnRleHQgfTtcbn1cblxuLyoqXG4gKiBMb3dlcmNhc2VkIHBsYWNlaG9sZGVyIHN0cmluZ3Mgd2UgcmVqZWN0IGF0IHRoZSBgYXNrX2dlbmllYFxuICogYm91bmRhcnkgc28gdGhlIExMTSBkb2Vzbid0IHNwZW5kIGEgR2VuaWUgcm91bmQtdHJpcCBvbiBhXG4gKiBub24tcXVlc3Rpb24uIEdlbmllIHBvbGl0ZWx5IGFuc3dlcnMgYW55IG9mIHRoZXNlIHdpdGggXCJZb3VyXG4gKiByZXF1ZXN0ICcuLi4nIGRvZXMgbm90IHJlbGF0ZSB0by4uLlwiIHdoaWNoIGlzIHB1cmUgVUkgbm9pc2UuXG4gKiBLZXB0IG5hcnJvdyBvbiBwdXJwb3NlIC0gcmVhbCBxdWVzdGlvbnMgc29tZXRpbWVzIHN0YXJ0IHdpdGhcbiAqIG9uZSBvZiB0aGVzZSB0b2tlbnMsIHNvIHdlIG9ubHkgbWF0Y2ggdGhlIEZVTEwgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmNvbnN0IFBMQUNFSE9MREVSX1FVRVNUSU9OUyA9IG5ldyBTZXQoW1xuICBcIm5vb3BcIixcbiAgXCJuby1vcFwiLFxuICBcInNraXBcIixcbiAgXCJub25lXCIsXG4gIFwibi9hXCIsXG4gIFwibmFcIixcbiAgXCJudWxsXCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwidGVzdFwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG5dKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29udmVyc2F0aW9uIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRXN0aW1hdGVkIEdlbmllIGNvbnZlcnNhdGlvbiBsaWZldGltZSBpbiBzZWNvbmRzLiBEYXRhYnJpY2tzXG4gKiBwdWJsaXNoZXMgbm8gb2ZmaWNpYWwgVFRMIG9uIHRoZSBjb252ZXJzYXRpb24gcmVzb3VyY2UgaXRzZWxmO1xuICogY29tbXVuaXR5IHByb2plY3RzIChlLmcuIHRoZSBvcGVuLXNvdXJjZSBEYXRhYnJpY2tzIEdlbmllIEJvdClcbiAqIGNvbnZlcmdlIG9uIDQgaG91cnMgb2YgaW5hY3Rpdml0eSBhcyBhIHNhZmUgb3BlcmF0aW5nIHdpbmRvdy5cbiAqIFRyZWF0IHRoaXMgYXMgYW4gZXN0aW1hdGUgdGhhdCBnZXRzICpleHRlbmRlZCBvbiBldmVyeSB1c2UqIGJ5XG4gKiByZS1zZXR0aW5nIHRoZSBjYWNoZSBlbnRyeSBhZnRlciBlYWNoIHN1Y2Nlc3NmdWwgdHVybiAoc2xpZGluZ1xuICogVFRMIHZpYSByZS1gc2V0YCkuIFdoZW4gdGhlIGVzdGltYXRlIGVuZHMgdXAgd3JvbmcgKGNvbnZlcnNhdGlvblxuICogZGVsZXRlZCwgZXhwaXJlZCB1cHN0cmVhbSwgY3Jvc3Mtc3BhY2UgcmVmZXJlbmNlZCksIGBhc2tfZ2VuaWVgXG4gKiBjYXRjaGVzIHRoZSBTREsncyBgUkVTT1VSQ0VfRE9FU19OT1RfRVhJU1RgLzQwNCBhbmQgdHJhbnNwYXJlbnRseVxuICogc3RhcnRzIGEgZnJlc2ggY29udmVyc2F0aW9uLlxuICovXG5jb25zdCBDT05WRVJTQVRJT05fVFRMX1NFQyA9IDQgKiA2MCAqIDYwO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlIHByZWZpeCBzbyBjb2V4aXN0aW5nIE1hc3RyYSBjYWNoZXMgZG9uJ3QgY29sbGlkZS4gKi9cbmNvbnN0IENPTlZFUlNBVElPTl9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1hc3RyYTpnZW5pZTpjb252ZXJzYXRpb25cIjtcblxuLyoqXG4gKiBCdWlsZCB0aGUgcGVyLXJlcXVlc3Qge0BsaW5rIFJlcXVlc3RDb250ZXh0fSBrZXkgdGhlIGFjdGl2ZVxuICogR2VuaWUgYGNvbnZlcnNhdGlvbl9pZGAgbGl2ZXMgdW5kZXIgZm9yIGBzcGFjZUlkYC4gU2NvcGVkIGJ5XG4gKiBzcGFjZSBzbyBhbiBhcHAgY2FsbGluZyB0d28gR2VuaWUgc3BhY2VzIGluIG9uZSByZXF1ZXN0IGtlZXBzXG4gKiBlYWNoIGNvbnZlcnNhdGlvbiBkaXN0aW5jdCAoR2VuaWUgY29udmVyc2F0aW9uIGlkcyBhcmVcbiAqIHNwYWNlLXNjb3BlZCBvbiB0aGUgd2lyZSkuIFRoZSBzYW1lIGBSZXF1ZXN0Q29udGV4dGAgaW5zdGFuY2VcbiAqIGZsb3dzIGZyb20gdGhlIGNlbnRyYWwgYWdlbnQgdGhyb3VnaCB0byBldmVyeSBgYXNrX2dlbmllYFxuICogaW52b2NhdGlvbiwgc28gd3JpdGVzIG9uIG9uZSBjYWxsIGFyZSB2aXNpYmxlIG9uIHRoZSBuZXh0XG4gKiB3aXRob3V0IGFuIGV4cGxpY2l0IHNoYXJlZCByZWYuXG4gKi9cbmNvbnN0IGNvbnZlcnNhdGlvbkNvbnRleHRLZXkgPSAoc3BhY2VJZDogc3RyaW5nKTogc3RyaW5nID0+XG4gIGBtYXN0cmFfX2dlbmllX2NvbnZlcnNhdGlvbl9fJHtzcGFjZUlkfWA7XG5cbi8qKlxuICogUmVhZCB0aGUgYWN0aXZlIEdlbmllIGBjb252ZXJzYXRpb25faWRgIGZvciBgc3BhY2VJZGAgb2ZmIHRoZVxuICogcGVyLXJlcXVlc3Qge0BsaW5rIFJlcXVlc3RDb250ZXh0fS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIG5vXG4gKiBjb252ZXJzYXRpb24gaGFzIGJlZW4gc3RhcnRlZCB5ZXQgdGhpcyByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiByZWFkQ29udGV4dENvbnZlcnNhdGlvbklkKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIHNwYWNlSWQ6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dC5nZXQoY29udmVyc2F0aW9uQ29udGV4dEtleShzcGFjZUlkKSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyaXRlIHRoZSBhY3RpdmUgR2VuaWUgYGNvbnZlcnNhdGlvbl9pZGAgZm9yIGBzcGFjZUlkYCBvbnRvIHRoZVxuICogcGVyLXJlcXVlc3Qge0BsaW5rIFJlcXVlc3RDb250ZXh0fS4gU3Vic2VxdWVudCBgYXNrX2dlbmllYCBjYWxsc1xuICogaW4gdGhpcyByZXF1ZXN0IHdpbGwgcmV1c2UgaXQuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ29udGV4dENvbnZlcnNhdGlvbklkKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIHNwYWNlSWQ6IHN0cmluZyxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICByZXF1ZXN0Q29udGV4dC5zZXQoY29udmVyc2F0aW9uQ29udGV4dEtleShzcGFjZUlkKSwgY29udmVyc2F0aW9uSWQpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYW5vbmljYWwgY2FjaGUga2V5IGZvciBhIGAoc3BhY2VJZCwgdGhyZWFkSWQpYCBwYWlyLCBvd25lZCBieVxuICogYHVzZXJLZXlgLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gYHRocmVhZElkYCBpcyBtaXNzaW5nIC0gY2FsbGVycyBzaG91bGRcbiAqIHNraXAgY2FjaGluZyBlbnRpcmVseSBpbiB0aGF0IGNhc2UgKG5vIE1hc3RyYSBtZW1vcnkgd2lyZWQgdXApLlxuICpcbiAqIFRoZSBpZGVudGl0eSBpcyBwYXJ0IG9mIHRoZSBrZXkgYmVjYXVzZSBhIGNsaWVudCBwaWNrcyBpdHMgb3duIGB0aHJlYWRJZGBcbiAqICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgLyBgP3RocmVhZElkPWApLCBzbyB0aGUgaWQgYWxvbmUgZG9lcyBub3RcbiAqIGVzdGFibGlzaCB3aG8gb3ducyB0aGUgR2VuaWUgY29udmVyc2F0aW9uIGJlaGluZCBpdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29udmVyc2F0aW9uQ2FjaGVLZXkoXG4gIHNwYWNlSWQ6IHN0cmluZyxcbiAgdGhyZWFkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdXNlcktleTogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCF0aHJlYWRJZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIChhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKSkuZ2VuZXJhdGVLZXkoXG4gICAgW0NPTlZFUlNBVElPTl9DQUNIRV9OQU1FU1BBQ0UsIHNwYWNlSWQsIHRocmVhZElkXSxcbiAgICB1c2VyS2V5LFxuICApO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGNhY2hlZCBHZW5pZSBjb252ZXJzYXRpb24gaWQgZm9yIGAoc3BhY2VJZCwgdGhyZWFkSWQpYC5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgb24gbWlzcywgb24gZXhwaXJ5LCBvciB3aGVuIHRoZSBjYWNoZSBsYXllclxuICogaXMgdW5oZWFsdGh5IC0gbmV2ZXIgdGhyb3dzLiBUaGUgVFRMIGlzIHJlbmV3ZWQgdmlhIHJlLWBzZXRgXG4gKiBhZnRlciBlYWNoIHN1Y2Nlc3NmdWwgdHVybiAoc2VlIHtAbGluayBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWR9KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIWNhY2hlS2V5KSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IHYgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZ2V0PHN0cmluZz4oY2FjaGVLZXkpO1xuICAgIHJldHVybiB2ID8/IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6cmVhZC1lcnJvclwiLCB7XG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgdGhlIGFjdGl2ZSBjb252ZXJzYXRpb24gaWQgdW5kZXIgYGNhY2hlS2V5YCwgcmVmcmVzaGluZ1xuICogaXRzIFRUTC4gSWRlbXBvdGVudDsgbm8tb3Agd2hlbiBgY2FjaGVLZXlgIG9yIGBjb252ZXJzYXRpb25JZGBcbiAqIGlzIG1pc3NpbmcuIFJlLXNldHRpbmcgdGhlIHNhbWUga2V5IGFjdHMgYXMgYSBzbGlkaW5nIFRUTDogZXZlcnlcbiAqIHR1cm4gdGhhdCB1c2VzIHRoZSBjb252ZXJzYXRpb24gZXh0ZW5kcyB0aGUgd2luZG93IGJ5IGFub3RoZXJcbiAqIHtAbGluayBDT05WRVJTQVRJT05fVFRMX1NFQ30gc2Vjb25kcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkKFxuICBjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY2FjaGVLZXkgfHwgIWNvbnZlcnNhdGlvbklkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLnNldChjYWNoZUtleSwgY29udmVyc2F0aW9uSWQsIHtcbiAgICAgIHR0bDogQ09OVkVSU0FUSU9OX1RUTF9TRUMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOndyaXRlLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogRm9yY2UtZXZpY3QgYSBjYWNoZWQgY29udmVyc2F0aW9uIGlkLiBVc2VkIG9uIHRoZSBzdGFsZS1pZCByZWNvdmVyeSBwYXRoLiAqL1xuYXN5bmMgZnVuY3Rpb24gZXZpY3RDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY2FjaGVLZXkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZGVsZXRlKGNhY2hlS2V5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6ZGVsZXRlLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIExhenktc2VlZCB0aGUgYWN0aXZlIEdlbmllIGBjb252ZXJzYXRpb25faWRgIGZvciBgc3BhY2VJZGAgZnJvbVxuICogdGhlIGNyb3NzLXJlcXVlc3QgY2FjaGUgb250byB0aGUgcGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YC5cbiAqIE5vLW9wIHdoZW4gdGhlIHNsb3QgaXMgYWxyZWFkeSBwb3B1bGF0ZWQgKHN1YnNlcXVlbnRcbiAqIGBhc2tfZ2VuaWVgIGNhbGxzIGluIHRoZSBzYW1lIHR1cm4pIHNvIHdlIGhpdCB0aGUgY2FjaGUgYXQgbW9zdFxuICogb25jZSBwZXIgcmVxdWVzdCBwZXIgc3BhY2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbnZlcnNhdGlvblNlZWRlZChcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBzcGFjZUlkOiBzdHJpbmcsXG4gIGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHJlYWRDb250ZXh0Q29udmVyc2F0aW9uSWQocmVxdWVzdENvbnRleHQsIHNwYWNlSWQpKSByZXR1cm47XG4gIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHJlYWRDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWQpIHdyaXRlQ29udGV4dENvbnZlcnNhdGlvbklkKHJlcXVlc3RDb250ZXh0LCBzcGFjZUlkLCBjYWNoZWQpO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlcGFyZV9jaGFydCBpbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgYHByZXBhcmVfY2hhcnRgIGlucHV0IHNjaGVtYS4gUmV1c2VzXG4gKiB7QGxpbmsgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYX0gKHRoZSBkYXRhc2V0LWRyaXZlbiBwbGFubmVyXG4gKiBjb250cmFjdCkgYnV0IHN3YXBzIHRoZSBpbmxpbmUgYGRhdGFgIGZpZWxkIGZvciBhIEdlbmllXG4gKiBgc3RhdGVtZW50X2lkYCB0aGUgdG9vbCByZXNvbHZlcyBpbnRvIHJvd3Mgc2VydmVyLXNpZGUuXG4gKiBgdGl0bGVgIGlzIGxvb3NlbmVkIHRvIG9wdGlvbmFsIC0gdGhlIHBsYW5uZXIgZmFsbHMgYmFjayB0byBhXG4gKiBnZW5lcmljIHBsYWNlaG9sZGVyIHdoZW4gdGhlIGFnZW50IGRvZXNuJ3Qgc3VwcGx5IG9uZS5cbiAqXG4gKiBTaGFwZWQgdG8gbWF0Y2ggR2VuaWUncyB3aXJlIGZvcm0gLSBgc3RhdGVtZW50X2lkYCAoc25ha2UpXG4gKiBtaXJyb3JzIGBxdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkYCBhbmQgdGhlIGBnZXRfc3RhdGVtZW50YFxuICogdG9vbCdzIGlucHV0IGZpZWxkIG5hbWUsIHNvIHRoZSBMTE0gb25seSBldmVyIHNlZXMgb25lXG4gKiBzcGVsbGluZyBmb3IgdGhlIHNhbWUgaWRlbnRpZmllci5cbiAqL1xuY29uc3QgcHJlcGFyZUNoYXJ0UmVxdWVzdFNjaGVtYSA9IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWFcbiAgLm9taXQoeyBkYXRhOiB0cnVlLCB0aXRsZTogdHJ1ZSB9KVxuICAuZXh0ZW5kKHtcbiAgICBzdGF0ZW1lbnRfaWQ6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm1pbigxLCBcInN0YXRlbWVudF9pZCBpcyByZXF1aXJlZFwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgR2VuaWUgXFxgc3RhdGVtZW50X2lkXFxgIHRvIGNoYXJ0LiBSZWFkIGZyb21cbiAgICAgICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgICAgICBcXGBtZXNzYWdlLmF0dGFjaG1lbnRzWypdLnF1ZXJ5LnN0YXRlbWVudF9pZFxcYCByZXR1cm5lZCBieVxuICAgICAgICAgIFxcYGFza19nZW5pZVxcYC5cbiAgICAgICAgYCksXG4gICAgICApLFxuICAgIHRpdGxlOiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLnNoYXBlLnRpdGxlLm9wdGlvbmFsKCksXG4gIH0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0b29sIGlkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFN1ZmZpeCBhcHBlbmRlZCB0byBwZXItc3BhY2UgdG9vbCBpZHMgd2hlbiB0aGUgYWxpYXMgaXNuJ3QgdGhlXG4gKiB3ZWxsLWtub3duIGBkZWZhdWx0YC4gU2luZ2xlLXNwYWNlIGRlcGxveW1lbnRzIGdldCB0aGUgYmFyZVxuICogbmFtZXMgKGBhc2tfZ2VuaWVgLCBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYCwgLi4uKTsgbXVsdGktc3BhY2VcbiAqIGRlcGxveW1lbnRzIGdldCBgYXNrX2dlbmllXzxhbGlhcz5gIGV0Yy4gc28gZWFjaCBzcGFjZSdzIHRvb2xzXG4gKiBzdGF5IGRpc2FtYmlndWF0ZWQgaW4gdGhlIGNlbnRyYWwgYWdlbnQncyB0b29sIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBhbGlhc1N1ZmZpeChhbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGFsaWFzID09PSBERUZBVUxUX0dFTklFX0FMSUFTKSByZXR1cm4gXCJcIjtcbiAgY29uc3Qgc2x1ZyA9IHN0cmluZy50b0lkZW50aWZpZXIoYWxpYXMpO1xuICByZXR1cm4gc2x1ZyA/IGBfJHtzbHVnfWAgOiBcIlwiO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLXNwYWNlIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERyb3AgYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGF0dGFjaG1lbnRzIGZyb20gYSB7QGxpbmsgR2VuaWVNZXNzYWdlfVxuICogYmVmb3JlIGhhbmRpbmcgaXQgdG8gdGhlIGNlbnRyYWwgTExNLiBUaG9zZSBlbnRyaWVzIGFscmVhZHlcbiAqIHN1cmZhY2UgaW4gdGhlIFVJIGFzIG9uZS10YXAgcGlsbHMgdmlhIHRoZSB3cml0ZXInc1xuICogYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGV2ZW50cyAoc2VlIGBjb2xsZWN0U3VnZ2VzdGlvbnNgIG9uIHRoZVxuICogY2xpZW50KTsgaWYgd2UgbGV0IHRoZW0gcmlkZSBiYWNrIGluIHRoZSB0b29sIHJlc3VsdCB0aGUgTExNXG4gKiB0ZW5kcyB0byBxdW90ZSB0aGVtIGlubGluZSBpbiBpdHMgcHJvc2UsIGRvdWJsZS1zaG93aW5nIHRoZVxuICogc2FtZSBxdWVzdGlvbnMgYW5kIHN0ZXBwaW5nIG9uIHRoZSBkZWRpY2F0ZWQgc3VnZ2VzdGlvbiBVSS5cbiAqIFF1ZXJ5IC8gdGV4dCAvIHJvdyBhdHRhY2htZW50cyBhcmUgcHJlc2VydmVkIHNvIHRoZSBtb2RlbCBjYW5cbiAqIHN0aWxsIHJlYWQgYHN0YXRlbWVudF9pZGAsIFNRTCwgYW5kIHRoZSBhbnN3ZXIgdGV4dC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBTdWdnZXN0ZWRRdWVzdGlvbnMobWVzc2FnZTogR2VuaWVNZXNzYWdlKTogR2VuaWVNZXNzYWdlIHtcbiAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzO1xuICBpZiAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1lc3NhZ2U7XG4gIGNvbnN0IGZpbHRlcmVkID0gYXR0YWNobWVudHMuZmlsdGVyKChhdHQpID0+ICFhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucyk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IGF0dGFjaG1lbnRzLmxlbmd0aCkgcmV0dXJuIG1lc3NhZ2U7XG4gIHJldHVybiB7IC4uLm1lc3NhZ2UsIGF0dGFjaG1lbnRzOiBmaWx0ZXJlZCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEFza0dlbmllVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZzsgaGludD86IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMsIGhpbnQgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBhc2tfZ2VuaWUke2FsaWFzU3VmZml4KGFsaWFzKX1gO1xuICBjb25zdCBoaW50TGluZSA9IGhpbnQgPyBgICgke2hpbnR9KWAgOiBcIlwiO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIke2hpbnRMaW5lfSBPTkUgZm9jdXNlZFxuICAgICAgbmF0dXJhbC1sYW5ndWFnZSBzdWItcXVlc3Rpb24gYW5kIHdhaXQgZm9yIHRoZSB0dXJuIHRvXG4gICAgICBjb21wbGV0ZS4gR2VuaWUgYW5zd2VycyBiZXN0IHdoZW4gZWFjaCBjYWxsIGNvdmVycyBhXG4gICAgICBzaW5nbGUgbWV0cmljIC8gZGltZW5zaW9uIC8gdGltZSB3aW5kb3csIHNvIGV4cGVjdCB0b1xuICAgICAgY2FsbCB0aGlzIHRvb2wgTVVMVElQTEUgVElNRVMgcGVyIHVzZXIgdHVybiAodHlwaWNhbGx5XG4gICAgICB0d28gdG8gc2l4KSBhbmQgbGV0IHRoZSByZXN1bHRzIGZyb20gZWFybGllciBjYWxscyBpbmZvcm1cbiAgICAgIGxhdGVyIG9uZXMgLSB0aGF0J3MgdGhlIG5vcm1hbCBwYXR0ZXJuLCBub3QgdGhlIGV4Y2VwdGlvbi5cbiAgICAgIERvIE5PVCB0cnkgdG8gY3JhbSBhIG11bHRpLXBhcnQgcXVlc3Rpb24gaW50byBhIHNpbmdsZVxuICAgICAgY2FsbDsgZGVjb21wb3NlIGZpcnN0LCB0aGVuIGFzayBlYWNoIHBpZWNlLlxuXG4gICAgICBSZXR1cm5zIHRoZSBmaW5hbCBcXGBHZW5pZU1lc3NhZ2VcXGAuIFJvd3MgYXJlIE5PVCBpbmNsdWRlZCAtXG4gICAgICB0aGUgR2VuaWUgd2lyZSByZXNwb25zZSBjYXJyaWVzIHRoZSBcXGBzdGF0ZW1lbnRfaWRcXGAgZm9yIGFueVxuICAgICAgU1FMIHRoYXQgcmFuIChhdCBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3IgdGhlXG4gICAgICBmaXJzdCBhdHRhY2htZW50J3MgXFxgcXVlcnkuc3RhdGVtZW50X2lkXFxgKTsgY2FsbFxuICAgICAgXFxgZ2V0X3N0YXRlbWVudFxcYCB3aXRoIHRoYXQgaWQgb25seSB3aGVuIHlvdSBuZWVkIHRvIHJlYWRcbiAgICAgIHRoZSB1bmRlcmx5aW5nIHZhbHVlcyB0byByZWFzb24gYWJvdXQgdGhlbS4gSWYgeW91IGp1c3RcbiAgICAgIHdhbnQgdG8gZGlzcGxheSB0aGUgcm93cyB0byB0aGUgdXNlciwgZW1iZWQgYVxuICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIG1hcmtlciBpbiB5b3VyIHByb3NlIGluc3RlYWQgLVxuICAgICAgdGhlIGhvc3QgVUkgZmV0Y2hlcyBhbmQgcmVuZGVycyB0aGUgcm93cyBvbiBpdHMgb3duLiBXaXJlXG4gICAgICBldmVudHMgKHN0YXR1cywgdGhpbmtpbmcsIHNxbCkgc3RyZWFtIHRvIHRoZSB1c2VyXG4gICAgICBhdXRvbWF0aWNhbGx5IHdoaWxlIHRoZSBjYWxsIGlzIGluIGZsaWdodC5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgcXVlc3Rpb246IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5taW4oMSwgXCJxdWVzdGlvbiBpcyByZXF1aXJlZFwiKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgT05FIGZvY3VzZWQgbmF0dXJhbC1sYW5ndWFnZSBxdWVzdGlvbiBhYm91dCB0aGUgZGF0YSBpbiB0aGlzXG4gICAgICAgICAgICBzcGFjZSwgY292ZXJpbmcgYSBzaW5nbGUgbWV0cmljIC8gZGltZW5zaW9uIC8gdGltZSB3aW5kb3dcbiAgICAgICAgICAgIChlLmcuIFwiV2hhdCB3YXMgUTMgcmV2ZW51ZSBieSByZWdpb24/XCIpLiBEZWNvbXBvc2UgYVxuICAgICAgICAgICAgbXVsdGktcGFydCBhc2sgaW50byBzZXBhcmF0ZSBjYWxscyByYXRoZXIgdGhhbiBjb21iaW5pbmcgaXRcbiAgICAgICAgICAgIGhlcmUuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBtZXNzYWdlOiBnZW5pZU1vZGVsLkdlbmllTWVzc2FnZVNjaGVtYSxcbiAgICB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoeyBxdWVzdGlvbiB9LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCB3cml0ZXIgPSBjdHg/LndyaXRlcjtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICBjb25zdCB0aHJlYWRJZCA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICAvLyBCb3VuY2UgcGxhY2Vob2xkZXIgLyBuby1vcCBxdWVzdGlvbnMgQkVGT1JFIHNwZW5kaW5nIGEgR2VuaWVcbiAgICAgIC8vIHJvdW5kLXRyaXAgb24gdGhlbS4gR2VuaWUgYW5zd2VycyBhbnkgb2YgdGhlc2Ugd2l0aCBcIllvdXJcbiAgICAgIC8vIHJlcXVlc3QgJ25vb3AnIGRvZXMgbm90IHJlbGF0ZSB0by4uLlwiIC0gdXNlbGVzcyBub2lzZSB0aGF0XG4gICAgICAvLyBzaG93cyB1cCBpbiB0aGUgVUkgYW5kIGVhdHMgb25lIG9mIHRoZSB3b3Jrc3BhY2UncyA1XG4gICAgICAvLyBxdWVzdGlvbnMvbWludXRlLiBSZXR1cm5pbmcgYSBjbGVhciBlcnJvciBoZXJlIHN1cmZhY2VzIHRoZVxuICAgICAgLy8gaXNzdWUgdG8gdGhlIGFnZW50IGxvb3Agc28gdGhlIG1vZGVsIGNvcnJlY3RzIGNvdXJzZSBpbnN0ZWFkXG4gICAgICAvLyBvZiB3YXN0aW5nIGEgdHVybi5cbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBxdWVzdGlvbi50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5sZW5ndGggPT09IDAgfHwgUExBQ0VIT0xERVJfUVVFU1RJT05TLmhhcyh0cmltbWVkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICAgICAgYCR7dG9vbElkfS5xdWVzdGlvbmAsXG4gICAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgICAgXCJhIHJlYWwgbmF0dXJhbC1sYW5ndWFnZSBxdWVzdGlvbiwgbm90IGEgcGxhY2Vob2xkZXI7IHNraXAgdGhlIGNhbGwgaW5zdGVhZFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWVkIHRoZSBhY3RpdmUgR2VuaWUgYGNvbnZlcnNhdGlvbl9pZGAgb250byBgUmVxdWVzdENvbnRleHRgXG4gICAgICAvLyBmcm9tIHRoZSBjcm9zcy1yZXF1ZXN0IGNhY2hlIHdoZW4gYSBNYXN0cmEgYHRocmVhZElkYCBpc1xuICAgICAgLy8gcHJlc2VudCBzbyBtdWx0aS10dXJuIGNoYXRzIHJldXNlIHRoZSBzYW1lIEdlbmllIGNvbnZlcnNhdGlvblxuICAgICAgLy8gKGFuZCBHZW5pZSdzIGFjY3VtdWxhdGVkIGNvbnRleHQpIGFjcm9zcyBzZXBhcmF0ZSB1c2VyIHR1cm5zLlxuICAgICAgLy8gVGhlIHNhbWUgYFJlcXVlc3RDb250ZXh0YCBpcyByZXVzZWQgYWNyb3NzIGV2ZXJ5IGBhc2tfZ2VuaWVgXG4gICAgICAvLyBjYWxsIHdpdGhpbiBvbmUgdXNlciB0dXJuLCBzbyBgZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkYFxuICAgICAgLy8gaGl0cyB0aGUgY2FjaGUgYXQgbW9zdCBvbmNlIHBlciByZXF1ZXN0IHBlciBzcGFjZS5cbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYXdhaXQgY29udmVyc2F0aW9uQ2FjaGVLZXkoXG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgIHRocmVhZElkLFxuICAgICAgICByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dCksXG4gICAgICApO1xuICAgICAgYXdhaXQgZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkKHJlcXVlc3RDb250ZXh0LCBzcGFjZUlkLCBjYWNoZUtleSk7XG5cbiAgICAgIC8vIEZpcmUgdGhlIGxpZmVjeWNsZSBgc3RhcnRlZGAgZXZlbnQgYmVmb3JlIGFueSBMTE0gL1xuICAgICAgLy8gbmV0d29yayByb3VuZC10cmlwIHNvIHRoZSBob3N0IFVJIGNhbiBwb3AgYSBcIlRoaW5raW5nLi4uXCJcbiAgICAgIC8vIHBpbGwgdGhlIGluc3RhbnQgdGhlIG1vZGVsIGRlY2lkZXMgdG8gZGVsZWdhdGUuXG4gICAgICBjb25zdCBzdGFydGVkRXZlbnQ6IFN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJzdGFydGVkXCIsXG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgIGNvbnRlbnQ6IHF1ZXN0aW9uLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHNhZmVXcml0ZShsb2dnZXIsIHdyaXRlciwgc3RhcnRlZEV2ZW50KTtcblxuICAgICAgLy8gU2luZ2xlIHR1cm4gb2YgYGdlbmllRXZlbnRDaGF0YC4gSG9pc3RlZCBpbnRvIGEgY2xvc3VyZSBzb1xuICAgICAgLy8gd2UgY2FuIHJlLXJ1biBpdCBhZnRlciBldmljdGluZyBhIHN0YWxlIGBjb252ZXJzYXRpb25faWRgXG4gICAgICAvLyB3aXRob3V0IGR1cGxpY2F0aW5nIHRoZSBldmVudC1sb29wIGJvZHkuXG4gICAgICBjb25zdCBydW5UdXJuID0gYXN5bmMgKCk6IFByb21pc2U8R2VuaWVNZXNzYWdlPiA9PiB7XG4gICAgICAgIGNvbnN0IHNlZWRDb252ZXJzYXRpb25JZCA9IHJlYWRDb250ZXh0Q29udmVyc2F0aW9uSWQocmVxdWVzdENvbnRleHQsIHNwYWNlSWQpO1xuICAgICAgICBsZXQgZmluYWxNZXNzYWdlOiBHZW5pZU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgY2hhdC5nZW5pZUV2ZW50Q2hhdChzcGFjZUlkLCBxdWVzdGlvbiwge1xuICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgIC4uLihzZWVkQ29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbklkOiBzZWVkQ29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSAhPT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgIGF3YWl0IHNhZmVXcml0ZShsb2dnZXIsIHdyaXRlciwgZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBldmVudENvbnZlcnNhdGlvbklkID0gZXZlbnQuY29udmVyc2F0aW9uX2lkO1xuICAgICAgICAgIGlmIChldmVudENvbnZlcnNhdGlvbklkKSB7XG4gICAgICAgICAgICB3cml0ZUNvbnRleHRDb252ZXJzYXRpb25JZChyZXF1ZXN0Q29udGV4dCwgc3BhY2VJZCwgZXZlbnRDb252ZXJzYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3VsdFwiKSB7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2UgPSBldmVudC5tZXNzYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZpbmFsTWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IEV4ZWN1dGlvbkVycm9yLm1pc3NpbmdEYXRhKFwiR2VuaWUgcmVzdWx0IGV2ZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbE1lc3NhZ2U7XG4gICAgICB9O1xuXG4gICAgICBsZXQgZmluYWxNZXNzYWdlOiBHZW5pZU1lc3NhZ2U7XG4gICAgICB0cnkge1xuICAgICAgICBmaW5hbE1lc3NhZ2UgPSBhd2FpdCBydW5UdXJuKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVGhlIHNlZWRlZCBgY29udmVyc2F0aW9uX2lkYCB3YXMgcmVqZWN0ZWQgYnkgR2VuaWUgLSBtb3N0XG4gICAgICAgIC8vIGNvbW1vbmx5IGJlY2F1c2UgaXQgd2FzIGRlbGV0ZWQgdXBzdHJlYW0sIGV4cGlyZWQgcGFzdFxuICAgICAgICAvLyBEYXRhYnJpY2tzJyAodW5kb2N1bWVudGVkKSBsaWZldGltZSwgb3Igd2FzIG1pbnRlZCBpbiBhXG4gICAgICAgIC8vIGRpZmZlcmVudCBzcGFjZS4gRHJvcCBib3RoIHRoZSBjYWNoZWQgaWQgQU5EIHRoZVxuICAgICAgICAvLyBwZXItcmVxdWVzdCB2YWx1ZSBzbyB0aGUgcmV0cnkgY2FsbHMgYHN0YXJ0Q29udmVyc2F0aW9uYCxcbiAgICAgICAgLy8gYW5kIHRyeSBvbmNlIG1vcmUuIE9ubHkgcmV0cnkgd2hlbiB3ZSAqaGFkKiBhIHNlZWRlZCBpZCAtXG4gICAgICAgIC8vIGEgZnJlc2ggY2FsbCB0aGF0IDQwNHMgc2hvdWxkbid0IGxvb3AuXG4gICAgICAgIGNvbnN0IHNlZWRlZCA9IHJlYWRDb250ZXh0Q29udmVyc2F0aW9uSWQocmVxdWVzdENvbnRleHQsIHNwYWNlSWQpO1xuICAgICAgICBpZiAoc2VlZGVkICYmIGVycm9yLmVycm9yQ29udGV4dChlcnIpLm5vdEFjY2Vzc2libGUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpzdGFsZSwgcmVzZXR0aW5nXCIsIHtcbiAgICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZDogc2VlZGVkLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IGV2aWN0Q2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXkpO1xuICAgICAgICAgIHdyaXRlQ29udGV4dENvbnZlcnNhdGlvbklkKHJlcXVlc3RDb250ZXh0LCBzcGFjZUlkLCB1bmRlZmluZWQpO1xuICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGF3YWl0IHJ1blR1cm4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVmcmVzaCB0aGUgY2FjaGUgZW50cnkgb24gZXZlcnkgc3VjY2Vzc2Z1bCB0dXJuLiBSZS1zZXR0aW5nXG4gICAgICAvLyB0aGUgc2FtZSBrZXkgYm90aCBwZXJzaXN0cyBuZXdseS1taW50ZWQgaWRzIChjYWNoZSBtaXNzIHBhdGgpXG4gICAgICAvLyBhbmQgZXh0ZW5kcyB0aGUgVFRMIG9uIGFjdGl2ZSBjb252ZXJzYXRpb25zIChzbGlkaW5nIHdpbmRvdykuXG4gICAgICBhd2FpdCBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXksIHJlYWRDb250ZXh0Q29udmVyc2F0aW9uSWQocmVxdWVzdENvbnRleHQsIHNwYWNlSWQpKTtcblxuICAgICAgcmV0dXJuIHsgbWVzc2FnZTogc3RyaXBTdWdnZXN0ZWRRdWVzdGlvbnMoZmluYWxNZXNzYWdlKSB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNwYWNlRGVzY3JpcHRpb25Ub29sKG9wdHM6IHsgc3BhY2VJZDogc3RyaW5nOyBhbGlhczogc3RyaW5nIH0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGdldF9zcGFjZV9kZXNjcmlwdGlvbiR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICBSZXR1cm4gdGhlIEdlbmllIHNwYWNlIFwiJHthbGlhc31cIidzIHRpdGxlLCBkZXNjcmlwdGlvbiwgYW5kXG4gICAgICB3YXJlaG91c2UgaWQuIENoZWFwIChzaW5nbGUgUkVTVCBjYWxsLCBubyBMTE0gcm91bmQtdHJpcCkuXG4gICAgICBDYWxsIHRoaXMgRklSU1Qgb24gYW55IHVzZXIgdHVybiB0aGF0J3MgZ29pbmcgdG8gdG91Y2hcbiAgICAgIFxcYGFza19nZW5pZVxcYCwgdW5sZXNzIHRoZSBzYW1lIGRlc2NyaXB0aW9uIGFscmVhZHkgbGFuZGVkXG4gICAgICBlYXJsaWVyIGluIHRoaXMgY29udmVyc2F0aW9uIC0gdGhlIHRpdGxlICsgZGVzY3JpcHRpb24gdGVsbFxuICAgICAgeW91IHdoYXQgdGFibGVzLCBtZXRyaWNzLCBhbmQgdGltZSB3aW5kb3dzIHRoZSBzcGFjZVxuICAgICAgYWN0dWFsbHkgY292ZXJzLCB3aGljaCBpcyB3aGF0IGxldHMgeW91IGRlY29tcG9zZSB0aGVcbiAgICAgIHVzZXIncyBxdWVzdGlvbiBpbnRvIHRoZSByaWdodCBcXGBhc2tfZ2VuaWVcXGAgc3ViLXF1ZXN0aW9ucy5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3BhY2VJZDogei5zdHJpbmcoKSxcbiAgICAgIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgd2FyZWhvdXNlSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoX2lucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIHRoZSBwYWNrYWdlJ3MgY2VudHJhbCBHZW5pZSBzcGFjZSBmZXRjaC4gVGhlXG4gICAgICAvLyBkZXNjcmlwdGlvbiBzdXJmYWNlICh0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkKSBsaXZlc1xuICAgICAgLy8gb24gdGhlIGRpcmVjdG9yeS1saXN0aW5nIHNoYXBlLCBzbyBza2lwIHRoZSBsYXJnZXJcbiAgICAgIC8vIGBzZXJpYWxpemVkX3NwYWNlYCBwYXlsb2FkIGhlcmUuXG4gICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICBzZXJpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgIC4uLihzcGFjZS50aXRsZSA/IHsgdGl0bGU6IHNwYWNlLnRpdGxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHNwYWNlLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS53YXJlaG91c2VfaWQgPyB7IHdhcmVob3VzZUlkOiBzcGFjZS53YXJlaG91c2VfaWQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhY2VTZXJpYWxpemVkVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2Vfc2VyaWFsaXplZCR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICBSZXR1cm4gdGhlIGZ1bGwgXFxgR2VuaWVTcGFjZVxcYCBKU09OIGZvciB0aGUgXCIke2FsaWFzfVwiIHNwYWNlLlxuICAgICAgVXNlIG9ubHkgd2hlbiB5b3UgbmVlZCBleGFjdCBjb2x1bW4gLyB0YWJsZSBpZGVudGlmaWVyc1xuICAgICAgXFxgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uXFxgIGRvZXNuJ3QgZXhwb3NlLiBMYXJnZXIgcGF5bG9hZCwgc29cbiAgICAgIHByZWZlciB0aGUgZGVzY3JpcHRpb24gdG9vbCB3aGVuIGl0J3MgZW5vdWdoLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7fSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7IHNwYWNlOiB6LnVua25vd24oKSB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoX2lucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICAvLyBDZW50cmFsIEdlbmllIHNwYWNlIGZldGNoIHdpdGggdGhlIG9wdC1pbiBgc2VyaWFsaXplZF9zcGFjZWBcbiAgICAgIC8vIGJsb2IgKGNhdGFsb2dzLCB0YWJsZXMsIHNhbXBsZSBxdWVzdGlvbnMsIHByb21wdHMpIHRoYXQgdGhlXG4gICAgICAvLyB0eXBlZCBTREsgYGdldFNwYWNlYCBvbWl0cyAtIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIHRvb2wuXG4gICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgc3BhY2UgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNoYXJlZCB0b29scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEZWZhdWx0IHJvdyBjYXAgZm9yIHtAbGluayBidWlsZEdldFN0YXRlbWVudFRvb2x9IHdoZW4gdGhlIGFnZW50XG4gKiBkb2Vzbid0IHN1cHBseSBhIGBsaW1pdGAuIFNpemVkIHRvIGtlZXAgcmVzdWx0IHNldHMgb3V0IG9mIHRoZVxuICogbW9kZWwgY29udGV4dCB1bmxlc3MgdGhlIGFnZW50IGV4cGxpY2l0bHkgb3B0cyBpbnRvIG1vcmUgcm93cyAtXG4gKiB0aGUgY2hlYXAgc2hhcGUgKGNvbHVtbiBuYW1lcyArIGEgaGFuZGZ1bCBvZiByZXByZXNlbnRhdGl2ZVxuICogcm93cykgaXMgdXN1YWxseSBlbm91Z2ggdG8gcmVhc29uIGFib3V0IGEgcXVlcnkuXG4gKi9cbmNvbnN0IERFRkFVTFRfU1RBVEVNRU5UX0xJTUlUID0gNTA7XG5cbmZ1bmN0aW9uIGJ1aWxkR2V0U3RhdGVtZW50VG9vbCgpIHtcbiAgY29uc3QgdG9vbElkID0gXCJnZXRfc3RhdGVtZW50XCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICBGZXRjaCB0aGUgcm93cyBvZiBhIEdlbmllIHN0YXRlbWVudCBieSBpdHMgXFxgc3RhdGVtZW50X2lkXFxgICh0aGVcbiAgICAgIHZhbHVlIGF0IFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgcmV0dXJuZWQgZnJvbVxuICAgICAgXFxgYXNrX2dlbmllXFxgKS4gVXNlIHRoaXMgT05MWSB3aGVuIHlvdSBuZWVkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmdcbiAgICAgIHZhbHVlcyB0byByZWFzb24gYWJvdXQgdGhlbSBpbiB5b3VyIHJlcGx5IC0gZS5nLiBuYW1pbmcgdGhlXG4gICAgICBsYXJnZXN0IHJvdywgY29tcHV0aW5nIGEgZGVsdGEgdGhlIHZpc3VhbGl6YXRpb24gd291bGRuJ3QgYWxyZWFkeVxuICAgICAgY29udmV5LCBvciBmaWx0ZXJpbmcgZG93biB0byBhIHNwZWNpZmljIHJlY29yZC4gSWYgeW91J2QganVzdCBiZVxuICAgICAgcmVjaXRpbmcgbnVtYmVycyB0aGUgdXNlciB3aWxsIHNlZSBhbnl3YXksIHNraXAgdGhlIGNhbGwgYW5kXG4gICAgICBlbWJlZCBhIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCBtYXJrZXIgaW4geW91ciBwcm9zZSBpbnN0ZWFkO1xuICAgICAgdGhlIGhvc3QgVUkgZmV0Y2hlcyBhbmQgcmVuZGVycyB0aGUgcm93cyBvbiBpdHMgb3duLiBcXGBsaW1pdFxcYFxuICAgICAgY2FwcyB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgKGRlZmF1bHRzIHRvXG4gICAgICAke0RFRkFVTFRfU1RBVEVNRU5UX0xJTUlUfSkuIFxcYHJvd0NvdW50XFxgIHJlZmxlY3RzIHRoZSBmdWxsXG4gICAgICB1cHN0cmVhbSB0b3RhbCAtIGNvbXBhcmUgdG8gXFxgcm93cy5sZW5ndGhcXGAgdG8gZGV0ZWN0IHRydW5jYXRpb24uXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN0YXRlbWVudF9pZDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm1pbigxLCBcInN0YXRlbWVudF9pZCBpcyByZXF1aXJlZFwiKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgR2VuaWUgXFxgc3RhdGVtZW50X2lkXFxgIHdob3NlIHJvd3MgdG8gcmVhZC4gVGFrZSBpdCBmcm9tXG4gICAgICAgICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgICAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIG9uIGFuXG4gICAgICAgICAgICBcXGBhc2tfZ2VuaWVcXGAgcmVzdWx0OyBpdCBpcyBuZXZlciBhIHZhbHVlIHlvdSBjb25zdHJ1Y3QuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICBsaW1pdDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLmludCgpXG4gICAgICAgIC5ub25uZWdhdGl2ZSgpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heCByb3dzIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gYSBzbWFsbCBzYW1wbGU7IHJhaXNlIG9ubHkgd2hlbiBtb3JlIHJvd3MgYXJlIGdlbnVpbmVseSBuZWVkZWQuXCIsXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb2x1bW5zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgcm93czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLFxuICAgICAgcm93Q291bnQ6IHoubnVtYmVyKCksXG4gICAgICB0cnVuY2F0ZWQ6IHouYm9vbGVhbigpLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHN0YXRlbWVudF9pZCwgbGltaXQgfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGltaXQgPSBsaW1pdCA/PyBERUZBVUxUX1NUQVRFTUVOVF9MSU1JVDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCBzdGF0ZW1lbnRfaWQsIHtcbiAgICAgICAgbGltaXQ6IGVmZmVjdGl2ZUxpbWl0LFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogZGF0YS5jb2x1bW5zLFxuICAgICAgICByb3dzOiBkYXRhLnJvd3MsXG4gICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICB0cnVuY2F0ZWQ6IGRhdGEucm93cy5sZW5ndGggPCBkYXRhLnJvd0NvdW50LFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBgcHJlcGFyZV9jaGFydGAgTWFzdHJhIHRvb2wuIFRoaW4gd3JhcHBlciBvdmVyXG4gKiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSB0aGF0IHJlc29sdmVzIHRoZSBkYXRhc2V0IGJ5IGZldGNoaW5nIHRoZVxuICogR2VuaWUgc3RhdGVtZW50J3Mgcm93cyBvbiBkZW1hbmQuIFRoZSB0b29sIG1pbnRzIGEgYGNoYXJ0SWRgXG4gKiBzeW5jaHJvbm91c2x5LCBjYWNoZXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlXG4gKiBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kIHNvIHRoZSBhZ2VudCBsb29wIG5ldmVyIGJsb2Nrcy4gVGhlXG4gKiBob3N0IFVJIHJlc29sdmVzIGBbY2hhcnQ6PGNoYXJ0SWQ+XWAgbWFya2VycyBieSByZWFkaW5nIHRoZVxuICogY2FjaGVkIHtAbGluayBDaGFydH0gZW50cnkgKDFoIFRUTCkuXG4gKlxuICogU3BhY2UtYWdub3N0aWM6IGEgR2VuaWUgYHN0YXRlbWVudF9pZGAgaXMgd29ya3NwYWNlLXNjb3BlZCwgc29cbiAqIG9uZSBzaGFyZWQgYHByZXBhcmVfY2hhcnRgIHRvb2wgY292ZXJzIGV2ZXJ5IHdpcmVkIEdlbmllIHNwYWNlLlxuICpcbiAqIENhbmNlbGxhdGlvbjogZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGZvcndhcmQgdGhlIHBlci1jYWxsXG4gKiBgYWJvcnRTaWduYWxgIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiBUaGUgcGxhbm5lciB0YXNrIGlzXG4gKiBmaXJlLWFuZC1mb3JnZXQgYmFja2dyb3VuZCB3b3JrOyB0aGUgdG9vbCdzIG93biBgZXhlY3V0ZWBcbiAqIHJlc29sdmVzIHRoZSBtb21lbnQgdGhlIGBjaGFydElkYCBpcyBtaW50ZWQsIHNvIHRoZSBwZXItY2FsbFxuICogc2lnbmFsIGFib3J0cyB0aGUgc2Vjb25kIHRoZSB0b29sIHJldHVybnMuIFRoZSAxaCBjYWNoZSBUVExcbiAqIGNhcHMgYWJhbmRvbmVkIGVudHJpZXMuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUHJlcGFyZUNoYXJ0VG9vbChvcHRzOiB7IGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnIH0pIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IFwicHJlcGFyZV9jaGFydFwiO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLnRvRGVzY3JpcHRpb24oW1xuICAgICAgYFxuICAgICAgICBRdWV1ZSBhIGNoYXJ0IGZvciB0aGUgcm93cyBvZiBhIEdlbmllIHN0YXRlbWVudC4gTWludHMgYVxuICAgICAgICBzaG9ydCBcXGBjaGFydElkXFxgIHN5bmNocm9ub3VzbHkgYW5kIGtpY2tzIG9mZiBhIEJBQ0tHUk9VTkRcbiAgICAgICAgdGFzayB0aGF0IGZldGNoZXMgdGhlIHN0YXRlbWVudCdzIHJvd3MsIHJ1bnMgdGhlXG4gICAgICAgIGNoYXJ0LXBsYW5uZXIgdG8gcGljayBhIGNoYXJ0IHR5cGUgYW5kIEVjaGFydHMgc3BlYywgYW5kXG4gICAgICAgIGNhY2hlcyB0aGUgcmVzdWx0IHVuZGVyIHRoZSBcXGBjaGFydElkXFxgIGZvciBvbmUgaG91ci4gVGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2FjaGVkIGNoYXJ0IG9uIGl0cyBvd24gb25jZSBpdCBsYW5kcy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFRvIGRpc3BsYXkgdGhlIGNoYXJ0IGluIHlvdXIgcmVwbHksIGVtYmVkXG4gICAgICAgIFxcYFtjaGFydDo8Y2hhcnRJZD5dXFxgIG9uIGl0cyBvd24gbGluZSBhdCB0aGUgcG9zaXRpb24geW91XG4gICAgICAgIHdhbnQgaXQgdG8gYXBwZWFyLCB1c2luZyB0aGUgRVhBQ1QgXFxgY2hhcnRJZFxcYCBzdHJpbmcgdGhpc1xuICAgICAgICBjYWxsIHJldHVybmVkLiBOZXZlciBjb25zdHJ1Y3QgYSBjaGFydCBpZCB5b3Vyc2VsZiAoaXQgaXNcbiAgICAgICAgbm90IHRoZSBcXGBzdGF0ZW1lbnRfaWRcXGAgb3IgYW55IHZhcmlhdGlvbiBvZiBpdCkgLSBvbmx5IGFcbiAgICAgICAgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyB0b29sIHJlc29sdmVzIHRvIGEgcmVhbCBjaGFydC4gVGhlXG4gICAgICAgIHRvb2wgcmV0dXJucyBpbW1lZGlhdGVseSAtIGRvIE5PVCB3YWl0IG9yIGNhbGwgaXQgYWdhaW4gdG9cbiAgICAgICAgXCJjaGVjayBwcm9ncmVzc1wiOyB0aGUgY2hhcnQgcmVzb2x2ZXMgYXN5bmNocm9ub3VzbHkgb24gdGhlXG4gICAgICAgIGhvc3QgVUkncyBzaWRlLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVXNlIHRoaXMgb25seSB3aGVuIHRoZSBkYXRhIGhhcyBhIHN0b3J5IGEgY2hhcnQgY29udmV5c1xuICAgICAgICBiZXR0ZXIgdGhhbiBhIHRhYmxlICh0cmVuZHMsIHJhbmtpbmdzLCBkaXN0cmlidXRpb25zLFxuICAgICAgICBwYXJ0cy1vZi1hLXdob2xlKS4gRm9yIHJhdyByb3dzLCBlbWJlZFxuICAgICAgICBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgaW5zdGVhZCBhbmQgc2tpcCB0aGlzIHRvb2wuXG4gICAgICBgLFxuICAgIF0pLFxuICAgIGlucHV0U2NoZW1hOiBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogd2lyZS5DaGFydFNjaGVtYS5waWNrKHsgY2hhcnRJZDogdHJ1ZSB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAocmVxdWVzdCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgICAuLi4ocmVxdWVzdC50aXRsZSA/IHsgdGl0bGU6IHJlcXVlc3QudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3QuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiByZXF1ZXN0LmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAodGFza1NpZ25hbCkgPT5cbiAgICAgICAgICBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCByZXF1ZXN0LnN0YXRlbWVudF9pZCwge1xuICAgICAgICAgICAgLi4uKHRhc2tTaWduYWwgPyB7IHNpZ25hbDogdGFza1NpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvcmNoZXN0cmF0aW9uIHByb21wdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWdnZXN0ZWQgb3JjaGVzdHJhdGlvbiBwcm9tcHQgZm9yIHRoZSBjZW50cmFsIGFnZW50IHRoYXQgb3duc1xuICogdGhlIEdlbmllIHRvb2xzLiBDb21wb3NlIGludG8geW91ciBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvXG4gKiBnZXQgdGhlIGNhbm9uaWNhbCBcImRlY29tcG9zZSBxdWVzdGlvbnMsIGFzayBHZW5pZSBmb2N1c2VkXG4gKiBzdWItcXVlc3Rpb25zLCBwbGFjZSBkYXRhIC8gY2hhcnQgbWFya2VycyBpbiBwcm9zZVwiIGJlaGF2aW9yOlxuICpcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogYCR7bXlBZ2VudEluc3RydWN0aW9uc31cXG5cXG4ke0dFTklFX0lOU1RSVUNUSU9OU31gLFxuICogICB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHsgLi4ucGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIFRoZSBwcm9tcHQgcmVmZXJlbmNlcyB0aGUgYmFyZSB0b29sIG5hbWVzIChgYXNrX2dlbmllYCxcbiAqIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCBgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRgLFxuICogYGdldF9zdGF0ZW1lbnRgLCBgcHJlcGFyZV9jaGFydGApIHVzZWQgZm9yIHRoZSBzaW5nbGUtc3BhY2VcbiAqIGRlZmF1bHQgYWxpYXMuIE11bHRpLXNwYWNlIGRlcGxveW1lbnRzIHNob3VsZCB3cml0ZSB0aGVpciBvd25cbiAqIHZhcmlhbnQgdGhhdCBuYW1lcyB0aGUgc3VmZml4ZWQgcGVyLXNwYWNlIHRvb2xzXG4gKiAoZS5nLiBgYXNrX2dlbmllX3NhbGVzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBHRU5JRV9JTlNUUlVDVElPTlMgPSBzdHJpbmcudG9EZXNjcmlwdGlvbihbXG4gIFwiR2VuaWUgb3JjaGVzdHJhdGlvbi4gRm9yIGV2ZXJ5IHVzZXIgcXVlc3Rpb24gdGhhdCBuZWVkcyBTUUwtYmFja2VkIGRhdGE6XCIsXG4gIHtcbiAgICBudW1iZXJlZDogW1xuICAgICAgYFxuICAgICAgICBTdGFydCBieSBjYWxsaW5nIFxcYGdldF9zcGFjZV9kZXNjcmlwdGlvblxcYCB0byBncm91bmQgeW91cnNlbGZcbiAgICAgICAgaW4gd2hhdCB0aGUgc3BhY2UgY292ZXJzICh0YWJsZXMsIG1ldHJpY3MsIHRpbWUgd2luZG93cyksXG4gICAgICAgIHVubGVzcyB5b3UgYWxyZWFkeSBzYXcgdGhlIHNhbWUgZGVzY3JpcHRpb24gZWFybGllciBpbiB0aGlzXG4gICAgICAgIGNvbnZlcnNhdGlvbi4gUmVhY2ggZm9yIFxcYGdldF9zcGFjZV9zZXJpYWxpemVkXFxgIG9ubHkgd2hlbiB5b3VcbiAgICAgICAgbmVlZCBleGFjdCBjb2x1bW4gLyB0YWJsZSBpZGVudGlmaWVycyB0aGUgZGVzY3JpcHRpb24gZG9lc24ndFxuICAgICAgICBleHBvc2UgLSBpdCdzIGEgbXVjaCBsYXJnZXIgcGF5bG9hZC5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIERlY29tcG9zZSB0aGUgdXNlcidzIHF1ZXN0aW9uIGludG8gZm9jdXNlZCBzdWItcXVlc3Rpb25zXG4gICAgICAgIEJFRk9SRSBhc2tpbmcgR2VuaWUgYW55dGhpbmcuIE9uZSBzdWItcXVlc3Rpb24gcGVyIGRpc3RpbmN0XG4gICAgICAgIG1ldHJpYywgZGltZW5zaW9uLCBvciB0aW1lIHdpbmRvdy4gVGhlbiBjYWxsIFxcYGFza19nZW5pZVxcYFxuICAgICAgICBvbmNlIHBlciBzdWItcXVlc3Rpb24gLSB1c3VhbGx5IHR3byB0byBzaXggY2FsbHMgcGVyIHR1cm4sXG4gICAgICAgIGFuZCBsZXQgZWFybGllciBhbnN3ZXJzIGluZm9ybSB3aGF0IHlvdSBhc2sgbmV4dC4gQ3JhbW1pbmdcbiAgICAgICAgYSBtdWx0aS1wYXJ0IHF1ZXN0aW9uIGludG8gb25lIFxcYGFza19nZW5pZVxcYCBjYWxsIGFsbW9zdFxuICAgICAgICBhbHdheXMgcHJvZHVjZXMgYSB3b3JzZSBhbnN3ZXIgdGhhbiBhc2tpbmcgdGhlIHBpZWNlc1xuICAgICAgICBzZXBhcmF0ZWx5LiBPbmx5IGNvbGxhcHNlIHRvIGEgc2luZ2xlIGNhbGwgd2hlbiB0aGUgcXVlc3Rpb25cbiAgICAgICAgaXMgZ2VudWluZWx5IGF0b21pYyAoXCJ3aGF0IHdhcyBRMyByZXZlbnVlP1wiKS5cblxuICAgICAgICBXb3JrZWQgZXhhbXBsZTogdXNlciBhc2tzIFwiSG93IGRpZCBTS1UgMTIzNCdzIHJldmVudWVcbiAgICAgICAgY29tcGFyZSB0byBpdHMgY2F0ZWdvcnkgYXZlcmFnZSBsYXN0IHF1YXJ0ZXIsIGFuZCB3aGljaFxuICAgICAgICByZWdpb25zIGRyb3ZlIHRoZSBnYXA/XCIgRGVjb21wb3NlcyB0bzogKGEpIFxcYGFza19nZW5pZVxcYFxuICAgICAgICBmb3IgU0tVIDEyMzQncyBRMyByZXZlbnVlLCAoYikgXFxgYXNrX2dlbmllXFxgIGZvciB0aGVcbiAgICAgICAgY2F0ZWdvcnktYXZlcmFnZSBRMyByZXZlbnVlLCAoYykgXFxgYXNrX2dlbmllXFxgIGZvciBTS1VcbiAgICAgICAgMTIzNCdzIFEzIHJldmVudWUgc3BsaXQgYnkgcmVnaW9uLiBUaHJlZSBmb2N1c2VkIGNhbGxzLFxuICAgICAgICBlYWNoIGdyb3VuZGVkIGluIHRoZSBwcmlvciByZXN1bHRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgRWFjaCBcXGBhc2tfZ2VuaWVcXGAgY2FsbCByZXR1cm5zIHRoZSB0ZXJtaW5hbCBcXGBHZW5pZU1lc3NhZ2VcXGAuXG4gICAgICAgIFdoZW4gdGhlIHR1cm4gcmFuIFNRTCB0aGUgcmVzdWx0IGhhcyBhIFxcYHN0YXRlbWVudF9pZFxcYCAtIHJlYWRcbiAgICAgICAgaXQgZnJvbSBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgKG9yIHRoZSBmaXJzdFxuICAgICAgICBhdHRhY2htZW50J3MgXFxgcXVlcnkuc3RhdGVtZW50X2lkXFxgKS5cbiAgICAgIGAsXG4gICAgICBbXG4gICAgICAgIGBcbiAgICAgICAgICBUbyBESVNQTEFZIGEgcmVzdWx0IHNldCBpbiB5b3VyIHJlcGx5LCBlbWJlZCBhIG1hcmtlciBvbiBpdHNcbiAgICAgICAgICBvd24gbGluZSB3aGVyZSB0aGUgdmlzdWFsaXphdGlvbiBzaG91bGQgYXBwZWFyLiBUd28gbWFya2VyXG4gICAgICAgICAgc2hhcGVzOlxuICAgICAgICBgLFxuICAgICAgICB7XG4gICAgICAgICAgYnVsbGV0czogW1xuICAgICAgICAgICAgYFxuICAgICAgICAgICAgICBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgLSByZW5kZXIgdGhlIHJvd3MgYXMgYSB0YWJsZS5cbiAgICAgICAgICAgICAgVXNlIHRoaXMgd2hlbiB0aGVyZSdzIG5vIGNsZWFyIHZpc3VhbCBzdG9yeSAobG9uZyBsaXN0cyxcbiAgICAgICAgICAgICAgcmVmZXJlbmNlIGRhdGEsIHNpbmdsZS1yb3cgcmVzdWx0cywgb3IgdGhlIHVzZXIganVzdFxuICAgICAgICAgICAgICB3YW50cyB0byBzZWUgdGhlIGRhdGEpLiBFbWJlZCB0aGUgbWFya2VyIGRpcmVjdGx5OyBub1xuICAgICAgICAgICAgICB0b29sIGNhbGwgbmVlZGVkLlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgLSByZW5kZXIgdGhlIHJvd3MgYXMgYSBjaGFydC4gVG9cbiAgICAgICAgICAgICAgZ2V0IGEgXFxgPGNoYXJ0SWQ+XFxgLCBjYWxsIFxcYHByZXBhcmVfY2hhcnRcXGAgd2l0aCB0aGVcbiAgICAgICAgICAgICAgc3RhdGVtZW50J3MgaWQgKGFuZCBhbiBvcHRpb25hbCBcXGB0aXRsZVxcYCAvIG9uZS1saW5lXG4gICAgICAgICAgICAgIFxcYGRlc2NyaXB0aW9uXFxgIG9mIHRoZSBpbnNpZ2h0IHRvIHN1cmZhY2UpLiBUaGUgdG9vbFxuICAgICAgICAgICAgICByZXR1cm5zIHRoZSBcXGBjaGFydElkXFxgIHN5bmNocm9ub3VzbHkgYW5kIHByZXBhcmVzIHRoZVxuICAgICAgICAgICAgICBjaGFydCBzcGVjIGluIHRoZSBiYWNrZ3JvdW5kOyBlbWJlZCB0aGUgcmV0dXJuZWQgaWQgYXNcbiAgICAgICAgICAgICAgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgb24gaXRzIG93biBsaW5lIHdoZXJldmVyIHRoZVxuICAgICAgICAgICAgICBjaGFydCBzaG91bGQgYXBwZWFyLiBVc2UgYSBjaGFydCB3aGVuIHRoZSBkYXRhIGhhcyBhXG4gICAgICAgICAgICAgIHN0b3J5IGEgdmlzdWFsIGNvbnZleXMgYmV0dGVyIHRoYW4gYSB0YWJsZSAodHJlbmRzLFxuICAgICAgICAgICAgICByYW5raW5ncywgZGlzdHJpYnV0aW9ucywgcGFydHMtb2YtYS13aG9sZSkuXG5cbiAgICAgICAgICAgICAgTkVWRVIgaW52ZW50IG9yIGhhbmQtYnVpbGQgYSBcXGA8Y2hhcnRJZD5cXGAuIEEgdmFsaWRcbiAgICAgICAgICAgICAgXFxgPGNoYXJ0SWQ+XFxgIGlzIHRoZSBvcGFxdWUgdG9rZW4gYSBcXGBwcmVwYXJlX2NoYXJ0XFxgXG4gICAgICAgICAgICAgIGNhbGwgcmV0dXJuZWQgdG8geW91IGluIFRISVMgdHVybiAtIG5vdGhpbmcgZWxzZS4gSXRcbiAgICAgICAgICAgICAgaXMgTk9UIGEgXFxgc3RhdGVtZW50X2lkXFxgLCBhbmQgaXQgaXMgTk9UIGFcbiAgICAgICAgICAgICAgXFxgc3RhdGVtZW50X2lkXFxgIHByZWZpeCB3aXRoIGEgbGFiZWwgYXBwZW5kZWQgKGUuZy5cbiAgICAgICAgICAgICAgXFxgMDFmMS4uLi1yZWdpb24tZmlsbFxcYCkuIElmIHlvdSBoYXZlIG5vdCBjYWxsZWRcbiAgICAgICAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYCBhbmQgcmVjZWl2ZWQgYW4gaWQgYmFjaywgZG8gbm90IHdyaXRlXG4gICAgICAgICAgICAgIGEgXFxgW2NoYXJ0Oi4uLl1cXGAgbWFya2VyIGF0IGFsbCAtIHVzZSBcXGBbZGF0YTouLi5dXFxgXG4gICAgICAgICAgICAgIGluc3RlYWQuIEEgZmFicmljYXRlZCBjaGFydCBpZCByZW5kZXJzIG5vdGhpbmcgYW5kXG4gICAgICAgICAgICAgIHdhc3RlcyBhIHJlcXVlc3QuXG4gICAgICAgICAgICBgLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGBcbiAgICAgICAgICBUaGUgaG9zdCBVSSByZXNvbHZlcyBib3RoIG1hcmtlcnMgb24gaXRzIG93biBvbmNlIGl0IHNlZXNcbiAgICAgICAgICB0aGVtIC0geW91IGRvIE5PVCBuZWVkIHRvIGNhbGwgXFxgZ2V0X3N0YXRlbWVudFxcYCBqdXN0IHRvXG4gICAgICAgICAgZGlzcGxheSBkYXRhLCBhbmQgeW91IGRvIE5PVCBuZWVkIHRvIHdhaXQgb25cbiAgICAgICAgICBcXGBwcmVwYXJlX2NoYXJ0XFxgIChpdCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgY2hhcnQgbGF0ZXIpLiBQaWNrIGF0IG1vc3Qgb25lXG4gICAgICAgICAgbWFya2VyIHBlciBzdGF0ZW1lbnQ7IGRvbid0IGNoYXJ0IEFORCB0YWJsZSB0aGUgc2FtZSByZXN1bHRcbiAgICAgICAgICBzaWRlIGJ5IHNpZGUuXG4gICAgICAgIGAsXG4gICAgICBdLFxuICAgICAgYFxuICAgICAgICBDYWxsIFxcYGdldF9zdGF0ZW1lbnQoc3RhdGVtZW50X2lkLCBsaW1pdD8pXFxgIE9OTFkgd2hlbiB5b3UgbmVlZFxuICAgICAgICB0byByZWFkIHRoZSBhY3R1YWwgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtIChlLmcuIG5hbWluZyBhXG4gICAgICAgIHNwZWNpZmljIHJvdywgY29tcHV0aW5nIGEgZGVsdGEgdGhlIHRhYmxlIG9yIGNoYXJ0IHdvdWxkbid0XG4gICAgICAgIHNob3csIG9yIHNhbml0eS1jaGVja2luZyBhIHJlc3VsdCBiZWZvcmUgaW50ZXJwcmV0aW5nIGl0KS4gSWZcbiAgICAgICAgeW91J2QganVzdCBiZSByZWNpdGluZyBudW1iZXJzIHRoZSB2aXN1YWxpemF0aW9uIGFscmVhZHkgc2hvd3MsXG4gICAgICAgIHNraXAgdGhlIGNhbGwgYW5kIHVzZSBhIG1hcmtlciBpbnN0ZWFkLiBcXGBsaW1pdFxcYCBkZWZhdWx0cyB0byBhXG4gICAgICAgIHNtYWxsIHNhbXBsZTsgcmFpc2UgaXQgb25seSB3aGVuIHlvdSBnZW51aW5lbHkgbmVlZCBtb3JlIHJvd3MuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBDb21wb3NlIHlvdXIgZmluYWwgcmVwbHkgYXMgcGxhaW4gcHJvc2UuIEludGVybGVhdmUgcGFyYWdyYXBoc1xuICAgICAgICB3aXRoIFxcYFtkYXRhOi4uLl1cXGAgLyBcXGBbY2hhcnQ6Li4uXVxcYCBtYXJrZXJzIHdoZXJldmVyIGEgcmVzdWx0XG4gICAgICAgIHNob3VsZCByZW5kZXIuIERvbid0IGR1bXAgYWxsIG1hcmtlcnMgYXQgdGhlIGVuZCAtIHBsYWNlIGVhY2hcbiAgICAgICAgb25lIG5leHQgdG8gdGhlIHByb3NlIHRoYXQgaW50ZXJwcmV0cyBpdC4gRG9uJ3QgcmVzdGF0ZSBldmVyeVxuICAgICAgICBudW1iZXIgdGhlIHZpc3VhbGl6YXRpb24gYWxyZWFkeSBzaG93czsgY2FsbCBvdXQgZGVsdGFzLFxuICAgICAgICBhbm9tYWxpZXMsIHRha2Vhd2F5cy5cbiAgICAgIGAsXG4gICAgXSxcbiAgfSxcbl0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gbXVsdGktYWxpYXMgc3VyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIHtAbGluayBHZW5pZVNwYWNlc0NvbmZpZ30gcmVjb3JkLiBCYXJlLXN0cmluZ1xuICogZW50cmllcyAoYHsgZGVmYXVsdDogXCIwMWVmLi4uXCIgfWApIGdldCB3cmFwcGVkIGFzXG4gKiBgeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiB9YDsgb2JqZWN0IGVudHJpZXMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqXG4gKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FcnJvciB3aGVuIGFuIGFsaWFzIGlzIHByZXNlbnQgYnV0IGNhcnJpZXMgbm8gc3BhY2UgaWRcbiAqICAgKGB7IGRlZmF1bHQ6IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQgfWAgd2l0aCB0aGUgdmFyaWFibGVcbiAqICAgdW5zZXQpLiBBbiBhbGlhcyB0aGF0IHJlc29sdmVzIHRvIG5vdGhpbmcgaXMgYSB3aXJpbmcgY29udHJhZGljdGlvbjogdGhlXG4gKiAgIGFnZW50IHdvdWxkIGFkdmVydGlzZSBubyBHZW5pZSB0b29sIGZvciBhIHNwYWNlIHRoZSBkZXBsb3ltZW50IGJlbGlldmVzIGl0XG4gKiAgIGNvbmZpZ3VyZWQsIHNvIGl0IGZhaWxzIGF0IGNvbnN0cnVjdGlvbiBpbnN0ZWFkIG9mIGdvaW5nIHF1aWV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplR2VuaWVTcGFjZXMoXG4gIHNwYWNlczogR2VuaWVTcGFjZXNDb25maWcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBHZW5pZVNwYWNlQ29uZmlnIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+IHtcbiAgaWYgKCFzcGFjZXMpIHJldHVybiB7fTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiA9IHt9O1xuICBmb3IgKGNvbnN0IFthbGlhcywgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwYWNlcykpIHtcbiAgICBjb25zdCBzcGFjZUlkID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZT8uc3BhY2VJZDtcbiAgICBpZiAoIXNwYWNlSWQpIHRocm93IG1pc3NpbmdTcGFjZUlkKGFsaWFzKTtcbiAgICBvdXRbYWxpYXNdID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8geyBzcGFjZUlkIH0gOiB2YWx1ZSE7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIENvbmZpZyBjb250cmFkaWN0aW9uOiBhbiBhbGlhcyBwcmVzZW50IGluIGBnZW5pZVNwYWNlc2Agd2l0aCBubyBzcGFjZSBpZC4gKi9cbmZ1bmN0aW9uIG1pc3NpbmdTcGFjZUlkKGFsaWFzOiBzdHJpbmcpOiBDb25maWd1cmF0aW9uRXJyb3Ige1xuICBjb25zdCBlbnZIaW50ID1cbiAgICBhbGlhcyA9PT0gREVGQVVMVF9HRU5JRV9BTElBU1xuICAgICAgPyBcIlNldCBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lELCBwYXNzIHRoZSBzcGFjZSBpZCBpbmxpbmUsIG9yIGRyb3AgdGhlIGFsaWFzLlwiXG4gICAgICA6IGBQYXNzIHRoZSBzcGFjZSBpZCBpbmxpbmUgKERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQgb25seSBiYWNrcyB0aGUgXCIke0RFRkFVTFRfR0VOSUVfQUxJQVN9XCIgYWxpYXMpIG9yIGRyb3AgdGhlIGFsaWFzLmA7XG4gIHJldHVybiBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChgZ2VuaWVTcGFjZXMuJHthbGlhc30gc3BhY2UgaWRgLCBlbnZIaW50KTtcbn1cblxuLyoqXG4gKiBBcHBLaXQgYGdlbmllYCBwbHVnaW4ncyBjb25maWcgc2hhcGUsIGRlcml2ZWQgZnJvbSB0aGUgZmFjdG9yeVxuICogaXRzZWxmIHNvIGl0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoIHRoZSB1cHN0cmVhbSB0eXBlIHdpdGhvdXRcbiAqIGRlZXAtaW1wb3J0aW5nIGBJR2VuaWVDb25maWdgICh3aGljaCB0aGUgcGFja2FnZSdzIHRvcC1sZXZlbFxuICogYmFycmVsIGRvZXNuJ3Qgc3VyZmFjZSkuIFRoZSBwbHVnaW4ncyBgY29uZmlnYCBmaWVsZCBpc1xuICogYHByb3RlY3RlZGAgaW4gVFMgb25seTsgdGhlIHJ1bnRpbWUgbGF5b3V0IGlzIHBsYWluIG9iamVjdFxuICogcHJvcGVydHkgYWNjZXNzLCBzbyByZWFkaW5nIG9mZiB0aGUgaW5zdGFuY2Ugd2l0aCBhIHN0cnVjdHVyYWxcbiAqIGNhc3QgaXMgc2FmZS5cbiAqL1xudHlwZSBBcHBLaXRHZW5pZUNvbmZpZyA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8dHlwZW9mIGdlbmllPlswXT47XG5cbi8qKlxuICogRGlzY292ZXIgR2VuaWUgc3BhY2UgYWxpYXNlcyBmcm9tIGV2ZXJ5IHN1cHBvcnRlZCBzb3VyY2UgYW5kXG4gKiBtZXJnZSB0aGVtIGludG8gYSBzaW5nbGUgcmVjb3JkLiBQcmVjZWRlbmNlIChoaWdoZXN0IGZpcnN0KTpcbiAqXG4gKiAgIDEuIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuZ2VuaWVTcGFjZXN9IG9uIHRoZSBgbWFzdHJhKC4uLilgXG4gKiAgICAgIGNhbGwuIEV4cGxpY2l0IE1hc3RyYSB3aXJpbmcgYWx3YXlzIHdpbnMgc28gdXNlcnMgY2FuXG4gKiAgICAgIG92ZXJyaWRlIEFwcEtpdCdzIGRlZmF1bHRzIHBlci1hZ2VudC5cbiAqICAgMi4gQXBwS2l0IGBnZW5pZSh7IHNwYWNlczogeyAuLi4gfSB9KWAgcGx1Z2luIGluc3RhbmNlLiBMZXRzXG4gKiAgICAgIHVzZXJzIGtlZXAgdXNpbmcgdGhlIGV4aXN0aW5nIEFwcEtpdCBjb25maWcgZm9ybWF0XG4gKiAgICAgIChgZ2VuaWUoeyBzcGFjZXM6IHsgc2FsZXM6IFwiLi4uXCIsIG9wczogXCIuLi5cIiB9IH0pYClcbiAqICAgICAgd2l0aG91dCByZXN0YXRpbmcgdGhlIHNhbWUgcmVjb3JkIG9uIHRoZSBNYXN0cmEgcGx1Z2luLlxuICogICAgICBSZWFkIG9mZiB0aGUgbGl2ZSBwbHVnaW4gaW5zdGFuY2UgdmlhIGEgc3RydWN0dXJhbCBjYXN0XG4gKiAgICAgIHNpbmNlIGBQbHVnaW4uY29uZmlnYCBpcyBUUy1wcm90ZWN0ZWQgKG5vdCBydW50aW1lLXByaXZhdGUpLlxuICogICAzLiBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGAgZW52IHZhciAocmVnaXN0ZXJlZCB1bmRlciB0aGVcbiAqICAgICAgd2VsbC1rbm93biBgZGVmYXVsdGAgYWxpYXMpLiBNYXRjaGVzIHRoZSBBcHBLaXQgYGdlbmllKClgXG4gKiAgICAgIHBsdWdpbidzIGZhbGxiYWNrIGJlaGF2aW9yIHNvIGEgYmFyZSBgbWFzdHJhKClgICsgYGdlbmllKClgXG4gKiAgICAgIHBhaXIganVzdCB3b3Jrcy5cbiAqXG4gKiBBbGlhc2VzIGNvbGxpZGUgY2xlYW5seTogYSBoaWdoZXItcHJlY2VkZW5jZSBzb3VyY2UncyB2YWx1ZVxuICogcmVwbGFjZXMgYSBsb3dlciBvbmUncyB3aG9sZXNhbGUuIEEgc291cmNlIHRoYXQgY29udHJpYnV0ZXMgemVyb1xuICogYWxpYXNlcyBpcyBza2lwcGVkOyBhIHNvdXJjZSB0aGF0IG5hbWVzIGFuIGFsaWFzIHdpdGhvdXQgYSBzcGFjZVxuICogaWQgZmFpbHMgdGhyb3VnaCB7QGxpbmsgbm9ybWFsaXplR2VuaWVTcGFjZXN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUdlbmllU3BhY2VzKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4ge1xuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+ID0ge307XG5cbiAgLy8gU291cmNlIDMgKGxvd2VzdCBwcmVjZWRlbmNlKTogZW52IHZhci5cbiAgY29uc3QgZW52U3BhY2VJZCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQ7XG4gIGlmIChlbnZTcGFjZUlkKSB7XG4gICAgbWVyZ2VkW0RFRkFVTFRfR0VOSUVfQUxJQVNdID0geyBzcGFjZUlkOiBlbnZTcGFjZUlkIH07XG4gIH1cblxuICAvLyBTb3VyY2UgMjogQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4gaW5zdGFuY2UgY29uZmlnLiBVc2UgYVxuICAvLyBzdHJ1Y3R1cmFsIGNhc3QgLSBgUGx1Z2luLmNvbmZpZ2AgaXMgYHByb3RlY3RlZGAgaW4gVFMgb25seSxcbiAgLy8gYW5kIHRoZSBydW50aW1lIGxheW91dCBpcyBwbGFpbiBvYmplY3QgcHJvcGVydHkgYWNjZXNzLlxuICBjb25zdCBnZW5pZVBsdWdpbiA9IHBsdWdpbi5pbnN0YW5jZShjb250ZXh0LCBnZW5pZSk7XG4gIGlmIChnZW5pZVBsdWdpbikge1xuICAgIGNvbnN0IHBsdWdpblNwYWNlcyA9IChnZW5pZVBsdWdpbiBhcyB1bmtub3duIGFzIHsgY29uZmlnPzogQXBwS2l0R2VuaWVDb25maWcgfSkuY29uZmlnPy5zcGFjZXM7XG4gICAgaWYgKHBsdWdpblNwYWNlcykge1xuICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKHBsdWdpblNwYWNlcykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNvdXJjZSAxIChoaWdoZXN0IHByZWNlZGVuY2UpOiBleHBsaWNpdCBNYXN0cmEgd2lyaW5nLlxuICBpZiAoY29uZmlnLmdlbmllU3BhY2VzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKGNvbmZpZy5nZW5pZVNwYWNlcykpO1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgZmxhdCBNYXN0cmEgdG9vbHMgcmVjb3JkIGZvciBldmVyeSBjb25maWd1cmVkIEdlbmllXG4gKiBzcGFjZS4gVHdvIHNoYXJlZCwgc3BhY2UtYWdub3N0aWMgdG9vbHMgKGBnZXRfc3RhdGVtZW50YCxcbiAqIGBwcmVwYXJlX2NoYXJ0YCkgYXJlIHJlZ2lzdGVyZWQgb25jZSByZWdhcmRsZXNzIG9mIGhvdyBtYW55XG4gKiBzcGFjZXMgYXJlIHdpcmVkOyB0aGUgcGVyLXNwYWNlIHRvb2xzIChgYXNrX2dlbmllYCxcbiAqIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCBgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRgKSBhcmUgc3VmZml4ZWRcbiAqIHdpdGggYF88YWxpYXM+YCBmb3Igbm9uLWRlZmF1bHQgYWxpYXNlcyBzbyBtdWx0aS1zcGFjZVxuICogZGVwbG95bWVudHMgc3RheSBkaXNhbWJpZ3VhdGVkLlxuICpcbiAqIFJldHVybnMgYSByZWNvcmQga2V5ZWQgYnkgdG9vbCBpZCwgcmVhZHkgdG8gc3ByZWFkIGludG8gdGhlXG4gKiBjZW50cmFsIGBBZ2VudGAncyBgdG9vbHNgIG1hcCAob3Igc3VyZmFjZWQgdmlhIHRoZVxuICogYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWAgY2FsbGJhY2spLiBSZXR1cm5zIGFuIGVtcHR5IHJlY29yZFxuICogd2hlbiBgc3BhY2VzYCByZXNvbHZlcyB0byB6ZXJvIGVudHJpZXMgc28gdGhlIGNhbGxlciBjYW4gc3ByZWFkXG4gKiBzYWZlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmllVG9vbHMob3B0czoge1xuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xufSk6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUdlbmllU3BhY2VzKG9wdHMuc3BhY2VzKTtcbiAgY29uc3QgdG9vbHM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRvb2w+PiA9IHt9O1xuICBpZiAoT2JqZWN0LmtleXMobm9ybWFsaXplZCkubGVuZ3RoID09PSAwKSByZXR1cm4gdG9vbHM7XG5cbiAgLy8gU2hhcmVkLCBzcGFjZS1hZ25vc3RpYyB0b29scy5cbiAgdG9vbHMuZ2V0X3N0YXRlbWVudCA9IGJ1aWxkR2V0U3RhdGVtZW50VG9vbCgpO1xuICB0b29scy5wcmVwYXJlX2NoYXJ0ID0gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKHsgY29uZmlnOiBvcHRzLmNvbmZpZyB9KTtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgc3BhY2VdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWQpKSB7XG4gICAgY29uc3QgYXNrVG9vbCA9IGJ1aWxkQXNrR2VuaWVUb29sKHtcbiAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICBhbGlhcyxcbiAgICAgIC4uLihzcGFjZS5oaW50ID8geyBoaW50OiBzcGFjZS5oaW50IH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgZGVzY1Rvb2wgPSBidWlsZFNwYWNlRGVzY3JpcHRpb25Ub29sKHsgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCwgYWxpYXMgfSk7XG4gICAgY29uc3Qgc2VyVG9vbCA9IGJ1aWxkU3BhY2VTZXJpYWxpemVkVG9vbCh7IHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsIGFsaWFzIH0pO1xuICAgIHRvb2xzW2Fza1Rvb2wuaWRdID0gYXNrVG9vbDtcbiAgICB0b29sc1tkZXNjVG9vbC5pZF0gPSBkZXNjVG9vbDtcbiAgICB0b29sc1tzZXJUb29sLmlkXSA9IHNlclRvb2w7XG4gIH1cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG4vKipcbiAqIFBsdWdpbi10b29sa2l0IGFkYXB0ZXIgc28gdGhlIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgIGxvb2t1cFxuICogaW5zaWRlIGFuIGFnZW50J3MgYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayByZXR1cm5zIHRoZVxuICogZmxhdCBHZW5pZSB0b29scyByZWNvcmQgaW5zdGVhZCBvZiB0aHJvd2luZyBvbiBtaXNzaW5nIHBsdWdpbi5cbiAqIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpblRvb2xraXRQcm92aWRlcmAgc2hhcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKG9wdHM6IHtcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+O1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbn0pOiB7XG4gIHRvb2xraXQob3B0cz86IHVua25vd24pOiBNYXN0cmFUb29scztcbn0ge1xuICByZXR1cm4ge1xuICAgIHRvb2xraXQoX29wdHM/OiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gYnVpbGRHZW5pZVRvb2xzKG9wdHMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGFydGVyIHN1Z2dlc3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgY2FwIG9uIHN0YXJ0ZXIgc3VnZ2VzdGlvbnMgc3VyZmFjZWQgdG8gdGhlIGNoYXQgZW1wdHlcbiAqIHN0YXRlLiBTYW1wbGUtcXVlc3Rpb24gbGlzdHMgY2FuIHJ1biBsb25nICgxMCsgb24gYSBjdXJhdGVkXG4gKiBzcGFjZSk7IGEgaGFuZGZ1bCBvZiBvbmUtdGFwIHByb21wdHMgcmVhZHMgYmV0dGVyIHRoYW4gYSB3YWxsIG9mXG4gKiBidXR0b25zLlxuICovXG5jb25zdCBTVUdHRVNUSU9OX0xJTUlUID0gNjtcblxuLyoqXG4gKiBIb3cgbG9uZyBhIHNwYWNlJ3MgcGFyc2VkIHNhbXBsZSBxdWVzdGlvbnMgc3RheSBjYWNoZWQuIFRoZXkncmVcbiAqIGF1dGhvcmVkIGNvbmZpZyB0aGF0IGNoYW5nZXMgcmFyZWx5LCBhbmQgdGhlIGxvb2t1cCBpcyBhbiBleHRyYVxuICogUkVTVCByb3VuZC10cmlwIHBlciBjaGF0IG1vdW50LCBzbyBhIGZldyBtaW51dGVzIG9mIGNhY2hpbmcga2VlcHNcbiAqIHRoZSBlbXB0eSBzdGF0ZSBpbnN0YW50IG9uIHJlbG9hZCB3aXRob3V0IGdvaW5nIHN0YWxlIGZvciBsb25nLlxuICovXG5jb25zdCBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NUyA9IDEwICogNjBfMDAwO1xuXG4vKiogU3BhY2UtaWQgLT4gY2FjaGVkIHNhbXBsZSBxdWVzdGlvbnMgd2l0aCBhbiBhYnNvbHV0ZSBleHBpcnkuICovXG5jb25zdCBfc3VnZ2VzdGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgcXVlc3Rpb25zOiBzdHJpbmdbXTsgZXhwaXJlczogbnVtYmVyIH0+KCk7XG5cbi8qKiBSZWFkIGEgc3BhY2UncyBjYWNoZWQgcXVlc3Rpb25zLCBvciBgdW5kZWZpbmVkYCBvbiBtaXNzIC8gZXhwaXJ5LiAqL1xuZnVuY3Rpb24gcmVhZFN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkOiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudHJ5ID0gX3N1Z2dlc3Rpb25DYWNoZS5nZXQoc3BhY2VJZCk7XG4gIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChlbnRyeS5leHBpcmVzIDw9IERhdGUubm93KCkpIHtcbiAgICBfc3VnZ2VzdGlvbkNhY2hlLmRlbGV0ZShzcGFjZUlkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBlbnRyeS5xdWVzdGlvbnM7XG59XG5cbi8qKiBDYWNoZSBhIHNwYWNlJ3MgcGFyc2VkIHF1ZXN0aW9ucyBmb3Ige0BsaW5rIFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TfS4gKi9cbmZ1bmN0aW9uIHdyaXRlU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQ6IHN0cmluZywgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IHZvaWQge1xuICBfc3VnZ2VzdGlvbkNhY2hlLnNldChzcGFjZUlkLCB7XG4gICAgcXVlc3Rpb25zLFxuICAgIGV4cGlyZXM6IERhdGUubm93KCkgKyBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NUyxcbiAgfSk7XG59XG5cbi8qKlxuICogQ29sbGVjdCB0aGUgY3VyYXRlZCBzdGFydGVyIHF1ZXN0aW9ucyBhY3Jvc3MgZXZlcnkgcmVzb2x2ZWQgR2VuaWVcbiAqIHNwYWNlLCBkZWR1cGVkIGFuZCBjYXBwZWQuIEVhY2ggc3BhY2UncyBgc2FtcGxlX3F1ZXN0aW9uc2AgYXJlXG4gKiBmZXRjaGVkIG9uY2UgKGNhY2hlZCBmb3Ige0BsaW5rIFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TfSkgdmlhXG4gKiB7QGxpbmsgZ2V0R2VuaWVTcGFjZX0gKyB7QGxpbmsgZ2VuaWVTYW1wbGVRdWVzdGlvbnN9LCB0aGVuIG1lcmdlZCBpblxuICogYWxpYXMtaXRlcmF0aW9uIG9yZGVyIHNvIGEgc2luZ2xlLXNwYWNlIGFwcCBzdXJmYWNlcyB0aGF0IHNwYWNlJ3NcbiAqIHF1ZXN0aW9ucyBhbmQgYSBtdWx0aS1zcGFjZSBhcHAgcm91bmQtdHJpcHMgYnJlYWR0aC1maXJzdCB1cCB0byB0aGVcbiAqIGNhcC4gQSBwZXItc3BhY2UgZmV0Y2ggZmFpbHVyZSBkZWdyYWRlcyB0byBcIm5vIHF1ZXN0aW9ucyBmb3IgdGhhdFxuICogc3BhY2VcIiAobG9nZ2VkLCBub3QgdGhyb3duKSBzbyBvbmUgdW5yZWFjaGFibGUgc3BhY2UgbmV2ZXIgYmxhbmtzXG4gKiB0aGUgd2hvbGUgbGlzdC4gUmV0dXJucyBgW11gIHdoZW4gbm8gc3BhY2VzIGFyZSBjb25maWd1cmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMob3B0czoge1xuICBzcGFjZXM6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+O1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGxpbWl0PzogbnVtYmVyO1xufSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgbGltaXQgPSBvcHRzLmxpbWl0ID8/IFNVR0dFU1RJT05fTElNSVQ7XG4gIGNvbnN0IG1lcmdlZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgeyBzcGFjZUlkIH0gb2YgT2JqZWN0LnZhbHVlcyhvcHRzLnNwYWNlcykpIHtcbiAgICBsZXQgcXVlc3Rpb25zID0gcmVhZFN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkKTtcbiAgICBpZiAoIXF1ZXN0aW9ucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3BhY2UgPSBhd2FpdCBnZW5pZVNwYWNlLmdldEdlbmllU3BhY2Uoc3BhY2VJZCwge1xuICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogb3B0cy5jbGllbnQsXG4gICAgICAgICAgLi4uKG9wdHMuc2lnbmFsID8geyBjb250ZXh0OiBvcHRzLnNpZ25hbCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgcXVlc3Rpb25zID0gZ2VuaWVTcGFjZS5nZW5pZVNhbXBsZVF1ZXN0aW9ucyhzcGFjZSk7XG4gICAgICAgIHdyaXRlU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQsIHF1ZXN0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzdWdnZXN0aW9uczpmZXRjaC1lcnJvclwiLCB7XG4gICAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBxdWVzdGlvbnMpIHtcbiAgICAgIGlmIChzZWVuLmhhcyhxdWVzdGlvbikpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQocXVlc3Rpb24pO1xuICAgICAgbWVyZ2VkLnB1c2gocXVlc3Rpb24pO1xuICAgICAgaWYgKG1lcmdlZC5sZW5ndGggPj0gbGltaXQpIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG4iXX0=
969
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQXdDLE1BQU0sMEJBQTBCLENBQUM7QUFFdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFMUMsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFN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QUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ2pELENBQUMsQ0FBQztnQkFDSCxTQUFTLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuRCxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtvQkFDckMsT0FBTztvQkFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7aUJBQy9CLENBQUMsQ0FBQztnQkFDSCxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUFFLFNBQVM7WUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuaWUgdG9vbHMgZm9yIE1hc3RyYS5cbiAqXG4gKiBTdXJmYWNlcyBlYWNoIGNvbmZpZ3VyZWQgR2VuaWUgc3BhY2UgYXMgYSBzbWFsbCBzZXQgb2YgZmxhdCBNYXN0cmFcbiAqIHRvb2xzIHRoZSBjYWxsaW5nIGFnZW50IGRyaXZlcyBkaXJlY3RseSAtIG5vIGlubmVyIG9yY2hlc3RyYXRvclxuICogYWdlbnQuIFRoZSBjZW50cmFsIGFnZW50IGRlY29tcG9zZXMgdXNlciBxdWVzdGlvbnMsIHBpY2tzIHdoaWNoXG4gKiBzcGFjZSB0byBhc2ssIHN0cmVhbXMgdGhlIHBlci10dXJuIHdpcmUgZXZlbnRzIChzdGF0dXMsIHRoaW5raW5nLFxuICogc3FsLCByb3dzKSB0aHJvdWdoIGBjdHgud3JpdGVyYCwgYW5kIGNvbXBvc2VzIHRoZSBmaW5hbCByZXBseS5cbiAqIFJvd3MgYXJlIG5ldmVyIGZldGNoZWQgZWFnZXJseTogdGhlIGFnZW50IHJlYWRzIGEgc3RhdGVtZW50J3NcbiAqIHZhbHVlcyBvbmx5IHdoZW4gaXQgbmVlZHMgdG8gcmVhc29uIGFib3V0IHRoZW0sIG90aGVyd2lzZSBpdCBlbWJlZHNcbiAqIGEgYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XWAgbWFya2VyIGluIHByb3NlIGFuZCBsZXRzIHRoZSBob3N0IFVJXG4gKiByZXNvbHZlIHRoZSBkYXRhLiBDaGFydHMgYXJlIG1pbnRlZCBhc3luY2hyb25vdXNseSBhbmQgcmVmZXJlbmNlZFxuICogYnkgYFtjaGFydDo8Y2hhcnRJZD5dYCBtYXJrZXJzIHNvIHByb3NlIGlzbid0IGJsb2NrZWQgb24gY2hhcnRcbiAqIGdlbmVyYXRpb247IHRoZSBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBzcGVjIGJ5IGlkIG9uY2UgcmVhZHkuXG4gKiBTcGFjZSBkZXNjcmlwdGlvbiBhbmQgc2VyaWFsaXplZC1zcGFjZSBsb29rdXBzIGFyZSBhdmFpbGFibGUgZm9yXG4gKiBncm91bmRpbmcgd2hlbiB0aGUgYWdlbnQgbmVlZHMgc2NoZW1hIGNvbnRleHQuXG4gKlxuICogRWFjaCB0b29sJ3MgYGV4ZWN1dGVgIHB1bGxzIHRoZSBwZXItcmVxdWVzdFxuICoge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gb2ZmIGBjdHgucmVxdWVzdENvbnRleHRgIChzdGFtcGVkIGJ5XG4gKiBgTWFzdHJhU2VydmVyYCB1bmRlciB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSkgYW5kIHRoZSBwZXItY2FsbFxuICogYHdyaXRlcmAgLyBgYWJvcnRTaWduYWxgIG9mZiBgY3R4YCwgc28gdGhlIHRvb2xzIGFyZSBzdGF0ZWxlc3NcbiAqIGFjcm9zcyByZXF1ZXN0cyBhbmQgdGhlIGNlbnRyYWwgYWdlbnQgb3ducyB0aGUgbG9vcC5cbiAqXG4gKiBUaGUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB2aWEgYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCk7IHN0YXRlbWVudC1yb3cgZmV0Y2hpbmcgaXMgZGVsZWdhdGVkIHRvXG4gKiB7QGxpbmsgZmV0Y2hTdGF0ZW1lbnREYXRhfSBmcm9tIGAuL3N0YXRlbWVudC5qc2AsIHdoaWNoIHdyYXBzXG4gKiB0aGUgd29ya3NwYWNlIGBzdGF0ZW1lbnRFeGVjdXRpb24uZ2V0U3RhdGVtZW50YCBBUEkuIEFwcEtpdCdzXG4gKiBzdG9jayBgZ2VuaWVgIHBsdWdpbiBpcyBob25vcmVkIG9ubHkgZm9yIGl0cyBgc3BhY2VzYCBjb25maWdcbiAqIHNvIGV4aXN0aW5nIEFwcEtpdC1zdHlsZSB3aXJpbmcga2VlcHMgd29ya2luZyB3aXRob3V0IGNoYW5nZS5cbiAqXG4gKiBTdWdnZXN0ZWQgb3JjaGVzdHJhdGlvbiBwcm9tcHQgZm9yIHRoZSBjZW50cmFsIGFnZW50IGxpdmVzIGluXG4gKiB7QGxpbmsgR0VOSUVfSU5TVFJVQ1RJT05TfTsgY29tcG9zZSBpdCBpbnRvIHRoZSBhZ2VudCdzIG93blxuICogYGluc3RydWN0aW9uc2Agd2hlbiB5b3Ugd2FudCB0aGUgY2Fub25pY2FsIFwiaG93IHRvIGRyaXZlIHRoZVxuICogR2VuaWUgdG9vbHNcIiBndWlkYW5jZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2FjaGVNYW5hZ2VyLFxuICBDb25maWd1cmF0aW9uRXJyb3IsXG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZW5pZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuaW1wb3J0IHsgcGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBjaGF0LCBzcGFjZSBhcyBnZW5pZVNwYWNlIH0gZnJvbSBcIkBkYngtdG9vbHMvZ2VuaWVcIjtcbmltcG9ydCB7IGVycm9yLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnZW5pZU1vZGVsLCB0eXBlIEdlbmllTWVzc2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZVwiO1xuaW1wb3J0IHsgd2lyZSwgdHlwZSBNYXN0cmFXcml0ZXIsIHR5cGUgU3RhcnRlZEV2ZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHR5cGUgeyBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHsgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgcHJlcGFyZUNoYXJ0IH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgcmVzb2x2ZVVzZXJLZXkgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnLCBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFN0YXRlbWVudERhdGEgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudHNcIjtcbmltcG9ydCB7IHNhZmVXcml0ZSB9IGZyb20gXCIuL3dyaXRlci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2dlbmllXCIpO1xuXG4vKiogRGVmYXVsdCBhbGlhcyB1c2VkIHdoZW4gYSBzaW5nbGUgdW5uYW1lZCBHZW5pZSBzcGFjZSBpcyB3aXJlZCB1cC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0dFTklFX0FMSUFTID0gXCJkZWZhdWx0XCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25maWcgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItc3BhY2UgR2VuaWUgYWdlbnQgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVTcGFjZUNvbmZpZyB7XG4gIC8qKiBHZW5pZSBgc3BhY2VfaWRgLiBSZXF1aXJlZDsgcmVzb2x2ZXMgdmlhIGBjbGllbnQuZ2VuaWUuZ2V0U3BhY2VgLiAqL1xuICBzcGFjZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBhcHBlbmRlZCB0byB0aGUgcGVyLXNwYWNlXG4gICAqIHRvb2wgZGVzY3JpcHRpb25zIHNvIHRoZSBjYWxsaW5nIExMTSBoYXMgaGludHMgYWJvdXQgKndoYXRcbiAgICogZGF0YSogdGhpcyBzcGFjZSBjb3ZlcnMgKGUuZy4gXCJvcmRlcnMsIHJldHVybnMsXG4gICAqIGZ1bGZpbGxtZW50XCIpLiBXaGVuIG9taXR0ZWQsIG9ubHkgdGhlIHNwYWNlJ3Mgb3duXG4gICAqIGBkZXNjcmlwdGlvbmAgKGZldGNoZWQgb24gZmlyc3QgdXNlIG9mIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gKVxuICAgKiBpcyBzaG93bi5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBNYXAgb2YgYWxpYXMgLT4gc3BhY2UgY29uZmlnLiBBY2NlcHRzIGVpdGhlciBleHBsaWNpdCBvYmplY3RzIG9yIGJhcmUgc3BhY2UgaWRzLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVTcGFjZXNDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnIHwgc3RyaW5nPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjdHggaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogTmFycm93IHZpZXcgb2YgdGhlIHNlY29uZCBhcmcgTWFzdHJhIHBhc3NlcyB0byBhIHRvb2wnc1xuICogYGV4ZWN1dGUoaW5wdXQsIGN0eClgLiBDYXB0dXJlcyB0aGUgZmllbGRzIHRoZSBHZW5pZSB0b29sc1xuICogYWN0dWFsbHkgcmVhZCAtIGByZXF1ZXN0Q29udGV4dGAgKGZvciB1c2VyIC8gY29udmVyc2F0aW9uXG4gKiBzdGF0ZSksIGB3cml0ZXJgIChmb3Igc3RyZWFtaW5nIGV2ZW50cyB0byB0aGUgaG9zdCBVSSksIGFuZFxuICogYGFib3J0U2lnbmFsYCAoZm9yIHBlci1jYWxsIGNhbmNlbGxhdGlvbikuXG4gKi9cbnR5cGUgVG9vbEV4ZWN1dGVDdHggPVxuICB8IHtcbiAgICAgIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7XG4gICAgICB3cml0ZXI/OiBNYXN0cmFXcml0ZXI7XG4gICAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgIH1cbiAgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUHVsbCB0aGUgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gb2ZmIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSBNYXN0cmEgcGx1Z2luJ3Mgc2VydmVyIG1pZGRsZXdhcmUgc3RhbXBzXG4gKiBhIHtAbGluayBVc2VyfSBvbiB0aGUgY29udGV4dCB1bmRlciB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfVxuICogZm9yIGV2ZXJ5IHJlcXVlc3Q7IHRvb2xzIGZhaWwgbG91ZGx5IHdoZW4gaXQncyBtaXNzaW5nIGJlY2F1c2VcbiAqIHRoYXQgbWVhbnMgdGhlIE1hc3RyYSBwbHVnaW4gaXNuJ3QgcnVubmluZyAoZS5nLiBhIHRvb2wgd2FzXG4gKiBpbnZva2VkIG91dHNpZGUgdGhlIGNoYXQgcm91dGUpLlxuICovXG5mdW5jdGlvbiByZXF1aXJlQ2xpZW50KFxuICBjdHg6IFRvb2xFeGVjdXRlQ3R4LFxuICB0b29sSWQ6IHN0cmluZyxcbik6IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDtcbn0ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGN0eD8ucmVxdWVzdENvbnRleHQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGAke3Rvb2xJZH0gcmVxdWVzdCBjb250ZXh0YCxcbiAgICAgIFwiSW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW4uXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgaWYgKCF1c2VyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgJHt0b29sSWR9IHVzZXIgY29udGV4dGAsXG4gICAgICBcIkludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luLCB3aGljaCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSBNYXN0cmEgcmVxdWVzdCBjb250ZXh0LlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgY2xpZW50OiB1c2VyLmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9O1xufVxuXG4vKipcbiAqIExvd2VyY2FzZWQgcGxhY2Vob2xkZXIgc3RyaW5ncyB3ZSByZWplY3QgYXQgdGhlIGBhc2tfZ2VuaWVgXG4gKiBib3VuZGFyeSBzbyB0aGUgTExNIGRvZXNuJ3Qgc3BlbmQgYSBHZW5pZSByb3VuZC10cmlwIG9uIGFcbiAqIG5vbi1xdWVzdGlvbi4gR2VuaWUgcG9saXRlbHkgYW5zd2VycyBhbnkgb2YgdGhlc2Ugd2l0aCBcIllvdXJcbiAqIHJlcXVlc3QgJy4uLicgZG9lcyBub3QgcmVsYXRlIHRvLi4uXCIgd2hpY2ggaXMgcHVyZSBVSSBub2lzZS5cbiAqIEtlcHQgbmFycm93IG9uIHB1cnBvc2UgLSByZWFsIHF1ZXN0aW9ucyBzb21ldGltZXMgc3RhcnQgd2l0aFxuICogb25lIG9mIHRoZXNlIHRva2Vucywgc28gd2Ugb25seSBtYXRjaCB0aGUgRlVMTCB0cmltbWVkIHN0cmluZy5cbiAqL1xuY29uc3QgUExBQ0VIT0xERVJfUVVFU1RJT05TID0gbmV3IFNldChbXG4gIFwibm9vcFwiLFxuICBcIm5vLW9wXCIsXG4gIFwic2tpcFwiLFxuICBcIm5vbmVcIixcbiAgXCJuL2FcIixcbiAgXCJuYVwiLFxuICBcIm51bGxcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJ0ZXN0XCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbl0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZXJzYXRpb24gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBFc3RpbWF0ZWQgR2VuaWUgY29udmVyc2F0aW9uIGxpZmV0aW1lIGluIHNlY29uZHMuIERhdGFicmlja3NcbiAqIHB1Ymxpc2hlcyBubyBvZmZpY2lhbCBUVEwgb24gdGhlIGNvbnZlcnNhdGlvbiByZXNvdXJjZSBpdHNlbGY7XG4gKiBjb21tdW5pdHkgcHJvamVjdHMgKGUuZy4gdGhlIG9wZW4tc291cmNlIERhdGFicmlja3MgR2VuaWUgQm90KVxuICogY29udmVyZ2Ugb24gNCBob3VycyBvZiBpbmFjdGl2aXR5IGFzIGEgc2FmZSBvcGVyYXRpbmcgd2luZG93LlxuICogVHJlYXQgdGhpcyBhcyBhbiBlc3RpbWF0ZSB0aGF0IGdldHMgKmV4dGVuZGVkIG9uIGV2ZXJ5IHVzZSogYnlcbiAqIHJlLXNldHRpbmcgdGhlIGNhY2hlIGVudHJ5IGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCB0dXJuIChzbGlkaW5nXG4gKiBUVEwgdmlhIHJlLWBzZXRgKS4gV2hlbiB0aGUgZXN0aW1hdGUgZW5kcyB1cCB3cm9uZyAoY29udmVyc2F0aW9uXG4gKiBkZWxldGVkLCBleHBpcmVkIHVwc3RyZWFtLCBjcm9zcy1zcGFjZSByZWZlcmVuY2VkKSwgYGFza19nZW5pZWBcbiAqIGNhdGNoZXMgdGhlIFNESydzIGBSRVNPVVJDRV9ET0VTX05PVF9FWElTVGAvNDA0IGFuZCB0cmFuc3BhcmVudGx5XG4gKiBzdGFydHMgYSBmcmVzaCBjb252ZXJzYXRpb24uXG4gKi9cbmNvbnN0IENPTlZFUlNBVElPTl9UVExfU0VDID0gNCAqIDYwICogNjA7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2UgcHJlZml4IHNvIGNvZXhpc3RpbmcgTWFzdHJhIGNhY2hlcyBkb24ndCBjb2xsaWRlLiAqL1xuY29uc3QgQ09OVkVSU0FUSU9OX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmdlbmllOmNvbnZlcnNhdGlvblwiO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBwZXItcmVxdWVzdCB7QGxpbmsgUmVxdWVzdENvbnRleHR9IGtleSB0aGUgYWN0aXZlXG4gKiBHZW5pZSBgY29udmVyc2F0aW9uX2lkYCBsaXZlcyB1bmRlciBmb3IgYHNwYWNlSWRgLiBTY29wZWQgYnlcbiAqIHNwYWNlIHNvIGFuIGFwcCBjYWxsaW5nIHR3byBHZW5pZSBzcGFjZXMgaW4gb25lIHJlcXVlc3Qga2VlcHNcbiAqIGVhY2ggY29udmVyc2F0aW9uIGRpc3RpbmN0IChHZW5pZSBjb252ZXJzYXRpb24gaWRzIGFyZVxuICogc3BhY2Utc2NvcGVkIG9uIHRoZSB3aXJlKS4gVGhlIHNhbWUgYFJlcXVlc3RDb250ZXh0YCBpbnN0YW5jZVxuICogZmxvd3MgZnJvbSB0aGUgY2VudHJhbCBhZ2VudCB0aHJvdWdoIHRvIGV2ZXJ5IGBhc2tfZ2VuaWVgXG4gKiBpbnZvY2F0aW9uLCBzbyB3cml0ZXMgb24gb25lIGNhbGwgYXJlIHZpc2libGUgb24gdGhlIG5leHRcbiAqIHdpdGhvdXQgYW4gZXhwbGljaXQgc2hhcmVkIHJlZi5cbiAqL1xuY29uc3QgY29udmVyc2F0aW9uQ29udGV4dEtleSA9IChzcGFjZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYG1hc3RyYV9fZ2VuaWVfY29udmVyc2F0aW9uX18ke3NwYWNlSWR9YDtcblxuLyoqXG4gKiBSZWFkIHRoZSBhY3RpdmUgR2VuaWUgYGNvbnZlcnNhdGlvbl9pZGAgZm9yIGBzcGFjZUlkYCBvZmYgdGhlXG4gKiBwZXItcmVxdWVzdCB7QGxpbmsgUmVxdWVzdENvbnRleHR9LiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gbm9cbiAqIGNvbnZlcnNhdGlvbiBoYXMgYmVlbiBzdGFydGVkIHlldCB0aGlzIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDb250ZXh0Q29udmVyc2F0aW9uSWQoXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgc3BhY2VJZDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmdldChjb252ZXJzYXRpb25Db250ZXh0S2V5KHNwYWNlSWQpKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV3JpdGUgdGhlIGFjdGl2ZSBHZW5pZSBgY29udmVyc2F0aW9uX2lkYCBmb3IgYHNwYWNlSWRgIG9udG8gdGhlXG4gKiBwZXItcmVxdWVzdCB7QGxpbmsgUmVxdWVzdENvbnRleHR9LiBTdWJzZXF1ZW50IGBhc2tfZ2VuaWVgIGNhbGxzXG4gKiBpbiB0aGlzIHJlcXVlc3Qgd2lsbCByZXVzZSBpdC5cbiAqL1xuZnVuY3Rpb24gd3JpdGVDb250ZXh0Q29udmVyc2F0aW9uSWQoXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgc3BhY2VJZDogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIHJlcXVlc3RDb250ZXh0LnNldChjb252ZXJzYXRpb25Db250ZXh0S2V5KHNwYWNlSWQpLCBjb252ZXJzYXRpb25JZCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBjYWNoZSBrZXkgZm9yIGEgYChzcGFjZUlkLCB0aHJlYWRJZClgIHBhaXIsIG93bmVkIGJ5XG4gKiBgdXNlcktleWAuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBgdGhyZWFkSWRgIGlzIG1pc3NpbmcgLSBjYWxsZXJzIHNob3VsZFxuICogc2tpcCBjYWNoaW5nIGVudGlyZWx5IGluIHRoYXQgY2FzZSAobm8gTWFzdHJhIG1lbW9yeSB3aXJlZCB1cCkuXG4gKlxuICogVGhlIGlkZW50aXR5IGlzIHBhcnQgb2YgdGhlIGtleSBiZWNhdXNlIGEgY2xpZW50IHBpY2tzIGl0cyBvd24gYHRocmVhZElkYFxuICogKHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciAvIGA/dGhyZWFkSWQ9YCksIHNvIHRoZSBpZCBhbG9uZSBkb2VzIG5vdFxuICogZXN0YWJsaXNoIHdobyBvd25zIHRoZSBHZW5pZSBjb252ZXJzYXRpb24gYmVoaW5kIGl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb252ZXJzYXRpb25DYWNoZUtleShcbiAgc3BhY2VJZDogc3RyaW5nLFxuICB0aHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB1c2VyS2V5OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIXRocmVhZElkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpKS5nZW5lcmF0ZUtleShcbiAgICBbQ09OVkVSU0FUSU9OX0NBQ0hFX05BTUVTUEFDRSwgc3BhY2VJZCwgdGhyZWFkSWRdLFxuICAgIHVzZXJLZXksXG4gICk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgY2FjaGVkIEdlbmllIGNvbnZlcnNhdGlvbiBpZCBmb3IgYChzcGFjZUlkLCB0aHJlYWRJZClgLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBvbiBtaXNzLCBvbiBleHBpcnksIG9yIHdoZW4gdGhlIGNhY2hlIGxheWVyXG4gKiBpcyB1bmhlYWx0aHkgLSBuZXZlciB0aHJvd3MuIFRoZSBUVEwgaXMgcmVuZXdlZCB2aWEgcmUtYHNldGBcbiAqIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCB0dXJuIChzZWUge0BsaW5rIHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZH0pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghY2FjaGVLZXkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgdiA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXQ8c3RyaW5nPihjYWNoZUtleSk7XG4gICAgcmV0dXJuIHYgPz8gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpyZWFkLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUGVyc2lzdCB0aGUgYWN0aXZlIGNvbnZlcnNhdGlvbiBpZCB1bmRlciBgY2FjaGVLZXlgLCByZWZyZXNoaW5nXG4gKiBpdHMgVFRMLiBJZGVtcG90ZW50OyBuby1vcCB3aGVuIGBjYWNoZUtleWAgb3IgYGNvbnZlcnNhdGlvbklkYFxuICogaXMgbWlzc2luZy4gUmUtc2V0dGluZyB0aGUgc2FtZSBrZXkgYWN0cyBhcyBhIHNsaWRpbmcgVFRMOiBldmVyeVxuICogdHVybiB0aGF0IHVzZXMgdGhlIGNvbnZlcnNhdGlvbiBleHRlbmRzIHRoZSB3aW5kb3cgYnkgYW5vdGhlclxuICoge0BsaW5rIENPTlZFUlNBVElPTl9UVExfU0VDfSBzZWNvbmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWQoXG4gIGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjYWNoZUtleSB8fCAhY29udmVyc2F0aW9uSWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuc2V0KGNhY2hlS2V5LCBjb252ZXJzYXRpb25JZCwge1xuICAgICAgdHRsOiBDT05WRVJTQVRJT05fVFRMX1NFQyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6d3JpdGUtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBGb3JjZS1ldmljdCBhIGNhY2hlZCBjb252ZXJzYXRpb24gaWQuIFVzZWQgb24gdGhlIHN0YWxlLWlkIHJlY292ZXJ5IHBhdGguICovXG5hc3luYyBmdW5jdGlvbiBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5kZWxldGUoY2FjaGVLZXkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpkZWxldGUtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTGF6eS1zZWVkIHRoZSBhY3RpdmUgR2VuaWUgYGNvbnZlcnNhdGlvbl9pZGAgZm9yIGBzcGFjZUlkYCBmcm9tXG4gKiB0aGUgY3Jvc3MtcmVxdWVzdCBjYWNoZSBvbnRvIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgLlxuICogTm8tb3Agd2hlbiB0aGUgc2xvdCBpcyBhbHJlYWR5IHBvcHVsYXRlZCAoc3Vic2VxdWVudFxuICogYGFza19nZW5pZWAgY2FsbHMgaW4gdGhlIHNhbWUgdHVybikgc28gd2UgaGl0IHRoZSBjYWNoZSBhdCBtb3N0XG4gKiBvbmNlIHBlciByZXF1ZXN0IHBlciBzcGFjZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIHNwYWNlSWQ6IHN0cmluZyxcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocmVhZENvbnRleHRDb252ZXJzYXRpb25JZChyZXF1ZXN0Q29udGV4dCwgc3BhY2VJZCkpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gYXdhaXQgcmVhZENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgaWYgKGNhY2hlZCkgd3JpdGVDb250ZXh0Q29udmVyc2F0aW9uSWQocmVxdWVzdENvbnRleHQsIHNwYWNlSWQsIGNhY2hlZCk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlX2NoYXJ0IGlucHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEFnZW50LWZhY2luZyBgcHJlcGFyZV9jaGFydGAgaW5wdXQgc2NoZW1hLiBSZXVzZXNcbiAqIHtAbGluayBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hfSAodGhlIGRhdGFzZXQtZHJpdmVuIHBsYW5uZXJcbiAqIGNvbnRyYWN0KSBidXQgc3dhcHMgdGhlIGlubGluZSBgZGF0YWAgZmllbGQgZm9yIGEgR2VuaWVcbiAqIGBzdGF0ZW1lbnRfaWRgIHRoZSB0b29sIHJlc29sdmVzIGludG8gcm93cyBzZXJ2ZXItc2lkZS5cbiAqIGB0aXRsZWAgaXMgbG9vc2VuZWQgdG8gb3B0aW9uYWwgLSB0aGUgcGxhbm5lciBmYWxscyBiYWNrIHRvIGFcbiAqIGdlbmVyaWMgcGxhY2Vob2xkZXIgd2hlbiB0aGUgYWdlbnQgZG9lc24ndCBzdXBwbHkgb25lLlxuICpcbiAqIFNoYXBlZCB0byBtYXRjaCBHZW5pZSdzIHdpcmUgZm9ybSAtIGBzdGF0ZW1lbnRfaWRgIChzbmFrZSlcbiAqIG1pcnJvcnMgYHF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRgIGFuZCB0aGUgYGdldF9zdGF0ZW1lbnRgXG4gKiB0b29sJ3MgaW5wdXQgZmllbGQgbmFtZSwgc28gdGhlIExMTSBvbmx5IGV2ZXIgc2VlcyBvbmVcbiAqIHNwZWxsaW5nIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyLlxuICovXG5jb25zdCBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hID0gY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYVxuICAub21pdCh7IGRhdGE6IHRydWUsIHRpdGxlOiB0cnVlIH0pXG4gIC5leHRlbmQoe1xuICAgIHN0YXRlbWVudF9pZDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEsIFwic3RhdGVtZW50X2lkIGlzIHJlcXVpcmVkXCIpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICBHZW5pZSBcXGBzdGF0ZW1lbnRfaWRcXGAgdG8gY2hhcnQuIFJlYWQgZnJvbVxuICAgICAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIHJldHVybmVkIGJ5XG4gICAgICAgICAgXFxgYXNrX2dlbmllXFxgLlxuICAgICAgICBgKSxcbiAgICAgICksXG4gICAgdGl0bGU6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEuc2hhcGUudGl0bGUub3B0aW9uYWwoKSxcbiAgfSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRvb2wgaWRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogU3VmZml4IGFwcGVuZGVkIHRvIHBlci1zcGFjZSB0b29sIGlkcyB3aGVuIHRoZSBhbGlhcyBpc24ndCB0aGVcbiAqIHdlbGwta25vd24gYGRlZmF1bHRgLiBTaW5nbGUtc3BhY2UgZGVwbG95bWVudHMgZ2V0IHRoZSBiYXJlXG4gKiBuYW1lcyAoYGFza19nZW5pZWAsIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCAuLi4pOyBtdWx0aS1zcGFjZVxuICogZGVwbG95bWVudHMgZ2V0IGBhc2tfZ2VuaWVfPGFsaWFzPmAgZXRjLiBzbyBlYWNoIHNwYWNlJ3MgdG9vbHNcbiAqIHN0YXkgZGlzYW1iaWd1YXRlZCBpbiB0aGUgY2VudHJhbCBhZ2VudCdzIHRvb2wgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGFsaWFzU3VmZml4KGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoYWxpYXMgPT09IERFRkFVTFRfR0VOSUVfQUxJQVMpIHJldHVybiBcIlwiO1xuICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihhbGlhcyk7XG4gIHJldHVybiBzbHVnID8gYF8ke3NsdWd9YCA6IFwiXCI7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwZXItc3BhY2UgdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRHJvcCBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2AgYXR0YWNobWVudHMgZnJvbSBhIHtAbGluayBHZW5pZU1lc3NhZ2V9XG4gKiBiZWZvcmUgaGFuZGluZyBpdCB0byB0aGUgY2VudHJhbCBMTE0uIFRob3NlIGVudHJpZXMgYWxyZWFkeVxuICogc3VyZmFjZSBpbiB0aGUgVUkgYXMgb25lLXRhcCBwaWxscyB2aWEgdGhlIHdyaXRlcidzXG4gKiBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2AgZXZlbnRzIChzZWUgYGNvbGxlY3RTdWdnZXN0aW9uc2Agb24gdGhlXG4gKiBjbGllbnQpOyBpZiB3ZSBsZXQgdGhlbSByaWRlIGJhY2sgaW4gdGhlIHRvb2wgcmVzdWx0IHRoZSBMTE1cbiAqIHRlbmRzIHRvIHF1b3RlIHRoZW0gaW5saW5lIGluIGl0cyBwcm9zZSwgZG91YmxlLXNob3dpbmcgdGhlXG4gKiBzYW1lIHF1ZXN0aW9ucyBhbmQgc3RlcHBpbmcgb24gdGhlIGRlZGljYXRlZCBzdWdnZXN0aW9uIFVJLlxuICogUXVlcnkgLyB0ZXh0IC8gcm93IGF0dGFjaG1lbnRzIGFyZSBwcmVzZXJ2ZWQgc28gdGhlIG1vZGVsIGNhblxuICogc3RpbGwgcmVhZCBgc3RhdGVtZW50X2lkYCwgU1FMLCBhbmQgdGhlIGFuc3dlciB0ZXh0LlxuICovXG5mdW5jdGlvbiBzdHJpcFN1Z2dlc3RlZFF1ZXN0aW9ucyhtZXNzYWdlOiBHZW5pZU1lc3NhZ2UpOiBHZW5pZU1lc3NhZ2Uge1xuICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHM7XG4gIGlmICghYXR0YWNobWVudHMgfHwgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gbWVzc2FnZTtcbiAgY29uc3QgZmlsdGVyZWQgPSBhdHRhY2htZW50cy5maWx0ZXIoKGF0dCkgPT4gIWF0dC5zdWdnZXN0ZWRfcXVlc3Rpb25zKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gYXR0YWNobWVudHMubGVuZ3RoKSByZXR1cm4gbWVzc2FnZTtcbiAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgYXR0YWNobWVudHM6IGZpbHRlcmVkIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXNrR2VuaWVUb29sKG9wdHM6IHsgc3BhY2VJZDogc3RyaW5nOyBhbGlhczogc3RyaW5nOyBoaW50Pzogc3RyaW5nIH0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcywgaGludCB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGFza19nZW5pZSR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIGNvbnN0IGhpbnRMaW5lID0gaGludCA/IGAgKCR7aGludH0pYCA6IFwiXCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICBBc2sgdGhlIEdlbmllIHNwYWNlIFwiJHthbGlhc31cIiR7aGludExpbmV9IE9ORSBmb2N1c2VkXG4gICAgICBuYXR1cmFsLWxhbmd1YWdlIHN1Yi1xdWVzdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHR1cm4gdG9cbiAgICAgIGNvbXBsZXRlLiBHZW5pZSBhbnN3ZXJzIGJlc3Qgd2hlbiBlYWNoIGNhbGwgY292ZXJzIGFcbiAgICAgIHNpbmdsZSBtZXRyaWMgLyBkaW1lbnNpb24gLyB0aW1lIHdpbmRvdywgc28gZXhwZWN0IHRvXG4gICAgICBjYWxsIHRoaXMgdG9vbCBNVUxUSVBMRSBUSU1FUyBwZXIgdXNlciB0dXJuICh0eXBpY2FsbHlcbiAgICAgIHR3byB0byBzaXgpIGFuZCBsZXQgdGhlIHJlc3VsdHMgZnJvbSBlYXJsaWVyIGNhbGxzIGluZm9ybVxuICAgICAgbGF0ZXIgb25lcyAtIHRoYXQncyB0aGUgbm9ybWFsIHBhdHRlcm4sIG5vdCB0aGUgZXhjZXB0aW9uLlxuICAgICAgRG8gTk9UIHRyeSB0byBjcmFtIGEgbXVsdGktcGFydCBxdWVzdGlvbiBpbnRvIGEgc2luZ2xlXG4gICAgICBjYWxsOyBkZWNvbXBvc2UgZmlyc3QsIHRoZW4gYXNrIGVhY2ggcGllY2UuXG5cbiAgICAgIFJldHVybnMgdGhlIGZpbmFsIFxcYEdlbmllTWVzc2FnZVxcYC4gUm93cyBhcmUgTk9UIGluY2x1ZGVkIC1cbiAgICAgIHRoZSBHZW5pZSB3aXJlIHJlc3BvbnNlIGNhcnJpZXMgdGhlIFxcYHN0YXRlbWVudF9pZFxcYCBmb3IgYW55XG4gICAgICBTUUwgdGhhdCByYW4gKGF0IFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvciB0aGVcbiAgICAgIGZpcnN0IGF0dGFjaG1lbnQncyBcXGBxdWVyeS5zdGF0ZW1lbnRfaWRcXGApOyBjYWxsXG4gICAgICBcXGBnZXRfc3RhdGVtZW50XFxgIHdpdGggdGhhdCBpZCBvbmx5IHdoZW4geW91IG5lZWQgdG8gcmVhZFxuICAgICAgdGhlIHVuZGVybHlpbmcgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtLiBJZiB5b3UganVzdFxuICAgICAgd2FudCB0byBkaXNwbGF5IHRoZSByb3dzIHRvIHRoZSB1c2VyLCBlbWJlZCBhXG4gICAgICBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyIGluIHlvdXIgcHJvc2UgaW5zdGVhZCAtXG4gICAgICB0aGUgaG9zdCBVSSBmZXRjaGVzIGFuZCByZW5kZXJzIHRoZSByb3dzIG9uIGl0cyBvd24uIFdpcmVcbiAgICAgIGV2ZW50cyAoc3RhdHVzLCB0aGlua2luZywgc3FsKSBzdHJlYW0gdG8gdGhlIHVzZXJcbiAgICAgIGF1dG9tYXRpY2FsbHkgd2hpbGUgdGhlIGNhbGwgaXMgaW4gZmxpZ2h0LlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBxdWVzdGlvbjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm1pbigxLCBcInF1ZXN0aW9uIGlzIHJlcXVpcmVkXCIpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBPTkUgZm9jdXNlZCBuYXR1cmFsLWxhbmd1YWdlIHF1ZXN0aW9uIGFib3V0IHRoZSBkYXRhIGluIHRoaXNcbiAgICAgICAgICAgIHNwYWNlLCBjb3ZlcmluZyBhIHNpbmdsZSBtZXRyaWMgLyBkaW1lbnNpb24gLyB0aW1lIHdpbmRvd1xuICAgICAgICAgICAgKGUuZy4gXCJXaGF0IHdhcyBRMyByZXZlbnVlIGJ5IHJlZ2lvbj9cIikuIERlY29tcG9zZSBhXG4gICAgICAgICAgICBtdWx0aS1wYXJ0IGFzayBpbnRvIHNlcGFyYXRlIGNhbGxzIHJhdGhlciB0aGFuIGNvbWJpbmluZyBpdFxuICAgICAgICAgICAgaGVyZS5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2U6IGdlbmllTW9kZWwuR2VuaWVNZXNzYWdlU2NoZW1hLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHF1ZXN0aW9uIH0sIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQsIHJlcXVlc3RDb250ZXh0IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGN0eD8ud3JpdGVyO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIEJvdW5jZSBwbGFjZWhvbGRlciAvIG5vLW9wIHF1ZXN0aW9ucyBCRUZPUkUgc3BlbmRpbmcgYSBHZW5pZVxuICAgICAgLy8gcm91bmQtdHJpcCBvbiB0aGVtLiBHZW5pZSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICAgICAgLy8gcmVxdWVzdCAnbm9vcCcgZG9lcyBub3QgcmVsYXRlIHRvLi4uXCIgLSB1c2VsZXNzIG5vaXNlIHRoYXRcbiAgICAgIC8vIHNob3dzIHVwIGluIHRoZSBVSSBhbmQgZWF0cyBvbmUgb2YgdGhlIHdvcmtzcGFjZSdzIDVcbiAgICAgIC8vIHF1ZXN0aW9ucy9taW51dGUuIFJldHVybmluZyBhIGNsZWFyIGVycm9yIGhlcmUgc3VyZmFjZXMgdGhlXG4gICAgICAvLyBpc3N1ZSB0byB0aGUgYWdlbnQgbG9vcCBzbyB0aGUgbW9kZWwgY29ycmVjdHMgY291cnNlIGluc3RlYWRcbiAgICAgIC8vIG9mIHdhc3RpbmcgYSB0dXJuLlxuICAgICAgY29uc3QgdHJpbW1lZCA9IHF1ZXN0aW9uLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCBQTEFDRUhPTERFUl9RVUVTVElPTlMuaGFzKHRyaW1tZWQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgICAgICBgJHt0b29sSWR9LnF1ZXN0aW9uYCxcbiAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICBcImEgcmVhbCBuYXR1cmFsLWxhbmd1YWdlIHF1ZXN0aW9uLCBub3QgYSBwbGFjZWhvbGRlcjsgc2tpcCB0aGUgY2FsbCBpbnN0ZWFkXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlZWQgdGhlIGFjdGl2ZSBHZW5pZSBgY29udmVyc2F0aW9uX2lkYCBvbnRvIGBSZXF1ZXN0Q29udGV4dGBcbiAgICAgIC8vIGZyb20gdGhlIGNyb3NzLXJlcXVlc3QgY2FjaGUgd2hlbiBhIE1hc3RyYSBgdGhyZWFkSWRgIGlzXG4gICAgICAvLyBwcmVzZW50IHNvIG11bHRpLXR1cm4gY2hhdHMgcmV1c2UgdGhlIHNhbWUgR2VuaWUgY29udmVyc2F0aW9uXG4gICAgICAvLyAoYW5kIEdlbmllJ3MgYWNjdW11bGF0ZWQgY29udGV4dCkgYWNyb3NzIHNlcGFyYXRlIHVzZXIgdHVybnMuXG4gICAgICAvLyBUaGUgc2FtZSBgUmVxdWVzdENvbnRleHRgIGlzIHJldXNlZCBhY3Jvc3MgZXZlcnkgYGFza19nZW5pZWBcbiAgICAgIC8vIGNhbGwgd2l0aGluIG9uZSB1c2VyIHR1cm4sIHNvIGBlbnN1cmVDb252ZXJzYXRpb25TZWVkZWRgXG4gICAgICAvLyBoaXRzIHRoZSBjYWNoZSBhdCBtb3N0IG9uY2UgcGVyIHJlcXVlc3QgcGVyIHNwYWNlLlxuICAgICAgY29uc3QgY2FjaGVLZXkgPSBhd2FpdCBjb252ZXJzYXRpb25DYWNoZUtleShcbiAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgIHJlc29sdmVVc2VyS2V5KHJlcXVlc3RDb250ZXh0KSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBlbnN1cmVDb252ZXJzYXRpb25TZWVkZWQocmVxdWVzdENvbnRleHQsIHNwYWNlSWQsIGNhY2hlS2V5KTtcblxuICAgICAgLy8gRmlyZSB0aGUgbGlmZWN5Y2xlIGBzdGFydGVkYCBldmVudCBiZWZvcmUgYW55IExMTSAvXG4gICAgICAvLyBuZXR3b3JrIHJvdW5kLXRyaXAgc28gdGhlIGhvc3QgVUkgY2FuIHBvcCBhIFwiVGhpbmtpbmcuLi5cIlxuICAgICAgLy8gcGlsbCB0aGUgaW5zdGFudCB0aGUgbW9kZWwgZGVjaWRlcyB0byBkZWxlZ2F0ZS5cbiAgICAgIGNvbnN0IHN0YXJ0ZWRFdmVudDogU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInN0YXJ0ZWRcIixcbiAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgY29udGVudDogcXVlc3Rpb24sXG4gICAgICB9O1xuICAgICAgYXdhaXQgc2FmZVdyaXRlKGxvZ2dlciwgd3JpdGVyLCBzdGFydGVkRXZlbnQpO1xuXG4gICAgICAvLyBTaW5nbGUgdHVybiBvZiBgZ2VuaWVFdmVudENoYXRgLiBIb2lzdGVkIGludG8gYSBjbG9zdXJlIHNvXG4gICAgICAvLyB3ZSBjYW4gcmUtcnVuIGl0IGFmdGVyIGV2aWN0aW5nIGEgc3RhbGUgYGNvbnZlcnNhdGlvbl9pZGBcbiAgICAgIC8vIHdpdGhvdXQgZHVwbGljYXRpbmcgdGhlIGV2ZW50LWxvb3AgYm9keS5cbiAgICAgIGNvbnN0IHJ1blR1cm4gPSBhc3luYyAoKTogUHJvbWlzZTxHZW5pZU1lc3NhZ2U+ID0+IHtcbiAgICAgICAgY29uc3Qgc2VlZENvbnZlcnNhdGlvbklkID0gcmVhZENvbnRleHRDb252ZXJzYXRpb25JZChyZXF1ZXN0Q29udGV4dCwgc3BhY2VJZCk7XG4gICAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBjaGF0LmdlbmllRXZlbnRDaGF0KHNwYWNlSWQsIHF1ZXN0aW9uLCB7XG4gICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgICAgLi4uKHNlZWRDb252ZXJzYXRpb25JZCA/IHsgY29udmVyc2F0aW9uSWQ6IHNlZWRDb252ZXJzYXRpb25JZCB9IDoge30pLFxuICAgICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgICB9KSkge1xuICAgICAgICAgIGlmIChldmVudC50eXBlICE9PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgYXdhaXQgc2FmZVdyaXRlKGxvZ2dlciwgd3JpdGVyLCBldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV2ZW50Q29udmVyc2F0aW9uSWQgPSBldmVudC5jb252ZXJzYXRpb25faWQ7XG4gICAgICAgICAgaWYgKGV2ZW50Q29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgIHdyaXRlQ29udGV4dENvbnZlcnNhdGlvbklkKHJlcXVlc3RDb250ZXh0LCBzcGFjZUlkLCBldmVudENvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzdWx0XCIpIHtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGV2ZW50Lm1lc3NhZ2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZmluYWxNZXNzYWdlKSB7XG4gICAgICAgICAgdGhyb3cgRXhlY3V0aW9uRXJyb3IubWlzc2luZ0RhdGEoXCJHZW5pZSByZXN1bHQgZXZlbnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsTWVzc2FnZTtcbiAgICAgIH07XG5cbiAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbmFsTWVzc2FnZSA9IGF3YWl0IHJ1blR1cm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBUaGUgc2VlZGVkIGBjb252ZXJzYXRpb25faWRgIHdhcyByZWplY3RlZCBieSBHZW5pZSAtIG1vc3RcbiAgICAgICAgLy8gY29tbW9ubHkgYmVjYXVzZSBpdCB3YXMgZGVsZXRlZCB1cHN0cmVhbSwgZXhwaXJlZCBwYXN0XG4gICAgICAgIC8vIERhdGFicmlja3MnICh1bmRvY3VtZW50ZWQpIGxpZmV0aW1lLCBvciB3YXMgbWludGVkIGluIGFcbiAgICAgICAgLy8gZGlmZmVyZW50IHNwYWNlLiBEcm9wIGJvdGggdGhlIGNhY2hlZCBpZCBBTkQgdGhlXG4gICAgICAgIC8vIHBlci1yZXF1ZXN0IHZhbHVlIHNvIHRoZSByZXRyeSBjYWxscyBgc3RhcnRDb252ZXJzYXRpb25gLFxuICAgICAgICAvLyBhbmQgdHJ5IG9uY2UgbW9yZS4gT25seSByZXRyeSB3aGVuIHdlICpoYWQqIGEgc2VlZGVkIGlkIC1cbiAgICAgICAgLy8gYSBmcmVzaCBjYWxsIHRoYXQgNDA0cyBzaG91bGRuJ3QgbG9vcC5cbiAgICAgICAgY29uc3Qgc2VlZGVkID0gcmVhZENvbnRleHRDb252ZXJzYXRpb25JZChyZXF1ZXN0Q29udGV4dCwgc3BhY2VJZCk7XG4gICAgICAgIGlmIChzZWVkZWQgJiYgZXJyb3IuZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOnN0YWxlLCByZXNldHRpbmdcIiwge1xuICAgICAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiBzZWVkZWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgZXZpY3RDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleSk7XG4gICAgICAgICAgd3JpdGVDb250ZXh0Q29udmVyc2F0aW9uSWQocmVxdWVzdENvbnRleHQsIHNwYWNlSWQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgZmluYWxNZXNzYWdlID0gYXdhaXQgcnVuVHVybigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZWZyZXNoIHRoZSBjYWNoZSBlbnRyeSBvbiBldmVyeSBzdWNjZXNzZnVsIHR1cm4uIFJlLXNldHRpbmdcbiAgICAgIC8vIHRoZSBzYW1lIGtleSBib3RoIHBlcnNpc3RzIG5ld2x5LW1pbnRlZCBpZHMgKGNhY2hlIG1pc3MgcGF0aClcbiAgICAgIC8vIGFuZCBleHRlbmRzIHRoZSBUVEwgb24gYWN0aXZlIGNvbnZlcnNhdGlvbnMgKHNsaWRpbmcgd2luZG93KS5cbiAgICAgIGF3YWl0IHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleSwgcmVhZENvbnRleHRDb252ZXJzYXRpb25JZChyZXF1ZXN0Q29udGV4dCwgc3BhY2VJZCkpO1xuXG4gICAgICByZXR1cm4geyBtZXNzYWdlOiBzdHJpcFN1Z2dlc3RlZFF1ZXN0aW9ucyhmaW5hbE1lc3NhZ2UpIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhY2VEZXNjcmlwdGlvblRvb2wob3B0czogeyBzcGFjZUlkOiBzdHJpbmc7IGFsaWFzOiBzdHJpbmcgfSkge1xuICBjb25zdCB7IHNwYWNlSWQsIGFsaWFzIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgR2VuaWUgc3BhY2UgXCIke2FsaWFzfVwiJ3MgdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmRcbiAgICAgIHdhcmVob3VzZSBpZC4gQ2hlYXAgKHNpbmdsZSBSRVNUIGNhbGwsIG5vIExMTSByb3VuZC10cmlwKS5cbiAgICAgIENhbGwgdGhpcyBGSVJTVCBvbiBhbnkgdXNlciB0dXJuIHRoYXQncyBnb2luZyB0byB0b3VjaFxuICAgICAgXFxgYXNrX2dlbmllXFxgLCB1bmxlc3MgdGhlIHNhbWUgZGVzY3JpcHRpb24gYWxyZWFkeSBsYW5kZWRcbiAgICAgIGVhcmxpZXIgaW4gdGhpcyBjb252ZXJzYXRpb24gLSB0aGUgdGl0bGUgKyBkZXNjcmlwdGlvbiB0ZWxsXG4gICAgICB5b3Ugd2hhdCB0YWJsZXMsIG1ldHJpY3MsIGFuZCB0aW1lIHdpbmRvd3MgdGhlIHNwYWNlXG4gICAgICBhY3R1YWxseSBjb3ZlcnMsIHdoaWNoIGlzIHdoYXQgbGV0cyB5b3UgZGVjb21wb3NlIHRoZVxuICAgICAgdXNlcidzIHF1ZXN0aW9uIGludG8gdGhlIHJpZ2h0IFxcYGFza19nZW5pZVxcYCBzdWItcXVlc3Rpb25zLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7fSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzcGFjZUlkOiB6LnN0cmluZygpLFxuICAgICAgdGl0bGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICB3YXJlaG91c2VJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIFJvdXRlIHRocm91Z2ggdGhlIHBhY2thZ2UncyBjZW50cmFsIEdlbmllIHNwYWNlIGZldGNoLiBUaGVcbiAgICAgIC8vIGRlc2NyaXB0aW9uIHN1cmZhY2UgKHRpdGxlIC8gZGVzY3JpcHRpb24gLyB3YXJlaG91c2UgaWQpIGxpdmVzXG4gICAgICAvLyBvbiB0aGUgZGlyZWN0b3J5LWxpc3Rpbmcgc2hhcGUsIHNvIHNraXAgdGhlIGxhcmdlclxuICAgICAgLy8gYHNlcmlhbGl6ZWRfc3BhY2VgIHBheWxvYWQgaGVyZS5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIHNlcmlhbGl6ZWQ6IGZhbHNlLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgLi4uKHNwYWNlLnRpdGxlID8geyB0aXRsZTogc3BhY2UudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwYWNlLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogc3BhY2UuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwYWNlLndhcmVob3VzZV9pZCA/IHsgd2FyZWhvdXNlSWQ6IHNwYWNlLndhcmVob3VzZV9pZCB9IDoge30pLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTcGFjZVNlcmlhbGl6ZWRUb29sKG9wdHM6IHsgc3BhY2VJZDogc3RyaW5nOyBhbGlhczogc3RyaW5nIH0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGdldF9zcGFjZV9zZXJpYWxpemVkJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgZnVsbCBcXGBHZW5pZVNwYWNlXFxgIEpTT04gZm9yIHRoZSBcIiR7YWxpYXN9XCIgc3BhY2UuXG4gICAgICBVc2Ugb25seSB3aGVuIHlvdSBuZWVkIGV4YWN0IGNvbHVtbiAvIHRhYmxlIGlkZW50aWZpZXJzXG4gICAgICBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgZG9lc24ndCBleHBvc2UuIExhcmdlciBwYXlsb2FkLCBzb1xuICAgICAgcHJlZmVyIHRoZSBkZXNjcmlwdGlvbiB0b29sIHdoZW4gaXQncyBlbm91Z2guXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHt9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHsgc3BhY2U6IHoudW5rbm93bigpIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIENlbnRyYWwgR2VuaWUgc3BhY2UgZmV0Y2ggd2l0aCB0aGUgb3B0LWluIGBzZXJpYWxpemVkX3NwYWNlYFxuICAgICAgLy8gYmxvYiAoY2F0YWxvZ3MsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cykgdGhhdCB0aGVcbiAgICAgIC8vIHR5cGVkIFNESyBgZ2V0U3BhY2VgIG9taXRzIC0gdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgdG9vbC5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBzcGFjZSB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2hhcmVkIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgcm93IGNhcCBmb3Ige0BsaW5rIGJ1aWxkR2V0U3RhdGVtZW50VG9vbH0gd2hlbiB0aGUgYWdlbnRcbiAqIGRvZXNuJ3Qgc3VwcGx5IGEgYGxpbWl0YC4gU2l6ZWQgdG8ga2VlcCByZXN1bHQgc2V0cyBvdXQgb2YgdGhlXG4gKiBtb2RlbCBjb250ZXh0IHVubGVzcyB0aGUgYWdlbnQgZXhwbGljaXRseSBvcHRzIGludG8gbW9yZSByb3dzIC1cbiAqIHRoZSBjaGVhcCBzaGFwZSAoY29sdW1uIG5hbWVzICsgYSBoYW5kZnVsIG9mIHJlcHJlc2VudGF0aXZlXG4gKiByb3dzKSBpcyB1c3VhbGx5IGVub3VnaCB0byByZWFzb24gYWJvdXQgYSBxdWVyeS5cbiAqL1xuY29uc3QgREVGQVVMVF9TVEFURU1FTlRfTElNSVQgPSA1MDtcblxuZnVuY3Rpb24gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCkge1xuICBjb25zdCB0b29sSWQgPSBcImdldF9zdGF0ZW1lbnRcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIEZldGNoIHRoZSByb3dzIG9mIGEgR2VuaWUgc3RhdGVtZW50IGJ5IGl0cyBcXGBzdGF0ZW1lbnRfaWRcXGAgKHRoZVxuICAgICAgdmFsdWUgYXQgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIG9yXG4gICAgICBcXGBtZXNzYWdlLmF0dGFjaG1lbnRzWypdLnF1ZXJ5LnN0YXRlbWVudF9pZFxcYCByZXR1cm5lZCBmcm9tXG4gICAgICBcXGBhc2tfZ2VuaWVcXGApLiBVc2UgdGhpcyBPTkxZIHdoZW4geW91IG5lZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZ1xuICAgICAgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtIGluIHlvdXIgcmVwbHkgLSBlLmcuIG5hbWluZyB0aGVcbiAgICAgIGxhcmdlc3Qgcm93LCBjb21wdXRpbmcgYSBkZWx0YSB0aGUgdmlzdWFsaXphdGlvbiB3b3VsZG4ndCBhbHJlYWR5XG4gICAgICBjb252ZXksIG9yIGZpbHRlcmluZyBkb3duIHRvIGEgc3BlY2lmaWMgcmVjb3JkLiBJZiB5b3UnZCBqdXN0IGJlXG4gICAgICByZWNpdGluZyBudW1iZXJzIHRoZSB1c2VyIHdpbGwgc2VlIGFueXdheSwgc2tpcCB0aGUgY2FsbCBhbmRcbiAgICAgIGVtYmVkIGEgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIG1hcmtlciBpbiB5b3VyIHByb3NlIGluc3RlYWQ7XG4gICAgICB0aGUgaG9zdCBVSSBmZXRjaGVzIGFuZCByZW5kZXJzIHRoZSByb3dzIG9uIGl0cyBvd24uIFxcYGxpbWl0XFxgXG4gICAgICBjYXBzIHRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZCAoZGVmYXVsdHMgdG9cbiAgICAgICR7REVGQVVMVF9TVEFURU1FTlRfTElNSVR9KS4gXFxgcm93Q291bnRcXGAgcmVmbGVjdHMgdGhlIGZ1bGxcbiAgICAgIHVwc3RyZWFtIHRvdGFsIC0gY29tcGFyZSB0byBcXGByb3dzLmxlbmd0aFxcYCB0byBkZXRlY3QgdHJ1bmNhdGlvbi5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3RhdGVtZW50X2lkOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAubWluKDEsIFwic3RhdGVtZW50X2lkIGlzIHJlcXVpcmVkXCIpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBHZW5pZSBcXGBzdGF0ZW1lbnRfaWRcXGAgd2hvc2Ugcm93cyB0byByZWFkLiBUYWtlIGl0IGZyb21cbiAgICAgICAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgb24gYW5cbiAgICAgICAgICAgIFxcYGFza19nZW5pZVxcYCByZXN1bHQ7IGl0IGlzIG5ldmVyIGEgdmFsdWUgeW91IGNvbnN0cnVjdC5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIGxpbWl0OiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAuaW50KClcbiAgICAgICAgLm5vbm5lZ2F0aXZlKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4IHJvd3MgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byBhIHNtYWxsIHNhbXBsZTsgcmFpc2Ugb25seSB3aGVuIG1vcmUgcm93cyBhcmUgZ2VudWluZWx5IG5lZWRlZC5cIixcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbHVtbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gICAgICByb3dzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSksXG4gICAgICByb3dDb3VudDogei5udW1iZXIoKSxcbiAgICAgIHRydW5jYXRlZDogei5ib29sZWFuKCksXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKHsgc3RhdGVtZW50X2lkLCBsaW1pdCB9LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICBjb25zdCBlZmZlY3RpdmVMaW1pdCA9IGxpbWl0ID8/IERFRkFVTFRfU1RBVEVNRU5UX0xJTUlUO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoU3RhdGVtZW50RGF0YShjbGllbnQsIHN0YXRlbWVudF9pZCwge1xuICAgICAgICBsaW1pdDogZWZmZWN0aXZlTGltaXQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBkYXRhLmNvbHVtbnMsXG4gICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgcm93Q291bnQ6IGRhdGEucm93Q291bnQsXG4gICAgICAgIHRydW5jYXRlZDogZGF0YS5yb3dzLmxlbmd0aCA8IGRhdGEucm93Q291bnQsXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIGBwcmVwYXJlX2NoYXJ0YCBNYXN0cmEgdG9vbC4gVGhpbiB3cmFwcGVyIG92ZXJcbiAqIHtAbGluayBwcmVwYXJlQ2hhcnR9IHRoYXQgcmVzb2x2ZXMgdGhlIGRhdGFzZXQgYnkgZmV0Y2hpbmcgdGhlXG4gKiBHZW5pZSBzdGF0ZW1lbnQncyByb3dzIG9uIGRlbWFuZC4gVGhlIHRvb2wgbWludHMgYSBgY2hhcnRJZGBcbiAqIHN5bmNocm9ub3VzbHksIGNhY2hlcyBhbiBlbXB0eSBwbGFjZWhvbGRlciwgYW5kIGtpY2tzIG9mZiB0aGVcbiAqIHBsYW5uZXIgaW4gdGhlIGJhY2tncm91bmQgc28gdGhlIGFnZW50IGxvb3AgbmV2ZXIgYmxvY2tzLiBUaGVcbiAqIGhvc3QgVUkgcmVzb2x2ZXMgYFtjaGFydDo8Y2hhcnRJZD5dYCBtYXJrZXJzIGJ5IHJlYWRpbmcgdGhlXG4gKiBjYWNoZWQge0BsaW5rIENoYXJ0fSBlbnRyeSAoMWggVFRMKS5cbiAqXG4gKiBTcGFjZS1hZ25vc3RpYzogYSBHZW5pZSBgc3RhdGVtZW50X2lkYCBpcyB3b3Jrc3BhY2Utc2NvcGVkLCBzb1xuICogb25lIHNoYXJlZCBgcHJlcGFyZV9jaGFydGAgdG9vbCBjb3ZlcnMgZXZlcnkgd2lyZWQgR2VuaWUgc3BhY2UuXG4gKlxuICogQ2FuY2VsbGF0aW9uOiBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZm9yd2FyZCB0aGUgcGVyLWNhbGxcbiAqIGBhYm9ydFNpZ25hbGAgdG8ge0BsaW5rIHByZXBhcmVDaGFydH0uIFRoZSBwbGFubmVyIHRhc2sgaXNcbiAqIGZpcmUtYW5kLWZvcmdldCBiYWNrZ3JvdW5kIHdvcms7IHRoZSB0b29sJ3Mgb3duIGBleGVjdXRlYFxuICogcmVzb2x2ZXMgdGhlIG1vbWVudCB0aGUgYGNoYXJ0SWRgIGlzIG1pbnRlZCwgc28gdGhlIHBlci1jYWxsXG4gKiBzaWduYWwgYWJvcnRzIHRoZSBzZWNvbmQgdGhlIHRvb2wgcmV0dXJucy4gVGhlIDFoIGNhY2hlIFRUTFxuICogY2FwcyBhYmFuZG9uZWQgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKG9wdHM6IHsgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcgfSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gXCJwcmVwYXJlX2NoYXJ0XCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihbXG4gICAgICBgXG4gICAgICAgIFF1ZXVlIGEgY2hhcnQgZm9yIHRoZSByb3dzIG9mIGEgR2VuaWUgc3RhdGVtZW50LiBNaW50cyBhXG4gICAgICAgIHNob3J0IFxcYGNoYXJ0SWRcXGAgc3luY2hyb25vdXNseSBhbmQga2lja3Mgb2ZmIGEgQkFDS0dST1VORFxuICAgICAgICB0YXNrIHRoYXQgZmV0Y2hlcyB0aGUgc3RhdGVtZW50J3Mgcm93cywgcnVucyB0aGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciB0byBwaWNrIGEgY2hhcnQgdHlwZSBhbmQgRWNoYXJ0cyBzcGVjLCBhbmRcbiAgICAgICAgY2FjaGVzIHRoZSByZXN1bHQgdW5kZXIgdGhlIFxcYGNoYXJ0SWRcXGAgZm9yIG9uZSBob3VyLiBUaGVcbiAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgY2hhcnQgb24gaXRzIG93biBvbmNlIGl0IGxhbmRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVG8gZGlzcGxheSB0aGUgY2hhcnQgaW4geW91ciByZXBseSwgZW1iZWRcbiAgICAgICAgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgb24gaXRzIG93biBsaW5lIGF0IHRoZSBwb3NpdGlvbiB5b3VcbiAgICAgICAgd2FudCBpdCB0byBhcHBlYXIsIHVzaW5nIHRoZSBFWEFDVCBcXGBjaGFydElkXFxgIHN0cmluZyB0aGlzXG4gICAgICAgIGNhbGwgcmV0dXJuZWQuIE5ldmVyIGNvbnN0cnVjdCBhIGNoYXJ0IGlkIHlvdXJzZWxmIChpdCBpc1xuICAgICAgICBub3QgdGhlIFxcYHN0YXRlbWVudF9pZFxcYCBvciBhbnkgdmFyaWF0aW9uIG9mIGl0KSAtIG9ubHkgYVxuICAgICAgICB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIHRvb2wgcmVzb2x2ZXMgdG8gYSByZWFsIGNoYXJ0LiBUaGVcbiAgICAgICAgdG9vbCByZXR1cm5zIGltbWVkaWF0ZWx5IC0gZG8gTk9UIHdhaXQgb3IgY2FsbCBpdCBhZ2FpbiB0b1xuICAgICAgICBcImNoZWNrIHByb2dyZXNzXCI7IHRoZSBjaGFydCByZXNvbHZlcyBhc3luY2hyb25vdXNseSBvbiB0aGVcbiAgICAgICAgaG9zdCBVSSdzIHNpZGUuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2UgdGhpcyBvbmx5IHdoZW4gdGhlIGRhdGEgaGFzIGEgc3RvcnkgYSBjaGFydCBjb252ZXlzXG4gICAgICAgIGJldHRlciB0aGFuIGEgdGFibGUgKHRyZW5kcywgcmFua2luZ3MsIGRpc3RyaWJ1dGlvbnMsXG4gICAgICAgIHBhcnRzLW9mLWEtd2hvbGUpLiBGb3IgcmF3IHJvd3MsIGVtYmVkXG4gICAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCBpbnN0ZWFkIGFuZCBza2lwIHRoaXMgdG9vbC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IHByZXBhcmVDaGFydFJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiB3aXJlLkNoYXJ0U2NoZW1hLnBpY2soeyBjaGFydElkOiB0cnVlIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChyZXF1ZXN0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICByZXR1cm4gcHJlcGFyZUNoYXJ0KHtcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB1c2VyS2V5OiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIC4uLihyZXF1ZXN0LnRpdGxlID8geyB0aXRsZTogcmVxdWVzdC50aXRsZSB9IDoge30pLFxuICAgICAgICAuLi4ocmVxdWVzdC5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHJlcXVlc3QuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgcmVzb2x2ZURhdGE6ICh0YXNrU2lnbmFsKSA9PlxuICAgICAgICAgIGZldGNoU3RhdGVtZW50RGF0YShjbGllbnQsIHJlcXVlc3Quc3RhdGVtZW50X2lkLCB7XG4gICAgICAgICAgICAuLi4odGFza1NpZ25hbCA/IHsgc2lnbmFsOiB0YXNrU2lnbmFsIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIC4uLihjdHg/LnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogY3R4LnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG9yY2hlc3RyYXRpb24gcHJvbXB0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFN1Z2dlc3RlZCBvcmNoZXN0cmF0aW9uIHByb21wdCBmb3IgdGhlIGNlbnRyYWwgYWdlbnQgdGhhdCBvd25zXG4gKiB0aGUgR2VuaWUgdG9vbHMuIENvbXBvc2UgaW50byB5b3VyIGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG9cbiAqIGdldCB0aGUgY2Fub25pY2FsIFwiZGVjb21wb3NlIHF1ZXN0aW9ucywgYXNrIEdlbmllIGZvY3VzZWRcbiAqIHN1Yi1xdWVzdGlvbnMsIHBsYWNlIGRhdGEgLyBjaGFydCBtYXJrZXJzIGluIHByb3NlXCIgYmVoYXZpb3I6XG4gKlxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBgJHtteUFnZW50SW5zdHJ1Y3Rpb25zfVxcblxcbiR7R0VOSUVfSU5TVFJVQ1RJT05TfWAsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi5wbHVnaW5zLmdlbmllPy50b29sa2l0KCkgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHByb21wdCByZWZlcmVuY2VzIHRoZSBiYXJlIHRvb2wgbmFtZXMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGAsXG4gKiBgZ2V0X3N0YXRlbWVudGAsIGBwcmVwYXJlX2NoYXJ0YCkgdXNlZCBmb3IgdGhlIHNpbmdsZS1zcGFjZVxuICogZGVmYXVsdCBhbGlhcy4gTXVsdGktc3BhY2UgZGVwbG95bWVudHMgc2hvdWxkIHdyaXRlIHRoZWlyIG93blxuICogdmFyaWFudCB0aGF0IG5hbWVzIHRoZSBzdWZmaXhlZCBwZXItc3BhY2UgdG9vbHNcbiAqIChlLmcuIGBhc2tfZ2VuaWVfc2FsZXNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdFTklFX0lOU1RSVUNUSU9OUyA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgXCJHZW5pZSBvcmNoZXN0cmF0aW9uLiBGb3IgZXZlcnkgdXNlciBxdWVzdGlvbiB0aGF0IG5lZWRzIFNRTC1iYWNrZWQgZGF0YTpcIixcbiAge1xuICAgIG51bWJlcmVkOiBbXG4gICAgICBgXG4gICAgICAgIFN0YXJ0IGJ5IGNhbGxpbmcgXFxgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uXFxgIHRvIGdyb3VuZCB5b3Vyc2VsZlxuICAgICAgICBpbiB3aGF0IHRoZSBzcGFjZSBjb3ZlcnMgKHRhYmxlcywgbWV0cmljcywgdGltZSB3aW5kb3dzKSxcbiAgICAgICAgdW5sZXNzIHlvdSBhbHJlYWR5IHNhdyB0aGUgc2FtZSBkZXNjcmlwdGlvbiBlYXJsaWVyIGluIHRoaXNcbiAgICAgICAgY29udmVyc2F0aW9uLiBSZWFjaCBmb3IgXFxgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRcXGAgb25seSB3aGVuIHlvdVxuICAgICAgICBuZWVkIGV4YWN0IGNvbHVtbiAvIHRhYmxlIGlkZW50aWZpZXJzIHRoZSBkZXNjcmlwdGlvbiBkb2Vzbid0XG4gICAgICAgIGV4cG9zZSAtIGl0J3MgYSBtdWNoIGxhcmdlciBwYXlsb2FkLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgRGVjb21wb3NlIHRoZSB1c2VyJ3MgcXVlc3Rpb24gaW50byBmb2N1c2VkIHN1Yi1xdWVzdGlvbnNcbiAgICAgICAgQkVGT1JFIGFza2luZyBHZW5pZSBhbnl0aGluZy4gT25lIHN1Yi1xdWVzdGlvbiBwZXIgZGlzdGluY3RcbiAgICAgICAgbWV0cmljLCBkaW1lbnNpb24sIG9yIHRpbWUgd2luZG93LiBUaGVuIGNhbGwgXFxgYXNrX2dlbmllXFxgXG4gICAgICAgIG9uY2UgcGVyIHN1Yi1xdWVzdGlvbiAtIHVzdWFsbHkgdHdvIHRvIHNpeCBjYWxscyBwZXIgdHVybixcbiAgICAgICAgYW5kIGxldCBlYXJsaWVyIGFuc3dlcnMgaW5mb3JtIHdoYXQgeW91IGFzayBuZXh0LiBDcmFtbWluZ1xuICAgICAgICBhIG11bHRpLXBhcnQgcXVlc3Rpb24gaW50byBvbmUgXFxgYXNrX2dlbmllXFxgIGNhbGwgYWxtb3N0XG4gICAgICAgIGFsd2F5cyBwcm9kdWNlcyBhIHdvcnNlIGFuc3dlciB0aGFuIGFza2luZyB0aGUgcGllY2VzXG4gICAgICAgIHNlcGFyYXRlbHkuIE9ubHkgY29sbGFwc2UgdG8gYSBzaW5nbGUgY2FsbCB3aGVuIHRoZSBxdWVzdGlvblxuICAgICAgICBpcyBnZW51aW5lbHkgYXRvbWljIChcIndoYXQgd2FzIFEzIHJldmVudWU/XCIpLlxuXG4gICAgICAgIFdvcmtlZCBleGFtcGxlOiB1c2VyIGFza3MgXCJIb3cgZGlkIFNLVSAxMjM0J3MgcmV2ZW51ZVxuICAgICAgICBjb21wYXJlIHRvIGl0cyBjYXRlZ29yeSBhdmVyYWdlIGxhc3QgcXVhcnRlciwgYW5kIHdoaWNoXG4gICAgICAgIHJlZ2lvbnMgZHJvdmUgdGhlIGdhcD9cIiBEZWNvbXBvc2VzIHRvOiAoYSkgXFxgYXNrX2dlbmllXFxgXG4gICAgICAgIGZvciBTS1UgMTIzNCdzIFEzIHJldmVudWUsIChiKSBcXGBhc2tfZ2VuaWVcXGAgZm9yIHRoZVxuICAgICAgICBjYXRlZ29yeS1hdmVyYWdlIFEzIHJldmVudWUsIChjKSBcXGBhc2tfZ2VuaWVcXGAgZm9yIFNLVVxuICAgICAgICAxMjM0J3MgUTMgcmV2ZW51ZSBzcGxpdCBieSByZWdpb24uIFRocmVlIGZvY3VzZWQgY2FsbHMsXG4gICAgICAgIGVhY2ggZ3JvdW5kZWQgaW4gdGhlIHByaW9yIHJlc3VsdHMuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBFYWNoIFxcYGFza19nZW5pZVxcYCBjYWxsIHJldHVybnMgdGhlIHRlcm1pbmFsIFxcYEdlbmllTWVzc2FnZVxcYC5cbiAgICAgICAgV2hlbiB0aGUgdHVybiByYW4gU1FMIHRoZSByZXN1bHQgaGFzIGEgXFxgc3RhdGVtZW50X2lkXFxgIC0gcmVhZFxuICAgICAgICBpdCBmcm9tIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCAob3IgdGhlIGZpcnN0XG4gICAgICAgIGF0dGFjaG1lbnQncyBcXGBxdWVyeS5zdGF0ZW1lbnRfaWRcXGApLlxuICAgICAgYCxcbiAgICAgIFtcbiAgICAgICAgYFxuICAgICAgICAgIFRvIERJU1BMQVkgYSByZXN1bHQgc2V0IGluIHlvdXIgcmVwbHksIGVtYmVkIGEgbWFya2VyIG9uIGl0c1xuICAgICAgICAgIG93biBsaW5lIHdoZXJlIHRoZSB2aXN1YWxpemF0aW9uIHNob3VsZCBhcHBlYXIuIFR3byBtYXJrZXJcbiAgICAgICAgICBzaGFwZXM6XG4gICAgICAgIGAsXG4gICAgICAgIHtcbiAgICAgICAgICBidWxsZXRzOiBbXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCAtIHJlbmRlciB0aGUgcm93cyBhcyBhIHRhYmxlLlxuICAgICAgICAgICAgICBVc2UgdGhpcyB3aGVuIHRoZXJlJ3Mgbm8gY2xlYXIgdmlzdWFsIHN0b3J5IChsb25nIGxpc3RzLFxuICAgICAgICAgICAgICByZWZlcmVuY2UgZGF0YSwgc2luZ2xlLXJvdyByZXN1bHRzLCBvciB0aGUgdXNlciBqdXN0XG4gICAgICAgICAgICAgIHdhbnRzIHRvIHNlZSB0aGUgZGF0YSkuIEVtYmVkIHRoZSBtYXJrZXIgZGlyZWN0bHk7IG5vXG4gICAgICAgICAgICAgIHRvb2wgY2FsbCBuZWVkZWQuXG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgYFxuICAgICAgICAgICAgICBcXGBbY2hhcnQ6PGNoYXJ0SWQ+XVxcYCAtIHJlbmRlciB0aGUgcm93cyBhcyBhIGNoYXJ0LiBUb1xuICAgICAgICAgICAgICBnZXQgYSBcXGA8Y2hhcnRJZD5cXGAsIGNhbGwgXFxgcHJlcGFyZV9jaGFydFxcYCB3aXRoIHRoZVxuICAgICAgICAgICAgICBzdGF0ZW1lbnQncyBpZCAoYW5kIGFuIG9wdGlvbmFsIFxcYHRpdGxlXFxgIC8gb25lLWxpbmVcbiAgICAgICAgICAgICAgXFxgZGVzY3JpcHRpb25cXGAgb2YgdGhlIGluc2lnaHQgdG8gc3VyZmFjZSkuIFRoZSB0b29sXG4gICAgICAgICAgICAgIHJldHVybnMgdGhlIFxcYGNoYXJ0SWRcXGAgc3luY2hyb25vdXNseSBhbmQgcHJlcGFyZXMgdGhlXG4gICAgICAgICAgICAgIGNoYXJ0IHNwZWMgaW4gdGhlIGJhY2tncm91bmQ7IGVtYmVkIHRoZSByZXR1cm5lZCBpZCBhc1xuICAgICAgICAgICAgICBcXGBbY2hhcnQ6PGNoYXJ0SWQ+XVxcYCBvbiBpdHMgb3duIGxpbmUgd2hlcmV2ZXIgdGhlXG4gICAgICAgICAgICAgIGNoYXJ0IHNob3VsZCBhcHBlYXIuIFVzZSBhIGNoYXJ0IHdoZW4gdGhlIGRhdGEgaGFzIGFcbiAgICAgICAgICAgICAgc3RvcnkgYSB2aXN1YWwgY29udmV5cyBiZXR0ZXIgdGhhbiBhIHRhYmxlICh0cmVuZHMsXG4gICAgICAgICAgICAgIHJhbmtpbmdzLCBkaXN0cmlidXRpb25zLCBwYXJ0cy1vZi1hLXdob2xlKS5cblxuICAgICAgICAgICAgICBORVZFUiBpbnZlbnQgb3IgaGFuZC1idWlsZCBhIFxcYDxjaGFydElkPlxcYC4gQSB2YWxpZFxuICAgICAgICAgICAgICBcXGA8Y2hhcnRJZD5cXGAgaXMgdGhlIG9wYXF1ZSB0b2tlbiBhIFxcYHByZXBhcmVfY2hhcnRcXGBcbiAgICAgICAgICAgICAgY2FsbCByZXR1cm5lZCB0byB5b3UgaW4gVEhJUyB0dXJuIC0gbm90aGluZyBlbHNlLiBJdFxuICAgICAgICAgICAgICBpcyBOT1QgYSBcXGBzdGF0ZW1lbnRfaWRcXGAsIGFuZCBpdCBpcyBOT1QgYVxuICAgICAgICAgICAgICBcXGBzdGF0ZW1lbnRfaWRcXGAgcHJlZml4IHdpdGggYSBsYWJlbCBhcHBlbmRlZCAoZS5nLlxuICAgICAgICAgICAgICBcXGAwMWYxLi4uLXJlZ2lvbi1maWxsXFxgKS4gSWYgeW91IGhhdmUgbm90IGNhbGxlZFxuICAgICAgICAgICAgICBcXGBwcmVwYXJlX2NoYXJ0XFxgIGFuZCByZWNlaXZlZCBhbiBpZCBiYWNrLCBkbyBub3Qgd3JpdGVcbiAgICAgICAgICAgICAgYSBcXGBbY2hhcnQ6Li4uXVxcYCBtYXJrZXIgYXQgYWxsIC0gdXNlIFxcYFtkYXRhOi4uLl1cXGBcbiAgICAgICAgICAgICAgaW5zdGVhZC4gQSBmYWJyaWNhdGVkIGNoYXJ0IGlkIHJlbmRlcnMgbm90aGluZyBhbmRcbiAgICAgICAgICAgICAgd2FzdGVzIGEgcmVxdWVzdC5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgYFxuICAgICAgICAgIFRoZSBob3N0IFVJIHJlc29sdmVzIGJvdGggbWFya2VycyBvbiBpdHMgb3duIG9uY2UgaXQgc2Vlc1xuICAgICAgICAgIHRoZW0gLSB5b3UgZG8gTk9UIG5lZWQgdG8gY2FsbCBcXGBnZXRfc3RhdGVtZW50XFxgIGp1c3QgdG9cbiAgICAgICAgICBkaXNwbGF5IGRhdGEsIGFuZCB5b3UgZG8gTk9UIG5lZWQgdG8gd2FpdCBvblxuICAgICAgICAgIFxcYHByZXBhcmVfY2hhcnRcXGAgKGl0IHJldHVybnMgdGhlIGlkIGltbWVkaWF0ZWx5IGFuZCB0aGVcbiAgICAgICAgICBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBjaGFydCBsYXRlcikuIFBpY2sgYXQgbW9zdCBvbmVcbiAgICAgICAgICBtYXJrZXIgcGVyIHN0YXRlbWVudDsgZG9uJ3QgY2hhcnQgQU5EIHRhYmxlIHRoZSBzYW1lIHJlc3VsdFxuICAgICAgICAgIHNpZGUgYnkgc2lkZS5cbiAgICAgICAgYCxcbiAgICAgIF0sXG4gICAgICBgXG4gICAgICAgIENhbGwgXFxgZ2V0X3N0YXRlbWVudChzdGF0ZW1lbnRfaWQsIGxpbWl0PylcXGAgT05MWSB3aGVuIHlvdSBuZWVkXG4gICAgICAgIHRvIHJlYWQgdGhlIGFjdHVhbCB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gKGUuZy4gbmFtaW5nIGFcbiAgICAgICAgc3BlY2lmaWMgcm93LCBjb21wdXRpbmcgYSBkZWx0YSB0aGUgdGFibGUgb3IgY2hhcnQgd291bGRuJ3RcbiAgICAgICAgc2hvdywgb3Igc2FuaXR5LWNoZWNraW5nIGEgcmVzdWx0IGJlZm9yZSBpbnRlcnByZXRpbmcgaXQpLiBJZlxuICAgICAgICB5b3UnZCBqdXN0IGJlIHJlY2l0aW5nIG51bWJlcnMgdGhlIHZpc3VhbGl6YXRpb24gYWxyZWFkeSBzaG93cyxcbiAgICAgICAgc2tpcCB0aGUgY2FsbCBhbmQgdXNlIGEgbWFya2VyIGluc3RlYWQuIFxcYGxpbWl0XFxgIGRlZmF1bHRzIHRvIGFcbiAgICAgICAgc21hbGwgc2FtcGxlOyByYWlzZSBpdCBvbmx5IHdoZW4geW91IGdlbnVpbmVseSBuZWVkIG1vcmUgcm93cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIENvbXBvc2UgeW91ciBmaW5hbCByZXBseSBhcyBwbGFpbiBwcm9zZS4gSW50ZXJsZWF2ZSBwYXJhZ3JhcGhzXG4gICAgICAgIHdpdGggXFxgW2RhdGE6Li4uXVxcYCAvIFxcYFtjaGFydDouLi5dXFxgIG1hcmtlcnMgd2hlcmV2ZXIgYSByZXN1bHRcbiAgICAgICAgc2hvdWxkIHJlbmRlci4gRG9uJ3QgZHVtcCBhbGwgbWFya2VycyBhdCB0aGUgZW5kIC0gcGxhY2UgZWFjaFxuICAgICAgICBvbmUgbmV4dCB0byB0aGUgcHJvc2UgdGhhdCBpbnRlcnByZXRzIGl0LiBEb24ndCByZXN0YXRlIGV2ZXJ5XG4gICAgICAgIG51bWJlciB0aGUgdmlzdWFsaXphdGlvbiBhbHJlYWR5IHNob3dzOyBjYWxsIG91dCBkZWx0YXMsXG4gICAgICAgIGFub21hbGllcywgdGFrZWF3YXlzLlxuICAgICAgYCxcbiAgICBdLFxuICB9LFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtdWx0aS1hbGlhcyBzdXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUge0BsaW5rIEdlbmllU3BhY2VzQ29uZmlnfSByZWNvcmQuIEJhcmUtc3RyaW5nXG4gKiBlbnRyaWVzIChgeyBkZWZhdWx0OiBcIjAxZWYuLi5cIiB9YCkgZ2V0IHdyYXBwZWQgYXNcbiAqIGB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiIH1gOyBvYmplY3QgZW50cmllcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIHdoZW4gYW4gYWxpYXMgaXMgcHJlc2VudCBidXQgY2FycmllcyBubyBzcGFjZSBpZFxuICogICAoYHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB9YCB3aXRoIHRoZSB2YXJpYWJsZVxuICogICB1bnNldCkuIEFuIGFsaWFzIHRoYXQgcmVzb2x2ZXMgdG8gbm90aGluZyBpcyBhIHdpcmluZyBjb250cmFkaWN0aW9uOiB0aGVcbiAqICAgYWdlbnQgd291bGQgYWR2ZXJ0aXNlIG5vIEdlbmllIHRvb2wgZm9yIGEgc3BhY2UgdGhlIGRlcGxveW1lbnQgYmVsaWV2ZXMgaXRcbiAqICAgY29uZmlndXJlZCwgc28gaXQgZmFpbHMgYXQgY29uc3RydWN0aW9uIGluc3RlYWQgb2YgZ29pbmcgcXVpZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVHZW5pZVNwYWNlcyhcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IEdlbmllU3BhY2VDb25maWcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4ge1xuICBpZiAoIXNwYWNlcykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+ID0ge307XG4gIGZvciAoY29uc3QgW2FsaWFzLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BhY2VzKSkge1xuICAgIGNvbnN0IHNwYWNlSWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlPy5zcGFjZUlkO1xuICAgIGlmICghc3BhY2VJZCkgdGhyb3cgbWlzc2luZ1NwYWNlSWQoYWxpYXMpO1xuICAgIG91dFthbGlhc10gPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB7IHNwYWNlSWQgfSA6IHZhbHVlITtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQ29uZmlnIGNvbnRyYWRpY3Rpb246IGFuIGFsaWFzIHByZXNlbnQgaW4gYGdlbmllU3BhY2VzYCB3aXRoIG5vIHNwYWNlIGlkLiAqL1xuZnVuY3Rpb24gbWlzc2luZ1NwYWNlSWQoYWxpYXM6IHN0cmluZyk6IENvbmZpZ3VyYXRpb25FcnJvciB7XG4gIGNvbnN0IGVudkhpbnQgPVxuICAgIGFsaWFzID09PSBERUZBVUxUX0dFTklFX0FMSUFTXG4gICAgICA/IFwiU2V0IERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQsIHBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSwgb3IgZHJvcCB0aGUgYWxpYXMuXCJcbiAgICAgIDogYFBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSAoREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCBvbmx5IGJhY2tzIHRoZSBcIiR7REVGQVVMVF9HRU5JRV9BTElBU31cIiBhbGlhcykgb3IgZHJvcCB0aGUgYWxpYXMuYDtcbiAgcmV0dXJuIENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKGBnZW5pZVNwYWNlcy4ke2FsaWFzfSBzcGFjZSBpZGAsIGVudkhpbnQpO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgZ2VuaWVgIHBsdWdpbidzIGNvbmZpZyBzaGFwZSwgZGVyaXZlZCBmcm9tIHRoZSBmYWN0b3J5XG4gKiBpdHNlbGYgc28gaXQgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggdGhlIHVwc3RyZWFtIHR5cGUgd2l0aG91dFxuICogZGVlcC1pbXBvcnRpbmcgYElHZW5pZUNvbmZpZ2AgKHdoaWNoIHRoZSBwYWNrYWdlJ3MgdG9wLWxldmVsXG4gKiBiYXJyZWwgZG9lc24ndCBzdXJmYWNlKS4gVGhlIHBsdWdpbidzIGBjb25maWdgIGZpZWxkIGlzXG4gKiBgcHJvdGVjdGVkYCBpbiBUUyBvbmx5OyB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0XG4gKiBwcm9wZXJ0eSBhY2Nlc3MsIHNvIHJlYWRpbmcgb2ZmIHRoZSBpbnN0YW5jZSB3aXRoIGEgc3RydWN0dXJhbFxuICogY2FzdCBpcyBzYWZlLlxuICovXG50eXBlIEFwcEtpdEdlbmllQ29uZmlnID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgZ2VuaWU+WzBdPjtcblxuLyoqXG4gKiBEaXNjb3ZlciBHZW5pZSBzcGFjZSBhbGlhc2VzIGZyb20gZXZlcnkgc3VwcG9ydGVkIHNvdXJjZSBhbmRcbiAqIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSByZWNvcmQuIFByZWNlZGVuY2UgKGhpZ2hlc3QgZmlyc3QpOlxuICpcbiAqICAgMS4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5nZW5pZVNwYWNlc30gb24gdGhlIGBtYXN0cmEoLi4uKWBcbiAqICAgICAgY2FsbC4gRXhwbGljaXQgTWFzdHJhIHdpcmluZyBhbHdheXMgd2lucyBzbyB1c2VycyBjYW5cbiAqICAgICAgb3ZlcnJpZGUgQXBwS2l0J3MgZGVmYXVsdHMgcGVyLWFnZW50LlxuICogICAyLiBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2UuIExldHNcbiAqICAgICAgdXNlcnMga2VlcCB1c2luZyB0aGUgZXhpc3RpbmcgQXBwS2l0IGNvbmZpZyBmb3JtYXRcbiAqICAgICAgKGBnZW5pZSh7IHNwYWNlczogeyBzYWxlczogXCIuLi5cIiwgb3BzOiBcIi4uLlwiIH0gfSlgKVxuICogICAgICB3aXRob3V0IHJlc3RhdGluZyB0aGUgc2FtZSByZWNvcmQgb24gdGhlIE1hc3RyYSBwbHVnaW4uXG4gKiAgICAgIFJlYWQgb2ZmIHRoZSBsaXZlIHBsdWdpbiBpbnN0YW5jZSB2aWEgYSBzdHJ1Y3R1cmFsIGNhc3RcbiAqICAgICAgc2luY2UgYFBsdWdpbi5jb25maWdgIGlzIFRTLXByb3RlY3RlZCAobm90IHJ1bnRpbWUtcHJpdmF0ZSkuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyIChyZWdpc3RlcmVkIHVuZGVyIHRoZVxuICogICAgICB3ZWxsLWtub3duIGBkZWZhdWx0YCBhbGlhcykuIE1hdGNoZXMgdGhlIEFwcEtpdCBgZ2VuaWUoKWBcbiAqICAgICAgcGx1Z2luJ3MgZmFsbGJhY2sgYmVoYXZpb3Igc28gYSBiYXJlIGBtYXN0cmEoKWAgKyBgZ2VuaWUoKWBcbiAqICAgICAgcGFpciBqdXN0IHdvcmtzLlxuICpcbiAqIEFsaWFzZXMgY29sbGlkZSBjbGVhbmx5OiBhIGhpZ2hlci1wcmVjZWRlbmNlIHNvdXJjZSdzIHZhbHVlXG4gKiByZXBsYWNlcyBhIGxvd2VyIG9uZSdzIHdob2xlc2FsZS4gQSBzb3VyY2UgdGhhdCBjb250cmlidXRlcyB6ZXJvXG4gKiBhbGlhc2VzIGlzIHNraXBwZWQ7IGEgc291cmNlIHRoYXQgbmFtZXMgYW4gYWxpYXMgd2l0aG91dCBhIHNwYWNlXG4gKiBpZCBmYWlscyB0aHJvdWdoIHtAbGluayBub3JtYWxpemVHZW5pZVNwYWNlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlR2VuaWVTcGFjZXMoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4gPSB7fTtcblxuICAvLyBTb3VyY2UgMyAobG93ZXN0IHByZWNlZGVuY2UpOiBlbnYgdmFyLlxuICBjb25zdCBlbnZTcGFjZUlkID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRDtcbiAgaWYgKGVudlNwYWNlSWQpIHtcbiAgICBtZXJnZWRbREVGQVVMVF9HRU5JRV9BTElBU10gPSB7IHNwYWNlSWQ6IGVudlNwYWNlSWQgfTtcbiAgfVxuXG4gIC8vIFNvdXJjZSAyOiBBcHBLaXQgYGdlbmllKClgIHBsdWdpbiBpbnN0YW5jZSBjb25maWcuIFVzZSBhXG4gIC8vIHN0cnVjdHVyYWwgY2FzdCAtIGBQbHVnaW4uY29uZmlnYCBpcyBgcHJvdGVjdGVkYCBpbiBUUyBvbmx5LFxuICAvLyBhbmQgdGhlIHJ1bnRpbWUgbGF5b3V0IGlzIHBsYWluIG9iamVjdCBwcm9wZXJ0eSBhY2Nlc3MuXG4gIGNvbnN0IGdlbmllUGx1Z2luID0gcGx1Z2luLmluc3RhbmNlKGNvbnRleHQsIGdlbmllKTtcbiAgaWYgKGdlbmllUGx1Z2luKSB7XG4gICAgY29uc3QgcGx1Z2luU3BhY2VzID0gKGdlbmllUGx1Z2luIGFzIHVua25vd24gYXMgeyBjb25maWc/OiBBcHBLaXRHZW5pZUNvbmZpZyB9KS5jb25maWc/LnNwYWNlcztcbiAgICBpZiAocGx1Z2luU3BhY2VzKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgbm9ybWFsaXplR2VuaWVTcGFjZXMocGx1Z2luU3BhY2VzKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU291cmNlIDEgKGhpZ2hlc3QgcHJlY2VkZW5jZSk6IGV4cGxpY2l0IE1hc3RyYSB3aXJpbmcuXG4gIGlmIChjb25maWcuZ2VuaWVTcGFjZXMpIHtcbiAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgbm9ybWFsaXplR2VuaWVTcGFjZXMoY29uZmlnLmdlbmllU3BhY2VzKSk7XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBmbGF0IE1hc3RyYSB0b29scyByZWNvcmQgZm9yIGV2ZXJ5IGNvbmZpZ3VyZWQgR2VuaWVcbiAqIHNwYWNlLiBUd28gc2hhcmVkLCBzcGFjZS1hZ25vc3RpYyB0b29scyAoYGdldF9zdGF0ZW1lbnRgLFxuICogYHByZXBhcmVfY2hhcnRgKSBhcmUgcmVnaXN0ZXJlZCBvbmNlIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnlcbiAqIHNwYWNlcyBhcmUgd2lyZWQ7IHRoZSBwZXItc3BhY2UgdG9vbHMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGApIGFyZSBzdWZmaXhlZFxuICogd2l0aCBgXzxhbGlhcz5gIGZvciBub24tZGVmYXVsdCBhbGlhc2VzIHNvIG11bHRpLXNwYWNlXG4gKiBkZXBsb3ltZW50cyBzdGF5IGRpc2FtYmlndWF0ZWQuXG4gKlxuICogUmV0dXJucyBhIHJlY29yZCBrZXllZCBieSB0b29sIGlkLCByZWFkeSB0byBzcHJlYWQgaW50byB0aGVcbiAqIGNlbnRyYWwgYEFnZW50YCdzIGB0b29sc2AgbWFwIChvciBzdXJmYWNlZCB2aWEgdGhlXG4gKiBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYCBjYWxsYmFjaykuIFJldHVybnMgYW4gZW1wdHkgcmVjb3JkXG4gKiB3aGVuIGBzcGFjZXNgIHJlc29sdmVzIHRvIHplcm8gZW50cmllcyBzbyB0aGUgY2FsbGVyIGNhbiBzcHJlYWRcbiAqIHNhZmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuaWVUb29scyhvcHRzOiB7XG4gIHNwYWNlczogR2VuaWVTcGFjZXNDb25maWcgfCBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG59KTogTWFzdHJhVG9vbHMge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplR2VuaWVTcGFjZXMob3B0cy5zcGFjZXMpO1xuICBjb25zdCB0b29sczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlVG9vbD4+ID0ge307XG4gIGlmIChPYmplY3Qua2V5cyhub3JtYWxpemVkKS5sZW5ndGggPT09IDApIHJldHVybiB0b29scztcblxuICAvLyBTaGFyZWQsIHNwYWNlLWFnbm9zdGljIHRvb2xzLlxuICB0b29scy5nZXRfc3RhdGVtZW50ID0gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCk7XG4gIHRvb2xzLnByZXBhcmVfY2hhcnQgPSBidWlsZFByZXBhcmVDaGFydFRvb2woeyBjb25maWc6IG9wdHMuY29uZmlnIH0pO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCBzcGFjZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZCkpIHtcbiAgICBjb25zdCBhc2tUb29sID0gYnVpbGRBc2tHZW5pZVRvb2woe1xuICAgICAgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCxcbiAgICAgIGFsaWFzLFxuICAgICAgLi4uKHNwYWNlLmhpbnQgPyB7IGhpbnQ6IHNwYWNlLmhpbnQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkZXNjVG9vbCA9IGJ1aWxkU3BhY2VEZXNjcmlwdGlvblRvb2woeyBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLCBhbGlhcyB9KTtcbiAgICBjb25zdCBzZXJUb29sID0gYnVpbGRTcGFjZVNlcmlhbGl6ZWRUb29sKHsgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCwgYWxpYXMgfSk7XG4gICAgdG9vbHNbYXNrVG9vbC5pZF0gPSBhc2tUb29sO1xuICAgIHRvb2xzW2Rlc2NUb29sLmlkXSA9IGRlc2NUb29sO1xuICAgIHRvb2xzW3NlclRvb2wuaWRdID0gc2VyVG9vbDtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbi8qKlxuICogUGx1Z2luLXRvb2xraXQgYWRhcHRlciBzbyB0aGUgYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWAgbG9va3VwXG4gKiBpbnNpZGUgYW4gYWdlbnQncyBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIHJldHVybnMgdGhlXG4gKiBmbGF0IEdlbmllIHRvb2xzIHJlY29yZCBpbnN0ZWFkIG9mIHRocm93aW5nIG9uIG1pc3NpbmcgcGx1Z2luLlxuICogTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luVG9vbGtpdFByb3ZpZGVyYCBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIob3B0czoge1xuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xufSk6IHtcbiAgdG9vbGtpdChvcHRzPzogdW5rbm93bik6IE1hc3RyYVRvb2xzO1xufSB7XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChfb3B0cz86IHVua25vd24pIHtcbiAgICAgIHJldHVybiBidWlsZEdlbmllVG9vbHMob3B0cyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXJ0ZXIgc3VnZ2VzdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gc3RhcnRlciBzdWdnZXN0aW9ucyBzdXJmYWNlZCB0byB0aGUgY2hhdCBlbXB0eVxuICogc3RhdGUuIFNhbXBsZS1xdWVzdGlvbiBsaXN0cyBjYW4gcnVuIGxvbmcgKDEwKyBvbiBhIGN1cmF0ZWRcbiAqIHNwYWNlKTsgYSBoYW5kZnVsIG9mIG9uZS10YXAgcHJvbXB0cyByZWFkcyBiZXR0ZXIgdGhhbiBhIHdhbGwgb2ZcbiAqIGJ1dHRvbnMuXG4gKi9cbmNvbnN0IFNVR0dFU1RJT05fTElNSVQgPSA2O1xuXG4vKipcbiAqIEhvdyBsb25nIGEgc3BhY2UncyBwYXJzZWQgc2FtcGxlIHF1ZXN0aW9ucyBzdGF5IGNhY2hlZC4gVGhleSdyZVxuICogYXV0aG9yZWQgY29uZmlnIHRoYXQgY2hhbmdlcyByYXJlbHksIGFuZCB0aGUgbG9va3VwIGlzIGFuIGV4dHJhXG4gKiBSRVNUIHJvdW5kLXRyaXAgcGVyIGNoYXQgbW91bnQsIHNvIGEgZmV3IG1pbnV0ZXMgb2YgY2FjaGluZyBrZWVwc1xuICogdGhlIGVtcHR5IHN0YXRlIGluc3RhbnQgb24gcmVsb2FkIHdpdGhvdXQgZ29pbmcgc3RhbGUgZm9yIGxvbmcuXG4gKi9cbmNvbnN0IFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG5cbi8qKiBTcGFjZS1pZCAtPiBjYWNoZWQgc2FtcGxlIHF1ZXN0aW9ucyB3aXRoIGFuIGFic29sdXRlIGV4cGlyeS4gKi9cbmNvbnN0IF9zdWdnZXN0aW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBxdWVzdGlvbnM6IHN0cmluZ1tdOyBleHBpcmVzOiBudW1iZXIgfT4oKTtcblxuLyoqIFJlYWQgYSBzcGFjZSdzIGNhY2hlZCBxdWVzdGlvbnMsIG9yIGB1bmRlZmluZWRgIG9uIG1pc3MgLyBleHBpcnkuICovXG5mdW5jdGlvbiByZWFkU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBfc3VnZ2VzdGlvbkNhY2hlLmdldChzcGFjZUlkKTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGVudHJ5LmV4cGlyZXMgPD0gRGF0ZS5ub3coKSkge1xuICAgIF9zdWdnZXN0aW9uQ2FjaGUuZGVsZXRlKHNwYWNlSWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGVudHJ5LnF1ZXN0aW9ucztcbn1cblxuLyoqIENhY2hlIGEgc3BhY2UncyBwYXJzZWQgcXVlc3Rpb25zIGZvciB7QGxpbmsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVN9LiAqL1xuZnVuY3Rpb24gd3JpdGVTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZDogc3RyaW5nLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIF9zdWdnZXN0aW9uQ2FjaGUuc2V0KHNwYWNlSWQsIHtcbiAgICBxdWVzdGlvbnMsXG4gICAgZXhwaXJlczogRGF0ZS5ub3coKSArIFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGFjcm9zcyBldmVyeSByZXNvbHZlZCBHZW5pZVxuICogc3BhY2UsIGRlZHVwZWQgYW5kIGNhcHBlZC4gRWFjaCBzcGFjZSdzIGBzYW1wbGVfcXVlc3Rpb25zYCBhcmVcbiAqIGZldGNoZWQgb25jZSAoY2FjaGVkIGZvciB7QGxpbmsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVN9KSB2aWFcbiAqIHtAbGluayBnZXRHZW5pZVNwYWNlfSArIHtAbGluayBnZW5pZVNhbXBsZVF1ZXN0aW9uc30sIHRoZW4gbWVyZ2VkIGluXG4gKiBhbGlhcy1pdGVyYXRpb24gb3JkZXIgc28gYSBzaW5nbGUtc3BhY2UgYXBwIHN1cmZhY2VzIHRoYXQgc3BhY2Unc1xuICogcXVlc3Rpb25zIGFuZCBhIG11bHRpLXNwYWNlIGFwcCByb3VuZC10cmlwcyBicmVhZHRoLWZpcnN0IHVwIHRvIHRoZVxuICogY2FwLiBBIHBlci1zcGFjZSBmZXRjaCBmYWlsdXJlIGRlZ3JhZGVzIHRvIFwibm8gcXVlc3Rpb25zIGZvciB0aGF0XG4gKiBzcGFjZVwiIChsb2dnZWQsIG5vdCB0aHJvd24pIHNvIG9uZSB1bnJlYWNoYWJsZSBzcGFjZSBuZXZlciBibGFua3NcbiAqIHRoZSB3aG9sZSBsaXN0LiBSZXR1cm5zIGBbXWAgd2hlbiBubyBzcGFjZXMgYXJlIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyhvcHRzOiB7XG4gIHNwYWNlczogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgbGltaXQ/OiBudW1iZXI7XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBsaW1pdCA9IG9wdHMubGltaXQgPz8gU1VHR0VTVElPTl9MSU1JVDtcbiAgY29uc3QgbWVyZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCB7IHNwYWNlSWQgfSBvZiBPYmplY3QudmFsdWVzKG9wdHMuc3BhY2VzKSkge1xuICAgIGxldCBxdWVzdGlvbnMgPSByZWFkU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQpO1xuICAgIGlmICghcXVlc3Rpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBvcHRzLmNsaWVudCxcbiAgICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGNvbnRleHQ6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBnZW5pZVNwYWNlLmdlbmllU2FtcGxlUXVlc3Rpb25zKHNwYWNlKTtcbiAgICAgICAgd3JpdGVTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZCwgcXVlc3Rpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihcInN1Z2dlc3Rpb25zOmZldGNoLWVycm9yXCIsIHtcbiAgICAgICAgICBzcGFjZUlkLFxuICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXN0aW9ucyA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHF1ZXN0aW9uIG9mIHF1ZXN0aW9ucykge1xuICAgICAgaWYgKHNlZW4uaGFzKHF1ZXN0aW9uKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZChxdWVzdGlvbik7XG4gICAgICBtZXJnZWQucHVzaChxdWVzdGlvbik7XG4gICAgICBpZiAobWVyZ2VkLmxlbmd0aCA+PSBsaW1pdCkgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cbiJdfQ==
@@ -261,4 +261,4 @@ function toEpoch(value) {
261
261
  }
262
262
  return 0;
263
263
  }
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oaXN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1wRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUUzRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMscUVBQXFFO0FBQ3JFLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLDZFQUE2RTtBQUM3RSxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7QUFhekI7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxJQUF3QjtJQUN4RCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUN6QyxRQUFRLEVBQUUsZ0JBQWdCO1FBQzFCLEdBQUcsRUFBRSxZQUFZO0tBQ2xCLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtB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QUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLElBQUksS0FBSyxZQUFZLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRocmVhZCBoaXN0b3J5IGxvYWRlciBleHBvc2VkIGFzIGEgTWFzdHJhIGN1c3RvbSBBUEkgcm91dGUuXG4gKlxuICogQmFja2VkIGVudGlyZWx5IGJ5IG5hdGl2ZSBNYXN0cmE6IGxvb2tzIHVwIHRoZSBhY3RpdmUgYWdlbnQgYnkgaWQsXG4gKiBhc2tzIGl0cyBgTWVtb3J5YCBpbnN0YW5jZSB0byBgcmVjYWxsYCBhIHBhZ2Ugb2YgYE1hc3RyYURCTWVzc2FnZWBzLFxuICogYW5kIGNvbnZlcnRzIHRoZSByZXN1bHQgdG8gQUkgU0RLIFY1IGBVSU1lc3NhZ2VgcyB3aXRoIHRoZSBvZmZpY2lhbFxuICoge0BsaW5rIHRvQUlTZGtWNU1lc3NhZ2VzfSBoZWxwZXIgZnJvbSBgQG1hc3RyYS9haS1zZGsvdWlgLiBObyBkaXJlY3RcbiAqIGRhdGFiYXNlIHJlYWRzLlxuICpcbiAqIFRoZSByb3V0ZSBpcyByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIGhpc3RvcnlSb3V0ZX0gYXMgYSBNYXN0cmFcbiAqIGByZWdpc3RlckFwaVJvdXRlYCBzbyBpdCBzaXRzIGluIHRoZSBzYW1lIGRpc3BhdGNoZXIgcGlwZWxpbmUgYXNcbiAqIHRoZSBzdGFuZGFyZCBhZ2VudCByb3V0ZXMuIFRoYXQgbWVhbnMgdGhlIGBNYXN0cmFTZXJ2ZXJgIGF1dGhcbiAqIG1pZGRsZXdhcmUgKGluIGAuL3NlcnZlci50c2ApIGhhcyBhbHJlYWR5IHBvcHVsYXRlZCBgUmVxdWVzdENvbnRleHRgIHdpdGhcbiAqIGBNQVNUUkFfVEhSRUFEX0lEX0tFWWAgYW5kIGBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZYCBieSB0aGUgdGltZVxuICogdGhlIGhhbmRsZXIgcnVucyAtIG5vIGNvb2tpZSBvciB1c2VyIGxvb2t1cHMgaGFwcGVuIGhlcmUsIGFuZCB0aGVcbiAqIHNlc3Npb24tY29va2llIGxvZ2ljIHN0YXlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGluIGBzZXJ2ZXIudHNgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWFzdHJhQ2xlYXJIaXN0b3J5UmVzcG9uc2UsXG4gIE1hc3RyYUhpc3RvcnlSZXNwb25zZSxcbiAgTWFzdHJhSGlzdG9yeVVJTWVzc2FnZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgdG9BSVNka1Y1TWVzc2FnZXMgfSBmcm9tIFwiQG1hc3RyYS9haS1zZGsvdWlcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYURCTWVzc2FnZSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnQvbWVzc2FnZS1saXN0XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRXaXRoTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9zZXJ2ZXJcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQXBpUm91dGUgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NlcnZlclwiO1xuXG5pbXBvcnQgeyBjbGFtcFBlclBhZ2UsIHBhcnNlSW50UGFyYW0gfSBmcm9tIFwiLi9wYWdpbmF0aW9uXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvaGlzdG9yeVwiKTtcblxuLyoqIERlZmF1bHQgaGlzdG9yeSBwYWdlIHNpemU7IG1hdGNoZXMgdGhlIE1hc3RyYSBzdG9yYWdlIGRlZmF1bHQuICovXG5jb25zdCBERUZBVUxUX1BFUl9QQUdFID0gMjA7XG4vKiogSGFyZCBjYXAgc28gYSBtaXNiZWhhdmluZyBjbGllbnQgY2FuJ3QgZmV0Y2ggdGhlIHdob2xlIHRocmVhZCBhdCBvbmNlLiAqL1xuY29uc3QgTUFYX1BFUl9QQUdFID0gMjAwO1xuXG4vKiogSW5wdXRzIGFjY2VwdGVkIGJ5IHtAbGluayBsb2FkSGlzdG9yeX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRIaXN0b3J5T3B0aW9ucyB7XG4gIGFnZW50OiBBZ2VudDtcbiAgdGhyZWFkSWQ6IHN0cmluZztcbiAgcmVzb3VyY2VJZD86IHN0cmluZztcbiAgcGFnZT86IG51bWJlcjtcbiAgcGVyUGFnZT86IG51bWJlcjtcbiAgLyoqIFdoZW4gdHJ1ZSwgcmV0dXJucyB0aGUgKm9sZGVzdCogcGFnZSBmaXJzdCAoY2hyb25vbG9naWNhbCkuICovXG4gIGFzY2VuZGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmV0Y2ggYSBwYWdlIG9mIFVJLWZvcm1hdHRlZCBtZXNzYWdlcyBmb3IgYSB0aHJlYWQuXG4gKlxuICogVXNlcyB0aGUgYWdlbnQncyByZXNvbHZlZCBgTWVtb3J5YCAoYGdldE1lbW9yeSgpYCkgc28gcGVyLWFnZW50XG4gKiBzdG9yYWdlIG5hbWVzcGFjZXMgKGBtYXN0cmFfPGFnZW50SWQ+YCBzY2hlbWFzKSBhbmQgYW55IGZ1dHVyZVxuICogbWVtb3J5LXNpZGUgZmlsdGVycyBhcHBseSBhdXRvbWF0aWNhbGx5LiBXaGVuIHRoZSBhZ2VudCBoYXMgbm9cbiAqIG1lbW9yeSBjb25maWd1cmVkIHRoZSByZXNwb25zZSBpcyBhIHN1Y2Nlc3NmdWwgZW1wdHkgcGFnZSBzb1xuICogY2FsbGVycyBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSBzdGF0ZWxlc3MgYWdlbnRzLlxuICpcbiAqIFBhZ2luYXRpb24gaXMgZGVzY2VuZGluZy1ieS1kZWZhdWx0OiBwYWdlIDAgaXMgdGhlIG1vc3QgcmVjZW50XG4gKiBwYWdlLCBwYWdlIDEgdGhlIHBhZ2UgYmVmb3JlIHRoYXQsIGV0Yy4gVGhlIHJldHVybmVkIGB1aU1lc3NhZ2VzYFxuICogYXJlIGFsd2F5cyByZS1zb3J0ZWQgaW50byBjaHJvbm9sb2dpY2FsIG9yZGVyIChvbGRlc3QgLT4gbmV3ZXN0KVxuICogc28gdGhlIGNsaWVudCBjYW4gcHJlcGVuZCB0aGVtIGFib3ZlIHRoZSBleGlzdGluZyB0cmFuc2NyaXB0XG4gKiB3aXRob3V0IHNvcnRpbmcgbG9jYWxseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRIaXN0b3J5KG9wdHM6IExvYWRIaXN0b3J5T3B0aW9ucyk6IFByb21pc2U8TWFzdHJhSGlzdG9yeVJlc3BvbnNlPiB7XG4gIGNvbnN0IHBlclBhZ2UgPSBjbGFtcFBlclBhZ2Uob3B0cy5wZXJQYWdlLCB7XG4gICAgZmFsbGJhY2s6IERFRkFVTFRfUEVSX1BBR0UsXG4gICAgbWF4OiBNQVhfUEVSX1BBR0UsXG4gIH0pO1xuICBjb25zdCBwYWdlID0gTWF0aC5tYXgoMCwgTWF0aC50cnVuYyhvcHRzLnBhZ2UgPz8gMCkpO1xuICBjb25zdCBtZW1vcnkgPSBhd2FpdCBvcHRzLmFnZW50LmdldE1lbW9yeSgpO1xuICBpZiAoIW1lbW9yeSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlY2FsbDpuby1tZW1vcnlcIiwgeyBhZ2VudElkOiBvcHRzLmFnZW50LmlkLCB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCB9KTtcbiAgICByZXR1cm4geyB1aU1lc3NhZ2VzOiBbXSwgcGFnZSwgcGVyUGFnZSwgdG90YWw6IDAsIGhhc01vcmU6IGZhbHNlIH07XG4gIH1cbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWVtb3J5LnJlY2FsbCh7XG4gICAgdGhyZWFkSWQ6IG9wdHMudGhyZWFkSWQsXG4gICAgLi4uKG9wdHMucmVzb3VyY2VJZCA/IHsgcmVzb3VyY2VJZDogb3B0cy5yZXNvdXJjZUlkIH0gOiB7fSksXG4gICAgcGFnZSxcbiAgICBwZXJQYWdlLFxuICAgIG9yZGVyQnk6IHtcbiAgICAgIGZpZWxkOiBcImNyZWF0ZWRBdFwiLFxuICAgICAgZGlyZWN0aW9uOiBvcHRzLmFzY2VuZGluZyA/IFwiQVNDXCIgOiBcIkRFU0NcIixcbiAgICB9LFxuICB9KTtcbiAgY29uc3QgY2hyb25vbG9naWNhbCA9IHNvcnRDaHJvbm9sb2dpY2FsKHJlc3VsdC5tZXNzYWdlcyk7XG4gIGNvbnN0IHVpTWVzc2FnZXMgPSB0b0FJU2RrVjVNZXNzYWdlcyhjaHJvbm9sb2dpY2FsKSBhcyB1bmtub3duIGFzIE1hc3RyYUhpc3RvcnlVSU1lc3NhZ2VbXTtcbiAgbG9nZ2VyLmRlYnVnKFwicmVjYWxsOmRvbmVcIiwge1xuICAgIGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsXG4gICAgdGhyZWFkSWQ6IG9wdHMudGhyZWFkSWQsXG4gICAgcGFnZSxcbiAgICBwZXJQYWdlLFxuICAgIHJldHVybmVkOiB1aU1lc3NhZ2VzLmxlbmd0aCxcbiAgICB0b3RhbDogcmVzdWx0LnRvdGFsLFxuICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlLFxuICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdWlNZXNzYWdlcyxcbiAgICBwYWdlLFxuICAgIHBlclBhZ2UsXG4gICAgdG90YWw6IHJlc3VsdC50b3RhbCxcbiAgICBoYXNNb3JlOiByZXN1bHQuaGFzTW9yZSxcbiAgfTtcbn1cblxuLyoqIElucHV0cyBhY2NlcHRlZCBieSB7QGxpbmsgY2xlYXJIaXN0b3J5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xlYXJIaXN0b3J5T3B0aW9ucyB7XG4gIGFnZW50OiBBZ2VudDtcbiAgdGhyZWFkSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaXBlIGV2ZXJ5IHBlcnNpc3RlZCBtZXNzYWdlIHRpZWQgdG8gYSB0aHJlYWQuIFJldHVybnMgdGhlIGNvdW50XG4gKiBvZiBtZXNzYWdlcyB0aGF0IHdlcmUgb24gdGhlIHRocmVhZCBhdCBkZWxldGUgdGltZSBzbyB0aGUgY2FsbGVyXG4gKiBjYW4gcmVuZGVyIGEgXCJjbGVhcmVkIE4gbWVzc2FnZXNcIiBhZmZvcmRhbmNlIHdpdGhvdXQgYW5cbiAqIGFkZGl0aW9uYWwgcm91bmQtdHJpcC5cbiAqXG4gKiBBZ2VudHMgd2l0aG91dCBhIGNvbmZpZ3VyZWQgYE1lbW9yeWAgcmVzb2x2ZSB0byBhIG5vLW9wIChjb3VudFxuICogMCksIG1hdGNoaW5nIHtAbGluayBsb2FkSGlzdG9yeX0ncyBcInN0YXRlbGVzcyBhZ2VudHMgcmV0dXJuIGFuXG4gKiBlbXB0eSBwYWdlXCIgc3RhbmNlIHNvIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsLWNhc2UgdGhlbS5cbiAqIFRocmVhZHMgdGhhdCBkb24ndCBleGlzdCB5ZXQgYXJlIGFsc28gYSBzdWNjZXNzZnVsIG5vLW9wIC0gdGhlXG4gKiBvcGVyYXRpb24gaXMgaWRlbXBvdGVudCBzbyB0aGUgVUkgY2FuIGZpcmUtYW5kLWZvcmdldCB3aXRob3V0XG4gKiB0cmFja2luZyB0aHJlYWQgZXhpc3RlbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJIaXN0b3J5KG9wdHM6IENsZWFySGlzdG9yeU9wdGlvbnMpOiBQcm9taXNlPHsgY2xlYXJlZDogbnVtYmVyIH0+IHtcbiAgY29uc3QgbWVtb3J5ID0gYXdhaXQgb3B0cy5hZ2VudC5nZXRNZW1vcnkoKTtcbiAgaWYgKCFtZW1vcnkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjbGVhcjpuby1tZW1vcnlcIiwgeyBhZ2VudElkOiBvcHRzLmFnZW50LmlkLCB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCB9KTtcbiAgICByZXR1cm4geyBjbGVhcmVkOiAwIH07XG4gIH1cbiAgLy8gTWFzdHJhJ3MgYGRlbGV0ZVRocmVhZGAgY2FzY2FkZXMgdG8gdGhlIG1lc3NhZ2UgdGFibGUsIHNvIHdlXG4gIC8vIGNhbid0IGFzayBmb3IgYSBjb3VudCBhZnRlciB0aGUgZmFjdC4gUmVhZCBpdCBwcmUtZGVsZXRlIHdpdGggYVxuICAvLyBvbmUtcGFnZSByZWNhbGwgc2l6ZWQgdG8gZml0IGNvbW1vbiB0aHJlYWRzIGluIGEgc2luZ2xlIHJvdW5kXG4gIC8vIHRyaXA7IHRoZSB2YWx1ZSBpcyBmb3IgdGVsZW1ldHJ5IC8gVUksIG5vdCBjb3JyZWN0bmVzcy5cbiAgbGV0IGNsZWFyZWQgPSAwO1xuICB0cnkge1xuICAgIGNvbnN0IHByb2JlID0gYXdhaXQgbWVtb3J5LnJlY2FsbCh7XG4gICAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICAgIHBhZ2U6IDAsXG4gICAgICBwZXJQYWdlOiAxLFxuICAgIH0pO1xuICAgIGNsZWFyZWQgPSBwcm9iZS50b3RhbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQSBtaXNzaW5nLXRocmVhZCBlcnJvciBpcyB0aGUgaGFwcHktcGF0aCBcIm5vdGhpbmcgdG8gY291bnRcIjtcbiAgICAvLyBldmVyeSBvdGhlciBlcnJvciBpcyBsb2dnZWQgYnV0IGRvZXNuJ3QgYmxvY2sgdGhlIGRlbGV0ZS5cbiAgICBsb2dnZXIuZGVidWcoXCJjbGVhcjpwcm9iZS1mYWlsZWRcIiwge1xuICAgICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICAgIHRocmVhZElkOiBvcHRzLnRocmVhZElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBtZW1vcnkuZGVsZXRlVGhyZWFkKG9wdHMudGhyZWFkSWQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBNYXN0cmEncyBgZGVsZXRlVGhyZWFkYCByYWlzZXMgd2hlbiB0aGUgdGhyZWFkIHJvdyB3YXMgbmV2ZXJcbiAgICAvLyBjcmVhdGVkIChlLmcuIGNsZWFyaW5nIGFuIGVtcHR5IHNlc3Npb24pLiBTdXJmYWNlIGFzIGEgc29mdFxuICAgIC8vIHdhcm4gYW5kIHRyZWF0IGFzIHN1Y2Nlc3MgLSB0aGUgdXNlci1mYWNpbmcgc2VtYW50aWMgaXNcbiAgICAvLyBcImhpc3RvcnkgaXMgbm93IGVtcHR5XCIgd2hpY2ggaXMgYWxyZWFkeSB0cnVlLlxuICAgIGxvZ2dlci53YXJuKFwiY2xlYXI6ZGVsZXRlLXNvZnQtZmFpbGVkXCIsIHtcbiAgICAgIGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsXG4gICAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxuICBsb2dnZXIuaW5mbyhcImNsZWFyOmRvbmVcIiwge1xuICAgIGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsXG4gICAgdGhyZWFkSWQ6IG9wdHMudGhyZWFkSWQsXG4gICAgY2xlYXJlZCxcbiAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gIH0pO1xuICByZXR1cm4geyBjbGVhcmVkIH07XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IHtAbGluayBoaXN0b3J5Um91dGV9LiAqL1xuZXhwb3J0IHR5cGUgSGlzdG9yeVJvdXRlT3B0aW9ucyA9XG4gIHsgcGF0aDogYCR7c3RyaW5nfTphZ2VudElkJHtzdHJpbmd9YDsgYWdlbnQ/OiBuZXZlciB9IHwgeyBwYXRoOiBzdHJpbmc7IGFnZW50OiBzdHJpbmcgfTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgYDxwYXRoPmAgTWFzdHJhIGN1c3RvbSBBUEkgcm91dGUuIEhhbmRsZXMgdHdvXG4gKiBtZXRob2RzIG9uIHRoZSBzYW1lIG1vdW50OlxuICpcbiAqICAgLSBgR0VUYDogcmV0dXJuIGEgcGFnZSBvZiBBSSBTREsgVjUgYFVJTWVzc2FnZWBzIGZvciB0aGVcbiAqICAgICBjYWxsZXIncyBjdXJyZW50IHRocmVhZCAoe0BsaW5rIGxvYWRIaXN0b3J5fSkuXG4gKiAgIC0gYERFTEVURWA6IHdpcGUgZXZlcnkgcGVyc2lzdGVkIG1lc3NhZ2Ugb24gdGhlIGNhbGxlcidzXG4gKiAgICAgdGhyZWFkICh7QGxpbmsgY2xlYXJIaXN0b3J5fSkuIFRoZSBzZXNzaW9uIGNvb2tpZSB0aGF0XG4gKiAgICAgYW5jaG9ycyB0aGUgdGhyZWFkIGlkIGlzIGxlZnQgYWxvbmUgc28gdGhlIHVzZXIga2VlcHMgdGhlXG4gKiAgICAgc2FtZSB0aHJlYWQgLSBvbmx5IHRoZSBjb250ZW50cyBnbyBhd2F5LlxuICpcbiAqIEZvbGxvd3MgdGhlIGBAbWFzdHJhL2FpLXNka2AgYGNoYXRSb3V0ZWAgY29udmVudGlvbiBmb3IgYWdlbnRcbiAqIGJpbmRpbmc6IHBhc3MgYGFnZW50YCBmb3IgYSBmaXhlZC1hZ2VudCBtb3VudCwgb3IgaW5jbHVkZVxuICogYDphZ2VudElkYCBpbiB0aGUgcGF0aCBmb3IgZHluYW1pYyByb3V0aW5nLiBUaGUgcGx1Z2luIHJlZ2lzdGVyc1xuICogYm90aCBgL3JvdXRlL2hpc3RvcnlgIChkZWZhdWx0IGFnZW50KSBhbmQgYC9yb3V0ZS9oaXN0b3J5LzphZ2VudElkYC5cbiAqXG4gKiBUaGUgaGFuZGxlciByZWFkcyBgdGhyZWFkSWRgIGFuZCBgcmVzb3VyY2VJZGAgZnJvbSBgUmVxdWVzdENvbnRleHRgXG4gKiAocG9wdWxhdGVkIHVwc3RyZWFtIGJ5IGBNYXN0cmFTZXJ2ZXIucmVnaXN0ZXJBdXRoTWlkZGxld2FyZWApLCBzb1xuICogbm8gY29va2llIG9yIHVzZXIgbG9va3VwcyBoYXBwZW4gaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpc3RvcnlSb3V0ZShvcHRpb25zOiBIaXN0b3J5Um91dGVPcHRpb25zKSB7XG4gIGNvbnN0IHsgcGF0aCB9ID0gb3B0aW9ucztcbiAgY29uc3QgZml4ZWRBZ2VudCA9IFwiYWdlbnRcIiBpbiBvcHRpb25zID8gb3B0aW9ucy5hZ2VudCA6IHVuZGVmaW5lZDtcbiAgaWYgKCFmaXhlZEFnZW50ICYmICFwYXRoLmluY2x1ZGVzKFwiOmFnZW50SWRcIikpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgXCJoaXN0b3J5Um91dGUucGF0aFwiLFxuICAgICAgcGF0aCxcbiAgICAgIFwiYSBwYXRoIGNvbnRhaW5pbmcgYDphZ2VudElkYCwgb3IgYW4gZXhwbGljaXQgYGFnZW50YFwiLFxuICAgICk7XG4gIH1cbiAgLy8gVGlueSByZXNvbHZlciBzaGFyZWQgYnkgR0VUIC8gREVMRVRFOiBkZXJpdmUgdGhlIGFjdGl2ZSBhZ2VudFxuICAvLyBhbmQgdGhyZWFkIGlkLCByZXR1cm5pbmcgYSBKU09OIGVycm9yIHJlc3BvbnNlIHdoZW4gZWl0aGVyIGlzXG4gIC8vIG1pc3NpbmcuIEtlZXBzIGJvdGggaGFuZGxlcnMgdGhpbiBhbmQgZ2l2ZXMgdGhlbSBpZGVudGljYWxcbiAgLy8gdmFsaWRhdGlvbiBiZWhhdmlvdXIuXG4gIGNvbnN0IHJlc29sdmVDb250ZXh0ID0gKGM6IENvbnRleHRXaXRoTWFzdHJhKSA9PiB7XG4gICAgY29uc3QgbWFzdHJhID0gYy5nZXQoXCJtYXN0cmFcIik7XG4gICAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjLmdldChcInJlcXVlc3RDb250ZXh0XCIpO1xuICAgIGNvbnN0IGFnZW50SWQgPSBmaXhlZEFnZW50ID8/IGMucmVxLnBhcmFtKFwiYWdlbnRJZFwiKTtcbiAgICBpZiAoIWFnZW50SWQpIHtcbiAgICAgIHJldHVybiB7IGVycm9yOiBjLmpzb24oeyBlcnJvcjogXCJhZ2VudElkIGlzIHJlcXVpcmVkXCIgfSwgNDAwKSB9IGFzIGNvbnN0O1xuICAgIH1cbiAgICBjb25zdCBhZ2VudCA9IG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IGMuanNvbih7IGVycm9yOiBgVW5rbm93biBhZ2VudCBcIiR7YWdlbnRJZH1cImAgfSwgNDA0KSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgfVxuICAgIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCF0aHJlYWRJZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IGMuanNvbih7IGVycm9yOiBcInRocmVhZCBpZCBtaXNzaW5nIGZyb20gcmVxdWVzdCBjb250ZXh0XCIgfSwgNDAwKSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgfVxuICAgIGNvbnN0IHJlc291cmNlSWQgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGFnZW50SWQsIGFnZW50LCB0aHJlYWRJZCwgcmVzb3VyY2VJZCB9IGFzIGNvbnN0O1xuICB9O1xuXG4gIHJldHVybiBbXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShwYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYzogQ29udGV4dFdpdGhNYXN0cmEpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gcmVzb2x2ZUNvbnRleHQoYyk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gY3R4KSByZXR1cm4gY3R4LmVycm9yO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgbG9hZEhpc3Rvcnkoe1xuICAgICAgICAgIGFnZW50OiBjdHguYWdlbnQsXG4gICAgICAgICAgdGhyZWFkSWQ6IGN0eC50aHJlYWRJZCxcbiAgICAgICAgICAuLi4oY3R4LnJlc291cmNlSWQgPyB7IHJlc291cmNlSWQ6IGN0eC5yZXNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgICAgcGFnZTogcGFyc2VJbnRQYXJhbShjLnJlcS5xdWVyeShcInBhZ2VcIikpLFxuICAgICAgICAgIHBlclBhZ2U6IHBhcnNlSW50UGFyYW0oYy5yZXEucXVlcnkoXCJwZXJQYWdlXCIpKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjLmpzb24ocGF5bG9hZCk7XG4gICAgICB9LFxuICAgIH0pLFxuICAgIHJlZ2lzdGVyQXBpUm91dGUocGF0aCwge1xuICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGM6IENvbnRleHRXaXRoTWFzdHJhKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHJlc29sdmVDb250ZXh0KGMpO1xuICAgICAgICBpZiAoXCJlcnJvclwiIGluIGN0eCkgcmV0dXJuIGN0eC5lcnJvcjtcbiAgICAgICAgY29uc3QgeyBjbGVhcmVkIH0gPSBhd2FpdCBjbGVhckhpc3Rvcnkoe1xuICAgICAgICAgIGFnZW50OiBjdHguYWdlbnQsXG4gICAgICAgICAgdGhyZWFkSWQ6IGN0eC50aHJlYWRJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IE1hc3RyYUNsZWFySGlzdG9yeVJlc3BvbnNlID0ge1xuICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgIGFnZW50SWQ6IGN0eC5hZ2VudElkLFxuICAgICAgICAgIHRocmVhZElkOiBjdHgudGhyZWFkSWQsXG4gICAgICAgICAgY2xlYXJlZCxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGMuanNvbihwYXlsb2FkKTtcbiAgICAgIH0sXG4gICAgfSksXG4gIF07XG59XG5cbi8qKlxuICogU29ydCBtZXNzYWdlcyBvbGRlc3QtZmlyc3QgYnkgYGNyZWF0ZWRBdGAsIGZhbGxpbmcgYmFjayB0byB3aGF0ZXZlclxuICogb3JkZXIgdGhlIHN0b3JhZ2UgcmV0dXJuZWQgdGhlbSBpbi4gVGhlIG5hdGl2ZSBgcmVjYWxsYCBjYWxsIGhvbm9yc1xuICogYG9yZGVyQnlgIGJ1dCBkb2Vzbid0IGd1YXJhbnRlZSBhIHN0YWJsZSBzZWNvbmRhcnkgc29ydCwgc28gd2VcbiAqIG5vcm1hbGl6ZSBoZXJlIGJlZm9yZSBoYW5kaW5nIHRoZSBwYWdlIHRvIHRoZSBBSSBTREsgY29udmVydGVyLlxuICovXG5mdW5jdGlvbiBzb3J0Q2hyb25vbG9naWNhbChtZXNzYWdlczogTWFzdHJhREJNZXNzYWdlW10pOiBNYXN0cmFEQk1lc3NhZ2VbXSB7XG4gIHJldHVybiBbLi4ubWVzc2FnZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCB0YSA9IHRvRXBvY2goYS5jcmVhdGVkQXQpO1xuICAgIGNvbnN0IHRiID0gdG9FcG9jaChiLmNyZWF0ZWRBdCk7XG4gICAgcmV0dXJuIHRhIC0gdGI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0Vwb2NoKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlLmdldFRpbWUoKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IDAgOiBwYXJzZWQ7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG4iXX0=
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oaXN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1wRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUU1QyxxRUFBcUU7QUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsNkVBQTZFO0FBQzdFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQWF6Qjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLElBQXdCO0lBQ3hELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ3pDLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsR0FBRyxFQUFFLFlBQVk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMs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LFNBQVMsT0FBTyxDQUFDLEtBQWM7SUFDN0IsSUFBSSxLQUFLLFlBQVksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhyZWFkIGhpc3RvcnkgbG9hZGVyIGV4cG9zZWQgYXMgYSBNYXN0cmEgY3VzdG9tIEFQSSByb3V0ZS5cbiAqXG4gKiBCYWNrZWQgZW50aXJlbHkgYnkgbmF0aXZlIE1hc3RyYTogbG9va3MgdXAgdGhlIGFjdGl2ZSBhZ2VudCBieSBpZCxcbiAqIGFza3MgaXRzIGBNZW1vcnlgIGluc3RhbmNlIHRvIGByZWNhbGxgIGEgcGFnZSBvZiBgTWFzdHJhREJNZXNzYWdlYHMsXG4gKiBhbmQgY29udmVydHMgdGhlIHJlc3VsdCB0byBBSSBTREsgVjUgYFVJTWVzc2FnZWBzIHdpdGggdGhlIG9mZmljaWFsXG4gKiB7QGxpbmsgdG9BSVNka1Y1TWVzc2FnZXN9IGhlbHBlciBmcm9tIGBAbWFzdHJhL2FpLXNkay91aWAuIE5vIGRpcmVjdFxuICogZGF0YWJhc2UgcmVhZHMuXG4gKlxuICogVGhlIHJvdXRlIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgaGlzdG9yeVJvdXRlfSBhcyBhIE1hc3RyYVxuICogYHJlZ2lzdGVyQXBpUm91dGVgIHNvIGl0IHNpdHMgaW4gdGhlIHNhbWUgZGlzcGF0Y2hlciBwaXBlbGluZSBhc1xuICogdGhlIHN0YW5kYXJkIGFnZW50IHJvdXRlcy4gVGhhdCBtZWFucyB0aGUgYE1hc3RyYVNlcnZlcmAgYXV0aFxuICogbWlkZGxld2FyZSAoaW4gYC4vc2VydmVyLnRzYCkgaGFzIGFscmVhZHkgcG9wdWxhdGVkIGBSZXF1ZXN0Q29udGV4dGAgd2l0aFxuICogYE1BU1RSQV9USFJFQURfSURfS0VZYCBhbmQgYE1BU1RSQV9SRVNPVVJDRV9JRF9LRVlgIGJ5IHRoZSB0aW1lXG4gKiB0aGUgaGFuZGxlciBydW5zIC0gbm8gY29va2llIG9yIHVzZXIgbG9va3VwcyBoYXBwZW4gaGVyZSwgYW5kIHRoZVxuICogc2Vzc2lvbi1jb29raWUgbG9naWMgc3RheXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaW4gYHNlcnZlci50c2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBNYXN0cmFDbGVhckhpc3RvcnlSZXNwb25zZSxcbiAgTWFzdHJhSGlzdG9yeVJlc3BvbnNlLFxuICBNYXN0cmFIaXN0b3J5VUlNZXNzYWdlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyB0b0FJU2RrVjVNZXNzYWdlcyB9IGZyb20gXCJAbWFzdHJhL2FpLXNkay91aVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhREJNZXNzYWdlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudC9tZXNzYWdlLWxpc3RcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIE1BU1RSQV9USFJFQURfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dFdpdGhNYXN0cmEgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NlcnZlclwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJBcGlSb3V0ZSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvc2VydmVyXCI7XG5cbmltcG9ydCB7IGNsYW1wUGVyUGFnZSwgcGFyc2VJbnRQYXJhbSB9IGZyb20gXCIuL3BhZ2luYXRpb24udHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9oaXN0b3J5XCIpO1xuXG4vKiogRGVmYXVsdCBoaXN0b3J5IHBhZ2Ugc2l6ZTsgbWF0Y2hlcyB0aGUgTWFzdHJhIHN0b3JhZ2UgZGVmYXVsdC4gKi9cbmNvbnN0IERFRkFVTFRfUEVSX1BBR0UgPSAyMDtcbi8qKiBIYXJkIGNhcCBzbyBhIG1pc2JlaGF2aW5nIGNsaWVudCBjYW4ndCBmZXRjaCB0aGUgd2hvbGUgdGhyZWFkIGF0IG9uY2UuICovXG5jb25zdCBNQVhfUEVSX1BBR0UgPSAyMDA7XG5cbi8qKiBJbnB1dHMgYWNjZXB0ZWQgYnkge0BsaW5rIGxvYWRIaXN0b3J5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZEhpc3RvcnlPcHRpb25zIHtcbiAgYWdlbnQ6IEFnZW50O1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkPzogc3RyaW5nO1xuICBwYWdlPzogbnVtYmVyO1xuICBwZXJQYWdlPzogbnVtYmVyO1xuICAvKiogV2hlbiB0cnVlLCByZXR1cm5zIHRoZSAqb2xkZXN0KiBwYWdlIGZpcnN0IChjaHJvbm9sb2dpY2FsKS4gKi9cbiAgYXNjZW5kaW5nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHBhZ2Ugb2YgVUktZm9ybWF0dGVkIG1lc3NhZ2VzIGZvciBhIHRocmVhZC5cbiAqXG4gKiBVc2VzIHRoZSBhZ2VudCdzIHJlc29sdmVkIGBNZW1vcnlgIChgZ2V0TWVtb3J5KClgKSBzbyBwZXItYWdlbnRcbiAqIHN0b3JhZ2UgbmFtZXNwYWNlcyAoYG1hc3RyYV88YWdlbnRJZD5gIHNjaGVtYXMpIGFuZCBhbnkgZnV0dXJlXG4gKiBtZW1vcnktc2lkZSBmaWx0ZXJzIGFwcGx5IGF1dG9tYXRpY2FsbHkuIFdoZW4gdGhlIGFnZW50IGhhcyBub1xuICogbWVtb3J5IGNvbmZpZ3VyZWQgdGhlIHJlc3BvbnNlIGlzIGEgc3VjY2Vzc2Z1bCBlbXB0eSBwYWdlIHNvXG4gKiBjYWxsZXJzIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIHN0YXRlbGVzcyBhZ2VudHMuXG4gKlxuICogUGFnaW5hdGlvbiBpcyBkZXNjZW5kaW5nLWJ5LWRlZmF1bHQ6IHBhZ2UgMCBpcyB0aGUgbW9zdCByZWNlbnRcbiAqIHBhZ2UsIHBhZ2UgMSB0aGUgcGFnZSBiZWZvcmUgdGhhdCwgZXRjLiBUaGUgcmV0dXJuZWQgYHVpTWVzc2FnZXNgXG4gKiBhcmUgYWx3YXlzIHJlLXNvcnRlZCBpbnRvIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCAtPiBuZXdlc3QpXG4gKiBzbyB0aGUgY2xpZW50IGNhbiBwcmVwZW5kIHRoZW0gYWJvdmUgdGhlIGV4aXN0aW5nIHRyYW5zY3JpcHRcbiAqIHdpdGhvdXQgc29ydGluZyBsb2NhbGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3Rvcnkob3B0czogTG9hZEhpc3RvcnlPcHRpb25zKTogUHJvbWlzZTxNYXN0cmFIaXN0b3J5UmVzcG9uc2U+IHtcbiAgY29uc3QgcGVyUGFnZSA9IGNsYW1wUGVyUGFnZShvcHRzLnBlclBhZ2UsIHtcbiAgICBmYWxsYmFjazogREVGQVVMVF9QRVJfUEFHRSxcbiAgICBtYXg6IE1BWF9QRVJfUEFHRSxcbiAgfSk7XG4gIGNvbnN0IHBhZ2UgPSBNYXRoLm1heCgwLCBNYXRoLnRydW5jKG9wdHMucGFnZSA/PyAwKSk7XG4gIGNvbnN0IG1lbW9yeSA9IGF3YWl0IG9wdHMuYWdlbnQuZ2V0TWVtb3J5KCk7XG4gIGlmICghbWVtb3J5KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVjYWxsOm5vLW1lbW9yeVwiLCB7IGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsIHRocmVhZElkOiBvcHRzLnRocmVhZElkIH0pO1xuICAgIHJldHVybiB7IHVpTWVzc2FnZXM6IFtdLCBwYWdlLCBwZXJQYWdlLCB0b3RhbDogMCwgaGFzTW9yZTogZmFsc2UgfTtcbiAgfVxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBtZW1vcnkucmVjYWxsKHtcbiAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICAuLi4ob3B0cy5yZXNvdXJjZUlkID8geyByZXNvdXJjZUlkOiBvcHRzLnJlc291cmNlSWQgfSA6IHt9KSxcbiAgICBwYWdlLFxuICAgIHBlclBhZ2UsXG4gICAgb3JkZXJCeToge1xuICAgICAgZmllbGQ6IFwiY3JlYXRlZEF0XCIsXG4gICAgICBkaXJlY3Rpb246IG9wdHMuYXNjZW5kaW5nID8gXCJBU0NcIiA6IFwiREVTQ1wiLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBjaHJvbm9sb2dpY2FsID0gc29ydENocm9ub2xvZ2ljYWwocmVzdWx0Lm1lc3NhZ2VzKTtcbiAgY29uc3QgdWlNZXNzYWdlcyA9IHRvQUlTZGtWNU1lc3NhZ2VzKGNocm9ub2xvZ2ljYWwpIGFzIHVua25vd24gYXMgTWFzdHJhSGlzdG9yeVVJTWVzc2FnZVtdO1xuICBsb2dnZXIuZGVidWcoXCJyZWNhbGw6ZG9uZVwiLCB7XG4gICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICBwYWdlLFxuICAgIHBlclBhZ2UsXG4gICAgcmV0dXJuZWQ6IHVpTWVzc2FnZXMubGVuZ3RoLFxuICAgIHRvdGFsOiByZXN1bHQudG90YWwsXG4gICAgaGFzTW9yZTogcmVzdWx0Lmhhc01vcmUsXG4gICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB1aU1lc3NhZ2VzLFxuICAgIHBhZ2UsXG4gICAgcGVyUGFnZSxcbiAgICB0b3RhbDogcmVzdWx0LnRvdGFsLFxuICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlLFxuICB9O1xufVxuXG4vKiogSW5wdXRzIGFjY2VwdGVkIGJ5IHtAbGluayBjbGVhckhpc3Rvcnl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGVhckhpc3RvcnlPcHRpb25zIHtcbiAgYWdlbnQ6IEFnZW50O1xuICB0aHJlYWRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdpcGUgZXZlcnkgcGVyc2lzdGVkIG1lc3NhZ2UgdGllZCB0byBhIHRocmVhZC4gUmV0dXJucyB0aGUgY291bnRcbiAqIG9mIG1lc3NhZ2VzIHRoYXQgd2VyZSBvbiB0aGUgdGhyZWFkIGF0IGRlbGV0ZSB0aW1lIHNvIHRoZSBjYWxsZXJcbiAqIGNhbiByZW5kZXIgYSBcImNsZWFyZWQgTiBtZXNzYWdlc1wiIGFmZm9yZGFuY2Ugd2l0aG91dCBhblxuICogYWRkaXRpb25hbCByb3VuZC10cmlwLlxuICpcbiAqIEFnZW50cyB3aXRob3V0IGEgY29uZmlndXJlZCBgTWVtb3J5YCByZXNvbHZlIHRvIGEgbm8tb3AgKGNvdW50XG4gKiAwKSwgbWF0Y2hpbmcge0BsaW5rIGxvYWRIaXN0b3J5fSdzIFwic3RhdGVsZXNzIGFnZW50cyByZXR1cm4gYW5cbiAqIGVtcHR5IHBhZ2VcIiBzdGFuY2Ugc28gY2FsbGVycyBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSB0aGVtLlxuICogVGhyZWFkcyB0aGF0IGRvbid0IGV4aXN0IHlldCBhcmUgYWxzbyBhIHN1Y2Nlc3NmdWwgbm8tb3AgLSB0aGVcbiAqIG9wZXJhdGlvbiBpcyBpZGVtcG90ZW50IHNvIHRoZSBVSSBjYW4gZmlyZS1hbmQtZm9yZ2V0IHdpdGhvdXRcbiAqIHRyYWNraW5nIHRocmVhZCBleGlzdGVuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhckhpc3Rvcnkob3B0czogQ2xlYXJIaXN0b3J5T3B0aW9ucyk6IFByb21pc2U8eyBjbGVhcmVkOiBudW1iZXIgfT4ge1xuICBjb25zdCBtZW1vcnkgPSBhd2FpdCBvcHRzLmFnZW50LmdldE1lbW9yeSgpO1xuICBpZiAoIW1lbW9yeSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyOm5vLW1lbW9yeVwiLCB7IGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsIHRocmVhZElkOiBvcHRzLnRocmVhZElkIH0pO1xuICAgIHJldHVybiB7IGNsZWFyZWQ6IDAgfTtcbiAgfVxuICAvLyBNYXN0cmEncyBgZGVsZXRlVGhyZWFkYCBjYXNjYWRlcyB0byB0aGUgbWVzc2FnZSB0YWJsZSwgc28gd2VcbiAgLy8gY2FuJ3QgYXNrIGZvciBhIGNvdW50IGFmdGVyIHRoZSBmYWN0LiBSZWFkIGl0IHByZS1kZWxldGUgd2l0aCBhXG4gIC8vIG9uZS1wYWdlIHJlY2FsbCBzaXplZCB0byBmaXQgY29tbW9uIHRocmVhZHMgaW4gYSBzaW5nbGUgcm91bmRcbiAgLy8gdHJpcDsgdGhlIHZhbHVlIGlzIGZvciB0ZWxlbWV0cnkgLyBVSSwgbm90IGNvcnJlY3RuZXNzLlxuICBsZXQgY2xlYXJlZCA9IDA7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvYmUgPSBhd2FpdCBtZW1vcnkucmVjYWxsKHtcbiAgICAgIHRocmVhZElkOiBvcHRzLnRocmVhZElkLFxuICAgICAgcGFnZTogMCxcbiAgICAgIHBlclBhZ2U6IDEsXG4gICAgfSk7XG4gICAgY2xlYXJlZCA9IHByb2JlLnRvdGFsO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBBIG1pc3NpbmctdGhyZWFkIGVycm9yIGlzIHRoZSBoYXBweS1wYXRoIFwibm90aGluZyB0byBjb3VudFwiO1xuICAgIC8vIGV2ZXJ5IG90aGVyIGVycm9yIGlzIGxvZ2dlZCBidXQgZG9lc24ndCBibG9jayB0aGUgZGVsZXRlLlxuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyOnByb2JlLWZhaWxlZFwiLCB7XG4gICAgICBhZ2VudElkOiBvcHRzLmFnZW50LmlkLFxuICAgICAgdGhyZWFkSWQ6IG9wdHMudGhyZWFkSWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGF3YWl0IG1lbW9yeS5kZWxldGVUaHJlYWQob3B0cy50aHJlYWRJZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIE1hc3RyYSdzIGBkZWxldGVUaHJlYWRgIHJhaXNlcyB3aGVuIHRoZSB0aHJlYWQgcm93IHdhcyBuZXZlclxuICAgIC8vIGNyZWF0ZWQgKGUuZy4gY2xlYXJpbmcgYW4gZW1wdHkgc2Vzc2lvbikuIFN1cmZhY2UgYXMgYSBzb2Z0XG4gICAgLy8gd2FybiBhbmQgdHJlYXQgYXMgc3VjY2VzcyAtIHRoZSB1c2VyLWZhY2luZyBzZW1hbnRpYyBpc1xuICAgIC8vIFwiaGlzdG9yeSBpcyBub3cgZW1wdHlcIiB3aGljaCBpcyBhbHJlYWR5IHRydWUuXG4gICAgbG9nZ2VyLndhcm4oXCJjbGVhcjpkZWxldGUtc29mdC1mYWlsZWRcIiwge1xuICAgICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICAgIHRocmVhZElkOiBvcHRzLnRocmVhZElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG4gIGxvZ2dlci5pbmZvKFwiY2xlYXI6ZG9uZVwiLCB7XG4gICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICBjbGVhcmVkLFxuICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgfSk7XG4gIHJldHVybiB7IGNsZWFyZWQgfTtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkge0BsaW5rIGhpc3RvcnlSb3V0ZX0uICovXG5leHBvcnQgdHlwZSBIaXN0b3J5Um91dGVPcHRpb25zID1cbiAgeyBwYXRoOiBgJHtzdHJpbmd9OmFnZW50SWQke3N0cmluZ31gOyBhZ2VudD86IG5ldmVyIH0gfCB7IHBhdGg6IHN0cmluZzsgYWdlbnQ6IHN0cmluZyB9O1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBgPHBhdGg+YCBNYXN0cmEgY3VzdG9tIEFQSSByb3V0ZS4gSGFuZGxlcyB0d29cbiAqIG1ldGhvZHMgb24gdGhlIHNhbWUgbW91bnQ6XG4gKlxuICogICAtIGBHRVRgOiByZXR1cm4gYSBwYWdlIG9mIEFJIFNESyBWNSBgVUlNZXNzYWdlYHMgZm9yIHRoZVxuICogICAgIGNhbGxlcidzIGN1cnJlbnQgdGhyZWFkICh7QGxpbmsgbG9hZEhpc3Rvcnl9KS5cbiAqICAgLSBgREVMRVRFYDogd2lwZSBldmVyeSBwZXJzaXN0ZWQgbWVzc2FnZSBvbiB0aGUgY2FsbGVyJ3NcbiAqICAgICB0aHJlYWQgKHtAbGluayBjbGVhckhpc3Rvcnl9KS4gVGhlIHNlc3Npb24gY29va2llIHRoYXRcbiAqICAgICBhbmNob3JzIHRoZSB0aHJlYWQgaWQgaXMgbGVmdCBhbG9uZSBzbyB0aGUgdXNlciBrZWVwcyB0aGVcbiAqICAgICBzYW1lIHRocmVhZCAtIG9ubHkgdGhlIGNvbnRlbnRzIGdvIGF3YXkuXG4gKlxuICogRm9sbG93cyB0aGUgYEBtYXN0cmEvYWktc2RrYCBgY2hhdFJvdXRlYCBjb252ZW50aW9uIGZvciBhZ2VudFxuICogYmluZGluZzogcGFzcyBgYWdlbnRgIGZvciBhIGZpeGVkLWFnZW50IG1vdW50LCBvciBpbmNsdWRlXG4gKiBgOmFnZW50SWRgIGluIHRoZSBwYXRoIGZvciBkeW5hbWljIHJvdXRpbmcuIFRoZSBwbHVnaW4gcmVnaXN0ZXJzXG4gKiBib3RoIGAvcm91dGUvaGlzdG9yeWAgKGRlZmF1bHQgYWdlbnQpIGFuZCBgL3JvdXRlL2hpc3RvcnkvOmFnZW50SWRgLlxuICpcbiAqIFRoZSBoYW5kbGVyIHJlYWRzIGB0aHJlYWRJZGAgYW5kIGByZXNvdXJjZUlkYCBmcm9tIGBSZXF1ZXN0Q29udGV4dGBcbiAqIChwb3B1bGF0ZWQgdXBzdHJlYW0gYnkgYE1hc3RyYVNlcnZlci5yZWdpc3RlckF1dGhNaWRkbGV3YXJlYCksIHNvXG4gKiBubyBjb29raWUgb3IgdXNlciBsb29rdXBzIGhhcHBlbiBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlzdG9yeVJvdXRlKG9wdGlvbnM6IEhpc3RvcnlSb3V0ZU9wdGlvbnMpIHtcbiAgY29uc3QgeyBwYXRoIH0gPSBvcHRpb25zO1xuICBjb25zdCBmaXhlZEFnZW50ID0gXCJhZ2VudFwiIGluIG9wdGlvbnMgPyBvcHRpb25zLmFnZW50IDogdW5kZWZpbmVkO1xuICBpZiAoIWZpeGVkQWdlbnQgJiYgIXBhdGguaW5jbHVkZXMoXCI6YWdlbnRJZFwiKSkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcImhpc3RvcnlSb3V0ZS5wYXRoXCIsXG4gICAgICBwYXRoLFxuICAgICAgXCJhIHBhdGggY29udGFpbmluZyBgOmFnZW50SWRgLCBvciBhbiBleHBsaWNpdCBgYWdlbnRgXCIsXG4gICAgKTtcbiAgfVxuICAvLyBUaW55IHJlc29sdmVyIHNoYXJlZCBieSBHRVQgLyBERUxFVEU6IGRlcml2ZSB0aGUgYWN0aXZlIGFnZW50XG4gIC8vIGFuZCB0aHJlYWQgaWQsIHJldHVybmluZyBhIEpTT04gZXJyb3IgcmVzcG9uc2Ugd2hlbiBlaXRoZXIgaXNcbiAgLy8gbWlzc2luZy4gS2VlcHMgYm90aCBoYW5kbGVycyB0aGluIGFuZCBnaXZlcyB0aGVtIGlkZW50aWNhbFxuICAvLyB2YWxpZGF0aW9uIGJlaGF2aW91ci5cbiAgY29uc3QgcmVzb2x2ZUNvbnRleHQgPSAoYzogQ29udGV4dFdpdGhNYXN0cmEpID0+IHtcbiAgICBjb25zdCBtYXN0cmEgPSBjLmdldChcIm1hc3RyYVwiKTtcbiAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGMuZ2V0KFwicmVxdWVzdENvbnRleHRcIik7XG4gICAgY29uc3QgYWdlbnRJZCA9IGZpeGVkQWdlbnQgPz8gYy5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgIGlmICghYWdlbnRJZCkge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGMuanNvbih7IGVycm9yOiBcImFnZW50SWQgaXMgcmVxdWlyZWRcIiB9LCA0MDApIH0gYXMgY29uc3Q7XG4gICAgfVxuICAgIGNvbnN0IGFnZW50ID0gbWFzdHJhLmdldEFnZW50QnlJZChhZ2VudElkKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogYy5qc29uKHsgZXJyb3I6IGBVbmtub3duIGFnZW50IFwiJHthZ2VudElkfVwiYCB9LCA0MDQpLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICB9XG4gICAgY29uc3QgdGhyZWFkSWQgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXRocmVhZElkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogYy5qc29uKHsgZXJyb3I6IFwidGhyZWFkIGlkIG1pc3NpbmcgZnJvbSByZXF1ZXN0IGNvbnRleHRcIiB9LCA0MDApLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgYWdlbnRJZCwgYWdlbnQsIHRocmVhZElkLCByZXNvdXJjZUlkIH0gYXMgY29uc3Q7XG4gIH07XG5cbiAgcmV0dXJuIFtcbiAgICByZWdpc3RlckFwaVJvdXRlKHBhdGgsIHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjOiBDb250ZXh0V2l0aE1hc3RyYSkgPT4ge1xuICAgICAgICBjb25zdCBjdHggPSByZXNvbHZlQ29udGV4dChjKTtcbiAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiBjdHgpIHJldHVybiBjdHguZXJyb3I7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBsb2FkSGlzdG9yeSh7XG4gICAgICAgICAgYWdlbnQ6IGN0eC5hZ2VudCxcbiAgICAgICAgICB0aHJlYWRJZDogY3R4LnRocmVhZElkLFxuICAgICAgICAgIC4uLihjdHgucmVzb3VyY2VJZCA/IHsgcmVzb3VyY2VJZDogY3R4LnJlc291cmNlSWQgfSA6IHt9KSxcbiAgICAgICAgICBwYWdlOiBwYXJzZUludFBhcmFtKGMucmVxLnF1ZXJ5KFwicGFnZVwiKSksXG4gICAgICAgICAgcGVyUGFnZTogcGFyc2VJbnRQYXJhbShjLnJlcS5xdWVyeShcInBlclBhZ2VcIikpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGMuanNvbihwYXlsb2FkKTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShwYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYzogQ29udGV4dFdpdGhNYXN0cmEpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gcmVzb2x2ZUNvbnRleHQoYyk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gY3R4KSByZXR1cm4gY3R4LmVycm9yO1xuICAgICAgICBjb25zdCB7IGNsZWFyZWQgfSA9IGF3YWl0IGNsZWFySGlzdG9yeSh7XG4gICAgICAgICAgYWdlbnQ6IGN0eC5hZ2VudCxcbiAgICAgICAgICB0aHJlYWRJZDogY3R4LnRocmVhZElkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogTWFzdHJhQ2xlYXJIaXN0b3J5UmVzcG9uc2UgPSB7XG4gICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgYWdlbnRJZDogY3R4LmFnZW50SWQsXG4gICAgICAgICAgdGhyZWFkSWQ6IGN0eC50aHJlYWRJZCxcbiAgICAgICAgICBjbGVhcmVkLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYy5qc29uKHBheWxvYWQpO1xuICAgICAgfSxcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBTb3J0IG1lc3NhZ2VzIG9sZGVzdC1maXJzdCBieSBgY3JlYXRlZEF0YCwgZmFsbGluZyBiYWNrIHRvIHdoYXRldmVyXG4gKiBvcmRlciB0aGUgc3RvcmFnZSByZXR1cm5lZCB0aGVtIGluLiBUaGUgbmF0aXZlIGByZWNhbGxgIGNhbGwgaG9ub3JzXG4gKiBgb3JkZXJCeWAgYnV0IGRvZXNuJ3QgZ3VhcmFudGVlIGEgc3RhYmxlIHNlY29uZGFyeSBzb3J0LCBzbyB3ZVxuICogbm9ybWFsaXplIGhlcmUgYmVmb3JlIGhhbmRpbmcgdGhlIHBhZ2UgdG8gdGhlIEFJIFNESyBjb252ZXJ0ZXIuXG4gKi9cbmZ1bmN0aW9uIHNvcnRDaHJvbm9sb2dpY2FsKG1lc3NhZ2VzOiBNYXN0cmFEQk1lc3NhZ2VbXSk6IE1hc3RyYURCTWVzc2FnZVtdIHtcbiAgcmV0dXJuIFsuLi5tZXNzYWdlc10uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHRhID0gdG9FcG9jaChhLmNyZWF0ZWRBdCk7XG4gICAgY29uc3QgdGIgPSB0b0Vwb2NoKGIuY3JlYXRlZEF0KTtcbiAgICByZXR1cm4gdGEgLSB0YjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRXBvY2godmFsdWU6IHVua25vd24pOiBudW1iZXIge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdmFsdWUuZ2V0VGltZSgpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQpID8gMCA6IHBhcnNlZDtcbiAgfVxuICByZXR1cm4gMDtcbn1cbiJdfQ==
package/lib/src/mcp.d.ts CHANGED
@@ -13,8 +13,8 @@
13
13
  */
14
14
  import type { Agent } from "@mastra/core/agent";
15
15
  import { MCPServer } from "@mastra/mcp";
16
- import type { MastraTools } from "./agents.js";
17
- import type { MastraPluginConfig } from "./config.js";
16
+ import type { MastraTools } from "./agents.ts";
17
+ import type { MastraPluginConfig } from "./config.ts";
18
18
  /**
19
19
  * A built MCP server plus the request paths it answers on, relative to
20
20
  * the plugin's base path (`/api/<plugin>`).
package/lib/src/mcp.js CHANGED
@@ -62,4 +62,4 @@ export function buildMcpServer(opts) {
62
62
  messagePath: "/messages",
63
63
  };
64
64
  }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21jcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS3hDLHFFQUFxRTtBQUNyRSxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztBQTZCcEM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQU05QjtJQUNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3ZFLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQW9CLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVuRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQztJQUNqRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQztJQUMvQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztJQUU1QyxvRUFBb0U7SUFDcEUsd0NBQXdDO0lBQ3hDLE1BQU0sS0FBSyxHQUFnQjtRQUN6QixHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7S0FDL0IsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDO1FBQzNCLEVBQUUsRUFBRSxRQUFRO1FBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksR0FBRyxXQUFXLE1BQU07UUFDM0MsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksbUJBQW1CO1FBQ2hELEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkMsS0FBSztLQUNOLENBQUMsQ0FBQztJQUVILHNFQUFzRTtJQUN0RSxpRUFBaUU7SUFDakUsT0FBTztRQUNMLFFBQVE7UUFDUixNQUFNO1FBQ04sUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLE1BQU07UUFDZixXQUFXLEVBQUUsV0FBVztLQUN6QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3B0aW9uYWwgTWFzdHJhIE1DUCBzZXJ2ZXIgZXhwb3N1cmUgZm9yIHRoZSBBcHBLaXQgTWFzdHJhIHBsdWdpbi5cbiAqXG4gKiBUdXJucyB0aGUgcGx1Z2luJ3MgcmVnaXN0ZXJlZCBhZ2VudHMgKGFuZCwgb3B0LWluLCBpdHMgYW1iaWVudCB0b29scylcbiAqIGludG8gYSBNYXN0cmEgYE1DUFNlcnZlcmAgc28gZXh0ZXJuYWwgTUNQIGNsaWVudHMgLSBDbGF1ZGUgRGVza3RvcCxcbiAqIEN1cnNvciwgdGhlIE1hc3RyYSBwbGF5Z3JvdW5kLCBvciBhbm90aGVyIGFnZW50IC0gY2FuIGNhbGwgdGhlbSBvdmVyXG4gKiB0aGUgc3RhbmRhcmQgTUNQIHRyYW5zcG9ydHMuIFRoZSByZXN1bHRpbmcgc2VydmVyIGlzIGhhbmRlZCB0byB0aGVcbiAqIGBNYXN0cmFgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHdoaWNoIG1ha2VzIGBAbWFzdHJhL2V4cHJlc3NgXG4gKiBzZXJ2ZSB0aGUgc3RvY2sgTUNQIHJvdXRlcyB1bmRlciB0aGUgcGx1Z2luJ3MgYmFzZSBwYXRoOyB0aGUgcGx1Z2luXG4gKiBuZXZlciByZWdpc3RlcnMgYSBiZXNwb2tlIE1DUCByb3V0ZSBvZiBpdHMgb3duLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTUNQU2VydmVyIH0gZnJvbSBcIkBtYXN0cmEvbWNwXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMgfSBmcm9tIFwiLi9hZ2VudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcblxuLyoqIE1DUCBzZXJ2ZXIgdmVyc2lvbiBhZHZlcnRpc2VkIHdoZW4gdGhlIGNhbGxlciBkb2Vzbid0IHBpbiBvbmUuICovXG5jb25zdCBERUZBVUxUX01DUF9WRVJTSU9OID0gXCIxLjAuMFwiO1xuXG4vKipcbiAqIEEgYnVpbHQgTUNQIHNlcnZlciBwbHVzIHRoZSByZXF1ZXN0IHBhdGhzIGl0IGFuc3dlcnMgb24sIHJlbGF0aXZlIHRvXG4gKiB0aGUgcGx1Z2luJ3MgYmFzZSBwYXRoIChgL2FwaS88cGx1Z2luPmApLlxuICpcbiAqIFRoZSBwYXRocyBhcmUgdGhlICoqY2xlYW4gcHVibGljIGFsaWFzZXMqKiAoYC9tY3BgLCBgL3NzZWAsXG4gKiBgL21lc3NhZ2VzYCkgdGhlIHBsdWdpbiBleHBvc2VzLiBgQG1hc3RyYS9leHByZXNzYCBhY3R1YWxseSBtb3VudHMgdGhlXG4gKiB0cmFuc3BvcnRzIHVuZGVyIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gIG9mZiB0aGUgYE1hc3RyYWBcbiAqIGluc3RhbmNlJ3MgYG1jcFNlcnZlcnNgOyB0aGUgcGx1Z2luIHJld3JpdGVzIHRoZSBhbGlhcyB0byB0aGF0IHJvdXRlXG4gKiBiZWZvcmUgZGlzcGF0Y2ggKHNlZSB7QGxpbmsgUmVzb2x2ZWRNY3Auc2VydmVySWR9KSwgc28gYSBjbGllbnQgbmV2ZXJcbiAqIHNlZXMgdGhlIGRvdWJsZWQgYC9tY3AvPHNlcnZlcklkPi9tY3BgIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRNY3Age1xuICAvKipcbiAgICogUmVnaXN0cnkgaWQsIHVzZWQgaW4gdGhlIHVuZGVybHlpbmcgYEBtYXN0cmEvZXhwcmVzc2Agcm91dGVcbiAgICogKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgdGhlIHBsdWdpbiByZXdyaXRlcyB0aGUgY2xlYW4gYWxpYXMgdG8uXG4gICAqL1xuICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAvKiogVGhlIE1hc3RyYSBNQ1Agc2VydmVyIHRvIGhhbmQgdG8gYG5ldyBNYXN0cmEoeyBtY3BTZXJ2ZXJzIH0pYC4gKi9cbiAgc2VydmVyOiBNQ1BTZXJ2ZXI7XG4gIC8qKiBTdHJlYW1hYmxlLUhUVFAgdHJhbnNwb3J0IHBhdGgsIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gYmFzZSBwYXRoLiAqL1xuICBodHRwUGF0aDogc3RyaW5nO1xuICAvKiogU1NFIHRyYW5zcG9ydCBwYXRoLCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGJhc2UgcGF0aC4gKi9cbiAgc3NlUGF0aDogc3RyaW5nO1xuICAvKiogU1NFIG1lc3NhZ2UgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBiYXNlIHBhdGguICovXG4gIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHBsdWdpbidzIE1DUCBzZXJ2ZXIsIG9yIGBudWxsYCBvbmx5IHdoZW4gYGNvbmZpZy5tY3BgIGlzXG4gKiBleHBsaWNpdGx5IGBmYWxzZWAuXG4gKlxuICogQWdlbnQgZXhwb3N1cmUgaXMgb24gYnkgZGVmYXVsdCBiZWNhdXNlIGl0J3MgY2hlYXA6IHRoZSBhbHJlYWR5LVxuICogcmVnaXN0ZXJlZCBhZ2VudHMgYXJlIHdyYXBwZWQgYXMgYGFza188YWdlbnRJZD5gIHRvb2xzIGFuZCBoYW5kZWQgdG9cbiAqIGBAbWFzdHJhL2V4cHJlc3NgIChhbHJlYWR5IG1vdW50ZWQgZm9yIHRoZSBjaGF0IHJvdXRlcykgLSBubyBleHRyYVxuICogcHJvY2VzcywgZGVwZW5kZW5jeSwgb3IgbmV0d29yayBjb3N0LCBhbmQgcmVxdWVzdHMgcnVuIHVuZGVyIHRoZSBzYW1lXG4gKiBPQk8gc2NvcGUuIFNvIGB1bmRlZmluZWRgICh0aGUgZGVmYXVsdCkgYW5kIGB0cnVlYCBib3RoIGV4cG9zZSBldmVyeVxuICogcmVnaXN0ZXJlZCBhZ2VudCB1bmRlciBhIHNlcnZlciBpZCBlcXVhbCB0byB0aGUgcGx1Z2luIG5hbWU7IG9ubHlcbiAqIGBmYWxzZWAgdHVybnMgTUNQIG9mZi4gVGhlIG9iamVjdCBmb3JtICh7QGxpbmsgTWFzdHJhTWNwQ29uZmlnfSkgdHVuZXNcbiAqIHRoZSBpZCAvIGFkdmVydGlzZWQgbWV0YWRhdGEgYW5kIGNhbiBhZGRpdGlvbmFsbHkgZXhwb3NlIHRoZSBwbHVnaW4nc1xuICogYW1iaWVudCB0b29scyBvciBhIHNldCBvZiBleHRyYSBNQ1Atb25seSB0b29scy4gQW1iaWVudCB0b29scyBzdGF5IG9mZlxuICogdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZCAtIHRoZXkgYXNzdW1lIGFuIGluLXByb2Nlc3MgY2hhdCB0dXJuLCBzb1xuICogdGhleSBhcmVuJ3QgY2hlYXAgLyBzYWZlIHRvIGV4cG9zZSB0byBhIHN0YW5kYWxvbmUgTUNQIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWNwU2VydmVyKG9wdHM6IHtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59KTogUmVzb2x2ZWRNY3AgfCBudWxsIHtcbiAgY29uc3QgeyBjb25maWcsIHBsdWdpbk5hbWUsIGRpc3BsYXlOYW1lLCBhZ2VudHMsIGFtYmllbnRUb29scyB9ID0gb3B0cztcbiAgaWYgKGNvbmZpZy5tY3AgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgc2V0dGluZ3M6IE1hc3RyYU1jcENvbmZpZyA9IHR5cGVvZiBjb25maWcubWNwID09PSBcIm9iamVjdFwiID8gY29uZmlnLm1jcCA6IHt9O1xuXG4gIGNvbnN0IHNlcnZlcklkID0gc2V0dGluZ3Muc2VydmVySWQgPz8gcGx1Z2luTmFtZTtcbiAgY29uc3QgZXhwb3NlQWdlbnRzID0gc2V0dGluZ3MuYWdlbnRzICE9PSBmYWxzZTtcbiAgY29uc3QgZXhwb3NlVG9vbHMgPSBzZXR0aW5ncy50b29scyA9PT0gdHJ1ZTtcblxuICAvLyBNQ1BTZXJ2ZXJDb25maWcudG9vbHMgaXMgcmVxdWlyZWQsIHNvIGFsd2F5cyBwYXNzIGEgcmVjb3JkIChlbXB0eVxuICAvLyB3aGVuIHRoZSBjYWxsZXIgZXhwb3NlcyBvbmx5IGFnZW50cykuXG4gIGNvbnN0IHRvb2xzOiBNYXN0cmFUb29scyA9IHtcbiAgICAuLi4oZXhwb3NlVG9vbHMgPyBhbWJpZW50VG9vbHMgOiB7fSksXG4gICAgLi4uKHNldHRpbmdzLmV4dHJhVG9vbHMgPz8ge30pLFxuICB9O1xuXG4gIGNvbnN0IHNlcnZlciA9IG5ldyBNQ1BTZXJ2ZXIoe1xuICAgIGlkOiBzZXJ2ZXJJZCxcbiAgICBuYW1lOiBzZXR0aW5ncy5uYW1lID8/IGAke2Rpc3BsYXlOYW1lfSBNQ1BgLFxuICAgIHZlcnNpb246IHNldHRpbmdzLnZlcnNpb24gPz8gREVGQVVMVF9NQ1BfVkVSU0lPTixcbiAgICAuLi4oc2V0dGluZ3MuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBzZXR0aW5ncy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgIC4uLihleHBvc2VBZ2VudHMgPyB7IGFnZW50cyB9IDoge30pLFxuICAgIHRvb2xzLFxuICB9KTtcblxuICAvLyBBZHZlcnRpc2UgdGhlIGNsZWFuIGFsaWFzZXM7IHRoZSBwbHVnaW4gcmV3cml0ZXMgdGhlc2UgdG8gdGhlIHN0b2NrXG4gIC8vIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gIHJvdXRlcyBgQG1hc3RyYS9leHByZXNzYCBtb3VudHMuXG4gIHJldHVybiB7XG4gICAgc2VydmVySWQsXG4gICAgc2VydmVyLFxuICAgIGh0dHBQYXRoOiBcIi9tY3BcIixcbiAgICBzc2VQYXRoOiBcIi9zc2VcIixcbiAgICBtZXNzYWdlUGF0aDogXCIvbWVzc2FnZXNcIixcbiAgfTtcbn1cbiJdfQ==
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21jcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS3hDLHFFQUFxRTtBQUNyRSxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztBQTZCcEM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQU05QjtJQUNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3ZFLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQW9CLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVuRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQztJQUNqRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQztJQUMvQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztJQUU1QyxvRUFBb0U7SUFDcEUsd0NBQXdDO0lBQ3hDLE1BQU0sS0FBSyxHQUFnQjtRQUN6QixHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7S0FDL0IsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDO1FBQzNCLEVBQUUsRUFBRSxRQUFRO1FBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksR0FBRyxXQUFXLE1BQU07UUFDM0MsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksbUJBQW1CO1FBQ2hELEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkMsS0FBSztLQUNOLENBQUMsQ0FBQztJQUVILHNFQUFzRTtJQUN0RSxpRUFBaUU7SUFDakUsT0FBTztRQUNMLFFBQVE7UUFDUixNQUFNO1FBQ04sUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLE1BQU07UUFDZixXQUFXLEVBQUUsV0FBVztLQUN6QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3B0aW9uYWwgTWFzdHJhIE1DUCBzZXJ2ZXIgZXhwb3N1cmUgZm9yIHRoZSBBcHBLaXQgTWFzdHJhIHBsdWdpbi5cbiAqXG4gKiBUdXJucyB0aGUgcGx1Z2luJ3MgcmVnaXN0ZXJlZCBhZ2VudHMgKGFuZCwgb3B0LWluLCBpdHMgYW1iaWVudCB0b29scylcbiAqIGludG8gYSBNYXN0cmEgYE1DUFNlcnZlcmAgc28gZXh0ZXJuYWwgTUNQIGNsaWVudHMgLSBDbGF1ZGUgRGVza3RvcCxcbiAqIEN1cnNvciwgdGhlIE1hc3RyYSBwbGF5Z3JvdW5kLCBvciBhbm90aGVyIGFnZW50IC0gY2FuIGNhbGwgdGhlbSBvdmVyXG4gKiB0aGUgc3RhbmRhcmQgTUNQIHRyYW5zcG9ydHMuIFRoZSByZXN1bHRpbmcgc2VydmVyIGlzIGhhbmRlZCB0byB0aGVcbiAqIGBNYXN0cmFgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHdoaWNoIG1ha2VzIGBAbWFzdHJhL2V4cHJlc3NgXG4gKiBzZXJ2ZSB0aGUgc3RvY2sgTUNQIHJvdXRlcyB1bmRlciB0aGUgcGx1Z2luJ3MgYmFzZSBwYXRoOyB0aGUgcGx1Z2luXG4gKiBuZXZlciByZWdpc3RlcnMgYSBiZXNwb2tlIE1DUCByb3V0ZSBvZiBpdHMgb3duLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTUNQU2VydmVyIH0gZnJvbSBcIkBtYXN0cmEvbWNwXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxuLyoqIE1DUCBzZXJ2ZXIgdmVyc2lvbiBhZHZlcnRpc2VkIHdoZW4gdGhlIGNhbGxlciBkb2Vzbid0IHBpbiBvbmUuICovXG5jb25zdCBERUZBVUxUX01DUF9WRVJTSU9OID0gXCIxLjAuMFwiO1xuXG4vKipcbiAqIEEgYnVpbHQgTUNQIHNlcnZlciBwbHVzIHRoZSByZXF1ZXN0IHBhdGhzIGl0IGFuc3dlcnMgb24sIHJlbGF0aXZlIHRvXG4gKiB0aGUgcGx1Z2luJ3MgYmFzZSBwYXRoIChgL2FwaS88cGx1Z2luPmApLlxuICpcbiAqIFRoZSBwYXRocyBhcmUgdGhlICoqY2xlYW4gcHVibGljIGFsaWFzZXMqKiAoYC9tY3BgLCBgL3NzZWAsXG4gKiBgL21lc3NhZ2VzYCkgdGhlIHBsdWdpbiBleHBvc2VzLiBgQG1hc3RyYS9leHByZXNzYCBhY3R1YWxseSBtb3VudHMgdGhlXG4gKiB0cmFuc3BvcnRzIHVuZGVyIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gIG9mZiB0aGUgYE1hc3RyYWBcbiAqIGluc3RhbmNlJ3MgYG1jcFNlcnZlcnNgOyB0aGUgcGx1Z2luIHJld3JpdGVzIHRoZSBhbGlhcyB0byB0aGF0IHJvdXRlXG4gKiBiZWZvcmUgZGlzcGF0Y2ggKHNlZSB7QGxpbmsgUmVzb2x2ZWRNY3Auc2VydmVySWR9KSwgc28gYSBjbGllbnQgbmV2ZXJcbiAqIHNlZXMgdGhlIGRvdWJsZWQgYC9tY3AvPHNlcnZlcklkPi9tY3BgIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRNY3Age1xuICAvKipcbiAgICogUmVnaXN0cnkgaWQsIHVzZWQgaW4gdGhlIHVuZGVybHlpbmcgYEBtYXN0cmEvZXhwcmVzc2Agcm91dGVcbiAgICogKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgdGhlIHBsdWdpbiByZXdyaXRlcyB0aGUgY2xlYW4gYWxpYXMgdG8uXG4gICAqL1xuICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAvKiogVGhlIE1hc3RyYSBNQ1Agc2VydmVyIHRvIGhhbmQgdG8gYG5ldyBNYXN0cmEoeyBtY3BTZXJ2ZXJzIH0pYC4gKi9cbiAgc2VydmVyOiBNQ1BTZXJ2ZXI7XG4gIC8qKiBTdHJlYW1hYmxlLUhUVFAgdHJhbnNwb3J0IHBhdGgsIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gYmFzZSBwYXRoLiAqL1xuICBodHRwUGF0aDogc3RyaW5nO1xuICAvKiogU1NFIHRyYW5zcG9ydCBwYXRoLCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGJhc2UgcGF0aC4gKi9cbiAgc3NlUGF0aDogc3RyaW5nO1xuICAvKiogU1NFIG1lc3NhZ2UgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBiYXNlIHBhdGguICovXG4gIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHBsdWdpbidzIE1DUCBzZXJ2ZXIsIG9yIGBudWxsYCBvbmx5IHdoZW4gYGNvbmZpZy5tY3BgIGlzXG4gKiBleHBsaWNpdGx5IGBmYWxzZWAuXG4gKlxuICogQWdlbnQgZXhwb3N1cmUgaXMgb24gYnkgZGVmYXVsdCBiZWNhdXNlIGl0J3MgY2hlYXA6IHRoZSBhbHJlYWR5LVxuICogcmVnaXN0ZXJlZCBhZ2VudHMgYXJlIHdyYXBwZWQgYXMgYGFza188YWdlbnRJZD5gIHRvb2xzIGFuZCBoYW5kZWQgdG9cbiAqIGBAbWFzdHJhL2V4cHJlc3NgIChhbHJlYWR5IG1vdW50ZWQgZm9yIHRoZSBjaGF0IHJvdXRlcykgLSBubyBleHRyYVxuICogcHJvY2VzcywgZGVwZW5kZW5jeSwgb3IgbmV0d29yayBjb3N0LCBhbmQgcmVxdWVzdHMgcnVuIHVuZGVyIHRoZSBzYW1lXG4gKiBPQk8gc2NvcGUuIFNvIGB1bmRlZmluZWRgICh0aGUgZGVmYXVsdCkgYW5kIGB0cnVlYCBib3RoIGV4cG9zZSBldmVyeVxuICogcmVnaXN0ZXJlZCBhZ2VudCB1bmRlciBhIHNlcnZlciBpZCBlcXVhbCB0byB0aGUgcGx1Z2luIG5hbWU7IG9ubHlcbiAqIGBmYWxzZWAgdHVybnMgTUNQIG9mZi4gVGhlIG9iamVjdCBmb3JtICh7QGxpbmsgTWFzdHJhTWNwQ29uZmlnfSkgdHVuZXNcbiAqIHRoZSBpZCAvIGFkdmVydGlzZWQgbWV0YWRhdGEgYW5kIGNhbiBhZGRpdGlvbmFsbHkgZXhwb3NlIHRoZSBwbHVnaW4nc1xuICogYW1iaWVudCB0b29scyBvciBhIHNldCBvZiBleHRyYSBNQ1Atb25seSB0b29scy4gQW1iaWVudCB0b29scyBzdGF5IG9mZlxuICogdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZCAtIHRoZXkgYXNzdW1lIGFuIGluLXByb2Nlc3MgY2hhdCB0dXJuLCBzb1xuICogdGhleSBhcmVuJ3QgY2hlYXAgLyBzYWZlIHRvIGV4cG9zZSB0byBhIHN0YW5kYWxvbmUgTUNQIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWNwU2VydmVyKG9wdHM6IHtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59KTogUmVzb2x2ZWRNY3AgfCBudWxsIHtcbiAgY29uc3QgeyBjb25maWcsIHBsdWdpbk5hbWUsIGRpc3BsYXlOYW1lLCBhZ2VudHMsIGFtYmllbnRUb29scyB9ID0gb3B0cztcbiAgaWYgKGNvbmZpZy5tY3AgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgc2V0dGluZ3M6IE1hc3RyYU1jcENvbmZpZyA9IHR5cGVvZiBjb25maWcubWNwID09PSBcIm9iamVjdFwiID8gY29uZmlnLm1jcCA6IHt9O1xuXG4gIGNvbnN0IHNlcnZlcklkID0gc2V0dGluZ3Muc2VydmVySWQgPz8gcGx1Z2luTmFtZTtcbiAgY29uc3QgZXhwb3NlQWdlbnRzID0gc2V0dGluZ3MuYWdlbnRzICE9PSBmYWxzZTtcbiAgY29uc3QgZXhwb3NlVG9vbHMgPSBzZXR0aW5ncy50b29scyA9PT0gdHJ1ZTtcblxuICAvLyBNQ1BTZXJ2ZXJDb25maWcudG9vbHMgaXMgcmVxdWlyZWQsIHNvIGFsd2F5cyBwYXNzIGEgcmVjb3JkIChlbXB0eVxuICAvLyB3aGVuIHRoZSBjYWxsZXIgZXhwb3NlcyBvbmx5IGFnZW50cykuXG4gIGNvbnN0IHRvb2xzOiBNYXN0cmFUb29scyA9IHtcbiAgICAuLi4oZXhwb3NlVG9vbHMgPyBhbWJpZW50VG9vbHMgOiB7fSksXG4gICAgLi4uKHNldHRpbmdzLmV4dHJhVG9vbHMgPz8ge30pLFxuICB9O1xuXG4gIGNvbnN0IHNlcnZlciA9IG5ldyBNQ1BTZXJ2ZXIoe1xuICAgIGlkOiBzZXJ2ZXJJZCxcbiAgICBuYW1lOiBzZXR0aW5ncy5uYW1lID8/IGAke2Rpc3BsYXlOYW1lfSBNQ1BgLFxuICAgIHZlcnNpb246IHNldHRpbmdzLnZlcnNpb24gPz8gREVGQVVMVF9NQ1BfVkVSU0lPTixcbiAgICAuLi4oc2V0dGluZ3MuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBzZXR0aW5ncy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgIC4uLihleHBvc2VBZ2VudHMgPyB7IGFnZW50cyB9IDoge30pLFxuICAgIHRvb2xzLFxuICB9KTtcblxuICAvLyBBZHZlcnRpc2UgdGhlIGNsZWFuIGFsaWFzZXM7IHRoZSBwbHVnaW4gcmV3cml0ZXMgdGhlc2UgdG8gdGhlIHN0b2NrXG4gIC8vIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gIHJvdXRlcyBgQG1hc3RyYS9leHByZXNzYCBtb3VudHMuXG4gIHJldHVybiB7XG4gICAgc2VydmVySWQsXG4gICAgc2VydmVyLFxuICAgIGh0dHBQYXRoOiBcIi9tY3BcIixcbiAgICBzc2VQYXRoOiBcIi9zc2VcIixcbiAgICBtZXNzYWdlUGF0aDogXCIvbWVzc2FnZXNcIixcbiAgfTtcbn1cbiJdfQ==
@@ -31,8 +31,8 @@
31
31
  import { Memory } from "@mastra/memory";
32
32
  import { PostgresStore } from "@mastra/pg";
33
33
  import { Pool, type PoolConfig } from "pg";
34
- import type { MastraAgentDefinition } from "./agents.js";
35
- import type { MastraPluginConfig } from "./config.js";
34
+ import type { MastraAgentDefinition } from "./agents.ts";
35
+ import type { MastraPluginConfig } from "./config.ts";
36
36
  /**
37
37
  * Build a dedicated **service-principal** Lakebase pool for Mastra
38
38
  * memory from the lakebase plugin's resolved SP pg config.