├── .gitignore
├── README.md
├── apex
└── f103.sql
├── config.json
├── dist
├── kscope.zip
└── kscope
│ ├── apex_pages
│ └── js
│ │ ├── p2.js
│ │ └── p2.min.js
│ └── js
│ ├── apex_pages
│ ├── p2.js
│ └── p2.min.js
│ ├── bundle.js
│ ├── bundle.min.js
│ ├── kscope.js
│ └── kscope.min.js
├── gulp-tasks
├── bundle.js
├── deploy.js
└── scripts.js
├── gulpfile.js
├── package.json
└── src
└── js
├── applications
└── kscope
│ ├── apex_pages
│ └── p2.js
│ └── kscope.js
├── modules
├── keyboardShortcuts.js
└── message.js
└── widgets
└── customReport.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/*
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # apex-modular-js
2 | Using modular JavaScript with Oracle Application Express
3 |
4 | This project is created for sample purposes only. It demonstrates how to create and use reusable JavaScript modules & widgets in an APEX application. It's developed with a combination of Node.js, Gulp and Browserify.
5 |
6 | The project was presented at the Kscope16 conference.
7 |
8 | Demo: https://apex.oracle.com/pls/apex/f?p=78682
9 |
10 | Blogpost: [https://blog.iadvise.eu/2016/08/12/apex-javascript-the-modular-way/](https://blog.iadvise.eu/2016/08/12/apex-javascript-the-modular-way/)
11 |
12 | Take a look at all the files to see how it works.
13 |
14 | ## System Requirements
15 | - [Node.js](https://nodejs.org)
16 | - [Oracle APEX](https://apex.oracle.com)
17 | - [Git](https://git-scm.com/downloads)
18 |
19 | ## Install this project
20 | - Open the command line
21 | - Go to your desired directory
22 | - Execute
23 | ```bash
24 | git clone https://github.com/mennooo/apex-modular-js.git
25 | cd apex-modular-js
26 | npm install
27 | ```
28 |
29 | ## Install APEX Sample application
30 | You can import the demo application in your APEX workspace. It works immediate without any further actions and is located at:
31 | ```
32 | apex/f103.sql
33 | ```
34 |
35 | ## Run
36 | **On the command line:**
37 | ```bash
38 | npm start
39 | ```
40 | ## Usage
41 | You can change the content of the JavaScript files to see how it affects the sample application.
42 | From the `src` folder you can create, edit or delete any files in:
43 | ```
44 | |-/src/
45 | |-js
46 | |-applications
47 | |-kscope
48 | |-modules
49 | |-widgets
50 | ```
51 | As you can see the `modules` and `widgets` folders are not placed inside the `applications` folder because we want to be able to use them in multiple applications.
52 | New modules are not added to your application immediate. If you want to include any module or widget in the sample application then change the following config file:
53 | ```
54 | config.json
55 | ```
56 | The names of modules and widgets must be the same as the corresponding `.js` files.
57 |
58 | Saving changes to file in the `src` folder will automatically compile your files to this folder structure:
59 | ```
60 | |-/dist/
61 | |-kscope
62 | ```
63 |
64 | A zip file called `kscope.zip` will be created every time you save a change:
65 | ```
66 | dist/kscope/kscope.zip
67 | ```
68 | Please upload the file `dist/kscope/kscope.zip` to APEX **Static Application Files** in the sample application. At this point you can use the new code in the application.
69 |
70 | In a real world project you can tell Gulp to upload the content of the dist folder to your webserver via sftp (most likely /i/ folder).
71 |
72 | ## About the APEX sample application
73 |
74 | The application includes 4 examples about using the Modular JavaScript approach. It's also available on apex.oracle.com:
75 | https://apex.oracle.com/pls/apex/f?p=78682
76 |
77 | It's based around integrating the pNotify plugin.
78 |
79 | Examples:
80 | - 1: Load nessecary files in page, put code inside dynamic action (not recommended)
81 | - 2: Encapsulate pNotify in kscope.message module, put code in p2.js file (a bit better)
82 | - 3: Encapsulate kscope.message module in dynamic action plugin, add dynamic action to page 3 (preferred solution)
83 | - 4: Encapsulate kscope.message module inside keyboardShortcuts module (advanced usage)
84 |
85 | In example 4, it's not longer needed to include the message module in the `config.json` because it will be bundled as part of the keyboardShortcuts module. Feel free to test this out.
86 |
87 | The JavaScript files from this project are added under **User Interface Details** in the **JavaScript File URLs**. The filenames are **Substitution Variables** defined in the **Application Definition**.
88 |
89 | ## How the project works
90 |
91 | ### Bundling all modules and widgets
92 |
93 | It's developed to demonstrate how to bundle required modules and widgets into a single file to add to your APEX application.
94 | A module dependency loader loads required client side modules as part of the module. In this case a module dependency loader called Browserify was used.
95 |
96 | For instance:
97 | - The module message.js requires jQuery and pNotify in order to work when bundled.
98 | - The module keyboardShortcuts.js requires keymaster and our message module in order to work when bundled.
99 |
100 | The external plugins are preinstalled and they are available as NPM packages. The installation was done as follows.
101 | Go to the root folder of this project and execute these commands:
102 | ```
103 | npm install --save pnotify
104 | npm install --save keymaster
105 | ```
106 |
107 | If you would like to add other external plugins, make sure they are available is NPM package at npmjs.com.
108 |
109 | The tasks to bundle the modules and widgets and place all files for deployment in the `dist` folder is done via an automated task runner called Gulp.
110 |
111 | Gulp itself is a Node.js module which works well together with Browserify. Feel free to take a look at the Gulp config in:
112 | ```
113 | gulpfile.js
114 | gulp-tasks/bundle.js
115 | gulp-tasks/deploy.js
116 | gulp-tasks/scripts.js
117 | ```
118 | I had to tweak the Browserify task in Gulp a little bit because Browserify typically creates one big bundle where all functions are only accessible within the file. In APEX we need to access the modules from dynamic actions and other external JavaScript files, so I've attached the modules and widgets to a global namespace called `kscope`.
119 |
--------------------------------------------------------------------------------
/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "applications": [
3 | {
4 | "alias": "kscope",
5 | "modules": ["message", "keyboardShortcuts"],
6 | "widgets": ["customReport"]
7 | }
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/dist/kscope.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mennooo/apex-modular-js/1c57b6d6cdf371658155341939caf49cefa70a77/dist/kscope.zip
--------------------------------------------------------------------------------
/dist/kscope/apex_pages/js/p2.js:
--------------------------------------------------------------------------------
1 | (function localScope() {apex.jQuery(document).ready(function(){
2 |
3 | // Show message on button click
4 | $('#MESSAGE').on('click', function() {
5 | kscope.message.info({
6 | title: "Hi Kscope",
7 | text: "Now I'm loaded by the page.js"
8 | });
9 | });
10 |
11 | });
12 | })();
--------------------------------------------------------------------------------
/dist/kscope/apex_pages/js/p2.min.js:
--------------------------------------------------------------------------------
1 | !function(){apex.jQuery(document).ready(function(){$("#MESSAGE").on("click",function(){kscope.message.info({title:"Hi Kscope",text:"Now I'm loaded by the page.js"})})})}();
--------------------------------------------------------------------------------
/dist/kscope/js/apex_pages/p2.js:
--------------------------------------------------------------------------------
1 | (function localScope() {apex.jQuery(document).ready(function(){
2 |
3 | // Show message on button click
4 | $('#MESSAGE').on('click', function() {
5 | kscope.message.info({
6 | title: "Hi Kscope",
7 | text: "Now I'm loaded by the page.js"
8 | });
9 | });
10 |
11 | });
12 | })();
--------------------------------------------------------------------------------
/dist/kscope/js/apex_pages/p2.min.js:
--------------------------------------------------------------------------------
1 | !function(){apex.jQuery(document).ready(function(){$("#MESSAGE").on("click",function(){kscope.message.info({title:"Hi Kscope",text:"Now I'm loaded by the page.js"})})})}();
--------------------------------------------------------------------------------
/dist/kscope/js/bundle.js:
--------------------------------------------------------------------------------
1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o property to true and return
78 | if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko
79 | if(key in _mods) {
80 | _mods[key] = true;
81 | // 'assignKey' from inside this closure is exported to window.key
82 | for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;
83 | return;
84 | }
85 | updateModifierKey(event);
86 |
87 | // see if we need to ignore the keypress (filter() can can be overridden)
88 | // by default ignore key presses if a select, textarea, or input is focused
89 | if(!assignKey.filter.call(this, event)) return;
90 |
91 | // abort if no potentially matching shortcuts found
92 | if (!(key in _handlers)) return;
93 |
94 | scope = getScope();
95 |
96 | // for each potential shortcut
97 | for (i = 0; i < _handlers[key].length; i++) {
98 | handler = _handlers[key][i];
99 |
100 | // see if it's in the current scope
101 | if(handler.scope == scope || handler.scope == 'all'){
102 | // check if modifiers match if any
103 | modifiersMatch = handler.mods.length > 0;
104 | for(k in _mods)
105 | if((!_mods[k] && index(handler.mods, +k) > -1) ||
106 | (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false;
107 | // call the handler and stop the event if neccessary
108 | if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){
109 | if(handler.method(event, handler)===false){
110 | if(event.preventDefault) event.preventDefault();
111 | else event.returnValue = false;
112 | if(event.stopPropagation) event.stopPropagation();
113 | if(event.cancelBubble) event.cancelBubble = true;
114 | }
115 | }
116 | }
117 | }
118 | };
119 |
120 | // unset modifier keys on keyup
121 | function clearModifier(event){
122 | var key = event.keyCode, k,
123 | i = index(_downKeys, key);
124 |
125 | // remove key from _downKeys
126 | if (i >= 0) {
127 | _downKeys.splice(i, 1);
128 | }
129 |
130 | if(key == 93 || key == 224) key = 91;
131 | if(key in _mods) {
132 | _mods[key] = false;
133 | for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false;
134 | }
135 | };
136 |
137 | function resetModifiers() {
138 | for(k in _mods) _mods[k] = false;
139 | for(k in _MODIFIERS) assignKey[k] = false;
140 | };
141 |
142 | // parse and assign shortcut
143 | function assignKey(key, scope, method){
144 | var keys, mods;
145 | keys = getKeys(key);
146 | if (method === undefined) {
147 | method = scope;
148 | scope = 'all';
149 | }
150 |
151 | // for each shortcut
152 | for (var i = 0; i < keys.length; i++) {
153 | // set modifier keys if any
154 | mods = [];
155 | key = keys[i].split('+');
156 | if (key.length > 1){
157 | mods = getMods(key);
158 | key = [key[key.length-1]];
159 | }
160 | // convert to keycode and...
161 | key = key[0]
162 | key = code(key);
163 | // ...store handler
164 | if (!(key in _handlers)) _handlers[key] = [];
165 | _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods });
166 | }
167 | };
168 |
169 | // unbind all handlers for given key in current scope
170 | function unbindKey(key, scope) {
171 | var multipleKeys, keys,
172 | mods = [],
173 | i, j, obj;
174 |
175 | multipleKeys = getKeys(key);
176 |
177 | for (j = 0; j < multipleKeys.length; j++) {
178 | keys = multipleKeys[j].split('+');
179 |
180 | if (keys.length > 1) {
181 | mods = getMods(keys);
182 | key = keys[keys.length - 1];
183 | }
184 |
185 | key = code(key);
186 |
187 | if (scope === undefined) {
188 | scope = getScope();
189 | }
190 | if (!_handlers[key]) {
191 | return;
192 | }
193 | for (i = 0; i < _handlers[key].length; i++) {
194 | obj = _handlers[key][i];
195 | // only clear handlers if correct scope and mods match
196 | if (obj.scope === scope && compareArray(obj.mods, mods)) {
197 | _handlers[key][i] = {};
198 | }
199 | }
200 | }
201 | };
202 |
203 | // Returns true if the key with code 'keyCode' is currently down
204 | // Converts strings into key codes.
205 | function isPressed(keyCode) {
206 | if (typeof(keyCode)=='string') {
207 | keyCode = code(keyCode);
208 | }
209 | return index(_downKeys, keyCode) != -1;
210 | }
211 |
212 | function getPressedKeyCodes() {
213 | return _downKeys.slice(0);
214 | }
215 |
216 | function filter(event){
217 | var tagName = (event.target || event.srcElement).tagName;
218 | // ignore keypressed in any elements that support keyboard data input
219 | return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');
220 | }
221 |
222 | // initialize key. to false
223 | for(k in _MODIFIERS) assignKey[k] = false;
224 |
225 | // set current scope (default 'all')
226 | function setScope(scope){ _scope = scope || 'all' };
227 | function getScope(){ return _scope || 'all' };
228 |
229 | // delete all handlers for a given scope
230 | function deleteScope(scope){
231 | var key, handlers, i;
232 |
233 | for (key in _handlers) {
234 | handlers = _handlers[key];
235 | for (i = 0; i < handlers.length; ) {
236 | if (handlers[i].scope === scope) handlers.splice(i, 1);
237 | else i++;
238 | }
239 | }
240 | };
241 |
242 | // abstract key logic for assign and unassign
243 | function getKeys(key) {
244 | var keys;
245 | key = key.replace(/\s/g, '');
246 | keys = key.split(',');
247 | if ((keys[keys.length - 1]) == '') {
248 | keys[keys.length - 2] += ',';
249 | }
250 | return keys;
251 | }
252 |
253 | // abstract mods logic for assign and unassign
254 | function getMods(key) {
255 | var mods = key.slice(0, key.length - 1);
256 | for (var mi = 0; mi < mods.length; mi++)
257 | mods[mi] = _MODIFIERS[mods[mi]];
258 | return mods;
259 | }
260 |
261 | // cross-browser events
262 | function addEvent(object, event, method) {
263 | if (object.addEventListener)
264 | object.addEventListener(event, method, false);
265 | else if(object.attachEvent)
266 | object.attachEvent('on'+event, function(){ method(window.event) });
267 | };
268 |
269 | // set the handlers globally on document
270 | addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48
271 | addEvent(document, 'keyup', clearModifier);
272 |
273 | // reset modifiers to false whenever the window is (re)focused.
274 | addEvent(window, 'focus', resetModifiers);
275 |
276 | // store previously defined key
277 | var previousKey = global.key;
278 |
279 | // restore previously defined key and return reference to our key object
280 | function noConflict() {
281 | var k = global.key;
282 | global.key = previousKey;
283 | return k;
284 | }
285 |
286 | // set window.key and window.key.set/get/deleteScope, and the default filter
287 | global.key = assignKey;
288 | global.key.setScope = setScope;
289 | global.key.getScope = getScope;
290 | global.key.deleteScope = deleteScope;
291 | global.key.filter = filter;
292 | global.key.isPressed = isPressed;
293 | global.key.getPressedKeyCodes = getPressedKeyCodes;
294 | global.key.noConflict = noConflict;
295 | global.key.unbind = unbindKey;
296 |
297 | if(typeof module !== 'undefined') module.exports = assignKey;
298 |
299 | })(this);
300 |
301 | },{}],3:[function(require,module,exports){
302 | (function (global){
303 | /*
304 | PNotify 3.0.0 sciactive.com/pnotify/
305 | (C) 2015 Hunter Perrin; Google, Inc.
306 | license Apache-2.0
307 | */
308 | (function(b,k){"function"===typeof define&&define.amd?define("pnotify",["jquery"],function(q){return k(q,b)}):"object"===typeof exports&&"undefined"!==typeof module?module.exports=k((window.$),global||b):b.PNotify=k(b.jQuery,b)})(this,function(b,k){var q=function(l){var k={dir1:"down",dir2:"left",push:"bottom",spacing1:36,spacing2:36,context:b("body"),modal:!1},g,h,n=b(l),r=function(){h=b("body");d.prototype.options.stack.context=h;n=b(l);n.bind("resize",function(){g&&clearTimeout(g);g=setTimeout(function(){d.positionAll(!0)},
309 | 10)})},s=function(c){var a=b("",{"class":"ui-pnotify-modal-overlay"});a.prependTo(c.context);c.overlay_close&&a.click(function(){d.removeStack(c)});return a},d=function(c){this.parseOptions(c);this.init()};b.extend(d.prototype,{version:"3.0.0",options:{title:!1,title_escape:!1,text:!1,text_escape:!1,styling:"brighttheme",addclass:"",cornerclass:"",auto_display:!0,width:"300px",min_height:"16px",type:"notice",icon:!0,animation:"fade",animate_speed:"normal",shadow:!0,hide:!0,delay:8E3,mouse_reset:!0,
310 | remove:!0,insert_brs:!0,destroy:!0,stack:k},modules:{},runModules:function(c,a){var p,b;for(b in this.modules)p="object"===typeof a&&b in a?a[b]:a,"function"===typeof this.modules[b][c]&&(this.modules[b].notice=this,this.modules[b].options="object"===typeof this.options[b]?this.options[b]:{},this.modules[b][c](this,"object"===typeof this.options[b]?this.options[b]:{},p))},state:"initializing",timer:null,animTimer:null,styles:null,elem:null,container:null,title_container:null,text_container:null,animating:!1,
311 | timerHide:!1,init:function(){var c=this;this.modules={};b.extend(!0,this.modules,d.prototype.modules);this.styles="object"===typeof this.options.styling?this.options.styling:d.styling[this.options.styling];this.elem=b("",{"class":"ui-pnotify "+this.options.addclass,css:{display:"none"},"aria-live":"assertive","aria-role":"alertdialog",mouseenter:function(a){if(c.options.mouse_reset&&"out"===c.animating){if(!c.timerHide)return;c.cancelRemove()}c.options.hide&&c.options.mouse_reset&&c.cancelRemove()},
312 | mouseleave:function(a){c.options.hide&&c.options.mouse_reset&&"out"!==c.animating&&c.queueRemove();d.positionAll()}});"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);this.container=b("",{"class":this.styles.container+" ui-pnotify-container "+("error"===this.options.type?this.styles.error:"info"===this.options.type?this.styles.info:"success"===this.options.type?this.styles.success:this.styles.notice),role:"alert"}).appendTo(this.elem);""!==
313 | this.options.cornerclass&&this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass);this.options.shadow&&this.container.addClass("ui-pnotify-shadow");!1!==this.options.icon&&b("",{"class":"ui-pnotify-icon"}).append(b("",{"class":!0===this.options.icon?"error"===this.options.type?this.styles.error_icon:"info"===this.options.type?this.styles.info_icon:"success"===this.options.type?this.styles.success_icon:this.styles.notice_icon:this.options.icon})).prependTo(this.container);
314 | this.title_container=b("",{"class":"ui-pnotify-title"}).appendTo(this.container);!1===this.options.title?this.title_container.hide():this.options.title_escape?this.title_container.text(this.options.title):this.title_container.html(this.options.title);this.text_container=b("",{"class":"ui-pnotify-text","aria-role":"alert"}).appendTo(this.container);!1===this.options.text?this.text_container.hide():this.options.text_escape?this.text_container.text(this.options.text):this.text_container.html(this.options.insert_brs?
315 | String(this.options.text).replace(/\n/g,"
"):this.options.text);"string"===typeof this.options.width&&this.elem.css("width",this.options.width);"string"===typeof this.options.min_height&&this.container.css("min-height",this.options.min_height);d.notices="top"===this.options.stack.push?b.merge([this],d.notices):b.merge(d.notices,[this]);"top"===this.options.stack.push&&this.queuePosition(!1,1);this.options.stack.animation=!1;this.runModules("init");this.options.auto_display&&this.open();return this},
316 | update:function(c){var a=this.options;this.parseOptions(a,c);this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast");"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);this.options.cornerclass!==a.cornerclass&&this.container.removeClass("ui-corner-all "+a.cornerclass).addClass(this.options.cornerclass);this.options.shadow!==a.shadow&&(this.options.shadow?this.container.addClass("ui-pnotify-shadow"):this.container.removeClass("ui-pnotify-shadow"));
317 | !1===this.options.addclass?this.elem.removeClass(a.addclass):this.options.addclass!==a.addclass&&this.elem.removeClass(a.addclass).addClass(this.options.addclass);!1===this.options.title?this.title_container.slideUp("fast"):this.options.title!==a.title&&(this.options.title_escape?this.title_container.text(this.options.title):this.title_container.html(this.options.title),!1===a.title&&this.title_container.slideDown(200));!1===this.options.text?this.text_container.slideUp("fast"):this.options.text!==
318 | a.text&&(this.options.text_escape?this.text_container.text(this.options.text):this.text_container.html(this.options.insert_brs?String(this.options.text).replace(/\n/g,"
"):this.options.text),!1===a.text&&this.text_container.slideDown(200));this.options.type!==a.type&&this.container.removeClass(this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info).addClass("error"===this.options.type?this.styles.error:"info"===this.options.type?this.styles.info:"success"===this.options.type?
319 | this.styles.success:this.styles.notice);if(this.options.icon!==a.icon||!0===this.options.icon&&this.options.type!==a.type)this.container.find("div.ui-pnotify-icon").remove(),!1!==this.options.icon&&b("",{"class":"ui-pnotify-icon"}).append(b("",{"class":!0===this.options.icon?"error"===this.options.type?this.styles.error_icon:"info"===this.options.type?this.styles.info_icon:"success"===this.options.type?this.styles.success_icon:this.styles.notice_icon:this.options.icon})).prependTo(this.container);
320 | this.options.width!==a.width&&this.elem.animate({width:this.options.width});this.options.min_height!==a.min_height&&this.container.animate({minHeight:this.options.min_height});this.options.hide?a.hide||this.queueRemove():this.cancelRemove();this.queuePosition(!0);this.runModules("update",a);return this},open:function(){this.state="opening";this.runModules("beforeOpen");var c=this;this.elem.parent().length||this.elem.appendTo(this.options.stack.context?this.options.stack.context:h);"top"!==this.options.stack.push&&
321 | this.position(!0);this.animateIn(function(){c.queuePosition(!0);c.options.hide&&c.queueRemove();c.state="open";c.runModules("afterOpen")});return this},remove:function(c){this.state="closing";this.timerHide=!!c;this.runModules("beforeClose");var a=this;this.timer&&(l.clearTimeout(this.timer),this.timer=null);this.animateOut(function(){a.state="closed";a.runModules("afterClose");a.queuePosition(!0);a.options.remove&&a.elem.detach();a.runModules("beforeDestroy");if(a.options.destroy&&null!==d.notices){var c=
322 | b.inArray(a,d.notices);-1!==c&&d.notices.splice(c,1)}a.runModules("afterDestroy")});return this},get:function(){return this.elem},parseOptions:function(c,a){this.options=b.extend(!0,{},d.prototype.options);this.options.stack=d.prototype.options.stack;for(var p=[c,a],m,f=0;f(a.context.is(h)?n.height():a.context.prop("scrollHeight"))||"up"===a.dir1&&a.nextpos1+b.height()>
327 | (a.context.is(h)?n.height():a.context.prop("scrollHeight"))||"left"===a.dir1&&a.nextpos1+b.width()>(a.context.is(h)?n.width():a.context.prop("scrollWidth"))||"right"===a.dir1&&a.nextpos1+b.width()>(a.context.is(h)?n.width():a.context.prop("scrollWidth")))a.nextpos1=a.firstpos1,a.nextpos2+=a.addpos2+("undefined"===typeof a.spacing2?25:a.spacing2),a.addpos2=0;"number"===typeof a.nextpos2&&(a.animation?b.css(e,a.nextpos2+"px"):(b.removeClass("ui-pnotify-move"),b.css(e,a.nextpos2+"px"),b.css(e),b.addClass("ui-pnotify-move")));
328 | switch(a.dir2){case "down":case "up":b.outerHeight(!0)>a.addpos2&&(a.addpos2=b.height());break;case "left":case "right":b.outerWidth(!0)>a.addpos2&&(a.addpos2=b.width())}"number"===typeof a.nextpos1&&(a.animation?b.css(f,a.nextpos1+"px"):(b.removeClass("ui-pnotify-move"),b.css(f,a.nextpos1+"px"),b.css(f),b.addClass("ui-pnotify-move")));switch(a.dir1){case "down":case "up":a.nextpos1+=b.height()+("undefined"===typeof a.spacing1?25:a.spacing1);break;case "left":case "right":a.nextpos1+=b.width()+("undefined"===
329 | typeof a.spacing1?25:a.spacing1)}}return this}},queuePosition:function(b,a){g&&clearTimeout(g);a||(a=10);g=setTimeout(function(){d.positionAll(b)},a);return this},cancelRemove:function(){this.timer&&l.clearTimeout(this.timer);this.animTimer&&l.clearTimeout(this.animTimer);"closing"===this.state&&(this.state="open",this.animating=!1,this.elem.addClass("ui-pnotify-in"),"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-in"));return this},queueRemove:function(){var b=this;this.cancelRemove();
330 | this.timer=l.setTimeout(function(){b.remove(!0)},isNaN(this.options.delay)?0:this.options.delay);return this}});b.extend(d,{notices:[],reload:q,removeAll:function(){b.each(d.notices,function(){this.remove&&this.remove(!1)})},removeStack:function(c){b.each(d.notices,function(){this.remove&&this.options.stack===c&&this.remove(!1)})},positionAll:function(c){g&&clearTimeout(g);g=null;if(d.notices&&d.notices.length)b.each(d.notices,function(){var a=this.options.stack;a&&(a.overlay&&a.overlay.hide(),a.nextpos1=
331 | a.firstpos1,a.nextpos2=a.firstpos2,a.addpos2=0,a.animation=c)}),b.each(d.notices,function(){this.position()});else{var a=d.prototype.options.stack;a&&(delete a.nextpos1,delete a.nextpos2)}},styling:{brighttheme:{container:"brighttheme",notice:"brighttheme-notice",notice_icon:"brighttheme-icon-notice",info:"brighttheme-info",info_icon:"brighttheme-icon-info",success:"brighttheme-success",success_icon:"brighttheme-icon-success",error:"brighttheme-error",error_icon:"brighttheme-icon-error"},jqueryui:{container:"ui-widget ui-widget-content ui-corner-all",
332 | notice:"ui-state-highlight",notice_icon:"ui-icon ui-icon-info",info:"",info_icon:"ui-icon ui-icon-info",success:"ui-state-default",success_icon:"ui-icon ui-icon-circle-check",error:"ui-state-error",error_icon:"ui-icon ui-icon-alert"},bootstrap3:{container:"alert",notice:"alert-warning",notice_icon:"glyphicon glyphicon-exclamation-sign",info:"alert-info",info_icon:"glyphicon glyphicon-info-sign",success:"alert-success",success_icon:"glyphicon glyphicon-ok-sign",error:"alert-danger",error_icon:"glyphicon glyphicon-warning-sign"}}});
333 | d.styling.fontawesome=b.extend({},d.styling.bootstrap3);b.extend(d.styling.fontawesome,{notice_icon:"fa fa-exclamation-circle",info_icon:"fa fa-info",success_icon:"fa fa-check",error_icon:"fa fa-warning"});l.document.body?r():b(r);return d};return q(k)});
334 |
335 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
336 |
337 | },{}],4:[function(require,module,exports){
338 | var key = require("keymaster");
339 | var message = require("modules/message");
340 |
341 | // Add shortcut coe
342 | var _addShortcut = function(selectedKey,cb) {
343 | key(selectedKey, cb);
344 | }
345 |
346 | var _clickButton = function(selector) {
347 | $(selector).trigger('click');
348 | return false;
349 | }
350 |
351 | // Add shortcuts for selectors
352 | var defaultShortcuts = function() {
353 | _addShortcut('ctrl+s', function(event,handler){
354 | _clickButton('.t-Button[onclick*="\'CREATE\'"],.t-Button#CREATE');
355 | });
356 | _addShortcut('ctrl+s', function(event,handler){
357 | _clickButton('.t-Button[onclick*="\'SAVE\'"],.t-Button#SAVE');
358 | });
359 | _addShortcut('ctrl+d', function(event,handler){
360 | _clickButton('.t-Button[onclick*="\'DELETE\'"],.t-Button#DELETE');
361 | });
362 | _addShortcut('ctrl+m', function(event,handler){
363 | message.info({
364 | title: "A key was pressed",
365 | text: "ctrl+m"
366 | });
367 | });
368 | };
369 |
370 | module.exports = {
371 | defaultShortcuts: defaultShortcuts
372 | }
373 |
374 | },{"keymaster":2,"modules/message":5}],5:[function(require,module,exports){
375 | var $ = (window.$); // being shimmed
376 | var PNotify = require("pnotify");
377 |
378 |
379 | // Button defaults
380 | var defaults = {
381 | hide: false,
382 | closer: true,
383 | buttons: {
384 | closer_hover: false,
385 | sticker: false,
386 | labels: {
387 | close: 'Sluit melding'
388 | }
389 | }
390 | };
391 |
392 |
393 | var getSettings = function(options) {
394 |
395 | switch (typeof options) {
396 | case "string":
397 | return $.extend({
398 | title: options
399 | }, defaults);
400 | case "object":
401 | return $.extend(options, defaults);
402 | default:
403 | return defaults;
404 | };
405 |
406 | };
407 |
408 | var info = function(options) {
409 | return new PNotify($.extend(getSettings(options), {
410 | type: 'info',
411 | hide: true
412 | }));
413 | };
414 |
415 | var success = function(options) {
416 | return new PNotify($.extend(getSettings(options), {
417 | type: 'success',
418 | hide: true
419 | }));
420 | };
421 |
422 | var warning = function(options) {
423 | return new PNotify($.extend(getSettings(options), {
424 | type: 'warning'
425 | }));
426 | };
427 |
428 | var error = function(options) {
429 | return new PNotify($.extend(getSettings(options), {
430 | type: 'error'
431 | }));
432 | };
433 |
434 | module.exports = {
435 | info: info,
436 | success: success,
437 | warning: warning,
438 | error: error
439 | };
440 |
441 | },{"pnotify":3}],6:[function(require,module,exports){
442 | $.widget("custom.customReport", {
443 | options: {
444 | exceptClass: 'no-row-link',
445 | activeClass: 'active',
446 | columns: [],
447 | rowclick: function(e, data) {
448 | $(this).customReport('openLink', e);
449 | }
450 | },
451 |
452 | _create: function() {
453 | var self = this;
454 | // Check if report may have a row link
455 | if (this._rowLinkAllowed) {
456 | this._initRowClick();
457 | }
458 |
459 | $(this.element).on('apexafterrefresh',function(e){
460 | self._apexafterrefresh();
461 | });
462 |
463 | },
464 |
465 | _apexafterrefresh: function() {
466 | // Check if report may have a row link
467 | if (this._rowLinkAllowed) {
468 | this._initRowClick();
469 | }
470 | },
471 |
472 | _initRowClick: function(cb) {
473 |
474 | var self = this;
475 | var data;
476 | cb = $.proxy(cb, self);
477 |
478 | // Remove previous handlers
479 | this._off(this.element, 'click tr td:not(:has(a))');
480 | this._off(this.element, 'hover tr td:not(:has(a))');
481 |
482 | // Add new handler
483 | this._on(this.element, {
484 | 'mouseenter tr td:not(:has(a))': function(e) {
485 | $(e.target).css('cursor', 'pointer');
486 | }
487 | });
488 |
489 | // Add new handler
490 | this._on(this.element, {
491 | 'click tr td:not(:has(a))': function(e) {
492 | self._trigger('rowclick', e, data);
493 | e.stopImmediatePropagation();
494 | }
495 | });
496 |
497 | },
498 |
499 | // Use an a href value to redirect on row click in report
500 | openLink: function(event, options) {
501 |
502 | var self = this;
503 |
504 | var defaults = {
505 | aPos: 0 // which "a" element contains the link
506 | }
507 |
508 | var settings = $.extend(options, defaults);
509 |
510 | // Get link
511 | var $linkElem = self._getLinkElement(settings, event.currentTarget);
512 | var href = $linkElem.attr('href');
513 |
514 | if (href != undefined) {
515 | window.location.href = href;
516 | }
517 | },
518 |
519 | _getLinkElement: function(options, target) {
520 |
521 | var links = $(target).closest('tr').find('td:has(a)');
522 |
523 | // Raise exception if position of a element is invalid
524 | if (links.length < options.aPos) {
525 | apex.debug.error('Exception: ', options.aPos + 'th "a" element is not found in report row.');
526 | } else {
527 | return $(links[options.aPos]).find('a');
528 | }
529 |
530 | },
531 |
532 | // _rowLinkAllowed returns boolean
533 | _rowLinkAllowed: function() {
534 | return !$(this.element).hasClass(this.options.exceptClass);
535 | },
536 |
537 | _setActiveRow: function($row) {
538 | $($row).closest('table').find('td.'+this.options.activeClass).removeClass(this.options.activeClass);
539 | $($row).find('td').addClass(this.options.activeClass);
540 | },
541 |
542 | activeRow: function() {
543 | return $(this.element).find('td.'+this.options.activeClass).closest('tr');
544 | }
545 |
546 | });
547 |
548 | },{}]},{},[1])
549 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJfc3RyZWFtXzAuanMiLCJub2RlX21vZHVsZXMva2V5bWFzdGVyL2tleW1hc3Rlci5qcyIsIm5vZGVfbW9kdWxlcy9wbm90aWZ5L2Rpc3QvcG5vdGlmeS5qcyIsInNyYy9qcy9tb2R1bGVzL2tleWJvYXJkU2hvcnRjdXRzLmpzIiwic3JjL2pzL21vZHVsZXMvbWVzc2FnZS5qcyIsInNyYy9qcy93aWRnZXRzL2N1c3RvbVJlcG9ydC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsInZhciBrc2NvcGUgPSB7fTt3aW5kb3cua3Njb3BlID0ga3Njb3BlO2tzY29wZS5tZXNzYWdlID0gcmVxdWlyZSgnbW9kdWxlcy9tZXNzYWdlJyk7a3Njb3BlLmtleWJvYXJkU2hvcnRjdXRzID0gcmVxdWlyZSgnbW9kdWxlcy9rZXlib2FyZFNob3J0Y3V0cycpO3JlcXVpcmUoJ3dpZGdldHMvY3VzdG9tUmVwb3J0Jyk7IiwiLy8gICAgIGtleW1hc3Rlci5qc1xuLy8gICAgIChjKSAyMDExLTIwMTMgVGhvbWFzIEZ1Y2hzXG4vLyAgICAga2V5bWFzdGVyLmpzIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuXG47KGZ1bmN0aW9uKGdsb2JhbCl7XG4gIHZhciBrLFxuICAgIF9oYW5kbGVycyA9IHt9LFxuICAgIF9tb2RzID0geyAxNjogZmFsc2UsIDE4OiBmYWxzZSwgMTc6IGZhbHNlLCA5MTogZmFsc2UgfSxcbiAgICBfc2NvcGUgPSAnYWxsJyxcbiAgICAvLyBtb2RpZmllciBrZXlzXG4gICAgX01PRElGSUVSUyA9IHtcbiAgICAgICfih6cnOiAxNiwgc2hpZnQ6IDE2LFxuICAgICAgJ+KMpSc6IDE4LCBhbHQ6IDE4LCBvcHRpb246IDE4LFxuICAgICAgJ+KMgyc6IDE3LCBjdHJsOiAxNywgY29udHJvbDogMTcsXG4gICAgICAn4oyYJzogOTEsIGNvbW1hbmQ6IDkxXG4gICAgfSxcbiAgICAvLyBzcGVjaWFsIGtleXNcbiAgICBfTUFQID0ge1xuICAgICAgYmFja3NwYWNlOiA4LCB0YWI6IDksIGNsZWFyOiAxMixcbiAgICAgIGVudGVyOiAxMywgJ3JldHVybic6IDEzLFxuICAgICAgZXNjOiAyNywgZXNjYXBlOiAyNywgc3BhY2U6IDMyLFxuICAgICAgbGVmdDogMzcsIHVwOiAzOCxcbiAgICAgIHJpZ2h0OiAzOSwgZG93bjogNDAsXG4gICAgICBkZWw6IDQ2LCAnZGVsZXRlJzogNDYsXG4gICAgICBob21lOiAzNiwgZW5kOiAzNSxcbiAgICAgIHBhZ2V1cDogMzMsIHBhZ2Vkb3duOiAzNCxcbiAgICAgICcsJzogMTg4LCAnLic6IDE5MCwgJy8nOiAxOTEsXG4gICAgICAnYCc6IDE5MiwgJy0nOiAxODksICc9JzogMTg3LFxuICAgICAgJzsnOiAxODYsICdcXCcnOiAyMjIsXG4gICAgICAnWyc6IDIxOSwgJ10nOiAyMjEsICdcXFxcJzogMjIwXG4gICAgfSxcbiAgICBjb2RlID0gZnVuY3Rpb24oeCl7XG4gICAgICByZXR1cm4gX01BUFt4XSB8fCB4LnRvVXBwZXJDYXNlKCkuY2hhckNvZGVBdCgwKTtcbiAgICB9LFxuICAgIF9kb3duS2V5cyA9IFtdO1xuXG4gIGZvcihrPTE7azwyMDtrKyspIF9NQVBbJ2YnK2tdID0gMTExK2s7XG5cbiAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IEFycmF5I2luZGV4T2YsIHNvIGhhdmUgYSBzaW1wbGUgcmVwbGFjZW1lbnRcbiAgZnVuY3Rpb24gaW5kZXgoYXJyYXksIGl0ZW0pe1xuICAgIHZhciBpID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlKGktLSkgaWYoYXJyYXlbaV09PT1pdGVtKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBmb3IgY29tcGFyaW5nIG1vZHMgYmVmb3JlIHVuYXNzaWdubWVudFxuICBmdW5jdGlvbiBjb21wYXJlQXJyYXkoYTEsIGEyKSB7XG4gICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhMVtpXSAhPT0gYTJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbW9kaWZpZXJNYXAgPSB7XG4gICAgICAxNjonc2hpZnRLZXknLFxuICAgICAgMTg6J2FsdEtleScsXG4gICAgICAxNzonY3RybEtleScsXG4gICAgICA5MTonbWV0YUtleSdcbiAgfTtcbiAgZnVuY3Rpb24gdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpIHtcbiAgICAgIGZvcihrIGluIF9tb2RzKSBfbW9kc1trXSA9IGV2ZW50W21vZGlmaWVyTWFwW2tdXTtcbiAgfTtcblxuICAvLyBoYW5kbGUga2V5ZG93biBldmVudFxuICBmdW5jdGlvbiBkaXNwYXRjaChldmVudCkge1xuICAgIHZhciBrZXksIGhhbmRsZXIsIGssIGksIG1vZGlmaWVyc01hdGNoLCBzY29wZTtcbiAgICBrZXkgPSBldmVudC5rZXlDb2RlO1xuXG4gICAgaWYgKGluZGV4KF9kb3duS2V5cywga2V5KSA9PSAtMSkge1xuICAgICAgICBfZG93bktleXMucHVzaChrZXkpO1xuICAgIH1cblxuICAgIC8vIGlmIGEgbW9kaWZpZXIga2V5LCBzZXQgdGhlIGtleS48bW9kaWZpZXJrZXluYW1lPiBwcm9wZXJ0eSB0byB0cnVlIGFuZCByZXR1cm5cbiAgICBpZihrZXkgPT0gOTMgfHwga2V5ID09IDIyNCkga2V5ID0gOTE7IC8vIHJpZ2h0IGNvbW1hbmQgb24gd2Via2l0LCBjb21tYW5kIG9uIEdlY2tvXG4gICAgaWYoa2V5IGluIF9tb2RzKSB7XG4gICAgICBfbW9kc1trZXldID0gdHJ1ZTtcbiAgICAgIC8vICdhc3NpZ25LZXknIGZyb20gaW5zaWRlIHRoaXMgY2xvc3VyZSBpcyBleHBvcnRlZCB0byB3aW5kb3cua2V5XG4gICAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBpZihfTU9ESUZJRVJTW2tdID09IGtleSkgYXNzaWduS2V5W2tdID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpO1xuXG4gICAgLy8gc2VlIGlmIHdlIG5lZWQgdG8gaWdub3JlIHRoZSBrZXlwcmVzcyAoZmlsdGVyKCkgY2FuIGNhbiBiZSBvdmVycmlkZGVuKVxuICAgIC8vIGJ5IGRlZmF1bHQgaWdub3JlIGtleSBwcmVzc2VzIGlmIGEgc2VsZWN0LCB0ZXh0YXJlYSwgb3IgaW5wdXQgaXMgZm9jdXNlZFxuICAgIGlmKCFhc3NpZ25LZXkuZmlsdGVyLmNhbGwodGhpcywgZXZlbnQpKSByZXR1cm47XG5cbiAgICAvLyBhYm9ydCBpZiBubyBwb3RlbnRpYWxseSBtYXRjaGluZyBzaG9ydGN1dHMgZm91bmRcbiAgICBpZiAoIShrZXkgaW4gX2hhbmRsZXJzKSkgcmV0dXJuO1xuXG4gICAgc2NvcGUgPSBnZXRTY29wZSgpO1xuXG4gICAgLy8gZm9yIGVhY2ggcG90ZW50aWFsIHNob3J0Y3V0XG4gICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoYW5kbGVyID0gX2hhbmRsZXJzW2tleV1baV07XG5cbiAgICAgIC8vIHNlZSBpZiBpdCdzIGluIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICBpZihoYW5kbGVyLnNjb3BlID09IHNjb3BlIHx8IGhhbmRsZXIuc2NvcGUgPT0gJ2FsbCcpe1xuICAgICAgICAvLyBjaGVjayBpZiBtb2RpZmllcnMgbWF0Y2ggaWYgYW55XG4gICAgICAgIG1vZGlmaWVyc01hdGNoID0gaGFuZGxlci5tb2RzLmxlbmd0aCA+IDA7XG4gICAgICAgIGZvcihrIGluIF9tb2RzKVxuICAgICAgICAgIGlmKCghX21vZHNba10gJiYgaW5kZXgoaGFuZGxlci5tb2RzLCAraykgPiAtMSkgfHxcbiAgICAgICAgICAgIChfbW9kc1trXSAmJiBpbmRleChoYW5kbGVyLm1vZHMsICtrKSA9PSAtMSkpIG1vZGlmaWVyc01hdGNoID0gZmFsc2U7XG4gICAgICAgIC8vIGNhbGwgdGhlIGhhbmRsZXIgYW5kIHN0b3AgdGhlIGV2ZW50IGlmIG5lY2Nlc3NhcnlcbiAgICAgICAgaWYoKGhhbmRsZXIubW9kcy5sZW5ndGggPT0gMCAmJiAhX21vZHNbMTZdICYmICFfbW9kc1sxOF0gJiYgIV9tb2RzWzE3XSAmJiAhX21vZHNbOTFdKSB8fCBtb2RpZmllcnNNYXRjaCl7XG4gICAgICAgICAgaWYoaGFuZGxlci5tZXRob2QoZXZlbnQsIGhhbmRsZXIpPT09ZmFsc2Upe1xuICAgICAgICAgICAgaWYoZXZlbnQucHJldmVudERlZmF1bHQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGVsc2UgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZihldmVudC5jYW5jZWxCdWJibGUpIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuc2V0IG1vZGlmaWVyIGtleXMgb24ga2V5dXBcbiAgZnVuY3Rpb24gY2xlYXJNb2RpZmllcihldmVudCl7XG4gICAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGUsIGssXG4gICAgICAgIGkgPSBpbmRleChfZG93bktleXMsIGtleSk7XG5cbiAgICAvLyByZW1vdmUga2V5IGZyb20gX2Rvd25LZXlzXG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBfZG93bktleXMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIGlmKGtleSA9PSA5MyB8fCBrZXkgPT0gMjI0KSBrZXkgPSA5MTtcbiAgICBpZihrZXkgaW4gX21vZHMpIHtcbiAgICAgIF9tb2RzW2tleV0gPSBmYWxzZTtcbiAgICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGlmKF9NT0RJRklFUlNba10gPT0ga2V5KSBhc3NpZ25LZXlba10gPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVzZXRNb2RpZmllcnMoKSB7XG4gICAgZm9yKGsgaW4gX21vZHMpIF9tb2RzW2tdID0gZmFsc2U7XG4gICAgZm9yKGsgaW4gX01PRElGSUVSUykgYXNzaWduS2V5W2tdID0gZmFsc2U7XG4gIH07XG5cbiAgLy8gcGFyc2UgYW5kIGFzc2lnbiBzaG9ydGN1dFxuICBmdW5jdGlvbiBhc3NpZ25LZXkoa2V5LCBzY29wZSwgbWV0aG9kKXtcbiAgICB2YXIga2V5cywgbW9kcztcbiAgICBrZXlzID0gZ2V0S2V5cyhrZXkpO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0aG9kID0gc2NvcGU7XG4gICAgICBzY29wZSA9ICdhbGwnO1xuICAgIH1cblxuICAgIC8vIGZvciBlYWNoIHNob3J0Y3V0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBzZXQgbW9kaWZpZXIga2V5cyBpZiBhbnlcbiAgICAgIG1vZHMgPSBbXTtcbiAgICAgIGtleSA9IGtleXNbaV0uc3BsaXQoJysnKTtcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMSl7XG4gICAgICAgIG1vZHMgPSBnZXRNb2RzKGtleSk7XG4gICAgICAgIGtleSA9IFtrZXlba2V5Lmxlbmd0aC0xXV07XG4gICAgICB9XG4gICAgICAvLyBjb252ZXJ0IHRvIGtleWNvZGUgYW5kLi4uXG4gICAgICBrZXkgPSBrZXlbMF1cbiAgICAgIGtleSA9IGNvZGUoa2V5KTtcbiAgICAgIC8vIC4uLnN0b3JlIGhhbmRsZXJcbiAgICAgIGlmICghKGtleSBpbiBfaGFuZGxlcnMpKSBfaGFuZGxlcnNba2V5XSA9IFtdO1xuICAgICAgX2hhbmRsZXJzW2tleV0ucHVzaCh7IHNob3J0Y3V0OiBrZXlzW2ldLCBzY29wZTogc2NvcGUsIG1ldGhvZDogbWV0aG9kLCBrZXk6IGtleXNbaV0sIG1vZHM6IG1vZHMgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuYmluZCBhbGwgaGFuZGxlcnMgZm9yIGdpdmVuIGtleSBpbiBjdXJyZW50IHNjb3BlXG4gIGZ1bmN0aW9uIHVuYmluZEtleShrZXksIHNjb3BlKSB7XG4gICAgdmFyIG11bHRpcGxlS2V5cywga2V5cyxcbiAgICAgIG1vZHMgPSBbXSxcbiAgICAgIGksIGosIG9iajtcblxuICAgIG11bHRpcGxlS2V5cyA9IGdldEtleXMoa2V5KTtcblxuICAgIGZvciAoaiA9IDA7IGogPCBtdWx0aXBsZUtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGtleXMgPSBtdWx0aXBsZUtleXNbal0uc3BsaXQoJysnKTtcblxuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgICAgICBtb2RzID0gZ2V0TW9kcyhrZXlzKTtcbiAgICAgICAga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBjb2RlKGtleSk7XG5cbiAgICAgIGlmIChzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjb3BlID0gZ2V0U2NvcGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICghX2hhbmRsZXJzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9iaiA9IF9oYW5kbGVyc1trZXldW2ldO1xuICAgICAgICAvLyBvbmx5IGNsZWFyIGhhbmRsZXJzIGlmIGNvcnJlY3Qgc2NvcGUgYW5kIG1vZHMgbWF0Y2hcbiAgICAgICAgaWYgKG9iai5zY29wZSA9PT0gc2NvcGUgJiYgY29tcGFyZUFycmF5KG9iai5tb2RzLCBtb2RzKSkge1xuICAgICAgICAgIF9oYW5kbGVyc1trZXldW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgd2l0aCBjb2RlICdrZXlDb2RlJyBpcyBjdXJyZW50bHkgZG93blxuICAvLyBDb252ZXJ0cyBzdHJpbmdzIGludG8ga2V5IGNvZGVzLlxuICBmdW5jdGlvbiBpc1ByZXNzZWQoa2V5Q29kZSkge1xuICAgICAgaWYgKHR5cGVvZihrZXlDb2RlKT09J3N0cmluZycpIHtcbiAgICAgICAga2V5Q29kZSA9IGNvZGUoa2V5Q29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXgoX2Rvd25LZXlzLCBrZXlDb2RlKSAhPSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZXNzZWRLZXlDb2RlcygpIHtcbiAgICAgIHJldHVybiBfZG93bktleXMuc2xpY2UoMCk7XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXIoZXZlbnQpe1xuICAgIHZhciB0YWdOYW1lID0gKGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50KS50YWdOYW1lO1xuICAgIC8vIGlnbm9yZSBrZXlwcmVzc2VkIGluIGFueSBlbGVtZW50cyB0aGF0IHN1cHBvcnQga2V5Ym9hcmQgZGF0YSBpbnB1dFxuICAgIHJldHVybiAhKHRhZ05hbWUgPT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09ICdTRUxFQ1QnIHx8IHRhZ05hbWUgPT0gJ1RFWFRBUkVBJyk7XG4gIH1cblxuICAvLyBpbml0aWFsaXplIGtleS48bW9kaWZpZXI+IHRvIGZhbHNlXG4gIGZvcihrIGluIF9NT0RJRklFUlMpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuXG4gIC8vIHNldCBjdXJyZW50IHNjb3BlIChkZWZhdWx0ICdhbGwnKVxuICBmdW5jdGlvbiBzZXRTY29wZShzY29wZSl7IF9zY29wZSA9IHNjb3BlIHx8ICdhbGwnIH07XG4gIGZ1bmN0aW9uIGdldFNjb3BlKCl7IHJldHVybiBfc2NvcGUgfHwgJ2FsbCcgfTtcblxuICAvLyBkZWxldGUgYWxsIGhhbmRsZXJzIGZvciBhIGdpdmVuIHNjb3BlXG4gIGZ1bmN0aW9uIGRlbGV0ZVNjb3BlKHNjb3BlKXtcbiAgICB2YXIga2V5LCBoYW5kbGVycywgaTtcblxuICAgIGZvciAoa2V5IGluIF9oYW5kbGVycykge1xuICAgICAgaGFuZGxlcnMgPSBfaGFuZGxlcnNba2V5XTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7ICkge1xuICAgICAgICBpZiAoaGFuZGxlcnNbaV0uc2NvcGUgPT09IHNjb3BlKSBoYW5kbGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGVsc2UgaSsrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBhYnN0cmFjdCBrZXkgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0S2V5cyhrZXkpIHtcbiAgICB2YXIga2V5cztcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBrZXlzID0ga2V5LnNwbGl0KCcsJyk7XG4gICAgaWYgKChrZXlzW2tleXMubGVuZ3RoIC0gMV0pID09ICcnKSB7XG4gICAgICBrZXlzW2tleXMubGVuZ3RoIC0gMl0gKz0gJywnO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIC8vIGFic3RyYWN0IG1vZHMgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0TW9kcyhrZXkpIHtcbiAgICB2YXIgbW9kcyA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gMSk7XG4gICAgZm9yICh2YXIgbWkgPSAwOyBtaSA8IG1vZHMubGVuZ3RoOyBtaSsrKVxuICAgIG1vZHNbbWldID0gX01PRElGSUVSU1ttb2RzW21pXV07XG4gICAgcmV0dXJuIG1vZHM7XG4gIH1cblxuICAvLyBjcm9zcy1icm93c2VyIGV2ZW50c1xuICBmdW5jdGlvbiBhZGRFdmVudChvYmplY3QsIGV2ZW50LCBtZXRob2QpIHtcbiAgICBpZiAob2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICBvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbWV0aG9kLCBmYWxzZSk7XG4gICAgZWxzZSBpZihvYmplY3QuYXR0YWNoRXZlbnQpXG4gICAgICBvYmplY3QuYXR0YWNoRXZlbnQoJ29uJytldmVudCwgZnVuY3Rpb24oKXsgbWV0aG9kKHdpbmRvdy5ldmVudCkgfSk7XG4gIH07XG5cbiAgLy8gc2V0IHRoZSBoYW5kbGVycyBnbG9iYWxseSBvbiBkb2N1bWVudFxuICBhZGRFdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkgeyBkaXNwYXRjaChldmVudCkgfSk7IC8vIFBhc3NpbmcgX3Njb3BlIHRvIGEgY2FsbGJhY2sgdG8gZW5zdXJlIGl0IHJlbWFpbnMgdGhlIHNhbWUgYnkgZXhlY3V0aW9uLiBGaXhlcyAjNDhcbiAgYWRkRXZlbnQoZG9jdW1lbnQsICdrZXl1cCcsIGNsZWFyTW9kaWZpZXIpO1xuXG4gIC8vIHJlc2V0IG1vZGlmaWVycyB0byBmYWxzZSB3aGVuZXZlciB0aGUgd2luZG93IGlzIChyZSlmb2N1c2VkLlxuICBhZGRFdmVudCh3aW5kb3csICdmb2N1cycsIHJlc2V0TW9kaWZpZXJzKTtcblxuICAvLyBzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5XG4gIHZhciBwcmV2aW91c0tleSA9IGdsb2JhbC5rZXk7XG5cbiAgLy8gcmVzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5IGFuZCByZXR1cm4gcmVmZXJlbmNlIHRvIG91ciBrZXkgb2JqZWN0XG4gIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgdmFyIGsgPSBnbG9iYWwua2V5O1xuICAgIGdsb2JhbC5rZXkgPSBwcmV2aW91c0tleTtcbiAgICByZXR1cm4gaztcbiAgfVxuXG4gIC8vIHNldCB3aW5kb3cua2V5IGFuZCB3aW5kb3cua2V5LnNldC9nZXQvZGVsZXRlU2NvcGUsIGFuZCB0aGUgZGVmYXVsdCBmaWx0ZXJcbiAgZ2xvYmFsLmtleSA9IGFzc2lnbktleTtcbiAgZ2xvYmFsLmtleS5zZXRTY29wZSA9IHNldFNjb3BlO1xuICBnbG9iYWwua2V5LmdldFNjb3BlID0gZ2V0U2NvcGU7XG4gIGdsb2JhbC5rZXkuZGVsZXRlU2NvcGUgPSBkZWxldGVTY29wZTtcbiAgZ2xvYmFsLmtleS5maWx0ZXIgPSBmaWx0ZXI7XG4gIGdsb2JhbC5rZXkuaXNQcmVzc2VkID0gaXNQcmVzc2VkO1xuICBnbG9iYWwua2V5LmdldFByZXNzZWRLZXlDb2RlcyA9IGdldFByZXNzZWRLZXlDb2RlcztcbiAgZ2xvYmFsLmtleS5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgZ2xvYmFsLmtleS51bmJpbmQgPSB1bmJpbmRLZXk7XG5cbiAgaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIG1vZHVsZS5leHBvcnRzID0gYXNzaWduS2V5O1xuXG59KSh0aGlzKTtcbiIsIi8qXG5QTm90aWZ5IDMuMC4wIHNjaWFjdGl2ZS5jb20vcG5vdGlmeS9cbihDKSAyMDE1IEh1bnRlciBQZXJyaW47IEdvb2dsZSwgSW5jLlxubGljZW5zZSBBcGFjaGUtMi4wXG4qL1xuKGZ1bmN0aW9uKGIsayl7XCJmdW5jdGlvblwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJwbm90aWZ5XCIsW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKHEpe3JldHVybiBrKHEsYil9KTpcIm9iamVjdFwiPT09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWsoKHdpbmRvdy4kKSxnbG9iYWx8fGIpOmIuUE5vdGlmeT1rKGIualF1ZXJ5LGIpfSkodGhpcyxmdW5jdGlvbihiLGspe3ZhciBxPWZ1bmN0aW9uKGwpe3ZhciBrPXtkaXIxOlwiZG93blwiLGRpcjI6XCJsZWZ0XCIscHVzaDpcImJvdHRvbVwiLHNwYWNpbmcxOjM2LHNwYWNpbmcyOjM2LGNvbnRleHQ6YihcImJvZHlcIiksbW9kYWw6ITF9LGcsaCxuPWIobCkscj1mdW5jdGlvbigpe2g9YihcImJvZHlcIik7ZC5wcm90b3R5cGUub3B0aW9ucy5zdGFjay5jb250ZXh0PWg7bj1iKGwpO24uYmluZChcInJlc2l6ZVwiLGZ1bmN0aW9uKCl7ZyYmY2xlYXJUaW1lb3V0KGcpO2c9c2V0VGltZW91dChmdW5jdGlvbigpe2QucG9zaXRpb25BbGwoITApfSxcbjEwKX0pfSxzPWZ1bmN0aW9uKGMpe3ZhciBhPWIoXCI8ZGl2IC8+XCIse1wiY2xhc3NcIjpcInVpLXBub3RpZnktbW9kYWwtb3ZlcmxheVwifSk7YS5wcmVwZW5kVG8oYy5jb250ZXh0KTtjLm92ZXJsYXlfY2xvc2UmJmEuY2xpY2soZnVuY3Rpb24oKXtkLnJlbW92ZVN0YWNrKGMpfSk7cmV0dXJuIGF9LGQ9ZnVuY3Rpb24oYyl7dGhpcy5wYXJzZU9wdGlvbnMoYyk7dGhpcy5pbml0KCl9O2IuZXh0ZW5kKGQucHJvdG90eXBlLHt2ZXJzaW9uOlwiMy4wLjBcIixvcHRpb25zOnt0aXRsZTohMSx0aXRsZV9lc2NhcGU6ITEsdGV4dDohMSx0ZXh0X2VzY2FwZTohMSxzdHlsaW5nOlwiYnJpZ2h0dGhlbWVcIixhZGRjbGFzczpcIlwiLGNvcm5lcmNsYXNzOlwiXCIsYXV0b19kaXNwbGF5OiEwLHdpZHRoOlwiMzAwcHhcIixtaW5faGVpZ2h0OlwiMTZweFwiLHR5cGU6XCJub3RpY2VcIixpY29uOiEwLGFuaW1hdGlvbjpcImZhZGVcIixhbmltYXRlX3NwZWVkOlwibm9ybWFsXCIsc2hhZG93OiEwLGhpZGU6ITAsZGVsYXk6OEUzLG1vdXNlX3Jlc2V0OiEwLFxucmVtb3ZlOiEwLGluc2VydF9icnM6ITAsZGVzdHJveTohMCxzdGFjazprfSxtb2R1bGVzOnt9LHJ1bk1vZHVsZXM6ZnVuY3Rpb24oYyxhKXt2YXIgcCxiO2ZvcihiIGluIHRoaXMubW9kdWxlcylwPVwib2JqZWN0XCI9PT10eXBlb2YgYSYmYiBpbiBhP2FbYl06YSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgdGhpcy5tb2R1bGVzW2JdW2NdJiYodGhpcy5tb2R1bGVzW2JdLm5vdGljZT10aGlzLHRoaXMubW9kdWxlc1tiXS5vcHRpb25zPVwib2JqZWN0XCI9PT10eXBlb2YgdGhpcy5vcHRpb25zW2JdP3RoaXMub3B0aW9uc1tiXTp7fSx0aGlzLm1vZHVsZXNbYl1bY10odGhpcyxcIm9iamVjdFwiPT09dHlwZW9mIHRoaXMub3B0aW9uc1tiXT90aGlzLm9wdGlvbnNbYl06e30scCkpfSxzdGF0ZTpcImluaXRpYWxpemluZ1wiLHRpbWVyOm51bGwsYW5pbVRpbWVyOm51bGwsc3R5bGVzOm51bGwsZWxlbTpudWxsLGNvbnRhaW5lcjpudWxsLHRpdGxlX2NvbnRhaW5lcjpudWxsLHRleHRfY29udGFpbmVyOm51bGwsYW5pbWF0aW5nOiExLFxudGltZXJIaWRlOiExLGluaXQ6ZnVuY3Rpb24oKXt2YXIgYz10aGlzO3RoaXMubW9kdWxlcz17fTtiLmV4dGVuZCghMCx0aGlzLm1vZHVsZXMsZC5wcm90b3R5cGUubW9kdWxlcyk7dGhpcy5zdHlsZXM9XCJvYmplY3RcIj09PXR5cGVvZiB0aGlzLm9wdGlvbnMuc3R5bGluZz90aGlzLm9wdGlvbnMuc3R5bGluZzpkLnN0eWxpbmdbdGhpcy5vcHRpb25zLnN0eWxpbmddO3RoaXMuZWxlbT1iKFwiPGRpdiAvPlwiLHtcImNsYXNzXCI6XCJ1aS1wbm90aWZ5IFwiK3RoaXMub3B0aW9ucy5hZGRjbGFzcyxjc3M6e2Rpc3BsYXk6XCJub25lXCJ9LFwiYXJpYS1saXZlXCI6XCJhc3NlcnRpdmVcIixcImFyaWEtcm9sZVwiOlwiYWxlcnRkaWFsb2dcIixtb3VzZWVudGVyOmZ1bmN0aW9uKGEpe2lmKGMub3B0aW9ucy5tb3VzZV9yZXNldCYmXCJvdXRcIj09PWMuYW5pbWF0aW5nKXtpZighYy50aW1lckhpZGUpcmV0dXJuO2MuY2FuY2VsUmVtb3ZlKCl9Yy5vcHRpb25zLmhpZGUmJmMub3B0aW9ucy5tb3VzZV9yZXNldCYmYy5jYW5jZWxSZW1vdmUoKX0sXG5tb3VzZWxlYXZlOmZ1bmN0aW9uKGEpe2Mub3B0aW9ucy5oaWRlJiZjLm9wdGlvbnMubW91c2VfcmVzZXQmJlwib3V0XCIhPT1jLmFuaW1hdGluZyYmYy5xdWV1ZVJlbW92ZSgpO2QucG9zaXRpb25BbGwoKX19KTtcImZhZGVcIj09PXRoaXMub3B0aW9ucy5hbmltYXRpb24mJnRoaXMuZWxlbS5hZGRDbGFzcyhcInVpLXBub3RpZnktZmFkZS1cIit0aGlzLm9wdGlvbnMuYW5pbWF0ZV9zcGVlZCk7dGhpcy5jb250YWluZXI9YihcIjxkaXYgLz5cIix7XCJjbGFzc1wiOnRoaXMuc3R5bGVzLmNvbnRhaW5lcitcIiB1aS1wbm90aWZ5LWNvbnRhaW5lciBcIisoXCJlcnJvclwiPT09dGhpcy5vcHRpb25zLnR5cGU/dGhpcy5zdHlsZXMuZXJyb3I6XCJpbmZvXCI9PT10aGlzLm9wdGlvbnMudHlwZT90aGlzLnN0eWxlcy5pbmZvOlwic3VjY2Vzc1wiPT09dGhpcy5vcHRpb25zLnR5cGU/dGhpcy5zdHlsZXMuc3VjY2Vzczp0aGlzLnN0eWxlcy5ub3RpY2UpLHJvbGU6XCJhbGVydFwifSkuYXBwZW5kVG8odGhpcy5lbGVtKTtcIlwiIT09XG50aGlzLm9wdGlvbnMuY29ybmVyY2xhc3MmJnRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwidWktY29ybmVyLWFsbFwiKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuY29ybmVyY2xhc3MpO3RoaXMub3B0aW9ucy5zaGFkb3cmJnRoaXMuY29udGFpbmVyLmFkZENsYXNzKFwidWktcG5vdGlmeS1zaGFkb3dcIik7ITEhPT10aGlzLm9wdGlvbnMuaWNvbiYmYihcIjxkaXYgLz5cIix7XCJjbGFzc1wiOlwidWktcG5vdGlmeS1pY29uXCJ9KS5hcHBlbmQoYihcIjxzcGFuIC8+XCIse1wiY2xhc3NcIjohMD09PXRoaXMub3B0aW9ucy5pY29uP1wiZXJyb3JcIj09PXRoaXMub3B0aW9ucy50eXBlP3RoaXMuc3R5bGVzLmVycm9yX2ljb246XCJpbmZvXCI9PT10aGlzLm9wdGlvbnMudHlwZT90aGlzLnN0eWxlcy5pbmZvX2ljb246XCJzdWNjZXNzXCI9PT10aGlzLm9wdGlvbnMudHlwZT90aGlzLnN0eWxlcy5zdWNjZXNzX2ljb246dGhpcy5zdHlsZXMubm90aWNlX2ljb246dGhpcy5vcHRpb25zLmljb259KSkucHJlcGVuZFRvKHRoaXMuY29udGFpbmVyKTtcbnRoaXMudGl0bGVfY29udGFpbmVyPWIoXCI8aDQgLz5cIix7XCJjbGFzc1wiOlwidWktcG5vdGlmeS10aXRsZVwifSkuYXBwZW5kVG8odGhpcy5jb250YWluZXIpOyExPT09dGhpcy5vcHRpb25zLnRpdGxlP3RoaXMudGl0bGVfY29udGFpbmVyLmhpZGUoKTp0aGlzLm9wdGlvbnMudGl0bGVfZXNjYXBlP3RoaXMudGl0bGVfY29udGFpbmVyLnRleHQodGhpcy5vcHRpb25zLnRpdGxlKTp0aGlzLnRpdGxlX2NvbnRhaW5lci5odG1sKHRoaXMub3B0aW9ucy50aXRsZSk7dGhpcy50ZXh0X2NvbnRhaW5lcj1iKFwiPGRpdiAvPlwiLHtcImNsYXNzXCI6XCJ1aS1wbm90aWZ5LXRleHRcIixcImFyaWEtcm9sZVwiOlwiYWxlcnRcIn0pLmFwcGVuZFRvKHRoaXMuY29udGFpbmVyKTshMT09PXRoaXMub3B0aW9ucy50ZXh0P3RoaXMudGV4dF9jb250YWluZXIuaGlkZSgpOnRoaXMub3B0aW9ucy50ZXh0X2VzY2FwZT90aGlzLnRleHRfY29udGFpbmVyLnRleHQodGhpcy5vcHRpb25zLnRleHQpOnRoaXMudGV4dF9jb250YWluZXIuaHRtbCh0aGlzLm9wdGlvbnMuaW5zZXJ0X2Jycz9cblN0cmluZyh0aGlzLm9wdGlvbnMudGV4dCkucmVwbGFjZSgvXFxuL2csXCI8YnIgLz5cIik6dGhpcy5vcHRpb25zLnRleHQpO1wic3RyaW5nXCI9PT10eXBlb2YgdGhpcy5vcHRpb25zLndpZHRoJiZ0aGlzLmVsZW0uY3NzKFwid2lkdGhcIix0aGlzLm9wdGlvbnMud2lkdGgpO1wic3RyaW5nXCI9PT10eXBlb2YgdGhpcy5vcHRpb25zLm1pbl9oZWlnaHQmJnRoaXMuY29udGFpbmVyLmNzcyhcIm1pbi1oZWlnaHRcIix0aGlzLm9wdGlvbnMubWluX2hlaWdodCk7ZC5ub3RpY2VzPVwidG9wXCI9PT10aGlzLm9wdGlvbnMuc3RhY2sucHVzaD9iLm1lcmdlKFt0aGlzXSxkLm5vdGljZXMpOmIubWVyZ2UoZC5ub3RpY2VzLFt0aGlzXSk7XCJ0b3BcIj09PXRoaXMub3B0aW9ucy5zdGFjay5wdXNoJiZ0aGlzLnF1ZXVlUG9zaXRpb24oITEsMSk7dGhpcy5vcHRpb25zLnN0YWNrLmFuaW1hdGlvbj0hMTt0aGlzLnJ1bk1vZHVsZXMoXCJpbml0XCIpO3RoaXMub3B0aW9ucy5hdXRvX2Rpc3BsYXkmJnRoaXMub3BlbigpO3JldHVybiB0aGlzfSxcbnVwZGF0ZTpmdW5jdGlvbihjKXt2YXIgYT10aGlzLm9wdGlvbnM7dGhpcy5wYXJzZU9wdGlvbnMoYSxjKTt0aGlzLmVsZW0ucmVtb3ZlQ2xhc3MoXCJ1aS1wbm90aWZ5LWZhZGUtc2xvdyB1aS1wbm90aWZ5LWZhZGUtbm9ybWFsIHVpLXBub3RpZnktZmFkZS1mYXN0XCIpO1wiZmFkZVwiPT09dGhpcy5vcHRpb25zLmFuaW1hdGlvbiYmdGhpcy5lbGVtLmFkZENsYXNzKFwidWktcG5vdGlmeS1mYWRlLVwiK3RoaXMub3B0aW9ucy5hbmltYXRlX3NwZWVkKTt0aGlzLm9wdGlvbnMuY29ybmVyY2xhc3MhPT1hLmNvcm5lcmNsYXNzJiZ0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInVpLWNvcm5lci1hbGwgXCIrYS5jb3JuZXJjbGFzcykuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmNvcm5lcmNsYXNzKTt0aGlzLm9wdGlvbnMuc2hhZG93IT09YS5zaGFkb3cmJih0aGlzLm9wdGlvbnMuc2hhZG93P3RoaXMuY29udGFpbmVyLmFkZENsYXNzKFwidWktcG5vdGlmeS1zaGFkb3dcIik6dGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJ1aS1wbm90aWZ5LXNoYWRvd1wiKSk7XG4hMT09PXRoaXMub3B0aW9ucy5hZGRjbGFzcz90aGlzLmVsZW0ucmVtb3ZlQ2xhc3MoYS5hZGRjbGFzcyk6dGhpcy5vcHRpb25zLmFkZGNsYXNzIT09YS5hZGRjbGFzcyYmdGhpcy5lbGVtLnJlbW92ZUNsYXNzKGEuYWRkY2xhc3MpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5hZGRjbGFzcyk7ITE9PT10aGlzLm9wdGlvbnMudGl0bGU/dGhpcy50aXRsZV9jb250YWluZXIuc2xpZGVVcChcImZhc3RcIik6dGhpcy5vcHRpb25zLnRpdGxlIT09YS50aXRsZSYmKHRoaXMub3B0aW9ucy50aXRsZV9lc2NhcGU/dGhpcy50aXRsZV9jb250YWluZXIudGV4dCh0aGlzLm9wdGlvbnMudGl0bGUpOnRoaXMudGl0bGVfY29udGFpbmVyLmh0bWwodGhpcy5vcHRpb25zLnRpdGxlKSwhMT09PWEudGl0bGUmJnRoaXMudGl0bGVfY29udGFpbmVyLnNsaWRlRG93bigyMDApKTshMT09PXRoaXMub3B0aW9ucy50ZXh0P3RoaXMudGV4dF9jb250YWluZXIuc2xpZGVVcChcImZhc3RcIik6dGhpcy5vcHRpb25zLnRleHQhPT1cbmEudGV4dCYmKHRoaXMub3B0aW9ucy50ZXh0X2VzY2FwZT90aGlzLnRleHRfY29udGFpbmVyLnRleHQodGhpcy5vcHRpb25zLnRleHQpOnRoaXMudGV4dF9jb250YWluZXIuaHRtbCh0aGlzLm9wdGlvbnMuaW5zZXJ0X2Jycz9TdHJpbmcodGhpcy5vcHRpb25zLnRleHQpLnJlcGxhY2UoL1xcbi9nLFwiPGJyIC8+XCIpOnRoaXMub3B0aW9ucy50ZXh0KSwhMT09PWEudGV4dCYmdGhpcy50ZXh0X2NvbnRhaW5lci5zbGlkZURvd24oMjAwKSk7dGhpcy5vcHRpb25zLnR5cGUhPT1hLnR5cGUmJnRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMuc3R5bGVzLmVycm9yK1wiIFwiK3RoaXMuc3R5bGVzLm5vdGljZStcIiBcIit0aGlzLnN0eWxlcy5zdWNjZXNzK1wiIFwiK3RoaXMuc3R5bGVzLmluZm8pLmFkZENsYXNzKFwiZXJyb3JcIj09PXRoaXMub3B0aW9ucy50eXBlP3RoaXMuc3R5bGVzLmVycm9yOlwiaW5mb1wiPT09dGhpcy5vcHRpb25zLnR5cGU/dGhpcy5zdHlsZXMuaW5mbzpcInN1Y2Nlc3NcIj09PXRoaXMub3B0aW9ucy50eXBlP1xudGhpcy5zdHlsZXMuc3VjY2Vzczp0aGlzLnN0eWxlcy5ub3RpY2UpO2lmKHRoaXMub3B0aW9ucy5pY29uIT09YS5pY29ufHwhMD09PXRoaXMub3B0aW9ucy5pY29uJiZ0aGlzLm9wdGlvbnMudHlwZSE9PWEudHlwZSl0aGlzLmNvbnRhaW5lci5maW5kKFwiZGl2LnVpLXBub3RpZnktaWNvblwiKS5yZW1vdmUoKSwhMSE9PXRoaXMub3B0aW9ucy5pY29uJiZiKFwiPGRpdiAvPlwiLHtcImNsYXNzXCI6XCJ1aS1wbm90aWZ5LWljb25cIn0pLmFwcGVuZChiKFwiPHNwYW4gLz5cIix7XCJjbGFzc1wiOiEwPT09dGhpcy5vcHRpb25zLmljb24/XCJlcnJvclwiPT09dGhpcy5vcHRpb25zLnR5cGU/dGhpcy5zdHlsZXMuZXJyb3JfaWNvbjpcImluZm9cIj09PXRoaXMub3B0aW9ucy50eXBlP3RoaXMuc3R5bGVzLmluZm9faWNvbjpcInN1Y2Nlc3NcIj09PXRoaXMub3B0aW9ucy50eXBlP3RoaXMuc3R5bGVzLnN1Y2Nlc3NfaWNvbjp0aGlzLnN0eWxlcy5ub3RpY2VfaWNvbjp0aGlzLm9wdGlvbnMuaWNvbn0pKS5wcmVwZW5kVG8odGhpcy5jb250YWluZXIpO1xudGhpcy5vcHRpb25zLndpZHRoIT09YS53aWR0aCYmdGhpcy5lbGVtLmFuaW1hdGUoe3dpZHRoOnRoaXMub3B0aW9ucy53aWR0aH0pO3RoaXMub3B0aW9ucy5taW5faGVpZ2h0IT09YS5taW5faGVpZ2h0JiZ0aGlzLmNvbnRhaW5lci5hbmltYXRlKHttaW5IZWlnaHQ6dGhpcy5vcHRpb25zLm1pbl9oZWlnaHR9KTt0aGlzLm9wdGlvbnMuaGlkZT9hLmhpZGV8fHRoaXMucXVldWVSZW1vdmUoKTp0aGlzLmNhbmNlbFJlbW92ZSgpO3RoaXMucXVldWVQb3NpdGlvbighMCk7dGhpcy5ydW5Nb2R1bGVzKFwidXBkYXRlXCIsYSk7cmV0dXJuIHRoaXN9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPVwib3BlbmluZ1wiO3RoaXMucnVuTW9kdWxlcyhcImJlZm9yZU9wZW5cIik7dmFyIGM9dGhpczt0aGlzLmVsZW0ucGFyZW50KCkubGVuZ3RofHx0aGlzLmVsZW0uYXBwZW5kVG8odGhpcy5vcHRpb25zLnN0YWNrLmNvbnRleHQ/dGhpcy5vcHRpb25zLnN0YWNrLmNvbnRleHQ6aCk7XCJ0b3BcIiE9PXRoaXMub3B0aW9ucy5zdGFjay5wdXNoJiZcbnRoaXMucG9zaXRpb24oITApO3RoaXMuYW5pbWF0ZUluKGZ1bmN0aW9uKCl7Yy5xdWV1ZVBvc2l0aW9uKCEwKTtjLm9wdGlvbnMuaGlkZSYmYy5xdWV1ZVJlbW92ZSgpO2Muc3RhdGU9XCJvcGVuXCI7Yy5ydW5Nb2R1bGVzKFwiYWZ0ZXJPcGVuXCIpfSk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihjKXt0aGlzLnN0YXRlPVwiY2xvc2luZ1wiO3RoaXMudGltZXJIaWRlPSEhYzt0aGlzLnJ1bk1vZHVsZXMoXCJiZWZvcmVDbG9zZVwiKTt2YXIgYT10aGlzO3RoaXMudGltZXImJihsLmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPW51bGwpO3RoaXMuYW5pbWF0ZU91dChmdW5jdGlvbigpe2Euc3RhdGU9XCJjbG9zZWRcIjthLnJ1bk1vZHVsZXMoXCJhZnRlckNsb3NlXCIpO2EucXVldWVQb3NpdGlvbighMCk7YS5vcHRpb25zLnJlbW92ZSYmYS5lbGVtLmRldGFjaCgpO2EucnVuTW9kdWxlcyhcImJlZm9yZURlc3Ryb3lcIik7aWYoYS5vcHRpb25zLmRlc3Ryb3kmJm51bGwhPT1kLm5vdGljZXMpe3ZhciBjPVxuYi5pbkFycmF5KGEsZC5ub3RpY2VzKTstMSE9PWMmJmQubm90aWNlcy5zcGxpY2UoYywxKX1hLnJ1bk1vZHVsZXMoXCJhZnRlckRlc3Ryb3lcIil9KTtyZXR1cm4gdGhpc30sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbX0scGFyc2VPcHRpb25zOmZ1bmN0aW9uKGMsYSl7dGhpcy5vcHRpb25zPWIuZXh0ZW5kKCEwLHt9LGQucHJvdG90eXBlLm9wdGlvbnMpO3RoaXMub3B0aW9ucy5zdGFjaz1kLnByb3RvdHlwZS5vcHRpb25zLnN0YWNrO2Zvcih2YXIgcD1bYyxhXSxtLGY9MDtmPHAubGVuZ3RoO2YrKyl7bT1wW2ZdO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgbSlicmVhaztpZihcIm9iamVjdFwiIT09dHlwZW9mIG0pdGhpcy5vcHRpb25zLnRleHQ9bTtlbHNlIGZvcih2YXIgZSBpbiBtKXRoaXMubW9kdWxlc1tlXT9iLmV4dGVuZCghMCx0aGlzLm9wdGlvbnNbZV0sbVtlXSk6dGhpcy5vcHRpb25zW2VdPW1bZV19fSxhbmltYXRlSW46ZnVuY3Rpb24oYyl7dGhpcy5hbmltYXRpbmc9XG5cImluXCI7dmFyIGE9dGhpcztjPWZ1bmN0aW9uKCl7YS5hbmltVGltZXImJmNsZWFyVGltZW91dChhLmFuaW1UaW1lcik7XCJpblwiPT09YS5hbmltYXRpbmcmJihhLmVsZW0uaXMoXCI6dmlzaWJsZVwiKT8odGhpcyYmdGhpcy5jYWxsKCksYS5hbmltYXRpbmc9ITEpOmEuYW5pbVRpbWVyPXNldFRpbWVvdXQoYyw0MCkpfS5iaW5kKGMpO1wiZmFkZVwiPT09dGhpcy5vcHRpb25zLmFuaW1hdGlvbj8odGhpcy5lbGVtLm9uZShcIndlYmtpdFRyYW5zaXRpb25FbmQgbW96VHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQgb1RyYW5zaXRpb25FbmQgdHJhbnNpdGlvbmVuZFwiLGMpLmFkZENsYXNzKFwidWktcG5vdGlmeS1pblwiKSx0aGlzLmVsZW0uY3NzKFwib3BhY2l0eVwiKSx0aGlzLmVsZW0uYWRkQ2xhc3MoXCJ1aS1wbm90aWZ5LWZhZGUtaW5cIiksdGhpcy5hbmltVGltZXI9c2V0VGltZW91dChjLDY1MCkpOih0aGlzLmVsZW0uYWRkQ2xhc3MoXCJ1aS1wbm90aWZ5LWluXCIpLGMoKSl9LGFuaW1hdGVPdXQ6ZnVuY3Rpb24oYyl7dGhpcy5hbmltYXRpbmc9XG5cIm91dFwiO3ZhciBhPXRoaXM7Yz1mdW5jdGlvbigpe2EuYW5pbVRpbWVyJiZjbGVhclRpbWVvdXQoYS5hbmltVGltZXIpO1wib3V0XCI9PT1hLmFuaW1hdGluZyYmKFwiMFwiIT1hLmVsZW0uY3NzKFwib3BhY2l0eVwiKSYmYS5lbGVtLmlzKFwiOnZpc2libGVcIik/YS5hbmltVGltZXI9c2V0VGltZW91dChjLDQwKTooYS5lbGVtLnJlbW92ZUNsYXNzKFwidWktcG5vdGlmeS1pblwiKSx0aGlzJiZ0aGlzLmNhbGwoKSxhLmFuaW1hdGluZz0hMSkpfS5iaW5kKGMpO1wiZmFkZVwiPT09dGhpcy5vcHRpb25zLmFuaW1hdGlvbj8odGhpcy5lbGVtLm9uZShcIndlYmtpdFRyYW5zaXRpb25FbmQgbW96VHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQgb1RyYW5zaXRpb25FbmQgdHJhbnNpdGlvbmVuZFwiLGMpLnJlbW92ZUNsYXNzKFwidWktcG5vdGlmeS1mYWRlLWluXCIpLHRoaXMuYW5pbVRpbWVyPXNldFRpbWVvdXQoYyw2NTApKToodGhpcy5lbGVtLnJlbW92ZUNsYXNzKFwidWktcG5vdGlmeS1pblwiKSxjKCkpfSxwb3NpdGlvbjpmdW5jdGlvbihjKXt2YXIgYT1cbnRoaXMub3B0aW9ucy5zdGFjayxiPXRoaXMuZWxlbTtcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEuY29udGV4dCYmKGEuY29udGV4dD1oKTtpZihhKXtcIm51bWJlclwiIT09dHlwZW9mIGEubmV4dHBvczEmJihhLm5leHRwb3MxPWEuZmlyc3Rwb3MxKTtcIm51bWJlclwiIT09dHlwZW9mIGEubmV4dHBvczImJihhLm5leHRwb3MyPWEuZmlyc3Rwb3MyKTtcIm51bWJlclwiIT09dHlwZW9mIGEuYWRkcG9zMiYmKGEuYWRkcG9zMj0wKTt2YXIgZD0hYi5oYXNDbGFzcyhcInVpLXBub3RpZnktaW5cIik7aWYoIWR8fGMpe2EubW9kYWwmJihhLm92ZXJsYXk/YS5vdmVybGF5LnNob3coKTphLm92ZXJsYXk9cyhhKSk7Yi5hZGRDbGFzcyhcInVpLXBub3RpZnktbW92ZVwiKTt2YXIgZjtzd2l0Y2goYS5kaXIxKXtjYXNlIFwiZG93blwiOmY9XCJ0b3BcIjticmVhaztjYXNlIFwidXBcIjpmPVwiYm90dG9tXCI7YnJlYWs7Y2FzZSBcImxlZnRcIjpmPVwicmlnaHRcIjticmVhaztjYXNlIFwicmlnaHRcIjpmPVwibGVmdFwifWM9cGFyc2VJbnQoYi5jc3MoZikucmVwbGFjZSgvKD86XFwuLip8W14wLTkuXSkvZyxcblwiXCIpKTtpc05hTihjKSYmKGM9MCk7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhLmZpcnN0cG9zMXx8ZHx8KGEuZmlyc3Rwb3MxPWMsYS5uZXh0cG9zMT1hLmZpcnN0cG9zMSk7dmFyIGU7c3dpdGNoKGEuZGlyMil7Y2FzZSBcImRvd25cIjplPVwidG9wXCI7YnJlYWs7Y2FzZSBcInVwXCI6ZT1cImJvdHRvbVwiO2JyZWFrO2Nhc2UgXCJsZWZ0XCI6ZT1cInJpZ2h0XCI7YnJlYWs7Y2FzZSBcInJpZ2h0XCI6ZT1cImxlZnRcIn1jPXBhcnNlSW50KGIuY3NzKGUpLnJlcGxhY2UoLyg/OlxcLi4qfFteMC05Ll0pL2csXCJcIikpO2lzTmFOKGMpJiYoYz0wKTtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGEuZmlyc3Rwb3MyfHxkfHwoYS5maXJzdHBvczI9YyxhLm5leHRwb3MyPWEuZmlyc3Rwb3MyKTtpZihcImRvd25cIj09PWEuZGlyMSYmYS5uZXh0cG9zMStiLmhlaWdodCgpPihhLmNvbnRleHQuaXMoaCk/bi5oZWlnaHQoKTphLmNvbnRleHQucHJvcChcInNjcm9sbEhlaWdodFwiKSl8fFwidXBcIj09PWEuZGlyMSYmYS5uZXh0cG9zMStiLmhlaWdodCgpPlxuKGEuY29udGV4dC5pcyhoKT9uLmhlaWdodCgpOmEuY29udGV4dC5wcm9wKFwic2Nyb2xsSGVpZ2h0XCIpKXx8XCJsZWZ0XCI9PT1hLmRpcjEmJmEubmV4dHBvczErYi53aWR0aCgpPihhLmNvbnRleHQuaXMoaCk/bi53aWR0aCgpOmEuY29udGV4dC5wcm9wKFwic2Nyb2xsV2lkdGhcIikpfHxcInJpZ2h0XCI9PT1hLmRpcjEmJmEubmV4dHBvczErYi53aWR0aCgpPihhLmNvbnRleHQuaXMoaCk/bi53aWR0aCgpOmEuY29udGV4dC5wcm9wKFwic2Nyb2xsV2lkdGhcIikpKWEubmV4dHBvczE9YS5maXJzdHBvczEsYS5uZXh0cG9zMis9YS5hZGRwb3MyKyhcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEuc3BhY2luZzI/MjU6YS5zcGFjaW5nMiksYS5hZGRwb3MyPTA7XCJudW1iZXJcIj09PXR5cGVvZiBhLm5leHRwb3MyJiYoYS5hbmltYXRpb24/Yi5jc3MoZSxhLm5leHRwb3MyK1wicHhcIik6KGIucmVtb3ZlQ2xhc3MoXCJ1aS1wbm90aWZ5LW1vdmVcIiksYi5jc3MoZSxhLm5leHRwb3MyK1wicHhcIiksYi5jc3MoZSksYi5hZGRDbGFzcyhcInVpLXBub3RpZnktbW92ZVwiKSkpO1xuc3dpdGNoKGEuZGlyMil7Y2FzZSBcImRvd25cIjpjYXNlIFwidXBcIjpiLm91dGVySGVpZ2h0KCEwKT5hLmFkZHBvczImJihhLmFkZHBvczI9Yi5oZWlnaHQoKSk7YnJlYWs7Y2FzZSBcImxlZnRcIjpjYXNlIFwicmlnaHRcIjpiLm91dGVyV2lkdGgoITApPmEuYWRkcG9zMiYmKGEuYWRkcG9zMj1iLndpZHRoKCkpfVwibnVtYmVyXCI9PT10eXBlb2YgYS5uZXh0cG9zMSYmKGEuYW5pbWF0aW9uP2IuY3NzKGYsYS5uZXh0cG9zMStcInB4XCIpOihiLnJlbW92ZUNsYXNzKFwidWktcG5vdGlmeS1tb3ZlXCIpLGIuY3NzKGYsYS5uZXh0cG9zMStcInB4XCIpLGIuY3NzKGYpLGIuYWRkQ2xhc3MoXCJ1aS1wbm90aWZ5LW1vdmVcIikpKTtzd2l0Y2goYS5kaXIxKXtjYXNlIFwiZG93blwiOmNhc2UgXCJ1cFwiOmEubmV4dHBvczErPWIuaGVpZ2h0KCkrKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYS5zcGFjaW5nMT8yNTphLnNwYWNpbmcxKTticmVhaztjYXNlIFwibGVmdFwiOmNhc2UgXCJyaWdodFwiOmEubmV4dHBvczErPWIud2lkdGgoKSsoXCJ1bmRlZmluZWRcIj09PVxudHlwZW9mIGEuc3BhY2luZzE/MjU6YS5zcGFjaW5nMSl9fXJldHVybiB0aGlzfX0scXVldWVQb3NpdGlvbjpmdW5jdGlvbihiLGEpe2cmJmNsZWFyVGltZW91dChnKTthfHwoYT0xMCk7Zz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5wb3NpdGlvbkFsbChiKX0sYSk7cmV0dXJuIHRoaXN9LGNhbmNlbFJlbW92ZTpmdW5jdGlvbigpe3RoaXMudGltZXImJmwuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO3RoaXMuYW5pbVRpbWVyJiZsLmNsZWFyVGltZW91dCh0aGlzLmFuaW1UaW1lcik7XCJjbG9zaW5nXCI9PT10aGlzLnN0YXRlJiYodGhpcy5zdGF0ZT1cIm9wZW5cIix0aGlzLmFuaW1hdGluZz0hMSx0aGlzLmVsZW0uYWRkQ2xhc3MoXCJ1aS1wbm90aWZ5LWluXCIpLFwiZmFkZVwiPT09dGhpcy5vcHRpb25zLmFuaW1hdGlvbiYmdGhpcy5lbGVtLmFkZENsYXNzKFwidWktcG5vdGlmeS1mYWRlLWluXCIpKTtyZXR1cm4gdGhpc30scXVldWVSZW1vdmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuY2FuY2VsUmVtb3ZlKCk7XG50aGlzLnRpbWVyPWwuc2V0VGltZW91dChmdW5jdGlvbigpe2IucmVtb3ZlKCEwKX0saXNOYU4odGhpcy5vcHRpb25zLmRlbGF5KT8wOnRoaXMub3B0aW9ucy5kZWxheSk7cmV0dXJuIHRoaXN9fSk7Yi5leHRlbmQoZCx7bm90aWNlczpbXSxyZWxvYWQ6cSxyZW1vdmVBbGw6ZnVuY3Rpb24oKXtiLmVhY2goZC5ub3RpY2VzLGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmUmJnRoaXMucmVtb3ZlKCExKX0pfSxyZW1vdmVTdGFjazpmdW5jdGlvbihjKXtiLmVhY2goZC5ub3RpY2VzLGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmUmJnRoaXMub3B0aW9ucy5zdGFjaz09PWMmJnRoaXMucmVtb3ZlKCExKX0pfSxwb3NpdGlvbkFsbDpmdW5jdGlvbihjKXtnJiZjbGVhclRpbWVvdXQoZyk7Zz1udWxsO2lmKGQubm90aWNlcyYmZC5ub3RpY2VzLmxlbmd0aCliLmVhY2goZC5ub3RpY2VzLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLnN0YWNrO2EmJihhLm92ZXJsYXkmJmEub3ZlcmxheS5oaWRlKCksYS5uZXh0cG9zMT1cbmEuZmlyc3Rwb3MxLGEubmV4dHBvczI9YS5maXJzdHBvczIsYS5hZGRwb3MyPTAsYS5hbmltYXRpb249Yyl9KSxiLmVhY2goZC5ub3RpY2VzLGZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbigpfSk7ZWxzZXt2YXIgYT1kLnByb3RvdHlwZS5vcHRpb25zLnN0YWNrO2EmJihkZWxldGUgYS5uZXh0cG9zMSxkZWxldGUgYS5uZXh0cG9zMil9fSxzdHlsaW5nOnticmlnaHR0aGVtZTp7Y29udGFpbmVyOlwiYnJpZ2h0dGhlbWVcIixub3RpY2U6XCJicmlnaHR0aGVtZS1ub3RpY2VcIixub3RpY2VfaWNvbjpcImJyaWdodHRoZW1lLWljb24tbm90aWNlXCIsaW5mbzpcImJyaWdodHRoZW1lLWluZm9cIixpbmZvX2ljb246XCJicmlnaHR0aGVtZS1pY29uLWluZm9cIixzdWNjZXNzOlwiYnJpZ2h0dGhlbWUtc3VjY2Vzc1wiLHN1Y2Nlc3NfaWNvbjpcImJyaWdodHRoZW1lLWljb24tc3VjY2Vzc1wiLGVycm9yOlwiYnJpZ2h0dGhlbWUtZXJyb3JcIixlcnJvcl9pY29uOlwiYnJpZ2h0dGhlbWUtaWNvbi1lcnJvclwifSxqcXVlcnl1aTp7Y29udGFpbmVyOlwidWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGxcIixcbm5vdGljZTpcInVpLXN0YXRlLWhpZ2hsaWdodFwiLG5vdGljZV9pY29uOlwidWktaWNvbiB1aS1pY29uLWluZm9cIixpbmZvOlwiXCIsaW5mb19pY29uOlwidWktaWNvbiB1aS1pY29uLWluZm9cIixzdWNjZXNzOlwidWktc3RhdGUtZGVmYXVsdFwiLHN1Y2Nlc3NfaWNvbjpcInVpLWljb24gdWktaWNvbi1jaXJjbGUtY2hlY2tcIixlcnJvcjpcInVpLXN0YXRlLWVycm9yXCIsZXJyb3JfaWNvbjpcInVpLWljb24gdWktaWNvbi1hbGVydFwifSxib290c3RyYXAzOntjb250YWluZXI6XCJhbGVydFwiLG5vdGljZTpcImFsZXJ0LXdhcm5pbmdcIixub3RpY2VfaWNvbjpcImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiLGluZm86XCJhbGVydC1pbmZvXCIsaW5mb19pY29uOlwiZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIixzdWNjZXNzOlwiYWxlcnQtc3VjY2Vzc1wiLHN1Y2Nlc3NfaWNvbjpcImdseXBoaWNvbiBnbHlwaGljb24tb2stc2lnblwiLGVycm9yOlwiYWxlcnQtZGFuZ2VyXCIsZXJyb3JfaWNvbjpcImdseXBoaWNvbiBnbHlwaGljb24td2FybmluZy1zaWduXCJ9fX0pO1xuZC5zdHlsaW5nLmZvbnRhd2Vzb21lPWIuZXh0ZW5kKHt9LGQuc3R5bGluZy5ib290c3RyYXAzKTtiLmV4dGVuZChkLnN0eWxpbmcuZm9udGF3ZXNvbWUse25vdGljZV9pY29uOlwiZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlXCIsaW5mb19pY29uOlwiZmEgZmEtaW5mb1wiLHN1Y2Nlc3NfaWNvbjpcImZhIGZhLWNoZWNrXCIsZXJyb3JfaWNvbjpcImZhIGZhLXdhcm5pbmdcIn0pO2wuZG9jdW1lbnQuYm9keT9yKCk6YihyKTtyZXR1cm4gZH07cmV0dXJuIHEoayl9KTtcbiIsInZhciBrZXkgPSByZXF1aXJlKFwia2V5bWFzdGVyXCIpO1xyXG52YXIgbWVzc2FnZSA9IHJlcXVpcmUoXCJtb2R1bGVzL21lc3NhZ2VcIik7XHJcblxyXG4vLyBBZGQgc2hvcnRjdXQgY29lXHJcbnZhciBfYWRkU2hvcnRjdXQgPSBmdW5jdGlvbihzZWxlY3RlZEtleSxjYikge1xyXG4gIGtleShzZWxlY3RlZEtleSwgY2IpO1xyXG59XHJcblxyXG52YXIgX2NsaWNrQnV0dG9uID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAkKHNlbGVjdG9yKS50cmlnZ2VyKCdjbGljaycpO1xyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuLy8gQWRkIHNob3J0Y3V0cyBmb3Igc2VsZWN0b3JzXHJcbnZhciBkZWZhdWx0U2hvcnRjdXRzID0gZnVuY3Rpb24oKSB7XHJcbiAgX2FkZFNob3J0Y3V0KCdjdHJsK3MnLCBmdW5jdGlvbihldmVudCxoYW5kbGVyKXtcclxuICAgIF9jbGlja0J1dHRvbignLnQtQnV0dG9uW29uY2xpY2sqPVwiXFwnQ1JFQVRFXFwnXCJdLC50LUJ1dHRvbiNDUkVBVEUnKTtcclxuICB9KTtcclxuICBfYWRkU2hvcnRjdXQoJ2N0cmwrcycsIGZ1bmN0aW9uKGV2ZW50LGhhbmRsZXIpe1xyXG4gICAgX2NsaWNrQnV0dG9uKCcudC1CdXR0b25bb25jbGljayo9XCJcXCdTQVZFXFwnXCJdLC50LUJ1dHRvbiNTQVZFJyk7XHJcbiAgfSk7XHJcbiAgX2FkZFNob3J0Y3V0KCdjdHJsK2QnLCBmdW5jdGlvbihldmVudCxoYW5kbGVyKXtcclxuICAgIF9jbGlja0J1dHRvbignLnQtQnV0dG9uW29uY2xpY2sqPVwiXFwnREVMRVRFXFwnXCJdLC50LUJ1dHRvbiNERUxFVEUnKTtcclxuICB9KTtcclxuICBfYWRkU2hvcnRjdXQoJ2N0cmwrbScsIGZ1bmN0aW9uKGV2ZW50LGhhbmRsZXIpe1xyXG4gICAgbWVzc2FnZS5pbmZvKHtcclxuICAgICAgdGl0bGU6IFwiQSBrZXkgd2FzIHByZXNzZWRcIixcclxuICAgICAgdGV4dDogXCJjdHJsK21cIlxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICBkZWZhdWx0U2hvcnRjdXRzOiBkZWZhdWx0U2hvcnRjdXRzXHJcbn1cclxuIiwidmFyICQgPSAod2luZG93LiQpOyAvLyBiZWluZyBzaGltbWVkXHJcbnZhciBQTm90aWZ5ID0gcmVxdWlyZShcInBub3RpZnlcIik7XHJcblxyXG5cclxuLy8gQnV0dG9uIGRlZmF1bHRzXHJcbnZhciBkZWZhdWx0cyA9IHtcclxuICBoaWRlOiBmYWxzZSxcclxuICBjbG9zZXI6IHRydWUsXHJcbiAgYnV0dG9uczoge1xyXG4gICAgY2xvc2VyX2hvdmVyOiBmYWxzZSxcclxuICAgIHN0aWNrZXI6IGZhbHNlLFxyXG4gICAgbGFiZWxzOiB7XHJcbiAgICAgIGNsb3NlOiAnU2x1aXQgbWVsZGluZydcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5cclxudmFyIGdldFNldHRpbmdzID0gZnVuY3Rpb24ob3B0aW9ucykge1xyXG5cclxuICBzd2l0Y2ggKHR5cGVvZiBvcHRpb25zKSB7XHJcbiAgICBjYXNlIFwic3RyaW5nXCI6XHJcbiAgICAgIHJldHVybiAkLmV4dGVuZCh7XHJcbiAgICAgICAgdGl0bGU6IG9wdGlvbnNcclxuICAgICAgfSwgZGVmYXVsdHMpO1xyXG4gICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICByZXR1cm4gJC5leHRlbmQob3B0aW9ucywgZGVmYXVsdHMpO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIGRlZmF1bHRzO1xyXG4gIH07XHJcblxyXG59O1xyXG5cclxudmFyIGluZm8gPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgcmV0dXJuIG5ldyBQTm90aWZ5KCQuZXh0ZW5kKGdldFNldHRpbmdzKG9wdGlvbnMpLCB7XHJcbiAgICB0eXBlOiAnaW5mbycsXHJcbiAgICBoaWRlOiB0cnVlXHJcbiAgfSkpO1xyXG59O1xyXG5cclxudmFyIHN1Y2Nlc3MgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgcmV0dXJuIG5ldyBQTm90aWZ5KCQuZXh0ZW5kKGdldFNldHRpbmdzKG9wdGlvbnMpLCB7XHJcbiAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICBoaWRlOiB0cnVlXHJcbiAgfSkpO1xyXG59O1xyXG5cclxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgcmV0dXJuIG5ldyBQTm90aWZ5KCQuZXh0ZW5kKGdldFNldHRpbmdzKG9wdGlvbnMpLCB7XHJcbiAgICB0eXBlOiAnd2FybmluZydcclxuICB9KSk7XHJcbn07XHJcblxyXG52YXIgZXJyb3IgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgcmV0dXJuIG5ldyBQTm90aWZ5KCQuZXh0ZW5kKGdldFNldHRpbmdzKG9wdGlvbnMpLCB7XHJcbiAgICB0eXBlOiAnZXJyb3InXHJcbiAgfSkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgaW5mbzogaW5mbyxcclxuICBzdWNjZXNzOiBzdWNjZXNzLFxyXG4gIHdhcm5pbmc6IHdhcm5pbmcsXHJcbiAgZXJyb3I6IGVycm9yXHJcbn07XHJcbiIsIiQud2lkZ2V0KFwiY3VzdG9tLmN1c3RvbVJlcG9ydFwiLCB7XHJcbiAgb3B0aW9uczoge1xyXG4gICAgZXhjZXB0Q2xhc3M6ICduby1yb3ctbGluaycsXHJcbiAgICBhY3RpdmVDbGFzczogJ2FjdGl2ZScsXHJcbiAgICBjb2x1bW5zOiBbXSxcclxuICAgIHJvd2NsaWNrOiBmdW5jdGlvbihlLCBkYXRhKSB7XHJcbiAgICAgICQodGhpcykuY3VzdG9tUmVwb3J0KCdvcGVuTGluaycsIGUpO1xyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIF9jcmVhdGU6IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgLy8gQ2hlY2sgaWYgcmVwb3J0IG1heSBoYXZlIGEgcm93IGxpbmtcclxuICAgIGlmICh0aGlzLl9yb3dMaW5rQWxsb3dlZCkge1xyXG4gICAgICB0aGlzLl9pbml0Um93Q2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAkKHRoaXMuZWxlbWVudCkub24oJ2FwZXhhZnRlcnJlZnJlc2gnLGZ1bmN0aW9uKGUpe1xyXG4gICAgICBzZWxmLl9hcGV4YWZ0ZXJyZWZyZXNoKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgfSxcclxuXHJcbiAgX2FwZXhhZnRlcnJlZnJlc2g6IGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gQ2hlY2sgaWYgcmVwb3J0IG1heSBoYXZlIGEgcm93IGxpbmtcclxuICAgIGlmICh0aGlzLl9yb3dMaW5rQWxsb3dlZCkge1xyXG4gICAgICB0aGlzLl9pbml0Um93Q2xpY2soKTtcclxuICAgIH1cclxuICB9LFxyXG5cclxuICBfaW5pdFJvd0NsaWNrOiBmdW5jdGlvbihjYikge1xyXG5cclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgIHZhciBkYXRhO1xyXG4gICAgY2IgPSAkLnByb3h5KGNiLCBzZWxmKTtcclxuXHJcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgaGFuZGxlcnNcclxuICAgIHRoaXMuX29mZih0aGlzLmVsZW1lbnQsICdjbGljayB0ciB0ZDpub3QoOmhhcyhhKSknKTtcclxuICAgIHRoaXMuX29mZih0aGlzLmVsZW1lbnQsICdob3ZlciB0ciB0ZDpub3QoOmhhcyhhKSknKTtcclxuXHJcbiAgICAvLyBBZGQgbmV3IGhhbmRsZXJcclxuICAgIHRoaXMuX29uKHRoaXMuZWxlbWVudCwge1xyXG4gICAgICAnbW91c2VlbnRlciB0ciB0ZDpub3QoOmhhcyhhKSknOiBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgJChlLnRhcmdldCkuY3NzKCdjdXJzb3InLCAncG9pbnRlcicpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBZGQgbmV3IGhhbmRsZXJcclxuICAgIHRoaXMuX29uKHRoaXMuZWxlbWVudCwge1xyXG4gICAgICAnY2xpY2sgdHIgdGQ6bm90KDpoYXMoYSkpJzogZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIHNlbGYuX3RyaWdnZXIoJ3Jvd2NsaWNrJywgZSwgZGF0YSk7XHJcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH0sXHJcblxyXG4gIC8vIFVzZSBhbiBhIGhyZWYgdmFsdWUgdG8gcmVkaXJlY3Qgb24gcm93IGNsaWNrIGluIHJlcG9ydFxyXG4gIG9wZW5MaW5rOiBmdW5jdGlvbihldmVudCwgb3B0aW9ucykge1xyXG5cclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICB2YXIgZGVmYXVsdHMgPSB7XHJcbiAgICAgIGFQb3M6IDAgLy8gd2hpY2ggXCJhXCIgZWxlbWVudCBjb250YWlucyB0aGUgbGlua1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKG9wdGlvbnMsIGRlZmF1bHRzKTtcclxuXHJcbiAgICAvLyBHZXQgbGlua1xyXG4gICAgdmFyICRsaW5rRWxlbSA9IHNlbGYuX2dldExpbmtFbGVtZW50KHNldHRpbmdzLCBldmVudC5jdXJyZW50VGFyZ2V0KTtcclxuICAgIHZhciBocmVmID0gJGxpbmtFbGVtLmF0dHIoJ2hyZWYnKTtcclxuXHJcbiAgICBpZiAoaHJlZiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIF9nZXRMaW5rRWxlbWVudDogZnVuY3Rpb24ob3B0aW9ucywgdGFyZ2V0KSB7XHJcblxyXG4gICAgdmFyIGxpbmtzID0gJCh0YXJnZXQpLmNsb3Nlc3QoJ3RyJykuZmluZCgndGQ6aGFzKGEpJyk7XHJcblxyXG4gICAgLy8gUmFpc2UgZXhjZXB0aW9uIGlmIHBvc2l0aW9uIG9mIGEgZWxlbWVudCBpcyBpbnZhbGlkXHJcbiAgICBpZiAobGlua3MubGVuZ3RoIDwgb3B0aW9ucy5hUG9zKSB7XHJcbiAgICAgIGFwZXguZGVidWcuZXJyb3IoJ0V4Y2VwdGlvbjogJywgb3B0aW9ucy5hUG9zICsgJ3RoIFwiYVwiIGVsZW1lbnQgaXMgbm90IGZvdW5kIGluIHJlcG9ydCByb3cuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJChsaW5rc1tvcHRpb25zLmFQb3NdKS5maW5kKCdhJyk7XHJcbiAgICB9XHJcblxyXG4gIH0sXHJcblxyXG4gIC8vIF9yb3dMaW5rQWxsb3dlZCByZXR1cm5zIGJvb2xlYW5cclxuICBfcm93TGlua0FsbG93ZWQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuICEkKHRoaXMuZWxlbWVudCkuaGFzQ2xhc3ModGhpcy5vcHRpb25zLmV4Y2VwdENsYXNzKTtcclxuICB9LFxyXG5cclxuICBfc2V0QWN0aXZlUm93OiBmdW5jdGlvbigkcm93KSB7XHJcbiAgICAkKCRyb3cpLmNsb3Nlc3QoJ3RhYmxlJykuZmluZCgndGQuJyt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyk7XHJcbiAgICAkKCRyb3cpLmZpbmQoJ3RkJykuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtcclxuICB9LFxyXG5cclxuICBhY3RpdmVSb3c6IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuICQodGhpcy5lbGVtZW50KS5maW5kKCd0ZC4nK3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykuY2xvc2VzdCgndHInKTtcclxuICB9XHJcblxyXG59KTtcclxuIl19
550 |
--------------------------------------------------------------------------------
/dist/kscope/js/bundle.min.js:
--------------------------------------------------------------------------------
1 | !function t(i,e,o){function n(r,a){if(!e[r]){if(!i[r]){var c="function"==typeof require&&require;if(!a&&c)return c(r,!0);if(s)return s(r,!0);var h=new Error("Cannot find module '"+r+"'");throw h.code="MODULE_NOT_FOUND",h}var l=e[r]={exports:{}};i[r][0].call(l.exports,function(t){var e=i[r][1][t];return n(e?e:t)},l,l.exports,t,i,e,o)}return e[r].exports}for(var s="function"==typeof require&&require,r=0;r0;for(s in k)(!k[s]&&e(o.mods,+s)>-1||k[s]&&e(o.mods,+s)==-1)&&(a=!1);(0!=o.mods.length||k[16]||k[18]||k[17]||k[91])&&!a||o.method(t,o)===!1&&(t.preventDefault?t.preventDefault():t.returnValue=!1,t.stopPropagation&&t.stopPropagation(),t.cancelBubble&&(t.cancelBubble=!0))}}function r(t){var i,o=t.keyCode,n=e(R,o);if(n>=0&&R.splice(n,1),93!=o&&224!=o||(o=91),o in k){k[o]=!1;for(i in C)C[i]==o&&(c[i]=!1)}}function a(){for(w in k)k[w]=!1;for(w in C)c[w]=!1}function c(t,i,e){var o,n;o=y(t),void 0===e&&(e=i,i="all");for(var s=0;s1&&(n=g(t),t=[t[t.length-1]]),t=t[0],t=E(t),t in _||(_[t]=[]),_[t].push({shortcut:o[s],scope:i,method:e,key:o[s],mods:n})}function h(t,i){var e,n,s,r,a,c=[];for(e=y(t),r=0;r1&&(c=g(n),t=n[n.length-1]),t=E(t),void 0===i&&(i=f()),!_[t])return;for(s=0;s<_[t].length;s++)a=_[t][s],a.scope===i&&o(a.mods,c)&&(_[t][s]={})}}function l(t){return"string"==typeof t&&(t=E(t)),e(R,t)!=-1}function p(){return R.slice(0)}function u(t){var i=(t.target||t.srcElement).tagName;return!("INPUT"==i||"SELECT"==i||"TEXTAREA"==i)}function d(t){b=t||"all"}function f(){return b||"all"}function m(t){var i,e,o;for(i in _)for(e=_[i],o=0;o",{"class":"ui-pnotify-modal-overlay"});return e.prependTo(i.context),i.overlay_close&&e.click(function(){h.removeStack(i)}),e},h=function(t){this.parseOptions(t),this.init()};return t.extend(h.prototype,{version:"3.0.0",options:{title:!1,title_escape:!1,text:!1,text_escape:!1,styling:"brighttheme",addclass:"",cornerclass:"",auto_display:!0,width:"300px",min_height:"16px",type:"notice",icon:!0,animation:"fade",animate_speed:"normal",shadow:!0,hide:!0,delay:8e3,mouse_reset:!0,remove:!0,insert_brs:!0,destroy:!0,stack:s},modules:{},runModules:function(t,i){var e,o;for(o in this.modules)e="object"==typeof i&&o in i?i[o]:i,"function"==typeof this.modules[o][t]&&(this.modules[o].notice=this,this.modules[o].options="object"==typeof this.options[o]?this.options[o]:{},this.modules[o][t](this,"object"==typeof this.options[o]?this.options[o]:{},e))},state:"initializing",timer:null,animTimer:null,styles:null,elem:null,container:null,title_container:null,text_container:null,animating:!1,timerHide:!1,init:function(){var i=this;return this.modules={},t.extend(!0,this.modules,h.prototype.modules),this.styles="object"==typeof this.options.styling?this.options.styling:h.styling[this.options.styling],this.elem=t("",{"class":"ui-pnotify "+this.options.addclass,css:{display:"none"},"aria-live":"assertive","aria-role":"alertdialog",mouseenter:function(t){if(i.options.mouse_reset&&"out"===i.animating){if(!i.timerHide)return;i.cancelRemove()}i.options.hide&&i.options.mouse_reset&&i.cancelRemove()},mouseleave:function(t){i.options.hide&&i.options.mouse_reset&&"out"!==i.animating&&i.queueRemove(),h.positionAll()}}),"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed),this.container=t("",{"class":this.styles.container+" ui-pnotify-container "+("error"===this.options.type?this.styles.error:"info"===this.options.type?this.styles.info:"success"===this.options.type?this.styles.success:this.styles.notice),role:"alert"}).appendTo(this.elem),""!==this.options.cornerclass&&this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass),this.options.shadow&&this.container.addClass("ui-pnotify-shadow"),!1!==this.options.icon&&t("",{"class":"ui-pnotify-icon"}).append(t("",{"class":!0===this.options.icon?"error"===this.options.type?this.styles.error_icon:"info"===this.options.type?this.styles.info_icon:"success"===this.options.type?this.styles.success_icon:this.styles.notice_icon:this.options.icon})).prependTo(this.container),this.title_container=t("",{"class":"ui-pnotify-title"}).appendTo(this.container),!1===this.options.title?this.title_container.hide():this.options.title_escape?this.title_container.text(this.options.title):this.title_container.html(this.options.title),this.text_container=t("",{"class":"ui-pnotify-text","aria-role":"alert"}).appendTo(this.container),!1===this.options.text?this.text_container.hide():this.options.text_escape?this.text_container.text(this.options.text):this.text_container.html(this.options.insert_brs?String(this.options.text).replace(/\n/g,"
"):this.options.text),"string"==typeof this.options.width&&this.elem.css("width",this.options.width),"string"==typeof this.options.min_height&&this.container.css("min-height",this.options.min_height),h.notices="top"===this.options.stack.push?t.merge([this],h.notices):t.merge(h.notices,[this]),"top"===this.options.stack.push&&this.queuePosition(!1,1),this.options.stack.animation=!1,this.runModules("init"),this.options.auto_display&&this.open(),this},update:function(i){var e=this.options;return this.parseOptions(e,i),this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast"),"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed),this.options.cornerclass!==e.cornerclass&&this.container.removeClass("ui-corner-all "+e.cornerclass).addClass(this.options.cornerclass),this.options.shadow!==e.shadow&&(this.options.shadow?this.container.addClass("ui-pnotify-shadow"):this.container.removeClass("ui-pnotify-shadow")),!1===this.options.addclass?this.elem.removeClass(e.addclass):this.options.addclass!==e.addclass&&this.elem.removeClass(e.addclass).addClass(this.options.addclass),!1===this.options.title?this.title_container.slideUp("fast"):this.options.title!==e.title&&(this.options.title_escape?this.title_container.text(this.options.title):this.title_container.html(this.options.title),!1===e.title&&this.title_container.slideDown(200)),!1===this.options.text?this.text_container.slideUp("fast"):this.options.text!==e.text&&(this.options.text_escape?this.text_container.text(this.options.text):this.text_container.html(this.options.insert_brs?String(this.options.text).replace(/\n/g,"
"):this.options.text),!1===e.text&&this.text_container.slideDown(200)),this.options.type!==e.type&&this.container.removeClass(this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info).addClass("error"===this.options.type?this.styles.error:"info"===this.options.type?this.styles.info:"success"===this.options.type?this.styles.success:this.styles.notice),(this.options.icon!==e.icon||!0===this.options.icon&&this.options.type!==e.type)&&(this.container.find("div.ui-pnotify-icon").remove(),!1!==this.options.icon&&t("",{"class":"ui-pnotify-icon"}).append(t("",{"class":!0===this.options.icon?"error"===this.options.type?this.styles.error_icon:"info"===this.options.type?this.styles.info_icon:"success"===this.options.type?this.styles.success_icon:this.styles.notice_icon:this.options.icon})).prependTo(this.container)),this.options.width!==e.width&&this.elem.animate({width:this.options.width}),this.options.min_height!==e.min_height&&this.container.animate({minHeight:this.options.min_height}),this.options.hide?e.hide||this.queueRemove():this.cancelRemove(),this.queuePosition(!0),this.runModules("update",e),this},open:function(){this.state="opening",this.runModules("beforeOpen");var t=this;return this.elem.parent().length||this.elem.appendTo(this.options.stack.context?this.options.stack.context:n),"top"!==this.options.stack.push&&this.position(!0),this.animateIn(function(){t.queuePosition(!0),t.options.hide&&t.queueRemove(),t.state="open",t.runModules("afterOpen")}),this},remove:function(e){this.state="closing",this.timerHide=!!e,this.runModules("beforeClose");var o=this;return this.timer&&(i.clearTimeout(this.timer),this.timer=null),this.animateOut(function(){if(o.state="closed",o.runModules("afterClose"),o.queuePosition(!0),o.options.remove&&o.elem.detach(),o.runModules("beforeDestroy"),o.options.destroy&&null!==h.notices){var i=t.inArray(o,h.notices);-1!==i&&h.notices.splice(i,1)}o.runModules("afterDestroy")}),this},get:function(){return this.elem},parseOptions:function(i,e){this.options=t.extend(!0,{},h.prototype.options),this.options.stack=h.prototype.options.stack;for(var o,n=[i,e],s=0;s(i.context.is(n)?r.height():i.context.prop("scrollHeight"))||"up"===i.dir1&&i.nextpos1+e.height()>(i.context.is(n)?r.height():i.context.prop("scrollHeight"))||"left"===i.dir1&&i.nextpos1+e.width()>(i.context.is(n)?r.width():i.context.prop("scrollWidth"))||"right"===i.dir1&&i.nextpos1+e.width()>(i.context.is(n)?r.width():i.context.prop("scrollWidth")))&&(i.nextpos1=i.firstpos1,i.nextpos2+=i.addpos2+("undefined"==typeof i.spacing2?25:i.spacing2),i.addpos2=0),"number"==typeof i.nextpos2&&(i.animation?e.css(a,i.nextpos2+"px"):(e.removeClass("ui-pnotify-move"),e.css(a,i.nextpos2+"px"),e.css(a),e.addClass("ui-pnotify-move"))),i.dir2){case"down":case"up":e.outerHeight(!0)>i.addpos2&&(i.addpos2=e.height());break;case"left":case"right":e.outerWidth(!0)>i.addpos2&&(i.addpos2=e.width())}switch("number"==typeof i.nextpos1&&(i.animation?e.css(s,i.nextpos1+"px"):(e.removeClass("ui-pnotify-move"),e.css(s,i.nextpos1+"px"),e.css(s),e.addClass("ui-pnotify-move"))),i.dir1){case"down":case"up":i.nextpos1+=e.height()+("undefined"==typeof i.spacing1?25:i.spacing1);break;case"left":case"right":i.nextpos1+=e.width()+("undefined"==typeof i.spacing1?25:i.spacing1)}}return this}},queuePosition:function(t,i){return o&&clearTimeout(o),i||(i=10),o=setTimeout(function(){h.positionAll(t)},i),this},cancelRemove:function(){return this.timer&&i.clearTimeout(this.timer),this.animTimer&&i.clearTimeout(this.animTimer),"closing"===this.state&&(this.state="open",this.animating=!1,this.elem.addClass("ui-pnotify-in"),"fade"===this.options.animation&&this.elem.addClass("ui-pnotify-fade-in")),this},queueRemove:function(){var t=this;return this.cancelRemove(),this.timer=i.setTimeout(function(){t.remove(!0)},isNaN(this.options.delay)?0:this.options.delay),this}}),t.extend(h,{notices:[],reload:e,removeAll:function(){t.each(h.notices,function(){this.remove&&this.remove(!1)})},removeStack:function(i){t.each(h.notices,function(){this.remove&&this.options.stack===i&&this.remove(!1)})},positionAll:function(i){if(o&&clearTimeout(o),o=null,h.notices&&h.notices.length)t.each(h.notices,function(){var t=this.options.stack;t&&(t.overlay&&t.overlay.hide(),t.nextpos1=t.firstpos1,t.nextpos2=t.firstpos2,t.addpos2=0,t.animation=i)}),t.each(h.notices,function(){this.position()});else{var e=h.prototype.options.stack;e&&(delete e.nextpos1,delete e.nextpos2)}},styling:{brighttheme:{container:"brighttheme",notice:"brighttheme-notice",notice_icon:"brighttheme-icon-notice",info:"brighttheme-info",info_icon:"brighttheme-icon-info",success:"brighttheme-success",success_icon:"brighttheme-icon-success",error:"brighttheme-error",error_icon:"brighttheme-icon-error"},jqueryui:{container:"ui-widget ui-widget-content ui-corner-all",notice:"ui-state-highlight",notice_icon:"ui-icon ui-icon-info",info:"",info_icon:"ui-icon ui-icon-info",success:"ui-state-default",success_icon:"ui-icon ui-icon-circle-check",error:"ui-state-error",error_icon:"ui-icon ui-icon-alert"},bootstrap3:{container:"alert",notice:"alert-warning",notice_icon:"glyphicon glyphicon-exclamation-sign",info:"alert-info",info_icon:"glyphicon glyphicon-info-sign",success:"alert-success",success_icon:"glyphicon glyphicon-ok-sign",error:"alert-danger",error_icon:"glyphicon glyphicon-warning-sign"}}}),h.styling.fontawesome=t.extend({},h.styling.bootstrap3),t.extend(h.styling.fontawesome,{notice_icon:"fa fa-exclamation-circle",info_icon:"fa fa-info",success_icon:"fa fa-check",error_icon:"fa fa-warning"}),i.document.body?a():t(a),h};return e(i)})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(t,i,e){var o=t("keymaster"),n=t("modules/message"),s=function(t,i){o(t,i)},r=function(t){return $(t).trigger("click"),!1},a=function(){s("ctrl+s",function(t,i){r(".t-Button[onclick*=\"'CREATE'\"],.t-Button#CREATE")}),s("ctrl+s",function(t,i){r(".t-Button[onclick*=\"'SAVE'\"],.t-Button#SAVE")}),s("ctrl+d",function(t,i){r(".t-Button[onclick*=\"'DELETE'\"],.t-Button#DELETE")}),s("ctrl+m",function(t,i){n.info({title:"A key was pressed",text:"ctrl+m"})})};i.exports={defaultShortcuts:a}},{keymaster:2,"modules/message":5}],5:[function(t,i,e){var o=window.$,n=t("pnotify"),s={hide:!1,closer:!0,buttons:{closer_hover:!1,sticker:!1,labels:{close:"Sluit melding"}}},r=function(t){switch(typeof t){case"string":return o.extend({title:t},s);case"object":return o.extend(t,s);default:return s}},a=function(t){return new n(o.extend(r(t),{type:"info",hide:!0}))},c=function(t){return new n(o.extend(r(t),{type:"success",hide:!0}))},h=function(t){return new n(o.extend(r(t),{type:"warning"}))},l=function(t){return new n(o.extend(r(t),{type:"error"}))};i.exports={info:a,success:c,warning:h,error:l}},{pnotify:3}],6:[function(t,i,e){$.widget("custom.customReport",{options:{exceptClass:"no-row-link",activeClass:"active",columns:[],rowclick:function(t,i){$(this).customReport("openLink",t)}},_create:function(){var t=this;this._rowLinkAllowed&&this._initRowClick(),$(this.element).on("apexafterrefresh",function(i){t._apexafterrefresh()})},_apexafterrefresh:function(){this._rowLinkAllowed&&this._initRowClick()},_initRowClick:function(t){var i,e=this;t=$.proxy(t,e),this._off(this.element,"click tr td:not(:has(a))"),this._off(this.element,"hover tr td:not(:has(a))"),this._on(this.element,{"mouseenter tr td:not(:has(a))":function(t){$(t.target).css("cursor","pointer")}}),this._on(this.element,{"click tr td:not(:has(a))":function(t){e._trigger("rowclick",t,i),t.stopImmediatePropagation()}})},openLink:function(t,i){var e=this,o={aPos:0},n=$.extend(i,o),s=e._getLinkElement(n,t.currentTarget),r=s.attr("href");void 0!=r&&(window.location.href=r)},_getLinkElement:function(t,i){var e=$(i).closest("tr").find("td:has(a)");return e.length