UNPKG

15.5 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.DynamicValueCounter = exports.DynamicValue = undefined;
7
8var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
9
10var _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; }; }();
11
12var _defined = require('defined');
13
14var _defined2 = _interopRequireDefault(_defined);
15
16function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
18function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
19
20function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
21
22var DynamicValue = exports.DynamicValue = function () {
23 _createClass(DynamicValue, null, [{
24 key: 'createCounter',
25 value: function createCounter() {
26 return new DynamicValueCounter();
27 }
28 }, {
29 key: 'pluck',
30 value: function pluck(scope, property, key) {
31 var value = undefined;
32 if (scope && null != scope[property]) {
33 value = null != key ? scope[property][key] : scope[property];
34 }
35
36 for (var _len = arguments.length, defaultValues = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
37 defaultValues[_key - 3] = arguments[_key];
38 }
39
40 return DynamicValue.primitive(_defined2.default.apply(undefined, [value].concat(defaultValues)));
41 }
42 }, {
43 key: 'primitive',
44 value: function primitive(v) {
45 var value = v;
46 if (null == v) {
47 value = undefined;
48 }
49 if ('object' == (typeof v === 'undefined' ? 'undefined' : _typeof(v))) {
50 var hasLength = 'number' == typeof v.length;
51 var hasIterator = 'function' == typeof v[Symbol.iterator];
52 // array
53 if (hasLength) {
54 if (hasIterator) {
55 value = [].concat(_toConsumableArray(v));
56 } else {
57 value = Array(v.length).fill(0).map(function (_, i) {
58 return v[i];
59 });
60 }
61 }
62 // object
63 else {
64 value = Object.assign({}, v);
65 }
66 }
67 return value;
68 }
69 }]);
70
71 function DynamicValue(ctx) {
72 var _this = this;
73
74 var initialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
75 var props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
76
77 _classCallCheck(this, DynamicValue);
78
79 var define = function define(k, v, def) {
80 return Object.defineProperty(_this, k, {
81 enumerable: false, get: function get() {
82 return v || def;
83 }
84 });
85 };
86 define('ctx', ctx, {});
87 define('initialState', initialState, {});
88 if ('object' == (typeof props === 'undefined' ? 'undefined' : _typeof(props))) {
89 this.set(props);
90 }
91 }
92
93 _createClass(DynamicValue, [{
94 key: 'set',
95 value: function set(name, value) {
96 var _initialState$prefix = this.initialState.prefix,
97 prefix = _initialState$prefix === undefined ? '' : _initialState$prefix;
98
99 if (name && 'object' == (typeof name === 'undefined' ? 'undefined' : _typeof(name))) {
100 var descriptors = Object.getOwnPropertyDescriptors(name);
101 for (var key in descriptors) {
102 try {
103 Object.defineProperty(this, '' + prefix + key, descriptors[key]);
104 } catch (e) {}
105 }
106 } else if ('string' == typeof name && null != value) {
107 this['' + prefix + name] = DynamicValue.primitive(value);
108 }
109 this.purge();
110 return this;
111 }
112 }, {
113 key: 'unset',
114 value: function unset(name) {
115 var _initialState$prefix2 = this.initialState.prefix,
116 prefix = _initialState$prefix2 === undefined ? '' : _initialState$prefix2;
117
118 if ('string' == typeof name) {
119 delete this['' + prefix + name];
120 }
121 return this;
122 }
123 }, {
124 key: 'purge',
125 value: function purge() {
126 for (var key in this) {
127 if (null == this[key]) {
128 delete this[key];
129 }
130 }
131 return this;
132 }
133 }]);
134
135 return DynamicValue;
136}();
137
138var DynamicValueCounter = exports.DynamicValueCounter = function () {
139 function DynamicValueCounter() {
140 _classCallCheck(this, DynamicValueCounter);
141
142 Object.defineProperties(this, {
143 contexts: { enumerable: false, value: new Set() },
144 map: { enumerable: false, value: new WeakMap() }
145 });
146 }
147
148 _createClass(DynamicValueCounter, [{
149 key: 'setContext',
150 value: function setContext(ctx) {
151 var set = this.map.get(ctx) || new Set();
152 this.map.set(ctx, set);
153 if (false == this.contexts.has(ctx)) {
154 this.contexts.add(ctx);
155 }
156 return this;
157 }
158 }, {
159 key: 'getSetForContext',
160 value: function getSetForContext(ctx) {
161 this.setContext(ctx);
162 return this.map.get(ctx);
163 }
164 }, {
165 key: 'addValueForContext',
166 value: function addValueForContext(ctx, dynamicValue) {
167 var set = this.getSetForContext(ctx);
168 if (false == set.has(dynamicValue)) {
169 set.add(dynamicValue);
170 }
171 return this;
172 }
173 }, {
174 key: 'sumSetForContext',
175 value: function sumSetForContext(ctx) {
176 return this.getSetForContext(ctx).size();
177 }
178 }, {
179 key: 'listSetForContext',
180 value: function listSetForContext(ctx) {
181 return [].concat(_toConsumableArray(this.getSetForContext(ctx)));
182 }
183 }, {
184 key: 'list',
185 value: function list() {
186 return [].concat(_toConsumableArray(this.contexts));
187 }
188 }]);
189
190 return DynamicValueCounter;
191}();
192//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2R5bmFtaWMuanMiXSwibmFtZXMiOlsiRHluYW1pY1ZhbHVlIiwiRHluYW1pY1ZhbHVlQ291bnRlciIsInNjb3BlIiwicHJvcGVydHkiLCJrZXkiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsImRlZmF1bHRWYWx1ZXMiLCJwcmltaXRpdmUiLCJ2IiwiaGFzTGVuZ3RoIiwibGVuZ3RoIiwiaGFzSXRlcmF0b3IiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiZmlsbCIsIm1hcCIsIl8iLCJpIiwiT2JqZWN0IiwiYXNzaWduIiwiY3R4IiwiaW5pdGlhbFN0YXRlIiwicHJvcHMiLCJkZWZpbmUiLCJrIiwiZGVmIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0Iiwic2V0IiwibmFtZSIsInByZWZpeCIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImUiLCJwdXJnZSIsImRlZmluZVByb3BlcnRpZXMiLCJjb250ZXh0cyIsIlNldCIsIldlYWtNYXAiLCJoYXMiLCJhZGQiLCJzZXRDb250ZXh0IiwiZHluYW1pY1ZhbHVlIiwiZ2V0U2V0Rm9yQ29udGV4dCIsInNpemUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7SUFFYUEsWSxXQUFBQSxZOzs7b0NBQ1k7QUFDckIsYUFBTyxJQUFJQyxtQkFBSixFQUFQO0FBQ0Q7OzswQkFFWUMsSyxFQUFPQyxRLEVBQVVDLEcsRUFBdUI7QUFDbkQsVUFBSUMsUUFBUUMsU0FBWjtBQUNBLFVBQUlKLFNBQVMsUUFBUUEsTUFBTUMsUUFBTixDQUFyQixFQUFzQztBQUNwQ0UsZ0JBQVEsUUFBUUQsR0FBUixHQUFjRixNQUFNQyxRQUFOLEVBQWdCQyxHQUFoQixDQUFkLEdBQXFDRixNQUFNQyxRQUFOLENBQTdDO0FBQ0Q7O0FBSmtELHdDQUFmSSxhQUFlO0FBQWZBLHFCQUFlO0FBQUE7O0FBS25ELGFBQU9QLGFBQWFRLFNBQWIsQ0FBdUIsb0NBQVNILEtBQVQsU0FBbUJFLGFBQW5CLEVBQXZCLENBQVA7QUFDRDs7OzhCQUVnQkUsQyxFQUFHO0FBQ2xCLFVBQUlKLFFBQVFJLENBQVo7QUFDQSxVQUFJLFFBQVFBLENBQVosRUFBZTtBQUFFSixnQkFBUUMsU0FBUjtBQUFtQjtBQUNwQyxVQUFJLG9CQUFtQkcsQ0FBbkIseUNBQW1CQSxDQUFuQixFQUFKLEVBQTBCO0FBQ3hCLFlBQU1DLFlBQVksWUFBWSxPQUFPRCxFQUFFRSxNQUF2QztBQUNBLFlBQU1DLGNBQWMsY0FBYyxPQUFPSCxFQUFFSSxPQUFPQyxRQUFULENBQXpDO0FBQ0E7QUFDQSxZQUFJSixTQUFKLEVBQWU7QUFDYixjQUFJRSxXQUFKLEVBQWlCO0FBQUVQLGlEQUFZSSxDQUFaO0FBQWdCLFdBQW5DLE1BQ0s7QUFBRUosb0JBQVFVLE1BQU1OLEVBQUVFLE1BQVIsRUFBZ0JLLElBQWhCLENBQXFCLENBQXJCLEVBQXdCQyxHQUF4QixDQUE0QixVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxxQkFBVVYsRUFBRVUsQ0FBRixDQUFWO0FBQUEsYUFBNUIsQ0FBUjtBQUFxRDtBQUM3RDtBQUNEO0FBSkEsYUFLSztBQUNIZCxvQkFBUWUsT0FBT0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JaLENBQWxCLENBQVI7QUFDRDtBQUNGO0FBQ0QsYUFBT0osS0FBUDtBQUNEOzs7QUFFRCx3QkFBWWlCLEdBQVosRUFBZ0Q7QUFBQTs7QUFBQSxRQUEvQkMsWUFBK0IsdUVBQWhCLEVBQWdCO0FBQUEsUUFBWkMsS0FBWSx1RUFBSixFQUFJOztBQUFBOztBQUM5QyxRQUFNQyxTQUFTLFNBQVRBLE1BQVMsQ0FBQ0MsQ0FBRCxFQUFJakIsQ0FBSixFQUFPa0IsR0FBUDtBQUFBLGFBQWVQLE9BQU9RLGNBQVAsUUFBNEJGLENBQTVCLEVBQStCO0FBQzNERyxvQkFBWSxLQUQrQyxFQUN4Q0MsS0FBSztBQUFBLGlCQUFNckIsS0FBS2tCLEdBQVg7QUFBQTtBQURtQyxPQUEvQixDQUFmO0FBQUEsS0FBZjtBQUdBRixXQUFPLEtBQVAsRUFBY0gsR0FBZCxFQUFtQixFQUFuQjtBQUNBRyxXQUFPLGNBQVAsRUFBdUJGLFlBQXZCLEVBQXFDLEVBQXJDO0FBQ0EsUUFBSSxvQkFBbUJDLEtBQW5CLHlDQUFtQkEsS0FBbkIsRUFBSixFQUE4QjtBQUM1QixXQUFLTyxHQUFMLENBQVNQLEtBQVQ7QUFDRDtBQUNGOzs7O3dCQUVHUSxJLEVBQU0zQixLLEVBQU87QUFBQSxpQ0FDTyxLQUFLa0IsWUFEWixDQUNSVSxNQURRO0FBQUEsVUFDUkEsTUFEUSx3Q0FDQyxFQUREOztBQUVmLFVBQUlELFFBQVEsb0JBQW1CQSxJQUFuQix5Q0FBbUJBLElBQW5CLEVBQVosRUFBcUM7QUFDbkMsWUFBTUUsY0FBY2QsT0FBT2UseUJBQVAsQ0FBaUNILElBQWpDLENBQXBCO0FBQ0EsYUFBSyxJQUFNNUIsR0FBWCxJQUFrQjhCLFdBQWxCLEVBQStCO0FBQzdCLGNBQUk7QUFBRWQsbUJBQU9RLGNBQVAsQ0FBc0IsSUFBdEIsT0FBK0JLLE1BQS9CLEdBQXdDN0IsR0FBeEMsRUFBK0M4QixZQUFZOUIsR0FBWixDQUEvQztBQUFrRSxXQUF4RSxDQUNBLE9BQU9nQyxDQUFQLEVBQVUsQ0FBRTtBQUNiO0FBQ0YsT0FORCxNQU1PLElBQUksWUFBWSxPQUFPSixJQUFuQixJQUEyQixRQUFRM0IsS0FBdkMsRUFBOEM7QUFDbkQsa0JBQVE0QixNQUFSLEdBQWlCRCxJQUFqQixJQUEyQmhDLGFBQWFRLFNBQWIsQ0FBdUJILEtBQXZCLENBQTNCO0FBQ0Q7QUFDRCxXQUFLZ0MsS0FBTDtBQUNBLGFBQU8sSUFBUDtBQUNEOzs7MEJBRUtMLEksRUFBTTtBQUFBLGtDQUNZLEtBQUtULFlBRGpCLENBQ0hVLE1BREc7QUFBQSxVQUNIQSxNQURHLHlDQUNNLEVBRE47O0FBRVYsVUFBSSxZQUFZLE9BQU9ELElBQXZCLEVBQTZCO0FBQzNCLGVBQU8sVUFBUUMsTUFBUixHQUFpQkQsSUFBakIsQ0FBUDtBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0Q7Ozs0QkFFTztBQUNOLFdBQUssSUFBTTVCLEdBQVgsSUFBa0IsSUFBbEIsRUFBd0I7QUFDdEIsWUFBSSxRQUFRLEtBQUtBLEdBQUwsQ0FBWixFQUF1QjtBQUNyQixpQkFBTyxLQUFLQSxHQUFMLENBQVA7QUFDRDtBQUNGO0FBQ0QsYUFBTyxJQUFQO0FBQ0Q7Ozs7OztJQUdVSCxtQixXQUFBQSxtQjtBQUNYLGlDQUFjO0FBQUE7O0FBQ1ptQixXQUFPa0IsZ0JBQVAsQ0FBd0IsSUFBeEIsRUFBOEI7QUFDNUJDLGdCQUFVLEVBQUVWLFlBQVksS0FBZCxFQUFxQnhCLE9BQU8sSUFBSW1DLEdBQUosRUFBNUIsRUFEa0I7QUFFNUJ2QixXQUFLLEVBQUVZLFlBQVksS0FBZCxFQUFxQnhCLE9BQU8sSUFBSW9DLE9BQUosRUFBNUI7QUFGdUIsS0FBOUI7QUFJRDs7OzsrQkFFVW5CLEcsRUFBSztBQUNkLFVBQU1TLE1BQU0sS0FBS2QsR0FBTCxDQUFTYSxHQUFULENBQWFSLEdBQWIsS0FBcUIsSUFBSWtCLEdBQUosRUFBakM7QUFDQSxXQUFLdkIsR0FBTCxDQUFTYyxHQUFULENBQWFULEdBQWIsRUFBa0JTLEdBQWxCO0FBQ0EsVUFBSSxTQUFTLEtBQUtRLFFBQUwsQ0FBY0csR0FBZCxDQUFrQnBCLEdBQWxCLENBQWIsRUFBcUM7QUFDbkMsYUFBS2lCLFFBQUwsQ0FBY0ksR0FBZCxDQUFrQnJCLEdBQWxCO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRDs7O3FDQUVnQkEsRyxFQUFLO0FBQ3BCLFdBQUtzQixVQUFMLENBQWdCdEIsR0FBaEI7QUFDQSxhQUFPLEtBQUtMLEdBQUwsQ0FBU2EsR0FBVCxDQUFhUixHQUFiLENBQVA7QUFDRDs7O3VDQUVrQkEsRyxFQUFLdUIsWSxFQUFjO0FBQ3BDLFVBQU1kLE1BQU0sS0FBS2UsZ0JBQUwsQ0FBc0J4QixHQUF0QixDQUFaO0FBQ0EsVUFBSSxTQUFTUyxJQUFJVyxHQUFKLENBQVFHLFlBQVIsQ0FBYixFQUFvQztBQUNsQ2QsWUFBSVksR0FBSixDQUFRRSxZQUFSO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRDs7O3FDQUVnQnZCLEcsRUFBSztBQUNwQixhQUFPLEtBQUt3QixnQkFBTCxDQUFzQnhCLEdBQXRCLEVBQTJCeUIsSUFBM0IsRUFBUDtBQUNEOzs7c0NBRWlCekIsRyxFQUFLO0FBQ3JCLDBDQUFZLEtBQUt3QixnQkFBTCxDQUFzQnhCLEdBQXRCLENBQVo7QUFDRDs7OzJCQUVNO0FBQ0wsMENBQVksS0FBS2lCLFFBQWpCO0FBQ0QiLCJmaWxlIjoiZHluYW1pYy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb2FsZXNjZSBmcm9tICdkZWZpbmVkJ1xuXG5leHBvcnQgY2xhc3MgRHluYW1pY1ZhbHVlIHtcbiAgc3RhdGljIGNyZWF0ZUNvdW50ZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbWljVmFsdWVDb3VudGVyKClcbiAgfVxuXG4gIHN0YXRpYyBwbHVjayhzY29wZSwgcHJvcGVydHksIGtleSwgLi4uZGVmYXVsdFZhbHVlcykge1xuICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZFxuICAgIGlmIChzY29wZSAmJiBudWxsICE9IHNjb3BlW3Byb3BlcnR5XSkge1xuICAgICAgdmFsdWUgPSBudWxsICE9IGtleSA/IHNjb3BlW3Byb3BlcnR5XVtrZXldIDogc2NvcGVbcHJvcGVydHldXG4gICAgfVxuICAgIHJldHVybiBEeW5hbWljVmFsdWUucHJpbWl0aXZlKGNvYWxlc2NlKHZhbHVlLCAuLi5kZWZhdWx0VmFsdWVzKSlcbiAgfVxuXG4gIHN0YXRpYyBwcmltaXRpdmUodikge1xuICAgIGxldCB2YWx1ZSA9IHZcbiAgICBpZiAobnVsbCA9PSB2KSB7IHZhbHVlID0gdW5kZWZpbmVkIH1cbiAgICBpZiAoJ29iamVjdCcgPT0gdHlwZW9mIHYpIHtcbiAgICAgIGNvbnN0IGhhc0xlbmd0aCA9ICdudW1iZXInID09IHR5cGVvZiB2Lmxlbmd0aFxuICAgICAgY29uc3QgaGFzSXRlcmF0b3IgPSAnZnVuY3Rpb24nID09IHR5cGVvZiB2W1N5bWJvbC5pdGVyYXRvcl1cbiAgICAgIC8vIGFycmF5XG4gICAgICBpZiAoaGFzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChoYXNJdGVyYXRvcikgeyB2YWx1ZSA9IFsuLi52XSB9XG4gICAgICAgIGVsc2UgeyB2YWx1ZSA9IEFycmF5KHYubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaSkgPT4gdltpXSkgfVxuICAgICAgfVxuICAgICAgLy8gb2JqZWN0XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBPYmplY3QuYXNzaWduKHt9LCB2KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGN0eCwgaW5pdGlhbFN0YXRlID0ge30sIHByb3BzID0ge30pIHtcbiAgICBjb25zdCBkZWZpbmUgPSAoaywgdiwgZGVmKSA9PiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsIGdldDogKCkgPT4gdiB8fCBkZWZcbiAgICB9KVxuICAgIGRlZmluZSgnY3R4JywgY3R4LCB7fSlcbiAgICBkZWZpbmUoJ2luaXRpYWxTdGF0ZScsIGluaXRpYWxTdGF0ZSwge30pXG4gICAgaWYgKCdvYmplY3QnID09IHR5cGVvZiBwcm9wcykge1xuICAgICAgdGhpcy5zZXQocHJvcHMpXG4gICAgfVxuICB9XG5cbiAgc2V0KG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3Qge3ByZWZpeCA9ICcnfSA9IHRoaXMuaW5pdGlhbFN0YXRlXG4gICAgaWYgKG5hbWUgJiYgJ29iamVjdCcgPT0gdHlwZW9mIG5hbWUpIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobmFtZSlcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRlc2NyaXB0b3JzKSB7XG4gICAgICAgIHRyeSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBgJHtwcmVmaXh9JHtrZXl9YCwgZGVzY3JpcHRvcnNba2V5XSkgfVxuICAgICAgICBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBuYW1lICYmIG51bGwgIT0gdmFsdWUpIHtcbiAgICAgIHRoaXNbYCR7cHJlZml4fSR7bmFtZX1gXSA9IER5bmFtaWNWYWx1ZS5wcmltaXRpdmUodmFsdWUpXG4gICAgfVxuICAgIHRoaXMucHVyZ2UoKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1bnNldChuYW1lKSB7XG4gICAgY29uc3Qge3ByZWZpeCA9ICcnfSA9IHRoaXMuaW5pdGlhbFN0YXRlXG4gICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBuYW1lKSB7XG4gICAgICBkZWxldGUgdGhpc1tgJHtwcmVmaXh9JHtuYW1lfWBdXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdXJnZSgpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzKSB7XG4gICAgICBpZiAobnVsbCA9PSB0aGlzW2tleV0pIHtcbiAgICAgICAgZGVsZXRlIHRoaXNba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEeW5hbWljVmFsdWVDb3VudGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgY29udGV4dHM6IHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiBuZXcgU2V0KCkgfSxcbiAgICAgIG1hcDogeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IG5ldyBXZWFrTWFwKCkgfSxcbiAgICB9KVxuICB9XG5cbiAgc2V0Q29udGV4dChjdHgpIHtcbiAgICBjb25zdCBzZXQgPSB0aGlzLm1hcC5nZXQoY3R4KSB8fCBuZXcgU2V0KClcbiAgICB0aGlzLm1hcC5zZXQoY3R4LCBzZXQpXG4gICAgaWYgKGZhbHNlID09IHRoaXMuY29udGV4dHMuaGFzKGN0eCkpIHtcbiAgICAgIHRoaXMuY29udGV4dHMuYWRkKGN0eClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGdldFNldEZvckNvbnRleHQoY3R4KSB7XG4gICAgdGhpcy5zZXRDb250ZXh0KGN0eClcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KGN0eClcbiAgfVxuXG4gIGFkZFZhbHVlRm9yQ29udGV4dChjdHgsIGR5bmFtaWNWYWx1ZSkge1xuICAgIGNvbnN0IHNldCA9IHRoaXMuZ2V0U2V0Rm9yQ29udGV4dChjdHgpXG4gICAgaWYgKGZhbHNlID09IHNldC5oYXMoZHluYW1pY1ZhbHVlKSkge1xuICAgICAgc2V0LmFkZChkeW5hbWljVmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdW1TZXRGb3JDb250ZXh0KGN0eCkge1xuICAgIHJldHVybiB0aGlzLmdldFNldEZvckNvbnRleHQoY3R4KS5zaXplKClcbiAgfVxuXG4gIGxpc3RTZXRGb3JDb250ZXh0KGN0eCkge1xuICAgIHJldHVybiBbIC4uLnRoaXMuZ2V0U2V0Rm9yQ29udGV4dChjdHgpIF1cbiAgfVxuXG4gIGxpc3QoKSB7XG4gICAgcmV0dXJuIFsgLi4udGhpcy5jb250ZXh0cyBdXG4gIH1cbn1cbiJdfQ==
\No newline at end of file