ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
355 lines (298 loc) • 28.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Arguments = undefined;
var _util = require("@glimmer/util");
var _reference = require("@glimmer/reference");
var _references = require("../references");
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Arguments = exports.Arguments = function () {
function Arguments() {
_classCallCheck(this, Arguments);
this.stack = null;
this.positional = new PositionalArguments();
this.named = new NamedArguments();
}
Arguments.prototype.empty = function empty() {
this.setup(null, true);
return this;
};
Arguments.prototype.setup = function setup(stack, synthetic) {
this.stack = stack;
var names = stack.fromTop(0);
var namedCount = names.length;
var positionalCount = stack.fromTop(namedCount + 1);
var start = positionalCount + namedCount + 2;
var positional = this.positional;
positional.setup(stack, start, positionalCount);
var named = this.named;
named.setup(stack, namedCount, names, synthetic);
};
Arguments.prototype.at = function at(pos) {
return this.positional.at(pos);
};
Arguments.prototype.get = function get(name) {
return this.named.get(name);
};
Arguments.prototype.capture = function capture() {
return {
tag: this.tag,
length: this.length,
positional: this.positional.capture(),
named: this.named.capture()
};
};
Arguments.prototype.clear = function clear() {
var stack = this.stack,
length = this.length;
stack.pop(length + 2);
};
_createClass(Arguments, [{
key: 'tag',
get: function () {
return (0, _reference.combineTagged)([this.positional, this.named]);
}
}, {
key: 'length',
get: function () {
return this.positional.length + this.named.length;
}
}]);
return Arguments;
}();
var PositionalArguments = function () {
function PositionalArguments() {
_classCallCheck(this, PositionalArguments);
this.length = 0;
this.stack = null;
this.start = 0;
this._tag = null;
this._references = null;
}
PositionalArguments.prototype.setup = function setup(stack, start, length) {
this.stack = stack;
this.start = start;
this.length = length;
this._tag = null;
this._references = null;
};
PositionalArguments.prototype.at = function at(position) {
var start = this.start,
length = this.length;
if (position < 0 || position >= length) {
return _references.UNDEFINED_REFERENCE;
}
// stack: pos1, pos2, pos3, named1, named2
// start: 4 (top - 4)
//
// at(0) === pos1 === top - start
// at(1) === pos2 === top - (start - 1)
// at(2) === pos3 === top - (start - 2)
var fromTop = start - position - 1;
return this.stack.fromTop(fromTop);
};
PositionalArguments.prototype.capture = function capture() {
return new CapturedPositionalArguments(this.tag, this.references);
};
_createClass(PositionalArguments, [{
key: 'tag',
get: function () {
var tag = this._tag;
if (!tag) {
tag = this._tag = (0, _reference.combineTagged)(this.references);
}
return tag;
}
}, {
key: 'references',
get: function () {
var references = this._references;
if (!references) {
var length = this.length;
references = this._references = new Array(length);
for (var i = 0; i < length; i++) {
references[i] = this.at(i);
}
}
return references;
}
}]);
return PositionalArguments;
}();
var CapturedPositionalArguments = function () {
function CapturedPositionalArguments(tag, references) {
var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : references.length;
_classCallCheck(this, CapturedPositionalArguments);
this.tag = tag;
this.references = references;
this.length = length;
}
CapturedPositionalArguments.prototype.at = function at(position) {
return this.references[position];
};
CapturedPositionalArguments.prototype.value = function value() {
return this.references.map(this.valueOf);
};
CapturedPositionalArguments.prototype.get = function get(name) {
var references = this.references,
length = this.length;
if (name === 'length') {
return _references.PrimitiveReference.create(length);
} else {
var idx = parseInt(name, 10);
if (idx < 0 || idx >= length) {
return _references.UNDEFINED_REFERENCE;
} else {
return references[idx];
}
}
};
CapturedPositionalArguments.prototype.valueOf = function valueOf(reference) {
return reference.value();
};
return CapturedPositionalArguments;
}();
var NamedArguments = function () {
function NamedArguments() {
_classCallCheck(this, NamedArguments);
this.length = 0;
this._tag = null;
this._references = null;
this._names = null;
this._realNames = _util.EMPTY_ARRAY;
}
NamedArguments.prototype.setup = function setup(stack, length, names, synthetic) {
this.stack = stack;
this.length = length;
this._tag = null;
this._references = null;
if (synthetic) {
this._names = names;
this._realNames = _util.EMPTY_ARRAY;
} else {
this._names = null;
this._realNames = names;
}
};
NamedArguments.prototype.has = function has(name) {
return this.names.indexOf(name) !== -1;
};
NamedArguments.prototype.get = function get(name) {
var names = this.names,
length = this.length;
var idx = names.indexOf(name);
if (idx === -1) {
return _references.UNDEFINED_REFERENCE;
}
// stack: pos1, pos2, pos3, named1, named2
// start: 4 (top - 4)
// namedDict: { named1: 1, named2: 0 };
//
// get('named1') === named1 === top - (start - 1)
// get('named2') === named2 === top - start
var fromTop = length - idx;
return this.stack.fromTop(fromTop);
};
NamedArguments.prototype.capture = function capture() {
return new CapturedNamedArguments(this.tag, this.names, this.references);
};
NamedArguments.prototype.sliceName = function sliceName(name) {
return name.slice(1);
};
_createClass(NamedArguments, [{
key: 'tag',
get: function () {
return (0, _reference.combineTagged)(this.references);
}
}, {
key: 'names',
get: function () {
var names = this._names;
if (!names) {
names = this._names = this._realNames.map(this.sliceName);
}
return names;
}
}, {
key: 'references',
get: function () {
var references = this._references;
if (!references) {
var names = this.names,
length = this.length;
references = this._references = [];
for (var i = 0; i < length; i++) {
references[i] = this.get(names[i]);
}
}
return references;
}
}]);
return NamedArguments;
}();
var CapturedNamedArguments = function () {
function CapturedNamedArguments(tag, names, references) {
_classCallCheck(this, CapturedNamedArguments);
this.tag = tag;
this.names = names;
this.references = references;
this.length = names.length;
this._map = null;
}
CapturedNamedArguments.prototype.has = function has(name) {
return this.names.indexOf(name) !== -1;
};
CapturedNamedArguments.prototype.get = function get(name) {
var names = this.names,
references = this.references;
var idx = names.indexOf(name);
if (idx === -1) {
return _references.UNDEFINED_REFERENCE;
} else {
return references[idx];
}
};
CapturedNamedArguments.prototype.value = function value() {
var names = this.names,
references = this.references;
var out = (0, _util.dict)();
for (var i = 0; i < names.length; i++) {
var name = names[i];
out[name] = references[i].value();
}
return out;
};
_createClass(CapturedNamedArguments, [{
key: 'map',
get: function () {
var map = this._map;
if (!map) {
var names = this.names,
references = this.references;
map = this._map = (0, _util.dict)();
for (var i = 0; i < names.length; i++) {
var name = names[i];
map[name] = references[i];
}
}
return map;
}
}]);
return CapturedNamedArguments;
}();
exports.default = new Arguments();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92bS9hcmd1bWVudHMuanMiXSwibmFtZXMiOlsiZGljdCIsIkVNUFRZX0FSUkFZIiwiY29tYmluZVRhZ2dlZCIsIlByaW1pdGl2ZVJlZmVyZW5jZSIsIlVOREVGSU5FRF9SRUZFUkVOQ0UiLCJBcmd1bWVudHMiLCJzdGFjayIsInBvc2l0aW9uYWwiLCJQb3NpdGlvbmFsQXJndW1lbnRzIiwibmFtZWQiLCJOYW1lZEFyZ3VtZW50cyIsImVtcHR5Iiwic2V0dXAiLCJzeW50aGV0aWMiLCJuYW1lcyIsImZyb21Ub3AiLCJuYW1lZENvdW50IiwibGVuZ3RoIiwicG9zaXRpb25hbENvdW50Iiwic3RhcnQiLCJhdCIsInBvcyIsImdldCIsIm5hbWUiLCJjYXB0dXJlIiwidGFnIiwiY2xlYXIiLCJwb3AiLCJfdGFnIiwiX3JlZmVyZW5jZXMiLCJwb3NpdGlvbiIsIkNhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyIsInJlZmVyZW5jZXMiLCJBcnJheSIsImkiLCJ2YWx1ZSIsIm1hcCIsInZhbHVlT2YiLCJjcmVhdGUiLCJpZHgiLCJwYXJzZUludCIsInJlZmVyZW5jZSIsIl9uYW1lcyIsIl9yZWFsTmFtZXMiLCJoYXMiLCJpbmRleE9mIiwiQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyIsInNsaWNlTmFtZSIsInNsaWNlIiwiX21hcCIsIm91dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLEFBQVMsQUFBTSxBQUFtQjs7QUFDbEMsQUFBUyxBQUFxQjs7QUFDOUIsQUFBUyxBQUFvQixBQUEyQixBQUN4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsQUFBYSw0Q0FDVDt5QkFBYzs4QkFDVjs7YUFBQSxBQUFLLFFBQUwsQUFBYSxBQUNiO2FBQUEsQUFBSyxhQUFhLElBQWxCLEFBQWtCLEFBQUksQUFDdEI7YUFBQSxBQUFLLFFBQVEsSUFBYixBQUFhLEFBQUksQUFDcEI7QUFMTDs7d0JBQUEsQUFNSSx5QkFBUSxBQUNKO2FBQUEsQUFBSyxNQUFMLEFBQVcsTUFBWCxBQUFp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QUFwQixBQUEwQixRQUExQixBQUFrQyxLQUFLLEFBQ25DO3dCQUFJLE9BQU8sTUFBWCxBQUFXLEFBQU0sQUFDakI7d0JBQUEsQUFBSSxRQUFRLFdBQVosQUFBWSxBQUFXLEFBQzFCO0FBQ0o7QUFDRDttQkFBQSxBQUFPLEFBQ1Y7Ozs7O0FBdUJMOztrQkFBZSxJQUFmLEFBQWUsQUFBSSIsImZpbGUiOiJsaWIvdm0vYXJndW1lbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGljdCwgRU1QVFlfQVJSQVkgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IGNvbWJpbmVUYWdnZWQgfSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgUHJpbWl0aXZlUmVmZXJlbmNlLCBVTkRFRklORURfUkVGRVJFTkNFIH0gZnJvbSAnLi4vcmVmZXJlbmNlcyc7XG5leHBvcnQgY2xhc3MgQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGFjayA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zaXRpb25hbCA9IG5ldyBQb3NpdGlvbmFsQXJndW1lbnRzKCk7XG4gICAgICAgIHRoaXMubmFtZWQgPSBuZXcgTmFtZWRBcmd1bWVudHMoKTtcbiAgICB9XG4gICAgZW1wdHkoKSB7XG4gICAgICAgIHRoaXMuc2V0dXAobnVsbCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXR1cChzdGFjaywgc3ludGhldGljKSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgbGV0IG5hbWVzID0gc3RhY2suZnJvbVRvcCgwKTtcbiAgICAgICAgbGV0IG5hbWVkQ291bnQgPSBuYW1lcy5sZW5ndGg7XG4gICAgICAgIGxldCBwb3NpdGlvbmFsQ291bnQgPSBzdGFjay5mcm9tVG9wKG5hbWVkQ291bnQgKyAxKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gcG9zaXRpb25hbENvdW50ICsgbmFtZWRDb3VudCArIDI7XG4gICAgICAgIGxldCBwb3NpdGlvbmFsID0gdGhpcy5wb3NpdGlvbmFsO1xuICAgICAgICBwb3NpdGlvbmFsLnNldHVwKHN0YWNrLCBzdGFydCwgcG9zaXRpb25hbENvdW50KTtcbiAgICAgICAgbGV0IG5hbWVkID0gdGhpcy5uYW1lZDtcbiAgICAgICAgbmFtZWQuc2V0dXAoc3RhY2ssIG5hbWVkQ291bnQsIG5hbWVzLCBzeW50aGV0aWMpO1xuICAgIH1cbiAgICBnZXQgdGFnKCkge1xuICAgICAgICByZXR1cm4gY29tYmluZVRhZ2dlZChbdGhpcy5wb3NpdGlvbmFsLCB0aGlzLm5hbWVkXSk7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uYWwubGVuZ3RoICsgdGhpcy5uYW1lZC5sZW5ndGg7XG4gICAgfVxuICAgIGF0KHBvcykge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbmFsLmF0KHBvcyk7XG4gICAgfVxuICAgIGdldChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVkLmdldChuYW1lKTtcbiAgICB9XG4gICAgY2FwdHVyZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRhZzogdGhpcy50YWcsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMubGVuZ3RoLFxuICAgICAgICAgICAgcG9zaXRpb25hbDogdGhpcy5wb3NpdGlvbmFsLmNhcHR1cmUoKSxcbiAgICAgICAgICAgIG5hbWVkOiB0aGlzLm5hbWVkLmNhcHR1cmUoKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgbGV0IHsgc3RhY2ssIGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgc3RhY2sucG9wKGxlbmd0aCArIDIpO1xuICAgIH1cbn1cbmNsYXNzIFBvc2l0aW9uYWxBcmd1bWVudHMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICAgICAgdGhpcy5fdGFnID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgfVxuICAgIHNldHVwKHN0YWNrLCBzdGFydCwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5fdGFnID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgfVxuICAgIGdldCB0YWcoKSB7XG4gICAgICAgIGxldCB0YWcgPSB0aGlzLl90YWc7XG4gICAgICAgIGlmICghdGFnKSB7XG4gICAgICAgICAgICB0YWcgPSB0aGlzLl90YWcgPSBjb21iaW5lVGFnZ2VkKHRoaXMucmVmZXJlbmNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgYXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgICAgICB9XG4gICAgICAgIC8vIHN0YWNrOiBwb3MxLCBwb3MyLCBwb3MzLCBuYW1lZDEsIG5hbWVkMlxuICAgICAgICAvLyBzdGFydDogNCAodG9wIC0gNClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gYXQoMCkgPT09IHBvczEgPT09IHRvcCAtIHN0YXJ0XG4gICAgICAgIC8vIGF0KDEpID09PSBwb3MyID09PSB0b3AgLSAoc3RhcnQgLSAxKVxuICAgICAgICAvLyBhdCgyKSA9PT0gcG9zMyA9PT0gdG9wIC0gKHN0YXJ0IC0gMilcbiAgICAgICAgbGV0IGZyb21Ub3AgPSBzdGFydCAtIHBvc2l0aW9uIC0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2suZnJvbVRvcChmcm9tVG9wKTtcbiAgICB9XG4gICAgY2FwdHVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHModGhpcy50YWcsIHRoaXMucmVmZXJlbmNlcyk7XG4gICAgfVxuICAgIGdldCByZWZlcmVuY2VzKCkge1xuICAgICAgICBsZXQgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXM7XG4gICAgICAgIGlmICghcmVmZXJlbmNlcykge1xuICAgICAgICAgICAgbGV0IHsgbGVuZ3RoIH0gPSB0aGlzO1xuICAgICAgICAgICAgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzW2ldID0gdGhpcy5hdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgICB9XG59XG5jbGFzcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMge1xuICAgIGNvbnN0cnVjdG9yKHRhZywgcmVmZXJlbmNlcywgbGVuZ3RoID0gcmVmZXJlbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlcyA9IHJlZmVyZW5jZXM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cbiAgICBhdChwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VzW3Bvc2l0aW9uXTtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXMubWFwKHRoaXMudmFsdWVPZik7XG4gICAgfVxuICAgIGdldChuYW1lKSB7XG4gICAgICAgIGxldCB7IHJlZmVyZW5jZXMsIGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgaWYgKG5hbWUgPT09ICdsZW5ndGgnKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJpbWl0aXZlUmVmZXJlbmNlLmNyZWF0ZShsZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGlkeCA9IHBhcnNlSW50KG5hbWUsIDEwKTtcbiAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXNbaWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YWx1ZU9mKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gcmVmZXJlbmNlLnZhbHVlKCk7XG4gICAgfVxufVxuY2xhc3MgTmFtZWRBcmd1bWVudHMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3RhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9uYW1lcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlYWxOYW1lcyA9IEVNUFRZX0FSUkFZO1xuICAgIH1cbiAgICBzZXR1cChzdGFjaywgbGVuZ3RoLCBuYW1lcywgc3ludGhldGljKSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuX3RhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgICAgICBpZiAoc3ludGhldGljKSB7XG4gICAgICAgICAgICB0aGlzLl9uYW1lcyA9IG5hbWVzO1xuICAgICAgICAgICAgdGhpcy5fcmVhbE5hbWVzID0gRU1QVFlfQVJSQVk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9uYW1lcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZWFsTmFtZXMgPSBuYW1lcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgdGFnKCkge1xuICAgICAgICByZXR1cm4gY29tYmluZVRhZ2dlZCh0aGlzLnJlZmVyZW5jZXMpO1xuICAgIH1cbiAgICBnZXQgbmFtZXMoKSB7XG4gICAgICAgIGxldCBuYW1lcyA9IHRoaXMuX25hbWVzO1xuICAgICAgICBpZiAoIW5hbWVzKSB7XG4gICAgICAgICAgICBuYW1lcyA9IHRoaXMuX25hbWVzID0gdGhpcy5fcmVhbE5hbWVzLm1hcCh0aGlzLnNsaWNlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWVzO1xuICAgIH1cbiAgICBoYXMobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgICB9XG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgbGV0IHsgbmFtZXMsIGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgbGV0IGlkeCA9IG5hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdGFjazogcG9zMSwgcG9zMiwgcG9zMywgbmFtZWQxLCBuYW1lZDJcbiAgICAgICAgLy8gc3RhcnQ6IDQgKHRvcCAtIDQpXG4gICAgICAgIC8vIG5hbWVkRGljdDogeyBuYW1lZDE6IDEsIG5hbWVkMjogMCB9O1xuICAgICAgICAvL1xuICAgICAgICAvLyBnZXQoJ25hbWVkMScpID09PSBuYW1lZDEgPT09IHRvcCAtIChzdGFydCAtIDEpXG4gICAgICAgIC8vIGdldCgnbmFtZWQyJykgPT09IG5hbWVkMiA9PT0gdG9wIC0gc3RhcnRcbiAgICAgICAgbGV0IGZyb21Ub3AgPSBsZW5ndGggLSBpZHg7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrLmZyb21Ub3AoZnJvbVRvcCk7XG4gICAgfVxuICAgIGNhcHR1cmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyh0aGlzLnRhZywgdGhpcy5uYW1lcywgdGhpcy5yZWZlcmVuY2VzKTtcbiAgICB9XG4gICAgZ2V0IHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIGxldCByZWZlcmVuY2VzID0gdGhpcy5fcmVmZXJlbmNlcztcbiAgICAgICAgaWYgKCFyZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICBsZXQgeyBuYW1lcywgbGVuZ3RoIH0gPSB0aGlzO1xuICAgICAgICAgICAgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzW2ldID0gdGhpcy5nZXQobmFtZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VzO1xuICAgIH1cbiAgICBzbGljZU5hbWUobmFtZSkge1xuICAgICAgICByZXR1cm4gbmFtZS5zbGljZSgxKTtcbiAgICB9XG59XG5jbGFzcyBDYXB0dXJlZE5hbWVkQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcsIG5hbWVzLCByZWZlcmVuY2VzKSB7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB0aGlzLm5hbWVzID0gbmFtZXM7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlcyA9IHJlZmVyZW5jZXM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbmFtZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgIH1cbiAgICBnZXQgbWFwKCkge1xuICAgICAgICBsZXQgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAoIW1hcCkge1xuICAgICAgICAgICAgbGV0IHsgbmFtZXMsIHJlZmVyZW5jZXMgfSA9IHRoaXM7XG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXAgPSBkaWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICAgICAgICBtYXBbbmFtZV0gPSByZWZlcmVuY2VzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICAgIGhhcyhuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICAgIH1cbiAgICBnZXQobmFtZSkge1xuICAgICAgICBsZXQgeyBuYW1lcywgcmVmZXJlbmNlcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGlkeCA9IG5hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzW2lkeF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCB7IG5hbWVzLCByZWZlcmVuY2VzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgb3V0ID0gZGljdCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgICAgICAgb3V0W25hbWVdID0gcmVmZXJlbmNlc1tpXS52YWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbmV3IEFyZ3VtZW50cygpOyJdfQ==