UNPKG

@glimmer/syntax

Version:
313 lines (282 loc) 24.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadResolution = loadResolution; exports.ARGUMENT_RESOLUTION = exports.LooseModeResolution = exports.STRICT_RESOLUTION = exports.StrictResolution = void 0; /** * A free variable is resolved according to a resolution rule: * * 1. Strict resolution * 2. Namespaced resolution * 3. Fallback resolution */ /** * Strict resolution is used: * * 1. in a strict mode template * 2. in an unambiguous invocation with dot paths */ var StrictResolution = /*#__PURE__*/function () { function StrictResolution() { this.isAngleBracket = false; } var _proto = StrictResolution.prototype; _proto.resolution = function resolution() { return 31 /* GetStrictFree */ ; }; _proto.serialize = function serialize() { return 'Strict'; }; return StrictResolution; }(); exports.StrictResolution = StrictResolution; var STRICT_RESOLUTION = new StrictResolution(); /** * A `LooseModeResolution` includes: * * - 0 or more namespaces to resolve the variable in * - optional fallback behavior * * In practice, there are a limited number of possible combinations of these degrees of freedom, * and they are captured by the `Ambiguity` union below. */ exports.STRICT_RESOLUTION = STRICT_RESOLUTION; var LooseModeResolution = /*#__PURE__*/function () { function LooseModeResolution(ambiguity, isAngleBracket) { if (isAngleBracket === void 0) { isAngleBracket = false; } this.ambiguity = ambiguity; this.isAngleBracket = isAngleBracket; } /** * Namespaced resolution is used in an unambiguous syntax position: * * 1. `(sexp)` (namespace: `Helper`) * 2. `{{#block}}` (namespace: `Component`) * 3. `<a {{modifier}}>` (namespace: `Modifier`) * 4. `<Component />` (namespace: `Component`) * * @see {NamespacedAmbiguity} */ LooseModeResolution.namespaced = function namespaced(namespace, isAngleBracket) { if (isAngleBracket === void 0) { isAngleBracket = false; } return new LooseModeResolution({ namespaces: [namespace], fallback: false }, isAngleBracket); } /** * Fallback resolution is used when no namespaced resolutions are possible, but fallback * resolution is still allowed. * * ```hbs * {{x.y}} * ``` * * @see {FallbackAmbiguity} */ ; LooseModeResolution.fallback = function fallback() { return new LooseModeResolution({ namespaces: [], fallback: true }); } /** * Append resolution is used when the variable should be resolved in both the `component` and * `helper` namespaces. Fallback resolution is optional. * * ```hbs * {{x}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces with fallback resolution. * * ```hbs * {{x y}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces without fallback * resolution. * * @see {ComponentOrHelperAmbiguity} */ ; LooseModeResolution.append = function append(_ref) { var invoke = _ref.invoke; return new LooseModeResolution({ namespaces: ["Component" /* Component */ , "Helper" /* Helper */ ], fallback: !invoke }); } /** * Trusting append resolution is used when the variable should be resolved in both the `component` and * `helper` namespaces. Fallback resolution is optional. * * ```hbs * {{{x}}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces with fallback resolution. * * ```hbs * {{{x y}}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces without fallback * resolution. * * @see {HelperAmbiguity} */ ; LooseModeResolution.trustingAppend = function trustingAppend(_ref2) { var invoke = _ref2.invoke; return new LooseModeResolution({ namespaces: ["Helper" /* Helper */ ], fallback: !invoke }); } /** * Attribute resolution is used when the variable should be resolved as a `helper` with fallback * resolution. * * ```hbs * <a href={{x}} /> * <a href="{{x}}.html" /> * ``` * * ^ resolved in the `helper` namespace with fallback * * @see {HelperAmbiguity} */ ; LooseModeResolution.attr = function attr() { return new LooseModeResolution({ namespaces: ["Helper" /* Helper */ ], fallback: true }); }; var _proto2 = LooseModeResolution.prototype; _proto2.resolution = function resolution() { if (this.ambiguity.namespaces.length === 0) { return 31 /* GetStrictFree */ ; } else if (this.ambiguity.namespaces.length === 1) { if (this.ambiguity.fallback) { // simple namespaced resolution with fallback must be attr={{x}} return 36 /* GetFreeAsHelperHeadOrThisFallback */ ; } else { // simple namespaced resolution without fallback switch (this.ambiguity.namespaces[0]) { case "Helper" /* Helper */ : return 37 /* GetFreeAsHelperHead */ ; case "Modifier" /* Modifier */ : return 38 /* GetFreeAsModifierHead */ ; case "Component" /* Component */ : return 39 /* GetFreeAsComponentHead */ ; } } } else if (this.ambiguity.fallback) { // component or helper + fallback ({{something}}) return 34 /* GetFreeAsComponentOrHelperHeadOrThisFallback */ ; } else { // component or helper without fallback ({{something something}}) return 35 /* GetFreeAsComponentOrHelperHead */ ; } }; _proto2.serialize = function serialize() { if (this.ambiguity.namespaces.length === 0) { return 'Loose'; } else if (this.ambiguity.namespaces.length === 1) { if (this.ambiguity.fallback) { // simple namespaced resolution with fallback must be attr={{x}} return ['ambiguous', "Attr" /* Attr */ ]; } else { return ['ns', this.ambiguity.namespaces[0]]; } } else if (this.ambiguity.fallback) { // component or helper + fallback ({{something}}) return ['ambiguous', "Append" /* Append */ ]; } else { // component or helper without fallback ({{something something}}) return ['ambiguous', "Invoke" /* Invoke */ ]; } }; return LooseModeResolution; }(); exports.LooseModeResolution = LooseModeResolution; var ARGUMENT_RESOLUTION = LooseModeResolution.fallback(); exports.ARGUMENT_RESOLUTION = ARGUMENT_RESOLUTION; function loadResolution(resolution) { if (typeof resolution === 'string') { switch (resolution) { case 'Loose': return LooseModeResolution.fallback(); case 'Strict': return STRICT_RESOLUTION; } } switch (resolution[0]) { case 'ambiguous': switch (resolution[1]) { case "Append" /* Append */ : return LooseModeResolution.append({ invoke: false }); case "Attr" /* Attr */ : return LooseModeResolution.attr(); case "Invoke" /* Invoke */ : return LooseModeResolution.append({ invoke: true }); } case 'ns': return LooseModeResolution.namespaced(resolution[1]); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9vYmplY3RzL3Jlc29sdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7QUFVQTs7Ozs7O0FBTUEsSUFBTSxnQkFBTixHQUFBLGFBQUEsWUFBQTtBQUFBLFdBQUEsZ0JBQUEsR0FBQTtBQVNXLFNBQUEsY0FBQSxHQUFBLEtBQUE7QUFDVjs7QUFWRCxNQUFBLE1BQUEsR0FBQSxnQkFBQSxDQUFBLFNBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsVUFBQSxHQUNFLFNBQUEsVUFBQSxHQUFVO0FBQ1IsV0FBQTtBQUFBO0FBQUE7QUFGSixHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLFNBQUEsR0FLRSxTQUFBLFNBQUEsR0FBUztBQUNQLFdBQUEsUUFBQTtBQU5KLEdBQUE7O0FBQUEsU0FBQSxnQkFBQTtBQUFBLENBQUEsRUFBQTs7O0FBWU8sSUFBTSxpQkFBaUIsR0FBRyxJQUExQixnQkFBMEIsRUFBMUI7QUFFUDs7Ozs7Ozs7Ozs7O0FBU0EsSUFBTSxtQkFBTixHQUFBLGFBQUEsWUFBQTtBQXdHRSxXQUFBLG1CQUFBLENBQUEsU0FBQSxFQUFBLGNBQUEsRUFBMEU7QUFBQSxRQUF0QixjQUFzQixLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQXRCLE1BQUEsY0FBc0IsR0FBMUUsS0FBb0Q7QUFBc0I7O0FBQXJELFNBQUEsU0FBQSxHQUFBLFNBQUE7QUFBK0IsU0FBQSxjQUFBLEdBQUEsY0FBQTtBQUEwQjtBQXZHOUU7Ozs7Ozs7Ozs7OztBQURGLEVBQUEsbUJBQUEsQ0FBQSxVQUFBLEdBV0UsU0FBQSxVQUFBLENBQUEsU0FBQSxFQUFBLGNBQUEsRUFBcUU7QUFBQSxRQUF0QixjQUFzQixLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQXRCLE1BQUEsY0FBc0IsR0FBckUsS0FBK0M7QUFBc0I7O0FBQ25FLFdBQU8sSUFBQSxtQkFBQSxDQUNM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QW5CLFVBQUEsQ0FBK0IsVUFBVSxDQUFoRCxDQUFnRCxDQUF6QyxDQUFQO0FBWko7QUFjRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBmcmVlIHZhcmlhYmxlIGlzIHJlc29sdmVkIGFjY29yZGluZyB0byBhIHJlc29sdXRpb24gcnVsZTpcbiAqXG4gKiAxLiBTdHJpY3QgcmVzb2x1dGlvblxuICogMi4gTmFtZXNwYWNlZCByZXNvbHV0aW9uXG4gKiAzLiBGYWxsYmFjayByZXNvbHV0aW9uXG4gKi9cblxuaW1wb3J0IHsgR2V0Q29udGV4dHVhbEZyZWVPcCwgU2V4cE9wY29kZXMgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBTdHJpY3QgcmVzb2x1dGlvbiBpcyB1c2VkOlxuICpcbiAqIDEuIGluIGEgc3RyaWN0IG1vZGUgdGVtcGxhdGVcbiAqIDIuIGluIGFuIHVuYW1iaWd1b3VzIGludm9jYXRpb24gd2l0aCBkb3QgcGF0aHNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmljdFJlc29sdXRpb24ge1xuICByZXNvbHV0aW9uKCk6IEdldENvbnRleHR1YWxGcmVlT3Age1xuICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRTdHJpY3RGcmVlO1xuICB9XG5cbiAgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRSZXNvbHV0aW9uIHtcbiAgICByZXR1cm4gJ1N0cmljdCc7XG4gIH1cblxuICByZWFkb25seSBpc0FuZ2xlQnJhY2tldCA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3QgU1RSSUNUX1JFU09MVVRJT04gPSBuZXcgU3RyaWN0UmVzb2x1dGlvbigpO1xuXG4vKipcbiAqIEEgYExvb3NlTW9kZVJlc29sdXRpb25gIGluY2x1ZGVzOlxuICpcbiAqIC0gMCBvciBtb3JlIG5hbWVzcGFjZXMgdG8gcmVzb2x2ZSB0aGUgdmFyaWFibGUgaW5cbiAqIC0gb3B0aW9uYWwgZmFsbGJhY2sgYmVoYXZpb3JcbiAqXG4gKiBJbiBwcmFjdGljZSwgdGhlcmUgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHRoZXNlIGRlZ3JlZXMgb2YgZnJlZWRvbSxcbiAqIGFuZCB0aGV5IGFyZSBjYXB0dXJlZCBieSB0aGUgYEFtYmlndWl0eWAgdW5pb24gYmVsb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb29zZU1vZGVSZXNvbHV0aW9uIHtcbiAgLyoqXG4gICAqIE5hbWVzcGFjZWQgcmVzb2x1dGlvbiBpcyB1c2VkIGluIGFuIHVuYW1iaWd1b3VzIHN5bnRheCBwb3NpdGlvbjpcbiAgICpcbiAgICogMS4gYChzZXhwKWAgKG5hbWVzcGFjZTogYEhlbHBlcmApXG4gICAqIDIuIGB7eyNibG9ja319YCAobmFtZXNwYWNlOiBgQ29tcG9uZW50YClcbiAgICogMy4gYDxhIHt7bW9kaWZpZXJ9fT5gIChuYW1lc3BhY2U6IGBNb2RpZmllcmApXG4gICAqIDQuIGA8Q29tcG9uZW50IC8+YCAobmFtZXNwYWNlOiBgQ29tcG9uZW50YClcbiAgICpcbiAgICogQHNlZSB7TmFtZXNwYWNlZEFtYmlndWl0eX1cbiAgICovXG4gIHN0YXRpYyBuYW1lc3BhY2VkKG5hbWVzcGFjZTogRnJlZVZhck5hbWVzcGFjZSwgaXNBbmdsZUJyYWNrZXQgPSBmYWxzZSk6IExvb3NlTW9kZVJlc29sdXRpb24ge1xuICAgIHJldHVybiBuZXcgTG9vc2VNb2RlUmVzb2x1dGlvbihcbiAgICAgIHtcbiAgICAgICAgbmFtZXNwYWNlczogW25hbWVzcGFjZV0sXG4gICAgICAgIGZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBpc0FuZ2xlQnJhY2tldFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgcmVzb2x1dGlvbiBpcyB1c2VkIHdoZW4gbm8gbmFtZXNwYWNlZCByZXNvbHV0aW9ucyBhcmUgcG9zc2libGUsIGJ1dCBmYWxsYmFja1xuICAgKiByZXNvbHV0aW9uIGlzIHN0aWxsIGFsbG93ZWQuXG4gICAqXG4gICAqIGBgYGhic1xuICAgKiB7e3gueX19XG4gICAqIGBgYFxuICAgKlxuICAgKiBAc2VlIHtGYWxsYmFja0FtYmlndWl0eX1cbiAgICovXG4gIHN0YXRpYyBmYWxsYmFjaygpOiBMb29zZU1vZGVSZXNvbHV0aW9uIHtcbiAgICByZXR1cm4gbmV3IExvb3NlTW9kZVJlc29sdXRpb24oeyBuYW1lc3BhY2VzOiBbXSwgZmFsbGJhY2s6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIHJlc29sdXRpb24gaXMgdXNlZCB3aGVuIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gYm90aCB0aGUgYGNvbXBvbmVudGAgYW5kXG4gICAqIGBoZWxwZXJgIG5hbWVzcGFjZXMuIEZhbGxiYWNrIHJlc29sdXRpb24gaXMgb3B0aW9uYWwuXG4gICAqXG4gICAqIGBgYGhic1xuICAgKiB7e3h9fVxuICAgKiBgYGBcbiAgICpcbiAgICogXiBgeGAgc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBgY29tcG9uZW50YCBhbmQgYGhlbHBlcmAgbmFtZXNwYWNlcyB3aXRoIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAqXG4gICAqIGBgYGhic1xuICAgKiB7e3ggeX19XG4gICAqIGBgYFxuICAgKlxuICAgKiBeIGB4YCBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gdGhlIGBjb21wb25lbnRgIGFuZCBgaGVscGVyYCBuYW1lc3BhY2VzIHdpdGhvdXQgZmFsbGJhY2tcbiAgICogcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHNlZSB7Q29tcG9uZW50T3JIZWxwZXJBbWJpZ3VpdHl9XG4gICAqL1xuICBzdGF0aWMgYXBwZW5kKHsgaW52b2tlIH06IHsgaW52b2tlOiBib29sZWFuIH0pOiBMb29zZU1vZGVSZXNvbHV0aW9uIHtcbiAgICByZXR1cm4gbmV3IExvb3NlTW9kZVJlc29sdXRpb24oe1xuICAgICAgbmFtZXNwYWNlczogW0ZyZWVWYXJOYW1lc3BhY2UuQ29tcG9uZW50LCBGcmVlVmFyTmFtZXNwYWNlLkhlbHBlcl0sXG4gICAgICBmYWxsYmFjazogIWludm9rZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVzdGluZyBhcHBlbmQgcmVzb2x1dGlvbiBpcyB1c2VkIHdoZW4gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSByZXNvbHZlZCBpbiBib3RoIHRoZSBgY29tcG9uZW50YCBhbmRcbiAgICogYGhlbHBlcmAgbmFtZXNwYWNlcy4gRmFsbGJhY2sgcmVzb2x1dGlvbiBpcyBvcHRpb25hbC5cbiAgICpcbiAgICogYGBgaGJzXG4gICAqIHt7e3h9fX1cbiAgICogYGBgXG4gICAqXG4gICAqIF4gYHhgIHNob3VsZCBiZSByZXNvbHZlZCBpbiB0aGUgYGNvbXBvbmVudGAgYW5kIGBoZWxwZXJgIG5hbWVzcGFjZXMgd2l0aCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBgYGBoYnNcbiAgICoge3t7eCB5fX19XG4gICAqIGBgYFxuICAgKlxuICAgKiBeIGB4YCBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gdGhlIGBjb21wb25lbnRgIGFuZCBgaGVscGVyYCBuYW1lc3BhY2VzIHdpdGhvdXQgZmFsbGJhY2tcbiAgICogcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHNlZSB7SGVscGVyQW1iaWd1aXR5fVxuICAgKi9cbiAgc3RhdGljIHRydXN0aW5nQXBwZW5kKHsgaW52b2tlIH06IHsgaW52b2tlOiBib29sZWFuIH0pOiBMb29zZU1vZGVSZXNvbHV0aW9uIHtcbiAgICByZXR1cm4gbmV3IExvb3NlTW9kZVJlc29sdXRpb24oe1xuICAgICAgbmFtZXNwYWNlczogW0ZyZWVWYXJOYW1lc3BhY2UuSGVscGVyXSxcbiAgICAgIGZhbGxiYWNrOiAhaW52b2tlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZSByZXNvbHV0aW9uIGlzIHVzZWQgd2hlbiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHJlc29sdmVkIGFzIGEgYGhlbHBlcmAgd2l0aCBmYWxsYmFja1xuICAgKiByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBgYGBoYnNcbiAgICogPGEgaHJlZj17e3h9fSAvPlxuICAgKiA8YSBocmVmPVwie3t4fX0uaHRtbFwiIC8+XG4gICAqIGBgYFxuICAgKlxuICAgKiBeIHJlc29sdmVkIGluIHRoZSBgaGVscGVyYCBuYW1lc3BhY2Ugd2l0aCBmYWxsYmFja1xuICAgKlxuICAgKiBAc2VlIHtIZWxwZXJBbWJpZ3VpdHl9XG4gICAqL1xuICBzdGF0aWMgYXR0cigpOiBMb29zZU1vZGVSZXNvbHV0aW9uIHtcbiAgICByZXR1cm4gbmV3IExvb3NlTW9kZVJlc29sdXRpb24oeyBuYW1lc3BhY2VzOiBbRnJlZVZhck5hbWVzcGFjZS5IZWxwZXJdLCBmYWxsYmFjazogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGFtYmlndWl0eTogQW1iaWd1aXR5LCByZWFkb25seSBpc0FuZ2xlQnJhY2tldCA9IGZhbHNlKSB7fVxuXG4gIHJlc29sdXRpb24oKTogR2V0Q29udGV4dHVhbEZyZWVPcCB7XG4gICAgaWYgKHRoaXMuYW1iaWd1aXR5Lm5hbWVzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0U3RyaWN0RnJlZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYW1iaWd1aXR5Lm5hbWVzcGFjZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAodGhpcy5hbWJpZ3VpdHkuZmFsbGJhY2spIHtcbiAgICAgICAgLy8gc2ltcGxlIG5hbWVzcGFjZWQgcmVzb2x1dGlvbiB3aXRoIGZhbGxiYWNrIG11c3QgYmUgYXR0cj17e3h9fVxuICAgICAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0RnJlZUFzSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2ltcGxlIG5hbWVzcGFjZWQgcmVzb2x1dGlvbiB3aXRob3V0IGZhbGxiYWNrXG4gICAgICAgIHN3aXRjaCAodGhpcy5hbWJpZ3VpdHkubmFtZXNwYWNlc1swXSkge1xuICAgICAgICAgIGNhc2UgRnJlZVZhck5hbWVzcGFjZS5IZWxwZXI6XG4gICAgICAgICAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0RnJlZUFzSGVscGVySGVhZDtcbiAgICAgICAgICBjYXNlIEZyZWVWYXJOYW1lc3BhY2UuTW9kaWZpZXI6XG4gICAgICAgICAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0RnJlZUFzTW9kaWZpZXJIZWFkO1xuICAgICAgICAgIGNhc2UgRnJlZVZhck5hbWVzcGFjZS5Db21wb25lbnQ6XG4gICAgICAgICAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0RnJlZUFzQ29tcG9uZW50SGVhZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5hbWJpZ3VpdHkuZmFsbGJhY2spIHtcbiAgICAgIC8vIGNvbXBvbmVudCBvciBoZWxwZXIgKyBmYWxsYmFjayAoe3tzb21ldGhpbmd9fSlcbiAgICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNDb21wb25lbnRPckhlbHBlckhlYWRPclRoaXNGYWxsYmFjaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcG9uZW50IG9yIGhlbHBlciB3aXRob3V0IGZhbGxiYWNrICh7e3NvbWV0aGluZyBzb21ldGhpbmd9fSlcbiAgICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNDb21wb25lbnRPckhlbHBlckhlYWQ7XG4gICAgfVxuICB9XG5cbiAgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRSZXNvbHV0aW9uIHtcbiAgICBpZiAodGhpcy5hbWJpZ3VpdHkubmFtZXNwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnTG9vc2UnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hbWJpZ3VpdHkubmFtZXNwYWNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmICh0aGlzLmFtYmlndWl0eS5mYWxsYmFjaykge1xuICAgICAgICAvLyBzaW1wbGUgbmFtZXNwYWNlZCByZXNvbHV0aW9uIHdpdGggZmFsbGJhY2sgbXVzdCBiZSBhdHRyPXt7eH19XG4gICAgICAgIHJldHVybiBbJ2FtYmlndW91cycsIFNlcmlhbGl6ZWRBbWJpZ3VpdHkuQXR0cl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWyducycsIHRoaXMuYW1iaWd1aXR5Lm5hbWVzcGFjZXNbMF1dO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5hbWJpZ3VpdHkuZmFsbGJhY2spIHtcbiAgICAgIC8vIGNvbXBvbmVudCBvciBoZWxwZXIgKyBmYWxsYmFjayAoe3tzb21ldGhpbmd9fSlcbiAgICAgIHJldHVybiBbJ2FtYmlndW91cycsIFNlcmlhbGl6ZWRBbWJpZ3VpdHkuQXBwZW5kXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcG9uZW50IG9yIGhlbHBlciB3aXRob3V0IGZhbGxiYWNrICh7e3NvbWV0aGluZyBzb21ldGhpbmd9fSlcbiAgICAgIHJldHVybiBbJ2FtYmlndW91cycsIFNlcmlhbGl6ZWRBbWJpZ3VpdHkuSW52b2tlXTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEFSR1VNRU5UX1JFU09MVVRJT04gPSBMb29zZU1vZGVSZXNvbHV0aW9uLmZhbGxiYWNrKCk7XG5cbmV4cG9ydCBjb25zdCBlbnVtIEZyZWVWYXJOYW1lc3BhY2Uge1xuICBIZWxwZXIgPSAnSGVscGVyJyxcbiAgTW9kaWZpZXIgPSAnTW9kaWZpZXInLFxuICBDb21wb25lbnQgPSAnQ29tcG9uZW50Jyxcbn1cblxuLyoqXG4gKiBBIGBDb21wb25lbnRPckhlbHBlckFtYmlndWl0eWAgbWlnaHQgYmUgYSBjb21wb25lbnQgb3IgYSBoZWxwZXIsIHdpdGggYW4gb3B0aW9uYWwgZmFsbGJhY2tcbiAqXG4gKiBgYGBoYnNcbiAqIHt7eH19XG4gKiBgYGBcbiAqXG4gKiBeIGB4YCBpcyByZXNvbHZlZCBpbiB0aGUgYGNvbXBvbmVudGAgYW5kIGBoZWxwZXJgIG5hbWVzcGFjZXMsIHdpdGggZmFsbGJhY2tcbiAqXG4gKiBgYGBoYnNcbiAqIHt7eCB5fX1cbiAqIGBgYFxuICpcbiAqIF4gYHhgIGlzIHJlc29sdmVkIGluIHRoZSBgY29tcG9uZW50YCBhbmQgYGhlbHBlcmAgbmFtZXNwYWNlcywgd2l0aG91dCBmYWxsYmFja1xuICovXG50eXBlIENvbXBvbmVudE9ySGVscGVyQW1iaWd1aXR5ID0ge1xuICBuYW1lc3BhY2VzOiBbRnJlZVZhck5hbWVzcGFjZS5Db21wb25lbnQsIEZyZWVWYXJOYW1lc3BhY2UuSGVscGVyXTtcbiAgZmFsbGJhY2s6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEEgYEhlbHBlckFtYmlndWl0eWAgbXVzdCBiZSBhIGhlbHBlciwgYnV0IGl0IGhhcyBmYWxsYmFjay4gSWYgaXQgZGlkbid0IGhhdmUgZmFsbGJhY2ssIGl0IHdvdWxkXG4gKiBiZSBhIGBOYW1lc3BhY2VkQW1iaWd1aXR5YC5cbiAqXG4gKiBgYGBoYnNcbiAqIDxhIGhyZWY9e3t4fX0gLz5cbiAqIDxhIGhyZWY9XCJ7e3h9fS5odG1sXCIgLz5cbiAqIGBgYFxuICpcbiAqIF4gYHhgIGlzIHJlc29sdmVkIGluIHRoZSBgaGVscGVyYCBuYW1lc3BhY2Ugd2l0aCBmYWxsYmFja1xuICovXG50eXBlIEhlbHBlckFtYmlndWl0eSA9IHsgbmFtZXNwYWNlczogW0ZyZWVWYXJOYW1lc3BhY2UuSGVscGVyXTsgZmFsbGJhY2s6IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBBIGBOYW1lc3BhY2VkQW1iaWd1aXR5YCBtdXN0IGJlIHJlc29sdmVkIGluIGEgcGFydGljdWxhciBuYW1lc3BhY2UsIHdpdGhvdXQgZmFsbGJhY2suXG4gKlxuICogYGBgaGJzXG4gKiA8WCAvPlxuICogYGBgXG4gKlxuICogXiBgWGAgaXMgcmVzb2x2ZWQgaW4gdGhlIGBjb21wb25lbnRgIG5hbWVzcGFjZSB3aXRob3V0IGZhbGxiYWNrXG4gKlxuICogYGBgaGJzXG4gKiAoeClcbiAqIGBgYFxuICpcbiAqIF4gYHhgIGlzIHJlc29sdmVkIGluIHRoZSBgaGVscGVyYCBuYW1lc3BhY2Ugd2l0aG91dCBmYWxsYmFja1xuICpcbiAqIGBgYGhic1xuICogPGEge3t4fX0gLz5cbiAqIGBgYFxuICpcbiAqIF4gYHhgIGlzIHJlc29sdmVkIGluIHRoZSBgbW9kaWZpZXJgIG5hbWVzcGFjZSB3aXRob3V0IGZhbGxiYWNrXG4gKi9cbnR5cGUgTmFtZXNwYWNlZEFtYmlndWl0eSA9IHtcbiAgbmFtZXNwYWNlczogW0ZyZWVWYXJOYW1lc3BhY2UuQ29tcG9uZW50IHwgRnJlZVZhck5hbWVzcGFjZS5IZWxwZXIgfCBGcmVlVmFyTmFtZXNwYWNlLk1vZGlmaWVyXTtcbiAgZmFsbGJhY2s6IGZhbHNlO1xufTtcblxudHlwZSBGYWxsYmFja0FtYmlndWl0eSA9IHtcbiAgbmFtZXNwYWNlczogW107XG4gIGZhbGxiYWNrOiB0cnVlO1xufTtcblxudHlwZSBBbWJpZ3VpdHkgPVxuICB8IENvbXBvbmVudE9ySGVscGVyQW1iaWd1aXR5XG4gIHwgSGVscGVyQW1iaWd1aXR5XG4gIHwgTmFtZXNwYWNlZEFtYmlndWl0eVxuICB8IEZhbGxiYWNrQW1iaWd1aXR5O1xuXG5leHBvcnQgdHlwZSBGcmVlVmFyUmVzb2x1dGlvbiA9IFN0cmljdFJlc29sdXRpb24gfCBMb29zZU1vZGVSZXNvbHV0aW9uO1xuXG4vLyBTZXJpYWxpemF0aW9uXG5cbmNvbnN0IGVudW0gU2VyaWFsaXplZEFtYmlndWl0eSB7XG4gIC8vIHt7eH19XG4gIEFwcGVuZCA9ICdBcHBlbmQnLFxuICAvLyBocmVmPXt7eH19XG4gIEF0dHIgPSAnQXR0cicsXG4gIC8vIHt7eCB5fX0gKG5vdCBhdHRyKVxuICBJbnZva2UgPSAnSW52b2tlJyxcbn1cblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFJlc29sdXRpb24gPVxuICB8ICdTdHJpY3QnXG4gIHwgJ0xvb3NlJ1xuICB8IFsnbnMnLCBGcmVlVmFyTmFtZXNwYWNlXVxuICB8IFsnYW1iaWd1b3VzJywgU2VyaWFsaXplZEFtYmlndWl0eV07XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmVzb2x1dGlvbihyZXNvbHV0aW9uOiBTZXJpYWxpemVkUmVzb2x1dGlvbik6IEZyZWVWYXJSZXNvbHV0aW9uIHtcbiAgaWYgKHR5cGVvZiByZXNvbHV0aW9uID09PSAnc3RyaW5nJykge1xuICAgIHN3aXRjaCAocmVzb2x1dGlvbikge1xuICAgICAgY2FzZSAnTG9vc2UnOlxuICAgICAgICByZXR1cm4gTG9vc2VNb2RlUmVzb2x1dGlvbi5mYWxsYmFjaygpO1xuICAgICAgY2FzZSAnU3RyaWN0JzpcbiAgICAgICAgcmV0dXJuIFNUUklDVF9SRVNPTFVUSU9OO1xuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAocmVzb2x1dGlvblswXSkge1xuICAgIGNhc2UgJ2FtYmlndW91cyc6XG4gICAgICBzd2l0Y2ggKHJlc29sdXRpb25bMV0pIHtcbiAgICAgICAgY2FzZSBTZXJpYWxpemVkQW1iaWd1aXR5LkFwcGVuZDpcbiAgICAgICAgICByZXR1cm4gTG9vc2VNb2RlUmVzb2x1dGlvbi5hcHBlbmQoeyBpbnZva2U6IGZhbHNlIH0pO1xuICAgICAgICBjYXNlIFNlcmlhbGl6ZWRBbWJpZ3VpdHkuQXR0cjpcbiAgICAgICAgICByZXR1cm4gTG9vc2VNb2RlUmVzb2x1dGlvbi5hdHRyKCk7XG4gICAgICAgIGNhc2UgU2VyaWFsaXplZEFtYmlndWl0eS5JbnZva2U6XG4gICAgICAgICAgcmV0dXJuIExvb3NlTW9kZVJlc29sdXRpb24uYXBwZW5kKHsgaW52b2tlOiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgY2FzZSAnbnMnOlxuICAgICAgcmV0dXJuIExvb3NlTW9kZVJlc29sdXRpb24ubmFtZXNwYWNlZChyZXNvbHV0aW9uWzFdKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==