UNPKG

18.7 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Context = 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 _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; };
11
12var _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; }; }();
13
14var _events = require('events');
15
16var _defined = require('defined');
17
18var _defined2 = _interopRequireDefault(_defined);
19
20var _document = require('global/document');
21
22var _document2 = _interopRequireDefault(_document);
23
24var _window = require('global/window');
25
26var _window2 = _interopRequireDefault(_window);
27
28var _domEvents = require('dom-events');
29
30var _domEvents2 = _interopRequireDefault(_domEvents);
31
32var _regl = require('@littlstar/regl');
33
34var _regl2 = _interopRequireDefault(_regl);
35
36function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
37
38function _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); } }
39
40function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
41
42function _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; }
43
44function _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; }
45
46var Context = exports.Context = function (_EventEmitter) {
47 _inherits(Context, _EventEmitter);
48
49 function Context() {
50 var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
51 var createRegl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _regl2.default;
52
53 _classCallCheck(this, Context);
54
55 var _this = _possibleConstructorReturn(this, (Context.__proto__ || Object.getPrototypeOf(Context)).call(this));
56
57 _this.setMaxListeners(Infinity);
58 _this._hasFocus = false;
59 _this._isDestroyed = false;
60
61 // coalesce regl options if given as `.gl`
62 opts.regl = (0, _defined2.default)(opts.regl, opts.gl || {});
63 if (opts.gl && opts.gl.context) {
64 opts.regl.gl = opts.gl.context;
65 delete opts.gl.context;
66 }
67
68 // derive container element
69 if (opts.canvas && 'object' == _typeof(opts.canvas)) {
70 opts.regl.canvas = opts.canvas;
71 } else if (opts.element && 'CANVAS' == opts.element.nodeName) {
72 opts.regl.canvas = opts.element;
73 } else if (opts.element && opts.element.nodeName) {
74 opts.regl.container = opts.element;
75 } else if ('string' == typeof opts.element) {
76 opts.regl.container = opts.element;
77 }
78
79 // call regl initializer
80 createRegl(_extends({
81 pixelRatio: opts.pixelRatio || _window2.default.devicePixelRatio || 1,
82 profile: Boolean(opts.profile)
83 }, opts.regl, {
84 attributes: _extends({}, opts.regl.attributes || {}),
85 extensions: [].concat(_toConsumableArray(opts.regl.extensions || [])),
86 optionalExtensions: ['ANGLE_instanced_arrays'].concat(_toConsumableArray(opts.regl.optionalExtensions || [])),
87
88 onDone: function onDone(err, regl) {
89 if (err) {
90 return _this.emit('error', err);
91 }
92 _this._regl = regl;
93 _this._isDestroyed = false;
94 if (regl._gl && regl._gl.canvas) {
95 _this._domElement = _this._regl._gl.canvas;
96 } else {
97 _this._domElement = null;
98 }
99 }
100 }));
101
102 if (null != _this._domElement && 'undefind' != typeof _window2.default && 'undefind' != typeof _document2.default) {
103 var bind = function bind(t, e, f) {
104 _domEvents2.default.on(t, e, f);
105 _this.once('beforedestroy', function () {
106 return _domEvents2.default.off(t, e, f);
107 });
108 };
109 // context focus event handlers
110 var onblur = function onblur() {
111 _this.blur();
112 };
113 var onfocus = function onfocus() {
114 _this.focus();
115 };
116 var onwindowblur = function onwindowblur() {
117 _this.blur();
118 };
119 var onmousedown = function onmousedown(e) {
120 if (e.target == _this._domElement) {
121 _this.focus();
122 } else {
123 _this.blur();
124 }
125 };
126 bind(_this._domElement, 'blur', onblur);
127 bind(_this._domElement, 'focus', onfocus);
128 bind(_window2.default, 'blur', onwindowblur);
129 bind(_document2.default, 'mousedown', onmousedown);
130 bind(_document2.default, 'touchstart', onmousedown);
131 }
132 return _this;
133 }
134
135 _createClass(Context, [{
136 key: 'focus',
137 value: function focus() {
138 this._hasFocus = true;
139 this.emit('focus');
140 return this;
141 }
142 }, {
143 key: 'blur',
144 value: function blur() {
145 this._hasFocus = false;
146 this.emit('blur');
147 return this;
148 }
149 }, {
150 key: 'destroy',
151 value: function destroy() {
152 this.emit('beforedestroy');
153 if (this._regl && 'function' == typeof this._regl.destroy) {
154 this._regl.destroy();
155 }
156
157 if (this._domElement && this._domElement.parentElement) {
158 this._domElement.parentElement.removeChild(this._domElement);
159 }
160
161 delete this._regl;
162 delete this._domElement;
163 this._hasFocus = false;
164 this.emit('destroy');
165 return this;
166 }
167 }, {
168 key: 'refresh',
169 value: function refresh() {
170 if (this.regl && 'function' == typeof this.regl._refresh) {
171 this.regl._refresh();
172 }
173 return this;
174 }
175 }, {
176 key: 'flush',
177 value: function flush() {
178 if (this.gl) {
179 this.gl.flush();
180 }
181 return this;
182 }
183 }, {
184 key: 'poll',
185 value: function poll() {
186 if (this.regl) {
187 if (this.regl && 'function' == typeof this.regl.poll) {
188 this.regl.poll();
189 }
190 }
191 }
192 }, {
193 key: 'isDestroyed',
194 get: function get() {
195 return Boolean(this._isDestroyed);
196 }
197 }, {
198 key: 'domElement',
199 get: function get() {
200 return this._domElement || null;
201 }
202 }, {
203 key: 'hasFocus',
204 get: function get() {
205 return Boolean(this._hasFocus);
206 }
207 }, {
208 key: 'regl',
209 get: function get() {
210 return this._regl || null;
211 }
212 }, {
213 key: 'gl',
214 get: function get() {
215 return this._regl ? this._regl._gl || null : null;
216 }
217 }]);
218
219 return Context;
220}(_events.EventEmitter);
221//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2NvbnRleHQuanMiXSwibmFtZXMiOlsiQ29udGV4dCIsIm9wdHMiLCJjcmVhdGVSZWdsIiwic2V0TWF4TGlzdGVuZXJzIiwiSW5maW5pdHkiLCJfaGFzRm9jdXMiLCJfaXNEZXN0cm95ZWQiLCJyZWdsIiwiZ2wiLCJjb250ZXh0IiwiY2FudmFzIiwiZWxlbWVudCIsIm5vZGVOYW1lIiwiY29udGFpbmVyIiwicGl4ZWxSYXRpbyIsImRldmljZVBpeGVsUmF0aW8iLCJwcm9maWxlIiwiQm9vbGVhbiIsImF0dHJpYnV0ZXMiLCJleHRlbnNpb25zIiwib3B0aW9uYWxFeHRlbnNpb25zIiwib25Eb25lIiwiZXJyIiwiZW1pdCIsIl9yZWdsIiwiX2dsIiwiX2RvbUVsZW1lbnQiLCJiaW5kIiwidCIsImUiLCJmIiwib24iLCJvbmNlIiwib2ZmIiwib25ibHVyIiwiYmx1ciIsIm9uZm9jdXMiLCJmb2N1cyIsIm9ud2luZG93Ymx1ciIsIm9ubW91c2Vkb3duIiwidGFyZ2V0IiwiZGVzdHJveSIsInBhcmVudEVsZW1lbnQiLCJyZW1vdmVDaGlsZCIsIl9yZWZyZXNoIiwiZmx1c2giLCJwb2xsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7SUFFYUEsTyxXQUFBQSxPOzs7QUFDWCxxQkFBMEM7QUFBQSxRQUE5QkMsSUFBOEIsdUVBQXZCLEVBQXVCO0FBQUEsUUFBbkJDLFVBQW1COztBQUFBOztBQUFBOztBQUV4QyxVQUFLQyxlQUFMLENBQXFCQyxRQUFyQjtBQUNBLFVBQUtDLFNBQUwsR0FBaUIsS0FBakI7QUFDQSxVQUFLQyxZQUFMLEdBQW9CLEtBQXBCOztBQUVBO0FBQ0FMLFNBQUtNLElBQUwsR0FBWSx1QkFBU04sS0FBS00sSUFBZCxFQUFvQk4sS0FBS08sRUFBTCxJQUFXLEVBQS9CLENBQVo7QUFDQSxRQUFJUCxLQUFLTyxFQUFMLElB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RCxhQUFLckMsSUFBTCxDQUFVcUMsUUFBVjtBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0Q7Ozs0QkFFTztBQUNOLFVBQUksS0FBS3BDLEVBQVQsRUFBYTtBQUNYLGFBQUtBLEVBQUwsQ0FBUXFDLEtBQVI7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNEOzs7MkJBRU07QUFDTCxVQUFJLEtBQUt0QyxJQUFULEVBQWU7QUFDYixZQUFJLEtBQUtBLElBQUwsSUFBYSxjQUFjLE9BQU8sS0FBS0EsSUFBTCxDQUFVdUMsSUFBaEQsRUFBc0Q7QUFDcEQsZUFBS3ZDLElBQUwsQ0FBVXVDLElBQVY7QUFDRDtBQUNGO0FBQ0Y7Ozt3QkF2RGlCO0FBQUUsYUFBTzdCLFFBQVEsS0FBS1gsWUFBYixDQUFQO0FBQW1DOzs7d0JBQ3RDO0FBQUUsYUFBTyxLQUFLb0IsV0FBTCxJQUFvQixJQUEzQjtBQUFpQzs7O3dCQUNyQztBQUFFLGFBQU9ULFFBQVEsS0FBS1osU0FBYixDQUFQO0FBQWdDOzs7d0JBQ3RDO0FBQUUsYUFBTyxLQUFLbUIsS0FBTCxJQUFjLElBQXJCO0FBQTJCOzs7d0JBQy9CO0FBQUUsYUFBTyxLQUFLQSxLQUFMLEdBQWEsS0FBS0EsS0FBTCxDQUFXQyxHQUFYLElBQWtCLElBQS9CLEdBQXNDLElBQTdDO0FBQW1EIiwiZmlsZSI6ImNvbnRleHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXG5pbXBvcnQgY29hbGVzY2UgZnJvbSAnZGVmaW5lZCdcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnXG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnXG5pbXBvcnQgZXZlbnRzIGZyb20gJ2RvbS1ldmVudHMnXG5pbXBvcnQgcmVnbCBmcm9tICdAbGl0dGxzdGFyL3JlZ2wnXG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3Iob3B0cyA9IHt9LCBjcmVhdGVSZWdsID0gcmVnbCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLnNldE1heExpc3RlbmVycyhJbmZpbml0eSlcbiAgICB0aGlzLl9oYXNGb2N1cyA9IGZhbHNlXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZVxuXG4gICAgLy8gY29hbGVzY2UgcmVnbCBvcHRpb25zIGlmIGdpdmVuIGFzIGAuZ2xgXG4gICAgb3B0cy5yZWdsID0gY29hbGVzY2Uob3B0cy5yZWdsLCBvcHRzLmdsIHx8IHt9KVxuICAgIGlmIChvcHRzLmdsICYmIG9wdHMuZ2wuY29udGV4dCkge1xuICAgICAgb3B0cy5yZWdsLmdsID0gb3B0cy5nbC5jb250ZXh0XG4gICAgICBkZWxldGUgb3B0cy5nbC5jb250ZXh0XG4gICAgfVxuXG4gICAgLy8gZGVyaXZlIGNvbnRhaW5lciBlbGVtZW50XG4gICAgaWYgKG9wdHMuY2FudmFzICYmICdvYmplY3QnID09IHR5cGVvZiBvcHRzLmNhbnZhcykge1xuICAgICAgb3B0cy5yZWdsLmNhbnZhcyA9IG9wdHMuY2FudmFzXG4gICAgfSBlbHNlIGlmIChvcHRzLmVsZW1lbnQgJiYgJ0NBTlZBUycgPT0gb3B0cy5lbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgICBvcHRzLnJlZ2wuY2FudmFzID0gb3B0cy5lbGVtZW50XG4gICAgfSBlbHNlIGlmIChvcHRzLmVsZW1lbnQgJiYgb3B0cy5lbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgICBvcHRzLnJlZ2wuY29udGFpbmVyID0gb3B0cy5lbGVtZW50XG4gICAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PSB0eXBlb2Ygb3B0cy5lbGVtZW50KSB7XG4gICAgICBvcHRzLnJlZ2wuY29udGFpbmVyID0gb3B0cy5lbGVtZW50XG4gICAgfVxuXG4gICAgLy8gY2FsbCByZWdsIGluaXRpYWxpemVyXG4gICAgY3JlYXRlUmVnbCh7XG4gICAgICBwaXhlbFJhdGlvOiBvcHRzLnBpeGVsUmF0aW8gfHwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSxcbiAgICAgIHByb2ZpbGU6IEJvb2xlYW4ob3B0cy5wcm9maWxlKSxcbiAgICAgIC4uLm9wdHMucmVnbCxcbiAgICAgIGF0dHJpYnV0ZXM6IHsgLi4uKG9wdHMucmVnbC5hdHRyaWJ1dGVzIHx8IHt9KSB9LFxuICAgICAgZXh0ZW5zaW9uczogWyAuLi4ob3B0cy5yZWdsLmV4dGVuc2lvbnMgfHwgW10pIF0sXG4gICAgICBvcHRpb25hbEV4dGVuc2lvbnM6IFtcbiAgICAgICAgJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnLFxuICAgICAgICAuLi4ob3B0cy5yZWdsLm9wdGlvbmFsRXh0ZW5zaW9ucyB8fCBbXSlcbiAgICAgIF0sXG5cbiAgICAgIG9uRG9uZTogKGVyciwgcmVnbCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7IHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKSB9XG4gICAgICAgIHRoaXMuX3JlZ2wgPSByZWdsXG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2VcbiAgICAgICAgaWYgKHJlZ2wuX2dsICYmIHJlZ2wuX2dsLmNhbnZhcykge1xuICAgICAgICAgIHRoaXMuX2RvbUVsZW1lbnQgPSB0aGlzLl9yZWdsLl9nbC5jYW52YXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9kb21FbGVtZW50ID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChcbiAgICAgIG51bGwgIT0gdGhpcy5fZG9tRWxlbWVudCAmJlxuICAgICAgJ3VuZGVmaW5kJyAhPSB0eXBlb2Ygd2luZG93ICYmXG4gICAgICAndW5kZWZpbmQnICE9IHR5cGVvZiBkb2N1bWVudFxuICAgICkge1xuICAgICAgY29uc3QgYmluZCA9ICh0LCBlLCBmKSA9PiB7XG4gICAgICAgIGV2ZW50cy5vbih0LCBlLCBmKVxuICAgICAgICB0aGlzLm9uY2UoJ2JlZm9yZWRlc3Ryb3knLCAoKSA9PiBldmVudHMub2ZmKHQsIGUsIGYpKVxuICAgICAgfVxuICAgICAgLy8gY29udGV4dCBmb2N1cyBldmVudCBoYW5kbGVyc1xuICAgICAgY29uc3Qgb25ibHVyID0gKCkgPT4geyB0aGlzLmJsdXIoKSB9XG4gICAgICBjb25zdCBvbmZvY3VzID0gKCkgPT4geyB0aGlzLmZvY3VzKCkgfVxuICAgICAgY29uc3Qgb253aW5kb3dibHVyID0gKCkgPT4geyB0aGlzLmJsdXIoKSB9XG4gICAgICBjb25zdCBvbm1vdXNlZG93biA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLnRhcmdldCA9PSB0aGlzLl9kb21FbGVtZW50KSB7IHRoaXMuZm9jdXMoKSB9XG4gICAgICAgIGVsc2UgeyB0aGlzLmJsdXIoKSB9XG4gICAgICB9XG4gICAgICBiaW5kKHRoaXMuX2RvbUVsZW1lbnQsICdibHVyJywgb25ibHVyKVxuICAgICAgYmluZCh0aGlzLl9kb21FbGVtZW50LCAnZm9jdXMnLCBvbmZvY3VzKVxuICAgICAgYmluZCh3aW5kb3csICdibHVyJywgb253aW5kb3dibHVyKVxuICAgICAgYmluZChkb2N1bWVudCwgJ21vdXNlZG93bicsIG9ubW91c2Vkb3duKVxuICAgICAgYmluZChkb2N1bWVudCwgJ3RvdWNoc3RhcnQnLCBvbm1vdXNlZG93bilcbiAgICB9XG4gIH1cblxuICBnZXQgaXNEZXN0cm95ZWQoKSB7IHJldHVybiBCb29sZWFuKHRoaXMuX2lzRGVzdHJveWVkKSB9XG4gIGdldCBkb21FbGVtZW50KCkgeyByZXR1cm4gdGhpcy5fZG9tRWxlbWVudCB8fCBudWxsIH1cbiAgZ2V0IGhhc0ZvY3VzKCkgeyByZXR1cm4gQm9vbGVhbih0aGlzLl9oYXNGb2N1cykgfVxuICBnZXQgcmVnbCgpIHsgcmV0dXJuIHRoaXMuX3JlZ2wgfHwgbnVsbCB9XG4gIGdldCBnbCgpIHsgcmV0dXJuIHRoaXMuX3JlZ2wgPyB0aGlzLl9yZWdsLl9nbCB8fCBudWxsIDogbnVsbCB9XG5cbiAgZm9jdXMoKSB7XG4gICAgdGhpcy5faGFzRm9jdXMgPSB0cnVlXG4gICAgdGhpcy5lbWl0KCdmb2N1cycpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGJsdXIoKSB7XG4gICAgdGhpcy5faGFzRm9jdXMgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgnYmx1cicpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5lbWl0KCdiZWZvcmVkZXN0cm95JylcbiAgICBpZiAodGhpcy5fcmVnbCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0aGlzLl9yZWdsLmRlc3Ryb3kpIHtcbiAgICAgIHRoaXMuX3JlZ2wuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RvbUVsZW1lbnQgJiYgdGhpcy5fZG9tRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLl9kb21FbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fZG9tRWxlbWVudClcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5fcmVnbFxuICAgIGRlbGV0ZSB0aGlzLl9kb21FbGVtZW50XG4gICAgdGhpcy5faGFzRm9jdXMgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgnZGVzdHJveScpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgaWYgKHRoaXMucmVnbCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0aGlzLnJlZ2wuX3JlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVnbC5fcmVmcmVzaCgpXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBmbHVzaCgpIHtcbiAgICBpZiAodGhpcy5nbCkge1xuICAgICAgdGhpcy5nbC5mbHVzaCgpXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwb2xsKCkge1xuICAgIGlmICh0aGlzLnJlZ2wpIHtcbiAgICAgIGlmICh0aGlzLnJlZ2wgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdGhpcy5yZWdsLnBvbGwpIHtcbiAgICAgICAgdGhpcy5yZWdsLnBvbGwoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
\No newline at end of file