UNPKG

704 kBJavaScriptView Raw
1/*! angular-onsenui.js for onsenui - v2.0.4 - 2016-11-04 */
2"use strict";
3
4/* Simple JavaScript Inheritance for ES 5.1
5 * based on http://ejohn.org/blog/simple-javascript-inheritance/
6 * (inspired by base2 and Prototype)
7 * MIT Licensed.
8 */
9(function () {
10 "use strict";
11
12 var fnTest = /xyz/.test(function () {
13 xyz;
14 }) ? /\b_super\b/ : /.*/;
15
16 // The base Class implementation (does nothing)
17 function BaseClass() {}
18
19 // Create a new Class that inherits from this class
20 BaseClass.extend = function (props) {
21 var _super = this.prototype;
22
23 // Set up the prototype to inherit from the base class
24 // (but without running the init constructor)
25 var proto = Object.create(_super);
26
27 // Copy the properties over onto the new prototype
28 for (var name in props) {
29 // Check if we're overwriting an existing function
30 proto[name] = typeof props[name] === "function" && typeof _super[name] == "function" && fnTest.test(props[name]) ? function (name, fn) {
31 return function () {
32 var tmp = this._super;
33
34 // Add a new ._super() method that is the same method
35 // but on the super-class
36 this._super = _super[name];
37
38 // The method only need to be bound temporarily, so we
39 // remove it when we're done executing
40 var ret = fn.apply(this, arguments);
41 this._super = tmp;
42
43 return ret;
44 };
45 }(name, props[name]) : props[name];
46 }
47
48 // The new constructor
49 var newClass = typeof proto.init === "function" ? proto.hasOwnProperty("init") ? proto.init // All construction is actually done in the init method
50 : function SubClass() {
51 _super.init.apply(this, arguments);
52 } : function EmptyClass() {};
53
54 // Populate our constructed prototype object
55 newClass.prototype = proto;
56
57 // Enforce the constructor to be what we expect
58 proto.constructor = newClass;
59
60 // And make this class extendable
61 newClass.extend = BaseClass.extend;
62
63 return newClass;
64 };
65
66 // export
67 window.Class = BaseClass;
68})();
69"use strict";
70
71//HEAD
72(function (app) {
73 try {
74 app = angular.module("templates-main");
75 } catch (err) {
76 app = angular.module("templates-main", []);
77 }
78 app.run(["$templateCache", function ($templateCache) {
79 "use strict";
80
81 $templateCache.put("templates/sliding_menu.tpl", "<div class=\"onsen-sliding-menu__menu\"></div>\n" + "<div class=\"onsen-sliding-menu__main\"></div>\n" + "");
82
83 $templateCache.put("templates/split_view.tpl", "<div class=\"onsen-split-view__secondary full-screen\"></div>\n" + "<div class=\"onsen-split-view__main full-screen\"></div>\n" + "");
84 }]);
85})();
86'use strict';
87
88/*
89Copyright 2013-2015 ASIAL CORPORATION
90
91Licensed under the Apache License, Version 2.0 (the "License");
92you may not use this file except in compliance with the License.
93You may obtain a copy of the License at
94
95 http://www.apache.org/licenses/LICENSE-2.0
96
97Unless required by applicable law or agreed to in writing, software
98distributed under the License is distributed on an "AS IS" BASIS,
99WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
100See the License for the specific language governing permissions and
101limitations under the License.
102
103*/
104
105/**
106 * @object ons
107 * @description
108 * [ja]Onsen UIで利用できるグローバルなオブジェクトです。このオブジェクトは、AngularJSのスコープから参照することができます。 [/ja]
109 * [en]A global object that's used in Onsen UI. This object can be reached from the AngularJS scope.[/en]
110 */
111
112(function (ons) {
113 'use strict';
114
115 var module = angular.module('onsen', ['templates-main']);
116 angular.module('onsen.directives', ['onsen']); // for BC
117
118 // JS Global facade for Onsen UI.
119 initOnsenFacade();
120 waitOnsenUILoad();
121 initAngularModule();
122 initTemplateCache();
123
124 function waitOnsenUILoad() {
125 var unlockOnsenUI = ons._readyLock.lock();
126 module.run(['$compile', '$rootScope', function ($compile, $rootScope) {
127 // for initialization hook.
128 if (document.readyState === 'loading' || document.readyState == 'uninitialized') {
129 window.addEventListener('DOMContentLoaded', function () {
130 document.body.appendChild(document.createElement('ons-dummy-for-init'));
131 });
132 } else if (document.body) {
133 document.body.appendChild(document.createElement('ons-dummy-for-init'));
134 } else {
135 throw new Error('Invalid initialization state.');
136 }
137
138 $rootScope.$on('$ons-ready', unlockOnsenUI);
139 }]);
140 }
141
142 function initAngularModule() {
143 module.value('$onsGlobal', ons);
144 module.run(['$compile', '$rootScope', '$onsen', '$q', function ($compile, $rootScope, $onsen, $q) {
145 ons._onsenService = $onsen;
146 ons._qService = $q;
147
148 $rootScope.ons = window.ons;
149 $rootScope.console = window.console;
150 $rootScope.alert = window.alert;
151
152 ons.$compile = $compile;
153 }]);
154 }
155
156 function initTemplateCache() {
157 module.run(['$templateCache', function ($templateCache) {
158 var tmp = ons._internal.getTemplateHTMLAsync;
159
160 ons._internal.getTemplateHTMLAsync = function (page) {
161 var cache = $templateCache.get(page);
162
163 if (cache) {
164 return Promise.resolve(cache);
165 } else {
166 return tmp(page);
167 }
168 };
169 }]);
170 }
171
172 function initOnsenFacade() {
173 ons._onsenService = null;
174
175 // Object to attach component variables to when using the var="..." attribute.
176 // Can be set to null to avoid polluting the global scope.
177 ons.componentBase = window;
178
179 /**
180 * @method bootstrap
181 * @signature bootstrap([moduleName, [dependencies]])
182 * @description
183 * [ja]Onsen UIの初期化を行います。Angular.jsのng-app属性を利用すること無しにOnsen UIを読み込んで初期化してくれます。[/ja]
184 * [en]Initialize Onsen UI. Can be used to load Onsen UI without using the <code>ng-app</code> attribute from AngularJS.[/en]
185 * @param {String} [moduleName]
186 * [en]AngularJS module name.[/en]
187 * [ja]Angular.jsでのモジュール名[/ja]
188 * @param {Array} [dependencies]
189 * [en]List of AngularJS module dependencies.[/en]
190 * [ja]依存するAngular.jsのモジュール名の配列[/ja]
191 * @return {Object}
192 * [en]An AngularJS module object.[/en]
193 * [ja]AngularJSのModuleオブジェクトを表します。[/ja]
194 */
195 ons.bootstrap = function (name, deps) {
196 if (angular.isArray(name)) {
197 deps = name;
198 name = undefined;
199 }
200
201 if (!name) {
202 name = 'myOnsenApp';
203 }
204
205 deps = ['onsen'].concat(angular.isArray(deps) ? deps : []);
206 var module = angular.module(name, deps);
207
208 var doc = window.document;
209 if (doc.readyState == 'loading' || doc.readyState == 'uninitialized' || doc.readyState == 'interactive') {
210 doc.addEventListener('DOMContentLoaded', function () {
211 angular.bootstrap(doc.documentElement, [name]);
212 }, false);
213 } else if (doc.documentElement) {
214 angular.bootstrap(doc.documentElement, [name]);
215 } else {
216 throw new Error('Invalid state');
217 }
218
219 return module;
220 };
221
222 /**
223 * @method findParentComponentUntil
224 * @signature findParentComponentUntil(name, [dom])
225 * @param {String} name
226 * [en]Name of component, i.e. 'ons-page'.[/en]
227 * [ja]コンポーネント名を指定します。例えばons-pageなどを指定します。[/ja]
228 * @param {Object/jqLite/HTMLElement} [dom]
229 * [en]$event, jqLite or HTMLElement object.[/en]
230 * [ja]$eventオブジェクト、jqLiteオブジェクト、HTMLElementオブジェクトのいずれかを指定できます。[/ja]
231 * @return {Object}
232 * [en]Component object. Will return null if no component was found.[/en]
233 * [ja]コンポーネントのオブジェクトを返します。もしコンポーネントが見つからなかった場合にはnullを返します。[/ja]
234 * @description
235 * [en]Find parent component object of <code>dom</code> element.[/en]
236 * [ja]指定されたdom引数の親要素をたどってコンポーネントを検索します。[/ja]
237 */
238 ons.findParentComponentUntil = function (name, dom) {
239 var element;
240 if (dom instanceof HTMLElement) {
241 element = angular.element(dom);
242 } else if (dom instanceof angular.element) {
243 element = dom;
244 } else if (dom.target) {
245 element = angular.element(dom.target);
246 }
247
248 return element.inheritedData(name);
249 };
250
251 /**
252 * @method findComponent
253 * @signature findComponent(selector, [dom])
254 * @param {String} selector
255 * [en]CSS selector[/en]
256 * [ja]CSSセレクターを指定します。[/ja]
257 * @param {HTMLElement} [dom]
258 * [en]DOM element to search from.[/en]
259 * [ja]検索対象とするDOM要素を指定します。[/ja]
260 * @return {Object/null}
261 * [en]Component object. Will return null if no component was found.[/en]
262 * [ja]コンポーネントのオブジェクトを返します。もしコンポーネントが見つからなかった場合にはnullを返します。[/ja]
263 * @description
264 * [en]Find component object using CSS selector.[/en]
265 * [ja]CSSセレクタを使ってコンポーネントのオブジェクトを検索します。[/ja]
266 */
267 ons.findComponent = function (selector, dom) {
268 var target = (dom ? dom : document).querySelector(selector);
269 return target ? angular.element(target).data(target.nodeName.toLowerCase()) || null : null;
270 };
271
272 /**
273 * @method compile
274 * @signature compile(dom)
275 * @param {HTMLElement} dom
276 * [en]Element to compile.[/en]
277 * [ja]コンパイルする要素を指定します。[/ja]
278 * @description
279 * [en]Compile Onsen UI components.[/en]
280 * [ja]通常のHTMLの要素をOnsen UIのコンポーネントにコンパイルします。[/ja]
281 */
282 ons.compile = function (dom) {
283 if (!ons.$compile) {
284 throw new Error('ons.$compile() is not ready. Wait for initialization with ons.ready().');
285 }
286
287 if (!(dom instanceof HTMLElement)) {
288 throw new Error('First argument must be an instance of HTMLElement.');
289 }
290
291 var scope = angular.element(dom).scope();
292 if (!scope) {
293 throw new Error('AngularJS Scope is null. Argument DOM element must be attached in DOM document.');
294 }
295
296 ons.$compile(dom)(scope);
297 };
298
299 ons._getOnsenService = function () {
300 if (!this._onsenService) {
301 throw new Error('$onsen is not loaded, wait for ons.ready().');
302 }
303
304 return this._onsenService;
305 };
306
307 /**
308 * @param {String} elementName
309 * @param {Function} lastReady
310 * @return {Function}
311 */
312 ons._waitDiretiveInit = function (elementName, lastReady) {
313 return function (element, callback) {
314 if (angular.element(element).data(elementName)) {
315 lastReady(element, callback);
316 } else {
317 var listen = function listen() {
318 lastReady(element, callback);
319 element.removeEventListener(elementName + ':init', listen, false);
320 };
321 element.addEventListener(elementName + ':init', listen, false);
322 }
323 };
324 };
325
326 /**
327 * @method createAlertDialog
328 * @signature createAlertDialog(page, [options])
329 * @param {String} page
330 * [en]Page name. Can be either an HTML file or an <ons-template> containing a <ons-alert-dialog> component.[/en]
331 * [ja]pageのURLか、もしくはons-templateで宣言したテンプレートのid属性の値を指定できます。[/ja]
332 * @param {Object} [options]
333 * [en]Parameter object.[/en]
334 * [ja]オプションを指定するオブジェクト。[/ja]
335 * @param {Object} [options.parentScope]
336 * [en]Parent scope of the dialog. Used to bind models and access scope methods from the dialog.[/en]
337 * [ja]ダイアログ内で利用する親スコープを指定します。ダイアログからモデルやスコープのメソッドにアクセスするのに使います。このパラメータはAngularJSバインディングでのみ利用できます。[/ja]
338 * @return {Promise}
339 * [en]Promise object that resolves to the alert dialog component object.[/en]
340 * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
341 * @description
342 * [en]Create a alert dialog instance from a template.[/en]
343 * [ja]テンプレートからアラートダイアログのインスタンスを生成します。[/ja]
344 */
345 ons.createAlertDialog = function (page, options) {
346 options = options || {};
347
348 options.link = function (element) {
349 if (options.parentScope) {
350 ons.$compile(angular.element(element))(options.parentScope.$new());
351 options.parentScope.$evalAsync();
352 } else {
353 ons.compile(element);
354 }
355 };
356
357 return ons._createAlertDialogOriginal(page, options).then(function (alertDialog) {
358 return angular.element(alertDialog).data('ons-alert-dialog');
359 });
360 };
361
362 /**
363 * @method createDialog
364 * @signature createDialog(page, [options])
365 * @param {String} page
366 * [en]Page name. Can be either an HTML file or an <ons-template> containing a <ons-dialog> component.[/en]
367 * [ja]pageのURLか、もしくはons-templateで宣言したテンプレートのid属性の値を指定できます。[/ja]
368 * @param {Object} [options]
369 * [en]Parameter object.[/en]
370 * [ja]オプションを指定するオブジェクト。[/ja]
371 * @param {Object} [options.parentScope]
372 * [en]Parent scope of the dialog. Used to bind models and access scope methods from the dialog.[/en]
373 * [ja]ダイアログ内で利用する親スコープを指定します。ダイアログからモデルやスコープのメソッドにアクセスするのに使います。このパラメータはAngularJSバインディングでのみ利用できます。[/ja]
374 * @return {Promise}
375 * [en]Promise object that resolves to the dialog component object.[/en]
376 * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
377 * @description
378 * [en]Create a dialog instance from a template.[/en]
379 * [ja]テンプレートからダイアログのインスタンスを生成します。[/ja]
380 */
381 ons.createDialog = function (page, options) {
382 options = options || {};
383
384 options.link = function (element) {
385 if (options.parentScope) {
386 ons.$compile(angular.element(element))(options.parentScope.$new());
387 options.parentScope.$evalAsync();
388 } else {
389 ons.compile(element);
390 }
391 };
392
393 return ons._createDialogOriginal(page, options).then(function (dialog) {
394 return angular.element(dialog).data('ons-dialog');
395 });
396 };
397
398 /**
399 * @method createPopover
400 * @signature createPopover(page, [options])
401 * @param {String} page
402 * [en]Page name. Can be either an HTML file or an <ons-template> containing a <ons-dialog> component.[/en]
403 * [ja]pageのURLか、もしくはons-templateで宣言したテンプレートのid属性の値を指定できます。[/ja]
404 * @param {Object} [options]
405 * [en]Parameter object.[/en]
406 * [ja]オプションを指定するオブジェクト。[/ja]
407 * @param {Object} [options.parentScope]
408 * [en]Parent scope of the dialog. Used to bind models and access scope methods from the dialog.[/en]
409 * [ja]ダイアログ内で利用する親スコープを指定します。ダイアログからモデルやスコープのメソッドにアクセスするのに使います。このパラメータはAngularJSバインディングでのみ利用できます。[/ja]
410 * @return {Promise}
411 * [en]Promise object that resolves to the popover component object.[/en]
412 * [ja]ポップオーバーのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
413 * @description
414 * [en]Create a popover instance from a template.[/en]
415 * [ja]テンプレートからポップオーバーのインスタンスを生成します。[/ja]
416 */
417 ons.createPopover = function (page, options) {
418 options = options || {};
419
420 options.link = function (element) {
421 if (options.parentScope) {
422 ons.$compile(angular.element(element))(options.parentScope.$new());
423 options.parentScope.$evalAsync();
424 } else {
425 ons.compile(element);
426 }
427 };
428
429 return ons._createPopoverOriginal(page, options).then(function (popover) {
430 return angular.element(popover).data('ons-popover');
431 });
432 };
433
434 /**
435 * @param {String} page
436 */
437 ons.resolveLoadingPlaceholder = function (page) {
438 return ons._resolveLoadingPlaceholderOriginal(page, function (element, done) {
439 ons.compile(element);
440 angular.element(element).scope().$evalAsync(function () {
441 setImmediate(done);
442 });
443 });
444 };
445
446 ons._setupLoadingPlaceHolders = function () {
447 // Do nothing
448 };
449 }
450})(window.ons = window.ons || {});
451'use strict';
452
453/*
454Copyright 2013-2015 ASIAL CORPORATION
455
456Licensed under the Apache License, Version 2.0 (the "License");
457you may not use this file except in compliance with the License.
458You may obtain a copy of the License at
459
460 http://www.apache.org/licenses/LICENSE-2.0
461
462Unless required by applicable law or agreed to in writing, software
463distributed under the License is distributed on an "AS IS" BASIS,
464WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
465See the License for the specific language governing permissions and
466limitations under the License.
467
468*/
469
470(function () {
471 'use strict';
472
473 var module = angular.module('onsen');
474
475 module.factory('AlertDialogView', ['$onsen', function ($onsen) {
476
477 var AlertDialogView = Class.extend({
478
479 /**
480 * @param {Object} scope
481 * @param {jqLite} element
482 * @param {Object} attrs
483 */
484 init: function init(scope, element, attrs) {
485 this._scope = scope;
486 this._element = element;
487 this._attrs = attrs;
488
489 this._clearDerivingMethods = $onsen.deriveMethods(this, this._element[0], ['show', 'hide']);
490
491 this._clearDerivingEvents = $onsen.deriveEvents(this, this._element[0], ['preshow', 'postshow', 'prehide', 'posthide', 'cancel'], function (detail) {
492 if (detail.alertDialog) {
493 detail.alertDialog = this;
494 }
495 return detail;
496 }.bind(this));
497
498 this._scope.$on('$destroy', this._destroy.bind(this));
499 },
500
501 _destroy: function _destroy() {
502 this.emit('destroy');
503
504 this._element.remove();
505
506 this._clearDerivingMethods();
507 this._clearDerivingEvents();
508
509 this._scope = this._attrs = this._element = null;
510 }
511
512 });
513
514 MicroEvent.mixin(AlertDialogView);
515 $onsen.derivePropertiesFromElement(AlertDialogView, ['disabled', 'cancelable', 'visible', 'onDeviceBackButton']);
516
517 return AlertDialogView;
518 }]);
519})();
520'use strict';
521
522/*
523Copyright 2013-2015 ASIAL CORPORATION
524
525Licensed under the Apache License, Version 2.0 (the "License");
526you may not use this file except in compliance with the License.
527You may obtain a copy of the License at
528
529 http://www.apache.org/licenses/LICENSE-2.0
530
531Unless required by applicable law or agreed to in writing, software
532distributed under the License is distributed on an "AS IS" BASIS,
533WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
534See the License for the specific language governing permissions and
535limitations under the License.
536
537*/
538
539angular.module('onsen').value('AlertDialogAnimator', ons._internal.AlertDialogAnimator).value('AndroidAlertDialogAnimator', ons._internal.AndroidAlertDialogAnimator).value('IOSAlertDialogAnimator', ons._internal.IOSAlertDialogAnimator);
540'use strict';
541
542/*
543Copyright 2013-2015 ASIAL CORPORATION
544
545Licensed under the Apache License, Version 2.0 (the "License");
546you may not use this file except in compliance with the License.
547You may obtain a copy of the License at
548
549 http://www.apache.org/licenses/LICENSE-2.0
550
551Unless required by applicable law or agreed to in writing, software
552distributed under the License is distributed on an "AS IS" BASIS,
553WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
554See the License for the specific language governing permissions and
555limitations under the License.
556
557*/
558
559angular.module('onsen').value('AnimationChooser', ons._internal.AnimatorFactory);
560'use strict';
561
562/*
563Copyright 2013-2015 ASIAL CORPORATION
564
565Licensed under the Apache License, Version 2.0 (the "License");
566you may not use this file except in compliance with the License.
567You may obtain a copy of the License at
568
569 http://www.apache.org/licenses/LICENSE-2.0
570
571Unless required by applicable law or agreed to in writing, software
572distributed under the License is distributed on an "AS IS" BASIS,
573WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
574See the License for the specific language governing permissions and
575limitations under the License.
576
577*/
578
579(function () {
580 'use strict';
581
582 var module = angular.module('onsen');
583
584 module.factory('CarouselView', ['$onsen', function ($onsen) {
585
586 /**
587 * @class CarouselView
588 */
589 var CarouselView = Class.extend({
590
591 /**
592 * @param {Object} scope
593 * @param {jqLite} element
594 * @param {Object} attrs
595 */
596 init: function init(scope, element, attrs) {
597 this._element = element;
598 this._scope = scope;
599 this._attrs = attrs;
600
601 this._scope.$on('$destroy', this._destroy.bind(this));
602
603 this._clearDerivingMethods = $onsen.deriveMethods(this, element[0], ['setActiveIndex', 'getActiveIndex', 'next', 'prev', 'refresh', 'first', 'last']);
604
605 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['refresh', 'postchange', 'overscroll'], function (detail) {
606 if (detail.carousel) {
607 detail.carousel = this;
608 }
609 return detail;
610 }.bind(this));
611 },
612
613 _destroy: function _destroy() {
614 this.emit('destroy');
615
616 this._clearDerivingEvents();
617 this._clearDerivingMethods();
618
619 this._element = this._scope = this._attrs = null;
620 }
621 });
622
623 MicroEvent.mixin(CarouselView);
624
625 $onsen.derivePropertiesFromElement(CarouselView, ['centered', 'overscrollable', 'disabled', 'autoScroll', 'swipeable', 'autoScrollRatio', 'itemCount']);
626
627 return CarouselView;
628 }]);
629})();
630'use strict';
631
632/*
633Copyright 2013-2015 ASIAL CORPORATION
634
635Licensed under the Apache License, Version 2.0 (the "License");
636you may not use this file except in compliance with the License.
637You may obtain a copy of the License at
638
639 http://www.apache.org/licenses/LICENSE-2.0
640
641Unless required by applicable law or agreed to in writing, software
642distributed under the License is distributed on an "AS IS" BASIS,
643WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
644See the License for the specific language governing permissions and
645limitations under the License.
646
647*/
648
649(function () {
650 'use strict';
651
652 var module = angular.module('onsen');
653
654 module.factory('DialogView', ['$onsen', function ($onsen) {
655
656 var DialogView = Class.extend({
657
658 init: function init(scope, element, attrs) {
659 this._scope = scope;
660 this._element = element;
661 this._attrs = attrs;
662
663 this._clearDerivingMethods = $onsen.deriveMethods(this, this._element[0], ['show', 'hide']);
664
665 this._clearDerivingEvents = $onsen.deriveEvents(this, this._element[0], ['preshow', 'postshow', 'prehide', 'posthide', 'cancel'], function (detail) {
666 if (detail.dialog) {
667 detail.dialog = this;
668 }
669 return detail;
670 }.bind(this));
671
672 this._scope.$on('$destroy', this._destroy.bind(this));
673 },
674
675 _destroy: function _destroy() {
676 this.emit('destroy');
677
678 this._element.remove();
679 this._clearDerivingMethods();
680 this._clearDerivingEvents();
681
682 this._scope = this._attrs = this._element = null;
683 }
684 });
685
686 DialogView.registerAnimator = function (name, Animator) {
687 return window.ons.DialogElement.registerAnimator(name, Animator);
688 };
689
690 MicroEvent.mixin(DialogView);
691 $onsen.derivePropertiesFromElement(DialogView, ['disabled', 'cancelable', 'visible', 'onDeviceBackButton']);
692
693 return DialogView;
694 }]);
695})();
696'use strict';
697
698/*
699Copyright 2013-2015 ASIAL CORPORATION
700
701 Licensed under the Apache License, Version 2.0 (the "License");
702 you may not use this file except in compliance with the License.
703 You may obtain a copy of the License at
704
705http://www.apache.org/licenses/LICENSE-2.0
706
707Unless required by applicable law or agreed to in writing, software
708distributed under the License is distributed on an "AS IS" BASIS,
709WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
710See the License for the specific language governing permissions and
711limitations under the License.
712
713*/
714
715angular.module('onsen').value('DialogAnimator', ons._internal.DialogAnimator).value('IOSDialogAnimator', ons._internal.IOSDialogAnimator).value('AndroidDialogAnimator', ons._internal.AndroidDialogAnimator).value('SlideDialogAnimator', ons._internal.SlideDialogAnimator);
716'use strict';
717
718/*
719Copyright 2013-2015 ASIAL CORPORATION
720
721Licensed under the Apache License, Version 2.0 (the "License");
722you may not use this file except in compliance with the License.
723You may obtain a copy of the License at
724
725 http://www.apache.org/licenses/LICENSE-2.0
726
727Unless required by applicable law or agreed to in writing, software
728distributed under the License is distributed on an "AS IS" BASIS,
729WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
730See the License for the specific language governing permissions and
731limitations under the License.
732
733*/
734
735(function () {
736 'use strict';
737
738 var module = angular.module('onsen');
739
740 module.factory('FabView', ['$onsen', function ($onsen) {
741
742 /**
743 * @class FabView
744 */
745 var FabView = Class.extend({
746
747 /**
748 * @param {Object} scope
749 * @param {jqLite} element
750 * @param {Object} attrs
751 */
752 init: function init(scope, element, attrs) {
753 this._element = element;
754 this._scope = scope;
755 this._attrs = attrs;
756
757 this._scope.$on('$destroy', this._destroy.bind(this));
758
759 this._clearDerivingMethods = $onsen.deriveMethods(this, element[0], ['show', 'hide', 'toggle']);
760 },
761
762 _destroy: function _destroy() {
763 this.emit('destroy');
764 this._clearDerivingMethods();
765
766 this._element = this._scope = this._attrs = null;
767 }
768 });
769
770 $onsen.derivePropertiesFromElement(FabView, ['disabled', 'visible']);
771
772 MicroEvent.mixin(FabView);
773
774 return FabView;
775 }]);
776})();
777'use strict';
778
779/*
780Copyright 2013-2015 ASIAL CORPORATION
781
782Licensed under the Apache License, Version 2.0 (the "License");
783you may not use this file except in compliance with the License.
784You may obtain a copy of the License at
785
786 http://www.apache.org/licenses/LICENSE-2.0
787
788Unless required by applicable law or agreed to in writing, software
789distributed under the License is distributed on an "AS IS" BASIS,
790WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
791See the License for the specific language governing permissions and
792limitations under the License.
793
794*/
795
796(function () {
797 'use strict';
798
799 angular.module('onsen').factory('GenericView', ['$onsen', function ($onsen) {
800
801 var GenericView = Class.extend({
802
803 /**
804 * @param {Object} scope
805 * @param {jqLite} element
806 * @param {Object} attrs
807 * @param {Object} [options]
808 * @param {Boolean} [options.directiveOnly]
809 * @param {Function} [options.onDestroy]
810 * @param {String} [options.modifierTemplate]
811 */
812 init: function init(scope, element, attrs, options) {
813 var self = this;
814 options = {};
815
816 this._element = element;
817 this._scope = scope;
818 this._attrs = attrs;
819
820 if (options.directiveOnly) {
821 if (!options.modifierTemplate) {
822 throw new Error('options.modifierTemplate is undefined.');
823 }
824 $onsen.addModifierMethods(this, options.modifierTemplate, element);
825 } else {
826 $onsen.addModifierMethodsForCustomElements(this, element);
827 }
828
829 $onsen.cleaner.onDestroy(scope, function () {
830 self._events = undefined;
831 $onsen.removeModifierMethods(self);
832
833 if (options.onDestroy) {
834 options.onDestroy(self);
835 }
836
837 $onsen.clearComponent({
838 scope: scope,
839 attrs: attrs,
840 element: element
841 });
842
843 self = element = self._element = self._scope = scope = self._attrs = attrs = options = null;
844 });
845 }
846 });
847
848 /**
849 * @param {Object} scope
850 * @param {jqLite} element
851 * @param {Object} attrs
852 * @param {Object} options
853 * @param {String} options.viewKey
854 * @param {Boolean} [options.directiveOnly]
855 * @param {Function} [options.onDestroy]
856 * @param {String} [options.modifierTemplate]
857 */
858 GenericView.register = function (scope, element, attrs, options) {
859 var view = new GenericView(scope, element, attrs, options);
860
861 if (!options.viewKey) {
862 throw new Error('options.viewKey is required.');
863 }
864
865 $onsen.declareVarAttribute(attrs, view);
866 element.data(options.viewKey, view);
867
868 var destroy = options.onDestroy || angular.noop;
869 options.onDestroy = function (view) {
870 destroy(view);
871 element.data(options.viewKey, null);
872 };
873
874 return view;
875 };
876
877 MicroEvent.mixin(GenericView);
878
879 return GenericView;
880 }]);
881})();
882'use strict';
883
884/*
885Copyright 2013-2015 ASIAL CORPORATION
886
887Licensed under the Apache License, Version 2.0 (the "License");
888you may not use this file except in compliance with the License.
889You may obtain a copy of the License at
890
891 http://www.apache.org/licenses/LICENSE-2.0
892
893Unless required by applicable law or agreed to in writing, software
894distributed under the License is distributed on an "AS IS" BASIS,
895WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
896See the License for the specific language governing permissions and
897limitations under the License.
898
899*/
900
901(function () {
902 'use strict';
903
904 var module = angular.module('onsen');
905
906 module.factory('LazyRepeatView', ['AngularLazyRepeatDelegate', function (AngularLazyRepeatDelegate) {
907
908 var LazyRepeatView = Class.extend({
909
910 /**
911 * @param {Object} scope
912 * @param {jqLite} element
913 * @param {Object} attrs
914 */
915 init: function init(scope, element, attrs, linker) {
916 var _this = this;
917
918 this._element = element;
919 this._scope = scope;
920 this._attrs = attrs;
921 this._linker = linker;
922
923 ons._util.updateParentPosition(element[0]);
924
925 var userDelegate = this._scope.$eval(this._attrs.onsLazyRepeat);
926
927 var internalDelegate = new AngularLazyRepeatDelegate(userDelegate, element[0], element.scope());
928
929 this._provider = new ons._internal.LazyRepeatProvider(element[0].parentNode, internalDelegate);
930
931 // Expose refresh method to user.
932 userDelegate.refresh = this._provider.refresh.bind(this._provider);
933
934 element.remove();
935
936 // Render when number of items change.
937 this._scope.$watch(internalDelegate.countItems.bind(internalDelegate), this._provider._onChange.bind(this._provider));
938
939 this._scope.$on('$destroy', function () {
940 _this._element = _this._scope = _this._attrs = _this._linker = null;
941 });
942 }
943 });
944
945 return LazyRepeatView;
946 }]);
947})();
948'use strict';
949
950var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
951
952var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
953
954function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
955
956function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
957
958function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
959
960/*
961Copyright 2013-2015 ASIAL CORPORATION
962
963Licensed under the Apache License, Version 2.0 (the "License");
964you may not use this file except in compliance with the License.
965You may obtain a copy of the License at
966
967 http://www.apache.org/licenses/LICENSE-2.0
968
969Unless required by applicable law or agreed to in writing, software
970distributed under the License is distributed on an "AS IS" BASIS,
971WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
972See the License for the specific language governing permissions and
973limitations under the License.
974
975*/
976
977(function () {
978 'use strict';
979
980 angular.module('onsen').factory('AngularLazyRepeatDelegate', ['$compile', function ($compile) {
981
982 var directiveAttributes = ['ons-lazy-repeat', 'ons:lazy:repeat', 'ons_lazy_repeat', 'data-ons-lazy-repeat', 'x-ons-lazy-repeat'];
983
984 var AngularLazyRepeatDelegate = function (_ons$_internal$LazyRe) {
985 _inherits(AngularLazyRepeatDelegate, _ons$_internal$LazyRe);
986
987 /**
988 * @param {Object} userDelegate
989 * @param {Element} templateElement
990 * @param {Scope} parentScope
991 */
992 function AngularLazyRepeatDelegate(userDelegate, templateElement, parentScope) {
993 _classCallCheck(this, AngularLazyRepeatDelegate);
994
995 var _this = _possibleConstructorReturn(this, (AngularLazyRepeatDelegate.__proto__ || Object.getPrototypeOf(AngularLazyRepeatDelegate)).call(this, userDelegate, templateElement));
996
997 _this._parentScope = parentScope;
998
999 directiveAttributes.forEach(function (attr) {
1000 return templateElement.removeAttribute(attr);
1001 });
1002 _this._linker = $compile(templateElement ? templateElement.cloneNode(true) : null);
1003 return _this;
1004 }
1005
1006 _createClass(AngularLazyRepeatDelegate, [{
1007 key: 'configureItemScope',
1008 value: function configureItemScope(item, scope) {
1009 if (this._userDelegate.configureItemScope instanceof Function) {
1010 this._userDelegate.configureItemScope(item, scope);
1011 }
1012 }
1013 }, {
1014 key: 'destroyItemScope',
1015 value: function destroyItemScope(item, element) {
1016 if (this._userDelegate.destroyItemScope instanceof Function) {
1017 this._userDelegate.destroyItemScope(item, element);
1018 }
1019 }
1020 }, {
1021 key: '_usingBinding',
1022 value: function _usingBinding() {
1023 if (this._userDelegate.configureItemScope) {
1024 return true;
1025 }
1026
1027 if (this._userDelegate.createItemContent) {
1028 return false;
1029 }
1030
1031 throw new Error('`lazy-repeat` delegate object is vague.');
1032 }
1033 }, {
1034 key: 'loadItemElement',
1035 value: function loadItemElement(index, parent, done) {
1036 this._prepareItemElement(index, function (_ref) {
1037 var element = _ref.element,
1038 scope = _ref.scope;
1039
1040 parent.appendChild(element);
1041 done({ element: element, scope: scope });
1042 });
1043 }
1044 }, {
1045 key: '_prepareItemElement',
1046 value: function _prepareItemElement(index, done) {
1047 var _this2 = this;
1048
1049 var scope = this._parentScope.$new();
1050 this._addSpecialProperties(index, scope);
1051
1052 if (this._usingBinding()) {
1053 this.configureItemScope(index, scope);
1054 }
1055
1056 this._linker(scope, function (cloned) {
1057 var element = cloned[0];
1058 if (!_this2._usingBinding()) {
1059 element = _this2._userDelegate.createItemContent(index, element);
1060 $compile(element)(scope);
1061 }
1062
1063 done({ element: element, scope: scope });
1064 });
1065 }
1066
1067 /**
1068 * @param {Number} index
1069 * @param {Object} scope
1070 */
1071
1072 }, {
1073 key: '_addSpecialProperties',
1074 value: function _addSpecialProperties(i, scope) {
1075 var last = this.countItems() - 1;
1076 angular.extend(scope, {
1077 $index: i,
1078 $first: i === 0,
1079 $last: i === last,
1080 $middle: i !== 0 && i !== last,
1081 $even: i % 2 === 0,
1082 $odd: i % 2 === 1
1083 });
1084 }
1085 }, {
1086 key: 'updateItem',
1087 value: function updateItem(index, item) {
1088 var _this3 = this;
1089
1090 if (this._usingBinding()) {
1091 item.scope.$evalAsync(function () {
1092 return _this3.configureItemScope(index, item.scope);
1093 });
1094 } else {
1095 _get(AngularLazyRepeatDelegate.prototype.__proto__ || Object.getPrototypeOf(AngularLazyRepeatDelegate.prototype), 'updateItem', this).call(this, index, item);
1096 }
1097 }
1098
1099 /**
1100 * @param {Number} index
1101 * @param {Object} item
1102 * @param {Object} item.scope
1103 * @param {Element} item.element
1104 */
1105
1106 }, {
1107 key: 'destroyItem',
1108 value: function destroyItem(index, item) {
1109 if (this._usingBinding()) {
1110 this.destroyItemScope(index, item.scope);
1111 } else {
1112 _get(AngularLazyRepeatDelegate.prototype.__proto__ || Object.getPrototypeOf(AngularLazyRepeatDelegate.prototype), 'destroyItem', this).call(this, index, item.element);
1113 }
1114 item.scope.$destroy();
1115 }
1116 }, {
1117 key: 'destroy',
1118 value: function destroy() {
1119 _get(AngularLazyRepeatDelegate.prototype.__proto__ || Object.getPrototypeOf(AngularLazyRepeatDelegate.prototype), 'destroy', this).call(this);
1120 this._scope = null;
1121 }
1122 }]);
1123
1124 return AngularLazyRepeatDelegate;
1125 }(ons._internal.LazyRepeatDelegate);
1126
1127 return AngularLazyRepeatDelegate;
1128 }]);
1129})();
1130'use strict';
1131
1132/*
1133Copyright 2013-2015 ASIAL CORPORATION
1134
1135Licensed under the Apache License, Version 2.0 (the "License");
1136you may not use this file except in compliance with the License.
1137You may obtain a copy of the License at
1138
1139 http://www.apache.org/licenses/LICENSE-2.0
1140
1141Unless required by applicable law or agreed to in writing, software
1142distributed under the License is distributed on an "AS IS" BASIS,
1143WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1144See the License for the specific language governing permissions and
1145limitations under the License.
1146
1147*/
1148
1149(function () {
1150 'use strict';
1151
1152 var module = angular.module('onsen');
1153
1154 module.value('ModalAnimator', ons._internal.ModalAnimator);
1155 module.value('FadeModalAnimator', ons._internal.FadeModalAnimator);
1156
1157 module.factory('ModalView', ['$onsen', '$parse', function ($onsen, $parse) {
1158
1159 var ModalView = Class.extend({
1160 _element: undefined,
1161 _scope: undefined,
1162
1163 init: function init(scope, element, attrs) {
1164 this._scope = scope;
1165 this._element = element;
1166 this._scope.$on('$destroy', this._destroy.bind(this));
1167
1168 element[0]._animatorFactory.setAnimationOptions($parse(attrs.animationOptions)());
1169 },
1170
1171 show: function show(options) {
1172 return this._element[0].show(options);
1173 },
1174
1175 hide: function hide(options) {
1176 return this._element[0].hide(options);
1177 },
1178
1179 toggle: function toggle(options) {
1180 return this._element[0].toggle(options);
1181 },
1182
1183 _destroy: function _destroy() {
1184 this.emit('destroy', { page: this });
1185
1186 this._events = this._element = this._scope = null;
1187 }
1188 });
1189
1190 ModalView.registerAnimator = function (name, Animator) {
1191 return window.ons.ModalElement.registerAnimator(name, Animator);
1192 };
1193
1194 MicroEvent.mixin(ModalView);
1195 $onsen.derivePropertiesFromElement(ModalView, ['onDeviceBackButton']);
1196
1197 return ModalView;
1198 }]);
1199})();
1200'use strict';
1201
1202/*
1203Copyright 2013-2015 ASIAL CORPORATION
1204
1205Licensed under the Apache License, Version 2.0 (the "License");
1206you may not use this file except in compliance with the License.
1207You may obtain a copy of the License at
1208
1209 http://www.apache.org/licenses/LICENSE-2.0
1210
1211Unless required by applicable law or agreed to in writing, software
1212distributed under the License is distributed on an "AS IS" BASIS,
1213WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1214See the License for the specific language governing permissions and
1215limitations under the License.
1216
1217*/
1218
1219(function () {
1220 'use strict';
1221
1222 var module = angular.module('onsen');
1223
1224 module.factory('NavigatorView', ['$compile', '$onsen', function ($compile, $onsen) {
1225
1226 /**
1227 * Manages the page navigation backed by page stack.
1228 *
1229 * @class NavigatorView
1230 */
1231 var NavigatorView = Class.extend({
1232
1233 /**
1234 * @member {jqLite} Object
1235 */
1236 _element: undefined,
1237
1238 /**
1239 * @member {Object} Object
1240 */
1241 _attrs: undefined,
1242
1243 /**
1244 * @member {Object}
1245 */
1246 _scope: undefined,
1247
1248 /**
1249 * @param {Object} scope
1250 * @param {jqLite} element jqLite Object to manage with navigator
1251 * @param {Object} attrs
1252 */
1253 init: function init(scope, element, attrs) {
1254
1255 this._element = element || angular.element(window.document.body);
1256 this._scope = scope || this._element.scope();
1257 this._attrs = attrs;
1258 this._previousPageScope = null;
1259
1260 this._boundOnPrepop = this._onPrepop.bind(this);
1261 this._boundOnPageDestroy = this._onPageDestroy.bind(this);
1262 this._element.on('prepop', this._boundOnPrepop);
1263 this._element.on('destroy', this._boundOnPageDestroy);
1264
1265 this._scope.$on('$destroy', this._destroy.bind(this));
1266
1267 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['prepush', 'postpush', 'prepop', 'postpop', 'init', 'show', 'hide', 'destroy'], function (detail) {
1268 if (detail.navigator) {
1269 detail.navigator = this;
1270 }
1271 return detail;
1272 }.bind(this));
1273
1274 this._clearDerivingMethods = $onsen.deriveMethods(this, element[0], ['insertPage', 'pushPage', 'bringPageTop', 'popPage', 'replacePage', 'resetToPage', 'canPopPage']);
1275 },
1276
1277 _onPrepop: function _onPrepop(event) {
1278 var pages = event.detail.navigator.pages;
1279 angular.element(pages[pages.length - 2]).data('_scope').$evalAsync();
1280 },
1281
1282 _onPageDestroy: function _onPageDestroy(event) {
1283 var page = event.target;
1284
1285 if (this._element[0] === page.parentNode) {
1286 var scope = angular.element(page).data('_scope');
1287 scope.$destroy();
1288 }
1289 },
1290
1291 _compileAndLink: function _compileAndLink(pageElement, callback) {
1292 var link = $compile(pageElement);
1293 var pageScope = this._createPageScope();
1294 link(pageScope);
1295
1296 /**
1297 * Overwrite page scope.
1298 */
1299 angular.element(pageElement).data('_scope', pageScope);
1300
1301 pageScope.$evalAsync(function () {
1302 callback(pageElement);
1303 });
1304 },
1305
1306 _destroy: function _destroy() {
1307 this.emit('destroy');
1308 this._clearDerivingEvents();
1309 this._clearDerivingMethods();
1310 this._element.off('prepop', this._boundOnPrepop);
1311 this._element.off('destroy', this._boundOnPageDestroy);
1312 this._element = this._scope = this._attrs = null;
1313 },
1314
1315 _createPageScope: function _createPageScope() {
1316 return this._scope.$new();
1317 }
1318 });
1319
1320 MicroEvent.mixin(NavigatorView);
1321 $onsen.derivePropertiesFromElement(NavigatorView, ['pages', 'topPage']);
1322
1323 return NavigatorView;
1324 }]);
1325})();
1326'use strict';
1327
1328/*
1329Copyright 2013-2015 ASIAL CORPORATION
1330
1331 Licensed under the Apache License, Version 2.0 (the "License");
1332 you may not use this file except in compliance with the License.
1333 You may obtain a copy of the License at
1334
1335http://www.apache.org/licenses/LICENSE-2.0
1336
1337Unless required by applicable law or agreed to in writing, software
1338distributed under the License is distributed on an "AS IS" BASIS,
1339WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340See the License for the specific language governing permissions and
1341limitations under the License.
1342
1343*/
1344
1345angular.module('onsen').value('NavigatorTransitionAnimator', ons._internal.NavigatorTransitionAnimator).value('FadeTransitionAnimator', ons._internal.FadeNavigatorTransitionAnimator).value('IOSSlideTransitionAnimator', ons._internal.IOSSlideNavigatorTransitionAnimator).value('LiftTransitionAnimator', ons._internal.LiftNavigatorTransitionAnimator).value('NullTransitionAnimator', ons._internal.NavigatorTransitionAnimator).value('SimpleSlideTransitionAnimator', ons._internal.SimpleSlideNavigatorTransitionAnimator);
1346'use strict';
1347
1348/*
1349Copyright 2013-2015 ASIAL CORPORATION
1350
1351Licensed under the Apache License, Version 2.0 (the "License");
1352you may not use this file except in compliance with the License.
1353You may obtain a copy of the License at
1354
1355 http://www.apache.org/licenses/LICENSE-2.0
1356
1357Unless required by applicable law or agreed to in writing, software
1358distributed under the License is distributed on an "AS IS" BASIS,
1359WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1360See the License for the specific language governing permissions and
1361limitations under the License.
1362
1363*/
1364
1365(function () {
1366 'use strict';
1367
1368 var module = angular.module('onsen');
1369
1370 module.factory('OverlaySlidingMenuAnimator', ['SlidingMenuAnimator', function (SlidingMenuAnimator) {
1371
1372 var OverlaySlidingMenuAnimator = SlidingMenuAnimator.extend({
1373
1374 _blackMask: undefined,
1375
1376 _isRight: false,
1377 _element: false,
1378 _menuPage: false,
1379 _mainPage: false,
1380 _width: false,
1381
1382 /**
1383 * @param {jqLite} element "ons-sliding-menu" or "ons-split-view" element
1384 * @param {jqLite} mainPage
1385 * @param {jqLite} menuPage
1386 * @param {Object} options
1387 * @param {String} options.width "width" style value
1388 * @param {Boolean} options.isRight
1389 */
1390 setup: function setup(element, mainPage, menuPage, options) {
1391 options = options || {};
1392 this._width = options.width || '90%';
1393 this._isRight = !!options.isRight;
1394 this._element = element;
1395 this._mainPage = mainPage;
1396 this._menuPage = menuPage;
1397
1398 menuPage.css('box-shadow', '0px 0 10px 0px rgba(0, 0, 0, 0.2)');
1399 menuPage.css({
1400 width: options.width,
1401 display: 'none',
1402 zIndex: 2
1403 });
1404
1405 // Fix for transparent menu page on iOS8.
1406 menuPage.css('-webkit-transform', 'translate3d(0px, 0px, 0px)');
1407
1408 mainPage.css({ zIndex: 1 });
1409
1410 if (this._isRight) {
1411 menuPage.css({
1412 right: '-' + options.width,
1413 left: 'auto'
1414 });
1415 } else {
1416 menuPage.css({
1417 right: 'auto',
1418 left: '-' + options.width
1419 });
1420 }
1421
1422 this._blackMask = angular.element('<div></div>').css({
1423 backgroundColor: 'black',
1424 top: '0px',
1425 left: '0px',
1426 right: '0px',
1427 bottom: '0px',
1428 position: 'absolute',
1429 display: 'none',
1430 zIndex: 0
1431 });
1432
1433 element.prepend(this._blackMask);
1434 },
1435
1436 /**
1437 * @param {Object} options
1438 * @param {String} options.width
1439 */
1440 onResized: function onResized(options) {
1441 this._menuPage.css('width', options.width);
1442
1443 if (this._isRight) {
1444 this._menuPage.css({
1445 right: '-' + options.width,
1446 left: 'auto'
1447 });
1448 } else {
1449 this._menuPage.css({
1450 right: 'auto',
1451 left: '-' + options.width
1452 });
1453 }
1454
1455 if (options.isOpened) {
1456 var max = this._menuPage[0].clientWidth;
1457 var menuStyle = this._generateMenuPageStyle(max);
1458 animit(this._menuPage[0]).queue(menuStyle).play();
1459 }
1460 },
1461
1462 /**
1463 */
1464 destroy: function destroy() {
1465 if (this._blackMask) {
1466 this._blackMask.remove();
1467 this._blackMask = null;
1468 }
1469
1470 this._mainPage.removeAttr('style');
1471 this._menuPage.removeAttr('style');
1472
1473 this._element = this._mainPage = this._menuPage = null;
1474 },
1475
1476 /**
1477 * @param {Function} callback
1478 * @param {Boolean} instant
1479 */
1480 openMenu: function openMenu(callback, instant) {
1481 var duration = instant === true ? 0.0 : this.duration;
1482 var delay = instant === true ? 0.0 : this.delay;
1483
1484 this._menuPage.css('display', 'block');
1485 this._blackMask.css('display', 'block');
1486
1487 var max = this._menuPage[0].clientWidth;
1488 var menuStyle = this._generateMenuPageStyle(max);
1489 var mainPageStyle = this._generateMainPageStyle(max);
1490
1491 setTimeout(function () {
1492
1493 animit(this._mainPage[0]).wait(delay).queue(mainPageStyle, {
1494 duration: duration,
1495 timing: this.timing
1496 }).queue(function (done) {
1497 callback();
1498 done();
1499 }).play();
1500
1501 animit(this._menuPage[0]).wait(delay).queue(menuStyle, {
1502 duration: duration,
1503 timing: this.timing
1504 }).play();
1505 }.bind(this), 1000 / 60);
1506 },
1507
1508 /**
1509 * @param {Function} callback
1510 * @param {Boolean} instant
1511 */
1512 closeMenu: function closeMenu(callback, instant) {
1513 var duration = instant === true ? 0.0 : this.duration;
1514 var delay = instant === true ? 0.0 : this.delay;
1515
1516 this._blackMask.css({ display: 'block' });
1517
1518 var menuPageStyle = this._generateMenuPageStyle(0);
1519 var mainPageStyle = this._generateMainPageStyle(0);
1520
1521 setTimeout(function () {
1522
1523 animit(this._mainPage[0]).wait(delay).queue(mainPageStyle, {
1524 duration: duration,
1525 timing: this.timing
1526 }).queue(function (done) {
1527 this._menuPage.css('display', 'none');
1528 callback();
1529 done();
1530 }.bind(this)).play();
1531
1532 animit(this._menuPage[0]).wait(delay).queue(menuPageStyle, {
1533 duration: duration,
1534 timing: this.timing
1535 }).play();
1536 }.bind(this), 1000 / 60);
1537 },
1538
1539 /**
1540 * @param {Object} options
1541 * @param {Number} options.distance
1542 * @param {Number} options.maxDistance
1543 */
1544 translateMenu: function translateMenu(options) {
1545
1546 this._menuPage.css('display', 'block');
1547 this._blackMask.css({ display: 'block' });
1548
1549 var menuPageStyle = this._generateMenuPageStyle(Math.min(options.maxDistance, options.distance));
1550 var mainPageStyle = this._generateMainPageStyle(Math.min(options.maxDistance, options.distance));
1551 delete mainPageStyle.opacity;
1552
1553 animit(this._menuPage[0]).queue(menuPageStyle).play();
1554
1555 if (Object.keys(mainPageStyle).length > 0) {
1556 animit(this._mainPage[0]).queue(mainPageStyle).play();
1557 }
1558 },
1559
1560 _generateMenuPageStyle: function _generateMenuPageStyle(distance) {
1561 var x = this._isRight ? -distance : distance;
1562 var transform = 'translate3d(' + x + 'px, 0, 0)';
1563
1564 return {
1565 transform: transform,
1566 'box-shadow': distance === 0 ? 'none' : '0px 0 10px 0px rgba(0, 0, 0, 0.2)'
1567 };
1568 },
1569
1570 _generateMainPageStyle: function _generateMainPageStyle(distance) {
1571 var max = this._menuPage[0].clientWidth;
1572 var opacity = 1 - 0.1 * distance / max;
1573
1574 return {
1575 opacity: opacity
1576 };
1577 },
1578
1579 copy: function copy() {
1580 return new OverlaySlidingMenuAnimator();
1581 }
1582 });
1583
1584 return OverlaySlidingMenuAnimator;
1585 }]);
1586})();
1587'use strict';
1588
1589/*
1590Copyright 2013-2015 ASIAL CORPORATION
1591
1592Licensed under the Apache License, Version 2.0 (the "License");
1593you may not use this file except in compliance with the License.
1594You may obtain a copy of the License at
1595
1596 http://www.apache.org/licenses/LICENSE-2.0
1597
1598Unless required by applicable law or agreed to in writing, software
1599distributed under the License is distributed on an "AS IS" BASIS,
1600WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1601See the License for the specific language governing permissions and
1602limitations under the License.
1603
1604*/
1605
1606(function () {
1607 'use strict';
1608
1609 var module = angular.module('onsen');
1610
1611 module.factory('PageView', ['$onsen', '$parse', function ($onsen, $parse) {
1612
1613 var PageView = Class.extend({
1614 init: function init(scope, element, attrs) {
1615 var _this = this;
1616
1617 this._scope = scope;
1618 this._element = element;
1619 this._attrs = attrs;
1620
1621 this._clearListener = scope.$on('$destroy', this._destroy.bind(this));
1622
1623 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['init', 'show', 'hide', 'destroy']);
1624
1625 Object.defineProperty(this, 'onDeviceBackButton', {
1626 get: function get() {
1627 return _this._element[0].onDeviceBackButton;
1628 },
1629 set: function set(value) {
1630 if (!_this._userBackButtonHandler) {
1631 _this._enableBackButtonHandler();
1632 }
1633 _this._userBackButtonHandler = value;
1634 }
1635 });
1636
1637 if (this._attrs.ngDeviceBackButton || this._attrs.onDeviceBackButton) {
1638 this._enableBackButtonHandler();
1639 }
1640 if (this._attrs.ngInfiniteScroll) {
1641 this._element[0].onInfiniteScroll = function (done) {
1642 $parse(_this._attrs.ngInfiniteScroll)(_this._scope)(done);
1643 };
1644 }
1645 },
1646
1647 _enableBackButtonHandler: function _enableBackButtonHandler() {
1648 this._userBackButtonHandler = angular.noop;
1649 this._element[0].onDeviceBackButton = this._onDeviceBackButton.bind(this);
1650 },
1651
1652 _onDeviceBackButton: function _onDeviceBackButton($event) {
1653 this._userBackButtonHandler($event);
1654
1655 // ng-device-backbutton
1656 if (this._attrs.ngDeviceBackButton) {
1657 $parse(this._attrs.ngDeviceBackButton)(this._scope, { $event: $event });
1658 }
1659
1660 // on-device-backbutton
1661 /* jshint ignore:start */
1662 if (this._attrs.onDeviceBackButton) {
1663 var lastEvent = window.$event;
1664 window.$event = $event;
1665 new Function(this._attrs.onDeviceBackButton)(); // eslint-disable-line no-new-func
1666 window.$event = lastEvent;
1667 }
1668 /* jshint ignore:end */
1669 },
1670
1671 _destroy: function _destroy() {
1672 this._clearDerivingEvents();
1673
1674 this._element = null;
1675 this._scope = null;
1676
1677 this._clearListener();
1678 }
1679 });
1680 MicroEvent.mixin(PageView);
1681
1682 return PageView;
1683 }]);
1684})();
1685'use strict';
1686
1687/*
1688Copyright 2013-2015 ASIAL CORPORATION
1689
1690Licensed under the Apache License, Version 2.0 (the "License");
1691you may not use this file except in compliance with the License.
1692You may obtain a copy of the License at
1693
1694 http://www.apache.org/licenses/LICENSE-2.0
1695
1696Unless required by applicable law or agreed to in writing, software
1697distributed under the License is distributed on an "AS IS" BASIS,
1698WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1699See the License for the specific language governing permissions and
1700limitations under the License.
1701
1702*/
1703
1704(function () {
1705 'use strict';
1706
1707 angular.module('onsen').factory('PopoverView', ['$onsen', function ($onsen) {
1708
1709 var PopoverView = Class.extend({
1710
1711 /**
1712 * @param {Object} scope
1713 * @param {jqLite} element
1714 * @param {Object} attrs
1715 */
1716 init: function init(scope, element, attrs) {
1717 this._element = element;
1718 this._scope = scope;
1719 this._attrs = attrs;
1720
1721 this._scope.$on('$destroy', this._destroy.bind(this));
1722
1723 this._clearDerivingMethods = $onsen.deriveMethods(this, this._element[0], ['show', 'hide']);
1724
1725 this._clearDerivingEvents = $onsen.deriveEvents(this, this._element[0], ['preshow', 'postshow', 'prehide', 'posthide'], function (detail) {
1726 if (detail.popover) {
1727 detail.popover = this;
1728 }
1729 return detail;
1730 }.bind(this));
1731 },
1732
1733 _destroy: function _destroy() {
1734 this.emit('destroy');
1735
1736 this._clearDerivingMethods();
1737 this._clearDerivingEvents();
1738
1739 this._element.remove();
1740
1741 this._element = this._scope = null;
1742 }
1743 });
1744
1745 MicroEvent.mixin(PopoverView);
1746 $onsen.derivePropertiesFromElement(PopoverView, ['cancelable', 'disabled', 'onDeviceBackButton']);
1747
1748 return PopoverView;
1749 }]);
1750})();
1751'use strict';
1752
1753/*
1754Copyright 2013-2015 ASIAL CORPORATION
1755
1756 Licensed under the Apache License, Version 2.0 (the "License");
1757 you may not use this file except in compliance with the License.
1758 You may obtain a copy of the License at
1759
1760http://www.apache.org/licenses/LICENSE-2.0
1761
1762Unless required by applicable law or agreed to in writing, software
1763distributed under the License is distributed on an "AS IS" BASIS,
1764WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1765See the License for the specific language governing permissions and
1766limitations under the License.
1767
1768*/
1769
1770angular.module('onsen').value('PopoverAnimator', ons._internal.PopoverAnimator).value('FadePopoverAnimator', ons._internal.FadePopoverAnimator);
1771'use strict';
1772
1773/*
1774Copyright 2013-2015 ASIAL CORPORATION
1775
1776Licensed under the Apache License, Version 2.0 (the "License");
1777you may not use this file except in compliance with the License.
1778You may obtain a copy of the License at
1779
1780 http://www.apache.org/licenses/LICENSE-2.0
1781
1782Unless required by applicable law or agreed to in writing, software
1783distributed under the License is distributed on an "AS IS" BASIS,
1784WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1785See the License for the specific language governing permissions and
1786limitations under the License.
1787
1788*/
1789
1790(function () {
1791 'use strict';
1792
1793 var module = angular.module('onsen');
1794
1795 module.factory('PullHookView', ['$onsen', '$parse', function ($onsen, $parse) {
1796
1797 var PullHookView = Class.extend({
1798
1799 init: function init(scope, element, attrs) {
1800 var _this = this;
1801
1802 this._element = element;
1803 this._scope = scope;
1804 this._attrs = attrs;
1805
1806 this._clearDerivingEvents = $onsen.deriveEvents(this, this._element[0], ['changestate'], function (detail) {
1807 if (detail.pullHook) {
1808 detail.pullHook = _this;
1809 }
1810 return detail;
1811 });
1812
1813 this.on('changestate', function () {
1814 return _this._scope.$evalAsync();
1815 });
1816
1817 this._element[0].onAction = function (done) {
1818 if (_this._attrs.ngAction) {
1819 _this._scope.$eval(_this._attrs.ngAction, { $done: done });
1820 } else {
1821 _this.onAction ? _this.onAction(done) : done();
1822 }
1823 };
1824
1825 this._scope.$on('$destroy', this._destroy.bind(this));
1826 },
1827
1828 _destroy: function _destroy() {
1829 this.emit('destroy');
1830
1831 this._clearDerivingEvents();
1832
1833 this._element = this._scope = this._attrs = null;
1834 }
1835 });
1836
1837 MicroEvent.mixin(PullHookView);
1838 $onsen.derivePropertiesFromElement(PullHookView, ['state', 'pullDistance', 'height', 'thresholdHeight', 'disabled']);
1839
1840 return PullHookView;
1841 }]);
1842})();
1843'use strict';
1844
1845/*
1846Copyright 2013-2015 ASIAL CORPORATION
1847
1848Licensed under the Apache License, Version 2.0 (the "License");
1849you may not use this file except in compliance with the License.
1850You may obtain a copy of the License at
1851
1852 http://www.apache.org/licenses/LICENSE-2.0
1853
1854Unless required by applicable law or agreed to in writing, software
1855distributed under the License is distributed on an "AS IS" BASIS,
1856WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1857See the License for the specific language governing permissions and
1858limitations under the License.
1859
1860*/
1861
1862(function () {
1863 'use strict';
1864
1865 var module = angular.module('onsen');
1866
1867 module.factory('PushSlidingMenuAnimator', ['SlidingMenuAnimator', function (SlidingMenuAnimator) {
1868
1869 var PushSlidingMenuAnimator = SlidingMenuAnimator.extend({
1870
1871 _isRight: false,
1872 _element: undefined,
1873 _menuPage: undefined,
1874 _mainPage: undefined,
1875 _width: undefined,
1876
1877 /**
1878 * @param {jqLite} element "ons-sliding-menu" or "ons-split-view" element
1879 * @param {jqLite} mainPage
1880 * @param {jqLite} menuPage
1881 * @param {Object} options
1882 * @param {String} options.width "width" style value
1883 * @param {Boolean} options.isRight
1884 */
1885 setup: function setup(element, mainPage, menuPage, options) {
1886 options = options || {};
1887
1888 this._element = element;
1889 this._mainPage = mainPage;
1890 this._menuPage = menuPage;
1891
1892 this._isRight = !!options.isRight;
1893 this._width = options.width || '90%';
1894
1895 menuPage.css({
1896 width: options.width,
1897 display: 'none'
1898 });
1899
1900 if (this._isRight) {
1901 menuPage.css({
1902 right: '-' + options.width,
1903 left: 'auto'
1904 });
1905 } else {
1906 menuPage.css({
1907 right: 'auto',
1908 left: '-' + options.width
1909 });
1910 }
1911 },
1912
1913 /**
1914 * @param {Object} options
1915 * @param {String} options.width
1916 * @param {Object} options.isRight
1917 */
1918 onResized: function onResized(options) {
1919 this._menuPage.css('width', options.width);
1920
1921 if (this._isRight) {
1922 this._menuPage.css({
1923 right: '-' + options.width,
1924 left: 'auto'
1925 });
1926 } else {
1927 this._menuPage.css({
1928 right: 'auto',
1929 left: '-' + options.width
1930 });
1931 }
1932
1933 if (options.isOpened) {
1934 var max = this._menuPage[0].clientWidth;
1935 var mainPageTransform = this._generateAbovePageTransform(max);
1936 var menuPageStyle = this._generateBehindPageStyle(max);
1937
1938 animit(this._mainPage[0]).queue({ transform: mainPageTransform }).play();
1939 animit(this._menuPage[0]).queue(menuPageStyle).play();
1940 }
1941 },
1942
1943 /**
1944 */
1945 destroy: function destroy() {
1946 this._mainPage.removeAttr('style');
1947 this._menuPage.removeAttr('style');
1948
1949 this._element = this._mainPage = this._menuPage = null;
1950 },
1951
1952 /**
1953 * @param {Function} callback
1954 * @param {Boolean} instant
1955 */
1956 openMenu: function openMenu(callback, instant) {
1957 var duration = instant === true ? 0.0 : this.duration;
1958 var delay = instant === true ? 0.0 : this.delay;
1959
1960 this._menuPage.css('display', 'block');
1961
1962 var max = this._menuPage[0].clientWidth;
1963
1964 var aboveTransform = this._generateAbovePageTransform(max);
1965 var behindStyle = this._generateBehindPageStyle(max);
1966
1967 setTimeout(function () {
1968
1969 animit(this._mainPage[0]).wait(delay).queue({
1970 transform: aboveTransform
1971 }, {
1972 duration: duration,
1973 timing: this.timing
1974 }).queue(function (done) {
1975 callback();
1976 done();
1977 }).play();
1978
1979 animit(this._menuPage[0]).wait(delay).queue(behindStyle, {
1980 duration: duration,
1981 timing: this.timing
1982 }).play();
1983 }.bind(this), 1000 / 60);
1984 },
1985
1986 /**
1987 * @param {Function} callback
1988 * @param {Boolean} instant
1989 */
1990 closeMenu: function closeMenu(callback, instant) {
1991 var duration = instant === true ? 0.0 : this.duration;
1992 var delay = instant === true ? 0.0 : this.delay;
1993
1994 var aboveTransform = this._generateAbovePageTransform(0);
1995 var behindStyle = this._generateBehindPageStyle(0);
1996
1997 setTimeout(function () {
1998
1999 animit(this._mainPage[0]).wait(delay).queue({
2000 transform: aboveTransform
2001 }, {
2002 duration: duration,
2003 timing: this.timing
2004 }).queue({
2005 transform: 'translate3d(0, 0, 0)'
2006 }).queue(function (done) {
2007 this._menuPage.css('display', 'none');
2008 callback();
2009 done();
2010 }.bind(this)).play();
2011
2012 animit(this._menuPage[0]).wait(delay).queue(behindStyle, {
2013 duration: duration,
2014 timing: this.timing
2015 }).queue(function (done) {
2016 done();
2017 }).play();
2018 }.bind(this), 1000 / 60);
2019 },
2020
2021 /**
2022 * @param {Object} options
2023 * @param {Number} options.distance
2024 * @param {Number} options.maxDistance
2025 */
2026 translateMenu: function translateMenu(options) {
2027
2028 this._menuPage.css('display', 'block');
2029
2030 var aboveTransform = this._generateAbovePageTransform(Math.min(options.maxDistance, options.distance));
2031 var behindStyle = this._generateBehindPageStyle(Math.min(options.maxDistance, options.distance));
2032
2033 animit(this._mainPage[0]).queue({ transform: aboveTransform }).play();
2034
2035 animit(this._menuPage[0]).queue(behindStyle).play();
2036 },
2037
2038 _generateAbovePageTransform: function _generateAbovePageTransform(distance) {
2039 var x = this._isRight ? -distance : distance;
2040 var aboveTransform = 'translate3d(' + x + 'px, 0, 0)';
2041
2042 return aboveTransform;
2043 },
2044
2045 _generateBehindPageStyle: function _generateBehindPageStyle(distance) {
2046 var behindX = this._isRight ? -distance : distance;
2047 var behindTransform = 'translate3d(' + behindX + 'px, 0, 0)';
2048
2049 return {
2050 transform: behindTransform
2051 };
2052 },
2053
2054 copy: function copy() {
2055 return new PushSlidingMenuAnimator();
2056 }
2057 });
2058
2059 return PushSlidingMenuAnimator;
2060 }]);
2061})();
2062'use strict';
2063
2064/*
2065Copyright 2013-2015 ASIAL CORPORATION
2066
2067Licensed under the Apache License, Version 2.0 (the "License");
2068you may not use this file except in compliance with the License.
2069You may obtain a copy of the License at
2070
2071 http://www.apache.org/licenses/LICENSE-2.0
2072
2073Unless required by applicable law or agreed to in writing, software
2074distributed under the License is distributed on an "AS IS" BASIS,
2075WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2076See the License for the specific language governing permissions and
2077limitations under the License.
2078
2079*/
2080
2081(function () {
2082 'use strict';
2083
2084 var module = angular.module('onsen');
2085
2086 module.factory('RevealSlidingMenuAnimator', ['SlidingMenuAnimator', function (SlidingMenuAnimator) {
2087
2088 var RevealSlidingMenuAnimator = SlidingMenuAnimator.extend({
2089
2090 _blackMask: undefined,
2091
2092 _isRight: false,
2093
2094 _menuPage: undefined,
2095 _element: undefined,
2096 _mainPage: undefined,
2097
2098 /**
2099 * @param {jqLite} element "ons-sliding-menu" or "ons-split-view" element
2100 * @param {jqLite} mainPage
2101 * @param {jqLite} menuPage
2102 * @param {Object} options
2103 * @param {String} options.width "width" style value
2104 * @param {Boolean} options.isRight
2105 */
2106 setup: function setup(element, mainPage, menuPage, options) {
2107 this._element = element;
2108 this._menuPage = menuPage;
2109 this._mainPage = mainPage;
2110 this._isRight = !!options.isRight;
2111 this._width = options.width || '90%';
2112
2113 mainPage.css({
2114 boxShadow: '0px 0 10px 0px rgba(0, 0, 0, 0.2)'
2115 });
2116
2117 menuPage.css({
2118 width: options.width,
2119 opacity: 0.9,
2120 display: 'none'
2121 });
2122
2123 if (this._isRight) {
2124 menuPage.css({
2125 right: '0px',
2126 left: 'auto'
2127 });
2128 } else {
2129 menuPage.css({
2130 right: 'auto',
2131 left: '0px'
2132 });
2133 }
2134
2135 this._blackMask = angular.element('<div></div>').css({
2136 backgroundColor: 'black',
2137 top: '0px',
2138 left: '0px',
2139 right: '0px',
2140 bottom: '0px',
2141 position: 'absolute',
2142 display: 'none'
2143 });
2144
2145 element.prepend(this._blackMask);
2146
2147 // Dirty fix for broken rendering bug on android 4.x.
2148 animit(mainPage[0]).queue({ transform: 'translate3d(0, 0, 0)' }).play();
2149 },
2150
2151 /**
2152 * @param {Object} options
2153 * @param {Boolean} options.isOpened
2154 * @param {String} options.width
2155 */
2156 onResized: function onResized(options) {
2157 this._width = options.width;
2158 this._menuPage.css('width', this._width);
2159
2160 if (options.isOpened) {
2161 var max = this._menuPage[0].clientWidth;
2162
2163 var aboveTransform = this._generateAbovePageTransform(max);
2164 var behindStyle = this._generateBehindPageStyle(max);
2165
2166 animit(this._mainPage[0]).queue({ transform: aboveTransform }).play();
2167 animit(this._menuPage[0]).queue(behindStyle).play();
2168 }
2169 },
2170
2171 /**
2172 * @param {jqLite} element "ons-sliding-menu" or "ons-split-view" element
2173 * @param {jqLite} mainPage
2174 * @param {jqLite} menuPage
2175 */
2176 destroy: function destroy() {
2177 if (this._blackMask) {
2178 this._blackMask.remove();
2179 this._blackMask = null;
2180 }
2181
2182 if (this._mainPage) {
2183 this._mainPage.attr('style', '');
2184 }
2185
2186 if (this._menuPage) {
2187 this._menuPage.attr('style', '');
2188 }
2189
2190 this._mainPage = this._menuPage = this._element = undefined;
2191 },
2192
2193 /**
2194 * @param {Function} callback
2195 * @param {Boolean} instant
2196 */
2197 openMenu: function openMenu(callback, instant) {
2198 var duration = instant === true ? 0.0 : this.duration;
2199 var delay = instant === true ? 0.0 : this.delay;
2200
2201 this._menuPage.css('display', 'block');
2202 this._blackMask.css('display', 'block');
2203
2204 var max = this._menuPage[0].clientWidth;
2205
2206 var aboveTransform = this._generateAbovePageTransform(max);
2207 var behindStyle = this._generateBehindPageStyle(max);
2208
2209 setTimeout(function () {
2210
2211 animit(this._mainPage[0]).wait(delay).queue({
2212 transform: aboveTransform
2213 }, {
2214 duration: duration,
2215 timing: this.timing
2216 }).queue(function (done) {
2217 callback();
2218 done();
2219 }).play();
2220
2221 animit(this._menuPage[0]).wait(delay).queue(behindStyle, {
2222 duration: duration,
2223 timing: this.timing
2224 }).play();
2225 }.bind(this), 1000 / 60);
2226 },
2227
2228 /**
2229 * @param {Function} callback
2230 * @param {Boolean} instant
2231 */
2232 closeMenu: function closeMenu(callback, instant) {
2233 var duration = instant === true ? 0.0 : this.duration;
2234 var delay = instant === true ? 0.0 : this.delay;
2235
2236 this._blackMask.css('display', 'block');
2237
2238 var aboveTransform = this._generateAbovePageTransform(0);
2239 var behindStyle = this._generateBehindPageStyle(0);
2240
2241 setTimeout(function () {
2242
2243 animit(this._mainPage[0]).wait(delay).queue({
2244 transform: aboveTransform
2245 }, {
2246 duration: duration,
2247 timing: this.timing
2248 }).queue({
2249 transform: 'translate3d(0, 0, 0)'
2250 }).queue(function (done) {
2251 this._menuPage.css('display', 'none');
2252 callback();
2253 done();
2254 }.bind(this)).play();
2255
2256 animit(this._menuPage[0]).wait(delay).queue(behindStyle, {
2257 duration: duration,
2258 timing: this.timing
2259 }).queue(function (done) {
2260 done();
2261 }).play();
2262 }.bind(this), 1000 / 60);
2263 },
2264
2265 /**
2266 * @param {Object} options
2267 * @param {Number} options.distance
2268 * @param {Number} options.maxDistance
2269 */
2270 translateMenu: function translateMenu(options) {
2271
2272 this._menuPage.css('display', 'block');
2273 this._blackMask.css('display', 'block');
2274
2275 var aboveTransform = this._generateAbovePageTransform(Math.min(options.maxDistance, options.distance));
2276 var behindStyle = this._generateBehindPageStyle(Math.min(options.maxDistance, options.distance));
2277 delete behindStyle.opacity;
2278
2279 animit(this._mainPage[0]).queue({ transform: aboveTransform }).play();
2280
2281 animit(this._menuPage[0]).queue(behindStyle).play();
2282 },
2283
2284 _generateAbovePageTransform: function _generateAbovePageTransform(distance) {
2285 var x = this._isRight ? -distance : distance;
2286 var aboveTransform = 'translate3d(' + x + 'px, 0, 0)';
2287
2288 return aboveTransform;
2289 },
2290
2291 _generateBehindPageStyle: function _generateBehindPageStyle(distance) {
2292 var max = this._menuPage[0].getBoundingClientRect().width;
2293
2294 var behindDistance = (distance - max) / max * 10;
2295 behindDistance = isNaN(behindDistance) ? 0 : Math.max(Math.min(behindDistance, 0), -10);
2296
2297 var behindX = this._isRight ? -behindDistance : behindDistance;
2298 var behindTransform = 'translate3d(' + behindX + '%, 0, 0)';
2299 var opacity = 1 + behindDistance / 100;
2300
2301 return {
2302 transform: behindTransform,
2303 opacity: opacity
2304 };
2305 },
2306
2307 copy: function copy() {
2308 return new RevealSlidingMenuAnimator();
2309 }
2310 });
2311
2312 return RevealSlidingMenuAnimator;
2313 }]);
2314})();
2315'use strict';
2316
2317/*
2318Copyright 2013-2015 ASIAL CORPORATION
2319
2320Licensed under the Apache License, Version 2.0 (the "License");
2321you may not use this file except in compliance with the License.
2322You may obtain a copy of the License at
2323
2324 http://www.apache.org/licenses/LICENSE-2.0
2325
2326Unless required by applicable law or agreed to in writing, software
2327distributed under the License is distributed on an "AS IS" BASIS,
2328WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2329See the License for the specific language governing permissions and
2330limitations under the License.
2331
2332*/
2333
2334(function () {
2335 'use strict';
2336
2337 var module = angular.module('onsen');
2338
2339 var SlidingMenuViewModel = Class.extend({
2340
2341 /**
2342 * @member Number
2343 */
2344 _distance: 0,
2345
2346 /**
2347 * @member Number
2348 */
2349 _maxDistance: undefined,
2350
2351 /**
2352 * @param {Object} options
2353 * @param {Number} maxDistance
2354 */
2355 init: function init(options) {
2356 if (!angular.isNumber(options.maxDistance)) {
2357 throw new Error('options.maxDistance must be number');
2358 }
2359
2360 this.setMaxDistance(options.maxDistance);
2361 },
2362
2363 /**
2364 * @param {Number} maxDistance
2365 */
2366 setMaxDistance: function setMaxDistance(maxDistance) {
2367 if (maxDistance <= 0) {
2368 throw new Error('maxDistance must be greater then zero.');
2369 }
2370
2371 if (this.isOpened()) {
2372 this._distance = maxDistance;
2373 }
2374 this._maxDistance = maxDistance;
2375 },
2376
2377 /**
2378 * @return {Boolean}
2379 */
2380 shouldOpen: function shouldOpen() {
2381 return !this.isOpened() && this._distance >= this._maxDistance / 2;
2382 },
2383
2384 /**
2385 * @return {Boolean}
2386 */
2387 shouldClose: function shouldClose() {
2388 return !this.isClosed() && this._distance < this._maxDistance / 2;
2389 },
2390
2391 openOrClose: function openOrClose(options) {
2392 if (this.shouldOpen()) {
2393 this.open(options);
2394 } else if (this.shouldClose()) {
2395 this.close(options);
2396 }
2397 },
2398
2399 close: function close(options) {
2400 var callback = options.callback || function () {};
2401
2402 if (!this.isClosed()) {
2403 this._distance = 0;
2404 this.emit('close', options);
2405 } else {
2406 callback();
2407 }
2408 },
2409
2410 open: function open(options) {
2411 var callback = options.callback || function () {};
2412
2413 if (!this.isOpened()) {
2414 this._distance = this._maxDistance;
2415 this.emit('open', options);
2416 } else {
2417 callback();
2418 }
2419 },
2420
2421 /**
2422 * @return {Boolean}
2423 */
2424 isClosed: function isClosed() {
2425 return this._distance === 0;
2426 },
2427
2428 /**
2429 * @return {Boolean}
2430 */
2431 isOpened: function isOpened() {
2432 return this._distance === this._maxDistance;
2433 },
2434
2435 /**
2436 * @return {Number}
2437 */
2438 getX: function getX() {
2439 return this._distance;
2440 },
2441
2442 /**
2443 * @return {Number}
2444 */
2445 getMaxDistance: function getMaxDistance() {
2446 return this._maxDistance;
2447 },
2448
2449 /**
2450 * @param {Number} x
2451 */
2452 translate: function translate(x) {
2453 this._distance = Math.max(1, Math.min(this._maxDistance - 1, x));
2454
2455 var options = {
2456 distance: this._distance,
2457 maxDistance: this._maxDistance
2458 };
2459
2460 this.emit('translate', options);
2461 },
2462
2463 toggle: function toggle() {
2464 if (this.isClosed()) {
2465 this.open();
2466 } else {
2467 this.close();
2468 }
2469 }
2470 });
2471 MicroEvent.mixin(SlidingMenuViewModel);
2472
2473 module.factory('SlidingMenuView', ['$onsen', '$compile', '$parse', 'AnimationChooser', 'SlidingMenuAnimator', 'RevealSlidingMenuAnimator', 'PushSlidingMenuAnimator', 'OverlaySlidingMenuAnimator', function ($onsen, $compile, $parse, AnimationChooser, SlidingMenuAnimator, RevealSlidingMenuAnimator, PushSlidingMenuAnimator, OverlaySlidingMenuAnimator) {
2474
2475 var SlidingMenuView = Class.extend({
2476 _scope: undefined,
2477 _attrs: undefined,
2478
2479 _element: undefined,
2480 _menuPage: undefined,
2481 _mainPage: undefined,
2482
2483 _doorLock: undefined,
2484
2485 _isRightMenu: false,
2486
2487 init: function init(scope, element, attrs) {
2488 this._scope = scope;
2489 this._attrs = attrs;
2490 this._element = element;
2491
2492 this._menuPage = angular.element(element[0].querySelector('.onsen-sliding-menu__menu'));
2493 this._mainPage = angular.element(element[0].querySelector('.onsen-sliding-menu__main'));
2494
2495 this._doorLock = new ons._DoorLock();
2496
2497 this._isRightMenu = attrs.side === 'right';
2498
2499 // Close menu on tap event.
2500 this._mainPageGestureDetector = new ons.GestureDetector(this._mainPage[0]);
2501 this._boundOnTap = this._onTap.bind(this);
2502
2503 var maxDistance = this._normalizeMaxSlideDistanceAttr();
2504 this._logic = new SlidingMenuViewModel({ maxDistance: Math.max(maxDistance, 1) });
2505 this._logic.on('translate', this._translate.bind(this));
2506 this._logic.on('open', function (options) {
2507 this._open(options);
2508 }.bind(this));
2509 this._logic.on('close', function (options) {
2510 this._close(options);
2511 }.bind(this));
2512
2513 attrs.$observe('maxSlideDistance', this._onMaxSlideDistanceChanged.bind(this));
2514 attrs.$observe('swipeable', this._onSwipeableChanged.bind(this));
2515
2516 this._boundOnWindowResize = this._onWindowResize.bind(this);
2517 window.addEventListener('resize', this._boundOnWindowResize);
2518
2519 this._boundHandleEvent = this._handleEvent.bind(this);
2520 this._bindEvents();
2521
2522 if (attrs.mainPage) {
2523 this.setMainPage(attrs.mainPage);
2524 }
2525
2526 if (attrs.menuPage) {
2527 this.setMenuPage(attrs.menuPage);
2528 }
2529
2530 this._deviceBackButtonHandler = ons._deviceBackButtonDispatcher.createHandler(this._element[0], this._onDeviceBackButton.bind(this));
2531
2532 var unlock = this._doorLock.lock();
2533
2534 window.setTimeout(function () {
2535 var maxDistance = this._normalizeMaxSlideDistanceAttr();
2536 this._logic.setMaxDistance(maxDistance);
2537
2538 this._menuPage.css({ opacity: 1 });
2539
2540 var animationChooser = new AnimationChooser({
2541 animators: SlidingMenuView._animatorDict,
2542 baseClass: SlidingMenuAnimator,
2543 baseClassName: 'SlidingMenuAnimator',
2544 defaultAnimation: attrs.type,
2545 defaultAnimationOptions: $parse(attrs.animationOptions)()
2546 });
2547 this._animator = animationChooser.newAnimator();
2548 this._animator.setup(this._element, this._mainPage, this._menuPage, {
2549 isRight: this._isRightMenu,
2550 width: this._attrs.maxSlideDistance || '90%'
2551 });
2552
2553 unlock();
2554 }.bind(this), 400);
2555
2556 scope.$on('$destroy', this._destroy.bind(this));
2557
2558 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['init', 'show', 'hide', 'destroy']);
2559
2560 if (!attrs.swipeable) {
2561 this.setSwipeable(true);
2562 }
2563 },
2564
2565 getDeviceBackButtonHandler: function getDeviceBackButtonHandler() {
2566 return this._deviceBackButtonHandler;
2567 },
2568
2569 _onDeviceBackButton: function _onDeviceBackButton(event) {
2570 if (this.isMenuOpened()) {
2571 this.closeMenu();
2572 } else {
2573 event.callParentHandler();
2574 }
2575 },
2576
2577 _onTap: function _onTap() {
2578 if (this.isMenuOpened()) {
2579 this.closeMenu();
2580 }
2581 },
2582
2583 _refreshMenuPageWidth: function _refreshMenuPageWidth() {
2584 var width = 'maxSlideDistance' in this._attrs ? this._attrs.maxSlideDistance : '90%';
2585
2586 if (this._animator) {
2587 this._animator.onResized({
2588 isOpened: this._logic.isOpened(),
2589 width: width
2590 });
2591 }
2592 },
2593
2594 _destroy: function _destroy() {
2595 this.emit('destroy');
2596
2597 this._clearDerivingEvents();
2598
2599 this._deviceBackButtonHandler.destroy();
2600 window.removeEventListener('resize', this._boundOnWindowResize);
2601
2602 this._mainPageGestureDetector.off('tap', this._boundOnTap);
2603 this._element = this._scope = this._attrs = null;
2604 },
2605
2606 _onSwipeableChanged: function _onSwipeableChanged(swipeable) {
2607 swipeable = swipeable === '' || swipeable === undefined || swipeable == 'true';
2608
2609 this.setSwipeable(swipeable);
2610 },
2611
2612 /**
2613 * @param {Boolean} enabled
2614 */
2615 setSwipeable: function setSwipeable(enabled) {
2616 if (enabled) {
2617 this._activateGestureDetector();
2618 } else {
2619 this._deactivateGestureDetector();
2620 }
2621 },
2622
2623 _onWindowResize: function _onWindowResize() {
2624 this._recalculateMAX();
2625 this._refreshMenuPageWidth();
2626 },
2627
2628 _onMaxSlideDistanceChanged: function _onMaxSlideDistanceChanged() {
2629 this._recalculateMAX();
2630 this._refreshMenuPageWidth();
2631 },
2632
2633 /**
2634 * @return {Number}
2635 */
2636 _normalizeMaxSlideDistanceAttr: function _normalizeMaxSlideDistanceAttr() {
2637 var maxDistance = this._attrs.maxSlideDistance;
2638
2639 if (!('maxSlideDistance' in this._attrs)) {
2640 maxDistance = 0.9 * this._mainPage[0].clientWidth;
2641 } else if (typeof maxDistance == 'string') {
2642 if (maxDistance.indexOf('px', maxDistance.length - 2) !== -1) {
2643 maxDistance = parseInt(maxDistance.replace('px', ''), 10);
2644 } else if (maxDistance.indexOf('%', maxDistance.length - 1) > 0) {
2645 maxDistance = maxDistance.replace('%', '');
2646 maxDistance = parseFloat(maxDistance) / 100 * this._mainPage[0].clientWidth;
2647 }
2648 } else {
2649 throw new Error('invalid state');
2650 }
2651
2652 return maxDistance;
2653 },
2654
2655 _recalculateMAX: function _recalculateMAX() {
2656 var maxDistance = this._normalizeMaxSlideDistanceAttr();
2657
2658 if (maxDistance) {
2659 this._logic.setMaxDistance(parseInt(maxDistance, 10));
2660 }
2661 },
2662
2663 _activateGestureDetector: function _activateGestureDetector() {
2664 this._gestureDetector.on('touch dragleft dragright swipeleft swiperight release', this._boundHandleEvent);
2665 },
2666
2667 _deactivateGestureDetector: function _deactivateGestureDetector() {
2668 this._gestureDetector.off('touch dragleft dragright swipeleft swiperight release', this._boundHandleEvent);
2669 },
2670
2671 _bindEvents: function _bindEvents() {
2672 this._gestureDetector = new ons.GestureDetector(this._element[0], {
2673 dragMinDistance: 1
2674 });
2675 },
2676
2677 _appendMainPage: function _appendMainPage(pageUrl, templateHTML) {
2678 var _this = this;
2679
2680 var pageScope = this._scope.$new();
2681 var pageContent = angular.element(templateHTML);
2682 var link = $compile(pageContent);
2683
2684 this._mainPage.append(pageContent);
2685
2686 if (this._currentPageElement) {
2687 this._currentPageElement.remove();
2688 this._currentPageScope.$destroy();
2689 }
2690
2691 link(pageScope);
2692
2693 this._currentPageElement = pageContent;
2694 this._currentPageScope = pageScope;
2695 this._currentPageUrl = pageUrl;
2696
2697 setImmediate(function () {
2698 _this._currentPageElement[0]._show();
2699 });
2700 },
2701
2702 /**
2703 * @param {String}
2704 */
2705 _appendMenuPage: function _appendMenuPage(templateHTML) {
2706 var pageScope = this._scope.$new();
2707 var pageContent = angular.element(templateHTML);
2708 var link = $compile(pageContent);
2709
2710 this._menuPage.append(pageContent);
2711
2712 if (this._currentMenuPageScope) {
2713 this._currentMenuPageScope.$destroy();
2714 this._currentMenuPageElement.remove();
2715 }
2716
2717 link(pageScope);
2718
2719 this._currentMenuPageElement = pageContent;
2720 this._currentMenuPageScope = pageScope;
2721 },
2722
2723 /**
2724 * @param {String} page
2725 * @param {Object} options
2726 * @param {Boolean} [options.closeMenu]
2727 * @param {Boolean} [options.callback]
2728 */
2729 setMenuPage: function setMenuPage(page, options) {
2730 if (page) {
2731 options = options || {};
2732 options.callback = options.callback || function () {};
2733
2734 var self = this;
2735 $onsen.getPageHTMLAsync(page).then(function (html) {
2736 self._appendMenuPage(angular.element(html));
2737 if (options.closeMenu) {
2738 self.close();
2739 }
2740 options.callback();
2741 }, function () {
2742 throw new Error('Page is not found: ' + page);
2743 });
2744 } else {
2745 throw new Error('cannot set undefined page');
2746 }
2747 },
2748
2749 /**
2750 * @param {String} pageUrl
2751 * @param {Object} options
2752 * @param {Boolean} [options.closeMenu]
2753 * @param {Boolean} [options.callback]
2754 */
2755 setMainPage: function setMainPage(pageUrl, options) {
2756 options = options || {};
2757 options.callback = options.callback || function () {};
2758
2759 var done = function () {
2760 if (options.closeMenu) {
2761 this.close();
2762 }
2763 options.callback();
2764 }.bind(this);
2765
2766 if (this._currentPageUrl === pageUrl) {
2767 done();
2768 return;
2769 }
2770
2771 if (pageUrl) {
2772 var self = this;
2773 $onsen.getPageHTMLAsync(pageUrl).then(function (html) {
2774 self._appendMainPage(pageUrl, html);
2775 done();
2776 }, function () {
2777 throw new Error('Page is not found: ' + page);
2778 });
2779 } else {
2780 throw new Error('cannot set undefined page');
2781 }
2782 },
2783
2784 _handleEvent: function _handleEvent(event) {
2785
2786 if (this._doorLock.isLocked()) {
2787 return;
2788 }
2789
2790 if (this._isInsideIgnoredElement(event.target)) {
2791 this._deactivateGestureDetector();
2792 }
2793
2794 switch (event.type) {
2795 case 'dragleft':
2796 case 'dragright':
2797
2798 if (this._logic.isClosed() && !this._isInsideSwipeTargetArea(event)) {
2799 return;
2800 }
2801
2802 event.gesture.preventDefault();
2803
2804 var deltaX = event.gesture.deltaX;
2805 var deltaDistance = this._isRightMenu ? -deltaX : deltaX;
2806
2807 var startEvent = event.gesture.startEvent;
2808
2809 if (!('isOpened' in startEvent)) {
2810 startEvent.isOpened = this._logic.isOpened();
2811 }
2812
2813 if (deltaDistance < 0 && this._logic.isClosed()) {
2814 break;
2815 }
2816
2817 if (deltaDistance > 0 && this._logic.isOpened()) {
2818 break;
2819 }
2820
2821 var distance = startEvent.isOpened ? deltaDistance + this._logic.getMaxDistance() : deltaDistance;
2822
2823 this._logic.translate(distance);
2824
2825 break;
2826
2827 case 'swipeleft':
2828 event.gesture.preventDefault();
2829
2830 if (this._logic.isClosed() && !this._isInsideSwipeTargetArea(event)) {
2831 return;
2832 }
2833
2834 if (this._isRightMenu) {
2835 this.open();
2836 } else {
2837 this.close();
2838 }
2839
2840 event.gesture.stopDetect();
2841 break;
2842
2843 case 'swiperight':
2844 event.gesture.preventDefault();
2845
2846 if (this._logic.isClosed() && !this._isInsideSwipeTargetArea(event)) {
2847 return;
2848 }
2849
2850 if (this._isRightMenu) {
2851 this.close();
2852 } else {
2853 this.open();
2854 }
2855
2856 event.gesture.stopDetect();
2857 break;
2858
2859 case 'release':
2860 this._lastDistance = null;
2861
2862 if (this._logic.shouldOpen()) {
2863 this.open();
2864 } else if (this._logic.shouldClose()) {
2865 this.close();
2866 }
2867
2868 break;
2869 }
2870 },
2871
2872 /**
2873 * @param {jqLite} element
2874 * @return {Boolean}
2875 */
2876 _isInsideIgnoredElement: function _isInsideIgnoredElement(element) {
2877 do {
2878 if (element.getAttribute && element.getAttribute('sliding-menu-ignore')) {
2879 return true;
2880 }
2881 element = element.parentNode;
2882 } while (element);
2883
2884 return false;
2885 },
2886
2887 _isInsideSwipeTargetArea: function _isInsideSwipeTargetArea(event) {
2888 var x = event.gesture.center.pageX;
2889
2890 if (!('_swipeTargetWidth' in event.gesture.startEvent)) {
2891 event.gesture.startEvent._swipeTargetWidth = this._getSwipeTargetWidth();
2892 }
2893
2894 var targetWidth = event.gesture.startEvent._swipeTargetWidth;
2895 return this._isRightMenu ? this._mainPage[0].clientWidth - x < targetWidth : x < targetWidth;
2896 },
2897
2898 _getSwipeTargetWidth: function _getSwipeTargetWidth() {
2899 var targetWidth = this._attrs.swipeTargetWidth;
2900
2901 if (typeof targetWidth == 'string') {
2902 targetWidth = targetWidth.replace('px', '');
2903 }
2904
2905 var width = parseInt(targetWidth, 10);
2906 if (width < 0 || !targetWidth) {
2907 return this._mainPage[0].clientWidth;
2908 } else {
2909 return width;
2910 }
2911 },
2912
2913 closeMenu: function closeMenu() {
2914 return this.close.apply(this, arguments);
2915 },
2916
2917 /**
2918 * Close sliding-menu page.
2919 *
2920 * @param {Object} options
2921 */
2922 close: function close(options) {
2923 options = options || {};
2924 options = typeof options == 'function' ? { callback: options } : options;
2925
2926 if (!this._logic.isClosed()) {
2927 this.emit('preclose', {
2928 slidingMenu: this
2929 });
2930
2931 this._doorLock.waitUnlock(function () {
2932 this._logic.close(options);
2933 }.bind(this));
2934 }
2935 },
2936
2937 _close: function _close(options) {
2938 var callback = options.callback || function () {},
2939 unlock = this._doorLock.lock(),
2940 instant = options.animation == 'none';
2941
2942 this._animator.closeMenu(function () {
2943 unlock();
2944
2945 this._mainPage.children().css('pointer-events', '');
2946 this._mainPageGestureDetector.off('tap', this._boundOnTap);
2947
2948 this.emit('postclose', {
2949 slidingMenu: this
2950 });
2951
2952 callback();
2953 }.bind(this), instant);
2954 },
2955
2956 /**
2957 * Open sliding-menu page.
2958 *
2959 * @param {Object} [options]
2960 * @param {Function} [options.callback]
2961 */
2962 openMenu: function openMenu() {
2963 return this.open.apply(this, arguments);
2964 },
2965
2966 /**
2967 * Open sliding-menu page.
2968 *
2969 * @param {Object} [options]
2970 * @param {Function} [options.callback]
2971 */
2972 open: function open(options) {
2973 options = options || {};
2974 options = typeof options == 'function' ? { callback: options } : options;
2975
2976 this.emit('preopen', {
2977 slidingMenu: this
2978 });
2979
2980 this._doorLock.waitUnlock(function () {
2981 this._logic.open(options);
2982 }.bind(this));
2983 },
2984
2985 _open: function _open(options) {
2986 var callback = options.callback || function () {},
2987 unlock = this._doorLock.lock(),
2988 instant = options.animation == 'none';
2989
2990 this._animator.openMenu(function () {
2991 unlock();
2992
2993 this._mainPage.children().css('pointer-events', 'none');
2994 this._mainPageGestureDetector.on('tap', this._boundOnTap);
2995
2996 this.emit('postopen', {
2997 slidingMenu: this
2998 });
2999
3000 callback();
3001 }.bind(this), instant);
3002 },
3003
3004 /**
3005 * Toggle sliding-menu page.
3006 * @param {Object} [options]
3007 * @param {Function} [options.callback]
3008 */
3009 toggle: function toggle(options) {
3010 if (this._logic.isClosed()) {
3011 this.open(options);
3012 } else {
3013 this.close(options);
3014 }
3015 },
3016
3017 /**
3018 * Toggle sliding-menu page.
3019 */
3020 toggleMenu: function toggleMenu() {
3021 return this.toggle.apply(this, arguments);
3022 },
3023
3024 /**
3025 * @return {Boolean}
3026 */
3027 isMenuOpened: function isMenuOpened() {
3028 return this._logic.isOpened();
3029 },
3030
3031 /**
3032 * @param {Object} event
3033 */
3034 _translate: function _translate(event) {
3035 this._animator.translateMenu(event);
3036 }
3037 });
3038
3039 // Preset sliding menu animators.
3040 SlidingMenuView._animatorDict = {
3041 'default': RevealSlidingMenuAnimator,
3042 'overlay': OverlaySlidingMenuAnimator,
3043 'reveal': RevealSlidingMenuAnimator,
3044 'push': PushSlidingMenuAnimator
3045 };
3046
3047 /**
3048 * @param {String} name
3049 * @param {Function} Animator
3050 */
3051 SlidingMenuView.registerAnimator = function (name, Animator) {
3052 if (!(Animator.prototype instanceof SlidingMenuAnimator)) {
3053 throw new Error('"Animator" param must inherit SlidingMenuAnimator');
3054 }
3055
3056 this._animatorDict[name] = Animator;
3057 };
3058
3059 MicroEvent.mixin(SlidingMenuView);
3060
3061 return SlidingMenuView;
3062 }]);
3063})();
3064'use strict';
3065
3066/*
3067Copyright 2013-2015 ASIAL CORPORATION
3068
3069Licensed under the Apache License, Version 2.0 (the "License");
3070you may not use this file except in compliance with the License.
3071You may obtain a copy of the License at
3072
3073 http://www.apache.org/licenses/LICENSE-2.0
3074
3075Unless required by applicable law or agreed to in writing, software
3076distributed under the License is distributed on an "AS IS" BASIS,
3077WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3078See the License for the specific language governing permissions and
3079limitations under the License.
3080
3081*/
3082
3083(function () {
3084 'use strict';
3085
3086 var module = angular.module('onsen');
3087
3088 module.factory('SlidingMenuAnimator', function () {
3089 return Class.extend({
3090
3091 delay: 0,
3092 duration: 0.4,
3093 timing: 'cubic-bezier(.1, .7, .1, 1)',
3094
3095 /**
3096 * @param {Object} options
3097 * @param {String} options.timing
3098 * @param {Number} options.duration
3099 * @param {Number} options.delay
3100 */
3101 init: function init(options) {
3102 options = options || {};
3103
3104 this.timing = options.timing || this.timing;
3105 this.duration = options.duration !== undefined ? options.duration : this.duration;
3106 this.delay = options.delay !== undefined ? options.delay : this.delay;
3107 },
3108
3109 /**
3110 * @param {jqLite} element "ons-sliding-menu" or "ons-split-view" element
3111 * @param {jqLite} mainPage
3112 * @param {jqLite} menuPage
3113 * @param {Object} options
3114 * @param {String} options.width "width" style value
3115 * @param {Boolean} options.isRight
3116 */
3117 setup: function setup(element, mainPage, menuPage, options) {},
3118
3119 /**
3120 * @param {Object} options
3121 * @param {Boolean} options.isRight
3122 * @param {Boolean} options.isOpened
3123 * @param {String} options.width
3124 */
3125 onResized: function onResized(options) {},
3126
3127 /**
3128 * @param {Function} callback
3129 */
3130 openMenu: function openMenu(callback) {},
3131
3132 /**
3133 * @param {Function} callback
3134 */
3135 closeClose: function closeClose(callback) {},
3136
3137 /**
3138 */
3139 destroy: function destroy() {},
3140
3141 /**
3142 * @param {Object} options
3143 * @param {Number} options.distance
3144 * @param {Number} options.maxDistance
3145 */
3146 translateMenu: function translateMenu(mainPage, menuPage, options) {},
3147
3148 /**
3149 * @return {SlidingMenuAnimator}
3150 */
3151 copy: function copy() {
3152 throw new Error('Override copy method.');
3153 }
3154 });
3155 });
3156})();
3157'use strict';
3158
3159/*
3160Copyright 2013-2015 ASIAL CORPORATION
3161
3162Licensed under the Apache License, Version 2.0 (the "License");
3163you may not use this file except in compliance with the License.
3164You may obtain a copy of the License at
3165
3166 http://www.apache.org/licenses/LICENSE-2.0
3167
3168Unless required by applicable law or agreed to in writing, software
3169distributed under the License is distributed on an "AS IS" BASIS,
3170WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3171See the License for the specific language governing permissions and
3172limitations under the License.
3173
3174*/
3175
3176(function () {
3177 'use strict';
3178
3179 var module = angular.module('onsen');
3180
3181 module.factory('SpeedDialView', ['$onsen', function ($onsen) {
3182
3183 /**
3184 * @class SpeedDialView
3185 */
3186 var SpeedDialView = Class.extend({
3187
3188 /**
3189 * @param {Object} scope
3190 * @param {jqLite} element
3191 * @param {Object} attrs
3192 */
3193 init: function init(scope, element, attrs) {
3194 this._element = element;
3195 this._scope = scope;
3196 this._attrs = attrs;
3197
3198 this._scope.$on('$destroy', this._destroy.bind(this));
3199
3200 this._clearDerivingMethods = $onsen.deriveMethods(this, element[0], ['show', 'hide', 'showItems', 'hideItems', 'isOpen', 'toggle', 'toggleItems']);
3201
3202 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['open', 'close']).bind(this);
3203 },
3204
3205 _destroy: function _destroy() {
3206 this.emit('destroy');
3207
3208 this._clearDerivingEvents();
3209 this._clearDerivingMethods();
3210
3211 this._element = this._scope = this._attrs = null;
3212 }
3213 });
3214
3215 MicroEvent.mixin(SpeedDialView);
3216
3217 $onsen.derivePropertiesFromElement(SpeedDialView, ['disabled', 'visible', 'inline']);
3218
3219 return SpeedDialView;
3220 }]);
3221})();
3222'use strict';
3223
3224/*
3225Copyright 2013-2015 ASIAL CORPORATION
3226
3227Licensed under the Apache License, Version 2.0 (the "License");
3228you may not use this file except in compliance with the License.
3229You may obtain a copy of the License at
3230
3231 http://www.apache.org/licenses/LICENSE-2.0
3232
3233Unless required by applicable law or agreed to in writing, software
3234distributed under the License is distributed on an "AS IS" BASIS,
3235WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3236See the License for the specific language governing permissions and
3237limitations under the License.
3238
3239*/
3240(function () {
3241 'use strict';
3242
3243 var module = angular.module('onsen');
3244
3245 module.factory('SplitView', ['$compile', 'RevealSlidingMenuAnimator', '$onsen', '$onsGlobal', function ($compile, RevealSlidingMenuAnimator, $onsen, $onsGlobal) {
3246 var SPLIT_MODE = 0;
3247 var COLLAPSE_MODE = 1;
3248 var MAIN_PAGE_RATIO = 0.9;
3249
3250 var SplitView = Class.extend({
3251
3252 init: function init(scope, element, attrs) {
3253 element.addClass('onsen-sliding-menu');
3254
3255 this._element = element;
3256 this._scope = scope;
3257 this._attrs = attrs;
3258
3259 this._mainPage = angular.element(element[0].querySelector('.onsen-split-view__main'));
3260 this._secondaryPage = angular.element(element[0].querySelector('.onsen-split-view__secondary'));
3261
3262 this._max = this._mainPage[0].clientWidth * MAIN_PAGE_RATIO;
3263 this._mode = SPLIT_MODE;
3264 this._doorLock = new ons._DoorLock();
3265
3266 this._doSplit = false;
3267 this._doCollapse = false;
3268
3269 $onsGlobal.orientation.on('change', this._onResize.bind(this));
3270
3271 this._animator = new RevealSlidingMenuAnimator();
3272
3273 this._element.css('display', 'none');
3274
3275 if (attrs.mainPage) {
3276 this.setMainPage(attrs.mainPage);
3277 }
3278
3279 if (attrs.secondaryPage) {
3280 this.setSecondaryPage(attrs.secondaryPage);
3281 }
3282
3283 var unlock = this._doorLock.lock();
3284
3285 this._considerChangingCollapse();
3286 this._setSize();
3287
3288 setTimeout(function () {
3289 this._element.css('display', 'block');
3290 unlock();
3291 }.bind(this), 1000 / 60 * 2);
3292
3293 scope.$on('$destroy', this._destroy.bind(this));
3294
3295 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['init', 'show', 'hide', 'destroy']);
3296 },
3297
3298 /**
3299 * @param {String} templateHTML
3300 */
3301 _appendSecondPage: function _appendSecondPage(templateHTML) {
3302 var pageScope = this._scope.$new();
3303 var pageContent = $compile(templateHTML)(pageScope);
3304
3305 this._secondaryPage.append(pageContent);
3306
3307 if (this._currentSecondaryPageElement) {
3308 this._currentSecondaryPageElement.remove();
3309 this._currentSecondaryPageScope.$destroy();
3310 }
3311
3312 this._currentSecondaryPageElement = pageContent;
3313 this._currentSecondaryPageScope = pageScope;
3314 },
3315
3316 /**
3317 * @param {String} templateHTML
3318 */
3319 _appendMainPage: function _appendMainPage(templateHTML) {
3320 var _this = this;
3321
3322 var pageScope = this._scope.$new();
3323 var pageContent = $compile(templateHTML)(pageScope);
3324
3325 this._mainPage.append(pageContent);
3326
3327 if (this._currentPage) {
3328 this._currentPageScope.$destroy();
3329 }
3330
3331 this._currentPage = pageContent;
3332 this._currentPageScope = pageScope;
3333
3334 setImmediate(function () {
3335 _this._currentPage[0]._show();
3336 });
3337 },
3338
3339 /**
3340 * @param {String} page
3341 */
3342 setSecondaryPage: function setSecondaryPage(page) {
3343 if (page) {
3344 $onsen.getPageHTMLAsync(page).then(function (html) {
3345 this._appendSecondPage(angular.element(html.trim()));
3346 }.bind(this), function () {
3347 throw new Error('Page is not found: ' + page);
3348 });
3349 } else {
3350 throw new Error('cannot set undefined page');
3351 }
3352 },
3353
3354 /**
3355 * @param {String} page
3356 */
3357 setMainPage: function setMainPage(page) {
3358 if (page) {
3359 $onsen.getPageHTMLAsync(page).then(function (html) {
3360 this._appendMainPage(angular.element(html.trim()));
3361 }.bind(this), function () {
3362 throw new Error('Page is not found: ' + page);
3363 });
3364 } else {
3365 throw new Error('cannot set undefined page');
3366 }
3367 },
3368
3369 _onResize: function _onResize() {
3370 var lastMode = this._mode;
3371
3372 this._considerChangingCollapse();
3373
3374 if (lastMode === COLLAPSE_MODE && this._mode === COLLAPSE_MODE) {
3375 this._animator.onResized({
3376 isOpened: false,
3377 width: '90%'
3378 });
3379 }
3380
3381 this._max = this._mainPage[0].clientWidth * MAIN_PAGE_RATIO;
3382 },
3383
3384 _considerChangingCollapse: function _considerChangingCollapse() {
3385 var should = this._shouldCollapse();
3386
3387 if (should && this._mode !== COLLAPSE_MODE) {
3388 this._fireUpdateEvent();
3389 if (this._doSplit) {
3390 this._activateSplitMode();
3391 } else {
3392 this._activateCollapseMode();
3393 }
3394 } else if (!should && this._mode === COLLAPSE_MODE) {
3395 this._fireUpdateEvent();
3396 if (this._doCollapse) {
3397 this._activateCollapseMode();
3398 } else {
3399 this._activateSplitMode();
3400 }
3401 }
3402
3403 this._doCollapse = this._doSplit = false;
3404 },
3405
3406 update: function update() {
3407 this._fireUpdateEvent();
3408
3409 var should = this._shouldCollapse();
3410
3411 if (this._doSplit) {
3412 this._activateSplitMode();
3413 } else if (this._doCollapse) {
3414 this._activateCollapseMode();
3415 } else if (should) {
3416 this._activateCollapseMode();
3417 } else if (!should) {
3418 this._activateSplitMode();
3419 }
3420
3421 this._doSplit = this._doCollapse = false;
3422 },
3423
3424 _getOrientation: function _getOrientation() {
3425 if ($onsGlobal.orientation.isPortrait()) {
3426 return 'portrait';
3427 } else {
3428 return 'landscape';
3429 }
3430 },
3431
3432 getCurrentMode: function getCurrentMode() {
3433 if (this._mode === COLLAPSE_MODE) {
3434 return 'collapse';
3435 } else {
3436 return 'split';
3437 }
3438 },
3439
3440 _shouldCollapse: function _shouldCollapse() {
3441 var c = 'portrait';
3442 if (typeof this._attrs.collapse === 'string') {
3443 c = this._attrs.collapse.trim();
3444 }
3445
3446 if (c == 'portrait') {
3447 return $onsGlobal.orientation.isPortrait();
3448 } else if (c == 'landscape') {
3449 return $onsGlobal.orientation.isLandscape();
3450 } else if (c.substr(0, 5) == 'width') {
3451 var num = c.split(' ')[1];
3452 if (num.indexOf('px') >= 0) {
3453 num = num.substr(0, num.length - 2);
3454 }
3455
3456 var width = window.innerWidth;
3457
3458 return isNumber(num) && width < num;
3459 } else {
3460 var mq = window.matchMedia(c);
3461 return mq.matches;
3462 }
3463 },
3464
3465 _setSize: function _setSize() {
3466 if (this._mode === SPLIT_MODE) {
3467 if (!this._attrs.mainPageWidth) {
3468 this._attrs.mainPageWidth = '70';
3469 }
3470
3471 var secondarySize = 100 - this._attrs.mainPageWidth.replace('%', '');
3472 this._secondaryPage.css({
3473 width: secondarySize + '%',
3474 opacity: 1
3475 });
3476
3477 this._mainPage.css({
3478 width: this._attrs.mainPageWidth + '%'
3479 });
3480
3481 this._mainPage.css('left', secondarySize + '%');
3482 }
3483 },
3484
3485 _fireEvent: function _fireEvent(name) {
3486 this.emit(name, {
3487 splitView: this,
3488 width: window.innerWidth,
3489 orientation: this._getOrientation()
3490 });
3491 },
3492
3493 _fireUpdateEvent: function _fireUpdateEvent() {
3494 var that = this;
3495
3496 this.emit('update', {
3497 splitView: this,
3498 shouldCollapse: this._shouldCollapse(),
3499 currentMode: this.getCurrentMode(),
3500 split: function split() {
3501 that._doSplit = true;
3502 that._doCollapse = false;
3503 },
3504 collapse: function collapse() {
3505 that._doSplit = false;
3506 that._doCollapse = true;
3507 },
3508 width: window.innerWidth,
3509 orientation: this._getOrientation()
3510 });
3511 },
3512
3513 _activateCollapseMode: function _activateCollapseMode() {
3514 if (this._mode !== COLLAPSE_MODE) {
3515 this._fireEvent('precollapse');
3516 this._secondaryPage.attr('style', '');
3517 this._mainPage.attr('style', '');
3518
3519 this._mode = COLLAPSE_MODE;
3520
3521 this._animator.setup(this._element, this._mainPage, this._secondaryPage, { isRight: false, width: '90%' });
3522
3523 this._fireEvent('postcollapse');
3524 }
3525 },
3526
3527 _activateSplitMode: function _activateSplitMode() {
3528 if (this._mode !== SPLIT_MODE) {
3529 this._fireEvent('presplit');
3530
3531 this._animator.destroy();
3532
3533 this._secondaryPage.attr('style', '');
3534 this._mainPage.attr('style', '');
3535
3536 this._mode = SPLIT_MODE;
3537 this._setSize();
3538
3539 this._fireEvent('postsplit');
3540 }
3541 },
3542
3543 _destroy: function _destroy() {
3544 this.emit('destroy');
3545
3546 this._clearDerivingEvents();
3547
3548 this._element = null;
3549 this._scope = null;
3550 }
3551 });
3552
3553 function isNumber(n) {
3554 return !isNaN(parseFloat(n)) && isFinite(n);
3555 }
3556
3557 MicroEvent.mixin(SplitView);
3558
3559 return SplitView;
3560 }]);
3561})();
3562'use strict';
3563
3564/*
3565Copyright 2013-2015 ASIAL CORPORATION
3566
3567Licensed under the Apache License, Version 2.0 (the "License");
3568you may not use this file except in compliance with the License.
3569You may obtain a copy of the License at
3570
3571 http://www.apache.org/licenses/LICENSE-2.0
3572
3573Unless required by applicable law or agreed to in writing, software
3574distributed under the License is distributed on an "AS IS" BASIS,
3575WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3576See the License for the specific language governing permissions and
3577limitations under the License.
3578
3579*/
3580(function () {
3581 'use strict';
3582
3583 angular.module('onsen').factory('SplitterContent', ['$onsen', '$compile', function ($onsen, $compile) {
3584
3585 var SplitterContent = Class.extend({
3586
3587 init: function init(scope, element, attrs) {
3588 var _this = this;
3589
3590 this._element = element;
3591 this._scope = scope;
3592 this._attrs = attrs;
3593
3594 this.load = function () {
3595 var _element$;
3596
3597 _this._pageScope && _this._pageScope.$destroy();
3598 return (_element$ = _this._element[0]).load.apply(_element$, arguments);
3599 };
3600 scope.$on('$destroy', this._destroy.bind(this));
3601 },
3602
3603 _link: function _link(fragment, done) {
3604 this._pageScope = this._scope.$new();
3605 $compile(fragment)(this._pageScope);
3606
3607 this._pageScope.$evalAsync(function () {
3608 return done(fragment);
3609 });
3610 },
3611
3612 _destroy: function _destroy() {
3613 this.emit('destroy');
3614 this._element = this._scope = this._attrs = this.load = this._pageScope = null;
3615 }
3616 });
3617
3618 MicroEvent.mixin(SplitterContent);
3619 $onsen.derivePropertiesFromElement(SplitterContent, ['page']);
3620
3621 return SplitterContent;
3622 }]);
3623})();
3624'use strict';
3625
3626/*
3627Copyright 2013-2015 ASIAL CORPORATION
3628
3629Licensed under the Apache License, Version 2.0 (the "License");
3630you may not use this file except in compliance with the License.
3631You may obtain a copy of the License at
3632
3633 http://www.apache.org/licenses/LICENSE-2.0
3634
3635Unless required by applicable law or agreed to in writing, software
3636distributed under the License is distributed on an "AS IS" BASIS,
3637WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3638See the License for the specific language governing permissions and
3639limitations under the License.
3640
3641*/
3642(function () {
3643 'use strict';
3644
3645 angular.module('onsen').factory('SplitterSide', ['$onsen', '$compile', function ($onsen, $compile) {
3646
3647 var SplitterSide = Class.extend({
3648
3649 init: function init(scope, element, attrs) {
3650 var _this = this;
3651
3652 this._element = element;
3653 this._scope = scope;
3654 this._attrs = attrs;
3655
3656 this._clearDerivingMethods = $onsen.deriveMethods(this, this._element[0], ['open', 'close', 'toggle']);
3657
3658 this.load = function () {
3659 var _element$;
3660
3661 _this._pageScope && _this._pageScope.$destroy();
3662 return (_element$ = _this._element[0]).load.apply(_element$, arguments);
3663 };
3664
3665 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['modechange', 'preopen', 'preclose', 'postopen', 'postclose'], function (detail) {
3666 return detail.side ? angular.extend(detail, { side: _this }) : detail;
3667 });
3668
3669 scope.$on('$destroy', this._destroy.bind(this));
3670 },
3671
3672 _link: function _link(fragment, done) {
3673 var link = $compile(fragment);
3674 this._pageScope = this._scope.$new();
3675 link(this._pageScope);
3676
3677 this._pageScope.$evalAsync(function () {
3678 return done(fragment);
3679 });
3680 },
3681
3682 _destroy: function _destroy() {
3683 this.emit('destroy');
3684
3685 this._clearDerivingMethods();
3686 this._clearDerivingEvents();
3687
3688 this._element = this._scope = this._attrs = this.load = this._pageScope = null;
3689 }
3690 });
3691
3692 MicroEvent.mixin(SplitterSide);
3693 $onsen.derivePropertiesFromElement(SplitterSide, ['page', 'mode', 'isOpen']);
3694
3695 return SplitterSide;
3696 }]);
3697})();
3698'use strict';
3699
3700/*
3701Copyright 2013-2015 ASIAL CORPORATION
3702
3703Licensed under the Apache License, Version 2.0 (the "License");
3704you may not use this file except in compliance with the License.
3705You may obtain a copy of the License at
3706
3707 http://www.apache.org/licenses/LICENSE-2.0
3708
3709Unless required by applicable law or agreed to in writing, software
3710distributed under the License is distributed on an "AS IS" BASIS,
3711WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3712See the License for the specific language governing permissions and
3713limitations under the License.
3714
3715*/
3716(function () {
3717 'use strict';
3718
3719 angular.module('onsen').factory('Splitter', ['$onsen', function ($onsen) {
3720
3721 var Splitter = Class.extend({
3722 init: function init(scope, element, attrs) {
3723 this._element = element;
3724 this._scope = scope;
3725 this._attrs = attrs;
3726 scope.$on('$destroy', this._destroy.bind(this));
3727 },
3728
3729 _destroy: function _destroy() {
3730 this.emit('destroy');
3731 this._element = this._scope = this._attrs = null;
3732 }
3733 });
3734
3735 MicroEvent.mixin(Splitter);
3736 $onsen.derivePropertiesFromElement(Splitter, ['onDeviceBackButton']);
3737
3738 ['left', 'right', 'content', 'mask'].forEach(function (prop, i) {
3739 Object.defineProperty(Splitter.prototype, prop, {
3740 get: function get() {
3741 var tagName = 'ons-splitter-' + (i < 2 ? 'side' : prop);
3742 return angular.element(this._element[0][prop]).data(tagName);
3743 }
3744 });
3745 });
3746
3747 return Splitter;
3748 }]);
3749})();
3750'use strict';
3751
3752/*
3753Copyright 2013-2015 ASIAL CORPORATION
3754
3755Licensed under the Apache License, Version 2.0 (the "License");
3756you may not use this file except in compliance with the License.
3757You may obtain a copy of the License at
3758
3759 http://www.apache.org/licenses/LICENSE-2.0
3760
3761Unless required by applicable law or agreed to in writing, software
3762distributed under the License is distributed on an "AS IS" BASIS,
3763WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3764See the License for the specific language governing permissions and
3765limitations under the License.
3766
3767*/
3768
3769(function () {
3770 'use strict';
3771
3772 angular.module('onsen').factory('SwitchView', ['$parse', '$onsen', function ($parse, $onsen) {
3773
3774 var SwitchView = Class.extend({
3775
3776 /**
3777 * @param {jqLite} element
3778 * @param {Object} scope
3779 * @param {Object} attrs
3780 */
3781 init: function init(element, scope, attrs) {
3782 var _this = this;
3783
3784 this._element = element;
3785 this._checkbox = angular.element(element[0].querySelector('input[type=checkbox]'));
3786 this._scope = scope;
3787
3788 this._prepareNgModel(element, scope, attrs);
3789
3790 this._scope.$on('$destroy', function () {
3791 _this.emit('destroy');
3792 _this._element = _this._checkbox = _this._scope = null;
3793 });
3794 },
3795
3796 _prepareNgModel: function _prepareNgModel(element, scope, attrs) {
3797 var _this2 = this;
3798
3799 if (attrs.ngModel) {
3800 var set = $parse(attrs.ngModel).assign;
3801
3802 scope.$parent.$watch(attrs.ngModel, function (value) {
3803 _this2.checked = !!value;
3804 });
3805
3806 this._element.on('change', function (e) {
3807 set(scope.$parent, _this2.checked);
3808
3809 if (attrs.ngChange) {
3810 scope.$eval(attrs.ngChange);
3811 }
3812
3813 scope.$parent.$evalAsync();
3814 });
3815 }
3816 }
3817 });
3818
3819 MicroEvent.mixin(SwitchView);
3820 $onsen.derivePropertiesFromElement(SwitchView, ['disabled', 'checked', 'checkbox']);
3821
3822 return SwitchView;
3823 }]);
3824})();
3825'use strict';
3826
3827/*
3828Copyright 2013-2015 ASIAL CORPORATION
3829
3830Licensed under the Apache License, Version 2.0 (the "License");
3831you may not use this file except in compliance with the License.
3832You may obtain a copy of the License at
3833
3834 http://www.apache.org/licenses/LICENSE-2.0
3835
3836Unless required by applicable law or agreed to in writing, software
3837distributed under the License is distributed on an "AS IS" BASIS,
3838WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3839See the License for the specific language governing permissions and
3840limitations under the License.
3841
3842*/
3843
3844(function () {
3845 'use strict';
3846
3847 var module = angular.module('onsen');
3848
3849 module.value('TabbarNoneAnimator', ons._internal.TabbarNoneAnimator);
3850 module.value('TabbarFadeAnimator', ons._internal.TabbarFadeAnimator);
3851 module.value('TabbarSlideAnimator', ons._internal.TabbarSlideAnimator);
3852
3853 module.factory('TabbarView', ['$onsen', '$compile', '$parse', function ($onsen, $compile, $parse) {
3854 var TabbarView = Class.extend({
3855
3856 init: function init(scope, element, attrs) {
3857 if (element[0].nodeName.toLowerCase() !== 'ons-tabbar') {
3858 throw new Error('"element" parameter must be a "ons-tabbar" element.');
3859 }
3860
3861 this._scope = scope;
3862 this._element = element;
3863 this._attrs = attrs;
3864 this._lastPageElement = null;
3865 this._lastPageScope = null;
3866
3867 this._scope.$on('$destroy', this._destroy.bind(this));
3868
3869 this._clearDerivingEvents = $onsen.deriveEvents(this, element[0], ['reactive', 'postchange', 'prechange', 'init', 'show', 'hide', 'destroy']);
3870
3871 this._clearDerivingMethods = $onsen.deriveMethods(this, element[0], ['setActiveTab', 'setTabbarVisibility', 'getActiveTabIndex', 'loadPage']);
3872 },
3873
3874 _compileAndLink: function _compileAndLink(pageElement, callback) {
3875 var link = $compile(pageElement);
3876 var pageScope = this._scope.$new();
3877 link(pageScope);
3878
3879 pageScope.$evalAsync(function () {
3880 callback(pageElement);
3881 });
3882 },
3883
3884 _destroy: function _destroy() {
3885 this.emit('destroy');
3886
3887 this._clearDerivingEvents();
3888 this._clearDerivingMethods();
3889
3890 this._element = this._scope = this._attrs = null;
3891 }
3892 });
3893 MicroEvent.mixin(TabbarView);
3894
3895 TabbarView.registerAnimator = function (name, Animator) {
3896 return window.ons.TabbarElement.registerAnimator(name, Animator);
3897 };
3898
3899 return TabbarView;
3900 }]);
3901})();
3902'use strict';
3903
3904/**
3905 * @element ons-alert-dialog
3906 */
3907
3908/**
3909 * @attribute var
3910 * @initonly
3911 * @type {String}
3912 * @description
3913 * [en]Variable name to refer this alert dialog.[/en]
3914 * [ja]このアラートダイアログを参照するための名前を指定します。[/ja]
3915 */
3916
3917/**
3918 * @attribute ons-preshow
3919 * @initonly
3920 * @type {Expression}
3921 * @description
3922 * [en]Allows you to specify custom behavior when the "preshow" event is fired.[/en]
3923 * [ja]"preshow"イベントが発火された時の挙動を独自に指定できます。[/ja]
3924 */
3925
3926/**
3927 * @attribute ons-prehide
3928 * @initonly
3929 * @type {Expression}
3930 * @description
3931 * [en]Allows you to specify custom behavior when the "prehide" event is fired.[/en]
3932 * [ja]"prehide"イベントが発火された時の挙動を独自に指定できます。[/ja]
3933 */
3934
3935/**
3936 * @attribute ons-postshow
3937 * @initonly
3938 * @type {Expression}
3939 * @description
3940 * [en]Allows you to specify custom behavior when the "postshow" event is fired.[/en]
3941 * [ja]"postshow"イベントが発火された時の挙動を独自に指定できます。[/ja]
3942 */
3943
3944/**
3945 * @attribute ons-posthide
3946 * @initonly
3947 * @type {Expression}
3948 * @description
3949 * [en]Allows you to specify custom behavior when the "posthide" event is fired.[/en]
3950 * [ja]"posthide"イベントが発火された時の挙動を独自に指定できます。[/ja]
3951 */
3952
3953/**
3954 * @attribute ons-destroy
3955 * @initonly
3956 * @type {Expression}
3957 * @description
3958 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
3959 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
3960 */
3961
3962/**
3963 * @method on
3964 * @signature on(eventName, listener)
3965 * @description
3966 * [en]Add an event listener.[/en]
3967 * [ja]イベントリスナーを追加します。[/ja]
3968 * @param {String} eventName
3969 * [en]Name of the event.[/en]
3970 * [ja]イベント名を指定します。[/ja]
3971 * @param {Function} listener
3972 * [en]Function to execute when the event is triggered.[/en]
3973 * [ja]イベントが発火された際に呼び出されるコールバックを指定します。[/ja]
3974 */
3975
3976/**
3977 * @method once
3978 * @signature once(eventName, listener)
3979 * @description
3980 * [en]Add an event listener that's only triggered once.[/en]
3981 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
3982 * @param {String} eventName
3983 * [en]Name of the event.[/en]
3984 * [ja]イベント名を指定します。[/ja]
3985 * @param {Function} listener
3986 * [en]Function to execute when the event is triggered.[/en]
3987 * [ja]イベントが発火した際に呼び出されるコールバックを指定します。[/ja]
3988 */
3989
3990/**
3991 * @method off
3992 * @signature off(eventName, [listener])
3993 * @description
3994 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
3995 * [ja]イベントリスナーを削除します。もしlistenerパラメータが指定されなかった場合、そのイベントのリスナーが全て削除されます。[/ja]
3996 * @param {String} eventName
3997 * [en]Name of the event.[/en]
3998 * [ja]イベント名を指定します。[/ja]
3999 * @param {Function} listener
4000 * [en]Function to execute when the event is triggered.[/en]
4001 * [ja]削除するイベントリスナーの関数オブジェクトを渡します。[/ja]
4002 */
4003
4004(function () {
4005 'use strict';
4006
4007 /**
4008 * Alert dialog directive.
4009 */
4010
4011 angular.module('onsen').directive('onsAlertDialog', ['$onsen', 'AlertDialogView', function ($onsen, AlertDialogView) {
4012 return {
4013 restrict: 'E',
4014 replace: false,
4015 scope: true,
4016 transclude: false,
4017
4018 compile: function compile(element, attrs) {
4019
4020 return {
4021 pre: function pre(scope, element, attrs) {
4022 var alertDialog = new AlertDialogView(scope, element, attrs);
4023
4024 $onsen.declareVarAttribute(attrs, alertDialog);
4025 $onsen.registerEventHandlers(alertDialog, 'preshow prehide postshow posthide destroy');
4026 $onsen.addModifierMethodsForCustomElements(alertDialog, element);
4027
4028 element.data('ons-alert-dialog', alertDialog);
4029 element.data('_scope', scope);
4030
4031 scope.$on('$destroy', function () {
4032 alertDialog._events = undefined;
4033 $onsen.removeModifierMethods(alertDialog);
4034 element.data('ons-alert-dialog', undefined);
4035 element = null;
4036 });
4037 },
4038 post: function post(scope, element) {
4039 $onsen.fireComponentEvent(element[0], 'init');
4040 }
4041 };
4042 }
4043 };
4044 }]);
4045})();
4046'use strict';
4047
4048(function () {
4049 'use strict';
4050
4051 var module = angular.module('onsen');
4052
4053 module.directive('onsBackButton', ['$onsen', '$compile', 'GenericView', 'ComponentCleaner', function ($onsen, $compile, GenericView, ComponentCleaner) {
4054 return {
4055 restrict: 'E',
4056 replace: false,
4057
4058 compile: function compile(element, attrs) {
4059
4060 return {
4061 pre: function pre(scope, element, attrs, controller, transclude) {
4062 var backButton = GenericView.register(scope, element, attrs, {
4063 viewKey: 'ons-back-button'
4064 });
4065
4066 scope.$on('$destroy', function () {
4067 backButton._events = undefined;
4068 $onsen.removeModifierMethods(backButton);
4069 element = null;
4070 });
4071
4072 ComponentCleaner.onDestroy(scope, function () {
4073 ComponentCleaner.destroyScope(scope);
4074 ComponentCleaner.destroyAttributes(attrs);
4075 element = scope = attrs = null;
4076 });
4077 },
4078 post: function post(scope, element) {
4079 $onsen.fireComponentEvent(element[0], 'init');
4080 }
4081 };
4082 }
4083 };
4084 }]);
4085})();
4086'use strict';
4087
4088(function () {
4089 'use strict';
4090
4091 angular.module('onsen').directive('onsBottomToolbar', ['$onsen', 'GenericView', function ($onsen, GenericView) {
4092 return {
4093 restrict: 'E',
4094 link: {
4095 pre: function pre(scope, element, attrs) {
4096 GenericView.register(scope, element, attrs, {
4097 viewKey: 'ons-bottomToolbar'
4098 });
4099 },
4100
4101 post: function post(scope, element, attrs) {
4102 $onsen.fireComponentEvent(element[0], 'init');
4103 }
4104 }
4105 };
4106 }]);
4107})();
4108'use strict';
4109
4110/**
4111 * @element ons-button
4112 */
4113
4114(function () {
4115 'use strict';
4116
4117 angular.module('onsen').directive('onsButton', ['$onsen', 'GenericView', function ($onsen, GenericView) {
4118 return {
4119 restrict: 'E',
4120 link: function link(scope, element, attrs) {
4121 var button = GenericView.register(scope, element, attrs, {
4122 viewKey: 'ons-button'
4123 });
4124
4125 Object.defineProperty(button, 'disabled', {
4126 get: function get() {
4127 return this._element[0].disabled;
4128 },
4129 set: function set(value) {
4130 return this._element[0].disabled = value;
4131 }
4132 });
4133 $onsen.fireComponentEvent(element[0], 'init');
4134 }
4135 };
4136 }]);
4137})();
4138'use strict';
4139
4140/**
4141 * @element ons-carousel
4142 * @description
4143 * [en]Carousel component.[/en]
4144 * [ja]カルーセルを表示できるコンポーネント。[/ja]
4145 * @codepen xbbzOQ
4146 * @guide UsingCarousel
4147 * [en]Learn how to use the carousel component.[/en]
4148 * [ja]carouselコンポーネントの使い方[/ja]
4149 * @example
4150 * <ons-carousel style="width: 100%; height: 200px">
4151 * <ons-carousel-item>
4152 * ...
4153 * </ons-carousel-item>
4154 * <ons-carousel-item>
4155 * ...
4156 * </ons-carousel-item>
4157 * </ons-carousel>
4158 */
4159
4160/**
4161 * @attribute var
4162 * @initonly
4163 * @type {String}
4164 * @description
4165 * [en]Variable name to refer this carousel.[/en]
4166 * [ja]このカルーセルを参照するための変数名を指定します。[/ja]
4167 */
4168
4169/**
4170 * @attribute ons-postchange
4171 * @initonly
4172 * @type {Expression}
4173 * @description
4174 * [en]Allows you to specify custom behavior when the "postchange" event is fired.[/en]
4175 * [ja]"postchange"イベントが発火された時の挙動を独自に指定できます。[/ja]
4176 */
4177
4178/**
4179 * @attribute ons-refresh
4180 * @initonly
4181 * @type {Expression}
4182 * @description
4183 * [en]Allows you to specify custom behavior when the "refresh" event is fired.[/en]
4184 * [ja]"refresh"イベントが発火された時の挙動を独自に指定できます。[/ja]
4185 */
4186
4187/**
4188 * @attribute ons-overscroll
4189 * @initonly
4190 * @type {Expression}
4191 * @description
4192 * [en]Allows you to specify custom behavior when the "overscroll" event is fired.[/en]
4193 * [ja]"overscroll"イベントが発火された時の挙動を独自に指定できます。[/ja]
4194 */
4195
4196/**
4197 * @attribute ons-destroy
4198 * @initonly
4199 * @type {Expression}
4200 * @description
4201 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
4202 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
4203 */
4204
4205/**
4206 * @method once
4207 * @signature once(eventName, listener)
4208 * @description
4209 * [en]Add an event listener that's only triggered once.[/en]
4210 * [ja]一度だけ呼び出されるイベントリスナを追加します。[/ja]
4211 * @param {String} eventName
4212 * [en]Name of the event.[/en]
4213 * [ja]イベント名を指定します。[/ja]
4214 * @param {Function} listener
4215 * [en]Function to execute when the event is triggered.[/en]
4216 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
4217 */
4218
4219/**
4220 * @method off
4221 * @signature off(eventName, [listener])
4222 * @description
4223 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
4224 * [ja]イベントリスナーを削除します。もしイベントリスナーが指定されなかった場合には、そのイベントに紐付いているイベントリスナーが全て削除されます。[/ja]
4225 * @param {String} eventName
4226 * [en]Name of the event.[/en]
4227 * [ja]イベント名を指定します。[/ja]
4228 * @param {Function} listener
4229 * [en]Function to execute when the event is triggered.[/en]
4230 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
4231 */
4232
4233/**
4234 * @method on
4235 * @signature on(eventName, listener)
4236 * @description
4237 * [en]Add an event listener.[/en]
4238 * [ja]イベントリスナーを追加します。[/ja]
4239 * @param {String} eventName
4240 * [en]Name of the event.[/en]
4241 * [ja]イベント名を指定します。[/ja]
4242 * @param {Function} listener
4243 * [en]Function to execute when the event is triggered.[/en]
4244 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
4245 */
4246
4247(function () {
4248 'use strict';
4249
4250 var module = angular.module('onsen');
4251
4252 module.directive('onsCarousel', ['$onsen', 'CarouselView', function ($onsen, CarouselView) {
4253 return {
4254 restrict: 'E',
4255 replace: false,
4256
4257 // NOTE: This element must coexists with ng-controller.
4258 // Do not use isolated scope and template's ng-transclude.
4259 scope: false,
4260 transclude: false,
4261
4262 compile: function compile(element, attrs) {
4263
4264 return function (scope, element, attrs) {
4265 var carousel = new CarouselView(scope, element, attrs);
4266
4267 element.data('ons-carousel', carousel);
4268
4269 $onsen.registerEventHandlers(carousel, 'postchange refresh overscroll destroy');
4270 $onsen.declareVarAttribute(attrs, carousel);
4271
4272 scope.$on('$destroy', function () {
4273 carousel._events = undefined;
4274 element.data('ons-carousel', undefined);
4275 element = null;
4276 });
4277
4278 $onsen.fireComponentEvent(element[0], 'init');
4279 };
4280 }
4281
4282 };
4283 }]);
4284
4285 module.directive('onsCarouselItem', function () {
4286 return {
4287 restrict: 'E',
4288 compile: function compile(element, attrs) {
4289 return function (scope, element, attrs) {
4290 if (scope.$last) {
4291 element[0].parentElement._setup();
4292 element[0].parentElement._setupInitialIndex();
4293 element[0].parentElement._saveLastState();
4294 }
4295 };
4296 }
4297 };
4298 });
4299})();
4300'use strict';
4301
4302/**
4303 * @element ons-dialog
4304 */
4305
4306/**
4307 * @attribute var
4308 * @initonly
4309 * @type {String}
4310 * @description
4311 * [en]Variable name to refer this dialog.[/en]
4312 * [ja]このダイアログを参照するための名前を指定します。[/ja]
4313 */
4314
4315/**
4316 * @attribute ons-preshow
4317 * @initonly
4318 * @type {Expression}
4319 * @description
4320 * [en]Allows you to specify custom behavior when the "preshow" event is fired.[/en]
4321 * [ja]"preshow"イベントが発火された時の挙動を独自に指定できます。[/ja]
4322 */
4323
4324/**
4325 * @attribute ons-prehide
4326 * @initonly
4327 * @type {Expression}
4328 * @description
4329 * [en]Allows you to specify custom behavior when the "prehide" event is fired.[/en]
4330 * [ja]"prehide"イベントが発火された時の挙動を独自に指定できます。[/ja]
4331 */
4332
4333/**
4334 * @attribute ons-postshow
4335 * @initonly
4336 * @type {Expression}
4337 * @description
4338 * [en]Allows you to specify custom behavior when the "postshow" event is fired.[/en]
4339 * [ja]"postshow"イベントが発火された時の挙動を独自に指定できます。[/ja]
4340 */
4341
4342/**
4343 * @attribute ons-posthide
4344 * @initonly
4345 * @type {Expression}
4346 * @description
4347 * [en]Allows you to specify custom behavior when the "posthide" event is fired.[/en]
4348 * [ja]"posthide"イベントが発火された時の挙動を独自に指定できます。[/ja]
4349 */
4350
4351/**
4352 * @attribute ons-destroy
4353 * @initonly
4354 * @type {Expression}
4355 * @description
4356 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
4357 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
4358 */
4359
4360/**
4361 * @method on
4362 * @signature on(eventName, listener)
4363 * @description
4364 * [en]Add an event listener.[/en]
4365 * [ja]イベントリスナーを追加します。[/ja]
4366 * @param {String} eventName
4367 * [en]Name of the event.[/en]
4368 * [ja]イベント名を指定します。[/ja]
4369 * @param {Function} listener
4370 * [en]Function to execute when the event is triggered.[/en]
4371 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
4372 */
4373
4374/**
4375 * @method once
4376 * @signature once(eventName, listener)
4377 * @description
4378 * [en]Add an event listener that's only triggered once.[/en]
4379 * [ja]一度だけ呼び出されるイベントリスナを追加します。[/ja]
4380 * @param {String} eventName
4381 * [en]Name of the event.[/en]
4382 * [ja]イベント名を指定します。[/ja]
4383 * @param {Function} listener
4384 * [en]Function to execute when the event is triggered.[/en]
4385 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
4386 */
4387
4388/**
4389 * @method off
4390 * @signature off(eventName, [listener])
4391 * @description
4392 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
4393 * [ja]イベントリスナーを削除します。もしイベントリスナーが指定されなかった場合には、そのイベントに紐付いているイベントリスナーが全て削除されます。[/ja]
4394 * @param {String} eventName
4395 * [en]Name of the event.[/en]
4396 * [ja]イベント名を指定します。[/ja]
4397 * @param {Function} listener
4398 * [en]Function to execute when the event is triggered.[/en]
4399 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
4400 */
4401(function () {
4402 'use strict';
4403
4404 angular.module('onsen').directive('onsDialog', ['$onsen', 'DialogView', function ($onsen, DialogView) {
4405 return {
4406 restrict: 'E',
4407 scope: true,
4408 compile: function compile(element, attrs) {
4409
4410 return {
4411 pre: function pre(scope, element, attrs) {
4412
4413 var dialog = new DialogView(scope, element, attrs);
4414 $onsen.declareVarAttribute(attrs, dialog);
4415 $onsen.registerEventHandlers(dialog, 'preshow prehide postshow posthide destroy');
4416 $onsen.addModifierMethodsForCustomElements(dialog, element);
4417
4418 element.data('ons-dialog', dialog);
4419 scope.$on('$destroy', function () {
4420 dialog._events = undefined;
4421 $onsen.removeModifierMethods(dialog);
4422 element.data('ons-dialog', undefined);
4423 element = null;
4424 });
4425 },
4426
4427 post: function post(scope, element) {
4428 $onsen.fireComponentEvent(element[0], 'init');
4429 }
4430 };
4431 }
4432 };
4433 }]);
4434})();
4435'use strict';
4436
4437(function () {
4438 'use strict';
4439
4440 var module = angular.module('onsen');
4441
4442 module.directive('onsDummyForInit', ['$rootScope', function ($rootScope) {
4443 var isReady = false;
4444
4445 return {
4446 restrict: 'E',
4447 replace: false,
4448
4449 link: {
4450 post: function post(scope, element) {
4451 if (!isReady) {
4452 isReady = true;
4453 $rootScope.$broadcast('$ons-ready');
4454 }
4455 element.remove();
4456 }
4457 }
4458 };
4459 }]);
4460})();
4461'use strict';
4462
4463/**
4464 * @element ons-fab
4465 */
4466
4467/**
4468 * @attribute var
4469 * @initonly
4470 * @type {String}
4471 * @description
4472 * [en]Variable name to refer the floating action button.[/en]
4473 * [ja]このフローティングアクションボタンを参照するための変数名をしてします。[/ja]
4474 */
4475
4476(function () {
4477 'use strict';
4478
4479 var module = angular.module('onsen');
4480
4481 module.directive('onsFab', ['$onsen', 'FabView', function ($onsen, FabView) {
4482 return {
4483 restrict: 'E',
4484 replace: false,
4485 scope: false,
4486 transclude: false,
4487
4488 compile: function compile(element, attrs) {
4489
4490 return function (scope, element, attrs) {
4491 var fab = new FabView(scope, element, attrs);
4492
4493 element.data('ons-fab', fab);
4494
4495 $onsen.declareVarAttribute(attrs, fab);
4496
4497 scope.$on('$destroy', function () {
4498 element.data('ons-fab', undefined);
4499 element = null;
4500 });
4501
4502 $onsen.fireComponentEvent(element[0], 'init');
4503 };
4504 }
4505
4506 };
4507 }]);
4508})();
4509'use strict';
4510
4511(function () {
4512 'use strict';
4513
4514 var EVENTS = ('drag dragleft dragright dragup dragdown hold release swipe swipeleft swiperight ' + 'swipeup swipedown tap doubletap touch transform pinch pinchin pinchout rotate').split(/ +/);
4515
4516 angular.module('onsen').directive('onsGestureDetector', ['$onsen', function ($onsen) {
4517
4518 var scopeDef = EVENTS.reduce(function (dict, name) {
4519 dict['ng' + titlize(name)] = '&';
4520 return dict;
4521 }, {});
4522
4523 function titlize(str) {
4524 return str.charAt(0).toUpperCase() + str.slice(1);
4525 }
4526
4527 return {
4528 restrict: 'E',
4529 scope: scopeDef,
4530
4531 // NOTE: This element must coexists with ng-controller.
4532 // Do not use isolated scope and template's ng-transclude.
4533 replace: false,
4534 transclude: true,
4535
4536 compile: function compile(element, attrs) {
4537 return function link(scope, element, attrs, _, transclude) {
4538
4539 transclude(scope.$parent, function (cloned) {
4540 element.append(cloned);
4541 });
4542
4543 var handler = function handler(event) {
4544 var attr = 'ng' + titlize(event.type);
4545
4546 if (attr in scopeDef) {
4547 scope[attr]({ $event: event });
4548 }
4549 };
4550
4551 var gestureDetector;
4552
4553 setImmediate(function () {
4554 gestureDetector = element[0]._gestureDetector;
4555 gestureDetector.on(EVENTS.join(' '), handler);
4556 });
4557
4558 $onsen.cleaner.onDestroy(scope, function () {
4559 gestureDetector.off(EVENTS.join(' '), handler);
4560 $onsen.clearComponent({
4561 scope: scope,
4562 element: element,
4563 attrs: attrs
4564 });
4565 gestureDetector.element = scope = element = attrs = null;
4566 });
4567
4568 $onsen.fireComponentEvent(element[0], 'init');
4569 };
4570 }
4571 };
4572 }]);
4573})();
4574'use strict';
4575
4576/**
4577 * @element ons-icon
4578 */
4579
4580(function () {
4581 'use strict';
4582
4583 angular.module('onsen').directive('onsIcon', ['$onsen', 'GenericView', function ($onsen, GenericView) {
4584 return {
4585 restrict: 'E',
4586
4587 compile: function compile(element, attrs) {
4588
4589 if (attrs.icon.indexOf('{{') !== -1) {
4590 attrs.$observe('icon', function () {
4591 setImmediate(function () {
4592 return element[0]._update();
4593 });
4594 });
4595 }
4596
4597 return function (scope, element, attrs) {
4598 GenericView.register(scope, element, attrs, {
4599 viewKey: 'ons-icon'
4600 });
4601 // $onsen.fireComponentEvent(element[0], 'init');
4602 };
4603 }
4604
4605 };
4606 }]);
4607})();
4608'use strict';
4609
4610/**
4611 * @element ons-if-orientation
4612 * @category conditional
4613 * @description
4614 * [en]Conditionally display content depending on screen orientation. Valid values are portrait and landscape. Different from other components, this component is used as attribute in any element.[/en]
4615 * [ja]画面の向きに応じてコンテンツの制御を行います。portraitもしくはlandscapeを指定できます。すべての要素の属性に使用できます。[/ja]
4616 * @seealso ons-if-platform [en]ons-if-platform component[/en][ja]ons-if-platformコンポーネント[/ja]
4617 * @guide UtilityAPIs [en]Other utility APIs[/en][ja]他のユーティリティAPI[/ja]
4618 * @example
4619 * <div ons-if-orientation="portrait">
4620 * <p>This will only be visible in portrait mode.</p>
4621 * </div>
4622 */
4623
4624/**
4625 * @attribute ons-if-orientation
4626 * @initonly
4627 * @type {String}
4628 * @description
4629 * [en]Either "portrait" or "landscape".[/en]
4630 * [ja]portraitもしくはlandscapeを指定します。[/ja]
4631 */
4632
4633(function () {
4634 'use strict';
4635
4636 var module = angular.module('onsen');
4637
4638 module.directive('onsIfOrientation', ['$onsen', '$onsGlobal', function ($onsen, $onsGlobal) {
4639 return {
4640 restrict: 'A',
4641 replace: false,
4642
4643 // NOTE: This element must coexists with ng-controller.
4644 // Do not use isolated scope and template's ng-transclude.
4645 transclude: false,
4646 scope: false,
4647
4648 compile: function compile(element) {
4649 element.css('display', 'none');
4650
4651 return function (scope, element, attrs) {
4652 attrs.$observe('onsIfOrientation', update);
4653 $onsGlobal.orientation.on('change', update);
4654
4655 update();
4656
4657 $onsen.cleaner.onDestroy(scope, function () {
4658 $onsGlobal.orientation.off('change', update);
4659
4660 $onsen.clearComponent({
4661 element: element,
4662 scope: scope,
4663 attrs: attrs
4664 });
4665 element = scope = attrs = null;
4666 });
4667
4668 function update() {
4669 var userOrientation = ('' + attrs.onsIfOrientation).toLowerCase();
4670 var orientation = getLandscapeOrPortrait();
4671
4672 if (userOrientation === 'portrait' || userOrientation === 'landscape') {
4673 if (userOrientation === orientation) {
4674 element.css('display', '');
4675 } else {
4676 element.css('display', 'none');
4677 }
4678 }
4679 }
4680
4681 function getLandscapeOrPortrait() {
4682 return $onsGlobal.orientation.isPortrait() ? 'portrait' : 'landscape';
4683 }
4684 };
4685 }
4686 };
4687 }]);
4688})();
4689'use strict';
4690
4691/**
4692 * @element ons-if-platform
4693 * @category conditional
4694 * @description
4695 * [en]Conditionally display content depending on the platform / browser. Valid values are "opera", "firefox", "safari", "chrome", "ie", "edge", "android", "blackberry", "ios" and "wp".[/en]
4696 * [ja]プラットフォームやブラウザーに応じてコンテンツの制御をおこないます。opera, firefox, safari, chrome, ie, edge, android, blackberry, ios, wpのいずれかの値を空白区切りで複数指定できます。[/ja]
4697 * @seealso ons-if-orientation [en]ons-if-orientation component[/en][ja]ons-if-orientationコンポーネント[/ja]
4698 * @guide UtilityAPIs [en]Other utility APIs[/en][ja]他のユーティリティAPI[/ja]
4699 * @example
4700 * <div ons-if-platform="android">
4701 * ...
4702 * </div>
4703 */
4704
4705/**
4706 * @attribute ons-if-platform
4707 * @type {String}
4708 * @initonly
4709 * @description
4710 * [en]One or multiple space separated values: "opera", "firefox", "safari", "chrome", "ie", "edge", "android", "blackberry", "ios" or "wp".[/en]
4711 * [ja]"opera", "firefox", "safari", "chrome", "ie", "edge", "android", "blackberry", "ios", "wp"のいずれか空白区切りで複数指定できます。[/ja]
4712 */
4713
4714(function () {
4715 'use strict';
4716
4717 var module = angular.module('onsen');
4718
4719 module.directive('onsIfPlatform', ['$onsen', function ($onsen) {
4720 return {
4721 restrict: 'A',
4722 replace: false,
4723
4724 // NOTE: This element must coexists with ng-controller.
4725 // Do not use isolated scope and template's ng-transclude.
4726 transclude: false,
4727 scope: false,
4728
4729 compile: function compile(element) {
4730 element.css('display', 'none');
4731
4732 var platform = getPlatformString();
4733
4734 return function (scope, element, attrs) {
4735 attrs.$observe('onsIfPlatform', function (userPlatform) {
4736 if (userPlatform) {
4737 update();
4738 }
4739 });
4740
4741 update();
4742
4743 $onsen.cleaner.onDestroy(scope, function () {
4744 $onsen.clearComponent({
4745 element: element,
4746 scope: scope,
4747 attrs: attrs
4748 });
4749 element = scope = attrs = null;
4750 });
4751
4752 function update() {
4753 var userPlatforms = attrs.onsIfPlatform.toLowerCase().trim().split(/\s+/);
4754 if (userPlatforms.indexOf(platform.toLowerCase()) >= 0) {
4755 element.css('display', 'block');
4756 } else {
4757 element.css('display', 'none');
4758 }
4759 }
4760 };
4761
4762 function getPlatformString() {
4763
4764 if (navigator.userAgent.match(/Android/i)) {
4765 return 'android';
4766 }
4767
4768 if (navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/RIM Tablet OS/i) || navigator.userAgent.match(/BB10/i)) {
4769 return 'blackberry';
4770 }
4771
4772 if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
4773 return 'ios';
4774 }
4775
4776 if (navigator.userAgent.match(/Windows Phone|IEMobile|WPDesktop/i)) {
4777 return 'wp';
4778 }
4779
4780 // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
4781 var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
4782 if (isOpera) {
4783 return 'opera';
4784 }
4785
4786 var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
4787 if (isFirefox) {
4788 return 'firefox';
4789 }
4790
4791 var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
4792 // At least Safari 3+: "[object HTMLElementConstructor]"
4793 if (isSafari) {
4794 return 'safari';
4795 }
4796
4797 var isEdge = navigator.userAgent.indexOf(' Edge/') >= 0;
4798 if (isEdge) {
4799 return 'edge';
4800 }
4801
4802 var isChrome = !!window.chrome && !isOpera && !isEdge; // Chrome 1+
4803 if (isChrome) {
4804 return 'chrome';
4805 }
4806
4807 var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
4808 if (isIE) {
4809 return 'ie';
4810 }
4811
4812 return 'unknown';
4813 }
4814 }
4815 };
4816 }]);
4817})();
4818'use strict';
4819
4820/**
4821 * @ngdoc directive
4822 * @id input
4823 * @name ons-input
4824 * @category form
4825 * @description
4826 * [en]Input component.[/en]
4827 * [ja]inputコンポ―ネントです。[/ja]
4828 * @codepen ojQxLj
4829 * @guide UsingFormComponents
4830 * [en]Using form components[/en]
4831 * [ja]フォームを使う[/ja]
4832 * @guide EventHandling
4833 * [en]Event handling descriptions[/en]
4834 * [ja]イベント処理の使い方[/ja]
4835 * @example
4836 * <ons-input></ons-input>
4837 * <ons-input modifier="material" label="Username"></ons-input>
4838 */
4839
4840/**
4841 * @ngdoc attribute
4842 * @name label
4843 * @type {String}
4844 * @description
4845 * [en]Text for animated floating label.[/en]
4846 * [ja]アニメーションさせるフローティングラベルのテキストを指定します。[/ja]
4847 */
4848
4849/**
4850 * @ngdoc attribute
4851 * @name float
4852 * @description
4853 * [en]If this attribute is present, the label will be animated.[/en]
4854 * [ja]この属性が設定された時、ラベルはアニメーションするようになります。[/ja]
4855 */
4856
4857/**
4858 * @ngdoc attribute
4859 * @name ng-model
4860 * @extensionOf angular
4861 * @description
4862 * [en]Bind the value to a model. Works just like for normal input elements.[/en]
4863 * [ja]この要素の値をモデルに紐付けます。通常のinput要素の様に動作します。[/ja]
4864 */
4865
4866/**
4867 * @ngdoc attribute
4868 * @name ng-change
4869 * @extensionOf angular
4870 * @description
4871 * [en]Executes an expression when the value changes. Works just like for normal input elements.[/en]
4872 * [ja]値が変わった時にこの属性で指定したexpressionが実行されます。通常のinput要素の様に動作します。[/ja]
4873 */
4874
4875(function () {
4876 'use strict';
4877
4878 angular.module('onsen').directive('onsInput', ['$parse', function ($parse) {
4879 return {
4880 restrict: 'E',
4881 replace: false,
4882 scope: false,
4883
4884 link: function link(scope, element, attrs) {
4885 var el = element[0];
4886
4887 var onInput = function onInput() {
4888 var set = $parse(attrs.ngModel).assign;
4889
4890 if (el._isTextInput) {
4891 set(scope, el.value);
4892 } else if (el.type === 'radio' && el.checked) {
4893 set(scope, el.value);
4894 } else {
4895 set(scope, el.checked);
4896 }
4897
4898 if (attrs.ngChange) {
4899 scope.$eval(attrs.ngChange);
4900 }
4901
4902 scope.$parent.$evalAsync();
4903 };
4904
4905 if (attrs.ngModel) {
4906 scope.$watch(attrs.ngModel, function (value) {
4907 if (el._isTextInput && typeof value !== 'undefined') {
4908 el.value = value;
4909 } else if (el.type === 'radio') {
4910 el.checked = value === el.value;
4911 } else {
4912 el.checked = value;
4913 }
4914 });
4915
4916 el._isTextInput ? element.on('input', onInput) : element.on('change', onInput);
4917 }
4918
4919 scope.$on('$destroy', function () {
4920 el._isTextInput ? element.off('input', onInput) : element.off('change', onInput);
4921
4922 scope = element = attrs = el = null;
4923 });
4924 }
4925 };
4926 }]);
4927})();
4928'use strict';
4929
4930/**
4931 * @element ons-keyboard-active
4932 * @category form
4933 * @description
4934 * [en]
4935 * Conditionally display content depending on if the software keyboard is visible or hidden.
4936 * This component requires cordova and that the com.ionic.keyboard plugin is installed.
4937 * [/en]
4938 * [ja]
4939 * ソフトウェアキーボードが表示されているかどうかで、コンテンツを表示するかどうかを切り替えることが出来ます。
4940 * このコンポーネントは、Cordovaやcom.ionic.keyboardプラグインを必要とします。
4941 * [/ja]
4942 * @guide UtilityAPIs
4943 * [en]Other utility APIs[/en]
4944 * [ja]他のユーティリティAPI[/ja]
4945 * @example
4946 * <div ons-keyboard-active>
4947 * This will only be displayed if the software keyboard is open.
4948 * </div>
4949 * <div ons-keyboard-inactive>
4950 * There is also a component that does the opposite.
4951 * </div>
4952 */
4953
4954/**
4955 * @attribute ons-keyboard-active
4956 * @description
4957 * [en]The content of tags with this attribute will be visible when the software keyboard is open.[/en]
4958 * [ja]この属性がついた要素は、ソフトウェアキーボードが表示された時に初めて表示されます。[/ja]
4959 */
4960
4961/**
4962 * @attribute ons-keyboard-inactive
4963 * @description
4964 * [en]The content of tags with this attribute will be visible when the software keyboard is hidden.[/en]
4965 * [ja]この属性がついた要素は、ソフトウェアキーボードが隠れている時のみ表示されます。[/ja]
4966 */
4967
4968(function () {
4969 'use strict';
4970
4971 var module = angular.module('onsen');
4972
4973 var compileFunction = function compileFunction(show, $onsen) {
4974 return function (element) {
4975 return function (scope, element, attrs) {
4976 var dispShow = show ? 'block' : 'none',
4977 dispHide = show ? 'none' : 'block';
4978
4979 var onShow = function onShow() {
4980 element.css('display', dispShow);
4981 };
4982
4983 var onHide = function onHide() {
4984 element.css('display', dispHide);
4985 };
4986
4987 var onInit = function onInit(e) {
4988 if (e.visible) {
4989 onShow();
4990 } else {
4991 onHide();
4992 }
4993 };
4994
4995 ons.softwareKeyboard.on('show', onShow);
4996 ons.softwareKeyboard.on('hide', onHide);
4997 ons.softwareKeyboard.on('init', onInit);
4998
4999 if (ons.softwareKeyboard._visible) {
5000 onShow();
5001 } else {
5002 onHide();
5003 }
5004
5005 $onsen.cleaner.onDestroy(scope, function () {
5006 ons.softwareKeyboard.off('show', onShow);
5007 ons.softwareKeyboard.off('hide', onHide);
5008 ons.softwareKeyboard.off('init', onInit);
5009
5010 $onsen.clearComponent({
5011 element: element,
5012 scope: scope,
5013 attrs: attrs
5014 });
5015 element = scope = attrs = null;
5016 });
5017 };
5018 };
5019 };
5020
5021 module.directive('onsKeyboardActive', ['$onsen', function ($onsen) {
5022 return {
5023 restrict: 'A',
5024 replace: false,
5025 transclude: false,
5026 scope: false,
5027 compile: compileFunction(true, $onsen)
5028 };
5029 }]);
5030
5031 module.directive('onsKeyboardInactive', ['$onsen', function ($onsen) {
5032 return {
5033 restrict: 'A',
5034 replace: false,
5035 transclude: false,
5036 scope: false,
5037 compile: compileFunction(false, $onsen)
5038 };
5039 }]);
5040})();
5041'use strict';
5042
5043/**
5044 * @element ons-lazy-repeat
5045 * @description
5046 * [en]
5047 * Using this component a list with millions of items can be rendered without a drop in performance.
5048 * It does that by "lazily" loading elements into the DOM when they come into view and
5049 * removing items from the DOM when they are not visible.
5050 * [/en]
5051 * [ja]
5052 * このコンポーネント内で描画されるアイテムのDOM要素の読み込みは、画面に見えそうになった時まで自動的に遅延され、
5053 * 画面から見えなくなった場合にはその要素は動的にアンロードされます。
5054 * このコンポーネントを使うことで、パフォーマンスを劣化させること無しに巨大な数の要素を描画できます。
5055 * [/ja]
5056 * @codepen QwrGBm
5057 * @guide UsingLazyRepeat
5058 * [en]How to use Lazy Repeat[/en]
5059 * [ja]レイジーリピートの使い方[/ja]
5060 * @example
5061 * <script>
5062 * ons.bootstrap()
5063 *
5064 * .controller('MyController', function($scope) {
5065 * $scope.MyDelegate = {
5066 * countItems: function() {
5067 * // Return number of items.
5068 * return 1000000;
5069 * },
5070 *
5071 * calculateItemHeight: function(index) {
5072 * // Return the height of an item in pixels.
5073 * return 45;
5074 * },
5075 *
5076 * configureItemScope: function(index, itemScope) {
5077 * // Initialize scope
5078 * itemScope.item = 'Item #' + (index + 1);
5079 * },
5080 *
5081 * destroyItemScope: function(index, itemScope) {
5082 * // Optional method that is called when an item is unloaded.
5083 * console.log('Destroyed item with index: ' + index);
5084 * }
5085 * };
5086 * });
5087 * </script>
5088 *
5089 * <ons-list ng-controller="MyController">
5090 * <ons-list-item ons-lazy-repeat="MyDelegate">
5091 * {{ item }}
5092 * </ons-list-item>
5093 * </ons-list>
5094 */
5095
5096/**
5097 * @attribute ons-lazy-repeat
5098 * @type {Expression}
5099 * @initonly
5100 * @description
5101 * [en]A delegate object, can be either an object attached to the scope (when using AngularJS) or a normal JavaScript variable.[/en]
5102 * [ja]要素のロード、アンロードなどの処理を委譲するオブジェクトを指定します。AngularJSのスコープの変数名や、通常のJavaScriptの変数名を指定します。[/ja]
5103 */
5104
5105/**
5106 * @property delegate.configureItemScope
5107 * @type {Function}
5108 * @description
5109 * [en]Function which recieves an index and the scope for the item. Can be used to configure values in the item scope.[/en]
5110 * [ja][/ja]
5111 */
5112
5113(function () {
5114 'use strict';
5115
5116 var module = angular.module('onsen');
5117
5118 /**
5119 * Lazy repeat directive.
5120 */
5121 module.directive('onsLazyRepeat', ['$onsen', 'LazyRepeatView', function ($onsen, LazyRepeatView) {
5122 return {
5123 restrict: 'A',
5124 replace: false,
5125 priority: 1000,
5126 terminal: true,
5127
5128 compile: function compile(element, attrs) {
5129 return function (scope, element, attrs) {
5130 var lazyRepeat = new LazyRepeatView(scope, element, attrs);
5131
5132 scope.$on('$destroy', function () {
5133 scope = element = attrs = lazyRepeat = null;
5134 });
5135 };
5136 }
5137 };
5138 }]);
5139})();
5140'use strict';
5141
5142(function () {
5143 'use strict';
5144
5145 angular.module('onsen').directive('onsList', ['$onsen', 'GenericView', function ($onsen, GenericView) {
5146 return {
5147 restrict: 'E',
5148 link: function link(scope, element, attrs) {
5149 GenericView.register(scope, element, attrs, { viewKey: 'ons-list' });
5150 $onsen.fireComponentEvent(element[0], 'init');
5151 }
5152 };
5153 }]);
5154})();
5155'use strict';
5156
5157(function () {
5158 'use strict';
5159
5160 angular.module('onsen').directive('onsListHeader', ['$onsen', 'GenericView', function ($onsen, GenericView) {
5161 return {
5162 restrict: 'E',
5163 link: function link(scope, element, attrs) {
5164 GenericView.register(scope, element, attrs, { viewKey: 'ons-listHeader' });
5165 $onsen.fireComponentEvent(element[0], 'init');
5166 }
5167 };
5168 }]);
5169})();
5170'use strict';
5171
5172(function () {
5173 'use strict';
5174
5175 angular.module('onsen').directive('onsListItem', ['$onsen', 'GenericView', function ($onsen, GenericView) {
5176 return {
5177 restrict: 'E',
5178 link: function link(scope, element, attrs) {
5179 GenericView.register(scope, element, attrs, { viewKey: 'ons-list-item' });
5180 $onsen.fireComponentEvent(element[0], 'init');
5181 }
5182 };
5183 }]);
5184})();
5185'use strict';
5186
5187/**
5188 * @element ons-loading-placeholder
5189 * @category util
5190 * @description
5191 * [en]Display a placeholder while the content is loading.[/en]
5192 * [ja]Onsen UIが読み込まれるまでに表示するプレースホルダーを表現します。[/ja]
5193 * @guide UtilityAPIs [en]Other utility APIs[/en][ja]他のユーティリティAPI[/ja]
5194 * @example
5195 * <div ons-loading-placeholder="page.html">
5196 * Loading...
5197 * </div>
5198 */
5199
5200/**
5201 * @attribute ons-loading-placeholder
5202 * @initonly
5203 * @type {String}
5204 * @description
5205 * [en]The url of the page to load.[/en]
5206 * [ja]読み込むページのURLを指定します。[/ja]
5207 */
5208
5209(function () {
5210 'use strict';
5211
5212 angular.module('onsen').directive('onsLoadingPlaceholder', function () {
5213 return {
5214 restrict: 'A',
5215 link: function link(scope, element, attrs) {
5216 if (attrs.onsLoadingPlaceholder) {
5217 ons._resolveLoadingPlaceholder(element[0], attrs.onsLoadingPlaceholder, function (contentElement, done) {
5218 ons.compile(contentElement);
5219 scope.$evalAsync(function () {
5220 setImmediate(done);
5221 });
5222 });
5223 }
5224 }
5225 };
5226 });
5227})();
5228'use strict';
5229
5230/**
5231 * @element ons-modal
5232 */
5233
5234/**
5235 * @attribute var
5236 * @type {String}
5237 * @initonly
5238 * @description
5239 * [en]Variable name to refer this modal.[/en]
5240 * [ja]このモーダルを参照するための名前を指定します。[/ja]
5241 */
5242
5243(function () {
5244 'use strict';
5245
5246 /**
5247 * Modal directive.
5248 */
5249
5250 angular.module('onsen').directive('onsModal', ['$onsen', 'ModalView', function ($onsen, ModalView) {
5251 return {
5252 restrict: 'E',
5253 replace: false,
5254
5255 // NOTE: This element must coexists with ng-controller.
5256 // Do not use isolated scope and template's ng-transclude.
5257 scope: false,
5258 transclude: false,
5259
5260 compile: function compile(element, attrs) {
5261
5262 return {
5263 pre: function pre(scope, element, attrs) {
5264 var modal = new ModalView(scope, element, attrs);
5265 $onsen.addModifierMethodsForCustomElements(modal, element);
5266
5267 $onsen.declareVarAttribute(attrs, modal);
5268 element.data('ons-modal', modal);
5269
5270 scope.$on('$destroy', function () {
5271 $onsen.removeModifierMethods(modal);
5272 element.data('ons-modal', undefined);
5273 modal = element = scope = attrs = null;
5274 });
5275 },
5276
5277 post: function post(scope, element) {
5278 $onsen.fireComponentEvent(element[0], 'init');
5279 }
5280 };
5281 }
5282 };
5283 }]);
5284})();
5285'use strict';
5286
5287/**
5288 * @element ons-navigator
5289 * @example
5290 * <ons-navigator animation="slide" var="app.navi">
5291 * <ons-page>
5292 * <ons-toolbar>
5293 * <div class="center">Title</div>
5294 * </ons-toolbar>
5295 *
5296 * <p style="text-align: center">
5297 * <ons-button modifier="light" ng-click="app.navi.pushPage('page.html');">Push</ons-button>
5298 * </p>
5299 * </ons-page>
5300 * </ons-navigator>
5301 *
5302 * <ons-template id="page.html">
5303 * <ons-page>
5304 * <ons-toolbar>
5305 * <div class="center">Title</div>
5306 * </ons-toolbar>
5307 *
5308 * <p style="text-align: center">
5309 * <ons-button modifier="light" ng-click="app.navi.popPage();">Pop</ons-button>
5310 * </p>
5311 * </ons-page>
5312 * </ons-template>
5313 */
5314
5315/**
5316 * @attribute var
5317 * @initonly
5318 * @type {String}
5319 * @description
5320 * [en]Variable name to refer this navigator.[/en]
5321 * [ja]このナビゲーターを参照するための名前を指定します。[/ja]
5322 */
5323
5324/**
5325 * @attribute ons-prepush
5326 * @initonly
5327 * @type {Expression}
5328 * @description
5329 * [en]Allows you to specify custom behavior when the "prepush" event is fired.[/en]
5330 * [ja]"prepush"イベントが発火された時の挙動を独自に指定できます。[/ja]
5331 */
5332
5333/**
5334 * @attribute ons-prepop
5335 * @initonly
5336 * @type {Expression}
5337 * @description
5338 * [en]Allows you to specify custom behavior when the "prepop" event is fired.[/en]
5339 * [ja]"prepop"イベントが発火された時の挙動を独自に指定できます。[/ja]
5340 */
5341
5342/**
5343 * @attribute ons-postpush
5344 * @initonly
5345 * @type {Expression}
5346 * @description
5347 * [en]Allows you to specify custom behavior when the "postpush" event is fired.[/en]
5348 * [ja]"postpush"イベントが発火された時の挙動を独自に指定できます。[/ja]
5349 */
5350
5351/**
5352 * @attribute ons-postpop
5353 * @initonly
5354 * @type {Expression}
5355 * @description
5356 * [en]Allows you to specify custom behavior when the "postpop" event is fired.[/en]
5357 * [ja]"postpop"イベントが発火された時の挙動を独自に指定できます。[/ja]
5358 */
5359
5360/**
5361 * @attribute ons-init
5362 * @initonly
5363 * @type {Expression}
5364 * @description
5365 * [en]Allows you to specify custom behavior when a page's "init" event is fired.[/en]
5366 * [ja]ページの"init"イベントが発火された時の挙動を独自に指定できます。[/ja]
5367 */
5368
5369/**
5370 * @attribute ons-show
5371 * @initonly
5372 * @type {Expression}
5373 * @description
5374 * [en]Allows you to specify custom behavior when a page's "show" event is fired.[/en]
5375 * [ja]ページの"show"イベントが発火された時の挙動を独自に指定できます。[/ja]
5376 */
5377
5378/**
5379 * @attribute ons-hide
5380 * @initonly
5381 * @type {Expression}
5382 * @description
5383 * [en]Allows you to specify custom behavior when a page's "hide" event is fired.[/en]
5384 * [ja]ページの"hide"イベントが発火された時の挙動を独自に指定できます。[/ja]
5385 */
5386
5387/**
5388 * @attribute ons-destroy
5389 * @initonly
5390 * @type {Expression}
5391 * @description
5392 * [en]Allows you to specify custom behavior when a page's "destroy" event is fired.[/en]
5393 * [ja]ページの"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
5394 */
5395
5396/**
5397 * @method on
5398 * @signature on(eventName, listener)
5399 * @description
5400 * [en]Add an event listener.[/en]
5401 * [ja]イベントリスナーを追加します。[/ja]
5402 * @param {String} eventName
5403 * [en]Name of the event.[/en]
5404 * [ja]イベント名を指定します。[/ja]
5405 * @param {Function} listener
5406 * [en]Function to execute when the event is triggered.[/en]
5407 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
5408 */
5409
5410/**
5411 * @method once
5412 * @signature once(eventName, listener)
5413 * @description
5414 * [en]Add an event listener that's only triggered once.[/en]
5415 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
5416 * @param {String} eventName
5417 * [en]Name of the event.[/en]
5418 * [ja]イベント名を指定します。[/ja]
5419 * @param {Function} listener
5420 * [en]Function to execute when the event is triggered.[/en]
5421 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
5422 */
5423
5424/**
5425 * @method off
5426 * @signature off(eventName, [listener])
5427 * @description
5428 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
5429 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
5430 * @param {String} eventName
5431 * [en]Name of the event.[/en]
5432 * [ja]イベント名を指定します。[/ja]
5433 * @param {Function} listener
5434 * [en]Function to execute when the event is triggered.[/en]
5435 * [ja]削除するイベントリスナーを指定します。[/ja]
5436 */
5437
5438(function () {
5439 'use strict';
5440
5441 var lastReady = window.ons.NavigatorElement.rewritables.ready;
5442 window.ons.NavigatorElement.rewritables.ready = ons._waitDiretiveInit('ons-navigator', lastReady);
5443
5444 var lastLink = window.ons.NavigatorElement.rewritables.link;
5445 window.ons.NavigatorElement.rewritables.link = function (navigatorElement, target, options, callback) {
5446 var view = angular.element(navigatorElement).data('ons-navigator');
5447 view._compileAndLink(target, function (target) {
5448 lastLink(navigatorElement, target, options, callback);
5449 });
5450 };
5451
5452 angular.module('onsen').directive('onsNavigator', ['NavigatorView', '$onsen', function (NavigatorView, $onsen) {
5453 return {
5454 restrict: 'E',
5455
5456 // NOTE: This element must coexists with ng-controller.
5457 // Do not use isolated scope and template's ng-transclude.
5458 transclude: false,
5459 scope: true,
5460
5461 compile: function compile(element) {
5462
5463 return {
5464 pre: function pre(scope, element, attrs, controller) {
5465 var navigator = new NavigatorView(scope, element, attrs);
5466
5467 $onsen.declareVarAttribute(attrs, navigator);
5468 $onsen.registerEventHandlers(navigator, 'prepush prepop postpush postpop init show hide destroy');
5469
5470 element.data('ons-navigator', navigator);
5471
5472 scope.$on('$destroy', function () {
5473 navigator._events = undefined;
5474 element.data('ons-navigator', undefined);
5475 element = null;
5476 });
5477 },
5478 post: function post(scope, element, attrs) {
5479 $onsen.fireComponentEvent(element[0], 'init');
5480 }
5481 };
5482 }
5483 };
5484 }]);
5485})();
5486'use strict';
5487
5488/**
5489 * @element ons-page
5490 */
5491
5492/**
5493 * @attribute var
5494 * @initonly
5495 * @type {String}
5496 * @description
5497 * [en]Variable name to refer this page.[/en]
5498 * [ja]このページを参照するための名前を指定します。[/ja]
5499 */
5500
5501/**
5502 * @attribute ng-infinite-scroll
5503 * @initonly
5504 * @type {String}
5505 * @description
5506 * [en]Path of the function to be executed on infinite scrolling. The path is relative to $scope. The function receives a done callback that must be called when it's finished.[/en]
5507 * [ja][/ja]
5508 */
5509
5510/**
5511 * @attribute on-device-back-button
5512 * @type {Expression}
5513 * @description
5514 * [en]Allows you to specify custom behavior when the back button is pressed.[/en]
5515 * [ja]デバイスのバックボタンが押された時の挙動を設定できます。[/ja]
5516 */
5517
5518/**
5519 * @attribute ng-device-back-button
5520 * @initonly
5521 * @type {Expression}
5522 * @description
5523 * [en]Allows you to specify custom behavior with an AngularJS expression when the back button is pressed.[/en]
5524 * [ja]デバイスのバックボタンが押された時の挙動を設定できます。AngularJSのexpressionを指定できます。[/ja]
5525 */
5526
5527/**
5528 * @attribute ons-init
5529 * @initonly
5530 * @type {Expression}
5531 * @description
5532 * [en]Allows you to specify custom behavior when the "init" event is fired.[/en]
5533 * [ja]"init"イベントが発火された時の挙動を独自に指定できます。[/ja]
5534 */
5535
5536/**
5537 * @attribute ons-show
5538 * @initonly
5539 * @type {Expression}
5540 * @description
5541 * [en]Allows you to specify custom behavior when the "show" event is fired.[/en]
5542 * [ja]"show"イベントが発火された時の挙動を独自に指定できます。[/ja]
5543 */
5544
5545/**
5546 * @attribute ons-hide
5547 * @initonly
5548 * @type {Expression}
5549 * @description
5550 * [en]Allows you to specify custom behavior when the "hide" event is fired.[/en]
5551 * [ja]"hide"イベントが発火された時の挙動を独自に指定できます。[/ja]
5552 */
5553
5554/**
5555 * @attribute ons-destroy
5556 * @initonly
5557 * @type {Expression}
5558 * @description
5559 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
5560 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
5561 */
5562
5563(function () {
5564 'use strict';
5565
5566 var module = angular.module('onsen');
5567
5568 module.directive('onsPage', ['$onsen', 'PageView', function ($onsen, PageView) {
5569
5570 function firePageInitEvent(element) {
5571 // TODO: remove dirty fix
5572 var i = 0,
5573 f = function f() {
5574 if (i++ < 15) {
5575 if (isAttached(element)) {
5576 $onsen.fireComponentEvent(element, 'init');
5577 fireActualPageInitEvent(element);
5578 } else {
5579 if (i > 10) {
5580 setTimeout(f, 1000 / 60);
5581 } else {
5582 setImmediate(f);
5583 }
5584 }
5585 } else {
5586 throw new Error('Fail to fire "pageinit" event. Attach "ons-page" element to the document after initialization.');
5587 }
5588 };
5589
5590 f();
5591 }
5592
5593 function fireActualPageInitEvent(element) {
5594 var event = document.createEvent('HTMLEvents');
5595 event.initEvent('pageinit', true, true);
5596 element.dispatchEvent(event);
5597 }
5598
5599 function isAttached(element) {
5600 if (document.documentElement === element) {
5601 return true;
5602 }
5603 return element.parentNode ? isAttached(element.parentNode) : false;
5604 }
5605
5606 return {
5607 restrict: 'E',
5608
5609 // NOTE: This element must coexists with ng-controller.
5610 // Do not use isolated scope and template's ng-transclude.
5611 transclude: false,
5612 scope: true,
5613
5614 compile: function compile(element, attrs) {
5615 return {
5616 pre: function pre(scope, element, attrs) {
5617 var page = new PageView(scope, element, attrs);
5618
5619 $onsen.declareVarAttribute(attrs, page);
5620 $onsen.registerEventHandlers(page, 'init show hide destroy');
5621
5622 element.data('ons-page', page);
5623 $onsen.addModifierMethodsForCustomElements(page, element);
5624
5625 element.data('_scope', scope);
5626
5627 $onsen.cleaner.onDestroy(scope, function () {
5628 page._events = undefined;
5629 $onsen.removeModifierMethods(page);
5630 element.data('ons-page', undefined);
5631 element.data('_scope', undefined);
5632
5633 $onsen.clearComponent({
5634 element: element,
5635 scope: scope,
5636 attrs: attrs
5637 });
5638 scope = element = attrs = null;
5639 });
5640 },
5641
5642 post: function postLink(scope, element, attrs) {
5643 firePageInitEvent(element[0]);
5644 }
5645 };
5646 }
5647 };
5648 }]);
5649})();
5650'use strict';
5651
5652/**
5653 * @element ons-popover
5654 */
5655
5656/**
5657 * @attribute var
5658 * @initonly
5659 * @type {String}
5660 * @description
5661 * [en]Variable name to refer this popover.[/en]
5662 * [ja]このポップオーバーを参照するための名前を指定します。[/ja]
5663 */
5664
5665/**
5666 * @attribute ons-preshow
5667 * @initonly
5668 * @type {Expression}
5669 * @description
5670 * [en]Allows you to specify custom behavior when the "preshow" event is fired.[/en]
5671 * [ja]"preshow"イベントが発火された時の挙動を独自に指定できます。[/ja]
5672 */
5673
5674/**
5675 * @attribute ons-prehide
5676 * @initonly
5677 * @type {Expression}
5678 * @description
5679 * [en]Allows you to specify custom behavior when the "prehide" event is fired.[/en]
5680 * [ja]"prehide"イベントが発火された時の挙動を独自に指定できます。[/ja]
5681 */
5682
5683/**
5684 * @attribute ons-postshow
5685 * @initonly
5686 * @type {Expression}
5687 * @description
5688 * [en]Allows you to specify custom behavior when the "postshow" event is fired.[/en]
5689 * [ja]"postshow"イベントが発火された時の挙動を独自に指定できます。[/ja]
5690 */
5691
5692/**
5693 * @attribute ons-posthide
5694 * @initonly
5695 * @type {Expression}
5696 * @description
5697 * [en]Allows you to specify custom behavior when the "posthide" event is fired.[/en]
5698 * [ja]"posthide"イベントが発火された時の挙動を独自に指定できます。[/ja]
5699 */
5700
5701/**
5702 * @attribute ons-destroy
5703 * @initonly
5704 * @type {Expression}
5705 * @description
5706 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
5707 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
5708 */
5709
5710/**
5711 * @method on
5712 * @signature on(eventName, listener)
5713 * @description
5714 * [en]Add an event listener.[/en]
5715 * [ja]イベントリスナーを追加します。[/ja]
5716 * @param {String} eventName
5717 * [en]Name of the event.[/en]
5718 * [ja]イベント名を指定します。[/ja]
5719 * @param {Function} listener
5720 * [en]Function to execute when the event is triggered.[/en]
5721 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
5722 */
5723
5724/**
5725 * @method once
5726 * @signature once(eventName, listener)
5727 * @description
5728 * [en]Add an event listener that's only triggered once.[/en]
5729 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
5730 * @param {String} eventName
5731 * [en]Name of the event.[/en]
5732 * [ja]イベント名を指定します。[/ja]
5733 * @param {Function} listener
5734 * [en]Function to execute when the event is triggered.[/en]
5735 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
5736 */
5737
5738/**
5739 * @method off
5740 * @signature off(eventName, [listener])
5741 * @description
5742 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
5743 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
5744 * @param {String} eventName
5745 * [en]Name of the event.[/en]
5746 * [ja]イベント名を指定します。[/ja]
5747 * @param {Function} listener
5748 * [en]Function to execute when the event is triggered.[/en]
5749 * [ja]削除するイベントリスナーを指定します。[/ja]
5750 */
5751
5752(function () {
5753 'use strict';
5754
5755 var module = angular.module('onsen');
5756
5757 module.directive('onsPopover', ['$onsen', 'PopoverView', function ($onsen, PopoverView) {
5758 return {
5759 restrict: 'E',
5760 replace: false,
5761 scope: true,
5762 compile: function compile(element, attrs) {
5763 return {
5764 pre: function pre(scope, element, attrs) {
5765
5766 var popover = new PopoverView(scope, element, attrs);
5767
5768 $onsen.declareVarAttribute(attrs, popover);
5769 $onsen.registerEventHandlers(popover, 'preshow prehide postshow posthide destroy');
5770 $onsen.addModifierMethodsForCustomElements(popover, element);
5771
5772 element.data('ons-popover', popover);
5773
5774 scope.$on('$destroy', function () {
5775 popover._events = undefined;
5776 $onsen.removeModifierMethods(popover);
5777 element.data('ons-popover', undefined);
5778 element = null;
5779 });
5780 },
5781
5782 post: function post(scope, element) {
5783 $onsen.fireComponentEvent(element[0], 'init');
5784 }
5785 };
5786 }
5787 };
5788 }]);
5789})();
5790"use strict";
5791'use strict';
5792
5793/**
5794 * @element ons-pull-hook
5795 * @example
5796 * <script>
5797 * ons.bootstrap()
5798 *
5799 * .controller('MyController', function($scope, $timeout) {
5800 * $scope.items = [3, 2 ,1];
5801 *
5802 * $scope.load = function($done) {
5803 * $timeout(function() {
5804 * $scope.items.unshift($scope.items.length + 1);
5805 * $done();
5806 * }, 1000);
5807 * };
5808 * });
5809 * </script>
5810 *
5811 * <ons-page ng-controller="MyController">
5812 * <ons-pull-hook var="loader" ng-action="load($done)">
5813 * <span ng-switch="loader.state">
5814 * <span ng-switch-when="initial">Pull down to refresh</span>
5815 * <span ng-switch-when="preaction">Release to refresh</span>
5816 * <span ng-switch-when="action">Loading data. Please wait...</span>
5817 * </span>
5818 * </ons-pull-hook>
5819 * <ons-list>
5820 * <ons-list-item ng-repeat="item in items">
5821 * Item #{{ item }}
5822 * </ons-list-item>
5823 * </ons-list>
5824 * </ons-page>
5825 */
5826
5827/**
5828 * @attribute var
5829 * @initonly
5830 * @type {String}
5831 * @description
5832 * [en]Variable name to refer this component.[/en]
5833 * [ja]このコンポーネントを参照するための名前を指定します。[/ja]
5834 */
5835
5836/**
5837 * @attribute ng-action
5838 * @initonly
5839 * @type {Expression}
5840 * @description
5841 * [en]Use to specify custom behavior when the page is pulled down. A <code>$done</code> function is available to tell the component that the action is completed.[/en]
5842 * [ja]pull downしたときの振る舞いを指定します。アクションが完了した時には<code>$done</code>関数を呼び出します。[/ja]
5843 */
5844
5845/**
5846 * @attribute ons-changestate
5847 * @initonly
5848 * @type {Expression}
5849 * @description
5850 * [en]Allows you to specify custom behavior when the "changestate" event is fired.[/en]
5851 * [ja]"changestate"イベントが発火された時の挙動を独自に指定できます。[/ja]
5852 */
5853
5854/**
5855 * @method on
5856 * @signature on(eventName, listener)
5857 * @description
5858 * [en]Add an event listener.[/en]
5859 * [ja]イベントリスナーを追加します。[/ja]
5860 * @param {String} eventName
5861 * [en]Name of the event.[/en]
5862 * [ja]イベント名を指定します。[/ja]
5863 * @param {Function} listener
5864 * [en]Function to execute when the event is triggered.[/en]
5865 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
5866 */
5867
5868/**
5869 * @method once
5870 * @signature once(eventName, listener)
5871 * @description
5872 * [en]Add an event listener that's only triggered once.[/en]
5873 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
5874 * @param {String} eventName
5875 * [en]Name of the event.[/en]
5876 * [ja]イベント名を指定します。[/ja]
5877 * @param {Function} listener
5878 * [en]Function to execute when the event is triggered.[/en]
5879 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
5880 */
5881
5882/**
5883 * @method off
5884 * @signature off(eventName, [listener])
5885 * @description
5886 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
5887 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
5888 * @param {String} eventName
5889 * [en]Name of the event.[/en]
5890 * [ja]イベント名を指定します。[/ja]
5891 * @param {Function} listener
5892 * [en]Function to execute when the event is triggered.[/en]
5893 * [ja]削除するイベントリスナーを指定します。[/ja]
5894 */
5895
5896(function () {
5897 'use strict';
5898
5899 /**
5900 * Pull hook directive.
5901 */
5902
5903 angular.module('onsen').directive('onsPullHook', ['$onsen', 'PullHookView', function ($onsen, PullHookView) {
5904 return {
5905 restrict: 'E',
5906 replace: false,
5907 scope: true,
5908
5909 compile: function compile(element, attrs) {
5910 return {
5911 pre: function pre(scope, element, attrs) {
5912 var pullHook = new PullHookView(scope, element, attrs);
5913
5914 $onsen.declareVarAttribute(attrs, pullHook);
5915 $onsen.registerEventHandlers(pullHook, 'changestate destroy');
5916 element.data('ons-pull-hook', pullHook);
5917
5918 scope.$on('$destroy', function () {
5919 pullHook._events = undefined;
5920 element.data('ons-pull-hook', undefined);
5921 scope = element = attrs = null;
5922 });
5923 },
5924 post: function post(scope, element) {
5925 $onsen.fireComponentEvent(element[0], 'init');
5926 }
5927 };
5928 }
5929 };
5930 }]);
5931})();
5932'use strict';
5933
5934(function () {
5935 'use strict';
5936
5937 angular.module('onsen').directive('onsRange', ['$parse', function ($parse) {
5938 return {
5939 restrict: 'E',
5940 replace: false,
5941 scope: false,
5942
5943 link: function link(scope, element, attrs) {
5944
5945 var onInput = function onInput() {
5946 var set = $parse(attrs.ngModel).assign;
5947
5948 set(scope, element[0].value);
5949 if (attrs.ngChange) {
5950 scope.$eval(attrs.ngChange);
5951 }
5952 scope.$parent.$evalAsync();
5953 };
5954
5955 if (attrs.ngModel) {
5956 scope.$watch(attrs.ngModel, function (value) {
5957 element[0].value = value;
5958 });
5959
5960 element.on('input', onInput);
5961 }
5962
5963 scope.$on('$destroy', function () {
5964 element.off('input', onInput);
5965 scope = element = attrs = null;
5966 });
5967 }
5968 };
5969 }]);
5970})();
5971'use strict';
5972
5973(function () {
5974 'use strict';
5975
5976 angular.module('onsen').directive('onsRipple', ['$onsen', 'GenericView', function ($onsen, GenericView) {
5977 return {
5978 restrict: 'E',
5979 link: function link(scope, element, attrs) {
5980 GenericView.register(scope, element, attrs, { viewKey: 'ons-ripple' });
5981 $onsen.fireComponentEvent(element[0], 'init');
5982 }
5983 };
5984 }]);
5985})();
5986'use strict';
5987
5988/**
5989 * @element ons-scope
5990 * @category util
5991 * @description
5992 * [en]All child elements using the "var" attribute will be attached to the scope of this element.[/en]
5993 * [ja]"var"属性を使っている全ての子要素のviewオブジェクトは、この要素のAngularJSスコープに追加されます。[/ja]
5994 * @example
5995 * <ons-list>
5996 * <ons-list-item ons-scope ng-repeat="item in items">
5997 * <ons-carousel var="carousel">
5998 * <ons-carousel-item ng-click="carousel.next()">
5999 * {{ item }}
6000 * </ons-carousel-item>
6001 * </ons-carousel-item ng-click="carousel.prev()">
6002 * ...
6003 * </ons-carousel-item>
6004 * </ons-carousel>
6005 * </ons-list-item>
6006 * </ons-list>
6007 */
6008
6009(function () {
6010 'use strict';
6011
6012 var module = angular.module('onsen');
6013
6014 module.directive('onsScope', ['$onsen', function ($onsen) {
6015 return {
6016 restrict: 'A',
6017 replace: false,
6018 transclude: false,
6019 scope: false,
6020
6021 link: function link(scope, element) {
6022 element.data('_scope', scope);
6023
6024 scope.$on('$destroy', function () {
6025 element.data('_scope', undefined);
6026 });
6027 }
6028 };
6029 }]);
6030})();
6031'use strict';
6032
6033/**
6034 * @element ons-sliding-menu
6035 * @category menu
6036 * @description
6037 * [en]Component for sliding UI where one page is overlayed over another page. The above page can be slided aside to reveal the page behind.[/en]
6038 * [ja]スライディングメニューを表現するためのコンポーネントで、片方のページが別のページの上にオーバーレイで表示されます。above-pageで指定されたページは、横からスライドして表示します。[/ja]
6039 * @codepen IDvFJ
6040 * @seealso ons-page
6041 * [en]ons-page component[/en]
6042 * [ja]ons-pageコンポーネント[/ja]
6043 * @guide UsingSlidingMenu
6044 * [en]Using sliding menu[/en]
6045 * [ja]スライディングメニューを使う[/ja]
6046 * @guide EventHandling
6047 * [en]Using events[/en]
6048 * [ja]イベントの利用[/ja]
6049 * @guide CallingComponentAPIsfromJavaScript
6050 * [en]Using navigator from JavaScript[/en]
6051 * [ja]JavaScriptからコンポーネントを呼び出す[/ja]
6052 * @guide DefiningMultiplePagesinSingleHTML
6053 * [en]Defining multiple pages in single html[/en]
6054 * [ja]複数のページを1つのHTMLに記述する[/ja]
6055 * @example
6056 * <ons-sliding-menu var="app.menu" main-page="page.html" menu-page="menu.html" max-slide-distance="200px" type="reveal" side="left">
6057 * </ons-sliding-menu>
6058 *
6059 * <ons-template id="page.html">
6060 * <ons-page>
6061 * <p style="text-align: center">
6062 * <ons-button ng-click="app.menu.toggleMenu()">Toggle</ons-button>
6063 * </p>
6064 * </ons-page>
6065 * </ons-template>
6066 *
6067 * <ons-template id="menu.html">
6068 * <ons-page>
6069 * <!-- menu page's contents -->
6070 * </ons-page>
6071 * </ons-template>
6072 *
6073 */
6074
6075/**
6076 * @event preopen
6077 * @description
6078 * [en]Fired just before the sliding menu is opened.[/en]
6079 * [ja]スライディングメニューが開く前に発火します。[/ja]
6080 * @param {Object} event
6081 * [en]Event object.[/en]
6082 * [ja]イベントオブジェクトです。[/ja]
6083 * @param {Object} event.slidingMenu
6084 * [en]Sliding menu view object.[/en]
6085 * [ja]イベントが発火したSlidingMenuオブジェクトです。[/ja]
6086 */
6087
6088/**
6089 * @event postopen
6090 * @description
6091 * [en]Fired just after the sliding menu is opened.[/en]
6092 * [ja]スライディングメニューが開き終わった後に発火します。[/ja]
6093 * @param {Object} event
6094 * [en]Event object.[/en]
6095 * [ja]イベントオブジェクトです。[/ja]
6096 * @param {Object} event.slidingMenu
6097 * [en]Sliding menu view object.[/en]
6098 * [ja]イベントが発火したSlidingMenuオブジェクトです。[/ja]
6099 */
6100
6101/**
6102 * @event preclose
6103 * @description
6104 * [en]Fired just before the sliding menu is closed.[/en]
6105 * [ja]スライディングメニューが閉じる前に発火します。[/ja]
6106 * @param {Object} event
6107 * [en]Event object.[/en]
6108 * [ja]イベントオブジェクトです。[/ja]
6109 * @param {Object} event.slidingMenu
6110 * [en]Sliding menu view object.[/en]
6111 * [ja]イベントが発火したSlidingMenuオブジェクトです。[/ja]
6112 */
6113
6114/**
6115 * @event postclose
6116 * @description
6117 * [en]Fired just after the sliding menu is closed.[/en]
6118 * [ja]スライディングメニューが閉じ終わった後に発火します。[/ja]
6119 * @param {Object} event
6120 * [en]Event object.[/en]
6121 * [ja]イベントオブジェクトです。[/ja]
6122 * @param {Object} event.slidingMenu
6123 * [en]Sliding menu view object.[/en]
6124 * [ja]イベントが発火したSlidingMenuオブジェクトです。[/ja]
6125 */
6126
6127/**
6128 * @attribute var
6129 * @initonly
6130 * @type {String}
6131 * @description
6132 * [en]Variable name to refer this sliding menu.[/en]
6133 * [ja]このスライディングメニューを参照するための名前を指定します。[/ja]
6134 */
6135
6136/**
6137 * @attribute menu-page
6138 * @initonly
6139 * @type {String}
6140 * @description
6141 * [en]The url of the menu page.[/en]
6142 * [ja]左に位置するメニューページのURLを指定します。[/ja]
6143 */
6144
6145/**
6146 * @attribute main-page
6147 * @initonly
6148 * @type {String}
6149 * @description
6150 * [en]The url of the main page.[/en]
6151 * [ja]右に位置するメインページのURLを指定します。[/ja]
6152 */
6153
6154/**
6155 * @attribute swipeable
6156 * @initonly
6157 * @type {Boolean}
6158 * @description
6159 * [en]Whether to enable swipe interaction.[/en]
6160 * [ja]スワイプ操作を有効にする場合に指定します。[/ja]
6161 */
6162
6163/**
6164 * @attribute swipe-target-width
6165 * @initonly
6166 * @type {String}
6167 * @description
6168 * [en]The width of swipeable area calculated from the left (in pixels). Use this to enable swipe only when the finger touch on the screen edge.[/en]
6169 * [ja]スワイプの判定領域をピクセル単位で指定します。画面の端から指定した距離に達するとページが表示されます。[/ja]
6170 */
6171
6172/**
6173 * @attribute max-slide-distance
6174 * @initonly
6175 * @type {String}
6176 * @description
6177 * [en]How far the menu page will slide open. Can specify both in px and %. eg. 90%, 200px[/en]
6178 * [ja]menu-pageで指定されたページの表示幅を指定します。ピクセルもしくは%の両方で指定できます(例: 90%, 200px)[/ja]
6179 */
6180
6181/**
6182 * @attribute side
6183 * @initonly
6184 * @type {String}
6185 * @description
6186 * [en]Specify which side of the screen the menu page is located on. Possible values are "left" and "right".[/en]
6187 * [ja]menu-pageで指定されたページが画面のどちら側から表示されるかを指定します。leftもしくはrightのいずれかを指定できます。[/ja]
6188 */
6189
6190/**
6191 * @attribute type
6192 * @initonly
6193 * @type {String}
6194 * @description
6195 * [en]Sliding menu animator. Possible values are reveal (default), push and overlay.[/en]
6196 * [ja]スライディングメニューのアニメーションです。"reveal"(デフォルト)、"push"、"overlay"のいずれかを指定できます。[/ja]
6197 */
6198
6199/**
6200 * @attribute ons-preopen
6201 * @initonly
6202 * @type {Expression}
6203 * @description
6204 * [en]Allows you to specify custom behavior when the "preopen" event is fired.[/en]
6205 * [ja]"preopen"イベントが発火された時の挙動を独自に指定できます。[/ja]
6206 */
6207
6208/**
6209 * @attribute ons-preclose
6210 * @initonly
6211 * @type {Expression}
6212 * @description
6213 * [en]Allows you to specify custom behavior when the "preclose" event is fired.[/en]
6214 * [ja]"preclose"イベントが発火された時の挙動を独自に指定できます。[/ja]
6215 */
6216
6217/**
6218 * @attribute ons-postopen
6219 * @initonly
6220 * @type {Expression}
6221 * @description
6222 * [en]Allows you to specify custom behavior when the "postopen" event is fired.[/en]
6223 * [ja]"postopen"イベントが発火された時の挙動を独自に指定できます。[/ja]
6224 */
6225
6226/**
6227 * @attribute ons-postclose
6228 * @initonly
6229 * @type {Expression}
6230 * @description
6231 * [en]Allows you to specify custom behavior when the "postclose" event is fired.[/en]
6232 * [ja]"postclose"イベントが発火された時の挙動を独自に指定できます。[/ja]
6233 */
6234
6235/**
6236 * @attribute ons-init
6237 * @initonly
6238 * @type {Expression}
6239 * @description
6240 * [en]Allows you to specify custom behavior when a page's "init" event is fired.[/en]
6241 * [ja]ページの"init"イベントが発火された時の挙動を独自に指定できます。[/ja]
6242 */
6243
6244/**
6245 * @attribute ons-show
6246 * @initonly
6247 * @type {Expression}
6248 * @description
6249 * [en]Allows you to specify custom behavior when a page's "show" event is fired.[/en]
6250 * [ja]ページの"show"イベントが発火された時の挙動を独自に指定できます。[/ja]
6251 */
6252
6253/**
6254 * @attribute ons-hide
6255 * @initonly
6256 * @type {Expression}
6257 * @description
6258 * [en]Allows you to specify custom behavior when a page's "hide" event is fired.[/en]
6259 * [ja]ページの"hide"イベントが発火された時の挙動を独自に指定できます。[/ja]
6260 */
6261
6262/**
6263 * @attribute ons-destroy
6264 * @initonly
6265 * @type {Expression}
6266 * @description
6267 * [en]Allows you to specify custom behavior when a page's "destroy" event is fired.[/en]
6268 * [ja]ページの"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
6269 */
6270
6271/**
6272 * @method setMainPage
6273 * @signature setMainPage(pageUrl, [options])
6274 * @param {String} pageUrl
6275 * [en]Page URL. Can be either an HTML document or an <code>&lt;ons-template&gt;</code>.[/en]
6276 * [ja]pageのURLか、ons-templateで宣言したテンプレートのid属性の値を指定します。[/ja]
6277 * @param {Object} [options]
6278 * [en]Parameter object.[/en]
6279 * [ja]オプションを指定するオブジェクト。[/ja]
6280 * @param {Boolean} [options.closeMenu]
6281 * [en]If true the menu will be closed.[/en]
6282 * [ja]trueを指定すると、開いているメニューを閉じます。[/ja]
6283 * @param {Function} [options.callback]
6284 * [en]Function that is executed after the page has been set.[/en]
6285 * [ja]ページが読み込まれた後に呼び出される関数オブジェクトを指定します。[/ja]
6286 * @description
6287 * [en]Show the page specified in pageUrl in the main contents pane.[/en]
6288 * [ja]中央部分に表示されるページをpageUrlに指定します。[/ja]
6289 */
6290
6291/**
6292 * @method setMenuPage
6293 * @signature setMenuPage(pageUrl, [options])
6294 * @param {String} pageUrl
6295 * [en]Page URL. Can be either an HTML document or an <code>&lt;ons-template&gt;</code>.[/en]
6296 * [ja]pageのURLか、ons-templateで宣言したテンプレートのid属性の値を指定します。[/ja]
6297 * @param {Object} [options]
6298 * [en]Parameter object.[/en]
6299 * [ja]オプションを指定するオブジェクト。[/ja]
6300 * @param {Boolean} [options.closeMenu]
6301 * [en]If true the menu will be closed after the menu page has been set.[/en]
6302 * [ja]trueを指定すると、開いているメニューを閉じます。[/ja]
6303 * @param {Function} [options.callback]
6304 * [en]This function will be executed after the menu page has been set.[/en]
6305 * [ja]メニューページが読み込まれた後に呼び出される関数オブジェクトを指定します。[/ja]
6306 * @description
6307 * [en]Show the page specified in pageUrl in the side menu pane.[/en]
6308 * [ja]メニュー部分に表示されるページをpageUrlに指定します。[/ja]
6309 */
6310
6311/**
6312 * @method openMenu
6313 * @signature openMenu([options])
6314 * @param {Object} [options]
6315 * [en]Parameter object.[/en]
6316 * [ja]オプションを指定するオブジェクト。[/ja]
6317 * @param {Function} [options.callback]
6318 * [en]This function will be called after the menu has been opened.[/en]
6319 * [ja]メニューが開いた後に呼び出される関数オブジェクトを指定します。[/ja]
6320 * @description
6321 * [en]Slide the above layer to reveal the layer behind.[/en]
6322 * [ja]メニューページを表示します。[/ja]
6323 */
6324
6325/**
6326 * @method closeMenu
6327 * @signature closeMenu([options])
6328 * @param {Object} [options]
6329 * [en]Parameter object.[/en]
6330 * [ja]オプションを指定するオブジェクト。[/ja]
6331 * @param {Function} [options.callback]
6332 * [en]This function will be called after the menu has been closed.[/en]
6333 * [ja]メニューが閉じられた後に呼び出される関数オブジェクトを指定します。[/ja]
6334 * @description
6335 * [en]Slide the above layer to hide the layer behind.[/en]
6336 * [ja]メニューページを非表示にします。[/ja]
6337 */
6338
6339/**
6340 * @method toggleMenu
6341 * @signature toggleMenu([options])
6342 * @param {Object} [options]
6343 * [en]Parameter object.[/en]
6344 * [ja]オプションを指定するオブジェクト。[/ja]
6345 * @param {Function} [options.callback]
6346 * [en]This function will be called after the menu has been opened or closed.[/en]
6347 * [ja]メニューが開き終わった後か、閉じ終わった後に呼び出される関数オブジェクトです。[/ja]
6348 * @description
6349 * [en]Slide the above layer to reveal the layer behind if it is currently hidden, otherwise, hide the layer behind.[/en]
6350 * [ja]現在の状況に合わせて、メニューページを表示もしくは非表示にします。[/ja]
6351 */
6352
6353/**
6354 * @method isMenuOpened
6355 * @signature isMenuOpened()
6356 * @return {Boolean}
6357 * [en]true if the menu is currently open.[/en]
6358 * [ja]メニューが開いていればtrueとなります。[/ja]
6359 * @description
6360 * [en]Returns true if the menu page is open, otherwise false.[/en]
6361 * [ja]メニューページが開いている場合はtrue、そうでない場合はfalseを返します。[/ja]
6362 */
6363
6364/**
6365 * @method getDeviceBackButtonHandler
6366 * @signature getDeviceBackButtonHandler()
6367 * @return {Object}
6368 * [en]Device back button handler.[/en]
6369 * [ja]デバイスのバックボタンハンドラを返します。[/ja]
6370 * @description
6371 * [en]Retrieve the back-button handler.[/en]
6372 * [ja]ons-sliding-menuに紐付いているバックボタンハンドラを取得します。[/ja]
6373 */
6374
6375/**
6376 * @method setSwipeable
6377 * @signature setSwipeable(swipeable)
6378 * @param {Boolean} swipeable
6379 * [en]If true the menu will be swipeable.[/en]
6380 * [ja]スワイプで開閉できるようにする場合にはtrueを指定します。[/ja]
6381 * @description
6382 * [en]Specify if the menu should be swipeable or not.[/en]
6383 * [ja]スワイプで開閉するかどうかを設定する。[/ja]
6384 */
6385
6386/**
6387 * @method on
6388 * @signature on(eventName, listener)
6389 * @description
6390 * [en]Add an event listener.[/en]
6391 * [ja]イベントリスナーを追加します。[/ja]
6392 * @param {String} eventName
6393 * [en]Name of the event.[/en]
6394 * [ja]イベント名を指定します。[/ja]
6395 * @param {Function} listener
6396 * [en]Function to execute when the event is triggered.[/en]
6397 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
6398 */
6399
6400/**
6401 * @method once
6402 * @signature once(eventName, listener)
6403 * @description
6404 * [en]Add an event listener that's only triggered once.[/en]
6405 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
6406 * @param {String} eventName
6407 * [en]Name of the event.[/en]
6408 * [ja]イベント名を指定します。[/ja]
6409 * @param {Function} listener
6410 * [en]Function to execute when the event is triggered.[/en]
6411 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
6412 */
6413
6414/**
6415 * @method off
6416 * @signature off(eventName, [listener])
6417 * @description
6418 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
6419 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
6420 * @param {String} eventName
6421 * [en]Name of the event.[/en]
6422 * [ja]イベント名を指定します。[/ja]
6423 * @param {Function} listener
6424 * [en]Function to execute when the event is triggered.[/en]
6425 * [ja]削除するイベントリスナーを指定します。[/ja]
6426 */
6427
6428(function () {
6429 'use strict';
6430
6431 var module = angular.module('onsen');
6432
6433 module.directive('onsSlidingMenu', ['$compile', 'SlidingMenuView', '$onsen', function ($compile, SlidingMenuView, $onsen) {
6434 return {
6435 restrict: 'E',
6436 replace: false,
6437
6438 // NOTE: This element must coexists with ng-controller.
6439 // Do not use isolated scope and template's ng-transclude.
6440 transclude: false,
6441 scope: true,
6442
6443 compile: function compile(element, attrs) {
6444 var main = element[0].querySelector('.main'),
6445 menu = element[0].querySelector('.menu');
6446
6447 if (main) {
6448 var mainHtml = angular.element(main).remove().html().trim();
6449 }
6450
6451 if (menu) {
6452 var menuHtml = angular.element(menu).remove().html().trim();
6453 }
6454
6455 return function (scope, element, attrs) {
6456 element.append(angular.element('<div></div>').addClass('onsen-sliding-menu__menu'));
6457 element.append(angular.element('<div></div>').addClass('onsen-sliding-menu__main'));
6458
6459 var slidingMenu = new SlidingMenuView(scope, element, attrs);
6460
6461 $onsen.registerEventHandlers(slidingMenu, 'preopen preclose postopen postclose init show hide destroy');
6462
6463 if (mainHtml && !attrs.mainPage) {
6464 slidingMenu._appendMainPage(null, mainHtml);
6465 }
6466
6467 if (menuHtml && !attrs.menuPage) {
6468 slidingMenu._appendMenuPage(menuHtml);
6469 }
6470
6471 $onsen.declareVarAttribute(attrs, slidingMenu);
6472 element.data('ons-sliding-menu', slidingMenu);
6473
6474 scope.$on('$destroy', function () {
6475 slidingMenu._events = undefined;
6476 element.data('ons-sliding-menu', undefined);
6477 });
6478
6479 $onsen.fireComponentEvent(element[0], 'init');
6480 };
6481 }
6482 };
6483 }]);
6484})();
6485'use strict';
6486
6487/**
6488 * @element ons-speed-dial
6489 */
6490
6491/**
6492 * @attribute var
6493 * @initonly
6494 * @type {String}
6495 * @description
6496 * [en]Variable name to refer the speed dial.[/en]
6497 * [ja]このスピードダイアルを参照するための変数名をしてします。[/ja]
6498 */
6499
6500/**
6501 * @attribute ons-open
6502 * @initonly
6503 * @type {Expression}
6504 * @description
6505 * [en]Allows you to specify custom behavior when the "open" event is fired.[/en]
6506 * [ja]"open"イベントが発火された時の挙動を独自に指定できます。[/ja]
6507 */
6508
6509/**
6510 * @attribute ons-close
6511 * @initonly
6512 * @type {Expression}
6513 * @description
6514 * [en]Allows you to specify custom behavior when the "close" event is fired.[/en]
6515 * [ja]"close"イベントが発火された時の挙動を独自に指定できます。[/ja]
6516 */
6517
6518/**
6519 * @method once
6520 * @signature once(eventName, listener)
6521 * @description
6522 * [en]Add an event listener that's only triggered once.[/en]
6523 * [ja]一度だけ呼び出されるイベントリスナを追加します。[/ja]
6524 * @param {String} eventName
6525 * [en]Name of the event.[/en]
6526 * [ja]イベント名を指定します。[/ja]
6527 * @param {Function} listener
6528 * [en]Function to execute when the event is triggered.[/en]
6529 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
6530 */
6531
6532/**
6533 * @method off
6534 * @signature off(eventName, [listener])
6535 * @description
6536 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
6537 * [ja]イベントリスナーを削除します。もしイベントリスナーが指定されなかった場合には、そのイベントに紐付いているイベントリスナーが全て削除されます。[/ja]
6538 * @param {String} eventName
6539 * [en]Name of the event.[/en]
6540 * [ja]イベント名を指定します。[/ja]
6541 * @param {Function} listener
6542 * [en]Function to execute when the event is triggered.[/en]
6543 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
6544 */
6545
6546/**
6547 * @method on
6548 * @signature on(eventName, listener)
6549 * @description
6550 * [en]Add an event listener.[/en]
6551 * [ja]イベントリスナーを追加します。[/ja]
6552 * @param {String} eventName
6553 * [en]Name of the event.[/en]
6554 * [ja]イベント名を指定します。[/ja]
6555 * @param {Function} listener
6556 * [en]Function to execute when the event is triggered.[/en]
6557 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
6558 */
6559
6560(function () {
6561 'use strict';
6562
6563 var module = angular.module('onsen');
6564
6565 module.directive('onsSpeedDial', ['$onsen', 'SpeedDialView', function ($onsen, SpeedDialView) {
6566 return {
6567 restrict: 'E',
6568 replace: false,
6569 scope: false,
6570 transclude: false,
6571
6572 compile: function compile(element, attrs) {
6573
6574 return function (scope, element, attrs) {
6575 var speedDial = new SpeedDialView(scope, element, attrs);
6576
6577 element.data('ons-speed-dial', speedDial);
6578
6579 $onsen.registerEventHandlers(speedDial, 'open close');
6580 $onsen.declareVarAttribute(attrs, speedDial);
6581
6582 scope.$on('$destroy', function () {
6583 speedDial._events = undefined;
6584 element.data('ons-speed-dial', undefined);
6585 element = null;
6586 });
6587
6588 $onsen.fireComponentEvent(element[0], 'init');
6589 };
6590 }
6591
6592 };
6593 }]);
6594})();
6595'use strict';
6596
6597/**
6598 * @element ons-split-view
6599 * @category control
6600 * @description
6601 * [en]Divides the screen into a left and right section.[/en]
6602 * [ja]画面を左右に分割するコンポーネントです。[/ja]
6603 * @codepen nKqfv {wide}
6604 * @guide Usingonssplitviewcomponent
6605 * [en]Using ons-split-view.[/en]
6606 * [ja]ons-split-viewコンポーネントを使う[/ja]
6607 * @guide CallingComponentAPIsfromJavaScript
6608 * [en]Using navigator from JavaScript[/en]
6609 * [ja]JavaScriptからコンポーネントを呼び出す[/ja]
6610 * @example
6611 * <ons-split-view
6612 * secondary-page="secondary.html"
6613 * main-page="main.html"
6614 * main-page-width="70%"
6615 * collapse="portrait">
6616 * </ons-split-view>
6617 */
6618
6619/**
6620 * @event update
6621 * @description
6622 * [en]Fired when the split view is updated.[/en]
6623 * [ja]split viewの状態が更新された際に発火します。[/ja]
6624 * @param {Object} event
6625 * [en]Event object.[/en]
6626 * [ja]イベントオブジェクトです。[/ja]
6627 * @param {Object} event.splitView
6628 * [en]Split view object.[/en]
6629 * [ja]イベントが発火したSplitViewオブジェクトです。[/ja]
6630 * @param {Boolean} event.shouldCollapse
6631 * [en]True if the view should collapse.[/en]
6632 * [ja]collapse状態の場合にtrueになります。[/ja]
6633 * @param {String} event.currentMode
6634 * [en]Current mode.[/en]
6635 * [ja]現在のモード名を返します。"collapse"か"split"かのいずれかです。[/ja]
6636 * @param {Function} event.split
6637 * [en]Call to force split.[/en]
6638 * [ja]この関数を呼び出すと強制的にsplitモードにします。[/ja]
6639 * @param {Function} event.collapse
6640 * [en]Call to force collapse.[/en]
6641 * [ja]この関数を呼び出すと強制的にcollapseモードにします。[/ja]
6642 * @param {Number} event.width
6643 * [en]Current width.[/en]
6644 * [ja]現在のSplitViewの幅を返します。[/ja]
6645 * @param {String} event.orientation
6646 * [en]Current orientation.[/en]
6647 * [ja]現在の画面のオリエンテーションを返します。"portrait"かもしくは"landscape"です。 [/ja]
6648 */
6649
6650/**
6651 * @event presplit
6652 * @description
6653 * [en]Fired just before the view is split.[/en]
6654 * [ja]split状態にる前に発火します。[/ja]
6655 * @param {Object} event
6656 * [en]Event object.[/en]
6657 * [ja]イベントオブジェクト。[/ja]
6658 * @param {Object} event.splitView
6659 * [en]Split view object.[/en]
6660 * [ja]イベントが発火したSplitViewオブジェクトです。[/ja]
6661 * @param {Number} event.width
6662 * [en]Current width.[/en]
6663 * [ja]現在のSplitViewnの幅です。[/ja]
6664 * @param {String} event.orientation
6665 * [en]Current orientation.[/en]
6666 * [ja]現在の画面のオリエンテーションを返します。"portrait"もしくは"landscape"です。[/ja]
6667 */
6668
6669/**
6670 * @event postsplit
6671 * @description
6672 * [en]Fired just after the view is split.[/en]
6673 * [ja]split状態になった後に発火します。[/ja]
6674 * @param {Object} event
6675 * [en]Event object.[/en]
6676 * [ja]イベントオブジェクト。[/ja]
6677 * @param {Object} event.splitView
6678 * [en]Split view object.[/en]
6679 * [ja]イベントが発火したSplitViewオブジェクトです。[/ja]
6680 * @param {Number} event.width
6681 * [en]Current width.[/en]
6682 * [ja]現在のSplitViewnの幅です。[/ja]
6683 * @param {String} event.orientation
6684 * [en]Current orientation.[/en]
6685 * [ja]現在の画面のオリエンテーションを返します。"portrait"もしくは"landscape"です。[/ja]
6686 */
6687
6688/**
6689 * @event precollapse
6690 * @description
6691 * [en]Fired just before the view is collapsed.[/en]
6692 * [ja]collapse状態になる前に発火します。[/ja]
6693 * @param {Object} event
6694 * [en]Event object.[/en]
6695 * [ja]イベントオブジェクト。[/ja]
6696 * @param {Object} event.splitView
6697 * [en]Split view object.[/en]
6698 * [ja]イベントが発火したSplitViewオブジェクトです。[/ja]
6699 * @param {Number} event.width
6700 * [en]Current width.[/en]
6701 * [ja]現在のSplitViewnの幅です。[/ja]
6702 * @param {String} event.orientation
6703 * [en]Current orientation.[/en]
6704 * [ja]現在の画面のオリエンテーションを返します。"portrait"もしくは"landscape"です。[/ja]
6705 */
6706
6707/**
6708 * @event postcollapse
6709 * @description
6710 * [en]Fired just after the view is collapsed.[/en]
6711 * [ja]collapse状態になった後に発火します。[/ja]
6712 * @param {Object} event
6713 * [en]Event object.[/en]
6714 * [ja]イベントオブジェクト。[/ja]
6715 * @param {Object} event.splitView
6716 * [en]Split view object.[/en]
6717 * [ja]イベントが発火したSplitViewオブジェクトです。[/ja]
6718 * @param {Number} event.width
6719 * [en]Current width.[/en]
6720 * [ja]現在のSplitViewnの幅です。[/ja]
6721 * @param {String} event.orientation
6722 * [en]Current orientation.[/en]
6723 * [ja]現在の画面のオリエンテーションを返します。"portrait"もしくは"landscape"です。[/ja]
6724 */
6725
6726/**
6727 * @attribute var
6728 * @initonly
6729 * @type {String}
6730 * @description
6731 * [en]Variable name to refer this split view.[/en]
6732 * [ja]このスプリットビューコンポーネントを参照するための名前を指定します。[/ja]
6733 */
6734
6735/**
6736 * @attribute main-page
6737 * @initonly
6738 * @type {String}
6739 * @description
6740 * [en]The url of the page on the right.[/en]
6741 * [ja]右側に表示するページのURLを指定します。[/ja]
6742 */
6743
6744/**
6745 * @attribute main-page-width
6746 * @initonly
6747 * @type {Number}
6748 * @description
6749 * [en]Main page width percentage. The secondary page width will be the remaining percentage.[/en]
6750 * [ja]右側のページの幅をパーセント単位で指定します。[/ja]
6751 */
6752
6753/**
6754 * @attribute secondary-page
6755 * @initonly
6756 * @type {String}
6757 * @description
6758 * [en]The url of the page on the left.[/en]
6759 * [ja]左側に表示するページのURLを指定します。[/ja]
6760 */
6761
6762/**
6763 * @attribute collapse
6764 * @initonly
6765 * @type {String}
6766 * @description
6767 * [en]
6768 * Specify the collapse behavior. Valid values are portrait, landscape, width #px or a media query.
6769 * "portrait" or "landscape" means the view will collapse when device is in landscape or portrait orientation.
6770 * "width #px" means the view will collapse when the window width is smaller than the specified #px.
6771 * If the value is a media query, the view will collapse when the media query is true.
6772 * [/en]
6773 * [ja]
6774 * 左側のページを非表示にする条件を指定します。portrait, landscape、width #pxもしくはメディアクエリの指定が可能です。
6775 * portraitもしくはlandscapeを指定すると、デバイスの画面が縦向きもしくは横向きになった時に適用されます。
6776 * width #pxを指定すると、画面が指定した横幅よりも短い場合に適用されます。
6777 * メディアクエリを指定すると、指定したクエリに適合している場合に適用されます。
6778 * [/ja]
6779 */
6780
6781/**
6782 * @attribute ons-update
6783 * @initonly
6784 * @type {Expression}
6785 * @description
6786 * [en]Allows you to specify custom behavior when the "update" event is fired.[/en]
6787 * [ja]"update"イベントが発火された時の挙動を独自に指定できます。[/ja]
6788 */
6789
6790/**
6791 * @attribute ons-presplit
6792 * @initonly
6793 * @type {Expression}
6794 * @description
6795 * [en]Allows you to specify custom behavior when the "presplit" event is fired.[/en]
6796 * [ja]"presplit"イベントが発火された時の挙動を独自に指定できます。[/ja]
6797 */
6798
6799/**
6800 * @attribute ons-precollapse
6801 * @initonly
6802 * @type {Expression}
6803 * @description
6804 * [en]Allows you to specify custom behavior when the "precollapse" event is fired.[/en]
6805 * [ja]"precollapse"イベントが発火された時の挙動を独自に指定できます。[/ja]
6806 */
6807
6808/**
6809 * @attribute ons-postsplit
6810 * @initonly
6811 * @type {Expression}
6812 * @description
6813 * [en]Allows you to specify custom behavior when the "postsplit" event is fired.[/en]
6814 * [ja]"postsplit"イベントが発火された時の挙動を独自に指定できます。[/ja]
6815 */
6816
6817/**
6818 * @attribute ons-postcollapse
6819 * @initonly
6820 * @type {Expression}
6821 * @description
6822 * [en]Allows you to specify custom behavior when the "postcollapse" event is fired.[/en]
6823 * [ja]"postcollapse"イベントが発火された時の挙動を独自に指定できます。[/ja]
6824 */
6825
6826/**
6827 * @attribute ons-init
6828 * @initonly
6829 * @type {Expression}
6830 * @description
6831 * [en]Allows you to specify custom behavior when a page's "init" event is fired.[/en]
6832 * [ja]ページの"init"イベントが発火された時の挙動を独自に指定できます。[/ja]
6833 */
6834
6835/**
6836 * @attribute ons-show
6837 * @initonly
6838 * @type {Expression}
6839 * @description
6840 * [en]Allows you to specify custom behavior when a page's "show" event is fired.[/en]
6841 * [ja]ページの"show"イベントが発火された時の挙動を独自に指定できます。[/ja]
6842 */
6843
6844/**
6845 * @attribute ons-hide
6846 * @initonly
6847 * @type {Expression}
6848 * @description
6849 * [en]Allows you to specify custom behavior when a page's "hide" event is fired.[/en]
6850 * [ja]ページの"hide"イベントが発火された時の挙動を独自に指定できます。[/ja]
6851 */
6852
6853/**
6854 * @attribute ons-destroy
6855 * @initonly
6856 * @type {Expression}
6857 * @description
6858 * [en]Allows you to specify custom behavior when a page's "destroy" event is fired.[/en]
6859 * [ja]ページの"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
6860 */
6861
6862/**
6863 * @method setMainPage
6864 * @signature setMainPage(pageUrl)
6865 * @param {String} pageUrl
6866 * [en]Page URL. Can be either an HTML document or an <ons-template>.[/en]
6867 * [ja]pageのURLか、ons-templateで宣言したテンプレートのid属性の値を指定します。[/ja]
6868 * @description
6869 * [en]Show the page specified in pageUrl in the right section[/en]
6870 * [ja]指定したURLをメインページを読み込みます。[/ja]
6871 */
6872
6873/**
6874 * @method setSecondaryPage
6875 * @signature setSecondaryPage(pageUrl)
6876 * @param {String} pageUrl
6877 * [en]Page URL. Can be either an HTML document or an <ons-template>.[/en]
6878 * [ja]pageのURLか、ons-templateで宣言したテンプレートのid属性の値を指定します。[/ja]
6879 * @description
6880 * [en]Show the page specified in pageUrl in the left section[/en]
6881 * [ja]指定したURLを左のページの読み込みます。[/ja]
6882 */
6883
6884/**
6885 * @method update
6886 * @signature update()
6887 * @description
6888 * [en]Trigger an 'update' event and try to determine if the split behavior should be changed.[/en]
6889 * [ja]splitモードを変えるべきかどうかを判断するための'update'イベントを発火します。[/ja]
6890 */
6891
6892/**
6893 * @method on
6894 * @signature on(eventName, listener)
6895 * @description
6896 * [en]Add an event listener.[/en]
6897 * [ja]イベントリスナーを追加します。[/ja]
6898 * @param {String} eventName
6899 * [en]Name of the event.[/en]
6900 * [ja]イベント名を指定します。[/ja]
6901 * @param {Function} listener
6902 * [en]Function to execute when the event is triggered.[/en]
6903 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
6904 */
6905
6906/**
6907 * @method once
6908 * @signature once(eventName, listener)
6909 * @description
6910 * [en]Add an event listener that's only triggered once.[/en]
6911 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
6912 * @param {String} eventName
6913 * [en]Name of the event.[/en]
6914 * [ja]イベント名を指定します。[/ja]
6915 * @param {Function} listener
6916 * [en]Function to execute when the event is triggered.[/en]
6917 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
6918 */
6919
6920/**
6921 * @method off
6922 * @signature off(eventName, [listener])
6923 * @description
6924 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
6925 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
6926 * @param {String} eventName
6927 * [en]Name of the event.[/en]
6928 * [ja]イベント名を指定します。[/ja]
6929 * @param {Function} listener
6930 * [en]Function to execute when the event is triggered.[/en]
6931 * [ja]削除するイベントリスナーを指定します。[/ja]
6932 */
6933
6934(function () {
6935 'use strict';
6936
6937 var module = angular.module('onsen');
6938
6939 module.directive('onsSplitView', ['$compile', 'SplitView', '$onsen', function ($compile, SplitView, $onsen) {
6940
6941 return {
6942 restrict: 'E',
6943 replace: false,
6944 transclude: false,
6945 scope: true,
6946
6947 compile: function compile(element, attrs) {
6948 var mainPage = element[0].querySelector('.main-page'),
6949 secondaryPage = element[0].querySelector('.secondary-page');
6950
6951 if (mainPage) {
6952 var mainHtml = angular.element(mainPage).remove().html().trim();
6953 }
6954
6955 if (secondaryPage) {
6956 var secondaryHtml = angular.element(secondaryPage).remove().html().trim();
6957 }
6958
6959 return function (scope, element, attrs) {
6960 element.append(angular.element('<div></div>').addClass('onsen-split-view__secondary full-screen'));
6961 element.append(angular.element('<div></div>').addClass('onsen-split-view__main full-screen'));
6962
6963 var splitView = new SplitView(scope, element, attrs);
6964
6965 if (mainHtml && !attrs.mainPage) {
6966 splitView._appendMainPage(mainHtml);
6967 }
6968
6969 if (secondaryHtml && !attrs.secondaryPage) {
6970 splitView._appendSecondPage(secondaryHtml);
6971 }
6972
6973 $onsen.declareVarAttribute(attrs, splitView);
6974 $onsen.registerEventHandlers(splitView, 'update presplit precollapse postsplit postcollapse init show hide destroy');
6975
6976 element.data('ons-split-view', splitView);
6977
6978 scope.$on('$destroy', function () {
6979 splitView._events = undefined;
6980 element.data('ons-split-view', undefined);
6981 });
6982
6983 $onsen.fireComponentEvent(element[0], 'init');
6984 };
6985 }
6986 };
6987 }]);
6988})();
6989'use strict';
6990
6991/**
6992 * @element ons-splitter
6993 */
6994
6995/**
6996 * @attribute var
6997 * @initonly
6998 * @type {String}
6999 * @description
7000 * [en]Variable name to refer this split view.[/en]
7001 * [ja]このスプリットビューコンポーネントを参照するための名前を指定します。[/ja]
7002 */
7003
7004/**
7005 * @attribute ons-destroy
7006 * @initonly
7007 * @type {Expression}
7008 * @description
7009 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
7010 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
7011 */
7012
7013/**
7014 * @method on
7015 * @signature on(eventName, listener)
7016 * @description
7017 * [en]Add an event listener.[/en]
7018 * [ja]イベントリスナーを追加します。[/ja]
7019 * @param {String} eventName
7020 * [en]Name of the event.[/en]
7021 * [ja]イベント名を指定します。[/ja]
7022 * @param {Function} listener
7023 * [en]Function to execute when the event is triggered.[/en]
7024 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
7025 */
7026
7027/**
7028 * @method once
7029 * @signature once(eventName, listener)
7030 * @description
7031 * [en]Add an event listener that's only triggered once.[/en]
7032 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
7033 * @param {String} eventName
7034 * [en]Name of the event.[/en]
7035 * [ja]イベント名を指定します。[/ja]
7036 * @param {Function} listener
7037 * [en]Function to execute when the event is triggered.[/en]
7038 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
7039 */
7040
7041/**
7042 * @method off
7043 * @signature off(eventName, [listener])
7044 * @description
7045 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
7046 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
7047 * @param {String} eventName
7048 * [en]Name of the event.[/en]
7049 * [ja]イベント名を指定します。[/ja]
7050 * @param {Function} listener
7051 * [en]Function to execute when the event is triggered.[/en]
7052 * [ja]削除するイベントリスナーを指定します。[/ja]
7053 */
7054
7055(function () {
7056 'use strict';
7057
7058 angular.module('onsen').directive('onsSplitter', ['$compile', 'Splitter', '$onsen', function ($compile, Splitter, $onsen) {
7059 return {
7060 restrict: 'E',
7061 scope: true,
7062
7063 compile: function compile(element, attrs) {
7064
7065 return function (scope, element, attrs) {
7066
7067 var splitter = new Splitter(scope, element, attrs);
7068
7069 $onsen.declareVarAttribute(attrs, splitter);
7070 $onsen.registerEventHandlers(splitter, 'destroy');
7071
7072 element.data('ons-splitter', splitter);
7073
7074 scope.$on('$destroy', function () {
7075 splitter._events = undefined;
7076 element.data('ons-splitter', undefined);
7077 });
7078
7079 $onsen.fireComponentEvent(element[0], 'init');
7080 };
7081 }
7082 };
7083 }]);
7084})();
7085'use strict';
7086
7087/**
7088 * @element ons-splitter-content
7089 */
7090
7091/**
7092 * @attribute ons-destroy
7093 * @initonly
7094 * @type {Expression}
7095 * @description
7096 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
7097 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
7098 */
7099(function () {
7100 'use strict';
7101
7102 var lastReady = window.ons.SplitterContentElement.rewritables.ready;
7103 window.ons.SplitterContentElement.rewritables.ready = ons._waitDiretiveInit('ons-splitter-content', lastReady);
7104
7105 var lastLink = window.ons.SplitterContentElement.rewritables.link;
7106 window.ons.SplitterContentElement.rewritables.link = function (element, target, options, callback) {
7107 var view = angular.element(element).data('ons-splitter-content');
7108 lastLink(element, target, options, function (target) {
7109 view._link(target, callback);
7110 });
7111 };
7112
7113 angular.module('onsen').directive('onsSplitterContent', ['$compile', 'SplitterContent', '$onsen', function ($compile, SplitterContent, $onsen) {
7114 return {
7115 restrict: 'E',
7116
7117 compile: function compile(element, attrs) {
7118
7119 return function (scope, element, attrs) {
7120
7121 var view = new SplitterContent(scope, element, attrs);
7122
7123 $onsen.declareVarAttribute(attrs, view);
7124 $onsen.registerEventHandlers(view, 'destroy');
7125
7126 element.data('ons-splitter-content', view);
7127
7128 scope.$on('$destroy', function () {
7129 view._events = undefined;
7130 element.data('ons-splitter-content', undefined);
7131 });
7132
7133 $onsen.fireComponentEvent(element[0], 'init');
7134 };
7135 }
7136 };
7137 }]);
7138})();
7139'use strict';
7140
7141/**
7142 * @element ons-splitter-side
7143 */
7144
7145/**
7146 * @attribute ons-destroy
7147 * @initonly
7148 * @type {Expression}
7149 * @description
7150 * [en]Allows you to specify custom behavior when the "destroy" event is fired.[/en]
7151 * [ja]"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
7152 */
7153
7154/**
7155 * @attribute ons-preopen
7156 * @initonly
7157 * @type {Expression}
7158 * @description
7159 * [en]Allows you to specify custom behavior when the "preopen" event is fired.[/en]
7160 * [ja]"preopen"イベントが発火された時の挙動を独自に指定できます。[/ja]
7161 */
7162
7163/**
7164 * @attribute ons-preclose
7165 * @initonly
7166 * @type {Expression}
7167 * @description
7168 * [en]Allows you to specify custom behavior when the "preclose" event is fired.[/en]
7169 * [ja]"preclose"イベントが発火された時の挙動を独自に指定できます。[/ja]
7170 */
7171
7172/**
7173 * @attribute ons-postopen
7174 * @initonly
7175 * @type {Expression}
7176 * @description
7177 * [en]Allows you to specify custom behavior when the "postopen" event is fired.[/en]
7178 * [ja]"postopen"イベントが発火された時の挙動を独自に指定できます。[/ja]
7179 */
7180
7181/**
7182 * @attribute ons-postclose
7183 * @initonly
7184 * @type {Expression}
7185 * @description
7186 * [en]Allows you to specify custom behavior when the "postclose" event is fired.[/en]
7187 * [ja]"postclose"イベントが発火された時の挙動を独自に指定できます。[/ja]
7188 */
7189(function () {
7190 'use strict';
7191
7192 var lastReady = window.ons.SplitterSideElement.rewritables.ready;
7193 window.ons.SplitterSideElement.rewritables.ready = ons._waitDiretiveInit('ons-splitter-side', lastReady);
7194
7195 var lastLink = window.ons.SplitterSideElement.rewritables.link;
7196 window.ons.SplitterSideElement.rewritables.link = function (element, target, options, callback) {
7197 var view = angular.element(element).data('ons-splitter-side');
7198 lastLink(element, target, options, function (target) {
7199 view._link(target, callback);
7200 });
7201 };
7202
7203 angular.module('onsen').directive('onsSplitterSide', ['$compile', 'SplitterSide', '$onsen', function ($compile, SplitterSide, $onsen) {
7204 return {
7205 restrict: 'E',
7206
7207 compile: function compile(element, attrs) {
7208
7209 return function (scope, element, attrs) {
7210
7211 var view = new SplitterSide(scope, element, attrs);
7212
7213 $onsen.declareVarAttribute(attrs, view);
7214 $onsen.registerEventHandlers(view, 'destroy');
7215
7216 element.data('ons-splitter-side', view);
7217
7218 scope.$on('$destroy', function () {
7219 view._events = undefined;
7220 element.data('ons-splitter-side', undefined);
7221 });
7222
7223 $onsen.fireComponentEvent(element[0], 'init');
7224 };
7225 }
7226 };
7227 }]);
7228})();
7229'use strict';
7230
7231/**
7232 * @element ons-switch
7233 */
7234
7235/**
7236 * @attribute var
7237 * @initonly
7238 * @type {String}
7239 * @description
7240 * [en]Variable name to refer this switch.[/en]
7241 * [ja]JavaScriptから参照するための変数名を指定します。[/ja]
7242 */
7243
7244/**
7245 * @method on
7246 * @signature on(eventName, listener)
7247 * @description
7248 * [en]Add an event listener.[/en]
7249 * [ja]イベントリスナーを追加します。[/ja]
7250 * @param {String} eventName
7251 * [en]Name of the event.[/en]
7252 * [ja]イベント名を指定します。[/ja]
7253 * @param {Function} listener
7254 * [en]Function to execute when the event is triggered.[/en]
7255 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
7256 */
7257
7258/**
7259 * @method once
7260 * @signature once(eventName, listener)
7261 * @description
7262 * [en]Add an event listener that's only triggered once.[/en]
7263 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
7264 * @param {String} eventName
7265 * [en]Name of the event.[/en]
7266 * [ja]イベント名を指定します。[/ja]
7267 * @param {Function} listener
7268 * [en]Function to execute when the event is triggered.[/en]
7269 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
7270 */
7271
7272/**
7273 * @method off
7274 * @signature off(eventName, [listener])
7275 * @description
7276 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
7277 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
7278 * @param {String} eventName
7279 * [en]Name of the event.[/en]
7280 * [ja]イベント名を指定します。[/ja]
7281 * @param {Function} listener
7282 * [en]Function to execute when the event is triggered.[/en]
7283 * [ja]削除するイベントリスナーを指定します。[/ja]
7284 */
7285
7286(function () {
7287 'use strict';
7288
7289 angular.module('onsen').directive('onsSwitch', ['$onsen', 'SwitchView', function ($onsen, SwitchView) {
7290 return {
7291 restrict: 'E',
7292 replace: false,
7293 scope: true,
7294
7295 link: function link(scope, element, attrs) {
7296
7297 if (attrs.ngController) {
7298 throw new Error('This element can\'t accept ng-controller directive.');
7299 }
7300
7301 var switchView = new SwitchView(element, scope, attrs);
7302 $onsen.addModifierMethodsForCustomElements(switchView, element);
7303
7304 $onsen.declareVarAttribute(attrs, switchView);
7305 element.data('ons-switch', switchView);
7306
7307 $onsen.cleaner.onDestroy(scope, function () {
7308 switchView._events = undefined;
7309 $onsen.removeModifierMethods(switchView);
7310 element.data('ons-switch', undefined);
7311 $onsen.clearComponent({
7312 element: element,
7313 scope: scope,
7314 attrs: attrs
7315 });
7316 element = attrs = scope = null;
7317 });
7318
7319 $onsen.fireComponentEvent(element[0], 'init');
7320 }
7321 };
7322 }]);
7323})();
7324'use strict';
7325
7326(function () {
7327 'use strict';
7328
7329 tab.$inject = ['$onsen'];
7330 angular.module('onsen').directive('onsTab', tab).directive('onsTabbarItem', tab); // for BC
7331
7332 function tab($onsen) {
7333 return {
7334 restrict: 'E',
7335 link: function link(scope, element, attrs) {
7336 $onsen.fireComponentEvent(element[0], 'init');
7337 }
7338 };
7339 }
7340})();
7341'use strict';
7342
7343/**
7344 * @element ons-tabbar
7345 */
7346
7347/**
7348 * @attribute var
7349 * @initonly
7350 * @type {String}
7351 * @description
7352 * [en]Variable name to refer this tab bar.[/en]
7353 * [ja]このタブバーを参照するための名前を指定します。[/ja]
7354 */
7355
7356/**
7357 * @attribute hide-tabs
7358 * @initonly
7359 * @type {Boolean}
7360 * @default false
7361 * @description
7362 * [en]Whether to hide the tabs. Valid values are true/false.[/en]
7363 * [ja]タブを非表示にする場合に指定します。trueもしくはfalseを指定できます。[/ja]
7364 */
7365
7366/**
7367 * @attribute ons-reactive
7368 * @initonly
7369 * @type {Expression}
7370 * @description
7371 * [en]Allows you to specify custom behavior when the "reactive" event is fired.[/en]
7372 * [ja]"reactive"イベントが発火された時の挙動を独自に指定できます。[/ja]
7373 */
7374
7375/**
7376 * @attribute ons-prechange
7377 * @initonly
7378 * @type {Expression}
7379 * @description
7380 * [en]Allows you to specify custom behavior when the "prechange" event is fired.[/en]
7381 * [ja]"prechange"イベントが発火された時の挙動を独自に指定できます。[/ja]
7382 */
7383
7384/**
7385 * @attribute ons-postchange
7386 * @initonly
7387 * @type {Expression}
7388 * @description
7389 * [en]Allows you to specify custom behavior when the "postchange" event is fired.[/en]
7390 * [ja]"postchange"イベントが発火された時の挙動を独自に指定できます。[/ja]
7391 */
7392
7393/**
7394 * @attribute ons-init
7395 * @initonly
7396 * @type {Expression}
7397 * @description
7398 * [en]Allows you to specify custom behavior when a page's "init" event is fired.[/en]
7399 * [ja]ページの"init"イベントが発火された時の挙動を独自に指定できます。[/ja]
7400 */
7401
7402/**
7403 * @attribute ons-show
7404 * @initonly
7405 * @type {Expression}
7406 * @description
7407 * [en]Allows you to specify custom behavior when a page's "show" event is fired.[/en]
7408 * [ja]ページの"show"イベントが発火された時の挙動を独自に指定できます。[/ja]
7409 */
7410
7411/**
7412 * @attribute ons-hide
7413 * @initonly
7414 * @type {Expression}
7415 * @description
7416 * [en]Allows you to specify custom behavior when a page's "hide" event is fired.[/en]
7417 * [ja]ページの"hide"イベントが発火された時の挙動を独自に指定できます。[/ja]
7418 */
7419
7420/**
7421 * @attribute ons-destroy
7422 * @initonly
7423 * @type {Expression}
7424 * @description
7425 * [en]Allows you to specify custom behavior when a page's "destroy" event is fired.[/en]
7426 * [ja]ページの"destroy"イベントが発火された時の挙動を独自に指定できます。[/ja]
7427 */
7428
7429/**
7430 * @method on
7431 * @signature on(eventName, listener)
7432 * @description
7433 * [en]Add an event listener.[/en]
7434 * [ja]イベントリスナーを追加します。[/ja]
7435 * @param {String} eventName
7436 * [en]Name of the event.[/en]
7437 * [ja]イベント名を指定します。[/ja]
7438 * @param {Function} listener
7439 * [en]Function to execute when the event is triggered.[/en]
7440 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
7441 */
7442
7443/**
7444 * @method once
7445 * @signature once(eventName, listener)
7446 * @description
7447 * [en]Add an event listener that's only triggered once.[/en]
7448 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
7449 * @param {String} eventName
7450 * [en]Name of the event.[/en]
7451 * [ja]イベント名を指定します。[/ja]
7452 * @param {Function} listener
7453 * [en]Function to execute when the event is triggered.[/en]
7454 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
7455 */
7456
7457/**
7458 * @method off
7459 * @signature off(eventName, [listener])
7460 * @description
7461 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
7462 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
7463 * @param {String} eventName
7464 * [en]Name of the event.[/en]
7465 * [ja]イベント名を指定します。[/ja]
7466 * @param {Function} listener
7467 * [en]Function to execute when the event is triggered.[/en]
7468 * [ja]削除するイベントリスナーを指定します。[/ja]
7469 */
7470
7471(function () {
7472 'use strict';
7473
7474 var lastReady = window.ons.TabbarElement.rewritables.ready;
7475 window.ons.TabbarElement.rewritables.ready = ons._waitDiretiveInit('ons-tabbar', lastReady);
7476
7477 var lastLink = window.ons.TabbarElement.rewritables.link;
7478 window.ons.TabbarElement.rewritables.link = function (tabbarElement, target, options, callback) {
7479 var view = angular.element(tabbarElement).data('ons-tabbar');
7480 view._compileAndLink(target, function (target) {
7481 lastLink(tabbarElement, target, options, callback);
7482 });
7483 };
7484
7485 var lastUnlink = window.ons.TabbarElement.rewritables.unlink;
7486 window.ons.TabbarElement.rewritables.unlink = function (tabbarElement, target, callback) {
7487 angular.element(target).data('_scope').$destroy();
7488 lastUnlink(tabbarElement, target, callback);
7489 };
7490
7491 angular.module('onsen').directive('onsTabbar', ['$onsen', '$compile', '$parse', 'TabbarView', function ($onsen, $compile, $parse, TabbarView) {
7492
7493 return {
7494 restrict: 'E',
7495
7496 replace: false,
7497 scope: true,
7498
7499 link: function link(scope, element, attrs, controller) {
7500
7501 scope.$watch(attrs.hideTabs, function (hide) {
7502 if (typeof hide === 'string') {
7503 hide = hide === 'true';
7504 }
7505 element[0].setTabbarVisibility(!hide);
7506 });
7507
7508 var tabbarView = new TabbarView(scope, element, attrs);
7509 $onsen.addModifierMethodsForCustomElements(tabbarView, element);
7510
7511 $onsen.registerEventHandlers(tabbarView, 'reactive prechange postchange init show hide destroy');
7512
7513 element.data('ons-tabbar', tabbarView);
7514 $onsen.declareVarAttribute(attrs, tabbarView);
7515
7516 scope.$on('$destroy', function () {
7517 tabbarView._events = undefined;
7518 $onsen.removeModifierMethods(tabbarView);
7519 element.data('ons-tabbar', undefined);
7520 });
7521
7522 $onsen.fireComponentEvent(element[0], 'init');
7523 }
7524 };
7525 }]);
7526})();
7527'use strict';
7528
7529(function () {
7530 'use strict';
7531
7532 angular.module('onsen').directive('onsTemplate', ['$templateCache', function ($templateCache) {
7533 return {
7534 restrict: 'E',
7535 terminal: true,
7536 compile: function compile(element) {
7537 var content = element[0].template || element.html();
7538 $templateCache.put(element.attr('id'), content);
7539 }
7540 };
7541 }]);
7542})();
7543'use strict';
7544
7545/**
7546 * @element ons-toolbar
7547 */
7548
7549/**
7550 * @attribute var
7551 * @initonly
7552 * @type {String}
7553 * @description
7554 * [en]Variable name to refer this toolbar.[/en]
7555 * [ja]このツールバーを参照するための名前を指定します。[/ja]
7556 */
7557(function () {
7558 'use strict';
7559
7560 angular.module('onsen').directive('onsToolbar', ['$onsen', 'GenericView', function ($onsen, GenericView) {
7561 return {
7562 restrict: 'E',
7563
7564 // NOTE: This element must coexists with ng-controller.
7565 // Do not use isolated scope and template's ng-transclude.
7566 scope: false,
7567 transclude: false,
7568
7569 compile: function compile(element) {
7570 return {
7571 pre: function pre(scope, element, attrs) {
7572 // TODO: Remove this dirty fix!
7573 if (element[0].nodeName === 'ons-toolbar') {
7574 GenericView.register(scope, element, attrs, { viewKey: 'ons-toolbar' });
7575 }
7576 },
7577 post: function post(scope, element, attrs) {
7578 $onsen.fireComponentEvent(element[0], 'init');
7579 }
7580 };
7581 }
7582 };
7583 }]);
7584})();
7585'use strict';
7586
7587/**
7588 * @element ons-toolbar-button
7589 */
7590
7591/**
7592 * @attribute var
7593 * @initonly
7594 * @type {String}
7595 * @description
7596 * [en]Variable name to refer this button.[/en]
7597 * [ja]このボタンを参照するための名前を指定します。[/ja]
7598 */
7599(function () {
7600 'use strict';
7601
7602 var module = angular.module('onsen');
7603
7604 module.directive('onsToolbarButton', ['$onsen', 'GenericView', function ($onsen, GenericView) {
7605 return {
7606 restrict: 'E',
7607 scope: false,
7608 link: {
7609 pre: function pre(scope, element, attrs) {
7610 var toolbarButton = new GenericView(scope, element, attrs);
7611 element.data('ons-toolbar-button', toolbarButton);
7612 $onsen.declareVarAttribute(attrs, toolbarButton);
7613
7614 $onsen.addModifierMethodsForCustomElements(toolbarButton, element);
7615
7616 $onsen.cleaner.onDestroy(scope, function () {
7617 toolbarButton._events = undefined;
7618 $onsen.removeModifierMethods(toolbarButton);
7619 element.data('ons-toolbar-button', undefined);
7620 element = null;
7621
7622 $onsen.clearComponent({
7623 scope: scope,
7624 attrs: attrs,
7625 element: element
7626 });
7627 scope = element = attrs = null;
7628 });
7629 },
7630 post: function post(scope, element, attrs) {
7631 $onsen.fireComponentEvent(element[0], 'init');
7632 }
7633 }
7634 };
7635 }]);
7636})();
7637'use strict';
7638
7639/*
7640Copyright 2013-2015 ASIAL CORPORATION
7641
7642Licensed under the Apache License, Version 2.0 (the "License");
7643you may not use this file except in compliance with the License.
7644You may obtain a copy of the License at
7645
7646 http://www.apache.org/licenses/LICENSE-2.0
7647
7648Unless required by applicable law or agreed to in writing, software
7649distributed under the License is distributed on an "AS IS" BASIS,
7650WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7651See the License for the specific language governing permissions and
7652limitations under the License.
7653
7654*/
7655
7656(function () {
7657 'use strict';
7658
7659 var module = angular.module('onsen');
7660
7661 var ComponentCleaner = {
7662 /**
7663 * @param {jqLite} element
7664 */
7665 decomposeNode: function decomposeNode(element) {
7666 var children = element.remove().children();
7667 for (var i = 0; i < children.length; i++) {
7668 ComponentCleaner.decomposeNode(angular.element(children[i]));
7669 }
7670 },
7671
7672 /**
7673 * @param {Attributes} attrs
7674 */
7675 destroyAttributes: function destroyAttributes(attrs) {
7676 attrs.$$element = null;
7677 attrs.$$observers = null;
7678 },
7679
7680 /**
7681 * @param {jqLite} element
7682 */
7683 destroyElement: function destroyElement(element) {
7684 element.remove();
7685 },
7686
7687 /**
7688 * @param {Scope} scope
7689 */
7690 destroyScope: function destroyScope(scope) {
7691 scope.$$listeners = {};
7692 scope.$$watchers = null;
7693 scope = null;
7694 },
7695
7696 /**
7697 * @param {Scope} scope
7698 * @param {Function} fn
7699 */
7700 onDestroy: function onDestroy(scope, fn) {
7701 var clear = scope.$on('$destroy', function () {
7702 clear();
7703 fn.apply(null, arguments);
7704 });
7705 }
7706 };
7707
7708 module.factory('ComponentCleaner', function () {
7709 return ComponentCleaner;
7710 });
7711
7712 // override builtin ng-(eventname) directives
7713 (function () {
7714 var ngEventDirectives = {};
7715 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' ').forEach(function (name) {
7716 var directiveName = directiveNormalize('ng-' + name);
7717 ngEventDirectives[directiveName] = ['$parse', function ($parse) {
7718 return {
7719 compile: function compile($element, attr) {
7720 var fn = $parse(attr[directiveName]);
7721 return function (scope, element, attr) {
7722 var listener = function listener(event) {
7723 scope.$apply(function () {
7724 fn(scope, { $event: event });
7725 });
7726 };
7727 element.on(name, listener);
7728
7729 ComponentCleaner.onDestroy(scope, function () {
7730 element.off(name, listener);
7731 element = null;
7732
7733 ComponentCleaner.destroyScope(scope);
7734 scope = null;
7735
7736 ComponentCleaner.destroyAttributes(attr);
7737 attr = null;
7738 });
7739 };
7740 }
7741 };
7742 }];
7743
7744 function directiveNormalize(name) {
7745 return name.replace(/-([a-z])/g, function (matches) {
7746 return matches[1].toUpperCase();
7747 });
7748 }
7749 });
7750 module.config(['$provide', function ($provide) {
7751 var shift = function shift($delegate) {
7752 $delegate.shift();
7753 return $delegate;
7754 };
7755 Object.keys(ngEventDirectives).forEach(function (directiveName) {
7756 $provide.decorator(directiveName + 'Directive', ['$delegate', shift]);
7757 });
7758 }]);
7759 Object.keys(ngEventDirectives).forEach(function (directiveName) {
7760 module.directive(directiveName, ngEventDirectives[directiveName]);
7761 });
7762 })();
7763})();
7764'use strict';
7765
7766/*
7767Copyright 2013-2015 ASIAL CORPORATION
7768
7769Licensed under the Apache License, Version 2.0 (the "License");
7770you may not use this file except in compliance with the License.
7771You may obtain a copy of the License at
7772
7773 http://www.apache.org/licenses/LICENSE-2.0
7774
7775Unless required by applicable law or agreed to in writing, software
7776distributed under the License is distributed on an "AS IS" BASIS,
7777WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7778See the License for the specific language governing permissions and
7779limitations under the License.
7780
7781*/
7782
7783(function () {
7784 'use strict';
7785
7786 var module = angular.module('onsen');
7787
7788 /**
7789 * Internal service class for framework implementation.
7790 */
7791 module.factory('$onsen', ['$rootScope', '$window', '$cacheFactory', '$document', '$templateCache', '$http', '$q', '$onsGlobal', 'ComponentCleaner', function ($rootScope, $window, $cacheFactory, $document, $templateCache, $http, $q, $onsGlobal, ComponentCleaner) {
7792
7793 var $onsen = createOnsenService();
7794 var ModifierUtil = $onsGlobal._internal.ModifierUtil;
7795
7796 return $onsen;
7797
7798 function createOnsenService() {
7799 return {
7800
7801 DIRECTIVE_TEMPLATE_URL: 'templates',
7802
7803 cleaner: ComponentCleaner,
7804
7805 DeviceBackButtonHandler: $onsGlobal._deviceBackButtonDispatcher,
7806
7807 _defaultDeviceBackButtonHandler: $onsGlobal._defaultDeviceBackButtonHandler,
7808
7809 /**
7810 * @return {Object}
7811 */
7812 getDefaultDeviceBackButtonHandler: function getDefaultDeviceBackButtonHandler() {
7813 return this._defaultDeviceBackButtonHandler;
7814 },
7815
7816 /**
7817 * @param {Object} view
7818 * @param {Element} element
7819 * @param {Array} methodNames
7820 * @return {Function} A function that dispose all driving methods.
7821 */
7822 deriveMethods: function deriveMethods(view, element, methodNames) {
7823 methodNames.forEach(function (methodName) {
7824 view[methodName] = function () {
7825 return element[methodName].apply(element, arguments);
7826 };
7827 });
7828
7829 return function () {
7830 methodNames.forEach(function (methodName) {
7831 view[methodName] = null;
7832 });
7833 view = element = null;
7834 };
7835 },
7836
7837 /**
7838 * @param {Class} klass
7839 * @param {Array} properties
7840 */
7841 derivePropertiesFromElement: function derivePropertiesFromElement(klass, properties) {
7842 properties.forEach(function (property) {
7843 Object.defineProperty(klass.prototype, property, {
7844 get: function get() {
7845 return this._element[0][property];
7846 },
7847 set: function set(value) {
7848 return this._element[0][property] = value; // eslint-disable-line no-return-assign
7849 }
7850 });
7851 });
7852 },
7853
7854 /**
7855 * @param {Object} view
7856 * @param {Element} element
7857 * @param {Array} eventNames
7858 * @param {Function} [map]
7859 * @return {Function} A function that clear all event listeners
7860 */
7861 deriveEvents: function deriveEvents(view, element, eventNames, map) {
7862 map = map || function (detail) {
7863 return detail;
7864 };
7865 eventNames = [].concat(eventNames);
7866 var listeners = [];
7867
7868 eventNames.forEach(function (eventName) {
7869 var listener = function listener(event) {
7870 view.emit(eventName, map(Object.create(event.detail)));
7871 };
7872 listeners.push(listener);
7873 element.addEventListener(eventName, listener, false);
7874 });
7875
7876 return function () {
7877 eventNames.forEach(function (eventName, index) {
7878 element.removeEventListener(eventName, listeners[index], false);
7879 });
7880 view = element = listeners = map = null;
7881 };
7882 },
7883
7884 /**
7885 * @return {Boolean}
7886 */
7887 isEnabledAutoStatusBarFill: function isEnabledAutoStatusBarFill() {
7888 return !!$onsGlobal._config.autoStatusBarFill;
7889 },
7890
7891 /**
7892 * @return {Boolean}
7893 */
7894 shouldFillStatusBar: $onsGlobal.shouldFillStatusBar,
7895
7896 /**
7897 * @param {Function} action
7898 */
7899 autoStatusBarFill: $onsGlobal.autoStatusBarFill,
7900
7901 /**
7902 * @param {Object} params
7903 * @param {Scope} [params.scope]
7904 * @param {jqLite} [params.element]
7905 * @param {Array} [params.elements]
7906 * @param {Attributes} [params.attrs]
7907 */
7908 clearComponent: function clearComponent(params) {
7909 if (params.scope) {
7910 ComponentCleaner.destroyScope(params.scope);
7911 }
7912
7913 if (params.attrs) {
7914 ComponentCleaner.destroyAttributes(params.attrs);
7915 }
7916
7917 if (params.element) {
7918 ComponentCleaner.destroyElement(params.element);
7919 }
7920
7921 if (params.elements) {
7922 params.elements.forEach(function (element) {
7923 ComponentCleaner.destroyElement(element);
7924 });
7925 }
7926 },
7927
7928 /**
7929 * @param {jqLite} element
7930 * @param {String} name
7931 */
7932 findElementeObject: function findElementeObject(element, name) {
7933 return element.inheritedData(name);
7934 },
7935
7936 /**
7937 * @param {String} page
7938 * @return {Promise}
7939 */
7940 getPageHTMLAsync: function getPageHTMLAsync(page) {
7941 var cache = $templateCache.get(page);
7942
7943 if (cache) {
7944 var deferred = $q.defer();
7945
7946 var html = typeof cache === 'string' ? cache : cache[1];
7947 deferred.resolve(this.normalizePageHTML(html));
7948
7949 return deferred.promise;
7950 } else {
7951 return $http({
7952 url: page,
7953 method: 'GET'
7954 }).then(function (response) {
7955 var html = response.data;
7956
7957 return this.normalizePageHTML(html);
7958 }.bind(this));
7959 }
7960 },
7961
7962 /**
7963 * @param {String} html
7964 * @return {String}
7965 */
7966 normalizePageHTML: function normalizePageHTML(html) {
7967 html = ('' + html).trim();
7968
7969 if (!html.match(/^<ons-page/)) {
7970 html = '<ons-page _muted>' + html + '</ons-page>';
7971 }
7972
7973 return html;
7974 },
7975
7976 /**
7977 * Create modifier templater function. The modifier templater generate css classes bound modifier name.
7978 *
7979 * @param {Object} attrs
7980 * @param {Array} [modifiers] an array of appendix modifier
7981 * @return {Function}
7982 */
7983 generateModifierTemplater: function generateModifierTemplater(attrs, modifiers) {
7984 var attrModifiers = attrs && typeof attrs.modifier === 'string' ? attrs.modifier.trim().split(/ +/) : [];
7985 modifiers = angular.isArray(modifiers) ? attrModifiers.concat(modifiers) : attrModifiers;
7986
7987 /**
7988 * @return {String} template eg. 'ons-button--*', 'ons-button--*__item'
7989 * @return {String}
7990 */
7991 return function (template) {
7992 return modifiers.map(function (modifier) {
7993 return template.replace('*', modifier);
7994 }).join(' ');
7995 };
7996 },
7997
7998 /**
7999 * Add modifier methods to view object for custom elements.
8000 *
8001 * @param {Object} view object
8002 * @param {jqLite} element
8003 */
8004 addModifierMethodsForCustomElements: function addModifierMethodsForCustomElements(view, element) {
8005 var methods = {
8006 hasModifier: function hasModifier(needle) {
8007 var tokens = ModifierUtil.split(element.attr('modifier'));
8008 needle = typeof needle === 'string' ? needle.trim() : '';
8009
8010 return ModifierUtil.split(needle).some(function (needle) {
8011 return tokens.indexOf(needle) != -1;
8012 });
8013 },
8014
8015 removeModifier: function removeModifier(needle) {
8016 needle = typeof needle === 'string' ? needle.trim() : '';
8017
8018 var modifier = ModifierUtil.split(element.attr('modifier')).filter(function (token) {
8019 return token !== needle;
8020 }).join(' ');
8021
8022 element.attr('modifier', modifier);
8023 },
8024
8025 addModifier: function addModifier(modifier) {
8026 element.attr('modifier', element.attr('modifier') + ' ' + modifier);
8027 },
8028
8029 setModifier: function setModifier(modifier) {
8030 element.attr('modifier', modifier);
8031 },
8032
8033 toggleModifier: function toggleModifier(modifier) {
8034 if (this.hasModifier(modifier)) {
8035 this.removeModifier(modifier);
8036 } else {
8037 this.addModifier(modifier);
8038 }
8039 }
8040 };
8041
8042 for (var method in methods) {
8043 if (methods.hasOwnProperty(method)) {
8044 view[method] = methods[method];
8045 }
8046 }
8047 },
8048
8049 /**
8050 * Add modifier methods to view object.
8051 *
8052 * @param {Object} view object
8053 * @param {String} template
8054 * @param {jqLite} element
8055 */
8056 addModifierMethods: function addModifierMethods(view, template, element) {
8057 var _tr = function _tr(modifier) {
8058 return template.replace('*', modifier);
8059 };
8060
8061 var fns = {
8062 hasModifier: function hasModifier(modifier) {
8063 return element.hasClass(_tr(modifier));
8064 },
8065
8066 removeModifier: function removeModifier(modifier) {
8067 element.removeClass(_tr(modifier));
8068 },
8069
8070 addModifier: function addModifier(modifier) {
8071 element.addClass(_tr(modifier));
8072 },
8073
8074 setModifier: function setModifier(modifier) {
8075 var classes = element.attr('class').split(/\s+/),
8076 patt = template.replace('*', '.');
8077
8078 for (var i = 0; i < classes.length; i++) {
8079 var cls = classes[i];
8080
8081 if (cls.match(patt)) {
8082 element.removeClass(cls);
8083 }
8084 }
8085
8086 element.addClass(_tr(modifier));
8087 },
8088
8089 toggleModifier: function toggleModifier(modifier) {
8090 var cls = _tr(modifier);
8091 if (element.hasClass(cls)) {
8092 element.removeClass(cls);
8093 } else {
8094 element.addClass(cls);
8095 }
8096 }
8097 };
8098
8099 var append = function append(oldFn, newFn) {
8100 if (typeof oldFn !== 'undefined') {
8101 return function () {
8102 return oldFn.apply(null, arguments) || newFn.apply(null, arguments);
8103 };
8104 } else {
8105 return newFn;
8106 }
8107 };
8108
8109 view.hasModifier = append(view.hasModifier, fns.hasModifier);
8110 view.removeModifier = append(view.removeModifier, fns.removeModifier);
8111 view.addModifier = append(view.addModifier, fns.addModifier);
8112 view.setModifier = append(view.setModifier, fns.setModifier);
8113 view.toggleModifier = append(view.toggleModifier, fns.toggleModifier);
8114 },
8115
8116 /**
8117 * Remove modifier methods.
8118 *
8119 * @param {Object} view object
8120 */
8121 removeModifierMethods: function removeModifierMethods(view) {
8122 view.hasModifier = view.removeModifier = view.addModifier = view.setModifier = view.toggleModifier = undefined;
8123 },
8124
8125 /**
8126 * Define a variable to JavaScript global scope and AngularJS scope as 'var' attribute name.
8127 *
8128 * @param {Object} attrs
8129 * @param object
8130 */
8131 declareVarAttribute: function declareVarAttribute(attrs, object) {
8132 if (typeof attrs.var === 'string') {
8133 var varName = attrs.var;
8134 this._defineVar(varName, object);
8135 }
8136 },
8137
8138 _registerEventHandler: function _registerEventHandler(component, eventName) {
8139 var capitalizedEventName = eventName.charAt(0).toUpperCase() + eventName.slice(1);
8140
8141 component.on(eventName, function (event) {
8142 $onsen.fireComponentEvent(component._element[0], eventName, event);
8143
8144 var handler = component._attrs['ons' + capitalizedEventName];
8145 if (handler) {
8146 component._scope.$eval(handler, { $event: event });
8147 component._scope.$evalAsync();
8148 }
8149 });
8150 },
8151
8152 /**
8153 * Register event handlers for attributes.
8154 *
8155 * @param {Object} component
8156 * @param {String} eventNames
8157 */
8158 registerEventHandlers: function registerEventHandlers(component, eventNames) {
8159 eventNames = eventNames.trim().split(/\s+/);
8160
8161 for (var i = 0, l = eventNames.length; i < l; i++) {
8162 var eventName = eventNames[i];
8163 this._registerEventHandler(component, eventName);
8164 }
8165 },
8166
8167 /**
8168 * @return {Boolean}
8169 */
8170 isAndroid: function isAndroid() {
8171 return !!window.navigator.userAgent.match(/android/i);
8172 },
8173
8174 /**
8175 * @return {Boolean}
8176 */
8177 isIOS: function isIOS() {
8178 return !!window.navigator.userAgent.match(/(ipad|iphone|ipod touch)/i);
8179 },
8180
8181 /**
8182 * @return {Boolean}
8183 */
8184 isWebView: function isWebView() {
8185 return window.ons.isWebView();
8186 },
8187
8188 /**
8189 * @return {Boolean}
8190 */
8191 isIOS7above: function () {
8192 var ua = window.navigator.userAgent;
8193 var match = ua.match(/(iPad|iPhone|iPod touch);.*CPU.*OS (\d+)_(\d+)/i);
8194
8195 var result = match ? parseFloat(match[2] + '.' + match[3]) >= 7 : false;
8196
8197 return function () {
8198 return result;
8199 };
8200 }(),
8201
8202 /**
8203 * Fire a named event for a component. The view object, if it exists, is attached to event.component.
8204 *
8205 * @param {HTMLElement} [dom]
8206 * @param {String} event name
8207 */
8208 fireComponentEvent: function fireComponentEvent(dom, eventName, data) {
8209 data = data || {};
8210
8211 var event = document.createEvent('HTMLEvents');
8212
8213 for (var key in data) {
8214 if (data.hasOwnProperty(key)) {
8215 event[key] = data[key];
8216 }
8217 }
8218
8219 event.component = dom ? angular.element(dom).data(dom.nodeName.toLowerCase()) || null : null;
8220 event.initEvent(dom.nodeName.toLowerCase() + ':' + eventName, true, true);
8221
8222 dom.dispatchEvent(event);
8223 },
8224
8225 /**
8226 * Define a variable to JavaScript global scope and AngularJS scope.
8227 *
8228 * Util.defineVar('foo', 'foo-value');
8229 * // => window.foo and $scope.foo is now 'foo-value'
8230 *
8231 * Util.defineVar('foo.bar', 'foo-bar-value');
8232 * // => window.foo.bar and $scope.foo.bar is now 'foo-bar-value'
8233 *
8234 * @param {String} name
8235 * @param object
8236 */
8237 _defineVar: function _defineVar(name, object) {
8238 var names = name.split(/\./);
8239
8240 function set(container, names, object) {
8241 var name;
8242 for (var i = 0; i < names.length - 1; i++) {
8243 name = names[i];
8244 if (container[name] === undefined || container[name] === null) {
8245 container[name] = {};
8246 }
8247 container = container[name];
8248 }
8249
8250 container[names[names.length - 1]] = object;
8251
8252 if (container[names[names.length - 1]] !== object) {
8253 throw new Error('Cannot set var="' + object._attrs.var + '" because it will overwrite a read-only variable.');
8254 }
8255 }
8256
8257 if (ons.componentBase) {
8258 set(ons.componentBase, names, object);
8259 }
8260
8261 // Attach to ancestor with ons-scope attribute.
8262 var element = object._element[0];
8263
8264 while (element.parentNode) {
8265 if (element.hasAttribute('ons-scope')) {
8266 set(angular.element(element).data('_scope'), names, object);
8267 element = null;
8268 return;
8269 }
8270
8271 element = element.parentNode;
8272 }
8273 element = null;
8274
8275 // If no ons-scope element was found, attach to $rootScope.
8276 set($rootScope, names, object);
8277 }
8278 };
8279 }
8280 }]);
8281})();
8282'use strict';
8283
8284/*
8285Copyright 2013-2015 ASIAL CORPORATION
8286
8287Licensed under the Apache License, Version 2.0 (the "License");
8288you may not use this file except in compliance with the License.
8289You may obtain a copy of the License at
8290
8291 http://www.apache.org/licenses/LICENSE-2.0
8292
8293Unless required by applicable law or agreed to in writing, software
8294distributed under the License is distributed on an "AS IS" BASIS,
8295WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8296See the License for the specific language governing permissions and
8297limitations under the License.
8298
8299*/
8300
8301['alert', 'confirm', 'prompt'].forEach(function (name) {
8302 var originalNotification = ons.notification[name];
8303
8304 ons.notification[name] = function (message) {
8305 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8306
8307 typeof message === 'string' ? options.message = message : options = message;
8308
8309 var compile = options.compile;
8310 var $element = void 0;
8311
8312 options.compile = function (element) {
8313 $element = angular.element(compile ? compile(element) : element);
8314 return ons.$compile($element)($element.injector().get('$rootScope'));
8315 };
8316
8317 options.destroy = function () {
8318 $element.data('_scope').$destroy();
8319 $element = null;
8320 };
8321
8322 return originalNotification(options);
8323 };
8324});
8325'use strict';
8326
8327// confirm to use jqLite
8328if (window.jQuery && angular.element === window.jQuery) {
8329 console.warn('Onsen UI require jqLite. Load jQuery after loading AngularJS to fix this error. jQuery may break Onsen UI behavior.'); // eslint-disable-line no-console
8330}
8331'use strict';
8332
8333/*
8334Copyright 2013-2015 ASIAL CORPORATION
8335
8336Licensed under the Apache License, Version 2.0 (the "License");
8337you may not use this file except in compliance with the License.
8338You may obtain a copy of the License at
8339
8340 http://www.apache.org/licenses/LICENSE-2.0
8341
8342Unless required by applicable law or agreed to in writing, software
8343distributed under the License is distributed on an "AS IS" BASIS,
8344WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8345See the License for the specific language governing permissions and
8346limitations under the License.
8347
8348*/
8349
8350(function () {
8351 'use strict';
8352
8353 angular.module('onsen').run(['$templateCache', function ($templateCache) {
8354 var templates = window.document.querySelectorAll('script[type="text/ons-template"]');
8355
8356 for (var i = 0; i < templates.length; i++) {
8357 var template = angular.element(templates[i]);
8358 var id = template.attr('id');
8359 if (typeof id === 'string') {
8360 $templateCache.put(id, template.text());
8361 }
8362 }
8363 }]);
8364})();
8365//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNsYXNzLmpzIiwidGVtcGxhdGVzLmpzIiwib25zZW4uanMiLCJhbGVydERpYWxvZy5qcyIsImFsZXJ0RGlhbG9nQW5pbWF0b3IuanMiLCJhbmltYXRpb25DaG9vc2VyLmpzIiwiY2Fyb3VzZWwuanMiLCJkaWFsb2cuanMiLCJkaWFsb2dBbmltYXRvci5qcyIsImZhYi5qcyIsImdlbmVyaWMuanMiLCJsYXp5UmVwZWF0LmpzIiwibGF6eVJlcGVhdERlbGVnYXRlLmpzIiwibW9kYWwuanMiLCJuYXZpZ2F0b3IuanMiLCJuYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IuanMiLCJvdmVybGF5U2xpZGluZ01lbnVBbmltYXRvci5qcyIsInBhZ2UuanMiLCJwb3BvdmVyLmpzIiwicG9wb3ZlckFuaW1hdG9yLmpzIiwicHVsbEhvb2suanMiLCJwdXNoU2xpZGluZ01lbnVBbmltYXRvci5qcyIsInJldmVhbFNsaWRpbmdNZW51QW5pbWF0b3IuanMiLCJzbGlkaW5nTWVudS5qcyIsInNsaWRpbmdNZW51QW5pbWF0b3IuanMiLCJzcGVlZERpYWwuanMiLCJzcGxpdFZpZXcuanMiLCJzcGxpdHRlci1jb250ZW50LmpzIiwic3BsaXR0ZXItc2lkZS5qcyIsInNwbGl0dGVyLmpzIiwic3dpdGNoLmpzIiwidGFiYmFyVmlldy5qcyIsImJhY2tCdXR0b24uanMiLCJib3R0b21Ub29sYmFyLmpzIiwiYnV0dG9uLmpzIiwiZHVtbXlGb3JJbml0LmpzIiwiZ2VzdHVyZURldGVjdG9yLmpzIiwiaWNvbi5qcyIsImlmT3JpZW50YXRpb24uanMiLCJpZlBsYXRmb3JtLmpzIiwiaW5wdXQuanMiLCJrZXlib2FyZC5qcyIsImxpc3QuanMiLCJsaXN0SGVhZGVyLmpzIiwibGlzdEl0ZW0uanMiLCJsb2FkaW5nUGxhY2Vob2xkZXIuanMiLCJwcm9ncmVzc0Jhci5qcyIsInJhbmdlLmpzIiwicmlwcGxlLmpzIiwic2NvcGUuanMiLCJzcGxpdHRlckNvbnRlbnQuanMiLCJzcGxpdHRlclNpZGUuanMiLCJ0YWIuanMiLCJ0YWJCYXIuanMiLCJ0ZW1wbGF0ZS5qcyIsInRvb2xiYXIuanMiLCJ0b29sYmFyQnV0dG9uLmpzIiwiY29tcG9uZW50Q2xlYW5lci5qcyIsIm5vdGlmaWNhdGlvbi5qcyIsInNldHVwLmpzIiwidGVtcGxhdGVMb2FkZXIuanMiXSwibmFtZXMiOlsiZm5UZXN0IiwidGVzdCIsInh5eiIsIkJhc2VDbGFzcyIsImV4dGVuZCIsInByb3BzIiwiX3N1cGVyIiwicHJvdG90eXBlIiwicHJvdG8iLCJPYmplY3QiLCJjcmVhdGUiLCJuYW1lIiwiZm4iLCJ0bXAiLCJyZXQiLCJhcHBseSIsImFyZ3VtZW50cyIsIm5ld0NsYXNzIiwiaW5pdCIsImhhc093blByb3BlcnR5IiwiU3ViQ2xhc3MiLCJFbXB0eUNsYXNzIiwiY29uc3RydWN0b3IiLCJ3aW5kb3ciLCJDbGFzcyIsImFwcCIsImFuZ3VsYXIiLCJtb2R1bGUiLCJlcnIiLCJydW4iLCIkdGVtcGxhdGVDYWNoZSIsInB1dCIsIm9ucyIsImluaXRPbnNlbkZhY2FkZSIsIndhaXRPbnNlblVJTG9hZCIsImluaXRBbmd1bGFyTW9kdWxlIiwiaW5pdFRlbXBsYXRlQ2FjaGUiLCJ1bmxvY2tPbnNlblVJIiwiX3JlYWR5TG9jayIsImxvY2siLCIkY29tcGlsZSIsIiRyb290U2NvcGUiLCJkb2N1bWVudCIsInJlYWR5U3RhdGUiLCJhZGRFdmVudExpc3RlbmVyIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY3JlYXRlRWxlbWVudCIsIkVycm9yIiwiJG9uIiwidmFsdWUiLCIkb25zZW4iLCIkcSIsIl9vbnNlblNlcnZpY2UiLCJfcVNlcnZpY2UiLCJjb25zb2xlIiwiYWxlcnQiLCJfaW50ZXJuYWwiLCJnZXRUZW1wbGF0ZUhUTUxBc3luYyIsInBhZ2UiLCJjYWNoZSIsImdldCIsIlByb21pc2UiLCJyZXNvbHZlIiwiY29tcG9uZW50QmFzZSIsImJvb3RzdHJhcCIsImRlcHMiLCJpc0FycmF5IiwidW5kZWZpbmVkIiwiY29uY2F0IiwiZG9jIiwiZG9jdW1lbnRFbGVtZW50IiwiZmluZFBhcmVudENvbXBvbmVudFVudGlsIiwiZG9tIiwiZWxlbWVudCIsIkhUTUxFbGVtZW50IiwidGFyZ2V0IiwiaW5oZXJpdGVkRGF0YSIsImZpbmRDb21wb25lbnQiLCJzZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3IiLCJkYXRhIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImNvbXBpbGUiLCJzY29wZSIsIl9nZXRPbnNlblNlcnZpY2UiLCJfd2FpdERpcmV0aXZlSW5pdCIsImVsZW1lbnROYW1lIiwibGFzdFJlYWR5IiwiY2FsbGJhY2siLCJsaXN0ZW4iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY3JlYXRlQWxlcnREaWFsb2ciLCJvcHRpb25zIiwibGluayIsInBhcmVudFNjb3BlIiwiJG5ldyIsIiRldmFsQXN5bmMiLCJfY3JlYXRlQWxlcnREaWFsb2dPcmlnaW5hbCIsInRoZW4iLCJhbGVydERpYWxvZyIsImNyZWF0ZURpYWxvZyIsIl9jcmVhdGVEaWFsb2dPcmlnaW5hbCIsImRpYWxvZyIsImNyZWF0ZVBvcG92ZXIiLCJfY3JlYXRlUG9wb3Zlck9yaWdpbmFsIiwicG9wb3ZlciIsInJlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIiLCJfcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlck9yaWdpbmFsIiwiZG9uZSIsInNldEltbWVkaWF0ZSIsIl9zZXR1cExvYWRpbmdQbGFjZUhvbGRlcnMiLCJmYWN0b3J5IiwiQWxlcnREaWFsb2dWaWV3IiwiYXR0cnMiLCJfc2NvcGUiLCJfZWxlbWVudCIsIl9hdHRycyIsIl9jbGVhckRlcml2aW5nTWV0aG9kcyIsImRlcml2ZU1ldGhvZHMiLCJfY2xlYXJEZXJpdmluZ0V2ZW50cyIsImRlcml2ZUV2ZW50cyIsImRldGFpbCIsImJpbmQiLCJfZGVzdHJveSIsImVtaXQiLCJyZW1vdmUiLCJNaWNyb0V2ZW50IiwibWl4aW4iLCJkZXJpdmVQcm9wZXJ0aWVzRnJvbUVsZW1lbnQiLCJBbGVydERpYWxvZ0FuaW1hdG9yIiwiQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3IiLCJJT1NBbGVydERpYWxvZ0FuaW1hdG9yIiwiQW5pbWF0b3JGYWN0b3J5IiwiQ2Fyb3VzZWxWaWV3IiwiY2Fyb3VzZWwiLCJEaWFsb2dWaWV3IiwicmVnaXN0ZXJBbmltYXRvciIsIkFuaW1hdG9yIiwiRGlhbG9nRWxlbWVudCIsIkRpYWxvZ0FuaW1hdG9yIiwiSU9TRGlhbG9nQW5pbWF0b3IiLCJBbmRyb2lkRGlhbG9nQW5pbWF0b3IiLCJTbGlkZURpYWxvZ0FuaW1hdG9yIiwiRmFiVmlldyIsIkdlbmVyaWNWaWV3Iiwic2VsZiIsImRpcmVjdGl2ZU9ubHkiLCJtb2RpZmllclRlbXBsYXRlIiwiYWRkTW9kaWZpZXJNZXRob2RzIiwiYWRkTW9kaWZpZXJNZXRob2RzRm9yQ3VzdG9tRWxlbWVudHMiLCJjbGVhbmVyIiwib25EZXN0cm95IiwiX2V2ZW50cyIsInJlbW92ZU1vZGlmaWVyTWV0aG9kcyIsImNsZWFyQ29tcG9uZW50IiwicmVnaXN0ZXIiLCJ2aWV3Iiwidmlld0tleSIsImRlY2xhcmVWYXJBdHRyaWJ1dGUiLCJkZXN0cm95Iiwibm9vcCIsIkFuZ3VsYXJMYXp5UmVwZWF0RGVsZWdhdGUiLCJMYXp5UmVwZWF0VmlldyIsImxpbmtlciIsIl9saW5rZXIiLCJfdXRpbCIsInVwZGF0ZVBhcmVudFBvc2l0aW9uIiwidXNlckRlbGVnYXRlIiwiJGV2YWwiLCJvbnNMYXp5UmVwZWF0IiwiaW50ZXJuYWxEZWxlZ2F0ZSIsIl9wcm92aWRlciIsIkxhenlSZXBlYXRQcm92aWRlciIsInBhcmVudE5vZGUiLCJyZWZyZXNoIiwiJHdhdGNoIiwiY291bnRJdGVtcyIsIl9vbkNoYW5nZSIsImRpcmVjdGl2ZUF0dHJpYnV0ZXMiLCJ0ZW1wbGF0ZUVsZW1lbnQiLCJfcGFyZW50U2NvcGUiLCJmb3JFYWNoIiwicmVtb3ZlQXR0cmlidXRlIiwiYXR0ciIsImNsb25lTm9kZSIsIml0ZW0iLCJfdXNlckRlbGVnYXRlIiwiY29uZmlndXJlSXRlbVNjb3BlIiwiRnVuY3Rpb24iLCJkZXN0cm95SXRlbVNjb3BlIiwiY3JlYXRlSXRlbUNvbnRlbnQiLCJpbmRleCIsInBhcmVudCIsIl9wcmVwYXJlSXRlbUVsZW1lbnQiLCJfYWRkU3BlY2lhbFByb3BlcnRpZXMiLCJfdXNpbmdCaW5kaW5nIiwiY2xvbmVkIiwiaSIsImxhc3QiLCIkaW5kZXgiLCIkZmlyc3QiLCIkbGFzdCIsIiRtaWRkbGUiLCIkZXZlbiIsIiRvZGQiLCIkZGVzdHJveSIsIkxhenlSZXBlYXREZWxlZ2F0ZSIsIk1vZGFsQW5pbWF0b3IiLCJGYWRlTW9kYWxBbmltYXRvciIsIiRwYXJzZSIsIk1vZGFsVmlldyIsIl9hbmltYXRvckZhY3RvcnkiLCJzZXRBbmltYXRpb25PcHRpb25zIiwiYW5pbWF0aW9uT3B0aW9ucyIsInNob3ciLCJoaWRlIiwidG9nZ2xlIiwiTW9kYWxFbGVtZW50IiwiTmF2aWdhdG9yVmlldyIsIl9wcmV2aW91c1BhZ2VTY29wZSIsIl9ib3VuZE9uUHJlcG9wIiwiX29uUHJlcG9wIiwiX2JvdW5kT25QYWdlRGVzdHJveSIsIl9vblBhZ2VEZXN0cm95Iiwib24iLCJuYXZpZ2F0b3IiLCJldmVudCIsInBhZ2VzIiwibGVuZ3RoIiwiX2NvbXBpbGVBbmRMaW5rIiwicGFnZUVsZW1lbnQiLCJwYWdlU2NvcGUiLCJfY3JlYXRlUGFnZVNjb3BlIiwib2ZmIiwiTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIiwiRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciIsIklPU1NsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIiwiTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciIsIlNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIiwiU2xpZGluZ01lbnVBbmltYXRvciIsIk92ZXJsYXlTbGlkaW5nTWVudUFuaW1hdG9yIiwiX2JsYWNrTWFzayIsIl9pc1JpZ2h0IiwiX21lbnVQYWdlIiwiX21haW5QYWdlIiwiX3dpZHRoIiwic2V0dXAiLCJtYWluUGFnZSIsIm1lbnVQYWdlIiwid2lkdGgiLCJpc1JpZ2h0IiwiY3NzIiwiZGlzcGxheSIsInpJbmRleCIsInJpZ2h0IiwibGVmdCIsImJhY2tncm91bmRDb2xvciIsInRvcCIsImJvdHRvbSIsInBvc2l0aW9uIiwicHJlcGVuZCIsIm9uUmVzaXplZCIsImlzT3BlbmVkIiwibWF4IiwiY2xpZW50V2lkdGgiLCJtZW51U3R5bGUiLCJfZ2VuZXJhdGVNZW51UGFnZVN0eWxlIiwiYW5pbWl0IiwicXVldWUiLCJwbGF5IiwicmVtb3ZlQXR0ciIsIm9wZW5NZW51IiwiaW5zdGFudCIsImR1cmF0aW9uIiwiZGVsYXkiLCJtYWluUGFnZVN0eWxlIiwiX2dlbmVyYXRlTWFpblBhZ2VTdHlsZSIsInNldFRpbWVvdXQiLCJ3YWl0IiwidGltaW5nIiwiY2xvc2VNZW51IiwibWVudVBhZ2VTdHlsZSIsInRyYW5zbGF0ZU1lbnUiLCJNYXRoIiwibWluIiwibWF4RGlzdGFuY2UiLCJkaXN0YW5jZSIsIm9wYWNpdHkiLCJrZXlzIiwieCIsInRyYW5zZm9ybSIsImNvcHkiLCJQYWdlVmlldyIsIl9jbGVhckxpc3RlbmVyIiwiZGVmaW5lUHJvcGVydHkiLCJvbkRldmljZUJhY2tCdXR0b24iLCJzZXQiLCJfdXNlckJhY2tCdXR0b25IYW5kbGVyIiwiX2VuYWJsZUJhY2tCdXR0b25IYW5kbGVyIiwibmdEZXZpY2VCYWNrQnV0dG9uIiwibmdJbmZpbml0ZVNjcm9sbCIsIm9uSW5maW5pdGVTY3JvbGwiLCJfb25EZXZpY2VCYWNrQnV0dG9uIiwiJGV2ZW50IiwibGFzdEV2ZW50IiwiUG9wb3ZlclZpZXciLCJQb3BvdmVyQW5pbWF0b3IiLCJGYWRlUG9wb3ZlckFuaW1hdG9yIiwiUHVsbEhvb2tWaWV3IiwicHVsbEhvb2siLCJvbkFjdGlvbiIsIm5nQWN0aW9uIiwiJGRvbmUiLCJQdXNoU2xpZGluZ01lbnVBbmltYXRvciIsIm1haW5QYWdlVHJhbnNmb3JtIiwiX2dlbmVyYXRlQWJvdmVQYWdlVHJhbnNmb3JtIiwiX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlIiwiYWJvdmVUcmFuc2Zvcm0iLCJiZWhpbmRTdHlsZSIsImJlaGluZFgiLCJiZWhpbmRUcmFuc2Zvcm0iLCJSZXZlYWxTbGlkaW5nTWVudUFuaW1hdG9yIiwiYm94U2hhZG93IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiYmVoaW5kRGlzdGFuY2UiLCJpc05hTiIsIlNsaWRpbmdNZW51Vmlld01vZGVsIiwiX2Rpc3RhbmNlIiwiX21heERpc3RhbmNlIiwiaXNOdW1iZXIiLCJzZXRNYXhEaXN0YW5jZSIsInNob3VsZE9wZW4iLCJzaG91bGRDbG9zZSIsImlzQ2xvc2VkIiwib3Blbk9yQ2xvc2UiLCJvcGVuIiwiY2xvc2UiLCJnZXRYIiwiZ2V0TWF4RGlzdGFuY2UiLCJ0cmFuc2xhdGUiLCJBbmltYXRpb25DaG9vc2VyIiwiU2xpZGluZ01lbnVWaWV3IiwiX2Rvb3JMb2NrIiwiX2lzUmlnaHRNZW51IiwiX0Rvb3JMb2NrIiwic2lkZSIsIl9tYWluUGFnZUdlc3R1cmVEZXRlY3RvciIsIkdlc3R1cmVEZXRlY3RvciIsIl9ib3VuZE9uVGFwIiwiX29uVGFwIiwiX25vcm1hbGl6ZU1heFNsaWRlRGlzdGFuY2VBdHRyIiwiX2xvZ2ljIiwiX3RyYW5zbGF0ZSIsIl9vcGVuIiwiX2Nsb3NlIiwiJG9ic2VydmUiLCJfb25NYXhTbGlkZURpc3RhbmNlQ2hhbmdlZCIsIl9vblN3aXBlYWJsZUNoYW5nZWQiLCJfYm91bmRPbldpbmRvd1Jlc2l6ZSIsIl9vbldpbmRvd1Jlc2l6ZSIsIl9ib3VuZEhhbmRsZUV2ZW50IiwiX2hhbmRsZUV2ZW50IiwiX2JpbmRFdmVudHMiLCJzZXRNYWluUGFnZSIsInNldE1lbnVQYWdlIiwiX2RldmljZUJhY2tCdXR0b25IYW5kbGVyIiwiX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIiwiY3JlYXRlSGFuZGxlciIsInVubG9jayIsImFuaW1hdGlvbkNob29zZXIiLCJhbmltYXRvcnMiLCJfYW5pbWF0b3JEaWN0IiwiYmFzZUNsYXNzIiwiYmFzZUNsYXNzTmFtZSIsImRlZmF1bHRBbmltYXRpb24iLCJ0eXBlIiwiZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnMiLCJfYW5pbWF0b3IiLCJuZXdBbmltYXRvciIsIm1heFNsaWRlRGlzdGFuY2UiLCJzd2lwZWFibGUiLCJzZXRTd2lwZWFibGUiLCJnZXREZXZpY2VCYWNrQnV0dG9uSGFuZGxlciIsImlzTWVudU9wZW5lZCIsImNhbGxQYXJlbnRIYW5kbGVyIiwiX3JlZnJlc2hNZW51UGFnZVdpZHRoIiwiZW5hYmxlZCIsIl9hY3RpdmF0ZUdlc3R1cmVEZXRlY3RvciIsIl9kZWFjdGl2YXRlR2VzdHVyZURldGVjdG9yIiwiX3JlY2FsY3VsYXRlTUFYIiwiaW5kZXhPZiIsInBhcnNlSW50IiwicmVwbGFjZSIsInBhcnNlRmxvYXQiLCJfZ2VzdHVyZURldGVjdG9yIiwiZHJhZ01pbkRpc3RhbmNlIiwiX2FwcGVuZE1haW5QYWdlIiwicGFnZVVybCIsInRlbXBsYXRlSFRNTCIsInBhZ2VDb250ZW50IiwiYXBwZW5kIiwiX2N1cnJlbnRQYWdlRWxlbWVudCIsIl9jdXJyZW50UGFnZVNjb3BlIiwiX2N1cnJlbnRQYWdlVXJsIiwiX3Nob3ciLCJfYXBwZW5kTWVudVBhZ2UiLCJfY3VycmVudE1lbnVQYWdlU2NvcGUiLCJfY3VycmVudE1lbnVQYWdlRWxlbWVudCIsImdldFBhZ2VIVE1MQXN5bmMiLCJodG1sIiwiaXNMb2NrZWQiLCJfaXNJbnNpZGVJZ25vcmVkRWxlbWVudCIsIl9pc0luc2lkZVN3aXBlVGFyZ2V0QXJlYSIsImdlc3R1cmUiLCJwcmV2ZW50RGVmYXVsdCIsImRlbHRhWCIsImRlbHRhRGlzdGFuY2UiLCJzdGFydEV2ZW50Iiwic3RvcERldGVjdCIsIl9sYXN0RGlzdGFuY2UiLCJnZXRBdHRyaWJ1dGUiLCJjZW50ZXIiLCJwYWdlWCIsIl9zd2lwZVRhcmdldFdpZHRoIiwiX2dldFN3aXBlVGFyZ2V0V2lkdGgiLCJ0YXJnZXRXaWR0aCIsInN3aXBlVGFyZ2V0V2lkdGgiLCJzbGlkaW5nTWVudSIsIndhaXRVbmxvY2siLCJhbmltYXRpb24iLCJjaGlsZHJlbiIsInRvZ2dsZU1lbnUiLCJjbG9zZUNsb3NlIiwiU3BlZWREaWFsVmlldyIsIiRvbnNHbG9iYWwiLCJTUExJVF9NT0RFIiwiQ09MTEFQU0VfTU9ERSIsIk1BSU5fUEFHRV9SQVRJTyIsIlNwbGl0VmlldyIsImFkZENsYXNzIiwiX3NlY29uZGFyeVBhZ2UiLCJfbWF4IiwiX21vZGUiLCJfZG9TcGxpdCIsIl9kb0NvbGxhcHNlIiwib3JpZW50YXRpb24iLCJfb25SZXNpemUiLCJzZWNvbmRhcnlQYWdlIiwic2V0U2Vjb25kYXJ5UGFnZSIsIl9jb25zaWRlckNoYW5naW5nQ29sbGFwc2UiLCJfc2V0U2l6ZSIsIl9hcHBlbmRTZWNvbmRQYWdlIiwiX2N1cnJlbnRTZWNvbmRhcnlQYWdlRWxlbWVudCIsIl9jdXJyZW50U2Vjb25kYXJ5UGFnZVNjb3BlIiwiX2N1cnJlbnRQYWdlIiwidHJpbSIsImxhc3RNb2RlIiwic2hvdWxkIiwiX3Nob3VsZENvbGxhcHNlIiwiX2ZpcmVVcGRhdGVFdmVudCIsIl9hY3RpdmF0ZVNwbGl0TW9kZSIsIl9hY3RpdmF0ZUNvbGxhcHNlTW9kZSIsInVwZGF0ZSIsIl9nZXRPcmllbnRhdGlvbiIsImlzUG9ydHJhaXQiLCJnZXRDdXJyZW50TW9kZSIsImMiLCJjb2xsYXBzZSIsImlzTGFuZHNjYXBlIiwic3Vic3RyIiwibnVtIiwic3BsaXQiLCJpbm5lcldpZHRoIiwibXEiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsIm1haW5QYWdlV2lkdGgiLCJzZWNvbmRhcnlTaXplIiwiX2ZpcmVFdmVudCIsInNwbGl0VmlldyIsInRoYXQiLCJzaG91bGRDb2xsYXBzZSIsImN1cnJlbnRNb2RlIiwibiIsImlzRmluaXRlIiwiU3BsaXR0ZXJDb250ZW50IiwibG9hZCIsIl9wYWdlU2NvcGUiLCJfbGluayIsImZyYWdtZW50IiwiU3BsaXR0ZXJTaWRlIiwiU3BsaXR0ZXIiLCJwcm9wIiwidGFnTmFtZSIsIlN3aXRjaFZpZXciLCJfY2hlY2tib3giLCJfcHJlcGFyZU5nTW9kZWwiLCJuZ01vZGVsIiwiYXNzaWduIiwiJHBhcmVudCIsImNoZWNrZWQiLCJuZ0NoYW5nZSIsIlRhYmJhck5vbmVBbmltYXRvciIsIlRhYmJhckZhZGVBbmltYXRvciIsIlRhYmJhclNsaWRlQW5pbWF0b3IiLCJUYWJiYXJWaWV3IiwiX2xhc3RQYWdlRWxlbWVudCIsIl9sYXN0UGFnZVNjb3BlIiwiVGFiYmFyRWxlbWVudCIsImRpcmVjdGl2ZSIsInJlc3RyaWN0IiwidHJhbnNjbHVkZSIsInByZSIsInJlZ2lzdGVyRXZlbnRIYW5kbGVycyIsInBvc3QiLCJmaXJlQ29tcG9uZW50RXZlbnQiLCJDb21wb25lbnRDbGVhbmVyIiwiY29udHJvbGxlciIsImJhY2tCdXR0b24iLCJkZXN0cm95U2NvcGUiLCJkZXN0cm95QXR0cmlidXRlcyIsImJ1dHRvbiIsImRpc2FibGVkIiwicGFyZW50RWxlbWVudCIsIl9zZXR1cCIsIl9zZXR1cEluaXRpYWxJbmRleCIsIl9zYXZlTGFzdFN0YXRlIiwiaXNSZWFkeSIsIiRicm9hZGNhc3QiLCJmYWIiLCJFVkVOVFMiLCJzY29wZURlZiIsInJlZHVjZSIsImRpY3QiLCJ0aXRsaXplIiwic3RyIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsIl8iLCJoYW5kbGVyIiwiZ2VzdHVyZURldGVjdG9yIiwiam9pbiIsImljb24iLCJfdXBkYXRlIiwidXNlck9yaWVudGF0aW9uIiwib25zSWZPcmllbnRhdGlvbiIsImdldExhbmRzY2FwZU9yUG9ydHJhaXQiLCJwbGF0Zm9ybSIsImdldFBsYXRmb3JtU3RyaW5nIiwidXNlclBsYXRmb3JtIiwidXNlclBsYXRmb3JtcyIsIm9uc0lmUGxhdGZvcm0iLCJ1c2VyQWdlbnQiLCJtYXRjaCIsImlzT3BlcmEiLCJvcGVyYSIsImlzRmlyZWZveCIsIkluc3RhbGxUcmlnZ2VyIiwiaXNTYWZhcmkiLCJ0b1N0cmluZyIsImNhbGwiLCJpc0VkZ2UiLCJpc0Nocm9tZSIsImNocm9tZSIsImlzSUUiLCJkb2N1bWVudE1vZGUiLCJlbCIsIm9uSW5wdXQiLCJfaXNUZXh0SW5wdXQiLCJjb21waWxlRnVuY3Rpb24iLCJkaXNwU2hvdyIsImRpc3BIaWRlIiwib25TaG93Iiwib25IaWRlIiwib25Jbml0IiwiZSIsInZpc2libGUiLCJzb2Z0d2FyZUtleWJvYXJkIiwiX3Zpc2libGUiLCJwcmlvcml0eSIsInRlcm1pbmFsIiwibGF6eVJlcGVhdCIsIm9uc0xvYWRpbmdQbGFjZWhvbGRlciIsIl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyIiwiY29udGVudEVsZW1lbnQiLCJtb2RhbCIsIk5hdmlnYXRvckVsZW1lbnQiLCJyZXdyaXRhYmxlcyIsInJlYWR5IiwibGFzdExpbmsiLCJuYXZpZ2F0b3JFbGVtZW50IiwiZmlyZVBhZ2VJbml0RXZlbnQiLCJmIiwiaXNBdHRhY2hlZCIsImZpcmVBY3R1YWxQYWdlSW5pdEV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwicG9zdExpbmsiLCJtYWluIiwibWVudSIsIm1haW5IdG1sIiwibWVudUh0bWwiLCJzcGVlZERpYWwiLCJzZWNvbmRhcnlIdG1sIiwic3BsaXR0ZXIiLCJTcGxpdHRlckNvbnRlbnRFbGVtZW50IiwiU3BsaXR0ZXJTaWRlRWxlbWVudCIsIm5nQ29udHJvbGxlciIsInN3aXRjaFZpZXciLCJ0YWIiLCIkaW5qZWN0IiwidGFiYmFyRWxlbWVudCIsImxhc3RVbmxpbmsiLCJ1bmxpbmsiLCJoaWRlVGFicyIsInNldFRhYmJhclZpc2liaWxpdHkiLCJ0YWJiYXJWaWV3IiwiY29udGVudCIsInRlbXBsYXRlIiwidG9vbGJhckJ1dHRvbiIsImRlY29tcG9zZU5vZGUiLCIkJGVsZW1lbnQiLCIkJG9ic2VydmVycyIsImRlc3Ryb3lFbGVtZW50IiwiJCRsaXN0ZW5lcnMiLCIkJHdhdGNoZXJzIiwiY2xlYXIiLCJuZ0V2ZW50RGlyZWN0aXZlcyIsImRpcmVjdGl2ZU5hbWUiLCJkaXJlY3RpdmVOb3JtYWxpemUiLCIkZWxlbWVudCIsImxpc3RlbmVyIiwiJGFwcGx5IiwiY29uZmlnIiwiJHByb3ZpZGUiLCJzaGlmdCIsIiRkZWxlZ2F0ZSIsImRlY29yYXRvciIsIiR3aW5kb3ciLCIkY2FjaGVGYWN0b3J5IiwiJGRvY3VtZW50IiwiJGh0dHAiLCJjcmVhdGVPbnNlblNlcnZpY2UiLCJNb2RpZmllclV0aWwiLCJESVJFQ1RJVkVfVEVNUExBVEVfVVJMIiwiRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIiLCJfZGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyIiwiZ2V0RGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyIiwibWV0aG9kTmFtZXMiLCJtZXRob2ROYW1lIiwia2xhc3MiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJldmVudE5hbWVzIiwibWFwIiwibGlzdGVuZXJzIiwiZXZlbnROYW1lIiwicHVzaCIsImlzRW5hYmxlZEF1dG9TdGF0dXNCYXJGaWxsIiwiX2NvbmZpZyIsImF1dG9TdGF0dXNCYXJGaWxsIiwic2hvdWxkRmlsbFN0YXR1c0JhciIsInBhcmFtcyIsImVsZW1lbnRzIiwiZmluZEVsZW1lbnRlT2JqZWN0IiwiZGVmZXJyZWQiLCJkZWZlciIsIm5vcm1hbGl6ZVBhZ2VIVE1MIiwicHJvbWlzZSIsInVybCIsIm1ldGhvZCIsInJlc3BvbnNlIiwiZ2VuZXJhdGVNb2RpZmllclRlbXBsYXRlciIsIm1vZGlmaWVycyIsImF0dHJNb2RpZmllcnMiLCJtb2RpZmllciIsIm1ldGhvZHMiLCJoYXNNb2RpZmllciIsIm5lZWRsZSIsInRva2VucyIsInNvbWUiLCJyZW1vdmVNb2RpZmllciIsImZpbHRlciIsInRva2VuIiwiYWRkTW9kaWZpZXIiLCJzZXRNb2RpZmllciIsInRvZ2dsZU1vZGlmaWVyIiwiX3RyIiwiZm5zIiwiaGFzQ2xhc3MiLCJyZW1vdmVDbGFzcyIsImNsYXNzZXMiLCJwYXR0IiwiY2xzIiwib2xkRm4iLCJuZXdGbiIsIm9iamVjdCIsInZhciIsInZhck5hbWUiLCJfZGVmaW5lVmFyIiwiX3JlZ2lzdGVyRXZlbnRIYW5kbGVyIiwiY29tcG9uZW50IiwiY2FwaXRhbGl6ZWRFdmVudE5hbWUiLCJsIiwiaXNBbmRyb2lkIiwiaXNJT1MiLCJpc1dlYlZpZXciLCJpc0lPUzdhYm92ZSIsInVhIiwicmVzdWx0Iiwia2V5IiwibmFtZXMiLCJjb250YWluZXIiLCJoYXNBdHRyaWJ1dGUiLCJvcmlnaW5hbE5vdGlmaWNhdGlvbiIsIm5vdGlmaWNhdGlvbiIsIm1lc3NhZ2UiLCJpbmplY3RvciIsImpRdWVyeSIsIndhcm4iLCJ0ZW1wbGF0ZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaWQiLCJ0ZXh0Il0sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7QUFLQSxDQUFDLFlBQVc7QUFDVjs7QUFDQSxNQUFJQSxTQUFTLE1BQU1DLElBQU4sQ0FBVyxZQUFVO0FBQUNDO0FBQUssR0FBM0IsSUFBK0IsWUFBL0IsR0FBOEMsSUFBM0Q7O0FBRUE7QUFDQSxXQUFTQyxTQUFULEdBQW9CLENBQUU7O0FBRXRCO0FBQ0FBLFlBQVVDLE1BQVYsR0FBbUIsVUFBU0MsS0FBVCxFQUFnQjtBQUNqQyxRQUFJQyxTQUFTLEtBQUtDLFNBQWxCOztBQUVBO0FBQ0E7QUFDQSxRQUFJQyxRQUFRQyxPQUFPQyxNQUFQLENBQWNKLE1BQWQsQ0FBWjs7QUFFQTtBQUNBLFNBQUssSUFBSUssSUFBVCxJQUFpQk4sS0FBakIsRUFBd0I7QUFDdEI7QUFDQUcsWUFBTUcsSUFBTixJQUFjLE9BQU9OLE1BQU1NLElBQU4sQ0FBUCxLQUF1QixVQUF2QixJQUNaLE9BQU9MLE9BQU9LLElBQVAsQ0FBUCxJQUF1QixVQURYLElBQ3lCWCxPQUFPQyxJQUFQLENBQVlJLE1BQU1NLElBQU4sQ0FBWixDQUR6QixHQUVULFVBQVNBLElBQVQsRUFBZUMsRUFBZixFQUFrQjtBQUNqQixlQUFPLFlBQVc7QUFDaEIsY0FBSUMsTUFBTSxLQUFLUCxNQUFmOztBQUVBO0FBQ0E7QUFDQSxlQUFLQSxNQUFMLEdBQWNBLE9BQU9LLElBQVAsQ0FBZDs7QUFFQTtBQUNBO0FBQ0EsY0FBSUcsTUFBTUYsR0FBR0csS0FB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N3JCLE9BQU9tQixRQUFQLENBQWdCMnFCLGdCQUFoQixDQUFpQyxrQ0FBakMsQ0FBaEI7O0FBRUEsU0FBSyxJQUFJOWdCLElBQUksQ0FBYixFQUFnQkEsSUFBSTZnQixVQUFVOWUsTUFBOUIsRUFBc0MvQixHQUF0QyxFQUEyQztBQUN6QyxVQUFJdWEsV0FBV3BsQixRQUFRZ0QsT0FBUixDQUFnQjBvQixVQUFVN2dCLENBQVYsQ0FBaEIsQ0FBZjtBQUNBLFVBQUkrZ0IsS0FBS3hHLFNBQVNyYixJQUFULENBQWMsSUFBZCxDQUFUO0FBQ0EsVUFBSSxPQUFPNmhCLEVBQVAsS0FBYyxRQUFsQixFQUE0QjtBQUMxQnhyQix1QkFBZUMsR0FBZixDQUFtQnVyQixFQUFuQixFQUF1QnhHLFNBQVN5RyxJQUFULEVBQXZCO0FBQ0Q7QUFDRjtBQUNGLEdBVjJCLENBQTVCO0FBWUQsQ0FmRCIsImZpbGUiOiJhbmd1bGFyLW9uc2VudWkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBTaW1wbGUgSmF2YVNjcmlwdCBJbmhlcml0YW5jZSBmb3IgRVMgNS4xXG4gKiBiYXNlZCBvbiBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvc2ltcGxlLWphdmFzY3JpcHQtaW5oZXJpdGFuY2UvXG4gKiAgKGluc3BpcmVkIGJ5IGJhc2UyIGFuZCBQcm90b3R5cGUpXG4gKiBNSVQgTGljZW5zZWQuXG4gKi9cbihmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIHZhciBmblRlc3QgPSAveHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6O30pID8gL1xcYl9zdXBlclxcYi8gOiAvLiovO1xuXG4gIC8vIFRoZSBiYXNlIENsYXNzIGltcGxlbWVudGF0aW9uIChkb2VzIG5vdGhpbmcpXG4gIGZ1bmN0aW9uIEJhc2VDbGFzcygpe31cblxuICAvLyBDcmVhdGUgYSBuZXcgQ2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIHRoaXMgY2xhc3NcbiAgQmFzZUNsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgdmFyIF9zdXBlciA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgLy8gU2V0IHVwIHRoZSBwcm90b3R5cGUgdG8gaW5oZXJpdCBmcm9tIHRoZSBiYXNlIGNsYXNzXG4gICAgLy8gKGJ1dCB3aXRob3V0IHJ1bm5pbmcgdGhlIGluaXQgY29uc3RydWN0b3IpXG4gICAgdmFyIHByb3RvID0gT2JqZWN0LmNyZWF0ZShfc3VwZXIpO1xuXG4gICAgLy8gQ29weSB0aGUgcHJvcGVydGllcyBvdmVyIG9udG8gdGhlIG5ldyBwcm90b3R5cGVcbiAgICBmb3IgKHZhciBuYW1lIGluIHByb3BzKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmdW5jdGlvblxuICAgICAgcHJvdG9bbmFtZV0gPSB0eXBlb2YgcHJvcHNbbmFtZV0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICB0eXBlb2YgX3N1cGVyW25hbWVdID09IFwiZnVuY3Rpb25cIiAmJiBmblRlc3QudGVzdChwcm9wc1tuYW1lXSlcbiAgICAgICAgPyAoZnVuY3Rpb24obmFtZSwgZm4pe1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgdG1wID0gdGhpcy5fc3VwZXI7XG5cbiAgICAgICAgICAgICAgLy8gQWRkIGEgbmV3IC5fc3VwZXIoKSBtZXRob2QgdGhhdCBpcyB0aGUgc2FtZSBtZXRob2RcbiAgICAgICAgICAgICAgLy8gYnV0IG9uIHRoZSBzdXBlci1jbGFzc1xuICAgICAgICAgICAgICB0aGlzLl9zdXBlciA9IF9zdXBlcltuYW1lXTtcblxuICAgICAgICAgICAgICAvLyBUaGUgbWV0aG9kIG9ubHkgbmVlZCB0byBiZSBib3VuZCB0ZW1wb3JhcmlseSwgc28gd2VcbiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0IHdoZW4gd2UncmUgZG9uZSBleGVjdXRpbmdcbiAgICAgICAgICAgICAgdmFyIHJldCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIHRoaXMuX3N1cGVyID0gdG1wO1xuXG4gICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKG5hbWUsIHByb3BzW25hbWVdKVxuICAgICAgICA6IHByb3BzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoZSBuZXcgY29uc3RydWN0b3JcbiAgICB2YXIgbmV3Q2xhc3MgPSB0eXBlb2YgcHJvdG8uaW5pdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHByb3RvLmhhc093blByb3BlcnR5KFwiaW5pdFwiKVxuICAgICAgICA/IHByb3RvLmluaXQgLy8gQWxsIGNvbnN0cnVjdGlvbiBpcyBhY3R1YWxseSBkb25lIGluIHRoZSBpbml0IG1ldGhvZFxuICAgICAgICA6IGZ1bmN0aW9uIFN1YkNsYXNzKCl7IF9zdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbiAgICAgIDogZnVuY3Rpb24gRW1wdHlDbGFzcygpe307XG5cbiAgICAvLyBQb3B1bGF0ZSBvdXIgY29uc3RydWN0ZWQgcHJvdG90eXBlIG9iamVjdFxuICAgIG5ld0NsYXNzLnByb3RvdHlwZSA9IHByb3RvO1xuXG4gICAgLy8gRW5mb3JjZSB0aGUgY29uc3RydWN0b3IgdG8gYmUgd2hhdCB3ZSBleHBlY3RcbiAgICBwcm90by5jb25zdHJ1Y3RvciA9IG5ld0NsYXNzO1xuXG4gICAgLy8gQW5kIG1ha2UgdGhpcyBjbGFzcyBleHRlbmRhYmxlXG4gICAgbmV3Q2xhc3MuZXh0ZW5kID0gQmFzZUNsYXNzLmV4dGVuZDtcblxuICAgIHJldHVybiBuZXdDbGFzcztcbiAgfTtcblxuICAvLyBleHBvcnRcbiAgd2luZG93LkNsYXNzID0gQmFzZUNsYXNzO1xufSkoKTtcbiIsIi8vSEVBRCBcbihmdW5jdGlvbihhcHApIHtcbnRyeSB7IGFwcCA9IGFuZ3VsYXIubW9kdWxlKFwidGVtcGxhdGVzLW1haW5cIik7IH1cbmNhdGNoKGVycikgeyBhcHAgPSBhbmd1bGFyLm1vZHVsZShcInRlbXBsYXRlcy1tYWluXCIsIFtdKTsgfVxuYXBwLnJ1bihbXCIkdGVtcGxhdGVDYWNoZVwiLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9zbGlkaW5nX21lbnUudHBsXCIsXCI8ZGl2IGNsYXNzPVxcXCJvbnNlbi1zbGlkaW5nLW1lbnVfX21lbnVcXFwiPjwvZGl2PlxcblwiICtcbiAgICBcIjxkaXYgY2xhc3M9XFxcIm9uc2VuLXNsaWRpbmctbWVudV9fbWFpblxcXCI+PC9kaXY+XFxuXCIgK1xuICAgIFwiXCIpXG5cbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9zcGxpdF92aWV3LnRwbFwiLFwiPGRpdiBjbGFzcz1cXFwib25zZW4tc3BsaXQtdmlld19fc2Vjb25kYXJ5IGZ1bGwtc2NyZWVuXFxcIj48L2Rpdj5cXG5cIiArXG4gICAgXCI8ZGl2IGNsYXNzPVxcXCJvbnNlbi1zcGxpdC12aWV3X19tYWluIGZ1bGwtc2NyZWVuXFxcIj48L2Rpdj5cXG5cIiArXG4gICAgXCJcIilcbn1dKTtcbn0pKCk7IiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKGZ1bmN0aW9uKCl7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHNlcnZpY2UgY2xhc3MgZm9yIGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIG1vZHVsZS5mYWN0b3J5KCckb25zZW4nLCBbJyRyb290U2NvcGUnLCAnJHdpbmRvdycsICckY2FjaGVGYWN0b3J5JywgJyRkb2N1bWVudCcsICckdGVtcGxhdGVDYWNoZScsICckaHR0cCcsICckcScsICckb25zR2xvYmFsJywgJ0NvbXBvbmVudENsZWFuZXInLCBmdW5jdGlvbigkcm9vdFNjb3BlLCAkd2luZG93LCAkY2FjaGVGYWN0b3J5LCAkZG9jdW1lbnQsICR0ZW1wbGF0ZUNhY2hlLCAkaHR0cCwgJHEsICRvbnNHbG9iYWwsIENvbXBvbmVudENsZWFuZXIpIHtcblxuICAgIHZhciAkb25zZW4gPSBjcmVhdGVPbnNlblNlcnZpY2UoKTtcbiAgICB2YXIgTW9kaWZpZXJVdGlsID0gJG9uc0dsb2JhbC5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuXG4gICAgcmV0dXJuICRvbnNlbjtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZU9uc2VuU2VydmljZSgpIHtcbiAgICAgIHJldHVybiB7XG5cbiAgICAgICAgRElSRUNUSVZFX1RFTVBMQVRFX1VSTDogJ3RlbXBsYXRlcycsXG5cbiAgICAgICAgY2xlYW5lcjogQ29tcG9uZW50Q2xlYW5lcixcblxuICAgICAgICBEZXZpY2VCYWNrQnV0dG9uSGFuZGxlcjogJG9uc0dsb2JhbC5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIsXG5cbiAgICAgICAgX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlcjogJG9uc0dsb2JhbC5fZGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBnZXREZWZhdWx0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2aWV3XG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXRob2ROYW1lc1xuICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0aGF0IGRpc3Bvc2UgYWxsIGRyaXZpbmcgbWV0aG9kcy5cbiAgICAgICAgICovXG4gICAgICAgIGRlcml2ZU1ldGhvZHM6IGZ1bmN0aW9uKHZpZXcsIGVsZW1lbnQsIG1ldGhvZE5hbWVzKSB7XG4gICAgICAgICAgbWV0aG9kTmFtZXMuZm9yRWFjaChmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICB2aWV3W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50W21ldGhvZE5hbWVdLmFwcGx5KGVsZW1lbnQsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbWV0aG9kTmFtZXMuZm9yRWFjaChmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICAgIHZpZXdbbWV0aG9kTmFtZV0gPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2aWV3ID0gZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtDbGFzc30ga2xhc3NcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcHJvcGVydGllc1xuICAgICAgICAgKi9cbiAgICAgICAgZGVyaXZlUHJvcGVydGllc0Zyb21FbGVtZW50OiBmdW5jdGlvbihrbGFzcywgcHJvcGVydGllcykge1xuICAgICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtsYXNzLnByb3RvdHlwZSwgcHJvcGVydHksIHtcbiAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRbMF1bcHJvcGVydHldO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRbMF1bcHJvcGVydHldID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmV0dXJuLWFzc2lnblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHZpZXdcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGV2ZW50TmFtZXNcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW21hcF1cbiAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBjbGVhciBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICAqL1xuICAgICAgICBkZXJpdmVFdmVudHM6IGZ1bmN0aW9uKHZpZXcsIGVsZW1lbnQsIGV2ZW50TmFtZXMsIG1hcCkge1xuICAgICAgICAgIG1hcCA9IG1hcCB8fCBmdW5jdGlvbihkZXRhaWwpIHsgcmV0dXJuIGRldGFpbDsgfTtcbiAgICAgICAgICBldmVudE5hbWVzID0gW10uY29uY2F0KGV2ZW50TmFtZXMpO1xuICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgICAgIGV2ZW50TmFtZXMuZm9yRWFjaChmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZpZXcuZW1pdChldmVudE5hbWUsIG1hcChPYmplY3QuY3JlYXRlKGV2ZW50LmRldGFpbCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZXZlbnROYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJzW2luZGV4XSwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2aWV3ID0gZWxlbWVudCA9IGxpc3RlbmVycyA9IG1hcCA9IG51bGw7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlzRW5hYmxlZEF1dG9TdGF0dXNCYXJGaWxsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gISEkb25zR2xvYmFsLl9jb25maWcuYXV0b1N0YXR1c0JhckZpbGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGRGaWxsU3RhdHVzQmFyOiAkb25zR2xvYmFsLnNob3VsZEZpbGxTdGF0dXNCYXIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFjdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYXV0b1N0YXR1c0JhckZpbGw6ICRvbnNHbG9iYWwuYXV0b1N0YXR1c0JhckZpbGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgICAgICogQHBhcmFtIHtTY29wZX0gW3BhcmFtcy5zY29wZV1cbiAgICAgICAgICogQHBhcmFtIHtqcUxpdGV9IFtwYXJhbXMuZWxlbWVudF1cbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3BhcmFtcy5lbGVtZW50c11cbiAgICAgICAgICogQHBhcmFtIHtBdHRyaWJ1dGVzfSBbcGFyYW1zLmF0dHJzXVxuICAgICAgICAgKi9cbiAgICAgICAgY2xlYXJDb21wb25lbnQ6IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgICAgICAgIGlmIChwYXJhbXMuc2NvcGUpIHtcbiAgICAgICAgICAgIENvbXBvbmVudENsZWFuZXIuZGVzdHJveVNjb3BlKHBhcmFtcy5zY29wZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcmFtcy5hdHRycykge1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xlYW5lci5kZXN0cm95QXR0cmlidXRlcyhwYXJhbXMuYXR0cnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXJhbXMuZWxlbWVudCkge1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xlYW5lci5kZXN0cm95RWxlbWVudChwYXJhbXMuZWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcmFtcy5lbGVtZW50cykge1xuICAgICAgICAgICAgcGFyYW1zLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICBDb21wb25lbnRDbGVhbmVyLmRlc3Ryb3lFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgZmluZEVsZW1lbnRlT2JqZWN0OiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5oZXJpdGVkRGF0YShuYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgICAgICovXG4gICAgICAgIGdldFBhZ2VIVE1MQXN5bmM6IGZ1bmN0aW9uKHBhZ2UpIHtcbiAgICAgICAgICB2YXIgY2FjaGUgPSAkdGVtcGxhdGVDYWNoZS5nZXQocGFnZSk7XG5cbiAgICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG5cbiAgICAgICAgICAgIHZhciBodG1sID0gdHlwZW9mIGNhY2hlID09PSAnc3RyaW5nJyA/IGNhY2hlIDogY2FjaGVbMV07XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRoaXMubm9ybWFsaXplUGFnZUhUTUwoaHRtbCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJGh0dHAoe1xuICAgICAgICAgICAgICB1cmw6IHBhZ2UsXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCdcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgdmFyIGh0bWwgPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gICAgICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5vcm1hbGl6ZVBhZ2VIVE1MOiBmdW5jdGlvbihodG1sKSB7XG4gICAgICAgICAgaHRtbCA9ICgnJyArIGh0bWwpLnRyaW0oKTtcblxuICAgICAgICAgIGlmICghaHRtbC5tYXRjaCgvXjxvbnMtcGFnZS8pKSB7XG4gICAgICAgICAgICBodG1sID0gJzxvbnMtcGFnZSBfbXV0ZWQ+JyArIGh0bWwgKyAnPC9vbnMtcGFnZT4nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgbW9kaWZpZXIgdGVtcGxhdGVyIGZ1bmN0aW9uLiBUaGUgbW9kaWZpZXIgdGVtcGxhdGVyIGdlbmVyYXRlIGNzcyBjbGFzc2VzIGJvdW5kIG1vZGlmaWVyIG5hbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbbW9kaWZpZXJzXSBhbiBhcnJheSBvZiBhcHBlbmRpeCBtb2RpZmllclxuICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIGdlbmVyYXRlTW9kaWZpZXJUZW1wbGF0ZXI6IGZ1bmN0aW9uKGF0dHJzLCBtb2RpZmllcnMpIHtcbiAgICAgICAgICB2YXIgYXR0ck1vZGlmaWVycyA9IGF0dHJzICYmIHR5cGVvZiBhdHRycy5tb2RpZmllciA9PT0gJ3N0cmluZycgPyBhdHRycy5tb2RpZmllci50cmltKCkuc3BsaXQoLyArLykgOiBbXTtcbiAgICAgICAgICBtb2RpZmllcnMgPSBhbmd1bGFyLmlzQXJyYXkobW9kaWZpZXJzKSA/IGF0dHJNb2RpZmllcnMuY29uY2F0KG1vZGlmaWVycykgOiBhdHRyTW9kaWZpZXJzO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7U3RyaW5nfSB0ZW1wbGF0ZSBlZy4gJ29ucy1idXR0b24tLSonLCAnb25zLWJ1dHRvbi0tKl9faXRlbSdcbiAgICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICAgICAgICovXG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZXJzLm1hcChmdW5jdGlvbihtb2RpZmllcikge1xuICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgnKicsIG1vZGlmaWVyKTtcbiAgICAgICAgICAgIH0pLmpvaW4oJyAnKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgbW9kaWZpZXIgbWV0aG9kcyB0byB2aWV3IG9iamVjdCBmb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmlldyBvYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtqcUxpdGV9IGVsZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIGFkZE1vZGlmaWVyTWV0aG9kc0ZvckN1c3RvbUVsZW1lbnRzOiBmdW5jdGlvbih2aWV3LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIG1ldGhvZHMgPSB7XG4gICAgICAgICAgICBoYXNNb2RpZmllcjogZnVuY3Rpb24obmVlZGxlKSB7XG4gICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBNb2RpZmllclV0aWwuc3BsaXQoZWxlbWVudC5hdHRyKCdtb2RpZmllcicpKTtcbiAgICAgICAgICAgICAgbmVlZGxlID0gdHlwZW9mIG5lZWRsZSA9PT0gJ3N0cmluZycgPyBuZWVkbGUudHJpbSgpIDogJyc7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5zcGxpdChuZWVkbGUpLnNvbWUoZnVuY3Rpb24obmVlZGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucy5pbmRleE9mKG5lZWRsZSkgIT0gLTE7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcmVtb3ZlTW9kaWZpZXI6IGZ1bmN0aW9uKG5lZWRsZSkge1xuICAgICAgICAgICAgICBuZWVkbGUgPSB0eXBlb2YgbmVlZGxlID09PSAnc3RyaW5nJyA/IG5lZWRsZS50cmltKCkgOiAnJztcblxuICAgICAgICAgICAgICB2YXIgbW9kaWZpZXIgPSBNb2RpZmllclV0aWwuc3BsaXQoZWxlbWVudC5hdHRyKCdtb2RpZmllcicpKS5maWx0ZXIoZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gIT09IG5lZWRsZTtcbiAgICAgICAgICAgICAgfSkuam9pbignICcpO1xuXG4gICAgICAgICAgICAgIGVsZW1lbnQuYXR0cignbW9kaWZpZXInLCBtb2RpZmllcik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhZGRNb2RpZmllcjogZnVuY3Rpb24obW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hdHRyKCdtb2RpZmllcicsIGVsZW1lbnQuYXR0cignbW9kaWZpZXInKSArICcgJyArIG1vZGlmaWVyKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldE1vZGlmaWVyOiBmdW5jdGlvbihtb2RpZmllcikge1xuICAgICAgICAgICAgICBlbGVtZW50LmF0dHIoJ21vZGlmaWVyJywgbW9kaWZpZXIpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdG9nZ2xlTW9kaWZpZXI6IGZ1bmN0aW9uKG1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmhhc01vZGlmaWVyKG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZvciAodmFyIG1ldGhvZCBpbiBtZXRob2RzKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShtZXRob2QpKSB7XG4gICAgICAgICAgICAgIHZpZXdbbWV0aG9kXSA9IG1ldGhvZHNbbWV0aG9kXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZCBtb2RpZmllciBtZXRob2RzIHRvIHZpZXcgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmlldyBvYmplY3RcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gICAgICAgICAqIEBwYXJhbSB7anFMaXRlfSBlbGVtZW50XG4gICAgICAgICAqL1xuICAgICAgICBhZGRNb2RpZmllck1ldGhvZHM6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlLCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIF90ciA9IGZ1bmN0aW9uKG1vZGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgnKicsIG1vZGlmaWVyKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdmFyIGZucyA9IHtcbiAgICAgICAgICAgIGhhc01vZGlmaWVyOiBmdW5jdGlvbihtb2RpZmllcikge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNDbGFzcyhfdHIobW9kaWZpZXIpKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlbW92ZU1vZGlmaWVyOiBmdW5jdGlvbihtb2RpZmllcikge1xuICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzKF90cihtb2RpZmllcikpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYWRkTW9kaWZpZXI6IGZ1bmN0aW9uKG1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoX3RyKG1vZGlmaWVyKSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRNb2RpZmllcjogZnVuY3Rpb24obW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBlbGVtZW50LmF0dHIoJ2NsYXNzJykuc3BsaXQoL1xccysvKSxcbiAgICAgICAgICAgICAgICAgIHBhdHQgPSB0ZW1wbGF0ZS5yZXBsYWNlKCcqJywgJy4nKTtcblxuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xzID0gY2xhc3Nlc1tpXTtcblxuICAgICAgICAgICAgICAgIGlmIChjbHMubWF0Y2gocGF0dCkpIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoY2xzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKF90cihtb2RpZmllcikpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdG9nZ2xlTW9kaWZpZXI6IGZ1bmN0aW9uKG1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIHZhciBjbHMgPSBfdHIobW9kaWZpZXIpO1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcyhjbHMpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDbGFzcyhjbHMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoY2xzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB2YXIgYXBwZW5kID0gZnVuY3Rpb24ob2xkRm4sIG5ld0ZuKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9sZEZuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZEZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cykgfHwgbmV3Rm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXdGbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdmlldy5oYXNNb2RpZmllciA9IGFwcGVuZCh2aWV3Lmhhc01vZGlmaWVyLCBmbnMuaGFzTW9kaWZpZXIpO1xuICAgICAgICAgIHZpZXcucmVtb3ZlTW9kaWZpZXIgPSBhcHBlbmQodmlldy5yZW1vdmVNb2RpZmllciwgZm5zLnJlbW92ZU1vZGlmaWVyKTtcbiAgICAgICAgICB2aWV3LmFkZE1vZGlmaWVyID0gYXBwZW5kKHZpZXcuYWRkTW9kaWZpZXIsIGZucy5hZGRNb2RpZmllcik7XG4gICAgICAgICAgdmlldy5zZXRNb2RpZmllciA9IGFwcGVuZCh2aWV3LnNldE1vZGlmaWVyLCBmbnMuc2V0TW9kaWZpZXIpO1xuICAgICAgICAgIHZpZXcudG9nZ2xlTW9kaWZpZXIgPSBhcHBlbmQodmlldy50b2dnbGVNb2RpZmllciwgZm5zLnRvZ2dsZU1vZGlmaWVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlIG1vZGlmaWVyIG1ldGhvZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2aWV3IG9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlTW9kaWZpZXJNZXRob2RzOiBmdW5jdGlvbih2aWV3KSB7XG4gICAgICAgICAgdmlldy5oYXNNb2RpZmllciA9IHZpZXcucmVtb3ZlTW9kaWZpZXIgPVxuICAgICAgICAgICAgdmlldy5hZGRNb2RpZmllciA9IHZpZXcuc2V0TW9kaWZpZXIgPVxuICAgICAgICAgICAgdmlldy50b2dnbGVNb2RpZmllciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lIGEgdmFyaWFibGUgdG8gSmF2YVNjcmlwdCBnbG9iYWwgc2NvcGUgYW5kIEFuZ3VsYXJKUyBzY29wZSBhcyAndmFyJyBhdHRyaWJ1dGUgbmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gICAgICAgICAqIEBwYXJhbSBvYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGRlY2xhcmVWYXJBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHJzLCBvYmplY3QpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGF0dHJzLnZhciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciB2YXJOYW1lID0gYXR0cnMudmFyO1xuICAgICAgICAgICAgdGhpcy5fZGVmaW5lVmFyKHZhck5hbWUsIG9iamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9yZWdpc3RlckV2ZW50SGFuZGxlcjogZnVuY3Rpb24oY29tcG9uZW50LCBldmVudE5hbWUpIHtcbiAgICAgICAgICB2YXIgY2FwaXRhbGl6ZWRFdmVudE5hbWUgPSBldmVudE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICBjb21wb25lbnQub24oZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgJG9uc2VuLmZpcmVDb21wb25lbnRFdmVudChjb21wb25lbnQuX2VsZW1lbnRbMF0sIGV2ZW50TmFtZSwgZXZlbnQpO1xuXG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGNvbXBvbmVudC5fYXR0cnNbJ29ucycgKyBjYXBpdGFsaXplZEV2ZW50TmFtZV07XG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICBjb21wb25lbnQuX3Njb3BlLiRldmFsKGhhbmRsZXIsIHskZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5fc2NvcGUuJGV2YWxBc3luYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWdpc3RlciBldmVudCBoYW5kbGVycyBmb3IgYXR0cmlidXRlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudFxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lc1xuICAgICAgICAgKi9cbiAgICAgICAgcmVnaXN0ZXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbihjb21wb25lbnQsIGV2ZW50TmFtZXMpIHtcbiAgICAgICAgICBldmVudE5hbWVzID0gZXZlbnROYW1lcy50cmltKCkuc3BsaXQoL1xccysvKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnROYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBldmVudE5hbWVzW2ldO1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJFdmVudEhhbmRsZXIoY29tcG9uZW50LCBldmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlzQW5kcm9pZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICEhd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2FuZHJvaWQvaSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBpc0lPUzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICEhd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhpcGFkfGlwaG9uZXxpcG9kIHRvdWNoKS9pKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlzV2ViVmlldzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHdpbmRvdy5vbnMuaXNXZWJWaWV3KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBpc0lPUzdhYm92ZTogKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICAgIHZhciBtYXRjaCA9IHVhLm1hdGNoKC8oaVBhZHxpUGhvbmV8aVBvZCB0b3VjaCk7LipDUFUuKk9TIChcXGQrKV8oXFxkKykvaSk7XG5cbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2ggPyBwYXJzZUZsb2F0KG1hdGNoWzJdICsgJy4nICsgbWF0Y2hbM10pID49IDcgOiBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZSBhIG5hbWVkIGV2ZW50IGZvciBhIGNvbXBvbmVudC4gVGhlIHZpZXcgb2JqZWN0LCBpZiBpdCBleGlzdHMsIGlzIGF0dGFjaGVkIHRvIGV2ZW50LmNvbXBvbmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW2RvbV1cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IG5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGZpcmVDb21wb25lbnRFdmVudDogZnVuY3Rpb24oZG9tLCBldmVudE5hbWUsIGRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gZGF0YSB8fCB7fTtcblxuICAgICAgICAgIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XG5cbiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICBldmVudFtrZXldID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGV2ZW50LmNvbXBvbmVudCA9IGRvbSA/XG4gICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoZG9tKS5kYXRhKGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCBudWxsIDogbnVsbDtcbiAgICAgICAgICBldmVudC5pbml0RXZlbnQoZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKyAnOicgKyBldmVudE5hbWUsIHRydWUsIHRydWUpO1xuXG4gICAgICAgICAgZG9tLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB2YXJpYWJsZSB0byBKYXZhU2NyaXB0IGdsb2JhbCBzY29wZSBhbmQgQW5ndWxhckpTIHNjb3BlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBVdGlsLmRlZmluZVZhcignZm9vJywgJ2Zvby12YWx1ZScpO1xuICAgICAgICAgKiAvLyA9PiB3aW5kb3cuZm9vIGFuZCAkc2NvcGUuZm9vIGlzIG5vdyAnZm9vLXZhbHVlJ1xuICAgICAgICAgKlxuICAgICAgICAgKiBVdGlsLmRlZmluZVZhcignZm9vLmJhcicsICdmb28tYmFyLXZhbHVlJyk7XG4gICAgICAgICAqIC8vID0+IHdpbmRvdy5mb28uYmFyIGFuZCAkc2NvcGUuZm9vLmJhciBpcyBub3cgJ2Zvby1iYXItdmFsdWUnXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSBvYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIF9kZWZpbmVWYXI6IGZ1bmN0aW9uKG5hbWUsIG9iamVjdCkge1xuICAgICAgICAgIHZhciBuYW1lcyA9IG5hbWUuc3BsaXQoL1xcLi8pO1xuXG4gICAgICAgICAgZnVuY3Rpb24gc2V0KGNvbnRhaW5lciwgbmFtZXMsIG9iamVjdCkge1xuICAgICAgICAgICAgdmFyIG5hbWU7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgICAgICAgIGlmIChjb250YWluZXJbbmFtZV0gPT09IHVuZGVmaW5lZCB8fCBjb250YWluZXJbbmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXJbbmFtZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lcltuYW1lc1tuYW1lcy5sZW5ndGggLSAxXV0gPSBvYmplY3Q7XG5cbiAgICAgICAgICAgIGlmIChjb250YWluZXJbbmFtZXNbbmFtZXMubGVuZ3RoIC0gMV1dICE9PSBvYmplY3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IHZhcj1cIicgKyBvYmplY3QuX2F0dHJzLnZhciArICdcIiBiZWNhdXNlIGl0IHdpbGwgb3ZlcndyaXRlIGEgcmVhZC1vbmx5IHZhcmlhYmxlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvbnMuY29tcG9uZW50QmFzZSkge1xuICAgICAgICAgICAgc2V0KG9ucy5jb21wb25lbnRCYXNlLCBuYW1lcywgb2JqZWN0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBdHRhY2ggdG8gYW5jZXN0b3Igd2l0aCBvbnMtc2NvcGUgYXR0cmlidXRlLlxuICAgICAgICAgIHZhciBlbGVtZW50ID0gb2JqZWN0Ll9lbGVtZW50WzBdO1xuXG4gICAgICAgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdvbnMtc2NvcGUnKSkge1xuICAgICAgICAgICAgICBzZXQoYW5ndWxhci5lbGVtZW50KGVsZW1lbnQpLmRhdGEoJ19zY29wZScpLCBuYW1lcywgb2JqZWN0KTtcbiAgICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgICAvLyBJZiBubyBvbnMtc2NvcGUgZWxlbWVudCB3YXMgZm91bmQsIGF0dGFjaCB0byAkcm9vdFNjb3BlLlxuICAgICAgICAgIHNldCgkcm9vdFNjb3BlLCBuYW1lcywgb2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgfV0pO1xufSkoKTtcbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLWFsZXJ0LWRpYWxvZ1xuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1WYXJpYWJsZSBuYW1lIHRvIHJlZmVyIHRoaXMgYWxlcnQgZGlhbG9nLlsvZW5dXG4gKiAgW2phXeOBk+OBruOCouODqeODvOODiOODgOOCpOOCouODreOCsOOCkuWPgueFp+OBmeOCi+OBn+OCgeOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wcmVzaG93XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVzaG93XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwcmVzaG93XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcHJlaGlkZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicHJlaGlkZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicHJlaGlkZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXBvc3RzaG93XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwb3N0c2hvd1wiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicG9zdHNob3dcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wb3N0aGlkZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicG9zdGhpZGVcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInBvc3RoaWRlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtZGVzdHJveVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwiZGVzdHJveVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwiZGVzdHJveVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb25cbiAqIEBzaWduYXR1cmUgb24oZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+OCs+ODvOODq+ODkOODg+OCr+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uY2VcbiAqIEBzaWduYXR1cmUgb25jZShldmVudE5hbWUsIGxpc3RlbmVyKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0J3Mgb25seSB0cmlnZ2VyZWQgb25jZS5bL2VuXVxuICogIFtqYV3kuIDluqbjgaDjgZHlkbzjgbPlh7rjgZXjgozjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+OCs+ODvOODq+ODkOODg+OCr+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9mZlxuICogQHNpZ25hdHVyZSBvZmYoZXZlbnROYW1lLCBbbGlzdGVuZXJdKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci4gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBzcGVjaWZpZWQgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50IHR5cGUgd2lsbCBiZSByZW1vdmVkLlsvZW5dXG4gKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAguOCguOBl2xpc3RlbmVy44OR44Op44Oh44O844K/44GM5oyH5a6a44GV44KM44Gq44GL44Gj44Gf5aC05ZCI44CB44Gd44Gu44Kk44OZ44Oz44OI44Gu44Oq44K544OK44O844GM5YWo44Gm5YmK6Zmk44GV44KM44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3liYrpmaTjgZnjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjga7plqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmuKHjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiBBbGVydCBkaWFsb2cgZGlyZWN0aXZlLlxuICAgKi9cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNBbGVydERpYWxvZycsIFsnJG9uc2VuJywgJ0FsZXJ0RGlhbG9nVmlldycsIGZ1bmN0aW9uKCRvbnNlbiwgQWxlcnREaWFsb2dWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICByZXBsYWNlOiBmYWxzZSxcbiAgICAgIHNjb3BlOiB0cnVlLFxuICAgICAgdHJhbnNjbHVkZTogZmFsc2UsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgICAgdmFyIGFsZXJ0RGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nVmlldyhzY29wZSwgZWxlbWVudCwgYXR0cnMpO1xuXG4gICAgICAgICAgICAkb25zZW4uZGVjbGFyZVZhckF0dHJpYnV0ZShhdHRycywgYWxlcnREaWFsb2cpO1xuICAgICAgICAgICAgJG9uc2VuLnJlZ2lzdGVyRXZlbnRIYW5kbGVycyhhbGVydERpYWxvZywgJ3ByZXNob3cgcHJlaGlkZSBwb3N0c2hvdyBwb3N0aGlkZSBkZXN0cm95Jyk7XG4gICAgICAgICAgICAkb25zZW4uYWRkTW9kaWZpZXJNZXRob2RzRm9yQ3VzdG9tRWxlbWVudHMoYWxlcnREaWFsb2csIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1hbGVydC1kaWFsb2cnLCBhbGVydERpYWxvZyk7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ19zY29wZScsIHNjb3BlKTtcblxuICAgICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBhbGVydERpYWxvZy5fZXZlbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAkb25zZW4ucmVtb3ZlTW9kaWZpZXJNZXRob2RzKGFsZXJ0RGlhbG9nKTtcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdvbnMtYWxlcnQtZGlhbG9nJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvc3Q6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcblxufSkoKTtcbiIsIlxuLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuYW5ndWxhci5tb2R1bGUoJ29uc2VuJylcbiAgLnZhbHVlKCdBbGVydERpYWxvZ0FuaW1hdG9yJywgb25zLl9pbnRlcm5hbC5BbGVydERpYWxvZ0FuaW1hdG9yKVxuICAudmFsdWUoJ0FuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yJywgb25zLl9pbnRlcm5hbC5BbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvcilcbiAgLnZhbHVlKCdJT1NBbGVydERpYWxvZ0FuaW1hdG9yJywgb25zLl9pbnRlcm5hbC5JT1NBbGVydERpYWxvZ0FuaW1hdG9yKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLnZhbHVlKCdBbmltYXRpb25DaG9vc2VyJywgb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3RvcnkpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtY2Fyb3VzZWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ2Fyb3VzZWwgY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vjgpLooajnpLrjgafjgY3jgovjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgIJbL2phXVxuICogQGNvZGVwZW4geGJiek9RXG4gKiBAZ3VpZGUgVXNpbmdDYXJvdXNlbFxuICogICBbZW5dTGVhcm4gaG93IHRvIHVzZSB0aGUgY2Fyb3VzZWwgY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV1jYXJvdXNlbOOCs+ODs+ODneODvOODjeODs+ODiOOBruS9v+OBhOaWuVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1jYXJvdXNlbCBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDIwMHB4XCI+XG4gKiAgIDxvbnMtY2Fyb3VzZWwtaXRlbT5cbiAqICAgIC4uLlxuICogICA8L29ucy1jYXJvdXNlbC1pdGVtPlxuICogICA8b25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgICAuLi5cbiAqICAgPC9vbnMtY2Fyb3VzZWwtaXRlbT5cbiAqIDwvb25zLWNhcm91c2VsPlxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVmFyaWFibGUgbmFtZSB0byByZWZlciB0aGlzIGNhcm91c2VsLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jgqvjg6vjg7zjgrvjg6vjgpLlj4LnhafjgZnjgovjgZ/jgoHjga7lpInmlbDlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcG9zdGNoYW5nZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicG9zdGNoYW5nZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicG9zdGNoYW5nZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXJlZnJlc2hcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcInJlZnJlc2hcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInJlZnJlc2hcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1vdmVyc2Nyb2xsXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJvdmVyc2Nyb2xsXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJvdmVyc2Nyb2xsXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtZGVzdHJveVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwiZGVzdHJveVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwiZGVzdHJveVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb25jZVxuICogQHNpZ25hdHVyZSBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQncyBvbmx5IHRyaWdnZXJlZCBvbmNlLlsvZW5dXG4gKiAgW2phXeS4gOW6puOBoOOBkeWRvOOBs+WHuuOBleOCjOOCi+OCpOODmeODs+ODiOODquOCueODiuOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb2ZmXG4gKiBAc2lnbmF0dXJlIG9mZihldmVudE5hbWUsIFtsaXN0ZW5lcl0pXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHNwZWNpZmllZCBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgdHlwZSB3aWxsIGJlIHJlbW92ZWQuWy9lbl1cbiAqICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5YmK6Zmk44GX44G+44GZ44CC44KC44GX44Kk44OZ44Oz44OI44Oq44K544OK44O844GM5oyH5a6a44GV44KM44Gq44GL44Gj44Gf5aC05ZCI44Gr44Gv44CB44Gd44Gu44Kk44OZ44Oz44OI44Gr57SQ5LuY44GE44Gm44GE44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844GM5YWo44Gm5YmK6Zmk44GV44KM44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvblxuICogQHNpZ25hdHVyZSBvbihldmVudE5hbWUsIGxpc3RlbmVyKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmRpcmVjdGl2ZSgnb25zQ2Fyb3VzZWwnLCBbJyRvbnNlbicsICdDYXJvdXNlbFZpZXcnLCBmdW5jdGlvbigkb25zZW4sIENhcm91c2VsVmlldykge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG5cbiAgICAgIC8vIE5PVEU6IFRoaXMgZWxlbWVudCBtdXN0IGNvZXhpc3RzIHdpdGggbmctY29udHJvbGxlci5cbiAgICAgIC8vIERvIG5vdCB1c2UgaXNvbGF0ZWQgc2NvcGUgYW5kIHRlbXBsYXRlJ3MgbmctdHJhbnNjbHVkZS5cbiAgICAgIHNjb3BlOiBmYWxzZSxcbiAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLFxuXG4gICAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRycykge1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICB2YXIgY2Fyb3VzZWwgPSBuZXcgQ2Fyb3VzZWxWaWV3KHNjb3BlLCBlbGVtZW50LCBhdHRycyk7XG5cbiAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1jYXJvdXNlbCcsIGNhcm91c2VsKTtcblxuICAgICAgICAgICRvbnNlbi5yZWdpc3RlckV2ZW50SGFuZGxlcnMoY2Fyb3VzZWwsICdwb3N0Y2hhbmdlIHJlZnJlc2ggb3ZlcnNjcm9sbCBkZXN0cm95Jyk7XG4gICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIGNhcm91c2VsKTtcblxuICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNhcm91c2VsLl9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1jYXJvdXNlbCcsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICB9O1xuICB9XSk7XG5cbiAgbW9kdWxlLmRpcmVjdGl2ZSgnb25zQ2Fyb3VzZWxJdGVtJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRycykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgaWYgKHNjb3BlLiRsYXN0KSB7XG4gICAgICAgICAgICBlbGVtZW50WzBdLnBhcmVudEVsZW1lbnQuX3NldHVwKCk7XG4gICAgICAgICAgICBlbGVtZW50WzBdLnBhcmVudEVsZW1lbnQuX3NldHVwSW5pdGlhbEluZGV4KCk7XG4gICAgICAgICAgICBlbGVtZW50WzBdLnBhcmVudEVsZW1lbnQuX3NhdmVMYXN0U3RhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbn0pKCk7XG5cbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLWRpYWxvZ1xuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1WYXJpYWJsZSBuYW1lIHRvIHJlZmVyIHRoaXMgZGlhbG9nLlsvZW5dXG4gKiAgW2phXeOBk+OBruODgOOCpOOCouODreOCsOOCkuWPgueFp+OBmeOCi+OBn+OCgeOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wcmVzaG93XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVzaG93XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwcmVzaG93XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcHJlaGlkZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicHJlaGlkZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicHJlaGlkZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXBvc3RzaG93XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwb3N0c2hvd1wiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicG9zdHNob3dcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wb3N0aGlkZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicG9zdGhpZGVcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInBvc3RoaWRlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtZGVzdHJveVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwiZGVzdHJveVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwiZGVzdHJveVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb25cbiAqIEBzaWduYXR1cmUgb24oZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uY2VcbiAqIEBzaWduYXR1cmUgb25jZShldmVudE5hbWUsIGxpc3RlbmVyKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0J3Mgb25seSB0cmlnZ2VyZWQgb25jZS5bL2VuXVxuICogIFtqYV3kuIDluqbjgaDjgZHlkbzjgbPlh7rjgZXjgozjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9mZlxuICogQHNpZ25hdHVyZSBvZmYoZXZlbnROYW1lLCBbbGlzdGVuZXJdKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci4gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBzcGVjaWZpZWQgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50IHR5cGUgd2lsbCBiZSByZW1vdmVkLlsvZW5dXG4gKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAguOCguOBl+OCpOODmeODs+ODiOODquOCueODiuODvOOBjOaMh+WumuOBleOCjOOBquOBi+OBo+OBn+WgtOWQiOOBq+OBr+OAgeOBneOBruOCpOODmeODs+ODiOOBq+e0kOS7mOOBhOOBpuOBhOOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOBjOWFqOOBpuWJiumZpOOBleOCjOOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNEaWFsb2cnLCBbJyRvbnNlbicsICdEaWFsb2dWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBEaWFsb2dWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBzY29wZTogdHJ1ZSxcbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuXG4gICAgICAgICAgICB2YXIgZGlhbG9nID0gbmV3IERpYWxvZ1ZpZXcoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKTtcbiAgICAgICAgICAgICRvbnNlbi5kZWNsYXJlVmFyQXR0cmlidXRlKGF0dHJzLCBkaWFsb2cpO1xuICAgICAgICAgICAgJG9uc2VuLnJlZ2lzdGVyRXZlbnRIYW5kbGVycyhkaWFsb2csICdwcmVzaG93IHByZWhpZGUgcG9zdHNob3cgcG9zdGhpZGUgZGVzdHJveScpO1xuICAgICAgICAgICAgJG9uc2VuLmFkZE1vZGlmaWVyTWV0aG9kc0ZvckN1c3RvbUVsZW1lbnRzKGRpYWxvZywgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLWRpYWxvZycsIGRpYWxvZyk7XG4gICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGRpYWxvZy5fZXZlbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAkb25zZW4ucmVtb3ZlTW9kaWZpZXJNZXRob2RzKGRpYWxvZyk7XG4gICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLWRpYWxvZycsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHBvc3Q6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcblxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmFuZ3VsYXIubW9kdWxlKCdvbnNlbicpXG4gIC52YWx1ZSgnRGlhbG9nQW5pbWF0b3InLCBvbnMuX2ludGVybmFsLkRpYWxvZ0FuaW1hdG9yKVxuICAudmFsdWUoJ0lPU0RpYWxvZ0FuaW1hdG9yJywgb25zLl9pbnRlcm5hbC5JT1NEaWFsb2dBbmltYXRvcilcbiAgLnZhbHVlKCdBbmRyb2lkRGlhbG9nQW5pbWF0b3InLCBvbnMuX2ludGVybmFsLkFuZHJvaWREaWFsb2dBbmltYXRvcilcbiAgLnZhbHVlKCdTbGlkZURpYWxvZ0FuaW1hdG9yJywgb25zLl9pbnRlcm5hbC5TbGlkZURpYWxvZ0FuaW1hdG9yKTtcbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLWZhYlxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVmFyaWFibGUgbmFtZSB0byByZWZlciB0aGUgZmxvYXRpbmcgYWN0aW9uIGJ1dHRvbi5bL2VuXVxuICogICBbamFd44GT44Gu44OV44Ot44O844OG44Kj44Oz44Kw44Ki44Kv44K344On44Oz44Oc44K/44Oz44KS5Y+C54Wn44GZ44KL44Gf44KB44Gu5aSJ5pWw5ZCN44KS44GX44Gm44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmRpcmVjdGl2ZSgnb25zRmFiJywgWyckb25zZW4nLCAnRmFiVmlldycsIGZ1bmN0aW9uKCRvbnNlbiwgRmFiVmlldykge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG4gICAgICBzY29wZTogZmFsc2UsXG4gICAgICB0cmFuc2NsdWRlOiBmYWxzZSxcblxuICAgICAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cnMpIHtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgdmFyIGZhYiA9IG5ldyBGYWJWaWV3KHNjb3BlLCBlbGVtZW50LCBhdHRycyk7XG5cbiAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1mYWInLCBmYWIpO1xuXG4gICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIGZhYik7XG5cbiAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1mYWInLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgfTtcbiAgfV0pO1xuXG59KSgpO1xuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLmZhY3RvcnkoJ0dlbmVyaWNWaWV3JywgWyckb25zZW4nLCBmdW5jdGlvbigkb25zZW4pIHtcblxuICAgIHZhciBHZW5lcmljVmlldyA9IENsYXNzLmV4dGVuZCh7XG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjb3BlXG4gICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRpcmVjdGl2ZU9ubHldXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vbkRlc3Ryb3ldXG4gICAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJUZW1wbGF0ZV1cbiAgICAgICAqL1xuICAgICAgaW5pdDogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLl9hdHRycyA9IGF0dHJzO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZU9ubHkpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMubW9kaWZpZXJUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLm1vZGlmaWVyVGVtcGxhdGUgaXMgdW5kZWZpbmVkLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAkb25zZW4uYWRkTW9kaWZpZXJNZXRob2RzKHRoaXMsIG9wdGlvbnMubW9kaWZpZXJUZW1wbGF0ZSwgZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJG9uc2VuLmFkZE1vZGlmaWVyTWV0aG9kc0ZvckN1c3RvbUVsZW1lbnRzKHRoaXMsIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgJG9uc2VuLmNsZWFuZXIub25EZXN0cm95KHNjb3BlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLl9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgJG9uc2VuLnJlbW92ZU1vZGlmaWVyTWV0aG9kcyhzZWxmKTtcblxuICAgICAgICAgIGlmIChvcHRpb25zLm9uRGVzdHJveSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkRlc3Ryb3koc2VsZik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJG9uc2VuLmNsZWFyQ29tcG9uZW50KHtcbiAgICAgICAgICAgIHNjb3BlOiBzY29wZSxcbiAgICAgICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHNlbGYgPSBlbGVtZW50ID0gc2VsZi5fZWxlbWVudCA9IHNlbGYuX3Njb3BlID0gc2NvcGUgPSBzZWxmLl9hdHRycyA9IGF0dHJzID0gb3B0aW9ucyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNjb3BlXG4gICAgICogQHBhcmFtIHtqcUxpdGV9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnZpZXdLZXlcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRpcmVjdGl2ZU9ubHldXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25EZXN0cm95XVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tb2RpZmllclRlbXBsYXRlXVxuICAgICAqL1xuICAgIEdlbmVyaWNWaWV3LnJlZ2lzdGVyID0gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBvcHRpb25zKSB7XG4gICAgICB2YXIgdmlldyA9IG5ldyBHZW5lcmljVmlldyhzY29wZSwgZWxlbWVudCwgYXR0cnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoIW9wdGlvbnMudmlld0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMudmlld0tleSBpcyByZXF1aXJlZC4nKTtcbiAgICAgIH1cblxuICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIHZpZXcpO1xuICAgICAgZWxlbWVudC5kYXRhKG9wdGlvbnMudmlld0tleSwgdmlldyk7XG5cbiAgICAgIHZhciBkZXN0cm95ID0gb3B0aW9ucy5vbkRlc3Ryb3kgfHwgYW5ndWxhci5ub29wO1xuICAgICAgb3B0aW9ucy5vbkRlc3Ryb3kgPSBmdW5jdGlvbih2aWV3KSB7XG4gICAgICAgIGRlc3Ryb3kodmlldyk7XG4gICAgICAgIGVsZW1lbnQuZGF0YShvcHRpb25zLnZpZXdLZXksIG51bGwpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfTtcblxuICAgIE1pY3JvRXZlbnQubWl4aW4oR2VuZXJpY1ZpZXcpO1xuXG4gICAgcmV0dXJuIEdlbmVyaWNWaWV3O1xuICB9XSk7XG59KSgpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtbGF6eS1yZXBlYXRcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVXNpbmcgdGhpcyBjb21wb25lbnQgYSBsaXN0IHdpdGggbWlsbGlvbnMgb2YgaXRlbXMgY2FuIGJlIHJlbmRlcmVkIHdpdGhvdXQgYSBkcm9wIGluIHBlcmZvcm1hbmNlLlxuICogICAgIEl0IGRvZXMgdGhhdCBieSBcImxhemlseVwiIGxvYWRpbmcgZWxlbWVudHMgaW50byB0aGUgRE9NIHdoZW4gdGhleSBjb21lIGludG8gdmlldyBhbmRcbiAqICAgICByZW1vdmluZyBpdGVtcyBmcm9tIHRoZSBET00gd2hlbiB0aGV5IGFyZSBub3QgdmlzaWJsZS5cbiAqICAgWy9lbl1cbiAqICAgW2phXVxuICogICAgIOOBk+OBruOCs+ODs+ODneODvOODjeODs+ODiOWGheOBp+aPj+eUu+OBleOCjOOCi+OCouOCpOODhuODoOOBrkRPTeimgee0oOOBruiqreOBv+i+vOOBv+OBr+OAgeeUu+mdouOBq+imi+OBiOOBneOBhuOBq+OBquOBo+OBn+aZguOBvuOBp+iHquWLleeahOOBq+mBheW7tuOBleOCjOOAgVxuICogICAgIOeUu+mdouOBi+OCieimi+OBiOOBquOBj+OBquOBo+OBn+WgtOWQiOOBq+OBr+OBneOBruimgee0oOOBr+WLleeahOOBq+OCouODs+ODreODvOODieOBleOCjOOBvuOBmeOAglxuICogICAgIOOBk+OBruOCs+ODs+ODneODvOODjeODs+ODiOOCkuS9v+OBhuOBk+OBqOOBp+OAgeODkeODleOCqeODvOODnuODs+OCueOCkuWKo+WMluOBleOBm+OCi+OBk+OBqOeEoeOBl+OBq+W3qOWkp+OBquaVsOOBruimgee0oOOCkuaPj+eUu+OBp+OBjeOBvuOBmeOAglxuICogICBbL2phXVxuICogQGNvZGVwZW4gUXdyR0JtXG4gKiBAZ3VpZGUgVXNpbmdMYXp5UmVwZWF0XG4gKiAgIFtlbl1Ib3cgdG8gdXNlIExhenkgUmVwZWF0Wy9lbl1cbiAqICAgW2phXeODrOOCpOOCuOODvOODquODlOODvOODiOOBruS9v+OBhOaWuVsvamFdXG4gKiBAZXhhbXBsZVxuICogPHNjcmlwdD5cbiAqICAgb25zLmJvb3RzdHJhcCgpXG4gKlxuICogICAuY29udHJvbGxlcignTXlDb250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgJHNjb3BlLk15RGVsZWdhdGUgPSB7XG4gKiAgICAgICBjb3VudEl0ZW1zOiBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgLy8gUmV0dXJuIG51bWJlciBvZiBpdGVtcy5cbiAqICAgICAgICAgcmV0dXJuIDEwMDAwMDA7XG4gKiAgICAgICB9LFxuICpcbiAqICAgICAgIGNhbGN1bGF0ZUl0ZW1IZWlnaHQ6IGZ1bmN0aW9uKGluZGV4KSB7XG4gKiAgICAgICAgIC8vIFJldHVybiB0aGUgaGVpZ2h0IG9mIGFuIGl0ZW0gaW4gcGl4ZWxzLlxuICogICAgICAgICByZXR1cm4gNDU7XG4gKiAgICAgICB9LFxuICpcbiAqICAgICAgIGNvbmZpZ3VyZUl0ZW1TY29wZTogZnVuY3Rpb24oaW5kZXgsIGl0ZW1TY29wZSkge1xuICogICAgICAgICAvLyBJbml0aWFsaXplIHNjb3BlXG4gKiAgICAgICAgIGl0ZW1TY29wZS5pdGVtID0gJ0l0ZW0gIycgKyAoaW5kZXggKyAxKTtcbiAqICAgICAgIH0sXG4gKlxuICogICAgICAgZGVzdHJveUl0ZW1TY29wZTogZnVuY3Rpb24oaW5kZXgsIGl0ZW1TY29wZSkge1xuICogICAgICAgICAvLyBPcHRpb25hbCBtZXRob2QgdGhhdCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVtIGlzIHVubG9hZGVkLlxuICogICAgICAgICBjb25zb2xlLmxvZygnRGVzdHJveWVkIGl0ZW0gd2l0aCBpbmRleDogJyArIGluZGV4KTtcbiAqICAgICAgIH1cbiAqICAgICB9O1xuICogICB9KTtcbiAqIDwvc2NyaXB0PlxuICpcbiAqIDxvbnMtbGlzdCBuZy1jb250cm9sbGVyPVwiTXlDb250cm9sbGVyXCI+XG4gKiAgIDxvbnMtbGlzdC1pdGVtIG9ucy1sYXp5LXJlcGVhdD1cIk15RGVsZWdhdGVcIj5cbiAqICAgICB7eyBpdGVtIH19XG4gKiAgIDwvb25zLWxpc3QtaXRlbT5cbiAqIDwvb25zLWxpc3Q+XG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1sYXp5LXJlcGVhdFxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAaW5pdG9ubHlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BIGRlbGVnYXRlIG9iamVjdCwgY2FuIGJlIGVpdGhlciBhbiBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIHNjb3BlICh3aGVuIHVzaW5nIEFuZ3VsYXJKUykgb3IgYSBub3JtYWwgSmF2YVNjcmlwdCB2YXJpYWJsZS5bL2VuXVxuICogIFtqYV3opoHntKDjga7jg63jg7zjg4njgIHjgqLjg7Pjg63jg7zjg4njgarjganjga7lh6bnkIbjgpLlp5TorbLjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJBbmd1bGFySlPjga7jgrnjgrPjg7zjg5fjga7lpInmlbDlkI3jgoTjgIHpgJrluLjjga5KYXZhU2NyaXB044Gu5aSJ5pWw5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBwcm9wZXJ0eSBkZWxlZ2F0ZS5jb25maWd1cmVJdGVtU2NvcGVcbiAqIEB0eXBlIHtGdW5jdGlvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRnVuY3Rpb24gd2hpY2ggcmVjaWV2ZXMgYW4gaW5kZXggYW5kIHRoZSBzY29wZSBmb3IgdGhlIGl0ZW0uIENhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB2YWx1ZXMgaW4gdGhlIGl0ZW0gc2NvcGUuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpO1xuXG4gIC8qKlxuICAgKiBMYXp5IHJlcGVhdCBkaXJlY3RpdmUuXG4gICAqL1xuICBtb2R1bGUuZGlyZWN0aXZlKCdvbnNMYXp5UmVwZWF0JywgWyckb25zZW4nLCAnTGF6eVJlcGVhdFZpZXcnLCBmdW5jdGlvbigkb25zZW4sIExhenlSZXBlYXRWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICByZXBsYWNlOiBmYWxzZSxcbiAgICAgIHByaW9yaXR5OiAxMDAwLFxuICAgICAgdGVybWluYWw6IHRydWUsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICB2YXIgbGF6eVJlcGVhdCA9IG5ldyBMYXp5UmVwZWF0VmlldyhzY29wZSwgZWxlbWVudCwgYXR0cnMpO1xuXG4gICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2NvcGUgPSBlbGVtZW50ID0gYXR0cnMgPSBsYXp5UmVwZWF0ID0gbnVsbDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG5cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLmZhY3RvcnkoJ0FuZ3VsYXJMYXp5UmVwZWF0RGVsZWdhdGUnLCBbJyRjb21waWxlJywgZnVuY3Rpb24oJGNvbXBpbGUpIHtcblxuICAgIGNvbnN0IGRpcmVjdGl2ZUF0dHJpYnV0ZXMgPSBbJ29ucy1sYXp5LXJlcGVhdCcsICdvbnM6bGF6eTpyZXBlYXQnLCAnb25zX2xhenlfcmVwZWF0JywgJ2RhdGEtb25zLWxhenktcmVwZWF0JywgJ3gtb25zLWxhenktcmVwZWF0J107XG4gICAgY2xhc3MgQW5ndWxhckxhenlSZXBlYXREZWxlZ2F0ZSBleHRlbmRzIG9ucy5faW50ZXJuYWwuTGF6eVJlcGVhdERlbGVnYXRlIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IHVzZXJEZWxlZ2F0ZVxuICAgICAgICogQHBhcmFtIHtFbGVtZW50fSB0ZW1wbGF0ZUVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7U2NvcGV9IHBhcmVudFNjb3BlXG4gICAgICAgKi9cbiAgICAgIGNvbnN0cnVjdG9yKHVzZXJEZWxlZ2F0ZSwgdGVtcGxhdGVFbGVtZW50LCBwYXJlbnRTY29wZSkge1xuICAgICAgICBzdXBlcih1c2VyRGVsZWdhdGUsIHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuX3BhcmVudFNjb3BlID0gcGFyZW50U2NvcGU7XG5cbiAgICAgICAgZGlyZWN0aXZlQXR0cmlidXRlcy5mb3JFYWNoKGF0dHIgPT4gdGVtcGxhdGVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyKSk7XG4gICAgICAgIHRoaXMuX2xpbmtlciA9ICRjb21waWxlKHRlbXBsYXRlRWxlbWVudCA/IHRlbXBsYXRlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBudWxsKTtcbiAgICAgIH1cblxuICAgICAgY29uZmlndXJlSXRlbVNjb3BlKGl0ZW0sIHNjb3BlKXtcbiAgICAgICAgaWYgKHRoaXMuX3VzZXJEZWxlZ2F0ZS5jb25maWd1cmVJdGVtU2NvcGUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZS5jb25maWd1cmVJdGVtU2NvcGUoaXRlbSwgc2NvcGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRlc3Ryb3lJdGVtU2NvcGUoaXRlbSwgZWxlbWVudCl7XG4gICAgICAgIGlmICh0aGlzLl91c2VyRGVsZWdhdGUuZGVzdHJveUl0ZW1TY29wZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5fdXNlckRlbGVnYXRlLmRlc3Ryb3lJdGVtU2NvcGUoaXRlbSwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3VzaW5nQmluZGluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3VzZXJEZWxlZ2F0ZS5jb25maWd1cmVJdGVtU2NvcGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl91c2VyRGVsZWdhdGUuY3JlYXRlSXRlbUNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BsYXp5LXJlcGVhdGAgZGVsZWdhdGUgb2JqZWN0IGlzIHZhZ3VlLicpO1xuICAgICAgfVxuXG4gICAgICBsb2FkSXRlbUVsZW1lbnQoaW5kZXgsIHBhcmVudCwgZG9uZSkge1xuICAgICAgICB0aGlzLl9wcmVwYXJlSXRlbUVsZW1lbnQoaW5kZXgsICh7ZWxlbWVudCwgc2NvcGV9KSA9PiB7XG4gICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgIGRvbmUoe2VsZW1lbnQsIHNjb3BlfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfcHJlcGFyZUl0ZW1FbGVtZW50KGluZGV4LCBkb25lKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gdGhpcy5fcGFyZW50U2NvcGUuJG5ldygpO1xuICAgICAgICB0aGlzLl9hZGRTcGVjaWFsUHJvcGVydGllcyhpbmRleCwgc2NvcGUpO1xuXG4gICAgICAgIGlmICh0aGlzLl91c2luZ0JpbmRpbmcoKSkge1xuICAgICAgICAgIHRoaXMuY29uZmlndXJlSXRlbVNjb3BlKGluZGV4LCBzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9saW5rZXIoc2NvcGUsIChjbG9uZWQpID0+IHtcbiAgICAgICAgICBsZXQgZWxlbWVudCA9IGNsb25lZFswXTtcbiAgICAgICAgICBpZiAoIXRoaXMuX3VzaW5nQmluZGluZygpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5fdXNlckRlbGVnYXRlLmNyZWF0ZUl0ZW1Db250ZW50KGluZGV4LCBlbGVtZW50KTtcbiAgICAgICAgICAgICRjb21waWxlKGVsZW1lbnQpKHNjb3BlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb25lKHtlbGVtZW50LCBzY29wZX0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY29wZVxuICAgICAgICovXG4gICAgICBfYWRkU3BlY2lhbFByb3BlcnRpZXMoaSwgc2NvcGUpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMuY291bnRJdGVtcygpIC0gMTtcbiAgICAgICAgYW5ndWxhci5leHRlbmQoc2NvcGUsIHtcbiAgICAgICAgICAkaW5kZXg6IGksXG4gICAgICAgICAgJGZpcnN0OiBpID09PSAwLFxuICAgICAgICAgICRsYXN0OiBpID09PSBsYXN0LFxuICAgICAgICAgICRtaWRkbGU6IGkgIT09IDAgJiYgaSAhPT0gbGFzdCxcbiAgICAgICAgICAkZXZlbjogaSAlIDIgPT09IDAsXG4gICAgICAgICAgJG9kZDogaSAlIDIgPT09IDFcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZUl0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3VzaW5nQmluZGluZygpKSB7XG4gICAgICAgICAgaXRlbS5zY29wZS4kZXZhbEFzeW5jKCgpID0+IHRoaXMuY29uZmlndXJlSXRlbVNjb3BlKGluZGV4LCBpdGVtLnNjb3BlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VwZXIudXBkYXRlSXRlbShpbmRleCwgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbS5zY29wZVxuICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBpdGVtLmVsZW1lbnRcbiAgICAgICAqL1xuICAgICAgZGVzdHJveUl0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMuX3VzaW5nQmluZGluZygpKSB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95SXRlbVNjb3BlKGluZGV4LCBpdGVtLnNjb3BlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdXBlci5kZXN0cm95SXRlbShpbmRleCwgaXRlbS5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLnNjb3BlLiRkZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fc2NvcGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIEFuZ3VsYXJMYXp5UmVwZWF0RGVsZWdhdGU7XG4gIH1dKTtcbn0pKCk7XG4iLCIvKipcbiAqIEBlbGVtZW50IG9ucy1tb2RhbFxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAaW5pdG9ubHlcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVmFyaWFibGUgbmFtZSB0byByZWZlciB0aGlzIG1vZGFsLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jg6Ljg7zjg4Djg6vjgpLlj4LnhafjgZnjgovjgZ/jgoHjga7lkI3liY3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiBNb2RhbCBkaXJlY3RpdmUuXG4gICAqL1xuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc01vZGFsJywgWyckb25zZW4nLCAnTW9kYWxWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBNb2RhbFZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuXG4gICAgICAvLyBOT1RFOiBUaGlzIGVsZW1lbnQgbXVzdCBjb2V4aXN0cyB3aXRoIG5nLWNvbnRyb2xsZXIuXG4gICAgICAvLyBEbyBub3QgdXNlIGlzb2xhdGVkIHNjb3BlIGFuZCB0ZW1wbGF0ZSdzIG5nLXRyYW5zY2x1ZGUuXG4gICAgICBzY29wZTogZmFsc2UsXG4gICAgICB0cmFuc2NsdWRlOiBmYWxzZSxcblxuICAgICAgY29tcGlsZTogKGVsZW1lbnQsIGF0dHJzKSA9PiB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IE1vZGFsVmlldyhzY29wZSwgZWxlbWVudCwgYXR0cnMpO1xuICAgICAgICAgICAgJG9uc2VuLmFkZE1vZGlmaWVyTWV0aG9kc0ZvckN1c3RvbUVsZW1lbnRzKG1vZGFsLCBlbGVtZW50KTtcblxuICAgICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIG1vZGFsKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLW1vZGFsJywgbW9kYWwpO1xuXG4gICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICRvbnNlbi5yZW1vdmVNb2RpZmllck1ldGhvZHMobW9kYWwpO1xuICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1tb2RhbCcsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIG1vZGFsID0gZWxlbWVudCA9IHNjb3BlID0gYXR0cnMgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHBvc3Q6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcbn0pKCk7XG4iLCIvKipcbiAqIEBlbGVtZW50IG9ucy1uYXZpZ2F0b3JcbiAqIEBleGFtcGxlXG4gKiA8b25zLW5hdmlnYXRvciBhbmltYXRpb249XCJzbGlkZVwiIHZhcj1cImFwcC5uYXZpXCI+XG4gKiAgIDxvbnMtcGFnZT5cbiAqICAgICA8b25zLXRvb2xiYXI+XG4gKiAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+VGl0bGU8L2Rpdj5cbiAqICAgICA8L29ucy10b29sYmFyPlxuICpcbiAqICAgICA8cCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiPlxuICogICAgICAgPG9ucy1idXR0b24gbW9kaWZpZXI9XCJsaWdodFwiIG5nLWNsaWNrPVwiYXBwLm5hdmkucHVzaFBhZ2UoJ3BhZ2UuaHRtbCcpO1wiPlB1c2g8L29ucy1idXR0b24+XG4gKiAgICAgPC9wPlxuICogICA8L29ucy1wYWdlPlxuICogPC9vbnMtbmF2aWdhdG9yPlxuICpcbiAqIDxvbnMtdGVtcGxhdGUgaWQ9XCJwYWdlLmh0bWxcIj5cbiAqICAgPG9ucy1wYWdlPlxuICogICAgIDxvbnMtdG9vbGJhcj5cbiAqICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5UaXRsZTwvZGl2PlxuICogICAgIDwvb25zLXRvb2xiYXI+XG4gKlxuICogICAgIDxwIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCI+XG4gKiAgICAgICA8b25zLWJ1dHRvbiBtb2RpZmllcj1cImxpZ2h0XCIgbmctY2xpY2s9XCJhcHAubmF2aS5wb3BQYWdlKCk7XCI+UG9wPC9vbnMtYnV0dG9uPlxuICogICAgIDwvcD5cbiAqICAgPC9vbnMtcGFnZT5cbiAqIDwvb25zLXRlbXBsYXRlPlxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1WYXJpYWJsZSBuYW1lIHRvIHJlZmVyIHRoaXMgbmF2aWdhdG9yLlsvZW5dXG4gKiAgW2phXeOBk+OBruODiuODk+OCsuODvOOCv+ODvOOCkuWPgueFp+OBmeOCi+OBn+OCgeOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wcmVwdXNoXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVwdXNoXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwcmVwdXNoXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcHJlcG9wXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVwb3BcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInByZXBvcFwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXBvc3RwdXNoXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwb3N0cHVzaFwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicG9zdHB1c2hcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wb3N0cG9wXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwb3N0cG9wXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwb3N0cG9wXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtaW5pdFxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJpbml0XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJpbml0XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtc2hvd1xuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJzaG93XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJzaG93XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtaGlkZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJoaWRlXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJoaWRlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtZGVzdHJveVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJkZXN0cm95XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJkZXN0cm95XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvblxuICogQHNpZ25hdHVyZSBvbihldmVudE5hbWUsIGxpc3RlbmVyKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd44GT44Gu44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb25jZVxuICogQHNpZ25hdHVyZSBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQncyBvbmx5IHRyaWdnZXJlZCBvbmNlLlsvZW5dXG4gKiAgW2phXeS4gOW6puOBoOOBkeWRvOOBs+WHuuOBleOCjOOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb2ZmXG4gKiBAc2lnbmF0dXJlIG9mZihldmVudE5hbWUsIFtsaXN0ZW5lcl0pXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHNwZWNpZmllZCBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgdHlwZSB3aWxsIGJlIHJlbW92ZWQuWy9lbl1cbiAqICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5YmK6Zmk44GX44G+44GZ44CC44KC44GX44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5oyH5a6a44GX44Gq44GL44Gj44Gf5aC05ZCI44Gr44Gv44CB44Gd44Gu44Kk44OZ44Oz44OI44Gr57SQ44Gl44GP5YWo44Gm44Gu44Kk44OZ44Oz44OI44Oq44K544OK44O844GM5YmK6Zmk44GV44KM44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3liYrpmaTjgZnjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBsYXN0UmVhZHkgPSB3aW5kb3cub25zLk5hdmlnYXRvckVsZW1lbnQucmV3cml0YWJsZXMucmVhZHk7XG4gIHdpbmRvdy5vbnMuTmF2aWdhdG9yRWxlbWVudC5yZXdyaXRhYmxlcy5yZWFkeSA9IG9ucy5fd2FpdERpcmV0aXZlSW5pdCgnb25zLW5hdmlnYXRvcicsIGxhc3RSZWFkeSk7XG5cbiAgdmFyIGxhc3RMaW5rID0gd2luZG93Lm9ucy5OYXZpZ2F0b3JFbGVtZW50LnJld3JpdGFibGVzLmxpbms7XG4gIHdpbmRvdy5vbnMuTmF2aWdhdG9yRWxlbWVudC5yZXdyaXRhYmxlcy5saW5rID0gZnVuY3Rpb24obmF2aWdhdG9yRWxlbWVudCwgdGFyZ2V0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciB2aWV3ID0gYW5ndWxhci5lbGVtZW50KG5hdmlnYXRvckVsZW1lbnQpLmRhdGEoJ29ucy1uYXZpZ2F0b3InKTtcbiAgICB2aWV3Ll9jb21waWxlQW5kTGluayh0YXJnZXQsIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgbGFzdExpbmsobmF2aWdhdG9yRWxlbWVudCwgdGFyZ2V0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgfSk7XG4gIH07XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNOYXZpZ2F0b3InLCBbJ05hdmlnYXRvclZpZXcnLCAnJG9uc2VuJywgZnVuY3Rpb24oTmF2aWdhdG9yVmlldywgJG9uc2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG5cbiAgICAgIC8vIE5PVEU6IFRoaXMgZWxlbWVudCBtdXN0IGNvZXhpc3RzIHdpdGggbmctY29udHJvbGxlci5cbiAgICAgIC8vIERvIG5vdCB1c2UgaXNvbGF0ZWQgc2NvcGUgYW5kIHRlbXBsYXRlJ3MgbmctdHJhbnNjbHVkZS5cbiAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLFxuICAgICAgc2NvcGU6IHRydWUsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByZTogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gbmV3IE5hdmlnYXRvclZpZXcoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKTtcblxuICAgICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIG5hdmlnYXRvcik7XG4gICAgICAgICAgICAkb25zZW4ucmVnaXN0ZXJFdmVudEhhbmRsZXJzKG5hdmlnYXRvciwgJ3ByZXB1c2ggcHJlcG9wIHBvc3RwdXNoIHBvc3Rwb3AgaW5pdCBzaG93IGhpZGUgZGVzdHJveScpO1xuXG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1uYXZpZ2F0b3InLCBuYXZpZ2F0b3IpO1xuXG4gICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIG5hdmlnYXRvci5fZXZlbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1uYXZpZ2F0b3InLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb3N0OiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmFuZ3VsYXIubW9kdWxlKCdvbnNlbicpXG4gIC52YWx1ZSgnTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yJywgb25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IpXG4gIC52YWx1ZSgnRmFkZVRyYW5zaXRpb25BbmltYXRvcicsIG9ucy5faW50ZXJuYWwuRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcilcbiAgLnZhbHVlKCdJT1NTbGlkZVRyYW5zaXRpb25BbmltYXRvcicsIG9ucy5faW50ZXJuYWwuSU9TU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IpXG4gIC52YWx1ZSgnTGlmdFRyYW5zaXRpb25BbmltYXRvcicsIG9ucy5faW50ZXJuYWwuTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcilcbiAgLnZhbHVlKCdOdWxsVHJhbnNpdGlvbkFuaW1hdG9yJywgb25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IpXG4gIC52YWx1ZSgnU2ltcGxlU2xpZGVUcmFuc2l0aW9uQW5pbWF0b3InLCBvbnMuX2ludGVybmFsLlNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmZhY3RvcnkoJ092ZXJsYXlTbGlkaW5nTWVudUFuaW1hdG9yJywgWydTbGlkaW5nTWVudUFuaW1hdG9yJywgZnVuY3Rpb24oU2xpZGluZ01lbnVBbmltYXRvcikge1xuXG4gICAgdmFyIE92ZXJsYXlTbGlkaW5nTWVudUFuaW1hdG9yID0gU2xpZGluZ01lbnVBbmltYXRvci5leHRlbmQoe1xuXG4gICAgICBfYmxhY2tNYXNrOiB1bmRlZmluZWQsXG5cbiAgICAgIF9pc1JpZ2h0OiBmYWxzZSxcbiAgICAgIF9lbGVtZW50OiBmYWxzZSxcbiAgICAgIF9tZW51UGFnZTogZmFsc2UsXG4gICAgICBfbWFpblBhZ2U6IGZhbHNlLFxuICAgICAgX3dpZHRoOiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gZWxlbWVudCBcIm9ucy1zbGlkaW5nLW1lbnVcIiBvciBcIm9ucy1zcGxpdC12aWV3XCIgZWxlbWVudFxuICAgICAgICogQHBhcmFtIHtqcUxpdGV9IG1haW5QYWdlXG4gICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gbWVudVBhZ2VcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy53aWR0aCBcIndpZHRoXCIgc3R5bGUgdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5pc1JpZ2h0XG4gICAgICAgKi9cbiAgICAgIHNldHVwOiBmdW5jdGlvbihlbGVtZW50LCBtYWluUGFnZSwgbWVudVBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuX3dpZHRoID0gb3B0aW9ucy53aWR0aCB8fCAnOTAlJztcbiAgICAgICAgdGhpcy5faXNSaWdodCA9ICEhb3B0aW9ucy5pc1JpZ2h0O1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fbWFpblBhZ2UgPSBtYWluUGFnZTtcbiAgICAgICAgdGhpcy5fbWVudVBhZ2UgPSBtZW51UGFnZTtcblxuICAgICAgICBtZW51UGFnZS5jc3MoJ2JveC1zaGFkb3cnLCAnMHB4IDAgMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpJyk7XG4gICAgICAgIG1lbnVQYWdlLmNzcyh7XG4gICAgICAgICAgd2lkdGg6IG9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICAgIHpJbmRleDogMlxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaXggZm9yIHRyYW5zcGFyZW50IG1lbnUgcGFnZSBvbiBpT1M4LlxuICAgICAgICBtZW51UGFnZS5jc3MoJy13ZWJraXQtdHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpJyk7XG5cbiAgICAgICAgbWFpblBhZ2UuY3NzKHt6SW5kZXg6IDF9KTtcblxuICAgICAgICBpZiAodGhpcy5faXNSaWdodCkge1xuICAgICAgICAgIG1lbnVQYWdlLmNzcyh7XG4gICAgICAgICAgICByaWdodDogJy0nICsgb3B0aW9ucy53aWR0aCxcbiAgICAgICAgICAgIGxlZnQ6ICdhdXRvJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lbnVQYWdlLmNzcyh7XG4gICAgICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgbGVmdDogJy0nICsgb3B0aW9ucy53aWR0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYmxhY2tNYXNrID0gYW5ndWxhci5lbGVtZW50KCc8ZGl2PjwvZGl2PicpLmNzcyh7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnYmxhY2snLFxuICAgICAgICAgIHRvcDogJzBweCcsXG4gICAgICAgICAgbGVmdDogJzBweCcsXG4gICAgICAgICAgcmlnaHQ6ICcwcHgnLFxuICAgICAgICAgIGJvdHRvbTogJzBweCcsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICAgIHpJbmRleDogMFxuICAgICAgICB9KTtcblxuICAgICAgICBlbGVtZW50LnByZXBlbmQodGhpcy5fYmxhY2tNYXNrKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLndpZHRoXG4gICAgICAgKi9cbiAgICAgIG9uUmVzaXplZDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICB0aGlzLl9tZW51UGFnZS5jc3MoJ3dpZHRoJywgb3B0aW9ucy53aWR0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzUmlnaHQpIHtcbiAgICAgICAgICB0aGlzLl9tZW51UGFnZS5jc3Moe1xuICAgICAgICAgICAgcmlnaHQ6ICctJyArIG9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgICBsZWZ0OiAnYXV0bydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9tZW51UGFnZS5jc3Moe1xuICAgICAgICAgICAgcmlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGxlZnQ6ICctJyArIG9wdGlvbnMud2lkdGhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmlzT3BlbmVkKSB7XG4gICAgICAgICAgdmFyIG1heCA9IHRoaXMuX21lbnVQYWdlWzBdLmNsaWVudFdpZHRoO1xuICAgICAgICAgIHZhciBtZW51U3R5bGUgPSB0aGlzLl9nZW5lcmF0ZU1lbnVQYWdlU3R5bGUobWF4KTtcbiAgICAgICAgICBhbmltaXQodGhpcy5fbWVudVBhZ2VbMF0pLnF1ZXVlKG1lbnVTdHlsZSkucGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqL1xuICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9ibGFja01hc2spIHtcbiAgICAgICAgICB0aGlzLl9ibGFja01hc2sucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy5fYmxhY2tNYXNrID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21haW5QYWdlLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMuX21lbnVQYWdlLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuX21haW5QYWdlID0gdGhpcy5fbWVudVBhZ2UgPSBudWxsO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAgICAgKi9cbiAgICAgIG9wZW5NZW51OiBmdW5jdGlvbihjYWxsYmFjaywgaW5zdGFudCkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnN0YW50ID09PSB0cnVlID8gMC4wIDogdGhpcy5kdXJhdGlvbjtcbiAgICAgICAgdmFyIGRlbGF5ID0gaW5zdGFudCA9PT0gdHJ1ZSA/IDAuMCA6IHRoaXMuZGVsYXk7XG5cbiAgICAgICAgdGhpcy5fbWVudVBhZ2UuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgIHRoaXMuX2JsYWNrTWFzay5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuICAgICAgICB2YXIgbWF4ID0gdGhpcy5fbWVudVBhZ2VbMF0uY2xpZW50V2lkdGg7XG4gICAgICAgIHZhciBtZW51U3R5bGUgPSB0aGlzLl9nZW5lcmF0ZU1lbnVQYWdlU3R5bGUobWF4KTtcbiAgICAgICAgdmFyIG1haW5QYWdlU3R5bGUgPSB0aGlzLl9nZW5lcmF0ZU1haW5QYWdlU3R5bGUobWF4KTtcblxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgYW5pbWl0KHRoaXMuX21haW5QYWdlWzBdKVxuICAgICAgICAgICAgLndhaXQoZGVsYXkpXG4gICAgICAgICAgICAucXVldWUobWFpblBhZ2VTdHlsZSwge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBsYXkoKTtcblxuICAgICAgICAgIGFuaW1pdCh0aGlzLl9tZW51UGFnZVswXSlcbiAgICAgICAgICAgIC53YWl0KGRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZSwge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGxheSgpO1xuXG4gICAgICAgIH0uYmluZCh0aGlzKSwgMTAwMCAvIDYwKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5zdGFudFxuICAgICAgICovXG4gICAgICBjbG9zZU1lbnU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBpbnN0YW50KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGluc3RhbnQgPT09IHRydWUgPyAwLjAgOiB0aGlzLmR1cmF0aW9uO1xuICAgICAgICB2YXIgZGVsYXkgPSBpbnN0YW50ID09PSB0cnVlID8gMC4wIDogdGhpcy5kZWxheTtcblxuICAgICAgICB0aGlzLl9ibGFja01hc2suY3NzKHtkaXNwbGF5OiAnYmxvY2snfSk7XG5cbiAgICAgICAgdmFyIG1lbnVQYWdlU3R5bGUgPSB0aGlzLl9nZW5lcmF0ZU1lbnVQYWdlU3R5bGUoMCk7XG4gICAgICAgIHZhciBtYWluUGFnZVN0eWxlID0gdGhpcy5fZ2VuZXJhdGVNYWluUGFnZVN0eWxlKDApO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICBhbmltaXQodGhpcy5fbWFpblBhZ2VbMF0pXG4gICAgICAgICAgICAud2FpdChkZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZShtYWluUGFnZVN0eWxlLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICAgIHRoaXMuX21lbnVQYWdlLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5wbGF5KCk7XG5cbiAgICAgICAgICBhbmltaXQodGhpcy5fbWVudVBhZ2VbMF0pXG4gICAgICAgICAgICAud2FpdChkZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZShtZW51UGFnZVN0eWxlLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5wbGF5KCk7XG5cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwIC8gNjApO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGlzdGFuY2VcbiAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLm1heERpc3RhbmNlXG4gICAgICAgKi9cbiAgICAgIHRyYW5zbGF0ZU1lbnU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblxuICAgICAgICB0aGlzLl9tZW51UGFnZS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgdGhpcy5fYmxhY2tNYXNrLmNzcyh7ZGlzcGxheTogJ2Jsb2NrJ30pO1xuXG4gICAgICAgIHZhciBtZW51UGFnZVN0eWxlID0gdGhpcy5fZ2VuZXJhdGVNZW51UGFnZVN0eWxlKE1hdGgubWluKG9wdGlvbnMubWF4RGlzdGFuY2UsIG9wdGlvbnMuZGlzdGFuY2UpKTtcbiAgICAgICAgdmFyIG1haW5QYWdlU3R5bGUgPSB0aGlzLl9nZW5lcmF0ZU1haW5QYWdlU3R5bGUoTWF0aC5taW4ob3B0aW9ucy5tYXhEaXN0YW5jZSwgb3B0aW9ucy5kaXN0YW5jZSkpO1xuICAgICAgICBkZWxldGUgbWFpblBhZ2VTdHlsZS5vcGFjaXR5O1xuXG4gICAgICAgIGFuaW1pdCh0aGlzLl9tZW51UGFnZVswXSlcbiAgICAgICAgICAucXVldWUobWVudVBhZ2VTdHlsZSlcbiAgICAgICAgICAucGxheSgpO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhtYWluUGFnZVN0eWxlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYW5pbWl0KHRoaXMuX21haW5QYWdlWzBdKVxuICAgICAgICAgICAgLnF1ZXVlKG1haW5QYWdlU3R5bGUpXG4gICAgICAgICAgICAucGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBfZ2VuZXJhdGVNZW51UGFnZVN0eWxlOiBmdW5jdGlvbihkaXN0YW5jZSkge1xuICAgICAgICB2YXIgeCA9IHRoaXMuX2lzUmlnaHQgPyAtZGlzdGFuY2UgOiBkaXN0YW5jZTtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgnICsgeCArICdweCwgMCwgMCknO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgJ2JveC1zaGFkb3cnOiBkaXN0YW5jZSA9PT0gMCA/ICdub25lJyA6ICcwcHggMCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiknXG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICBfZ2VuZXJhdGVNYWluUGFnZVN0eWxlOiBmdW5jdGlvbihkaXN0YW5jZSkge1xuICAgICAgICB2YXIgbWF4ID0gdGhpcy5fbWVudVBhZ2VbMF0uY2xpZW50V2lkdGg7XG4gICAgICAgIHZhciBvcGFjaXR5ID0gMSAtICgwLjEgKiBkaXN0YW5jZSAvIG1heCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcGFjaXR5OiBvcGFjaXR5XG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVybGF5U2xpZGluZ01lbnVBbmltYXRvcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE92ZXJsYXlTbGlkaW5nTWVudUFuaW1hdG9yO1xuICB9XSk7XG5cbn0pKCk7XG4iLCIvKipcbiAqIEBlbGVtZW50IG9ucy1wYWdlXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZhclxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1WYXJpYWJsZSBuYW1lIHRvIHJlZmVyIHRoaXMgcGFnZS5bL2VuXVxuICogICBbamFd44GT44Gu44Oa44O844K444KS5Y+C54Wn44GZ44KL44Gf44KB44Gu5ZCN5YmN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgbmctaW5maW5pdGUtc2Nyb2xsXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVBhdGggb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGluZmluaXRlIHNjcm9sbGluZy4gVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gJHNjb3BlLiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgYSBkb25lIGNhbGxiYWNrIHRoYXQgbXVzdCBiZSBjYWxsZWQgd2hlbiBpdCdzIGZpbmlzaGVkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbi1kZXZpY2UtYmFjay1idXR0b25cbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIGJhY2sgYnV0dG9uIGlzIHByZXNzZWQuWy9lbl1cbiAqICAgW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OBjOaKvOOBleOCjOOBn+aZguOBruaMmeWLleOCkuioreWumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG5nLWRldmljZS1iYWNrLWJ1dHRvblxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aXRoIGFuIEFuZ3VsYXJKUyBleHByZXNzaW9uIHdoZW4gdGhlIGJhY2sgYnV0dG9uIGlzIHByZXNzZWQuWy9lbl1cbiAqICAgW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OBjOaKvOOBleOCjOOBn+aZguOBruaMmeWLleOCkuioreWumuOBp+OBjeOBvuOBmeOAgkFuZ3VsYXJKU+OBrmV4cHJlc3Npb27jgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtaW5pdFxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwiaW5pdFwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwiaW5pdFwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXNob3dcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcInNob3dcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInNob3dcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1oaWRlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJoaWRlXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJoaWRlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtZGVzdHJveVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwiZGVzdHJveVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwiZGVzdHJveVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmRpcmVjdGl2ZSgnb25zUGFnZScsIFsnJG9uc2VuJywgJ1BhZ2VWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBQYWdlVmlldykge1xuXG4gICAgZnVuY3Rpb24gZmlyZVBhZ2VJbml0RXZlbnQoZWxlbWVudCkge1xuICAgICAgLy8gVE9ETzogcmVtb3ZlIGRpcnR5IGZpeFxuICAgICAgdmFyIGkgPSAwLCBmID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChpKysgPCAxNSkgIHtcbiAgICAgICAgICBpZiAoaXNBdHRhY2hlZChlbGVtZW50KSkge1xuICAgICAgICAgICAgJG9uc2VuLmZpcmVDb21wb25lbnRFdmVudChlbGVtZW50LCAnaW5pdCcpO1xuICAgICAgICAgICAgZmlyZUFjdHVhbFBhZ2VJbml0RXZlbnQoZWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpID4gMTApIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmLCAxMDAwIC8gNjApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWwgdG8gZmlyZSBcInBhZ2Vpbml0XCIgZXZlbnQuIEF0dGFjaCBcIm9ucy1wYWdlXCIgZWxlbWVudCB0byB0aGUgZG9jdW1lbnQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGYoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaXJlQWN0dWFsUGFnZUluaXRFdmVudChlbGVtZW50KSB7XG4gICAgICB2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO1xuICAgICAgZXZlbnQuaW5pdEV2ZW50KCdwYWdlaW5pdCcsIHRydWUsIHRydWUpO1xuICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0F0dGFjaGVkKGVsZW1lbnQpIHtcbiAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnROb2RlID8gaXNBdHRhY2hlZChlbGVtZW50LnBhcmVudE5vZGUpIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG5cbiAgICAgIC8vIE5PVEU6IFRoaXMgZWxlbWVudCBtdXN0IGNvZXhpc3RzIHdpdGggbmctY29udHJvbGxlci5cbiAgICAgIC8vIERvIG5vdCB1c2UgaXNvbGF0ZWQgc2NvcGUgYW5kIHRlbXBsYXRlJ3MgbmctdHJhbnNjbHVkZS5cbiAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLFxuICAgICAgc2NvcGU6IHRydWUsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJlOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHZhciBwYWdlID0gbmV3IFBhZ2VWaWV3KHNjb3BlLCBlbGVtZW50LCBhdHRycyk7XG5cbiAgICAgICAgICAgICRvbnNlbi5kZWNsYXJlVmFyQXR0cmlidXRlKGF0dHJzLCBwYWdlKTtcbiAgICAgICAgICAgICRvbnNlbi5yZWdpc3RlckV2ZW50SGFuZGxlcnMocGFnZSwgJ2luaXQgc2hvdyBoaWRlIGRlc3Ryb3knKTtcblxuICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdvbnMtcGFnZScsIHBhZ2UpO1xuICAgICAgICAgICAgJG9uc2VuLmFkZE1vZGlmaWVyTWV0aG9kc0ZvckN1c3RvbUVsZW1lbnRzKHBhZ2UsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ19zY29wZScsIHNjb3BlKTtcblxuICAgICAgICAgICAgJG9uc2VuLmNsZWFuZXIub25EZXN0cm95KHNjb3BlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcGFnZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAkb25zZW4ucmVtb3ZlTW9kaWZpZXJNZXRob2RzKHBhZ2UpO1xuICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1wYWdlJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdfc2NvcGUnLCB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICAgICRvbnNlbi5jbGVhckNvbXBvbmVudCh7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBzY29wZTogc2NvcGUsXG4gICAgICAgICAgICAgICAgYXR0cnM6IGF0dHJzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBzY29wZSA9IGVsZW1lbnQgPSBhdHRycyA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgcG9zdDogZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgICBmaXJlUGFnZUluaXRFdmVudChlbGVtZW50WzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xufSkoKTtcbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLXBvcG92ZXJcbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgdmFyXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dVmFyaWFibGUgbmFtZSB0byByZWZlciB0aGlzIHBvcG92ZXIuWy9lbl1cbiAqICBbamFd44GT44Gu44Od44OD44OX44Kq44O844OQ44O844KS5Y+C54Wn44GZ44KL44Gf44KB44Gu5ZCN5YmN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXByZXNob3dcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcInByZXNob3dcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInByZXNob3dcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wcmVoaWRlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVoaWRlXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwcmVoaWRlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcG9zdHNob3dcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcInBvc3RzaG93XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwb3N0c2hvd1wi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXBvc3RoaWRlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwb3N0aGlkZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicG9zdGhpZGVcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1kZXN0cm95XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJkZXN0cm95XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJkZXN0cm95XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvblxuICogQHNpZ25hdHVyZSBvbihldmVudE5hbWUsIGxpc3RlbmVyKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd44GT44Gu44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb25jZVxuICogQHNpZ25hdHVyZSBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQncyBvbmx5IHRyaWdnZXJlZCBvbmNlLlsvZW5dXG4gKiAgW2phXeS4gOW6puOBoOOBkeWRvOOBs+WHuuOBleOCjOOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb2ZmXG4gKiBAc2lnbmF0dXJlIG9mZihldmVudE5hbWUsIFtsaXN0ZW5lcl0pXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHNwZWNpZmllZCBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgdHlwZSB3aWxsIGJlIHJlbW92ZWQuWy9lbl1cbiAqICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5YmK6Zmk44GX44G+44GZ44CC44KC44GX44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5oyH5a6a44GX44Gq44GL44Gj44Gf5aC05ZCI44Gr44Gv44CB44Gd44Gu44Kk44OZ44Oz44OI44Gr57SQ44Gl44GP5YWo44Gm44Gu44Kk44OZ44Oz44OI44Oq44K544OK44O844GM5YmK6Zmk44GV44KM44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3liYrpmaTjgZnjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbihmdW5jdGlvbigpe1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpO1xuXG4gIG1vZHVsZS5kaXJlY3RpdmUoJ29uc1BvcG92ZXInLCBbJyRvbnNlbicsICdQb3BvdmVyVmlldycsIGZ1bmN0aW9uKCRvbnNlbiwgUG9wb3ZlclZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgc2NvcGU6IHRydWUsXG4gICAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRycykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByZTogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG5cbiAgICAgICAgICAgIHZhciBwb3BvdmVyID0gbmV3IFBvcG92ZXJWaWV3KHNjb3BlLCBlbGVtZW50LCBhdHRycyk7XG5cbiAgICAgICAgICAgICRvbnNlbi5kZWNsYXJlVmFyQXR0cmlidXRlKGF0dHJzLCBwb3BvdmVyKTtcbiAgICAgICAgICAgICRvbnNlbi5yZWdpc3RlckV2ZW50SGFuZGxlcnMocG9wb3ZlciwgJ3ByZXNob3cgcHJlaGlkZSBwb3N0c2hvdyBwb3N0aGlkZSBkZXN0cm95Jyk7XG4gICAgICAgICAgICAkb25zZW4uYWRkTW9kaWZpZXJNZXRob2RzRm9yQ3VzdG9tRWxlbWVudHMocG9wb3ZlciwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXBvcG92ZXInLCBwb3BvdmVyKTtcblxuICAgICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBwb3BvdmVyLl9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICRvbnNlbi5yZW1vdmVNb2RpZmllck1ldGhvZHMocG9wb3Zlcik7XG4gICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXBvcG92ZXInLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBwb3N0OiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCkge1xuICAgICAgICAgICAgJG9uc2VuLmZpcmVDb21wb25lbnRFdmVudChlbGVtZW50WzBdLCAnaW5pdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5hbmd1bGFyLm1vZHVsZSgnb25zZW4nKVxuICAudmFsdWUoJ1BvcG92ZXJBbmltYXRvcicsIG9ucy5faW50ZXJuYWwuUG9wb3ZlckFuaW1hdG9yKVxuICAudmFsdWUoJ0ZhZGVQb3BvdmVyQW5pbWF0b3InLCBvbnMuX2ludGVybmFsLkZhZGVQb3BvdmVyQW5pbWF0b3IpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtcHVsbC1ob29rXG4gKiBAZXhhbXBsZVxuICogPHNjcmlwdD5cbiAqICAgb25zLmJvb3RzdHJhcCgpXG4gKlxuICogICAuY29udHJvbGxlcignTXlDb250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlLCAkdGltZW91dCkge1xuICogICAgICRzY29wZS5pdGVtcyA9IFszLCAyICwxXTtcbiAqXG4gKiAgICAgJHNjb3BlLmxvYWQgPSBmdW5jdGlvbigkZG9uZSkge1xuICogICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICRzY29wZS5pdGVtcy51bnNoaWZ0KCRzY29wZS5pdGVtcy5sZW5ndGggKyAxKTtcbiAqICAgICAgICAgJGRvbmUoKTtcbiAqICAgICAgIH0sIDEwMDApO1xuICogICAgIH07XG4gKiAgIH0pO1xuICogPC9zY3JpcHQ+XG4gKlxuICogPG9ucy1wYWdlIG5nLWNvbnRyb2xsZXI9XCJNeUNvbnRyb2xsZXJcIj5cbiAqICAgPG9ucy1wdWxsLWhvb2sgdmFyPVwibG9hZGVyXCIgbmctYWN0aW9uPVwibG9hZCgkZG9uZSlcIj5cbiAqICAgICA8c3BhbiBuZy1zd2l0Y2g9XCJsb2FkZXIuc3RhdGVcIj5cbiAqICAgICAgIDxzcGFuIG5nLXN3aXRjaC13aGVuPVwiaW5pdGlhbFwiPlB1bGwgZG93biB0byByZWZyZXNoPC9zcGFuPlxuICogICAgICAgPHNwYW4gbmctc3dpdGNoLXdoZW49XCJwcmVhY3Rpb25cIj5SZWxlYXNlIHRvIHJlZnJlc2g8L3NwYW4+XG4gKiAgICAgICA8c3BhbiBuZy1zd2l0Y2gtd2hlbj1cImFjdGlvblwiPkxvYWRpbmcgZGF0YS4gUGxlYXNlIHdhaXQuLi48L3NwYW4+XG4gKiAgICAgPC9zcGFuPlxuICogICA8L29ucy1wdWxsLWhvb2s+XG4gKiAgIDxvbnMtbGlzdD5cbiAqICAgICA8b25zLWxpc3QtaXRlbSBuZy1yZXBlYXQ9XCJpdGVtIGluIGl0ZW1zXCI+XG4gKiAgICAgICBJdGVtICN7eyBpdGVtIH19XG4gKiAgICAgPC9vbnMtbGlzdC1pdGVtPlxuICogICA8L29ucy1saXN0PlxuICogPC9vbnMtcGFnZT5cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgdmFyXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVZhcmlhYmxlIG5hbWUgdG8gcmVmZXIgdGhpcyBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXeOBk+OBruOCs+ODs+ODneODvOODjeODs+ODiOOCkuWPgueFp+OBmeOCi+OBn+OCgeOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG5nLWFjdGlvblxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVXNlIHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIHBhZ2UgaXMgcHVsbGVkIGRvd24uIEEgPGNvZGU+JGRvbmU8L2NvZGU+IGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB0byB0ZWxsIHRoZSBjb21wb25lbnQgdGhhdCB0aGUgYWN0aW9uIGlzIGNvbXBsZXRlZC5bL2VuXVxuICogICBbamFdcHVsbCBkb3du44GX44Gf44Go44GN44Gu5oyv44KL6Iie44GE44KS5oyH5a6a44GX44G+44GZ44CC44Ki44Kv44K344On44Oz44GM5a6M5LqG44GX44Gf5pmC44Gr44GvPGNvZGU+JGRvbmU8L2NvZGU+6Zai5pWw44KS5ZG844Gz5Ye644GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLWNoYW5nZXN0YXRlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJjaGFuZ2VzdGF0ZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwiY2hhbmdlc3RhdGVcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uXG4gKiBAc2lnbmF0dXJlIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lci5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvbmNlXG4gKiBAc2lnbmF0dXJlIG9uY2UoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCdzIG9ubHkgdHJpZ2dlcmVkIG9uY2UuWy9lbl1cbiAqICBbamFd5LiA5bqm44Gg44GR5ZG844Gz5Ye644GV44KM44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvZmZcbiAqIEBzaWduYXR1cmUgb2ZmKGV2ZW50TmFtZSwgW2xpc3RlbmVyXSlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1SZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuIElmIHRoZSBsaXN0ZW5lciBpcyBub3Qgc3BlY2lmaWVkIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCB0eXBlIHdpbGwgYmUgcmVtb3ZlZC5bL2VuXVxuICogIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLliYrpmaTjgZfjgb7jgZnjgILjgoLjgZfjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLmjIflrprjgZfjgarjgYvjgaPjgZ/loLTlkIjjgavjga/jgIHjgZ3jga7jgqTjg5njg7Pjg4jjgavntJDjgaXjgY/lhajjgabjga7jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgYzliYrpmaTjgZXjgozjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeWJiumZpOOBmeOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIFB1bGwgaG9vayBkaXJlY3RpdmUuXG4gICAqL1xuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc1B1bGxIb29rJywgWyckb25zZW4nLCAnUHVsbEhvb2tWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBQdWxsSG9va1ZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgc2NvcGU6IHRydWUsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJlOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHZhciBwdWxsSG9vayA9IG5ldyBQdWxsSG9va1ZpZXcoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKTtcblxuICAgICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIHB1bGxIb29rKTtcbiAgICAgICAgICAgICRvbnNlbi5yZWdpc3RlckV2ZW50SGFuZGxlcnMocHVsbEhvb2ssICdjaGFuZ2VzdGF0ZSBkZXN0cm95Jyk7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1wdWxsLWhvb2snLCBwdWxsSG9vayk7XG5cbiAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcHVsbEhvb2suX2V2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdvbnMtcHVsbC1ob29rJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgc2NvcGUgPSBlbGVtZW50ID0gYXR0cnMgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb3N0OiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCkge1xuICAgICAgICAgICAgJG9uc2VuLmZpcmVDb21wb25lbnRFdmVudChlbGVtZW50WzBdLCAnaW5pdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG5cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpO1xuXG4gIG1vZHVsZS5mYWN0b3J5KCdQdXNoU2xpZGluZ01lbnVBbmltYXRvcicsIFsnU2xpZGluZ01lbnVBbmltYXRvcicsIGZ1bmN0aW9uKFNsaWRpbmdNZW51QW5pbWF0b3IpIHtcblxuICAgIHZhciBQdXNoU2xpZGluZ01lbnVBbmltYXRvciA9IFNsaWRpbmdNZW51QW5pbWF0b3IuZXh0ZW5kKHtcblxuICAgICAgX2lzUmlnaHQ6IGZhbHNlLFxuICAgICAgX2VsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgICAgIF9tZW51UGFnZTogdW5kZWZpbmVkLFxuICAgICAgX21haW5QYWdlOiB1bmRlZmluZWQsXG4gICAgICBfd2lkdGg6IHVuZGVmaW5lZCxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gZWxlbWVudCBcIm9ucy1zbGlkaW5nLW1lbnVcIiBvciBcIm9ucy1zcGxpdC12aWV3XCIgZWxlbWVudFxuICAgICAgICogQHBhcmFtIHtqcUxpdGV9IG1haW5QYWdlXG4gICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gbWVudVBhZ2VcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy53aWR0aCBcIndpZHRoXCIgc3R5bGUgdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5pc1JpZ2h0XG4gICAgICAgKi9cbiAgICAgIHNldHVwOiBmdW5jdGlvbihlbGVtZW50LCBtYWluUGFnZSwgbWVudVBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX21haW5QYWdlID0gbWFpblBhZ2U7XG4gICAgICAgIHRoaXMuX21lbnVQYWdlID0gbWVudVBhZ2U7XG5cbiAgICAgICAgdGhpcy5faXNSaWdodCA9ICEhb3B0aW9ucy5pc1JpZ2h0O1xuICAgICAgICB0aGlzLl93aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgJzkwJSc7XG5cbiAgICAgICAgbWVudVBhZ2UuY3NzKHtcbiAgICAgICAgICB3aWR0aDogb3B0aW9ucy53aWR0aCxcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzUmlnaHQpIHtcbiAgICAgICAgICBtZW51UGFnZS5jc3Moe1xuICAgICAgICAgICAgcmlnaHQ6ICctJyArIG9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgICBsZWZ0OiAnYXV0bydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZW51UGFnZS5jc3Moe1xuICAgICAgICAgICAgcmlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGxlZnQ6ICctJyArIG9wdGlvbnMud2lkdGhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMud2lkdGhcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmlzUmlnaHRcbiAgICAgICAqL1xuICAgICAgb25SZXNpemVkOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX21lbnVQYWdlLmNzcygnd2lkdGgnLCBvcHRpb25zLndpZHRoKTtcblxuICAgICAgICBpZiAodGhpcy5faXNSaWdodCkge1xuICAgICAgICAgIHRoaXMuX21lbnVQYWdlLmNzcyh7XG4gICAgICAgICAgICByaWdodDogJy0nICsgb3B0aW9ucy53aWR0aCxcbiAgICAgICAgICAgIGxlZnQ6ICdhdXRvJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX21lbnVQYWdlLmNzcyh7XG4gICAgICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgbGVmdDogJy0nICsgb3B0aW9ucy53aWR0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaXNPcGVuZWQpIHtcbiAgICAgICAgICB2YXIgbWF4ID0gdGhpcy5fbWVudVBhZ2VbMF0uY2xpZW50V2lkdGg7XG4gICAgICAgICAgdmFyIG1haW5QYWdlVHJhbnNmb3JtID0gdGhpcy5fZ2VuZXJhdGVBYm92ZVBhZ2VUcmFuc2Zvcm0obWF4KTtcbiAgICAgICAgICB2YXIgbWVudVBhZ2VTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKG1heCk7XG5cbiAgICAgICAgICBhbmltaXQodGhpcy5fbWFpblBhZ2VbMF0pLnF1ZXVlKHt0cmFuc2Zvcm06IG1haW5QYWdlVHJhbnNmb3JtfSkucGxheSgpO1xuICAgICAgICAgIGFuaW1pdCh0aGlzLl9tZW51UGFnZVswXSkucXVldWUobWVudVBhZ2VTdHlsZSkucGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqL1xuICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX21haW5QYWdlLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMuX21lbnVQYWdlLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuX21haW5QYWdlID0gdGhpcy5fbWVudVBhZ2UgPSBudWxsO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAgICAgKi9cbiAgICAgIG9wZW5NZW51OiBmdW5jdGlvbihjYWxsYmFjaywgaW5zdGFudCkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnN0YW50ID09PSB0cnVlID8gMC4wIDogdGhpcy5kdXJhdGlvbjtcbiAgICAgICAgdmFyIGRlbGF5ID0gaW5zdGFudCA9PT0gdHJ1ZSA/IDAuMCA6IHRoaXMuZGVsYXk7XG5cbiAgICAgICAgdGhpcy5fbWVudVBhZ2UuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG5cbiAgICAgICAgdmFyIG1heCA9IHRoaXMuX21lbnVQYWdlWzBdLmNsaWVudFdpZHRoO1xuXG4gICAgICAgIHZhciBhYm92ZVRyYW5zZm9ybSA9IHRoaXMuX2dlbmVyYXRlQWJvdmVQYWdlVHJhbnNmb3JtKG1heCk7XG4gICAgICAgIHZhciBiZWhpbmRTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKG1heCk7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcblxuICAgICAgICAgIGFuaW1pdCh0aGlzLl9tYWluUGFnZVswXSlcbiAgICAgICAgICAgIC53YWl0KGRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBhYm92ZVRyYW5zZm9ybVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBsYXkoKTtcblxuICAgICAgICAgIGFuaW1pdCh0aGlzLl9tZW51UGFnZVswXSlcbiAgICAgICAgICAgIC53YWl0KGRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKGJlaGluZFN0eWxlLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5wbGF5KCk7XG5cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwIC8gNjApO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAgICAgKi9cbiAgICAgIGNsb3NlTWVudTogZnVuY3Rpb24oY2FsbGJhY2ssIGluc3RhbnQpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5zdGFudCA9PT0gdHJ1ZSA/IDAuMCA6IHRoaXMuZHVyYXRpb247XG4gICAgICAgIHZhciBkZWxheSA9IGluc3RhbnQgPT09IHRydWUgPyAwLjAgOiB0aGlzLmRlbGF5O1xuXG4gICAgICAgIHZhciBhYm92ZVRyYW5zZm9ybSA9IHRoaXMuX2dlbmVyYXRlQWJvdmVQYWdlVHJhbnNmb3JtKDApO1xuICAgICAgICB2YXIgYmVoaW5kU3R5bGUgPSB0aGlzLl9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZSgwKTtcblxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgYW5pbWl0KHRoaXMuX21haW5QYWdlWzBdKVxuICAgICAgICAgICAgLndhaXQoZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06IGFib3ZlVHJhbnNmb3JtXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICAgIHRoaXMuX21lbnVQYWdlLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5wbGF5KCk7XG5cbiAgICAgICAgICBhbmltaXQodGhpcy5fbWVudVBhZ2VbMF0pXG4gICAgICAgICAgICAud2FpdChkZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZShiZWhpbmRTdHlsZSwge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBsYXkoKTtcblxuICAgICAgICB9LmJpbmQodGhpcyksIDEwMDAgLyA2MCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kaXN0YW5jZVxuICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMubWF4RGlzdGFuY2VcbiAgICAgICAqL1xuICAgICAgdHJhbnNsYXRlTWVudTogZnVuY3Rpb24ob3B0aW9ucykge1xuXG4gICAgICAgIHRoaXMuX21lbnVQYWdlLmNzcygnZGlzcGxheScsICdibG9jaycpO1xuXG4gICAgICAgIHZhciBhYm92ZVRyYW5zZm9ybSA9IHRoaXMuX2dlbmVyYXRlQWJvdmVQYWdlVHJhbnNmb3JtKE1hdGgubWluKG9wdGlvbnMubWF4RGlzdGFuY2UsIG9wdGlvbnMuZGlzdGFuY2UpKTtcbiAgICAgICAgdmFyIGJlaGluZFN0eWxlID0gdGhpcy5fZ2VuZXJhdGVCZWhpbmRQYWdlU3R5bGUoTWF0aC5taW4ob3B0aW9ucy5tYXhEaXN0YW5jZSwgb3B0aW9ucy5kaXN0YW5jZSkpO1xuXG4gICAgICAgIGFuaW1pdCh0aGlzLl9tYWluUGFnZVswXSlcbiAgICAgICAgICAucXVldWUoe3RyYW5zZm9ybTogYWJvdmVUcmFuc2Zvcm19KVxuICAgICAgICAgIC5wbGF5KCk7XG5cbiAgICAgICAgYW5pbWl0KHRoaXMuX21lbnVQYWdlWzBdKVxuICAgICAgICAgIC5xdWV1ZShiZWhpbmRTdHlsZSlcbiAgICAgICAgICAucGxheSgpO1xuICAgICAgfSxcblxuICAgICAgX2dlbmVyYXRlQWJvdmVQYWdlVHJhbnNmb3JtOiBmdW5jdGlvbihkaXN0YW5jZSkge1xuICAgICAgICB2YXIgeCA9IHRoaXMuX2lzUmlnaHQgPyAtZGlzdGFuY2UgOiBkaXN0YW5jZTtcbiAgICAgICAgdmFyIGFib3ZlVHJhbnNmb3JtID0gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJ3B4LCAwLCAwKSc7XG5cbiAgICAgICAgcmV0dXJuIGFib3ZlVHJhbnNmb3JtO1xuICAgICAgfSxcblxuICAgICAgX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlOiBmdW5jdGlvbihkaXN0YW5jZSkge1xuICAgICAgICB2YXIgYmVoaW5kWCA9IHRoaXMuX2lzUmlnaHQgPyAtZGlzdGFuY2UgOiBkaXN0YW5jZTtcbiAgICAgICAgdmFyIGJlaGluZFRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgnICsgYmVoaW5kWCArICdweCwgMCwgMCknO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiBiZWhpbmRUcmFuc2Zvcm1cbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFB1c2hTbGlkaW5nTWVudUFuaW1hdG9yKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHVzaFNsaWRpbmdNZW51QW5pbWF0b3I7XG4gIH1dKTtcblxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmZhY3RvcnkoJ1JldmVhbFNsaWRpbmdNZW51QW5pbWF0b3InLCBbJ1NsaWRpbmdNZW51QW5pbWF0b3InLCBmdW5jdGlvbihTbGlkaW5nTWVudUFuaW1hdG9yKSB7XG5cbiAgICB2YXIgUmV2ZWFsU2xpZGluZ01lbnVBbmltYXRvciA9IFNsaWRpbmdNZW51QW5pbWF0b3IuZXh0ZW5kKHtcblxuICAgICAgX2JsYWNrTWFzazogdW5kZWZpbmVkLFxuXG4gICAgICBfaXNSaWdodDogZmFsc2UsXG5cbiAgICAgIF9tZW51UGFnZTogdW5kZWZpbmVkLFxuICAgICAgX2VsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgICAgIF9tYWluUGFnZTogdW5kZWZpbmVkLFxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7anFMaXRlfSBlbGVtZW50IFwib25zLXNsaWRpbmctbWVudVwiIG9yIFwib25zLXNwbGl0LXZpZXdcIiBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gbWFpblBhZ2VcbiAgICAgICAqIEBwYXJhbSB7anFMaXRlfSBtZW51UGFnZVxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLndpZHRoIFwid2lkdGhcIiBzdHlsZSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzUmlnaHRcbiAgICAgICAqL1xuICAgICAgc2V0dXA6IGZ1bmN0aW9uKGVsZW1lbnQsIG1haW5QYWdlLCBtZW51UGFnZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fbWVudVBhZ2UgPSBtZW51UGFnZTtcbiAgICAgICAgdGhpcy5fbWFpblBhZ2UgPSBtYWluUGFnZTtcbiAgICAgICAgdGhpcy5faXNSaWdodCA9ICEhb3B0aW9ucy5pc1JpZ2h0O1xuICAgICAgICB0aGlzLl93aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgJzkwJSc7XG5cbiAgICAgICAgbWFpblBhZ2UuY3NzKHtcbiAgICAgICAgICBib3hTaGFkb3c6ICcwcHggMCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiknXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lbnVQYWdlLmNzcyh7XG4gICAgICAgICAgd2lkdGg6IG9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgb3BhY2l0eTogMC45LFxuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5faXNSaWdodCkge1xuICAgICAgICAgIG1lbnVQYWdlLmNzcyh7XG4gICAgICAgICAgICByaWdodDogJzBweCcsXG4gICAgICAgICAgICBsZWZ0OiAnYXV0bydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZW51UGFnZS5jc3Moe1xuICAgICAgICAgICAgcmlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGxlZnQ6ICcwcHgnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9ibGFja01hc2sgPSBhbmd1bGFyLmVsZW1lbnQoJzxkaXY+PC9kaXY+JykuY3NzKHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdibGFjaycsXG4gICAgICAgICAgdG9wOiAnMHB4JyxcbiAgICAgICAgICBsZWZ0OiAnMHB4JyxcbiAgICAgICAgICByaWdodDogJzBweCcsXG4gICAgICAgICAgYm90dG9tOiAnMHB4JyxcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZWxlbWVudC5wcmVwZW5kKHRoaXMuX2JsYWNrTWFzayk7XG5cbiAgICAgICAgLy8gRGlydHkgZml4IGZvciBicm9rZW4gcmVuZGVyaW5nIGJ1ZyBvbiBhbmRyb2lkIDQueC5cbiAgICAgICAgYW5pbWl0KG1haW5QYWdlWzBdKS5xdWV1ZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknfSkucGxheSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzT3BlbmVkXG4gICAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy53aWR0aFxuICAgICAgICovXG4gICAgICBvblJlc2l6ZWQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fd2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgICAgICB0aGlzLl9tZW51UGFnZS5jc3MoJ3dpZHRoJywgdGhpcy5fd2lkdGgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmlzT3BlbmVkKSB7XG4gICAgICAgICAgdmFyIG1heCA9IHRoaXMuX21lbnVQYWdlWzBdLmNsaWVudFdpZHRoO1xuXG4gICAgICAgICAgdmFyIGFib3ZlVHJhbnNmb3JtID0gdGhpcy5fZ2VuZXJhdGVBYm92ZVBhZ2VUcmFuc2Zvcm0obWF4KTtcbiAgICAgICAgICB2YXIgYmVoaW5kU3R5bGUgPSB0aGlzLl9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZShtYXgpO1xuXG4gICAgICAgICAgYW5pbWl0KHRoaXMuX21haW5QYWdlWzBdKS5xdWV1ZSh7dHJhbnNmb3JtOiBhYm92ZVRyYW5zZm9ybX0pLnBsYXkoKTtcbiAgICAgICAgICBhbmltaXQodGhpcy5fbWVudVBhZ2VbMF0pLnF1ZXVlKGJlaGluZFN0eWxlKS5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtqcUxpdGV9IGVsZW1lbnQgXCJvbnMtc2xpZGluZy1tZW51XCIgb3IgXCJvbnMtc3BsaXQtdmlld1wiIGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7anFMaXRlfSBtYWluUGFnZVxuICAgICAgICogQHBhcmFtIHtqcUxpdGV9IG1lbnVQYWdlXG4gICAgICAgKi9cbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fYmxhY2tNYXNrKSB7XG4gICAgICAgICAgdGhpcy5fYmxhY2tNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIHRoaXMuX2JsYWNrTWFzayA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFpblBhZ2UpIHtcbiAgICAgICAgICB0aGlzLl9tYWluUGFnZS5hdHRyKCdzdHlsZScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9tZW51UGFnZSkge1xuICAgICAgICAgIHRoaXMuX21lbnVQYWdlLmF0dHIoJ3N0eWxlJywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWFpblBhZ2UgPSB0aGlzLl9tZW51UGFnZSA9IHRoaXMuX2VsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluc3RhbnRcbiAgICAgICAqL1xuICAgICAgb3Blbk1lbnU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBpbnN0YW50KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGluc3RhbnQgPT09IHRydWUgPyAwLjAgOiB0aGlzLmR1cmF0aW9uO1xuICAgICAgICB2YXIgZGVsYXkgPSBpbnN0YW50ID09PSB0cnVlID8gMC4wIDogdGhpcy5kZWxheTtcblxuICAgICAgICB0aGlzLl9tZW51UGFnZS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgdGhpcy5fYmxhY2tNYXNrLmNzcygnZGlzcGxheScsICdibG9jaycpO1xuXG4gICAgICAgIHZhciBtYXggPSB0aGlzLl9tZW51UGFnZVswXS5jbGllbnRXaWR0aDtcblxuICAgICAgICB2YXIgYWJvdmVUcmFuc2Zvcm0gPSB0aGlzLl9nZW5lcmF0ZUFib3ZlUGFnZVRyYW5zZm9ybShtYXgpO1xuICAgICAgICB2YXIgYmVoaW5kU3R5bGUgPSB0aGlzLl9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZShtYXgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICBhbmltaXQodGhpcy5fbWFpblBhZ2VbMF0pXG4gICAgICAgICAgICAud2FpdChkZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogYWJvdmVUcmFuc2Zvcm1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5wbGF5KCk7XG5cbiAgICAgICAgICBhbmltaXQodGhpcy5fbWVudVBhZ2VbMF0pXG4gICAgICAgICAgICAud2FpdChkZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZShiZWhpbmRTdHlsZSwge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGxheSgpO1xuXG4gICAgICAgIH0uYmluZCh0aGlzKSwgMTAwMCAvIDYwKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5zdGFudFxuICAgICAgICovXG4gICAgICBjbG9zZU1lbnU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBpbnN0YW50KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGluc3RhbnQgPT09IHRydWUgPyAwLjAgOiB0aGlzLmR1cmF0aW9uO1xuICAgICAgICB2YXIgZGVsYXkgPSBpbnN0YW50ID09PSB0cnVlID8gMC4wIDogdGhpcy5kZWxheTtcblxuICAgICAgICB0aGlzLl9ibGFja01hc2suY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG5cbiAgICAgICAgdmFyIGFib3ZlVHJhbnNmb3JtID0gdGhpcy5fZ2VuZXJhdGVBYm92ZVBhZ2VUcmFuc2Zvcm0oMCk7XG4gICAgICAgIHZhciBiZWhpbmRTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKDApO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICBhbmltaXQodGhpcy5fbWFpblBhZ2VbMF0pXG4gICAgICAgICAgICAud2FpdChkZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogYWJvdmVUcmFuc2Zvcm1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbWVudVBhZ2UuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLnBsYXkoKTtcblxuICAgICAgICAgIGFuaW1pdCh0aGlzLl9tZW51UGFnZVswXSlcbiAgICAgICAgICAgIC53YWl0KGRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKGJlaGluZFN0eWxlLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGxheSgpO1xuXG4gICAgICAgIH0uYmluZCh0aGlzKSwgMTAwMCAvIDYwKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRpc3RhbmNlXG4gICAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5tYXhEaXN0YW5jZVxuICAgICAgICovXG4gICAgICB0cmFuc2xhdGVNZW51OiBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICAgICAgdGhpcy5fbWVudVBhZ2UuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgIHRoaXMuX2JsYWNrTWFzay5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuICAgICAgICB2YXIgYWJvdmVUcmFuc2Zvcm0gPSB0aGlzLl9nZW5lcmF0ZUFib3ZlUGFnZVRyYW5zZm9ybShNYXRoLm1pbihvcHRpb25zLm1heERpc3RhbmNlLCBvcHRpb25zLmRpc3RhbmNlKSk7XG4gICAgICAgIHZhciBiZWhpbmRTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKE1hdGgubWluKG9wdGlvbnMubWF4RGlzdGFuY2UsIG9wdGlvbnMuZGlzdGFuY2UpKTtcbiAgICAgICAgZGVsZXRlIGJlaGluZFN0eWxlLm9wYWNpdHk7XG5cbiAgICAgICAgYW5pbWl0KHRoaXMuX21haW5QYWdlWzBdKVxuICAgICAgICAgIC5xdWV1ZSh7dHJhbnNmb3JtOiBhYm92ZVRyYW5zZm9ybX0pXG4gICAgICAgICAgLnBsYXkoKTtcblxuICAgICAgICBhbmltaXQodGhpcy5fbWVudVBhZ2VbMF0pXG4gICAgICAgICAgLnF1ZXVlKGJlaGluZFN0eWxlKVxuICAgICAgICAgIC5wbGF5KCk7XG4gICAgICB9LFxuXG4gICAgICBfZ2VuZXJhdGVBYm92ZVBhZ2VUcmFuc2Zvcm06IGZ1bmN0aW9uKGRpc3RhbmNlKSB7XG4gICAgICAgIHZhciB4ID0gdGhpcy5faXNSaWdodCA/IC1kaXN0YW5jZSA6IGRpc3RhbmNlO1xuICAgICAgICB2YXIgYWJvdmVUcmFuc2Zvcm0gPSAndHJhbnNsYXRlM2QoJyArIHggKyAncHgsIDAsIDApJztcblxuICAgICAgICByZXR1cm4gYWJvdmVUcmFuc2Zvcm07XG4gICAgICB9LFxuXG4gICAgICBfZ2VuZXJhdGVCZWhpbmRQYWdlU3R5bGU6IGZ1bmN0aW9uKGRpc3RhbmNlKSB7XG4gICAgICAgIHZhciBtYXggPSB0aGlzLl9tZW51UGFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgICB2YXIgYmVoaW5kRGlzdGFuY2UgPSAoZGlzdGFuY2UgLSBtYXgpIC8gbWF4ICogMTA7XG4gICAgICAgIGJlaGluZERpc3RhbmNlID0gaXNOYU4oYmVoaW5kRGlzdGFuY2UpID8gMCA6IE1hdGgubWF4KE1hdGgubWluKGJlaGluZERpc3RhbmNlLCAwKSwgLTEwKTtcblxuICAgICAgICB2YXIgYmVoaW5kWCA9IHRoaXMuX2lzUmlnaHQgPyAtYmVoaW5kRGlzdGFuY2UgOiBiZWhpbmREaXN0YW5jZTtcbiAgICAgICAgdmFyIGJlaGluZFRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgnICsgYmVoaW5kWCArICclLCAwLCAwKSc7XG4gICAgICAgIHZhciBvcGFjaXR5ID0gMSArIGJlaGluZERpc3RhbmNlIC8gMTAwO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiBiZWhpbmRUcmFuc2Zvcm0sXG4gICAgICAgICAgb3BhY2l0eTogb3BhY2l0eVxuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmV2ZWFsU2xpZGluZ01lbnVBbmltYXRvcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFJldmVhbFNsaWRpbmdNZW51QW5pbWF0b3I7XG4gIH1dKTtcblxufSkoKTtcbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLXNsaWRpbmctbWVudVxuICogQGNhdGVnb3J5IG1lbnVcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ29tcG9uZW50IGZvciBzbGlkaW5nIFVJIHdoZXJlIG9uZSBwYWdlIGlzIG92ZXJsYXllZCBvdmVyIGFub3RoZXIgcGFnZS4gVGhlIGFib3ZlIHBhZ2UgY2FuIGJlIHNsaWRlZCBhc2lkZSB0byByZXZlYWwgdGhlIHBhZ2UgYmVoaW5kLlsvZW5dXG4gKiAgIFtqYV3jgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgpLooajnj77jgZnjgovjgZ/jgoHjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgIHniYfmlrnjga7jg5rjg7zjgrjjgYzliKXjga7jg5rjg7zjgrjjga7kuIrjgavjgqrjg7zjg5Djg7zjg6zjgqTjgafooajnpLrjgZXjgozjgb7jgZnjgIJhYm92ZS1wYWdl44Gn5oyH5a6a44GV44KM44Gf44Oa44O844K444Gv44CB5qiq44GL44KJ44K544Op44Kk44OJ44GX44Gm6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIElEdkZKXG4gKiBAc2VlYWxzbyBvbnMtcGFnZVxuICogICBbZW5db25zLXBhZ2UgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1wYWdl44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBndWlkZSBVc2luZ1NsaWRpbmdNZW51XG4gKiAgIFtlbl1Vc2luZyBzbGlkaW5nIG1lbnVbL2VuXVxuICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844KS5L2/44GGWy9qYV1cbiAqIEBndWlkZSBFdmVudEhhbmRsaW5nXG4gKiAgIFtlbl1Vc2luZyBldmVudHNbL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Gu5Yip55SoWy9qYV1cbiAqIEBndWlkZSBDYWxsaW5nQ29tcG9uZW50QVBJc2Zyb21KYXZhU2NyaXB0XG4gKiAgIFtlbl1Vc2luZyBuYXZpZ2F0b3IgZnJvbSBKYXZhU2NyaXB0Wy9lbl1cbiAqICAgW2phXUphdmFTY3JpcHTjgYvjgonjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgpLlkbzjgbPlh7rjgZlbL2phXVxuICogQGd1aWRlIERlZmluaW5nTXVsdGlwbGVQYWdlc2luU2luZ2xlSFRNTFxuICogICBbZW5dRGVmaW5pbmcgbXVsdGlwbGUgcGFnZXMgaW4gc2luZ2xlIGh0bWxbL2VuXVxuICogICBbamFd6KSH5pWw44Gu44Oa44O844K444KSMeOBpOOBrkhUTUzjgavoqJjov7DjgZnjgotbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc2xpZGluZy1tZW51IHZhcj1cImFwcC5tZW51XCIgbWFpbi1wYWdlPVwicGFnZS5odG1sXCIgbWVudS1wYWdlPVwibWVudS5odG1sXCIgbWF4LXNsaWRlLWRpc3RhbmNlPVwiMjAwcHhcIiB0eXBlPVwicmV2ZWFsXCIgc2lkZT1cImxlZnRcIj5cbiAqIDwvb25zLXNsaWRpbmctbWVudT5cbiAqXG4gKiA8b25zLXRlbXBsYXRlIGlkPVwicGFnZS5odG1sXCI+XG4gKiAgIDxvbnMtcGFnZT5cbiAqICAgIDxwIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCI+XG4gKiAgICAgIDxvbnMtYnV0dG9uIG5nLWNsaWNrPVwiYXBwLm1lbnUudG9nZ2xlTWVudSgpXCI+VG9nZ2xlPC9vbnMtYnV0dG9uPlxuICogICAgPC9wPlxuICogICA8L29ucy1wYWdlPlxuICogPC9vbnMtdGVtcGxhdGU+XG4gKlxuICogPG9ucy10ZW1wbGF0ZSBpZD1cIm1lbnUuaHRtbFwiPlxuICogICA8b25zLXBhZ2U+XG4gKiAgICAgPCEtLSBtZW51IHBhZ2UncyBjb250ZW50cyAtLT5cbiAqICAgPC9vbnMtcGFnZT5cbiAqIDwvb25zLXRlbXBsYXRlPlxuICpcbiAqL1xuXG4vKipcbiAqIEBldmVudCBwcmVvcGVuXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBzbGlkaW5nIG1lbnUgaXMgb3BlbmVkLlsvZW5dXG4gKiAgIFtqYV3jgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgYzplovjgY/liY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuc2xpZGluZ01lbnVcbiAqICAgW2VuXVNsaWRpbmcgbWVudSB2aWV3IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44GfU2xpZGluZ01lbnXjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGV2ZW50IHBvc3RvcGVuXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIHNsaWRpbmcgbWVudSBpcyBvcGVuZWQuWy9lbl1cbiAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWi+OBjee1guOCj+OBo+OBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zbGlkaW5nTWVudVxuICogICBbZW5dU2xpZGluZyBtZW51IHZpZXcgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9TbGlkaW5nTWVudeOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAZXZlbnQgcHJlY2xvc2VcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHNsaWRpbmcgbWVudSBpcyBjbG9zZWQuWy9lbl1cbiAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWieOBmOOCi+WJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zbGlkaW5nTWVudVxuICogICBbZW5dU2xpZGluZyBtZW51IHZpZXcgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9TbGlkaW5nTWVudeOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAZXZlbnQgcG9zdGNsb3NlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIHNsaWRpbmcgbWVudSBpcyBjbG9zZWQuWy9lbl1cbiAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWieOBmOe1guOCj+OBo+OBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zbGlkaW5nTWVudVxuICogICBbZW5dU2xpZGluZyBtZW51IHZpZXcgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9TbGlkaW5nTWVudeOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZhclxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVZhcmlhYmxlIG5hbWUgdG8gcmVmZXIgdGhpcyBzbGlkaW5nIG1lbnUuWy9lbl1cbiAqICBbamFd44GT44Gu44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844KS5Y+C54Wn44GZ44KL44Gf44KB44Gu5ZCN5YmN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgbWVudS1wYWdlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRoZSB1cmwgb2YgdGhlIG1lbnUgcGFnZS5bL2VuXVxuICogICBbamFd5bem44Gr5L2N572u44GZ44KL44Oh44OL44Ol44O844Oa44O844K444GuVVJM44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgbWFpbi1wYWdlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRoZSB1cmwgb2YgdGhlIG1haW4gcGFnZS5bL2VuXVxuICogICBbamFd5Y+z44Gr5L2N572u44GZ44KL44Oh44Kk44Oz44Oa44O844K444GuVVJM44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgc3dpcGVhYmxlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtCb29sZWFufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1XaGV0aGVyIHRvIGVuYWJsZSBzd2lwZSBpbnRlcmFjdGlvbi5bL2VuXVxuICogICBbamFd44K544Ov44Kk44OX5pON5L2c44KS5pyJ5Yq544Gr44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgc3dpcGUtdGFyZ2V0LXdpZHRoXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRoZSB3aWR0aCBvZiBzd2lwZWFibGUgYXJlYSBjYWxjdWxhdGVkIGZyb20gdGhlIGxlZnQgKGluIHBpeGVscykuIFVzZSB0aGlzIHRvIGVuYWJsZSBzd2lwZSBvbmx5IHdoZW4gdGhlIGZpbmdlciB0b3VjaCBvbiB0aGUgc2NyZWVuIGVkZ2UuWy9lbl1cbiAqICAgW2phXeOCueODr+OCpOODl+OBruWIpOWumumgmOWfn+OCkuODlOOCr+OCu+ODq+WNmOS9jeOBp+aMh+WumuOBl+OBvuOBmeOAgueUu+mdouOBruerr+OBi+OCieaMh+WumuOBl+OBn+i3nembouOBq+mBlOOBmeOCi+OBqOODmuODvOOCuOOBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG1heC1zbGlkZS1kaXN0YW5jZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1Ib3cgZmFyIHRoZSBtZW51IHBhZ2Ugd2lsbCBzbGlkZSBvcGVuLiBDYW4gc3BlY2lmeSBib3RoIGluIHB4IGFuZCAlLiBlZy4gOTAlLCAyMDBweFsvZW5dXG4gKiAgIFtqYV1tZW51LXBhZ2XjgafmjIflrprjgZXjgozjgZ/jg5rjg7zjgrjjga7ooajnpLrluYXjgpLmjIflrprjgZfjgb7jgZnjgILjg5Tjgq/jgrvjg6vjgoLjgZfjgY/jga8l44Gu5Lih5pa544Gn5oyH5a6a44Gn44GN44G+44GZ77yI5L6LOiA5MCUsIDIwMHB477yJWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgc2lkZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TcGVjaWZ5IHdoaWNoIHNpZGUgb2YgdGhlIHNjcmVlbiB0aGUgbWVudSBwYWdlIGlzIGxvY2F0ZWQgb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgXCJsZWZ0XCIgYW5kIFwicmlnaHRcIi5bL2VuXVxuICogICBbamFdbWVudS1wYWdl44Gn5oyH5a6a44GV44KM44Gf44Oa44O844K444GM55S76Z2i44Gu44Gp44Gh44KJ5YG044GL44KJ6KGo56S644GV44KM44KL44GL44KS5oyH5a6a44GX44G+44GZ44CCbGVmdOOCguOBl+OBj+OBr3JpZ2h044Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgdHlwZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TbGlkaW5nIG1lbnUgYW5pbWF0b3IuIFBvc3NpYmxlIHZhbHVlcyBhcmUgcmV2ZWFsIChkZWZhdWx0KSwgcHVzaCBhbmQgb3ZlcmxheS5bL2VuXVxuICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844Gu44Ki44OL44Oh44O844K344On44Oz44Gn44GZ44CCXCJyZXZlYWxcIu+8iOODh+ODleOCqeODq+ODiO+8ieOAgVwicHVzaFwi44CBXCJvdmVybGF5XCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcHJlb3BlblxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicHJlb3BlblwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicHJlb3Blblwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXByZWNsb3NlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVjbG9zZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicHJlY2xvc2VcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wb3N0b3BlblxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicG9zdG9wZW5cIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInBvc3RvcGVuXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcG9zdGNsb3NlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwb3N0Y2xvc2VcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInBvc3RjbG9zZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLWluaXRcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIGEgcGFnZSdzIFwiaW5pdFwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXeODmuODvOOCuOOBrlwiaW5pdFwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXNob3dcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIGEgcGFnZSdzIFwic2hvd1wiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXeODmuODvOOCuOOBrlwic2hvd1wi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLWhpZGVcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIGEgcGFnZSdzIFwiaGlkZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXeODmuODvOOCuOOBrlwiaGlkZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLWRlc3Ryb3lcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIGEgcGFnZSdzIFwiZGVzdHJveVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXeODmuODvOOCuOOBrlwiZGVzdHJveVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgc2V0TWFpblBhZ2VcbiAqIEBzaWduYXR1cmUgc2V0TWFpblBhZ2UocGFnZVVybCwgW29wdGlvbnNdKVxuICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VVcmxcbiAqICAgW2VuXVBhZ2UgVVJMLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZG9jdW1lbnQgb3IgYW4gPGNvZGU+Jmx0O29ucy10ZW1wbGF0ZSZndDs8L2NvZGU+LlsvZW5dXG4gKiAgIFtqYV1wYWdl44GuVVJM44GL44CBb25zLXRlbXBsYXRl44Gn5a6j6KiA44GX44Gf44OG44Oz44OX44Os44O844OI44GuaWTlsZ7mgKfjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2xvc2VNZW51XVxuICogICBbZW5dSWYgdHJ1ZSB0aGUgbWVudSB3aWxsIGJlIGNsb3NlZC5bL2VuXVxuICogICBbamFddHJ1ZeOCkuaMh+WumuOBmeOCi+OBqOOAgemWi+OBhOOBpuOBhOOCi+ODoeODi+ODpeODvOOCkumWieOBmOOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAqICAgW2VuXUZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHBhZ2UgaGFzIGJlZW4gc2V0LlsvZW5dXG4gKiAgIFtqYV3jg5rjg7zjgrjjgYzoqq3jgb/ovrzjgb7jgozjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TaG93IHRoZSBwYWdlIHNwZWNpZmllZCBpbiBwYWdlVXJsIGluIHRoZSBtYWluIGNvbnRlbnRzIHBhbmUuWy9lbl1cbiAqICAgW2phXeS4reWkrumDqOWIhuOBq+ihqOekuuOBleOCjOOCi+ODmuODvOOCuOOCknBhZ2VVcmzjgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBzZXRNZW51UGFnZVxuICogQHNpZ25hdHVyZSBzZXRNZW51UGFnZShwYWdlVXJsLCBbb3B0aW9uc10pXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVVybFxuICogICBbZW5dUGFnZSBVUkwuIENhbiBiZSBlaXRoZXIgYW4gSFRNTCBkb2N1bWVudCBvciBhbiA8Y29kZT4mbHQ7b25zLXRlbXBsYXRlJmd0OzwvY29kZT4uWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIFvbnMtdGVtcGxhdGXjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbG9zZU1lbnVdXG4gKiAgIFtlbl1JZiB0cnVlIHRoZSBtZW51IHdpbGwgYmUgY2xvc2VkIGFmdGVyIHRoZSBtZW51IHBhZ2UgaGFzIGJlZW4gc2V0LlsvZW5dXG4gKiAgIFtqYV10cnVl44KS5oyH5a6a44GZ44KL44Go44CB6ZaL44GE44Gm44GE44KL44Oh44OL44Ol44O844KS6ZaJ44GY44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICogICBbZW5dVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBtZW51IHBhZ2UgaGFzIGJlZW4gc2V0LlsvZW5dXG4gKiAgIFtqYV3jg6Hjg4vjg6Xjg7zjg5rjg7zjgrjjgYzoqq3jgb/ovrzjgb7jgozjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TaG93IHRoZSBwYWdlIHNwZWNpZmllZCBpbiBwYWdlVXJsIGluIHRoZSBzaWRlIG1lbnUgcGFuZS5bL2VuXVxuICogICBbamFd44Oh44OL44Ol44O86YOo5YiG44Gr6KGo56S644GV44KM44KL44Oa44O844K444KScGFnZVVybOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9wZW5NZW51XG4gKiBAc2lnbmF0dXJlIG9wZW5NZW51KFtvcHRpb25zXSlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAqICAgW2VuXVRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG1lbnUgaGFzIGJlZW4gb3BlbmVkLlsvZW5dXG4gKiAgIFtqYV3jg6Hjg4vjg6Xjg7zjgYzplovjgYTjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TbGlkZSB0aGUgYWJvdmUgbGF5ZXIgdG8gcmV2ZWFsIHRoZSBsYXllciBiZWhpbmQuWy9lbl1cbiAqICAgW2phXeODoeODi+ODpeODvOODmuODvOOCuOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGNsb3NlTWVudVxuICogQHNpZ25hdHVyZSBjbG9zZU1lbnUoW29wdGlvbnNdKVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICogICBbZW5dVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbWVudSBoYXMgYmVlbiBjbG9zZWQuWy9lbl1cbiAqICAgW2phXeODoeODi+ODpeODvOOBjOmWieOBmOOCieOCjOOBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVNsaWRlIHRoZSBhYm92ZSBsYXllciB0byBoaWRlIHRoZSBsYXllciBiZWhpbmQuWy9lbl1cbiAqICAgW2phXeODoeODi+ODpeODvOODmuODvOOCuOOCkumdnuihqOekuuOBq+OBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIHRvZ2dsZU1lbnVcbiAqIEBzaWduYXR1cmUgdG9nZ2xlTWVudShbb3B0aW9uc10pXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBtZW51IGhhcyBiZWVuIG9wZW5lZCBvciBjbG9zZWQuWy9lbl1cbiAqICAgW2phXeODoeODi+ODpeODvOOBjOmWi+OBjee1guOCj+OBo+OBn+W+jOOBi+OAgemWieOBmOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVNsaWRlIHRoZSBhYm92ZSBsYXllciB0byByZXZlYWwgdGhlIGxheWVyIGJlaGluZCBpZiBpdCBpcyBjdXJyZW50bHkgaGlkZGVuLCBvdGhlcndpc2UsIGhpZGUgdGhlIGxheWVyIGJlaGluZC5bL2VuXVxuICogICBbamFd54++5Zyo44Gu54q25rOB44Gr5ZCI44KP44Gb44Gm44CB44Oh44OL44Ol44O844Oa44O844K444KS6KGo56S644KC44GX44GP44Gv6Z2e6KGo56S644Gr44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgaXNNZW51T3BlbmVkXG4gKiBAc2lnbmF0dXJlIGlzTWVudU9wZW5lZCgpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogICBbZW5ddHJ1ZSBpZiB0aGUgbWVudSBpcyBjdXJyZW50bHkgb3Blbi5bL2VuXVxuICogICBbamFd44Oh44OL44Ol44O844GM6ZaL44GE44Gm44GE44KM44GwdHJ1ZeOBqOOBquOCiuOBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJldHVybnMgdHJ1ZSBpZiB0aGUgbWVudSBwYWdlIGlzIG9wZW4sIG90aGVyd2lzZSBmYWxzZS5bL2VuXVxuICogICBbamFd44Oh44OL44Ol44O844Oa44O844K444GM6ZaL44GE44Gm44GE44KL5aC05ZCI44GvdHJ1ZeOAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr2ZhbHNl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgZ2V0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXJcbiAqIEBzaWduYXR1cmUgZ2V0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXIoKVxuICogQHJldHVybiB7T2JqZWN0fVxuICogICBbZW5dRGV2aWNlIGJhY2sgYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAqICAgW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJldHJpZXZlIHRoZSBiYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gKiAgIFtqYV1vbnMtc2xpZGluZy1tZW5144Gr57SQ5LuY44GE44Gm44GE44KL44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44KS5Y+W5b6X44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgc2V0U3dpcGVhYmxlXG4gKiBAc2lnbmF0dXJlIHNldFN3aXBlYWJsZShzd2lwZWFibGUpXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHN3aXBlYWJsZVxuICogICBbZW5dSWYgdHJ1ZSB0aGUgbWVudSB3aWxsIGJlIHN3aXBlYWJsZS5bL2VuXVxuICogICBbamFd44K544Ov44Kk44OX44Gn6ZaL6ZaJ44Gn44GN44KL44KI44GG44Gr44GZ44KL5aC05ZCI44Gr44GvdHJ1ZeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVNwZWNpZnkgaWYgdGhlIG1lbnUgc2hvdWxkIGJlIHN3aXBlYWJsZSBvciBub3QuWy9lbl1cbiAqICAgW2phXeOCueODr+OCpOODl+OBp+mWi+mWieOBmeOCi+OBi+OBqeOBhuOBi+OCkuioreWumuOBmeOCi+OAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uXG4gKiBAc2lnbmF0dXJlIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lci5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvbmNlXG4gKiBAc2lnbmF0dXJlIG9uY2UoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCdzIG9ubHkgdHJpZ2dlcmVkIG9uY2UuWy9lbl1cbiAqICBbamFd5LiA5bqm44Gg44GR5ZG844Gz5Ye644GV44KM44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvZmZcbiAqIEBzaWduYXR1cmUgb2ZmKGV2ZW50TmFtZSwgW2xpc3RlbmVyXSlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1SZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuIElmIHRoZSBsaXN0ZW5lciBpcyBub3Qgc3BlY2lmaWVkIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCB0eXBlIHdpbGwgYmUgcmVtb3ZlZC5bL2VuXVxuICogIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLliYrpmaTjgZfjgb7jgZnjgILjgoLjgZfjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLmjIflrprjgZfjgarjgYvjgaPjgZ/loLTlkIjjgavjga/jgIHjgZ3jga7jgqTjg5njg7Pjg4jjgavntJDjgaXjgY/lhajjgabjga7jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgYzliYrpmaTjgZXjgozjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeWJiumZpOOBmeOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG4gIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKTtcblxuICBtb2R1bGUuZGlyZWN0aXZlKCdvbnNTbGlkaW5nTWVudScsIFsnJGNvbXBpbGUnLCAnU2xpZGluZ01lbnVWaWV3JywgJyRvbnNlbicsIGZ1bmN0aW9uKCRjb21waWxlLCBTbGlkaW5nTWVudVZpZXcsICRvbnNlbikge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG5cbiAgICAgIC8vIE5PVEU6IFRoaXMgZWxlbWVudCBtdXN0IGNvZXhpc3RzIHdpdGggbmctY29udHJvbGxlci5cbiAgICAgIC8vIERvIG5vdCB1c2UgaXNvbGF0ZWQgc2NvcGUgYW5kIHRlbXBsYXRlJ3MgbmctdHJhbnNjbHVkZS5cbiAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLFxuICAgICAgc2NvcGU6IHRydWUsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgIHZhciBtYWluID0gZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcubWFpbicpLFxuICAgICAgICAgICAgbWVudSA9IGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm1lbnUnKTtcblxuICAgICAgICBpZiAobWFpbikge1xuICAgICAgICAgIHZhciBtYWluSHRtbCA9IGFuZ3VsYXIuZWxlbWVudChtYWluKS5yZW1vdmUoKS5odG1sKCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lbnUpIHtcbiAgICAgICAgICB2YXIgbWVudUh0bWwgPSBhbmd1bGFyLmVsZW1lbnQobWVudSkucmVtb3ZlKCkuaHRtbCgpLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZChhbmd1bGFyLmVsZW1lbnQoJzxkaXY+PC9kaXY+JykuYWRkQ2xhc3MoJ29uc2VuLXNsaWRpbmctbWVudV9fbWVudScpKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZChhbmd1bGFyLmVsZW1lbnQoJzxkaXY+PC9kaXY+JykuYWRkQ2xhc3MoJ29uc2VuLXNsaWRpbmctbWVudV9fbWFpbicpKTtcblxuICAgICAgICAgIHZhciBzbGlkaW5nTWVudSA9IG5ldyBTbGlkaW5nTWVudVZpZXcoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKTtcblxuICAgICAgICAgICRvbnNlbi5yZWdpc3RlckV2ZW50SGFuZGxlcnMoc2xpZGluZ01lbnUsICdwcmVvcGVuIHByZWNsb3NlIHBvc3RvcGVuIHBvc3RjbG9zZSBpbml0IHNob3cgaGlkZSBkZXN0cm95Jyk7XG5cbiAgICAgICAgICBpZiAobWFpbkh0bWwgJiYgIWF0dHJzLm1haW5QYWdlKSB7XG4gICAgICAgICAgICBzbGlkaW5nTWVudS5fYXBwZW5kTWFpblBhZ2UobnVsbCwgbWFpbkh0bWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtZW51SHRtbCAmJiAhYXR0cnMubWVudVBhZ2UpIHtcbiAgICAgICAgICAgIHNsaWRpbmdNZW51Ll9hcHBlbmRNZW51UGFnZShtZW51SHRtbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIHNsaWRpbmdNZW51KTtcbiAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zbGlkaW5nLW1lbnUnLCBzbGlkaW5nTWVudSk7XG5cbiAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHNsaWRpbmdNZW51Ll9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zbGlkaW5nLW1lbnUnLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgJG9uc2VuLmZpcmVDb21wb25lbnRFdmVudChlbGVtZW50WzBdLCAnaW5pdCcpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpO1xuXG4gIG1vZHVsZS5mYWN0b3J5KCdTbGlkaW5nTWVudUFuaW1hdG9yJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIENsYXNzLmV4dGVuZCh7XG5cbiAgICAgIGRlbGF5OiAwLFxuICAgICAgZHVyYXRpb246IDAuNCxcbiAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKScsXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnRpbWluZ1xuICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAgICAgKi9cbiAgICAgIGluaXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy50aW1pbmcgPSBvcHRpb25zLnRpbWluZyB8fCB0aGlzLnRpbWluZztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZHVyYXRpb24gOiB0aGlzLmR1cmF0aW9uO1xuICAgICAgICB0aGlzLmRlbGF5ID0gb3B0aW9ucy5kZWxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZWxheSA6IHRoaXMuZGVsYXk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7anFMaXRlfSBlbGVtZW50IFwib25zLXNsaWRpbmctbWVudVwiIG9yIFwib25zLXNwbGl0LXZpZXdcIiBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gbWFpblBhZ2VcbiAgICAgICAqIEBwYXJhbSB7anFMaXRlfSBtZW51UGFnZVxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLndpZHRoIFwid2lkdGhcIiBzdHlsZSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzUmlnaHRcbiAgICAgICAqL1xuICAgICAgc2V0dXA6IGZ1bmN0aW9uKGVsZW1lbnQsIG1haW5QYWdlLCBtZW51UGFnZSwgb3B0aW9ucykge1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzUmlnaHRcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5pc09wZW5lZFxuICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMud2lkdGhcbiAgICAgICAqL1xuICAgICAgb25SZXNpemVkOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICAgKi9cbiAgICAgIG9wZW5NZW51OiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICovXG4gICAgICBjbG9zZUNsb3NlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKi9cbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGlzdGFuY2VcbiAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLm1heERpc3RhbmNlXG4gICAgICAgKi9cbiAgICAgIHRyYW5zbGF0ZU1lbnU6IGZ1bmN0aW9uKG1haW5QYWdlLCBtZW51UGFnZSwgb3B0aW9ucykge1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHtTbGlkaW5nTWVudUFuaW1hdG9yfVxuICAgICAgICovXG4gICAgICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVycmlkZSBjb3B5IG1ldGhvZC4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtc3BlZWQtZGlhbFxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVmFyaWFibGUgbmFtZSB0byByZWZlciB0aGUgc3BlZWQgZGlhbC5bL2VuXVxuICogICBbamFd44GT44Gu44K544OU44O844OJ44OA44Kk44Ki44Or44KS5Y+C54Wn44GZ44KL44Gf44KB44Gu5aSJ5pWw5ZCN44KS44GX44Gm44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLW9wZW5cbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcIm9wZW5cIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cIm9wZW5cIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1jbG9zZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwiY2xvc2VcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cImNsb3NlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvbmNlXG4gKiBAc2lnbmF0dXJlIG9uY2UoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCdzIG9ubHkgdHJpZ2dlcmVkIG9uY2UuWy9lbl1cbiAqICBbamFd5LiA5bqm44Gg44GR5ZG844Gz5Ye644GV44KM44KL44Kk44OZ44Oz44OI44Oq44K544OK44KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvZmZcbiAqIEBzaWduYXR1cmUgb2ZmKGV2ZW50TmFtZSwgW2xpc3RlbmVyXSlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1SZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuIElmIHRoZSBsaXN0ZW5lciBpcyBub3Qgc3BlY2lmaWVkIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCB0eXBlIHdpbGwgYmUgcmVtb3ZlZC5bL2VuXVxuICogIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLliYrpmaTjgZfjgb7jgZnjgILjgoLjgZfjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgYzmjIflrprjgZXjgozjgarjgYvjgaPjgZ/loLTlkIjjgavjga/jgIHjgZ3jga7jgqTjg5njg7Pjg4jjgavntJDku5jjgYTjgabjgYTjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgYzlhajjgabliYrpmaTjgZXjgozjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uXG4gKiBAc2lnbmF0dXJlIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lci5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKTtcblxuICBtb2R1bGUuZGlyZWN0aXZlKCdvbnNTcGVlZERpYWwnLCBbJyRvbnNlbicsICdTcGVlZERpYWxWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBTcGVlZERpYWxWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICByZXBsYWNlOiBmYWxzZSxcbiAgICAgIHNjb3BlOiBmYWxzZSxcbiAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLFxuXG4gICAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRycykge1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICB2YXIgc3BlZWREaWFsID0gbmV3IFNwZWVkRGlhbFZpZXcoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKTtcblxuICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXNwZWVkLWRpYWwnLCBzcGVlZERpYWwpO1xuXG4gICAgICAgICAgJG9uc2VuLnJlZ2lzdGVyRXZlbnRIYW5kbGVycyhzcGVlZERpYWwsICdvcGVuIGNsb3NlJyk7XG4gICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIHNwZWVkRGlhbCk7XG5cbiAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzcGVlZERpYWwuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXNwZWVkLWRpYWwnLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgfTtcbiAgfV0pO1xuXG59KSgpO1xuXG4iLCIvKipcbiAqIEBlbGVtZW50IG9ucy1zcGxpdC12aWV3XG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXURpdmlkZXMgdGhlIHNjcmVlbiBpbnRvIGEgbGVmdCBhbmQgcmlnaHQgc2VjdGlvbi5bL2VuXVxuICogIFtqYV3nlLvpnaLjgpLlt6blj7PjgavliIblibLjgZnjgovjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJbL2phXVxuICogQGNvZGVwZW4gbktxZnYge3dpZGV9XG4gKiBAZ3VpZGUgVXNpbmdvbnNzcGxpdHZpZXdjb21wb25lbnRcbiAqICAgW2VuXVVzaW5nIG9ucy1zcGxpdC12aWV3LlsvZW5dXG4gKiAgIFtqYV1vbnMtc3BsaXQtdmlld+OCs+ODs+ODneODvOODjeODs+ODiOOCkuS9v+OBhlsvamFdXG4gKiBAZ3VpZGUgQ2FsbGluZ0NvbXBvbmVudEFQSXNmcm9tSmF2YVNjcmlwdFxuICogICBbZW5dVXNpbmcgbmF2aWdhdG9yIGZyb20gSmF2YVNjcmlwdFsvZW5dXG4gKiAgIFtqYV1KYXZhU2NyaXB044GL44KJ44Kz44Oz44Od44O844ON44Oz44OI44KS5ZG844Gz5Ye644GZWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNwbGl0LXZpZXdcbiAqICAgc2Vjb25kYXJ5LXBhZ2U9XCJzZWNvbmRhcnkuaHRtbFwiXG4gKiAgIG1haW4tcGFnZT1cIm1haW4uaHRtbFwiXG4gKiAgIG1haW4tcGFnZS13aWR0aD1cIjcwJVwiXG4gKiAgIGNvbGxhcHNlPVwicG9ydHJhaXRcIj5cbiAqIDwvb25zLXNwbGl0LXZpZXc+XG4gKi9cblxuLyoqXG4gKiBAZXZlbnQgdXBkYXRlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIHNwbGl0IHZpZXcgaXMgdXBkYXRlZC5bL2VuXVxuICogICBbamFdc3BsaXQgdmlld+OBrueKtuaFi+OBjOabtOaWsOOBleOCjOOBn+mam+OBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zcGxpdFZpZXdcbiAqICAgW2VuXVNwbGl0IHZpZXcgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9TcGxpdFZpZXfjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBldmVudC5zaG91bGRDb2xsYXBzZVxuICogICBbZW5dVHJ1ZSBpZiB0aGUgdmlldyBzaG91bGQgY29sbGFwc2UuWy9lbl1cbiAqICAgW2phXWNvbGxhcHNl54q25oWL44Gu5aC05ZCI44GrdHJ1ZeOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQuY3VycmVudE1vZGVcbiAqICAgW2VuXUN1cnJlbnQgbW9kZS5bL2VuXVxuICogICBbamFd54++5Zyo44Gu44Oi44O844OJ5ZCN44KS6L+U44GX44G+44GZ44CCXCJjb2xsYXBzZVwi44GLXCJzcGxpdFwi44GL44Gu44GE44Ga44KM44GL44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LnNwbGl0XG4gKiAgIFtlbl1DYWxsIHRvIGZvcmNlIHNwbGl0LlsvZW5dXG4gKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlkbzjgbPlh7rjgZnjgajlvLfliLbnmoTjgatzcGxpdOODouODvOODieOBq+OBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jb2xsYXBzZVxuICogICBbZW5dQ2FsbCB0byBmb3JjZSBjb2xsYXBzZS5bL2VuXVxuICogICBbamFd44GT44Gu6Zai5pWw44KS5ZG844Gz5Ye644GZ44Go5by35Yi255qE44GrY29sbGFwc2Xjg6Ljg7zjg4njgavjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LndpZHRoXG4gKiAgIFtlbl1DdXJyZW50IHdpZHRoLlsvZW5dXG4gKiAgIFtqYV3nj77lnKjjga5TcGxpdFZpZXfjga7luYXjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50Lm9yaWVudGF0aW9uXG4gKiAgIFtlbl1DdXJyZW50IG9yaWVudGF0aW9uLlsvZW5dXG4gKiAgIFtqYV3nj77lnKjjga7nlLvpnaLjga7jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgpLov5TjgZfjgb7jgZnjgIJcInBvcnRyYWl0XCLjgYvjgoLjgZfjgY/jga9cImxhbmRzY2FwZVwi44Gn44GZ44CCIFsvamFdXG4gKi9cblxuLyoqXG4gKiBAZXZlbnQgcHJlc3BsaXRcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHZpZXcgaXMgc3BsaXQuWy9lbl1cbiAqICAgW2phXXNwbGl054q25oWL44Gr44KL5YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNwbGl0Vmlld1xuICogICBbZW5dU3BsaXQgdmlldyBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn1NwbGl0Vmlld+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge051bWJlcn0gZXZlbnQud2lkdGhcbiAqICAgW2VuXUN1cnJlbnQgd2lkdGguWy9lbl1cbiAqICAgW2phXeePvuWcqOOBrlNwbGl0Vmlld27jga7luYXjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50Lm9yaWVudGF0aW9uXG4gKiAgIFtlbl1DdXJyZW50IG9yaWVudGF0aW9uLlsvZW5dXG4gKiAgIFtqYV3nj77lnKjjga7nlLvpnaLjga7jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgpLov5TjgZfjgb7jgZnjgIJcInBvcnRyYWl0XCLjgoLjgZfjgY/jga9cImxhbmRzY2FwZVwi44Gn44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBldmVudCBwb3N0c3BsaXRcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgdmlldyBpcyBzcGxpdC5bL2VuXVxuICogICBbamFdc3BsaXTnirbmhYvjgavjgarjgaPjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuc3BsaXRWaWV3XG4gKiAgIFtlbl1TcGxpdCB2aWV3IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44GfU3BsaXRWaWV344Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC53aWR0aFxuICogICBbZW5dQ3VycmVudCB3aWR0aC5bL2VuXVxuICogICBbamFd54++5Zyo44GuU3BsaXRWaWV3buOBruW5heOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQub3JpZW50YXRpb25cbiAqICAgW2VuXUN1cnJlbnQgb3JpZW50YXRpb24uWy9lbl1cbiAqICAgW2phXeePvuWcqOOBrueUu+mdouOBruOCquODquOCqOODs+ODhuODvOOCt+ODp+ODs+OCkui/lOOBl+OBvuOBmeOAglwicG9ydHJhaXRcIuOCguOBl+OBj+OBr1wibGFuZHNjYXBlXCLjgafjgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGV2ZW50IHByZWNvbGxhcHNlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSB2aWV3IGlzIGNvbGxhcHNlZC5bL2VuXVxuICogICBbamFdY29sbGFwc2XnirbmhYvjgavjgarjgovliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuc3BsaXRWaWV3XG4gKiAgIFtlbl1TcGxpdCB2aWV3IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44GfU3BsaXRWaWV344Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC53aWR0aFxuICogICBbZW5dQ3VycmVudCB3aWR0aC5bL2VuXVxuICogICBbamFd54++5Zyo44GuU3BsaXRWaWV3buOBruW5heOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQub3JpZW50YXRpb25cbiAqICAgW2VuXUN1cnJlbnQgb3JpZW50YXRpb24uWy9lbl1cbiAqICAgW2phXeePvuWcqOOBrueUu+mdouOBruOCquODquOCqOODs+ODhuODvOOCt+ODp+ODs+OCkui/lOOBl+OBvuOBmeOAglwicG9ydHJhaXRcIuOCguOBl+OBj+OBr1wibGFuZHNjYXBlXCLjgafjgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGV2ZW50IHBvc3Rjb2xsYXBzZVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSB2aWV3IGlzIGNvbGxhcHNlZC5bL2VuXVxuICogICBbamFdY29sbGFwc2XnirbmhYvjgavjgarjgaPjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuc3BsaXRWaWV3XG4gKiAgIFtlbl1TcGxpdCB2aWV3IG9iamVjdC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44GfU3BsaXRWaWV344Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC53aWR0aFxuICogICBbZW5dQ3VycmVudCB3aWR0aC5bL2VuXVxuICogICBbamFd54++5Zyo44GuU3BsaXRWaWV3buOBruW5heOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQub3JpZW50YXRpb25cbiAqICAgW2VuXUN1cnJlbnQgb3JpZW50YXRpb24uWy9lbl1cbiAqICAgW2phXeePvuWcqOOBrueUu+mdouOBruOCquODquOCqOODs+ODhuODvOOCt+ODp+ODs+OCkui/lOOBl+OBvuOBmeOAglwicG9ydHJhaXRcIuOCguOBl+OBj+OBr1wibGFuZHNjYXBlXCLjgafjgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVmFyaWFibGUgbmFtZSB0byByZWZlciB0aGlzIHNwbGl0IHZpZXcuWy9lbl1cbiAqICAgW2phXeOBk+OBruOCueODl+ODquODg+ODiOODk+ODpeODvOOCs+ODs+ODneODvOODjeODs+ODiOOCkuWPgueFp+OBmeOCi+OBn+OCgeOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG1haW4tcGFnZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1UaGUgdXJsIG9mIHRoZSBwYWdlIG9uIHRoZSByaWdodC5bL2VuXVxuICogICBbamFd5Y+z5YG044Gr6KGo56S644GZ44KL44Oa44O844K444GuVVJM44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgbWFpbi1wYWdlLXdpZHRoXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtOdW1iZXJ9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXU1haW4gcGFnZSB3aWR0aCBwZXJjZW50YWdlLiBUaGUgc2Vjb25kYXJ5IHBhZ2Ugd2lkdGggd2lsbCBiZSB0aGUgcmVtYWluaW5nIHBlcmNlbnRhZ2UuWy9lbl1cbiAqICAgW2phXeWPs+WBtOOBruODmuODvOOCuOOBruW5heOCkuODkeODvOOCu+ODs+ODiOWNmOS9jeOBp+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHNlY29uZGFyeS1wYWdlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRoZSB1cmwgb2YgdGhlIHBhZ2Ugb24gdGhlIGxlZnQuWy9lbl1cbiAqICAgW2phXeW3puWBtOOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOBrlVSTOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIGNvbGxhcHNlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFNwZWNpZnkgdGhlIGNvbGxhcHNlIGJlaGF2aW9yLiBWYWxpZCB2YWx1ZXMgYXJlIHBvcnRyYWl0LCBsYW5kc2NhcGUsIHdpZHRoICNweCBvciBhIG1lZGlhIHF1ZXJ5LlxuICogICAgIFwicG9ydHJhaXRcIiBvciBcImxhbmRzY2FwZVwiIG1lYW5zIHRoZSB2aWV3IHdpbGwgY29sbGFwc2Ugd2hlbiBkZXZpY2UgaXMgaW4gbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uLlxuICogICAgIFwid2lkdGggI3B4XCIgbWVhbnMgdGhlIHZpZXcgd2lsbCBjb2xsYXBzZSB3aGVuIHRoZSB3aW5kb3cgd2lkdGggaXMgc21hbGxlciB0aGFuIHRoZSBzcGVjaWZpZWQgI3B4LlxuICogICAgIElmIHRoZSB2YWx1ZSBpcyBhIG1lZGlhIHF1ZXJ5LCB0aGUgdmlldyB3aWxsIGNvbGxhcHNlIHdoZW4gdGhlIG1lZGlhIHF1ZXJ5IGlzIHRydWUuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDlt6blgbTjga7jg5rjg7zjgrjjgpLpnZ7ooajnpLrjgavjgZnjgovmnaHku7bjgpLmjIflrprjgZfjgb7jgZnjgIJwb3J0cmFpdCwgbGFuZHNjYXBl44CBd2lkdGggI3B444KC44GX44GP44Gv44Oh44OH44Kj44Ki44Kv44Ko44Oq44Gu5oyH5a6a44GM5Y+v6IO944Gn44GZ44CCXG4gKiAgICAgcG9ydHJhaXTjgoLjgZfjgY/jga9sYW5kc2NhcGXjgpLmjIflrprjgZnjgovjgajjgIHjg4fjg5DjgqTjgrnjga7nlLvpnaLjgYznuKblkJHjgY3jgoLjgZfjgY/jga/mqKrlkJHjgY3jgavjgarjgaPjgZ/mmYLjgavpgannlKjjgZXjgozjgb7jgZnjgIJcbiAqICAgICB3aWR0aCAjcHjjgpLmjIflrprjgZnjgovjgajjgIHnlLvpnaLjgYzmjIflrprjgZfjgZ/mqKrluYXjgojjgorjgoLnn63jgYTloLTlkIjjgavpgannlKjjgZXjgozjgb7jgZnjgIJcbiAqICAgICDjg6Hjg4fjgqPjgqLjgq/jgqjjg6rjgpLmjIflrprjgZnjgovjgajjgIHmjIflrprjgZfjgZ/jgq/jgqjjg6rjgavpganlkIjjgZfjgabjgYTjgovloLTlkIjjgavpgannlKjjgZXjgozjgb7jgZnjgIJcbiAqICAgWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXVwZGF0ZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwidXBkYXRlXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJ1cGRhdGVcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wcmVzcGxpdFxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicHJlc3BsaXRcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInByZXNwbGl0XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcHJlY29sbGFwc2VcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcInByZWNvbGxhcHNlXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwcmVjb2xsYXBzZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXBvc3RzcGxpdFxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicG9zdHNwbGl0XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJwb3N0c3BsaXRcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wb3N0Y29sbGFwc2VcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcInBvc3Rjb2xsYXBzZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicG9zdGNvbGxhcHNlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtaW5pdFxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJpbml0XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJpbml0XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtc2hvd1xuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJzaG93XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJzaG93XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtaGlkZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJoaWRlXCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJoaWRlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtZGVzdHJveVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gYSBwYWdlJ3MgXCJkZXN0cm95XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFd44Oa44O844K444GuXCJkZXN0cm95XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBzZXRNYWluUGFnZVxuICogQHNpZ25hdHVyZSBzZXRNYWluUGFnZShwYWdlVXJsKVxuICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VVcmxcbiAqICAgW2VuXVBhZ2UgVVJMLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZG9jdW1lbnQgb3IgYW4gPG9ucy10ZW1wbGF0ZT4uWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIFvbnMtdGVtcGxhdGXjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVNob3cgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHBhZ2VVcmwgaW4gdGhlIHJpZ2h0IHNlY3Rpb25bL2VuXVxuICogICBbamFd5oyH5a6a44GX44GfVVJM44KS44Oh44Kk44Oz44Oa44O844K444KS6Kqt44G/6L6844G/44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgc2V0U2Vjb25kYXJ5UGFnZVxuICogQHNpZ25hdHVyZSBzZXRTZWNvbmRhcnlQYWdlKHBhZ2VVcmwpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVVybFxuICogICBbZW5dUGFnZSBVUkwuIENhbiBiZSBlaXRoZXIgYW4gSFRNTCBkb2N1bWVudCBvciBhbiA8b25zLXRlbXBsYXRlPi5bL2VuXVxuICogICBbamFdcGFnZeOBrlVSTOOBi+OAgW9ucy10ZW1wbGF0ZeOBp+Wuo+iogOOBl+OBn+ODhuODs+ODl+ODrOODvOODiOOBrmlk5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dU2hvdyB0aGUgcGFnZSBzcGVjaWZpZWQgaW4gcGFnZVVybCBpbiB0aGUgbGVmdCBzZWN0aW9uWy9lbl1cbiAqICAgW2phXeaMh+WumuOBl+OBn1VSTOOCkuW3puOBruODmuODvOOCuOOBruiqreOBv+i+vOOBv+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIHVwZGF0ZVxuICogQHNpZ25hdHVyZSB1cGRhdGUoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1UcmlnZ2VyIGFuICd1cGRhdGUnIGV2ZW50IGFuZCB0cnkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzcGxpdCBiZWhhdmlvciBzaG91bGQgYmUgY2hhbmdlZC5bL2VuXVxuICogICBbamFdc3BsaXTjg6Ljg7zjg4njgpLlpInjgYjjgovjgbnjgY3jgYvjganjgYbjgYvjgpLliKTmlq3jgZnjgovjgZ/jgoHjga4ndXBkYXRlJ+OCpOODmeODs+ODiOOCkueZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uXG4gKiBAc2lnbmF0dXJlIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lci5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvbmNlXG4gKiBAc2lnbmF0dXJlIG9uY2UoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCdzIG9ubHkgdHJpZ2dlcmVkIG9uY2UuWy9lbl1cbiAqICBbamFd5LiA5bqm44Gg44GR5ZG844Gz5Ye644GV44KM44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvZmZcbiAqIEBzaWduYXR1cmUgb2ZmKGV2ZW50TmFtZSwgW2xpc3RlbmVyXSlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1SZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuIElmIHRoZSBsaXN0ZW5lciBpcyBub3Qgc3BlY2lmaWVkIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCB0eXBlIHdpbGwgYmUgcmVtb3ZlZC5bL2VuXVxuICogIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLliYrpmaTjgZfjgb7jgZnjgILjgoLjgZfjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLmjIflrprjgZfjgarjgYvjgaPjgZ/loLTlkIjjgavjga/jgIHjgZ3jga7jgqTjg5njg7Pjg4jjgavntJDjgaXjgY/lhajjgabjga7jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgYzliYrpmaTjgZXjgozjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeWJiumZpOOBmeOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG4gIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKTtcblxuICBtb2R1bGUuZGlyZWN0aXZlKCdvbnNTcGxpdFZpZXcnLCBbJyRjb21waWxlJywgJ1NwbGl0VmlldycsICckb25zZW4nLCBmdW5jdGlvbigkY29tcGlsZSwgU3BsaXRWaWV3LCAkb25zZW4pIHtcblxuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG4gICAgICB0cmFuc2NsdWRlOiBmYWxzZSxcbiAgICAgIHNjb3BlOiB0cnVlLFxuXG4gICAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRycykge1xuICAgICAgICB2YXIgbWFpblBhZ2UgPSBlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5tYWluLXBhZ2UnKSxcbiAgICAgICAgICAgIHNlY29uZGFyeVBhZ2UgPSBlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5zZWNvbmRhcnktcGFnZScpO1xuXG4gICAgICAgIGlmIChtYWluUGFnZSkge1xuICAgICAgICAgIHZhciBtYWluSHRtbCA9IGFuZ3VsYXIuZWxlbWVudChtYWluUGFnZSkucmVtb3ZlKCkuaHRtbCgpLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWNvbmRhcnlQYWdlKSB7XG4gICAgICAgICAgdmFyIHNlY29uZGFyeUh0bWwgPSBhbmd1bGFyLmVsZW1lbnQoc2Vjb25kYXJ5UGFnZSkucmVtb3ZlKCkuaHRtbCgpLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZChhbmd1bGFyLmVsZW1lbnQoJzxkaXY+PC9kaXY+JykuYWRkQ2xhc3MoJ29uc2VuLXNwbGl0LXZpZXdfX3NlY29uZGFyeSBmdWxsLXNjcmVlbicpKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZChhbmd1bGFyLmVsZW1lbnQoJzxkaXY+PC9kaXY+JykuYWRkQ2xhc3MoJ29uc2VuLXNwbGl0LXZpZXdfX21haW4gZnVsbC1zY3JlZW4nKSk7XG5cbiAgICAgICAgICB2YXIgc3BsaXRWaWV3ID0gbmV3IFNwbGl0VmlldyhzY29wZSwgZWxlbWVudCwgYXR0cnMpO1xuXG4gICAgICAgICAgaWYgKG1haW5IdG1sICYmICFhdHRycy5tYWluUGFnZSkge1xuICAgICAgICAgICAgc3BsaXRWaWV3Ll9hcHBlbmRNYWluUGFnZShtYWluSHRtbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlY29uZGFyeUh0bWwgJiYgIWF0dHJzLnNlY29uZGFyeVBhZ2UpIHtcbiAgICAgICAgICAgIHNwbGl0Vmlldy5fYXBwZW5kU2Vjb25kUGFnZShzZWNvbmRhcnlIdG1sKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAkb25zZW4uZGVjbGFyZVZhckF0dHJpYnV0ZShhdHRycywgc3BsaXRWaWV3KTtcbiAgICAgICAgICAkb25zZW4ucmVnaXN0ZXJFdmVudEhhbmRsZXJzKHNwbGl0VmlldywgJ3VwZGF0ZSBwcmVzcGxpdCBwcmVjb2xsYXBzZSBwb3N0c3BsaXQgcG9zdGNvbGxhcHNlIGluaXQgc2hvdyBoaWRlIGRlc3Ryb3knKTtcblxuICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXNwbGl0LXZpZXcnLCBzcGxpdFZpZXcpO1xuXG4gICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc3BsaXRWaWV3Ll9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zcGxpdC12aWV3JywgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLmZhY3RvcnkoJ1NwbGl0dGVyQ29udGVudCcsIFsnJG9uc2VuJywgJyRjb21waWxlJywgZnVuY3Rpb24oJG9uc2VuLCAkY29tcGlsZSkge1xuXG4gICAgdmFyIFNwbGl0dGVyQ29udGVudCA9IENsYXNzLmV4dGVuZCh7XG5cbiAgICAgIGluaXQ6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5fYXR0cnMgPSBhdHRycztcblxuICAgICAgICB0aGlzLmxvYWQgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuX3BhZ2VTY29wZSAmJiB0aGlzLl9wYWdlU2NvcGUuJGRlc3Ryb3koKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFswXS5sb2FkKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgdGhpcy5fZGVzdHJveS5iaW5kKHRoaXMpKTtcbiAgICAgIH0sXG5cbiAgICAgIF9saW5rOiBmdW5jdGlvbihmcmFnbWVudCwgZG9uZSkge1xuICAgICAgICB0aGlzLl9wYWdlU2NvcGUgPSB0aGlzLl9zY29wZS4kbmV3KCk7XG4gICAgICAgICRjb21waWxlKGZyYWdtZW50KSh0aGlzLl9wYWdlU2NvcGUpO1xuXG4gICAgICAgIHRoaXMuX3BhZ2VTY29wZS4kZXZhbEFzeW5jKCgpID0+IGRvbmUoZnJhZ21lbnQpKTtcbiAgICAgIH0sXG5cbiAgICAgIF9kZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9zY29wZSA9IHRoaXMuX2F0dHJzID0gdGhpcy5sb2FkID0gdGhpcy5fcGFnZVNjb3BlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE1pY3JvRXZlbnQubWl4aW4oU3BsaXR0ZXJDb250ZW50KTtcbiAgICAkb25zZW4uZGVyaXZlUHJvcGVydGllc0Zyb21FbGVtZW50KFNwbGl0dGVyQ29udGVudCwgWydwYWdlJ10pO1xuXG4gICAgcmV0dXJuIFNwbGl0dGVyQ29udGVudDtcbiAgfV0pO1xufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5mYWN0b3J5KCdTcGxpdHRlclNpZGUnLCBbJyRvbnNlbicsICckY29tcGlsZScsIGZ1bmN0aW9uKCRvbnNlbiwgJGNvbXBpbGUpIHtcblxuICAgIHZhciBTcGxpdHRlclNpZGUgPSBDbGFzcy5leHRlbmQoe1xuXG4gICAgICBpbml0OiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3Njb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuX2F0dHJzID0gYXR0cnM7XG5cbiAgICAgICAgdGhpcy5fY2xlYXJEZXJpdmluZ01ldGhvZHMgPSAkb25zZW4uZGVyaXZlTWV0aG9kcyh0aGlzLCB0aGlzLl9lbGVtZW50WzBdLCBbXG4gICAgICAgICAgJ29wZW4nLCAnY2xvc2UnLCAndG9nZ2xlJ1xuICAgICAgICBdKTtcblxuICAgICAgICB0aGlzLmxvYWQgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuX3BhZ2VTY29wZSAmJiB0aGlzLl9wYWdlU2NvcGUuJGRlc3Ryb3koKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFswXS5sb2FkKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2NsZWFyRGVyaXZpbmdFdmVudHMgPSAkb25zZW4uZGVyaXZlRXZlbnRzKHRoaXMsIGVsZW1lbnRbMF0sIFtcbiAgICAgICAgICAnbW9kZWNoYW5nZScsICdwcmVvcGVuJywgJ3ByZWNsb3NlJywgJ3Bvc3RvcGVuJywgJ3Bvc3RjbG9zZSdcbiAgICAgICAgXSwgZGV0YWlsID0+IGRldGFpbC5zaWRlID8gYW5ndWxhci5leHRlbmQoZGV0YWlsLCB7c2lkZTogdGhpc30pIDogZGV0YWlsKTtcblxuICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgdGhpcy5fZGVzdHJveS5iaW5kKHRoaXMpKTtcbiAgICAgIH0sXG5cbiAgICAgIF9saW5rOiBmdW5jdGlvbihmcmFnbWVudCwgZG9uZSkge1xuICAgICAgICB2YXIgbGluayA9ICRjb21waWxlKGZyYWdtZW50KTtcbiAgICAgICAgdGhpcy5fcGFnZVNjb3BlID0gdGhpcy5fc2NvcGUuJG5ldygpO1xuICAgICAgICBsaW5rKHRoaXMuX3BhZ2VTY29wZSk7XG5cbiAgICAgICAgdGhpcy5fcGFnZVNjb3BlLiRldmFsQXN5bmMoKCkgPT4gZG9uZShmcmFnbWVudCkpO1xuICAgICAgfSxcblxuICAgICAgX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcblxuICAgICAgICB0aGlzLl9jbGVhckRlcml2aW5nTWV0aG9kcygpO1xuICAgICAgICB0aGlzLl9jbGVhckRlcml2aW5nRXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuX3Njb3BlID0gdGhpcy5fYXR0cnMgPSB0aGlzLmxvYWQgPSB0aGlzLl9wYWdlU2NvcGUgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgTWljcm9FdmVudC5taXhpbihTcGxpdHRlclNpZGUpO1xuICAgICRvbnNlbi5kZXJpdmVQcm9wZXJ0aWVzRnJvbUVsZW1lbnQoU3BsaXR0ZXJTaWRlLCBbJ3BhZ2UnLCAnbW9kZScsICdpc09wZW4nXSk7XG5cbiAgICByZXR1cm4gU3BsaXR0ZXJTaWRlO1xuICB9XSk7XG59KSgpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtc3BsaXR0ZXJcbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgdmFyXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVZhcmlhYmxlIG5hbWUgdG8gcmVmZXIgdGhpcyBzcGxpdCB2aWV3LlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jgrnjg5fjg6rjg4Pjg4jjg5Pjg6Xjg7zjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgpLlj4LnhafjgZnjgovjgZ/jgoHjga7lkI3liY3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtZGVzdHJveVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwiZGVzdHJveVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwiZGVzdHJveVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2Qgb25cbiAqIEBzaWduYXR1cmUgb24oZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOBk+OBruOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uY2VcbiAqIEBzaWduYXR1cmUgb25jZShldmVudE5hbWUsIGxpc3RlbmVyKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0J3Mgb25seSB0cmlnZ2VyZWQgb25jZS5bL2VuXVxuICogIFtqYV3kuIDluqbjgaDjgZHlkbzjgbPlh7rjgZXjgozjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9mZlxuICogQHNpZ25hdHVyZSBvZmYoZXZlbnROYW1lLCBbbGlzdGVuZXJdKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci4gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBzcGVjaWZpZWQgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50IHR5cGUgd2lsbCBiZSByZW1vdmVkLlsvZW5dXG4gKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAguOCguOBl+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBquOBi+OBo+OBn+WgtOWQiOOBq+OBr+OAgeOBneOBruOCpOODmeODs+ODiOOBq+e0kOOBpeOBj+WFqOOBpuOBruOCpOODmeODs+ODiOODquOCueODiuODvOOBjOWJiumZpOOBleOCjOOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd5YmK6Zmk44GZ44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc1NwbGl0dGVyJywgWyckY29tcGlsZScsICdTcGxpdHRlcicsICckb25zZW4nLCBmdW5jdGlvbigkY29tcGlsZSwgU3BsaXR0ZXIsICRvbnNlbikge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgc2NvcGU6IHRydWUsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuXG4gICAgICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IFNwbGl0dGVyKHNjb3BlLCBlbGVtZW50LCBhdHRycyk7XG5cbiAgICAgICAgICAkb25zZW4uZGVjbGFyZVZhckF0dHJpYnV0ZShhdHRycywgc3BsaXR0ZXIpO1xuICAgICAgICAgICRvbnNlbi5yZWdpc3RlckV2ZW50SGFuZGxlcnMoc3BsaXR0ZXIsICdkZXN0cm95Jyk7XG5cbiAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zcGxpdHRlcicsIHNwbGl0dGVyKTtcblxuICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNwbGl0dGVyLl9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zcGxpdHRlcicsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xufSkoKTtcbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLXN3aXRjaFxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVmFyaWFibGUgbmFtZSB0byByZWZlciB0aGlzIHN3aXRjaC5bL2VuXVxuICogICBbamFdSmF2YVNjcmlwdOOBi+OCieWPgueFp+OBmeOCi+OBn+OCgeOBruWkieaVsOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uXG4gKiBAc2lnbmF0dXJlIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lci5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvbmNlXG4gKiBAc2lnbmF0dXJlIG9uY2UoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCdzIG9ubHkgdHJpZ2dlcmVkIG9uY2UuWy9lbl1cbiAqICBbamFd5LiA5bqm44Gg44GR5ZG844Gz5Ye644GV44KM44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQG1ldGhvZCBvZmZcbiAqIEBzaWduYXR1cmUgb2ZmKGV2ZW50TmFtZSwgW2xpc3RlbmVyXSlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1SZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuIElmIHRoZSBsaXN0ZW5lciBpcyBub3Qgc3BlY2lmaWVkIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCB0eXBlIHdpbGwgYmUgcmVtb3ZlZC5bL2VuXVxuICogIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLliYrpmaTjgZfjgb7jgZnjgILjgoLjgZfjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLmjIflrprjgZfjgarjgYvjgaPjgZ/loLTlkIjjgavjga/jgIHjgZ3jga7jgqTjg5njg7Pjg4jjgavntJDjgaXjgY/lhajjgabjga7jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgYzliYrpmaTjgZXjgozjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeWJiumZpOOBmeOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuKGZ1bmN0aW9uKCl7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc1N3aXRjaCcsIFsnJG9uc2VuJywgJ1N3aXRjaFZpZXcnLCBmdW5jdGlvbigkb25zZW4sIFN3aXRjaFZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgc2NvcGU6IHRydWUsXG5cbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuXG4gICAgICAgIGlmIChhdHRycy5uZ0NvbnRyb2xsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZWxlbWVudCBjYW5cXCd0IGFjY2VwdCBuZy1jb250cm9sbGVyIGRpcmVjdGl2ZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzd2l0Y2hWaWV3ID0gbmV3IFN3aXRjaFZpZXcoZWxlbWVudCwgc2NvcGUsIGF0dHJzKTtcbiAgICAgICAgJG9uc2VuLmFkZE1vZGlmaWVyTWV0aG9kc0ZvckN1c3RvbUVsZW1lbnRzKHN3aXRjaFZpZXcsIGVsZW1lbnQpO1xuXG4gICAgICAgICRvbnNlbi5kZWNsYXJlVmFyQXR0cmlidXRlKGF0dHJzLCBzd2l0Y2hWaWV3KTtcbiAgICAgICAgZWxlbWVudC5kYXRhKCdvbnMtc3dpdGNoJywgc3dpdGNoVmlldyk7XG5cbiAgICAgICAgJG9uc2VuLmNsZWFuZXIub25EZXN0cm95KHNjb3BlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzd2l0Y2hWaWV3Ll9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgJG9uc2VuLnJlbW92ZU1vZGlmaWVyTWV0aG9kcyhzd2l0Y2hWaWV3KTtcbiAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zd2l0Y2gnLCB1bmRlZmluZWQpO1xuICAgICAgICAgICRvbnNlbi5jbGVhckNvbXBvbmVudCh7XG4gICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgc2NvcGU6IHNjb3BlLFxuICAgICAgICAgICAgYXR0cnM6IGF0dHJzXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZWxlbWVudCA9IGF0dHJzID0gc2NvcGUgPSBudWxsO1xuICAgICAgICB9KTtcblxuICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKTtcblxuICBtb2R1bGUudmFsdWUoJ1RhYmJhck5vbmVBbmltYXRvcicsIG9ucy5faW50ZXJuYWwuVGFiYmFyTm9uZUFuaW1hdG9yKTtcbiAgbW9kdWxlLnZhbHVlKCdUYWJiYXJGYWRlQW5pbWF0b3InLCBvbnMuX2ludGVybmFsLlRhYmJhckZhZGVBbmltYXRvcik7XG4gIG1vZHVsZS52YWx1ZSgnVGFiYmFyU2xpZGVBbmltYXRvcicsIG9ucy5faW50ZXJuYWwuVGFiYmFyU2xpZGVBbmltYXRvcik7XG5cbiAgbW9kdWxlLmZhY3RvcnkoJ1RhYmJhclZpZXcnLCBbJyRvbnNlbicsICckY29tcGlsZScsICckcGFyc2UnLCBmdW5jdGlvbigkb25zZW4sICRjb21waWxlLCAkcGFyc2UpIHtcbiAgICB2YXIgVGFiYmFyVmlldyA9IENsYXNzLmV4dGVuZCh7XG5cbiAgICAgIGluaXQ6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICBpZiAoZWxlbWVudFswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25zLXRhYmJhcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiZWxlbWVudFwiIHBhcmFtZXRlciBtdXN0IGJlIGEgXCJvbnMtdGFiYmFyXCIgZWxlbWVudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Njb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9hdHRycyA9IGF0dHJzO1xuICAgICAgICB0aGlzLl9sYXN0UGFnZUVsZW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9sYXN0UGFnZVNjb3BlID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9zY29wZS4kb24oJyRkZXN0cm95JywgdGhpcy5fZGVzdHJveS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLl9jbGVhckRlcml2aW5nRXZlbnRzID0gJG9uc2VuLmRlcml2ZUV2ZW50cyh0aGlzLCBlbGVtZW50WzBdLCBbXG4gICAgICAgICAgJ3JlYWN0aXZlJywgJ3Bvc3RjaGFuZ2UnLCAncHJlY2hhbmdlJywgJ2luaXQnLCAnc2hvdycsICdoaWRlJywgJ2Rlc3Ryb3knXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHRoaXMuX2NsZWFyRGVyaXZpbmdNZXRob2RzID0gJG9uc2VuLmRlcml2ZU1ldGhvZHModGhpcywgZWxlbWVudFswXSwgW1xuICAgICAgICAgICdzZXRBY3RpdmVUYWInLFxuICAgICAgICAgICdzZXRUYWJiYXJWaXNpYmlsaXR5JyxcbiAgICAgICAgICAnZ2V0QWN0aXZlVGFiSW5kZXgnLFxuICAgICAgICAgICdsb2FkUGFnZSdcbiAgICAgICAgXSk7XG5cbiAgICAgIH0sXG5cbiAgICAgIF9jb21waWxlQW5kTGluazogZnVuY3Rpb24ocGFnZUVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBsaW5rID0gJGNvbXBpbGUocGFnZUVsZW1lbnQpO1xuICAgICAgICB2YXIgcGFnZVNjb3BlID0gdGhpcy5fc2NvcGUuJG5ldygpO1xuICAgICAgICBsaW5rKHBhZ2VTY29wZSk7XG5cbiAgICAgICAgcGFnZVNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY2FsbGJhY2socGFnZUVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIF9kZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XG5cbiAgICAgICAgdGhpcy5fY2xlYXJEZXJpdmluZ0V2ZW50cygpO1xuICAgICAgICB0aGlzLl9jbGVhckRlcml2aW5nTWV0aG9kcygpO1xuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9zY29wZSA9IHRoaXMuX2F0dHJzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBNaWNyb0V2ZW50Lm1peGluKFRhYmJhclZpZXcpO1xuXG4gICAgVGFiYmFyVmlldy5yZWdpc3RlckFuaW1hdG9yID0gZnVuY3Rpb24obmFtZSwgQW5pbWF0b3IpIHtcbiAgICAgIHJldHVybiB3aW5kb3cub25zLlRhYmJhckVsZW1lbnQucmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcik7XG4gICAgfTtcblxuICAgIHJldHVybiBUYWJiYXJWaWV3O1xuICB9XSk7XG5cbn0pKCk7XG4iLCIoZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmRpcmVjdGl2ZSgnb25zQmFja0J1dHRvbicsIFsnJG9uc2VuJywgJyRjb21waWxlJywgJ0dlbmVyaWNWaWV3JywgJ0NvbXBvbmVudENsZWFuZXInLCBmdW5jdGlvbigkb25zZW4sICRjb21waWxlLCBHZW5lcmljVmlldywgQ29tcG9uZW50Q2xlYW5lcikge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlciwgdHJhbnNjbHVkZSkge1xuICAgICAgICAgICAgdmFyIGJhY2tCdXR0b24gPSBHZW5lcmljVmlldy5yZWdpc3RlcihzY29wZSwgZWxlbWVudCwgYXR0cnMsIHtcbiAgICAgICAgICAgICAgdmlld0tleTogJ29ucy1iYWNrLWJ1dHRvbidcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGJhY2tCdXR0b24uX2V2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgJG9uc2VuLnJlbW92ZU1vZGlmaWVyTWV0aG9kcyhiYWNrQnV0dG9uKTtcbiAgICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgQ29tcG9uZW50Q2xlYW5lci5vbkRlc3Ryb3koc2NvcGUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBDb21wb25lbnRDbGVhbmVyLmRlc3Ryb3lTY29wZShzY29wZSk7XG4gICAgICAgICAgICAgIENvbXBvbmVudENsZWFuZXIuZGVzdHJveUF0dHJpYnV0ZXMoYXR0cnMpO1xuICAgICAgICAgICAgICBlbGVtZW50ID0gc2NvcGUgPSBhdHRycyA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvc3Q6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLmRpcmVjdGl2ZSgnb25zQm90dG9tVG9vbGJhcicsIFsnJG9uc2VuJywgJ0dlbmVyaWNWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBHZW5lcmljVmlldykge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgbGluazoge1xuICAgICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgIEdlbmVyaWNWaWV3LnJlZ2lzdGVyKHNjb3BlLCBlbGVtZW50LCBhdHRycywge1xuICAgICAgICAgICAgdmlld0tleTogJ29ucy1ib3R0b21Ub29sYmFyJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIHBvc3Q6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1dKTtcblxufSkoKTtcblxuIiwiXG4vKipcbiAqIEBlbGVtZW50IG9ucy1idXR0b25cbiAqL1xuXG4oZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLmRpcmVjdGl2ZSgnb25zQnV0dG9uJywgWyckb25zZW4nLCAnR2VuZXJpY1ZpZXcnLCBmdW5jdGlvbigkb25zZW4sIEdlbmVyaWNWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgdmFyIGJ1dHRvbiA9IEdlbmVyaWNWaWV3LnJlZ2lzdGVyKHNjb3BlLCBlbGVtZW50LCBhdHRycywge1xuICAgICAgICAgIHZpZXdLZXk6ICdvbnMtYnV0dG9uJ1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYnV0dG9uLCAnZGlzYWJsZWQnLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFswXS5kaXNhYmxlZDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5fZWxlbWVudFswXS5kaXNhYmxlZCA9IHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xuXG5cblxufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKTtcblxuICBtb2R1bGUuZGlyZWN0aXZlKCdvbnNEdW1teUZvckluaXQnLCBbJyRyb290U2NvcGUnLCBmdW5jdGlvbigkcm9vdFNjb3BlKSB7XG4gICAgdmFyIGlzUmVhZHkgPSBmYWxzZTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG5cbiAgICAgIGxpbms6IHtcbiAgICAgICAgcG9zdDogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoIWlzUmVhZHkpIHtcbiAgICAgICAgICAgIGlzUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckb25zLXJlYWR5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG5cbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgRVZFTlRTID1cbiAgICAoJ2RyYWcgZHJhZ2xlZnQgZHJhZ3JpZ2h0IGRyYWd1cCBkcmFnZG93biBob2xkIHJlbGVhc2Ugc3dpcGUgc3dpcGVsZWZ0IHN3aXBlcmlnaHQgJyArXG4gICAgICAnc3dpcGV1cCBzd2lwZWRvd24gdGFwIGRvdWJsZXRhcCB0b3VjaCB0cmFuc2Zvcm0gcGluY2ggcGluY2hpbiBwaW5jaG91dCByb3RhdGUnKS5zcGxpdCgvICsvKTtcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc0dlc3R1cmVEZXRlY3RvcicsIFsnJG9uc2VuJywgZnVuY3Rpb24oJG9uc2VuKSB7XG5cbiAgICB2YXIgc2NvcGVEZWYgPSBFVkVOVFMucmVkdWNlKGZ1bmN0aW9uKGRpY3QsIG5hbWUpIHtcbiAgICAgIGRpY3RbJ25nJyArIHRpdGxpemUobmFtZSldID0gJyYnO1xuICAgICAgcmV0dXJuIGRpY3Q7XG4gICAgfSwge30pO1xuXG4gICAgZnVuY3Rpb24gdGl0bGl6ZShzdHIpIHtcbiAgICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBzY29wZTogc2NvcGVEZWYsXG5cbiAgICAgIC8vIE5PVEU6IFRoaXMgZWxlbWVudCBtdXN0IGNvZXhpc3RzIHdpdGggbmctY29udHJvbGxlci5cbiAgICAgIC8vIERvIG5vdCB1c2UgaXNvbGF0ZWQgc2NvcGUgYW5kIHRlbXBsYXRlJ3MgbmctdHJhbnNjbHVkZS5cbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgdHJhbnNjbHVkZTogdHJ1ZSxcblxuICAgICAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGxpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBfLCB0cmFuc2NsdWRlKSB7XG5cbiAgICAgICAgICB0cmFuc2NsdWRlKHNjb3BlLiRwYXJlbnQsIGZ1bmN0aW9uKGNsb25lZCkge1xuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQoY2xvbmVkKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBhdHRyID0gJ25nJyArIHRpdGxpemUoZXZlbnQudHlwZSk7XG5cbiAgICAgICAgICAgIGlmIChhdHRyIGluIHNjb3BlRGVmKSB7XG4gICAgICAgICAgICAgIHNjb3BlW2F0dHJdKHskZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHZhciBnZXN0dXJlRGV0ZWN0b3I7XG5cbiAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBnZXN0dXJlRGV0ZWN0b3IgPSBlbGVtZW50WzBdLl9nZXN0dXJlRGV0ZWN0b3I7XG4gICAgICAgICAgICBnZXN0dXJlRGV0ZWN0b3Iub24oRVZFTlRTLmpvaW4oJyAnKSwgaGFuZGxlcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAkb25zZW4uY2xlYW5lci5vbkRlc3Ryb3koc2NvcGUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZ2VzdHVyZURldGVjdG9yLm9mZihFVkVOVFMuam9pbignICcpLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICRvbnNlbi5jbGVhckNvbXBvbmVudCh7XG4gICAgICAgICAgICAgIHNjb3BlOiBzY29wZSxcbiAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgYXR0cnM6IGF0dHJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGdlc3R1cmVEZXRlY3Rvci5lbGVtZW50ID0gc2NvcGUgPSBlbGVtZW50ID0gYXR0cnMgPSBudWxsO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgJG9uc2VuLmZpcmVDb21wb25lbnRFdmVudChlbGVtZW50WzBdLCAnaW5pdCcpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcbn0pKCk7XG5cbiIsIlxuLyoqXG4gKiBAZWxlbWVudCBvbnMtaWNvblxuICovXG5cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNJY29uJywgWyckb25zZW4nLCAnR2VuZXJpY1ZpZXcnLCBmdW5jdGlvbigkb25zZW4sIEdlbmVyaWNWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJzKSB7XG5cbiAgICAgICAgaWYgKGF0dHJzLmljb24uaW5kZXhPZigne3snKSAhPT0gLTEpIHtcbiAgICAgICAgICBhdHRycy4kb2JzZXJ2ZSgnaWNvbicsICgpID0+IHtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiBlbGVtZW50WzBdLl91cGRhdGUoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHNjb3BlLCBlbGVtZW50LCBhdHRycykgPT4ge1xuICAgICAgICAgIEdlbmVyaWNWaWV3LnJlZ2lzdGVyKHNjb3BlLCBlbGVtZW50LCBhdHRycywge1xuICAgICAgICAgICAgdmlld0tleTogJ29ucy1pY29uJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgICAgfTtcblxuICAgICAgfVxuXG4gICAgfTtcbiAgfV0pO1xuXG59KSgpO1xuXG4iLCIvKipcbiAqIEBlbGVtZW50IG9ucy1pZi1vcmllbnRhdGlvblxuICogQGNhdGVnb3J5IGNvbmRpdGlvbmFsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUNvbmRpdGlvbmFsbHkgZGlzcGxheSBjb250ZW50IGRlcGVuZGluZyBvbiBzY3JlZW4gb3JpZW50YXRpb24uIFZhbGlkIHZhbHVlcyBhcmUgcG9ydHJhaXQgYW5kIGxhbmRzY2FwZS4gRGlmZmVyZW50IGZyb20gb3RoZXIgY29tcG9uZW50cywgdGhpcyBjb21wb25lbnQgaXMgdXNlZCBhcyBhdHRyaWJ1dGUgaW4gYW55IGVsZW1lbnQuWy9lbl1cbiAqICAgW2phXeeUu+mdouOBruWQkeOBjeOBq+W/nOOBmOOBpuOCs+ODs+ODhuODs+ODhOOBruWItuW+oeOCkuihjOOBhOOBvuOBmeOAgnBvcnRyYWl044KC44GX44GP44GvbGFuZHNjYXBl44KS5oyH5a6a44Gn44GN44G+44GZ44CC44GZ44G544Gm44Gu6KaB57Sg44Gu5bGe5oCn44Gr5L2/55So44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1pZi1wbGF0Zm9ybSBbZW5db25zLWlmLXBsYXRmb3JtIGNvbXBvbmVudFsvZW5dW2phXW9ucy1pZi1wbGF0Zm9ybeOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZ3VpZGUgVXRpbGl0eUFQSXMgW2VuXU90aGVyIHV0aWxpdHkgQVBJc1svZW5dW2phXeS7luOBruODpuODvOODhuOCo+ODquODhuOCo0FQSVsvamFdXG4gKiBAZXhhbXBsZVxuICogPGRpdiBvbnMtaWYtb3JpZW50YXRpb249XCJwb3J0cmFpdFwiPlxuICogICA8cD5UaGlzIHdpbGwgb25seSBiZSB2aXNpYmxlIGluIHBvcnRyYWl0IG1vZGUuPC9wPlxuICogPC9kaXY+XG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1pZi1vcmllbnRhdGlvblxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1FaXRoZXIgXCJwb3J0cmFpdFwiIG9yIFwibGFuZHNjYXBlXCIuWy9lbl1cbiAqICAgW2phXXBvcnRyYWl044KC44GX44GP44GvbGFuZHNjYXBl44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKTtcblxuICBtb2R1bGUuZGlyZWN0aXZlKCdvbnNJZk9yaWVudGF0aW9uJywgWyckb25zZW4nLCAnJG9uc0dsb2JhbCcsIGZ1bmN0aW9uKCRvbnNlbiwgJG9uc0dsb2JhbCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG5cbiAgICAgIC8vIE5PVEU6IFRoaXMgZWxlbWVudCBtdXN0IGNvZXhpc3RzIHdpdGggbmctY29udHJvbGxlci5cbiAgICAgIC8vIERvIG5vdCB1c2UgaXNvbGF0ZWQgc2NvcGUgYW5kIHRlbXBsYXRlJ3MgbmctdHJhbnNjbHVkZS5cbiAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLFxuICAgICAgc2NvcGU6IGZhbHNlLFxuXG4gICAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgYXR0cnMuJG9ic2VydmUoJ29uc0lmT3JpZW50YXRpb24nLCB1cGRhdGUpO1xuICAgICAgICAgICRvbnNHbG9iYWwub3JpZW50YXRpb24ub24oJ2NoYW5nZScsIHVwZGF0ZSk7XG5cbiAgICAgICAgICB1cGRhdGUoKTtcblxuICAgICAgICAgICRvbnNlbi5jbGVhbmVyLm9uRGVzdHJveShzY29wZSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkb25zR2xvYmFsLm9yaWVudGF0aW9uLm9mZignY2hhbmdlJywgdXBkYXRlKTtcblxuICAgICAgICAgICAgJG9uc2VuLmNsZWFyQ29tcG9uZW50KHtcbiAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgc2NvcGU6IHNjb3BlLFxuICAgICAgICAgICAgICBhdHRyczogYXR0cnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxlbWVudCA9IHNjb3BlID0gYXR0cnMgPSBudWxsO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgICAgICAgdmFyIHVzZXJPcmllbnRhdGlvbiA9ICgnJyArIGF0dHJzLm9uc0lmT3JpZW50YXRpb24pLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB2YXIgb3JpZW50YXRpb24gPSBnZXRMYW5kc2NhcGVPclBvcnRyYWl0KCk7XG5cbiAgICAgICAgICAgIGlmICh1c2VyT3JpZW50YXRpb24gPT09ICdwb3J0cmFpdCcgfHwgdXNlck9yaWVudGF0aW9uID09PSAnbGFuZHNjYXBlJykge1xuICAgICAgICAgICAgICBpZiAodXNlck9yaWVudGF0aW9uID09PSBvcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJycpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIGdldExhbmRzY2FwZU9yUG9ydHJhaXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gJG9uc0dsb2JhbC5vcmllbnRhdGlvbi5pc1BvcnRyYWl0KCkgPyAncG9ydHJhaXQnIDogJ2xhbmRzY2FwZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcbn0pKCk7XG5cbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLWlmLXBsYXRmb3JtXG4gKiBAY2F0ZWdvcnkgY29uZGl0aW9uYWxcbiAqIEBkZXNjcmlwdGlvblxuICogICAgW2VuXUNvbmRpdGlvbmFsbHkgZGlzcGxheSBjb250ZW50IGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gLyBicm93c2VyLiBWYWxpZCB2YWx1ZXMgYXJlIFwib3BlcmFcIiwgXCJmaXJlZm94XCIsIFwic2FmYXJpXCIsIFwiY2hyb21lXCIsIFwiaWVcIiwgXCJlZGdlXCIsIFwiYW5kcm9pZFwiLCBcImJsYWNrYmVycnlcIiwgXCJpb3NcIiBhbmQgXCJ3cFwiLlsvZW5dXG4gKiAgICBbamFd44OX44Op44OD44OI44OV44Kp44O844Og44KE44OW44Op44Km44K244O844Gr5b+c44GY44Gm44Kz44Oz44OG44Oz44OE44Gu5Yi25b6h44KS44GK44GT44Gq44GE44G+44GZ44CCb3BlcmEsIGZpcmVmb3gsIHNhZmFyaSwgY2hyb21lLCBpZSwgZWRnZSwgYW5kcm9pZCwgYmxhY2tiZXJyeSwgaW9zLCB3cOOBruOBhOOBmuOCjOOBi+OBruWApOOCkuepuueZveWMuuWIh+OCiuOBp+ikh+aVsOaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAc2VlYWxzbyBvbnMtaWYtb3JpZW50YXRpb24gW2VuXW9ucy1pZi1vcmllbnRhdGlvbiBjb21wb25lbnRbL2VuXVtqYV1vbnMtaWYtb3JpZW50YXRpb27jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGd1aWRlIFV0aWxpdHlBUElzIFtlbl1PdGhlciB1dGlsaXR5IEFQSXNbL2VuXVtqYV3ku5bjga7jg6bjg7zjg4bjgqPjg6rjg4bjgqNBUElbL2phXVxuICogQGV4YW1wbGVcbiAqIDxkaXYgb25zLWlmLXBsYXRmb3JtPVwiYW5kcm9pZFwiPlxuICogICAuLi5cbiAqIDwvZGl2PlxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtaWYtcGxhdGZvcm1cbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAaW5pdG9ubHlcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dT25lIG9yIG11bHRpcGxlIHNwYWNlIHNlcGFyYXRlZCB2YWx1ZXM6IFwib3BlcmFcIiwgXCJmaXJlZm94XCIsIFwic2FmYXJpXCIsIFwiY2hyb21lXCIsIFwiaWVcIiwgXCJlZGdlXCIsIFwiYW5kcm9pZFwiLCBcImJsYWNrYmVycnlcIiwgXCJpb3NcIiBvciBcIndwXCIuWy9lbl1cbiAqICAgW2phXVwib3BlcmFcIiwgXCJmaXJlZm94XCIsIFwic2FmYXJpXCIsIFwiY2hyb21lXCIsIFwiaWVcIiwgXCJlZGdlXCIsIFwiYW5kcm9pZFwiLCBcImJsYWNrYmVycnlcIiwgXCJpb3NcIiwgXCJ3cFwi44Gu44GE44Ga44KM44GL56m655m95Yy65YiH44KK44Gn6KSH5pWw5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmRpcmVjdGl2ZSgnb25zSWZQbGF0Zm9ybScsIFsnJG9uc2VuJywgZnVuY3Rpb24oJG9uc2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICByZXBsYWNlOiBmYWxzZSxcblxuICAgICAgLy8gTk9URTogVGhpcyBlbGVtZW50IG11c3QgY29leGlzdHMgd2l0aCBuZy1jb250cm9sbGVyLlxuICAgICAgLy8gRG8gbm90IHVzZSBpc29sYXRlZCBzY29wZSBhbmQgdGVtcGxhdGUncyBuZy10cmFuc2NsdWRlLlxuICAgICAgdHJhbnNjbHVkZTogZmFsc2UsXG4gICAgICBzY29wZTogZmFsc2UsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gICAgICAgIHZhciBwbGF0Zm9ybSA9IGdldFBsYXRmb3JtU3RyaW5nKCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgIGF0dHJzLiRvYnNlcnZlKCdvbnNJZlBsYXRmb3JtJywgZnVuY3Rpb24odXNlclBsYXRmb3JtKSB7XG4gICAgICAgICAgICBpZiAodXNlclBsYXRmb3JtKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdXBkYXRlKCk7XG5cbiAgICAgICAgICAkb25zZW4uY2xlYW5lci5vbkRlc3Ryb3koc2NvcGUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJG9uc2VuLmNsZWFyQ29tcG9uZW50KHtcbiAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgc2NvcGU6IHNjb3BlLFxuICAgICAgICAgICAgICBhdHRyczogYXR0cnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxlbWVudCA9IHNjb3BlID0gYXR0cnMgPSBudWxsO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgICAgICAgdmFyIHVzZXJQbGF0Zm9ybXMgPSBhdHRycy5vbnNJZlBsYXRmb3JtLnRvTG93ZXJDYXNlKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBpZiAodXNlclBsYXRmb3Jtcy5pbmRleE9mKHBsYXRmb3JtLnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0UGxhdGZvcm1TdHJpbmcoKSB7XG5cbiAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKSkge1xuICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSkpIHx8IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9SSU0gVGFibGV0IE9TL2kpKSB8fCAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQkIxMC9pKSkpIHtcbiAgICAgICAgICAgIHJldHVybiAnYmxhY2tiZXJyeSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSkpIHtcbiAgICAgICAgICAgIHJldHVybiAnaW9zJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvV2luZG93cyBQaG9uZXxJRU1vYmlsZXxXUERlc2t0b3AvaSkpIHtcbiAgICAgICAgICAgIHJldHVybiAnd3AnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9wZXJhIDguMCsgKFVBIGRldGVjdGlvbiB0byBkZXRlY3QgQmxpbmsvdjgtcG93ZXJlZCBPcGVyYSlcbiAgICAgICAgICB2YXIgaXNPcGVyYSA9ICEhd2luZG93Lm9wZXJhIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignIE9QUi8nKSA+PSAwO1xuICAgICAgICAgIGlmIChpc09wZXJhKSB7XG4gICAgICAgICAgICByZXR1cm4gJ29wZXJhJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaXNGaXJlZm94ID0gdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJzsgICAvLyBGaXJlZm94IDEuMCtcbiAgICAgICAgICBpZiAoaXNGaXJlZm94KSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpcmVmb3gnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpc1NhZmFyaSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cuSFRNTEVsZW1lbnQpLmluZGV4T2YoJ0NvbnN0cnVjdG9yJykgPiAwO1xuICAgICAgICAgIC8vIEF0IGxlYXN0IFNhZmFyaSAzKzogXCJbb2JqZWN0IEhUTUxFbGVtZW50Q29uc3RydWN0b3JdXCJcbiAgICAgICAgICBpZiAoaXNTYWZhcmkpIHtcbiAgICAgICAgICAgIHJldHVybiAnc2FmYXJpJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaXNFZGdlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgRWRnZS8nKSA+PSAwO1xuICAgICAgICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAnZWRnZSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGlzQ2hyb21lID0gISF3aW5kb3cuY2hyb21lICYmICFpc09wZXJhICYmICFpc0VkZ2U7IC8vIENocm9tZSAxK1xuICAgICAgICAgIGlmIChpc0Nocm9tZSkge1xuICAgICAgICAgICAgcmV0dXJuICdjaHJvbWUnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpc0lFID0gLypAY2Nfb24hQCovZmFsc2UgfHwgISFkb2N1bWVudC5kb2N1bWVudE1vZGU7IC8vIEF0IGxlYXN0IElFNlxuICAgICAgICAgIGlmIChpc0lFKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2llJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xufSkoKTtcbiIsIi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQGlkIGlucHV0XG4gKiBAbmFtZSBvbnMtaW5wdXRcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dSW5wdXQgY29tcG9uZW50LlsvZW5dXG4gKiAgW2phXWlucHV044Kz44Oz44Od4oCV44ON44Oz44OI44Gn44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIG9qUXhMalxuICogQGd1aWRlIFVzaW5nRm9ybUNvbXBvbmVudHNcbiAqICAgW2VuXVVzaW5nIGZvcm0gY29tcG9uZW50c1svZW5dXG4gKiAgIFtqYV3jg5Xjgqnjg7zjg6DjgpLkvb/jgYZbL2phXVxuICogQGd1aWRlIEV2ZW50SGFuZGxpbmdcbiAqICAgW2VuXUV2ZW50IGhhbmRsaW5nIGRlc2NyaXB0aW9uc1svZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jlh6bnkIbjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtaW5wdXQ+PC9vbnMtaW5wdXQ+XG4gKiA8b25zLWlucHV0IG1vZGlmaWVyPVwibWF0ZXJpYWxcIiBsYWJlbD1cIlVzZXJuYW1lXCI+PC9vbnMtaW5wdXQ+XG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgYXR0cmlidXRlXG4gKiBAbmFtZSBsYWJlbFxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVGV4dCBmb3IgYW5pbWF0ZWQgZmxvYXRpbmcgbGFiZWwuWy9lbl1cbiAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+OBleOBm+OCi+ODleODreODvOODhuOCo+ODs+OCsOODqeODmeODq+OBruODhuOCreOCueODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgYXR0cmlidXRlXG4gKiBAbmFtZSBmbG9hdFxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHByZXNlbnQsIHRoZSBsYWJlbCB3aWxsIGJlIGFuaW1hdGVkLlsvZW5dXG4gKiAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+aZguOAgeODqeODmeODq+OBr+OCouODi+ODoeODvOOCt+ODp+ODs+OBmeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgYXR0cmlidXRlXG4gKiBAbmFtZSBuZy1tb2RlbFxuICogQGV4dGVuc2lvbk9mIGFuZ3VsYXJcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQmluZCB0aGUgdmFsdWUgdG8gYSBtb2RlbC4gV29ya3MganVzdCBsaWtlIGZvciBub3JtYWwgaW5wdXQgZWxlbWVudHMuWy9lbl1cbiAqICAgW2phXeOBk+OBruimgee0oOOBruWApOOCkuODouODh+ODq+OBq+e0kOS7mOOBkeOBvuOBmeOAgumAmuW4uOOBrmlucHV06KaB57Sg44Gu5qeY44Gr5YuV5L2c44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBhdHRyaWJ1dGVcbiAqIEBuYW1lIG5nLWNoYW5nZVxuICogQGV4dGVuc2lvbk9mIGFuZ3VsYXJcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRXhlY3V0ZXMgYW4gZXhwcmVzc2lvbiB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLiBXb3JrcyBqdXN0IGxpa2UgZm9yIG5vcm1hbCBpbnB1dCBlbGVtZW50cy5bL2VuXVxuICogICBbamFd5YCk44GM5aSJ44KP44Gj44Gf5pmC44Gr44GT44Gu5bGe5oCn44Gn5oyH5a6a44GX44GfZXhwcmVzc2lvbuOBjOWun+ihjOOBleOCjOOBvuOBmeOAgumAmuW4uOOBrmlucHV06KaB57Sg44Gu5qeY44Gr5YuV5L2c44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLmRpcmVjdGl2ZSgnb25zSW5wdXQnLCBbJyRwYXJzZScsIGZ1bmN0aW9uKCRwYXJzZSkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgcmVwbGFjZTogZmFsc2UsXG4gICAgICBzY29wZTogZmFsc2UsXG5cbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICBsZXQgZWwgPSBlbGVtZW50WzBdO1xuXG4gICAgICAgIGNvbnN0IG9uSW5wdXQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2V0ID0gJHBhcnNlKGF0dHJzLm5nTW9kZWwpLmFzc2lnbjtcblxuICAgICAgICAgIGlmIChlbC5faXNUZXh0SW5wdXQpIHtcbiAgICAgICAgICAgIHNldChzY29wZSwgZWwudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChlbC50eXBlID09PSAncmFkaW8nICYmIGVsLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIHNldChzY29wZSwgZWwudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldChzY29wZSwgZWwuY2hlY2tlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF0dHJzLm5nQ2hhbmdlKSB7XG4gICAgICAgICAgICBzY29wZS4kZXZhbChhdHRycy5uZ0NoYW5nZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NvcGUuJHBhcmVudC4kZXZhbEFzeW5jKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGF0dHJzLm5nTW9kZWwpIHtcbiAgICAgICAgICBzY29wZS4kd2F0Y2goYXR0cnMubmdNb2RlbCwgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWwuX2lzVGV4dElucHV0ICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZWwudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVsLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgICAgZWwuY2hlY2tlZCA9IHZhbHVlID09PSBlbC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBlbC5jaGVja2VkID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBlbC5faXNUZXh0SW5wdXRcbiAgICAgICAgICAgID8gZWxlbWVudC5vbignaW5wdXQnLCBvbklucHV0KVxuICAgICAgICAgICAgOiBlbGVtZW50Lm9uKCdjaGFuZ2UnLCBvbklucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCAoKSA9PiB7XG4gICAgICAgICAgZWwuX2lzVGV4dElucHV0XG4gICAgICAgICAgICA/IGVsZW1lbnQub2ZmKCdpbnB1dCcsIG9uSW5wdXQpXG4gICAgICAgICAgICA6IGVsZW1lbnQub2ZmKCdjaGFuZ2UnLCBvbklucHV0KTtcblxuICAgICAgICAgIHNjb3BlID0gZWxlbWVudCA9IGF0dHJzID0gZWwgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMta2V5Ym9hcmQtYWN0aXZlXG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDb25kaXRpb25hbGx5IGRpc3BsYXkgY29udGVudCBkZXBlbmRpbmcgb24gaWYgdGhlIHNvZnR3YXJlIGtleWJvYXJkIGlzIHZpc2libGUgb3IgaGlkZGVuLlxuICogICAgIFRoaXMgY29tcG9uZW50IHJlcXVpcmVzIGNvcmRvdmEgYW5kIHRoYXQgdGhlIGNvbS5pb25pYy5rZXlib2FyZCBwbHVnaW4gaXMgaW5zdGFsbGVkLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg44K944OV44OI44Km44Kn44Ki44Kt44O844Oc44O844OJ44GM6KGo56S644GV44KM44Gm44GE44KL44GL44Gp44GG44GL44Gn44CB44Kz44Oz44OG44Oz44OE44KS6KGo56S644GZ44KL44GL44Gp44GG44GL44KS5YiH44KK5pu/44GI44KL44GT44Go44GM5Ye65p2l44G+44GZ44CCXG4gKiAgICAg44GT44Gu44Kz44Oz44Od44O844ON44Oz44OI44Gv44CBQ29yZG92YeOChGNvbS5pb25pYy5rZXlib2FyZOODl+ODqeOCsOOCpOODs+OCkuW/heimgeOBqOOBl+OBvuOBmeOAglxuICogICBbL2phXVxuICogQGd1aWRlIFV0aWxpdHlBUElzXG4gKiAgIFtlbl1PdGhlciB1dGlsaXR5IEFQSXNbL2VuXVxuICogICBbamFd5LuW44Gu44Om44O844OG44Kj44Oq44OG44KjQVBJWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IG9ucy1rZXlib2FyZC1hY3RpdmU+XG4gKiAgIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGUgc29mdHdhcmUga2V5Ym9hcmQgaXMgb3Blbi5cbiAqIDwvZGl2PlxuICogPGRpdiBvbnMta2V5Ym9hcmQtaW5hY3RpdmU+XG4gKiAgIFRoZXJlIGlzIGFsc28gYSBjb21wb25lbnQgdGhhdCBkb2VzIHRoZSBvcHBvc2l0ZS5cbiAqIDwvZGl2PlxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMta2V5Ym9hcmQtYWN0aXZlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRoZSBjb250ZW50IG9mIHRhZ3Mgd2l0aCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIHZpc2libGUgd2hlbiB0aGUgc29mdHdhcmUga2V5Ym9hcmQgaXMgb3Blbi5bL2VuXVxuICogICBbamFd44GT44Gu5bGe5oCn44GM44Gk44GE44Gf6KaB57Sg44Gv44CB44K944OV44OI44Km44Kn44Ki44Kt44O844Oc44O844OJ44GM6KGo56S644GV44KM44Gf5pmC44Gr5Yid44KB44Gm6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLWtleWJvYXJkLWluYWN0aXZlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRoZSBjb250ZW50IG9mIHRhZ3Mgd2l0aCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIHZpc2libGUgd2hlbiB0aGUgc29mdHdhcmUga2V5Ym9hcmQgaXMgaGlkZGVuLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgaTjgYTjgZ/opoHntKDjga/jgIHjgr3jg5Xjg4jjgqbjgqfjgqLjgq3jg7zjg5zjg7zjg4njgYzpmqDjgozjgabjgYTjgovmmYLjga7jgb/ooajnpLrjgZXjgozjgb7jgZnjgIJbL2phXVxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKTtcblxuICB2YXIgY29tcGlsZUZ1bmN0aW9uID0gZnVuY3Rpb24oc2hvdywgJG9uc2VuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgdmFyIGRpc3BTaG93ID0gc2hvdyA/ICdibG9jaycgOiAnbm9uZScsXG4gICAgICAgICAgICBkaXNwSGlkZSA9IHNob3cgPyAnbm9uZScgOiAnYmxvY2snO1xuXG4gICAgICAgIHZhciBvblNob3cgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsIGRpc3BTaG93KTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgb25IaWRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCBkaXNwSGlkZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIG9uSW5pdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICBpZiAoZS52aXNpYmxlKSB7XG4gICAgICAgICAgICBvblNob3coKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb25IaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG9ucy5zb2Z0d2FyZUtleWJvYXJkLm9uKCdzaG93Jywgb25TaG93KTtcbiAgICAgICAgb25zLnNvZnR3YXJlS2V5Ym9hcmQub24oJ2hpZGUnLCBvbkhpZGUpO1xuICAgICAgICBvbnMuc29mdHdhcmVLZXlib2FyZC5vbignaW5pdCcsIG9uSW5pdCk7XG5cbiAgICAgICAgaWYgKG9ucy5zb2Z0d2FyZUtleWJvYXJkLl92aXNpYmxlKSB7XG4gICAgICAgICAgb25TaG93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25IaWRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAkb25zZW4uY2xlYW5lci5vbkRlc3Ryb3koc2NvcGUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIG9ucy5zb2Z0d2FyZUtleWJvYXJkLm9mZignc2hvdycsIG9uU2hvdyk7XG4gICAgICAgICAgb25zLnNvZnR3YXJlS2V5Ym9hcmQub2ZmKCdoaWRlJywgb25IaWRlKTtcbiAgICAgICAgICBvbnMuc29mdHdhcmVLZXlib2FyZC5vZmYoJ2luaXQnLCBvbkluaXQpO1xuXG4gICAgICAgICAgJG9uc2VuLmNsZWFyQ29tcG9uZW50KHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgICBzY29wZTogc2NvcGUsXG4gICAgICAgICAgICBhdHRyczogYXR0cnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlbGVtZW50ID0gc2NvcGUgPSBhdHRycyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIG1vZHVsZS5kaXJlY3RpdmUoJ29uc0tleWJvYXJkQWN0aXZlJywgWyckb25zZW4nLCBmdW5jdGlvbigkb25zZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgdHJhbnNjbHVkZTogZmFsc2UsXG4gICAgICBzY29wZTogZmFsc2UsXG4gICAgICBjb21waWxlOiBjb21waWxlRnVuY3Rpb24odHJ1ZSwgJG9uc2VuKVxuICAgIH07XG4gIH1dKTtcblxuICBtb2R1bGUuZGlyZWN0aXZlKCdvbnNLZXlib2FyZEluYWN0aXZlJywgWyckb25zZW4nLCBmdW5jdGlvbigkb25zZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgdHJhbnNjbHVkZTogZmFsc2UsXG4gICAgICBzY29wZTogZmFsc2UsXG4gICAgICBjb21waWxlOiBjb21waWxlRnVuY3Rpb24oZmFsc2UsICRvbnNlbilcbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNMaXN0JywgWyckb25zZW4nLCAnR2VuZXJpY1ZpZXcnLCBmdW5jdGlvbigkb25zZW4sIEdlbmVyaWNWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgR2VuZXJpY1ZpZXcucmVnaXN0ZXIoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCB7dmlld0tleTogJ29ucy1saXN0J30pO1xuICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xuXG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNMaXN0SGVhZGVyJywgWyckb25zZW4nLCAnR2VuZXJpY1ZpZXcnLCBmdW5jdGlvbigkb25zZW4sIEdlbmVyaWNWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgR2VuZXJpY1ZpZXcucmVnaXN0ZXIoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCB7dmlld0tleTogJ29ucy1saXN0SGVhZGVyJ30pO1xuICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xuXG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNMaXN0SXRlbScsIFsnJG9uc2VuJywgJ0dlbmVyaWNWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBHZW5lcmljVmlldykge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgIEdlbmVyaWNWaWV3LnJlZ2lzdGVyKHNjb3BlLCBlbGVtZW50LCBhdHRycywge3ZpZXdLZXk6ICdvbnMtbGlzdC1pdGVtJ30pO1xuICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xufSkoKTtcbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLWxvYWRpbmctcGxhY2Vob2xkZXJcbiAqIEBjYXRlZ29yeSB1dGlsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXURpc3BsYXkgYSBwbGFjZWhvbGRlciB3aGlsZSB0aGUgY29udGVudCBpcyBsb2FkaW5nLlsvZW5dXG4gKiAgIFtqYV1PbnNlbiBVSeOBjOiqreOBv+i+vOOBvuOCjOOCi+OBvuOBp+OBq+ihqOekuuOBmeOCi+ODl+ODrOODvOOCueODm+ODq+ODgOODvOOCkuihqOePvuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZ3VpZGUgVXRpbGl0eUFQSXMgW2VuXU90aGVyIHV0aWxpdHkgQVBJc1svZW5dW2phXeS7luOBruODpuODvOODhuOCo+ODquODhuOCo0FQSVsvamFdXG4gKiBAZXhhbXBsZVxuICogPGRpdiBvbnMtbG9hZGluZy1wbGFjZWhvbGRlcj1cInBhZ2UuaHRtbFwiPlxuICogICBMb2FkaW5nLi4uXG4gKiA8L2Rpdj5cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLWxvYWRpbmctcGxhY2Vob2xkZXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVGhlIHVybCBvZiB0aGUgcGFnZSB0byBsb2FkLlsvZW5dXG4gKiAgIFtqYV3oqq3jgb/ovrzjgoDjg5rjg7zjgrjjga5VUkzjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5cbihmdW5jdGlvbigpe1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNMb2FkaW5nUGxhY2Vob2xkZXInLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICBpZiAoYXR0cnMub25zTG9hZGluZ1BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgb25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyKGVsZW1lbnRbMF0sIGF0dHJzLm9uc0xvYWRpbmdQbGFjZWhvbGRlciwgZnVuY3Rpb24oY29udGVudEVsZW1lbnQsIGRvbmUpIHtcbiAgICAgICAgICAgIG9ucy5jb21waWxlKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIHNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNldEltbWVkaWF0ZShkb25lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59KSgpO1xuIiwiIiwiKGZ1bmN0aW9uKCl7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc1JhbmdlJywgWyckcGFyc2UnLCBmdW5jdGlvbigkcGFyc2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgc2NvcGU6IGZhbHNlLFxuXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcblxuICAgICAgICBjb25zdCBvbklucHV0ID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNldCA9ICRwYXJzZShhdHRycy5uZ01vZGVsKS5hc3NpZ247XG5cbiAgICAgICAgICBzZXQoc2NvcGUsIGVsZW1lbnRbMF0udmFsdWUpO1xuICAgICAgICAgIGlmIChhdHRycy5uZ0NoYW5nZSkge1xuICAgICAgICAgICAgc2NvcGUuJGV2YWwoYXR0cnMubmdDaGFuZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzY29wZS4kcGFyZW50LiRldmFsQXN5bmMoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYXR0cnMubmdNb2RlbCkge1xuICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5uZ01vZGVsLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRbMF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGVsZW1lbnQub24oJ2lucHV0Jywgb25JbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQub2ZmKCdpbnB1dCcsIG9uSW5wdXQpO1xuICAgICAgICAgIHNjb3BlID0gZWxlbWVudCA9IGF0dHJzID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfV0pO1xufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLmRpcmVjdGl2ZSgnb25zUmlwcGxlJywgWyckb25zZW4nLCAnR2VuZXJpY1ZpZXcnLCBmdW5jdGlvbigkb25zZW4sIEdlbmVyaWNWaWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgR2VuZXJpY1ZpZXcucmVnaXN0ZXIoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCB7dmlld0tleTogJ29ucy1yaXBwbGUnfSk7XG4gICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtc2NvcGVcbiAqIEBjYXRlZ29yeSB1dGlsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFsbCBjaGlsZCBlbGVtZW50cyB1c2luZyB0aGUgXCJ2YXJcIiBhdHRyaWJ1dGUgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgc2NvcGUgb2YgdGhpcyBlbGVtZW50LlsvZW5dXG4gKiAgIFtqYV1cInZhclwi5bGe5oCn44KS5L2/44Gj44Gm44GE44KL5YWo44Gm44Gu5a2Q6KaB57Sg44Gudmlld+OCquODluOCuOOCp+OCr+ODiOOBr+OAgeOBk+OBruimgee0oOOBrkFuZ3VsYXJKU+OCueOCs+ODvOODl+OBq+i/veWKoOOBleOCjOOBvuOBmeOAglsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1saXN0PlxuICogICA8b25zLWxpc3QtaXRlbSBvbnMtc2NvcGUgbmctcmVwZWF0PVwiaXRlbSBpbiBpdGVtc1wiPlxuICogICAgIDxvbnMtY2Fyb3VzZWwgdmFyPVwiY2Fyb3VzZWxcIj5cbiAqICAgICAgIDxvbnMtY2Fyb3VzZWwtaXRlbSBuZy1jbGljaz1cImNhcm91c2VsLm5leHQoKVwiPlxuICogICAgICAgICB7eyBpdGVtIH19XG4gKiAgICAgICA8L29ucy1jYXJvdXNlbC1pdGVtPlxuICogICAgICAgPC9vbnMtY2Fyb3VzZWwtaXRlbSBuZy1jbGljaz1cImNhcm91c2VsLnByZXYoKVwiPlxuICogICAgICAgICAuLi5cbiAqICAgICAgIDwvb25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgICAgPC9vbnMtY2Fyb3VzZWw+XG4gKiAgIDwvb25zLWxpc3QtaXRlbT5cbiAqIDwvb25zLWxpc3Q+XG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpO1xuXG4gIG1vZHVsZS5kaXJlY3RpdmUoJ29uc1Njb3BlJywgWyckb25zZW4nLCBmdW5jdGlvbigkb25zZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgdHJhbnNjbHVkZTogZmFsc2UsXG4gICAgICBzY29wZTogZmFsc2UsXG5cbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuZGF0YSgnX3Njb3BlJywgc2NvcGUpO1xuXG4gICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtZW50LmRhdGEoJ19zY29wZScsIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcbn0pKCk7XG4iLCIvKipcbiAqIEBlbGVtZW50IG9ucy1zcGxpdHRlci1jb250ZW50XG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1kZXN0cm95XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJkZXN0cm95XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJkZXN0cm95XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbGFzdFJlYWR5ID0gd2luZG93Lm9ucy5TcGxpdHRlckNvbnRlbnRFbGVtZW50LnJld3JpdGFibGVzLnJlYWR5O1xuICB3aW5kb3cub25zLlNwbGl0dGVyQ29udGVudEVsZW1lbnQucmV3cml0YWJsZXMucmVhZHkgPSBvbnMuX3dhaXREaXJldGl2ZUluaXQoJ29ucy1zcGxpdHRlci1jb250ZW50JywgbGFzdFJlYWR5KTtcblxuICB2YXIgbGFzdExpbmsgPSB3aW5kb3cub25zLlNwbGl0dGVyQ29udGVudEVsZW1lbnQucmV3cml0YWJsZXMubGluaztcbiAgd2luZG93Lm9ucy5TcGxpdHRlckNvbnRlbnRFbGVtZW50LnJld3JpdGFibGVzLmxpbmsgPSBmdW5jdGlvbihlbGVtZW50LCB0YXJnZXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHZpZXcgPSBhbmd1bGFyLmVsZW1lbnQoZWxlbWVudCkuZGF0YSgnb25zLXNwbGl0dGVyLWNvbnRlbnQnKTtcbiAgICBsYXN0TGluayhlbGVtZW50LCB0YXJnZXQsIG9wdGlvbnMsIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgdmlldy5fbGluayh0YXJnZXQsIGNhbGxiYWNrKTtcbiAgICB9KTtcbiAgfTtcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc1NwbGl0dGVyQ29udGVudCcsIFsnJGNvbXBpbGUnLCAnU3BsaXR0ZXJDb250ZW50JywgJyRvbnNlbicsIGZ1bmN0aW9uKCRjb21waWxlLCBTcGxpdHRlckNvbnRlbnQsICRvbnNlbikge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuXG4gICAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRycykge1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcblxuICAgICAgICAgIHZhciB2aWV3ID0gbmV3IFNwbGl0dGVyQ29udGVudChzY29wZSwgZWxlbWVudCwgYXR0cnMpO1xuXG4gICAgICAgICAgJG9uc2VuLmRlY2xhcmVWYXJBdHRyaWJ1dGUoYXR0cnMsIHZpZXcpO1xuICAgICAgICAgICRvbnNlbi5yZWdpc3RlckV2ZW50SGFuZGxlcnModmlldywgJ2Rlc3Ryb3knKTtcblxuICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXNwbGl0dGVyLWNvbnRlbnQnLCB2aWV3KTtcblxuICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZpZXcuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXNwbGl0dGVyLWNvbnRlbnQnLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgJG9uc2VuLmZpcmVDb21wb25lbnRFdmVudChlbGVtZW50WzBdLCAnaW5pdCcpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcbn0pKCk7XG4iLCIvKipcbiAqIEBlbGVtZW50IG9ucy1zcGxpdHRlci1zaWRlXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1kZXN0cm95XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJkZXN0cm95XCIgZXZlbnQgaXMgZmlyZWQuWy9lbl1cbiAqICBbamFdXCJkZXN0cm95XCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcHJlb3BlblxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicHJlb3BlblwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicHJlb3Blblwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXByZWNsb3NlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVjbG9zZVwiIGV2ZW50IGlzIGZpcmVkLlsvZW5dXG4gKiAgW2phXVwicHJlY2xvc2VcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1wb3N0b3BlblxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicG9zdG9wZW5cIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInBvc3RvcGVuXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcG9zdGNsb3NlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwb3N0Y2xvc2VcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInBvc3RjbG9zZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGxhc3RSZWFkeSA9IHdpbmRvdy5vbnMuU3BsaXR0ZXJTaWRlRWxlbWVudC5yZXdyaXRhYmxlcy5yZWFkeTtcbiAgd2luZG93Lm9ucy5TcGxpdHRlclNpZGVFbGVtZW50LnJld3JpdGFibGVzLnJlYWR5ID0gb25zLl93YWl0RGlyZXRpdmVJbml0KCdvbnMtc3BsaXR0ZXItc2lkZScsIGxhc3RSZWFkeSk7XG5cbiAgdmFyIGxhc3RMaW5rID0gd2luZG93Lm9ucy5TcGxpdHRlclNpZGVFbGVtZW50LnJld3JpdGFibGVzLmxpbms7XG4gIHdpbmRvdy5vbnMuU3BsaXR0ZXJTaWRlRWxlbWVudC5yZXdyaXRhYmxlcy5saW5rID0gZnVuY3Rpb24oZWxlbWVudCwgdGFyZ2V0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciB2aWV3ID0gYW5ndWxhci5lbGVtZW50KGVsZW1lbnQpLmRhdGEoJ29ucy1zcGxpdHRlci1zaWRlJyk7XG4gICAgbGFzdExpbmsoZWxlbWVudCwgdGFyZ2V0LCBvcHRpb25zLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgIHZpZXcuX2xpbmsodGFyZ2V0LCBjYWxsYmFjayk7XG4gICAgfSk7XG4gIH07XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNTcGxpdHRlclNpZGUnLCBbJyRjb21waWxlJywgJ1NwbGl0dGVyU2lkZScsICckb25zZW4nLCBmdW5jdGlvbigkY29tcGlsZSwgU3BsaXR0ZXJTaWRlLCAkb25zZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcblxuICAgICAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cnMpIHtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG5cbiAgICAgICAgICB2YXIgdmlldyA9IG5ldyBTcGxpdHRlclNpZGUoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKTtcblxuICAgICAgICAgICRvbnNlbi5kZWNsYXJlVmFyQXR0cmlidXRlKGF0dHJzLCB2aWV3KTtcbiAgICAgICAgICAkb25zZW4ucmVnaXN0ZXJFdmVudEhhbmRsZXJzKHZpZXcsICdkZXN0cm95Jyk7XG5cbiAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zcGxpdHRlci1zaWRlJywgdmlldyk7XG5cbiAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2aWV3Ll9ldmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbGVtZW50LmRhdGEoJ29ucy1zcGxpdHRlci1zaWRlJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGFiLiRpbmplY3QgPSBbJyRvbnNlbiddO1xuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKVxuICAgIC5kaXJlY3RpdmUoJ29uc1RhYicsIHRhYilcbiAgICAuZGlyZWN0aXZlKCdvbnNUYWJiYXJJdGVtJywgdGFiKTsgLy8gZm9yIEJDXG5cbiAgZnVuY3Rpb24gdGFiKCRvbnNlbikge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59KSgpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtdGFiYmFyXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZhclxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1WYXJpYWJsZSBuYW1lIHRvIHJlZmVyIHRoaXMgdGFiIGJhci5bL2VuXVxuICogICBbamFd44GT44Gu44K/44OW44OQ44O844KS5Y+C54Wn44GZ44KL44Gf44KB44Gu5ZCN5YmN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgaGlkZS10YWJzXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtCb29sZWFufVxuICogQGRlZmF1bHQgZmFsc2VcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dV2hldGhlciB0byBoaWRlIHRoZSB0YWJzLiBWYWxpZCB2YWx1ZXMgYXJlIHRydWUvZmFsc2UuWy9lbl1cbiAqICAgW2phXeOCv+ODluOCkumdnuihqOekuuOBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAgnRydWXjgoLjgZfjgY/jga9mYWxzZeOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1yZWFjdGl2ZVxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1BbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIFwicmVhY3RpdmVcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInJlYWN0aXZlXCLjgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/mmYLjga7mjJnli5XjgpLni6zoh6rjgavmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSBvbnMtcHJlY2hhbmdlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgXCJwcmVjaGFuZ2VcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInByZWNoYW5nZVwi44Kk44OZ44Oz44OI44GM55m654Gr44GV44KM44Gf5pmC44Gu5oyZ5YuV44KS54us6Ieq44Gr5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgb25zLXBvc3RjaGFuZ2VcbiAqIEBpbml0b25seVxuICogQHR5cGUge0V4cHJlc3Npb259XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBcInBvc3RjaGFuZ2VcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV1cInBvc3RjaGFuZ2VcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1pbml0XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiBhIHBhZ2UncyBcImluaXRcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV3jg5rjg7zjgrjjga5cImluaXRcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1zaG93XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiBhIHBhZ2UncyBcInNob3dcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV3jg5rjg7zjgrjjga5cInNob3dcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1oaWRlXG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiBhIHBhZ2UncyBcImhpZGVcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV3jg5rjg7zjgrjjga5cImhpZGVcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIG9ucy1kZXN0cm95XG4gKiBAaW5pdG9ubHlcbiAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbiBhIHBhZ2UncyBcImRlc3Ryb3lcIiBldmVudCBpcyBmaXJlZC5bL2VuXVxuICogIFtqYV3jg5rjg7zjgrjjga5cImRlc3Ryb3lcIuOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+aZguOBruaMmeWLleOCkueLrOiHquOBq+aMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKi9cblxuXG4vKipcbiAqIEBtZXRob2Qgb25cbiAqIEBzaWduYXR1cmUgb24oZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlsvZW5dXG4gKiAgIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOBk+OBruOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9uY2VcbiAqIEBzaWduYXR1cmUgb25jZShldmVudE5hbWUsIGxpc3RlbmVyKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0J3Mgb25seSB0cmlnZ2VyZWQgb25jZS5bL2VuXVxuICogIFtqYV3kuIDluqbjgaDjgZHlkbzjgbPlh7rjgZXjgozjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIG9mZlxuICogQHNpZ25hdHVyZSBvZmYoZXZlbnROYW1lLCBbbGlzdGVuZXJdKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci4gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBzcGVjaWZpZWQgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50IHR5cGUgd2lsbCBiZSByZW1vdmVkLlsvZW5dXG4gKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAguOCguOBl+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBquOBi+OBo+OBn+WgtOWQiOOBq+OBr+OAgeOBneOBruOCpOODmeODs+ODiOOBq+e0kOOBpeOBj+WFqOOBpuOBruOCpOODmeODs+ODiOODquOCueODiuODvOOBjOWJiumZpOOBleOCjOOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICogICBbamFd5YmK6Zmk44GZ44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbGFzdFJlYWR5ID0gd2luZG93Lm9ucy5UYWJiYXJFbGVtZW50LnJld3JpdGFibGVzLnJlYWR5O1xuICB3aW5kb3cub25zLlRhYmJhckVsZW1lbnQucmV3cml0YWJsZXMucmVhZHkgPSBvbnMuX3dhaXREaXJldGl2ZUluaXQoJ29ucy10YWJiYXInLCBsYXN0UmVhZHkpO1xuXG4gIHZhciBsYXN0TGluayA9IHdpbmRvdy5vbnMuVGFiYmFyRWxlbWVudC5yZXdyaXRhYmxlcy5saW5rO1xuICB3aW5kb3cub25zLlRhYmJhckVsZW1lbnQucmV3cml0YWJsZXMubGluayA9IGZ1bmN0aW9uKHRhYmJhckVsZW1lbnQsIHRhcmdldCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgdmlldyA9IGFuZ3VsYXIuZWxlbWVudCh0YWJiYXJFbGVtZW50KS5kYXRhKCdvbnMtdGFiYmFyJyk7XG4gICAgdmlldy5fY29tcGlsZUFuZExpbmsodGFyZ2V0LCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgIGxhc3RMaW5rKHRhYmJhckVsZW1lbnQsIHRhcmdldCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBsYXN0VW5saW5rID0gd2luZG93Lm9ucy5UYWJiYXJFbGVtZW50LnJld3JpdGFibGVzLnVubGluaztcbiAgd2luZG93Lm9ucy5UYWJiYXJFbGVtZW50LnJld3JpdGFibGVzLnVubGluayA9IGZ1bmN0aW9uKHRhYmJhckVsZW1lbnQsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICBhbmd1bGFyLmVsZW1lbnQodGFyZ2V0KS5kYXRhKCdfc2NvcGUnKS4kZGVzdHJveSgpO1xuICAgIGxhc3RVbmxpbmsodGFiYmFyRWxlbWVudCwgdGFyZ2V0LCBjYWxsYmFjayk7XG4gIH07XG5cbiAgYW5ndWxhci5tb2R1bGUoJ29uc2VuJykuZGlyZWN0aXZlKCdvbnNUYWJiYXInLCBbJyRvbnNlbicsICckY29tcGlsZScsICckcGFyc2UnLCAnVGFiYmFyVmlldycsIGZ1bmN0aW9uKCRvbnNlbiwgJGNvbXBpbGUsICRwYXJzZSwgVGFiYmFyVmlldykge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG5cbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgc2NvcGU6IHRydWUsXG5cbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcikge1xuXG5cbiAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHJzLmhpZGVUYWJzLCBmdW5jdGlvbihoaWRlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoaWRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaGlkZSA9IGhpZGUgPT09ICd0cnVlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudFswXS5zZXRUYWJiYXJWaXNpYmlsaXR5KCFoaWRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIHRhYmJhclZpZXcgPSBuZXcgVGFiYmFyVmlldyhzY29wZSwgZWxlbWVudCwgYXR0cnMpO1xuICAgICAgICAkb25zZW4uYWRkTW9kaWZpZXJNZXRob2RzRm9yQ3VzdG9tRWxlbWVudHModGFiYmFyVmlldywgZWxlbWVudCk7XG5cbiAgICAgICAgJG9uc2VuLnJlZ2lzdGVyRXZlbnRIYW5kbGVycyh0YWJiYXJWaWV3LCAncmVhY3RpdmUgcHJlY2hhbmdlIHBvc3RjaGFuZ2UgaW5pdCBzaG93IGhpZGUgZGVzdHJveScpO1xuXG4gICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXRhYmJhcicsIHRhYmJhclZpZXcpO1xuICAgICAgICAkb25zZW4uZGVjbGFyZVZhckF0dHJpYnV0ZShhdHRycywgdGFiYmFyVmlldyk7XG5cbiAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRhYmJhclZpZXcuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAkb25zZW4ucmVtb3ZlTW9kaWZpZXJNZXRob2RzKHRhYmJhclZpZXcpO1xuICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXRhYmJhcicsIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICRvbnNlbi5maXJlQ29tcG9uZW50RXZlbnQoZWxlbWVudFswXSwgJ2luaXQnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCl7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc1RlbXBsYXRlJywgWyckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50WzBdLnRlbXBsYXRlIHx8IGVsZW1lbnQuaHRtbCgpO1xuICAgICAgICAkdGVtcGxhdGVDYWNoZS5wdXQoZWxlbWVudC5hdHRyKCdpZCcpLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiLyoqXG4gKiBAZWxlbWVudCBvbnMtdG9vbGJhclxuICovXG5cbi8qKlxuICogQGF0dHJpYnV0ZSB2YXJcbiAqIEBpbml0b25seVxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1WYXJpYWJsZSBuYW1lIHRvIHJlZmVyIHRoaXMgdG9vbGJhci5bL2VuXVxuICogIFtqYV3jgZPjga7jg4Tjg7zjg6vjg5Djg7zjgpLlj4LnhafjgZnjgovjgZ/jgoHjga7lkI3liY3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnb25zZW4nKS5kaXJlY3RpdmUoJ29uc1Rvb2xiYXInLCBbJyRvbnNlbicsICdHZW5lcmljVmlldycsIGZ1bmN0aW9uKCRvbnNlbiwgR2VuZXJpY1ZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcblxuICAgICAgLy8gTk9URTogVGhpcyBlbGVtZW50IG11c3QgY29leGlzdHMgd2l0aCBuZy1jb250cm9sbGVyLlxuICAgICAgLy8gRG8gbm90IHVzZSBpc29sYXRlZCBzY29wZSBhbmQgdGVtcGxhdGUncyBuZy10cmFuc2NsdWRlLlxuICAgICAgc2NvcGU6IGZhbHNlLFxuICAgICAgdHJhbnNjbHVkZTogZmFsc2UsXG5cbiAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGlydHkgZml4IVxuICAgICAgICAgICAgaWYgKGVsZW1lbnRbMF0ubm9kZU5hbWUgPT09ICdvbnMtdG9vbGJhcicpIHtcbiAgICAgICAgICAgICAgR2VuZXJpY1ZpZXcucmVnaXN0ZXIoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCB7dmlld0tleTogJ29ucy10b29sYmFyJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcG9zdDogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcblxufSkoKTtcbiIsIi8qKlxuICogQGVsZW1lbnQgb25zLXRvb2xiYXItYnV0dG9uXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZhclxuICogQGluaXRvbmx5XG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1WYXJpYWJsZSBuYW1lIHRvIHJlZmVyIHRoaXMgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV3jgZPjga7jg5zjgr/jg7PjgpLlj4LnhafjgZnjgovjgZ/jgoHjga7lkI3liY3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG4oZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgbW9kdWxlLmRpcmVjdGl2ZSgnb25zVG9vbGJhckJ1dHRvbicsIFsnJG9uc2VuJywgJ0dlbmVyaWNWaWV3JywgZnVuY3Rpb24oJG9uc2VuLCBHZW5lcmljVmlldykge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgc2NvcGU6IGZhbHNlLFxuICAgICAgbGluazoge1xuICAgICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgIHZhciB0b29sYmFyQnV0dG9uID0gbmV3IEdlbmVyaWNWaWV3KHNjb3BlLCBlbGVtZW50LCBhdHRycyk7XG4gICAgICAgICAgZWxlbWVudC5kYXRhKCdvbnMtdG9vbGJhci1idXR0b24nLCB0b29sYmFyQnV0dG9uKTtcbiAgICAgICAgICAkb25zZW4uZGVjbGFyZVZhckF0dHJpYnV0ZShhdHRycywgdG9vbGJhckJ1dHRvbik7XG5cbiAgICAgICAgICAkb25zZW4uYWRkTW9kaWZpZXJNZXRob2RzRm9yQ3VzdG9tRWxlbWVudHModG9vbGJhckJ1dHRvbiwgZWxlbWVudCk7XG5cbiAgICAgICAgICAkb25zZW4uY2xlYW5lci5vbkRlc3Ryb3koc2NvcGUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdG9vbGJhckJ1dHRvbi5fZXZlbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgJG9uc2VuLnJlbW92ZU1vZGlmaWVyTWV0aG9kcyh0b29sYmFyQnV0dG9uKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnb25zLXRvb2xiYXItYnV0dG9uJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgICAgICAkb25zZW4uY2xlYXJDb21wb25lbnQoe1xuICAgICAgICAgICAgICBzY29wZTogc2NvcGUsXG4gICAgICAgICAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2NvcGUgPSBlbGVtZW50ID0gYXR0cnMgPSBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0OiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICAkb25zZW4uZmlyZUNvbXBvbmVudEV2ZW50KGVsZW1lbnRbMF0sICdpbml0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XSk7XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKGZ1bmN0aW9uKCl7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29uc2VuJyk7XG5cbiAgdmFyIENvbXBvbmVudENsZWFuZXIgPSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtqcUxpdGV9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBkZWNvbXBvc2VOb2RlOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LnJlbW92ZSgpLmNoaWxkcmVuKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIENvbXBvbmVudENsZWFuZXIuZGVjb21wb3NlTm9kZShhbmd1bGFyLmVsZW1lbnQoY2hpbGRyZW5baV0pKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBdHRyaWJ1dGVzfSBhdHRyc1xuICAgICAqL1xuICAgIGRlc3Ryb3lBdHRyaWJ1dGVzOiBmdW5jdGlvbihhdHRycykge1xuICAgICAgYXR0cnMuJCRlbGVtZW50ID0gbnVsbDtcbiAgICAgIGF0dHJzLiQkb2JzZXJ2ZXJzID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtqcUxpdGV9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTY29wZX0gc2NvcGVcbiAgICAgKi9cbiAgICBkZXN0cm95U2NvcGU6IGZ1bmN0aW9uKHNjb3BlKSB7XG4gICAgICBzY29wZS4kJGxpc3RlbmVycyA9IHt9O1xuICAgICAgc2NvcGUuJCR3YXRjaGVycyA9IG51bGw7XG4gICAgICBzY29wZSA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICAgKi9cbiAgICBvbkRlc3Ryb3k6IGZ1bmN0aW9uKHNjb3BlLCBmbikge1xuICAgICAgdmFyIGNsZWFyID0gc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhcigpO1xuICAgICAgICBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIG1vZHVsZS5mYWN0b3J5KCdDb21wb25lbnRDbGVhbmVyJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudENsZWFuZXI7XG4gIH0pO1xuXG4gIC8vIG92ZXJyaWRlIGJ1aWx0aW4gbmctKGV2ZW50bmFtZSkgZGlyZWN0aXZlc1xuICAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG5nRXZlbnREaXJlY3RpdmVzID0ge307XG4gICAgJ2NsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgbW91c2VlbnRlciBtb3VzZWxlYXZlIGtleWRvd24ga2V5dXAga2V5cHJlc3Mgc3VibWl0IGZvY3VzIGJsdXIgY29weSBjdXQgcGFzdGUnLnNwbGl0KCcgJykuZm9yRWFjaChcbiAgICAgIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUoJ25nLScgKyBuYW1lKTtcbiAgICAgICAgbmdFdmVudERpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBbJyRwYXJzZScsIGZ1bmN0aW9uKCRwYXJzZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbigkZWxlbWVudCwgYXR0cikge1xuICAgICAgICAgICAgICB2YXIgZm4gPSAkcGFyc2UoYXR0cltkaXJlY3RpdmVOYW1lXSk7XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikge1xuICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuKHNjb3BlLCB7JGV2ZW50OiBldmVudH0pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgICAgICAgICAgICAgIENvbXBvbmVudENsZWFuZXIub25EZXN0cm95KHNjb3BlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQub2ZmKG5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICBDb21wb25lbnRDbGVhbmVyLmRlc3Ryb3lTY29wZShzY29wZSk7XG4gICAgICAgICAgICAgICAgICBzY29wZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIENvbXBvbmVudENsZWFuZXIuZGVzdHJveUF0dHJpYnV0ZXMoYXR0cik7XG4gICAgICAgICAgICAgICAgICBhdHRyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XTtcblxuICAgICAgICBmdW5jdGlvbiBkaXJlY3RpdmVOb3JtYWxpemUobmFtZSkge1xuICAgICAgICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLy0oW2Etel0pL2csIGZ1bmN0aW9uKG1hdGNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgIG1vZHVsZS5jb25maWcoWyckcHJvdmlkZScsIGZ1bmN0aW9uKCRwcm92aWRlKSB7XG4gICAgICB2YXIgc2hpZnQgPSBmdW5jdGlvbigkZGVsZWdhdGUpIHtcbiAgICAgICAgJGRlbGVnYXRlLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiAkZGVsZWdhdGU7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmtleXMobmdFdmVudERpcmVjdGl2ZXMpLmZvckVhY2goZnVuY3Rpb24oZGlyZWN0aXZlTmFtZSkge1xuICAgICAgICAkcHJvdmlkZS5kZWNvcmF0b3IoZGlyZWN0aXZlTmFtZSArICdEaXJlY3RpdmUnLCBbJyRkZWxlZ2F0ZScsIHNoaWZ0XSk7XG4gICAgICB9KTtcbiAgICB9XSk7XG4gICAgT2JqZWN0LmtleXMobmdFdmVudERpcmVjdGl2ZXMpLmZvckVhY2goZnVuY3Rpb24oZGlyZWN0aXZlTmFtZSkge1xuICAgICAgbW9kdWxlLmRpcmVjdGl2ZShkaXJlY3RpdmVOYW1lLCBuZ0V2ZW50RGlyZWN0aXZlc1tkaXJlY3RpdmVOYW1lXSk7XG4gICAgfSk7XG4gIH0pKCk7XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuWydhbGVydCcsICdjb25maXJtJywgJ3Byb21wdCddLmZvckVhY2gobmFtZSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsTm90aWZpY2F0aW9uID0gb25zLm5vdGlmaWNhdGlvbltuYW1lXTtcblxuICBvbnMubm90aWZpY2F0aW9uW25hbWVdID0gKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyA/IChvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlKSA6IChvcHRpb25zID0gbWVzc2FnZSk7XG5cbiAgICBjb25zdCBjb21waWxlID0gb3B0aW9ucy5jb21waWxlO1xuICAgIGxldCAkZWxlbWVudDtcblxuICAgIG9wdGlvbnMuY29tcGlsZSA9IGVsZW1lbnQgPT4ge1xuICAgICAgJGVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoY29tcGlsZSA/IGNvbXBpbGUoZWxlbWVudCkgOiBlbGVtZW50KTtcbiAgICAgIHJldHVybiBvbnMuJGNvbXBpbGUoJGVsZW1lbnQpKCRlbGVtZW50LmluamVjdG9yKCkuZ2V0KCckcm9vdFNjb3BlJykpO1xuICAgIH07XG5cbiAgICBvcHRpb25zLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAkZWxlbWVudC5kYXRhKCdfc2NvcGUnKS4kZGVzdHJveSgpO1xuICAgICAgJGVsZW1lbnQgPSBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gb3JpZ2luYWxOb3RpZmljYXRpb24ob3B0aW9ucyk7XG4gIH07XG59KTsiLCIvLyBjb25maXJtIHRvIHVzZSBqcUxpdGVcbmlmICh3aW5kb3cualF1ZXJ5ICYmIGFuZ3VsYXIuZWxlbWVudCA9PT0gd2luZG93LmpRdWVyeSkge1xuICBjb25zb2xlLndhcm4oJ09uc2VuIFVJIHJlcXVpcmUganFMaXRlLiBMb2FkIGpRdWVyeSBhZnRlciBsb2FkaW5nIEFuZ3VsYXJKUyB0byBmaXggdGhpcyBlcnJvci4galF1ZXJ5IG1heSBicmVhayBPbnNlbiBVSSBiZWhhdmlvci4nKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oZnVuY3Rpb24oKXtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdvbnNlbicpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHtcbiAgICB2YXIgdGVtcGxhdGVzID0gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFt0eXBlPVwidGV4dC9vbnMtdGVtcGxhdGVcIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdGVtcGxhdGUgPSBhbmd1bGFyLmVsZW1lbnQodGVtcGxhdGVzW2ldKTtcbiAgICAgIHZhciBpZCA9IHRlbXBsYXRlLmF0dHIoJ2lkJyk7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAkdGVtcGxhdGVDYWNoZS5wdXQoaWQsIHRlbXBsYXRlLnRleHQoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbn0pKCk7XG4iXX0=