// Platform: webos

// commit ab5e7db58d684da1403ab6059a80f3b4635bde4d

// File generated at :: Tue Feb 05 2013 13:01:43 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, message, keepCallback) {\n        var callback = cordova.callbacks[callbackId];\n        if (callback) {\n            if (success && status == cordova.callbackStatus.OK) {\n                callback.success && callback.success(message);\n            } else if (!success) {\n                callback.fail && callback.fail(message);\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    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\nmodule.exports = {\n    buildIntoButDoNotClobber: function(objects, target) {\n        include(target, objects, false, false);\n    },\n    buildIntoAndClobber: function(objects, target) {\n        include(target, objects, true, false);\n    },\n    buildIntoAndMerge: function(objects, target) {\n        include(target, objects, true, true);\n    },\n    recursiveMerge: recursiveMerge,\n    assignOrWrapInDeprecateGetter: assignOrWrapInDeprecateGetter\n};\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 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/common\", function(require, exports, module) {\n\nmodule.exports = {\n    defaults: {\n        cordova: {\n            path: 'cordova',\n            children: {\n                exec: {\n                    path: 'cordova/exec'\n                },\n                logger: {\n                    path: 'cordova/plugin/logger'\n                }\n            }\n        },\n        Cordova: {\n            children: {\n                exec: {\n                    path: 'cordova/exec'\n                }\n            }\n        },\n        open : {\n            path: 'cordova/plugin/InAppBrowser'\n        },\n        navigator: {\n            children: {\n                notification: {\n                    path: 'cordova/plugin/notification'\n                },\n                accelerometer: {\n                    path: 'cordova/plugin/accelerometer'\n                },\n                battery: {\n                    path: 'cordova/plugin/battery'\n                },\n                camera:{\n                    path: 'cordova/plugin/Camera'\n                },\n                compass:{\n                    path: 'cordova/plugin/compass'\n                },\n                contacts: {\n                    path: 'cordova/plugin/contacts'\n                },\n                device:{\n                    children:{\n                        capture: {\n                            path: 'cordova/plugin/capture'\n                        }\n                    }\n                },\n                geolocation: {\n                    path: 'cordova/plugin/geolocation'\n                },\n                globalization: {\n                    path: 'cordova/plugin/globalization'\n                },\n                network: {\n                    children: {\n                        connection: {\n                            path: 'cordova/plugin/network',\n                            deprecated: 'navigator.network.connection is deprecated. Use navigator.connection instead.'\n                        }\n                    }\n                },\n                splashscreen: {\n                    path: 'cordova/plugin/splashscreen'\n                }\n            }\n        },\n        Acceleration: {\n            path: 'cordova/plugin/Acceleration'\n        },\n        Camera:{\n            path: 'cordova/plugin/CameraConstants'\n        },\n        CameraPopoverOptions: {\n            path: 'cordova/plugin/CameraPopoverOptions'\n        },\n        CaptureError: {\n            path: 'cordova/plugin/CaptureError'\n        },\n        CaptureAudioOptions:{\n            path: 'cordova/plugin/CaptureAudioOptions'\n        },\n        CaptureImageOptions: {\n            path: 'cordova/plugin/CaptureImageOptions'\n        },\n        CaptureVideoOptions: {\n            path: 'cordova/plugin/CaptureVideoOptions'\n        },\n        CompassHeading:{\n            path: 'cordova/plugin/CompassHeading'\n        },\n        CompassError:{\n            path: 'cordova/plugin/CompassError'\n        },\n        ConfigurationData: {\n            path: 'cordova/plugin/ConfigurationData'\n        },\n        Connection: {\n            path: 'cordova/plugin/Connection'\n        },\n        Contact: {\n            path: 'cordova/plugin/Contact'\n        },\n        ContactAddress: {\n            path: 'cordova/plugin/ContactAddress'\n        },\n        ContactError: {\n            path: 'cordova/plugin/ContactError'\n        },\n        ContactField: {\n            path: 'cordova/plugin/ContactField'\n        },\n        ContactFindOptions: {\n            path: 'cordova/plugin/ContactFindOptions'\n        },\n        ContactName: {\n            path: 'cordova/plugin/ContactName'\n        },\n        ContactOrganization: {\n            path: 'cordova/plugin/ContactOrganization'\n        },\n        Coordinates: {\n            path: 'cordova/plugin/Coordinates'\n        },\n        device: {\n            path: 'cordova/plugin/device'\n        },\n        GlobalizationError: {\n            path: 'cordova/plugin/GlobalizationError'\n        },\n        Media: {\n            path: 'cordova/plugin/Media'\n        },\n        MediaError: {\n            path: 'cordova/plugin/MediaError'\n        },\n        MediaFile: {\n            path: 'cordova/plugin/MediaFile'\n        },\n        MediaFileData:{\n            path: 'cordova/plugin/MediaFileData'\n        },\n        Position: {\n            path: 'cordova/plugin/Position'\n        },\n        PositionError: {\n            path: 'cordova/plugin/PositionError'\n        },\n        ProgressEvent: {\n            path: 'cordova/plugin/ProgressEvent'\n        }\n    },\n    clobbers: {\n        navigator: {\n            children: {\n                connection: {\n                    path: 'cordova/plugin/network'\n                }\n            }\n        }\n    }\n};\n\n});\n\n//@ sourceURL=lib/common/common.js")} catch(e) {console.log("exception: in lib/common/common.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[part] = cur[part] || {};\n    }\n    return cur[parts[i-1]];\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 (target) {\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        var 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                notification: {\n                    path: \"cordova/plugin/webos/notification\"\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\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};\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/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 || null;\n  this.trueHeading = trueHeading || null;\n  this.headingAccuracy = headingAccuracy || null;\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);\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);\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) {\n    this.code = code || null;\n    this.source = source || null;\n    this.target = target || null;\n    this.http_status = status || 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//Export the original open so it can be used if needed\nmodule.exports._orig = window.open;\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/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/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/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/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/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/echo\", function(require, exports, module) {\n\nvar exec = require('cordova/exec');\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 = forceAsync ? 'echoAsync' : 'echo';\n    if (!forceAsync && message.constructor == ArrayBuffer) {\n        action = 'echoArrayBuffer';\n    }\n    exec(successCallback, errorCallback, \"Echo\", action, [message]);\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/FileTransfer', 'FileTransfer');\n    exportFunc('cordova/plugin/FileTransferError', 'FileTransferError');\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/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/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/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/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/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/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/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/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.onInternet) { info.type=Connection.WIFI; }\n                if (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/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    if (context.navigator) {\n        var CordovaNavigator = function() {};\n        CordovaNavigator.prototype = context.navigator;\n        context.navigator = new CordovaNavigator();\n    }\n\n    var channel = require(\"cordova/channel\"),\n        _self = {\n            boot: function () {\n                /**\n                 * Create all cordova objects once page has fully loaded and native side is ready.\n                 */\n                channel.join(function() {\n                    var builder = require('cordova/builder'),\n                        base = require('cordova/common'),\n                        platform = require('cordova/platform');\n\n                    // Drop the common globals into the window object, but be nice and don't overwrite anything.\n                    builder.buildIntoButDoNotClobber(base.defaults, context);\n                    builder.buildIntoAndClobber(base.clobbers, context);\n                    builder.buildIntoAndMerge(base.merges, context);\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                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);\n            }\n        };\n\n    // boot up once native side is ready\n    channel.onNativeReady.subscribe(_self.boot);\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}(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);}

})();