1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.Shader = undefined;
|
7 |
|
8 | var _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 |
|
10 | var _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; };
|
11 |
|
12 | 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; }; }();
|
13 |
|
14 | var _core = require('../core');
|
15 |
|
16 | var _utils = require('../utils');
|
17 |
|
18 | var _scope = require('../scope');
|
19 |
|
20 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
21 |
|
22 | function _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; }
|
23 |
|
24 | function _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; }
|
25 |
|
26 | var Shader = exports.Shader = function (_Component) {
|
27 | _inherits(Shader, _Component);
|
28 |
|
29 | _createClass(Shader, null, [{
|
30 | key: 'defaults',
|
31 | value: function defaults() {
|
32 | return _extends({}, _core.ShaderLib.defaults(), { defines: {} });
|
33 | }
|
34 | }]);
|
35 |
|
36 | function Shader(ctx) {
|
37 | var initialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
38 |
|
39 | _classCallCheck(this, Shader);
|
40 |
|
41 | (0, _utils.assignDefaults)(initialState, Shader.defaults());
|
42 | var defines = initialState.defines,
|
43 | shaderName = initialState.shaderName;
|
44 |
|
45 | var contextCache = {};
|
46 | var shaderCache = {};
|
47 | var shaderLib = new _core.ShaderLib(_extends({}, initialState, { defines: defines }));
|
48 |
|
49 | var injectParentContext = new _scope.ScopedContext(ctx, {
|
50 | defines: function (_defines) {
|
51 | function defines(_x2) {
|
52 | return _defines.apply(this, arguments);
|
53 | }
|
54 |
|
55 | defines.toString = function () {
|
56 | return _defines.toString();
|
57 | };
|
58 |
|
59 | return defines;
|
60 | }(function (_ref) {
|
61 | var contextDefines = _ref.defines;
|
62 |
|
63 | return _extends({}, contextDefines, defines);
|
64 | })
|
65 | });
|
66 |
|
67 | var injectContext = null;
|
68 |
|
69 | var fragmentShaderUncompiled = null;
|
70 | var vertexShaderUncompiled = null;
|
71 | var fragmentShader = null;
|
72 | var vertexShader = null;
|
73 |
|
74 | var _this = _possibleConstructorReturn(this, (Shader.__proto__ || Object.getPrototypeOf(Shader)).call(this, ctx, initialState, update));
|
75 |
|
76 | function update(state, block, previousState) {
|
77 | injectParentContext(function (reglContext) {
|
78 | var _state$forceCompile = state.forceCompile,
|
79 | forceCompile = _state$forceCompile === undefined ? false : _state$forceCompile;
|
80 |
|
81 | Object.assign(defines, _extends({}, reglContext.defines, state.defines));
|
82 |
|
83 | if (Object.keys(defines).length) {
|
84 | if (shaderLib.preprocessor.define(defines)) {
|
85 | forceCompile = true;
|
86 | }
|
87 | }
|
88 |
|
89 | if (forceCompile || shouldCompile(reglContext, state)) {
|
90 | compile(reglContext, state);
|
91 | }
|
92 |
|
93 | setInjectContext(reglContext, state);
|
94 |
|
95 | if ('function' == typeof injectContext) {
|
96 | injectContext(state, block);
|
97 | } else {
|
98 | block(state);
|
99 | }
|
100 | });
|
101 | }
|
102 |
|
103 | function getShaderFromCache(reglContext, currentState, shader) {
|
104 | shader = getViableShader(reglContext, currentState, shader);
|
105 | return shaderCache[shaderLib.hash(shader)];
|
106 | }
|
107 |
|
108 | function setInjectContext(reglContext, currentState) {
|
109 | var opts = {
|
110 | context: {
|
111 | fragmentShader: function (_fragmentShader) {
|
112 | function fragmentShader(_x3) {
|
113 | return _fragmentShader.apply(this, arguments);
|
114 | }
|
115 |
|
116 | fragmentShader.toString = function () {
|
117 | return _fragmentShader.toString();
|
118 | };
|
119 |
|
120 | return fragmentShader;
|
121 | }(function (_ref2) {
|
122 | var fs = _ref2.fragmentShader;
|
123 | return fragmentShader || fs;
|
124 | }),
|
125 | vertexShader: function (_vertexShader) {
|
126 | function vertexShader(_x4) {
|
127 | return _vertexShader.apply(this, arguments);
|
128 | }
|
129 |
|
130 | vertexShader.toString = function () {
|
131 | return _vertexShader.toString();
|
132 | };
|
133 |
|
134 | return vertexShader;
|
135 | }(function (_ref3) {
|
136 | var vs = _ref3.vertexShader;
|
137 | return vertexShader || vs;
|
138 | })
|
139 | }
|
140 | };
|
141 |
|
142 | var requestedFragmentShader = getShaderFromCache(reglContext, currentState, currentState.fragmentShader);
|
143 |
|
144 | var requestedVertexShader = getShaderFromCache(reglContext, currentState, currentState.vertexShader);
|
145 |
|
146 | if (requestedFragmentShader && requestedFragmentShader != fragmentShader) {
|
147 | fragmentShader = requestedFragmentShader;
|
148 | }
|
149 |
|
150 | if (requestedVertexShader && requestedVertexShader != vertexShader) {
|
151 | vertexShader = requestedVertexShader;
|
152 | }
|
153 |
|
154 | if ('string' == typeof vertexShader) {
|
155 | opts.vert = vertexShader;
|
156 | }
|
157 | if ('string' == typeof fragmentShader) {
|
158 | opts.frag = fragmentShader;
|
159 | }
|
160 |
|
161 | if ('string' == typeof opts.vert || 'string' == typeof opts.frag) {
|
162 | var hash = [shaderLib.hash(opts.vert), shaderLib.hash(opts.frag)].filter(Boolean).join('');
|
163 | if (null == contextCache[hash]) {
|
164 | injectContext = ctx.regl(opts);
|
165 | contextCache[hash] = injectContext;
|
166 | injectContext.opts = opts;
|
167 | } else {
|
168 | injectContext = contextCache[hash];
|
169 | }
|
170 | }
|
171 | }
|
172 |
|
173 | function compile(reglContext, currentState) {
|
174 | if (!isShaderCached(currentState.vertexShader)) {
|
175 | compileVertexShader();
|
176 | }
|
177 |
|
178 | if (!isShaderCached(currentState.fragmentShader)) {
|
179 | compileFragmentShader();
|
180 | }
|
181 |
|
182 | function compileShader(type, shader) {
|
183 | var compiled = null;
|
184 | var uncompiled = null;
|
185 | if (isViableShader(shader)) {
|
186 | uncompiled = getViableShader(reglContext, currentState, shader);
|
187 | compiled = shaderLib.compile(shaderName + ' (' + type + ')', uncompiled);
|
188 | compiled = shaderLib.preprocess(compiled);
|
189 | return { compiled: compiled, uncompiled: uncompiled };
|
190 | }
|
191 | return null;
|
192 | }
|
193 |
|
194 | function isShaderCached(shader) {
|
195 | return Boolean(getShaderFromCache(reglContext, currentState, shader));
|
196 | }
|
197 |
|
198 | function compileVertexShader() {
|
199 | var result = compileShader('vertex', currentState.vertexShader);
|
200 | if (result) {
|
201 | vertexShader = result.compiled;
|
202 | vertexShaderUncompiled = result.uncompiled;
|
203 | shaderCache[shaderLib.hash(vertexShaderUncompiled)] = vertexShader;
|
204 | }
|
205 | }
|
206 |
|
207 | function compileFragmentShader() {
|
208 | var result = compileShader('fragment', currentState.fragmentShader);
|
209 | if (result) {
|
210 | fragmentShader = result.compiled;
|
211 | fragmentShaderUncompiled = result.uncompiled;
|
212 | shaderCache[shaderLib.hash(fragmentShaderUncompiled)] = fragmentShader;
|
213 | }
|
214 | }
|
215 | }
|
216 |
|
217 | function getViableShader(reglContext, currentState, shader) {
|
218 | if ('string' == typeof shader) {
|
219 | return shader;
|
220 | } else if ('function' == typeof shader) {
|
221 | return shader(reglContext, currentState);
|
222 | }
|
223 | }
|
224 |
|
225 | function isViableShader(shader) {
|
226 | return ['string', 'function'].indexOf(typeof shader === 'undefined' ? 'undefined' : _typeof(shader)) > -1;
|
227 | }
|
228 |
|
229 | function shouldCompile(reglContext, currentState) {
|
230 | var needsCompile = false;
|
231 | check('function' != typeof injectContext);
|
232 | checkShader(vertexShaderUncompiled, currentState.vertexShader);
|
233 | checkShader(fragmentShaderUncompiled, currentState.fragmentShader);
|
234 | return needsCompile;
|
235 |
|
236 | function check(cond) {
|
237 | if (cond) {
|
238 | needsCompile = true;
|
239 | }
|
240 | }
|
241 |
|
242 | function checkShader(current, next) {
|
243 | next = getViableShader(reglContext, currentState, next);
|
244 | if (shaderCache[shaderLib.hash(next)]) {
|
245 | return check(true);
|
246 | } else if ('string' != typeof current && next) {
|
247 | return check(true);
|
248 | } else if ('string' == typeof next && current != next) {
|
249 | return check(true);
|
250 | }
|
251 | }
|
252 | }
|
253 | return _this;
|
254 | }
|
255 |
|
256 | return Shader;
|
257 | }(_core.Component);
|
258 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFkZXIvc2hhZGVyLmpzIl0sIm5hbWVzIjpbIlNoYWRlciIsImRlZmF1bHRzIiwiZGVmaW5lcyIsImN0eCIsImluaXRpYWxTdGF0ZSIsInNoYWRlck5hbWUiLCJjb250ZXh0Q2FjaGUiLCJzaGFkZXJDYWNoZSIsInNoYWRlckxpYiIsImluamVjdFBhcmVudENvbnRleHQiLCJjb250ZXh0RGVmaW5lcyIsImluamVjdENvbnRleHQiLCJmcmFnbWVudFNoYWRlclVuY29tcGlsZWQiLCJ2ZXJ0ZXhTaGFkZXJVbmNvbXBpbGVkIiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJ1cGRhdGUiLCJzdGF0ZSIsImJsb2NrIiwicHJldmlvdXNTdGF0ZSIsInJlZ2xDb250ZXh0IiwiZm9yY2VDb21waWxlIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5cyIsImxlbmd0aCIsInByZXByb2Nlc3NvciIsImRlZmluZSIsInNob3VsZENvbXBpbGUiLCJjb21waWxlIiwic2V0SW5qZWN0Q29udGV4dCIsImdldFNoYWRlckZyb21DYWNoZSIsImN1cnJlbnRTdGF0ZSIsInNoYWRlciIsImdldFZpYWJsZVNoYWRlciIsImhhc2giLCJvcHRzIiwiY29udGV4dCIsImZzIiwidnMiLCJyZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciIsInJlcXVlc3RlZFZlcnRleFNoYWRlciIsInZlcnQiLCJmcmFnIiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJyZWdsIiwiaXNTaGFkZXJDYWNoZWQiLCJjb21waWxlVmVydGV4U2hhZGVyIiwiY29tcGlsZUZyYWdtZW50U2hhZGVyIiwiY29tcGlsZVNoYWRlciIsInR5cGUiLCJjb21waWxlZCIsInVuY29tcGlsZWQiLCJpc1ZpYWJsZVNoYWRlciIsInByZXByb2Nlc3MiLCJyZXN1bHQiLCJpbmRleE9mIiwibmVlZHNDb21waWxlIiwiY2hlY2siLCJjaGVja1NoYWRlciIsImNvbmQiLCJjdXJyZW50IiwibmV4dCJdLCJtYXBw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QUFxQjtBQUNsQzs7QUFFRCxlQUFTRSxXQUFULENBQXFCRSxPQUFyQixFQUE4QkMsSUFBOUIsRUFBb0M7QUFFbENBLGVBQU85QixnQkFBZ0JkLFdBQWhCLEVBQTZCWSxZQUE3QixFQUEyQ2dDLElBQTNDLENBQVA7QUFDQSxZQUFJekQsWUFBWUMsVUFBVTJCLElBQVYsQ0FBZTZCLElBQWYsQ0FBWixDQUFKLEVBQXVDO0FBQ3JDLGlCQUFPSixNQUFNLElBQU4sQ0FBUDtBQUNELFNBRkQsTUFFTyxJQUFJLFlBQVksT0FBT0csT0FBbkIsSUFBOEJDLElBQWxDLEVBQXdDO0FBQzdDLGlCQUFPSixNQUFNLElBQU4sQ0FBUDtBQUNELFNBRk0sTUFFQSxJQUFJLFlBQVksT0FBT0ksSUFBbkIsSUFBMkJELFdBQVdDLElBQTFDLEVBQWdEO0FBQ3JELGlCQUFPSixNQUFNLElBQU4sQ0FBUDtBQUNEO0FBQ0Y7QUFDRjtBQTFLaUM7QUEyS25DIiwiZmlsZSI6InNoYWRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgU2hhZGVyTGliIH0gZnJvbSAnLi4vY29yZSdcbmltcG9ydCB7IGFzc2lnbkRlZmF1bHRzIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBTY29wZWRDb250ZXh0IH0gZnJvbSAnLi4vc2NvcGUnXG5cbmV4cG9ydCBjbGFzcyBTaGFkZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMoKSB7IHJldHVybiB7IC4uLlNoYWRlckxpYi5kZWZhdWx0cygpLCBkZWZpbmVzOiB7fSB9IH1cbiAgY29uc3RydWN0b3IoY3R4LCBpbml0aWFsU3RhdGUgPSB7fSkge1xuICAgIGFzc2lnbkRlZmF1bHRzKGluaXRpYWxTdGF0ZSwgU2hhZGVyLmRlZmF1bHRzKCkpXG4gICAgY29uc3QgeyBkZWZpbmVzLCBzaGFkZXJOYW1lIH0gPSBpbml0aWFsU3RhdGVcbiAgICBjb25zdCBjb250ZXh0Q2FjaGUgPSB7fVxuICAgIGNvbnN0IHNoYWRlckNhY2hlID0ge31cbiAgICBjb25zdCBzaGFkZXJMaWIgPSBuZXcgU2hhZGVyTGliKHsgLi4uaW5pdGlhbFN0YXRlLCBkZWZpbmVzIH0pXG5cbiAgICBjb25zdCBpbmplY3RQYXJlbnRDb250ZXh0ID0gbmV3IFNjb3BlZENvbnRleHQoY3R4LCB7XG4gICAgICBkZWZpbmVzKHtkZWZpbmVzOiBjb250ZXh0RGVmaW5lc30pIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29udGV4dERlZmluZXMsIC4uLmRlZmluZXMgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBsZXQgaW5qZWN0Q29udGV4dCA9IG51bGxcblxuICAgIGxldCBmcmFnbWVudFNoYWRlclVuY29tcGlsZWQgPSBudWxsXG4gICAgbGV0IHZlcnRleFNoYWRlclVuY29tcGlsZWQgPSBudWxsXG4gICAgbGV0IGZyYWdtZW50U2hhZGVyID0gbnVsbFxuICAgIGxldCB2ZXJ0ZXhTaGFkZXIgPSBudWxsXG5cbiAgICBzdXBlcihjdHgsIGluaXRpYWxTdGF0ZSwgdXBkYXRlKVxuICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSwgYmxvY2ssIHByZXZpb3VzU3RhdGUpIHtcbiAgICAgIGluamVjdFBhcmVudENvbnRleHQoKHJlZ2xDb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCB7Zm9yY2VDb21waWxlID0gZmFsc2V9ID0gc3RhdGVcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkZWZpbmVzLCB7IC4uLnJlZ2xDb250ZXh0LmRlZmluZXMsIC4uLnN0YXRlLmRlZmluZXMgfSlcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVmaW5lcykubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHNoYWRlckxpYi5wcmVwcm9jZXNzb3IuZGVmaW5lKGRlZmluZXMpKSB7XG4gICAgICAgICAgICBmb3JjZUNvbXBpbGUgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcmNlQ29tcGlsZSB8fCBzaG91bGRDb21waWxlKHJlZ2xDb250ZXh0LCBzdGF0ZSkpIHtcbiAgICAgICAgICBjb21waWxlKHJlZ2xDb250ZXh0LCBzdGF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEluamVjdENvbnRleHQocmVnbENvbnRleHQsIHN0YXRlKVxuXG4gICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBpbmplY3RDb250ZXh0KSB7XG4gICAgICAgICAgaW5qZWN0Q29udGV4dChzdGF0ZSwgYmxvY2spXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmxvY2soc3RhdGUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2hhZGVyRnJvbUNhY2hlKHJlZ2xDb250ZXh0LCBjdXJyZW50U3RhdGUsIHNoYWRlcikge1xuICAgICAgc2hhZGVyID0gZ2V0VmlhYmxlU2hhZGVyKHJlZ2xDb250ZXh0LCBjdXJyZW50U3RhdGUsIHNoYWRlcilcbiAgICAgIHJldHVybiBzaGFkZXJDYWNoZVtzaGFkZXJMaWIuaGFzaChzaGFkZXIpXVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEluamVjdENvbnRleHQocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSkge1xuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiAoe2ZyYWdtZW50U2hhZGVyOiBmc30pID0+IGZyYWdtZW50U2hhZGVyIHx8IGZzLFxuICAgICAgICAgIHZlcnRleFNoYWRlcjogKHt2ZXJ0ZXhTaGFkZXI6IHZzIH0pID0+IHZlcnRleFNoYWRlciB8fCB2cyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciA9IGdldFNoYWRlckZyb21DYWNoZShcbiAgICAgICAgcmVnbENvbnRleHQsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgY3VycmVudFN0YXRlLmZyYWdtZW50U2hhZGVyKVxuXG4gICAgICBjb25zdCByZXF1ZXN0ZWRWZXJ0ZXhTaGFkZXIgPSBnZXRTaGFkZXJGcm9tQ2FjaGUoXG4gICAgICAgIHJlZ2xDb250ZXh0LFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGN1cnJlbnRTdGF0ZS52ZXJ0ZXhTaGFkZXIpXG5cbiAgICAgIGlmIChyZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciAmJiByZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciAhPSBmcmFnbWVudFNoYWRlcikge1xuICAgICAgICBmcmFnbWVudFNoYWRlciA9IHJlcXVlc3RlZEZyYWdtZW50U2hhZGVyXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1ZXN0ZWRWZXJ0ZXhTaGFkZXIgJiYgcmVxdWVzdGVkVmVydGV4U2hhZGVyICE9IHZlcnRleFNoYWRlcikge1xuICAgICAgICB2ZXJ0ZXhTaGFkZXIgPSByZXF1ZXN0ZWRWZXJ0ZXhTaGFkZXJcbiAgICAgIH1cblxuICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB2ZXJ0ZXhTaGFkZXIpIHsgb3B0cy52ZXJ0ID0gdmVydGV4U2hhZGVyIH1cbiAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZnJhZ21lbnRTaGFkZXIpIHsgb3B0cy5mcmFnID0gZnJhZ21lbnRTaGFkZXIgfVxuXG4gICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIG9wdHMudmVydCB8fCAnc3RyaW5nJyA9PSB0eXBlb2Ygb3B0cy5mcmFnKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBbc2hhZGVyTGliLmhhc2gob3B0cy52ZXJ0KSwgc2hhZGVyTGliLmhhc2gob3B0cy5mcmFnKV1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKS5qb2luKCcnKVxuICAgICAgICBpZiAobnVsbCA9PSBjb250ZXh0Q2FjaGVbaGFzaF0pIHtcbiAgICAgICAgICBpbmplY3RDb250ZXh0ID0gY3R4LnJlZ2wob3B0cylcbiAgICAgICAgICBjb250ZXh0Q2FjaGVbaGFzaF0gPSBpbmplY3RDb250ZXh0XG4gICAgICAgICAgaW5qZWN0Q29udGV4dC5vcHRzID0gb3B0c1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluamVjdENvbnRleHQgPSBjb250ZXh0Q2FjaGVbaGFzaF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBpbGUocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSkge1xuICAgICAgaWYgKCFpc1NoYWRlckNhY2hlZChjdXJyZW50U3RhdGUudmVydGV4U2hhZGVyKSkge1xuICAgICAgICBjb21waWxlVmVydGV4U2hhZGVyKClcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1NoYWRlckNhY2hlZChjdXJyZW50U3RhdGUuZnJhZ21lbnRTaGFkZXIpKSB7XG4gICAgICAgIGNvbXBpbGVGcmFnbWVudFNoYWRlcigpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGVTaGFkZXIodHlwZSwgc2hhZGVyKSB7XG4gICAgICAgIGxldCBjb21waWxlZCA9IG51bGxcbiAgICAgICAgbGV0IHVuY29tcGlsZWQgPSBudWxsXG4gICAgICAgIGlmIChpc1ZpYWJsZVNoYWRlcihzaGFkZXIpKSB7XG4gICAgICAgICAgdW5jb21waWxlZCA9IGdldFZpYWJsZVNoYWRlcihyZWdsQ29udGV4dCwgY3VycmVudFN0YXRlLCBzaGFkZXIpXG4gICAgICAgICAgY29tcGlsZWQgPSBzaGFkZXJMaWIuY29tcGlsZShgJHtzaGFkZXJOYW1lfSAoJHt0eXBlfSlgLCB1bmNvbXBpbGVkKVxuICAgICAgICAgIGNvbXBpbGVkID0gc2hhZGVyTGliLnByZXByb2Nlc3MoY29tcGlsZWQpXG4gICAgICAgICAgcmV0dXJuIHtjb21waWxlZCwgdW5jb21waWxlZH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc1NoYWRlckNhY2hlZChzaGFkZXIpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0U2hhZGVyRnJvbUNhY2hlKHJlZ2xDb250ZXh0LCBjdXJyZW50U3RhdGUsIHNoYWRlcikpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGVWZXJ0ZXhTaGFkZXIoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBpbGVTaGFkZXIoJ3ZlcnRleCcsIGN1cnJlbnRTdGF0ZS52ZXJ0ZXhTaGFkZXIpXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB2ZXJ0ZXhTaGFkZXIgPSByZXN1bHQuY29tcGlsZWRcbiAgICAgICAgICB2ZXJ0ZXhTaGFkZXJVbmNvbXBpbGVkID0gcmVzdWx0LnVuY29tcGlsZWRcbiAgICAgICAgICBzaGFkZXJDYWNoZVtzaGFkZXJMaWIuaGFzaCh2ZXJ0ZXhTaGFkZXJVbmNvbXBpbGVkKV0gPSB2ZXJ0ZXhTaGFkZXJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb21waWxlRnJhZ21lbnRTaGFkZXIoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBpbGVTaGFkZXIoJ2ZyYWdtZW50JywgY3VycmVudFN0YXRlLmZyYWdtZW50U2hhZGVyKVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSByZXN1bHQuY29tcGlsZWRcbiAgICAgICAgICBmcmFnbWVudFNoYWRlclVuY29tcGlsZWQgPSByZXN1bHQudW5jb21waWxlZFxuICAgICAgICAgIHNoYWRlckNhY2hlW3NoYWRlckxpYi5oYXNoKGZyYWdtZW50U2hhZGVyVW5jb21waWxlZCldID0gZnJhZ21lbnRTaGFkZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFZpYWJsZVNoYWRlcihyZWdsQ29udGV4dCwgY3VycmVudFN0YXRlLCBzaGFkZXIpIHtcbiAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2Ygc2hhZGVyKSB7IHJldHVybiBzaGFkZXIgfVxuICAgICAgZWxzZSBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygc2hhZGVyKSB7XG4gICAgICAgIHJldHVybiBzaGFkZXIocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZpYWJsZVNoYWRlcihzaGFkZXIpIHtcbiAgICAgIHJldHVybiBbJ3N0cmluZycsICdmdW5jdGlvbiddLmluZGV4T2YodHlwZW9mIHNoYWRlcikgPiAtMVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3VsZENvbXBpbGUocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSkge1xuICAgICAgbGV0IG5lZWRzQ29tcGlsZSA9IGZhbHNlXG4gICAgICBjaGVjaygnZnVuY3Rpb24nICE9IHR5cGVvZiBpbmplY3RDb250ZXh0KVxuICAgICAgY2hlY2tTaGFkZXIodmVydGV4U2hhZGVyVW5jb21waWxlZCwgY3VycmVudFN0YXRlLnZlcnRleFNoYWRlcilcbiAgICAgIGNoZWNrU2hhZGVyKGZyYWdtZW50U2hhZGVyVW5jb21waWxlZCwgY3VycmVudFN0YXRlLmZyYWdtZW50U2hhZGVyKVxuICAgICAgcmV0dXJuIG5lZWRzQ29tcGlsZVxuXG4gICAgICBmdW5jdGlvbiBjaGVjayhjb25kKSB7XG4gICAgICAgIGlmIChjb25kKSB7IG5lZWRzQ29tcGlsZSA9IHRydWUgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjaGVja1NoYWRlcihjdXJyZW50LCBuZXh0KSB7XG4gICAgICAgIGxldCBjb25kID0gZmFsc2VcbiAgICAgICAgbmV4dCA9IGdldFZpYWJsZVNoYWRlcihyZWdsQ29udGV4dCwgY3VycmVudFN0YXRlLCBuZXh0KVxuICAgICAgICBpZiAoc2hhZGVyQ2FjaGVbc2hhZGVyTGliLmhhc2gobmV4dCldKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKHRydWUpXG4gICAgICAgIH0gZWxzZSBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIGN1cnJlbnQgJiYgbmV4dCkge1xuICAgICAgICAgIHJldHVybiBjaGVjayh0cnVlKVxuICAgICAgICB9IGVsc2UgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBuZXh0ICYmIGN1cnJlbnQgIT0gbmV4dCkge1xuICAgICAgICAgIHJldHVybiBjaGVjayh0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0= |
\ | No newline at end of file |