UNPKG

15.6 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Frame = undefined;
7
8var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
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 _utils = require('../utils');
13
14var _scope = require('../scope');
15
16var _core = require('../core');
17
18var _context = require('./context');
19
20var _state = require('./state');
21
22var _defaults2 = require('./defaults');
23
24var _defaults = _interopRequireWildcard(_defaults2);
25
26function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
27
28function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
29
30function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
31
32function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
33
34var Frame = exports.Frame = function (_Component) {
35 _inherits(Frame, _Component);
36
37 _createClass(Frame, null, [{
38 key: 'defaults',
39 value: function defaults() {
40 return _extends({}, _defaults);
41 }
42 }]);
43
44 function Frame(ctx) {
45 var initialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
46
47 _classCallCheck(this, Frame);
48
49 (0, _utils.assignDefaults)(initialState, Frame.defaults());
50 var _initialState$frames = initialState.frames,
51 frames = _initialState$frames === undefined ? [] : _initialState$frames;
52
53
54 var context = new _context.FrameContext(ctx, initialState);
55 var state = new _state.FrameState(ctx, initialState);
56
57 var getContext = ctx.regl({});
58 var clear = function clear() {
59 return getContext(function (_ref) {
60 var clear = _ref.clear;
61 return clear();
62 });
63 };
64 var autoClear = _core.Component.compose(context, clear);
65 var pipe = _core.Component.compose(state, context);
66
67 var loop = null; // for all frames
68
69 var _this = _possibleConstructorReturn(this, (Frame.__proto__ || Object.getPrototypeOf(Frame)).call(this, ctx, initialState, function (state, refresh) {
70 if (null == loop) {
71 createFrameLoop();
72 }
73 var inject = new _scope.ScopedContext(ctx, { frame: function (_frame) {
74 function frame() {
75 return _frame.apply(this, arguments);
76 }
77
78 frame.toString = function () {
79 return _frame.toString();
80 };
81
82 return frame;
83 }(function () {
84 return frame;
85 }), frames: frames, loop: loop });
86 var update = _core.Component.compose(inject, pipe);
87 var frame = createFrameRefresh(refresh, update);
88 frames.push(frame);
89 }));
90
91 function createFrameRefresh(refresh, components) {
92 var cancelled = null;
93 var frame = null;
94 return frame = {
95 cancel: function cancel() {
96 cancelled = true;
97 },
98 onframe: function onframe() {
99 if (cancelled) {
100 frames.splice(frames.indexOf(frame, 1));
101 } else try {
102 components(function () {
103 return getContext(refresh);
104 });
105 } catch (err) {
106 ctx.emit('error', err);
107 destroyFrameLoop();
108 }
109 }
110 };
111 }
112
113 function createFrameLoop() {
114 var _iteratorNormalCompletion = true;
115 var _didIteratorError = false;
116 var _iteratorError = undefined;
117
118 try {
119 for (var _iterator = frames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
120 var f = _step.value;
121 f.onframe();
122 }
123 } catch (err) {
124 _didIteratorError = true;
125 _iteratorError = err;
126 } finally {
127 try {
128 if (!_iteratorNormalCompletion && _iterator.return) {
129 _iterator.return();
130 }
131 } finally {
132 if (_didIteratorError) {
133 throw _iteratorError;
134 }
135 }
136 }
137
138 loop = ctx.regl.frame(function () {
139 try {
140 if (true === initialState.autoClear) {
141 autoClear();
142 }
143 var _iteratorNormalCompletion2 = true;
144 var _didIteratorError2 = false;
145 var _iteratorError2 = undefined;
146
147 try {
148 for (var _iterator2 = frames[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
149 var f = _step2.value;
150 f.onframe();
151 }
152 } catch (err) {
153 _didIteratorError2 = true;
154 _iteratorError2 = err;
155 } finally {
156 try {
157 if (!_iteratorNormalCompletion2 && _iterator2.return) {
158 _iterator2.return();
159 }
160 } finally {
161 if (_didIteratorError2) {
162 throw _iteratorError2;
163 }
164 }
165 }
166 } catch (err) {
167 try {
168 var _iteratorNormalCompletion3 = true;
169 var _didIteratorError3 = false;
170 var _iteratorError3 = undefined;
171
172 try {
173 for (var _iterator3 = frames[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
174 var _f = _step3.value;
175 _f.cancel();
176 }
177 } catch (err) {
178 _didIteratorError3 = true;
179 _iteratorError3 = err;
180 } finally {
181 try {
182 if (!_iteratorNormalCompletion3 && _iterator3.return) {
183 _iterator3.return();
184 }
185 } finally {
186 if (_didIteratorError3) {
187 throw _iteratorError3;
188 }
189 }
190 }
191 } catch (err) {
192 ctx.emit('error', err);
193 }
194 destroyFrameLoop();
195 }
196 });
197 }
198
199 function destroyFrameLoop() {
200 try {
201 var _iteratorNormalCompletion4 = true;
202 var _didIteratorError4 = false;
203 var _iteratorError4 = undefined;
204
205 try {
206 for (var _iterator4 = frames[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
207 var f = _step4.value;
208 f.cancel();
209 }
210 } catch (err) {
211 _didIteratorError4 = true;
212 _iteratorError4 = err;
213 } finally {
214 try {
215 if (!_iteratorNormalCompletion4 && _iterator4.return) {
216 _iterator4.return();
217 }
218 } finally {
219 if (_didIteratorError4) {
220 throw _iteratorError4;
221 }
222 }
223 }
224 } catch (err) {
225 ctx.emit('error', err);
226 }
227 frames.splice(0, frames.length);
228 }
229 return _this;
230 }
231
232 return Frame;
233}(_core.Component);
234//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mcmFtZS9mcmFtZS5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0cyIsIkZyYW1lIiwiY3R4IiwiaW5pdGlhbFN0YXRlIiwiZnJhbWVzIiwiY29udGV4dCIsInN0YXRlIiwiZ2V0Q29udGV4dCIsInJlZ2wiLCJjbGVhciIsImF1dG9DbGVhciIsImNvbXBvc2UiLCJwaXBlIiwibG9vcCIsInJlZnJlc2giLCJjcmVhdGVGcmFtZUxvb3AiLCJpbmplY3QiLCJmcmFtZSIsInVwZGF0ZSIsImNyZWF0ZUZyYW1lUmVmcmVzaCIsInB1c2giLCJjb21wb25lbnRzIiwiY2FuY2VsbGVkIiwiY2FuY2VsIiwib25mcmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJlcnIiLCJlbWl0IiwiZGVzdHJveUZyYW1lTG9vcCIsImYiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0lBQVlBLFM7Ozs7Ozs7Ozs7SUFFQ0MsSyxXQUFBQSxLOzs7OzsrQkFDTztBQUFFLDBCQUFZRCxTQUFaO0FBQXdCOzs7QUFDNUMsaUJBQVlFLEdBQVosRUFBb0M7QUFBQSxRQUFuQkMsWUFBbUIsdUVBQUosRUFBSTs7QUFBQTs7QUFDbEMsK0JBQWVBLFlBQWYsRUFBNkJGLE1BQU1ELFFBQU4sRUFBN0I7QUFEa0MsK0JBRVpHLFlBRlksQ0FFM0JDLE1BRjJCO0FBQUEsUUFFM0JBLE1BRjJCLHdDQUVsQixFQUZrQjs7O0FBSWxDLFFBQU1DLFVBQVUsMEJBQWlCSCxHQUFqQixFQUFzQkMsWUFBdEIsQ0FBaEI7QUFDQSxRQUFNRyxRQUFRLHNCQUFlSixHQUFmLEVBQW9CQyxZQUFwQixDQUFkOztBQUVBLFFBQU1JLGFBQWFMLElBQUlNLElBQUosQ0FBUyxFQUFULENBQW5CO0FBQ0EsUUFBTUMsUUFBUSxTQUFSQSxLQUFRO0FBQUEsYUFBTUYsV0FBVztBQUFBLFlBQUVFLEtBQUYsUUFBRUEsS0FBRjtBQUFBLGVBQWFBLE9BQWI7QUFBQSxPQUFYLENBQU47QUFBQSxLQUFkO0FBQ0EsUUFBTUMsWUFBWSxnQkFBVUMsT0FBVixDQUFrQk4sT0FBbEIsRUFBMkJJLEtBQTNCLENBQWxCO0FBQ0EsUUFBTUcsT0FBTyxnQkFBVUQsT0FBVixDQUFrQkwsS0FBbEIsRUFBeUJELE9BQXpCLENBQWI7O0FBRUEsUUFBSVEsT0FBTyxJQUFYLENBWmtDLENBWWxCOztBQVprQiw4R0FhNUJYLEdBYjRCLEVBYXZCQyxZQWJ1QixFQWFULFVBQUNHLEtBQUQsRUFBUVEsT0FBUixFQUFvQjtBQUMzQyxVQUFJLFFBQVFELElBQVosRUFBa0I7QUFBRUU7QUFBbUI7QUFDdkMsVUFBTUMsU0FBUyx5QkFBa0JkLEdBQWxCLEVBQXVCLEVBQUNlO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLFVBQU87QUFBQSxpQkFBTUEsS0FBTjtBQUFBLFNBQVAsQ0FBRCxFQUFxQmIsY0FBckIsRUFBNkJTLFVBQTdCLEVBQXZCLENBQWY7QUFDQSxVQUFNSyxTQUFTLGdCQUFVUCxPQUFWLENBQWtCSyxNQUFsQixFQUEwQkosSUFBMUIsQ0FBZjtBQUNBLFVBQU1LLFFBQVFFLG1CQUFtQkwsT0FBbkIsRUFBNEJJLE1BQTVCLENBQWQ7QUFDQWQsYUFBT2dCLElBQVAsQ0FBWUgsS0FBWjtBQUNELEtBbkJpQzs7QUFxQmxDLGFBQVNFLGtCQUFULENBQTRCTCxPQUE1QixFQUFxQ08sVUFBckMsRUFBaUQ7QUFDL0MsVUFBSUMsWUFBWSxJQUFoQjtBQUNBLFVBQUlMLFFBQVEsSUFBWjtBQUNBLGFBQU9BLFFBQVE7QUFDYk0sY0FEYSxvQkFDSjtBQUFFRCxzQkFBWSxJQUFaO0FBQWtCLFNBRGhCO0FBRWJFLGVBRmEscUJBRUg7QUFDUixjQUFJRixTQUFKLEVBQWU7QUFDYmxCLG1CQUFPcUIsTUFBUCxDQUFjckIsT0FBT3NCLE9BQVAsQ0FBZVQsS0FBZixFQUFzQixDQUF0QixDQUFkO0FBQ0QsV0FGRCxNQUVPLElBQUk7QUFDVEksdUJBQVc7QUFBQSxxQkFBTWQsV0FBV08sT0FBWCxDQUFOO0FBQUEsYUFBWDtBQUNELFdBRk0sQ0FFTCxPQUFPYSxHQUFQLEVBQVk7QUFDWnpCLGdCQUFJMEIsSUFBSixDQUFTLE9BQVQsRUFBa0JELEdBQWxCO0FBQ0FFO0FBQ0Q7QUFDRjtBQVhZLE9BQWY7QUFhRDs7QUFFRCxhQUFTZCxlQUFULEdBQTJCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQ3pCLDZCQUFnQlgsTUFBaEIsOEhBQXdCO0FBQUEsY0FBYjBCLENBQWE7QUFBRUEsWUFBRU4sT0FBRjtBQUFhO0FBRGQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFekJYLGFBQU9YLElBQUlNLElBQUosQ0FBU1MsS0FBVCxDQUFlLFlBQU07QUFDMUIsWUFBSTtBQUNGLGNBQUksU0FBU2QsYUFBYU8sU0FBMUIsRUFBcUM7QUFBRUE7QUFBYTtBQURsRDtBQUFBO0FBQUE7O0FBQUE7QUFFRixrQ0FBZ0JOLE1BQWhCLG1JQUF3QjtBQUFBLGtCQUFiMEIsQ0FBYTtBQUFFQSxnQkFBRU4sT0FBRjtBQUFhO0FBRnJDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHSCxTQUhELENBR0UsT0FBT0csR0FBUCxFQUFZO0FBQ1osY0FBSTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFFLG9DQUFnQnZCLE1BQWhCLG1JQUF3QjtBQUFBLG9CQUFiMEIsRUFBYTtBQUFFQSxtQkFBRVAsTUFBRjtBQUFZO0FBQXhDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMEMsV0FBOUMsQ0FDQSxPQUFPSSxHQUFQLEVBQVk7QUFBRXpCLGdCQUFJMEIsSUFBSixDQUFTLE9BQVQsRUFBa0JELEdBQWxCO0FBQXlCO0FBQ3ZDRTtBQUNEO0FBQ0YsT0FUTSxDQUFQO0FBVUQ7O0FBRUQsYUFBU0EsZ0JBQVQsR0FBNEI7QUFDMUIsVUFBSTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFFLGdDQUFnQnpCLE1BQWhCLG1JQUF3QjtBQUFBLGdCQUFiMEIsQ0FBYTtBQUFFQSxjQUFFUCxNQUFGO0FBQVk7QUFBeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUEwQyxPQUE5QyxDQUNBLE9BQU9JLEdBQVAsRUFBWTtBQUFFekIsWUFBSTBCLElBQUosQ0FBUyxPQUFULEVBQWtCRCxHQUFsQjtBQUF5QjtBQUN2Q3ZCLGFBQU9xQixNQUFQLENBQWMsQ0FBZCxFQUFpQnJCLE9BQU8yQixNQUF4QjtBQUNEO0FBekRpQztBQTBEbkMiLCJmaWxlIjoiZnJhbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NpZ25EZWZhdWx0cyB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgU2NvcGVkQ29udGV4dCB9IGZyb20gJy4uL3Njb3BlJ1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZSdcblxuaW1wb3J0IHsgRnJhbWVDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0J1xuaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gJy4vc3RhdGUnXG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRzJ1xuXG5leHBvcnQgY2xhc3MgRnJhbWUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMoKSB7IHJldHVybiB7IC4uLmRlZmF1bHRzIH0gfVxuICBjb25zdHJ1Y3RvcihjdHgsIGluaXRpYWxTdGF0ZSA9IHt9KSB7XG4gICAgYXNzaWduRGVmYXVsdHMoaW5pdGlhbFN0YXRlLCBGcmFtZS5kZWZhdWx0cygpKVxuICAgIGNvbnN0IHtmcmFtZXMgPSBbXX0gPSBpbml0aWFsU3RhdGVcblxuICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRnJhbWVDb250ZXh0KGN0eCwgaW5pdGlhbFN0YXRlKVxuICAgIGNvbnN0IHN0YXRlID0gbmV3IEZyYW1lU3RhdGUoY3R4LCBpbml0aWFsU3RhdGUpXG5cbiAgICBjb25zdCBnZXRDb250ZXh0ID0gY3R4LnJlZ2woe30pXG4gICAgY29uc3QgY2xlYXIgPSAoKSA9PiBnZXRDb250ZXh0KCh7Y2xlYXJ9KSA9PiBjbGVhcigpKVxuICAgIGNvbnN0IGF1dG9DbGVhciA9IENvbXBvbmVudC5jb21wb3NlKGNvbnRleHQsIGNsZWFyKVxuICAgIGNvbnN0IHBpcGUgPSBDb21wb25lbnQuY29tcG9zZShzdGF0ZSwgY29udGV4dClcblxuICAgIGxldCBsb29wID0gbnVsbCAvLyBmb3IgYWxsIGZyYW1lc1xuICAgIHN1cGVyKGN0eCwgaW5pdGlhbFN0YXRlLCAoc3RhdGUsIHJlZnJlc2gpID0+IHtcbiAgICAgIGlmIChudWxsID09IGxvb3ApIHsgY3JlYXRlRnJhbWVMb29wKCkgfVxuICAgICAgY29uc3QgaW5qZWN0ID0gbmV3IFNjb3BlZENvbnRleHQoY3R4LCB7ZnJhbWU6ICgpID0+IGZyYW1lLCBmcmFtZXMsIGxvb3B9KVxuICAgICAgY29uc3QgdXBkYXRlID0gQ29tcG9uZW50LmNvbXBvc2UoaW5qZWN0LCBwaXBlKVxuICAgICAgY29uc3QgZnJhbWUgPSBjcmVhdGVGcmFtZVJlZnJlc2gocmVmcmVzaCwgdXBkYXRlKVxuICAgICAgZnJhbWVzLnB1c2goZnJhbWUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyYW1lUmVmcmVzaChyZWZyZXNoLCBjb21wb25lbnRzKSB7XG4gICAgICBsZXQgY2FuY2VsbGVkID0gbnVsbFxuICAgICAgbGV0IGZyYW1lID0gbnVsbFxuICAgICAgcmV0dXJuIGZyYW1lID0ge1xuICAgICAgICBjYW5jZWwoKSB7IGNhbmNlbGxlZCA9IHRydWUgfSxcbiAgICAgICAgb25mcmFtZSgpIHtcbiAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICBmcmFtZXMuc3BsaWNlKGZyYW1lcy5pbmRleE9mKGZyYW1lLCAxKSlcbiAgICAgICAgICB9IGVsc2UgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMoKCkgPT4gZ2V0Q29udGV4dChyZWZyZXNoKSlcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGN0eC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICAgIGRlc3Ryb3lGcmFtZUxvb3AoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyYW1lTG9vcCgpIHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmcmFtZXMpIHsgZi5vbmZyYW1lKCkgfVxuICAgICAgbG9vcCA9IGN0eC5yZWdsLmZyYW1lKCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHJ1ZSA9PT0gaW5pdGlhbFN0YXRlLmF1dG9DbGVhcikgeyBhdXRvQ2xlYXIoKSB9XG4gICAgICAgICAgZm9yIChjb25zdCBmIG9mIGZyYW1lcykgeyBmLm9uZnJhbWUoKSB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRyeSB7IGZvciAoY29uc3QgZiBvZiBmcmFtZXMpIHsgZi5jYW5jZWwoKSB9IH1cbiAgICAgICAgICBjYXRjaCAoZXJyKSB7IGN0eC5lbWl0KCdlcnJvcicsIGVycik7IH1cbiAgICAgICAgICBkZXN0cm95RnJhbWVMb29wKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95RnJhbWVMb29wKCkge1xuICAgICAgdHJ5IHsgZm9yIChjb25zdCBmIG9mIGZyYW1lcykgeyBmLmNhbmNlbCgpIH0gfVxuICAgICAgY2F0Y2ggKGVycikgeyBjdHguZW1pdCgnZXJyb3InLCBlcnIpOyB9XG4gICAgICBmcmFtZXMuc3BsaWNlKDAsIGZyYW1lcy5sZW5ndGgpXG4gICAgfVxuICB9XG59XG4iXX0=
\No newline at end of file