UNPKG

22.6 kBJavaScriptView Raw
1'use strict';
2
3import { Context } from './core/context/context';
4import { ComponentEngine } from './core/engine/componentEngine';
5import { RenderingEngine } from './core/engine/engine';
6export class NailsDirectives {
7 constructor() {
8 this.directives = ['if', 'form', 'for', 'click', 'change'];
9 }
10 /*
11 A directive consists of an element (string) in the @directives array and a function declaration
12 below.
13 directive and function need to have the same name
14 sample body:
15 sample(element, statement, state){
16
17 }
18 where element is the element where the directive is added and statemenet
19 what has been declaired.
20 sample arguments
21 element = h1 reference
22 statement = var object of objects
23 state = current state
24
25 For reactivness, only use elements in the data object within the state, as these
26 are actively monitored.
27
28 DONT PREFIX YOUR DIRECTIVE AND FUNCTIONS WITH AN N
29 */
30
31
32 click(element, statement, state) {
33 const componentEngine = new ComponentEngine(state, new RenderingEngine(state), null, []);
34
35 if (!state.click) {
36 state.click.callbacks = [];
37 }
38
39 const callback = () => {
40 const instance = componentEngine.getInstanceOfElementOrNull(element);
41
42 if (instance !== null) {
43 // tslint:disable-next-line: no-eval
44 eval('instance.getComponent().' + statement);
45 return;
46 } // tslint:disable-next-line: no-eval
47
48
49 eval('state.methods.' + statement);
50 };
51
52 element.onclick = callback;
53 }
54
55 change(element, statement, state) {
56 const callback = () => {
57 // tslint:disable-next-line: no-eval
58 eval('state.methods.' + statement + '(' + element.value + ')');
59 };
60
61 element.onchange = callback;
62 }
63
64 form(element, statement, state) {
65 if (element.getAttribute('type') === 'text') {
66 if (state.data[statement] !== element.value) {
67 state.data[statement] = element.value;
68 }
69 }
70
71 element.addEventListener('input', () => {
72 if (state.data[statement] !== element.value) {
73 state.data[statement] = element.value;
74 }
75 });
76 }
77
78 for(element, statemenet, state) {
79 console.error('called');
80 const engine = new RenderingEngine(state);
81 const componentEngine = new ComponentEngine(state, engine, null, []);
82 engine.disableInterpolationForVariableNameOnElement(statemenet.split(' ')[1], element);
83 element.style.display = 'none'; // tslint:disable-next-line: no-shadowed-variable
84
85 function interpolateCustomElement(el, object, // tslint:disable-next-line: no-shadowed-variable
86 descriptor) {
87 // Performancewise, we render the whole html element.
88 let html = el.innerHTML;
89 const interpolations = engine.getInterpolationsForTextContent(html);
90
91 for (const interpolation of interpolations) {
92 let stripped = engine.stripAndTrimInterpolation(interpolation);
93 const args = stripped.split('.');
94 args[0] = '';
95 stripped = '';
96
97 for (const arg of args) {
98 stripped += arg + '.';
99 }
100
101 stripped = stripped.substring(0, stripped.length - 1);
102
103 if (engine.getValueOfInterpolation(interpolation, element) !== undefined) {
104 html = html.replace(interpolation, engine.getValueOfInterpolation(interpolation, element));
105 } else {
106 // tslint:disable: no-eval
107 html = html.replace(interpolation, engine.sanitize(eval('object' + stripped)));
108 }
109 }
110
111 el.innerHTML = html;
112 }
113
114 const descriptor = statemenet.split(' ')[1];
115 const arr = statemenet.split(' ')[3];
116 const instance = componentEngine.getInstanceOfElementOrNull(element);
117 const context = new Context(state, instance);
118 const refArray = context.resolveOrUndefined(arr);
119
120 if (!refArray) {
121 return;
122 }
123
124 const parent = element.parentNode;
125
126 if (parent === null) {
127 return;
128 }
129
130 for (const i of refArray) {
131 const child = document.createElement(element.nodeName);
132 child.innerHTML = element.innerHTML;
133 interpolateCustomElement(child, i, descriptor);
134 parent.appendChild(child);
135 engine.disableInterpolationForVariableNameOnElement(statemenet.split(' ')[1], child);
136
137 for (const attr of element.attributes) {
138 if (attr.name !== 'n-for' && attr.name !== 'style') {
139 child.setAttribute(attr.name, attr.value);
140 }
141 }
142
143 componentEngine.traverseElementAndExecuteDirectives(child); // engine.executeDirectivesOnElement(child, true)
144 }
145 }
146
147 if(element, statement, state) {
148 if (statement === 'true' || statement === 'false') {
149 if (statement === 'true') {
150 element.style.visibility = 'visible';
151 return;
152 } else {
153 element.style.visibility = 'hidden';
154 return;
155 }
156 }
157
158 let reversed = false;
159
160 if (statement[0] === '!') {
161 statement = statement.substring(1);
162 reversed = true;
163 }
164
165 const componentEngine = new ComponentEngine(state, new RenderingEngine(state), null, null); // tslint:disable-next-line:max-line-length
166
167 const context = new Context(state, componentEngine.getInstanceOfElementOrNull(element));
168
169 if (context.resolveOrUndefined(statement)) {
170 if (reversed) {
171 if (!eval(state.data[statement])) {
172 element.style.visibility = 'visible';
173 } else {
174 element.style.visibility = 'hidden';
175 }
176 } else {
177 if (eval(state.data[statement])) {
178 element.style.visibility = 'visible';
179 } else {
180 element.style.visibility = 'hidden';
181 }
182 }
183 } else {
184 element.style.visibility = 'hidden';
185 }
186 }
187
188}
189//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RpdmVEZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6WyJDb250ZXh0IiwiQ29tcG9uZW50RW5naW5lIiwiUmVuZGVyaW5nRW5naW5lIiwiTmFpbHNEaXJlY3RpdmVzIiwiY29uc3RydWN0b3IiLCJkaXJlY3RpdmVzIiwiY2xpY2siLCJlbGVtZW50Iiwic3RhdGVtZW50Iiwic3RhdGUiLCJjb21wb25lbnRFbmdpbmUiLCJjYWxsYmFja3MiLCJjYWxsYmFjayIsImluc3RhbmNlIiwiZ2V0SW5zdGFuY2VPZkVsZW1lbnRPck51bGwiLCJldmFsIiwib25jbGljayIsImNoYW5nZSIsInZhbHVlIiwib25jaGFuZ2UiLCJmb3JtIiwiZ2V0QXR0cmlidXRlIiwiZGF0YSIsImFkZEV2ZW50TGlzdGVuZXIiLCJmb3IiLCJzdGF0ZW1lbmV0IiwiY29uc29sZSIsImVycm9yIiwiZW5naW5lIiwiZGlzYWJsZUludGVycG9sYXRpb25Gb3JWYXJpYWJsZU5hbWVPbkVsZW1lbnQiLCJzcGxpdCIsInN0eWxlIiwiZGlzcGxheSIsImludGVycG9sYXRlQ3VzdG9tRWxlbWVudCIsImVsIiwib2JqZWN0IiwiZGVzY3JpcHRvciIsImh0bWwiLCJpbm5lckhUTUwiLCJpbnRlcnBvbGF0aW9ucyIsImdldEludGVycG9sYXRpb25zRm9yVGV4dENvbnRlbnQiLCJpbnRlcnBvbGF0aW9uIiwic3RyaXBwZWQiLCJzdHJpcEFuZFRyaW1JbnRlcnBvbGF0aW9uIiwiYXJncyIsImFyZyIsInN1YnN0cmluZyIsImxlbmd0aCIsImdldFZhbHVlT2ZJbnRlcnBvbGF0aW9uIiwidW5kZWZpbmVkIiwicmVwbGFjZSIsInNhbml0aXplIiwiYXJyIiwiY29udGV4dCIsInJlZkFycmF5IiwicmVzb2x2ZU9yVW5kZWZpbmVkIiwicGFyZW50IiwicGFyZW50Tm9kZSIsImkiLCJjaGlsZCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsIm5vZGVOYW1lIiwiYXBwZW5kQ2hpbGQiLCJhdHRyIiwiYXR0cmlidXRlcyIsIm5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJ0cmF2ZXJzZUVsZW1lbnRBbmRFeGVjdXRlRGlyZWN0aXZlcyIsImlmIiwidmlzaWJpbGl0eSIsInJldmVyc2VkIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxTQUFTQSxPQUFULFFBQXdCLHdCQUF4QjtBQUNBLFNBQVNDLGVBQVQsUUFBZ0MsK0JBQWhDO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxzQkFBaEM7QUFFQSxPQUFPLE1BQU1DLGVBQU4sQ0FBc0I7QUFFM0JDLEVBQUFBLFdBQVcsR0FBRztBQUNaLFNBQUtDLFVBQUwsR0FBa0IsQ0FBQyxJQUFELEVBQU8sTUFBUCxFQUFlLEtBQWYsRUFBc0IsT0FBdEIsRUFBK0IsUUFBL0IsQ0FBbEI7QUFDRDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJPQyxFQUFBQSxLQUFQLENBQWFDLE9BQWIsRUFBbUNDLFNBQW5DLEVBQXNEQyxLQUF0RCxFQUFvRTtBQUNsRSxVQUFNQyxlQUFlLEdBQUcsSUFBSVQsZUFBSixDQUFvQlEsS0FBcEIsRUFBMkIsSUFBSVAsZUFBSixDQUFvQk8sS0FBcEIsQ0FBM0IsRUFBdUQsSUFBdkQsRUFBNkQsRUFBN0QsQ0FBeEI7O0FBRUEsUUFBSSxDQUFDQSxLQUFLLENBQUNILEtBQVgsRUFBa0I7QUFDaEJHLE1BQUFBLEtBQUssQ0FBQ0gsS0FBTixDQUFZSyxTQUFaLEdBQXdCLEVBQXhCO0FBQ0Q7O0FBQ0QsVUFBTUMsUUFBUSxHQUFHLE1BQU07QUFDckIsWUFBTUMsUUFBUSxHQUFHSCxlQUFlLENBQUNJLDBCQUFoQixDQUEyQ1AsT0FBM0MsQ0FBakI7O0FBRUEsVUFBSU0sUUFBUSxLQUFLLElBQWpCLEVBQXVCO0FBQ3JCO0FBQ0FFLFFBQUFBLElBQUksQ0FBQyw2QkFBNkJQLFNBQTlCLENBQUo7QUFDQTtBQUNELE9BUG9CLENBUXJCOzs7QUFDQU8sTUFBQUEsSUFBSSxDQUFDLG1CQUFtQlAsU0FBcEIsQ0FBSjtBQUNELEtBVkQ7O0FBV0FELElBQUFBLE9B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b3J0IHsgSW5zdGFuY2UgfSBmcm9tICcuL2NsYXNzZXMvSW5zdGFuY2UnO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gJy4vY29yZS9jb250ZXh0L2NvbnRleHQnO1xuaW1wb3J0IHsgQ29tcG9uZW50RW5naW5lIH0gZnJvbSAnLi9jb3JlL2VuZ2luZS9jb21wb25lbnRFbmdpbmUnO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSAnLi9jb3JlL2VuZ2luZS9lbmdpbmUnO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuL2NvcmUvc3RhdGUnO1xuZXhwb3J0IGNsYXNzIE5haWxzRGlyZWN0aXZlcyB7XG4gIHB1YmxpYyBkaXJlY3RpdmVzOiBhbnk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZGlyZWN0aXZlcyA9IFsnaWYnLCAnZm9ybScsICdmb3InLCAnY2xpY2snLCAnY2hhbmdlJ107XG4gIH1cbiAgLypcbiAgICAgICAgICBBIGRpcmVjdGl2ZSBjb25zaXN0cyBvZiBhbiBlbGVtZW50IChzdHJpbmcpIGluIHRoZSBAZGlyZWN0aXZlcyBhcnJheSBhbmQgYSBmdW5jdGlvbiBkZWNsYXJhdGlvblxuICAgICAgICAgIGJlbG93LlxuICAgICAgICAgIGRpcmVjdGl2ZSBhbmQgZnVuY3Rpb24gbmVlZCB0byBoYXZlIHRoZSBzYW1lIG5hbWVcbiAgICAgICAgICBzYW1wbGUgYm9keTpcbiAgICAgICAgICBzYW1wbGUoZWxlbWVudCwgc3RhdGVtZW50LCBzdGF0ZSl7XG4gIFxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGVyZSBlbGVtZW50IGlzIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgaXMgYWRkZWQgYW5kIHN0YXRlbWVuZXRcbiAgICAgICAgICB3aGF0IGhhcyBiZWVuIGRlY2xhaXJlZC5cbiAgICAgICAgICBzYW1wbGUgYXJndW1lbnRzXG4gICAgICAgICAgZWxlbWVudCA9IGgxIHJlZmVyZW5jZVxuICAgICAgICAgIHN0YXRlbWVudCA9IHZhciBvYmplY3Qgb2Ygb2JqZWN0c1xuICAgICAgICAgIHN0YXRlID0gY3VycmVudCBzdGF0ZVxuICBcbiAgICAgICAgICBGb3IgcmVhY3Rpdm5lc3MsIG9ubHkgdXNlIGVsZW1lbnRzIGluIHRoZSBkYXRhIG9iamVjdCB3aXRoaW4gdGhlIHN0YXRlLCBhcyB0aGVzZVxuICAgICAgICAgIGFyZSBhY3RpdmVseSBtb25pdG9yZWQuXG4gIFxuICAgICAgICAgIERPTlQgUFJFRklYIFlPVVIgRElSRUNUSVZFIEFORCBGVU5DVElPTlMgV0lUSCBBTiBOXG4gICAgICAqL1xuXG4gIHB1YmxpYyBjbGljayhlbGVtZW50OiBIVE1MRWxlbWVudCwgc3RhdGVtZW50OiBzdHJpbmcsIHN0YXRlOiBTdGF0ZSkge1xuICAgIGNvbnN0IGNvbXBvbmVudEVuZ2luZSA9IG5ldyBDb21wb25lbnRFbmdpbmUoc3RhdGUsIG5ldyBSZW5kZXJpbmdFbmdpbmUoc3RhdGUpLCBudWxsLCBbXSk7XG5cbiAgICBpZiAoIXN0YXRlLmNsaWNrKSB7XG4gICAgICBzdGF0ZS5jbGljay5jYWxsYmFja3MgPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudEVuZ2luZS5nZXRJbnN0YW5jZU9mRWxlbWVudE9yTnVsbChlbGVtZW50KSBhcyBJbnN0YW5jZTtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZXZhbFxuICAgICAgICBldmFsKCdpbnN0YW5jZS5nZXRDb21wb25lbnQoKS4nICsgc3RhdGVtZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ldmFsXG4gICAgICBldmFsKCdzdGF0ZS5tZXRob2RzLicgKyBzdGF0ZW1lbnQpO1xuICAgIH07XG4gICAgZWxlbWVudC5vbmNsaWNrID0gY2FsbGJhY2s7XG4gIH1cbiAgcHVibGljIGNoYW5nZShlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50LCBzdGF0ZW1lbnQ6IHN0cmluZywgc3RhdGU6IFN0YXRlKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWV2YWxcbiAgICAgIGV2YWwoJ3N0YXRlLm1ldGhvZHMuJyArIHN0YXRlbWVudCArICcoJyArIGVsZW1lbnQudmFsdWUgKyAnKScpO1xuICAgIH07XG4gICAgZWxlbWVudC5vbmNoYW5nZSA9IGNhbGxiYWNrO1xuICB9XG4gIHB1YmxpYyBmb3JtKGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQsIHN0YXRlbWVudDogc3RyaW5nLCBzdGF0ZTogU3RhdGUpIHtcbiAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ3RleHQnKSB7XG4gICAgICBpZiAoc3RhdGUuZGF0YVtzdGF0ZW1lbnRdICE9PSBlbGVtZW50LnZhbHVlKSB7XG4gICAgICAgIHN0YXRlLmRhdGFbc3RhdGVtZW50XSA9IGVsZW1lbnQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBpZiAoc3RhdGUuZGF0YVtzdGF0ZW1lbnRdICE9PSBlbGVtZW50LnZhbHVlKSB7XG4gICAgICAgIHN0YXRlLmRhdGFbc3RhdGVtZW50XSA9IGVsZW1lbnQudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZm9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzdGF0ZW1lbmV0OiBzdHJpbmcsIHN0YXRlOiBTdGF0ZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NhbGxlZCcpO1xuICAgIGNvbnN0IGVuZ2luZSA9IG5ldyBSZW5kZXJpbmdFbmdpbmUoc3RhdGUpO1xuICAgIGNvbnN0IGNvbXBvbmVudEVuZ2luZSA9IG5ldyBDb21wb25lbnRFbmdpbmUoc3RhdGUsIGVuZ2luZSwgbnVsbCwgW10pO1xuICAgIGVuZ2luZS5kaXNhYmxlSW50ZXJwb2xhdGlvbkZvclZhcmlhYmxlTmFtZU9uRWxlbWVudChzdGF0ZW1lbmV0LnNwbGl0KCcgJylbMV0sIGVsZW1lbnQpO1xuXG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcbiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZUN1c3RvbUVsZW1lbnQoXG4gICAgICBlbDogSFRNTEVsZW1lbnQsXG4gICAgICBvYmplY3Q6IGFueSxcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcbiAgICAgIGRlc2NyaXB0b3I6IGFueSxcbiAgICApIHtcbiAgICAgIC8vIFBlcmZvcm1hbmNld2lzZSwgd2UgcmVuZGVyIHRoZSB3aG9sZSBodG1sIGVsZW1lbnQuXG4gICAgICBsZXQgaHRtbCA9IGVsLmlubmVySFRNTDtcbiAgICAgIGNvbnN0IGludGVycG9sYXRpb25zID0gZW5naW5lLmdldEludGVycG9sYXRpb25zRm9yVGV4dENvbnRlbnQoaHRtbCk7XG4gICAgICBmb3IgKGNvbnN0IGludGVycG9sYXRpb24gb2YgaW50ZXJwb2xhdGlvbnMpIHtcbiAgICAgICAgbGV0IHN0cmlwcGVkID0gZW5naW5lLnN0cmlwQW5kVHJpbUludGVycG9sYXRpb24oaW50ZXJwb2xhdGlvbik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBzdHJpcHBlZC5zcGxpdCgnLicpO1xuICAgICAgICBhcmdzWzBdID0gJyc7XG4gICAgICAgIHN0cmlwcGVkID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICBzdHJpcHBlZCArPSBhcmcgKyAnLic7XG4gICAgICAgIH1cbiAgICAgICAgc3RyaXBwZWQgPSBzdHJpcHBlZC5zdWJzdHJpbmcoMCwgc3RyaXBwZWQubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgaWYgKGVuZ2luZS5nZXRWYWx1ZU9mSW50ZXJwb2xhdGlvbihpbnRlcnBvbGF0aW9uLCBlbGVtZW50KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShpbnRlcnBvbGF0aW9uLCBlbmdpbmUuZ2V0VmFsdWVPZkludGVycG9sYXRpb24oaW50ZXJwb2xhdGlvbiwgZWxlbWVudCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlOiBuby1ldmFsXG4gICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShpbnRlcnBvbGF0aW9uLCBlbmdpbmUuc2FuaXRpemUoZXZhbCgnb2JqZWN0JyArIHN0cmlwcGVkKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbC5pbm5lckhUTUwgPSBodG1sO1xuICAgIH1cbiAgICBjb25zdCBkZXNjcmlwdG9yID0gc3RhdGVtZW5ldC5zcGxpdCgnICcpWzFdO1xuICAgIGNvbnN0IGFyciA9IHN0YXRlbWVuZXQuc3BsaXQoJyAnKVszXTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudEVuZ2luZS5nZXRJbnN0YW5jZU9mRWxlbWVudE9yTnVsbChlbGVtZW50KSBhcyBJbnN0YW5jZTtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUsIGluc3RhbmNlKTtcblxuICAgIGNvbnN0IHJlZkFycmF5ID0gY29udGV4dC5yZXNvbHZlT3JVbmRlZmluZWQoYXJyKTtcblxuICAgIGlmICghcmVmQXJyYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGkgb2YgcmVmQXJyYXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50Lm5vZGVOYW1lKTtcbiAgICAgIGNoaWxkLmlubmVySFRNTCA9IGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgaW50ZXJwb2xhdGVDdXN0b21FbGVtZW50KGNoaWxkLCBpLCBkZXNjcmlwdG9yKTtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICBlbmdpbmUuZGlzYWJsZUludGVycG9sYXRpb25Gb3JWYXJpYWJsZU5hbWVPbkVsZW1lbnQoc3RhdGVtZW5ldC5zcGxpdCgnICcpWzFdLCBjaGlsZCk7XG5cbiAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGF0dHIubmFtZSAhPT0gJ24tZm9yJyAmJiBhdHRyLm5hbWUgIT09ICdzdHlsZScpIHtcbiAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29tcG9uZW50RW5naW5lLnRyYXZlcnNlRWxlbWVudEFuZEV4ZWN1dGVEaXJlY3RpdmVzKGNoaWxkKTtcbiAgICAgIC8vIGVuZ2luZS5leGVjdXRlRGlyZWN0aXZlc09uRWxlbWVudChjaGlsZCwgdHJ1ZSlcbiAgICB9XG4gIH1cbiAgcHVibGljIGlmKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzdGF0ZW1lbnQ6IHN0cmluZywgc3RhdGU6IFN0YXRlKSB7XG4gICAgaWYgKHN0YXRlbWVudCA9PT0gJ3RydWUnIHx8IHN0YXRlbWVudCA9PT0gJ2ZhbHNlJykge1xuICAgICAgaWYgKHN0YXRlbWVudCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcblxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJldmVyc2VkID0gZmFsc2U7XG4gICAgaWYgKHN0YXRlbWVudFswXSA9PT0gJyEnKSB7XG4gICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQuc3Vic3RyaW5nKDEpO1xuICAgICAgcmV2ZXJzZWQgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb21wb25lbnRFbmdpbmUgPSBuZXcgQ29tcG9uZW50RW5naW5lKHN0YXRlLCBuZXcgUmVuZGVyaW5nRW5naW5lKHN0YXRlKSwgbnVsbCwgbnVsbCk7XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXRlLCBjb21wb25lbnRFbmdpbmUuZ2V0SW5zdGFuY2VPZkVsZW1lbnRPck51bGwoZWxlbWVudCkpO1xuICAgIGlmIChjb250ZXh0LnJlc29sdmVPclVuZGVmaW5lZChzdGF0ZW1lbnQpKSB7XG4gICAgICBpZiAocmV2ZXJzZWQpIHtcbiAgICAgICAgaWYgKCFldmFsKHN0YXRlLmRhdGFbc3RhdGVtZW50XSkpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChldmFsKHN0YXRlLmRhdGFbc3RhdGVtZW50XSkpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuICB9XG59XG4iXX0=
\No newline at end of file