// Platform: webos

// commit 6b1ca4e5e6db2525cfa4d0de41306d9edf61642b

// File generated at :: Wed Feb 27 2013 10:55:39 GMT-0800 (PST)

/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at
 
     http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
*/

;(function() {

try {eval("\nvar require,\n    define;\n\n(function () {\n    var modules = {};\n    // Stack of moduleIds currently being built.\n    var requireStack = [];\n    // Map of module ID -> index into requireStack of modules currently being built.\n    var inProgressModules = {};\n\n    function build(module) {\n        var factory = module.factory;\n        module.exports = {};\n        delete module.factory;\n        factory(require, module.exports, module);\n        return module.exports;\n    }\n\n    require = function (id) {\n        if (!modules[id]) {\n            throw \"module \" + id + \" not found\";\n        } else if (id in inProgressModules) {\n            var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id;\n            throw \"Cycle in require graph: \" + cycle;\n        }\n        if (modules[id].factory) {\n            try {\n                inProgressModules[id] = requireStack.length;\n                requireStack.push(id);\n                return build(modules[id]);\n            } finally {\n                delete inProgressModules[id];\n                requireStack.pop();\n            }\n        }\n        return modules[id].exports;\n    };\n\n    define = function (id, factory) {\n        if (modules[id]) {\n            throw \"module \" + id + \" already defined\";\n        }\n\n        modules[id] = {\n            id: id,\n            factory: factory\n        };\n    };\n\n    define.remove = function (id) {\n        delete modules[id];\n    };\n\n    define.moduleMap = modules;\n})();\n\n//Export for use in node\nif (typeof module === \"object\" && typeof require === \"function\") {\n    module.exports.require = require;\n    module.exports.define = define;\n}\n\n//@ sourceURL=lib/scripts/require.js")} catch(e) {console.log("exception: in lib/scripts/require.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova\", function(require, exports, module) {\n\n\nvar channel = require('cordova/channel');\n\n/**\n * Listen for DOMContentLoaded and notify our channel subscribers.\n */\ndocument.addEventListener('DOMContentLoaded', function() {\n    channel.onDOMContentLoaded.fire();\n}, false);\nif (document.readyState == 'complete' || document.readyState == 'interactive') {\n    channel.onDOMContentLoaded.fire();\n}\n\n/**\n * Intercept calls to addEventListener + removeEventListener and handle deviceready,\n * resume, and pause events.\n */\nvar m_document_addEventListener = document.addEventListener;\nvar m_document_removeEventListener = document.removeEventListener;\nvar m_window_addEventListener = window.addEventListener;\nvar m_window_removeEventListener = window.removeEventListener;\n\n/**\n * Houses custom event handlers to intercept on document + window event listeners.\n */\nvar documentEventHandlers = {},\n    windowEventHandlers = {};\n\ndocument.addEventListener = function(evt, handler, capture) {\n    var e = evt.toLowerCase();\n    if (typeof documentEventHandlers[e] != 'undefined') {\n        documentEventHandlers[e].subscribe(handler);\n    } else {\n        m_document_addEventListener.call(document, evt, handler, capture);\n    }\n};\n\nwindow.addEventListener = function(evt, handler, capture) {\n    var e = evt.toLowerCase();\n    if (typeof windowEventHandlers[e] != 'undefined') {\n        windowEventHandlers[e].subscribe(handler);\n    } else {\n        m_window_addEventListener.call(window, evt, handler, capture);\n    }\n};\n\ndocument.removeEventListener = function(evt, handler, capture) {\n    var e = evt.toLowerCase();\n    // If unsubscribing from an event that is handled by a plugin\n    if (typeof documentEventHandlers[e] != \"undefined\") {\n        documentEventHandlers[e].unsubscribe(handler);\n    } else {\n        m_document_removeEventListener.call(document, evt, handler, capture);\n    }\n};\n\nwindow.removeEventListener = function(evt, handler, capture) {\n    var e = evt.toLowerCase();\n    // If unsubscribing from an event that is handled by a plugin\n    if (typeof windowEventHandlers[e] != \"undefined\") {\n        windowEventHandlers[e].unsubscribe(handler);\n    } else {\n        m_window_removeEventListener.call(window, evt, handler, capture);\n    }\n};\n\nfunction createEvent(type, data) {\n    var event = document.createEvent('Events');\n    event.initEvent(type, false, false);\n    if (data) {\n        for (var i in data) {\n            if (data.hasOwnProperty(i)) {\n                event[i] = data[i];\n            }\n        }\n    }\n    return event;\n}\n\nif(typeof window.console === \"undefined\") {\n    window.console = {\n        log:function(){}\n    };\n}\n\nvar cordova = {\n    define:define,\n    require:require,\n    /**\n     * Methods to add/remove your own addEventListener hijacking on document + window.\n     */\n    addWindowEventHandler:function(event) {\n        return (windowEventHandlers[event] = channel.create(event));\n    },\n    addStickyDocumentEventHandler:function(event) {\n        return (documentEventHandlers[event] = channel.createSticky(event));\n    },\n    addDocumentEventHandler:function(event) {\n        return (documentEventHandlers[event] = channel.create(event));\n    },\n    removeWindowEventHandler:function(event) {\n        delete windowEventHandlers[event];\n    },\n    removeDocumentEventHandler:function(event) {\n        delete documentEventHandlers[event];\n    },\n    /**\n     * Retrieve original event handlers that were replaced by Cordova\n     *\n     * @return object\n     */\n    getOriginalHandlers: function() {\n        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},\n        'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};\n    },\n    /**\n     * Method to fire event from native code\n     * bNoDetach is required for events which cause an exception which needs to be caught in native code\n     */\n    fireDocumentEvent: function(type, data, bNoDetach) {\n        var evt = createEvent(type, data);\n        if (typeof documentEventHandlers[type] != 'undefined') {\n            if( bNoDetach ) {\n              documentEventHandlers[type].fire(evt);\n            }\n            else {\n              setTimeout(function() {\n                  documentEventHandlers[type].fire(evt);\n              }, 0);\n            }\n        } else {\n            document.dispatchEvent(evt);\n        }\n    },\n    fireWindowEvent: function(type, data) {\n        var evt = createEvent(type,data);\n        if (typeof windowEventHandlers[type] != 'undefined') {\n            setTimeout(function() {\n                windowEventHandlers[type].fire(evt);\n            }, 0);\n        } else {\n            window.dispatchEvent(evt);\n        }\n    },\n\n    /**\n     * Plugin callback mechanism.\n     */\n    // Randomize the starting callbackId to avoid collisions after refreshing or navigating.\n    // This way, it's very unlikely that any new callback would get the same callbackId as an old callback.\n    callbackId: Math.floor(Math.random() * 2000000000),\n    callbacks:  {},\n    callbackStatus: {\n        NO_RESULT: 0,\n        OK: 1,\n        CLASS_NOT_FOUND_EXCEPTION: 2,\n        ILLEGAL_ACCESS_EXCEPTION: 3,\n        INSTANTIATION_EXCEPTION: 4,\n        MALFORMED_URL_EXCEPTION: 5,\n        IO_EXCEPTION: 6,\n        INVALID_ACTION: 7,\n        JSON_EXCEPTION: 8,\n        ERROR: 9\n    },\n\n    /**\n     * Called by native code when returning successful result from an action.\n     */\n    callbackSuccess: function(callbackId, args) {\n        try {\n            cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);\n        } catch (e) {\n            console.log(\"Error in error callback: \" + callbackId + \" = \"+e);\n        }\n    },\n\n    /**\n     * Called by native code when returning error result from an action.\n     */\n    callbackError: function(callbackId, args) {\n        // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.\n        // Derive success from status.\n        try {\n            cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);\n        } catch (e) {\n            console.log(\"Error in error callback: \" + callbackId + \" = \"+e);\n        }\n    },\n\n    /**\n     * Called by native code when returning the result from an action.\n     */\n    callbackFromNative: function(callbackId, success, status, args, keepCallback) {\n        var callback = cordova.callbacks[callbackId];\n        if (callback) {\n            if (success && status == cordova.callbackStatus.OK) {\n                callback.success && callback.success.apply(null, args);\n            } else if (!success) {\n                callback.fail && callback.fail.apply(null, args);\n            }\n\n            // Clear callback if not expecting any more results\n            if (!keepCallback) {\n                delete cordova.callbacks[callbackId];\n            }\n        }\n    },\n    addConstructor: function(func) {\n        channel.onCordovaReady.subscribe(function() {\n            try {\n                func();\n            } catch(e) {\n                console.log(\"Failed to run constructor: \" + e);\n            }\n        });\n    }\n};\n\n// Register pause, resume and deviceready channels as events on document.\nchannel.onPause = cordova.addDocumentEventHandler('pause');\nchannel.onResume = cordova.addDocumentEventHandler('resume');\nchannel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');\n\nmodule.exports = cordova;\n\n});\n\n//@ sourceURL=lib/cordova.js")} catch(e) {console.log("exception: in lib/cordova.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/argscheck\", function(require, exports, module) {\n\nvar exec = require('cordova/exec');\nvar utils = require('cordova/utils');\n\nvar moduleExports = module.exports;\n\nvar typeMap = {\n    'A': 'Array',\n    'D': 'Date',\n    'N': 'Number',\n    'S': 'String',\n    'F': 'Function',\n    'O': 'Object'\n};\n\nfunction extractParamName(callee, argIndex) {\n  return (/.*?\\((.*?)\\)/).exec(callee)[1].split(', ')[argIndex];\n}\n\nfunction checkArgs(spec, functionName, args, opt_callee) {\n    if (!moduleExports.enableChecks) {\n        return;\n    }\n    var errMsg = null;\n    var typeName;\n    for (var i = 0; i < spec.length; ++i) {\n        var c = spec.charAt(i),\n            cUpper = c.toUpperCase(),\n            arg = args[i];\n        // Asterix means allow anything.\n        if (c == '*') {\n            continue;\n        }\n        typeName = utils.typeName(arg);\n        if ((arg === null || arg === undefined) && c == cUpper) {\n            continue;\n        }\n        if (typeName != typeMap[cUpper]) {\n            errMsg = 'Expected ' + typeMap[cUpper];\n            break;\n        }\n    }\n    if (errMsg) {\n        errMsg += ', but got ' + typeName + '.';\n        errMsg = 'Wrong type for parameter \"' + extractParamName(opt_callee || args.callee, i) + '\" of ' + functionName + ': ' + errMsg;\n        // Don't log when running jake test.\n        if (typeof jasmine == 'undefined') {\n            console.error(errMsg);\n        }\n        throw TypeError(errMsg);\n    }\n}\n\nfunction getValue(value, defaultValue) {\n    return value === undefined ? defaultValue : value;\n}\n\nmoduleExports.checkArgs = checkArgs;\nmoduleExports.getValue = getValue;\nmoduleExports.enableChecks = true;\n\n\n});\n\n//@ sourceURL=lib/common/argscheck.js")} catch(e) {console.log("exception: in lib/common/argscheck.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/builder\", function(require, exports, module) {\n\nvar utils = require('cordova/utils');\n\nfunction each(objects, func, context) {\n    for (var prop in objects) {\n        if (objects.hasOwnProperty(prop)) {\n            func.apply(context, [objects[prop], prop]);\n        }\n    }\n}\n\nfunction clobber(obj, key, value) {\n    exports.replaceHookForTesting(obj, key);\n    obj[key] = value;\n    // Getters can only be overridden by getters.\n    if (obj[key] !== value) {\n        utils.defineGetter(obj, key, function() {\n            return value;\n        });\n    }\n}\n\nfunction assignOrWrapInDeprecateGetter(obj, key, value, message) {\n    if (message) {\n        utils.defineGetter(obj, key, function() {\n            console.log(message);\n            delete obj[key];\n            clobber(obj, key, value);\n            return value;\n        });\n    } else {\n        clobber(obj, key, value);\n    }\n}\n\nfunction include(parent, objects, clobber, merge) {\n    each(objects, function (obj, key) {\n        try {\n          var result = obj.path ? require(obj.path) : {};\n\n          if (clobber) {\n              // Clobber if it doesn't exist.\n              if (typeof parent[key] === 'undefined') {\n                  assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);\n              } else if (typeof obj.path !== 'undefined') {\n                  // If merging, merge properties onto parent, otherwise, clobber.\n                  if (merge) {\n                      recursiveMerge(parent[key], result);\n                  } else {\n                      assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);\n                  }\n              }\n              result = parent[key];\n          } else {\n            // Overwrite if not currently defined.\n            if (typeof parent[key] == 'undefined') {\n              assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);\n            } else {\n              // Set result to what already exists, so we can build children into it if they exist.\n              result = parent[key];\n            }\n          }\n\n          if (obj.children) {\n            include(result, obj.children, clobber, merge);\n          }\n        } catch(e) {\n          utils.alert('Exception building cordova JS globals: ' + e + ' for key \"' + key + '\"');\n        }\n    });\n}\n\n/**\n * Merge properties from one object onto another recursively.  Properties from\n * the src object will overwrite existing target property.\n *\n * @param target Object to merge properties into.\n * @param src Object to merge properties from.\n */\nfunction recursiveMerge(target, src) {\n    for (var prop in src) {\n        if (src.hasOwnProperty(prop)) {\n            if (target.prototype && target.prototype.constructor === target) {\n                // If the target object is a constructor override off prototype.\n                clobber(target.prototype, prop, src[prop]);\n            } else {\n                if (typeof src[prop] === 'object' && typeof target[prop] === 'object') {\n                    recursiveMerge(target[prop], src[prop]);\n                } else {\n                    clobber(target, prop, src[prop]);\n                }\n            }\n        }\n    }\n}\n\nexports.buildIntoButDoNotClobber = function(objects, target) {\n    include(target, objects, false, false);\n};\nexports.buildIntoAndClobber = function(objects, target) {\n    include(target, objects, true, false);\n};\nexports.buildIntoAndMerge = function(objects, target) {\n    include(target, objects, true, true);\n};\nexports.recursiveMerge = recursiveMerge;\nexports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter;\nexports.replaceHookForTesting = function() {};\n\n});\n\n//@ sourceURL=lib/common/builder.js")} catch(e) {console.log("exception: in lib/common/builder.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/channel\", function(require, exports, module) {\n\nvar utils = require('cordova/utils'),\n    nextGuid = 1;\n\n/**\n * Custom pub-sub \"channel\" that can have functions subscribed to it\n * This object is used to define and control firing of events for\n * cordova initialization, as well as for custom events thereafter.\n *\n * The order of events during page load and Cordova startup is as follows:\n *\n * onDOMContentLoaded*         Internal event that is received when the web page is loaded and parsed.\n * onNativeReady*              Internal event that indicates the Cordova native side is ready.\n * onCordovaReady*             Internal event fired when all Cordova JavaScript objects have been created.\n * onCordovaInfoReady*         Internal event fired when device properties are available.\n * onCordovaConnectionReady*   Internal event fired when the connection property has been set.\n * onDeviceReady*              User event fired to indicate that Cordova is ready\n * onResume                    User event fired to indicate a start/resume lifecycle event\n * onPause                     User event fired to indicate a pause lifecycle event\n * onDestroy*                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).\n *\n * The events marked with an * are sticky. Once they have fired, they will stay in the fired state.\n * All listeners that subscribe after the event is fired will be executed right away.\n *\n * The only Cordova events that user code should register for are:\n *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript\n *      pause                 App has moved to background\n *      resume                App has returned to foreground\n *\n * Listeners can be registered as:\n *      document.addEventListener(\"deviceready\", myDeviceReadyListener, false);\n *      document.addEventListener(\"resume\", myResumeListener, false);\n *      document.addEventListener(\"pause\", myPauseListener, false);\n *\n * The DOM lifecycle events should be used for saving and restoring state\n *      window.onload\n *      window.onunload\n *\n */\n\n/**\n * Channel\n * @constructor\n * @param type  String the channel name\n */\nvar Channel = function(type, sticky) {\n    this.type = type;\n    // Map of guid -> function.\n    this.handlers = {};\n    // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.\n    this.state = sticky ? 1 : 0;\n    // Used in sticky mode to remember args passed to fire().\n    this.fireArgs = null;\n    // Used by onHasSubscribersChange to know if there are any listeners.\n    this.numHandlers = 0;\n    // Function that is called when the first listener is subscribed, or when\n    // the last listener is unsubscribed.\n    this.onHasSubscribersChange = null;\n},\n    channel = {\n        /**\n         * Calls the provided function only after all of the channels specified\n         * have been fired. All channels must be sticky channels.\n         */\n        join: function(h, c) {\n            var len = c.length,\n                i = len,\n                f = function() {\n                    if (!(--i)) h();\n                };\n            for (var j=0; j<len; j++) {\n                if (c[j].state === 0) {\n                    throw Error('Can only use join with sticky channels.');\n                }\n                c[j].subscribe(f);\n            }\n            if (!len) h();\n        },\n        create: function(type) {\n            return channel[type] = new Channel(type, false);\n        },\n        createSticky: function(type) {\n            return channel[type] = new Channel(type, true);\n        },\n\n        /**\n         * cordova Channels that must fire before \"deviceready\" is fired.\n         */\n        deviceReadyChannelsArray: [],\n        deviceReadyChannelsMap: {},\n\n        /**\n         * Indicate that a feature needs to be initialized before it is ready to be used.\n         * This holds up Cordova's \"deviceready\" event until the feature has been initialized\n         * and Cordova.initComplete(feature) is called.\n         *\n         * @param feature {String}     The unique feature name\n         */\n        waitForInitialization: function(feature) {\n            if (feature) {\n                var c = channel[feature] || this.createSticky(feature);\n                this.deviceReadyChannelsMap[feature] = c;\n                this.deviceReadyChannelsArray.push(c);\n            }\n        },\n\n        /**\n         * Indicate that initialization code has completed and the feature is ready to be used.\n         *\n         * @param feature {String}     The unique feature name\n         */\n        initializationComplete: function(feature) {\n            var c = this.deviceReadyChannelsMap[feature];\n            if (c) {\n                c.fire();\n            }\n        }\n    };\n\nfunction forceFunction(f) {\n    if (typeof f != 'function') throw \"Function required as first argument!\";\n}\n\n/**\n * Subscribes the given function to the channel. Any time that\n * Channel.fire is called so too will the function.\n * Optionally specify an execution context for the function\n * and a guid that can be used to stop subscribing to the channel.\n * Returns the guid.\n */\nChannel.prototype.subscribe = function(f, c) {\n    // need a function to call\n    forceFunction(f);\n    if (this.state == 2) {\n        f.apply(c || this, this.fireArgs);\n        return;\n    }\n\n    var func = f,\n        guid = f.observer_guid;\n    if (typeof c == \"object\") { func = utils.close(c, f); }\n\n    if (!guid) {\n        // first time any channel has seen this subscriber\n        guid = '' + nextGuid++;\n    }\n    func.observer_guid = guid;\n    f.observer_guid = guid;\n\n    // Don't add the same handler more than once.\n    if (!this.handlers[guid]) {\n        this.handlers[guid] = func;\n        this.numHandlers++;\n        if (this.numHandlers == 1) {\n            this.onHasSubscribersChange && this.onHasSubscribersChange();\n        }\n    }\n};\n\n/**\n * Unsubscribes the function with the given guid from the channel.\n */\nChannel.prototype.unsubscribe = function(f) {\n    // need a function to unsubscribe\n    forceFunction(f);\n\n    var guid = f.observer_guid,\n        handler = this.handlers[guid];\n    if (handler) {\n        delete this.handlers[guid];\n        this.numHandlers--;\n        if (this.numHandlers === 0) {\n            this.onHasSubscribersChange && this.onHasSubscribersChange();\n        }\n    }\n};\n\n/**\n * Calls all functions subscribed to this channel.\n */\nChannel.prototype.fire = function(e) {\n    var fail = false,\n        fireArgs = Array.prototype.slice.call(arguments);\n    // Apply stickiness.\n    if (this.state == 1) {\n        this.state = 2;\n        this.fireArgs = fireArgs;\n    }\n    if (this.numHandlers) {\n        // Copy the values first so that it is safe to modify it from within\n        // callbacks.\n        var toCall = [];\n        for (var item in this.handlers) {\n            toCall.push(this.handlers[item]);\n        }\n        for (var i = 0; i < toCall.length; ++i) {\n            toCall[i].apply(this, fireArgs);\n        }\n        if (this.state == 2 && this.numHandlers) {\n            this.numHandlers = 0;\n            this.handlers = {};\n            this.onHasSubscribersChange && this.onHasSubscribersChange();\n        }\n    }\n};\n\n\n// defining them here so they are ready super fast!\n// DOM event that is received when the web page is loaded and parsed.\nchannel.createSticky('onDOMContentLoaded');\n\n// Event to indicate the Cordova native side is ready.\nchannel.createSticky('onNativeReady');\n\n// Event to indicate that all Cordova JavaScript objects have been created\n// and it's time to run plugin constructors.\nchannel.createSticky('onCordovaReady');\n\n// Event to indicate that device properties are available\nchannel.createSticky('onCordovaInfoReady');\n\n// Event to indicate that the connection property has been set.\nchannel.createSticky('onCordovaConnectionReady');\n\n// Event to indicate that all automatically loaded JS plugins are loaded and ready.\n// This is used in conjunction with the automatic plugin JS loading CLI prototype.\nchannel.createSticky('onPluginsReady');\n\n// Event to indicate that Cordova is ready\nchannel.createSticky('onDeviceReady');\n\n// Event to indicate a resume lifecycle event\nchannel.create('onResume');\n\n// Event to indicate a pause lifecycle event\nchannel.create('onPause');\n\n// Event to indicate a destroy lifecycle event\nchannel.createSticky('onDestroy');\n\n// Channels that must fire before \"deviceready\" is fired.\nchannel.waitForInitialization('onCordovaReady');\nchannel.waitForInitialization('onCordovaConnectionReady');\n\nmodule.exports = channel;\n\n});\n\n//@ sourceURL=lib/common/channel.js")} catch(e) {console.log("exception: in lib/common/channel.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/commandProxy\", function(require, exports, module) {\n\n\n// internal map of proxy function\nvar CommandProxyMap = {};\n\nmodule.exports = {\n\n    // example: cordova.commandProxy.add(\"Accelerometer\",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);\n    add:function(id,proxyObj) {\n        console.log(\"adding proxy for \" + id);\n        CommandProxyMap[id] = proxyObj;\n        return proxyObj;\n    },\n\n    // cordova.commandProxy.remove(\"Accelerometer\");\n    remove:function(id) {\n        var proxy = CommandProxyMap[id];\n        delete CommandProxyMap[id];\n        CommandProxyMap[id] = null;\n        return proxy;\n    },\n\n    get:function(service,action) {\n        return ( CommandProxyMap[service] ? CommandProxyMap[service][action] : null );\n    }\n};\n});\n\n//@ sourceURL=lib/common/commandProxy.js")} catch(e) {console.log("exception: in lib/common/commandProxy.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/exec\", function(require, exports, module) {\n\n/**\n * Execute a cordova command.  It is up to the native side whether this action\n * is synchronous or asynchronous.  The native side can return:\n *      Synchronous: PluginResult object as a JSON string\n *      Asynchrounous: Empty string \"\"\n * If async, the native side will cordova.callbackSuccess or cordova.callbackError,\n * depending upon the result of the action.\n *\n * @param {Function} success    The success callback\n * @param {Function} fail       The fail callback\n * @param {String} service      The name of the service to use\n * @param {String} action       Action to be run in cordova\n * @param {String[]} [args]     Zero or more arguments to pass to the method\n */\n\nvar plugins = {\n    \"Device\": require('cordova/plugin/webos/device'),\n    \"NetworkStatus\": require('cordova/plugin/webos/network'),\n    \"Compass\": require('cordova/plugin/webos/compass'),\n    \"Camera\": require('cordova/plugin/webos/camera'),\n    \"Accelerometer\" : require('cordova/plugin/webos/accelerometer'),\n    \"Notification\" : require('cordova/plugin/webos/notification'),\n    \"Geolocation\": require('cordova/plugin/webos/geolocation')\n};\n\nmodule.exports = function(success, fail, service, action, args) {\n    try {\n        console.error(\"exec:call plugin:\"+service+\":\"+action);\n        plugins[service][action](success, fail, args);\n    }\n    catch(e) {\n        console.error(\"missing exec: \" + service + \".\" + action);\n        console.error(args);\n        console.error(e);\n        console.error(e.stack);\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/exec.js")} catch(e) {console.log("exception: in lib/webos/exec.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/modulemapper\", function(require, exports, module) {\n\nvar builder = require('cordova/builder'),\n    moduleMap = define.moduleMap,\n    symbolList,\n    deprecationMap;\n\nexports.reset = function() {\n    symbolList = [];\n    deprecationMap = {};\n};\n\nfunction addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) {\n    if (!(moduleName in moduleMap)) {\n        throw new Error('Module ' + moduleName + ' does not exist.');\n    }\n    symbolList.push(strategy, moduleName, symbolPath);\n    if (opt_deprecationMessage) {\n        deprecationMap[symbolPath] = opt_deprecationMessage;\n    }\n}\n\n// Note: Android 2.3 does have Function.bind().\nexports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) {\n    addEntry('c', moduleName, symbolPath, opt_deprecationMessage);\n};\n\nexports.merges = function(moduleName, symbolPath, opt_deprecationMessage) {\n    addEntry('m', moduleName, symbolPath, opt_deprecationMessage);\n};\n\nexports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) {\n    addEntry('d', moduleName, symbolPath, opt_deprecationMessage);\n};\n\nfunction prepareNamespace(symbolPath, context) {\n    if (!symbolPath) {\n        return context;\n    }\n    var parts = symbolPath.split('.');\n    var cur = context;\n    for (var i = 0, part; part = parts[i]; ++i) {\n        cur = cur[part] = cur[part] || {};\n    }\n    return cur;\n}\n\nexports.mapModules = function(context) {\n    var origSymbols = {};\n    context.CDV_origSymbols = origSymbols;\n    for (var i = 0, len = symbolList.length; i < len; i += 3) {\n        var strategy = symbolList[i];\n        var moduleName = symbolList[i + 1];\n        var symbolPath = symbolList[i + 2];\n        var lastDot = symbolPath.lastIndexOf('.');\n        var namespace = symbolPath.substr(0, lastDot);\n        var lastName = symbolPath.substr(lastDot + 1);\n\n        var module = require(moduleName);\n        var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;\n        var parentObj = prepareNamespace(namespace, context);\n        var target = parentObj[lastName];\n\n        if (strategy == 'm' && target) {\n            builder.recursiveMerge(target, module);\n        } else if ((strategy == 'd' && !target) || (strategy != 'd')) {\n            if (!(symbolPath in origSymbols)) {\n                origSymbols[symbolPath] = target;\n            }\n            builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);\n        }\n    }\n};\n\nexports.getOriginalSymbol = function(context, symbolPath) {\n    var origSymbols = context.CDV_origSymbols;\n    if (origSymbols && (symbolPath in origSymbols)) {\n        return origSymbols[symbolPath];\n    }\n    var parts = symbolPath.split('.');\n    var obj = context;\n    for (var i = 0; i < parts.length; ++i) {\n        obj = obj && obj[parts[i]];\n    }\n    return obj;\n};\n\nexports.loadMatchingModules = function(matchingRegExp) {\n    for (var k in moduleMap) {\n        if (matchingRegExp.exec(k)) {\n            require(k);\n        }\n    }\n};\n\nexports.reset();\n\n\n});\n\n//@ sourceURL=lib/common/modulemapper.js")} catch(e) {console.log("exception: in lib/common/modulemapper.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/platform\", function(require, exports, module) {\n\nvar service=require('cordova/plugin/webos/service'),\n    cordova = require('cordova');\n\nmodule.exports = {\n    id: \"webos\",\n    initialize: function() {\n        var modulemapper = require('cordova/modulemapper');\n\n        modulemapper.loadMatchingModules(/cordova.*\\/symbols$/);\n        modulemapper.mapModules(window);\n\n        if (window.PalmSystem) {\n            window.PalmSystem.stageReady();\n        }\n\n        // create global Mojo object if it does not exist\n        Mojo = window.Mojo || {};\n\n        // wait for deviceready before listening and firing document events\n        document.addEventListener(\"deviceready\", function () {\n\n            // LunaSysMgr calls this when the windows is maximized or opened.\n            window.Mojo.stageActivated = function() {\n                console.log(\"stageActivated\");\n                cordova.fireDocumentEvent(\"resume\");\n            };\n            // LunaSysMgr calls this when the windows is minimized or closed.\n            window.Mojo.stageDeactivated = function() {\n                console.log(\"stageDeactivated\");\n                cordova.fireDocumentEvent(\"pause\");\n            };\n            // LunaSysMgr calls this when a KeepAlive app's window is hidden\n            window.Mojo.hide = function() {\n                console.log(\"hide\");\n            };\n            // LunaSysMgr calls this when a KeepAlive app's window is shown\n            window.Mojo.show = function() {\n                console.log(\"show\");\n            };\n\n            // LunaSysMgr calls this whenever an app is \"launched;\"\n            window.Mojo.relaunch = function() {\n                // need to return true to tell sysmgr the relaunch succeeded.\n                // otherwise, it'll try to focus the app, which will focus the first\n                // opened window of an app with multiple windows.\n\n                var lp=JSON.parse(PalmSystem.launchParams) || {};\n\n                if (lp['palm-command'] && lp['palm-command'] == 'open-app-menu') {\n                    console.log(\"event:ToggleAppMenu\");\n                    cordova.fireDocumentEvent(\"menubutton\");\n                }\n\n                console.log(\"relaunch\");\n                return true;\n            };\n\n            // start to listen for network connection changes\n            service.Request('palm://com.palm.connectionmanager', {\n                method: 'getstatus',\n                parameters: { subscribe: true },\n                onSuccess: function (result) {\n                    console.log(\"subscribe:result:\"+JSON.stringify(result));\n\n                    if (!result.isInternetConnectionAvailable) {\n                        if (navigator.onLine) {\n                            console.log(\"Firing event:offline\");\n                            cordova.fireDocumentEvent(\"offline\");\n                        }\n                    } else {\n                        console.log(\"Firing event:online\");\n                        cordova.fireDocumentEvent(\"online\");\n                    }\n                },\n                onFailure: function(e) {\n                    console.error(\"subscribe:error\");\n                }\n            });\n\n        });\n    },\n    merges: {\n        navigator: {\n            children: {\n                service: {\n                    path: \"cordova/plugin/webos/service\"\n                },\n                application: {\n                    path: \"cordova/plugin/webos/application\"\n                },\n                window: {\n                    path: \"cordova/plugin/webos/window\"\n                },\n                orientation: {\n                    path: \"cordova/plugin/webos/orientation\"\n                },\n                keyboard: {\n                    path: \"cordova/plugin/webos/keyboard\"\n                }\n            }\n        }\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/platform.js")} catch(e) {console.log("exception: in lib/webos/platform.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Acceleration\", function(require, exports, module) {\n\nvar Acceleration = function(x, y, z, timestamp) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.timestamp = timestamp || (new Date()).getTime();\n};\n\nmodule.exports = Acceleration;\n\n});\n\n//@ sourceURL=lib/common/plugin/Acceleration.js")} catch(e) {console.log("exception: in lib/common/plugin/Acceleration.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Camera\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    Camera = require('cordova/plugin/CameraConstants'),\n    CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle');\n\nvar cameraExport = {};\n\n// Tack on the Camera Constants to the base camera plugin.\nfor (var key in Camera) {\n    cameraExport[key] = Camera[key];\n}\n\n/**\n * Gets a picture from source defined by \"options.sourceType\", and returns the\n * image as defined by the \"options.destinationType\" option.\n\n * The defaults are sourceType=CAMERA and destinationType=FILE_URI.\n *\n * @param {Function} successCallback\n * @param {Function} errorCallback\n * @param {Object} options\n */\ncameraExport.getPicture = function(successCallback, errorCallback, options) {\n    argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);\n    options = options || {};\n    var getValue = argscheck.getValue;\n\n    var quality = getValue(options.quality, 50);\n    var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);\n    var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);\n    var targetWidth = getValue(options.targetWidth, -1);\n    var targetHeight = getValue(options.targetHeight, -1);\n    var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);\n    var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);\n    var allowEdit = !!options.allowEdit;\n    var correctOrientation = !!options.correctOrientation;\n    var saveToPhotoAlbum = !!options.saveToPhotoAlbum;\n    var popoverOptions = getValue(options.popoverOptions, null);\n\n    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,\n                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];\n\n    exec(successCallback, errorCallback, \"Camera\", \"takePicture\", args);\n    return new CameraPopoverHandle();\n};\n\ncameraExport.cleanup = function(successCallback, errorCallback) {\n    exec(successCallback, errorCallback, \"Camera\", \"cleanup\", []);\n};\n\nmodule.exports = cameraExport;\n\n});\n\n//@ sourceURL=lib/common/plugin/Camera.js")} catch(e) {console.log("exception: in lib/common/plugin/Camera.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CameraConstants\", function(require, exports, module) {\n\nmodule.exports = {\n  DestinationType:{\n    DATA_URL: 0,         // Return base64 encoded string\n    FILE_URI: 1,         // Return file uri (content://media/external/images/media/2 for Android)\n    NATIVE_URI: 2        // Return native uri (eg. asset-library://... for iOS)\n  },\n  EncodingType:{\n    JPEG: 0,             // Return JPEG encoded image\n    PNG: 1               // Return PNG encoded image\n  },\n  MediaType:{\n    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType\n    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL\n    ALLMEDIA : 2         // allow selection from all media types\n  },\n  PictureSourceType:{\n    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)\n    CAMERA : 1,          // Take picture from camera\n    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)\n  },\n  PopoverArrowDirection:{\n      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover\n      ARROW_DOWN : 2,\n      ARROW_LEFT : 4,\n      ARROW_RIGHT : 8,\n      ARROW_ANY : 15\n  }\n};\n\n});\n\n//@ sourceURL=lib/common/plugin/CameraConstants.js")} catch(e) {console.log("exception: in lib/common/plugin/CameraConstants.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CameraPopoverHandle\", function(require, exports, module) {\n\nvar exec = require('cordova/exec');\n\n/**\n * A handle to an image picker popover.\n */\nvar CameraPopoverHandle = function() {\n    this.setPosition = function(popoverOptions) {\n        console.log('CameraPopoverHandle.setPosition is only supported on iOS.');\n    };\n};\n\nmodule.exports = CameraPopoverHandle;\n\n});\n\n//@ sourceURL=lib/common/plugin/CameraPopoverHandle.js")} catch(e) {console.log("exception: in lib/common/plugin/CameraPopoverHandle.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CameraPopoverOptions\", function(require, exports, module) {\n\nvar Camera = require('cordova/plugin/CameraConstants');\n\n/**\n * Encapsulates options for iOS Popover image picker\n */\nvar CameraPopoverOptions = function(x,y,width,height,arrowDir){\n    // information of rectangle that popover should be anchored to\n    this.x = x || 0;\n    this.y = y || 32;\n    this.width = width || 320;\n    this.height = height || 480;\n    // The direction of the popover arrow\n    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;\n};\n\nmodule.exports = CameraPopoverOptions;\n\n});\n\n//@ sourceURL=lib/common/plugin/CameraPopoverOptions.js")} catch(e) {console.log("exception: in lib/common/plugin/CameraPopoverOptions.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CaptureAudioOptions\", function(require, exports, module) {\n\n/**\n * Encapsulates all audio capture operation configuration options.\n */\nvar CaptureAudioOptions = function(){\n    // Upper limit of sound clips user can record. Value must be equal or greater than 1.\n    this.limit = 1;\n    // Maximum duration of a single sound clip in seconds.\n    this.duration = 0;\n    // The selected audio mode. Must match with one of the elements in supportedAudioModes array.\n    this.mode = null;\n};\n\nmodule.exports = CaptureAudioOptions;\n\n});\n\n//@ sourceURL=lib/common/plugin/CaptureAudioOptions.js")} catch(e) {console.log("exception: in lib/common/plugin/CaptureAudioOptions.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CaptureError\", function(require, exports, module) {\n\n/**\n * The CaptureError interface encapsulates all errors in the Capture API.\n */\nvar CaptureError = function(c) {\n   this.code = c || null;\n};\n\n// Camera or microphone failed to capture image or sound.\nCaptureError.CAPTURE_INTERNAL_ERR = 0;\n// Camera application or audio capture application is currently serving other capture request.\nCaptureError.CAPTURE_APPLICATION_BUSY = 1;\n// Invalid use of the API (e.g. limit parameter has value less than one).\nCaptureError.CAPTURE_INVALID_ARGUMENT = 2;\n// User exited camera application or audio capture application before capturing anything.\nCaptureError.CAPTURE_NO_MEDIA_FILES = 3;\n// The requested capture operation is not supported.\nCaptureError.CAPTURE_NOT_SUPPORTED = 20;\n\nmodule.exports = CaptureError;\n\n});\n\n//@ sourceURL=lib/common/plugin/CaptureError.js")} catch(e) {console.log("exception: in lib/common/plugin/CaptureError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CaptureImageOptions\", function(require, exports, module) {\n\n/**\n * Encapsulates all image capture operation configuration options.\n */\nvar CaptureImageOptions = function(){\n    // Upper limit of images user can take. Value must be equal or greater than 1.\n    this.limit = 1;\n    // The selected image mode. Must match with one of the elements in supportedImageModes array.\n    this.mode = null;\n};\n\nmodule.exports = CaptureImageOptions;\n\n});\n\n//@ sourceURL=lib/common/plugin/CaptureImageOptions.js")} catch(e) {console.log("exception: in lib/common/plugin/CaptureImageOptions.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CaptureVideoOptions\", function(require, exports, module) {\n\n/**\n * Encapsulates all video capture operation configuration options.\n */\nvar CaptureVideoOptions = function(){\n    // Upper limit of videos user can record. Value must be equal or greater than 1.\n    this.limit = 1;\n    // Maximum duration of a single video clip in seconds.\n    this.duration = 0;\n    // The selected video mode. Must match with one of the elements in supportedVideoModes array.\n    this.mode = null;\n};\n\nmodule.exports = CaptureVideoOptions;\n\n});\n\n//@ sourceURL=lib/common/plugin/CaptureVideoOptions.js")} catch(e) {console.log("exception: in lib/common/plugin/CaptureVideoOptions.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CompassError\", function(require, exports, module) {\n\n/**\n *  CompassError.\n *  An error code assigned by an implementation when an error has occurred\n * @constructor\n */\nvar CompassError = function(err) {\n    this.code = (err !== undefined ? err : null);\n};\n\nCompassError.COMPASS_INTERNAL_ERR = 0;\nCompassError.COMPASS_NOT_SUPPORTED = 20;\n\nmodule.exports = CompassError;\n\n});\n\n//@ sourceURL=lib/common/plugin/CompassError.js")} catch(e) {console.log("exception: in lib/common/plugin/CompassError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/CompassHeading\", function(require, exports, module) {\n\nvar CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {\n  this.magneticHeading = magneticHeading;\n  this.trueHeading = trueHeading;\n  this.headingAccuracy = headingAccuracy;\n  this.timestamp = timestamp || new Date().getTime();\n};\n\nmodule.exports = CompassHeading;\n\n});\n\n//@ sourceURL=lib/common/plugin/CompassHeading.js")} catch(e) {console.log("exception: in lib/common/plugin/CompassHeading.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ConfigurationData\", function(require, exports, module) {\n\n/**\n * Encapsulates a set of parameters that the capture device supports.\n */\nfunction ConfigurationData() {\n    // The ASCII-encoded string in lower case representing the media type.\n    this.type = null;\n    // The height attribute represents height of the image or video in pixels.\n    // In the case of a sound clip this attribute has value 0.\n    this.height = 0;\n    // The width attribute represents width of the image or video in pixels.\n    // In the case of a sound clip this attribute has value 0\n    this.width = 0;\n}\n\nmodule.exports = ConfigurationData;\n\n});\n\n//@ sourceURL=lib/common/plugin/ConfigurationData.js")} catch(e) {console.log("exception: in lib/common/plugin/ConfigurationData.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Connection\", function(require, exports, module) {\n\n/**\n * Network status\n */\nmodule.exports = {\n        UNKNOWN: \"unknown\",\n        ETHERNET: \"ethernet\",\n        WIFI: \"wifi\",\n        CELL_2G: \"2g\",\n        CELL_3G: \"3g\",\n        CELL_4G: \"4g\",\n        CELL:\"cellular\",\n        NONE: \"none\"\n};\n\n});\n\n//@ sourceURL=lib/common/plugin/Connection.js")} catch(e) {console.log("exception: in lib/common/plugin/Connection.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Contact\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    ContactError = require('cordova/plugin/ContactError'),\n    utils = require('cordova/utils');\n\n/**\n* Converts primitives into Complex Object\n* Currently only used for Date fields\n*/\nfunction convertIn(contact) {\n    var value = contact.birthday;\n    try {\n      contact.birthday = new Date(parseFloat(value));\n    } catch (exception){\n      console.log(\"Cordova Contact convertIn error: exception creating date.\");\n    }\n    return contact;\n}\n\n/**\n* Converts Complex objects into primitives\n* Only conversion at present is for Dates.\n**/\n\nfunction convertOut(contact) {\n    var value = contact.birthday;\n    if (value !== null) {\n        // try to make it a Date object if it is not already\n        if (!utils.isDate(value)){\n            try {\n                value = new Date(value);\n            } catch(exception){\n                value = null;\n            }\n        }\n        if (utils.isDate(value)){\n            value = value.valueOf(); // convert to milliseconds\n        }\n        contact.birthday = value;\n    }\n    return contact;\n}\n\n/**\n* Contains information about a single contact.\n* @constructor\n* @param {DOMString} id unique identifier\n* @param {DOMString} displayName\n* @param {ContactName} name\n* @param {DOMString} nickname\n* @param {Array.<ContactField>} phoneNumbers array of phone numbers\n* @param {Array.<ContactField>} emails array of email addresses\n* @param {Array.<ContactAddress>} addresses array of addresses\n* @param {Array.<ContactField>} ims instant messaging user ids\n* @param {Array.<ContactOrganization>} organizations\n* @param {DOMString} birthday contact's birthday\n* @param {DOMString} note user notes about contact\n* @param {Array.<ContactField>} photos\n* @param {Array.<ContactField>} categories\n* @param {Array.<ContactField>} urls contact's web sites\n*/\nvar Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,\n    ims, organizations, birthday, note, photos, categories, urls) {\n    this.id = id || null;\n    this.rawId = null;\n    this.displayName = displayName || null;\n    this.name = name || null; // ContactName\n    this.nickname = nickname || null;\n    this.phoneNumbers = phoneNumbers || null; // ContactField[]\n    this.emails = emails || null; // ContactField[]\n    this.addresses = addresses || null; // ContactAddress[]\n    this.ims = ims || null; // ContactField[]\n    this.organizations = organizations || null; // ContactOrganization[]\n    this.birthday = birthday || null;\n    this.note = note || null;\n    this.photos = photos || null; // ContactField[]\n    this.categories = categories || null; // ContactField[]\n    this.urls = urls || null; // ContactField[]\n};\n\n/**\n* Removes contact from device storage.\n* @param successCB success callback\n* @param errorCB error callback\n*/\nContact.prototype.remove = function(successCB, errorCB) {\n    argscheck.checkArgs('FF', 'Contact.remove', arguments);\n    var fail = errorCB && function(code) {\n        errorCB(new ContactError(code));\n    };\n    if (this.id === null) {\n        fail(ContactError.UNKNOWN_ERROR);\n    }\n    else {\n        exec(successCB, fail, \"Contacts\", \"remove\", [this.id]);\n    }\n};\n\n/**\n* Creates a deep copy of this Contact.\n* With the contact ID set to null.\n* @return copy of this Contact\n*/\nContact.prototype.clone = function() {\n    var clonedContact = utils.clone(this);\n    clonedContact.id = null;\n    clonedContact.rawId = null;\n\n    function nullIds(arr) {\n        if (arr) {\n            for (var i = 0; i < arr.length; ++i) {\n                arr[i].id = null;\n            }\n        }\n    }\n\n    // Loop through and clear out any id's in phones, emails, etc.\n    nullIds(clonedContact.phoneNumbers);\n    nullIds(clonedContact.emails);\n    nullIds(clonedContact.addresses);\n    nullIds(clonedContact.ims);\n    nullIds(clonedContact.organizations);\n    nullIds(clonedContact.categories);\n    nullIds(clonedContact.photos);\n    nullIds(clonedContact.urls);\n    return clonedContact;\n};\n\n/**\n* Persists contact to device storage.\n* @param successCB success callback\n* @param errorCB error callback\n*/\nContact.prototype.save = function(successCB, errorCB) {\n    argscheck.checkArgs('FFO', 'Contact.save', arguments);\n    var fail = errorCB && function(code) {\n        errorCB(new ContactError(code));\n    };\n    var success = function(result) {\n        if (result) {\n            if (successCB) {\n                var fullContact = require('cordova/plugin/contacts').create(result);\n                successCB(convertIn(fullContact));\n            }\n        }\n        else {\n            // no Entry object returned\n            fail(ContactError.UNKNOWN_ERROR);\n        }\n    };\n    var dupContact = convertOut(utils.clone(this));\n    exec(success, fail, \"Contacts\", \"save\", [dupContact]);\n};\n\n\nmodule.exports = Contact;\n\n});\n\n//@ sourceURL=lib/common/plugin/Contact.js")} catch(e) {console.log("exception: in lib/common/plugin/Contact.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ContactAddress\", function(require, exports, module) {\n\n/**\n* Contact address.\n* @constructor\n* @param {DOMString} id unique identifier, should only be set by native code\n* @param formatted // NOTE: not a W3C standard\n* @param streetAddress\n* @param locality\n* @param region\n* @param postalCode\n* @param country\n*/\n\nvar ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {\n    this.id = null;\n    this.pref = (typeof pref != 'undefined' ? pref : false);\n    this.type = type || null;\n    this.formatted = formatted || null;\n    this.streetAddress = streetAddress || null;\n    this.locality = locality || null;\n    this.region = region || null;\n    this.postalCode = postalCode || null;\n    this.country = country || null;\n};\n\nmodule.exports = ContactAddress;\n\n});\n\n//@ sourceURL=lib/common/plugin/ContactAddress.js")} catch(e) {console.log("exception: in lib/common/plugin/ContactAddress.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ContactError\", function(require, exports, module) {\n\n/**\n *  ContactError.\n *  An error code assigned by an implementation when an error has occurred\n * @constructor\n */\nvar ContactError = function(err) {\n    this.code = (typeof err != 'undefined' ? err : null);\n};\n\n/**\n * Error codes\n */\nContactError.UNKNOWN_ERROR = 0;\nContactError.INVALID_ARGUMENT_ERROR = 1;\nContactError.TIMEOUT_ERROR = 2;\nContactError.PENDING_OPERATION_ERROR = 3;\nContactError.IO_ERROR = 4;\nContactError.NOT_SUPPORTED_ERROR = 5;\nContactError.PERMISSION_DENIED_ERROR = 20;\n\nmodule.exports = ContactError;\n\n});\n\n//@ sourceURL=lib/common/plugin/ContactError.js")} catch(e) {console.log("exception: in lib/common/plugin/ContactError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ContactField\", function(require, exports, module) {\n\n/**\n* Generic contact field.\n* @constructor\n* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard\n* @param type\n* @param value\n* @param pref\n*/\nvar ContactField = function(type, value, pref) {\n    this.id = null;\n    this.type = (type && type.toString()) || null;\n    this.value = (value && value.toString()) || null;\n    this.pref = (typeof pref != 'undefined' ? pref : false);\n};\n\nmodule.exports = ContactField;\n\n});\n\n//@ sourceURL=lib/common/plugin/ContactField.js")} catch(e) {console.log("exception: in lib/common/plugin/ContactField.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ContactFindOptions\", function(require, exports, module) {\n\n/**\n * ContactFindOptions.\n * @constructor\n * @param filter used to match contacts against\n * @param multiple boolean used to determine if more than one contact should be returned\n */\n\nvar ContactFindOptions = function(filter, multiple) {\n    this.filter = filter || '';\n    this.multiple = (typeof multiple != 'undefined' ? multiple : false);\n};\n\nmodule.exports = ContactFindOptions;\n\n});\n\n//@ sourceURL=lib/common/plugin/ContactFindOptions.js")} catch(e) {console.log("exception: in lib/common/plugin/ContactFindOptions.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ContactName\", function(require, exports, module) {\n\n/**\n* Contact name.\n* @constructor\n* @param formatted // NOTE: not part of W3C standard\n* @param familyName\n* @param givenName\n* @param middle\n* @param prefix\n* @param suffix\n*/\nvar ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {\n    this.formatted = formatted || null;\n    this.familyName = familyName || null;\n    this.givenName = givenName || null;\n    this.middleName = middle || null;\n    this.honorificPrefix = prefix || null;\n    this.honorificSuffix = suffix || null;\n};\n\nmodule.exports = ContactName;\n\n});\n\n//@ sourceURL=lib/common/plugin/ContactName.js")} catch(e) {console.log("exception: in lib/common/plugin/ContactName.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ContactOrganization\", function(require, exports, module) {\n\n/**\n* Contact organization.\n* @constructor\n* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard\n* @param name\n* @param dept\n* @param title\n* @param startDate\n* @param endDate\n* @param location\n* @param desc\n*/\n\nvar ContactOrganization = function(pref, type, name, dept, title) {\n    this.id = null;\n    this.pref = (typeof pref != 'undefined' ? pref : false);\n    this.type = type || null;\n    this.name = name || null;\n    this.department = dept || null;\n    this.title = title || null;\n};\n\nmodule.exports = ContactOrganization;\n\n});\n\n//@ sourceURL=lib/common/plugin/ContactOrganization.js")} catch(e) {console.log("exception: in lib/common/plugin/ContactOrganization.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Coordinates\", function(require, exports, module) {\n\n/**\n * This class contains position information.\n * @param {Object} lat\n * @param {Object} lng\n * @param {Object} alt\n * @param {Object} acc\n * @param {Object} head\n * @param {Object} vel\n * @param {Object} altacc\n * @constructor\n */\nvar Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {\n    /**\n     * The latitude of the position.\n     */\n    this.latitude = lat;\n    /**\n     * The longitude of the position,\n     */\n    this.longitude = lng;\n    /**\n     * The accuracy of the position.\n     */\n    this.accuracy = acc;\n    /**\n     * The altitude of the position.\n     */\n    this.altitude = (alt !== undefined ? alt : null);\n    /**\n     * The direction the device is moving at the position.\n     */\n    this.heading = (head !== undefined ? head : null);\n    /**\n     * The velocity with which the device is moving at the position.\n     */\n    this.speed = (vel !== undefined ? vel : null);\n\n    if (this.speed === 0 || this.speed === null) {\n        this.heading = NaN;\n    }\n\n    /**\n     * The altitude accuracy of the position.\n     */\n    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;\n};\n\nmodule.exports = Coordinates;\n\n});\n\n//@ sourceURL=lib/common/plugin/Coordinates.js")} catch(e) {console.log("exception: in lib/common/plugin/Coordinates.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/DirectoryEntry\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    utils = require('cordova/utils'),\n    exec = require('cordova/exec'),\n    Entry = require('cordova/plugin/Entry'),\n    FileError = require('cordova/plugin/FileError'),\n    DirectoryReader = require('cordova/plugin/DirectoryReader');\n\n/**\n * An interface representing a directory on the file system.\n *\n * {boolean} isFile always false (readonly)\n * {boolean} isDirectory always true (readonly)\n * {DOMString} name of the directory, excluding the path leading to it (readonly)\n * {DOMString} fullPath the absolute full path to the directory (readonly)\n * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)\n */\nvar DirectoryEntry = function(name, fullPath) {\n     DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath);\n};\n\nutils.extend(DirectoryEntry, Entry);\n\n/**\n * Creates a new DirectoryReader to read entries from this directory\n */\nDirectoryEntry.prototype.createReader = function() {\n    return new DirectoryReader(this.fullPath);\n};\n\n/**\n * Creates or looks up a directory\n *\n * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory\n * @param {Flags} options to create or exclusively create the directory\n * @param {Function} successCallback is called with the new entry\n * @param {Function} errorCallback is called with a FileError\n */\nDirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {\n    argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);\n    var win = successCallback && function(result) {\n        var entry = new DirectoryEntry(result.name, result.fullPath);\n        successCallback(entry);\n    };\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n    exec(win, fail, \"File\", \"getDirectory\", [this.fullPath, path, options]);\n};\n\n/**\n * Deletes a directory and all of it's contents\n *\n * @param {Function} successCallback is called with no parameters\n * @param {Function} errorCallback is called with a FileError\n */\nDirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {\n    argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n    exec(successCallback, fail, \"File\", \"removeRecursively\", [this.fullPath]);\n};\n\n/**\n * Creates or looks up a file\n *\n * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file\n * @param {Flags} options to create or exclusively create the file\n * @param {Function} successCallback is called with the new entry\n * @param {Function} errorCallback is called with a FileError\n */\nDirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {\n    argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);\n    var win = successCallback && function(result) {\n        var FileEntry = require('cordova/plugin/FileEntry');\n        var entry = new FileEntry(result.name, result.fullPath);\n        successCallback(entry);\n    };\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n    exec(win, fail, \"File\", \"getFile\", [this.fullPath, path, options]);\n};\n\nmodule.exports = DirectoryEntry;\n\n});\n\n//@ sourceURL=lib/common/plugin/DirectoryEntry.js")} catch(e) {console.log("exception: in lib/common/plugin/DirectoryEntry.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/DirectoryReader\", function(require, exports, module) {\n\nvar exec = require('cordova/exec'),\n    FileError = require('cordova/plugin/FileError') ;\n\n/**\n * An interface that lists the files and directories in a directory.\n */\nfunction DirectoryReader(path) {\n    this.path = path || null;\n}\n\n/**\n * Returns a list of entries from a directory.\n *\n * @param {Function} successCallback is called with a list of entries\n * @param {Function} errorCallback is called with a FileError\n */\nDirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {\n    var win = typeof successCallback !== 'function' ? null : function(result) {\n        var retVal = [];\n        for (var i=0; i<result.length; i++) {\n            var entry = null;\n            if (result[i].isDirectory) {\n                entry = new (require('cordova/plugin/DirectoryEntry'))();\n            }\n            else if (result[i].isFile) {\n                entry = new (require('cordova/plugin/FileEntry'))();\n            }\n            entry.isDirectory = result[i].isDirectory;\n            entry.isFile = result[i].isFile;\n            entry.name = result[i].name;\n            entry.fullPath = result[i].fullPath;\n            retVal.push(entry);\n        }\n        successCallback(retVal);\n    };\n    var fail = typeof errorCallback !== 'function' ? null : function(code) {\n        errorCallback(new FileError(code));\n    };\n    exec(win, fail, \"File\", \"readEntries\", [this.path]);\n};\n\nmodule.exports = DirectoryReader;\n\n});\n\n//@ sourceURL=lib/common/plugin/DirectoryReader.js")} catch(e) {console.log("exception: in lib/common/plugin/DirectoryReader.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Entry\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    FileError = require('cordova/plugin/FileError'),\n    Metadata = require('cordova/plugin/Metadata');\n\n/**\n * Represents a file or directory on the local file system.\n *\n * @param isFile\n *            {boolean} true if Entry is a file (readonly)\n * @param isDirectory\n *            {boolean} true if Entry is a directory (readonly)\n * @param name\n *            {DOMString} name of the file or directory, excluding the path\n *            leading to it (readonly)\n * @param fullPath\n *            {DOMString} the absolute full path to the file or directory\n *            (readonly)\n */\nfunction Entry(isFile, isDirectory, name, fullPath, fileSystem) {\n    this.isFile = !!isFile;\n    this.isDirectory = !!isDirectory;\n    this.name = name || '';\n    this.fullPath = fullPath || '';\n    this.filesystem = fileSystem || null;\n}\n\n/**\n * Look up the metadata of the entry.\n *\n * @param successCallback\n *            {Function} is called with a Metadata object\n * @param errorCallback\n *            {Function} is called with a FileError\n */\nEntry.prototype.getMetadata = function(successCallback, errorCallback) {\n    argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);\n    var success = successCallback && function(lastModified) {\n        var metadata = new Metadata(lastModified);\n        successCallback(metadata);\n    };\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n\n    exec(success, fail, \"File\", \"getMetadata\", [this.fullPath]);\n};\n\n/**\n * Set the metadata of the entry.\n *\n * @param successCallback\n *            {Function} is called with a Metadata object\n * @param errorCallback\n *            {Function} is called with a FileError\n * @param metadataObject\n *            {Object} keys and values to set\n */\nEntry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {\n    argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);\n    exec(successCallback, errorCallback, \"File\", \"setMetadata\", [this.fullPath, metadataObject]);\n};\n\n/**\n * Move a file or directory to a new location.\n *\n * @param parent\n *            {DirectoryEntry} the directory to which to move this entry\n * @param newName\n *            {DOMString} new name of the entry, defaults to the current name\n * @param successCallback\n *            {Function} called with the new DirectoryEntry object\n * @param errorCallback\n *            {Function} called with a FileError\n */\nEntry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {\n    argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n    // source path\n    var srcPath = this.fullPath,\n        // entry name\n        name = newName || this.name,\n        success = function(entry) {\n            if (entry) {\n                if (successCallback) {\n                    // create appropriate Entry object\n                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);\n                    successCallback(result);\n                }\n            }\n            else {\n                // no Entry object returned\n                fail && fail(FileError.NOT_FOUND_ERR);\n            }\n        };\n\n    // copy\n    exec(success, fail, \"File\", \"moveTo\", [srcPath, parent.fullPath, name]);\n};\n\n/**\n * Copy a directory to a different location.\n *\n * @param parent\n *            {DirectoryEntry} the directory to which to copy the entry\n * @param newName\n *            {DOMString} new name of the entry, defaults to the current name\n * @param successCallback\n *            {Function} called with the new Entry object\n * @param errorCallback\n *            {Function} called with a FileError\n */\nEntry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {\n    argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n\n        // source path\n    var srcPath = this.fullPath,\n        // entry name\n        name = newName || this.name,\n        // success callback\n        success = function(entry) {\n            if (entry) {\n                if (successCallback) {\n                    // create appropriate Entry object\n                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);\n                    successCallback(result);\n                }\n            }\n            else {\n                // no Entry object returned\n                fail && fail(FileError.NOT_FOUND_ERR);\n            }\n        };\n\n    // copy\n    exec(success, fail, \"File\", \"copyTo\", [srcPath, parent.fullPath, name]);\n};\n\n/**\n * Return a URL that can be used to identify this entry.\n */\nEntry.prototype.toURL = function() {\n    // fullPath attribute contains the full URL\n    return this.fullPath;\n};\n\n/**\n * Returns a URI that can be used to identify this entry.\n *\n * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.\n * @return uri\n */\nEntry.prototype.toURI = function(mimeType) {\n    console.log(\"DEPRECATED: Update your code to use 'toURL'\");\n    // fullPath attribute contains the full URI\n    return this.toURL();\n};\n\n/**\n * Remove a file or directory. It is an error to attempt to delete a\n * directory that is not empty. It is an error to attempt to delete a\n * root directory of a file system.\n *\n * @param successCallback {Function} called with no parameters\n * @param errorCallback {Function} called with a FileError\n */\nEntry.prototype.remove = function(successCallback, errorCallback) {\n    argscheck.checkArgs('FF', 'Entry.remove', arguments);\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n    exec(successCallback, fail, \"File\", \"remove\", [this.fullPath]);\n};\n\n/**\n * Look up the parent DirectoryEntry of this entry.\n *\n * @param successCallback {Function} called with the parent DirectoryEntry object\n * @param errorCallback {Function} called with a FileError\n */\nEntry.prototype.getParent = function(successCallback, errorCallback) {\n    argscheck.checkArgs('FF', 'Entry.getParent', arguments);\n    var win = successCallback && function(result) {\n        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');\n        var entry = new DirectoryEntry(result.name, result.fullPath);\n        successCallback(entry);\n    };\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n    exec(win, fail, \"File\", \"getParent\", [this.fullPath]);\n};\n\nmodule.exports = Entry;\n\n});\n\n//@ sourceURL=lib/common/plugin/Entry.js")} catch(e) {console.log("exception: in lib/common/plugin/Entry.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/File\", function(require, exports, module) {\n\n/**\n * Constructor.\n * name {DOMString} name of the file, without path information\n * fullPath {DOMString} the full path of the file, including the name\n * type {DOMString} mime type\n * lastModifiedDate {Date} last modified date\n * size {Number} size of the file in bytes\n */\n\nvar File = function(name, fullPath, type, lastModifiedDate, size){\n    this.name = name || '';\n    this.fullPath = fullPath || null;\n    this.type = type || null;\n    this.lastModifiedDate = lastModifiedDate || null;\n    this.size = size || 0;\n\n    // These store the absolute start and end for slicing the file.\n    this.start = 0;\n    this.end = this.size;\n};\n\n/**\n * Returns a \"slice\" of the file. Since Cordova Files don't contain the actual\n * content, this really returns a File with adjusted start and end.\n * Slices of slices are supported.\n * start {Number} The index at which to start the slice (inclusive).\n * end {Number} The index at which to end the slice (exclusive).\n */\nFile.prototype.slice = function(start, end) {\n    var size = this.end - this.start;\n    var newStart = 0;\n    var newEnd = size;\n    if (arguments.length) {\n        if (start < 0) {\n            newStart = Math.max(size + start, 0);\n        } else {\n            newStart = Math.min(size, start);\n        }\n    }\n\n    if (arguments.length >= 2) {\n        if (end < 0) {\n            newEnd = Math.max(size + end, 0);\n        } else {\n            newEnd = Math.min(end, size);\n        }\n    }\n\n    var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size);\n    newFile.start = this.start + newStart;\n    newFile.end = this.start + newEnd;\n    return newFile;\n};\n\n\nmodule.exports = File;\n\n});\n\n//@ sourceURL=lib/common/plugin/File.js")} catch(e) {console.log("exception: in lib/common/plugin/File.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileEntry\", function(require, exports, module) {\n\nvar utils = require('cordova/utils'),\n    exec = require('cordova/exec'),\n    Entry = require('cordova/plugin/Entry'),\n    FileWriter = require('cordova/plugin/FileWriter'),\n    File = require('cordova/plugin/File'),\n    FileError = require('cordova/plugin/FileError');\n\n/**\n * An interface representing a file on the file system.\n *\n * {boolean} isFile always true (readonly)\n * {boolean} isDirectory always false (readonly)\n * {DOMString} name of the file, excluding the path leading to it (readonly)\n * {DOMString} fullPath the absolute full path to the file (readonly)\n * {FileSystem} filesystem on which the file resides (readonly)\n */\nvar FileEntry = function(name, fullPath) {\n     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);\n};\n\nutils.extend(FileEntry, Entry);\n\n/**\n * Creates a new FileWriter associated with the file that this FileEntry represents.\n *\n * @param {Function} successCallback is called with the new FileWriter\n * @param {Function} errorCallback is called with a FileError\n */\nFileEntry.prototype.createWriter = function(successCallback, errorCallback) {\n    this.file(function(filePointer) {\n        var writer = new FileWriter(filePointer);\n\n        if (writer.fileName === null || writer.fileName === \"\") {\n            errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR));\n        } else {\n            successCallback && successCallback(writer);\n        }\n    }, errorCallback);\n};\n\n/**\n * Returns a File that represents the current state of the file that this FileEntry represents.\n *\n * @param {Function} successCallback is called with the new File object\n * @param {Function} errorCallback is called with a FileError\n */\nFileEntry.prototype.file = function(successCallback, errorCallback) {\n    var win = successCallback && function(f) {\n        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);\n        successCallback(file);\n    };\n    var fail = errorCallback && function(code) {\n        errorCallback(new FileError(code));\n    };\n    exec(win, fail, \"File\", \"getFileMetadata\", [this.fullPath]);\n};\n\n\nmodule.exports = FileEntry;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileEntry.js")} catch(e) {console.log("exception: in lib/common/plugin/FileEntry.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileError\", function(require, exports, module) {\n\n/**\n * FileError\n */\nfunction FileError(error) {\n  this.code = error || null;\n}\n\n// File error codes\n// Found in DOMException\nFileError.NOT_FOUND_ERR = 1;\nFileError.SECURITY_ERR = 2;\nFileError.ABORT_ERR = 3;\n\n// Added by File API specification\nFileError.NOT_READABLE_ERR = 4;\nFileError.ENCODING_ERR = 5;\nFileError.NO_MODIFICATION_ALLOWED_ERR = 6;\nFileError.INVALID_STATE_ERR = 7;\nFileError.SYNTAX_ERR = 8;\nFileError.INVALID_MODIFICATION_ERR = 9;\nFileError.QUOTA_EXCEEDED_ERR = 10;\nFileError.TYPE_MISMATCH_ERR = 11;\nFileError.PATH_EXISTS_ERR = 12;\n\nmodule.exports = FileError;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileError.js")} catch(e) {console.log("exception: in lib/common/plugin/FileError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileReader\", function(require, exports, module) {\n\nvar exec = require('cordova/exec'),\n    modulemapper = require('cordova/modulemapper'),\n    utils = require('cordova/utils'),\n    File = require('cordova/plugin/File'),\n    FileError = require('cordova/plugin/FileError'),\n    ProgressEvent = require('cordova/plugin/ProgressEvent'),\n    origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader');\n\n/**\n * This class reads the mobile device file system.\n *\n * For Android:\n *      The root directory is the root of the file system.\n *      To read from the SD card, the file name is \"sdcard/my_file.txt\"\n * @constructor\n */\nvar FileReader = function() {\n    this._readyState = 0;\n    this._error = null;\n    this._result = null;\n    this._fileName = '';\n    this._realReader = origFileReader ? new origFileReader() : {};\n};\n\n// States\nFileReader.EMPTY = 0;\nFileReader.LOADING = 1;\nFileReader.DONE = 2;\n\nutils.defineGetter(FileReader.prototype, 'readyState', function() {\n    return this._fileName ? this._readyState : this._realReader.readyState;\n});\n\nutils.defineGetter(FileReader.prototype, 'error', function() {\n    return this._fileName ? this._error: this._realReader.error;\n});\n\nutils.defineGetter(FileReader.prototype, 'result', function() {\n    return this._fileName ? this._result: this._realReader.result;\n});\n\nfunction defineEvent(eventName) {\n    utils.defineGetterSetter(FileReader.prototype, eventName, function() {\n        return this._realReader[eventName] || null;\n    }, function(value) {\n        this._realReader[eventName] = value;\n    });\n}\ndefineEvent('onloadstart');    // When the read starts.\ndefineEvent('onprogress');     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)\ndefineEvent('onload');         // When the read has successfully completed.\ndefineEvent('onerror');        // When the read has failed (see errors).\ndefineEvent('onloadend');      // When the request has completed (either in success or failure).\ndefineEvent('onabort');        // When the read has been aborted. For instance, by invoking the abort() method.\n\nfunction initRead(reader, file) {\n    // Already loading something\n    if (reader.readyState == FileReader.LOADING) {\n      throw new FileError(FileError.INVALID_STATE_ERR);\n    }\n\n    reader._result = null;\n    reader._error = null;\n    reader._readyState = FileReader.LOADING;\n\n    if (typeof file == 'string') {\n        // Deprecated in Cordova 2.4.\n        console.warning('Using a string argument with FileReader.readAs functions is deprecated.');\n        reader._fileName = file;\n    } else if (typeof file.fullPath == 'string') {\n        reader._fileName = file.fullPath;\n    } else {\n        reader._fileName = '';\n        return true;\n    }\n\n    reader.onloadstart && reader.onloadstart(new ProgressEvent(\"loadstart\", {target:reader}));\n}\n\n/**\n * Abort reading file.\n */\nFileReader.prototype.abort = function() {\n    if (origFileReader && !this._fileName) {\n        return this._realReader.abort();\n    }\n    this._result = null;\n\n    if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) {\n      return;\n    }\n\n    this._readyState = FileReader.DONE;\n\n    // If abort callback\n    if (typeof this.onabort === 'function') {\n        this.onabort(new ProgressEvent('abort', {target:this}));\n    }\n    // If load end callback\n    if (typeof this.onloadend === 'function') {\n        this.onloadend(new ProgressEvent('loadend', {target:this}));\n    }\n};\n\n/**\n * Read text file.\n *\n * @param file          {File} File object containing file properties\n * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)\n */\nFileReader.prototype.readAsText = function(file, encoding) {\n    if (initRead(this, file)) {\n        return this._realReader.readAsText(file, encoding);\n    }\n\n    // Default encoding is UTF-8\n    var enc = encoding ? encoding : \"UTF-8\";\n    var me = this;\n    var execArgs = [this._fileName, enc];\n\n    // Maybe add slice parameters.\n    if (file.end < file.size) {\n        execArgs.push(file.start, file.end);\n    } else if (file.start > 0) {\n        execArgs.push(file.start);\n    }\n\n    // Read file\n    exec(\n        // Success callback\n        function(r) {\n            // If DONE (cancelled), then don't do anything\n            if (me._readyState === FileReader.DONE) {\n                return;\n            }\n\n            // Save result\n            me._result = r;\n\n            // If onload callback\n            if (typeof me.onload === \"function\") {\n                me.onload(new ProgressEvent(\"load\", {target:me}));\n            }\n\n            // DONE state\n            me._readyState = FileReader.DONE;\n\n            // If onloadend callback\n            if (typeof me.onloadend === \"function\") {\n                me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n            }\n        },\n        // Error callback\n        function(e) {\n            // If DONE (cancelled), then don't do anything\n            if (me._readyState === FileReader.DONE) {\n                return;\n            }\n\n            // DONE state\n            me._readyState = FileReader.DONE;\n\n            // null result\n            me._result = null;\n\n            // Save error\n            me._error = new FileError(e);\n\n            // If onerror callback\n            if (typeof me.onerror === \"function\") {\n                me.onerror(new ProgressEvent(\"error\", {target:me}));\n            }\n\n            // If onloadend callback\n            if (typeof me.onloadend === \"function\") {\n                me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n            }\n        }, \"File\", \"readAsText\", execArgs);\n};\n\n\n/**\n * Read file and return data as a base64 encoded data url.\n * A data url is of the form:\n *      data:[<mediatype>][;base64],<data>\n *\n * @param file          {File} File object containing file properties\n */\nFileReader.prototype.readAsDataURL = function(file) {\n    if (initRead(this, file)) {\n        return this._realReader.readAsDataURL(file);\n    }\n\n    var me = this;\n    var execArgs = [this._fileName];\n\n    // Maybe add slice parameters.\n    if (file.end < file.size) {\n        execArgs.push(file.start, file.end);\n    } else if (file.start > 0) {\n        execArgs.push(file.start);\n    }\n\n    // Read file\n    exec(\n        // Success callback\n        function(r) {\n            // If DONE (cancelled), then don't do anything\n            if (me._readyState === FileReader.DONE) {\n                return;\n            }\n\n            // DONE state\n            me._readyState = FileReader.DONE;\n\n            // Save result\n            me._result = r;\n\n            // If onload callback\n            if (typeof me.onload === \"function\") {\n                me.onload(new ProgressEvent(\"load\", {target:me}));\n            }\n\n            // If onloadend callback\n            if (typeof me.onloadend === \"function\") {\n                me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n            }\n        },\n        // Error callback\n        function(e) {\n            // If DONE (cancelled), then don't do anything\n            if (me._readyState === FileReader.DONE) {\n                return;\n            }\n\n            // DONE state\n            me._readyState = FileReader.DONE;\n\n            me._result = null;\n\n            // Save error\n            me._error = new FileError(e);\n\n            // If onerror callback\n            if (typeof me.onerror === \"function\") {\n                me.onerror(new ProgressEvent(\"error\", {target:me}));\n            }\n\n            // If onloadend callback\n            if (typeof me.onloadend === \"function\") {\n                me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n            }\n        }, \"File\", \"readAsDataURL\", execArgs);\n};\n\n/**\n * Read file and return data as a binary data.\n *\n * @param file          {File} File object containing file properties\n */\nFileReader.prototype.readAsBinaryString = function(file) {\n    if (initRead(this, file)) {\n        return this._realReader.readAsBinaryString(file);\n    }\n    // TODO - Can't return binary data to browser.\n    console.log('method \"readAsBinaryString\" is not supported at this time.');\n    this.abort();\n};\n\n/**\n * Read file and return data as a binary data.\n *\n * @param file          {File} File object containing file properties\n */\nFileReader.prototype.readAsArrayBuffer = function(file) {\n    if (initRead(this, file)) {\n        return this._realReader.readAsArrayBuffer(file);\n    }\n    // TODO - Can't return binary data to browser.\n    console.log('This method is not supported at this time.');\n    this.abort();\n};\n\nmodule.exports = FileReader;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileReader.js")} catch(e) {console.log("exception: in lib/common/plugin/FileReader.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileSystem\", function(require, exports, module) {\n\nvar DirectoryEntry = require('cordova/plugin/DirectoryEntry');\n\n/**\n * An interface representing a file system\n *\n * @constructor\n * {DOMString} name the unique name of the file system (readonly)\n * {DirectoryEntry} root directory of the file system (readonly)\n */\nvar FileSystem = function(name, root) {\n    this.name = name || null;\n    if (root) {\n        this.root = new DirectoryEntry(root.name, root.fullPath);\n    }\n};\n\nmodule.exports = FileSystem;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileSystem.js")} catch(e) {console.log("exception: in lib/common/plugin/FileSystem.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileTransfer\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    FileTransferError = require('cordova/plugin/FileTransferError'),\n    ProgressEvent = require('cordova/plugin/ProgressEvent');\n\nfunction newProgressEvent(result) {\n    var pe = new ProgressEvent();\n    pe.lengthComputable = result.lengthComputable;\n    pe.loaded = result.loaded;\n    pe.total = result.total;\n    return pe;\n}\n\nvar idCounter = 0;\n\n/**\n * FileTransfer uploads a file to a remote server.\n * @constructor\n */\nvar FileTransfer = function() {\n    this._id = ++idCounter;\n    this.onprogress = null; // optional callback\n};\n\n/**\n* Given an absolute file path, uploads a file on the device to a remote server\n* using a multipart HTTP request.\n* @param filePath {String}           Full path of the file on the device\n* @param server {String}             URL of the server to receive the file\n* @param successCallback (Function}  Callback to be invoked when upload has completed\n* @param errorCallback {Function}    Callback to be invoked upon error\n* @param options {FileUploadOptions} Optional parameters such as file name and mimetype\n* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false\n*/\nFileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {\n    argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments);\n    // check for options\n    var fileKey = null;\n    var fileName = null;\n    var mimeType = null;\n    var params = null;\n    var chunkedMode = true;\n    var headers = null;\n    if (options) {\n        fileKey = options.fileKey;\n        fileName = options.fileName;\n        mimeType = options.mimeType;\n        headers = options.headers;\n        if (options.chunkedMode !== null || typeof options.chunkedMode != \"undefined\") {\n            chunkedMode = options.chunkedMode;\n        }\n        if (options.params) {\n            params = options.params;\n        }\n        else {\n            params = {};\n        }\n    }\n\n    var fail = errorCallback && function(e) {\n        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);\n        errorCallback(error);\n    };\n\n    var self = this;\n    var win = function(result) {\n        if (typeof result.lengthComputable != \"undefined\") {\n            if (self.onprogress) {\n                self.onprogress(newProgressEvent(result));\n            }\n        } else {\n            successCallback && successCallback(result);\n        }\n    };\n    exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id]);\n};\n\n/**\n * Downloads a file form a given URL and saves it to the specified directory.\n * @param source {String}          URL of the server to receive the file\n * @param target {String}         Full path of the file on the device\n * @param successCallback (Function}  Callback to be invoked when upload has completed\n * @param errorCallback {Function}    Callback to be invoked upon error\n * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false\n */\nFileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts) {\n    argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments);\n    var self = this;\n    var win = function(result) {\n        if (typeof result.lengthComputable != \"undefined\") {\n            if (self.onprogress) {\n                return self.onprogress(newProgressEvent(result));\n            }\n        } else if (successCallback) {\n            var entry = null;\n            if (result.isDirectory) {\n                entry = new (require('cordova/plugin/DirectoryEntry'))();\n            }\n            else if (result.isFile) {\n                entry = new (require('cordova/plugin/FileEntry'))();\n            }\n            entry.isDirectory = result.isDirectory;\n            entry.isFile = result.isFile;\n            entry.name = result.name;\n            entry.fullPath = result.fullPath;\n            successCallback(entry);\n        }\n    };\n\n    var fail = errorCallback && function(e) {\n        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);\n        errorCallback(error);\n    };\n\n    exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id]);\n};\n\n/**\n * Aborts the ongoing file transfer on this object\n * @param successCallback {Function}  Callback to be invoked upon success\n * @param errorCallback {Function}    Callback to be invoked upon error\n */\nFileTransfer.prototype.abort = function(successCallback, errorCallback) {\n    exec(successCallback, errorCallback, 'FileTransfer', 'abort', [this._id]);\n};\n\nmodule.exports = FileTransfer;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileTransfer.js")} catch(e) {console.log("exception: in lib/common/plugin/FileTransfer.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileTransferError\", function(require, exports, module) {\n\n/**\n * FileTransferError\n * @constructor\n */\nvar FileTransferError = function(code, source, target, status, body) {\n    this.code = code || null;\n    this.source = source || null;\n    this.target = target || null;\n    this.http_status = status || null;\n    this.body = body || null;\n};\n\nFileTransferError.FILE_NOT_FOUND_ERR = 1;\nFileTransferError.INVALID_URL_ERR = 2;\nFileTransferError.CONNECTION_ERR = 3;\nFileTransferError.ABORT_ERR = 4;\n\nmodule.exports = FileTransferError;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileTransferError.js")} catch(e) {console.log("exception: in lib/common/plugin/FileTransferError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileUploadOptions\", function(require, exports, module) {\n\n/**\n * Options to customize the HTTP request used to upload files.\n * @constructor\n * @param fileKey {String}   Name of file request parameter.\n * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.\n * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.\n * @param params {Object}    Object with key: value params to send to the server.\n * @param headers {Object}   Keys are header names, values are header values. Multiple\n *                           headers of the same name are not supported.\n */\nvar FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {\n    this.fileKey = fileKey || null;\n    this.fileName = fileName || null;\n    this.mimeType = mimeType || null;\n    this.params = params || null;\n    this.headers = headers || null;\n};\n\nmodule.exports = FileUploadOptions;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileUploadOptions.js")} catch(e) {console.log("exception: in lib/common/plugin/FileUploadOptions.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileUploadResult\", function(require, exports, module) {\n\n/**\n * FileUploadResult\n * @constructor\n */\nvar FileUploadResult = function() {\n    this.bytesSent = 0;\n    this.responseCode = null;\n    this.response = null;\n};\n\nmodule.exports = FileUploadResult;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileUploadResult.js")} catch(e) {console.log("exception: in lib/common/plugin/FileUploadResult.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/FileWriter\", function(require, exports, module) {\n\nvar exec = require('cordova/exec'),\n    FileError = require('cordova/plugin/FileError'),\n    ProgressEvent = require('cordova/plugin/ProgressEvent');\n\n/**\n * This class writes to the mobile device file system.\n *\n * For Android:\n *      The root directory is the root of the file system.\n *      To write to the SD card, the file name is \"sdcard/my_file.txt\"\n *\n * @constructor\n * @param file {File} File object containing file properties\n * @param append if true write to the end of the file, otherwise overwrite the file\n */\nvar FileWriter = function(file) {\n    this.fileName = \"\";\n    this.length = 0;\n    if (file) {\n        this.fileName = file.fullPath || file;\n        this.length = file.size || 0;\n    }\n    // default is to write at the beginning of the file\n    this.position = 0;\n\n    this.readyState = 0; // EMPTY\n\n    this.result = null;\n\n    // Error\n    this.error = null;\n\n    // Event handlers\n    this.onwritestart = null;   // When writing starts\n    this.onprogress = null;     // While writing the file, and reporting partial file data\n    this.onwrite = null;        // When the write has successfully completed.\n    this.onwriteend = null;     // When the request has completed (either in success or failure).\n    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.\n    this.onerror = null;        // When the write has failed (see errors).\n};\n\n// States\nFileWriter.INIT = 0;\nFileWriter.WRITING = 1;\nFileWriter.DONE = 2;\n\n/**\n * Abort writing file.\n */\nFileWriter.prototype.abort = function() {\n    // check for invalid state\n    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {\n        throw new FileError(FileError.INVALID_STATE_ERR);\n    }\n\n    // set error\n    this.error = new FileError(FileError.ABORT_ERR);\n\n    this.readyState = FileWriter.DONE;\n\n    // If abort callback\n    if (typeof this.onabort === \"function\") {\n        this.onabort(new ProgressEvent(\"abort\", {\"target\":this}));\n    }\n\n    // If write end callback\n    if (typeof this.onwriteend === \"function\") {\n        this.onwriteend(new ProgressEvent(\"writeend\", {\"target\":this}));\n    }\n};\n\n/**\n * Writes data to the file\n *\n * @param text to be written\n */\nFileWriter.prototype.write = function(text) {\n    // Throw an exception if we are already writing a file\n    if (this.readyState === FileWriter.WRITING) {\n        throw new FileError(FileError.INVALID_STATE_ERR);\n    }\n\n    // WRITING state\n    this.readyState = FileWriter.WRITING;\n\n    var me = this;\n\n    // If onwritestart callback\n    if (typeof me.onwritestart === \"function\") {\n        me.onwritestart(new ProgressEvent(\"writestart\", {\"target\":me}));\n    }\n\n    // Write file\n    exec(\n        // Success callback\n        function(r) {\n            // If DONE (cancelled), then don't do anything\n            if (me.readyState === FileWriter.DONE) {\n                return;\n            }\n\n            // position always increases by bytes written because file would be extended\n            me.position += r;\n            // The length of the file is now where we are done writing.\n\n            me.length = me.position;\n\n            // DONE state\n            me.readyState = FileWriter.DONE;\n\n            // If onwrite callback\n            if (typeof me.onwrite === \"function\") {\n                me.onwrite(new ProgressEvent(\"write\", {\"target\":me}));\n            }\n\n            // If onwriteend callback\n            if (typeof me.onwriteend === \"function\") {\n                me.onwriteend(new ProgressEvent(\"writeend\", {\"target\":me}));\n            }\n        },\n        // Error callback\n        function(e) {\n            // If DONE (cancelled), then don't do anything\n            if (me.readyState === FileWriter.DONE) {\n                return;\n            }\n\n            // DONE state\n            me.readyState = FileWriter.DONE;\n\n            // Save error\n            me.error = new FileError(e);\n\n            // If onerror callback\n            if (typeof me.onerror === \"function\") {\n                me.onerror(new ProgressEvent(\"error\", {\"target\":me}));\n            }\n\n            // If onwriteend callback\n            if (typeof me.onwriteend === \"function\") {\n                me.onwriteend(new ProgressEvent(\"writeend\", {\"target\":me}));\n            }\n        }, \"File\", \"write\", [this.fileName, text, this.position]);\n};\n\n/**\n * Moves the file pointer to the location specified.\n *\n * If the offset is a negative number the position of the file\n * pointer is rewound.  If the offset is greater than the file\n * size the position is set to the end of the file.\n *\n * @param offset is the location to move the file pointer to.\n */\nFileWriter.prototype.seek = function(offset) {\n    // Throw an exception if we are already writing a file\n    if (this.readyState === FileWriter.WRITING) {\n        throw new FileError(FileError.INVALID_STATE_ERR);\n    }\n\n    if (!offset && offset !== 0) {\n        return;\n    }\n\n    // See back from end of file.\n    if (offset < 0) {\n        this.position = Math.max(offset + this.length, 0);\n    }\n    // Offset is bigger than file size so set position\n    // to the end of the file.\n    else if (offset > this.length) {\n        this.position = this.length;\n    }\n    // Offset is between 0 and file size so set the position\n    // to start writing.\n    else {\n        this.position = offset;\n    }\n};\n\n/**\n * Truncates the file to the size specified.\n *\n * @param size to chop the file at.\n */\nFileWriter.prototype.truncate = function(size) {\n    // Throw an exception if we are already writing a file\n    if (this.readyState === FileWriter.WRITING) {\n        throw new FileError(FileError.INVALID_STATE_ERR);\n    }\n\n    // WRITING state\n    this.readyState = FileWriter.WRITING;\n\n    var me = this;\n\n    // If onwritestart callback\n    if (typeof me.onwritestart === \"function\") {\n        me.onwritestart(new ProgressEvent(\"writestart\", {\"target\":this}));\n    }\n\n    // Write file\n    exec(\n        // Success callback\n        function(r) {\n            // If DONE (cancelled), then don't do anything\n            if (me.readyState === FileWriter.DONE) {\n                return;\n            }\n\n            // DONE state\n            me.readyState = FileWriter.DONE;\n\n            // Update the length of the file\n            me.length = r;\n            me.position = Math.min(me.position, r);\n\n            // If onwrite callback\n            if (typeof me.onwrite === \"function\") {\n                me.onwrite(new ProgressEvent(\"write\", {\"target\":me}));\n            }\n\n            // If onwriteend callback\n            if (typeof me.onwriteend === \"function\") {\n                me.onwriteend(new ProgressEvent(\"writeend\", {\"target\":me}));\n            }\n        },\n        // Error callback\n        function(e) {\n            // If DONE (cancelled), then don't do anything\n            if (me.readyState === FileWriter.DONE) {\n                return;\n            }\n\n            // DONE state\n            me.readyState = FileWriter.DONE;\n\n            // Save error\n            me.error = new FileError(e);\n\n            // If onerror callback\n            if (typeof me.onerror === \"function\") {\n                me.onerror(new ProgressEvent(\"error\", {\"target\":me}));\n            }\n\n            // If onwriteend callback\n            if (typeof me.onwriteend === \"function\") {\n                me.onwriteend(new ProgressEvent(\"writeend\", {\"target\":me}));\n            }\n        }, \"File\", \"truncate\", [this.fileName, size]);\n};\n\nmodule.exports = FileWriter;\n\n});\n\n//@ sourceURL=lib/common/plugin/FileWriter.js")} catch(e) {console.log("exception: in lib/common/plugin/FileWriter.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Flags\", function(require, exports, module) {\n\n/**\n * Supplies arguments to methods that lookup or create files and directories.\n *\n * @param create\n *            {boolean} file or directory if it doesn't exist\n * @param exclusive\n *            {boolean} used with create; if true the command will fail if\n *            target path exists\n */\nfunction Flags(create, exclusive) {\n    this.create = create || false;\n    this.exclusive = exclusive || false;\n}\n\nmodule.exports = Flags;\n\n});\n\n//@ sourceURL=lib/common/plugin/Flags.js")} catch(e) {console.log("exception: in lib/common/plugin/Flags.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/GlobalizationError\", function(require, exports, module) {\n\n\n/**\n * Globalization error object\n *\n * @constructor\n * @param code\n * @param message\n */\nvar GlobalizationError = function(code, message) {\n    this.code = code || null;\n    this.message = message || '';\n};\n\n// Globalization error codes\nGlobalizationError.UNKNOWN_ERROR = 0;\nGlobalizationError.FORMATTING_ERROR = 1;\nGlobalizationError.PARSING_ERROR = 2;\nGlobalizationError.PATTERN_ERROR = 3;\n\nmodule.exports = GlobalizationError;\n\n});\n\n//@ sourceURL=lib/common/plugin/GlobalizationError.js")} catch(e) {console.log("exception: in lib/common/plugin/GlobalizationError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/InAppBrowser\", function(require, exports, module) {\n\nvar exec = require('cordova/exec');\nvar channel = require('cordova/channel');\n\nfunction InAppBrowser() {\n   this.channels = {\n        'loadstart': channel.create('loadstart'),\n        'loadstop' : channel.create('loadstop'),\n        'exit' : channel.create('exit')\n   };\n}\n\nInAppBrowser.prototype = {\n    _eventHandler: function (event) {\n        if (event.type in this.channels) {\n            this.channels[event.type].fire(event);\n        }\n    },\n    close: function (eventname) {\n        exec(null, null, \"InAppBrowser\", \"close\", []);\n    },\n    addEventListener: function (eventname,f) {\n        if (eventname in this.channels) {\n            this.channels[eventname].subscribe(f);\n        }\n    },\n    removeEventListener: function(eventname, f) {\n        if (eventname in this.channels) {\n            this.channels[eventname].unsubscribe(f);\n        }\n    }\n};\n\nmodule.exports = function(strUrl, strWindowName, strWindowFeatures) {\n    var iab = new InAppBrowser();\n    var cb = function(eventname) {\n       iab._eventHandler(eventname);\n    };\n    exec(cb, null, \"InAppBrowser\", \"open\", [strUrl, strWindowName, strWindowFeatures]);\n    return iab;\n};\n\n\n});\n\n//@ sourceURL=lib/common/plugin/InAppBrowser.js")} catch(e) {console.log("exception: in lib/common/plugin/InAppBrowser.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/LocalFileSystem\", function(require, exports, module) {\n\nvar exec = require('cordova/exec');\n\n/**\n * Represents a local file system.\n */\nvar LocalFileSystem = function() {\n\n};\n\nLocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence\nLocalFileSystem.PERSISTENT = 1; //persistent\n\nmodule.exports = LocalFileSystem;\n\n});\n\n//@ sourceURL=lib/common/plugin/LocalFileSystem.js")} catch(e) {console.log("exception: in lib/common/plugin/LocalFileSystem.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Media\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    utils = require('cordova/utils'),\n    exec = require('cordova/exec');\n\nvar mediaObjects = {};\n\n/**\n * This class provides access to the device media, interfaces to both sound and video\n *\n * @constructor\n * @param src                   The file name or url to play\n * @param successCallback       The callback to be called when the file is done playing or recording.\n *                                  successCallback()\n * @param errorCallback         The callback to be called if there is an error.\n *                                  errorCallback(int errorCode) - OPTIONAL\n * @param statusCallback        The callback to be called when media status has changed.\n *                                  statusCallback(int statusCode) - OPTIONAL\n */\nvar Media = function(src, successCallback, errorCallback, statusCallback) {\n    argscheck.checkArgs('SFFF', 'Media', arguments);\n    this.id = utils.createUUID();\n    mediaObjects[this.id] = this;\n    this.src = src;\n    this.successCallback = successCallback;\n    this.errorCallback = errorCallback;\n    this.statusCallback = statusCallback;\n    this._duration = -1;\n    this._position = -1;\n    exec(null, this.errorCallback, \"Media\", \"create\", [this.id, this.src]);\n};\n\n// Media messages\nMedia.MEDIA_STATE = 1;\nMedia.MEDIA_DURATION = 2;\nMedia.MEDIA_POSITION = 3;\nMedia.MEDIA_ERROR = 9;\n\n// Media states\nMedia.MEDIA_NONE = 0;\nMedia.MEDIA_STARTING = 1;\nMedia.MEDIA_RUNNING = 2;\nMedia.MEDIA_PAUSED = 3;\nMedia.MEDIA_STOPPED = 4;\nMedia.MEDIA_MSG = [\"None\", \"Starting\", \"Running\", \"Paused\", \"Stopped\"];\n\n// \"static\" function to return existing objs.\nMedia.get = function(id) {\n    return mediaObjects[id];\n};\n\n/**\n * Start or resume playing audio file.\n */\nMedia.prototype.play = function(options) {\n    exec(null, null, \"Media\", \"startPlayingAudio\", [this.id, this.src, options]);\n};\n\n/**\n * Stop playing audio file.\n */\nMedia.prototype.stop = function() {\n    var me = this;\n    exec(function() {\n        me._position = 0;\n    }, this.errorCallback, \"Media\", \"stopPlayingAudio\", [this.id]);\n};\n\n/**\n * Seek or jump to a new time in the track..\n */\nMedia.prototype.seekTo = function(milliseconds) {\n    var me = this;\n    exec(function(p) {\n        me._position = p;\n    }, this.errorCallback, \"Media\", \"seekToAudio\", [this.id, milliseconds]);\n};\n\n/**\n * Pause playing audio file.\n */\nMedia.prototype.pause = function() {\n    exec(null, this.errorCallback, \"Media\", \"pausePlayingAudio\", [this.id]);\n};\n\n/**\n * Get duration of an audio file.\n * The duration is only set for audio that is playing, paused or stopped.\n *\n * @return      duration or -1 if not known.\n */\nMedia.prototype.getDuration = function() {\n    return this._duration;\n};\n\n/**\n * Get position of audio.\n */\nMedia.prototype.getCurrentPosition = function(success, fail) {\n    var me = this;\n    exec(function(p) {\n        me._position = p;\n        success(p);\n    }, fail, \"Media\", \"getCurrentPositionAudio\", [this.id]);\n};\n\n/**\n * Start recording audio file.\n */\nMedia.prototype.startRecord = function() {\n    exec(null, this.errorCallback, \"Media\", \"startRecordingAudio\", [this.id, this.src]);\n};\n\n/**\n * Stop recording audio file.\n */\nMedia.prototype.stopRecord = function() {\n    exec(null, this.errorCallback, \"Media\", \"stopRecordingAudio\", [this.id]);\n};\n\n/**\n * Release the resources.\n */\nMedia.prototype.release = function() {\n    exec(null, this.errorCallback, \"Media\", \"release\", [this.id]);\n};\n\n/**\n * Adjust the volume.\n */\nMedia.prototype.setVolume = function(volume) {\n    exec(null, null, \"Media\", \"setVolume\", [this.id, volume]);\n};\n\n/**\n * Audio has status update.\n * PRIVATE\n *\n * @param id            The media object id (string)\n * @param msgType       The 'type' of update this is\n * @param value         Use of value is determined by the msgType\n */\nMedia.onStatus = function(id, msgType, value) {\n\n    var media = mediaObjects[id];\n\n    if(media) {\n        switch(msgType) {\n            case Media.MEDIA_STATE :\n                media.statusCallback && media.statusCallback(value);\n                if(value == Media.MEDIA_STOPPED) {\n                    media.successCallback && media.successCallback();\n                }\n                break;\n            case Media.MEDIA_DURATION :\n                media._duration = value;\n                break;\n            case Media.MEDIA_ERROR :\n                media.errorCallback && media.errorCallback(value);\n                break;\n            case Media.MEDIA_POSITION :\n                media._position = Number(value);\n                break;\n            default :\n                console.error && console.error(\"Unhandled Media.onStatus :: \" + msgType);\n                break;\n        }\n    }\n    else {\n         console.error && console.error(\"Received Media.onStatus callback for unknown media :: \" + id);\n    }\n\n};\n\nmodule.exports = Media;\n\n});\n\n//@ sourceURL=lib/common/plugin/Media.js")} catch(e) {console.log("exception: in lib/common/plugin/Media.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/MediaError\", function(require, exports, module) {\n\n/**\n * This class contains information about any Media errors.\n*/\n/*\n According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror\n We should never be creating these objects, we should just implement the interface\n which has 1 property for an instance, 'code'\n\n instead of doing :\n    errorCallbackFunction( new MediaError(3,'msg') );\nwe should simply use a literal :\n    errorCallbackFunction( {'code':3} );\n */\n\n var _MediaError = window.MediaError;\n\n\nif(!_MediaError) {\n    window.MediaError = _MediaError = function(code, msg) {\n        this.code = (typeof code != 'undefined') ? code : null;\n        this.message = msg || \"\"; // message is NON-standard! do not use!\n    };\n}\n\n_MediaError.MEDIA_ERR_NONE_ACTIVE    = _MediaError.MEDIA_ERR_NONE_ACTIVE    || 0;\n_MediaError.MEDIA_ERR_ABORTED        = _MediaError.MEDIA_ERR_ABORTED        || 1;\n_MediaError.MEDIA_ERR_NETWORK        = _MediaError.MEDIA_ERR_NETWORK        || 2;\n_MediaError.MEDIA_ERR_DECODE         = _MediaError.MEDIA_ERR_DECODE         || 3;\n_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4;\n// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below.\n// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes\n_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4;\n\nmodule.exports = _MediaError;\n\n});\n\n//@ sourceURL=lib/common/plugin/MediaError.js")} catch(e) {console.log("exception: in lib/common/plugin/MediaError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/MediaFile\", function(require, exports, module) {\n\nvar utils = require('cordova/utils'),\n    exec = require('cordova/exec'),\n    File = require('cordova/plugin/File'),\n    CaptureError = require('cordova/plugin/CaptureError');\n/**\n * Represents a single file.\n *\n * name {DOMString} name of the file, without path information\n * fullPath {DOMString} the full path of the file, including the name\n * type {DOMString} mime type\n * lastModifiedDate {Date} last modified date\n * size {Number} size of the file in bytes\n */\nvar MediaFile = function(name, fullPath, type, lastModifiedDate, size){\n    MediaFile.__super__.constructor.apply(this, arguments);\n};\n\nutils.extend(MediaFile, File);\n\n/**\n * Request capture format data for a specific file and type\n *\n * @param {Function} successCB\n * @param {Function} errorCB\n */\nMediaFile.prototype.getFormatData = function(successCallback, errorCallback) {\n    if (typeof this.fullPath === \"undefined\" || this.fullPath === null) {\n        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));\n    } else {\n        exec(successCallback, errorCallback, \"Capture\", \"getFormatData\", [this.fullPath, this.type]);\n    }\n};\n\nmodule.exports = MediaFile;\n\n});\n\n//@ sourceURL=lib/common/plugin/MediaFile.js")} catch(e) {console.log("exception: in lib/common/plugin/MediaFile.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/MediaFileData\", function(require, exports, module) {\n\n/**\n * MediaFileData encapsulates format information of a media file.\n *\n * @param {DOMString} codecs\n * @param {long} bitrate\n * @param {long} height\n * @param {long} width\n * @param {float} duration\n */\nvar MediaFileData = function(codecs, bitrate, height, width, duration){\n    this.codecs = codecs || null;\n    this.bitrate = bitrate || 0;\n    this.height = height || 0;\n    this.width = width || 0;\n    this.duration = duration || 0;\n};\n\nmodule.exports = MediaFileData;\n\n});\n\n//@ sourceURL=lib/common/plugin/MediaFileData.js")} catch(e) {console.log("exception: in lib/common/plugin/MediaFileData.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Metadata\", function(require, exports, module) {\n\n/**\n * Information about the state of the file or directory\n *\n * {Date} modificationTime (readonly)\n */\nvar Metadata = function(time) {\n    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);\n};\n\nmodule.exports = Metadata;\n\n});\n\n//@ sourceURL=lib/common/plugin/Metadata.js")} catch(e) {console.log("exception: in lib/common/plugin/Metadata.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/Position\", function(require, exports, module) {\n\nvar Coordinates = require('cordova/plugin/Coordinates');\n\nvar Position = function(coords, timestamp) {\n    if (coords) {\n        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);\n    } else {\n        this.coords = new Coordinates();\n    }\n    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();\n};\n\nmodule.exports = Position;\n\n});\n\n//@ sourceURL=lib/common/plugin/Position.js")} catch(e) {console.log("exception: in lib/common/plugin/Position.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/PositionError\", function(require, exports, module) {\n\n/**\n * Position error object\n *\n * @constructor\n * @param code\n * @param message\n */\nvar PositionError = function(code, message) {\n    this.code = code || null;\n    this.message = message || '';\n};\n\nPositionError.PERMISSION_DENIED = 1;\nPositionError.POSITION_UNAVAILABLE = 2;\nPositionError.TIMEOUT = 3;\n\nmodule.exports = PositionError;\n\n});\n\n//@ sourceURL=lib/common/plugin/PositionError.js")} catch(e) {console.log("exception: in lib/common/plugin/PositionError.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/ProgressEvent\", function(require, exports, module) {\n\n// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill\n// Feature test: See if we can instantiate a native ProgressEvent;\n// if so, use that approach,\n// otherwise fill-in with our own implementation.\n//\n// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.\nvar ProgressEvent = (function() {\n    /*\n    var createEvent = function(data) {\n        var event = document.createEvent('Events');\n        event.initEvent('ProgressEvent', false, false);\n        if (data) {\n            for (var i in data) {\n                if (data.hasOwnProperty(i)) {\n                    event[i] = data[i];\n                }\n            }\n            if (data.target) {\n                // TODO: cannot call <some_custom_object>.dispatchEvent\n                // need to first figure out how to implement EventTarget\n            }\n        }\n        return event;\n    };\n    try {\n        var ev = createEvent({type:\"abort\",target:document});\n        return function ProgressEvent(type, data) {\n            data.type = type;\n            return createEvent(data);\n        };\n    } catch(e){\n    */\n        return function ProgressEvent(type, dict) {\n            this.type = type;\n            this.bubbles = false;\n            this.cancelBubble = false;\n            this.cancelable = false;\n            this.lengthComputable = false;\n            this.loaded = dict && dict.loaded ? dict.loaded : 0;\n            this.total = dict && dict.total ? dict.total : 0;\n            this.target = dict && dict.target ? dict.target : null;\n        };\n    //}\n})();\n\nmodule.exports = ProgressEvent;\n\n});\n\n//@ sourceURL=lib/common/plugin/ProgressEvent.js")} catch(e) {console.log("exception: in lib/common/plugin/ProgressEvent.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/accelerometer\", function(require, exports, module) {\n\n/**\n * This class provides access to device accelerometer data.\n * @constructor\n */\nvar argscheck = require('cordova/argscheck'),\n    utils = require(\"cordova/utils\"),\n    exec = require(\"cordova/exec\"),\n    Acceleration = require('cordova/plugin/Acceleration');\n\n// Is the accel sensor running?\nvar running = false;\n\n// Keeps reference to watchAcceleration calls.\nvar timers = {};\n\n// Array of listeners; used to keep track of when we should call start and stop.\nvar listeners = [];\n\n// Last returned acceleration object from native\nvar accel = null;\n\n// Tells native to start.\nfunction start() {\n    exec(function(a) {\n        var tempListeners = listeners.slice(0);\n        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);\n        for (var i = 0, l = tempListeners.length; i < l; i++) {\n            tempListeners[i].win(accel);\n        }\n    }, function(e) {\n        var tempListeners = listeners.slice(0);\n        for (var i = 0, l = tempListeners.length; i < l; i++) {\n            tempListeners[i].fail(e);\n        }\n    }, \"Accelerometer\", \"start\", []);\n    running = true;\n}\n\n// Tells native to stop.\nfunction stop() {\n    exec(null, null, \"Accelerometer\", \"stop\", []);\n    running = false;\n}\n\n// Adds a callback pair to the listeners array\nfunction createCallbackPair(win, fail) {\n    return {win:win, fail:fail};\n}\n\n// Removes a win/fail listener pair from the listeners array\nfunction removeListeners(l) {\n    var idx = listeners.indexOf(l);\n    if (idx > -1) {\n        listeners.splice(idx, 1);\n        if (listeners.length === 0) {\n            stop();\n        }\n    }\n}\n\nvar accelerometer = {\n    /**\n     * Asynchronously acquires the current acceleration.\n     *\n     * @param {Function} successCallback    The function to call when the acceleration data is available\n     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)\n     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)\n     */\n    getCurrentAcceleration: function(successCallback, errorCallback, options) {\n        argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments);\n\n        var p;\n        var win = function(a) {\n            removeListeners(p);\n            successCallback(a);\n        };\n        var fail = function(e) {\n            removeListeners(p);\n            errorCallback && errorCallback(e);\n        };\n\n        p = createCallbackPair(win, fail);\n        listeners.push(p);\n\n        if (!running) {\n            start();\n        }\n    },\n\n    /**\n     * Asynchronously acquires the acceleration repeatedly at a given interval.\n     *\n     * @param {Function} successCallback    The function to call each time the acceleration data is available\n     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)\n     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)\n     * @return String                       The watch id that must be passed to #clearWatch to stop watching.\n     */\n    watchAcceleration: function(successCallback, errorCallback, options) {\n        argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments);\n        // Default interval (10 sec)\n        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;\n\n        // Keep reference to watch id, and report accel readings as often as defined in frequency\n        var id = utils.createUUID();\n\n        var p = createCallbackPair(function(){}, function(e) {\n            removeListeners(p);\n            errorCallback && errorCallback(e);\n        });\n        listeners.push(p);\n\n        timers[id] = {\n            timer:window.setInterval(function() {\n                if (accel) {\n                    successCallback(accel);\n                }\n            }, frequency),\n            listeners:p\n        };\n\n        if (running) {\n            // If we're already running then immediately invoke the success callback\n            // but only if we have retrieved a value, sample code does not check for null ...\n            if (accel) {\n                successCallback(accel);\n            }\n        } else {\n            start();\n        }\n\n        return id;\n    },\n\n    /**\n     * Clears the specified accelerometer watch.\n     *\n     * @param {String} id       The id of the watch returned from #watchAcceleration.\n     */\n    clearWatch: function(id) {\n        // Stop javascript timer & remove from timer list\n        if (id && timers[id]) {\n            window.clearInterval(timers[id].timer);\n            removeListeners(timers[id].listeners);\n            delete timers[id];\n        }\n    }\n};\n\nmodule.exports = accelerometer;\n\n});\n\n//@ sourceURL=lib/common/plugin/accelerometer.js")} catch(e) {console.log("exception: in lib/common/plugin/accelerometer.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/accelerometer/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration');\nmodulemapper.defaults('cordova/plugin/accelerometer', 'navigator.accelerometer');\n\n});\n\n//@ sourceURL=lib/common/plugin/accelerometer/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/accelerometer/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/battery\", function(require, exports, module) {\n\n/**\n * This class contains information about the current battery status.\n * @constructor\n */\nvar cordova = require('cordova'),\n    exec = require('cordova/exec');\n\nfunction handlers() {\n  return battery.channels.batterystatus.numHandlers +\n         battery.channels.batterylow.numHandlers +\n         battery.channels.batterycritical.numHandlers;\n}\n\nvar Battery = function() {\n    this._level = null;\n    this._isPlugged = null;\n    // Create new event handlers on the window (returns a channel instance)\n    this.channels = {\n      batterystatus:cordova.addWindowEventHandler(\"batterystatus\"),\n      batterylow:cordova.addWindowEventHandler(\"batterylow\"),\n      batterycritical:cordova.addWindowEventHandler(\"batterycritical\")\n    };\n    for (var key in this.channels) {\n        this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange;\n    }\n};\n/**\n * Event handlers for when callbacks get registered for the battery.\n * Keep track of how many handlers we have so we can start and stop the native battery listener\n * appropriately (and hopefully save on battery life!).\n */\nBattery.onHasSubscribersChange = function() {\n  // If we just registered the first handler, make sure native listener is started.\n  if (this.numHandlers === 1 && handlers() === 1) {\n      exec(battery._status, battery._error, \"Battery\", \"start\", []);\n  } else if (handlers() === 0) {\n      exec(null, null, \"Battery\", \"stop\", []);\n  }\n};\n\n/**\n * Callback for battery status\n *\n * @param {Object} info            keys: level, isPlugged\n */\nBattery.prototype._status = function(info) {\n    if (info) {\n        var me = battery;\n    var level = info.level;\n        if (me._level !== level || me._isPlugged !== info.isPlugged) {\n            // Fire batterystatus event\n            cordova.fireWindowEvent(\"batterystatus\", info);\n\n            // Fire low battery event\n            if (level === 20 || level === 5) {\n                if (level === 20) {\n                    cordova.fireWindowEvent(\"batterylow\", info);\n                }\n                else {\n                    cordova.fireWindowEvent(\"batterycritical\", info);\n                }\n            }\n        }\n        me._level = level;\n        me._isPlugged = info.isPlugged;\n    }\n};\n\n/**\n * Error callback for battery start\n */\nBattery.prototype._error = function(e) {\n    console.log(\"Error initializing Battery: \" + e);\n};\n\nvar battery = new Battery();\n\nmodule.exports = battery;\n\n});\n\n//@ sourceURL=lib/common/plugin/battery.js")} catch(e) {console.log("exception: in lib/common/plugin/battery.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/battery/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.defaults('cordova/plugin/battery', 'navigator.battery');\n\n});\n\n//@ sourceURL=lib/common/plugin/battery/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/battery/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/camera/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.defaults('cordova/plugin/Camera', 'navigator.camera');\nmodulemapper.defaults('cordova/plugin/CameraConstants', 'Camera');\nmodulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions');\n\n});\n\n//@ sourceURL=lib/common/plugin/camera/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/camera/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/capture\", function(require, exports, module) {\n\nvar exec = require('cordova/exec'),\n    MediaFile = require('cordova/plugin/MediaFile');\n\n/**\n * Launches a capture of different types.\n *\n * @param (DOMString} type\n * @param {Function} successCB\n * @param {Function} errorCB\n * @param {CaptureVideoOptions} options\n */\nfunction _capture(type, successCallback, errorCallback, options) {\n    var win = function(pluginResult) {\n        var mediaFiles = [];\n        var i;\n        for (i = 0; i < pluginResult.length; i++) {\n            var mediaFile = new MediaFile();\n            mediaFile.name = pluginResult[i].name;\n            mediaFile.fullPath = pluginResult[i].fullPath;\n            mediaFile.type = pluginResult[i].type;\n            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;\n            mediaFile.size = pluginResult[i].size;\n            mediaFiles.push(mediaFile);\n        }\n        successCallback(mediaFiles);\n    };\n    exec(win, errorCallback, \"Capture\", type, [options]);\n}\n/**\n * The Capture interface exposes an interface to the camera and microphone of the hosting device.\n */\nfunction Capture() {\n    this.supportedAudioModes = [];\n    this.supportedImageModes = [];\n    this.supportedVideoModes = [];\n}\n\n/**\n * Launch audio recorder application for recording audio clip(s).\n *\n * @param {Function} successCB\n * @param {Function} errorCB\n * @param {CaptureAudioOptions} options\n */\nCapture.prototype.captureAudio = function(successCallback, errorCallback, options){\n    _capture(\"captureAudio\", successCallback, errorCallback, options);\n};\n\n/**\n * Launch camera application for taking image(s).\n *\n * @param {Function} successCB\n * @param {Function} errorCB\n * @param {CaptureImageOptions} options\n */\nCapture.prototype.captureImage = function(successCallback, errorCallback, options){\n    _capture(\"captureImage\", successCallback, errorCallback, options);\n};\n\n/**\n * Launch device camera application for recording video(s).\n *\n * @param {Function} successCB\n * @param {Function} errorCB\n * @param {CaptureVideoOptions} options\n */\nCapture.prototype.captureVideo = function(successCallback, errorCallback, options){\n    _capture(\"captureVideo\", successCallback, errorCallback, options);\n};\n\n\nmodule.exports = new Capture();\n\n});\n\n//@ sourceURL=lib/common/plugin/capture.js")} catch(e) {console.log("exception: in lib/common/plugin/capture.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/capture/symbols\", function(require, exports, module) {\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError');\nmodulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions');\nmodulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions');\nmodulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions');\nmodulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData');\nmodulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile');\nmodulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData');\nmodulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture');\n\n});\n\n//@ sourceURL=lib/common/plugin/capture/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/capture/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/compass\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    utils = require('cordova/utils'),\n    CompassHeading = require('cordova/plugin/CompassHeading'),\n    CompassError = require('cordova/plugin/CompassError'),\n    timers = {},\n    compass = {\n        /**\n         * Asynchronously acquires the current heading.\n         * @param {Function} successCallback The function to call when the heading\n         * data is available\n         * @param {Function} errorCallback The function to call when there is an error\n         * getting the heading data.\n         * @param {CompassOptions} options The options for getting the heading data (not used).\n         */\n        getCurrentHeading:function(successCallback, errorCallback, options) {\n            argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments);\n\n            var win = function(result) {\n                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);\n                successCallback(ch);\n            };\n            var fail = errorCallback && function(code) {\n                var ce = new CompassError(code);\n                errorCallback(ce);\n            };\n\n            // Get heading\n            exec(win, fail, \"Compass\", \"getHeading\", [options]);\n        },\n\n        /**\n         * Asynchronously acquires the heading repeatedly at a given interval.\n         * @param {Function} successCallback The function to call each time the heading\n         * data is available\n         * @param {Function} errorCallback The function to call when there is an error\n         * getting the heading data.\n         * @param {HeadingOptions} options The options for getting the heading data\n         * such as timeout and the frequency of the watch. For iOS, filter parameter\n         * specifies to watch via a distance filter rather than time.\n         */\n        watchHeading:function(successCallback, errorCallback, options) {\n            argscheck.checkArgs('fFO', 'compass.watchHeading', arguments);\n            // Default interval (100 msec)\n            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;\n            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;\n\n            var id = utils.createUUID();\n            if (filter > 0) {\n                // is an iOS request for watch by filter, no timer needed\n                timers[id] = \"iOS\";\n                compass.getCurrentHeading(successCallback, errorCallback, options);\n            } else {\n                // Start watch timer to get headings\n                timers[id] = window.setInterval(function() {\n                    compass.getCurrentHeading(successCallback, errorCallback);\n                }, frequency);\n            }\n\n            return id;\n        },\n\n        /**\n         * Clears the specified heading watch.\n         * @param {String} watchId The ID of the watch returned from #watchHeading.\n         */\n        clearWatch:function(id) {\n            // Stop javascript timer & remove from timer list\n            if (id && timers[id]) {\n                if (timers[id] != \"iOS\") {\n                    clearInterval(timers[id]);\n                } else {\n                    // is iOS watch by filter so call into device to stop\n                    exec(null, null, \"Compass\", \"stopHeading\", []);\n                }\n                delete timers[id];\n            }\n        }\n    };\n\nmodule.exports = compass;\n\n});\n\n//@ sourceURL=lib/common/plugin/compass.js")} catch(e) {console.log("exception: in lib/common/plugin/compass.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/compass/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading');\nmodulemapper.clobbers('cordova/plugin/CompassError', 'CompassError');\nmodulemapper.clobbers('cordova/plugin/compass', 'navigator.compass');\n\n});\n\n//@ sourceURL=lib/common/plugin/compass/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/compass/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/console-via-logger\", function(require, exports, module) {\n\n//------------------------------------------------------------------------------\n\nvar logger = require(\"cordova/plugin/logger\");\nvar utils  = require(\"cordova/utils\");\n\n//------------------------------------------------------------------------------\n// object that we're exporting\n//------------------------------------------------------------------------------\nvar console = module.exports;\n\n//------------------------------------------------------------------------------\n// copy of the original console object\n//------------------------------------------------------------------------------\nvar WinConsole = window.console;\n\n//------------------------------------------------------------------------------\n// whether to use the logger\n//------------------------------------------------------------------------------\nvar UseLogger = false;\n\n//------------------------------------------------------------------------------\n// Timers\n//------------------------------------------------------------------------------\nvar Timers = {};\n\n//------------------------------------------------------------------------------\n// used for unimplemented methods\n//------------------------------------------------------------------------------\nfunction noop() {}\n\n//------------------------------------------------------------------------------\n// used for unimplemented methods\n//------------------------------------------------------------------------------\nconsole.useLogger = function (value) {\n    if (arguments.length) UseLogger = !!value;\n\n    if (UseLogger) {\n        if (logger.useConsole()) {\n            throw new Error(\"console and logger are too intertwingly\");\n        }\n    }\n\n    return UseLogger;\n};\n\n//------------------------------------------------------------------------------\nconsole.log = function() {\n    if (logger.useConsole()) return;\n    logger.log.apply(logger, [].slice.call(arguments));\n};\n\n//------------------------------------------------------------------------------\nconsole.error = function() {\n    if (logger.useConsole()) return;\n    logger.error.apply(logger, [].slice.call(arguments));\n};\n\n//------------------------------------------------------------------------------\nconsole.warn = function() {\n    if (logger.useConsole()) return;\n    logger.warn.apply(logger, [].slice.call(arguments));\n};\n\n//------------------------------------------------------------------------------\nconsole.info = function() {\n    if (logger.useConsole()) return;\n    logger.info.apply(logger, [].slice.call(arguments));\n};\n\n//------------------------------------------------------------------------------\nconsole.debug = function() {\n    if (logger.useConsole()) return;\n    logger.debug.apply(logger, [].slice.call(arguments));\n};\n\n//------------------------------------------------------------------------------\nconsole.assert = function(expression) {\n    if (expression) return;\n\n    var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));\n    console.log(\"ASSERT: \" + message);\n};\n\n//------------------------------------------------------------------------------\nconsole.clear = function() {};\n\n//------------------------------------------------------------------------------\nconsole.dir = function(object) {\n    console.log(\"%o\", object);\n};\n\n//------------------------------------------------------------------------------\nconsole.dirxml = function(node) {\n    console.log(node.innerHTML);\n};\n\n//------------------------------------------------------------------------------\nconsole.trace = noop;\n\n//------------------------------------------------------------------------------\nconsole.group = console.log;\n\n//------------------------------------------------------------------------------\nconsole.groupCollapsed = console.log;\n\n//------------------------------------------------------------------------------\nconsole.groupEnd = noop;\n\n//------------------------------------------------------------------------------\nconsole.time = function(name) {\n    Timers[name] = new Date().valueOf();\n};\n\n//------------------------------------------------------------------------------\nconsole.timeEnd = function(name) {\n    var timeStart = Timers[name];\n    if (!timeStart) {\n        console.warn(\"unknown timer: \" + name);\n        return;\n    }\n\n    var timeElapsed = new Date().valueOf() - timeStart;\n    console.log(name + \": \" + timeElapsed + \"ms\");\n};\n\n//------------------------------------------------------------------------------\nconsole.timeStamp = noop;\n\n//------------------------------------------------------------------------------\nconsole.profile = noop;\n\n//------------------------------------------------------------------------------\nconsole.profileEnd = noop;\n\n//------------------------------------------------------------------------------\nconsole.count = noop;\n\n//------------------------------------------------------------------------------\nconsole.exception = console.log;\n\n//------------------------------------------------------------------------------\nconsole.table = function(data, columns) {\n    console.log(\"%o\", data);\n};\n\n//------------------------------------------------------------------------------\n// return a new function that calls both functions passed as args\n//------------------------------------------------------------------------------\nfunction wrappedOrigCall(orgFunc, newFunc) {\n    return function() {\n        var args = [].slice.call(arguments);\n        try { orgFunc.apply(WinConsole, args); } catch (e) {}\n        try { newFunc.apply(console,    args); } catch (e) {}\n    };\n}\n\n//------------------------------------------------------------------------------\n// For every function that exists in the original console object, that\n// also exists in the new console object, wrap the new console method\n// with one that calls both\n//------------------------------------------------------------------------------\nfor (var key in console) {\n    if (typeof WinConsole[key] == \"function\") {\n        console[key] = wrappedOrigCall(WinConsole[key], console[key]);\n    }\n}\n\n});\n\n//@ sourceURL=lib/common/plugin/console-via-logger.js")} catch(e) {console.log("exception: in lib/common/plugin/console-via-logger.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/contacts\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    ContactError = require('cordova/plugin/ContactError'),\n    utils = require('cordova/utils'),\n    Contact = require('cordova/plugin/Contact');\n\n/**\n* Represents a group of Contacts.\n* @constructor\n*/\nvar contacts = {\n    /**\n     * Returns an array of Contacts matching the search criteria.\n     * @param fields that should be searched\n     * @param successCB success callback\n     * @param errorCB error callback\n     * @param {ContactFindOptions} options that can be applied to contact searching\n     * @return array of Contacts matching search criteria\n     */\n    find:function(fields, successCB, errorCB, options) {\n        argscheck.checkArgs('afFO', 'contacts.find', arguments);\n        if (!fields.length) {\n            errorCB && errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));\n        } else {\n            var win = function(result) {\n                var cs = [];\n                for (var i = 0, l = result.length; i < l; i++) {\n                    cs.push(contacts.create(result[i]));\n                }\n                successCB(cs);\n            };\n            exec(win, errorCB, \"Contacts\", \"search\", [fields, options]);\n        }\n    },\n\n    /**\n     * This function creates a new contact, but it does not persist the contact\n     * to device storage. To persist the contact to device storage, invoke\n     * contact.save().\n     * @param properties an object whose properties will be examined to create a new Contact\n     * @returns new Contact object\n     */\n    create:function(properties) {\n        argscheck.checkArgs('O', 'contacts.create', arguments);\n        var contact = new Contact();\n        for (var i in properties) {\n            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {\n                contact[i] = properties[i];\n            }\n        }\n        return contact;\n    }\n};\n\nmodule.exports = contacts;\n\n});\n\n//@ sourceURL=lib/common/plugin/contacts.js")} catch(e) {console.log("exception: in lib/common/plugin/contacts.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/contacts/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts');\nmodulemapper.clobbers('cordova/plugin/Contact', 'Contact');\nmodulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress');\nmodulemapper.clobbers('cordova/plugin/ContactError', 'ContactError');\nmodulemapper.clobbers('cordova/plugin/ContactField', 'ContactField');\nmodulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions');\nmodulemapper.clobbers('cordova/plugin/ContactName', 'ContactName');\nmodulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization');\n\n});\n\n//@ sourceURL=lib/common/plugin/contacts/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/contacts/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/device\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    channel = require('cordova/channel'),\n    utils = require('cordova/utils'),\n    exec = require('cordova/exec');\n\n// Tell cordova channel to wait on the CordovaInfoReady event\nchannel.waitForInitialization('onCordovaInfoReady');\n\n/**\n * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the\n * phone, etc.\n * @constructor\n */\nfunction Device() {\n    this.available = false;\n    this.platform = null;\n    this.version = null;\n    this.name = null;\n    this.uuid = null;\n    this.cordova = null;\n    this.model = null;\n\n    var me = this;\n\n    channel.onCordovaReady.subscribe(function() {\n        me.getInfo(function(info) {\n            me.available = true;\n            me.platform = info.platform;\n            me.version = info.version;\n            me.name = info.name;\n            me.uuid = info.uuid;\n            me.cordova = info.cordova;\n            me.model = info.model;\n            channel.onCordovaInfoReady.fire();\n        },function(e) {\n            me.available = false;\n            utils.alert(\"[ERROR] Error initializing Cordova: \" + e);\n        });\n    });\n}\n\n/**\n * Get device info\n *\n * @param {Function} successCallback The function to call when the heading data is available\n * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)\n */\nDevice.prototype.getInfo = function(successCallback, errorCallback) {\n    argscheck.checkArgs('fF', 'Device.getInfo', arguments);\n    exec(successCallback, errorCallback, \"Device\", \"getDeviceInfo\", []);\n};\n\nmodule.exports = new Device();\n\n});\n\n//@ sourceURL=lib/common/plugin/device.js")} catch(e) {console.log("exception: in lib/common/plugin/device.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/device/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/device', 'device');\n\n});\n\n//@ sourceURL=lib/common/plugin/device/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/device/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/echo\", function(require, exports, module) {\n\nvar exec = require('cordova/exec'),\n    utils = require('cordova/utils');\n\n/**\n * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback.\n * @param successCallback  invoked with a FileSystem object\n * @param errorCallback  invoked if error occurs retrieving file system\n * @param message  The string to be echoed.\n * @param forceAsync  Whether to force an async return value (for testing native->js bridge).\n */\nmodule.exports = function(successCallback, errorCallback, message, forceAsync) {\n    var action = 'echo';\n    var messageIsMultipart = (utils.typeName(message) == \"Array\");\n    var args = messageIsMultipart ? message : [message];\n\n    if (utils.typeName(message) == 'ArrayBuffer') {\n        if (forceAsync) {\n            console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.');\n        }\n        action += 'ArrayBuffer';\n    } else if (messageIsMultipart) {\n        if (forceAsync) {\n            console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.');\n        }\n        action += 'MultiPart';\n    } else if (forceAsync) {\n        action += 'Async';\n    }\n\n    exec(successCallback, errorCallback, \"Echo\", action, args);\n};\n\n\n});\n\n//@ sourceURL=lib/common/plugin/echo.js")} catch(e) {console.log("exception: in lib/common/plugin/echo.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/file/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper'),\n    symbolshelper = require('cordova/plugin/file/symbolshelper');\n\nsymbolshelper(modulemapper.defaults);\nmodulemapper.clobbers('cordova/plugin/webos/requestfilesystem', 'requestFileSystem');\nmodulemapper.clobbers('cordova/plugin/webos/filereader', 'FileReader');\n\n});\n\n//@ sourceURL=lib/webos/plugin/file/symbols.js")} catch(e) {console.log("exception: in lib/webos/plugin/file/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/file/symbolshelper\", function(require, exports, module) {\n\nmodule.exports = function(exportFunc) {\n    exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry');\n    exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader');\n    exportFunc('cordova/plugin/Entry', 'Entry');\n    exportFunc('cordova/plugin/File', 'File');\n    exportFunc('cordova/plugin/FileEntry', 'FileEntry');\n    exportFunc('cordova/plugin/FileError', 'FileError');\n    exportFunc('cordova/plugin/FileReader', 'FileReader');\n    exportFunc('cordova/plugin/FileSystem', 'FileSystem');\n    exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions');\n    exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult');\n    exportFunc('cordova/plugin/FileWriter', 'FileWriter');\n    exportFunc('cordova/plugin/Flags', 'Flags');\n    exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem');\n    exportFunc('cordova/plugin/Metadata', 'Metadata');\n    exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent');\n    exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem');\n    exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI');\n};\n\n});\n\n//@ sourceURL=lib/common/plugin/file/symbolshelper.js")} catch(e) {console.log("exception: in lib/common/plugin/file/symbolshelper.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/filetransfer/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer');\nmodulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError');\n\n});\n\n//@ sourceURL=lib/common/plugin/filetransfer/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/filetransfer/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/geolocation\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    utils = require('cordova/utils'),\n    exec = require('cordova/exec'),\n    PositionError = require('cordova/plugin/PositionError'),\n    Position = require('cordova/plugin/Position');\n\nvar timers = {};   // list of timers in use\n\n// Returns default params, overrides if provided with values\nfunction parseParameters(options) {\n    var opt = {\n        maximumAge: 0,\n        enableHighAccuracy: false,\n        timeout: Infinity\n    };\n\n    if (options) {\n        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {\n            opt.maximumAge = options.maximumAge;\n        }\n        if (options.enableHighAccuracy !== undefined) {\n            opt.enableHighAccuracy = options.enableHighAccuracy;\n        }\n        if (options.timeout !== undefined && !isNaN(options.timeout)) {\n            if (options.timeout < 0) {\n                opt.timeout = 0;\n            } else {\n                opt.timeout = options.timeout;\n            }\n        }\n    }\n\n    return opt;\n}\n\n// Returns a timeout failure, closed over a specified timeout value and error callback.\nfunction createTimeout(errorCallback, timeout) {\n    var t = setTimeout(function() {\n        clearTimeout(t);\n        t = null;\n        errorCallback({\n            code:PositionError.TIMEOUT,\n            message:\"Position retrieval timed out.\"\n        });\n    }, timeout);\n    return t;\n}\n\nvar geolocation = {\n    lastPosition:null, // reference to last known (cached) position returned\n    /**\n   * Asynchronously acquires the current position.\n   *\n   * @param {Function} successCallback    The function to call when the position data is available\n   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)\n   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)\n   */\n    getCurrentPosition:function(successCallback, errorCallback, options) {\n        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);\n        options = parseParameters(options);\n\n        // Timer var that will fire an error callback if no position is retrieved from native\n        // before the \"timeout\" param provided expires\n        var timeoutTimer = {timer:null};\n\n        var win = function(p) {\n            clearTimeout(timeoutTimer.timer);\n            if (!(timeoutTimer.timer)) {\n                // Timeout already happened, or native fired error callback for\n                // this geo request.\n                // Don't continue with success callback.\n                return;\n            }\n            var pos = new Position(\n                {\n                    latitude:p.latitude,\n                    longitude:p.longitude,\n                    altitude:p.altitude,\n                    accuracy:p.accuracy,\n                    heading:p.heading,\n                    velocity:p.velocity,\n                    altitudeAccuracy:p.altitudeAccuracy\n                },\n                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))\n            );\n            geolocation.lastPosition = pos;\n            successCallback(pos);\n        };\n        var fail = function(e) {\n            clearTimeout(timeoutTimer.timer);\n            timeoutTimer.timer = null;\n            var err = new PositionError(e.code, e.message);\n            if (errorCallback) {\n                errorCallback(err);\n            }\n        };\n\n        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just\n        // fire the success callback with the cached position.\n        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {\n            successCallback(geolocation.lastPosition);\n        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.\n        } else if (options.timeout === 0) {\n            fail({\n                code:PositionError.TIMEOUT,\n                message:\"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter.\"\n            });\n        // Otherwise we have to call into native to retrieve a position.\n        } else {\n            if (options.timeout !== Infinity) {\n                // If the timeout value was not set to Infinity (default), then\n                // set up a timeout function that will fire the error callback\n                // if no successful position was retrieved before timeout expired.\n                timeoutTimer.timer = createTimeout(fail, options.timeout);\n            } else {\n                // This is here so the check in the win function doesn't mess stuff up\n                // may seem weird but this guarantees timeoutTimer is\n                // always truthy before we call into native\n                timeoutTimer.timer = true;\n            }\n            exec(win, fail, \"Geolocation\", \"getLocation\", [options.enableHighAccuracy, options.maximumAge]);\n        }\n        return timeoutTimer;\n    },\n    /**\n     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,\n     * the successCallback is called with the new location.\n     *\n     * @param {Function} successCallback    The function to call each time the location data is available\n     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)\n     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)\n     * @return String                       The watch id that must be passed to #clearWatch to stop watching.\n     */\n    watchPosition:function(successCallback, errorCallback, options) {\n        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);\n        options = parseParameters(options);\n\n        var id = utils.createUUID();\n\n        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition\n        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);\n\n        var fail = function(e) {\n            clearTimeout(timers[id].timer);\n            var err = new PositionError(e.code, e.message);\n            if (errorCallback) {\n                errorCallback(err);\n            }\n        };\n\n        var win = function(p) {\n            clearTimeout(timers[id].timer);\n            if (options.timeout !== Infinity) {\n                timers[id].timer = createTimeout(fail, options.timeout);\n            }\n            var pos = new Position(\n                {\n                    latitude:p.latitude,\n                    longitude:p.longitude,\n                    altitude:p.altitude,\n                    accuracy:p.accuracy,\n                    heading:p.heading,\n                    velocity:p.velocity,\n                    altitudeAccuracy:p.altitudeAccuracy\n                },\n                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))\n            );\n            geolocation.lastPosition = pos;\n            successCallback(pos);\n        };\n\n        exec(win, fail, \"Geolocation\", \"addWatch\", [id, options.enableHighAccuracy]);\n\n        return id;\n    },\n    /**\n     * Clears the specified heading watch.\n     *\n     * @param {String} id       The ID of the watch returned from #watchPosition\n     */\n    clearWatch:function(id) {\n        if (id && timers[id] !== undefined) {\n            clearTimeout(timers[id].timer);\n            timers[id].timer = false;\n            exec(null, null, \"Geolocation\", \"clearWatch\", [id]);\n        }\n    }\n};\n\nmodule.exports = geolocation;\n\n});\n\n//@ sourceURL=lib/common/plugin/geolocation.js")} catch(e) {console.log("exception: in lib/common/plugin/geolocation.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/geolocation/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation');\nmodulemapper.clobbers('cordova/plugin/PositionError', 'PositionError');\nmodulemapper.clobbers('cordova/plugin/Position', 'Position');\nmodulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates');\n\n});\n\n//@ sourceURL=lib/common/plugin/geolocation/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/geolocation/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/globalization\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    GlobalizationError = require('cordova/plugin/GlobalizationError');\n\nvar globalization = {\n\n/**\n* Returns the string identifier for the client's current language.\n* It returns the language identifier string to the successCB callback with a\n* properties object as a parameter. If there is an error getting the language,\n* then the errorCB callback is invoked.\n*\n* @param {Function} successCB\n* @param {Function} errorCB\n*\n* @return Object.value {String}: The language identifier\n*\n* @error GlobalizationError.UNKNOWN_ERROR\n*\n* Example\n*    globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\\n');},\n*                                function () {});\n*/\ngetPreferredLanguage:function(successCB, failureCB) {\n    argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments);\n    exec(successCB, failureCB, \"Globalization\",\"getPreferredLanguage\", []);\n},\n\n/**\n* Returns the string identifier for the client's current locale setting.\n* It returns the locale identifier string to the successCB callback with a\n* properties object as a parameter. If there is an error getting the locale,\n* then the errorCB callback is invoked.\n*\n* @param {Function} successCB\n* @param {Function} errorCB\n*\n* @return Object.value {String}: The locale identifier\n*\n* @error GlobalizationError.UNKNOWN_ERROR\n*\n* Example\n*    globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\\n');},\n*                                function () {});\n*/\ngetLocaleName:function(successCB, failureCB) {\n    argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments);\n    exec(successCB, failureCB, \"Globalization\",\"getLocaleName\", []);\n},\n\n\n/**\n* Returns a date formatted as a string according to the client's user preferences and\n* calendar using the time zone of the client. It returns the formatted date string to the\n* successCB callback with a properties object as a parameter. If there is an error\n* formatting the date, then the errorCB callback is invoked.\n*\n* The defaults are: formatLenght=\"short\" and selector=\"date and time\"\n*\n* @param {Date} date\n* @param {Function} successCB\n* @param {Function} errorCB\n* @param {Object} options {optional}\n*            formatLength {String}: 'short', 'medium', 'long', or 'full'\n*            selector {String}: 'date', 'time', or 'date and time'\n*\n* @return Object.value {String}: The localized date string\n*\n* @error GlobalizationError.FORMATTING_ERROR\n*\n* Example\n*    globalization.dateToString(new Date(),\n*                function (date) {alert('date:' + date.value + '\\n');},\n*                function (errorCode) {alert(errorCode);},\n*                {formatLength:'short'});\n*/\ndateToString:function(date, successCB, failureCB, options) {\n    argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments);\n    var dateValue = date.valueOf();\n    exec(successCB, failureCB, \"Globalization\", \"dateToString\", [{\"date\": dateValue, \"options\": options}]);\n},\n\n\n/**\n* Parses a date formatted as a string according to the client's user\n* preferences and calendar using the time zone of the client and returns\n* the corresponding date object. It returns the date to the successCB\n* callback with a properties object as a parameter. If there is an error\n* parsing the date string, then the errorCB callback is invoked.\n*\n* The defaults are: formatLength=\"short\" and selector=\"date and time\"\n*\n* @param {String} dateString\n* @param {Function} successCB\n* @param {Function} errorCB\n* @param {Object} options {optional}\n*            formatLength {String}: 'short', 'medium', 'long', or 'full'\n*            selector {String}: 'date', 'time', or 'date and time'\n*\n* @return    Object.year {Number}: The four digit year\n*            Object.month {Number}: The month from (0 - 11)\n*            Object.day {Number}: The day from (1 - 31)\n*            Object.hour {Number}: The hour from (0 - 23)\n*            Object.minute {Number}: The minute from (0 - 59)\n*            Object.second {Number}: The second from (0 - 59)\n*            Object.millisecond {Number}: The milliseconds (from 0 - 999),\n*                                        not available on all platforms\n*\n* @error GlobalizationError.PARSING_ERROR\n*\n* Example\n*    globalization.stringToDate('4/11/2011',\n*                function (date) { alert('Month:' + date.month + '\\n' +\n*                    'Day:' + date.day + '\\n' +\n*                    'Year:' + date.year + '\\n');},\n*                function (errorCode) {alert(errorCode);},\n*                {selector:'date'});\n*/\nstringToDate:function(dateString, successCB, failureCB, options) {\n    argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"stringToDate\", [{\"dateString\": dateString, \"options\": options}]);\n},\n\n\n/**\n* Returns a pattern string for formatting and parsing dates according to the client's\n* user preferences. It returns the pattern to the successCB callback with a\n* properties object as a parameter. If there is an error obtaining the pattern,\n* then the errorCB callback is invoked.\n*\n* The defaults are: formatLength=\"short\" and selector=\"date and time\"\n*\n* @param {Function} successCB\n* @param {Function} errorCB\n* @param {Object} options {optional}\n*            formatLength {String}: 'short', 'medium', 'long', or 'full'\n*            selector {String}: 'date', 'time', or 'date and time'\n*\n* @return    Object.pattern {String}: The date and time pattern for formatting and parsing dates.\n*                                    The patterns follow Unicode Technical Standard #35\n*                                    http://unicode.org/reports/tr35/tr35-4.html\n*            Object.timezone {String}: The abbreviated name of the time zone on the client\n*            Object.utc_offset {Number}: The current difference in seconds between the client's\n*                                        time zone and coordinated universal time.\n*            Object.dst_offset {Number}: The current daylight saving time offset in seconds\n*                                        between the client's non-daylight saving's time zone\n*                                        and the client's daylight saving's time zone.\n*\n* @error GlobalizationError.PATTERN_ERROR\n*\n* Example\n*    globalization.getDatePattern(\n*                function (date) {alert('pattern:' + date.pattern + '\\n');},\n*                function () {},\n*                {formatLength:'short'});\n*/\ngetDatePattern:function(successCB, failureCB, options) {\n    argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"getDatePattern\", [{\"options\": options}]);\n},\n\n\n/**\n* Returns an array of either the names of the months or days of the week\n* according to the client's user preferences and calendar. It returns the array of names to the\n* successCB callback with a properties object as a parameter. If there is an error obtaining the\n* names, then the errorCB callback is invoked.\n*\n* The defaults are: type=\"wide\" and item=\"months\"\n*\n* @param {Function} successCB\n* @param {Function} errorCB\n* @param {Object} options {optional}\n*            type {String}: 'narrow' or 'wide'\n*            item {String}: 'months', or 'days'\n*\n* @return Object.value {Array{String}}: The array of names starting from either\n*                                        the first month in the year or the\n*                                        first day of the week.\n* @error GlobalizationError.UNKNOWN_ERROR\n*\n* Example\n*    globalization.getDateNames(function (names) {\n*        for(var i = 0; i < names.value.length; i++) {\n*            alert('Month:' + names.value[i] + '\\n');}},\n*        function () {});\n*/\ngetDateNames:function(successCB, failureCB, options) {\n    argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"getDateNames\", [{\"options\": options}]);\n},\n\n/**\n* Returns whether daylight savings time is in effect for a given date using the client's\n* time zone and calendar. It returns whether or not daylight savings time is in effect\n* to the successCB callback with a properties object as a parameter. If there is an error\n* reading the date, then the errorCB callback is invoked.\n*\n* @param {Date} date\n* @param {Function} successCB\n* @param {Function} errorCB\n*\n* @return Object.dst {Boolean}: The value \"true\" indicates that daylight savings time is\n*                                in effect for the given date and \"false\" indicate that it is not.\n*\n* @error GlobalizationError.UNKNOWN_ERROR\n*\n* Example\n*    globalization.isDayLightSavingsTime(new Date(),\n*                function (date) {alert('dst:' + date.dst + '\\n');}\n*                function () {});\n*/\nisDayLightSavingsTime:function(date, successCB, failureCB) {\n    argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments);\n    var dateValue = date.valueOf();\n    exec(successCB, failureCB, \"Globalization\", \"isDayLightSavingsTime\", [{\"date\": dateValue}]);\n},\n\n/**\n* Returns the first day of the week according to the client's user preferences and calendar.\n* The days of the week are numbered starting from 1 where 1 is considered to be Sunday.\n* It returns the day to the successCB callback with a properties object as a parameter.\n* If there is an error obtaining the pattern, then the errorCB callback is invoked.\n*\n* @param {Function} successCB\n* @param {Function} errorCB\n*\n* @return Object.value {Number}: The number of the first day of the week.\n*\n* @error GlobalizationError.UNKNOWN_ERROR\n*\n* Example\n*    globalization.getFirstDayOfWeek(function (day)\n*                { alert('Day:' + day.value + '\\n');},\n*                function () {});\n*/\ngetFirstDayOfWeek:function(successCB, failureCB) {\n    argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"getFirstDayOfWeek\", []);\n},\n\n\n/**\n* Returns a number formatted as a string according to the client's user preferences.\n* It returns the formatted number string to the successCB callback with a properties object as a\n* parameter. If there is an error formatting the number, then the errorCB callback is invoked.\n*\n* The defaults are: type=\"decimal\"\n*\n* @param {Number} number\n* @param {Function} successCB\n* @param {Function} errorCB\n* @param {Object} options {optional}\n*            type {String}: 'decimal', \"percent\", or 'currency'\n*\n* @return Object.value {String}: The formatted number string.\n*\n* @error GlobalizationError.FORMATTING_ERROR\n*\n* Example\n*    globalization.numberToString(3.25,\n*                function (number) {alert('number:' + number.value + '\\n');},\n*                function () {},\n*                {type:'decimal'});\n*/\nnumberToString:function(number, successCB, failureCB, options) {\n    argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"numberToString\", [{\"number\": number, \"options\": options}]);\n},\n\n/**\n* Parses a number formatted as a string according to the client's user preferences and\n* returns the corresponding number. It returns the number to the successCB callback with a\n* properties object as a parameter. If there is an error parsing the number string, then\n* the errorCB callback is invoked.\n*\n* The defaults are: type=\"decimal\"\n*\n* @param {String} numberString\n* @param {Function} successCB\n* @param {Function} errorCB\n* @param {Object} options {optional}\n*            type {String}: 'decimal', \"percent\", or 'currency'\n*\n* @return Object.value {Number}: The parsed number.\n*\n* @error GlobalizationError.PARSING_ERROR\n*\n* Example\n*    globalization.stringToNumber('1234.56',\n*                function (number) {alert('Number:' + number.value + '\\n');},\n*                function () { alert('Error parsing number');});\n*/\nstringToNumber:function(numberString, successCB, failureCB, options) {\n    argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"stringToNumber\", [{\"numberString\": numberString, \"options\": options}]);\n},\n\n/**\n* Returns a pattern string for formatting and parsing numbers according to the client's user\n* preferences. It returns the pattern to the successCB callback with a properties object as a\n* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked.\n*\n* The defaults are: type=\"decimal\"\n*\n* @param {Function} successCB\n* @param {Function} errorCB\n* @param {Object} options {optional}\n*            type {String}: 'decimal', \"percent\", or 'currency'\n*\n* @return    Object.pattern {String}: The number pattern for formatting and parsing numbers.\n*                                    The patterns follow Unicode Technical Standard #35.\n*                                    http://unicode.org/reports/tr35/tr35-4.html\n*            Object.symbol {String}: The symbol to be used when formatting and parsing\n*                                    e.g., percent or currency symbol.\n*            Object.fraction {Number}: The number of fractional digits to use when parsing and\n*                                    formatting numbers.\n*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.\n*            Object.positive {String}: The symbol to use for positive numbers when parsing and formatting.\n*            Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting.\n*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.\n*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.\n*\n* @error GlobalizationError.PATTERN_ERROR\n*\n* Example\n*    globalization.getNumberPattern(\n*                function (pattern) {alert('Pattern:' + pattern.pattern + '\\n');},\n*                function () {});\n*/\ngetNumberPattern:function(successCB, failureCB, options) {\n    argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"getNumberPattern\", [{\"options\": options}]);\n},\n\n/**\n* Returns a pattern string for formatting and parsing currency values according to the client's\n* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a\n* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB\n* callback is invoked.\n*\n* @param {String} currencyCode\n* @param {Function} successCB\n* @param {Function} errorCB\n*\n* @return    Object.pattern {String}: The currency pattern for formatting and parsing currency values.\n*                                    The patterns follow Unicode Technical Standard #35\n*                                    http://unicode.org/reports/tr35/tr35-4.html\n*            Object.code {String}: The ISO 4217 currency code for the pattern.\n*            Object.fraction {Number}: The number of fractional digits to use when parsing and\n*                                    formatting currency.\n*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.\n*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.\n*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.\n*\n* @error GlobalizationError.FORMATTING_ERROR\n*\n* Example\n*    globalization.getCurrencyPattern('EUR',\n*                function (currency) {alert('Pattern:' + currency.pattern + '\\n');}\n*                function () {});\n*/\ngetCurrencyPattern:function(currencyCode, successCB, failureCB) {\n    argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments);\n    exec(successCB, failureCB, \"Globalization\", \"getCurrencyPattern\", [{\"currencyCode\": currencyCode}]);\n}\n\n};\n\nmodule.exports = globalization;\n\n});\n\n//@ sourceURL=lib/common/plugin/globalization.js")} catch(e) {console.log("exception: in lib/common/plugin/globalization.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/globalization/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/globalization', 'navigator.globalization');\nmodulemapper.clobbers('cordova/plugin/GlobalizationError', 'GlobalizationError');\n\n});\n\n//@ sourceURL=lib/common/plugin/globalization/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/globalization/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/logger\", function(require, exports, module) {\n\n//------------------------------------------------------------------------------\n// The logger module exports the following properties/functions:\n//\n// LOG                          - constant for the level LOG\n// ERROR                        - constant for the level ERROR\n// WARN                         - constant for the level WARN\n// INFO                         - constant for the level INFO\n// DEBUG                        - constant for the level DEBUG\n// logLevel()                   - returns current log level\n// logLevel(value)              - sets and returns a new log level\n// useConsole()                 - returns whether logger is using console\n// useConsole(value)            - sets and returns whether logger is using console\n// log(message,...)             - logs a message at level LOG\n// error(message,...)           - logs a message at level ERROR\n// warn(message,...)            - logs a message at level WARN\n// info(message,...)            - logs a message at level INFO\n// debug(message,...)           - logs a message at level DEBUG\n// logLevel(level,message,...)  - logs a message specified level\n//\n//------------------------------------------------------------------------------\n\nvar logger = exports;\n\nvar exec    = require('cordova/exec');\nvar utils   = require('cordova/utils');\n\nvar UseConsole   = true;\nvar Queued       = [];\nvar DeviceReady  = false;\nvar CurrentLevel;\n\n/**\n * Logging levels\n */\n\nvar Levels = [\n    \"LOG\",\n    \"ERROR\",\n    \"WARN\",\n    \"INFO\",\n    \"DEBUG\"\n];\n\n/*\n * add the logging levels to the logger object and\n * to a separate levelsMap object for testing\n */\n\nvar LevelsMap = {};\nfor (var i=0; i<Levels.length; i++) {\n    var level = Levels[i];\n    LevelsMap[level] = i;\n    logger[level]    = level;\n}\n\nCurrentLevel = LevelsMap.WARN;\n\n/**\n * Getter/Setter for the logging level\n *\n * Returns the current logging level.\n *\n * When a value is passed, sets the logging level to that value.\n * The values should be one of the following constants:\n *    logger.LOG\n *    logger.ERROR\n *    logger.WARN\n *    logger.INFO\n *    logger.DEBUG\n *\n * The value used determines which messages get printed.  The logging\n * values above are in order, and only messages logged at the logging\n * level or above will actually be displayed to the user.  E.g., the\n * default level is WARN, so only messages logged with LOG, ERROR, or\n * WARN will be displayed; INFO and DEBUG messages will be ignored.\n */\nlogger.level = function (value) {\n    if (arguments.length) {\n        if (LevelsMap[value] === null) {\n            throw new Error(\"invalid logging level: \" + value);\n        }\n        CurrentLevel = LevelsMap[value];\n    }\n\n    return Levels[CurrentLevel];\n};\n\n/**\n * Getter/Setter for the useConsole functionality\n *\n * When useConsole is true, the logger will log via the\n * browser 'console' object.  Otherwise, it will use the\n * native Logger plugin.\n */\nlogger.useConsole = function (value) {\n    if (arguments.length) UseConsole = !!value;\n\n    if (UseConsole) {\n        if (typeof console == \"undefined\") {\n            throw new Error(\"global console object is not defined\");\n        }\n\n        if (typeof console.log != \"function\") {\n            throw new Error(\"global console object does not have a log function\");\n        }\n\n        if (typeof console.useLogger == \"function\") {\n            if (console.useLogger()) {\n                throw new Error(\"console and logger are too intertwingly\");\n            }\n        }\n    }\n\n    return UseConsole;\n};\n\n/**\n * Logs a message at the LOG level.\n *\n * Parameters passed after message are used applied to\n * the message with utils.format()\n */\nlogger.log   = function(message) { logWithArgs(\"LOG\",   arguments); };\n\n/**\n * Logs a message at the ERROR level.\n *\n * Parameters passed after message are used applied to\n * the message with utils.format()\n */\nlogger.error = function(message) { logWithArgs(\"ERROR\", arguments); };\n\n/**\n * Logs a message at the WARN level.\n *\n * Parameters passed after message are used applied to\n * the message with utils.format()\n */\nlogger.warn  = function(message) { logWithArgs(\"WARN\",  arguments); };\n\n/**\n * Logs a message at the INFO level.\n *\n * Parameters passed after message are used applied to\n * the message with utils.format()\n */\nlogger.info  = function(message) { logWithArgs(\"INFO\",  arguments); };\n\n/**\n * Logs a message at the DEBUG level.\n *\n * Parameters passed after message are used applied to\n * the message with utils.format()\n */\nlogger.debug = function(message) { logWithArgs(\"DEBUG\", arguments); };\n\n// log at the specified level with args\nfunction logWithArgs(level, args) {\n    args = [level].concat([].slice.call(args));\n    logger.logLevel.apply(logger, args);\n}\n\n/**\n * Logs a message at the specified level.\n *\n * Parameters passed after message are used applied to\n * the message with utils.format()\n */\nlogger.logLevel = function(level, message /* , ... */) {\n    // format the message with the parameters\n    var formatArgs = [].slice.call(arguments, 2);\n    message    = utils.vformat(message, formatArgs);\n\n    if (LevelsMap[level] === null) {\n        throw new Error(\"invalid logging level: \" + level);\n    }\n\n    if (LevelsMap[level] > CurrentLevel) return;\n\n    // queue the message if not yet at deviceready\n    if (!DeviceReady && !UseConsole) {\n        Queued.push([level, message]);\n        return;\n    }\n\n    // if not using the console, use the native logger\n    if (!UseConsole) {\n        exec(null, null, \"Logger\", \"logLevel\", [level, message]);\n        return;\n    }\n\n    // make sure console is not using logger\n    if (console.__usingCordovaLogger) {\n        throw new Error(\"console and logger are too intertwingly\");\n    }\n\n    // log to the console\n    switch (level) {\n        case logger.LOG:   console.log(message); break;\n        case logger.ERROR: console.log(\"ERROR: \" + message); break;\n        case logger.WARN:  console.log(\"WARN: \"  + message); break;\n        case logger.INFO:  console.log(\"INFO: \"  + message); break;\n        case logger.DEBUG: console.log(\"DEBUG: \" + message); break;\n    }\n};\n\n// when deviceready fires, log queued messages\nlogger.__onDeviceReady = function() {\n    if (DeviceReady) return;\n\n    DeviceReady = true;\n\n    for (var i=0; i<Queued.length; i++) {\n        var messageArgs = Queued[i];\n        logger.logLevel(messageArgs[0], messageArgs[1]);\n    }\n\n    Queued = null;\n};\n\n// add a deviceready event to log queued messages\ndocument.addEventListener(\"deviceready\", logger.__onDeviceReady, false);\n\n});\n\n//@ sourceURL=lib/common/plugin/logger.js")} catch(e) {console.log("exception: in lib/common/plugin/logger.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/logger/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/logger', 'cordova.logger');\n\n});\n\n//@ sourceURL=lib/common/plugin/logger/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/logger/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/media/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.defaults('cordova/plugin/Media', 'Media');\nmodulemapper.defaults('cordova/plugin/MediaError', 'MediaError');\n\n});\n\n//@ sourceURL=lib/common/plugin/media/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/media/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/network\", function(require, exports, module) {\n\nvar exec = require('cordova/exec'),\n    cordova = require('cordova'),\n    channel = require('cordova/channel'),\n    utils = require('cordova/utils');\n\n// Link the onLine property with the Cordova-supplied network info.\n// This works because we clobber the naviagtor object with our own\n// object in bootstrap.js.\nif (typeof navigator != 'undefined') {\n    utils.defineGetter(navigator, 'onLine', function() {\n        return this.connection.type != 'none';\n    });\n}\n\nfunction NetworkConnection() {\n    this.type = 'unknown';\n}\n\n/**\n * Get connection info\n *\n * @param {Function} successCallback The function to call when the Connection data is available\n * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)\n */\nNetworkConnection.prototype.getInfo = function(successCallback, errorCallback) {\n    exec(successCallback, errorCallback, \"NetworkStatus\", \"getConnectionInfo\", []);\n};\n\nvar me = new NetworkConnection();\nvar timerId = null;\nvar timeout = 500;\n\nchannel.onCordovaReady.subscribe(function() {\n    me.getInfo(function(info) {\n        me.type = info;\n        if (info === \"none\") {\n            // set a timer if still offline at the end of timer send the offline event\n            timerId = setTimeout(function(){\n                cordova.fireDocumentEvent(\"offline\");\n                timerId = null;\n            }, timeout);\n        } else {\n            // If there is a current offline event pending clear it\n            if (timerId !== null) {\n                clearTimeout(timerId);\n                timerId = null;\n            }\n            cordova.fireDocumentEvent(\"online\");\n        }\n\n        // should only fire this once\n        if (channel.onCordovaConnectionReady.state !== 2) {\n            channel.onCordovaConnectionReady.fire();\n        }\n    },\n    function (e) {\n        // If we can't get the network info we should still tell Cordova\n        // to fire the deviceready event.\n        if (channel.onCordovaConnectionReady.state !== 2) {\n            channel.onCordovaConnectionReady.fire();\n        }\n        console.log(\"Error initializing Network Connection: \" + e);\n    });\n});\n\nmodule.exports = me;\n\n});\n\n//@ sourceURL=lib/common/plugin/network.js")} catch(e) {console.log("exception: in lib/common/plugin/network.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/networkstatus/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/network', 'navigator.network.connection', 'navigator.network.connection is deprecated. Use navigator.connection instead.');\nmodulemapper.clobbers('cordova/plugin/network', 'navigator.connection');\nmodulemapper.defaults('cordova/plugin/Connection', 'Connection');\n\n});\n\n//@ sourceURL=lib/common/plugin/networkstatus/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/networkstatus/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/notification\", function(require, exports, module) {\n\nvar exec = require('cordova/exec');\n\n/**\n * Provides access to notifications on the device.\n */\n\nmodule.exports = {\n\n    /**\n     * Open a native alert dialog, with a customizable title and button text.\n     *\n     * @param {String} message              Message to print in the body of the alert\n     * @param {Function} completeCallback   The callback that is called when user clicks on a button.\n     * @param {String} title                Title of the alert dialog (default: Alert)\n     * @param {String} buttonLabel          Label of the close button (default: OK)\n     */\n    alert: function(message, completeCallback, title, buttonLabel) {\n        var _title = (title || \"Alert\");\n        var _buttonLabel = (buttonLabel || \"OK\");\n        exec(completeCallback, null, \"Notification\", \"alert\", [message, _title, _buttonLabel]);\n    },\n\n    /**\n     * Open a native confirm dialog, with a customizable title and button text.\n     * The result that the user selects is returned to the result callback.\n     *\n     * @param {String} message              Message to print in the body of the alert\n     * @param {Function} resultCallback     The callback that is called when user clicks on a button.\n     * @param {String} title                Title of the alert dialog (default: Confirm)\n     * @param {String} buttonLabels         Comma separated list of the labels of the buttons (default: 'OK,Cancel')\n     */\n    confirm: function(message, resultCallback, title, buttonLabels) {\n        var _title = (title || \"Confirm\");\n        var _buttonLabels = (buttonLabels || \"OK,Cancel\");\n        exec(resultCallback, null, \"Notification\", \"confirm\", [message, _title, _buttonLabels]);\n    },\n\n    /**\n     * Causes the device to vibrate.\n     *\n     * @param {Integer} mills       The number of milliseconds to vibrate for.\n     */\n    vibrate: function(mills) {\n        exec(null, null, \"Notification\", \"vibrate\", [mills]);\n    },\n\n    /**\n     * Causes the device to beep.\n     * On Android, the default notification ringtone is played \"count\" times.\n     *\n     * @param {Integer} count       The number of beeps.\n     */\n    beep: function(count) {\n        exec(null, null, \"Notification\", \"beep\", [count]);\n    }\n};\n\n});\n\n//@ sourceURL=lib/common/plugin/notification.js")} catch(e) {console.log("exception: in lib/common/plugin/notification.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/notification/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.defaults('cordova/plugin/notification', 'navigator.notification');\nmodulemapper.merges('cordova/plugin/webos/notification', 'navigator.notification');\n\n});\n\n//@ sourceURL=lib/webos/plugin/notification/symbols.js")} catch(e) {console.log("exception: in lib/webos/plugin/notification/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/requestFileSystem\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    FileError = require('cordova/plugin/FileError'),\n    FileSystem = require('cordova/plugin/FileSystem'),\n    exec = require('cordova/exec');\n\n/**\n * Request a file system in which to store application data.\n * @param type  local file system type\n * @param size  indicates how much storage space, in bytes, the application expects to need\n * @param successCallback  invoked with a FileSystem object\n * @param errorCallback  invoked if error occurs retrieving file system\n */\nvar requestFileSystem = function(type, size, successCallback, errorCallback) {\n    argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);\n    var fail = function(code) {\n        errorCallback && errorCallback(new FileError(code));\n    };\n\n    if (type < 0 || type > 3) {\n        fail(FileError.SYNTAX_ERR);\n    } else {\n        // if successful, return a FileSystem object\n        var success = function(file_system) {\n            if (file_system) {\n                if (successCallback) {\n                    // grab the name and root from the file system object\n                    var result = new FileSystem(file_system.name, file_system.root);\n                    successCallback(result);\n                }\n            }\n            else {\n                // no FileSystem object returned\n                fail(FileError.NOT_FOUND_ERR);\n            }\n        };\n        exec(success, fail, \"File\", \"requestFileSystem\", [type, size]);\n    }\n};\n\nmodule.exports = requestFileSystem;\n\n});\n\n//@ sourceURL=lib/common/plugin/requestFileSystem.js")} catch(e) {console.log("exception: in lib/common/plugin/requestFileSystem.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/resolveLocalFileSystemURI\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),\n    FileEntry = require('cordova/plugin/FileEntry'),\n    FileError = require('cordova/plugin/FileError'),\n    exec = require('cordova/exec');\n\n/**\n * Look up file system Entry referred to by local URI.\n * @param {DOMString} uri  URI referring to a local file or directory\n * @param successCallback  invoked with Entry object corresponding to URI\n * @param errorCallback    invoked if error occurs retrieving file system entry\n */\nmodule.exports = function(uri, successCallback, errorCallback) {\n    argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments);\n    // error callback\n    var fail = function(error) {\n        errorCallback && errorCallback(new FileError(error));\n    };\n    // sanity check for 'not:valid:filename'\n    if(!uri || uri.split(\":\").length > 2) {\n        setTimeout( function() {\n            fail(FileError.ENCODING_ERR);\n        },0);\n        return;\n    }\n    // if successful, return either a file or directory entry\n    var success = function(entry) {\n        var result;\n        if (entry) {\n            if (successCallback) {\n                // create appropriate Entry object\n                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);\n                successCallback(result);\n            }\n        }\n        else {\n            // no Entry object returned\n            fail(FileError.NOT_FOUND_ERR);\n        }\n    };\n\n    exec(success, fail, \"File\", \"resolveLocalFileSystemURI\", [uri]);\n};\n\n});\n\n//@ sourceURL=lib/common/plugin/resolveLocalFileSystemURI.js")} catch(e) {console.log("exception: in lib/common/plugin/resolveLocalFileSystemURI.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/splashscreen\", function(require, exports, module) {\n\nvar exec = require('cordova/exec');\n\nvar splashscreen = {\n    show:function() {\n        exec(null, null, \"SplashScreen\", \"show\", []);\n    },\n    hide:function() {\n        exec(null, null, \"SplashScreen\", \"hide\", []);\n    }\n};\n\nmodule.exports = splashscreen;\n\n});\n\n//@ sourceURL=lib/common/plugin/splashscreen.js")} catch(e) {console.log("exception: in lib/common/plugin/splashscreen.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/splashscreen/symbols\", function(require, exports, module) {\n\n\nvar modulemapper = require('cordova/modulemapper');\n\nmodulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen');\n\n});\n\n//@ sourceURL=lib/common/plugin/splashscreen/symbols.js")} catch(e) {console.log("exception: in lib/common/plugin/splashscreen/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/accelerometer\", function(require, exports, module) {\n\nvar callback;\nmodule.exports = {\n    /*\n     * Tells WebOS to put higher priority on accelerometer resolution. Also relaxes the internal garbage collection events.\n     * @param {Boolean} state\n     * Dependencies: Mojo.windowProperties\n     * Example:\n     *         navigator.accelerometer.setFastAccelerometer(true)\n     */\n    setFastAccelerometer: function(state) {\n        navigator.windowProperties.fastAccelerometer = state;\n        navigator.window.setWindowProperties();\n    },\n\n    /*\n     * Starts the native acceleration listener.\n     */\n    start: function(win,fail,args) {\n        console.error(\"webos plugin accelerometer start\");\n        window.removeEventListener(\"acceleration\", callback);\n        callback = function(event) {\n            var accel = new Acceleration(event.accelX*-9.81, event.accelY*-9.81, event.accelZ*-9.81);\n            win(accel);\n        };\n        document.addEventListener(\"acceleration\", callback);\n    },\n    stop: function (win,fail,args) {\n        console.error(\"webos plugin accelerometer stop\");\n        window.removeEventListener(\"acceleration\", callback);\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/accelerometer.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/accelerometer.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/application\", function(require, exports, module) {\n\nmodule.exports = {\n    isActivated: function(inWindow) {\n        inWindow = inWindow || window;\n        if(inWindow.PalmSystem) {\n            return inWindow.PalmSystem.isActivated;\n        }\n        return false;\n    },\n\n    /*\n     * Tell webOS to activate the current page of your app, bringing it into focus.\n     * Example:\n     *         navigator.application.activate();\n     */\n    activate: function(inWindow) {\n        inWindow = inWindow || window;\n        if(inWindow.PalmSystem) {\n            inWindow.PalmSystem.activate();\n        }\n    },\n\n    /*\n     * Tell webOS to deactivate your app.\n     * Example:\n     *        navigator.application.deactivate();\n     */\n    deactivate: function(inWindow) {\n        inWindow = inWindow || window;\n        if(inWindow.PalmSystem) {\n            inWindow.PalmSystem.deactivate();\n        }\n    },\n\n    /*\n     * Returns the identifier of the current running application (e.g. com.yourdomain.yourapp).\n     * Example:\n     *        navigator.application.getIdentifier();\n     */\n    getIdentifier: function() {\n        return PalmSystem.identifier;\n    },\n\n    fetchAppId: function() {\n        if (window.PalmSystem) {\n            // PalmSystem.identifier: <appid> <processid>\n            return PalmSystem.identifier.split(\" \")[0];\n        }\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/application.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/application.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/camera\", function(require, exports, module) {\n\nvar service = require('cordova/plugin/webos/service');\n\nmodule.exports = {\n    takePicture: function(successCallback, errorCallback, options) {\n        var filename = (options || {}).filename | \"\";\n\n        service.Request('palm://com.palm.applicationManager', {\n            method: 'launch',\n            parameters: {\n            id: 'com.palm.app.camera',\n            params: {\n                    appId: 'com.palm.app.camera',\n                    name: 'capture',\n                    sublaunch: true,\n                    filename: filename\n                }\n            },\n            onSuccess: successCallback,\n            onFailure: errorCallback\n        });\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/camera.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/camera.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/compass\", function(require, exports, module) {\n\nvar CompassHeading = require('cordova/plugin/CompassHeading'),\n    CompassError = require('cordova/plugin/CompassError');\n\nmodule.exports = {\n    getHeading: function (win, lose) {\n        // only TouchPad and Pre3 have a Compass/Gyro\n        if (window.device.name !== \"TouchPad\" && window.device.name !== \"Prē3\") {\n            lose({code: CompassError.COMPASS_NOT_SUPPORTED});\n        } else {\n            console.error(\"webos plugin compass getheading\");\n            var onReadingChanged = function (e) {\n                var heading = new CompassHeading(e.magHeading, e.trueHeading);\n                document.removeEventListener(\"compass\", onReadingChanged);\n                win(heading);\n            };\n            document.addEventListener(\"compass\", onReadingChanged);\n        }\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/compass.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/compass.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/device\", function(require, exports, module) {\n\nvar service = require('cordova/plugin/webos/service');\n\nmodule.exports = {\n    getDeviceInfo: function(success, fail, args) {\n        console.log(\"webOS Plugin: Device - getDeviceInfo\");\n\n        service.Request('palm://com.palm.preferences/systemProperties', {\n            method:\"Get\",\n            parameters:{\"key\": \"com.palm.properties.nduid\" },\n            onSuccess: function (result) {\n                var parsedData = JSON.parse(PalmSystem.deviceInfo);\n\n                success({\n                    cordova: \"2.2.0\",\n                    platform: \"HP webOS\",\n                    name: parsedData.modelName,\n                    version: parsedData.platformVersion,\n                    uuid: result[\"com.palm.properties.nduid\"]\n                });\n            }\n        });\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/device.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/device.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/file\", function(require, exports, module) {\n\n/**\n * Constructor.\n * name {DOMString} name of the file, without path information\n * fullPath {DOMString} the full path of the file, including the name\n * type {DOMString} mime type\n * lastModifiedDate {Date} last modified date\n * size {Number} size of the file in bytes\n */\n\nvar File = function(name, fullPath, type, lastModifiedDate, size){\n    this.name = name || '';\n    this.fullPath = fullPath || null;\n    this.type = type || null;\n    this.lastModifiedDate = lastModifiedDate || null;\n    this.size = size || 0;\n};\n\nmodule.exports = File;\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/file.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/file.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/filereader\", function(require, exports, module) {\n\nvar FileError = require('cordova/plugin/FileError'),\n    ProgressEvent = require('cordova/plugin/ProgressEvent');\n\nvar FileReader = function() {\n    this.fileName = \"\";\n\n    this.readyState = 0; // FileReader.EMPTY\n\n    // File data\n    this.result = null;\n\n    // Error\n    this.error = null;\n\n    // Event handlers\n    this.onloadstart = null;    // When the read starts.\n    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)\n    this.onload = null;         // When the read has successfully completed.\n    this.onerror = null;        // When the read has failed (see errors).\n    this.onloadend = null;      // When the request has completed (either in success or failure).\n    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.\n};\n\nFileReader.prototype.readAsText = function(file, encoding) {\n    console.error(\"webos plugin filereader readastext:\" + file);\n    //Mojo has no file i/o yet, so we use an xhr. very limited\n\n    // Already loading something\n    if (this.readyState == FileReader.LOADING) {\n        throw new FileError(FileError.INVALID_STATE_ERR);\n    }\n\n    // LOADING state\n    this.readyState = FileReader.LOADING;\n\n    // If loadstart callback\n    if (typeof this.onloadstart === \"function\") {\n        this.onloadstart(new ProgressEvent(\"loadstart\", {target:this}));\n    }\n\n    // Default encoding is UTF-8\n    var enc = encoding ? encoding : \"UTF-8\";\n\n    var me = this;\n\n    var xhr = new XMLHttpRequest();\n    xhr.onreadystatechange = function() {\n        console.error(\"onreadystatechange:\"+xhr.readyState+\" \"+xhr.status);\n        if (xhr.readyState == 4) {\n            if (xhr.status == 200 && xhr.responseText) {\n                console.error(\"file read completed\");\n                // Save result\n                me.result = xhr.responseText;\n\n                // If onload callback\n                if (typeof me.onload === \"function\") {\n                    me.onload(new ProgressEvent(\"load\", {target:me}));\n                }\n\n                // DONE state\n                me.readyState = FileReader.DONE;\n\n                // If onloadend callback\n                if (typeof me.onloadend === \"function\") {\n                    me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n                }\n\n            } else {\n                // If DONE (cancelled), then don't do anything\n                if (me.readyState === FileReader.DONE) {\n                    return;\n                }\n\n                // DONE state\n                me.readyState = FileReader.DONE;\n\n                me.result = null;\n\n                // Save error\n                me.error = new FileError(FileError.NOT_FOUND_ERR);\n\n                // If onerror callback\n                if (typeof me.onerror === \"function\") {\n                    me.onerror(new ProgressEvent(\"error\", {target:me}));\n                }\n\n                // If onloadend callback\n                if (typeof me.onloadend === \"function\") {\n                    me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n                }\n            }\n        }\n    };\n    xhr.open(\"GET\", file, true);\n    xhr.send();\n};\n\nmodule.exports = FileReader;\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/filereader.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/filereader.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/geolocation\", function(require, exports, module) {\n\nvar service = require('cordova/plugin/webos/service');\n\nmodule.exports = {\n    getLocation: function(successCallback, errorCallback, options) {\n        console.error(\"webos plugin geolocation getlocation\");\n        var request = service.Request('palm://com.palm.location', {\n            method: \"getCurrentPosition\",\n            onSuccess: function(event) {\n                var alias={};\n                alias.lastPosition = {\n                    coords: {\n                        latitude: event.latitude,\n                        longitude: event.longitude,\n                        altitude: (event.altitude >= 0 ? event.altitude: null),\n                        speed: (event.velocity >= 0 ? event.velocity: null),\n                        heading: (event.heading >= 0 ? event.heading: null),\n                        accuracy: (event.horizAccuracy >= 0 ? event.horizAccuracy: null),\n                        altitudeAccuracy: (event.vertAccuracy >= 0 ? event.vertAccuracy: null)\n                    },\n                    timestamp: new Date().getTime()\n                };\n\n                successCallback(alias.lastPosition);\n            },\n            onFailure: function() {\n                errorCallback();\n            }\n        });\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/geolocation.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/geolocation.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/keyboard\", function(require, exports, module) {\n\nvar _isShowing = null,\n    _manual = null;\n\nmodule.exports = {\n    types: {\n        text: 0,\n        password: 1,\n        search: 2,\n        range: 3,\n        email: 4,\n        number: 5,\n        phone: 6,\n        url: 7,\n        color: 8\n    },\n    isShowing: function() {\n        return !!_isShowing;\n    },\n    show: function(type){\n        if(this.isManualMode()) {\n            PalmSystem.keyboardShow(type || 0);\n        }\n    },\n    hide: function(){\n        if(this.isManualMode()) {\n            PalmSystem.keyboardHide();\n        }\n    },\n    setManualMode: function(mode){\n        _manual = mode;\n        PalmSystem.setManualKeyboardEnabled(mode);\n    },\n    isManualMode: function(){\n        return _manual || false;\n    },\n    forceShow: function(inType){\n        this.setManualMode(true);\n        PalmSystem.keyboardShow(inType || 0);\n    },\n    forceHide: function(){\n        this.setManualMode(true);\n        PalmSystem.keyboardHide();\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/keyboard.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/keyboard.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/network\", function(require, exports, module) {\n\nvar service=require('cordova/plugin/webos/service'),\n    Connection = require('cordova/plugin/Connection');\n\nmodule.exports = {\n    /**\n     * Get connection info\n     *\n     * @param {Function} successCallback The function to call when the Connection data is available\n     * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)\n     */\n    getConnectionInfo: function (successCallback, errorCallback) {\n        // Get info\n        console.log(\"webos Plugin: NetworkStatus - getConnectionInfo\");\n\n        service.Request('palm://com.palm.connectionmanager', {\n            method: 'getstatus',\n            parameters: {},\n            onSuccess: function (result) {\n                console.log(\"result:\"+JSON.stringify(result));\n\n                var info={};\n                if (!result.isInternetConnectionAvailable) { info.type=Connection.NONE; }\n                if (result.wifi && result.wifi.onInternet) { info.type=Connection.WIFI; }\n                if (result.wan && result.wan.state===\"connected\") { info.type=Connection.CELL_2G; }\n\n                successCallback(info.type);\n            },\n            onFailure: errorCallback\n        });\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/network.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/network.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/notification\", function(require, exports, module) {\n\nmodule.exports = {\n    /*\n     * adds a dashboard to the WebOS app\n     * @param {String} url\n     * @param {String} html\n     * Example:\n     *        navigator.notification.newDashboard(\"dashboard.html\");\n     */\n    newDashboard: function(url, html) {\n        var win = window.open(url, \"_blank\", \"attributes={\\\"window\\\":\\\"dashboard\\\"}\");\n        html && win.document.write(html);\n        win.PalmSystem.stageReady();\n    },\n\n    /*\n     * Displays a banner notification. If specified, will send your 'response' object as data via the 'palmsystem' DOM event.\n     * If no 'icon' filename is specified, will use a small version of your application icon.\n     * @param {String} message\n     * @param {Object} response\n     * @param {String} icon\n     * @param {String} soundClass class of the sound; supported classes are: \"ringtones\", \"alerts\", \"alarm\", \"calendar\", \"notification\"\n     * @param {String} soundFile partial or full path to the sound file\n     * @param {String} soundDurationMs of sound in ms\n     * Example:\n     *        navigator.notification.showBanner('test message');\n     */\n    showBanner: function(message, response, icon, soundClass, soundFile, soundDurationMs) {\n        response = response || {\n            banner: true\n        };\n        PalmSystem.addBannerMessage(message, JSON.stringify(response), icon, soundClass, soundFile, soundDurationMs);\n    },\n\n    /**\n     * Remove a banner from the banner area. The category parameter defaults to 'banner'. Will not remove\n     * messages that are already displayed.\n     * @param {String} category\n            Value defined by the application and usually same one used in {@link showBanner}.\n            It is used if you have more than one kind of banner message.\n     */\n    removeBannerMessage: function(category) {\n        var bannerKey = category || 'banner';\n        var bannerId = this.banners.get(bannerKey);\n        if (bannerId) {\n            try {\n                PalmSystem.removeBannerMessage(bannerId);\n            } catch(removeBannerException) {\n                window.debug.error(removeBannerException.toString());\n            }\n        }\n    },\n\n    /*\n     * Remove all pending banner messages from the banner area. Will not remove messages that are already displayed.\n     */\n    clearBannerMessage: function() {\n        PalmSystem.clearBannerMessage();\n    },\n\n    /*\n     * This function vibrates the device\n     * @param {number} duration The duration in ms to vibrate for.\n     * @param {number} intensity The intensity of the vibration\n     */\n    vibrate_private: function(duration, intensity) {\n        //the intensity for palm is inverted; 0=high intensity, 100=low intensity\n        //this is opposite from our api, so we invert\n        if (isNaN(intensity) || intensity > 100 || intensity <= 0)\n        intensity = 0;\n        else\n        intensity = 100 - intensity;\n\n        // if the app id does not have the namespace \"com.palm.\", an error will be thrown here\n        //this.vibhandle = new Mojo.Service.Request(\"palm://com.palm.vibrate\", {\n        this.vibhandle = navigator.service.Request(\"palm://com.palm.vibrate\", {\n            method: 'vibrate',\n            parameters: {\n                'period': intensity,\n                'duration': duration\n            }\n        },\n        false);\n    },\n\n    vibrate: function(param) {\n        PalmSystem.playSoundNotification('vibrate');\n    },\n    /*\n     * Plays the specified sound\n     * @param {String} soundClass class of the sound; supported classes are: \"ringtones\", \"alerts\", \"alarm\", \"calendar\", \"notification\"\n     * @param {String} soundFile partial or full path to the sound file\n     * @param {String} soundDurationMs of sound in ms\n     */\n    beep: function(param) {\n        PalmSystem.playSoundNotification('alerts');\n    },\n\n    getRootWindow: function() {\n        var w = window.opener || window.rootWindow || window.top || window;\n        if(!w.setTimeout) { // use this window as the root if we don't have access to the real root.\n            w = window;\n        }\n        return w;\n    },\n\n    open: function(inOpener, inUrl, inName, inAttributes, inWindowInfo) {\n        var url = inUrl;\n        var a = inAttributes && JSON.stringify(inAttributes);\n        a = \"attributes=\" + a;\n        var i = inWindowInfo ? inWindowInfo + \", \" : \"\";\n        return inOpener.open(url, inName, i + a);\n    },\n\n    openWindow: function(inUrl, inName, inParams, inAttributes, inWindowInfo) {\n        //var attributes = inAttributes || {};\n        //attributes.window = attributes.window || \"card\";\n        // NOTE: make the root window open all windows.\n        return this.open(this.getRootWindow(), inUrl, inName || \"\", inAttributes, inWindowInfo);\n    },\n\n    alert: function(message,callback,title,buttonName) {\n        var inAttributes = {};\n        //inAttributes.window = \"card\"; // create card\n        inAttributes.window = \"popupalert\"; // create popup\n        //inAttributes.window=\"dashboard\"; // create dashboard\n        var html='<html><head><script>setTimeout(function(f){var el=window.document.getElementById(\"b1\");console.error(el);el.addEventListener(\"click\",function(f){window.close();},false);},500);</script></head><body>'+message+'<br/><button id=\"b1\">'+buttonName+'</button></body></html>';\n        var inName=\"PopupAlert\";\n        var inUrl=\"\";\n        var inParams={};\n        var inHeight=120;\n        var w = this.openWindow(inUrl, inName, inParams, inAttributes, \"height=\" + (inHeight || 200));\n        w.document.write(html);\n        w.PalmSystem.stageReady();\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/notification.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/notification.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/orientation\", function(require, exports, module) {\n\nmodule.exports = {\n    setOrientation: function(orientation) {\n        PalmSystem.setWindowOrientation(orientation);\n    },\n\n    /*\n     * Returns the current window orientation\n     * orientation is one of 'up', 'down', 'left', 'right', or 'free'\n     */\n    getCurrentOrientation: function() {\n          return PalmSystem.windowOrientation;\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/orientation.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/orientation.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/requestfilesystem\", function(require, exports, module) {\n\nmodule.exports = function(type,size,successCallback,errorCallback) {\n    console.error(\"requestFileSystem\");\n\n    var theFileSystem={};\n    theFileSystem.name=\"webOS\";\n    theFileSystem.root={};\n    theFileSystem.root.name=\"Root\";\n\n    theFileSystem.root.getFile=function(filename,options,successCallback,errorCallback) {\n        console.error(\"getFile\");\n        if (options.create) { errorCallback(); }\n        var theFile=filename;\n        successCallback(theFile);\n    };\n\n    successCallback(theFileSystem);\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/requestfilesystem.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/requestfilesystem.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/service\", function(require, exports, module) {\n\nfunction Service() { }\n\nService.prototype.Request = function (uri, params) {\n    var req = new PalmServiceBridge();\n    var url = uri + \"/\" + (params.method || \"\");\n    req.url = url;\n\n    this.req = req;\n    this.url = url;\n    this.params = params || {};\n\n    this.call(params);\n\n    return this;\n};\n\nService.prototype.call = function(params) {\n    var onsuccess = null;\n    var onfailure = null;\n    var oncomplete = null;\n\n    if (typeof params.onSuccess === 'function')\n        onsuccess = params.onSuccess;\n\n    if (typeof params.onFailure === 'function')\n        onerror = params.onFailure;\n\n    if (typeof params.onComplete === 'function')\n        oncomplete = params.onComplete;\n\n    this.req.onservicecallback = callback;\n\n    function callback(msg) {\n        var response = JSON.parse(msg);\n\n        if ((response.errorCode) && onfailure)\n            onfailure(response);\n        else if (onsuccess)\n            onsuccess(response);\n\n        if (oncomplete)\n            oncomplete(response);\n    }\n\n    this.data = (typeof params.parameters === 'object') ? JSON.stringify(params.parameters) : '{}';\n\n    this.req.call(this.url, this.data);\n};\n\nmodule.exports = new Service();\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/service.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/service.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/plugin/webos/window\", function(require, exports, module) {\n\nmodule.exports={\n    launchParams: function() {\n        return JSON.parse(PalmSystem.launchParams) || {};\n    },\n    /*\n     * This is a thin wrapper for 'window.open()' which optionally sets document contents to 'html', and calls 'PalmSystem.stageReady()'\n     * on your new card. Note that this new card will not come with your framework (if any) or anything for that matter.\n     * @param {String} url\n     * @param {String} html\n     * Example:\n     *        navigator.window.newCard('about:blank', '<html><body>Hello again!</body></html>');\n     */\n    newCard: function(url, html) {\n        var win = window.open(url || \"\");\n        if (html)\n            win.document.write(html);\n        win.PalmSystem.stageReady();\n    },\n\n    /*\n     * Enable or disable full screen display (full screen removes the app menu bar and the rounded corners of the screen).\n     * @param {Boolean} state\n     * Example:\n     *        navigator.window.setFullScreen(true);\n     */\n    setFullScreen: function(state) {\n        // valid state values are: true or false\n        PalmSystem.enableFullScreenMode(state);\n    },\n\n    /*\n     * used to set the window properties of the WebOS app\n     * @param {Object} props\n     * Example:\n     *         private method used by other member functions - ideally we shouldn't call this method\n     */\n    setWindowProperties: function(inWindow, inProps) {\n        if(arguments.length==1) {\n            inProps = inWindow;\n            inWindow = window;\n        }\n        if(inWindow.PalmSystem) {\n            inWindow.PalmSystem.setWindowProperties(inProps);\n        }\n    },\n\n    /*\n     * Enable or disable screen timeout. When enabled, the device screen will not dim. This is useful for navigation, clocks or other \"dock\" apps.\n     * @param {Boolean} state\n     * Example:\n     *        navigator.window.blockScreenTimeout(true);\n     */\n    blockScreenTimeout: function(state) {\n        navigator.windowProperties.blockScreenTimeout = state;\n        this.setWindowProperties();\n    },\n\n    /*\n     * Sets the lightbar to be a little dimmer for screen locked notifications.\n     * @param {Boolean} state\n     * Example:\n     *        navigator.window.setSubtleLightbar(true);\n     */\n    setSubtleLightbar: function(state) {\n        navigator.windowProperties.setSubtleLightbar = state;\n        this.setWindowProperties();\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/window.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/window.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/symbols\", function(require, exports, module) {\n\nvar modulemapper = require('cordova/modulemapper');\n\n// Use merges here in case others symbols files depend on this running first,\n// but fail to declare the dependency with a require().\nmodulemapper.merges('cordova', 'cordova');\nmodulemapper.clobbers('cordova/exec', 'cordova.exec');\nmodulemapper.clobbers('cordova/exec', 'Cordova.exec');\n\n});\n\n//@ sourceURL=lib/common/symbols.js")} catch(e) {console.log("exception: in lib/common/symbols.js: " + e);console.log(e.stack);}
try {eval("define(\"cordova/utils\", function(require, exports, module) {\n\nvar utils = exports;\n\n/**\n * Defines a property getter / setter for obj[key].\n */\nutils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) {\n    if (Object.defineProperty) {\n        var desc = {\n            get: getFunc,\n            configurable: true\n        };\n        if (opt_setFunc) {\n            desc.set = opt_setFunc;\n        }\n        Object.defineProperty(obj, key, desc);\n    } else {\n        obj.__defineGetter__(key, getFunc);\n        if (opt_setFunc) {\n            obj.__defineSetter__(key, opt_setFunc);\n        }\n    }\n};\n\n/**\n * Defines a property getter for obj[key].\n */\nutils.defineGetter = utils.defineGetterSetter;\n\nutils.arrayIndexOf = function(a, item) {\n    if (a.indexOf) {\n        return a.indexOf(item);\n    }\n    var len = a.length;\n    for (var i = 0; i < len; ++i) {\n        if (a[i] == item) {\n            return i;\n        }\n    }\n    return -1;\n};\n\n/**\n * Returns whether the item was found in the array.\n */\nutils.arrayRemove = function(a, item) {\n    var index = utils.arrayIndexOf(a, item);\n    if (index != -1) {\n        a.splice(index, 1);\n    }\n    return index != -1;\n};\n\nutils.typeName = function(val) {\n    return Object.prototype.toString.call(val).slice(8, -1);\n};\n\n/**\n * Returns an indication of whether the argument is an array or not\n */\nutils.isArray = function(a) {\n    return utils.typeName(a) == 'Array';\n};\n\n/**\n * Returns an indication of whether the argument is a Date or not\n */\nutils.isDate = function(d) {\n    return utils.typeName(d) == 'Date';\n};\n\n/**\n * Does a deep clone of the object.\n */\nutils.clone = function(obj) {\n    if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {\n        return obj;\n    }\n\n    var retVal, i;\n\n    if(utils.isArray(obj)){\n        retVal = [];\n        for(i = 0; i < obj.length; ++i){\n            retVal.push(utils.clone(obj[i]));\n        }\n        return retVal;\n    }\n\n    retVal = {};\n    for(i in obj){\n        if(!(i in retVal) || retVal[i] != obj[i]) {\n            retVal[i] = utils.clone(obj[i]);\n        }\n    }\n    return retVal;\n};\n\n/**\n * Returns a wrapped version of the function\n */\nutils.close = function(context, func, params) {\n    if (typeof params == 'undefined') {\n        return function() {\n            return func.apply(context, arguments);\n        };\n    } else {\n        return function() {\n            return func.apply(context, params);\n        };\n    }\n};\n\n/**\n * Create a UUID\n */\nutils.createUUID = function() {\n    return UUIDcreatePart(4) + '-' +\n        UUIDcreatePart(2) + '-' +\n        UUIDcreatePart(2) + '-' +\n        UUIDcreatePart(2) + '-' +\n        UUIDcreatePart(6);\n};\n\n/**\n * Extends a child object from a parent object using classical inheritance\n * pattern.\n */\nutils.extend = (function() {\n    // proxy used to establish prototype chain\n    var F = function() {};\n    // extend Child from Parent\n    return function(Child, Parent) {\n        F.prototype = Parent.prototype;\n        Child.prototype = new F();\n        Child.__super__ = Parent.prototype;\n        Child.prototype.constructor = Child;\n    };\n}());\n\n/**\n * Alerts a message in any available way: alert or console.log.\n */\nutils.alert = function(msg) {\n    if (window.alert) {\n        window.alert(msg);\n    } else if (console && console.log) {\n        console.log(msg);\n    }\n};\n\n/**\n * Formats a string and arguments following it ala sprintf()\n *\n * see utils.vformat() for more information\n */\nutils.format = function(formatString /* ,... */) {\n    var args = [].slice.call(arguments, 1);\n    return utils.vformat(formatString, args);\n};\n\n/**\n * Formats a string and arguments following it ala vsprintf()\n *\n * format chars:\n *   %j - format arg as JSON\n *   %o - format arg as JSON\n *   %c - format arg as ''\n *   %% - replace with '%'\n * any other char following % will format it's\n * arg via toString().\n *\n * for rationale, see FireBug's Console API:\n *    http://getfirebug.com/wiki/index.php/Console_API\n */\nutils.vformat = function(formatString, args) {\n    if (formatString === null || formatString === undefined) return \"\";\n    if (arguments.length == 1) return formatString.toString();\n    if (typeof formatString != \"string\") return formatString.toString();\n\n    var pattern = /(.*?)%(.)(.*)/;\n    var rest    = formatString;\n    var result  = [];\n\n    while (args.length) {\n        var arg   = args.shift();\n        var match = pattern.exec(rest);\n\n        if (!match) break;\n\n        rest = match[3];\n\n        result.push(match[1]);\n\n        if (match[2] == '%') {\n            result.push('%');\n            args.unshift(arg);\n            continue;\n        }\n\n        result.push(formatted(arg, match[2]));\n    }\n\n    result.push(rest);\n\n    return result.join('');\n};\n\n//------------------------------------------------------------------------------\nfunction UUIDcreatePart(length) {\n    var uuidpart = \"\";\n    for (var i=0; i<length; i++) {\n        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);\n        if (uuidchar.length == 1) {\n            uuidchar = \"0\" + uuidchar;\n        }\n        uuidpart += uuidchar;\n    }\n    return uuidpart;\n}\n\n//------------------------------------------------------------------------------\nfunction formatted(object, formatChar) {\n\n    try {\n        switch(formatChar) {\n            case 'j':\n            case 'o': return JSON.stringify(object);\n            case 'c': return '';\n        }\n    }\n    catch (e) {\n        return \"error JSON.stringify()ing argument: \" + e;\n    }\n\n    if ((object === null) || (object === undefined)) {\n        return Object.prototype.toString.call(object);\n    }\n\n    return object.toString();\n}\n\n});\n\n//@ sourceURL=lib/common/utils.js")} catch(e) {console.log("exception: in lib/common/utils.js: " + e);console.log(e.stack);}

window.cordova = require('cordova');

try {eval("\n(function (context) {\n    // Replace navigator before any modules are required(), to ensure it happens as soon as possible.\n    // We replace it so that properties that can't be clobbered can instead be overridden.\n    function replaceNavigator(origNavigator) {\n        var CordovaNavigator = function() {};\n        CordovaNavigator.prototype = origNavigator;\n        var newNavigator = new CordovaNavigator();\n        // This work-around really only applies to new APIs that are newer than Function.bind.\n        // Without it, APIs such as getGamepads() break.\n        if (CordovaNavigator.bind) {\n            for (var key in origNavigator) {\n                if (typeof origNavigator[key] == 'function') {\n                    newNavigator[key] = origNavigator[key].bind(origNavigator);\n                }\n            }\n        }\n        return newNavigator;\n    }\n    if (context.navigator) {\n        context.navigator = replaceNavigator(context.navigator);\n    }\n\n    var channel = require(\"cordova/channel\");\n\n    // _nativeReady is global variable that the native side can set\n    // to signify that the native code is ready. It is a global since\n    // it may be called before any cordova JS is ready.\n    if (window._nativeReady) {\n        channel.onNativeReady.fire();\n    }\n\n    /**\n     * Create all cordova objects once page has fully loaded and native side is ready.\n     */\n    var joinEvents = [ channel.onDOMContentLoaded, channel.onNativeReady ];\n\n    // If this property is set to something truthy, join on onPluginsReady too.\n    // This property is set by the automatic JS installation prototype in cordova-cli,\n    // and will be removed when the prototype either becomes mainline or is dropped.\n    if (window.__onPluginsLoadedHack) {\n        joinEvents.push(channel.onPluginsReady);\n    }\n\n    channel.join(function() {\n        var builder = require('cordova/builder'),\n            platform = require('cordova/platform');\n\n        builder.buildIntoButDoNotClobber(platform.defaults, context);\n        builder.buildIntoAndClobber(platform.clobbers, context);\n        builder.buildIntoAndMerge(platform.merges, context);\n\n        // Call the platform-specific initialization\n        platform.initialize();\n\n        // Fire event to notify that all objects are created\n        channel.onCordovaReady.fire();\n\n        // Fire onDeviceReady event once all constructors have run and\n        // cordova info has been received from native side.\n        channel.join(function() {\n            require('cordova').fireDocumentEvent('deviceready');\n        }, channel.deviceReadyChannelsArray);\n\n    }, joinEvents);\n\n}(window));\n\n//@ sourceURL=lib/scripts/bootstrap.js")} catch(e) {console.log("exception: in lib/scripts/bootstrap.js: " + e);console.log(e.stack);}
try {eval("\nrequire('cordova/channel').onNativeReady.fire();\n\n//@ sourceURL=lib/scripts/bootstrap-webos.js")} catch(e) {console.log("exception: in lib/scripts/bootstrap-webos.js: " + e);console.log(e.stack);}

})();