1 | /*! angular-onsenui.js for onsenui - v2.0.4 - 2016-11-04 */
|
2 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
87 |
|
88 | /*
|
89 | Copyright 2013-2015 ASIAL CORPORATION
|
90 |
|
91 | Licensed under the Apache License, Version 2.0 (the "License");
|
92 | you may not use this file except in compliance with the License.
|
93 | You may obtain a copy of the License at
|
94 |
|
95 | http://www.apache.org/licenses/LICENSE-2.0
|
96 |
|
97 | Unless required by applicable law or agreed to in writing, software
|
98 | distributed under the License is distributed on an "AS IS" BASIS,
|
99 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
100 | See the License for the specific language governing permissions and
|
101 | limitations 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 | ;
|
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 | ;
|
452 |
|
453 | /*
|
454 | Copyright 2013-2015 ASIAL CORPORATION
|
455 |
|
456 | Licensed under the Apache License, Version 2.0 (the "License");
|
457 | you may not use this file except in compliance with the License.
|
458 | You may obtain a copy of the License at
|
459 |
|
460 | http://www.apache.org/licenses/LICENSE-2.0
|
461 |
|
462 | Unless required by applicable law or agreed to in writing, software
|
463 | distributed under the License is distributed on an "AS IS" BASIS,
|
464 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
465 | See the License for the specific language governing permissions and
|
466 | limitations under the License.
|
467 |
|
468 | */
|
469 |
|
470 | (function () {
|
471 | ;
|
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 | ;
|
521 |
|
522 | /*
|
523 | Copyright 2013-2015 ASIAL CORPORATION
|
524 |
|
525 | Licensed under the Apache License, Version 2.0 (the "License");
|
526 | you may not use this file except in compliance with the License.
|
527 | You may obtain a copy of the License at
|
528 |
|
529 | http://www.apache.org/licenses/LICENSE-2.0
|
530 |
|
531 | Unless required by applicable law or agreed to in writing, software
|
532 | distributed under the License is distributed on an "AS IS" BASIS,
|
533 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
534 | See the License for the specific language governing permissions and
|
535 | limitations under the License.
|
536 |
|
537 | */
|
538 |
|
539 | angular.module('onsen').value('AlertDialogAnimator', ons._internal.AlertDialogAnimator).value('AndroidAlertDialogAnimator', ons._internal.AndroidAlertDialogAnimator).value('IOSAlertDialogAnimator', ons._internal.IOSAlertDialogAnimator);
|
540 | ;
|
541 |
|
542 | /*
|
543 | Copyright 2013-2015 ASIAL CORPORATION
|
544 |
|
545 | Licensed under the Apache License, Version 2.0 (the "License");
|
546 | you may not use this file except in compliance with the License.
|
547 | You may obtain a copy of the License at
|
548 |
|
549 | http://www.apache.org/licenses/LICENSE-2.0
|
550 |
|
551 | Unless required by applicable law or agreed to in writing, software
|
552 | distributed under the License is distributed on an "AS IS" BASIS,
|
553 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
554 | See the License for the specific language governing permissions and
|
555 | limitations under the License.
|
556 |
|
557 | */
|
558 |
|
559 | angular.module('onsen').value('AnimationChooser', ons._internal.AnimatorFactory);
|
560 | ;
|
561 |
|
562 | /*
|
563 | Copyright 2013-2015 ASIAL CORPORATION
|
564 |
|
565 | Licensed under the Apache License, Version 2.0 (the "License");
|
566 | you may not use this file except in compliance with the License.
|
567 | You may obtain a copy of the License at
|
568 |
|
569 | http://www.apache.org/licenses/LICENSE-2.0
|
570 |
|
571 | Unless required by applicable law or agreed to in writing, software
|
572 | distributed under the License is distributed on an "AS IS" BASIS,
|
573 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
574 | See the License for the specific language governing permissions and
|
575 | limitations under the License.
|
576 |
|
577 | */
|
578 |
|
579 | (function () {
|
580 | ;
|
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 | ;
|
631 |
|
632 | /*
|
633 | Copyright 2013-2015 ASIAL CORPORATION
|
634 |
|
635 | Licensed under the Apache License, Version 2.0 (the "License");
|
636 | you may not use this file except in compliance with the License.
|
637 | You may obtain a copy of the License at
|
638 |
|
639 | http://www.apache.org/licenses/LICENSE-2.0
|
640 |
|
641 | Unless required by applicable law or agreed to in writing, software
|
642 | distributed under the License is distributed on an "AS IS" BASIS,
|
643 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
644 | See the License for the specific language governing permissions and
|
645 | limitations under the License.
|
646 |
|
647 | */
|
648 |
|
649 | (function () {
|
650 | ;
|
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 | ;
|
697 |
|
698 | /*
|
699 | Copyright 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 |
|
705 | http://www.apache.org/licenses/LICENSE-2.0
|
706 |
|
707 | Unless required by applicable law or agreed to in writing, software
|
708 | distributed under the License is distributed on an "AS IS" BASIS,
|
709 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
710 | See the License for the specific language governing permissions and
|
711 | limitations under the License.
|
712 |
|
713 | */
|
714 |
|
715 | angular.module('onsen').value('DialogAnimator', ons._internal.DialogAnimator).value('IOSDialogAnimator', ons._internal.IOSDialogAnimator).value('AndroidDialogAnimator', ons._internal.AndroidDialogAnimator).value('SlideDialogAnimator', ons._internal.SlideDialogAnimator);
|
716 | ;
|
717 |
|
718 | /*
|
719 | Copyright 2013-2015 ASIAL CORPORATION
|
720 |
|
721 | Licensed under the Apache License, Version 2.0 (the "License");
|
722 | you may not use this file except in compliance with the License.
|
723 | You may obtain a copy of the License at
|
724 |
|
725 | http://www.apache.org/licenses/LICENSE-2.0
|
726 |
|
727 | Unless required by applicable law or agreed to in writing, software
|
728 | distributed under the License is distributed on an "AS IS" BASIS,
|
729 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
730 | See the License for the specific language governing permissions and
|
731 | limitations under the License.
|
732 |
|
733 | */
|
734 |
|
735 | (function () {
|
736 | ;
|
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 | ;
|
778 |
|
779 | /*
|
780 | Copyright 2013-2015 ASIAL CORPORATION
|
781 |
|
782 | Licensed under the Apache License, Version 2.0 (the "License");
|
783 | you may not use this file except in compliance with the License.
|
784 | You may obtain a copy of the License at
|
785 |
|
786 | http://www.apache.org/licenses/LICENSE-2.0
|
787 |
|
788 | Unless required by applicable law or agreed to in writing, software
|
789 | distributed under the License is distributed on an "AS IS" BASIS,
|
790 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
791 | See the License for the specific language governing permissions and
|
792 | limitations under the License.
|
793 |
|
794 | */
|
795 |
|
796 | (function () {
|
797 | ;
|
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 | ;
|
883 |
|
884 | /*
|
885 | Copyright 2013-2015 ASIAL CORPORATION
|
886 |
|
887 | Licensed under the Apache License, Version 2.0 (the "License");
|
888 | you may not use this file except in compliance with the License.
|
889 | You may obtain a copy of the License at
|
890 |
|
891 | http://www.apache.org/licenses/LICENSE-2.0
|
892 |
|
893 | Unless required by applicable law or agreed to in writing, software
|
894 | distributed under the License is distributed on an "AS IS" BASIS,
|
895 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
896 | See the License for the specific language governing permissions and
|
897 | limitations under the License.
|
898 |
|
899 | */
|
900 |
|
901 | (function () {
|
902 | ;
|
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 | ;
|
949 |
|
950 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
951 |
|
952 | var _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 |
|
954 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
955 |
|
956 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
957 |
|
958 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
959 |
|
960 | /*
|
961 | Copyright 2013-2015 ASIAL CORPORATION
|
962 |
|
963 | Licensed under the Apache License, Version 2.0 (the "License");
|
964 | you may not use this file except in compliance with the License.
|
965 | You may obtain a copy of the License at
|
966 |
|
967 | http://www.apache.org/licenses/LICENSE-2.0
|
968 |
|
969 | Unless required by applicable law or agreed to in writing, software
|
970 | distributed under the License is distributed on an "AS IS" BASIS,
|
971 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
972 | See the License for the specific language governing permissions and
|
973 | limitations under the License.
|
974 |
|
975 | */
|
976 |
|
977 | (function () {
|
978 | ;
|
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 | ;
|
1131 |
|
1132 | /*
|
1133 | Copyright 2013-2015 ASIAL CORPORATION
|
1134 |
|
1135 | Licensed under the Apache License, Version 2.0 (the "License");
|
1136 | you may not use this file except in compliance with the License.
|
1137 | You may obtain a copy of the License at
|
1138 |
|
1139 | http://www.apache.org/licenses/LICENSE-2.0
|
1140 |
|
1141 | Unless required by applicable law or agreed to in writing, software
|
1142 | distributed under the License is distributed on an "AS IS" BASIS,
|
1143 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1144 | See the License for the specific language governing permissions and
|
1145 | limitations under the License.
|
1146 |
|
1147 | */
|
1148 |
|
1149 | (function () {
|
1150 | ;
|
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 | ;
|
1201 |
|
1202 | /*
|
1203 | Copyright 2013-2015 ASIAL CORPORATION
|
1204 |
|
1205 | Licensed under the Apache License, Version 2.0 (the "License");
|
1206 | you may not use this file except in compliance with the License.
|
1207 | You may obtain a copy of the License at
|
1208 |
|
1209 | http://www.apache.org/licenses/LICENSE-2.0
|
1210 |
|
1211 | Unless required by applicable law or agreed to in writing, software
|
1212 | distributed under the License is distributed on an "AS IS" BASIS,
|
1213 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1214 | See the License for the specific language governing permissions and
|
1215 | limitations under the License.
|
1216 |
|
1217 | */
|
1218 |
|
1219 | (function () {
|
1220 | ;
|
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 | ;
|
1327 |
|
1328 | /*
|
1329 | Copyright 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 |
|
1335 | http://www.apache.org/licenses/LICENSE-2.0
|
1336 |
|
1337 | Unless required by applicable law or agreed to in writing, software
|
1338 | distributed under the License is distributed on an "AS IS" BASIS,
|
1339 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1340 | See the License for the specific language governing permissions and
|
1341 | limitations under the License.
|
1342 |
|
1343 | */
|
1344 |
|
1345 | angular.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 | ;
|
1347 |
|
1348 | /*
|
1349 | Copyright 2013-2015 ASIAL CORPORATION
|
1350 |
|
1351 | Licensed under the Apache License, Version 2.0 (the "License");
|
1352 | you may not use this file except in compliance with the License.
|
1353 | You may obtain a copy of the License at
|
1354 |
|
1355 | http://www.apache.org/licenses/LICENSE-2.0
|
1356 |
|
1357 | Unless required by applicable law or agreed to in writing, software
|
1358 | distributed under the License is distributed on an "AS IS" BASIS,
|
1359 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1360 | See the License for the specific language governing permissions and
|
1361 | limitations under the License.
|
1362 |
|
1363 | */
|
1364 |
|
1365 | (function () {
|
1366 | ;
|
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 | ;
|
1588 |
|
1589 | /*
|
1590 | Copyright 2013-2015 ASIAL CORPORATION
|
1591 |
|
1592 | Licensed under the Apache License, Version 2.0 (the "License");
|
1593 | you may not use this file except in compliance with the License.
|
1594 | You may obtain a copy of the License at
|
1595 |
|
1596 | http://www.apache.org/licenses/LICENSE-2.0
|
1597 |
|
1598 | Unless required by applicable law or agreed to in writing, software
|
1599 | distributed under the License is distributed on an "AS IS" BASIS,
|
1600 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1601 | See the License for the specific language governing permissions and
|
1602 | limitations under the License.
|
1603 |
|
1604 | */
|
1605 |
|
1606 | (function () {
|
1607 | ;
|
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 | ;
|
1686 |
|
1687 | /*
|
1688 | Copyright 2013-2015 ASIAL CORPORATION
|
1689 |
|
1690 | Licensed under the Apache License, Version 2.0 (the "License");
|
1691 | you may not use this file except in compliance with the License.
|
1692 | You may obtain a copy of the License at
|
1693 |
|
1694 | http://www.apache.org/licenses/LICENSE-2.0
|
1695 |
|
1696 | Unless required by applicable law or agreed to in writing, software
|
1697 | distributed under the License is distributed on an "AS IS" BASIS,
|
1698 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1699 | See the License for the specific language governing permissions and
|
1700 | limitations under the License.
|
1701 |
|
1702 | */
|
1703 |
|
1704 | (function () {
|
1705 | ;
|
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 | ;
|
1752 |
|
1753 | /*
|
1754 | Copyright 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 |
|
1760 | http://www.apache.org/licenses/LICENSE-2.0
|
1761 |
|
1762 | Unless required by applicable law or agreed to in writing, software
|
1763 | distributed under the License is distributed on an "AS IS" BASIS,
|
1764 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1765 | See the License for the specific language governing permissions and
|
1766 | limitations under the License.
|
1767 |
|
1768 | */
|
1769 |
|
1770 | angular.module('onsen').value('PopoverAnimator', ons._internal.PopoverAnimator).value('FadePopoverAnimator', ons._internal.FadePopoverAnimator);
|
1771 | ;
|
1772 |
|
1773 | /*
|
1774 | Copyright 2013-2015 ASIAL CORPORATION
|
1775 |
|
1776 | Licensed under the Apache License, Version 2.0 (the "License");
|
1777 | you may not use this file except in compliance with the License.
|
1778 | You may obtain a copy of the License at
|
1779 |
|
1780 | http://www.apache.org/licenses/LICENSE-2.0
|
1781 |
|
1782 | Unless required by applicable law or agreed to in writing, software
|
1783 | distributed under the License is distributed on an "AS IS" BASIS,
|
1784 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1785 | See the License for the specific language governing permissions and
|
1786 | limitations under the License.
|
1787 |
|
1788 | */
|
1789 |
|
1790 | (function () {
|
1791 | ;
|
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 | ;
|
1844 |
|
1845 | /*
|
1846 | Copyright 2013-2015 ASIAL CORPORATION
|
1847 |
|
1848 | Licensed under the Apache License, Version 2.0 (the "License");
|
1849 | you may not use this file except in compliance with the License.
|
1850 | You may obtain a copy of the License at
|
1851 |
|
1852 | http://www.apache.org/licenses/LICENSE-2.0
|
1853 |
|
1854 | Unless required by applicable law or agreed to in writing, software
|
1855 | distributed under the License is distributed on an "AS IS" BASIS,
|
1856 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
1857 | See the License for the specific language governing permissions and
|
1858 | limitations under the License.
|
1859 |
|
1860 | */
|
1861 |
|
1862 | (function () {
|
1863 | ;
|
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 | ;
|
2063 |
|
2064 | /*
|
2065 | Copyright 2013-2015 ASIAL CORPORATION
|
2066 |
|
2067 | Licensed under the Apache License, Version 2.0 (the "License");
|
2068 | you may not use this file except in compliance with the License.
|
2069 | You may obtain a copy of the License at
|
2070 |
|
2071 | http://www.apache.org/licenses/LICENSE-2.0
|
2072 |
|
2073 | Unless required by applicable law or agreed to in writing, software
|
2074 | distributed under the License is distributed on an "AS IS" BASIS,
|
2075 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
2076 | See the License for the specific language governing permissions and
|
2077 | limitations under the License.
|
2078 |
|
2079 | */
|
2080 |
|
2081 | (function () {
|
2082 | ;
|
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 | ;
|
2316 |
|
2317 | /*
|
2318 | Copyright 2013-2015 ASIAL CORPORATION
|
2319 |
|
2320 | Licensed under the Apache License, Version 2.0 (the "License");
|
2321 | you may not use this file except in compliance with the License.
|
2322 | You may obtain a copy of the License at
|
2323 |
|
2324 | http://www.apache.org/licenses/LICENSE-2.0
|
2325 |
|
2326 | Unless required by applicable law or agreed to in writing, software
|
2327 | distributed under the License is distributed on an "AS IS" BASIS,
|
2328 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
2329 | See the License for the specific language governing permissions and
|
2330 | limitations under the License.
|
2331 |
|
2332 | */
|
2333 |
|
2334 | (function () {
|
2335 | ;
|
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 | ;
|
3065 |
|
3066 | /*
|
3067 | Copyright 2013-2015 ASIAL CORPORATION
|
3068 |
|
3069 | Licensed under the Apache License, Version 2.0 (the "License");
|
3070 | you may not use this file except in compliance with the License.
|
3071 | You may obtain a copy of the License at
|
3072 |
|
3073 | http://www.apache.org/licenses/LICENSE-2.0
|
3074 |
|
3075 | Unless required by applicable law or agreed to in writing, software
|
3076 | distributed under the License is distributed on an "AS IS" BASIS,
|
3077 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3078 | See the License for the specific language governing permissions and
|
3079 | limitations under the License.
|
3080 |
|
3081 | */
|
3082 |
|
3083 | (function () {
|
3084 | ;
|
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 | ;
|
3158 |
|
3159 | /*
|
3160 | Copyright 2013-2015 ASIAL CORPORATION
|
3161 |
|
3162 | Licensed under the Apache License, Version 2.0 (the "License");
|
3163 | you may not use this file except in compliance with the License.
|
3164 | You may obtain a copy of the License at
|
3165 |
|
3166 | http://www.apache.org/licenses/LICENSE-2.0
|
3167 |
|
3168 | Unless required by applicable law or agreed to in writing, software
|
3169 | distributed under the License is distributed on an "AS IS" BASIS,
|
3170 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3171 | See the License for the specific language governing permissions and
|
3172 | limitations under the License.
|
3173 |
|
3174 | */
|
3175 |
|
3176 | (function () {
|
3177 | ;
|
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 | ;
|
3223 |
|
3224 | /*
|
3225 | Copyright 2013-2015 ASIAL CORPORATION
|
3226 |
|
3227 | Licensed under the Apache License, Version 2.0 (the "License");
|
3228 | you may not use this file except in compliance with the License.
|
3229 | You may obtain a copy of the License at
|
3230 |
|
3231 | http://www.apache.org/licenses/LICENSE-2.0
|
3232 |
|
3233 | Unless required by applicable law or agreed to in writing, software
|
3234 | distributed under the License is distributed on an "AS IS" BASIS,
|
3235 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3236 | See the License for the specific language governing permissions and
|
3237 | limitations under the License.
|
3238 |
|
3239 | */
|
3240 | (function () {
|
3241 | ;
|
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 | ;
|
3563 |
|
3564 | /*
|
3565 | Copyright 2013-2015 ASIAL CORPORATION
|
3566 |
|
3567 | Licensed under the Apache License, Version 2.0 (the "License");
|
3568 | you may not use this file except in compliance with the License.
|
3569 | You may obtain a copy of the License at
|
3570 |
|
3571 | http://www.apache.org/licenses/LICENSE-2.0
|
3572 |
|
3573 | Unless required by applicable law or agreed to in writing, software
|
3574 | distributed under the License is distributed on an "AS IS" BASIS,
|
3575 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3576 | See the License for the specific language governing permissions and
|
3577 | limitations under the License.
|
3578 |
|
3579 | */
|
3580 | (function () {
|
3581 | ;
|
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 | ;
|
3625 |
|
3626 | /*
|
3627 | Copyright 2013-2015 ASIAL CORPORATION
|
3628 |
|
3629 | Licensed under the Apache License, Version 2.0 (the "License");
|
3630 | you may not use this file except in compliance with the License.
|
3631 | You may obtain a copy of the License at
|
3632 |
|
3633 | http://www.apache.org/licenses/LICENSE-2.0
|
3634 |
|
3635 | Unless required by applicable law or agreed to in writing, software
|
3636 | distributed under the License is distributed on an "AS IS" BASIS,
|
3637 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3638 | See the License for the specific language governing permissions and
|
3639 | limitations under the License.
|
3640 |
|
3641 | */
|
3642 | (function () {
|
3643 | ;
|
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 | ;
|
3699 |
|
3700 | /*
|
3701 | Copyright 2013-2015 ASIAL CORPORATION
|
3702 |
|
3703 | Licensed under the Apache License, Version 2.0 (the "License");
|
3704 | you may not use this file except in compliance with the License.
|
3705 | You may obtain a copy of the License at
|
3706 |
|
3707 | http://www.apache.org/licenses/LICENSE-2.0
|
3708 |
|
3709 | Unless required by applicable law or agreed to in writing, software
|
3710 | distributed under the License is distributed on an "AS IS" BASIS,
|
3711 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3712 | See the License for the specific language governing permissions and
|
3713 | limitations under the License.
|
3714 |
|
3715 | */
|
3716 | (function () {
|
3717 | ;
|
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 | ;
|
3751 |
|
3752 | /*
|
3753 | Copyright 2013-2015 ASIAL CORPORATION
|
3754 |
|
3755 | Licensed under the Apache License, Version 2.0 (the "License");
|
3756 | you may not use this file except in compliance with the License.
|
3757 | You may obtain a copy of the License at
|
3758 |
|
3759 | http://www.apache.org/licenses/LICENSE-2.0
|
3760 |
|
3761 | Unless required by applicable law or agreed to in writing, software
|
3762 | distributed under the License is distributed on an "AS IS" BASIS,
|
3763 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3764 | See the License for the specific language governing permissions and
|
3765 | limitations under the License.
|
3766 |
|
3767 | */
|
3768 |
|
3769 | (function () {
|
3770 | ;
|
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 | ;
|
3826 |
|
3827 | /*
|
3828 | Copyright 2013-2015 ASIAL CORPORATION
|
3829 |
|
3830 | Licensed under the Apache License, Version 2.0 (the "License");
|
3831 | you may not use this file except in compliance with the License.
|
3832 | You may obtain a copy of the License at
|
3833 |
|
3834 | http://www.apache.org/licenses/LICENSE-2.0
|
3835 |
|
3836 | Unless required by applicable law or agreed to in writing, software
|
3837 | distributed under the License is distributed on an "AS IS" BASIS,
|
3838 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3839 | See the License for the specific language governing permissions and
|
3840 | limitations under the License.
|
3841 |
|
3842 | */
|
3843 |
|
3844 | (function () {
|
3845 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
4047 |
|
4048 | (function () {
|
4049 | ;
|
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 | ;
|
4087 |
|
4088 | (function () {
|
4089 | ;
|
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 | ;
|
4109 |
|
4110 | /**
|
4111 | * @element ons-button
|
4112 | */
|
4113 |
|
4114 | (function () {
|
4115 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
4436 |
|
4437 | (function () {
|
4438 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
4510 |
|
4511 | (function () {
|
4512 | ;
|
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 | ;
|
4575 |
|
4576 | /**
|
4577 | * @element ons-icon
|
4578 | */
|
4579 |
|
4580 | (function () {
|
4581 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
5141 |
|
5142 | (function () {
|
5143 | ;
|
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 | ;
|
5156 |
|
5157 | (function () {
|
5158 | ;
|
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 | ;
|
5171 |
|
5172 | (function () {
|
5173 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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><ons-template></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><ons-template></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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
7325 |
|
7326 | (function () {
|
7327 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
7528 |
|
7529 | (function () {
|
7530 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
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 | ;
|
7638 |
|
7639 | /*
|
7640 | Copyright 2013-2015 ASIAL CORPORATION
|
7641 |
|
7642 | Licensed under the Apache License, Version 2.0 (the "License");
|
7643 | you may not use this file except in compliance with the License.
|
7644 | You may obtain a copy of the License at
|
7645 |
|
7646 | http://www.apache.org/licenses/LICENSE-2.0
|
7647 |
|
7648 | Unless required by applicable law or agreed to in writing, software
|
7649 | distributed under the License is distributed on an "AS IS" BASIS,
|
7650 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7651 | See the License for the specific language governing permissions and
|
7652 | limitations under the License.
|
7653 |
|
7654 | */
|
7655 |
|
7656 | (function () {
|
7657 | ;
|
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 | ;
|
7765 |
|
7766 | /*
|
7767 | Copyright 2013-2015 ASIAL CORPORATION
|
7768 |
|
7769 | Licensed under the Apache License, Version 2.0 (the "License");
|
7770 | you may not use this file except in compliance with the License.
|
7771 | You may obtain a copy of the License at
|
7772 |
|
7773 | http://www.apache.org/licenses/LICENSE-2.0
|
7774 |
|
7775 | Unless required by applicable law or agreed to in writing, software
|
7776 | distributed under the License is distributed on an "AS IS" BASIS,
|
7777 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7778 | See the License for the specific language governing permissions and
|
7779 | limitations under the License.
|
7780 |
|
7781 | */
|
7782 |
|
7783 | (function () {
|
7784 | ;
|
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 | /*
|
8285 | Copyright 2013-2015 ASIAL CORPORATION
|
8286 |
|
8287 | Licensed under the Apache License, Version 2.0 (the "License");
|
8288 | you may not use this file except in compliance with the License.
|
8289 | You may obtain a copy of the License at
|
8290 |
|
8291 | http://www.apache.org/licenses/LICENSE-2.0
|
8292 |
|
8293 | Unless required by applicable law or agreed to in writing, software
|
8294 | distributed under the License is distributed on an "AS IS" BASIS,
|
8295 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
8296 | See the License for the specific language governing permissions and
|
8297 | limitations 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 | ;
|
8326 |
|
8327 | // confirm to use jqLite
|
8328 | if (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 | ;
|
8332 |
|
8333 | /*
|
8334 | Copyright 2013-2015 ASIAL CORPORATION
|
8335 |
|
8336 | Licensed under the Apache License, Version 2.0 (the "License");
|
8337 | you may not use this file except in compliance with the License.
|
8338 | You may obtain a copy of the License at
|
8339 |
|
8340 | http://www.apache.org/licenses/LICENSE-2.0
|
8341 |
|
8342 | Unless required by applicable law or agreed to in writing, software
|
8343 | distributed under the License is distributed on an "AS IS" BASIS,
|
8344 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
8345 | See the License for the specific language governing permissions and
|
8346 | limitations under the License.
|
8347 |
|
8348 | */
|
8349 |
|
8350 | (function () {
|
8351 | ;
|
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=
|