From 46833b587aa82dae44b75525aca3e62ea2fec602 Mon Sep 17 00:00:00 2001 From: rperezgonz Date: Sun, 15 Apr 2018 21:58:55 +0200 Subject: [PATCH 1/3] issue #1074: Rename KobukiViewer and use with electron --- src/tools/TurtlebotViewer-web/CMakeLists.txt | 26 + .../TurtlebotViewer-web/kobukiviewerjs.in | 5 + src/tools/TurtlebotViewer-web/main.js | 56 + .../TurtlebotViewer-web/package-lock.json | 1347 ++++ src/tools/TurtlebotViewer-web/package.json | 18 + .../TurtlebotViewer-web/public/config.yml | 22 + .../public/css/bootstrap-toggle.min.css | 28 + .../public/css/bootstrap.min.css | 14 + .../public/css/turtlebotviewer.css | 137 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../TurtlebotViewer-web/public/index.html | 213 + .../public/js/ColladaLoader.js | 5511 +++++++++++++++++ .../TurtlebotViewer-web/public/js/Ice.min.js | 10 + .../public/js/JoyStickControls.js | 741 +++ .../public/js/TrackballControls.js | 634 ++ .../TurtlebotViewer-web/public/js/api.js | 543 ++ .../public/js/api_workers/camera_worker.js | 195 + .../public/js/api_workers/laser_worker.js | 167 + .../public/js/api_workers/motors_worker.js | 152 + .../public/js/api_workers/pose3d_worker.js | 134 + .../public/js/bootstrap-toggle.min.js | 9 + .../public/js/bootstrap.min.js | 7 + .../TurtlebotViewer-web/public/js/gui.js | 546 ++ .../public/js/jderobot/ardroneextra.js | 55 + .../public/js/jderobot/bumper.js | 82 + .../public/js/jderobot/camera.js | 130 + .../public/js/jderobot/cmdvel.js | 89 + .../public/js/jderobot/common.js | 37 + .../public/js/jderobot/containers.js | 35 + .../public/js/jderobot/datetime.js | 52 + .../public/js/jderobot/emSensor.js | 83 + .../public/js/jderobot/encoders.js | 88 + .../public/js/jderobot/exceptions.js | 117 + .../public/js/jderobot/genericData.js | 82 + .../public/js/jderobot/image.js | 150 + .../public/js/jderobot/jcm.js | 186 + .../public/js/jderobot/jointmotor.js | 286 + .../public/js/jderobot/kinectleds.js | 55 + .../public/js/jderobot/laser.js | 94 + .../public/js/jderobot/motors.js | 55 + .../public/js/jderobot/namingService.js | 161 + .../public/js/jderobot/navdata.js | 163 + .../public/js/jderobot/pointcloud.js | 74 + .../public/js/jderobot/pose3d.js | 101 + .../public/js/jderobot/pose3dencoders.js | 109 + .../public/js/jderobot/pose3dmotors.js | 146 + .../public/js/jderobot/primitives.js | 112 + .../public/js/jderobot/ptencoders.js | 85 + .../public/js/jderobot/ptmotors.js | 133 + .../public/js/jderobot/recorder.js | 49 + .../public/js/jderobot/remoteCloud.js | 55 + .../public/js/jderobot/remoteConfig.js | 51 + .../public/js/jderobot/replayControl.js | 57 + .../public/js/jderobot/rgbd.js | 68 + .../public/js/jderobot/sonars.js | 79 + .../public/js/jderobot/visualization.js | 80 + .../public/js/jquery.min.js | 5 + .../public/js/three.min.js | 869 +++ .../public/js/turtlebotviewer.js | 460 ++ .../public/js/turtlebotviewerWeb.js | 117 + ...1-8000-RA_Turtlebot_F-F_Standoff_color.png | Bin 0 -> 85278 bytes ...2-1000-RA_Turtlebot_M-F_Standoff_color.png | Bin 0 -> 265354 bytes ...2-2000-RA_Turtlebot_M-F_Standoff_color.png | Bin 0 -> 90639 bytes .../materials/textures/create_body.png | Bin 0 -> 18670 bytes .../materials/textures/plate_0_logo.png | Bin 0 -> 18737 bytes .../materials/textures/plate_0_logo2.png | Bin 0 -> 25776 bytes .../materials/textures/plate_1_logo.png | Bin 0 -> 22928 bytes .../materials/textures/plate_1_logo2.png | Bin 0 -> 33934 bytes .../materials/textures/plate_2_logo.png | Bin 0 -> 22451 bytes .../materials/textures/plate_2_logo2.png | Bin 0 -> 30556 bytes .../public/robotmodels/peloto.png | Bin 0 -> 8230 bytes .../public/robotmodels/pioneer/chassis.dae | 375 ++ .../pioneer/sonyvid30/sonyvid30_bottom.dae | 110 + .../pioneer/sonyvid30/sonyvid30_mid.dae | 110 + .../pioneer/sonyvid30/sonyvid30_top.dae | 110 + .../public/robotmodels/pioneer/wheel.dae | 259 + .../robotmodels/quadrotor/red_quadrotor.dae | 2942 +++++++++ .../turtlebot/68-02403-125_Spacer.dae | 64 + ...8-02421-8000-RA_Turtlebot_F-F_Standoff.dae | 138 + ...8-04552-1000-RA_Turtlebot_M-F_Standoff.dae | 138 + ...8-04552-2000-RA_Turtlebot_M-F_Standoff.dae | 138 + .../68-04556-RA_Kinect_Standoff_Assy.dae | 138 + .../public/robotmodels/turtlebot/chassis.dae | 375 ++ .../robotmodels/turtlebot/create_body.dae | 348 ++ .../robotmodels/turtlebot/plate_0_logo.dae | 174 + .../robotmodels/turtlebot/plate_1_logo.dae | 174 + .../robotmodels/turtlebot/plate_2_logo.dae | 174 + .../turtlebot/sonyvid30/sonyvid30_bottom.dae | 110 + .../turtlebot/sonyvid30/sonyvid30_mid.dae | 110 + .../turtlebot/sonyvid30/sonyvid30_top.dae | 110 + .../public/robotmodels/turtlebot/wheel.dae | 259 + .../public/turtlebotviewer.html | 208 + src/tools/TurtlebotViewer-web/run.js | 47 + 97 files changed, 22064 insertions(+) create mode 100644 src/tools/TurtlebotViewer-web/CMakeLists.txt create mode 100644 src/tools/TurtlebotViewer-web/kobukiviewerjs.in create mode 100644 src/tools/TurtlebotViewer-web/main.js create mode 100644 src/tools/TurtlebotViewer-web/package-lock.json create mode 100644 src/tools/TurtlebotViewer-web/package.json create mode 100644 src/tools/TurtlebotViewer-web/public/config.yml create mode 100644 src/tools/TurtlebotViewer-web/public/css/bootstrap-toggle.min.css create mode 100644 src/tools/TurtlebotViewer-web/public/css/bootstrap.min.css create mode 100644 src/tools/TurtlebotViewer-web/public/css/turtlebotviewer.css create mode 100644 src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.eot create mode 100644 src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.svg create mode 100644 src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.ttf create mode 100644 src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.woff create mode 100644 src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.woff2 create mode 100644 src/tools/TurtlebotViewer-web/public/index.html create mode 100644 src/tools/TurtlebotViewer-web/public/js/ColladaLoader.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/Ice.min.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/JoyStickControls.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/TrackballControls.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/api.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/api_workers/camera_worker.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/api_workers/laser_worker.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/api_workers/motors_worker.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/api_workers/pose3d_worker.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/bootstrap-toggle.min.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/bootstrap.min.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/gui.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/ardroneextra.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/bumper.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/camera.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/cmdvel.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/common.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/containers.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/datetime.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/emSensor.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/encoders.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/exceptions.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/genericData.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/image.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/jcm.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/jointmotor.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/kinectleds.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/laser.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/motors.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/namingService.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/navdata.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/pointcloud.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/pose3d.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/pose3dencoders.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/pose3dmotors.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/primitives.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/ptencoders.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/ptmotors.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/recorder.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/remoteCloud.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/remoteConfig.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/replayControl.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/rgbd.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/sonars.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jderobot/visualization.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/jquery.min.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/three.min.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/turtlebotviewer.js create mode 100644 src/tools/TurtlebotViewer-web/public/js/turtlebotviewerWeb.js create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/68-02421-8000-RA_Turtlebot_F-F_Standoff_color.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/68-04552-1000-RA_Turtlebot_M-F_Standoff_color.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/68-04552-2000-RA_Turtlebot_M-F_Standoff_color.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/create_body.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/plate_0_logo.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/plate_0_logo2.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/plate_1_logo.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/plate_1_logo2.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/plate_2_logo.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/materials/textures/plate_2_logo2.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/peloto.png create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/pioneer/chassis.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/pioneer/sonyvid30/sonyvid30_bottom.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/pioneer/sonyvid30/sonyvid30_mid.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/pioneer/sonyvid30/sonyvid30_top.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/pioneer/wheel.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/quadrotor/red_quadrotor.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/68-02403-125_Spacer.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/68-02421-8000-RA_Turtlebot_F-F_Standoff.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/68-04552-1000-RA_Turtlebot_M-F_Standoff.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/68-04552-2000-RA_Turtlebot_M-F_Standoff.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/68-04556-RA_Kinect_Standoff_Assy.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/chassis.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/create_body.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/plate_0_logo.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/plate_1_logo.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/plate_2_logo.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/sonyvid30/sonyvid30_bottom.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/sonyvid30/sonyvid30_mid.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/sonyvid30/sonyvid30_top.dae create mode 100644 src/tools/TurtlebotViewer-web/public/robotmodels/turtlebot/wheel.dae create mode 100644 src/tools/TurtlebotViewer-web/public/turtlebotviewer.html create mode 100644 src/tools/TurtlebotViewer-web/run.js diff --git a/src/tools/TurtlebotViewer-web/CMakeLists.txt b/src/tools/TurtlebotViewer-web/CMakeLists.txt new file mode 100644 index 000000000..8247e5a0c --- /dev/null +++ b/src/tools/TurtlebotViewer-web/CMakeLists.txt @@ -0,0 +1,26 @@ +IF (NODEJS_COMPILE) + + configure_file( + kobukiviewerjs.in + kobukiviewerjs + @ONLY + ) + + ## INSTALL ## + + # install Launcher + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/kobukiviewerjs + PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ + DESTINATION bin + COMPONENT webtools + ) + + # Install script + INSTALL (FILES ${CMAKE_CURRENT_SOURCE_DIR}/run.js DESTINATION share/jderobot/webtools/kobukiviewerjs COMPONENT webtools ) + + # Install public + INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/public DESTINATION share/jderobot/webtools/kobukiviewerjs COMPONENT webtools PATTERN .svn EXCLUDE) + + +ENDIF() diff --git a/src/tools/TurtlebotViewer-web/kobukiviewerjs.in b/src/tools/TurtlebotViewer-web/kobukiviewerjs.in new file mode 100644 index 000000000..76018bae5 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/kobukiviewerjs.in @@ -0,0 +1,5 @@ +#!/bin/bash + +cd @CMAKE_INSTALL_PREFIX@/share/jderobot/webtools/kobukiviewerjs/ + +nodejs run.js \ No newline at end of file diff --git a/src/tools/TurtlebotViewer-web/main.js b/src/tools/TurtlebotViewer-web/main.js new file mode 100644 index 000000000..2feb838dc --- /dev/null +++ b/src/tools/TurtlebotViewer-web/main.js @@ -0,0 +1,56 @@ +const electron = require('electron') +const {app, BrowserWindow} = electron +const path = require('path') +const url = require('url') + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let win + +function createWindow () { + // Create the browser window. + var screenElectron = electron.screen; + var mainScreen = screenElectron.getPrimaryDisplay(); + var dimensions = mainScreen.size; + win = new BrowserWindow({width: dimensions.width, height: dimensions.height}); + + // and load the index.html of the app. + win.loadURL(url.format({ + pathname: path.join(__dirname, '/public/index.html'), + protocol: 'file:', + slashes: true + })) + + // Open the DevTools. +// win.webContents.openDevTools() + + // Emitted when the window is closed. + win.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + win = null + }) +} + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow) + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + // On macOS it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit() + } +}) + +app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (win === null) { + createWindow() + } +}) diff --git a/src/tools/TurtlebotViewer-web/package-lock.json b/src/tools/TurtlebotViewer-web/package-lock.json new file mode 100644 index 000000000..acc524198 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/package-lock.json @@ -0,0 +1,1347 @@ +{ + "name": "TurtlebotViewer-web", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "8.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.4.tgz", + "integrity": "sha512-dSvD36qnQs78G1BPsrZFdPpvLgMW/dnvr5+nTW2csMs5TiP9MOXrjUbnMZOEwnIuBklXtn7b6TPA2Cuq07bDHA==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "electron": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-1.8.2.tgz", + "integrity": "sha512-0TV5Hy92g8ACnPn+PVol6a/2uk+khzmRtWxhah/FcKs6StCytm5hD14QqOdZxEdJN8HljXIVCayN/wJX+0wDiQ==", + "dev": true, + "requires": { + "@types/node": "8.9.4", + "electron-download": "3.3.0", + "extract-zip": "1.6.6" + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "fs-extra": "0.30.0", + "home-path": "1.0.5", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "2.1.0", + "rc": "1.2.5", + "semver": "5.5.0", + "sumchecker": "1.3.1" + } + }, + "electron-ipc-server": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-ipc-server/-/electron-ipc-server-0.1.2.tgz", + "integrity": "sha1-okGdqm7hUwH1oCqCDDhAVW1dJeA=", + "requires": { + "parseurl": "1.3.2", + "path-to-regexp": "1.7.0", + "qs": "6.5.1", + "uuid": "2.0.3" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + } + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extract-zip": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "debug": "2.6.9", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "home-path": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.5.tgz", + "integrity": "sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "ice": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ice/-/ice-3.7.0.tgz", + "integrity": "sha512-kXKP3xxP4f0aAnFlJTeJwmhJmWz7vkww7xvrr0S0wdVvUD4nr/kxuGor5iCNGU5jc00oAHw2FZ+1lBsoahchwg==" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "2.6.9", + "minimist": "1.2.0", + "pretty-bytes": "1.0.4", + "progress-stream": "1.2.0", + "request": "2.83.0", + "single-line-log": "1.1.2", + "throttleit": "0.0.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "0.1.4", + "through2": "0.2.3" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" + }, + "rc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", + "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "slice2js": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/slice2js/-/slice2js-3.7.0.tgz", + "integrity": "sha512-iY1mnI1OMxM9uq9YaewLnRPYTrQr1UdlBAJ94u4TimhTqDCG1j9UHfIqkptjmpDqWQiQgLVug/xz3TD2qJobkw==", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "es6-promise": "4.2.4" + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xtend": "2.1.2" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "0.4.0" + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + } + } +} diff --git a/src/tools/TurtlebotViewer-web/package.json b/src/tools/TurtlebotViewer-web/package.json new file mode 100644 index 000000000..3909c932e --- /dev/null +++ b/src/tools/TurtlebotViewer-web/package.json @@ -0,0 +1,18 @@ +{ + "name": "TurtlebotViewer-web", + "version": "0.1.0", + "main": "main.js", + "scripts": { + "start": "electron ." + }, + "dependencies": { + "electron-ipc-server": "^0.1.2", + "ice": "^3.7.0", + "jquery": "^3.2.1", + "js-yaml": "^3.11.0" + }, + "devDependencies": { + "electron": "^1.8.2", + "slice2js": "^3.7.0" + } +} diff --git a/src/tools/TurtlebotViewer-web/public/config.yml b/src/tools/TurtlebotViewer-web/public/config.yml new file mode 100644 index 000000000..b8759c8c5 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/config.yml @@ -0,0 +1,22 @@ +camrightserv: + dir: localhost + port: 11010 +camrightepname: CameraR +camleftserv: + dir: localhost + port: 11010 +camleftepname: CameraL +motorserv: + dir: locahost + port: 11010 +motorsepname: Motors +pose3dserv: + dir: localhost + port: 11010 +pose3depname: Pose3D +laserserv: + dir: localhost + port: 11010 +laserepname: Laser +maxv: 3 +maxw: 0.7 diff --git a/src/tools/TurtlebotViewer-web/public/css/bootstrap-toggle.min.css b/src/tools/TurtlebotViewer-web/public/css/bootstrap-toggle.min.css new file mode 100644 index 000000000..0d42ed09c --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/css/bootstrap-toggle.min.css @@ -0,0 +1,28 @@ +/*! ======================================================================== + * Bootstrap Toggle: bootstrap-toggle.css v2.2.0 + * http://www.bootstraptoggle.com + * ======================================================================== + * Copyright 2014 Min Hur, The New York Times Company + * Licensed under MIT + * ======================================================================== */ +.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px} +.toggle{position:relative;overflow:hidden} +.toggle input[type=checkbox]{display:none} +.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none} +.toggle.off .toggle-group{left:-100%} +.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0} +.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0} +.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px} +.toggle.btn{min-width:59px;min-height:34px} +.toggle-on.btn{padding-right:24px} +.toggle-off.btn{padding-left:24px} +.toggle.btn-lg{min-width:79px;min-height:45px} +.toggle-on.btn-lg{padding-right:31px} +.toggle-off.btn-lg{padding-left:31px} +.toggle-handle.btn-lg{width:40px} +.toggle.btn-sm{min-width:50px;min-height:30px} +.toggle-on.btn-sm{padding-right:20px} +.toggle-off.btn-sm{padding-left:20px} +.toggle.btn-xs{min-width:35px;min-height:22px} +.toggle-on.btn-xs{padding-right:12px} +.toggle-off.btn-xs{padding-left:12px} \ No newline at end of file diff --git a/src/tools/TurtlebotViewer-web/public/css/bootstrap.min.css b/src/tools/TurtlebotViewer-web/public/css/bootstrap.min.css new file mode 100644 index 000000000..a5f95e37f --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/css/bootstrap.min.css @@ -0,0 +1,14 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=5c9895f0d94dc160deb5) + * Config saved to config.json and https://gist.github.com/5c9895f0d94dc160deb5 + *//*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#58d9ff;background-color:#333}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#fbfbfb;text-decoration:none}a:hover,a:focus{color:#d5d5d5;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#333;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#285f8f}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#285f8f}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:992px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#333}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#58d9ff;border:0;border-bottom:1px solid #58d9ff}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #58d9ff;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#d8f6ff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ccc;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ccc;background-color:#333;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#ccc;background-color:#1a1a1a;border-color:#8c8c8c}.btn-default:hover{color:#ccc;background-color:#1a1a1a;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ccc;background-color:#1a1a1a;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ccc;background-color:#080808;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#333;border-color:#ccc}.btn-default .badge{color:#333;background-color:#ccc}.btn-primary{color:#337ab7;background-color:#333;border-color:#337ab7}.btn-primary:focus,.btn-primary.focus{color:#337ab7;background-color:#1a1a1a;border-color:#173853}.btn-primary:hover{color:#337ab7;background-color:#1a1a1a;border-color:#265a87}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#337ab7;background-color:#1a1a1a;border-color:#265a87}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#337ab7;background-color:#080808;border-color:#173853}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#333;border-color:#337ab7}.btn-primary .badge{color:#333;background-color:#337ab7}.btn-success{color:#5cb85c;background-color:#333;border-color:#5cb85c}.btn-success:focus,.btn-success.focus{color:#5cb85c;background-color:#1a1a1a;border-color:#2d672d}.btn-success:hover{color:#5cb85c;background-color:#1a1a1a;border-color:#419641}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#5cb85c;background-color:#1a1a1a;border-color:#419641}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#5cb85c;background-color:#080808;border-color:#2d672d}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#333;border-color:#5cb85c}.btn-success .badge{color:#333;background-color:#5cb85c}.btn-info{color:#58d9ff;background-color:#333;border-color:#58d9ff}.btn-info:focus,.btn-info.focus{color:#58d9ff;background-color:#1a1a1a;border-color:#00a6d8}.btn-info:hover{color:#58d9ff;background-color:#1a1a1a;border-color:#1bcbff}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#58d9ff;background-color:#1a1a1a;border-color:#1bcbff}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#58d9ff;background-color:#080808;border-color:#00a6d8}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#333;border-color:#58d9ff}.btn-info .badge{color:#333;background-color:#58d9ff}.btn-warning{color:#f0ad4e;background-color:#333;border-color:#f0ad4e}.btn-warning:focus,.btn-warning.focus{color:#f0ad4e;background-color:#1a1a1a;border-color:#b06d0f}.btn-warning:hover{color:#f0ad4e;background-color:#1a1a1a;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#f0ad4e;background-color:#1a1a1a;border-color:#eb9316}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#f0ad4e;background-color:#080808;border-color:#b06d0f}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#333;border-color:#f0ad4e}.btn-warning .badge{color:#333;background-color:#f0ad4e}.btn-danger{color:#d9534f;background-color:#333;border-color:#d9534f}.btn-danger:focus,.btn-danger.focus{color:#d9534f;background-color:#1a1a1a;border-color:#8b211e}.btn-danger:hover{color:#d9534f;background-color:#1a1a1a;border-color:#c12e2a}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#d9534f;background-color:#1a1a1a;border-color:#c12e2a}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#d9534f;background-color:#080808;border-color:#8b211e}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#333;border-color:#d9534f}.btn-danger .badge{color:#333;background-color:#d9534f}.btn-link{color:#fbfbfb;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#d5d5d5;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#333;border:1px solid #58d9ff;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#58d9ff}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#58d9ff;border-color:#fbfbfb}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #58d9ff}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#58d9ff #58d9ff #58d9ff}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#58d9ff;background-color:#333;border:1px solid #58d9ff;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #58d9ff}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #58d9ff;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#333}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #58d9ff}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #58d9ff;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#333}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:992px){.navbar{border-radius:6px}}@media (min-width:992px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:992px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:992px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:992px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:992px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:992px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:992px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:991px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:992px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:991px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:992px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:6px;border-top-left-radius:6px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:992px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:992px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#fbfbfb;border-color:#58d9ff}.navbar-default .navbar-brand{color:#58d9ff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#25cdff;background-color:transparent}.navbar-default .navbar-text{color:#58d9ff}.navbar-default .navbar-nav>li>a{color:#58d9ff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#25cdff;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fbfbfb;background-color:#58d9ff}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#58d9ff}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#e2e2e2}.navbar-default .navbar-toggle .icon-bar{background-color:#58d9ff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#58d9ff}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#58d9ff;color:#fbfbfb}@media (max-width:991px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#58d9ff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#25cdff;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fbfbfb;background-color:#58d9ff}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#58d9ff}.navbar-default .navbar-link:hover{color:#25cdff}.navbar-default .btn-link{color:#58d9ff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#25cdff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#333;border-color:#58d9ff}.navbar-inverse .navbar-brand{color:#58d9ff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#0cc8ff;background-color:transparent}.navbar-inverse .navbar-text{color:#58d9ff}.navbar-inverse .navbar-nav>li>a{color:#58d9ff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#0cc8ff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fbfbfb;background-color:#333}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#58d9ff}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:arken(#fbfbfb, 10%)}.navbar-inverse .navbar-toggle .icon-bar{background-color:#58d9ff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#212121}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#333;color:#fbfbfb}@media (max-width:991px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#58d9ff}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#58d9ff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#58d9ff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#0cc8ff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fbfbfb;background-color:#333}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#58d9ff}.navbar-inverse .navbar-link:hover{color:#0cc8ff}.navbar-inverse .btn-link{color:#58d9ff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#0cc8ff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#fbfbfb;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#d5d5d5;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#285f8f}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#58d9ff}.label-info[href]:hover,.label-info[href]:focus{background-color:#25cdff}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#fbfbfb;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#333;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#fbfbfb}.thumbnail .caption{padding:9px;color:#58d9ff}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#58d9ff}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#333;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#333;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#58d9ff}.panel-info>.panel-heading{color:#58d9ff;background-color:#333;border-color:#58d9ff}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#58d9ff}.panel-info>.panel-heading .badge{color:#333;background-color:#58d9ff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#58d9ff}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#333;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #58d9ff}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #58d9ff}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, color-stop(0, rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, color-stop(0, rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/src/tools/TurtlebotViewer-web/public/css/turtlebotviewer.css b/src/tools/TurtlebotViewer-web/public/css/turtlebotviewer.css new file mode 100644 index 000000000..334a78049 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/css/turtlebotviewer.css @@ -0,0 +1,137 @@ +/*azul: #58D9FF + naranja: #e67e22 + blanco: #FBFBFB + carbon: #333333 +*/ + +/* +@btn-success-color #fff +@btn-success-bg @brand-success +@btn-success-border darken(@btn-success-bg, 5%) +@btn-info-color #fff +@btn-info-bg @brand-info +@btn-info-border darken(@btn-info-bg, 5%) +*/ + + +#body{ width: inherit; +} + +.color-light, .input-group-addon{ +/* color:#eee;*/ + color:#58D9FF; +} +.border-light{ + border-style: solid; + border-color: #eee; + border-width: 2px; +} + +.padding0 { + padding: 0px 0px 0px 0px; +} + +.letrero{ + padding: 2px 15px; +} + +.border-carbon{ + border-color: #333; +} +.border-blue{ + border: 1px solid #58D9FF; +} + +.row{ + margin-bottom: 3px; +} + +.width100{ + width:100%; +} +.right{ + text-align: right; +} + +.row { + margin-bottom: 10px; + +} + + +/* toggle button navbar*/ +.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus, +.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: #58D9FF; +} + +.navbar-default .navbar-toggle:hover .icon-bar, .navbar-default .navbar-toggle:focus .icon-bar, +.navbar-inverse .navbar-toggle:hover .icon-bar, .navbar-inverse .navbar-toggle:focus .icon-bar{ + background-color: #FBFBFB; +} + +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #58D9FF; +} + +.nav-tabs li a{ + color: #58D9FF; +} +.nav-tabs li a:hover{ + color: #333; +} + +.nav-tabs li.active a{ + color: #FBFBFB; +} + +/* Buttons */ + +.btn-success:hover{ + background-color: #5cb85c; + color: #FBFBFB; + +} +.btn-info:hover{ + background-color: #58D9FF; + color: #FBFBFB; + +} +.btn-warning:hover{ + background-color: #f0ad4e; + color: #FBFBFB; + +} +.btn-danger:hover{ + background-color: #d9534f; + color: #FBFBFB; + +} +.btn-primary:hover{ + background-color: #337ab7; + color: #FBFBFB; + +} + +.padding-left0{ + padding-left: 0; +} + +.padding-right0{ + padding-right: 0; +} + +@media (max-width: 767px) { + +} +@media (min-width: 768px) and (max-width: 991px) { + +} + +@media (min-width: 992px) and (max-width: 1199px) { + +} + +@media (min-width: 1200px) { + +} diff --git a/src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.eot b/src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%` z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9 zNq`(c8=wS`0!RZy0g3{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xCk z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.ttf b/src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 zcmd?Sd0-pWwLh*qi$?oCk~i6sWlOeWJC3|4juU5JNSu9hSVACzERcmjLV&P^utNzg zIE4Kr1=5g!SxTX#Ern9_%4&01rlrW`Z!56xXTGQR4C z3vR~wXq>NDx$c~e?;ia3YjJ*$!C>69a?2$lLyhpI!CFfJsP=|`8@K0|bbMpWwVUEygg0=0x_)HeHpGSJagJNLA3c!$EuOV>j$wi! zbo{vZ(s8tl>@!?}dmNHXo)ABy7ohD7_1G-P@SdJWT8*oeyBVYVW9*vn}&VI4q++W;Z+uz=QTK}^C75!`aFYCX# zf7fC2;o`%!huaTNJAB&VWrx=szU=VLhwnbT`vc<#<`4WI6n_x@AofA~2d90o?1L3w z9!I|#P*NQ)$#9aASijuw>JRld^-t)Zhmy|i-`Iam|IWkguaMR%lhi4p~cX-9& zjfbx}yz}s`4-6>D^+6FzihR)Y!GsUy=_MWi_v7y#KmYi-{iZ+s@ekkq!@Wxz!~BQwiI&ti z>hC&iBe2m(dpNVvSbZe3DVgl(dxHt-k@{xv;&`^c8GJY%&^LpM;}7)B;5Qg5J^E${ z7z~k8eWOucjX6)7q1a%EVtmnND8cclz8R1=X4W@D8IDeUGXxEWe&p>Z*voO0u_2!! zj3dT(Ki+4E;uykKi*yr?w6!BW2FD55PD6SMj`OfBLwXL5EA-9KjpMo4*5Eqs^>4&> z8PezAcn!9jk-h-Oo!E9EjX8W6@EkTHeI<@AY{f|5fMW<-Ez-z)xCvW3()Z#x0oydB zzm4MzY^NdpIF9qMp-jU;99LjlgY@@s+=z`}_%V*xV7nRV*Kwrx-i`FzI0BZ#yOI8# z!SDeNA5b6u9!Imj89v0(g$;dT_y|Yz!3V`i{{_dez8U@##|X9A};s^7vEd!3AcdyVlhVk$v?$O442KIM1-wX^R{U7`JW&lPr3N(%kXfXT_`7w^? z=#ntx`tTF|N$UT?pELvw7T*2;=Q-x@KmDUIbLyXZ>f5=y7z1DT<7>Bp0k;eItHF?1 zErzhlD2B$Tm|^7DrxnTYm-tgg`Mt4Eivp5{r$o9e)8(fXBO4g|G^6Xy?y$SM*&V52 z6SR*%`%DZC^w(gOWQL?6DRoI*hBNT)xW9sxvmi@!vI^!mI$3kvAMmR_q#SGn3zRb_ zGe$=;Tv3dXN~9XuIHow*NEU4y&u}FcZEZoSlXb9IBOA}!@J3uovp}yerhPMaiI8|SDhvWVr z^BE&yx6e3&RYqIg;mYVZ*3#A-cDJ;#ms4txEmwm@g^s`BB}KmSr7K+ruIoKs=s|gOXP|2 zb1!)87h9?(+1^QRWb(Vo8+@G=o24gyuzF3ytfsKjTHZJ}o{YznGcTDm!s)DRnmOX} z3pPL4wExoN$kyc2>#J`k+<67sy-VsfbQ-1u+HkyFR?9G`9r6g4*8!(!c65Be-5hUg zZHY$M0k(Yd+DT1*8)G(q)1&tDl=g9H7!bZTOvEEFnBOk_K=DXF(d4JOaH zI}*A3jGmy{gR>s}EQzyJa_q_?TYPNXRU1O;fcV_&TQZhd{@*8Tgpraf~nT0BYktu*n{a~ub^UUqQPyr~yBY{k2O zgV)honv{B_CqY|*S~3up%Wn%7i*_>Lu|%5~j)}rQLT1ZN?5%QN`LTJ}vA!EE=1`So z!$$Mv?6T)xk)H8JTrZ~m)oNXxS}pwPd#);<*>zWsYoL6iK!gRSBB{JCgB28C#E{T? z5VOCMW^;h~eMke(w6vLlKvm!!TyIf;k*RtK)|Q>_@nY#J%=h%aVb)?Ni_By)XNxY)E3`|}_u}fn+Kp^3p4RbhFUBRtGsDyx9Eolg77iWN z2iH-}CiM!pfYDIn7;i#Ui1KG01{3D<{e}uWTdlX4Vr*nsb^>l0%{O?0L9tP|KGw8w z+T5F}md>3qDZQ_IVkQ|BzuN08uN?SsVt$~wcHO4pB9~ykFTJO3g<4X({-Tm1w{Ufo zI03<6KK`ZjqVyQ(>{_aMxu7Zm^ck&~)Q84MOsQ-XS~{6j>0lTl@lMtfWjj;PT{nlZ zIn0YL?kK7CYJa)(8?unZ)j8L(O}%$5S#lTcq{rr5_gqqtZ@*0Yw4}OdjL*kBv+>+@ z&*24U=y{Nl58qJyW1vTwqsvs=VRAzojm&V zEn6=WzdL1y+^}%Vg!ap>x%%nFi=V#wn# zUuheBR@*KS)5Mn0`f=3fMwR|#-rPMQJg(fW*5e`7xO&^UUH{L(U8D$JtI!ac!g(Ze89<`UiO@L+)^D zjPk2_Ie0p~4|LiI?-+pHXuRaZKG$%zVT0jn!yTvvM^jlcp`|VSHRt-G@_&~<4&qW@ z?b#zIN)G(}L|60jer*P7#KCu*Af;{mpWWvYK$@Squ|n-Vtfgr@ZOmR5Xpl;0q~VILmjk$$mgp+`<2jP z@+nW5Oap%fF4nFwnVwR7rpFaOdmnfB$-rkO6T3#w^|*rft~acgCP|ZkgA6PHD#Of| zY%E!3tXtsWS`udLsE7cSE8g@p$ceu*tI71V31uA7jwmXUCT7+Cu3uv|W>ZwD{&O4Nfjjvl43N#A$|FWxId! z%=X!HSiQ-#4nS&smww~iXRn<-`&zc)nR~js?|Ei-cei$^$KsqtxNDZvl1oavXK#Pz zT&%Wln^Y5M95w=vJxj0a-ko_iQt(LTX_5x#*QfQLtPil;kkR|kz}`*xHiLWr35ajx zHRL-QQv$|PK-$ges|NHw8k6v?&d;{A$*q15hz9{}-`e6ys1EQ1oNNKDFGQ0xA!x^( zkG*-ueZT(GukSnK&Bs=4+w|(kuWs5V_2#3`!;f}q?>xU5IgoMl^DNf+Xd<=sl2XvkqviJ>d?+G@Z5nxxd5Sqd$*ENUB_mb8Z+7CyyU zA6mDQ&e+S~w49csl*UePzY;^K)Fbs^%?7;+hFc(xz#mWoek4_&QvmT7Fe)*{h-9R4 zqyXuN5{)HdQ6yVi#tRUO#M%;pL>rQxN~6yoZ)*{{!?jU)RD*oOxDoTjVh6iNmhWNC zB5_{R=o{qvxEvi(khbRS`FOXmOO|&Dj$&~>*oo)bZz%lPhEA@ zQ;;w5eu5^%i;)w?T&*=UaK?*|U3~{0tC`rvfEsRPgR~16;~{_S2&=E{fE2=c>{+y} zx1*NTv-*zO^px5TA|B```#NetKg`19O!BK*-#~wDM@KEllk^nfQ2quy25G%)l72<> zzL$^{DDM#jKt?<>m;!?E2p0l12`j+QJjr{Lx*47Nq(v6i3M&*P{jkZB{xR?NOSPN% zU>I+~d_ny=pX??qjF*E78>}Mgts@_yn`)C`wN-He_!OyE+gRI?-a>Om>Vh~3OX5+& z6MX*d1`SkdXwvb7KH&=31RCC|&H!aA1g_=ZY0hP)-Wm6?A7SG0*|$mC7N^SSBh@MG z9?V0tv_sE>X==yV{)^LsygK2=$Mo_0N!JCOU?r}rmWdHD%$h~~G3;bt`lH& zAuOOZ=G1Mih**0>lB5x+r)X^8mz!0K{SScj4|a=s^VhUEp#2M=^#WRqe?T&H9GnWa zYOq{+gBn9Q0e0*Zu>C(BAX=I-Af9wIFhCW6_>TsIH$d>|{fIrs&BX?2G>GvFc=<8` zVJ`#^knMU~65dWGgXcht`Kb>{V2oo%<{NK|iH+R^|Gx%q+env#Js*(EBT3V0=w4F@W+oLFsA)l7Qy8mx_;6Vrk;F2RjKFvmeq} zro&>@b^(?f))OoQ#^#s)tRL>b0gzhRYRG}EU%wr9GjQ#~Rpo|RSkeik^p9x2+=rUr}vfnQoeFAlv=oX%YqbLpvyvcZ3l$B z5bo;hDd(fjT;9o7g9xUg3|#?wU2#BJ0G&W1#wn?mfNR{O7bq747tc~mM%m%t+7YN}^tMa24O4@w<|$lk@pGx!;%pKiq&mZB z?3h<&w>un8r?Xua6(@Txu~Za9tI@|C4#!dmHMzDF_-_~Jolztm=e)@vG11bZQAs!tFvd9{C;oxC7VfWq377Y(LR^X_TyX9bn$)I765l=rJ%9uXcjggX*r?u zk|0!db_*1$&i8>d&G3C}A`{Fun_1J;Vx0gk7P_}8KBZDowr*8$@X?W6v^LYmNWI)lN92yQ;tDpN zOUdS-W4JZUjwF-X#w0r;97;i(l}ZZT$DRd4u#?pf^e2yaFo zbm>I@5}#8FjsmigM8w_f#m4fEP~r~_?OWB%SGWcn$ThnJ@Y`ZI-O&Qs#Y14To( zWAl>9Gw7#}eT(!c%D0m>5D8**a@h;sLW=6_AsT5v1Sd_T-C4pgu_kvc?7+X&n_fct znkHy(_LExh=N%o3I-q#f$F4QJpy>jZBW zRF7?EhqTGk)w&Koi}QQY3sVh?@e-Z3C9)P!(hMhxmXLC zF_+ZSTQU`Gqx@o(~B$dbr zHlEUKoK&`2gl>zKXlEi8w6}`X3kh3as1~sX5@^`X_nYl}hlbpeeVlj#2sv)CIMe%b zBs7f|37f8qq}gA~Is9gj&=te^wN8ma?;vF)7gce;&sZ64!7LqpR!fy)?4cEZposQ8 zf;rZF7Q>YMF1~eQ|Z*!5j0DuA=`~VG$Gg6B?Om1 z6fM@`Ck-K*k(eJ)Kvysb8sccsFf@7~3vfnC=<$q+VNv)FyVh6ZsWw}*vs>%k3$)9| zR9ek-@pA23qswe1io)(Vz!vS1o*XEN*LhVYOq#T`;rDkgt86T@O`23xW~;W_#ZS|x zvwx-XMb7_!hIte-#JNpFxskMMpo2OYhHRr0Yn8d^(jh3-+!CNs0K2B!1dL$9UuAD= zQ%7Ae(Y@}%Cd~!`h|wAdm$2WoZ(iA1(a_-1?znZ%8h72o&Mm*4x8Ta<4++;Yr6|}u zW8$p&izhdqF=m8$)HyS2J6cKyo;Yvb>DTfx4`4R{ zPSODe9E|uflE<`xTO=r>u~u=NuyB&H!(2a8vwh!jP!yfE3N>IiO1jI>7e&3rR#RO3_}G23W?gwDHgSgekzQ^PU&G5z&}V5GO? zfg#*72*$DP1T8i`S7=P;bQ8lYF9_@8^C(|;9v8ZaK2GnWz4$Th2a0$)XTiaxNWfdq z;yNi9veH!j)ba$9pke8`y2^63BP zIyYKj^7;2don3se!P&%I2jzFf|LA&tQ=NDs{r9fIi-F{-yiG-}@2`VR^-LIFN8BC4 z&?*IvLiGHH5>NY(Z^CL_A;yISNdq58}=u~9!Ia7 zm7MkDiK~lsfLpvmPMo!0$keA$`%Tm`>Fx9JpG^EfEb(;}%5}B4Dw!O3BCkf$$W-dF z$BupUPgLpHvr<<+QcNX*w@+Rz&VQz)Uh!j4|DYeKm5IC05T$KqVV3Y|MSXom+Jn8c zgUEaFW1McGi^44xoG*b0JWE4T`vka7qTo#dcS4RauUpE{O!ZQ?r=-MlY#;VBzhHGU zS@kCaZ*H73XX6~HtHd*4qr2h}Pf0Re@!WOyvres_9l2!AhPiV$@O2sX>$21)-3i+_ z*sHO4Ika^!&2utZ@5%VbpH(m2wE3qOPn-I5Tbnt&yn9{k*eMr3^u6zG-~PSr(w$p> zw)x^a*8Ru$PE+{&)%VQUvAKKiWiwvc{`|GqK2K|ZMy^Tv3g|zENL86z7i<c zW`W>zV1u}X%P;Ajn+>A)2iXZbJ5YB_r>K-h5g^N=LkN^h0Y6dPFfSBh(L`G$D%7c` z&0RXDv$}c7#w*7!x^LUes_|V*=bd&aP+KFi((tG*gakSR+FA26%{QJdB5G1F=UuU&koU*^zQA=cEN9}Vd?OEh| zgzbFf1?@LlPkcXH$;YZe`WEJ3si6&R2MRb}LYK&zK9WRD=kY-JMPUurX-t4(Wy{%` zZ@0WM2+IqPa9D(^*+MXw2NWwSX-_WdF0nMWpEhAyotIgqu5Y$wA=zfuXJ0Y2lL3#ji26-P3Z?-&0^KBc*`T$+8+cqp`%g0WB zTH9L)FZ&t073H4?t=(U6{8B+uRW_J_n*vW|p`DugT^3xe8Tomh^d}0k^G7$3wLgP& zn)vTWiMA&=bR8lX9H=uh4G04R6>C&Zjnx_f@MMY!6HK5v$T%vaFm;E8q=`w2Y}ucJ zkz~dKGqv9$E80NTtnx|Rf_)|3wxpnY6nh3U9<)fv2-vhQ6v=WhKO@~@X57N-`7Ppc zF;I7)eL?RN23FmGh0s;Z#+p)}-TgTJE%&>{W+}C`^-sy{gTm<$>rR z-X7F%MB9Sf%6o7A%ZHReD4R;imU6<9h81{%avv}hqugeaf=~^3A=x(Om6Lku-Pn9i zC;LP%Q7Xw*0`Kg1)X~nAsUfdV%HWrpr8dZRpd-#%)c#Fu^mqo|^b{9Mam`^Zw_@j@ zR&ZdBr3?@<@%4Z-%LT&RLgDUFs4a(CTah_5x4X`xDRugi#vI-cw*^{ncwMtA4NKjByYBza)Y$hozZCpuxL{IP&=tw6ZO52WY3|iwGf&IJCn+u(>icK zZB1~bWXCmwAUz|^<&ysd#*!DSp8}DLNbl5lRFat4NkvItxy;9tpp9~|@ z;JctShv^Iq4(z+y7^j&I?GCdKMVg&jCwtCkc4*@O7HY*veGDBtAIn*JgD$QftP}8= zxFAdF=(S>Ra6(4slk#h%b?EOU-96TIX$Jbfl*_7IY-|R%H zF8u|~hYS-YwWt5+^!uGcnKL~jM;)ObZ#q68ZkA?}CzV-%6_vPIdzh_wHT_$mM%vws9lxUj;E@#1UX?WO2R^41(X!nk$+2oJGr!sgcbn1f^yl1 z#pbPB&Bf;1&2+?};Jg5qgD1{4_|%X#s48rOLE!vx3@ktstyBsDQWwDz4GYlcgu$UJ zp|z_32yN72T*oT$SF8<}>e;FN^X&vWNCz>b2W0rwK#<1#kbV)Cf`vN-F$&knLo5T& z8!sO-*^x4=kJ$L&*h%rQ@49l?7_9IG99~xJDDil00<${~D&;kiqRQqeW5*22A`8I2 z(^@`qZoF7_`CO_e;8#qF!&g>UY;wD5MxWU>azoo=E{kW(GU#pbOi%XAn%?W{b>-bTt&2?G=E&BnK9m0zs{qr$*&g8afR_x`B~o zd#dxPpaap;I=>1j8=9Oj)i}s@V}oXhP*{R|@DAQXzQJekJnmuQ;vL90_)H_nD1g6e zS1H#dzg)U&6$fz0g%|jxDdz|FQN{KJ&Yx0vfuzAFewJjv`pdMRpY-wU`-Y6WQnJ(@ zGVb!-8DRJZvHnRFiR3PG3Tu^nCn(CcZHh7hQvyd7i6Q3&ot86XI{jo%WZqCPcTR0< zMRg$ZE=PQx66ovJDvI_JChN~k@L^Pyxv#?X^<)-TS5gk`M~d<~j%!UOWG;ZMi1af< z+86U0=sm!qAVJAIqqU`Qs1uJhQJA&n@9F1PUrYuW!-~IT>l$I!#5dBaiAK}RUufjg{$#GdQBkxF1=KU2E@N=i^;xgG2Y4|{H>s` z$t`k8c-8`fS7Yfb1FM#)vPKVE4Uf(Pk&%HLe z%^4L>@Z^9Z{ZOX<^e)~adVRkKJDanJ6VBC_m@6qUq_WF@Epw>AYqf%r6qDzQ~AEJ!jtUvLp^CcqZ^G-;Kz3T;O4WG45Z zFhrluCxlY`M+OKr2SeI697btH7Kj`O>A!+2DTEQ=48cR>Gg2^5uqp(+y5Sl09MRl* zp|28!v*wvMd_~e2DdKDMMQ|({HMn3D%%ATEecGG8V9>`JeL)T0KG}=}6K8NiSN5W< z79-ZdYWRUb`T}(b{RjN8>?M~opnSRl$$^gT`B27kMym5LNHu-k;A;VF8R(HtDYJHS zU7;L{a@`>jd0svOYKbwzq+pWSC(C~SPgG~nWR3pBA8@OICK$Cy#U`kS$I;?|^-SBC zBFkoO8Z^%8Fc-@X!KebF2Ob3%`8zlVHj6H;^(m7J35(_bS;cZPd}TY~qixY{MhykQ zV&7u7s%E=?i`}Ax-7dB0ih47w*7!@GBt<*7ImM|_mYS|9_K7CH+i}?*#o~a&tF-?C zlynEu1DmiAbGurEX2Flfy$wEVk7AU;`k#=IQE*6DMWafTL|9-vT0qs{A3mmZGzOyN zcM9#Rgo7WgB_ujU+?Q@Ql?V-!E=jbypS+*chI&zA+C_3_@aJal}!Q54?qsL0In({Ly zjH;e+_SK8yi0NQB%TO+Dl77jp#2pMGtwsgaC>K!)NimXG3;m7y`W+&<(ZaV>N*K$j zLL~I+6ouPk6_(iO>61cIsinx`5}DcKSaHjYkkMuDoVl>mKO<4$F<>YJ5J9A2Vl}#BP7+u~L8C6~D zsk`pZ$9Bz3teQS1Wb|8&c2SZ;qo<#F&gS;j`!~!ADr(jJXMtcDJ9cVi>&p3~{bqaP zgo%s8i+8V{UrYTc9)HiUR_c?cfx{Yan2#%PqJ{%?Wux4J;T$#cumM0{Es3@$>}DJg zqe*c8##t;X(4$?A`ve)e@YU3d2Balcivot{1(ahlE5qg@S-h(mPNH&`pBX$_~HdG48~)$x5p z{>ghzqqn_t8~pY<5?-To>cy^6o~mifr;KWvx_oMtXOw$$d6jddXG)V@a#lL4o%N@A zNJlQAz6R8{7jax-kQsH6JU_u*En%k^NHlvBB!$JAK!cYmS)HkLAkm0*9G3!vwMIWv zo#)+EamIJHEUV|$d|<)2iJ`lqBQLx;HgD}c3mRu{iK23C>G{0Mp1K)bt6OU?xC4!_ zZLqpFzeu&+>O1F>%g-%U^~yRg(-wSp@vmD-PT#bCWy!%&H;qT7rfuRCEgw67V!Qob z&tvPU@*4*$YF#2_>M0(75QxqrJr3Tvh~iDeFhxl=MzV@(psx%G8|I{~9;tv#BBE`l z3)_98eZqFNwEF1h)uqhBmT~mSmT8k$7vSHdR97K~kM)P9PuZdS;|Op4A?O<*%!?h` zn`}r_j%xvffs46x2hCWuo0BfIQWCw9aKkH==#B(TJ%p}p-RuIVzsRlaPL_Co{&R0h zQrqn=g1PGjQg3&sc2IlKG0Io#v%@p>tFwF)RG0ahYs@Zng6}M*d}Xua)+h&?$`%rb z;>M=iMh5eIHuJ5c$aC`y@CYjbFsJnSPH&}LQz4}za9YjDuao>Z^EdL@%saRm&LGQWXs*;FzwN#pH&j~SLhDZ+QzhplV_ij(NyMl z;v|}amvxRddO81LJFa~2QFUs z+Lk zZck)}9uK^buJNMo4G(rSdX{57(7&n=Q6$QZ@lIO9#<3pA2ceDpO_340B*pHlh_y{>i&c1?vdpN1j>3UN-;;Yq?P+V5oY`4Z(|P8SwWq<)n`W@AwcQ?E9 zd5j8>FT^m=MHEWfN9jS}UHHsU`&SScib$qd0i=ky0>4dz5ADy70AeIuSzw#gHhQ_c zOp1!v6qU)@8MY+ zMNIID?(CysRc2uZQ$l*QZVY)$X?@4$VT^>djbugLQJdm^P>?51#lXBkdXglYm|4{L zL%Sr?2f`J+xrcN@=0tiJt(<-=+v>tHy{XaGj7^cA6felUn_KPa?V4ebfq7~4i~GKE zpm)e@1=E;PP%?`vK6KVPKXjUXyLS1^NbnQ&?z>epHCd+J$ktT1G&L~T)nQeExe;0Z zlei}<_ni ztFo}j7nBl$)s_3odmdafVieFxc)m!wM+U`2u%yhJ90giFcU1`dR6BBTKc2cQ*d zm-{?M&%(={xYHy?VCx!ogr|4g5;V{2q(L?QzJGsirn~kWHU`l`rHiIrc-Nan!hR7zaLsPr4uR zG{En&gaRK&B@lyWV@yfFpD_^&z>84~_0Rd!v(Nr%PJhFF_ci3D#ixf|(r@$igZiWw za*qbXIJ_Hm4)TaQ=zW^g)FC6uvyO~Hg-#Z5Vsrybz6uOTF>Rq1($JS`imyNB7myWWpxYL(t7`H8*voI3Qz6mvm z$JxtArLJ(1wlCO_te?L{>8YPzQ})xJlvc5wv8p7Z=HviPYB#^#_vGO#*`<0r%MR#u zN_mV4vaBb2RwtoOYCw)X^>r{2a0kK|WyEYoBjGxcObFl&P*??)WEWKU*V~zG5o=s@ z;rc~uuQQf9wf)MYWsWgPR!wKGt6q;^8!cD_vxrG8GMoFGOVV=(J3w6Xk;}i)9(7*U zwR4VkP_5Zx7wqn8%M8uDj4f1aP+vh1Wue&ry@h|wuN(D2W;v6b1^ z`)7XBZ385zg;}&Pt@?dunQ=RduGRJn^9HLU&HaeUE_cA1{+oSIjmj3z+1YiOGiu-H zf8u-oVnG%KfhB8H?cg%@#V5n+L$MO2F4>XoBjBeX>css^h}Omu#)ExTfUE^07KOQS znMfQY2wz?!7!{*C^)aZ^UhMZf=TJNDv8VrrW;JJ9`=|L0`w9DE8MS>+o{f#{7}B4P z{I34>342vLsP}o=ny1eZkEabr@niT5J2AhByUz&i3Ck0H*H`LRHz;>3C_ru!X+EhJ z6(+(lI#4c`2{`q0o9aZhI|jRjBZOV~IA_km7ItNtUa(Wsr*Hmb;b4=;R(gF@GmsRI`pF+0tmq0zy~wnoJD(LSEwHjTOt4xb0XB-+ z&4RO{Snw4G%gS9w#uSUK$Zbb#=jxEl;}6&!b-rSY$0M4pftat-$Q)*y!bpx)R%P>8 zrB&`YEX2%+s#lFCIV;cUFUTIR$Gn2%F(3yLeiG8eG8&)+cpBlzx4)sK?>uIlH+$?2 z9q9wk5zY-xr_fzFSGxYp^KSY0s%1BhsI>ai2VAc8&JiwQ>3RRk?ITx!t~r45qsMnj zkX4bl06ojFCMq<9l*4NHMAtIxDJOX)H=K*$NkkNG<^nl46 zHWH1GXb?Og1f0S+8-((5yaeegCT62&4N*pNQY;%asz9r9Lfr;@Bl${1@a4QAvMLbV6JDp>8SO^q1)#(o%k!QiRSd0eTmzC< zNIFWY5?)+JTl1Roi=nS4%@5iF+%XztpR^BSuM~DX9q`;Mv=+$M+GgE$_>o+~$#?*y zAcD4nd~L~EsAjXV-+li6Lua4;(EFdi|M2qV53`^4|7gR8AJI;0Xb6QGLaYl1zr&eu zH_vFUt+Ouf4SXA~ z&Hh8K@ms^`(hJfdicecj>J^Aqd00^ccqN!-f-!=N7C1?`4J+`_f^nV!B3Q^|fuU)7 z1NDNT04hd4QqE+qBP+>ZE7{v;n3OGN`->|lHjNL5w40pePJ?^Y6bFk@^k%^5CXZ<+4qbOplxpe)l7c6m%o-l1oWmCx%c6@rx85hi(F=v(2 zJ$jN>?yPgU#DnbDXPkHLeQwED5)W5sH#-eS z%#^4dxiVs{+q(Yd^ShMN3GH)!h!@W&N`$L!SbElXCuvnqh{U7lcCvHI#{ZjwnKvu~ zAeo7Pqot+Ohm{8|RJsTr3J4GjCy5UTo_u_~p)MS&Z5UrUc|+;Mc(YS+ju|m3Y_Dvt zonVtpBWlM718YwaN3a3wUNqX;7TqvAFnVUoD5v5WTh~}r)KoLUDw%8Rrqso~bJqd> z_T!&Rmr6ebpV^4|knJZ%qmzL;OvG3~A*loGY7?YS%hS{2R0%NQ@fRoEK52Aiu%gj( z_7~a}eQUh8PnyI^J!>pxB(x7FeINHHC4zLDT`&C*XUpp@s0_B^!k5Uu)^j_uuu^T> z8WW!QK0SgwFHTA%M!L`bl3hHjPp)|wL5Var_*A1-H8LV?uY5&ou{hRjj>#X@rxV>5%-9hbP+v?$4}3EfoRH;l_wSiz{&1<+`Y5%o%q~4rdpRF0jOsCoLnWY5x?V)0ga>CDo`NpqS) z@x`mh1QGkx;f)p-n^*g5M^zRTHz%b2IkLBY{F+HsjrFC9_H(=9Z5W&Eymh~A_FUJ} znhTc9KG((OnjFO=+q>JQZJbeOoUM77M{)$)qQMcxK9f;=L;IOv_J>*~w^YOW744QZ zoG;!b9VD3ww}OX<8sZ0F##8hvfDP{hpa3HjaLsKbLJ8 z0WpY2E!w?&cWi7&N%bOMZD~o7QT*$xCRJ@{t31~qx~+0yYrLXubXh2{_L699Nl_pn z6)9eu+uUTUdjHXYs#pX^L)AIb!FjjNsTp7C399w&B{Q4q%yKfmy}T2uQdU|1EpNcY zDk~(h#AdxybjfzB+mg6rdU9mDZ^V>|U13Dl$Gj+pAL}lR2a1u!SJXU_YqP9N{ose4 zk+$v}BIHX60WSGVWv;S%zvHOWdDP(-ceo(<8`y@Goy%4wDu>57QZNJc)f>Ls+}9h7 z^N=#3q3|l?aG8K#HwiW2^PJu{v|x5;awYfahC?>_af3$LmMc4%N~JwVlRZa4c+eW2 zE!zosAjOv&UeCeu;Bn5OQUC=jtZjF;NDk9$fGbxf3d29SUBekX1!a$Vmq_VK*MHQ4)eB!dQrHH)LVYNF%-t8!d`@!cb z2CsKs3|!}T^7fSZm?0dJ^JE`ZGxA&a!jC<>6_y67On0M)hd$m*RAzo_qM?aeqkm`* zXpDYcc_>TFZYaC3JV>{>mp(5H^efu!Waa7hGTAts29jjuVd1vI*fEeB?A&uG<8dLZ z(j6;-%vJ7R0U9}XkH)1g>&uptXPHBEA*7PSO2TZ+dbhVxspNW~ZQT3fApz}2 z_@0-lZODcd>dLrYp!mHn4k>>7kibI!Em+Vh*;z}l?0qro=aJt68joCr5Jo(Vk<@i) z5BCKb4p6Gdr9=JSf(2Mgr=_6}%4?SwhV+JZj3Ox^_^OrQk$B^v?eNz}d^xRaz&~ zKVnlLnK#8^y=If2f1zmb~^5lPLe?%l}>?~wN4IN((2~U{e9fKhLMtYFj)I$(y zgnKv?R+ZpxA$f)Q2l=aqE6EPTK=i0sY&MDFJp!vQayyvzh4wee<}kybNthRlX>SHh z7S}9he^EBOqzBCww^duHu!u+dnf9veG{HjW!}aT7aJqzze9K6-Z~8pZAgdm1n~aDs z8_s7?WXMPJ3EPJHi}NL&d;lZP8hDhAXf5Hd!x|^kEHu`6QukXrVdLnq5zbI~oPo?7 z2Cbu8U?$K!Z4_yNM1a(bL!GRe!@{Qom+DxjrJ!B99qu5b*Ma%^&-=6UEbC+S2zX&= zQ!%bgJTvmv^2}hhvNQg!l=kbapAgM^hruE3k@jTxsG(B6d=4thBC*4tzVpCYXFc$a zeqgVB^zua)y-YjpiibCCdU%txXYeNFnXcbNj*D?~)5AGjL+!!ij_4{5EWKGav0^={~M^q}baAFOPzxfUM>`KPf|G z&hsaR*7(M6KzTj8Z?;45zX@L#xU{4n$9Q_<-ac(y4g~S|Hyp^-<*d8+P4NHe?~vfm z@y309=`lGdvN8*jw-CL<;o#DKc-%lb0i9a3%{v&2X($|Qxv(_*()&=xD=5oBg=$B0 zU?41h9)JKvP0yR{KsHoC>&`(Uz>?_`tlLjw1&5tPH3FoB%}j;yffm$$s$C=RHi`I3*m@%CPqWnP@B~%DEe;7ZT{9!IMTo1hT3Q347HJ&!)BM2 z3~aClf>aFh0_9||4G}(Npu`9xYY1*SD|M~9!CCFn{-J$u2&Dg*=5$_nozpoD2nxqq zB!--eA8UWZlcEDp4r#vhZ6|vq^9sFvRnA9HpHch5Mq4*T)oGbruj!U8Lx_G%Lby}o zTQ-_4A7b)5A42vA0U}hUJq6&wQ0J%$`w#ph!EGmW96)@{AUx>q6E>-r^Emk!iCR+X zdIaNH`$}7%57D1FyTccs3}Aq0<0Ei{`=S7*>pyg=Kv3nrqblqZcpsCWSQl^uMSsdj zYzh73?6th$c~CI0>%5@!Ej`o)Xm38u0fp9=HE@Sa6l2oX9^^4|Aq%GA z3(AbFR9gA_2T2i%Ck5V2Q2WW-(a&(j#@l6wE4Z`xg#S za#-UWUpU2U!TmIo`CN0JwG^>{+V#9;zvx;ztc$}@NlcyJr?q(Y`UdW6qhq!aWyB5xV1#Jb{I-ghFNO0 zFU~+QgPs{FY1AbiU&S$QSix>*rqYVma<-~s%ALhFyVhAYepId1 zs!gOB&weC18yhE-v6ltKZMV|>JwTX+X)Y_EI(Ff^3$WTD|Ea-1HlP;6L~&40Q&5{0 z$e$2KhUgH8ucMJxJV#M%cs!d~#hR^nRwk|uuCSf6irJCkSyI<%CR==tftx6d%;?ef zYIcjZrP@APzbtOeUe>m-TW}c-ugh+U*RbL1eIY{?>@8aW9bb1NGRy@MTse@>= za%;5=U}X%K2tKTYe9gjMcBvX%qrC&uZ`d(t)g)X8snf?vBe3H%dG=bl^rv8Z@YN$gd9yveHY0@Wt0$s zh^7jCp(q+6XDoekb;=%y=Wr8%6;z0ANH5dDR_VudDG|&_lYykJaiR+(y{zpR=qL3|2e${8 z2V;?jgHj7}Kl(d8C9xWRjhpf_)KOXl+@c4wrHy zL3#9U(`=N59og2KqVh>nK~g9>fX*PI0`>i;;b6KF|8zg+k2hViCt}4dfMdvb1NJ-Rfa7vL2;lPK{Lq*u`JT>S zoM_bZ_?UY6oV6Ja14X^;LqJPl+w?vf*C!nGK;uU^0GRN|UeFF@;H(Hgp8x^|;ygh? zIZx3DuO(lD01ksanR@Mn#lti=p28RTNYY6yK={RMFiVd~k8!@a&^jicZ&rxD3CCI! zVb=fI?;c#f{K4Pp2lnb8iF2mig)|6JEmU86Y%l}m>(VnI*Bj`a6qk8QL&~PFDxI8b z2mcsQBe9$q`Q$LfG2wdvK`M1}7?SwLAV&)nO;kAk`SAz%x9CDVHVbUd$O(*aI@D|s zLxJW7W(QeGpQY<$dSD6U$ja(;Hb3{Zx@)*fIQaW{8<$KJ&fS0caI2Py^clOq9@Irt z7th7F?7W`j{&UmM==Lo~T&^R7A?G=K_e-zfTX|)i`pLitlNE(~tq*}sS1x2}Jlul6 z5+r#4SpQu8h{ntIv#qCVH`uG~+I8l+7ZG&d`Dm!+(rZQDV*1LS^WfH%-!5aTAxry~ z4xl&rot5ct{xQ$w$MtVTUi6tBFSJWq2Rj@?HAX1H$eL*fk{Hq;E`x|hghRkipYNyt zKCO=*KSziiVk|+)qQCGrTYH9X!Z0$k{Nde~0Wl`P{}ca%nv<6fnYw^~9dYxTnTZB&&962jX0DM&wy&8fdxX8xeHSe=UU&Mq zRTaUKnQO|A>E#|PUo+F=Q@dMdt`P*6e92za(TH{5C*2I2S~p?~O@hYiT>1(n^Lqqn zqewq3ctAA%0E)r53*P-a8Ak32mGtUG`L^WVcm`QovX`ecB4E9X60wrA(6NZ7z~*_DV_e z8$I*eZ8m=WtChE{#QzeyHpZ%7GwFHlwo2*tAuloI-j2exx3#x7EL^&D;Re|Kj-XT- zt908^soV2`7s+Hha!d^#J+B)0-`{qIF_x=B811SZlbUe%kvPce^xu7?LY|C z@f1gRPha1jq|=f}Se)}v-7MWH9)YAs*FJ&v3ZT9TSi?e#jarin0tjPNmxZNU_JFJG z+tZi!q)JP|4pQ)?l8$hRaPeoKf!3>MM-bp06RodLa*wD=g3)@pYJ^*YrwSIO!SaZo zDTb!G9d!hb%Y0QdYxqNSCT5o0I!GDD$Z@N!8J3eI@@0AiJmD7brkvF!pJGg_AiJ1I zO^^cKe`w$DsO|1#^_|`6XTfw6E3SJ(agG*G9qj?JiqFSL|6tSD6vUwK?Cwr~gg)Do zp@$D~7~66-=p4`!!UzJDKAymb!!R(}%O?Uel|rMH>OpRGINALtg%gpg`=}M^Q#V5( zMgJY&gF)+;`e38QHI*c%B}m94o&tOfae;og&!J2;6ENW}QeL73jatbI1*9X~y=$Dm%6FwDcnCyMRL}zo`0=y7=}*Uw zo3!qZncAL{HCgY!+}eKr{P8o27ye+;qJP;kOB%RpSesGoHLT6tcYp*6v~Z9NCyb6m zP#qds0jyqXX46qMNhXDn3pyIxw2f_z;L_X9EIB}AhyC`FYI}G3$WnW>#NMy{0aw}nB%1=Z4&*(FaCn5QG(zvdG^pQRU25;{wwG4h z@kuLO0F->{@g2!;NNd!PfqM-;@F0;&wK}0fT9UrH}(8A5I zt33(+&U;CLN|8+71@g z(s!f-kZZZILUG$QXm9iYiE*>2w;gpM>lgM{R9vT3q>qI{ELO2hJHVi`)*jzOk$r)9 zq}$VrE0$GUCm6A3H5J-=Z9i*biw8ng zi<1nM0lo^KqRY@Asucc#DMmWsnCS;5uPR)GL3pL=-IqSd>4&D&NKSGHH?pG;=Xo`w zw~VV9ddkwbp~m>9G0*b?j7-0fOwR?*U#BE#n7A=_fDS>`fwatxQ+`FzhBGQUAyIRZ??eJt46vHBlR>9m!vfb6I)8!v6TmtZ%G6&E|1e zOtx5xy%yOSu+<9Ul5w5N=&~4Oph?I=ZKLX5DXO(*&Po>5KjbY7s@tp$8(fO|`Xy}Y z;NmMypLoG7r#Xz4aHz7n)MYZ7Z1v;DFHLNV{)to;(;TJ=bbMgud96xRMME#0d$z-S z-r1ROBbW^&YdQWA>U|Y>{whex#~K!ZgEEk=LYG8Wqo28NFv)!t!~}quaAt}I^y-m| z8~E{9H2VnyVxb_wCZ7v%y(B@VrM6lzk~|ywCi3HeiSV`TF>j+Ijd|p*kyn;=mqtf8&DK^|*f+y$38+9!sis9N=S)nINm9=CJ<;Y z!t&C>MIeyou4XLM*ywT_JuOXR>VkpFwuT9j5>667A=CU*{TBrMTgb4HuW&!%Yt`;#md7-`R`ouOi$rEd!ErI zo#>qggAcx?C7`rQ2;)~PYCw%CkS(@EJHZ|!!lhi@Dp$*n^mgrrImsS~(ioGak>3)w zvop0lq@IISuA0Ou*#1JkG{U>xSQV1e}c)!d$L1plFX5XDXX5N7Ns{kT{y5|6MfhBD+esT)e7&CgSW8FxsXTAY=}?0A!j_V9 zJ;IJ~d%av<@=fNPJ9)T3qE78kaz64E>dJaYab5uaU`n~Zdp2h{8DV%SKE5G^$LfuOTRRjB;TnT(Jk$r{Pfe4CO!SM_7d)I zquW~FVCpSycJ~c*B*V8?Qqo=GwU8CkmmLFugfHQ7;A{yCy1OL-+X=twLYg9|H=~8H znnN@|tCs^ZLlCBl5wHvYF}2vo>a6%mUWpTds_mt*@wMN4-r`%NTA%+$(`m6{MNpi@ zMx)8f>U4hd!row@gM&PVo&Hx+lV@$j9yWTjTue zG9n0DP<*HUmJ7ZZWwI2x+{t3QEfr6?T}2iXl=6e0b~)J>X3`!fXd9+2wc1%cj&F@Z zgYR|r5Xd5jy9;YW&=4{-0rJ*L5CgDPj9^3%bp-`HkyBs`j1iTUGD4?WilZ6RO8mIE z+~Joc?GID6K96dyuv(dWREK9Os~%?$$FxswxQsoOi8M?RnL%B~Lyk&(-09D0M?^Jy zWjP)n(b)TF<-|CG%!Vz?8Fu&6iU<>oG#kGcrcrrBlfZMVl0wOJvsq%RL9To%iCW@)#& zZAJWhgzYAq)#NTNb~3GBcD%ZZOc43!YWSyA7TD6xkk)n^FaRAz73b}%9d&YisBic(?mv=Iq^r%Ug zzHq-rRrhfOOF+yR=AN!a9*Rd#sM9ONt5h~w)yMP7Dl9lfpi$H0%GPW^lS4~~?vI8Z z%^ToK#NOe0ExmUsb`lLO$W*}yXNOxPe@zD*90uTDULnH6C?InP3J=jYEO2d)&e|mP z1DSd0QOZeuLWo*NqZzopA+LXy9)fJC00NSX=_4Mi1Z)YyZVC>C!g}cY(Amaj%QN+bev|Xxd2OPD zk!dfkY6k!(sDBvsFC2r^?}hb81(WG5Lt9|riT`2?P;B%jaf5UX<~OJ;uAL$=Ien+V zC!V8u0v?CUa)4*Q+Q_u zkx{q;NjLcvyMuU*{+uDsCQ4U{JLowYby-tn@hatL zy}X>9y08#}oytdn^qfFesF)Tt(2!XGw#r%?7&zzFFh2U;#U9XBO8W--#gOpfbJ`Ey z|M8FCKlWQrOJwE;@Sm02l9OBr7N}go4V8ur)}M@m2uWjggb)DC4s`I4d7_8O&E(j; z?3$9~R$QDxNM^rNh9Y;6P7w+bo2q}NEd6f&_raor-v`UCaTM3TT8HK2-$|n{N@U>_ zL-`P7EXoEU5JRMa)?tNUEe8XFis+w8g9k(QQ)%?&Oac}S`2V$b?%`DwXBgja&&fR@ zH_XidF$p1wA)J|Wk1;?lCl?fgc)=TB3>Y8;BoMqHwJqhL)Tgydv9(?(TBX)fq%=~C zmLj!iX-kn7QA(9snzk0LRf<%SzO&~IhLor6A3f*U^UcoAygRe!H#@UCv$JUP&vPxs zeDj$1%#<2T1!e|!7xI+~_VXLl5|jHqvOhU7ZDUGee;HnkcPP=_k_FFxPjXg*9KyI+ zIh0@+s)1JDSuKMeaDZ3|<_*J8{TUFDLl|mXmY8B>Wj_?4mC#=XjsCKPEO=p0c&t&Z zd1%kHxR#o9S*C?du*}tEHfAC7WetnvS}`<%j=o7YVna)6pw(xzkUi7f#$|^y4WQ{7 zu@@lu=j6xr*11VEIY+`B{tgd(c3zO8%nGk0U^%ec6h)G_`ki|XQXr!?NsQkxzV6Bn1ea9L+@ z(Zr7CU_oXaW>VOdfzENm+FlFQ7Se0ROrNdw(QLvb6{f}HRQ{$Je>(c&rws#{dFI^r zZ4^(`J*G0~Pu_+p5AAh>RRpkcbaS2a?Fe&JqxDTp`dIW9;DL%0wxX5;`KxyA4F{(~_`93>NF@bj4LF!NC&D6Zm+Di$Q-tb2*Q z&csGmXyqA%Z9s(AxNO3@Ij=WGt=UG6J7F;r*uqdQa z?7j!nV{8eQE-cwY7L(3AEXF3&V*9{DpSYdyCjRhv#&2johwf{r+k`QB81%!aRVN<& z@b*N^xiw_lU>H~@4MWzgHxSOGVfnD|iC7=hf0%CPm_@@4^t-nj#GHMug&S|FJtr?i z^JVrobltd(-?Ll>)6>jwgX=dUy+^n_ifzM>3)an3iOzpG9Tu;+96TP<0Jm_PIqof3 zMn=~M!#Ky{CTN_2f7Y-i#|gW~32RCWKA4-J9sS&>kYpTOx#xVNLCo)A$LUme^fVNH z@^S7VU^UJ0YR8?Oy$^IYuG*bm|g;@aX~i60%`7XLy*AYpYvZ^F^U(!|RW z*C!rJ@+7TGdL=nNd1gv^%B+;Fcr$y)i0!GRsZXRHPs>QVGVR{9r_#&Qd(wL|5;H;> zD>HUw=4CF++&{7$<8G@j*nGjhEO%BQYfjeItp4mPvY*JYb1HKd!{HJ9*)(3%BR%{Pp?AM&*yHAJsW({ivOzj*qS!-7|XEn6@zo z3L*tBT%<4RxoAh>q{0n_JBmgW6&8hx?kL(_^k%VL>?xjAyrKBmSl`$=V|SK}ELl}@ zd|d0eo#RfG`bw9SK3%r4Y+rdvc}w}~ixV%tqawbdqvE-WcgE+BUpxMT%F@btm76MG zn=oQRWWuTm+a{dy)Oc2V4yX(@M{QAkx>(QB59*`dLT`Pz3Lsj9iB=HSHAiCq()ns|Cr)1*c605Cx}3V&x}Lg?b+6Q?)z7Kl zQh&1Hx`y6JY-Cwvd*ozeps}a1xAA0CR+Da;+O(i)P1C;SjOI}Dtmf6tPqo-Bl`U78 zv$kYgPntPp@G)n1an9tEoL*Vumu9`>_@I(;+5+fBa-*?fEx=mTEjZ7wq}#@Gd5_cW z!mP{N=yqEntDo)|>oy6{9cu+-3*GTnmb^`O0^FzRPO^&aG`f@F_R*aQ_e{F+_9%NW z4KG_B`@X3EVV9L>?_RNDMddA>w=e0KfAiw5?#i1NFT%Zz#nuv(&!yIU>lVxmzYKQ` zzJ*0w9<&L4aJ6A;0j|_~i>+y(q-=;2Xxhx2v%CYY^{} z^J@LO()eLo|7!{ghQ+(u$wxO*xY#)cL(|miH2_ck2yN{mu4O9=hBW*pM_()-_YdH#Ru{JtwJ^R2}3?!>>m1pohh zrn(!xCjE0Q&EH1QK?zA%sxVh&H99cObJUY$veZhQ)MLu-h%`!*G)s$2k;~+A z)Kk->Ri?`oGDEJEtI*wijm(s5f$W78FH{+qBxiU{~kq((J3uK{m z$|C8K#j-?hm8H@x%VfFqpnvu@xn1s%J7uNZC9C99a<_b1J|mx%)$%!6gPU|~<@2&m zz99GDp`|a%m*iggvfL;4%X;~WY>)@!tMWB@P`)k?$;0x9JSrRI8?s3rlgH(o@`OAo zn{f*gZ#t2u6K??hx|aElOM`Xd0t+SAIUEHvFw%?Wsm$s zUXq{6UU?a>Nc@@Xlb_2k9M1Ctr<#+O?yd}rv z_wu&=_t$!Yngd@N_AUj}T; z#*Ce|%XZr_sQcsWcsl{pCnnj+c8ZNIMmx<;w=-g$Q>BU;9k;w|zQ;4!W32Xg2Cd?{ zvmO3kuKQ^Hv;o>6ZHP8ZJ2`4~Bx?N;cf<0fi=!*G^^WzbTF3e$b&d^qqB{>nqLG81 zs94bBh%|Vj+hLu=!8(b9brJ>ZBns9^6s(gdSVyP9qnu2_I{Sg8j-rloG6{d`De5We zDe5WeY3ga}Y3ga}Y3ga}Y3ga}Y3ga}d8y~6o|k%F>UpW>rJk31Ug~+N=cS&HdOqs; zsOO`ek9t1p`Kafko{xGy>iMbXr=FjBxZMYc8a#gL`Kjlpo}YSt>iMY`pk9DF0qO*( z6QE9jIsxhgs1u-0kUBx8D@eT{^@7w3QZGooAoYUO3sNscy%6<6)C*BBM7L`dk$Xk%6}eZQXgo#!75P`>Uy*-B{uTLGUy*-B{uTLGUy*-B{uTLG))v8{5gt_uj9!t5)^yb-JtjRGrhi zYInOUNJxNyf_yKX01)K=WP|Si>HqEj|B{eUl?MR<)%<1&{(~)D+NPwKxWqT-@~snp zg9KCz1VTZDiS?UH`PRk1VPM{29cgT9=D?!Wc_@}qzggFv;gb@2cJQAYWWtpEZ7?y@jSVqjx${B5UV@SO|wH<<0; z{><1KdVI%Ki}>~<`46C0AggwUwx-|QcU;iiZ{NZu`ur>hd*|Hb(|6veERqxu=b@5Bab=rqptGxd{QJg!4*-i_$sES~)AB46}Fjg|ea#e@?J}z%CUJ zOsLWRQR1#ng^sD)A4FDuY!iUhzlgfJh(J@BRqd&P#v2B`+saBx>m+M&q7vk-75$NH%T5pi%m z5FX?`2-5l53=a&GkC9^NZCLpN5(DMKMwwab$FDIs?q>4!!xBS}75gX_5;(luk;3Vl zLCLd5a_8`Iyz}K}+#RMwu6DVk3O_-}n>aE!4NaD*sQn`GxY?cHe!Bl9n?u&g6?aKm z-P8z&;Q3gr;h`YIxX%z^o&GZZg1=>_+hP2$$-DnL_?7?3^!WAsY4I7|@K;aL<>OTK zByfjl2PA$T83*LM9(;espx-qB%wv7H2i6CFsfAg<9V>Pj*OpwX)l?^mQfr$*OPPS$ z=`mzTYs{*(UW^ij1U8UfXjNoY7GK*+YHht(2oKE&tfZuvAyoN(;_OF>-J6AMmS5fB z^sY6wea&&${+!}@R1f$5oC-2J>J-A${@r(dRzc`wnK>a7~8{Y-scc|ETOI8 zjtNY%Y2!PI;8-@a=O}+{ap1Ewk0@T`C`q!|=KceX9gK8wtOtIC96}-^7)v23Mu;MH zhKyLGOQMujfRG$p(s`(2*nP4EH7*J57^=|%t(#PwCcW7U%e=8Jb>p6~>RAlY4a*ts=pl}_J{->@kKzxH|8XQ5{t=E zV&o`$D#ZHdv&iZWFa)(~oBh-Osl{~CS0hfM7?PyWUWsr5oYlsyC1cwULoQ4|Y5RHA2*rN+EnFPnu z`Y_&Yz*#550YJwDy@brZU>0pWV^RxRjL221@2ABq)AtA%Cz?+FG(}Yh?^v)1Lnh%D zeM{{3&-4#F9rZhS@DT0E(WRkrG!jC#5?OFjZv*xQjUP~XsaxL2rqRKvPW$zHqHr8Urp2Z)L z+)EvQeoeJ8c6A#Iy9>3lxiH3=@86uiTbnnJJJoypZ7gco_*HvKOH97B? zWiwp>+r}*Zf9b3ImxwvjL~h~j<<3shN8$k-$V1p|96I!=N6VBqmb==Bec|*;HUg?) z4!5#R*(#Fe)w%+RH#y{8&%%!|fQ5JcFzUE;-yVYR^&Ek55AXb{^w|@j|&G z|6C-+*On%j;W|f8mj?;679?!qY86c{(s1-PI2Wahoclf%1*8%JAvRh1(0)5Vu37Iz z`JY?RW@qKr+FMmBC{TC7k@}fv-k8t6iO}4K-i3WkF!Lc=D`nuD)v#Na zA|R*no51fkUN3^rmI;tty#IK284*2Zu!kG13!$OlxJAt@zLU`kvsazO25TpJLbK&;M8kw*0)*14kpf*)3;GiDh;C(F}$- z1;!=OBkW#ctacN=je*Pr)lnGzX=OwgNZjTpVbFxqb;8kTc@X&L2XR0A7oc!Mf2?u9 zcctQLCCr+tYipa_k=;1ETIpHt!Jeo;iy^xqBES^Ct6-+wHi%2g&)?7N^Yy zUrMIu){Jk)luDa@7We5U!$$3XFNbyRT!YPIbMKj5$IEpTX1IOtVP~(UPO2-+9ZFi6 z-$3<|{Xb#@tABt0M0s1TVCWKwveDy^S!!@4$s|DAqhsEv--Z}Dl)t%0G>U#ycJ7cy z^8%;|pg32=7~MJmqlC-x07Sd!2YX^|2D`?y;-$a!rZ3R5ia{v1QI_^>gi(HSS_e%2 zUbdg^zjMBBiLr8eSI^BqXM6HKKg#@-w`a**w(}RMe%XWl3MipvBODo*hi?+ykYq)z ziqy4goZw0@VIUY65+L7DaM5q=KWFd$;W3S!Zi>sOzpEF#(*3V-27N;^pDRoMh~(ZD zJLZXIam0lM7U#)119Hm947W)p3$%V`0Tv+*n=&ybF&}h~FA}7hEpA&1Y!BiYIb~~D z$TSo9#3ee02e^%*@4|*+=Nq6&JG5>zX4k5f?)z*#pI-G(+j|jye%13CUdcSP;rNlY z#Q!X%zHf|V)GWIcEz-=fW6AahfxI~y7w7i|PK6H@@twdgH>D_R@>&OtKl}%MuAQ7I zcpFmV^~w~8$4@zzh~P~+?B~%L@EM3x(^KXJSgc6I=;)B6 zpRco2LKIlURPE*XUmZ^|1vb?w*ZfF}EXvY13I4af+()bAI5V?BRbFp`Sb{8GRJHd* z4S2s%4A)6Uc=PK%4@PbJ<{1R6+2THMk0c+kif**#ZGE)w6WsqH z`r^DL&r8|OEAumm^qyrryd(HQ9olv$ltnVGB{aY?_76Uk%6p;e)2DTvF(;t=Q+|8b zqfT(u5@BP);6;jmRAEV057E*2d^wx@*aL1GqWU|$6h5%O@cQtVtC^isd%gD7PZ_Io z_BDP5w(2*)Mu&JxS@X%%ByH_@+l>y07jIc~!@;Raw)q_;9oy@*U#mCnc7%t85qa4? z%_Vr5tkN^}(^>`EFhag;!MpRh!&bKnveQZAJ4)gEJo1@wHtT$Gs6IpznN$Lk-$NcM z3ReVC&qcXvfGX$I0nfkS$a|Pm%x+lq{WweNc;K>a1M@EAVWs2IBcQPiEJNt}+Ea8~WiapASoMvo(&PdUO}AfC~>ZGzqWjd)4no( ziLi#e3lOU~sI*XPH&n&J0cWfoh*}eWEEZW%vX?YK!$?w}htY|GALx3;YZoo=JCF4@ zdiaA-uq!*L5;Yg)z-_`MciiIwDAAR3-snC4V+KA>&V%Ak;p{1u>{Lw$NFj)Yn0Ms2*kxUZ)OTddbiJM}PK!DM}Ot zczn?EZXhx3wyu6i{QMz_Ht%b?K&-@5r;8b076YDir`KXF0&2i9NQ~#JYaq*}Ylb}^ z<{{6xy&;dQ;|@k_(31PDr!}}W$zF7Jv@f%um0M$#=8ygpu%j(VU-d5JtQwT714#f0z+Cm$F9JjGr_G!~NS@L9P;C1? z;Ij2YVYuv}tzU+HugU=f9b1Wbx3418+xj$RKD;$gf$0j_A&c;-OhoF*z@DhEW@d9o zbQBjqEQnn2aG?N9{bmD^A#Um6SDKsm0g{g_<4^dJjg_l_HXdDMk!p`oFv8+@_v_9> zq;#WkQ!GNGfLT7f8m60H@$tu?p;o_It#TApmE`xnZr|_|cb3XXE)N^buLE`9R=Qbg zXJu}6r07me2HU<)S7m?@GzrQDTE3UH?FXM7V+-lT#l}P(U>Fvnyw8T7RTeP`R579m zj=Y>qDw1h-;|mX-)cSXCc$?hr;43LQt)7z$1QG^pyclQ1Bd!jbzsVEgIg~u9b38;> zfsRa%U`l%did6HzPRd;TK{_EW;n^Ivp-%pu0%9G-z@Au{Ry+EqEcqW=z-#6;-!{WA z;l+xC6Zke>dl+(R1q7B^Hu~HmrG~Kt575mzve>x*cL-shl+zqp6yuGX)DDGm`cid! znlnZY=+a5*xQ=$qM}5$N+o!^(TqTFHDdyCcL8NM4VY@2gnNXF|D?5a558Lb*Yfm4) z_;0%2EF7k{)i(tTvS`l5he^KvW%l&-suPwpIlWB_Za1Hfa$@J!emrcyPpTKKM@NqL z?X_SqHt#DucWm<3Lp}W|&YyQE27zbGP55=HtZmB(k*WZA79f##?TweCt{%5yuc+Kx zgfSrIZI*Y57FOD9l@H0nzqOu|Bhrm&^m_RK6^Z<^N($=DDxyyPLA z+J)E(gs9AfaO`5qk$IGGY+_*tEk0n_wrM}n4G#So>8Dw6#K7tx@g;U`8hN_R;^Uw9JLRUgOQ?PTMr4YD5H7=ryv)bPtl=<&4&% z*w6k|D-%Tg*F~sh0Ns(h&mOQ_Qf{`#_XU44(VDY8b})RFpLykg10uxUztD>gswTH} z&&xgt>zc(+=GdM2gIQ%3V4AGxPFW0*l0YsbA|nFZpN~ih4u-P!{39d@_MN)DC%d1w z7>SaUs-g@Hp7xqZ3Tn)e z7x^sC`xJ{V<3YrmbB{h9i5rdancCEyL=9ZOJXoVHo@$$-%ZaNm-75Z-Ry9Z%!^+STWyv~To>{^T&MW0-;$3yc9L2mhq z;ZbQ5LGNM+aN628)Cs16>p55^T^*8$Dw&ss_~4G5Go63gW^CY+0+Z07f2WB4Dh0^q z-|6QgV8__5>~&z1gq0FxDWr`OzmR}3aJmCA^d_eufde7;d|OCrKdnaM>4(M%4V`PxpCJc~UhEuddx9)@)9qe_|i z)0EA%&P@_&9&o#9eqZCUCbh?`j!zgih5sJ%c4(7_#|Xt#r7MVL&Q+^PQEg3MBW;4T zG^4-*8L%s|A}R%*eGdx&i}B1He(mLygTmIAc^G(9Si zK7e{Ngoq>r-r-zhyygK)*9cj8_%g z)`>ANlipCdzw(raeqP-+ldhyUv_VOht+!w*>Sh+Z7(7(l=9~_Vk ztsM|g1xW`?)?|@m2jyAgC_IB`Mtz(O`mwgP15`lPb2V+VihV#29>y=H6ujE#rdnK` zH`EaHzABs~teIrh`ScxMz}FC**_Ii?^EbL(n90b(F0r0PMQ70UkL}tv;*4~bKCiYm zqngRuGy`^c_*M6{*_~%7FmOMquOEZXAg1^kM`)0ZrFqgC>C%RJvQSo_OAA(WF3{euE}GaeA?tu5kF@#62mM$a051I zNhE>u>!gFE8g#Jj95BqHQS%|>DOj71MZ?EYfM+MiJcX?>*}vKfGaBfQFZ3f^Q-R1# znhyK1*RvO@nHb|^i4Ep_0s{lZwCNa;Ix<{E5cUReguJf+72QRZIc%`9-Vy)D zWKhb?FbluyDTgT^naN%l2|rm}oO6D0=3kfXO2L{tqj(kDqjbl(pYz9DykeZlk4iW5 zER`)vqJxx(NOa;so@buE!389-YLbEi@6rZG0#GBsC+Z0fzT6+d7deYVU;dy!rPXiE zmu73@Jr&~K{-9MVQD}&`)e>yLNWr>Yh8CXae9XqfvVQ&eC_;#zpoaMxZ0GpZz7xjx z`t_Q-F?u=vrRPaj3r<9&t6K=+egimiJ8D4gh-rUYvaVy zG($v+3zk5sMuOhjxkH7bQ}(5{PD3Mg?!@8PkK&w>n7tO8FmAmoF30_#^B~c(Q_`4L zYWOoDVSnK|1=p{+@`Fk^Qb81Xf89_S`RSTzv(a4ID%71nll%{Wad$!CKfeTKkyC?n zCkMKHU#*nz_(tO$M)UP&ZfJ#*q(0Gr!E(l5(ce<3xut+_i8XrK8?Xr7_oeHz(bZ?~8q5q~$Rah{5@@7SMN zx9PnJ-5?^xeW2m?yC_7A#WK*B@oIy*Y@iC1n7lYKj&m7vV;KP4TVll=II)$39dOJ^czLRU>L> z68P*PFMN+WXxdAu=Hyt3g$l(GTeTVOZYw3KY|W0Fk-$S_`@9`K=60)bEy?Z%tT+Iq z7f>%M9P)FGg3EY$ood+v$pdsXvG? zd2q3abeu-}LfAQWY@=*+#`CX8RChoA`=1!hS1x5dOF)rGjX4KFg!iPHZE2E=rv|A} zro(8h38LLFljl^>?nJkc+wdY&MOOlVa@6>vBki#gKhNVv+%Add{g6#-@Z$k*ps}0Y zQ=8$)+Nm||)mVz^aa4b-Vpg=1daRaOU)8@BY4jS>=5n#6abG@(F2`=k-eQ9@u# zxfNFHv=z2w@{p1dzSOgHokX1AUGT0DY4jQI@YMw)EWQ~q5wmR$KQ}Y;(HPMSQCwzu zdli|G?bj(>++CP)yQ4s6YfpDc3KqPmquQSxg%*EnTWumWugbDW5ef%8j-rT#3rJu? z)5n;4b2c*;2LIW%LmvUu6t1~di~}0&Svy}QX#ER|hDFZwl!~zUP&}B1oKAxIzt~so zb!GaJYOb#&qRUjEI1xe_`@7qv_-LggQ$JE8+{ryT4%ldwC5ete+{G3C#g@^oxfY3#F zcLlj(l2G8>tC<5XWV|6_DZQZ7ow?MD8EZ9mM2oV~WoV-uoExmbwpzc6eMV}%J_{3l zW(4t2a-o}XRlU|NSiYn!*nR(Sc>*@TuU*(S77gfCi7+WR%2b;4#RiyxWR3(u5BIdf zo@#g4wQjtG3T$PqdX$2z8Zi|QP~I^*9iC+(!;?qkyk&Q7v>DLJGjS44q|%yBz}}>i z&Ve%^6>xY<=Pi9WlwpWB%K10Iz`*#gS^YqMeV9$4qFchMFO}(%y}xs2Hn_E}s4=*3 z+lAeCKtS}9E{l(P=PBI;rsYVG-gw}-_x;KwUefIB@V%RLA&}WU2XCL_?hZHoR<7ED zY}4#P_MmX(_G_lqfp=+iX|!*)RdLCr-1w`4rB_@bI&Uz# z!>9C3&LdoB$r+O#n);WTPi;V52OhNeKfW6_NLnw zpFTuLC^@aPy~ZGUPZr;)=-p|b$-R8htO)JXy{ecE5a|b{{&0O%H2rN&9(VHxmvNly zbY?sVk}@^{aw)%#J}|UW=ucLWs%%j)^n7S%8D1Woi$UT}VuU6@Sd6zc2+t_2IMBxd zb4R#ykMr8s5gKy=v+opw6;4R&&46$V+OOpDZwp3iR0Osqpjx))joB*iX+diVl?E~Q zc|$qmb#T#7Kcal042LUNAoPTPUxF-iGFw>ZFnUqU@y$&s8%h-HGD`EoNBbe#S>Y-4 zlkeAP>62k~-N zHQqXXyN67hGD6CxQIq_zoepU&j0 zYO&}<4cS^2sp!;5))(aAD!KmUED#QGr48DVlwbyft31WlS2yU<1>#VMp?>D1BCFfB z_JJ-kxTB{OLI}5XcPHXUo}x~->VP%of!G_N-(3Snvq`*gX3u0GR&}*fFwHo3-vIw0 zeiWskq3ZT9hTg^je{sC^@+z3FAd}KNhbpE5RO+lsLgv$;1igG7pRwI|;BO7o($2>mS(E z$CO@qYf5i=Zh6-xB=U8@mR7Yjk%OUp;_MMBfe_v1A(Hqk6!D})x%JNl838^ZA13Xu zz}LyD@X2;5o1P61Rc$%jcUnJ>`;6r{h5yrEbnbM$$ntA@P2IS1PyW^RyG0$S2tUlh z8?E(McS?7}X3nAAJs2u_n{^05)*D7 zW{Y>o99!I9&KQdzgtG(k@BT|J*;{Pt*b|?A_})e98pXCbMWbhBZ$t&YbNQOwN^=F) z_yIb_az2Pyya2530n@Y@s>s>n?L79;U-O9oPY$==~f1gXro5Y z*3~JaenSl_I}1*&dpYD?i8s<7w%~sEojqq~iFnaYyLgM#so%_ZZ^WTV0`R*H@{m2+ zja4MX^|#>xS9YQo{@F1I)!%RhM{4ZUapHTKgLZLcn$ehRq(emb8 z9<&Nx*RLcS#)SdTxcURrJhxPM2IBP%I zf1bWu&uRf{60-?Gclb5(IFI*!%tU*7d`i!l@>TaHzYQqH4_Y*6!Wy0d-B#Lz7Rg3l zqKsvXUk9@6iKV6#!bDy5n&j9MYpcKm!vG7z*2&4G*Yl}iccl*@WqKZWQSJCgQSj+d ze&}E1mAs^hP}>`{BJ6lv*>0-ft<;P@`u&VFI~P3qRtufE11+|#Y6|RJccqo27Wzr}Tp|DH z`G4^v)_8}R24X3}=6X&@Uqu;hKEQV^-)VKnBzI*|Iskecw~l?+R|WKO*~(1LrpdJ? z0!JKnCe<|m*WR>m+Qm+NKNH<_yefIml z+x32qzkNRrhR^IhT#yCiYU{3oq196nC3ePkB)f%7X1G^Ibog$ZnYu4(HyHUiFB`6x zo$ty-8pknmO|B9|(5TzoHG|%>s#7)CM(i=M7Nl=@GyDi-*ng6ahK(&-_4h(lyUN-oOa$` zo+P;C4d@m^p9J4c~rbi$rq9nhGxayFjhg+Rqa{l#`Y z!(P6K7fK3T;y!VZhGiC#)|pl$QX?a)a9$(4l(usVSH>2&5pIu5ALn*CqBt)9$yAl; z-{fOmgu><7YJ5k>*0Q~>lq72!XFX6P5Z{vW&zLsraKq5H%Z26}$OKDMv=sim;K?vsoVs(JNbgTU8-M%+ zN(+7Xl}`BDl=KDkUHM9fLlV)gN&PqbyX)$86!Wv!y+r*~kAyjFUKPDWL3A)m$@ir9 zjJ;uQV9#3$*`Dqo1Cy5*;^8DQcid^Td=CivAP+D;gl4b7*xa9IQ-R|lY5tIpiM~9- z%Hm9*vDV@_1FfiR|Kqh_5Ml0sm?abD>@peo(cnhiSWs$uy&$RYcd+m`6%X9FN%?w}s~Q=3!pJzbN~iJ}bbM*PPi@!E0eN zhKcuT=kAsz8TQo76CMO+FW#hr6da({mqpGK2K4T|xv9SNIXZ}a=4_K5pbz1HE6T}9 zbApW~m0C`q)S^F}B9Kw5!eT)Bj_h9vlCX8%VRvMOg8PJ*>PU>%yt-hyGOhjg!2pZR4{ z=VR_*?Hw|aai##~+^H>3p$W@6Zi`o4^iO2Iy=FPdEAI58Ebc~*%1#sh8KzUKOVHs( z<3$LMSCFP|!>fmF^oESZR|c|2JI3|gucuLq4R(||_!8L@gHU8hUQZKn2S#z@EVf3? zTroZd&}JK(mJLe>#x8xL)jfx$6`okcHP?8i%dW?F%nZh=VJ)32CmY;^y5C1^?V0;M z<3!e8GZcPej-h&-Osc>6PU2f4x=XhA*<_K*D6U6R)4xbEx~{3*ldB#N+7QEXD^v=I z+i^L+V7_2ld}O2b-(#bmv*PyZI4|U#Q5|22a(-VLOTZc3!9ns1RI-? zA<~h|tPH0y*bO1#EMrsWN>4yJM7vqFZr?uw$H8*PhiHRQg1U9YoscX-G|gck+SSRX!(e7@~eeUEw+POsT;=W9J&=EV`cUc{PIg_#TQVGnZsQbCs7#Q-)v#BicxLw#Fb?#)8TYbu zN)5R=MI1i7FHhF|X}xEl=sW~`-kf;fOR^h1yjthSw?%#F{HqrY2$q>7!nbw~nZ8q9 zh{vY! z%i=H!!P&wh z7_E%pB7l5)*VU>_O-S~d5Z!+;f{pQ4e86*&);?G<9*Q$JEJ!ZxY;Oj5&@^eg0Zs!iLCAR`2K?MSFzjX;kHD6)^`&=EZOIdW>L#O`J zf~$M4}JiV}v6B-e{NUBGFgj-*H%NG zfY0X(@|S8?V)drF;2OQcpDl2LV=~=%gGx?_$fbSsi@%J~taHcMTLLpjNF8FkjnjyM zW;4sSf6RHaa~LijL#EJ0W2m!BmQP(f=%Km_N@hsBFw%q#7{Er?y1V~UEPEih87B`~ zv$jE%>Ug9&=o+sZVZL7^+sp)PSrS;ZIJac4S-M>#V;T--4FXZ*>CI7w%583<{>tb6 zOZ8gZ#B0jplyTbzto2VOs)s9U%trre`m=RlKf{I_Nwdxn(xNG%zaVNurEYiMV3*g| z``3;{j7`UyfFrjlEbIJN{0db|r>|LA@=vX9CHFZYiexnkn$b%8Rvw0TZOQIXa;oTI zv@j;ZP+#~|!J(aBz9S{wL7W%Dr1H)G-XUNt9-lP?ijJ-XEj1e*CI~-Xz@4(Xg;UoG z{uzBf-U+(SHe}6oG%;A*93Zb=oE>uTb^%qsL>|bQf?7_6=KIiPU`I|r;YcZ!YG7y~ zQu@UldAwz$^|uoz3mz1;An-WVBtefSh-pv<`n&TU3oM!hrEI?l@v8A4#^$4t&~T32 zl*J=1q~h+60sNc43>0aVvhzyfjshgPYZoQ(OOh>LbUIoblb@1z~zp?))n?^)q6WGuDh}gMUaA9|X z3qq-XlcNldy5==T4rq*~g@XVY!9sYZjo#R7 zr{n)r5^S{9+$+8l7IVB*3_k5%-TBY@C%`P@&tZf>82sm#nfw7L%92>nN$663yW!yt zhS>EfLcE_Z)gv-Y^h1;xj(<4nD4GY{C-nWUgQc9cMmH{qpa!uEznrGF^?bbJHApScQ$j>$JZHAX80DdXu z--AMgrA0$Otdd#N9#!cg2Z~N8&lj1d+wDh+^ZObWJ$J)_h(&2#msu>q0B$DEERy{1 zCJN{7M@%#E@8pda`@u!v@{gcT3bA*>g*xYLXlbb&o@1vX*x+l}Voys6o~^_7>#GB| z*r!R%kA9k%J`?m>1tMHB9x$ZRe0$r~ui}X}jOC)9LH=Po*2SLdtf3^4?VKnu2ox&mV~0oDgi` z;9d}P$g~9%ThTK8s}5ow2V4?(-lU*ed8ro|}mU}pk% z;bqB0bx3AOk<0Joeh}Vl@_7Po&C`Cg>>gff>e7fu41U3Ic{JQu1W%+!Gvz3GDO2ixKd;KF6UEw8F_cDAh08gB>@ zaRH2Q96sBJ>`4aXvrF0xPtIWoA1pPsRQtU~xDtnEfTJnl{A9u5pR^K8=UdNq%T8F$)FbN> zgK+_(BF#D>R>kK!M#OT~=@@}3yAYqm33?{Bv?2iBr|-aRK0@uapzuXI)wE0=R@m^7 zQ`wLBn(M*wg!mgmQT1d!@3<2z>~rmDW)KG0*B4>_R6LjiI0^9QT8gtDDT|Lclxppm z+OeL6H3QpearJAB%1ellZ6d*)wBQ(hPbE=%?y6i^uf%`RXm*JW*WQ%>&J+=V(=qf{ zri~yItvTZbII+7S0>4Q0U9@>HnMP$X>8TqAfD(vAh};2P{QK)ik`a6$W$nG<{bR2Ufd!^iE z#1K58$gW!xpeYHeehuhQCXZ9p%N8m zB+l~T_u-Ycr!U>!?xu!!*6rNxq37{`DhMMfY6NpD3Jw zkYQDstvt30Hc_SaZuuMP2YrdW@HsPMbf^Y9lI<9$bnMil2X7`Ba-DGLbzgqP>mxwe zf1&JkDH54D3nLar2KjJ3z`*R+rUABq4;>>4Kjc2iQEj7pVLcZYZ~pteAG4rm1{>PQy=!QiV5G|tVk)53 zP?Azw+N)Yq3zZ`dW7Q9Bq@Y*jSK0<1f`HM;_>GH57pf_S%Ounz_yhTY8lplQSM`xx zU{r-Deqs+*I~sLI$Oq`>i`J1kJ(+yNOYy$_>R3Jfi680<|^u#J@aY%Q>O zqfI~sCbk#3--^zMkV&Yj0D(R^rK}+_npgPr_4^kYuG=pO%$C_7v{s@-{M-P@RL3^<`kO@b=YdKMuccfO1ZW# zeRYE%D~CMAgPlo?T!O6?b|pOZv{iMWb;sN=jF%=?$Iz_5zH?K;aFGU^8l7u%zHgiy z%)~y|k;Es-7YX69AMj^epGX#&^c@pp+lc}kKc`5CjPN4Z$$e58$Yn*J?81%`0~A)D zPg-db*pj-t4-G9>ImW4IMi*v#9z^9VD9h@9t;3jMAUVxt=oor+16yHf{lT|G4 zya6{4#BxFw!!~UTRwXXawKU4iz$$GMY6=Z8VM{2@0{=5A0+A#p6$aT3ubRyWMWPq9 zCEH5(Il0v4e4=Yxg(tDglfYAy!UpC>&^4=x7#6_S&Ktds)a8^`^tp6RnRd{KImB^o z2n=t#>iKx<*evmvoE{+fH#@WXGWs$)Uxrtf?r>AaxV0?kf0o@oDboJ6z0cgP@A$;k>SK1UqC?Q_ zk_I?j74;}uNXhOf_5ZxQSgB4otDEb9JJrX1kq`-o%T>g%M5~xXf!2_4P~K64tKgXq z&KHZ0@!cPvUJG4kw-0;tPo$zJrU-Nop>Uo65Pm|yaNvKjhi7V1g98;^N1~V3% zTR>yWa+X2FJ_wpPwz3i^6AGwOa_VMS-&`*KoKgF2&oR10Jn6{!pvVG@n=Jk@vjNuY zL~P7aDGhg~O9G^!bHi$8?G9v9Gp0cmekYkK;(q=47;~gI>h-kx-ceM{ml$#8KI$4ltyjaqP zki^cyDERloAb)dcDBU4na9C(pfD{P@eBGA}0|Rb)p{ISqi60=^FUEdF!ok{Gs;vb) zfj9(#1QA64w*ud^YsN5&PeiI>c`VioE8h)e}W%S9NMA55Gs zrWL6l+@3CKd@8(UQLTwe12SGWMqRn+j)QZRj*g)Xua)%ayzpqs{pD(WWESJYL3{M$ z%qkpM`jFoqLYVv6{IbCkL?fEiJj$VG=$taup&RL9e{s(Sgse2xVJlw0h74EXJKt2eX|dxz{->0)3W`JN7Bv!rLvRZc z0tAOZ2yVe4g9iq826qXAg`f!*+}(o1;1FDb>kKexumFS40KvK0yH1_@Z=LgWZ+}(Y zwYsa;OLz6tTA%gS=>8$=Z7pLh>|K2QElL)E=Q*(n*H`8R`8={-@4mTD-SWBOYRxV? zmF(-rJB8^Wlp?319rTrh^?QEP?|Msxrv?WbJ-+id+V#F2Y4(JPJ6U9bv+U1cIIH^W z)lg$_=g^Ma>2~Pyd_YOAv29Cb-U6DJO?NxnW7~QP*SmYi*vdUVuW#LWQ_u0`hymZi zaQS3Nb^4`ro$>0G%zbXmr5|D|iq0R<;S@?kr0j5Ruq87-Z1>crx%EzVZ9#U;{?}ti zW2W%*9MQg3Nbh%Ti6LhDd|-aFSgXoPG`mHlUU1iCHr>ru>DX?W_#13(`u*!Plu2OP z6jk=2>BC0l)aw;HCmxoYD1i4b%m$1`DYC_^L~ zIEAnFcHvad=-aO3(_MI=9#`z6-9*_!&$?<%meb5;jGd5Qp=MGf z6BD{%`L#TAOq%z%@*ib95Ey7NbUF=BlszVk3Iu3imD&*91N-ij%hW?W@~2TtdHTfP z#n0@Xd7X8Dyu36n{k#PwQ~T~X7mAO^cNV+z<HO@3X-# z_@rAn$k~(l@kciCC;&Qd*fWRI>=;fL{UPlciNDWyj$bX<#r^(r;EE8wwUVQm&7~QY zCXRj!**r^xybAEPq>h3W$uvI1j=yNIyzkE_D7fpGw)OV{U*Uwm{xB;mEg2(|y|ICd zMdQVqzMb-=XM6|E-a9kNh)^9lY`-DjhhHD1w5lufRcy+QLgJ47!fFne86#F; zX{ufroVBEZJOY?rDo!;Te6aOZ^1SO!dYRxQ*2njyA~dCWawn)>!*k7~>8Ikt&e*0>>V5ZbO|*1+2LFOqVe zXHb!aMk03^h%&9L8GMy7UDI2Kev>V@(R}*Iu6x+!Hn4~D@wj`P%#Hdbf(lK{+DD7f zJ&(v*mhn_e(R$^5L#bM^^Q@-!*b!l|+Xrb(q*MRFJYnrE7*xko!SJOy9LngR2|q5k zY`Ioiu+YBfzF{Labszk-E#*BYQk>$()=xWEGZRKwY)*UxP}0dGuPLZOkNJDI9Hy zFjfwiK6RjhH#rHW#B0(MW}i%V`943<6@Z*Nd^JEP5uZonXm=u%AM>{H^U@&Jy*i0s za_Da^xI6pMtXzHc{e~_ZcnKP*;=YL2Z^RmzDl{dJTk7*}E_h*NvgnhnxVKB59Duh~ zqouS_WoOR*{UvUw_K#OWz;gMracr%8>QQ&V*jv!8)ho;U8}9~8EU{N<=Z_gR%IpMT zbkePUG_afm=#|iIfFmdqkpLMGxY5D$`?I}&T7>TexU@v zkBx09kG)O;09ckj#(_Uov6vv{{HOcr-%H#DUQ@*GzF8Zh{iSM13%fuB%>wjdU@3Nf zlnYE!GTyNrqes|;nLFXfWU*Wg-9wmr=NBd$nCk+H?iwNvcd0Wab^3CT9a`>3V~oWI z9=_H+N-Q=MQ(io4u4mpdQ;k&5FXnKV5M7R`@WJ9h(GrAirO#XXOU{qQpk^B^Vd=Dt{wiqT zg-#j9J~@o%H2;W9mg)o6@*Vo;BSs2*4HAHpDk02mndAsov08R_48zJZ@J)s7+hyCo zy*0L#y)?AqZt-wX%+_Vx`8*A95OLHvs1$k~{h-_N_vov_gHJE=`X>L?5K+ zD?u59=mjtImMvd1GsDytuYp{IyUkW&?h zF>$#`n$~bZ)KN0B$XGeMYh&`;g8 zo_2-koaO6+8O!+L>SpIQbG(i;QW9UJi{Ecewlo?s&D!^>i$|#jaW}#HJuxt|W48=? zb^Y&O$a1s5ddr8DIt!sD!t=y1g(d4GR(s;s-HfV$GXl&m;+sAAxB^rk(3_NjE$p#L z*t4em?tA0d+XwRxN^OQwzbDZMuSE0J1)Ky{mq)^t4bnSl*)s>zNM@mMdtd78&ebHN z`!(|lE5q-p+TsRaNnMXwALaN5QIZ2IUi^Z22tsN5>nvIO+YU}Q*xh6}ee6@rR~<&1 z(PB4z>9ZBUMXZwSMmd9-aKKsmJeJq^G|#JclOh*xf0?^e0(`40nsg1z)(48;4}B_( zGwPI)yo|{oX{dVDL-5-aMGr;~vU1cPtJP5JM(sswz&Q`e<@0?y{YhsO9YK8EYJA;L z>7oG_Mts+(wCBC*Md82#XdKw&J*IizR?9k^rf1r{Ot-&>V^ke{9nI9zavlcNkIJtN z7T>?o|4rENk-?|lewZ(EfdR;%BUrzKJ^UkCpsM)EA9QHBVV8trT&*O(9?FO{MLTFL z=5P0H+T6C^jAuX0k4U;~GM!x`!X2N~3_n?qXY$HI>x@(DHEy&Q3ucT1R6fj28wX!I zC=&d$@bJ_v^%?W2Ngl}e8ww`b%BrN-PzGH;$@B2Ky1?%GMkm#~Okj(-Admyy;qya| zOi73kr_pwt?5Nj3p=&H>81!w#>Agj z(QXx{j0r=pTl>micAI_5vUw<3`Sht?Z}-j2Wx~F8DKCUQrsXl2?W8hur42(F_ zsSJ)_36&x6A|YkY6c<2a94SXbv~d>4CC4nkDPvf9Z5Fys^6^5r0j5=E>Cgy_Dk@tS z%?c}9!qB?t6t8(XMH%le8UeNWp@Nsma~Ql+^3Bo%_npMryeQJz4V=BAqE~T?dejng z3ge{fjCHoNAfYBvsfq;G%VL|j7t z`X0sy1EEgpyD;)tS1x+fnv-?C@glP0{RCW}Ma?3qpoq_&IJAYOy3G#s`rsh5=3>`K zkj``=;|*x5HSjZC zXNvPLh372q;=+6ja|SC!R-`JcL}}wwskajjTUGTpL(1zkN-p?BA2lmf+J3WsB7!k`0Brx8^cLTF9h)r+LZ$vsZo}`OpOs)?c6$hclR!R#MAeh|_DY|9r zy+_3c%IO9h9X?ksp?an&>Lw;QeQ`T-Ku6HaK~H?E9-Z5$cZu{YU;1+-6B$|JD;%!^ zt(4l>F8}a-UkC4YtOxFHckhl4VKr6P$P_O*U!)IDory%}Wz`YeFx6TO{y2Y${SBm?H9cTWV=WWJ z`_*CGso!ZN>l@~_jkeXtV}fczfA{TUkyeD>)i3|NFGcCsBmK3HXp&ol_@GVs7PIpfULy!hi zs+%KYgS%(n7_z_}6)hblk~W#LZ@&2)fwm6xkFP%&Ju|MFWbNiTwy{{g-pV1RK`L&=RE2D z4|g;~vd8xd|teYS%w!IlT4W$&FTrk-hcTADX!P?*f1YWEIRwq$Ys%^(Z9w&HT$>} zsMD#6Df=uJrX!JHP7<>Or;e_Cf=}`!`qR=i8fBj)$6Lxx{HRzd8Tnzd0p>kSps{OG zKJkml>bUj8$u|F=``l(-aMxWBC@CGZ#FXClQZ<4|&%jN}Tkg#q8z)=>Ly{$i0`rjU zvt|QddO&i=91e?h3>s~i;+6{ z8X4i6a1wDLrSuE#W(zhan+U*Zq+8p3a))JFVF4ffaV51K^YgTso~3;Y*NmM; zx8T?y-N0uyWY(8=me-HUC9xtABvX5~%yg+Cp&XF$Bq=OcK6T*D7eZ2EmIoCFWm{$S z1PNw8HDpe5hHeCusN8kdeb&f2#=3M^A~7YwJ7FRrhq*)PG9x?JIAaC{MV}5}g#7R$-Ly%)4=IUkRCGOR|XTMjn&okRmFjaO^YF5^* z@)#MCBOBezD)*xQNxydlUyN?dW{fS(s-T`gv*0BEnk}`BdmrbmPO8q8y(X$AA}*RH%I7Av!~84pudHb&%Q5-j zt?=6x(iR?<^_7X0v6Ys#VAL}dKk^hcjI=|EY;kPcZ_w<*H`_*|N7SacaM1ERD@6ab zg`!iTm7$URV+lpW_{V$ruR&A>jrX68k4x2wo$45}&wf7o<|o(@B!u-L@bKyQBAGwy z4#}UrRAu>^>Vb6k2-th^>WjvP;Nl|i3WrjWv3ISkj{m{eAcQIW^_ndxSX@|8T(ASJ z?_$fcP2u*6uOBk-{d>^ z0vWlfGQMvysI%R=iE|A+!!Nw?C917EU*_$`;;)px?s83CRd3i_jBN)k#nR5t$dJ(+ z_sP;wG@Ad)^(3LRj7q}0b2O(b`|i0~5SYb%Sjk^*5ISZ-Ab+}DGu$-X1n^TF1Ndw_ zF|e*1)cI2%`TR&AW~XpqpFb!=3cHbS>np9hYD_Mr5}y5Y`SY^r7isA2Q4(z zazRQEqWDKT2zIEbjSYdCPi1ZOGz80Nsl}gxO^DWMY0AV<2K&OL{&^6#@L1?lXu#6xSMh%3^5c*}oM6DQGY#(a^@z<&D zF(43I9e&5`h|A$5!+UFuOH0>F3$shBV4`0#M4RSB8=6F0ZgIbq<2LQ$Hh^(kAJu=! zt8ZGXTacD{(3W{V1$j_{Jc)Ka7t6u}ho`4kF+4@t_0!mCBn z)}o%eA}L)_L?=jw6BIfll7tb3n}?*yLt&XADa=rW>qz=_6s9ziOd5sXjil>FVFx3r zf>Feewk0v#W9>Gp4GacTRr>Sd2T6dWi-{YX`v!D)kCWzG5xQB=?es5ON(%nkwUhNl zV>@xkWWWv*N+{e$(SrExvN6BXzU(Hxlx27{VYHf+LpIbTO+Yu(ltMk<;)3A(LU@ytVYFkYvTa79idMtUFhfxx?P!)2F`prNWW#Fub#l>N2s@nh&n_ zA4{#}|AIs9|A4P0ZF%fy=hDN!t#ifH<)4u2kirK~JUpjQ-J+~cXOZI&dIts;P}UeXslP6zKvpEKSN-$y>kJ^nw2tC9bv zo(|lT@?vZ!{_l|d^8Yh)eEBh*5ABh+Lzjw+?V)o z#P-W7361>E(Y4;@`sv;VKn G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.woff2 b/src/tools/TurtlebotViewer-web/public/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/src/tools/TurtlebotViewer-web/public/index.html b/src/tools/TurtlebotViewer-web/public/index.html new file mode 100644 index 000000000..2eae45ba7 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/index.html @@ -0,0 +1,213 @@ + + + + + + TurtlebotViewer + + + + + + + + + + + + +
+
+
+

+ + + +

+
+
+
+
+
+ +
+ Your browser does not support the HTML5 canvas tag. +
+
+
+
+
+ +
+ Your browser does not support the HTML5 canvas tag. +
+
+
+
+
+ +
+ Your browser does not support the HTML5 canvas tag. +
+
+
+
+
+
+
+
+ 3D Model +
+
+ Your browser does not support the HTML5 canvas tag. +
+
+
+
+
+ +
+ Your browser does not support the HTML5 canvas tag. +
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + diff --git a/src/tools/TurtlebotViewer-web/public/js/ColladaLoader.js b/src/tools/TurtlebotViewer-web/public/js/ColladaLoader.js new file mode 100644 index 000000000..353ad00f6 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/js/ColladaLoader.js @@ -0,0 +1,5511 @@ +/** +* @author Tim Knip / http://www.floorplanner.com/ / tim at floorplanner.com +* @author Tony Parisi / http://www.tonyparisi.com/ +*/ + +THREE.ColladaLoader = function () { + + var COLLADA = null; + var scene = null; + var visualScene; + var kinematicsModel; + + var readyCallbackFunc = null; + + var sources = {}; + var images = {}; + var animations = {}; + var controllers = {}; + var geometries = {}; + var materials = {}; + var effects = {}; + var cameras = {}; + var lights = {}; + + var animData; + var kinematics; + var visualScenes; + var kinematicsModels; + var baseUrl; + var morphs; + var skins; + + var flip_uv = true; + var preferredShading = THREE.SmoothShading; + + var options = { + // Force Geometry to always be centered at the local origin of the + // containing Mesh. + centerGeometry: false, + + // Axis conversion is done for geometries, animations, and controllers. + // If we ever pull cameras or lights out of the COLLADA file, they'll + // need extra work. + convertUpAxis: false, + + subdivideFaces: true, + + upAxis: 'Y', + + // For reflective or refractive materials we'll use this cubemap + defaultEnvMap: null + + }; + + var colladaUnit = 1.0; + var colladaUp = 'Y'; + var upConversion = null; + + function load ( url, readyCallback, progressCallback, failCallback ) { + + var length = 0; + + if ( document.implementation && document.implementation.createDocument ) { + + var request = new XMLHttpRequest(); + + request.onreadystatechange = function() { + + if ( request.readyState === 4 ) { + + if ( request.status === 0 || request.status === 200 ) { + + + if ( request.responseXML ) { + + readyCallbackFunc = readyCallback; + parse( request.responseXML, undefined, url ); + + } else if ( request.responseText ) { + + readyCallbackFunc = readyCallback; + var xmlParser = new DOMParser(); + var responseXML = xmlParser.parseFromString( request.responseText, "application/xml" ); + parse( responseXML, undefined, url ); + + } else { + + if ( faillCallback ) { + + failCallback(); + + } else { + + console.error( "ColladaLoader: Empty or non-existing file (" + url + ")" ); + + } + + } + + } + + } else if ( request.readyState === 3 ) { + + if ( progressCallback ) { + + if ( length === 0 ) { + + length = request.getResponseHeader( "Content-Length" ); + + } + + progressCallback( { total: length, loaded: request.responseText.length } ); + + } + + } + + } + + request.open( "GET", url, true ); + request.send( null ); + + } else { + + alert( "Don't know how to parse XML!" ); + + } + + } + + function parse( doc, callBack, url ) { + + COLLADA = doc; + callBack = callBack || readyCallbackFunc; + + if ( url !== undefined ) { + + var parts = url.split( '/' ); + parts.pop(); + baseUrl = ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/'; + + } + + parseAsset(); + setUpConversion(); + images = parseLib( "library_images image", _Image, "image" ); + materials = parseLib( "library_materials material", Material, "material" ); + effects = parseLib( "library_effects effect", Effect, "effect" ); + geometries = parseLib( "library_geometries geometry", Geometry, "geometry" ); + cameras = parseLib( "library_cameras camera", Camera, "camera" ); + lights = parseLib( "library_lights light", Light, "light" ); + controllers = parseLib( "library_controllers controller", Controller, "controller" ); + animations = parseLib( "library_animations animation", Animation, "animation" ); + visualScenes = parseLib( "library_visual_scenes visual_scene", VisualScene, "visual_scene" ); + kinematicsModels = parseLib( "library_kinematics_models kinematics_model", KinematicsModel, "kinematics_model" ); + + morphs = []; + skins = []; + + visualScene = parseScene(); + scene = new THREE.Group(); + + for ( var i = 0; i < visualScene.nodes.length; i ++ ) { + + scene.add( createSceneGraph( visualScene.nodes[ i ] ) ); + + } + + // unit conversion + scene.scale.multiplyScalar( colladaUnit ); + + createAnimations(); + + kinematicsModel = parseKinematicsModel(); + createKinematics(); + + var result = { + + scene: scene, + morphs: morphs, + skins: skins, + animations: animData, + kinematics: kinematics, + dae: { + images: images, + materials: materials, + cameras: cameras, + lights: lights, + effects: effects, + geometries: geometries, + controllers: controllers, + animations: animations, + visualScenes: visualScenes, + visualScene: visualScene, + scene: visualScene, + kinematicsModels: kinematicsModels, + kinematicsModel: kinematicsModel + } + + }; + + if ( callBack ) { + + callBack( result ); + + } + + return result; + + } + + function setPreferredShading ( shading ) { + + preferredShading = shading; + + } + + function parseAsset () { + + var elements = COLLADA.querySelectorAll('asset'); + + var element = elements[0]; + + if ( element && element.childNodes ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'unit': + + var meter = child.getAttribute( 'meter' ); + + if ( meter ) { + + colladaUnit = parseFloat( meter ); + + } + + break; + + case 'up_axis': + + colladaUp = child.textContent.charAt(0); + break; + + } + + } + + } + + } + + function parseLib ( q, classSpec, prefix ) { + + var elements = COLLADA.querySelectorAll(q); + + var lib = {}; + + var i = 0; + + var elementsLength = elements.length; + + for ( var j = 0; j < elementsLength; j ++ ) { + + var element = elements[j]; + var daeElement = ( new classSpec() ).parse( element ); + + if ( !daeElement.id || daeElement.id.length === 0 ) daeElement.id = prefix + ( i ++ ); + lib[ daeElement.id ] = daeElement; + + } + + return lib; + + } + + function parseScene() { + + var sceneElement = COLLADA.querySelectorAll('scene instance_visual_scene')[0]; + + if ( sceneElement ) { + + var url = sceneElement.getAttribute( 'url' ).replace( /^#/, '' ); + return visualScenes[ url.length > 0 ? url : 'visual_scene0' ]; + + } else { + + return null; + + } + + } + + function parseKinematicsModel() { + + var kinematicsModelElement = COLLADA.querySelectorAll('instance_kinematics_model')[0]; + + if ( kinematicsModelElement ) { + + var url = kinematicsModelElement.getAttribute( 'url' ).replace(/^#/, ''); + return kinematicsModels[ url.length > 0 ? url : 'kinematics_model0' ]; + + } else { + + return null; + + } + + } + + function createAnimations() { + + animData = []; + + // fill in the keys + recurseHierarchy( scene ); + + } + + function recurseHierarchy( node ) { + + var n = visualScene.getChildById( node.colladaId, true ), + newData = null; + + if ( n && n.keys ) { + + newData = { + fps: 60, + hierarchy: [ { + node: n, + keys: n.keys, + sids: n.sids + } ], + node: node, + name: 'animation_' + node.name, + length: 0 + }; + + animData.push(newData); + + for ( var i = 0, il = n.keys.length; i < il; i ++ ) { + + newData.length = Math.max( newData.length, n.keys[i].time ); + + } + + } else { + + newData = { + hierarchy: [ { + keys: [], + sids: [] + } ] + } + + } + + for ( var i = 0, il = node.children.length; i < il; i ++ ) { + + var d = recurseHierarchy( node.children[i] ); + + for ( var j = 0, jl = d.hierarchy.length; j < jl; j ++ ) { + + newData.hierarchy.push( { + keys: [], + sids: [] + } ); + + } + + } + + return newData; + + } + + function calcAnimationBounds () { + + var start = 1000000; + var end = -start; + var frames = 0; + var ID; + for ( var id in animations ) { + + var animation = animations[ id ]; + ID = ID || animation.id; + for ( var i = 0; i < animation.sampler.length; i ++ ) { + + var sampler = animation.sampler[ i ]; + + sampler.create(); + + start = Math.min( start, sampler.startTime ); + end = Math.max( end, sampler.endTime ); + frames = Math.max( frames, sampler.input.length ); + + } + + } + + return { start:start, end:end, frames:frames,ID:ID }; + + } + + function createMorph ( geometry, ctrl ) { + + var morphCtrl = ctrl instanceof InstanceController ? controllers[ ctrl.url ] : ctrl; + + if ( !morphCtrl || !morphCtrl.morph ) { + + console.log("could not find morph controller!"); + return; + + } + + var morph = morphCtrl.morph; + + for ( var i = 0; i < morph.targets.length; i ++ ) { + + var target_id = morph.targets[ i ]; + var daeGeometry = geometries[ target_id ]; + + if ( !daeGeometry.mesh || + !daeGeometry.mesh.primitives || + !daeGeometry.mesh.primitives.length ) { + continue; + } + + var target = daeGeometry.mesh.primitives[ 0 ].geometry; + + if ( target.vertices.length === geometry.vertices.length ) { + + geometry.morphTargets.push( { name: "target_1", vertices: target.vertices } ); + + } + + } + + geometry.morphTargets.push( { name: "target_Z", vertices: geometry.vertices } ); + + }; + + function createSkin ( geometry, ctrl, applyBindShape ) { + + var skinCtrl = controllers[ ctrl.url ]; + + if ( !skinCtrl || !skinCtrl.skin ) { + + console.log( "could not find skin controller!" ); + return; + + } + + if ( !ctrl.skeleton || !ctrl.skeleton.length ) { + + console.log( "could not find the skeleton for the skin!" ); + return; + + } + + var skin = skinCtrl.skin; + var skeleton = visualScene.getChildById( ctrl.skeleton[ 0 ] ); + var hierarchy = []; + + applyBindShape = applyBindShape !== undefined ? applyBindShape : true; + + var bones = []; + geometry.skinWeights = []; + geometry.skinIndices = []; + + //createBones( geometry.bones, skin, hierarchy, skeleton, null, -1 ); + //createWeights( skin, geometry.bones, geometry.skinIndices, geometry.skinWeights ); + + /* + geometry.animation = { + name: 'take_001', + fps: 30, + length: 2, + JIT: true, + hierarchy: hierarchy + }; + */ + + if ( applyBindShape ) { + + for ( var i = 0; i < geometry.vertices.length; i ++ ) { + + geometry.vertices[ i ].applyMatrix4( skin.bindShapeMatrix ); + + } + + } + + } + + function setupSkeleton ( node, bones, frame, parent ) { + + node.world = node.world || new THREE.Matrix4(); + node.localworld = node.localworld || new THREE.Matrix4(); + node.world.copy( node.matrix ); + node.localworld.copy( node.matrix ); + + if ( node.channels && node.channels.length ) { + + var channel = node.channels[ 0 ]; + var m = channel.sampler.output[ frame ]; + + if ( m instanceof THREE.Matrix4 ) { + + node.world.copy( m ); + node.localworld.copy(m); + if (frame === 0) + node.matrix.copy(m); + } + + } + + if ( parent ) { + + node.world.multiplyMatrices( parent, node.world ); + + } + + bones.push( node ); + + for ( var i = 0; i < node.nodes.length; i ++ ) { + + setupSkeleton( node.nodes[ i ], bones, frame, node.world ); + + } + + } + + function setupSkinningMatrices ( bones, skin ) { + + // FIXME: this is dumb... + + for ( var i = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + var found = -1; + + if ( bone.type != 'JOINT' ) continue; + + for ( var j = 0; j < skin.joints.length; j ++ ) { + + if ( bone.sid === skin.joints[ j ] ) { + + found = j; + break; + + } + + } + + if ( found >= 0 ) { + + var inv = skin.invBindMatrices[ found ]; + + bone.invBindMatrix = inv; + bone.skinningMatrix = new THREE.Matrix4(); + bone.skinningMatrix.multiplyMatrices(bone.world, inv); // (IBMi * JMi) + bone.animatrix = new THREE.Matrix4(); + + bone.animatrix.copy(bone.localworld); + bone.weights = []; + + for ( var j = 0; j < skin.weights.length; j ++ ) { + + for (var k = 0; k < skin.weights[ j ].length; k ++ ) { + + var w = skin.weights[ j ][ k ]; + + if ( w.joint === found ) { + + bone.weights.push( w ); + + } + + } + + } + + } else { + + console.warn( "ColladaLoader: Could not find joint '" + bone.sid + "'." ); + + bone.skinningMatrix = new THREE.Matrix4(); + bone.weights = []; + + } + } + + } + + //Walk the Collada tree and flatten the bones into a list, extract the position, quat and scale from the matrix + function flattenSkeleton(skeleton) { + + var list = []; + var walk = function(parentid, node, list) { + + var bone = {}; + bone.name = node.sid; + bone.parent = parentid; + bone.matrix = node.matrix; + var data = [ new THREE.Vector3(),new THREE.Quaternion(),new THREE.Vector3() ]; + bone.matrix.decompose(data[0], data[1], data[2]); + + bone.pos = [ data[0].x,data[0].y,data[0].z ]; + + bone.scl = [ data[2].x,data[2].y,data[2].z ]; + bone.rotq = [ data[1].x,data[1].y,data[1].z,data[1].w ]; + list.push(bone); + + for (var i in node.nodes) { + + walk(node.sid, node.nodes[i], list); + + } + + }; + + walk(-1, skeleton, list); + return list; + + } + + //Move the vertices into the pose that is proper for the start of the animation + function skinToBindPose(geometry,skeleton,skinController) { + + var bones = []; + setupSkeleton( skeleton, bones, -1 ); + setupSkinningMatrices( bones, skinController.skin ); + v = new THREE.Vector3(); + var skinned = []; + + for (var i = 0; i < geometry.vertices.length; i ++) { + + skinned.push(new THREE.Vector3()); + + } + + for ( i = 0; i < bones.length; i ++ ) { + + if ( bones[ i ].type != 'JOINT' ) continue; + + for ( j = 0; j < bones[ i ].weights.length; j ++ ) { + + w = bones[ i ].weights[ j ]; + vidx = w.index; + weight = w.weight; + + o = geometry.vertices[vidx]; + s = skinned[vidx]; + + v.x = o.x; + v.y = o.y; + v.z = o.z; + + v.applyMatrix4( bones[i].skinningMatrix ); + + s.x += (v.x * weight); + s.y += (v.y * weight); + s.z += (v.z * weight); + } + + } + + for (var i = 0; i < geometry.vertices.length; i ++) { + + geometry.vertices[i] = skinned[i]; + + } + + } + + function applySkin ( geometry, instanceCtrl, frame ) { + + var skinController = controllers[ instanceCtrl.url ]; + + frame = frame !== undefined ? frame : 40; + + if ( !skinController || !skinController.skin ) { + + console.log( 'ColladaLoader: Could not find skin controller.' ); + return; + + } + + if ( !instanceCtrl.skeleton || !instanceCtrl.skeleton.length ) { + + console.log( 'ColladaLoader: Could not find the skeleton for the skin. ' ); + return; + + } + + var animationBounds = calcAnimationBounds(); + var skeleton = visualScene.getChildById( instanceCtrl.skeleton[0], true ) || visualScene.getChildBySid( instanceCtrl.skeleton[0], true ); + + //flatten the skeleton into a list of bones + var bonelist = flattenSkeleton(skeleton); + var joints = skinController.skin.joints; + + //sort that list so that the order reflects the order in the joint list + var sortedbones = []; + for (var i = 0; i < joints.length; i ++) { + + for (var j = 0; j < bonelist.length; j ++) { + + if (bonelist[j].name === joints[i]) { + + sortedbones[i] = bonelist[j]; + + } + + } + + } + + //hook up the parents by index instead of name + for (var i = 0; i < sortedbones.length; i ++) { + + for (var j = 0; j < sortedbones.length; j ++) { + + if (sortedbones[i].parent === sortedbones[j].name) { + + sortedbones[i].parent = j; + + } + + } + + } + + + var i, j, w, vidx, weight; + var v = new THREE.Vector3(), o, s; + + // move vertices to bind shape + for ( i = 0; i < geometry.vertices.length; i ++ ) { + geometry.vertices[i].applyMatrix4( skinController.skin.bindShapeMatrix ); + } + + var skinIndices = []; + var skinWeights = []; + var weights = skinController.skin.weights; + + // hook up the skin weights + // TODO - this might be a good place to choose greatest 4 weights + for ( var i =0; i < weights.length; i ++ ) { + + var indicies = new THREE.Vector4(weights[i][0] ? weights[i][0].joint : 0,weights[i][1] ? weights[i][1].joint : 0,weights[i][2] ? weights[i][2].joint : 0,weights[i][3] ? weights[i][3].joint : 0); + var weight = new THREE.Vector4(weights[i][0] ? weights[i][0].weight : 0,weights[i][1] ? weights[i][1].weight : 0,weights[i][2] ? weights[i][2].weight : 0,weights[i][3] ? weights[i][3].weight : 0); + + skinIndices.push(indicies); + skinWeights.push(weight); + + } + + geometry.skinIndices = skinIndices; + geometry.skinWeights = skinWeights; + geometry.bones = sortedbones; + // process animation, or simply pose the rig if no animation + + //create an animation for the animated bones + //NOTE: this has no effect when using morphtargets + var animationdata = { "name":animationBounds.ID,"fps":30,"length":animationBounds.frames / 30,"hierarchy":[] }; + + for (var j = 0; j < sortedbones.length; j ++) { + + animationdata.hierarchy.push({ parent:sortedbones[j].parent, name:sortedbones[j].name, keys:[] }); + + } + + console.log( 'ColladaLoader:', animationBounds.ID + ' has ' + sortedbones.length + ' bones.' ); + + + + skinToBindPose(geometry, skeleton, skinController); + + + for ( frame = 0; frame < animationBounds.frames; frame ++ ) { + + var bones = []; + var skinned = []; + // process the frame and setup the rig with a fresh + // transform, possibly from the bone's animation channel(s) + + setupSkeleton( skeleton, bones, frame ); + setupSkinningMatrices( bones, skinController.skin ); + + for (var i = 0; i < bones.length; i ++) { + + for (var j = 0; j < animationdata.hierarchy.length; j ++) { + + if (animationdata.hierarchy[j].name === bones[i].sid) { + + var key = {}; + key.time = (frame / 30); + key.matrix = bones[i].animatrix; + + if (frame === 0) + bones[i].matrix = key.matrix; + + var data = [ new THREE.Vector3(),new THREE.Quaternion(),new THREE.Vector3() ]; + key.matrix.decompose(data[0], data[1], data[2]); + + key.pos = [ data[0].x,data[0].y,data[0].z ]; + + key.scl = [ data[2].x,data[2].y,data[2].z ]; + key.rot = data[1]; + + animationdata.hierarchy[j].keys.push(key); + + } + + } + + } + + geometry.animation = animationdata; + + } + + }; + + function createKinematics() { + + if ( kinematicsModel && kinematicsModel.joints.length === 0 ) { + kinematics = undefined; + return; + } + + var jointMap = {}; + + var _addToMap = function( jointIndex, parentVisualElement ) { + + var parentVisualElementId = parentVisualElement.getAttribute( 'id' ); + var colladaNode = visualScene.getChildById( parentVisualElementId, true ); + var joint = kinematicsModel.joints[ jointIndex ]; + + scene.traverse(function( node ) { + + if ( node.colladaId == parentVisualElementId ) { + + jointMap[ jointIndex ] = { + node: node, + transforms: colladaNode.transforms, + joint: joint, + position: joint.zeroPosition + }; + + } + + }); + + }; + + kinematics = { + + joints: kinematicsModel && kinematicsModel.joints, + + getJointValue: function( jointIndex ) { + + var jointData = jointMap[ jointIndex ]; + + if ( jointData ) { + + return jointData.position; + + } else { + + console.log( 'getJointValue: joint ' + jointIndex + ' doesn\'t exist' ); + + } + + }, + + setJointValue: function( jointIndex, value ) { + + var jointData = jointMap[ jointIndex ]; + + if ( jointData ) { + + var joint = jointData.joint; + + if ( value > joint.limits.max || value < joint.limits.min ) { + + console.log( 'setJointValue: joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ')' ); + + } else if ( joint.static ) { + + console.log( 'setJointValue: joint ' + jointIndex + ' is static' ); + + } else { + + var threejsNode = jointData.node; + var axis = joint.axis; + var transforms = jointData.transforms; + + var matrix = new THREE.Matrix4(); + + for (i = 0; i < transforms.length; i ++ ) { + + var transform = transforms[ i ]; + + // kinda ghetto joint detection + if ( transform.sid && transform.sid.indexOf( 'joint' + jointIndex ) !== -1 ) { + + // apply actual joint value here + switch ( joint.type ) { + + case 'revolute': + + matrix.multiply( m1.makeRotationAxis( axis, THREE.Math.degToRad(value) ) ); + break; + + case 'prismatic': + + matrix.multiply( m1.makeTranslation(axis.x * value, axis.y * value, axis.z * value ) ); + break; + + default: + + console.warn( 'setJointValue: unknown joint type: ' + joint.type ); + break; + + } + + } else { + + var m1 = new THREE.Matrix4(); + + switch ( transform.type ) { + + case 'matrix': + + matrix.multiply( transform.obj ); + + break; + + case 'translate': + + matrix.multiply( m1.makeTranslation( transform.obj.x, transform.obj.y, transform.obj.z ) ); + + break; + + case 'rotate': + + matrix.multiply( m1.makeRotationAxis( transform.obj, transform.angle ) ); + + break; + + } + } + } + + // apply the matrix to the threejs node + var elementsFloat32Arr = matrix.elements; + var elements = Array.prototype.slice.call( elementsFloat32Arr ); + + var elementsRowMajor = [ + elements[ 0 ], + elements[ 4 ], + elements[ 8 ], + elements[ 12 ], + elements[ 1 ], + elements[ 5 ], + elements[ 9 ], + elements[ 13 ], + elements[ 2 ], + elements[ 6 ], + elements[ 10 ], + elements[ 14 ], + elements[ 3 ], + elements[ 7 ], + elements[ 11 ], + elements[ 15 ] + ]; + + threejsNode.matrix.set.apply( threejsNode.matrix, elementsRowMajor ); + threejsNode.matrix.decompose( threejsNode.position, threejsNode.quaternion, threejsNode.scale ); + } + + } else { + + console.log( 'setJointValue: joint ' + jointIndex + ' doesn\'t exist' ); + + } + + } + + }; + + var element = COLLADA.querySelector('scene instance_kinematics_scene'); + + if ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'bind_joint_axis': + + var visualTarget = child.getAttribute( 'target' ).split( '/' ).pop(); + var axis = child.querySelector('axis param').textContent; + var jointIndex = parseInt( axis.split( 'joint' ).pop().split( '.' )[0] ); + var visualTargetElement = COLLADA.querySelector( '[sid="' + visualTarget + '"]' ); + + if ( visualTargetElement ) { + var parentVisualElement = visualTargetElement.parentElement; + _addToMap(jointIndex, parentVisualElement); + } + + break; + + default: + + break; + + } + + } + } + + }; + + function createSceneGraph ( node, parent ) { + + var obj = new THREE.Object3D(); + var skinned = false; + var skinController; + var morphController; + var i, j; + + // FIXME: controllers + + for ( i = 0; i < node.controllers.length; i ++ ) { + + var controller = controllers[ node.controllers[ i ].url ]; + + switch ( controller.type ) { + + case 'skin': + + if ( geometries[ controller.skin.source ] ) { + + var inst_geom = new InstanceGeometry(); + + inst_geom.url = controller.skin.source; + inst_geom.instance_material = node.controllers[ i ].instance_material; + + node.geometries.push( inst_geom ); + skinned = true; + skinController = node.controllers[ i ]; + + } else if ( controllers[ controller.skin.source ] ) { + + // urgh: controller can be chained + // handle the most basic case... + + var second = controllers[ controller.skin.source ]; + morphController = second; + // skinController = node.controllers[i]; + + if ( second.morph && geometries[ second.morph.source ] ) { + + var inst_geom = new InstanceGeometry(); + + inst_geom.url = second.morph.source; + inst_geom.instance_material = node.controllers[ i ].instance_material; + + node.geometries.push( inst_geom ); + + } + + } + + break; + + case 'morph': + + if ( geometries[ controller.morph.source ] ) { + + var inst_geom = new InstanceGeometry(); + + inst_geom.url = controller.morph.source; + inst_geom.instance_material = node.controllers[ i ].instance_material; + + node.geometries.push( inst_geom ); + morphController = node.controllers[ i ]; + + } + + console.log( 'ColladaLoader: Morph-controller partially supported.' ); + + default: + break; + + } + + } + + // geometries + + var double_sided_materials = {}; + + for ( i = 0; i < node.geometries.length; i ++ ) { + + var instance_geometry = node.geometries[i]; + var instance_materials = instance_geometry.instance_material; + var geometry = geometries[ instance_geometry.url ]; + var used_materials = {}; + var used_materials_array = []; + var num_materials = 0; + var first_material; + + if ( geometry ) { + + if ( !geometry.mesh || !geometry.mesh.primitives ) + continue; + + if ( obj.name.length === 0 ) { + + obj.name = geometry.id; + + } + + // collect used fx for this geometry-instance + + if ( instance_materials ) { + + for ( j = 0; j < instance_materials.length; j ++ ) { + + var instance_material = instance_materials[ j ]; + var mat = materials[ instance_material.target ]; + var effect_id = mat.instance_effect.url; + var shader = effects[ effect_id ].shader; + var material3js = shader.material; + + if ( geometry.doubleSided ) { + + if ( !( instance_material.symbol in double_sided_materials ) ) { + + var _copied_material = material3js.clone(); + _copied_material.side = THREE.DoubleSide; + double_sided_materials[ instance_material.symbol ] = _copied_material; + + } + + material3js = double_sided_materials[ instance_material.symbol ]; + + } + + material3js.opacity = !material3js.opacity ? 1 : material3js.opacity; + used_materials[ instance_material.symbol ] = num_materials; + used_materials_array.push( material3js ); + first_material = material3js; + first_material.name = mat.name === null || mat.name === '' ? mat.id : mat.name; + num_materials ++; + + } + + } + + var mesh; + var material = first_material || new THREE.MeshLambertMaterial( { color: 0xdddddd, side: geometry.doubleSided ? THREE.DoubleSide : THREE.FrontSide } ); + var geom = geometry.mesh.geometry3js; + + if ( num_materials > 1 ) { + + material = new THREE.MeshFaceMaterial( used_materials_array ); + + for ( j = 0; j < geom.faces.length; j ++ ) { + + var face = geom.faces[ j ]; + face.materialIndex = used_materials[ face.daeMaterial ] + + } + + } + + if ( skinController !== undefined ) { + + + applySkin( geom, skinController ); + + if ( geom.morphTargets.length > 0 ) { + + material.morphTargets = true; + material.skinning = false; + + } else { + + material.morphTargets = false; + material.skinning = true; + + } + + + mesh = new THREE.SkinnedMesh( geom, material, false ); + + + //mesh.skeleton = skinController.skeleton; + //mesh.skinController = controllers[ skinController.url ]; + //mesh.skinInstanceController = skinController; + mesh.name = 'skin_' + skins.length; + + + + //mesh.animationHandle.setKey(0); + skins.push( mesh ); + + } else if ( morphController !== undefined ) { + + createMorph( geom, morphController ); + + material.morphTargets = true; + + mesh = new THREE.Mesh( geom, material ); + mesh.name = 'morph_' + morphs.length; + + morphs.push( mesh ); + + } else { + + if ( geom.isLineStrip === true ) { + + mesh = new THREE.Line( geom ); + + } else { + + mesh = new THREE.Mesh( geom, material ); + + } + + } + + obj.add(mesh); + + } + + } + + for ( i = 0; i < node.cameras.length; i ++ ) { + + var instance_camera = node.cameras[i]; + var cparams = cameras[instance_camera.url]; + + var cam = new THREE.PerspectiveCamera(cparams.yfov, parseFloat(cparams.aspect_ratio), + parseFloat(cparams.znear), parseFloat(cparams.zfar)); + + obj.add(cam); + } + + for ( i = 0; i < node.lights.length; i ++ ) { + + var light = null; + var instance_light = node.lights[i]; + var lparams = lights[instance_light.url]; + + if ( lparams && lparams.technique ) { + + var color = lparams.color.getHex(); + var intensity = lparams.intensity; + var distance = lparams.distance; + var angle = lparams.falloff_angle; + var exponent; // Intentionally undefined, don't know what this is yet + + switch ( lparams.technique ) { + + case 'directional': + + light = new THREE.DirectionalLight( color, intensity, distance ); + light.position.set(0, 0, 1); + break; + + case 'point': + + light = new THREE.PointLight( color, intensity, distance ); + break; + + case 'spot': + + light = new THREE.SpotLight( color, intensity, distance, angle, exponent ); + light.position.set(0, 0, 1); + break; + + case 'ambient': + + light = new THREE.AmbientLight( color ); + break; + + } + + } + + if (light) { + obj.add(light); + } + } + + obj.name = node.name || node.id || ""; + obj.colladaId = node.id || ""; + obj.layer = node.layer || ""; + obj.matrix = node.matrix; + obj.matrix.decompose( obj.position, obj.quaternion, obj.scale ); + + if ( options.centerGeometry && obj.geometry ) { + + var delta = obj.geometry.center(); + delta.multiply( obj.scale ); + delta.applyQuaternion( obj.quaternion ); + + obj.position.sub( delta ); + + } + + for ( i = 0; i < node.nodes.length; i ++ ) { + + obj.add( createSceneGraph( node.nodes[i], node ) ); + + } + + return obj; + + }; + + function getJointId( skin, id ) { + + for ( var i = 0; i < skin.joints.length; i ++ ) { + + if ( skin.joints[ i ] === id ) { + + return i; + + } + + } + + }; + + function getLibraryNode( id ) { + + var nodes = COLLADA.querySelectorAll('library_nodes node'); + + for ( var i = 0; i < nodes.length; i++ ) { + + var attObj = nodes[i].attributes.getNamedItem('id'); + + if ( attObj && attObj.value === id ) { + + return nodes[i]; + + } + + } + + return undefined; + + }; + + function getChannelsForNode ( node ) { + + var channels = []; + var startTime = 1000000; + var endTime = -1000000; + + for ( var id in animations ) { + + var animation = animations[id]; + + for ( var i = 0; i < animation.channel.length; i ++ ) { + + var channel = animation.channel[i]; + var sampler = animation.sampler[i]; + var id = channel.target.split('/')[0]; + + if ( id == node.id ) { + + sampler.create(); + channel.sampler = sampler; + startTime = Math.min(startTime, sampler.startTime); + endTime = Math.max(endTime, sampler.endTime); + channels.push(channel); + + } + + } + + } + + if ( channels.length ) { + + node.startTime = startTime; + node.endTime = endTime; + + } + + return channels; + + }; + + function calcFrameDuration( node ) { + + var minT = 10000000; + + for ( var i = 0; i < node.channels.length; i ++ ) { + + var sampler = node.channels[i].sampler; + + for ( var j = 0; j < sampler.input.length - 1; j ++ ) { + + var t0 = sampler.input[ j ]; + var t1 = sampler.input[ j + 1 ]; + minT = Math.min( minT, t1 - t0 ); + + } + } + + return minT; + + }; + + function calcMatrixAt( node, t ) { + + var animated = {}; + + var i, j; + + for ( i = 0; i < node.channels.length; i ++ ) { + + var channel = node.channels[ i ]; + animated[ channel.sid ] = channel; + + } + + var matrix = new THREE.Matrix4(); + + for ( i = 0; i < node.transforms.length; i ++ ) { + + var transform = node.transforms[ i ]; + var channel = animated[ transform.sid ]; + + if ( channel !== undefined ) { + + var sampler = channel.sampler; + var value; + + for ( j = 0; j < sampler.input.length - 1; j ++ ) { + + if ( sampler.input[ j + 1 ] > t ) { + + value = sampler.output[ j ]; + //console.log(value.flatten) + break; + + } + + } + + if ( value !== undefined ) { + + if ( value instanceof THREE.Matrix4 ) { + + matrix.multiplyMatrices( matrix, value ); + + } else { + + // FIXME: handle other types + + matrix.multiplyMatrices( matrix, transform.matrix ); + + } + + } else { + + matrix.multiplyMatrices( matrix, transform.matrix ); + + } + + } else { + + matrix.multiplyMatrices( matrix, transform.matrix ); + + } + + } + + return matrix; + + }; + + function bakeAnimations ( node ) { + + if ( node.channels && node.channels.length ) { + + var keys = [], + sids = []; + + for ( var i = 0, il = node.channels.length; i < il; i ++ ) { + + var channel = node.channels[i], + fullSid = channel.fullSid, + sampler = channel.sampler, + input = sampler.input, + transform = node.getTransformBySid( channel.sid ), + member; + + if ( channel.arrIndices ) { + + member = []; + + for ( var j = 0, jl = channel.arrIndices.length; j < jl; j ++ ) { + + member[ j ] = getConvertedIndex( channel.arrIndices[ j ] ); + + } + + } else { + + member = getConvertedMember( channel.member ); + + } + + if ( transform ) { + + if ( sids.indexOf( fullSid ) === -1 ) { + + sids.push( fullSid ); + + } + + for ( var j = 0, jl = input.length; j < jl; j ++ ) { + + var time = input[j], + data = sampler.getData( transform.type, j, member ), + key = findKey( keys, time ); + + if ( !key ) { + + key = new Key( time ); + var timeNdx = findTimeNdx( keys, time ); + keys.splice( timeNdx === -1 ? keys.length : timeNdx, 0, key ); + + } + + key.addTarget( fullSid, transform, member, data ); + + } + + } else { + + console.log( 'Could not find transform "' + channel.sid + '" in node ' + node.id ); + + } + + } + + // post process + for ( var i = 0; i < sids.length; i ++ ) { + + var sid = sids[ i ]; + + for ( var j = 0; j < keys.length; j ++ ) { + + var key = keys[ j ]; + + if ( !key.hasTarget( sid ) ) { + + interpolateKeys( keys, key, j, sid ); + + } + + } + + } + + node.keys = keys; + node.sids = sids; + + } + + }; + + function findKey ( keys, time) { + + var retVal = null; + + for ( var i = 0, il = keys.length; i < il && retVal === null; i ++ ) { + + var key = keys[i]; + + if ( key.time === time ) { + + retVal = key; + + } else if ( key.time > time ) { + + break; + + } + + } + + return retVal; + + }; + + function findTimeNdx ( keys, time) { + + var ndx = -1; + + for ( var i = 0, il = keys.length; i < il && ndx === -1; i ++ ) { + + var key = keys[i]; + + if ( key.time >= time ) { + + ndx = i; + + } + + } + + return ndx; + + }; + + function interpolateKeys ( keys, key, ndx, fullSid ) { + + var prevKey = getPrevKeyWith( keys, fullSid, ndx ? ndx - 1 : 0 ), + nextKey = getNextKeyWith( keys, fullSid, ndx + 1 ); + + if ( prevKey && nextKey ) { + + var scale = (key.time - prevKey.time) / (nextKey.time - prevKey.time), + prevTarget = prevKey.getTarget( fullSid ), + nextData = nextKey.getTarget( fullSid ).data, + prevData = prevTarget.data, + data; + + if ( prevTarget.type === 'matrix' ) { + + data = prevData; + + } else if ( prevData.length ) { + + data = []; + + for ( var i = 0; i < prevData.length; ++ i ) { + + data[ i ] = prevData[ i ] + ( nextData[ i ] - prevData[ i ] ) * scale; + + } + + } else { + + data = prevData + ( nextData - prevData ) * scale; + + } + + key.addTarget( fullSid, prevTarget.transform, prevTarget.member, data ); + + } + + }; + + // Get next key with given sid + + function getNextKeyWith( keys, fullSid, ndx ) { + + for ( ; ndx < keys.length; ndx ++ ) { + + var key = keys[ ndx ]; + + if ( key.hasTarget( fullSid ) ) { + + return key; + + } + + } + + return null; + + }; + + // Get previous key with given sid + + function getPrevKeyWith( keys, fullSid, ndx ) { + + ndx = ndx >= 0 ? ndx : ndx + keys.length; + + for ( ; ndx >= 0; ndx -- ) { + + var key = keys[ ndx ]; + + if ( key.hasTarget( fullSid ) ) { + + return key; + + } + + } + + return null; + + }; + + function _Image() { + + this.id = ""; + this.init_from = ""; + + }; + + _Image.prototype.parse = function(element) { + + this.id = element.getAttribute('id'); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + if ( child.nodeName === 'init_from' ) { + + this.init_from = child.textContent; + + } + + } + + return this; + + }; + + function Controller() { + + this.id = ""; + this.name = ""; + this.type = ""; + this.skin = null; + this.morph = null; + + }; + + Controller.prototype.parse = function( element ) { + + this.id = element.getAttribute('id'); + this.name = element.getAttribute('name'); + this.type = "none"; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'skin': + + this.skin = (new Skin()).parse(child); + this.type = child.nodeName; + break; + + case 'morph': + + this.morph = (new Morph()).parse(child); + this.type = child.nodeName; + break; + + default: + break; + + } + } + + return this; + + }; + + function Morph() { + + this.method = null; + this.source = null; + this.targets = null; + this.weights = null; + + }; + + Morph.prototype.parse = function( element ) { + + var sources = {}; + var inputs = []; + var i; + + this.method = element.getAttribute( 'method' ); + this.source = element.getAttribute( 'source' ).replace( /^#/, '' ); + + for ( i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'source': + + var source = ( new Source() ).parse( child ); + sources[ source.id ] = source; + break; + + case 'targets': + + inputs = this.parseInputs( child ); + break; + + default: + + console.log( child.nodeName ); + break; + + } + + } + + for ( i = 0; i < inputs.length; i ++ ) { + + var input = inputs[ i ]; + var source = sources[ input.source ]; + + switch ( input.semantic ) { + + case 'MORPH_TARGET': + + this.targets = source.read(); + break; + + case 'MORPH_WEIGHT': + + this.weights = source.read(); + break; + + default: + break; + + } + } + + return this; + + }; + + Morph.prototype.parseInputs = function(element) { + + var inputs = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + if ( child.nodeType != 1) continue; + + switch ( child.nodeName ) { + + case 'input': + + inputs.push( (new Input()).parse(child) ); + break; + + default: + break; + } + } + + return inputs; + + }; + + function Skin() { + + this.source = ""; + this.bindShapeMatrix = null; + this.invBindMatrices = []; + this.joints = []; + this.weights = []; + + }; + + Skin.prototype.parse = function( element ) { + + var sources = {}; + var joints, weights; + + this.source = element.getAttribute( 'source' ).replace( /^#/, '' ); + this.invBindMatrices = []; + this.joints = []; + this.weights = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'bind_shape_matrix': + + var f = _floats(child.textContent); + this.bindShapeMatrix = getConvertedMat4( f ); + break; + + case 'source': + + var src = new Source().parse(child); + sources[ src.id ] = src; + break; + + case 'joints': + + joints = child; + break; + + case 'vertex_weights': + + weights = child; + break; + + default: + + console.log( child.nodeName ); + break; + + } + } + + this.parseJoints( joints, sources ); + this.parseWeights( weights, sources ); + + return this; + + }; + + Skin.prototype.parseJoints = function ( element, sources ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + + var input = ( new Input() ).parse( child ); + var source = sources[ input.source ]; + + if ( input.semantic === 'JOINT' ) { + + this.joints = source.read(); + + } else if ( input.semantic === 'INV_BIND_MATRIX' ) { + + this.invBindMatrices = source.read(); + + } + + break; + + default: + break; + } + + } + + }; + + Skin.prototype.parseWeights = function ( element, sources ) { + + var v, vcount, inputs = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + + inputs.push( ( new Input() ).parse( child ) ); + break; + + case 'v': + + v = _ints( child.textContent ); + break; + + case 'vcount': + + vcount = _ints( child.textContent ); + break; + + default: + break; + + } + + } + + var index = 0; + + for ( var i = 0; i < vcount.length; i ++ ) { + + var numBones = vcount[i]; + var vertex_weights = []; + + for ( var j = 0; j < numBones; j ++ ) { + + var influence = {}; + + for ( var k = 0; k < inputs.length; k ++ ) { + + var input = inputs[ k ]; + var value = v[ index + input.offset ]; + + switch ( input.semantic ) { + + case 'JOINT': + + influence.joint = value;//this.joints[value]; + break; + + case 'WEIGHT': + + influence.weight = sources[ input.source ].data[ value ]; + break; + + default: + break; + + } + + } + + vertex_weights.push( influence ); + index += inputs.length; + } + + for ( var j = 0; j < vertex_weights.length; j ++ ) { + + vertex_weights[ j ].index = i; + + } + + this.weights.push( vertex_weights ); + + } + + }; + + function VisualScene () { + + this.id = ""; + this.name = ""; + this.nodes = []; + this.scene = new THREE.Group(); + + }; + + VisualScene.prototype.getChildById = function( id, recursive ) { + + for ( var i = 0; i < this.nodes.length; i ++ ) { + + var node = this.nodes[ i ].getChildById( id, recursive ); + + if ( node ) { + + return node; + + } + + } + + return null; + + }; + + VisualScene.prototype.getChildBySid = function( sid, recursive ) { + + for ( var i = 0; i < this.nodes.length; i ++ ) { + + var node = this.nodes[ i ].getChildBySid( sid, recursive ); + + if ( node ) { + + return node; + + } + + } + + return null; + + }; + + VisualScene.prototype.parse = function( element ) { + + this.id = element.getAttribute( 'id' ); + this.name = element.getAttribute( 'name' ); + this.nodes = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'node': + + this.nodes.push( ( new Node() ).parse( child ) ); + break; + + default: + break; + + } + + } + + return this; + + }; + + function Node() { + + this.id = ""; + this.name = ""; + this.sid = ""; + this.nodes = []; + this.controllers = []; + this.transforms = []; + this.geometries = []; + this.channels = []; + this.matrix = new THREE.Matrix4(); + + }; + + Node.prototype.getChannelForTransform = function( transformSid ) { + + for ( var i = 0; i < this.channels.length; i ++ ) { + + var channel = this.channels[i]; + var parts = channel.target.split('/'); + var id = parts.shift(); + var sid = parts.shift(); + var dotSyntax = (sid.indexOf(".") >= 0); + var arrSyntax = (sid.indexOf("(") >= 0); + var arrIndices; + var member; + + if ( dotSyntax ) { + + parts = sid.split("."); + sid = parts.shift(); + member = parts.shift(); + + } else if ( arrSyntax ) { + + arrIndices = sid.split("("); + sid = arrIndices.shift(); + + for ( var j = 0; j < arrIndices.length; j ++ ) { + + arrIndices[ j ] = parseInt( arrIndices[ j ].replace( /\)/, '' ) ); + + } + + } + + if ( sid === transformSid ) { + + channel.info = { sid: sid, dotSyntax: dotSyntax, arrSyntax: arrSyntax, arrIndices: arrIndices }; + return channel; + + } + + } + + return null; + + }; + + Node.prototype.getChildById = function ( id, recursive ) { + + if ( this.id === id ) { + + return this; + + } + + if ( recursive ) { + + for ( var i = 0; i < this.nodes.length; i ++ ) { + + var n = this.nodes[ i ].getChildById( id, recursive ); + + if ( n ) { + + return n; + + } + + } + + } + + return null; + + }; + + Node.prototype.getChildBySid = function ( sid, recursive ) { + + if ( this.sid === sid ) { + + return this; + + } + + if ( recursive ) { + + for ( var i = 0; i < this.nodes.length; i ++ ) { + + var n = this.nodes[ i ].getChildBySid( sid, recursive ); + + if ( n ) { + + return n; + + } + + } + } + + return null; + + }; + + Node.prototype.getTransformBySid = function ( sid ) { + + for ( var i = 0; i < this.transforms.length; i ++ ) { + + if ( this.transforms[ i ].sid === sid ) return this.transforms[ i ]; + + } + + return null; + + }; + + Node.prototype.parse = function( element ) { + + var url; + + this.id = element.getAttribute('id'); + this.sid = element.getAttribute('sid'); + this.name = element.getAttribute('name'); + this.type = element.getAttribute('type'); + this.layer = element.getAttribute('layer'); + + this.type = this.type === 'JOINT' ? this.type : 'NODE'; + + this.nodes = []; + this.transforms = []; + this.geometries = []; + this.cameras = []; + this.lights = []; + this.controllers = []; + this.matrix = new THREE.Matrix4(); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'node': + + this.nodes.push( ( new Node() ).parse( child ) ); + break; + + case 'instance_camera': + + this.cameras.push( ( new InstanceCamera() ).parse( child ) ); + break; + + case 'instance_controller': + + this.controllers.push( ( new InstanceController() ).parse( child ) ); + break; + + case 'instance_geometry': + + this.geometries.push( ( new InstanceGeometry() ).parse( child ) ); + break; + + case 'instance_light': + + this.lights.push( ( new InstanceLight() ).parse( child ) ); + break; + + case 'instance_node': + + url = child.getAttribute( 'url' ).replace( /^#/, '' ); + var iNode = getLibraryNode( url ); + + if ( iNode ) { + + this.nodes.push( ( new Node() ).parse( iNode )) ; + + } + + break; + + case 'rotate': + case 'translate': + case 'scale': + case 'matrix': + case 'lookat': + case 'skew': + + this.transforms.push( ( new Transform() ).parse( child ) ); + break; + + case 'extra': + break; + + default: + + console.log( child.nodeName ); + break; + + } + + } + + this.channels = getChannelsForNode( this ); + bakeAnimations( this ); + + this.updateMatrix(); + + return this; + + }; + + Node.prototype.updateMatrix = function () { + + this.matrix.identity(); + + for ( var i = 0; i < this.transforms.length; i ++ ) { + + this.transforms[ i ].apply( this.matrix ); + + } + + }; + + function Transform () { + + this.sid = ""; + this.type = ""; + this.data = []; + this.obj = null; + + }; + + Transform.prototype.parse = function ( element ) { + + this.sid = element.getAttribute( 'sid' ); + this.type = element.nodeName; + this.data = _floats( element.textContent ); + this.convert(); + + return this; + + }; + + Transform.prototype.convert = function () { + + switch ( this.type ) { + + case 'matrix': + + this.obj = getConvertedMat4( this.data ); + break; + + case 'rotate': + + this.angle = THREE.Math.degToRad( this.data[3] ); + + case 'translate': + + fixCoords( this.data, -1 ); + this.obj = new THREE.Vector3( this.data[ 0 ], this.data[ 1 ], this.data[ 2 ] ); + break; + + case 'scale': + + fixCoords( this.data, 1 ); + this.obj = new THREE.Vector3( this.data[ 0 ], this.data[ 1 ], this.data[ 2 ] ); + break; + + default: + console.log( 'Can not convert Transform of type ' + this.type ); + break; + + } + + }; + + Transform.prototype.apply = function () { + + var m1 = new THREE.Matrix4(); + + return function ( matrix ) { + + switch ( this.type ) { + + case 'matrix': + + matrix.multiply( this.obj ); + + break; + + case 'translate': + + matrix.multiply( m1.makeTranslation( this.obj.x, this.obj.y, this.obj.z ) ); + + break; + + case 'rotate': + + matrix.multiply( m1.makeRotationAxis( this.obj, this.angle ) ); + + break; + + case 'scale': + + matrix.scale( this.obj ); + + break; + + } + + }; + + }(); + + Transform.prototype.update = function ( data, member ) { + + var members = [ 'X', 'Y', 'Z', 'ANGLE' ]; + + switch ( this.type ) { + + case 'matrix': + + if ( ! member ) { + + this.obj.copy( data ); + + } else if ( member.length === 1 ) { + + switch ( member[ 0 ] ) { + + case 0: + + this.obj.n11 = data[ 0 ]; + this.obj.n21 = data[ 1 ]; + this.obj.n31 = data[ 2 ]; + this.obj.n41 = data[ 3 ]; + + break; + + case 1: + + this.obj.n12 = data[ 0 ]; + this.obj.n22 = data[ 1 ]; + this.obj.n32 = data[ 2 ]; + this.obj.n42 = data[ 3 ]; + + break; + + case 2: + + this.obj.n13 = data[ 0 ]; + this.obj.n23 = data[ 1 ]; + this.obj.n33 = data[ 2 ]; + this.obj.n43 = data[ 3 ]; + + break; + + case 3: + + this.obj.n14 = data[ 0 ]; + this.obj.n24 = data[ 1 ]; + this.obj.n34 = data[ 2 ]; + this.obj.n44 = data[ 3 ]; + + break; + + } + + } else if ( member.length === 2 ) { + + var propName = 'n' + ( member[ 0 ] + 1 ) + ( member[ 1 ] + 1 ); + this.obj[ propName ] = data; + + } else { + + console.log('Incorrect addressing of matrix in transform.'); + + } + + break; + + case 'translate': + case 'scale': + + if ( Object.prototype.toString.call( member ) === '[object Array]' ) { + + member = members[ member[ 0 ] ]; + + } + + switch ( member ) { + + case 'X': + + this.obj.x = data; + break; + + case 'Y': + + this.obj.y = data; + break; + + case 'Z': + + this.obj.z = data; + break; + + default: + + this.obj.x = data[ 0 ]; + this.obj.y = data[ 1 ]; + this.obj.z = data[ 2 ]; + break; + + } + + break; + + case 'rotate': + + if ( Object.prototype.toString.call( member ) === '[object Array]' ) { + + member = members[ member[ 0 ] ]; + + } + + switch ( member ) { + + case 'X': + + this.obj.x = data; + break; + + case 'Y': + + this.obj.y = data; + break; + + case 'Z': + + this.obj.z = data; + break; + + case 'ANGLE': + + this.angle = THREE.Math.degToRad( data ); + break; + + default: + + this.obj.x = data[ 0 ]; + this.obj.y = data[ 1 ]; + this.obj.z = data[ 2 ]; + this.angle = THREE.Math.degToRad( data[ 3 ] ); + break; + + } + break; + + } + + }; + + function InstanceController() { + + this.url = ""; + this.skeleton = []; + this.instance_material = []; + + }; + + InstanceController.prototype.parse = function ( element ) { + + this.url = element.getAttribute('url').replace(/^#/, ''); + this.skeleton = []; + this.instance_material = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'skeleton': + + this.skeleton.push( child.textContent.replace(/^#/, '') ); + break; + + case 'bind_material': + + var instances = child.querySelectorAll('instance_material'); + + for ( var j = 0; j < instances.length; j ++ ) { + + var instance = instances[j]; + this.instance_material.push( (new InstanceMaterial()).parse(instance) ); + + } + + + break; + + case 'extra': + break; + + default: + break; + + } + } + + return this; + + }; + + function InstanceMaterial () { + + this.symbol = ""; + this.target = ""; + + }; + + InstanceMaterial.prototype.parse = function ( element ) { + + this.symbol = element.getAttribute('symbol'); + this.target = element.getAttribute('target').replace(/^#/, ''); + return this; + + }; + + function InstanceGeometry() { + + this.url = ""; + this.instance_material = []; + + }; + + InstanceGeometry.prototype.parse = function ( element ) { + + this.url = element.getAttribute('url').replace(/^#/, ''); + this.instance_material = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + if ( child.nodeType != 1 ) continue; + + if ( child.nodeName === 'bind_material' ) { + + var instances = child.querySelectorAll('instance_material'); + + for ( var j = 0; j < instances.length; j ++ ) { + + var instance = instances[j]; + this.instance_material.push( (new InstanceMaterial()).parse(instance) ); + + } + + break; + + } + + } + + return this; + + }; + + function Geometry() { + + this.id = ""; + this.mesh = null; + + }; + + Geometry.prototype.parse = function ( element ) { + + this.id = element.getAttribute('id'); + + extractDoubleSided( this, element ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + + switch ( child.nodeName ) { + + case 'mesh': + + this.mesh = (new Mesh(this)).parse(child); + break; + + case 'extra': + + // console.log( child ); + break; + + default: + break; + } + } + + return this; + + }; + + function Mesh( geometry ) { + + this.geometry = geometry.id; + this.primitives = []; + this.vertices = null; + this.geometry3js = null; + + }; + + Mesh.prototype.parse = function ( element ) { + + this.primitives = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'source': + + _source( child ); + break; + + case 'vertices': + + this.vertices = ( new Vertices() ).parse( child ); + break; + + case 'linestrips': + + this.primitives.push( ( new LineStrips().parse( child ) ) ); + break; + + case 'triangles': + + this.primitives.push( ( new Triangles().parse( child ) ) ); + break; + + case 'polygons': + + this.primitives.push( ( new Polygons().parse( child ) ) ); + break; + + case 'polylist': + + this.primitives.push( ( new Polylist().parse( child ) ) ); + break; + + default: + break; + + } + + } + + this.geometry3js = new THREE.Geometry(); + + if ( this.vertices === null ) { + + // TODO (mrdoob): Study case when this is null (carrier.dae) + + return this; + + } + + var vertexData = sources[ this.vertices.input['POSITION'].source ].data; + + for ( var i = 0; i < vertexData.length; i += 3 ) { + + this.geometry3js.vertices.push( getConvertedVec3( vertexData, i ).clone() ); + + } + + for ( var i = 0; i < this.primitives.length; i ++ ) { + + var primitive = this.primitives[ i ]; + primitive.setVertices( this.vertices ); + this.handlePrimitive( primitive, this.geometry3js ); + + } + + if ( this.geometry3js.calcNormals ) { + + this.geometry3js.computeVertexNormals(); + delete this.geometry3js.calcNormals; + + } + + return this; + + }; + + Mesh.prototype.handlePrimitive = function ( primitive, geom ) { + + if ( primitive instanceof LineStrips ) { + + // TODO: Handle indices. Maybe easier with BufferGeometry? + + geom.isLineStrip = true; + return; + + } + + var j, k, pList = primitive.p, inputs = primitive.inputs; + var input, index, idx32; + var source, numParams; + var vcIndex = 0, vcount = 3, maxOffset = 0; + var texture_sets = []; + + for ( j = 0; j < inputs.length; j ++ ) { + + input = inputs[ j ]; + + var offset = input.offset + 1; + maxOffset = (maxOffset < offset) ? offset : maxOffset; + + switch ( input.semantic ) { + + case 'TEXCOORD': + texture_sets.push( input.set ); + break; + + } + + } + + for ( var pCount = 0; pCount < pList.length; ++ pCount ) { + + var p = pList[ pCount ], i = 0; + + while ( i < p.length ) { + + var vs = []; + var ns = []; + var ts = null; + var cs = []; + + if ( primitive.vcount ) { + + vcount = primitive.vcount.length ? primitive.vcount[ vcIndex ++ ] : primitive.vcount; + + } else { + + vcount = p.length / maxOffset; + + } + + + for ( j = 0; j < vcount; j ++ ) { + + for ( k = 0; k < inputs.length; k ++ ) { + + input = inputs[ k ]; + source = sources[ input.source ]; + + index = p[ i + ( j * maxOffset ) + input.offset ]; + numParams = source.accessor.params.length; + idx32 = index * numParams; + + switch ( input.semantic ) { + + case 'VERTEX': + + vs.push( index ); + + break; + + case 'NORMAL': + + ns.push( getConvertedVec3( source.data, idx32 ) ); + + break; + + case 'TEXCOORD': + + ts = ts || { }; + if ( ts[ input.set ] === undefined ) ts[ input.set ] = []; + // invert the V + ts[ input.set ].push( new THREE.Vector2( source.data[ idx32 ], source.data[ idx32 + 1 ] ) ); + + break; + + case 'COLOR': + + cs.push( new THREE.Color().setRGB( source.data[ idx32 ], source.data[ idx32 + 1 ], source.data[ idx32 + 2 ] ) ); + + break; + + default: + + break; + + } + + } + + } + + if ( ns.length === 0 ) { + + // check the vertices inputs + input = this.vertices.input.NORMAL; + + if ( input ) { + + source = sources[ input.source ]; + numParams = source.accessor.params.length; + + for ( var ndx = 0, len = vs.length; ndx < len; ndx ++ ) { + + ns.push( getConvertedVec3( source.data, vs[ ndx ] * numParams ) ); + + } + + } else { + + geom.calcNormals = true; + + } + + } + + if ( !ts ) { + + ts = { }; + // check the vertices inputs + input = this.vertices.input.TEXCOORD; + + if ( input ) { + + texture_sets.push( input.set ); + source = sources[ input.source ]; + numParams = source.accessor.params.length; + + for ( var ndx = 0, len = vs.length; ndx < len; ndx ++ ) { + + idx32 = vs[ ndx ] * numParams; + if ( ts[ input.set ] === undefined ) ts[ input.set ] = [ ]; + // invert the V + ts[ input.set ].push( new THREE.Vector2( source.data[ idx32 ], 1.0 - source.data[ idx32 + 1 ] ) ); + + } + + } + + } + + if ( cs.length === 0 ) { + + // check the vertices inputs + input = this.vertices.input.COLOR; + + if ( input ) { + + source = sources[ input.source ]; + numParams = source.accessor.params.length; + + for ( var ndx = 0, len = vs.length; ndx < len; ndx ++ ) { + + idx32 = vs[ ndx ] * numParams; + cs.push( new THREE.Color().setRGB( source.data[ idx32 ], source.data[ idx32 + 1 ], source.data[ idx32 + 2 ] ) ); + + } + + } + + } + + var face = null, faces = [], uv, uvArr; + + if ( vcount === 3 ) { + + faces.push( new THREE.Face3( vs[0], vs[1], vs[2], ns, cs.length ? cs : new THREE.Color() ) ); + + } else if ( vcount === 4 ) { + + faces.push( new THREE.Face3( vs[0], vs[1], vs[3], [ ns[0].clone(), ns[1].clone(), ns[3].clone() ], cs.length ? [ cs[0], cs[1], cs[3] ] : new THREE.Color() ) ); + + faces.push( new THREE.Face3( vs[1], vs[2], vs[3], [ ns[1].clone(), ns[2].clone(), ns[3].clone() ], cs.length ? [ cs[1], cs[2], cs[3] ] : new THREE.Color() ) ); + + } else if ( vcount > 4 && options.subdivideFaces ) { + + var clr = cs.length ? cs : new THREE.Color(), + vec1, vec2, vec3, v1, v2, norm; + + // subdivide into multiple Face3s + + for ( k = 1; k < vcount - 1; ) { + + faces.push( new THREE.Face3( vs[0], vs[k], vs[k + 1], [ ns[0].clone(), ns[k ++].clone(), ns[k].clone() ], clr ) ); + + } + + } + + if ( faces.length ) { + + for ( var ndx = 0, len = faces.length; ndx < len; ndx ++ ) { + + face = faces[ndx]; + face.daeMaterial = primitive.material; + geom.faces.push( face ); + + for ( k = 0; k < texture_sets.length; k ++ ) { + + uv = ts[ texture_sets[k] ]; + + if ( vcount > 4 ) { + + // Grab the right UVs for the vertices in this face + uvArr = [ uv[0], uv[ndx + 1], uv[ndx + 2] ]; + + } else if ( vcount === 4 ) { + + if ( ndx === 0 ) { + + uvArr = [ uv[0], uv[1], uv[3] ]; + + } else { + + uvArr = [ uv[1].clone(), uv[2], uv[3].clone() ]; + + } + + } else { + + uvArr = [ uv[0], uv[1], uv[2] ]; + + } + + if ( geom.faceVertexUvs[k] === undefined ) { + + geom.faceVertexUvs[k] = []; + + } + + geom.faceVertexUvs[k].push( uvArr ); + + } + + } + + } else { + + console.log( 'dropped face with vcount ' + vcount + ' for geometry with id: ' + geom.id ); + + } + + i += maxOffset * vcount; + + } + + } + + }; + + function Polygons () { + + this.material = ""; + this.count = 0; + this.inputs = []; + this.vcount = null; + this.p = []; + this.geometry = new THREE.Geometry(); + + }; + + Polygons.prototype.setVertices = function ( vertices ) { + + for ( var i = 0; i < this.inputs.length; i ++ ) { + + if ( this.inputs[ i ].source === vertices.id ) { + + this.inputs[ i ].source = vertices.input[ 'POSITION' ].source; + + } + + } + + }; + + Polygons.prototype.parse = function ( element ) { + + this.material = element.getAttribute( 'material' ); + this.count = _attr_as_int( element, 'count', 0 ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'input': + + this.inputs.push( ( new Input() ).parse( element.childNodes[ i ] ) ); + break; + + case 'vcount': + + this.vcount = _ints( child.textContent ); + break; + + case 'p': + + this.p.push( _ints( child.textContent ) ); + break; + + case 'ph': + + console.warn( 'polygon holes not yet supported!' ); + break; + + default: + break; + + } + + } + + return this; + + }; + + function Polylist () { + + Polygons.call( this ); + + this.vcount = []; + + }; + + Polylist.prototype = Object.create( Polygons.prototype ); + Polylist.prototype.constructor = Polylist; + + function LineStrips() { + + Polygons.call( this ); + + this.vcount = 1; + + }; + + LineStrips.prototype = Object.create( Polygons.prototype ); + LineStrips.prototype.constructor = LineStrips; + + function Triangles () { + + Polygons.call( this ); + + this.vcount = 3; + + }; + + Triangles.prototype = Object.create( Polygons.prototype ); + Triangles.prototype.constructor = Triangles; + + function Accessor() { + + this.source = ""; + this.count = 0; + this.stride = 0; + this.params = []; + + }; + + Accessor.prototype.parse = function ( element ) { + + this.params = []; + this.source = element.getAttribute( 'source' ); + this.count = _attr_as_int( element, 'count', 0 ); + this.stride = _attr_as_int( element, 'stride', 0 ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + if ( child.nodeName === 'param' ) { + + var param = {}; + param[ 'name' ] = child.getAttribute( 'name' ); + param[ 'type' ] = child.getAttribute( 'type' ); + this.params.push( param ); + + } + + } + + return this; + + }; + + function Vertices() { + + this.input = {}; + + }; + + Vertices.prototype.parse = function ( element ) { + + this.id = element.getAttribute('id'); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + if ( element.childNodes[i].nodeName === 'input' ) { + + var input = ( new Input() ).parse( element.childNodes[ i ] ); + this.input[ input.semantic ] = input; + + } + + } + + return this; + + }; + + function Input () { + + this.semantic = ""; + this.offset = 0; + this.source = ""; + this.set = 0; + + }; + + Input.prototype.parse = function ( element ) { + + this.semantic = element.getAttribute('semantic'); + this.source = element.getAttribute('source').replace(/^#/, ''); + this.set = _attr_as_int(element, 'set', -1); + this.offset = _attr_as_int(element, 'offset', 0); + + if ( this.semantic === 'TEXCOORD' && this.set < 0 ) { + + this.set = 0; + + } + + return this; + + }; + + function Source ( id ) { + + this.id = id; + this.type = null; + + }; + + Source.prototype.parse = function ( element ) { + + this.id = element.getAttribute( 'id' ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + + switch ( child.nodeName ) { + + case 'bool_array': + + this.data = _bools( child.textContent ); + this.type = child.nodeName; + break; + + case 'float_array': + + this.data = _floats( child.textContent ); + this.type = child.nodeName; + break; + + case 'int_array': + + this.data = _ints( child.textContent ); + this.type = child.nodeName; + break; + + case 'IDREF_array': + case 'Name_array': + + this.data = _strings( child.textContent ); + this.type = child.nodeName; + break; + + case 'technique_common': + + for ( var j = 0; j < child.childNodes.length; j ++ ) { + + if ( child.childNodes[ j ].nodeName === 'accessor' ) { + + this.accessor = ( new Accessor() ).parse( child.childNodes[ j ] ); + break; + + } + } + break; + + default: + // console.log(child.nodeName); + break; + + } + + } + + return this; + + }; + + Source.prototype.read = function () { + + var result = []; + + //for (var i = 0; i < this.accessor.params.length; i++) { + + var param = this.accessor.params[ 0 ]; + + //console.log(param.name + " " + param.type); + + switch ( param.type ) { + + case 'IDREF': + case 'Name': case 'name': + case 'float': + + return this.data; + + case 'float4x4': + + for ( var j = 0; j < this.data.length; j += 16 ) { + + var s = this.data.slice( j, j + 16 ); + var m = getConvertedMat4( s ); + result.push( m ); + } + + break; + + default: + + console.log( 'ColladaLoader: Source: Read dont know how to read ' + param.type + '.' ); + break; + + } + + //} + + return result; + + }; + + function Material () { + + this.id = ""; + this.name = ""; + this.instance_effect = null; + + }; + + Material.prototype.parse = function ( element ) { + + this.id = element.getAttribute( 'id' ); + this.name = element.getAttribute( 'name' ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + if ( element.childNodes[ i ].nodeName === 'instance_effect' ) { + + this.instance_effect = ( new InstanceEffect() ).parse( element.childNodes[ i ] ); + break; + + } + + } + + return this; + + }; + + function ColorOrTexture () { + + this.color = new THREE.Color(); + this.color.setRGB( Math.random(), Math.random(), Math.random() ); + this.color.a = 1.0; + + this.texture = null; + this.texcoord = null; + this.texOpts = null; + + }; + + ColorOrTexture.prototype.isColor = function () { + + return ( this.texture === null ); + + }; + + ColorOrTexture.prototype.isTexture = function () { + + return ( this.texture != null ); + + }; + + ColorOrTexture.prototype.parse = function ( element ) { + + if (element.nodeName === 'transparent') { + + this.opaque = element.getAttribute('opaque'); + + } + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'color': + + var rgba = _floats( child.textContent ); + this.color = new THREE.Color(); + this.color.setRGB( rgba[0], rgba[1], rgba[2] ); + this.color.a = rgba[3]; + break; + + case 'texture': + + this.texture = child.getAttribute('texture'); + this.texcoord = child.getAttribute('texcoord'); + // Defaults from: + // https://collada.org/mediawiki/index.php/Maya_texture_placement_MAYA_extension + this.texOpts = { + offsetU: 0, + offsetV: 0, + repeatU: 1, + repeatV: 1, + wrapU: 1, + wrapV: 1 + }; + this.parseTexture( child ); + break; + + default: + break; + + } + + } + + return this; + + }; + + ColorOrTexture.prototype.parseTexture = function ( element ) { + + if ( ! element.childNodes ) return this; + + // This should be supported by Maya, 3dsMax, and MotionBuilder + + if ( element.childNodes[1] && element.childNodes[1].nodeName === 'extra' ) { + + element = element.childNodes[1]; + + if ( element.childNodes[1] && element.childNodes[1].nodeName === 'technique' ) { + + element = element.childNodes[1]; + + } + + } + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'offsetU': + case 'offsetV': + case 'repeatU': + case 'repeatV': + + this.texOpts[ child.nodeName ] = parseFloat( child.textContent ); + + break; + + case 'wrapU': + case 'wrapV': + + // some dae have a value of true which becomes NaN via parseInt + + if ( child.textContent.toUpperCase() === 'TRUE' ) { + + this.texOpts[ child.nodeName ] = 1; + + } else { + + this.texOpts[ child.nodeName ] = parseInt( child.textContent ); + + } + break; + + default: + + this.texOpts[ child.nodeName ] = child.textContent; + + break; + + } + + } + + return this; + + }; + + function Shader ( type, effect ) { + + this.type = type; + this.effect = effect; + this.material = null; + + }; + + Shader.prototype.parse = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'emission': + case 'diffuse': + case 'specular': + case 'transparent': + + this[ child.nodeName ] = ( new ColorOrTexture() ).parse( child ); + break; + + case 'bump': + + // If 'bumptype' is 'heightfield', create a 'bump' property + // Else if 'bumptype' is 'normalmap', create a 'normal' property + // (Default to 'bump') + var bumpType = child.getAttribute( 'bumptype' ); + if ( bumpType ) { + if ( bumpType.toLowerCase() === "heightfield" ) { + this[ 'bump' ] = ( new ColorOrTexture() ).parse( child ); + } else if ( bumpType.toLowerCase() === "normalmap" ) { + this[ 'normal' ] = ( new ColorOrTexture() ).parse( child ); + } else { + console.error( "Shader.prototype.parse: Invalid value for attribute 'bumptype' (" + bumpType + ") - valid bumptypes are 'HEIGHTFIELD' and 'NORMALMAP' - defaulting to 'HEIGHTFIELD'" ); + this[ 'bump' ] = ( new ColorOrTexture() ).parse( child ); + } + } else { + console.warn( "Shader.prototype.parse: Attribute 'bumptype' missing from bump node - defaulting to 'HEIGHTFIELD'" ); + this[ 'bump' ] = ( new ColorOrTexture() ).parse( child ); + } + + break; + + case 'shininess': + case 'reflectivity': + case 'index_of_refraction': + case 'transparency': + + var f = child.querySelectorAll('float'); + + if ( f.length > 0 ) + this[ child.nodeName ] = parseFloat( f[ 0 ].textContent ); + + break; + + default: + break; + + } + + } + + this.create(); + return this; + + }; + + Shader.prototype.create = function() { + + var props = {}; + + var transparent = false; + + if (this['transparency'] !== undefined && this['transparent'] !== undefined) { + // convert transparent color RBG to average value + var transparentColor = this['transparent']; + var transparencyLevel = (this.transparent.color.r + this.transparent.color.g + this.transparent.color.b) / 3 * this.transparency; + + if (transparencyLevel > 0) { + transparent = true; + props[ 'transparent' ] = true; + props[ 'opacity' ] = 1 - transparencyLevel; + + } + + } + + var keys = { + 'diffuse':'map', + 'ambient':'lightMap', + 'specular':'specularMap', + 'emission':'emissionMap', + 'bump':'bumpMap', + 'normal':'normalMap' + }; + + for ( var prop in this ) { + + switch ( prop ) { + + case 'ambient': + case 'emission': + case 'diffuse': + case 'specular': + case 'bump': + case 'normal': + + var cot = this[ prop ]; + + if ( cot instanceof ColorOrTexture ) { + + if ( cot.isTexture() ) { + + var samplerId = cot.texture; + var surfaceId = this.effect.sampler[samplerId]; + + if ( surfaceId !== undefined && surfaceId.source !== undefined ) { + + var surface = this.effect.surface[surfaceId.source]; + + if ( surface !== undefined ) { + + var image = images[ surface.init_from ]; + + if ( image ) { + + var url = baseUrl + image.init_from; + + var texture; + var loader = THREE.Loader.Handlers.get( url ); + + if ( loader !== null ) { + + texture = loader.load( url ); + + } else { + + texture = new THREE.Texture(); + + loadTextureImage( texture, url ); + + } + + texture.wrapS = cot.texOpts.wrapU ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; + texture.wrapT = cot.texOpts.wrapV ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; + texture.offset.x = cot.texOpts.offsetU; + texture.offset.y = cot.texOpts.offsetV; + texture.repeat.x = cot.texOpts.repeatU; + texture.repeat.y = cot.texOpts.repeatV; + props[keys[prop]] = texture; + + // Texture with baked lighting? + if (prop === 'emission') props['emissive'] = 0xffffff; + + } + + } + + } + + } else if ( prop === 'diffuse' || !transparent ) { + + if ( prop === 'emission' ) { + + props[ 'emissive' ] = cot.color.getHex(); + + } else { + + props[ prop ] = cot.color.getHex(); + + } + + } + + } + + break; + + case 'shininess': + + props[ prop ] = this[ prop ]; + break; + + case 'reflectivity': + + props[ prop ] = this[ prop ]; + if ( props[ prop ] > 0.0 ) props['envMap'] = options.defaultEnvMap; + props['combine'] = THREE.MixOperation; //mix regular shading with reflective component + break; + + case 'index_of_refraction': + + props[ 'refractionRatio' ] = this[ prop ]; //TODO: "index_of_refraction" becomes "refractionRatio" in shader, but I'm not sure if the two are actually comparable + if ( this[ prop ] !== 1.0 ) props['envMap'] = options.defaultEnvMap; + break; + + case 'transparency': + // gets figured out up top + break; + + default: + break; + + } + + } + + props[ 'shading' ] = preferredShading; + props[ 'side' ] = this.effect.doubleSided ? THREE.DoubleSide : THREE.FrontSide; + + switch ( this.type ) { + + case 'constant': + + if (props.emissive != undefined) props.color = props.emissive; + this.material = new THREE.MeshBasicMaterial( props ); + break; + + case 'phong': + case 'blinn': + + if (props.diffuse != undefined) props.color = props.diffuse; + this.material = new THREE.MeshPhongMaterial( props ); + break; + + case 'lambert': + default: + + if (props.diffuse != undefined) props.color = props.diffuse; + this.material = new THREE.MeshLambertMaterial( props ); + break; + + } + + return this.material; + + }; + + function Surface ( effect ) { + + this.effect = effect; + this.init_from = null; + this.format = null; + + }; + + Surface.prototype.parse = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'init_from': + + this.init_from = child.textContent; + break; + + case 'format': + + this.format = child.textContent; + break; + + default: + + console.log( "unhandled Surface prop: " + child.nodeName ); + break; + + } + + } + + return this; + + }; + + function Sampler2D ( effect ) { + + this.effect = effect; + this.source = null; + this.wrap_s = null; + this.wrap_t = null; + this.minfilter = null; + this.magfilter = null; + this.mipfilter = null; + + }; + + Sampler2D.prototype.parse = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'source': + + this.source = child.textContent; + break; + + case 'minfilter': + + this.minfilter = child.textContent; + break; + + case 'magfilter': + + this.magfilter = child.textContent; + break; + + case 'mipfilter': + + this.mipfilter = child.textContent; + break; + + case 'wrap_s': + + this.wrap_s = child.textContent; + break; + + case 'wrap_t': + + this.wrap_t = child.textContent; + break; + + default: + + console.log( "unhandled Sampler2D prop: " + child.nodeName ); + break; + + } + + } + + return this; + + }; + + function Effect () { + + this.id = ""; + this.name = ""; + this.shader = null; + this.surface = {}; + this.sampler = {}; + + }; + + Effect.prototype.create = function () { + + if ( this.shader === null ) { + + return null; + + } + + }; + + Effect.prototype.parse = function ( element ) { + + this.id = element.getAttribute( 'id' ); + this.name = element.getAttribute( 'name' ); + + extractDoubleSided( this, element ); + + this.shader = null; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'profile_COMMON': + + this.parseTechnique( this.parseProfileCOMMON( child ) ); + break; + + default: + break; + + } + + } + + return this; + + }; + + Effect.prototype.parseNewparam = function ( element ) { + + var sid = element.getAttribute( 'sid' ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'surface': + + this.surface[sid] = ( new Surface( this ) ).parse( child ); + break; + + case 'sampler2D': + + this.sampler[sid] = ( new Sampler2D( this ) ).parse( child ); + break; + + case 'extra': + + break; + + default: + + console.log( child.nodeName ); + break; + + } + + } + + }; + + Effect.prototype.parseProfileCOMMON = function ( element ) { + + var technique; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'profile_COMMON': + + this.parseProfileCOMMON( child ); + break; + + case 'technique': + + technique = child; + break; + + case 'newparam': + + this.parseNewparam( child ); + break; + + case 'image': + + var _image = ( new _Image() ).parse( child ); + images[ _image.id ] = _image; + break; + + case 'extra': + break; + + default: + + console.log( child.nodeName ); + break; + + } + + } + + return technique; + + }; + + Effect.prototype.parseTechnique = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'constant': + case 'lambert': + case 'blinn': + case 'phong': + + this.shader = ( new Shader( child.nodeName, this ) ).parse( child ); + break; + case 'extra': + this.parseExtra(child); + break; + default: + break; + + } + + } + + }; + + Effect.prototype.parseExtra = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique': + this.parseExtraTechnique( child ); + break; + default: + break; + + } + + } + + }; + + Effect.prototype.parseExtraTechnique = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[i]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'bump': + this.shader.parse( element ); + break; + default: + break; + + } + + } + + }; + + function InstanceEffect () { + + this.url = ""; + + }; + + InstanceEffect.prototype.parse = function ( element ) { + + this.url = element.getAttribute( 'url' ).replace( /^#/, '' ); + return this; + + }; + + function Animation() { + + this.id = ""; + this.name = ""; + this.source = {}; + this.sampler = []; + this.channel = []; + + }; + + Animation.prototype.parse = function ( element ) { + + this.id = element.getAttribute( 'id' ); + this.name = element.getAttribute( 'name' ); + this.source = {}; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'animation': + + var anim = ( new Animation() ).parse( child ); + + for ( var src in anim.source ) { + + this.source[ src ] = anim.source[ src ]; + + } + + for ( var j = 0; j < anim.channel.length; j ++ ) { + + this.channel.push( anim.channel[ j ] ); + this.sampler.push( anim.sampler[ j ] ); + + } + + break; + + case 'source': + + var src = ( new Source() ).parse( child ); + this.source[ src.id ] = src; + break; + + case 'sampler': + + this.sampler.push( ( new Sampler( this ) ).parse( child ) ); + break; + + case 'channel': + + this.channel.push( ( new Channel( this ) ).parse( child ) ); + break; + + default: + break; + + } + + } + + return this; + + }; + + function Channel( animation ) { + + this.animation = animation; + this.source = ""; + this.target = ""; + this.fullSid = null; + this.sid = null; + this.dotSyntax = null; + this.arrSyntax = null; + this.arrIndices = null; + this.member = null; + + }; + + Channel.prototype.parse = function ( element ) { + + this.source = element.getAttribute( 'source' ).replace( /^#/, '' ); + this.target = element.getAttribute( 'target' ); + + var parts = this.target.split( '/' ); + + var id = parts.shift(); + var sid = parts.shift(); + + var dotSyntax = ( sid.indexOf(".") >= 0 ); + var arrSyntax = ( sid.indexOf("(") >= 0 ); + + if ( dotSyntax ) { + + parts = sid.split("."); + this.sid = parts.shift(); + this.member = parts.shift(); + + } else if ( arrSyntax ) { + + var arrIndices = sid.split("("); + this.sid = arrIndices.shift(); + + for (var j = 0; j < arrIndices.length; j ++ ) { + + arrIndices[j] = parseInt( arrIndices[j].replace(/\)/, '') ); + + } + + this.arrIndices = arrIndices; + + } else { + + this.sid = sid; + + } + + this.fullSid = sid; + this.dotSyntax = dotSyntax; + this.arrSyntax = arrSyntax; + + return this; + + }; + + function Sampler ( animation ) { + + this.id = ""; + this.animation = animation; + this.inputs = []; + this.input = null; + this.output = null; + this.strideOut = null; + this.interpolation = null; + this.startTime = null; + this.endTime = null; + this.duration = 0; + + }; + + Sampler.prototype.parse = function ( element ) { + + this.id = element.getAttribute( 'id' ); + this.inputs = []; + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + + this.inputs.push( (new Input()).parse( child ) ); + break; + + default: + break; + + } + + } + + return this; + + }; + + Sampler.prototype.create = function () { + + for ( var i = 0; i < this.inputs.length; i ++ ) { + + var input = this.inputs[ i ]; + var source = this.animation.source[ input.source ]; + + switch ( input.semantic ) { + + case 'INPUT': + + this.input = source.read(); + break; + + case 'OUTPUT': + + this.output = source.read(); + this.strideOut = source.accessor.stride; + break; + + case 'INTERPOLATION': + + this.interpolation = source.read(); + break; + + case 'IN_TANGENT': + + break; + + case 'OUT_TANGENT': + + break; + + default: + + console.log(input.semantic); + break; + + } + + } + + this.startTime = 0; + this.endTime = 0; + this.duration = 0; + + if ( this.input.length ) { + + this.startTime = 100000000; + this.endTime = -100000000; + + for ( var i = 0; i < this.input.length; i ++ ) { + + this.startTime = Math.min( this.startTime, this.input[ i ] ); + this.endTime = Math.max( this.endTime, this.input[ i ] ); + + } + + this.duration = this.endTime - this.startTime; + + } + + }; + + Sampler.prototype.getData = function ( type, ndx, member ) { + + var data; + + if ( type === 'matrix' && this.strideOut === 16 ) { + + data = this.output[ ndx ]; + + } else if ( this.strideOut > 1 ) { + + data = []; + ndx *= this.strideOut; + + for ( var i = 0; i < this.strideOut; ++ i ) { + + data[ i ] = this.output[ ndx + i ]; + + } + + if ( this.strideOut === 3 ) { + + switch ( type ) { + + case 'rotate': + case 'translate': + + fixCoords( data, -1 ); + break; + + case 'scale': + + fixCoords( data, 1 ); + break; + + } + + } else if ( this.strideOut === 4 && type === 'matrix' ) { + + fixCoords( data, -1 ); + + } + + } else { + + data = this.output[ ndx ]; + + if ( member && type === 'translate' ) { + data = getConvertedTranslation( member, data ); + } + + } + + return data; + + }; + + function Key ( time ) { + + this.targets = []; + this.time = time; + + }; + + Key.prototype.addTarget = function ( fullSid, transform, member, data ) { + + this.targets.push( { + sid: fullSid, + member: member, + transform: transform, + data: data + } ); + + }; + + Key.prototype.apply = function ( opt_sid ) { + + for ( var i = 0; i < this.targets.length; ++ i ) { + + var target = this.targets[ i ]; + + if ( !opt_sid || target.sid === opt_sid ) { + + target.transform.update( target.data, target.member ); + + } + + } + + }; + + Key.prototype.getTarget = function ( fullSid ) { + + for ( var i = 0; i < this.targets.length; ++ i ) { + + if ( this.targets[ i ].sid === fullSid ) { + + return this.targets[ i ]; + + } + + } + + return null; + + }; + + Key.prototype.hasTarget = function ( fullSid ) { + + for ( var i = 0; i < this.targets.length; ++ i ) { + + if ( this.targets[ i ].sid === fullSid ) { + + return true; + + } + + } + + return false; + + }; + + // TODO: Currently only doing linear interpolation. Should support full COLLADA spec. + Key.prototype.interpolate = function ( nextKey, time ) { + + for ( var i = 0, l = this.targets.length; i < l; i ++ ) { + + var target = this.targets[ i ], + nextTarget = nextKey.getTarget( target.sid ), + data; + + if ( target.transform.type !== 'matrix' && nextTarget ) { + + var scale = ( time - this.time ) / ( nextKey.time - this.time ), + nextData = nextTarget.data, + prevData = target.data; + + if ( scale < 0 ) scale = 0; + if ( scale > 1 ) scale = 1; + + if ( prevData.length ) { + + data = []; + + for ( var j = 0; j < prevData.length; ++ j ) { + + data[ j ] = prevData[ j ] + ( nextData[ j ] - prevData[ j ] ) * scale; + + } + + } else { + + data = prevData + ( nextData - prevData ) * scale; + + } + + } else { + + data = target.data; + + } + + target.transform.update( data, target.member ); + + } + + }; + + // Camera + function Camera() { + + this.id = ""; + this.name = ""; + this.technique = ""; + + }; + + Camera.prototype.parse = function ( element ) { + + this.id = element.getAttribute( 'id' ); + this.name = element.getAttribute( 'name' ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'optics': + + this.parseOptics( child ); + break; + + default: + break; + + } + + } + + return this; + + }; + + Camera.prototype.parseOptics = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + if ( element.childNodes[ i ].nodeName === 'technique_common' ) { + + var technique = element.childNodes[ i ]; + + for ( var j = 0; j < technique.childNodes.length; j ++ ) { + + this.technique = technique.childNodes[ j ].nodeName; + + if ( this.technique === 'perspective' ) { + + var perspective = technique.childNodes[ j ]; + + for ( var k = 0; k < perspective.childNodes.length; k ++ ) { + + var param = perspective.childNodes[ k ]; + + switch ( param.nodeName ) { + + case 'yfov': + this.yfov = param.textContent; + break; + case 'xfov': + this.xfov = param.textContent; + break; + case 'znear': + this.znear = param.textContent; + break; + case 'zfar': + this.zfar = param.textContent; + break; + case 'aspect_ratio': + this.aspect_ratio = param.textContent; + break; + + } + + } + + } else if ( this.technique === 'orthographic' ) { + + var orthographic = technique.childNodes[ j ]; + + for ( var k = 0; k < orthographic.childNodes.length; k ++ ) { + + var param = orthographic.childNodes[ k ]; + + switch ( param.nodeName ) { + + case 'xmag': + this.xmag = param.textContent; + break; + case 'ymag': + this.ymag = param.textContent; + break; + case 'znear': + this.znear = param.textContent; + break; + case 'zfar': + this.zfar = param.textContent; + break; + case 'aspect_ratio': + this.aspect_ratio = param.textContent; + break; + + } + + } + + } + + } + + } + + } + + return this; + + }; + + function InstanceCamera() { + + this.url = ""; + + }; + + InstanceCamera.prototype.parse = function ( element ) { + + this.url = element.getAttribute('url').replace(/^#/, ''); + + return this; + + }; + + // Light + + function Light() { + + this.id = ""; + this.name = ""; + this.technique = ""; + + }; + + Light.prototype.parse = function ( element ) { + + this.id = element.getAttribute( 'id' ); + this.name = element.getAttribute( 'name' ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique_common': + + this.parseCommon( child ); + break; + + case 'technique': + + this.parseTechnique( child ); + break; + + default: + break; + + } + + } + + return this; + + }; + + Light.prototype.parseCommon = function ( element ) { + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + switch ( element.childNodes[ i ].nodeName ) { + + case 'directional': + case 'point': + case 'spot': + case 'ambient': + + this.technique = element.childNodes[ i ].nodeName; + + var light = element.childNodes[ i ]; + + for ( var j = 0; j < light.childNodes.length; j ++ ) { + + var child = light.childNodes[j]; + + switch ( child.nodeName ) { + + case 'color': + + var rgba = _floats( child.textContent ); + this.color = new THREE.Color(0); + this.color.setRGB( rgba[0], rgba[1], rgba[2] ); + this.color.a = rgba[3]; + break; + + case 'falloff_angle': + + this.falloff_angle = parseFloat( child.textContent ); + break; + + case 'quadratic_attenuation': + var f = parseFloat( child.textContent ); + this.distance = f ? Math.sqrt( 1 / f ) : 0; + } + + } + + } + + } + + return this; + + }; + + Light.prototype.parseTechnique = function ( element ) { + + this.profile = element.getAttribute( 'profile' ); + + for ( var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + + switch ( child.nodeName ) { + + case 'intensity': + + this.intensity = parseFloat(child.textContent); + break; + + } + + } + + return this; + + }; + + function InstanceLight() { + + this.url = ""; + + }; + + InstanceLight.prototype.parse = function ( element ) { + + this.url = element.getAttribute('url').replace(/^#/, ''); + + return this; + + }; + + function KinematicsModel( ) { + + this.id = ''; + this.name = ''; + this.joints = []; + this.links = []; + + } + + KinematicsModel.prototype.parse = function( element ) { + + this.id = element.getAttribute('id'); + this.name = element.getAttribute('name'); + this.joints = []; + this.links = []; + + for (var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'technique_common': + + this.parseCommon(child); + break; + + default: + break; + + } + + } + + return this; + + }; + + KinematicsModel.prototype.parseCommon = function( element ) { + + for (var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( element.childNodes[ i ].nodeName ) { + + case 'joint': + this.joints.push( (new Joint()).parse(child) ); + break; + + case 'link': + this.links.push( (new Link()).parse(child) ); + break; + + default: + break; + + } + + } + + return this; + + }; + + function Joint( ) { + + this.sid = ''; + this.name = ''; + this.axis = new THREE.Vector3(); + this.limits = { + min: 0, + max: 0 + }; + this.type = ''; + this.static = false; + this.zeroPosition = 0.0; + this.middlePosition = 0.0; + + } + + Joint.prototype.parse = function( element ) { + + this.sid = element.getAttribute('sid'); + this.name = element.getAttribute('name'); + this.axis = new THREE.Vector3(); + this.limits = { + min: 0, + max: 0 + }; + this.type = ''; + this.static = false; + this.zeroPosition = 0.0; + this.middlePosition = 0.0; + + var axisElement = element.querySelector('axis'); + var _axis = _floats(axisElement.textContent); + this.axis = getConvertedVec3(_axis, 0); + + var min = element.querySelector('limits min') ? parseFloat(element.querySelector('limits min').textContent) : -360; + var max = element.querySelector('limits max') ? parseFloat(element.querySelector('limits max').textContent) : 360; + + this.limits = { + min: min, + max: max + }; + + var jointTypes = [ 'prismatic', 'revolute' ]; + for (var i = 0; i < jointTypes.length; i ++ ) { + + var type = jointTypes[ i ]; + + var jointElement = element.querySelector(type); + + if ( jointElement ) { + + this.type = type; + + } + + } + + // if the min is equal to or somehow greater than the max, consider the joint static + if ( this.limits.min >= this.limits.max ) { + + this.static = true; + + } + + this.middlePosition = (this.limits.min + this.limits.max) / 2.0; + return this; + + }; + + function Link( ) { + + this.sid = ''; + this.name = ''; + this.transforms = []; + this.attachments = []; + + } + + Link.prototype.parse = function( element ) { + + this.sid = element.getAttribute('sid'); + this.name = element.getAttribute('name'); + this.transforms = []; + this.attachments = []; + + for (var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'attachment_full': + this.attachments.push( (new Attachment()).parse(child) ); + break; + + case 'rotate': + case 'translate': + case 'matrix': + + this.transforms.push( (new Transform()).parse(child) ); + break; + + default: + + break; + + } + + } + + return this; + + }; + + function Attachment( ) { + + this.joint = ''; + this.transforms = []; + this.links = []; + + } + + Attachment.prototype.parse = function( element ) { + + this.joint = element.getAttribute('joint').split('/').pop(); + this.links = []; + + for (var i = 0; i < element.childNodes.length; i ++ ) { + + var child = element.childNodes[ i ]; + if ( child.nodeType != 1 ) continue; + + switch ( child.nodeName ) { + + case 'link': + this.links.push( (new Link()).parse(child) ); + break; + + case 'rotate': + case 'translate': + case 'matrix': + + this.transforms.push( (new Transform()).parse(child) ); + break; + + default: + + break; + + } + + } + + return this; + + }; + + function _source( element ) { + + var id = element.getAttribute( 'id' ); + + if ( sources[ id ] != undefined ) { + + return sources[ id ]; + + } + + sources[ id ] = ( new Source(id )).parse( element ); + return sources[ id ]; + + }; + + function _nsResolver( nsPrefix ) { + + if ( nsPrefix === "dae" ) { + + return "http://www.collada.org/2005/11/COLLADASchema"; + + } + + return null; + + }; + + function _bools( str ) { + + var raw = _strings( str ); + var data = []; + + for ( var i = 0, l = raw.length; i < l; i ++ ) { + + data.push( (raw[i] === 'true' || raw[i] === '1') ? true : false ); + + } + + return data; + + }; + + function _floats( str ) { + + var raw = _strings(str); + var data = []; + + for ( var i = 0, l = raw.length; i < l; i ++ ) { + + data.push( parseFloat( raw[ i ] ) ); + + } + + return data; + + }; + + function _ints( str ) { + + var raw = _strings( str ); + var data = []; + + for ( var i = 0, l = raw.length; i < l; i ++ ) { + + data.push( parseInt( raw[ i ], 10 ) ); + + } + + return data; + + }; + + function _strings( str ) { + + return ( str.length > 0 ) ? _trimString( str ).split( /\s+/ ) : []; + + }; + + function _trimString( str ) { + + return str.replace( /^\s+/, "" ).replace( /\s+$/, "" ); + + }; + + function _attr_as_float( element, name, defaultValue ) { + + if ( element.hasAttribute( name ) ) { + + return parseFloat( element.getAttribute( name ) ); + + } else { + + return defaultValue; + + } + + }; + + function _attr_as_int( element, name, defaultValue ) { + + if ( element.hasAttribute( name ) ) { + + return parseInt( element.getAttribute( name ), 10) ; + + } else { + + return defaultValue; + + } + + }; + + function _attr_as_string( element, name, defaultValue ) { + + if ( element.hasAttribute( name ) ) { + + return element.getAttribute( name ); + + } else { + + return defaultValue; + + } + + }; + + function _format_float( f, num ) { + + if ( f === undefined ) { + + var s = '0.'; + + while ( s.length < num + 2 ) { + + s += '0'; + + } + + return s; + + } + + num = num || 2; + + var parts = f.toString().split( '.' ); + parts[ 1 ] = parts.length > 1 ? parts[ 1 ].substr( 0, num ) : "0"; + + while ( parts[ 1 ].length < num ) { + + parts[ 1 ] += '0'; + + } + + return parts.join( '.' ); + + }; + + function loadTextureImage ( texture, url ) { + + loader = new THREE.ImageLoader(); + + loader.load( url, function ( image ) { + + texture.image = image; + texture.needsUpdate = true; + + } ); + + }; + + function extractDoubleSided( obj, element ) { + + obj.doubleSided = false; + + var node = element.querySelectorAll('extra double_sided')[0]; + + if ( node ) { + + if ( node && parseInt( node.textContent, 10 ) === 1 ) { + + obj.doubleSided = true; + + } + + } + + }; + + // Up axis conversion + + function setUpConversion() { + + if ( options.convertUpAxis !== true || colladaUp === options.upAxis ) { + + upConversion = null; + + } else { + + switch ( colladaUp ) { + + case 'X': + + upConversion = options.upAxis === 'Y' ? 'XtoY' : 'XtoZ'; + break; + + case 'Y': + + upConversion = options.upAxis === 'X' ? 'YtoX' : 'YtoZ'; + break; + + case 'Z': + + upConversion = options.upAxis === 'X' ? 'ZtoX' : 'ZtoY'; + break; + + } + + } + + }; + + function fixCoords( data, sign ) { + + if ( options.convertUpAxis !== true || colladaUp === options.upAxis ) { + + return; + + } + + switch ( upConversion ) { + + case 'XtoY': + + var tmp = data[ 0 ]; + data[ 0 ] = sign * data[ 1 ]; + data[ 1 ] = tmp; + break; + + case 'XtoZ': + + var tmp = data[ 2 ]; + data[ 2 ] = data[ 1 ]; + data[ 1 ] = data[ 0 ]; + data[ 0 ] = tmp; + break; + + case 'YtoX': + + var tmp = data[ 0 ]; + data[ 0 ] = data[ 1 ]; + data[ 1 ] = sign * tmp; + break; + + case 'YtoZ': + + var tmp = data[ 1 ]; + data[ 1 ] = sign * data[ 2 ]; + data[ 2 ] = tmp; + break; + + case 'ZtoX': + + var tmp = data[ 0 ]; + data[ 0 ] = data[ 1 ]; + data[ 1 ] = data[ 2 ]; + data[ 2 ] = tmp; + break; + + case 'ZtoY': + + var tmp = data[ 1 ]; + data[ 1 ] = data[ 2 ]; + data[ 2 ] = sign * tmp; + break; + + } + + }; + + function getConvertedTranslation( axis, data ) { + + if ( options.convertUpAxis !== true || colladaUp === options.upAxis ) { + + return data; + + } + + switch ( axis ) { + case 'X': + data = upConversion === 'XtoY' ? data * -1 : data; + break; + case 'Y': + data = upConversion === 'YtoZ' || upConversion === 'YtoX' ? data * -1 : data; + break; + case 'Z': + data = upConversion === 'ZtoY' ? data * -1 : data ; + break; + default: + break; + } + + return data; + }; + + function getConvertedVec3( data, offset ) { + + var arr = [ data[ offset ], data[ offset + 1 ], data[ offset + 2 ] ]; + fixCoords( arr, -1 ); + return new THREE.Vector3( arr[ 0 ], arr[ 1 ], arr[ 2 ] ); + + }; + + function getConvertedMat4( data ) { + + if ( options.convertUpAxis ) { + + // First fix rotation and scale + + // Columns first + var arr = [ data[ 0 ], data[ 4 ], data[ 8 ] ]; + fixCoords( arr, -1 ); + data[ 0 ] = arr[ 0 ]; + data[ 4 ] = arr[ 1 ]; + data[ 8 ] = arr[ 2 ]; + arr = [ data[ 1 ], data[ 5 ], data[ 9 ] ]; + fixCoords( arr, -1 ); + data[ 1 ] = arr[ 0 ]; + data[ 5 ] = arr[ 1 ]; + data[ 9 ] = arr[ 2 ]; + arr = [ data[ 2 ], data[ 6 ], data[ 10 ] ]; + fixCoords( arr, -1 ); + data[ 2 ] = arr[ 0 ]; + data[ 6 ] = arr[ 1 ]; + data[ 10 ] = arr[ 2 ]; + // Rows second + arr = [ data[ 0 ], data[ 1 ], data[ 2 ] ]; + fixCoords( arr, -1 ); + data[ 0 ] = arr[ 0 ]; + data[ 1 ] = arr[ 1 ]; + data[ 2 ] = arr[ 2 ]; + arr = [ data[ 4 ], data[ 5 ], data[ 6 ] ]; + fixCoords( arr, -1 ); + data[ 4 ] = arr[ 0 ]; + data[ 5 ] = arr[ 1 ]; + data[ 6 ] = arr[ 2 ]; + arr = [ data[ 8 ], data[ 9 ], data[ 10 ] ]; + fixCoords( arr, -1 ); + data[ 8 ] = arr[ 0 ]; + data[ 9 ] = arr[ 1 ]; + data[ 10 ] = arr[ 2 ]; + + // Now fix translation + arr = [ data[ 3 ], data[ 7 ], data[ 11 ] ]; + fixCoords( arr, -1 ); + data[ 3 ] = arr[ 0 ]; + data[ 7 ] = arr[ 1 ]; + data[ 11 ] = arr[ 2 ]; + + } + + return new THREE.Matrix4().set( + data[0], data[1], data[2], data[3], + data[4], data[5], data[6], data[7], + data[8], data[9], data[10], data[11], + data[12], data[13], data[14], data[15] + ); + + }; + + function getConvertedIndex( index ) { + + if ( index > -1 && index < 3 ) { + + var members = [ 'X', 'Y', 'Z' ], + indices = { X: 0, Y: 1, Z: 2 }; + + index = getConvertedMember( members[ index ] ); + index = indices[ index ]; + + } + + return index; + + }; + + function getConvertedMember( member ) { + + if ( options.convertUpAxis ) { + + switch ( member ) { + + case 'X': + + switch ( upConversion ) { + + case 'XtoY': + case 'XtoZ': + case 'YtoX': + + member = 'Y'; + break; + + case 'ZtoX': + + member = 'Z'; + break; + + } + + break; + + case 'Y': + + switch ( upConversion ) { + + case 'XtoY': + case 'YtoX': + case 'ZtoX': + + member = 'X'; + break; + + case 'XtoZ': + case 'YtoZ': + case 'ZtoY': + + member = 'Z'; + break; + + } + + break; + + case 'Z': + + switch ( upConversion ) { + + case 'XtoZ': + + member = 'X'; + break; + + case 'YtoZ': + case 'ZtoX': + case 'ZtoY': + + member = 'Y'; + break; + + } + + break; + + } + + } + + return member; + + }; + + return { + + load: load, + parse: parse, + setPreferredShading: setPreferredShading, + applySkin: applySkin, + geometries : geometries, + options: options + + }; + +}; diff --git a/src/tools/TurtlebotViewer-web/public/js/Ice.min.js b/src/tools/TurtlebotViewer-web/public/js/Ice.min.js new file mode 100644 index 000000000..ee100584f --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/js/Ice.min.js @@ -0,0 +1,10 @@ +(function(){var e=typeof window!=="undefined"?window:self;e.Ice=e.Ice||{};Ice.Slice=Ice.Slice||{};e.IceMX=e.IceMX||{};e.IceSSL=e.IceSSL||{};var t=Ice.Slice;(function(){var e=typeof window!=="undefined"?window:self;var t={module:function(t){var n=e[t];if(n===undefined){n={};e[t]=n}return n},require:function(t){return e},type:function(t){if(t===undefined){return undefined}var n=t.split(".");var i=e;for(var r=0,s=n.length;r1;--t){var n=e[t-1];var i=Math.floor(Math.random()*t);e[t-1]=e[i];e[i]=n}},indexOf:function(e,t,n){if(n!==undefined&&n!==null){for(var i=0;ie.MAX_UINT32){throw new RangeError("Low word must be between 0 and 0xFFFFFFFF")}if(t<0||t>e.MAX_UINT32){throw new RangeError("High word must be between 0 and 0xFFFFFFFF")}this.high=t;this.low=n},hashCode:function(){return this.low},equals:function(t){if(this===t){return true}if(!(t instanceof e)){return false}return this.high===t.high&&this.low===t.low},toString:function(){return this.high+":"+this.low},toNumber:function(){if((this.high&e.SIGN_MASK)!==0){const t=~this.low>>>0;const n=~this.high>>>0;if(n>e.HIGH_MAX||n==e.HIGH_MAX&&t==e.MAX_UINT32){return Number.NEGATIVE_INFINITY}return-(n*e.HIGH_MASK+t+1)}else{if(this.high>e.HIGH_MAX){return Number.POSITIVE_INFINITY}return this.high*e.HIGH_MASK+this.low}}});e.MAX_UINT32=4294967295;e.SIGN_MASK=2147483648;e.HIGH_MASK=4294967296;e.HIGH_MAX=2097151;Ice.Long=e})();(function(){Ice.AssertionFailedException=Ice.Class(Error,{__init__:function(e){Error.call(this);Ice.Exception.captureStackTrace(this);this.message=e}});Ice.Debug={assert:function(e,t){if(!e){console.log(t===undefined?"assertion failed":t);console.log(Error().stack);throw new Ice.AssertionFailedException(t===undefined?"assertion failed":t)}}}})();(function(){Ice.DispatchStatus={DispatchOK:0,DispatchUserException:1,DispatchAsync:2}})();(function(){var e=Ice.Class({__init__:function(e,t){this._name=e;this._value=t},equals:function(e){if(this===e){return true}var t=Object.getPrototypeOf(this);if(!(e instanceof t.constructor)){return false}return this._value==e._value},hashCode:function(){return this._value},toString:function(){return this._name}});Ice.EnumBase=e;var t=e.prototype;Object.defineProperty(t,"name",{enumerable:true,get:function(){return this._name}});Object.defineProperty(t,"value",{enumerable:true,get:function(){return this._value}});var n=Ice.Class({__init__:function(e){this._enumType=e},write:function(e,t){this._enumType.__write(e,t)},writeOpt:function(e,t,n){this._enumType.__writeOpt(e,t,n)},read:function(e){return this._enumType.__read(e)},readOpt:function(e,t){return this._enumType.__readOpt(e,t)}});Ice.EnumHelper=n;var i=Ice.Slice;i.defineEnum=function(t){var i=function(t,n){e.call(this,t,n)};i.prototype=new e;i.prototype.constructor=i;var r=[];var s=0;var o=null;for(var c in t){var a=t[c][0],u=t[c][1];var l=new i(a,u);r[u]=l;if(!o){o=l}Object.defineProperty(i,a,{enumerable:true,value:l});if(u>s){s=u}}Object.defineProperty(i,"minWireSize",{get:function(){return 1}});i.__write=function(e,t){if(t){e.writeEnum(t)}else{e.writeEnum(o)}};i.__read=function(e){return e.readEnum(i)};i.__writeOpt=function(e,t,n){if(n!==undefined){if(e.writeOpt(t,Ice.OptionalFormat.Size)){i.__write(e,n)}}};i.__readOpt=function(e,t){return e.readOptEnum(t,i)};i.__helper=new n(i);Object.defineProperty(i,"valueOf",{value:function(e){if(e===undefined){return i}return r[e]}});Object.defineProperty(i,"maxValue",{value:s});Object.defineProperty(i.prototype,"maxValue",{value:s});return i}})();(function(){function e(){var e=(new Date).getTime();var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var n=(e+Math.random()*16)%16|0;e=Math.floor(e/16);return(t=="x"?n:n&7|8).toString(16)});return t}Ice.generateUUID=e})();(function(){Ice.FormatType=Ice.Slice.defineEnum([["DefaultFormat",0],["CompactFormat",1],["SlicedFormat",2]])})();(function(){var e=Ice.Debug;Ice.StringUtil={findFirstOf:function(e,t,n){n=n===undefined?0:n;var i=e.length;for(var r=n;r126){throw new Error("special characters must be in ASCII range 32-126")}}}var s=[],o;for(i=0,r=e.length;i127&&o<2048){t(o>>6|192,s,n);t(o&63|128,s,n)}else{t(o>>12|224,s,n);t(o>>6&63|128,s,n);t(o&63|128,s,n)}}return s.join("")},unescapeString:function(t,n,i){n=n===undefined?0:n;i=i===undefined?t.length:i;e.assert(n>=0&&n<=i&&i<=t.length);var s=[];r(t,n,i,s);return s.join("")},splitString:function(e,t){var n=[];var i="";var r=0;var s=null;while(r0){n.push(i);i=""}continue}}if(r0){n.push(i)}if(s!==null){return null}return n},checkQuote:function(e,t){t=t===undefined?0:t;var n=e.charAt(t);if(n=='"'||n=="'"){t++;var i=e.length;var r;while(t=32&&e<=126)){t.push("\\");var i=e.toString(8);for(var r=i.length;r<3;r++){t.push("0")}t.push(i)}else{var s=String.fromCharCode(e);if(n!==null&&n.indexOf(s)!==-1){t.push("\\");t.push(s)}else{t.push(s)}}}}}function n(e,t){var n=e.charCodeAt(t);if(!(n>=32&&n<=126)){var i;if(t>0){i="character after `"+e.substring(0,t)+"'"}else{i="first character"}i+=" is not a printable ASCII character (ordinal "+n+")";throw new Error(i)}return n}function i(t,i,r,s){e.assert(i>=0);e.assert(r<=t.length);if(i>=r){throw new Error("EOF while decoding string")}var o;if(t.charAt(i)!="\\"){o=n(t,i++)}else{if(i+1==r){throw new Error("trailing backslash")}switch(t.charAt(++i)){case"\\":case"'":case'"':{o=t.charCodeAt(i++);break}case"b":{++i;o="\b".charCodeAt(0);break}case"f":{++i;o="\f".charCodeAt(0);break}case"n":{++i;o="\n".charCodeAt(0);break}case"r":{++i;o="\r".charCodeAt(0);break}case"t":{++i;o="\t".charCodeAt(0);break}case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":{var c="01234567";var a=0;for(var u=0;u<3&&i255){var h="octal value \\"+a.toString(8)+" ("+a+") is out of range";throw new Error(h)}o=a;break}default:{o=n(t,i++);break}}}s.value=i;return o}function r(e,t,n,r){var s={value:0},o,c,a;while(t191&&o<224){c=i(e,t,n,s);t=s.value;r.push(String.fromCharCode((o&31)<<6|c&63))}else{c=i(e,t,n,s);t=s.value;a=i(e,t,n,s);t=s.value;r.push(String.fromCharCode((o&15)<<12|(c&63)<<6|a&63))}}}})();(function(){var e=Ice.__M;var t=Ice.StringUtil;function n(e,t,n,i,r){for(var s=e._table[r];s!==null;s=s._nextInBucket){if(s._hash===i&&e.keysEqual(t,s._key)){s._value=n;return undefined}}e.add(t,n,i,r);return undefined}function i(e,t){if(e===t){return true}if(e===undefined||e===null||t===undefined||t===null){return false}return e.equals(t)}function r(e,t){return e===t}var s=Ice.Class({__init__:function(e,t){var n=arguments;var i,o,c;if(typeof e=="function"){o=e;c=t}else if(e instanceof s){i=e;o=i.keyComparator;c=i.valueComparator}this._size=0;this._head=null;this._initialCapacity=32;this._loadFactor=.75;this._table=[];this._keyComparator=typeof o=="function"?o:r;this._valueComparator=typeof c=="function"?c:r;var a,u;if(i instanceof s&&i._size>0){this._threshold=i._threshold;u=i._table.length;this._table.length=u;for(a=0;a=this._threshold){this.resize(this._table.length*2)}},resize:function(e){var t=this._table;var n=[];for(var i=0;i254?s*e+5:s*e+1);this.write(t,r)}};this.readOpt=function(e,t){var n;if(e.readOpt(t,i.VSize)){e.skipSize();n=this.read(e)}return n}};r.VSizeContainer1OptHelper=function(){this.writeOpt=function(e,t,n){if(n!==undefined&&e.writeOpt(t,i.VSize)){this.write(e,n)}};this.readOpt=function(e,t){var n;if(e.readOpt(t,i.VSize)){n=this.read(e)}return n}};var s=e({write:function(e,t){if(t===null||t.length===0){e.writeSize(0)}else{var n=this.elementHelper;e.writeSize(t.length);for(var i=0;i=0},ice_ping:function(e){},ice_ids:function(e){return this.__mostDerivedType().__ids},ice_id:function(e){return this.__mostDerivedType().__id},toString:function(){return"[object "+this.ice_id()+"]"},ice_preMarshal:function(){},ice_postUnmarshal:function(){},__write:function(e){e.startWriteObject(null);i(this,e,this.__mostDerivedType());e.endWriteObject()},__read:function(e){e.startReadObject();r(this,e,this.__mostDerivedType());e.endReadObject(false)},ice_instanceof:function(e){if(e){if(this instanceof e){return true}return this.__mostDerivedType().__instanceof(e)}return false},__mostDerivedType:function(){return n},equals:function(e){return this===e}});n.write=function(e,t){e.writeObject(t)};n.writeOpt=function(e,t,n){e.writeOptObject(t,n)};n.read=function(e){var t={value:null};e.readObject(function(e){t.value=e},n);return t};n.readOpt=function(e,t){var i={value:undefined};e.readOptObject(t,function(e){i.value=e},n);return i};n.ice_staticId=function(){return n.__id};n.__instanceof=function(e){if(e===this){return true}for(var t in this.__implements){if(this.__implements[t].__instanceof(e)){return true}}if(this.__parent){return this.__parent.__instanceof(e)}return false};n.__ids=["::Ice::Object"];n.__id=n.__ids[0];n.__compactId=-1;n.__preserved=false;var i=function(e,t,r){if(r===undefined||r===n){return}t.startWriteSlice(r.__id,r.__compactId,r.__parent===n);if(r.prototype.__writeMemberImpl){r.prototype.__writeMemberImpl.call(e,t)}t.endWriteSlice();i(e,t,r.__parent)};var r=function(e,t,i){if(i===undefined||i===n){return}t.startReadSlice();if(i.prototype.__readMemberImpl){i.prototype.__readMemberImpl.call(e,t)}t.endReadSlice();r(e,t,i.__parent)};var s=function(e){e.startWriteObject(this.__slicedData);i(this,e,this.__mostDerivedType());e.endWriteObject()};var o=function(e){e.startReadObject();r(this,e,this.__mostDerivedType());this.__slicedData=e.endReadObject(true)};Ice.Object=n;var c=Ice.Slice;c.defineLocalObject=function(e,t){var n=e||function(){};if(t!==undefined){n.prototype=new t;n.__parent=t;n.prototype.constructor=e}return n};c.defineObject=function(e,t,i,r,c,a,u,l,h){var f=e||function(){};f.prototype=new t;f.__parent=t;f.__ids=c;f.__id=c[r];f.__compactId=a;f.__instanceof=n.__instanceof;f.__implements=i;f.write=function(e,t){e.writeObject(t)};f.writeOpt=function(e,t,n){e.writeOptObject(t,n)};f.read=function(e){var t={value:null};e.readObject(function(e){t.value=e},f);return t};f.readOpt=function(e,t){var n={value:undefined};e.readOptObject(t,function(e){n.value=e},f);return n};f.ice_staticId=function(){return c[r]};f.prototype.constructor=f;f.prototype.__mostDerivedType=function(){return f};if(h){f.prototype.__write=s;f.prototype.__read=o}f.prototype.__writeMemberImpl=u;f.prototype.__readMemberImpl=l;return f}})();(function(){var e=Ice.StringUtil;Ice.HashUtil={addBoolean:function(e,t){return(e<<5)+e^(t?0:1)},addString:function(t,n){if(n!==undefined&&n!==null){t=(t<<5)+t^e.hashCode(n)}return t},addNumber:function(e,t){return(e<<5)+e^t},addHashable:function(e,t){if(t!==undefined&&t!==null){e=(e<<5)+e^t.hashCode()}return e},addArray:function(e,t,n){if(t!==undefined&&t!==null){for(var i=0;ithis.capacity){this.reserve(e)}this._limit=e},clear:function(){this.b=null;this.v=null;this._position=0;this._limit=0},expand:function(e){var t=this.capacity===0?e:this._position+e;if(t>this._limit){this.resize(t)}},reset:function(){if(this._limit>0&&this._limit*22){this.reserve(this._limit);this._shrinkCounter=0}}else{this._shrinkCounter=0}this._limit=0;this._position=0},reserve:function(e){if(e>this.capacity){var t=Math.max(e,2*this.capacity);t=Math.max(1024,t);if(!this.b){this.b=new ArrayBuffer(t)}else{var n=new Uint8Array(t);n.set(new Uint8Array(this.b));this.b=n.buffer}this.v=new DataView(this.b)}else if(e=this._limit){throw new Error(i)}this.v.setUint8(e,t)},putArray:function(e){if(!(e instanceof Uint8Array)){throw new TypeError("argument is not a Uint8Array")}if(e.byteLength>0){if(this._position+e.length>this._limit){throw new Error(t)}new Uint8Array(this.b,0,this.b.byteLength).set(e,this._position);this._position+=e.byteLength}},putShort:function(e){if(this._position+2>this._limit){throw new Error(t)}this.v.setInt16(this._position,e,true);this._position+=2},putInt:function(e){if(this._position+4>this._limit){throw new Error(t)}this.v.setInt32(this._position,e,true);this._position+=4},putIntAt:function(e,t){if(e+4>this._limit||e<0){throw new Error(i)}this.v.setInt32(e,t,true)},putFloat:function(e){if(this._position+4>this._limit){throw new Error(t)}this.v.setFloat32(this._position,e,true);this._position+=4},putDouble:function(e){if(this._position+8>this._limit){throw new Error(t)}this.v.setFloat64(this._position,e,true);this._position+=8},putLong:function(e){if(this._position+8>this._limit){throw new Error(t)}this.v.setInt32(this._position,e.low,true);this._position+=4;this.v.setInt32(this._position,e.high,true);this._position+=4},writeString:function(e,t){var n=unescape(encodeURIComponent(t));e.writeSize(n.length);e.expand(n.length);this.putString(n,n.length)},putString:function(e,n){if(this._position+n>this._limit){throw new Error(t)}for(var i=0;i=this._limit){throw new Error(n)}var e=this.v.getUint8(this._position);this._position++;return e},getAt:function(e){if(e<0||e>=this._limit){throw new Error(i)}return this.v.getUint8(e)},getArray:function(e){if(this._position+e>this._limit){throw new Error(n)}var t=this.b.slice(this._position,this._position+e);this._position+=e;return new Uint8Array(t)},getArrayAt:function(e,t){if(e+t>this._limit){throw new Error(n)}t=t===undefined?this.b.byteLength-e:t;return new Uint8Array(this.b.slice(e,e+t)); +},getShort:function(){if(this._limit-this._position<2){throw new Error(n)}var e=this.v.getInt16(this._position,true);this._position+=2;return e},getInt:function(){if(this._limit-this._position<4){throw new Error(n)}var e=this.v.getInt32(this._position,true);this._position+=4;return e},getFloat:function(){if(this._limit-this._position<4){throw new Error(n)}var e=this.v.getFloat32(this._position,true);this._position+=4;return e},getDouble:function(){if(this._limit-this._position<8){throw new Error(n)}var e=this.v.getFloat64(this._position,true);this._position+=8;return e},getLong:function(){if(this._limit-this._position<8){throw new Error(n)}var t=new e;t.low=this.v.getUint32(this._position,true);this._position+=4;t.high=this.v.getUint32(this._position,true);this._position+=4;return t},getString:function(e){if(this._position+e>this._limit){throw new Error(n)}var t=new DataView(this.b,this._position,e);var i="";for(var r=0;r=0&&e<=this._limit){this._position=e}}});Object.defineProperty(s,"limit",{get:function(){return this._limit},set:function(e){if(e<=this.capacity){this._limit=e;if(this._position>e){this._position=e}}}});Object.defineProperty(s,"capacity",{get:function(){return this.b===null?0:this.b.byteLength}});Object.defineProperty(s,"remaining",{get:function(){return this._limit-this._position}});r.createNative=function(e){if(e===undefined){return new Uint8Array(0)}else{return new Uint8Array(e)}};Ice.Buffer=r})();(function(){var e=Ice.Buffer;var t={};var n="A".charCodeAt(0);var i="a".charCodeAt(0);var r="0".charCodeAt(0);t.encode=function(e){if(e===null||e.length===0){return""}var t=e.length*4/3+1;var n=t*2/76+1;var i=t+n;var r=[];var o;var c;var a;var u;var l;var h;var f;for(var d=0;d>2&255;l=((o&3)<<4|c>>4)&255;h=((c&15)<<2|a>>6)&255;f=a&63;r.push(s(u));r.push(s(l));if(d+176){_.push(p.substring(I,I+76));_.push("\r\n");I+=76}_.push(p.substring(I));return _.join("")};t.decode=function(n){var i=[];for(var r=0;r>4);if(_!="="){a.put((l&15)<<4|h>>2)}if(I!="="){a.put((h&3)<<6|f)}}return a.remaining>0?a.getArrayAt(0,a.position):a.getArrayAt(0)};t.isBase64=function(e){if(e>="A"&&e<="Z"){return true}if(e>="a"&&e<="z"){return true}if(e>="0"&&e<="9"){return true}if(e=="+"){return true}if(e=="/"){return true}if(e=="="){return true}return false};function s(e){if(e<26){return String.fromCharCode(n+e)}if(e<52){return String.fromCharCode(i+(e-26))}if(e<62){return String.fromCharCode(r+(e-52))}if(e==62){return"+"}return"/"}function o(e){if(e>="A"&&e<="Z"){return e.charCodeAt(0)-n}if(e>="a"&&e<="z"){return e.charCodeAt(0)-i+26}if(e>="0"&&e<="9"){return e.charCodeAt(0)-r+52}if(e=="+"){return 62}return 63}Ice.Base64=t})();(function(){Ice.Identity=t.defineStruct(function(e,t){this.name=e!==undefined?e:"";this.category=t!==undefined?t:""},true,function(e){e.writeString(this.name);e.writeString(this.category)},function(e){this.name=e.readString();this.category=e.readString()},2,false);t.defineDictionary(Ice,"ObjectDict","ObjectDictHelper","Ice.Identity","Ice.ObjectHelper",false,Ice.HashMap.compareEquals,"Ice.Object");t.defineSequence(Ice,"IdentitySeqHelper","Ice.Identity",false)})();(function(){})();(function(){Ice.ProtocolVersion=t.defineStruct(function(e,t){this.major=e!==undefined?e:0;this.minor=t!==undefined?t:0},true,function(e){e.writeByte(this.major);e.writeByte(this.minor)},function(e){this.major=e.readByte();this.minor=e.readByte()},2,true);Ice.EncodingVersion=t.defineStruct(function(e,t){this.major=e!==undefined?e:0;this.minor=t!==undefined?t:0},true,function(e){e.writeByte(this.major);e.writeByte(this.minor)},function(e){this.major=e.readByte();this.minor=e.readByte()},2,true)})();(function(){var e=function(){this.typeId="";this.compactId=-1;this.bytes=[];this.objects=[];this.hasOptionalMembers=false;this.isLastSlice=false};Ice.SliceInfo=e;var t=function(e){this.slices=e};Ice.SlicedData=t;var n=Ice.Class(Ice.Object,{__init__:function(e){this._unknownTypeId=e},getUnknownTypeId:function(){return this._unknownTypeId},__write:function(e){e.startWriteObject(this._slicedData);e.endWriteObject()},__read:function(e){e.startReadObject();this._slicedData=e.endReadObject(true)}});Ice.UnknownSlicedObject=n})();(function(){})();(function(){var e=Ice.HashMap;var t=Ice.Debug;var n=Ice.Class({__init__:function(){this._adapterEndpointsTable=new e;this._objectTable=new e(e.compareEquals)},clear:function(){this._adapterEndpointsTable.clear();this._objectTable.clear()},getAdapterEndpoints:function(e,t,n){if(t===0){n.value=false;return null}var i=this._adapterEndpointsTable.get(e);if(i!==undefined){n.value=this.checkTTL(i.time,t);return i.endpoints}n.value=false;return null},addAdapterEndpoints:function(e,t){this._adapterEndpointsTable.set(e,new i(Date.now(),t))},removeAdapterEndpoints:function(e){var t=this._adapterEndpointsTable.get(e);this._adapterEndpointsTable.delete(e);return t!==undefined?t.endpoints:null},getObjectReference:function(e,t,n){if(t===0){n.value=false;return null}var i=this._objectTable.get(e);if(i!==undefined){n.value=this.checkTTL(i.time,t);return i.reference}n.value=false;return null},addObjectReference:function(e,t){this._objectTable.set(e,new r(Date.now(),t))},removeObjectReference:function(e){var t=this._objectTable.get(e);this._objectTable.delete(e);return t!==undefined?t.reference:null},checkTTL:function(e,n){t.assert(n!==0);if(n<0){return true}else{return Date.now()-e<=n*1e3}}});Ice.LocatorTable=n;var i=function(e,t){this.time=e;this.endpoints=t};var r=function(e,t){this.time=e;this.reference=t}})();(function(){var e=Ice.Timer;var t={Pending:0,Success:1,Failed:2};var n=function(e,n){var i=e.__state===t.Success?n.onResponse:n.onException;try{if(typeof i!=="function"){n.promise.setState(e.__state,e._args)}else{var r=i.apply(null,e._args);if(r&&typeof r.then=="function"){r.then(function(){var e=arguments;n.promise.succeed.apply(n.promise,e)},function(){var e=arguments;n.promise.fail.apply(n.promise,e)})}else{n.promise.succeed(r)}}}catch(s){n.promise.fail.call(n.promise,s)}};var i=Ice.Class({__init__:function(){this.__state=t.Pending;this.__listeners=[]},then:function(t,n){var r=new i;var s=this;e.setImmediate(function(){s.__listeners.push({promise:r,onResponse:t,onException:n});s.resolve()});return r},exception:function(e){return this.then(null,e)},"finally":function(t){var n=new i;var r=this;var s=function(e){return function(){var i=arguments;try{var r=t.apply(null,i);if(r&&typeof r.then=="function"){var s=function(){e.apply(n,i)};r.then(s).exception(s)}else{e.apply(n,i)}}catch(o){e.apply(n,i)}}};e.setImmediate(function(){r.then(s(n.succeed),s(n.fail))});return n},delay:function(t){var n=new i;var r=this;var s=function(n,i){return function(){var r=arguments;e.setTimeout(function(){i.apply(n,r)},t)}};e.setImmediate(function(){r.then(s(n,n.succeed),s(n,n.fail))});return n},resolve:function(){if(this.__state===t.Pending){return}var e;while(e=this.__listeners.pop()){n(this,e)}},setState:function(n,i){if(this.__state===t.Pending&&n!==t.Pending){this.__state=n;this._args=i;var r=this;e.setImmediate(function(){r.resolve()})}},succeed:function(){var e=arguments;this.setState(t.Success,e);return this},fail:function(){var e=arguments;this.setState(t.Failed,e);return this},succeeded:function(){return this.__state===t.Success},failed:function(){return this.__state===t.Failed},completed:function(){return this.__state!==t.Pending}});i.all=function(){if(arguments.length===1&&arguments[0]instanceof Array){return i.all.apply(this,arguments[0])}var e=new i;var t=Array.prototype.slice.call(arguments);var n=new Array(arguments.length);var r=t.length;if(r===0){e.succeed.apply(e,n)}for(var s=0;s1){var t=new i;var n=Array.prototype.slice.call(arguments);e=n.pop();return t.succeed.apply(t,n).delay(e)}else{return(new i).succeed().delay(e)}};Ice.Promise=i})();(function(){var e=Ice.Class({__init__:function(e){if(e!==undefined&&e.length>0){this._prefix=e+": "}else{this._prefix=""}this._dateformat={year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric",hour12:false}},print:function(e){this.write(e,false)},trace:function(e,t){var n=[];var i=new Date;n.push("-- ");n.push(this.timestamp());n.push(" ");n.push(this._prefix);n.push(e);n.push(": ");n.push(t);this.write(n.join(""),true)},warning:function(e){var t=[];var n=new Date;t.push("-! ");t.push(this.timestamp());t.push(" ");t.push(this._prefix);t.push("warning: ");t.push(e);this.write(t.join(""),true)},error:function(e){var t=[];var n=new Date;t.push("!! ");t.push(this.timestamp());t.push(" ");t.push(this._prefix);t.push("error: ");t.push(e);this.write(t.join(""),true)},cloneWithPrefix:function(t){return new e(t)},write:function(e,t){if(t){e=e.replace(/\n/g,"\n ")}console.log(e)},timestamp:function(){var e=new Date;return e.toLocaleString("en-US",this._dateformat)+"."+e.getMilliseconds()}});Ice.Logger=e})();(function(){Ice.InitializationException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.reason=e!==undefined?e:""},Ice.LocalException,"Ice::InitializationException");Ice.PluginInitializationException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.reason=e!==undefined?e:""},Ice.LocalException,"Ice::PluginInitializationException");Ice.CollocationOptimizationException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::CollocationOptimizationException");Ice.AlreadyRegisteredException=t.defineLocalException(function(e,t,n){Ice.LocalException.call(this,n);this.kindOfObject=e!==undefined?e:"";this.id=t!==undefined?t:""},Ice.LocalException,"Ice::AlreadyRegisteredException");Ice.NotRegisteredException=t.defineLocalException(function(e,t,n){Ice.LocalException.call(this,n);this.kindOfObject=e!==undefined?e:"";this.id=t!==undefined?t:""},Ice.LocalException,"Ice::NotRegisteredException");Ice.TwowayOnlyException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.operation=e!==undefined?e:""},Ice.LocalException,"Ice::TwowayOnlyException");Ice.CloneNotImplementedException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::CloneNotImplementedException");Ice.UnknownException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.unknown=e!==undefined?e:""},Ice.LocalException,"Ice::UnknownException");Ice.UnknownLocalException=t.defineLocalException(function(e,t){Ice.UnknownException.call(this,e,t)},Ice.UnknownException,"Ice::UnknownLocalException");Ice.UnknownUserException=t.defineLocalException(function(e,t){Ice.UnknownException.call(this,e,t)},Ice.UnknownException,"Ice::UnknownUserException");Ice.VersionMismatchException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::VersionMismatchException");Ice.CommunicatorDestroyedException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::CommunicatorDestroyedException");Ice.ObjectAdapterDeactivatedException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.name=e!==undefined?e:""},Ice.LocalException,"Ice::ObjectAdapterDeactivatedException");Ice.ObjectAdapterIdInUseException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.id=e!==undefined?e:""},Ice.LocalException,"Ice::ObjectAdapterIdInUseException");Ice.NoEndpointException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.proxy=e!==undefined?e:""},Ice.LocalException,"Ice::NoEndpointException");Ice.EndpointParseException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.str=e!==undefined?e:""},Ice.LocalException,"Ice::EndpointParseException");Ice.EndpointSelectionTypeParseException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.str=e!==undefined?e:""},Ice.LocalException,"Ice::EndpointSelectionTypeParseException");Ice.VersionParseException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.str=e!==undefined?e:""},Ice.LocalException,"Ice::VersionParseException");Ice.IdentityParseException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.str=e!==undefined?e:""},Ice.LocalException,"Ice::IdentityParseException");Ice.ProxyParseException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.str=e!==undefined?e:""},Ice.LocalException,"Ice::ProxyParseException");Ice.IllegalIdentityException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.id=e!==undefined?e:new Ice.Identity},Ice.LocalException,"Ice::IllegalIdentityException");Ice.IllegalServantException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.reason=e!==undefined?e:""},Ice.LocalException,"Ice::IllegalServantException");Ice.RequestFailedException=t.defineLocalException(function(e,t,n,i){Ice.LocalException.call(this,i);this.id=e!==undefined?e:new Ice.Identity;this.facet=t!==undefined?t:"";this.operation=n!==undefined?n:""},Ice.LocalException,"Ice::RequestFailedException");Ice.ObjectNotExistException=t.defineLocalException(function(e,t,n,i){Ice.RequestFailedException.call(this,e,t,n,i)},Ice.RequestFailedException,"Ice::ObjectNotExistException");Ice.FacetNotExistException=t.defineLocalException(function(e,t,n,i){Ice.RequestFailedException.call(this,e,t,n,i)},Ice.RequestFailedException,"Ice::FacetNotExistException");Ice.OperationNotExistException=t.defineLocalException(function(e,t,n,i){Ice.RequestFailedException.call(this,e,t,n,i)},Ice.RequestFailedException,"Ice::OperationNotExistException");Ice.SyscallException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.error=e!==undefined?e:0},Ice.LocalException,"Ice::SyscallException");Ice.SocketException=t.defineLocalException(function(e,t){Ice.SyscallException.call(this,e,t)},Ice.SyscallException,"Ice::SocketException");Ice.FileException=t.defineLocalException(function(e,t,n){Ice.SyscallException.call(this,e,n);this.path=t!==undefined?t:""},Ice.SyscallException,"Ice::FileException");Ice.ConnectFailedException=t.defineLocalException(function(e,t){Ice.SocketException.call(this,e,t)},Ice.SocketException,"Ice::ConnectFailedException");Ice.ConnectionRefusedException=t.defineLocalException(function(e,t){Ice.ConnectFailedException.call(this,e,t)},Ice.ConnectFailedException,"Ice::ConnectionRefusedException");Ice.ConnectionLostException=t.defineLocalException(function(e,t){Ice.SocketException.call(this,e,t)},Ice.SocketException,"Ice::ConnectionLostException");Ice.DNSException=t.defineLocalException(function(e,t,n){Ice.LocalException.call(this,n);this.error=e!==undefined?e:0;this.host=t!==undefined?t:""},Ice.LocalException,"Ice::DNSException");Ice.OperationInterruptedException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::OperationInterruptedException");Ice.TimeoutException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::TimeoutException");Ice.ConnectTimeoutException=t.defineLocalException(function(e){Ice.TimeoutException.call(this,e)},Ice.TimeoutException,"Ice::ConnectTimeoutException");Ice.CloseTimeoutException=t.defineLocalException(function(e){Ice.TimeoutException.call(this,e)},Ice.TimeoutException,"Ice::CloseTimeoutException");Ice.ConnectionTimeoutException=t.defineLocalException(function(e){Ice.TimeoutException.call(this,e)},Ice.TimeoutException,"Ice::ConnectionTimeoutException");Ice.InvocationTimeoutException=t.defineLocalException(function(e){Ice.TimeoutException.call(this,e)},Ice.TimeoutException,"Ice::InvocationTimeoutException");Ice.InvocationCanceledException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::InvocationCanceledException");Ice.ProtocolException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.reason=e!==undefined?e:""},Ice.LocalException,"Ice::ProtocolException");Ice.BadMagicException=t.defineLocalException(function(e,t,n){Ice.ProtocolException.call(this,e,n);this.badMagic=t!==undefined?t:null},Ice.ProtocolException,"Ice::BadMagicException");Ice.UnsupportedProtocolException=t.defineLocalException(function(e,t,n,i){Ice.ProtocolException.call(this,e,i);this.bad=t!==undefined?t:new Ice.ProtocolVersion;this.supported=n!==undefined?n:new Ice.ProtocolVersion},Ice.ProtocolException,"Ice::UnsupportedProtocolException");Ice.UnsupportedEncodingException=t.defineLocalException(function(e,t,n,i){Ice.ProtocolException.call(this,e,i);this.bad=t!==undefined?t:new Ice.EncodingVersion;this.supported=n!==undefined?n:new Ice.EncodingVersion},Ice.ProtocolException,"Ice::UnsupportedEncodingException");Ice.UnknownMessageException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::UnknownMessageException");Ice.ConnectionNotValidatedException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::ConnectionNotValidatedException");Ice.UnknownRequestIdException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::UnknownRequestIdException");Ice.UnknownReplyStatusException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::UnknownReplyStatusException");Ice.CloseConnectionException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::CloseConnectionException");Ice.ForcedCloseConnectionException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::ForcedCloseConnectionException");Ice.IllegalMessageSizeException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::IllegalMessageSizeException");Ice.CompressionException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::CompressionException");Ice.DatagramLimitException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::DatagramLimitException");Ice.MarshalException=t.defineLocalException(function(e,t){Ice.ProtocolException.call(this,e,t)},Ice.ProtocolException,"Ice::MarshalException");Ice.ProxyUnmarshalException=t.defineLocalException(function(e,t){Ice.MarshalException.call(this,e,t)},Ice.MarshalException,"Ice::ProxyUnmarshalException");Ice.UnmarshalOutOfBoundsException=t.defineLocalException(function(e,t){Ice.MarshalException.call(this,e,t)},Ice.MarshalException,"Ice::UnmarshalOutOfBoundsException");Ice.NoObjectFactoryException=t.defineLocalException(function(e,t,n){Ice.MarshalException.call(this,e,n);this.type=t!==undefined?t:""},Ice.MarshalException,"Ice::NoObjectFactoryException");Ice.UnexpectedObjectException=t.defineLocalException(function(e,t,n,i){Ice.MarshalException.call(this,e,i);this.type=t!==undefined?t:"";this.expectedType=n!==undefined?n:""},Ice.MarshalException,"Ice::UnexpectedObjectException");Ice.MemoryLimitException=t.defineLocalException(function(e,t){Ice.MarshalException.call(this,e,t)},Ice.MarshalException,"Ice::MemoryLimitException");Ice.StringConversionException=t.defineLocalException(function(e,t){Ice.MarshalException.call(this,e,t)},Ice.MarshalException,"Ice::StringConversionException");Ice.EncapsulationException=t.defineLocalException(function(e,t){Ice.MarshalException.call(this,e,t)},Ice.MarshalException,"Ice::EncapsulationException");Ice.FeatureNotSupportedException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.unsupportedFeature=e!==undefined?e:""},Ice.LocalException,"Ice::FeatureNotSupportedException");Ice.SecurityException=t.defineLocalException(function(e,t){Ice.LocalException.call(this,t);this.reason=e!==undefined?e:""},Ice.LocalException,"Ice::SecurityException");Ice.FixedProxyException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::FixedProxyException");Ice.ResponseSentException=t.defineLocalException(function(e){Ice.LocalException.call(this,e)},Ice.LocalException,"Ice::ResponseSentException")})();(function(){var e=Ice.StringUtil;var t={};Ice.Encoding_1_0=new Ice.EncodingVersion(1,0);Ice.Encoding_1_1=new Ice.EncodingVersion(1,1);Ice.Protocol_1_0=new Ice.ProtocolVersion(1,0);t.headerSize=14;t.magic=Ice.Buffer.createNative([73,99,101,80]);t.protocolMajor=1;t.protocolMinor=0;t.protocolEncodingMajor=1;t.protocolEncodingMinor=0;t.encodingMajor=1;t.encodingMinor=1;t.requestMsg=0;t.requestBatchMsg=1;t.replyMsg=2;t.validateConnectionMsg=3;t.closeConnectionMsg=4;t.replyOK=0;t.replyUserException=1;t.replyObjectNotExist=2;t.replyFacetNotExist=3;t.replyOperationNotExist=4;t.replyUnknownLocalException=5;t.replyUnknownUserException=6;t.replyUnknownException=7;t.requestHdr=Ice.Buffer.createNative([t.magic[0],t.magic[1],t.magic[2],t.magic[3],t.protocolMajor,t.protocolMinor,t.protocolEncodingMajor,t.protocolEncodingMinor,t.requestMsg,0,0,0,0,0,0,0,0,0]);t.requestBatchHdr=Ice.Buffer.createNative([t.magic[0],t.magic[1],t.magic[2],t.magic[3],t.protocolMajor,t.protocolMinor,t.protocolEncodingMajor,t.protocolEncodingMinor,t.requestBatchMsg,0,0,0,0,0,0,0,0,0]);t.replyHdr=Ice.Buffer.createNative([t.magic[0],t.magic[1],t.magic[2],t.magic[3],t.protocolMajor,t.protocolMinor,t.protocolEncodingMajor,t.protocolEncodingMinor,t.replyMsg,0,0,0,0,0]);t.currentProtocol=new Ice.ProtocolVersion(t.protocolMajor,t.protocolMinor);t.currentProtocolEncoding=new Ice.EncodingVersion(t.protocolEncodingMajor,t.protocolEncodingMinor);t.currentEncoding=new Ice.EncodingVersion(t.encodingMajor,t.encodingMinor);t.checkSupportedProtocol=function(e){if(e.major!==t.currentProtocol.major||e.minor>t.currentProtocol.minor){throw new Ice.UnsupportedProtocolException("",e,t.currentProtocol)}};t.checkSupportedProtocolEncoding=function(e){if(e.major!==t.currentProtocolEncoding.major||e.minor>t.currentProtocolEncoding.minor){throw new Ice.UnsupportedEncodingException("",e,t.currentProtocolEncoding)}};t.checkSupportedEncoding=function(e){if(e.major!==t.currentEncoding.major||e.minor>t.currentEncoding.minor){throw new Ice.UnsupportedEncodingException("",e,t.currentEncoding)}};t.getCompatibleProtocol=function(e){if(e.major!==t.currentProtocol.major){return e}else if(e.minor255){throw new Ice.VersionParseException("range error in version `"+t+"'")}return r}function i(t){var n=t.indexOf(".");if(n===-1){throw new Ice.VersionParseException("malformed version value `"+t+"'")}var i=t.substring(n+1);var r;try{r=e.toInt(i)}catch(s){throw new Ice.VersionParseException("invalid version value `"+t+"'")}if(r<0||r>255){throw new Ice.VersionParseException("range error in version `"+t+"'")}return r}function r(e,t){return e+"."+t}})();(function(){var e=function t(e,n,i){this._pattern=e;this._deprecated=n;this._deprecatedBy=i};Object.defineProperty(e.prototype,"pattern",{get:function(){return this._pattern}});Object.defineProperty(e.prototype,"deprecated",{get:function(){return this._deprecated}});Object.defineProperty(e.prototype,"deprecatedBy",{get:function(){return this._deprecatedBy}});Ice.Property=e})();(function(){var e={};var t=Ice.Property;e.IceProps=[new t("/^Ice.ACM.Client/",true,null),new t("/^Ice.ACM.Server/",true,null),new t("/^Ice.ACM.Timeout/",false,null),new t("/^Ice.ACM.Heartbeat/",false,null),new t("/^Ice.ACM.Close/",false,null),new t("/^Ice.ACM/",false,null),new t("/^Ice.ACM.Client.Timeout/",false,null),new t("/^Ice.ACM.Client.Heartbeat/",false,null),new t("/^Ice.ACM.Client.Close/",false,null),new t("/^Ice.ACM.Client/",false,null),new t("/^Ice.ACM.Server.Timeout/",false,null),new t("/^Ice.ACM.Server.Heartbeat/",false,null),new t("/^Ice.ACM.Server.Close/",false,null),new t("/^Ice.ACM.Server/",false,null),new t("/^Ice.Admin.ACM.Timeout/",false,null),new t("/^Ice.Admin.ACM.Heartbeat/",false,null),new t("/^Ice.Admin.ACM.Close/",false,null),new t("/^Ice.Admin.ACM/",false,null),new t("/^Ice.Admin.AdapterId/",false,null),new t("/^Ice.Admin.Endpoints/",false,null),new t("/^Ice.Admin.Locator.EndpointSelection/",false,null),new t("/^Ice.Admin.Locator.ConnectionCached/",false,null),new t("/^Ice.Admin.Locator.PreferSecure/",false,null),new t("/^Ice.Admin.Locator.LocatorCacheTimeout/",false,null),new t("/^Ice.Admin.Locator.InvocationTimeout/",false,null),new t("/^Ice.Admin.Locator.Locator/",false,null),new t("/^Ice.Admin.Locator.Router/",false,null),new t("/^Ice.Admin.Locator.CollocationOptimized/",false,null),new t("/^Ice.Admin.Locator.Context../",false,null),new t("/^Ice.Admin.Locator/",false,null),new t("/^Ice.Admin.PublishedEndpoints/",false,null),new t("/^Ice.Admin.ReplicaGroupId/",false,null),new t("/^Ice.Admin.Router.EndpointSelection/",false,null),new t("/^Ice.Admin.Router.ConnectionCached/",false,null),new t("/^Ice.Admin.Router.PreferSecure/",false,null),new t("/^Ice.Admin.Router.LocatorCacheTimeout/",false,null),new t("/^Ice.Admin.Router.InvocationTimeout/",false,null),new t("/^Ice.Admin.Router.Locator/",false,null),new t("/^Ice.Admin.Router.Router/",false,null),new t("/^Ice.Admin.Router.CollocationOptimized/",false,null),new t("/^Ice.Admin.Router.Context../",false,null),new t("/^Ice.Admin.Router/",false,null),new t("/^Ice.Admin.ProxyOptions/",false,null),new t("/^Ice.Admin.ThreadPool.Size/",false,null),new t("/^Ice.Admin.ThreadPool.SizeMax/",false,null),new t("/^Ice.Admin.ThreadPool.SizeWarn/",false,null),new t("/^Ice.Admin.ThreadPool.StackSize/",false,null),new t("/^Ice.Admin.ThreadPool.Serialize/",false,null),new t("/^Ice.Admin.ThreadPool.ThreadIdleTime/",false,null),new t("/^Ice.Admin.ThreadPool.ThreadPriority/",false,null),new t("/^Ice.Admin.MessageSizeMax/",false,null),new t("/^Ice.Admin.DelayCreation/",false,null),new t("/^Ice.Admin.Enabled/",false,null),new t("/^Ice.Admin.Facets/",false,null),new t("/^Ice.Admin.InstanceName/",false,null),new t("/^Ice.Admin.Logger.KeepLogs/",false,null),new t("/^Ice.Admin.Logger.KeepTraces/",false,null),new t("/^Ice.Admin.Logger.Properties/",false,null),new t("/^Ice.Admin.ServerId/",false,null),new t("/^Ice.BackgroundLocatorCacheUpdates/",false,null),new t("/^Ice.BatchAutoFlush/",true,null),new t("/^Ice.BatchAutoFlushSize/",false,null),new t("/^Ice.ChangeUser/",false,null),new t("/^Ice.ClassGraphDepthMax/",false,null),new t("/^Ice.ClientAccessPolicyProtocol/",false,null),new t("/^Ice.Compression.Level/",false,null),new t("/^Ice.CollectObjects/",false,null),new t("/^Ice.Config/",false,null),new t("/^Ice.ConsoleListener/",false,null),new t("/^Ice.Default.CollocationOptimized/",false,null),new t("/^Ice.Default.EncodingVersion/",false,null),new t("/^Ice.Default.EndpointSelection/",false,null),new t("/^Ice.Default.Host/",false,null),new t("/^Ice.Default.Locator.EndpointSelection/",false,null),new t("/^Ice.Default.Locator.ConnectionCached/",false,null),new t("/^Ice.Default.Locator.PreferSecure/",false,null),new t("/^Ice.Default.Locator.LocatorCacheTimeout/",false,null),new t("/^Ice.Default.Locator.InvocationTimeout/",false,null),new t("/^Ice.Default.Locator.Locator/",false,null),new t("/^Ice.Default.Locator.Router/",false,null),new t("/^Ice.Default.Locator.CollocationOptimized/",false,null),new t("/^Ice.Default.Locator.Context../",false,null),new t("/^Ice.Default.Locator/",false,null),new t("/^Ice.Default.LocatorCacheTimeout/",false,null),new t("/^Ice.Default.InvocationTimeout/",false,null),new t("/^Ice.Default.Package/",false,null),new t("/^Ice.Default.PreferSecure/",false,null),new t("/^Ice.Default.Protocol/",false,null),new t("/^Ice.Default.Router.EndpointSelection/",false,null),new t("/^Ice.Default.Router.ConnectionCached/",false,null),new t("/^Ice.Default.Router.PreferSecure/",false,null),new t("/^Ice.Default.Router.LocatorCacheTimeout/",false,null),new t("/^Ice.Default.Router.InvocationTimeout/",false,null),new t("/^Ice.Default.Router.Locator/",false,null),new t("/^Ice.Default.Router.Router/",false,null),new t("/^Ice.Default.Router.CollocationOptimized/",false,null),new t("/^Ice.Default.Router.Context../",false,null),new t("/^Ice.Default.Router/",false,null),new t("/^Ice.Default.SlicedFormat/",false,null),new t("/^Ice.Default.SourceAddress/",false,null),new t("/^Ice.Default.Timeout/",false,null),new t("/^Ice.EventLog.Source/",false,null),new t("/^Ice.FactoryAssemblies/",false,null),new t("/^Ice.HTTPProxyHost/",false,null),new t("/^Ice.HTTPProxyPort/",false,null),new t("/^Ice.ImplicitContext/",false,null),new t("/^Ice.InitPlugins/",false,null),new t("/^Ice.IPv4/",false,null),new t("/^Ice.IPv6/",false,null),new t("/^Ice.LogFile/",false,null),new t("/^Ice.LogFile.SizeMax/",false,null),new t("/^Ice.LogStdErr.Convert/",false,null),new t("/^Ice.MessageSizeMax/",false,null),new t("/^Ice.Nohup/",false,null),new t("/^Ice.NullHandleAbort/",false,null),new t("/^Ice.Override.CloseTimeout/",false,null),new t("/^Ice.Override.Compress/",false,null),new t("/^Ice.Override.ConnectTimeout/",false,null),new t("/^Ice.Override.Timeout/",false,null),new t("/^Ice.Override.Secure/",false,null),new t("/^Ice.Package../",false,null),new t("/^Ice.Plugin../",false,null),new t("/^Ice.PluginLoadOrder/",false,null),new t("/^Ice.PreferIPv6Address/",false,null),new t("/^Ice.PrintAdapterReady/",false,null),new t("/^Ice.PrintProcessId/",false,null),new t("/^Ice.PrintStackTraces/",false,null),new t("/^Ice.ProgramName/",false,null),new t("/^Ice.RetryIntervals/",false,null),new t("/^Ice.ServerIdleTime/",false,null),new t("/^Ice.SOCKSProxyHost/",false,null),new t("/^Ice.SOCKSProxyPort/",false,null),new t("/^Ice.StdErr/",false,null),new t("/^Ice.StdOut/",false,null),new t("/^Ice.SyslogFacility/",false,null),new t("/^Ice.ThreadPool.Client.Size/",false,null),new t("/^Ice.ThreadPool.Client.SizeMax/",false,null),new t("/^Ice.ThreadPool.Client.SizeWarn/",false,null),new t("/^Ice.ThreadPool.Client.StackSize/",false,null),new t("/^Ice.ThreadPool.Client.Serialize/",false,null),new t("/^Ice.ThreadPool.Client.ThreadIdleTime/",false,null),new t("/^Ice.ThreadPool.Client.ThreadPriority/",false,null),new t("/^Ice.ThreadPool.Server.Size/",false,null),new t("/^Ice.ThreadPool.Server.SizeMax/",false,null),new t("/^Ice.ThreadPool.Server.SizeWarn/",false,null),new t("/^Ice.ThreadPool.Server.StackSize/",false,null),new t("/^Ice.ThreadPool.Server.Serialize/",false,null),new t("/^Ice.ThreadPool.Server.ThreadIdleTime/",false,null),new t("/^Ice.ThreadPool.Server.ThreadPriority/",false,null),new t("/^Ice.ThreadPriority/",false,null),new t("/^Ice.Trace.Admin.Properties/",false,null),new t("/^Ice.Trace.Admin.Logger/",false,null),new t("/^Ice.Trace.Locator/",false,null),new t("/^Ice.Trace.Network/",false,null),new t("/^Ice.Trace.Protocol/",false,null),new t("/^Ice.Trace.Retry/",false,null),new t("/^Ice.Trace.Slicing/",false,null),new t("/^Ice.Trace.ThreadPool/",false,null),new t("/^Ice.UDP.RcvSize/",false,null),new t("/^Ice.UDP.SndSize/",false,null),new t("/^Ice.TCP.Backlog/",false,null),new t("/^Ice.TCP.RcvSize/",false,null),new t("/^Ice.TCP.SndSize/",false,null),new t("/^Ice.UseApplicationClassLoader/",false,null),new t("/^Ice.UseSyslog/",false,null),new t("/^Ice.Warn.AMICallback/",false,null),new t("/^Ice.Warn.Connections/",false,null),new t("/^Ice.Warn.Datagrams/",false,null),new t("/^Ice.Warn.Dispatch/",false,null),new t("/^Ice.Warn.Endpoints/",false,null),new t("/^Ice.Warn.UnknownProperties/",false,null),new t("/^Ice.Warn.UnusedProperties/",false,null),new t("/^Ice.CacheMessageBuffers/",false,null),new t("/^Ice.ThreadInterruptSafe/",false,null),new t("/^Ice.Voip/",false,null)]; +e.validProps=[e.IceProps];e.clPropNames=["Ice"];Ice.PropertyNames=e})();(function(){var e=Ice.HashMap;var t=Ice.AlreadyRegisteredException;var n=Ice.NotRegisteredException;var i=Ice.Class({__init__:function(){this._factoryMap=new e},add:function(e,n){var i,r;i=this._factoryMap.get(n);if(i!==undefined){r=new t;r.id=n;r.kindOfObject="object factory";throw r}this._factoryMap.set(n,e)},remove:function(e){var t,i;t=this._factoryMap.get(e);if(t===undefined){i=new n;i.id=e;i.kindOfObject="object factory";throw i}this._factoryMap.delete(e);t.destroy()},find:function(e){return this._factoryMap.get(e)},destroy:function(){var t=this._factoryMap,n=t.entries;this._factoryMap=new e;while(n!==null){n.value.destroy();n=n.next}}});Ice.ObjectFactoryManager=i})();(function(){var e=Ice.Promise;var t=Ice.Class(e,{__init__:function(t,n,i,r,s){e.call(this);if(t!==undefined){this._communicator=t;this._instance=t!==null?t.instance:null;this._operation=n;this._connection=i;this._proxy=r;this._adapter=s}}});var n=t.prototype;var i=Object.defineProperty;i(n,"communicator",{get:function(){return this._communicator}});i(n,"connection",{get:function(){return this._connection}});i(n,"proxy",{get:function(){return this._proxy}});i(n,"adapter",{get:function(){return this._adapter}});i(n,"operation",{get:function(){return this._operation}});Ice.AsyncResultBase=t})();(function(){t.defineDictionary(Ice,"Context","ContextHelper","Ice.StringHelper","Ice.StringHelper",false,undefined,undefined);Ice.OperationMode=t.defineEnum([["Normal",0],["Nonmutating",1],["Idempotent",2]]);Ice.Current=t.defineStruct(function(e,t,n,i,r,s,o,c,a){this.adapter=e!==undefined?e:null;this.con=t!==undefined?t:null;this.id=n!==undefined?n:new Ice.Identity;this.facet=i!==undefined?i:"";this.operation=r!==undefined?r:"";this.mode=s!==undefined?s:Ice.OperationMode.Normal;this.ctx=o!==undefined?o:null;this.requestId=c!==undefined?c:0;this.encoding=a!==undefined?a:new Ice.EncodingVersion},false)})();(function(){Ice.ObjectFactory=Ice.Class({create:function(e){throw new Error("not implemented")},destroy:function(){throw new Error("not implemented")}})})();(function(){var e=Ice.Class(Error,{__init__:function(t){if(t instanceof Ice.LocalException){this._ex=t}else{Ice.Debug.assert(t instanceof e);this._ex=t._ex}}});var t=e.prototype;Object.defineProperty(t,"inner",{get:function(){return this._ex}});Ice.RetryException=e})();(function(){Ice.EndpointSelectionType=t.defineEnum([["Random",0],["Ordered",1]])})();(function(){var e=Ice.Promise;var t=Ice.ReferenceMode;var n=Ice.Class({__init__:function(e,n,i){this._reference=e;this._response=e.getMode()==t.ModeTwoway;this._connection=n;this._compress=i},update:function(e,t){try{if(e===this){return t}else if(e.getConnection()===this._connection){return t}}catch(n){}return this},sendAsyncRequest:function(e){return e.__invokeRemote(this._connection,this._compress,this._response)},asyncRequestCanceled:function(e){return this._connection.asyncRequestCanceled(e)},getReference:function(){return this._reference},getConnection:function(){return this._connection}});Ice.ConnectionRequestHandler=n})();(function(){var e=Ice.Debug;var t=Ice.HashMap;var n=Ice.Protocol;var i=Ice.StringUtil;var r=Ice.OperationMode;var s=Ice.Identity;var o={};o.traceSend=function(e,t,n){if(n.protocol>=1){var i=e.pos;e.pos=0;var r=[];var s=_(r,e);t.trace(n.protocolCat,"sending "+I(s)+" "+r.join(""));e.pos=i}};o.traceRecv=function(e,t,n){if(n.protocol>=1){var i=e.pos;e.pos=0;var r=[];var s=_(r,e);t.trace(n.protocolCat,"received "+I(s)+" "+r.join(""));e.pos=i}};o.trace=function(e,t,n,i){if(i.protocol>=1){var r=t.pos;t.pos=0;var s=[];s.push(e);_(s,t);n.trace(i.protocolCat,s.join(""));t.pos=r}};var c=new t;function a(e,t,n,i){if(!c.has(t)){var r="unknown "+e+" type `"+t+"'";i.trace(n,r);c.set(t,1)}}o.dumpStream=function(e){var t=e.pos;e.pos=0;var n=e.readBlob(e.size());o.dumpOctets(n);e.pos=t};o.dumpOctets=function(e){var t=8;var n=[];for(var i=0;i=32&&e[r]<127){n.push(String.fromCharCode(e[r]))}else{n.push(".")}}n.push('"\n')}console.log(n.join(""))};Ice.TraceUtil=o;function u(e,t){var n=new s;n.__read(t);e.push("\nidentity = "+t.instance.identityToString(n));var r=Ice.StringSeqHelper.read(t);e.push("\nfacet = ");if(r.length>0){e.push(i.escapeString(r[0],""))}var o=t.readString();e.push("\noperation = "+o)}function l(e,t){var n=t.readInt();e.push("\nrequest id = "+n);if(n===0){e.push(" (oneway)")}d(e,t)}function h(e,t){var n=t.readInt();e.push("\nnumber of requests = "+n);for(var i=0;i0){var s=t.readString();var o=t.readString();e.push(s+"/"+o);if(i>0){e.push(", ")}}var c=t.skipEncaps();if(!c.equals(Ice.Encoding_1_0)){e.push("\nencoding = ");e.push(Ice.encodingVersionToString(c))}}function p(e,t){t.readByte();t.readByte();t.readByte();t.readByte();t.readByte();t.readByte();t.readByte();t.readByte();var n=t.readByte();e.push("\nmessage type = "+n+" ("+I(n)+")");var i=t.readByte();e.push("\ncompression status = "+i+" ");switch(i){case 0:{e.push("(not compressed; do not compress response, if any)");break}case 1:{e.push("(not compressed; compress response, if any)");break}case 2:{e.push("(compressed; compress response, if any)");break}default:{e.push("(unknown)");break}}var r=t.readInt();e.push("\nmessage size = "+r);return n}function _(e,t){var i=p(e,t);switch(i){case n.closeConnectionMsg:case n.validateConnectionMsg:{break}case n.requestMsg:{l(e,t);break}case n.requestBatchMsg:{h(e,t);break}case n.replyMsg:{f(e,t);break}default:{break}}return i}function I(e){switch(e){case n.requestMsg:return"request";case n.requestBatchMsg:return"batch request";case n.replyMsg:return"reply";case n.closeConnectionMsg:return"close connection";case n.validateConnectionMsg:return"validate connection";default:return"unknown"}}})();(function(){var e=Ice.Logger;var t=null;Ice.getProcessLogger=function(){if(t===null){t=new e("","")}return t};Ice.setProcessLogger=function(e){t=e}})();(function(){var e=Ice.UnexpectedObjectException;var t=Ice.MemoryLimitException;Ice.ExUtil={throwUOE:function(t,n){var i=n.ice_id();throw new e("expected element of type `"+t+"' but received '"+i,i,t)},throwMemoryLimitException:function(e,n){throw new t("requested "+e+" bytes, maximum allowed is "+n+" bytes (see Ice.MessageSizeMax)")}}})();(function(){var e=Ice.StringUtil;var t=Ice.HashMap;var n=Ice.Promise;var i=Ice.PropertyNames;var r=Ice.Debug;var s=Ice.ProcessLogger;var o=Ice.getProcessLogger;var c=Ice.InitializationException;var a=0;var u=1;var l=Ice.Class({__init__:function(e,n){this._properties=new t;if(n!==undefined&&n!==null){for(var i=n._properties.entries;i!==null;i=i.next){this._properties.set(i.key,{value:i.value.value,used:false})}}if(e!==undefined&&e!==null){var r=this.parseIceCommandLineOptions(e);e.length=0;for(var s=0;s0){var g=this._properties.get(e);if(g!==undefined){g.value=t}else{this._properties.set(e,{value:t,used:false})}}else{this._properties.delete(e)}},getCommandLineOptions:function(){var e=[];for(var t=this._properties.entries;t!==null;t=t.next){e.push("--"+t.key+"="+t.pv.value)}return e},parseCommandLineOptions:function(e,t){if(e.length>0&&e.charAt(e.length-1)!="."){e+="."}e="--"+e;var n=[];var i=this;t.forEach(function(t){if(t.indexOf(e)===0){if(t.indexOf("=")===-1){t+="=1"}i.parseLine(t.substring(2))}else{n.push(t)}});return n},parseIceCommandLineOptions:function(e){var t=e.slice();for(var n=0;n0){c.id+=" -f "+n.escapeString(s,"")}throw c}}o.set(s,i)},addDefaultServant:function(t,n){e.assert(this._instance!==null);var i=this._defaultServantMap.get(n);if(i!==undefined){var r=new Ice.AlreadyRegisteredException;r.kindOfObject="default servant";r.id=n;throw r}this._defaultServantMap.set(n,t)},removeServant:function(t,i){e.assert(this._instance!==null);if(i===null){i=""}var r=this._servantMapMap.get(t);if(r===undefined||!r.has(i)){var s=new Ice.NotRegisteredException;s.id=this._instance.identityToString(t);s.kindOfObject="servant";if(i.length>0){s.id+=" -f "+n.escapeString(i,"")}throw s}var o=r.get(i);r.delete(i);if(r.size===0){this._servantMapMap.delete(t)}return o},removeDefaultServant:function(t){e.assert(this._instance!==null);var n=this._defaultServantMap.get(t);if(n===undefined){var i=new Ice.NotRegisteredException;i.kindOfObject="default servant";i.id=t;throw i}this._defaultServantMap.delete(t);return n},removeAllFacets:function(t){e.assert(this._instance!==null);var n=this._servantMapMap.get(t);if(n===undefined){var i=new Ice.NotRegisteredException;i.id=this._instance.identityToString(t);i.kindOfObject="servant";throw i}this._servantMapMap.delete(t);return n},findServant:function(e,t){if(t===null){t=""}var n=this._servantMapMap.get(e);var i=null;if(n===undefined){i=this._defaultServantMap.get(e.category);if(i===undefined){i=this._defaultServantMap.get("")}}else{i=n.get(t)}return i===undefined?null:i},findDefaultServant:function(t){e.assert(this._instance!==null);var n=this._defaultServantMap.get(t);return n===undefined?null:n},findAllFacets:function(n){e.assert(this._instance!==null);var i=this._servantMapMap.get(n);if(i!==undefined){return i.clone()}return new t},hasServant:function(t){var n=this._servantMapMap.get(t);if(n===undefined){return false}else{e.assert(n.size>0);return true}},addServantLocator:function(t,i){e.assert(this._instance!==null);var r=this._locatorMap.get(i);if(r!==undefined){var s=new Ice.AlreadyRegisteredException;s.id=n.escapeString(i,"");s.kindOfObject="servant locator";throw s}this._locatorMap.set(i,t)},removeServantLocator:function(t){e.assert(this._instance!==null);var i=this._locatorMap.get(t);if(i===undefined){var r=new Ice.NotRegisteredException;r.id=n.escapeString(t,"");r.kindOfObject="servant locator";throw r}this._locatorMap.delete(t);return i},findServantLocator:function(e){var t=this._locatorMap.get(e);return t===undefined?null:t},destroy:function(){e.assert(this._instance!==null);var t=this._instance.initializationData().logger;this._servantMapMap.clear();this._defaultServantMap.clear();var n=this._locatorMap.clone();this._locatorMap.clear();this._instance=null;for(var i=n.entries;i!==null;i=i.next){var r=i.value;try{r.deactivate(i.key)}catch(s){var o="exception during locator deactivation:\n"+"object adapter: `"+this._adapterName+"'\n"+"locator category: `"+i.key+"'\n"+s.toString();t.error(o)}}}});Ice.ServantManager=i})();(function(){var e=Ice.__M;var t=Ice.Debug;var n=Ice.ExUtil;var i=Ice.FormatType;var r=Ice.HashMap;var s=Ice.Object;var o=Ice.OptionalFormat;var c=Ice.Protocol;var a=Ice.TraceUtil;var u=Ice.ArrayUtil;var l=Ice.SlicedData;var h={};h.NoSlice=0;h.ObjectSlice=1;h.ExceptionSlice=2;var f=255;var d=1<<0;var p=1<<1;var _=1<<1|1<<0;var I=1<<2;var g=1<<3;var v=1<<4;var m=1<<5;Number.isNaN=Number.isNaN||function(e){return typeof e==="number"&&isNaN(e)};var y=function(e,t){this.index=e;this.patcher=t};var w=Ice.Class;var E=w({__init__:function(e,t,n,i){this._stream=e;this._encaps=t;this._sliceObjects=n;this._servantFactoryManager=i;this._patchMap=null;this._unmarshaledMap=new r;this._typeIdMap=null;this._typeIdIndex=0;this._objectList=null},readOpt:function(){return false},readPendingObjects:function(){},readTypeId:function(e){var t,n;if(this._typeIdMap===null){this._typeIdMap=new r}if(e){n=this._stream.readSize();t=this._typeIdMap.get(n);if(t===undefined){throw new Ice.UnmarshalOutOfBoundsException}}else{t=this._stream.readString();this._typeIdMap.set(++this._typeIdIndex,t)}return t},newInstance:function(e){var t=this._servantFactoryManager.find(e);var n=null;if(t!==undefined){n=t.create(e)}if(n===null||n===undefined){t=this._servantFactoryManager.find("");if(t!==undefined){n=t.create(e)}}if(n===null||n===undefined){n=this._stream.createObject(e)}return n},addPatchEntry:function(e,n){t.assert(e>0);var i=this._unmarshaledMap.get(e);if(i!==undefined&&i!==null){n.call(null,i);return}if(this._patchMap===null){this._patchMap=new r}var s=this._patchMap.get(e);if(s===undefined){s=[];this._patchMap.set(e,s)}s.push(n)},unmarshal:function(e,n){var i,r,s;this._unmarshaledMap.set(e,n);n.__read(this._stream);if(this._patchMap!==null){s=this._patchMap.get(e);if(s!==undefined){t.assert(s.length>0);for(i=0,r=s.length;i0){throw new Ice.MarshalException("invalid object id")}n=-n;if(n===0){e.call(null,null)}else{this.addPatchEntry(n,e)}},throwException:function(){t.assert(this._sliceType===h.NoSlice);var e=this._stream.readBool();this._sliceType=h.ExceptionSlice;this._skipFirstSlice=false;this.startSlice();var n=this._typeId;while(true){var i=this._stream.createUserException(this._typeId);if(i!==null){i.__read(this._stream);if(e){this.readPendingObjects()}throw i}this.skipSlice();try{this.startSlice()}catch(r){if(r instanceof Ice.UnmarshalOutOfBoundsException){r.reason="unknown exception type `"+n+"'"}throw r}}},startInstance:function(e){t.assert(this._sliceType===e);this._skipFirstSlice=true},endInstance:function(){var e;if(this._sliceType===h.ObjectSlice){this.startSlice();e=this._stream.readSize();if(e!==0){throw new Ice.MarshalException("invalid Object slice")}this.endSlice()}this._sliceType=h.NoSlice;return null},startSlice:function(){var e;if(this._skipFirstSlice){this._skipFirstSlice=false;return this._typeId}if(this._sliceType===h.ObjectSlice){e=this._stream.readBool();this._typeId=this.readTypeId(e)}else{this._typeId=this._stream.readString()}this._sliceSize=this._stream.readInt();if(this._sliceSize<4){throw new Ice.UnmarshalOutOfBoundsException}return this._typeId},endSlice:function(){},skipSlice:function(){if(this._stream.instance.traceLevels().slicing>0){var e=this._stream.instance.initializationData().logger;if(this._sliceType===h.ObjectSlice){a.traceSlicing("object",this._typeId,this._stream.instance.traceLevels().slicingCat,e)}else{a.traceSlicing("exception",this._typeId,this._stream.instance.traceLevels().slicingCat,e)}}t.assert(this._sliceSize>=4);this._stream.skip(this._sliceSize-4)},readPendingObjects:function(){var e,t;do{t=this._stream.readSize();for(e=t;e>0;--e){this.readInstance()}}while(t>0);if(this._patchMap!==null&&this._patchMap.size!==0){throw new Ice.MarshalException("index for class received, but no instance")}},readInstance:function(){var e=this._stream.readInt(),t,n=null;if(e<=0){throw new Ice.MarshalException("invalid object id")}this._sliceType=h.ObjectSlice;this._skipFirstSlice=false;this.startSlice();t=this._typeId;while(true){if(this._typeId==s.ice_staticId()){throw new Ice.NoObjectFactoryException("",t)}n=this.newInstance(this._typeId);if(n){break}if(!this._sliceObjects){throw new Ice.NoObjectFactoryException("no object factory found and object slicing is disabled",this._typeId)}this.skipSlice();this.startSlice()}this.unmarshal(e,n)}});var S=w(E,{__init__:function(e,t,n,i){E.call(this,e,t,n,i);this._current=null;this._objectIdIndex=1},readObject:function(e){t.assert(e!==undefined);var n=this._stream.readSize();if(n<0){throw new Ice.MarshalException("invalid object id")}if(n===0){if(e!==null){e.call(null,null)}}else if(this._current!==null&&(this._current.sliceFlags&g)!==0){if(e!==null){if(this._current.indirectPatchList===null){this._current.indirectPatchList=[]}var i=new y;i.index=n-1;i.patcher=e;this._current.indirectPatchList.push(i)}}else{this.readInstance(n,e)}},throwException:function(){t.assert(this._current===null);this.push(h.ExceptionSlice);this.startSlice();var e=this._current.typeId;while(true){var n=this._stream.createUserException(this._current.typeId);if(n!==null){n.__read(this._stream);throw n}this.skipSlice();if((this._current.sliceFlags&m)!==0){if(e.indexOf("::")===0){throw new Ice.UnknownUserException(e.substr(2))}throw new Ice.UnknownUserException(e)}this.startSlice()}},startInstance:function(e){t.assert(e!==undefined);t.assert(this._current.sliceType!==null&&this._current.sliceType===e);this._current.skipFirstSlice=true},endInstance:function(e){var t=null;if(e){t=this.readSlicedData()}if(this._current.slices!==null){this._current.slices.length=0;this._current.indirectionTables.length=0}this._current=this._current.previous;return t},startSlice:function(){if(this._current.skipFirstSlice){this._current.skipFirstSlice=false;return this._current.typeId}this._current.sliceFlags=this._stream.readByte();if(this._current.sliceType===h.ObjectSlice){if((this._current.sliceFlags&_)===_){this._current.typeId="";this._current.compactId=this._stream.readSize()}else if((this._current.sliceFlags&(p|d))!==0){this._current.typeId=this.readTypeId((this._current.sliceFlags&p)!==0);this._current.compactId=-1}else{this._current.typeId="";this._current.compactId=-1}}else{this._current.typeId=this._stream.readString();this._current.compactId=-1}if((this._current.sliceFlags&v)!==0){this._current.sliceSize=this._stream.readInt();if(this._current.sliceSize<4){throw new Ice.UnmarshalOutOfBoundsException}}else{this._current.sliceSize=0}return this._current.typeId},endSlice:function(){var e,n,i=[],r;if((this._current.sliceFlags&I)!==0){this._stream.skipOpts()}if((this._current.sliceFlags&g)!==0){r=this._stream.readAndCheckSeqSize(1);for(n=0;n=0);if(e.index>=i.length){throw new Ice.MarshalException("indirection out of range")}this.addPatchEntry(i[e.index],e.patcher)}this._current.indirectPatchList.length=0}}},skipSlice:function(){if(this._stream.instance.traceLevels().slicing>0){var e=this._stream.instance.initializationData().logger;var n=this._stream.instance.traceLevels().slicingCat;if(this._current.sliceType===h.ExceptionSlice){a.traceSlicing("exception",this._current.typeId,n,e)}else{a.traceSlicing("object",this._current.typeId,n,e)}}var i=this._stream.pos;if((this._current.sliceFlags&v)!==0){t.assert(this._current.sliceSize>=4);this._stream.skip(this._current.sliceSize-4)}else{if(this._current.sliceType===h.ObjectSlice){throw new Ice.NoObjectFactoryException("no object factory found and compact format prevents slicing "+"(the sender should use the sliced format instead)",this._current.typeId)}if(this._current.typeId.indexOf("::")===0){throw new Ice.UnknownUserException(this._current.typeId.substring(2))}throw new Ice.UnknownUserException(this._current.typeId)}var r=new Ice.SliceInfo;r.typeId=this._current.typeId;r.compactId=this._current.compactId;r.hasOptionalMembers=(this._current.sliceFlags&I)!==0;r.isLastSlice=(this._current.sliceFlags&m)!==0;var s=this._stream._buf;var o=s.position;var c=o;if(r.hasOptionalMembers){--c}s.position=i;r.bytes=s.getArray(c-i);s.position=o;if(this._current.slices===null){this._current.slices=[];this._current.indirectionTables=[]}if((this._current.sliceFlags&g)!==0){var u=this._stream.readAndCheckSeqSize(1);var l=[];for(var f=0;f0);var i,r=null;if(e>1){if(n!==null){this.addPatchEntry(e,n)}return e}this.push(h.ObjectSlice);e=++this._objectIdIndex;this.startSlice();i=this._current.typeId;while(true){if(this._current.compactId>=0){this._current.typeId="";if(this._current.typeId.length===0){this._current.typeId=this._stream.getTypeId(this._current.compactId)}}if(this._current.typeId.length>0){r=this.newInstance(this._current.typeId);if(r!==null&&r!==undefined){break}}if(!this._sliceObjects){throw new Ice.NoObjectFactoryException("no object factory found and object slicing is disabled",this._current.typeId)}this.skipSlice();if((this._current.sliceFlags&m)!==0){r=new Ice.UnknownSlicedObject(i);break}this.startSlice()}this.unmarshal(e,r);if(this._current===null&&this._patchMap!==null&&this._patchMap.size!==0){throw new Ice.MarshalException("index for class received, but no instance")}if(n!==null){n.call(null,r)}return e},readSlicedData:function(){var e,n,i,r,o,c;if(this._current.slices===null){return null}t.assert(this._current.slices.length===this._current.indirectionTables.length);for(e=0,n=this._current.slices.length;e0){this._marshaledMap.merge(this._toBeMarshaledMap);n=this._toBeMarshaledMap;this._toBeMarshaledMap=new r;this._stream.writeSize(n.size);n.forEach(t)}this._stream.writeSize(0)},registerObject:function(e){t.assert(e!==null);var n=this._toBeMarshaledMap.get(e);if(n!==undefined){return n}n=this._marshaledMap.get(e);if(n!==undefined){return n}this._toBeMarshaledMap.set(e,++this._objectIdIndex);return this._objectIdIndex}});var M=w(C,{__init__:function(e,t){C.call(this,e,t);this._current=null;this._objectIdIndex=1},writeObject:function(e){t.assert(e!==undefined);var n,s;if(e===null){this._stream.writeSize(0)}else if(this._current!==null&&this._encaps.format===i.SlicedFormat){if(this._current.indirectionTable===null){this._current.indirectionTable=[];this._current.indirectionMap=new r}n=this._current.indirectionMap.get(e);if(n===undefined){this._current.indirectionTable.push(e);s=this._current.indirectionTable.length;this._current.indirectionMap.set(e,s);this._stream.writeSize(s)}else{this._stream.writeSize(n)}}else{this.writeInstance(e)}},writePendingObjects:function(){return undefined},writeUserException:function(e){t.assert(e!==null&&e!==undefined);e.__write(this._stream)},startInstance:function(e,t){if(this._current===null){this._current=new M.InstanceData(null)}else{this._current=this._current.next===null?new M.InstanceData(this._current):this._current.next}this._current.sliceType=e;this._current.firstSlice=true;if(t!==null&&t!==undefined){this.writeSlicedData(t)}},endInstance:function(){this._current=this._current.previous},startSlice:function(e,n,r){t.assert((this._current.indirectionTable===null||this._current.indirectionTable.length===0)&&(this._current.indirectionMap===null||this._current.indirectionMap.size===0));this._current.sliceFlagsPos=this._stream.pos;this._current.sliceFlags=0;if(this._encaps.format===i.SlicedFormat){this._current.sliceFlags|=v}if(r){this._current.sliceFlags|=m}this._stream.writeByte(0);if(this._current.sliceType===h.ObjectSlice){if(this._encaps.format===i.SlicedFormat||this._current.firstSlice){if(n>=0){this._current.sliceFlags|=_;this._stream.writeSize(n)}else{var s=this.registerTypeId(e);if(s<0){this._current.sliceFlags|=d;this._stream.writeString(e)}else{this._current.sliceFlags|=p;this._stream.writeSize(s)}}}}else{this._stream.writeString(e)}if((this._current.sliceFlags&v)!==0){ +this._stream.writeInt(0)}this._current.writeSlice=this._stream.pos;this._current.firstSlice=false},endSlice:function(){var e,n,r;if((this._current.sliceFlags&I)!==0){this._stream.writeByte(f)}if((this._current.sliceFlags&v)!==0){e=this._stream.pos-this._current.writeSlice+4;this._stream.rewriteInt(e,this._current.writeSlice-4)}if(this._current.indirectionTable!==null&&this._current.indirectionTable.length!==0){t.assert(this._encaps.format===i.SlicedFormat);this._current.sliceFlags|=g;this._stream.writeSize(this._current.indirectionTable.length);for(n=0,r=this._current.indirectionTable.length;n0){if(this._current.indirectionTable===null){this._current.indirectionTable=[];this._current.indirectionMap=new r}for(c=0,a=o.objects.length;cthis._buf.remaining){throw new Ice.UnmarshalOutOfBoundsException}this._readEncapsStack.sz=t;var n=new Ice.EncodingVersion;n.__read(this);c.checkSupportedEncoding(n);this._readEncapsStack.setEncoding(n);return n},endReadEncaps:function(){t.assert(this._readEncapsStack!==null);if(!this._readEncapsStack.encoding_1_0){this.skipOpts();if(this._buf.position!==this._readEncapsStack.start+this._readEncapsStack.sz){throw new Ice.EncapsulationException}}else if(this._buf.position!==this._readEncapsStack.start+this._readEncapsStack.sz){if(this._buf.position+1!==this._readEncapsStack.start+this._readEncapsStack.sz){throw new Ice.EncapsulationException}try{this._buf.get()}catch(e){throw new Ice.UnmarshalOutOfBoundsException}}var n=this._readEncapsStack;this._readEncapsStack=n.next;n.next=this._readEncapsCache;this._readEncapsCache=n;this._readEncapsCache.reset()},skipEmptyEncaps:function(){var e=this.readInt();if(e<6){throw new Ice.EncapsulationException}if(e-4>this._buf.remaining){throw new Ice.UnmarshalOutOfBoundsException}var t=new Ice.EncodingVersion;t.__read(this);if(t.equals(Ice.Encoding_1_0)){if(e!=6){throw new Ice.EncapsulationException}}else{this._buf.position=this._buf.position+e-6}return t},endReadEncapsChecked:function(){if(this._readEncapsStack===null){throw new Ice.EncapsulationException("not in an encapsulation")}this.endReadEncaps()},readEncaps:function(e){t.assert(e!==undefined);var n=this.readInt();if(n<6){throw new Ice.UnmarshalOutOfBoundsException}if(n-4>this._buf.remaining){throw new Ice.UnmarshalOutOfBoundsException}if(e!==null){e.__read(this);this._buf.position=this._buf.position-6}else{this._buf.position=this._buf.position-4}try{return this._buf.getArray(n)}catch(i){throw new Ice.UnmarshalOutOfBoundsException}},getReadEncoding:function(){return this._readEncapsStack!==null?this._readEncapsStack.encoding:this._encoding},getReadEncapsSize:function(){t.assert(this._readEncapsStack!==null);return this._readEncapsStack.sz-6},skipEncaps:function(){var e=this.readInt();if(e<6){throw new Ice.UnmarshalOutOfBoundsException}var t=new Ice.EncodingVersion;t.__read(this);try{this._buf.position=this._buf.position+e-6}catch(n){throw new Ice.UnmarshalOutOfBoundsException}return t},startWriteSlice:function(e,n,i){t.assert(this._writeEncapsStack!==null&&this._writeEncapsStack.encoder!==null);this._writeEncapsStack.encoder.startSlice(e,n,i)},endWriteSlice:function(){t.assert(this._writeEncapsStack!==null&&this._writeEncapsStack.encoder!==null);this._writeEncapsStack.encoder.endSlice()},startReadSlice:function(){t.assert(this._readEncapsStack!==null&&this._readEncapsStack.decoder!==null);return this._readEncapsStack.decoder.startSlice()},endReadSlice:function(){t.assert(this._readEncapsStack!==null&&this._readEncapsStack.decoder!==null);this._readEncapsStack.decoder.endSlice()},skipSlice:function(){t.assert(this._readEncapsStack!==null&&this._readEncapsStack.decoder!==null);this._readEncapsStack.decoder.skipSlice()},readPendingObjects:function(){if(this._readEncapsStack!==null&&this._readEncapsStack.decoder!==null){this._readEncapsStack.decoder.readPendingObjects()}else if(this._readEncapsStack!==null&&this._readEncapsStack.encoding_1_0||this._readEncapsStack===null&&this._encoding.equals(Ice.Encoding_1_0)){this.skipSize()}},writePendingObjects:function(){if(this._writeEncapsStack!==null&&this._writeEncapsStack.encoder!==null){this._writeEncapsStack.encoder.writePendingObjects()}else if(this._writeEncapsStack!==null&&this._writeEncapsStack.encoding_1_0||this._writeEncapsStack===null&&this._encoding.equals(Ice.Encoding_1_0)){this.writeSize(0)}},writeSize:function(e){if(e>254){this.expand(5);this._buf.put(255);this._buf.putInt(e)}else{this.expand(1);this._buf.put(e)}},readSize:function(){try{var e=this._buf.get();if(e===255){var t=this._buf.getInt();if(t<0){throw new Ice.UnmarshalOutOfBoundsException}return t}return e}catch(n){throw new Ice.UnmarshalOutOfBoundsException}},readAndCheckSeqSize:function(e){var t=this.readSize();if(t===0){return t}if(this._startSeq===-1||this._buf.position>this._startSeq+this._minSeqSize){this._startSeq=this._buf.position;this._minSeqSize=t*e}else{this._minSeqSize+=t*e}if(this._startSeq+this._minSeqSize>this._buf.limit){throw new Ice.UnmarshalOutOfBoundsException}return t},startSize:function(){var e=this._buf.position;this.writeInt(0);return e},endSize:function(e){t.assert(e>=0);this.rewriteInt(this._buf.position-e-4,e)},writeBlob:function(e){if(e===null){return}this.expand(e.length);this._buf.putArray(e)},readBlob:function(e){if(this._buf.remaining=this._readEncapsStack.start+this._readEncapsStack.sz){return false}i=this.readByte();if(i===f){this._buf.position-=1;return false}r=o.valueOf(i&7);s=i>>3;if(s===30){s=this.readSize()}if(s>e){c=s<30?1:s<255?2:6;this._buf.position-=c;return false}if(s=this._readEncapsStack.start+this._readEncapsStack.sz){return}e=this.readByte();t=e<0?e+256:e;if(t===f){return}n=o.valueOf(t&7);if(t>>3===30){this.skipSize()}this.skipOpt(n)}},skip:function(e){if(e>this._buf.remaining){throw new Ice.UnmarshalOutOfBoundsException}this._buf.position+=e},skipSize:function(){var e=this.readByte();if(e===255){this.skip(4)}},isEmpty:function(){return this._buf.empty()},expand:function(e){this._buf.expand(e)},createObject:function(t){var n=null,i;try{var r=t.length>2?t.substr(2).replace(/::/g,"."):"";i=e.type(r);if(i!==undefined){n=new i}}catch(s){throw new Ice.NoObjectFactoryException("no object factory",t,s)}return n},getTypeId:function(e){var t=Ice.CompactIdRegistry.get(e);return t===undefined?"":t},isReadEncoding_1_0:function(){return this._readEncapsStack!==null?this._readEncapsStack.encoding_1_0:this._encoding.equals(Ice.Encoding_1_0)},isWriteEncoding_1_0:function(){return this._writeEncapsStack?this._writeEncapsStack.encoding_1_0:this._encoding.equals(Ice.Encoding_1_0)},initReadEncaps:function(){if(this._readEncapsStack===null){this._readEncapsStack=this._readEncapsCache;if(this._readEncapsStack!==null){this._readEncapsCache=this._readEncapsCache.next}else{this._readEncapsStack=new O}this._readEncapsStack.setEncoding(this._encoding);this._readEncapsStack.sz=this._buf.limit}if(this._readEncapsStack.decoder===null){var e=this._instance.servantFactoryManager();if(this._readEncapsStack.encoding_1_0){this._readEncapsStack.decoder=new x(this,this._readEncapsStack,this._sliceObjects,e)}else{this._readEncapsStack.decoder=new S(this,this._readEncapsStack,this._sliceObjects,e)}}},initWriteEncaps:function(){if(!this._writeEncapsStack){this._writeEncapsStack=this._writeEncapsCache;if(this._writeEncapsStack){this._writeEncapsCache=this._writeEncapsCache.next}else{this._writeEncapsStack=new k}this._writeEncapsStack.setEncoding(this._encoding)}if(this._writeEncapsStack.format===i.DefaultFormat){this._writeEncapsStack.format=this._instance.defaultsAndOverrides().defaultFormat}if(!this._writeEncapsStack.encoder){if(this._writeEncapsStack.encoding_1_0){this._writeEncapsStack.encoder=new P(this,this._writeEncapsStack)}else{this._writeEncapsStack.encoder=new M(this,this._writeEncapsStack)}}},createUserException:function(t){var n=null,i;try{var r=t.length>2?t.substr(2).replace(/::/g,"."):"";i=e.type(r);if(i!==undefined){n=new i}}catch(s){throw new Ice.MarshalException(s)}return n}});var T=Object.defineProperty;T(A.prototype,"pos",{get:function(){return this._buf.position},set:function(e){this._buf.position=e}});T(A.prototype,"size",{get:function(){return this._buf.limit}});T(A.prototype,"instance",{get:function(){return this._instance}});T(A.prototype,"closure",{get:function(){return this._type},set:function(e){this._type=e}});T(A.prototype,"buffer",{get:function(){return this._buf}});var L=function(e,t,n,i,r,s){var o={write:function(t,n){return e.call(t,n)},read:function(e){return t.call(e)},writeOpt:function(t,n,r){t.writeOptValue(n,i,e,r)},readOpt:function(e,n){return e.readOptValue(n,i,t)}};if(r!==undefined&&s!==undefined){o.validate=function(e){return e>=r&&e<=s}}T(o,"minWireSize",{get:function(){return n}});return o};var F=A.prototype;var R=0;var D=255;var j=-32768;var z=32767;var q=0;var B=4294967295;var U=-2147483648;var H=2147483647;var N=-3.4028234664e38;var W=3.4028234664e38;Ice.ByteHelper=L(F.writeByte,F.readByte,1,Ice.OptionalFormat.F1,R,D);Ice.ShortHelper=L(F.writeShort,F.readShort,2,Ice.OptionalFormat.F2,j,z);Ice.IntHelper=L(F.writeInt,F.readInt,4,Ice.OptionalFormat.F4,U,H);Ice.FloatHelper=L(F.writeFloat,F.readFloat,4,Ice.OptionalFormat.F4,N,W);Ice.FloatHelper.validate=function(e){return Number.isNaN(e)||e==Number.POSITIVE_INFINITY||e==Number.NEGATIVE_INFINITY||e>=N&&e<=W};Ice.DoubleHelper=L(F.writeDouble,F.readDouble,8,Ice.OptionalFormat.F8,-Number.MAX_VALUE,Number.MAX_VALUE);Ice.DoubleHelper.validate=function(e){return Number.isNaN(e)||e==Number.POSITIVE_INFINITY||e==Number.NEGATIVE_INFINITY||e>=-Number.MAX_VALUE&&e<=Number.MAX_VALUE};Ice.BoolHelper=L(F.writeBool,F.readBool,1,Ice.OptionalFormat.F1);Ice.LongHelper=L(F.writeLong,F.readLong,8,Ice.OptionalFormat.F8);Ice.LongHelper.validate=function(e){return e.low>=q&&e.low<=B&&e.high>=q&&e.high<=B};Ice.StringHelper=L(F.writeString,F.readString,1,Ice.OptionalFormat.VSize);Ice.ObjectHelper={write:function(e,t){e.writeObject(t)},read:function(e){var t;e.readObject(function(e){t=e},Ice.Object);return t},writeOpt:function(e,t,n){e.writeOptValue(t,Ice.OptionalFormat.Class,F.writeObject,n)},readOpt:function(e,t){var n;e.readOptObject(t,function(e){n=e},Ice.Object);return n}};T(Ice.ObjectHelper,"minWireSize",{get:function(){return 1}});Ice.BasicStream=A})();(function(){Ice.SocketOperation={None:0,Read:1,Write:2,Connect:2}})();(function(){var e=Ice.Class({__init__:function(e,t,n,i){this._instance=e;this._traceLevel=e.traceLevels().network;this._traceCategory=e.traceLevels().networkCat;this._logger=e.initializationData().logger;this._properties=e.initializationData().properties;this._type=t;this._protocol=n;this._secure=i},traceLevel:function(){return this._traceLevel},traceCategory:function(){return this._traceCategory},logger:function(){return this._logger},protocol:function(){return this._protocol},type:function(){return this._type},secure:function(){return this._secure},properties:function(){return this._properties},defaultHost:function(){return this._instance.defaultsAndOverrides().defaultHost},defaultSourceAddress:function(){return this._instance.defaultsAndOverrides().defaultSourceAddress},defaultEncoding:function(){return this._instance.defaultsAndOverrides().defaultEncoding},defaultTimeout:function(){return this._instance.defaultsAndOverrides().defaultTimeout},messageSizeMax:function(){return this._instance.messageSizeMax()}});Ice.ProtocolInstance=e})();(function(){t.defineSequence(Ice,"EndpointSeqHelper","Ice.ObjectHelper",false,"Ice.Endpoint")})();(function(){var e=Ice.AsyncResultBase;var t=Ice.Debug;var n=Ice.Promise;var i=Ice.Protocol;var r=Ice.UserException;var s=Ice.BasicStream;var o=Ice.Class(e,{__init__:function(t,n,r,o,c,a){e.call(this,t,n,r,o,c);if(t===undefined){return}this._completed=a;this._is=null;this._os=t!==null?new s(this._instance,i.currentProtocolEncoding):null;this._state=0;this._exception=null;this._sentSynchronously=false},cancel:function(){this.__cancel(new Ice.InvocationCanceledException)},isCompleted:function(){return(this._state&o.Done)>0},isSent:function(){return(this._state&o.Sent)>0},throwLocalException:function(){if(this._exception!==null){throw this._exception}},sentSynchronously:function(){return this._sentSynchronously},__markSent:function(e){t.assert((this._state&o.Done)===0);this._state|=o.Sent;if(e){this._state|=o.Done|o.OK;this._cancellationHandler=null;this.succeed(this)}},__markFinished:function(e,n){t.assert((this._state&o.Done)===0);this._state|=o.Done;if(e){this._state|=o.OK}this._cancellationHandler=null;if(n){n(this)}else{this.succeed(this)}},__markFinishedEx:function(e){t.assert((this._state&o.Done)===0);this._exception=e;this._state|=o.Done;this._cancellationHandler=null;this.fail(e,this)},__cancel:function(e){this._cancellationException=e;if(this._cancellationHandler){this._cancellationHandler.asyncRequestCanceled(this,e)}},__cancelable:function(e){if(this._cancellationException){try{throw this._cancellationException}finally{this._cancellationException=null}}this._cancellationHandler=e},__os:function(){return this._os},__is:function(){return this._is},__startReadParams:function(){this._is.startReadEncaps();return this._is},__endReadParams:function(){this._is.endReadEncaps()},__readEmptyParams:function(){this._is.skipEmptyEncaps()},__readParamEncaps:function(){return this._is.readEncaps(null)},__throwUserException:function(){t.assert((this._state&o.Done)!==0);if((this._state&o.OK)===0){try{this._is.startReadEncaps();this._is.throwException()}catch(e){if(e instanceof r){this._is.endReadEncaps()}throw e}}}});o.OK=1;o.Done=2;o.Sent=4;Ice.AsyncResult=o})();(function(){Ice.Address=function(e,t){this.host=e;this.port=t}})();(function(){var e=Ice.BasicStream;var t=Ice.Debug;var n=Ice.ExUtil;var i=Ice.Class;var r=Ice.Protocol;var s=20+8;var o=i({__init__:function(t,n){this._batchStreamInUse=false;this._batchRequestNum=0;this._batchStream=new e(t,r.currentProtocolEncoding);this._batchStream.writeBlob(r.requestBatchHdr);this._batchMarker=this._batchStream.size;this._exception=null;this._maxSize=t.batchAutoFlushSize();if(this._maxSize>0&&n){var i=t.initializationData().properties;var o=i.getPropertyAsIntWithDefault("Ice.UDP.SndSize",65535-s);if(o0&&this._batchStream.size>=this._maxSize){n.ice_flushBatchRequests()}t.assert(this._batchMarker=0){this._requests.splice(t,1)}},cancel:function(e){var t=this._requests.indexOf(e);if(t>=0){this._requests.splice(t,1);return this._instance.timer().cancel(e.token)}return false}});Ice.RetryQueue=t;var n=e({__init__:function(e,t,n,i){this._instance=e;this._queue=t;this._outAsync=n},run:function(){this._outAsync.__retry();this._queue.remove(this)},destroy:function(){try{this._outAsync.__abort(new Ice.CommunicatorDestroyedException)}catch(e){}},asyncRequestCanceled:function(e,t){if(this._queue.cancel(this)){if(this._instance.traceLevels().retry>=1){this._instance.initializationData().logger.trace(this._instance.traceLevels().retryCat,"operation retry canceled\n"+t.toString())}this._outAsync.__completedEx(t)}}})})();(function(){var e=Ice.ArrayUtil;var t=Ice.Debug;var n=Ice.HashMap;var i=Ice.Promise;var r=Ice.Class({__init__:function(e){this._router=e;t.assert(this._router!==null);this._clientEndpoints=null;this._serverEndpoints=null;this._adapter=null;this._identities=new n(n.compareEquals);this._evictedIdentities=[]},destroy:function(){this._clientEndpoints=[];this._serverEndpoints=[];this._adapter=null;this._identities.clear()},equals:function(e){if(this===e){return true}if(e instanceof r){return this._router.equals(e._router)}return false},hashCode:function(){return this._router.hashCode()},getRouter:function(){return this._router},getClientEndpoints:function(){var e=new i;if(this._clientEndpoints!==null){e.succeed(this._clientEndpoints)}else{var t=this;this._router.getClientProxy().then(function(n){t.setClientEndpoints(n,e)}).exception(function(t){e.fail(t)})}return e},getServerEndpoints:function(){if(this._serverEndpoints!==null){return(new i).succeed(this._serverEndpoints)}else{var e=this;return this._router.getServerProxy().then(function(t){return e.setServerEndpoints(t)})}},addProxy:function(e){t.assert(e!==null);if(this._identities.has(e.ice_getIdentity())){return(new i).succeed()}else{var n=this;return this._router.addProxies([e]).then(function(t){n.addAndEvictProxies(e,t)})}},setAdapter:function(e){this._adapter=e},getAdapter:function(){return this._adapter},clearCache:function(e){this._identities.delete(e.getIdentity())},setClientEndpoints:function(e,t){if(this._clientEndpoints===null){if(e===null){this._clientEndpoints=this._router.__reference().getEndpoints();t.succeed(this._clientEndpoints)}else{e=e.ice_router(null);var n=this;this._router.ice_getConnection().then(function(i){var r=e.ice_timeout(i.timeout());n._clientEndpoints=r.__reference().getEndpoints();t.succeed(n._clientEndpoints)}).exception(function(e){t.fail(e)})}}else{t.succeed(this._clientEndpoints)}},setServerEndpoints:function(e){if(e===null){throw new Ice.NoEndpointException}e=e.ice_router(null);this._serverEndpoints=e.__reference().getEndpoints();return this._serverEndpoints},addAndEvictProxies:function(t,n){var i=e.indexOf(this._evictedIdentities,t.ice_getIdentity(),function(e,t){return e.equals(t); +});if(i>=0){this._evictedIdentities.splice(i,1)}else{this._identities.set(t.ice_getIdentity(),1)}for(var r=0;r0){var i=this;this._timeoutToken=this._instance.timer().schedule(function(){i.__cancel(new Ice.InvocationTimeoutException)},n)}}while(true){try{this._sent=false;this._handler=this._proxy.__getRequestHandler();var r=this._handler.sendAsyncRequest(this);if((r&e.Sent)>0){if(t){this._sentSynchronously=true}}return}catch(o){if(o instanceof s){this._proxy.__updateRequestHandler(this._handler,null)}else{var c=this.__handleException(o);if(c>0){this._instance.retryQueue().add(this,c);return}}}}}catch(o){this.__markFinishedEx(o)}},__markSent:function(e){this._sent=true;if(e){if(this._timeoutToken){this._instance.timer().cancel(this._timeoutToken)}}u.prototype.__markSent.call(this,e)},__markFinishedEx:function(e){if(this._timeoutToken){this._instance.timer().cancel(this._timeoutToken)}u.prototype.__markFinishedEx.call(this,e)},__handleException:function(e){var t={value:0};this._cnt=this._proxy.__handleException(e,this._handler,this._mode,this._sent,t,this._cnt);return t.value}});var h=Ice.Class(l,{__init__:function(e,t,n){if(e!==undefined){l.call(this,e,t);this._encoding=c.getCompatibleEncoding(this._proxy.__reference().getEncoding());this._completed=n}else{l.call(this)}},__prepare:function(e,t,n){c.checkSupportedProtocol(c.getCompatibleProtocol(this._proxy.__reference().getProtocol()));this._mode=t;if(n===null){n=h._emptyContext}if(this._proxy.ice_isBatchOneway()||this._proxy.ice_isBatchDatagram()){this._proxy.__getBatchRequestQueue().prepareBatchRequest(this._os)}else{this._os.writeBlob(c.requestHdr)}var i=this._proxy.__reference();i.getIdentity().__write(this._os);var s=i.getFacet();if(s===null||s.length===0){Ice.StringSeqHelper.write(this._os,null)}else{Ice.StringSeqHelper.write(this._os,[s])}this._os.writeString(this._operation);this._os.writeByte(t.value);if(n!==undefined){if(n!==null&&!(n instanceof r)){throw new Error("illegal context value, expecting null or HashMap")}Ice.ContextHelper.write(this._os,n)}else{var o=i.getInstance().getImplicitContext();var a=i.getContext();if(o===null){Ice.ContextHelper.write(this._os,a)}else{o.write(a,this._os)}}},__sent:function(){this.__markSent(!this._proxy.ice_isTwoway())},__invokeRemote:function(e,t,n){return e.sendAsyncRequest(this,t,n,0)},__abort:function(e){if(this._proxy.ice_isBatchOneway()||this._proxy.ice_isBatchDatagram()){this._proxy.__getBatchRequestQueue().abortBatchRequest(this._os)}l.prototype.__abort.call(this,e)},__invoke:function(){if(this._proxy.ice_isBatchOneway()||this._proxy.ice_isBatchDatagram()){this._sentSynchronously=true;this._proxy.__getBatchRequestQueue().finishBatchRequest(this._os,this._proxy,this._operation);this.__markFinished(true);return}this.__invokeImpl(true)},__completed:function(e){i.assert(this._proxy.ice_isTwoway());var t;try{if(this._is===null){this._is=new n(this._instance,c.currentProtocolEncoding)}this._is.swap(e);t=this._is.readByte();switch(t){case c.replyOK:case c.replyUserException:{break}case c.replyObjectNotExist:case c.replyFacetNotExist:case c.replyOperationNotExist:{var r=new a;r.__read(this._is);var s=Ice.StringSeqHelper.read(this._is);var o;if(s.length>0){if(s.length>1){throw new Ice.MarshalException}o=s[0]}else{o=""}var u=this._is.readString();var l=null;switch(t){case c.replyObjectNotExist:{l=new Ice.ObjectNotExistException;break}case c.replyFacetNotExist:{l=new Ice.FacetNotExistException;break}case c.replyOperationNotExist:{l=new Ice.OperationNotExistException;break}default:{i.assert(false);break}}l.id=r;l.facet=o;l.operation=u;throw l}case c.replyUnknownException:case c.replyUnknownLocalException:case c.replyUnknownUserException:{var h=this._is.readString();var f=null;switch(t){case c.replyUnknownException:{f=new Ice.UnknownException;break}case c.replyUnknownLocalException:{f=new Ice.UnknownLocalException;break}case c.replyUnknownUserException:{f=new Ice.UnknownUserException;break}default:{i.assert(false);break}}f.unknown=h;throw f}default:{throw new Ice.UnknownReplyStatusException}}this.__markFinished(t==c.replyOK,this._completed)}catch(d){this.__completedEx(d)}},__startWriteParams:function(e){this._os.startWriteEncaps(this._encoding,e);return this._os},__endWriteParams:function(){this._os.endWriteEncaps()},__writeEmptyParams:function(){this._os.writeEmptyEncaps(this._encoding)},__writeParamEncaps:function(e){if(e===null||e.length===0){this._os.writeEmptyEncaps(this._encoding)}else{this._os.writeEncaps(e)}},__is:function(){return this._is},__startReadParams:function(){this._is.startReadEncaps();return this._is},__endReadParams:function(){this._is.endReadEncaps()},__readEmptyParams:function(){this._is.skipEmptyEncaps()},__readParamEncaps:function(){return this._is.readEncaps(null)},__throwUserException:function(){i.assert((this._state&t.Done)!==0);if((this._state&t.OK)===0){try{this._is.startReadEncaps();this._is.throwException()}catch(e){if(e instanceof Ice.UserException){this._is.endReadEncaps()}throw e}}}});h._emptyContext=new r;var f=Ice.Class(l,{__init__:function(e,t){l.call(this,e,t);this._batchRequestNum=e.__getBatchRequestQueue().swap(this._os)},__invokeRemote:function(t,n,i){if(this._batchRequestNum===0){this.__sent();return e.Sent}return t.sendAsyncRequest(this,n,i,this._batchRequestNum)},__invoke:function(){c.checkSupportedProtocol(c.getCompatibleProtocol(this._proxy.__reference().getProtocol()));this.__invokeImpl(true)}});var d=Ice.Class(l,{__init__:function(e,t){l.call(this,e,t)},__invokeRemote:function(t,n,i){this.__markFinished(true,function(e){e.succeed(t)});return e.Sent},__invoke:function(){this.__invokeImpl(true)}});var p=Ice.Class(u,{__init__:function(e,t,n){u.call(this,t,n,e,null,null)},__invoke:function(){try{var t=this._connection.getBatchRequestQueue().swap(this._os);var n;if(t===0){this.__sent();n=e.Sent}else{n=this._connection.sendAsyncRequest(this,false,false,t)}if((n&e.Sent)>0){this._sentSynchronously=true}}catch(i){this.__completedEx(i)}}});Ice.OutgoingAsync=h;Ice.ProxyFlushBatch=f;Ice.ProxyGetConnection=d;Ice.ConnectionFlushBatch=p})();(function(){var e=Ice.ArrayUtil;var t=Ice.AsyncResultBase;var n=Ice.AsyncResult;var i=Ice.Debug;var r=Ice.FormatType;var s=Ice.HashMap;var o=Ice.OutgoingAsync;var c=Ice.ProxyFlushBatch;var a=Ice.ProxyGetConnection;var u=Ice.ReferenceMode;var l=Ice.OperationMode;var h=Ice.Class({__init__:function(){this._reference=null;this._requestHandler=null},hashCode:function(e){return this._reference.hashCode()},ice_getCommunicator:function(){return this._reference.getCommunicator()},toString:function(){return this._reference.toString()},ice_getIdentity:function(){return this._reference.getIdentity().clone()},ice_identity:function(e){if(e===undefined||e===null||e.name.length===0){throw new Ice.IllegalIdentityException}if(e.equals(this._reference.getIdentity())){return this}else{var t=new h;t.__setup(this._reference.changeIdentity(e));return t}},ice_getContext:function(){return new s(this._reference.getContext())},ice_context:function(e){return this.__newInstance(this._reference.changeContext(e))},ice_getFacet:function(){return this._reference.getFacet()},ice_facet:function(e){if(e===undefined||e===null){e=""}if(e===this._reference.getFacet()){return this}else{var t=new h;t.__setup(this._reference.changeFacet(e));return t}},ice_getAdapterId:function(){return this._reference.getAdapterId()},ice_adapterId:function(e){if(e===undefined||e===null){e=""}if(e===this._reference.getAdapterId()){return this}else{return this.__newInstance(this._reference.changeAdapterId(e))}},ice_getEndpoints:function(){return e.clone(this._reference.getEndpoints())},ice_endpoints:function(t){if(t===undefined||t===null){t=[]}if(e.equals(t,this._reference.getEndpoints())){return this}else{return this.__newInstance(this._reference.changeEndpoints(t))}},ice_getLocatorCacheTimeout:function(){return this._reference.getLocatorCacheTimeout()},ice_locatorCacheTimeout:function(e){if(e<-1){throw new Error("invalid value passed to ice_locatorCacheTimeout: "+e)}if(e===this._reference.getLocatorCacheTimeout()){return this}else{return this.__newInstance(this._reference.changeLocatorCacheTimeout(e))}},ice_getInvocationTimeout:function(){return this._reference.getInvocationTimeout()},ice_invocationTimeout:function(e){if(e<1&&e!==-1){throw new Error("invalid value passed to ice_invocationTimeout: "+e)}if(e===this._reference.getInvocationTimeout()){return this}else{return this.__newInstance(this._reference.changeInvocationTimeout(e))}},ice_isConnectionCached:function(){return this._reference.getCacheConnection()},ice_connectionCached:function(e){if(e===this._reference.getCacheConnection()){return this}else{return this.__newInstance(this._reference.changeCacheConnection(e))}},ice_getEndpointSelection:function(){return this._reference.getEndpointSelection()},ice_endpointSelection:function(e){if(e===this._reference.getEndpointSelection()){return this}else{return this.__newInstance(this._reference.changeEndpointSelection(e))}},ice_isSecure:function(){return this._reference.getSecure()},ice_secure:function(e){if(e===this._reference.getSecure()){return this}else{return this.__newInstance(this._reference.changeSecure(e))}},ice_getEncodingVersion:function(){return this._reference.getEncoding().clone()},ice_encodingVersion:function(e){if(e.equals(this._reference.getEncoding())){return this}else{return this.__newInstance(this._reference.changeEncoding(e))}},ice_isPreferSecure:function(){return this._reference.getPreferSecure()},ice_preferSecure:function(e){if(e===this._reference.getPreferSecure()){return this}else{return this.__newInstance(this._reference.changePreferSecure(e))}},ice_getRouter:function(){var e=this._reference.getRouterInfo();return e!==null?e.getRouter():null},ice_router:function(e){var t=this._reference.changeRouter(e);if(t.equals(this._reference)){return this}else{return this.__newInstance(t)}},ice_getLocator:function(){var e=this._reference.getLocatorInfo();return e!==null?e.getLocator():null},ice_locator:function(e){var t=this._reference.changeLocator(e);if(t.equals(this._reference)){return this}else{return this.__newInstance(t)}},ice_isTwoway:function(){return this._reference.getMode()===u.ModeTwoway},ice_twoway:function(){if(this._reference.getMode()===u.ModeTwoway){return this}else{return this.__newInstance(this._reference.changeMode(u.ModeTwoway))}},ice_isOneway:function(){return this._reference.getMode()===u.ModeOneway},ice_oneway:function(){if(this._reference.getMode()===u.ModeOneway){return this}else{return this.__newInstance(this._reference.changeMode(u.ModeOneway))}},ice_isBatchOneway:function(){return this._reference.getMode()===u.ModeBatchOneway},ice_batchOneway:function(){if(this._reference.getMode()===u.ModeBatchOneway){return this}else{return this.__newInstance(this._reference.changeMode(u.ModeBatchOneway))}},ice_isDatagram:function(){return this._reference.getMode()===u.ModeDatagram},ice_datagram:function(){if(this._reference.getMode()===u.ModeDatagram){return this}else{return this.__newInstance(this._reference.changeMode(u.ModeDatagram))}},ice_isBatchDatagram:function(){return this._reference.getMode()===u.ModeBatchDatagram},ice_batchDatagram:function(){if(this._reference.getMode()===u.ModeBatchDatagram){return this}else{return this.__newInstance(this._reference.changeMode(u.ModeBatchDatagram))}},ice_compress:function(e){var t=this._reference.changeCompress(e);if(t.equals(this._reference)){return this}else{return this.__newInstance(t)}},ice_timeout:function(e){if(e<1&&e!==-1){throw new Error("invalid value passed to ice_timeout: "+e)}var t=this._reference.changeTimeout(e);if(t.equals(this._reference)){return this}else{return this.__newInstance(t)}},ice_getConnectionId:function(){return this._reference.getConnectionId()},ice_connectionId:function(e){var t=this._reference.changeConnectionId(e);if(t.equals(this._reference)){return this}else{return this.__newInstance(t)}},ice_getConnection:function(){var e=new a(this,"ice_getConnection");try{e.__invoke()}catch(t){e.__abort(t)}return e},ice_getCachedConnection:function(){return this._requestHandler?this._requestHandler.getConnection():null},ice_flushBatchRequests:function(){var e=new c(this,"ice_flushBatchRequests");try{e.__invoke()}catch(t){e.__abort(t)}return e},equals:function(e){if(this===e){return true}if(e instanceof h){return this._reference.equals(e._reference)}return false},__reference:function(){return this._reference},__copyFrom:function(e){i.assert(this._reference===null);i.assert(this._requestHandler===null);this._reference=e._reference;this._requestHandler=e._requestHandler},__handleException:function(e,t,n,i,r,s){this.__updateRequestHandler(t,null);if(e instanceof Ice.LocalException&&(!i||n==l.Nonmutating||n==l.Idempotent||e instanceof Ice.CloseConnectionException||e instanceof Ice.ObjectNotExistException)){try{return this._reference.getInstance().proxyFactory().checkRetryAfterException(e,this._reference,r,s)}catch(o){if(o instanceof Ice.CommunicatorDestroyedException){throw e}else{throw o}}}else{throw e}},__checkAsyncTwowayOnly:function(e){if(!this.ice_isTwoway()){throw new Error("`"+e+"' can only be called with a twoway proxy")}},__getRequestHandler:function(){if(this._reference.getCacheConnection()){if(this._requestHandler){return this._requestHandler}}return this._reference.getRequestHandler(this)},__getBatchRequestQueue:function(){if(!this._batchRequestQueue){this._batchRequestQueue=this._reference.getBatchRequestQueue()}return this._batchRequestQueue},__setRequestHandler:function(e){if(this._reference.getCacheConnection()){if(!this._requestHandler){this._requestHandler=e}return this._requestHandler}return e},__updateRequestHandler:function(e,t){if(this._reference.getCacheConnection()&&e!==null){if(this._requestHandler&&this._requestHandler!==t){this._requestHandler=this._requestHandler.update(e,t)}}},__setup:function(e){i.assert(this._reference===null);this._reference=e},__newInstance:function(e){var t=new this.constructor;t.__setup(e);return t},ice_instanceof:function(e){if(e){if(this instanceof e){return true}return this.constructor.__instanceof(e)}return false}});h.__invoke=function(e,t,n,i,r,s,c,a,u){if(c!==null||a.length>0){e.__checkAsyncTwowayOnly(t)}var l=new o(e,t,function(e){h.__completed(e,c,a)});try{l.__prepare(t,n,r);if(s===null){l.__writeEmptyParams()}else{var f=l.__startWriteParams(i);s.call(null,f,u);l.__endWriteParams()}l.__invoke()}catch(d){l.__abort(d)}return l};h.__completed=function(e,t,n){if(!h.__check(e,n)){return}try{if(t===null){e.__readEmptyParams();e.succeed(e)}else{var i=t(e);e.succeed.apply(e,i)}}catch(r){h.__dispatchLocalException(e,r);return}};h.__returns_bool=function(e,t){t.push(e.readBool())};h.__returns_byte=function(e,t){t.push(e.readByte())};h.__returns_short=function(e,t){t.push(e.readShort())};h.__returns_int=function(e,t){t.push(e.readInt())};h.__returns_long=function(e,t){t.push(e.readLong())};h.__returns_float=function(e,t){t.push(e.readFloat())};h.__returns_double=function(e,t){t.push(e.readDouble())};h.__returns_string=function(e,t){t.push(e.readString())};h.__returns_ObjectPrx=function(e,t){t.push(e.readProxy())};h.__returns_Object=function(e,t){e.readObject(function(e){t.push(e)},Ice.Object);e.readPendingObjects()};h.__check=function(e,t){try{e.__throwUserException()}catch(n){if(n instanceof Ice.UserException){if(t!==null){for(var i=0;i0){throw new Error("ice_response called with invalid arguments")}else{this.incomingAsync.__writeEmptyParams()}}else{var t=this.incomingAsync.__startWriteParams(this.op.format);var n;if(this.op.returns&&!this.op.returns.tag){n=this.op.returns}c(t,e,n,this.op.outParams,this.op.outParamsOpt,this.op.returnsClasses);this.incomingAsync.__endWriteParams(true)}},__checkException:function(e){for(var t=0;t0&&(t.sendsClasses||t.inParamsOpt.length>0)){for(var d=0;d1&&!(g instanceof Array)){throw new Ice.MarshalException("operation `"+t.servantMethod+"' should return an array of length "+I)}else if(I===1){g=[g]}u.__sendResponse(g);return Ice.DispatchStatus.DispatchOK}}catch(_){if(u.__checkException(_)){u.__sendException(_);return Ice.DispatchStatus.DispatchUserException}else{throw _}}};function l(e,t,n){var i;for(var r=0;i===undefined&&r0){a=function(e,t){var n,i,r;for(n=0;n0){u=function(e){var t=[];var n=e.__startReadParams();var i;if(s.returns&&!s.returns.tag){i=s.returns}o(n,i,s.outParams,s.outParamsOpt,s.returnsClasses,t,0);e.__endReadParams();if(s.returnsClasses||s.outParamsOpt.length>0){var r=0;if(s.returns&&s.returns.isObject&&t[s.returns.pos+r]!==undefined){t[s.returns.pos+r]=t[s.returns.pos+r].value}for(var c=0;c0){e+=" -h ";var t=this._host.indexOf(":")!=-1;if(t){e+='"'}e+=this._host;if(t){e+='"'}}e+=" -p "+this._port;if(this._sourceAddr!==null&&this._sourceAddr.length>0){e+=" --sourceAddr "+this._sourceAddr}return e},compareTo:function(e){if(this===e){return 0}if(e===null){return 1}if(!(e instanceof s)){return this.type()65535){throw new r("port value `"+t+"' out of range in endpoint "+i)}}else if(e==="--sourceAddress"){if(t===null){throw new r("no argument provided for --sourceAddress option in endpoint "+i)}this._sourceAddr=t}else{return false}return true}});Ice.IPEndpointI=s})();(function(){Object.defineProperty(IceSSL,"EndpointType",{value:Ice.SSLEndpointType});IceSSL.EndpointInfo=t.defineLocalObject(function(e,t,n,i,r){Ice.IPEndpointInfo.call(this,e,t,n,i,r)},Ice.IPEndpointInfo);IceSSL.WSSEndpointInfo=t.defineLocalObject(function(e,t,n,i,r,s){IceSSL.EndpointInfo.call(this,e,t,n,i,r);this.resource=s!==undefined?s:""},IceSSL.EndpointInfo)})();(function(){Ice.ConnectionInfo=t.defineLocalObject(function(e,t,n,i,r){this.incoming=e!==undefined?e:false;this.adapterName=t!==undefined?t:"";this.connectionId=n!==undefined?n:"";this.rcvSize=i!==undefined?i:0;this.sndSize=r!==undefined?r:0});Ice.ConnectionCallback=t.defineLocalObject();Ice.ACMClose=t.defineEnum([["CloseOff",0],["CloseOnIdle",1],["CloseOnInvocation",2],["CloseOnInvocationAndIdle",3],["CloseOnIdleForceful",4]]);Ice.ACMHeartbeat=t.defineEnum([["HeartbeatOff",0],["HeartbeatOnInvocation",1],["HeartbeatOnIdle",2],["HeartbeatAlways",3]]);Ice.ACM=t.defineStruct(function(e,t,n){this.timeout=e!==undefined?e:0;this.close=t!==undefined?t:Ice.ACMClose.CloseOff;this.heartbeat=n!==undefined?n:Ice.ACMHeartbeat.HeartbeatOff},true);Ice.Connection=t.defineLocalObject();Ice.IPConnectionInfo=t.defineLocalObject(function(e,t,n,i,r,s,o,c,a){Ice.ConnectionInfo.call(this,e,t,n,i,r);this.localAddress=s!==undefined?s:""; +this.localPort=o!==undefined?o:-1;this.remoteAddress=c!==undefined?c:"";this.remotePort=a!==undefined?a:-1},Ice.ConnectionInfo);Ice.TCPConnectionInfo=t.defineLocalObject(function(e,t,n,i,r,s,o,c,a){Ice.IPConnectionInfo.call(this,e,t,n,i,r,s,o,c,a)},Ice.IPConnectionInfo);Ice.UDPConnectionInfo=t.defineLocalObject(function(e,t,n,i,r,s,o,c,a,u,l){Ice.IPConnectionInfo.call(this,e,t,n,i,r,s,o,c,a);this.mcastAddress=u!==undefined?u:"";this.mcastPort=l!==undefined?l:-1},Ice.IPConnectionInfo);t.defineDictionary(Ice,"HeaderDict","HeaderDictHelper","Ice.StringHelper","Ice.StringHelper",false,undefined,undefined);Ice.WSConnectionInfo=t.defineLocalObject(function(e,t,n,i,r,s,o,c,a,u){Ice.TCPConnectionInfo.call(this,e,t,n,i,r,s,o,c,a);this.headers=u!==undefined?u:null},Ice.TCPConnectionInfo)})();(function(){Ice.TraceLevels=function(e){var t="Network";var n="Protocol";var i="Retry";var r="Locator";var s="Slicing";var o="Ice.Trace.";var c=e.getPropertyAsInt(o+t);var a=e.getPropertyAsInt(o+n);var u=e.getPropertyAsInt(o+i);var l=e.getPropertyAsInt(o+r);var h=e.getPropertyAsInt(o+s);e.getPropertyAsInt(o+"ThreadPool");return Object.create(null,{network:{get:function(){return c}},networkCat:{get:function(){return t}},protocol:{get:function(){return a}},protocolCat:{get:function(){return n}},retry:{get:function(){return u}},retryCat:{get:function(){return i}},location:{get:function(){return l}},locationCat:{get:function(){return r}},slicing:{get:function(){return h}},slicingCat:{get:function(){return s}}})}})();(function(){var e=Ice.Base64;var t=Ice.Debug;var n=Ice.HashUtil;var i=Ice.Protocol;var r=Ice.StringUtil;var s=Ice.EndpointParseException;var o=Ice.Class;var c=o(Ice.EndpointI,{__init__:function(e){this._rawEncoding=Ice.Encoding_1_0;this._type=e===undefined?-1:e;this._rawBytes=null},streamWrite:function(e){e.startWriteEncaps(this._rawEncoding,Ice.FormatType.DefaultFormat);e.writeBlob(this._rawBytes);e.endWriteEncaps()},getInfo:function(){return new a((-1),false,this._rawEncoding,this._rawBytes,this._type)},type:function(){return this._type},protocol:function(){return"opaque"},timeout:function(){return-1},changeTimeout:function(e){return this},changeConnectionId:function(e){return this},compress:function(){return false},changeCompress:function(e){return this},datagram:function(){return false},secure:function(){return false},rawBytes:function(){return this._rawBytes},transceiver:function(e){e.value=null;return null},acceptor:function(e,t){e.value=this;return null},connect:function(){return null},hashCode:function(){if(this._hashCode===undefined){var e=5381;e=n.addNumber(e,this._type);e=n.addHashable(e,this._rawEncoding);e=n.addArray(e,this._rawBytes,n.addNumber);this._hashCode=e}return this._hashCode},options:function(){var t="";t+=" -t "+this._type;t+=" -e "+Ice.encodingVersionToString(this._rawEncoding);t+=" -v "+e.encode(this._rawBytes);return t},equals:function(e){if(!(e instanceof c)){return false}if(this===e){return true}if(this._type!==e._type){return false}if(!this._rawEncoding.equals(e._rawEncoding)){return false}if(this._rawBytes.length!==e._rawBytes.length){return false}for(var t=0;t-1){throw new s("multiple -t options in endpoint "+i)}if(n===null){throw new s("no argument provided for -t option in endpoint "+i)}var o;try{o=r.toInt(n)}catch(c){throw new s("invalid type value `"+n+"' in endpoint "+i)}if(o<0||o>65535){throw new s("type value `"+n+"' out of range in endpoint "+i)}this._type=o;return true}case"v":{if(this._rawBytes){throw new s("multiple -v options in endpoint "+i)}if(n===null||n.length===0){throw new s("no argument provided for -v option in endpoint "+i)}for(var a=0;a1){this.__warning(e)}if(this._response){this._os.resize(o.headerSize+4);if(e instanceof Ice.ObjectNotExistException){this._os.writeByte(o.replyObjectNotExist)}else if(e instanceof Ice.FacetNotExistException){this._os.writeByte(o.replyFacetNotExist)}else if(e instanceof Ice.OperationNotExistException){this._os.writeByte(o.replyOperationNotExist)}else{n.assert(false)}e.id.__write(this._os);if(e.facet===null||e.facet.length===0){Ice.StringSeqHelper.write(this._os,null)}else{Ice.StringSeqHelper.write(this._os,[e.facet])}this._os.writeString(e.operation);this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}}else if(e instanceof Ice.UnknownLocalException){if(i.getPropertyAsIntWithDefault("Ice.Warn.Dispatch",1)>0){this.__warning(e)}if(this._response){this._os.resize(o.headerSize+4);this._os.writeByte(o.replyUnknownLocalException);this._os.writeString(e.unknown);this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}}else if(e instanceof Ice.UnknownUserException){if(i.getPropertyAsIntWithDefault("Ice.Warn.Dispatch",1)>0){this.__warning(e)}if(this._response){this._os.resize(o.headerSize+4);this._os.writeByte(o.replyUnknownUserException);this._os.writeString(e.unknown);this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}}else if(e instanceof Ice.UnknownException){if(i.getPropertyAsIntWithDefault("Ice.Warn.Dispatch",1)>0){this.__warning(e)}if(this._response){this._os.resize(o.headerSize+4);this._os.writeByte(o.replyUnknownException);this._os.writeString(e.unknown);this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}}else if(e instanceof Ice.LocalException){if(i.getPropertyAsIntWithDefault("Ice.Warn.Dispatch",1)>0){this.__warning(e)}if(this._response){this._os.resize(o.headerSize+4);this._os.writeByte(o.replyUnknownLocalException);r=[e.ice_name()];if(e.stack){r.push("\n");r.push(e.stack)}this._os.writeString(r.join(""));this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}}else if(e instanceof Ice.UserException){if(i.getPropertyAsIntWithDefault("Ice.Warn.Dispatch",1)>0){this.__warning(e)}if(this._response){this._os.resize(o.headerSize+4);this._os.writeByte(o.replyUnknownUserException);r=[e.ice_name()];if(e.stack){r.push("\n");r.push(e.stack)}this._os.writeString(r.join(""));this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}}else{if(i.getPropertyAsIntWithDefault("Ice.Warn.Dispatch",1)>0){this.__warning(e)}if(this._response){this._os.resize(o.headerSize+4);this._os.writeByte(o.replyUnknownException);this._os.writeString(e.stack?e.stack:"");this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}if(!t){throw new Ice.ServantError(e)}}this._connection=null},invoke:function(e,t){this._is=t;var s=this._is.pos;this._current.id.__read(this._is);var c=Ice.StringSeqHelper.read(this._is);if(c.length>0){if(c.length>1){throw new Ice.MarshalException}this._current.facet=c[0]}else{this._current.facet=""}this._current.operation=this._is.readString();this._current.mode=Ice.OperationMode.valueOf(this._is.readByte());this._current.ctx=new r;var a=this._is.readSize();while(a-- >0){var u=this._is.readString();var l=this._is.readString();this._current.ctx.set(u,l)}if(e!==null){this._servant=e.findServant(this._current.id,this._current.facet);if(this._servant===null){this._locator=e.findServantLocator(this._current.id.category);if(this._locator===null&&this._current.id.category.length>0){this._locator=e.findServantLocator("")}if(this._locator!==null){try{this._servant=this._locator.locate(this._current,this._cookie)}catch(h){if(h instanceof Ice.UserException){var f=this._is.skipEncaps();if(this._response){this._os.writeByte(o.replyUserException);this._os.startWriteEncaps(f,i.DefaultFormat);this._os.writeUserException(h);this._os.endWriteEncaps();this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}this._connection=null;return}else{this._is.skipEncaps();this.__handleException(h,false);return}}}}}try{if(this._servant!==null){if(this._servant.__dispatch(this,this._current)===Ice.DispatchStatus.DispatchAsync){return}if(this._locator!==null&&!this.__servantLocatorFinished(false)){return}}else{this._is.skipEncaps();if(e!==null&&e.hasServant(this._current.id)){throw new Ice.FacetNotExistException(this._current.id,this._current.facet,this._current.operation)}else{throw new Ice.ObjectNotExistException(this._current.id,this._current.facet,this._current.operation)}}}catch(h){if(this._servant!==null&&this._locator!==null&&!this.__servantLocatorFinished(false)){return}this.__handleException(h,false);return}n.assert(this._connection!==null);if(this._response){this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}this._connection=null},startReadParams:function(){this._current.encoding=this._is.startReadEncaps();return this._is},endReadParams:function(){this._is.endReadEncaps()},readEmptyParams:function(){this._current.encoding=this._is.skipEmptyEncaps()},readParamEncaps:function(){this._current.encoding=new Ice.EncodingVersion;return this._is.readEncaps(this._current.encoding)},__response:function(){try{if(this._locator!==null&&!this.__servantLocatorFinished(true)){return}n.assert(this._connection!==null);if(this._response){this._connection.sendResponse(this._os,this._compress)}else{this._connection.sendNoResponse()}this._connection=null}catch(e){this._connection.invokeException(e,1)}},__exception:function(e){try{if(this._locator!==null&&!this.__servantLocatorFinished(true)){return}this.__handleException(e,true)}catch(t){this._connection.invokeException(t,1)}},__validateResponse:function(e){if(!this._active){return false}this._active=false;return true},ice_exception:function(e){if(!this._active){return}this._active=false;if(this._connection!==null){this.__exception(e)}else{if(this._instance.initializationData().properties.getPropertyAsIntWithDefault("Ice.Warn.Dispatch",1)>0){this.__warning(e)}}}});Ice.IncomingAsync=a})();(function(){var e=Ice.AsyncResult;var t=Ice.AsyncStatus;var n=Ice.BasicStream;var i=Ice.ConnectionRequestHandler;var r=Ice.Debug;var s=Ice.ExUtil;var o=Ice.RetryException;var c=Ice.OutgoingAsync;var a=Ice.Protocol;var u=Ice.ReferenceMode;var l=Ice.LocalException;var h=Ice.Promise;var f=Ice.Class({__init__:function(e,t){this._reference=e;this._response=e.getMode()===u.ModeTwoway;this._proxy=t;this._proxies=[];this._initialized=false;this._connection=null;this._compress=false;this._exception=null;this._requests=[]},connect:function(e){if(!this.initialized()){this._proxies.push(e)}return this._requestHandler?this._requestHandler:this},update:function(e,t){return e===this?t:this},sendAsyncRequest:function(e){if(!this._initialized){e.__cancelable(this)}if(!this.initialized()){this._requests.push(e);return t.Queued}return e.__invokeRemote(this._connection,this._compress,this._response)},asyncRequestCanceled:function(e,t){if(this._exception!==null){return}if(!this.initialized()){for(var n=0;n=5?5:.2;return Math.min(e,25)},setCallbacks:function(e,t,n){this._connectedCallback=e;this._bytesAvailableCallback=t;this._bytesWrittenCallback=n},initialize:function(e,t){try{if(this._exception){throw this._exception}if(this._state===l){this._state=h;this._fd=new WebSocket(this._url,"ice.zeroc.com");this._fd.binaryType="arraybuffer";var i=this;this._fd.onopen=function(e){i.socketConnected(e)};this._fd.onmessage=function(e){i.socketBytesAvailable(e.data)};this._fd.onclose=function(e){i.socketClosed(e)};return s.Connect}else if(this._state===h){this._desc=I(this._addr);this._state=f}}catch(r){if(!this._exception){this._exception=g(this._state,r)}throw this._exception}n.assert(this._state===f);return s.None},register:function(){this._registered=true;if(this._hasBytesAvailable||this._exception){this._bytesAvailableCallback();this._hasBytesAvailable=false}},unregister:function(){this._registered=false},close:function(){if(this._fd===null){n.assert(this._exception);return}if(t&&this._fd.readyState===WebSocket.CONNECTING){this._state=d;return}n.assert(this._fd!==null);try{this._state=p;this._fd.close()}catch(e){throw g(this._state,e)}finally{this._fd=null}},write:function(e){if(this._exception){throw this._exception}else if(e.remaining===0){return true}n.assert(this._fd);var t=this;var i=function(){if(t._fd){if(t._fd.bufferedAmount+s<=t._maxSendPacketSize){t._bytesWrittenCallback(0,0)}else{u.setTimeout(i,t.writeReadyTimeout())}}};var r=e.position;while(true){var s=this._maxSendPacketSize>0&&e.remaining>this._maxSendPacketSize?this._maxSendPacketSize:e.remaining;if(e.remaining===0){break}n.assert(s>0);if(this._fd.bufferedAmount+s>this._maxSendPacketSize){u.setTimeout(i,this.writeReadyTimeout());return false}this._writeReadyTimeout=0;var o=e.b.slice(e.position,e.position+s);this._fd.send(o);e.position=e.position+s}return true},read:function(e,t){if(this._exception){throw this._exception}t.value=false;if(this._readBuffers.length===0){return false}var i=this._readBuffers[0].byteLength-this._readPosition;n.assert(i>0);var r=e.remaining;while(e.remaining>0){if(i>e.remaining){i=e.remaining}new Uint8Array(e.b).set(new Uint8Array(this._readBuffers[0],this._readPosition,i),e.position);e.position+=i;this._readPosition+=i;if(this._readPosition===this._readBuffers[0].byteLength){this._readPosition=0;this._readBuffers.shift();if(this._readBuffers.length===0){break}else{i=this._readBuffers[0].byteLength}}}t.value=this._readBuffers.byteLength>0;return e.remaining===0},type:function(){return this._secure?"wss":"ws"},getInfo:function(){n.assert(this._fd!==null);var t=this._secure?new e.WSSConnectionInfo:new Ice.WSConnectionInfo;t.localAddress="";t.localPort=-1;t.remoteAddress=this._addr.host;t.remotePort=this._addr.port;t.rcvSize=-1;t.sndSize=this._maxSendPacketSize;t.headers={};return t},checkSendSize:function(e){},setBufferSize:function(e,t){this._maxSendPacketSize=t},toString:function(){return this._desc},socketConnected:function(e){if(this._state==d){this.close();return}n.assert(this._connectedCallback!==null);this._connectedCallback()},socketBytesAvailable:function(e){n.assert(this._bytesAvailableCallback!==null);if(e.byteLength>0){this._readBuffers.push(e);if(this._registered){this._bytesAvailableCallback()}else if(!this._hasBytesAvailable){this._hasBytesAvailable=true}}},socketClosed:function(e){if(this._state==d){this.close();return}this._exception=g(this._state,e);if(this._state\nremote address = "+e.host+":"+e.port}function g(e,t){if(e\nremote address = "+n.host+":"+n.port;r._state=l;r._secure=t;r._exception=null;return r};Ice.WSTransceiver=_})();(function(){Ice.Router=t.defineObject(undefined,Ice.Object,undefined,1,["::Ice::Object","::Ice::Router"],-1,undefined,undefined,false);Ice.RouterPrx=t.defineProxy(Ice.ObjectPrx,Ice.Router.ice_staticId,undefined);t.defineOperations(Ice.Router,Ice.RouterPrx,{getClientProxy:[,2,1,,,[9],,,,,],getServerProxy:[,2,1,,,[9],,,,,],addProxies:[,2,2,,,["Ice.ObjectProxySeqHelper"],[["Ice.ObjectProxySeqHelper"]],,,,]});Ice.RouterFinder=t.defineObject(undefined,Ice.Object,undefined,1,["::Ice::Object","::Ice::RouterFinder"],-1,undefined,undefined,false);Ice.RouterFinderPrx=t.defineProxy(Ice.ObjectPrx,Ice.RouterFinder.ice_staticId,undefined);t.defineOperations(Ice.RouterFinder,Ice.RouterFinderPrx,{getRouter:[,,,,,["Ice.RouterPrx"],,,,,]})})();(function(){Ice.AdapterNotFoundException=t.defineUserException(function(e){Ice.UserException.call(this,e)},Ice.UserException,"Ice::AdapterNotFoundException",undefined,undefined,false,false);Ice.InvalidReplicaGroupIdException=t.defineUserException(function(e){Ice.UserException.call(this,e)},Ice.UserException,"Ice::InvalidReplicaGroupIdException",undefined,undefined,false,false);Ice.AdapterAlreadyActiveException=t.defineUserException(function(e){Ice.UserException.call(this,e)},Ice.UserException,"Ice::AdapterAlreadyActiveException",undefined,undefined,false,false);Ice.ObjectNotFoundException=t.defineUserException(function(e){Ice.UserException.call(this,e)},Ice.UserException,"Ice::ObjectNotFoundException",undefined,undefined,false,false);Ice.ServerNotFoundException=t.defineUserException(function(e){Ice.UserException.call(this,e)},Ice.UserException,"Ice::ServerNotFoundException",undefined,undefined,false,false);Ice.Locator=t.defineObject(undefined,Ice.Object,undefined,0,["::Ice::Locator","::Ice::Object"],-1,undefined,undefined,false);Ice.LocatorPrx=t.defineProxy(Ice.ObjectPrx,Ice.Locator.ice_staticId,undefined);t.defineOperations(Ice.Locator,Ice.LocatorPrx,{findObjectById:[,2,1,1,,[9],[[Ice.Identity]],,[Ice.ObjectNotFoundException],,],findAdapterById:[,2,1,1,,[9],[[7]],,[Ice.AdapterNotFoundException],,],getRegistry:[,2,1,,,["Ice.LocatorRegistryPrx"],,,,,]});Ice.LocatorRegistry=t.defineObject(undefined,Ice.Object,undefined,0,["::Ice::LocatorRegistry","::Ice::Object"],-1,undefined,undefined,false);Ice.LocatorRegistryPrx=t.defineProxy(Ice.ObjectPrx,Ice.LocatorRegistry.ice_staticId,undefined);t.defineOperations(Ice.LocatorRegistry,Ice.LocatorRegistryPrx,{setAdapterDirectProxy:[,2,2,1,,,[[7],[9]],,[Ice.AdapterAlreadyActiveException,Ice.AdapterNotFoundException],,],setReplicatedAdapterDirectProxy:[,2,2,1,,,[[7],[7],[9]],,[Ice.AdapterAlreadyActiveException,Ice.AdapterNotFoundException,Ice.InvalidReplicaGroupIdException],,],setServerProcessProxy:[,2,2,1,,,[[7],["Ice.ProcessPrx"]],,[Ice.ServerNotFoundException],,]});Ice.LocatorFinder=t.defineObject(undefined,Ice.Object,undefined,0,["::Ice::LocatorFinder","::Ice::Object"],-1,undefined,undefined,false);Ice.LocatorFinderPrx=t.defineProxy(Ice.ObjectPrx,Ice.LocatorFinder.ice_staticId,undefined);t.defineOperations(Ice.LocatorFinder,Ice.LocatorFinderPrx,{getLocator:[,,,,,["Ice.LocatorPrx"],,,,,]})})();(function(){var e=Ice.Debug;var t=Ice.HashUtil;var n=Ice.StringUtil;var i=typeof Ice.TcpTransceiver!=="undefined"?Ice.TcpTransceiver:null;var r=Ice.Class;var s=r(Ice.IPEndpointI,{__init__:function(e,t,n,i,r,s,o){Ice.IPEndpointI.call(this,e,t,n,i,s);this._timeout=r===undefined?e?e.defaultTimeout():undefined:r;this._compress=o===undefined?false:o},getInfo:function(){var e=this.secure()?new IceSSL.EndpointInfo:new Ice.TCPEndpointInfo;this.fillEndpointInfo(e);return e},timeout:function(){return this._timeout},changeTimeout:function(e){if(e===this._timeout){return this}else{return new s(this._instance,this._host,this._port,this._sourceAddr,e,this._connectionId,this._compress)}},changeConnectionId:function(e){if(e===this._connectionId){return this}else{return new s(this._instance,this._host,this._port,this._sourceAddr,this._timeout,e,this._compress)}},compress:function(){return this._compress},changeCompress:function(e){if(e===this._compress){return this}else{return new s(this._instance,this._host,this._port,this._sourceAddr,this._timeout,this._connectionId,e)}},datagram:function(){return false},connectable:function(){return i!==null&&!this.secure()},connect:function(){e.assert(!this.secure());return i.createOutgoing(this._instance,this.getAddress(),this._sourceAddr)},options:function(){var e=Ice.IPEndpointI.prototype.options.call(this);if(this._timeout==-1){e+=" -t infinite"}else{e+=" -t "+this._timeout}if(this._compress){e+=" -z"}return e},compareTo:function(e){if(this===e){return 0}if(e===null){return 1}if(!(e instanceof s)){return this.type()0;this._warnUdp=t.initializationData().properties.getPropertyAsInt("Ice.Warn.Datagrams")>0;this._acmLastActivity=this._monitor!==null&&this._monitor.getACM().timeout>0?Date.now():-1;this._nextRequestId=1;this._messageSizeMax=u?u.messageSizeMax():t.messageSizeMax();this._batchRequestQueue=new i(t,o.datagram());this._sendStreams=[];this._readStream=new n(t,h.currentProtocolEncoding);this._readHeader=false;this._writeStream=new n(t,h.currentProtocolEncoding);this._readStreamPos=-1;this._writeStreamPos=-1;this._dispatchCount=0;this._state=y;this._shutdownInitiated=false;this._initialized=false;this._validated=false;this._readProtocol=new _;this._readProtocolEncoding=new I;this._asyncRequests=new c;this._exception=null;this._startPromise=null;this._closePromises=[];this._holdPromises=[];this._finishedPromises=[];if(this._adapter!==null){this._servantManager=this._adapter.getServantManager()}else{this._servantManager=null}this._callback=null},start:function(){s.assert(this._startPromise===null); +try{if(this._state>=b){s.assert(this._exception!==null);return(new l).fail(this._exception)}this._startPromise=new l;var e=this;this._transceiver.setCallbacks(function(){e.message(f.Write)},function(){e.message(f.Read)},function(t,n){e.message(f.Write);if(e._instance.traceLevels().network>=3&&t>0){var i=[];i.push("sent ");i.push(t);if(!e._endpoint.datagram()){i.push(" of ");i.push(n)}i.push(" bytes via ");i.push(e._endpoint.protocol());i.push("\n");i.push(this.toString());e._instance.initializationData().logger.trace(e._instance.traceLevels().networkCat,i.join(""))}});this.initialize()}catch(t){if(t instanceof Ice.LocalException){this.exception(t)}return(new l).fail(t)}return this._startPromise},activate:function(){if(this._state<=w){return}if(this._acmLastActivity>0){this._acmLastActivity=Date.now()}this.setState(E)},hold:function(){if(this._state<=w){return}this.setState(x)},destroy:function(e){switch(e){case O.ObjectAdapterDeactivated:{this.setState(S,new Ice.ObjectAdapterDeactivatedException);break}case O.CommunicatorDestroyed:{this.setState(S,new Ice.CommunicatorDestroyedException);break}}},close:function(e){var n=new t(this._communicator,"close",this,null,null);if(e){this.setState(b,new Ice.ForcedCloseConnectionException);n.succeed(n)}else{this._closePromises.push(n);this.checkClose()}return n},checkClose:function(){if(this._asyncRequests.size===0&&this._closePromises.length>0){this.setState(S,new Ice.CloseConnectionException);for(var e=0;ew&&this._state=S);throw this._exception}},waitUntilHolding:function(){var e=new l;this._holdPromises.push(e);this.checkState();return e},waitUntilFinished:function(){var e=new l;this._finishedPromises.push(e);this.checkState();return e},monitor:function(e,t){if(this._state!==E){return}if(t.heartbeat==Ice.ACMHeartbeat.HeartbeatAlways||t.heartbeat!=Ice.ACMHeartbeat.HeartbeatOff&&this._writeStream.isEmpty()&&e>=this._acmLastActivity+t.timeout/4){if(t.heartbeat!=Ice.ACMHeartbeat.HeartbeatOnInvocation||this._dispatchCount>0){this.heartbeat()}}if(this._readStream.size>h.headerSize||!this._writeStream.isEmpty()){return}if(t.close!=Ice.ACMClose.CloseOff&&e>=this._acmLastActivity+t.timeout){if(t.close==Ice.ACMClose.CloseOnIdleForceful||t.close!=Ice.ACMClose.CloseOnIdle&&this._asyncRequests.size>0){this.setState(b,new Ice.ConnectionTimeoutException)}else if(t.close!=Ice.ACMClose.CloseOnInvocation&&this._dispatchCount===0&&this._batchRequestQueue.isEmpty()&&this._asyncRequests.size===0){this.setState(S,new Ice.ConnectionTimeoutException)}}},sendAsyncRequest:function(e,t,n,i){var r=0;var o=e.__os();if(this._exception!==null){throw new u(this._exception)}s.assert(this._state>w);s.assert(this._state0){o.pos=h.headerSize;o.writeInt(i)}var c;try{c=this.sendMessage(k.create(e,e.__os(),t,r))}catch(a){if(a instanceof Ice.LocalException){this.setState(b,a);s.assert(this._exception!==null);throw this._exception}else{throw a}}if(n){this._asyncRequests.set(r,e)}return c},getBatchRequestQueue:function(){return this._batchRequestQueue},flushBatchRequests:function(){var e=new r(this,this._communicator,"flushBatchRequests");e.__invoke();return e},setCallback:function(e){if(this._state>=b){if(e!==null){var t=this;d.setImmediate(function(){try{e.closed(this)}catch(n){t._logger.error("connection callback exception:\n"+n+"\n"+t._desc)}})}}else{this._callback=e}},setACM:function(e,t,n){if(this._monitor===null||this._state>=b){return}if(this._state==E){this._monitor.remove(this)}this._monitor=this._monitor.acm(e,t,n);if(this._state==E){this._monitor.add(this)}if(this._monitor.getACM().timeout<=0){this._acmLastActivity=-1}else if(this._state==E&&this._acmLastActivity==-1){this._acmLastActivity=Date.now()}},getACM:function(){return this._monitor!==null?this._monitor.getACM():new g(0,v.CloseOff,m.HeartbeatOff)},asyncRequestCanceled:function(e,t){for(var n=0;n0){this._asyncRequests.delete(i.requestId)}i.canceled();if(n!==0){this._sendStreams.splice(n,1)}e.__completedEx(t);return}}if(e instanceof Ice.OutgoingAsync){for(var r=this._asyncRequests.entries;r!==null;r=r.next){if(r.value===e){this._asyncRequests.delete(r.key);e.__completedEx(t);return}}}},sendResponse:function(e,t){s.assert(this._state>w);try{if(--this._dispatchCount===0){if(this._state===C){this.reap()}this.checkState()}if(this._state>=b){s.assert(this._exception!==null);throw this._exception}this.sendMessage(k.createForStream(e,t!==0,true));if(this._state===S&&this._dispatchCount===0){this.initiateShutdown()}}catch(n){if(n instanceof Ice.LocalException){this.setState(b,n)}else{throw n}}},sendNoResponse:function(){s.assert(this._state>w);try{if(--this._dispatchCount===0){if(this._state===C){this.reap()}this.checkState()}if(this._state>=b){s.assert(this._exception!==null);throw this._exception}if(this._state===S&&this._dispatchCount===0){this.initiateShutdown()}}catch(e){if(e instanceof Ice.LocalException){this.setState(b,e)}else{throw e}}},endpoint:function(){return this._endpoint},setAdapter:function(e){if(this._state<=w||this._state>=S){return}s.assert(this._state=b){return}this.unscheduleTimeout(e);this._hasMoreData.value=(e&f.Read)!==0;var t=null;try{if((e&f.Write)!==0&&this._writeStream.buffer.remaining>0){if(!this.write(this._writeStream.buffer)){s.assert(!this._writeStream.isEmpty());this.scheduleTimeout(f.Write,this._endpoint.timeout());return}s.assert(this._writeStream.buffer.remaining===0)}if((e&f.Read)!==0&&!this._readStream.isEmpty()){if(this._readHeader){if(!this.read(this._readStream.buffer)){return}s.assert(this._readStream.buffer.remaining===0);this._readHeader=false;var n=this._readStream.pos;if(nthis._messageSizeMax){o.throwMemoryLimitException(l,this._messageSizeMax)}if(l>this._readStream.size){this._readStream.resize(l)}this._readStream.pos=n}if(this._readStream.pos!=this._readStream.size){if(this._endpoint.datagram()){throw new Ice.DatagramLimitException}else{if(!this.read(this._readStream.buffer)){s.assert(!this._readStream.isEmpty());this.scheduleTimeout(f.Read,this._endpoint.timeout());return}s.assert(this._readStream.buffer.remaining===0)}}}if(this._state<=w){if(this._state===y&&!this.initialize()){return}if(this._state<=w&&!this.validate()){return}this._transceiver.unregister();this.setState(x);if(this._startPromise!==null){++this._dispatchCount}}else{s.assert(this._state<=S);if((e&f.Read)!==0){t=this.parseMessage()}if((e&f.Write)!==0){this.sendNextMessage()}}}catch(p){if(p instanceof Ice.DatagramLimitException){if(this._warnUdp){this._logger.warning("maximum datagram size of "+this._readStream.pos+" exceeded")}this._readStream.resize(h.headerSize);this._readStream.pos=0;this._readHeader=true;return}else if(p instanceof Ice.SocketException){this.setState(b,p);return}else if(p instanceof Ice.LocalException){if(this._endpoint.datagram()){if(this._warn){this._logger.warning("datagram connection exception:\n"+p+"\n"+this._desc)}this._readStream.resize(h.headerSize);this._readStream.pos=0;this._readHeader=true}else{this.setState(b,p)}return}else{throw p}}if(this._acmLastActivity>0){this._acmLastActivity=Date.now()}this.dispatch(t);if(this._hasMoreData.value){var _=this;d.setImmediate(function(){_.message(f.Read)})}},dispatch:function(e){var t=0;if(this._startPromise!==null){this._startPromise.succeed();this._startPromise=null;++t}if(e!==null){if(e.outAsync!==null){e.outAsync.__completed(e.stream);++t}if(e.invokeNum>0){this.invokeAll(e.stream,e.invokeNum,e.requestId,e.compress,e.servantManager,e.adapter)}if(e.heartbeatCallback){try{e.heartbeatCallback.heartbeat(this)}catch(n){this._logger.error("connection callback exception:\n"+n+"\n"+this._desc)}e.heartbeatCallback=null;++t}}if(t>0){this._dispatchCount-=t;if(this._dispatchCount===0){if(this._state===S&&!this._shutdownInitiated){try{this.initiateShutdown()}catch(n){if(n instanceof Ice.LocalException){this.setState(b,n)}else{throw n}}}else if(this._state===C){this.reap()}this.checkState()}}},finish:function(){s.assert(this._state===b);this.unscheduleTimeout(f.Read|f.Write|f.Connect);var e;var t=this._instance.traceLevels();if(!this._initialized){if(t.network>=2){e=[];e.push("failed to establish ");e.push(this._endpoint.protocol());e.push(" connection\n");e.push(this.toString());e.push("\n");e.push(this._exception.toString());this._instance.initializationData().logger.trace(t.networkCat,e.join(""))}}else{if(t.network>=1){e=[];e.push("closed ");e.push(this._endpoint.protocol());e.push(" connection\n");e.push(this.toString());if(!(this._exception instanceof Ice.CloseConnectionException||this._exception instanceof Ice.ForcedCloseConnectionException||this._exception instanceof Ice.ConnectionTimeoutException||this._exception instanceof Ice.CommunicatorDestroyedException||this._exception instanceof Ice.ObjectAdapterDeactivatedException)){e.push("\n");e.push(this._exception.toString())}this._instance.initializationData().logger.trace(t.networkCat,e.join(""))}}if(this._startPromise!==null){this._startPromise.fail(this._exception);this._startPromise=null}if(this._sendStreams.length>0){if(!this._writeStream.isEmpty()){var n=this._sendStreams[0];this._writeStream.swap(n.stream)}for(var i=0;i0){this._asyncRequests.delete(r.requestId)}r.completed(this._exception)}this._sendStreams=[]}for(var o=this._asyncRequests.entries;o!==null;o=o.next){o.value.__completedEx(this._exception)}this._asyncRequests.clear();this._readStream.clear();this._readStream.buffer.clear();this._writeStream.clear();this._writeStream.buffer.clear();if(this._callback!==null){try{this._callback.closed(this)}catch(c){this._logger.error("connection callback exception:\n"+c+"\n"+this._desc)}this._callback=null}if(this._dispatchCount===0){this.reap()}this.setState(C)},toString:function(){return this._desc},timedOut:function(e){if(this._state<=w){this.setState(b,new Ice.ConnectTimeoutException)}else if(this._state=b){throw this._exception}var e=this._transceiver.getInfo();e.adapterName=this._adapter!==null?this._adapter.getName():"";e.incoming=this._incoming;return e},setBufferSize:function(e,t){if(this._state>=b){throw this._exception}this._transceiver.setBufferSize(e,t)},exception:function(e){this.setState(b,e)},invokeException:function(e,t){this.setState(b,e);if(t>0){s.assert(this._dispatchCount>0);this._dispatchCount-=t;s.assert(this._dispatchCount>=0);if(this._dispatchCount===0){if(this._state===C){this.reap()}this.checkState()}}},setState:function(e,t){if(t!==undefined){s.assert(t instanceof Ice.LocalException);s.assert(e>=S);if(this._state===e){return}if(this._exception===null){this._exception=t;if(this._warn&&this._validated){if(!(this._exception instanceof Ice.CloseConnectionException||this._exception instanceof Ice.ForcedCloseConnectionException||this._exception instanceof Ice.ConnectionTimeoutException||this._exception instanceof Ice.CommunicatorDestroyedException||this._exception instanceof Ice.ObjectAdapterDeactivatedException||this._exception instanceof Ice.ConnectionLostException&&this._state===S)){this.warning("connection exception",this._exception)}}}}if(this._endpoint.datagram()&&e===S){e=b}if(this._state<=w&&e===S){e=b}if(this._state===e){return}try{switch(e){case y:{s.assert(false);break}case w:{if(this._state!==y){s.assert(this._state===b);return}if(!this._endpoint.datagram()&&!this._incoming){this._transceiver.register()}break}case E:{if(this._state!==x&&this._state!==w){return}this._transceiver.register();break}case x:{if(this._state!==E&&this._state!==w){return}if(this._state===E){this._transceiver.unregister()}break}case S:{if(this._state>=b){return}if(this._state===x){this._transceiver.register()}break}case b:{if(this._state===C){return}this._batchRequestQueue.destroy(this._exception);this._transceiver.unregister();break}case C:{s.assert(this._state===b);this._transceiver.close();this._communicator=null;break}}}catch(t){if(t instanceof Ice.LocalException){var n="unexpected connection exception:\n "+this._desc+"\n"+t.toString();this._instance.initializationData().logger.error(n)}else{throw t}}if(this._monitor!==null){if(e===E){this._monitor.add(this);if(this._acmLastActivity>0){this._acmLastActivity=Date.now()}}else if(this._state===E){this._monitor.remove(this)}}this._state=e;if(this._state===S&&this._dispatchCount===0){try{this.initiateShutdown()}catch(t){if(t instanceof Ice.LocalException){this.setState(b,t)}else{throw t}}}else if(this._state===b){this.finish()}this.checkState()},initiateShutdown:function(){s.assert(this._state===S);s.assert(this._dispatchCount===0);s.assert(!this._shutdownInitiated);if(!this._endpoint.datagram()){var t=new n(this._instance,h.currentProtocolEncoding);t.writeBlob(h.magic);h.currentProtocol.__write(t);h.currentProtocolEncoding.__write(t);t.writeByte(h.closeConnectionMsg);t.writeByte(0);t.writeInt(h.headerSize);var i=this.sendMessage(k.createForStream(t,false,false));if((i&e.Sent)>0){this.scheduleTimeout(f.Write,this.closeTimeout())}}},heartbeat:function(){s.assert(this._state===E);if(!this._endpoint.datagram()){var e=new n(this._instance,h.currentProtocolEncoding);e.writeBlob(h.magic);h.currentProtocol.__write(e);h.currentProtocolEncoding.__write(e);e.writeByte(h.validateConnectionMsg);e.writeByte(0);e.writeInt(h.headerSize);try{this.sendMessage(k.createForStream(e,false,false))}catch(t){this.setState(b,t);s.assert(this._exception!==null)}}},initialize:function(){var e=this._transceiver.initialize(this._readStream.buffer,this._writeStream.buffer);if(e!=f.None){this.scheduleTimeout(e,this.connectTimeout());return false}this._desc=this._transceiver.toString();this._initialized=true;this.setState(w);return true},validate:function(){if(!this._endpoint.datagram()){if(this._adapter!==null){if(this._writeStream.size===0){this._writeStream.writeBlob(h.magic);h.currentProtocol.__write(this._writeStream);h.currentProtocolEncoding.__write(this._writeStream);this._writeStream.writeByte(h.validateConnectionMsg);this._writeStream.writeByte(0);this._writeStream.writeInt(h.headerSize);p.traceSend(this._writeStream,this._logger,this._traceLevels);this._writeStream.prepareWrite()}if(this._writeStream.pos!=this._writeStream.size&&!this.write(this._writeStream.buffer)){this.scheduleTimeout(f.Write,this.connectTimeout());return false}}else{if(this._readStream.size===0){this._readStream.resize(h.headerSize);this._readStream.pos=0}if(this._readStream.pos!==this._readStream.size&&!this.read(this._readStream.buffer)){this.scheduleTimeout(f.Read,this.connectTimeout());return false}s.assert(this._readStream.pos===h.headerSize);this._readStream.pos=0;var e=this._readStream.readBlob(4);if(e[0]!==h.magic[0]||e[1]!==h.magic[1]||e[2]!==h.magic[2]||e[3]!==h.magic[3]){var t=new Ice.BadMagicException;t.badMagic=e;throw t}this._readProtocol.__read(this._readStream);h.checkSupportedProtocol(this._readProtocol);this._readProtocolEncoding.__read(this._readStream);h.checkSupportedProtocolEncoding(this._readProtocolEncoding);var n=this._readStream.readByte();if(n!==h.validateConnectionMsg){throw new Ice.ConnectionNotValidatedException}this._readStream.readByte();var i=this._readStream.readInt();if(i!==h.headerSize){throw new Ice.IllegalMessageSizeException}p.traceRecv(this._readStream,this._logger,this._traceLevels);this._validated=true}}this._writeStream.resize(0);this._writeStream.pos=0;this._readStream.resize(h.headerSize);this._readHeader=true;this._readStream.pos=0;var r=this._instance.traceLevels();if(r.network>=1){var o=[];if(this._endpoint.datagram()){o.push("starting to send ");o.push(this._endpoint.protocol());o.push(" messages\n");o.push(this._transceiver.toDetailedString())}else{o=[];o.push("established ");o.push(this._endpoint.protocol());o.push(" connection\n");o.push(this.toString())}this._instance.initializationData().logger.trace(r.networkCat,o.join(""))}return true},sendNextMessage:function(){if(this._sendStreams.length===0){return}s.assert(!this._writeStream.isEmpty()&&this._writeStream.pos===this._writeStream.size);try{while(true){var e=this._sendStreams.shift();this._writeStream.swap(e.stream);e.sent();if(this._sendStreams.length===0){break}if(this._state>=b){return}e=this._sendStreams[0];s.assert(!e.prepared);var t=e.stream;t.pos=10;t.writeInt(t.size);t.prepareWrite();e.prepared=true;if(e.outAsync!==null){p.trace("sending asynchronous request",t,this._logger,this._traceLevels)}else{p.traceSend(t,this._logger,this._traceLevels)}this._writeStream.swap(e.stream);if(this._writeStream.pos!=this._writeStream.size&&!this.write(this._writeStream.buffer)){s.assert(!this._writeStream.isEmpty());this.scheduleTimeout(f.Write,this._endpoint.timeout());return}}}catch(n){if(n instanceof Ice.LocalException){this.setState(b,n);return}else{throw n}}s.assert(this._writeStream.isEmpty());if(this._state===S){this.scheduleTimeout(f.Write,this.closeTimeout())}},sendMessage:function(t){if(this._sendStreams.length>0){t.doAdopt();this._sendStreams.push(t);return e.Queued}s.assert(this._state0){this._acmLastActivity=Date.now()}return e.Sent}t.doAdopt();this._writeStream.swap(t.stream);this._sendStreams.push(t);this.scheduleTimeout(f.Write,this._endpoint.timeout());return e.Queued},parseMessage:function(){s.assert(this._state>w&&this._state0){var c=!this._endpoint.datagram()&&n!==0;o=new a(this._instance,this,s,c,i,n);o.invoke(r,e);--t;o=null}e.clear()}catch(u){if(u instanceof Ice.LocalException){this.invokeException(u,t)}else if(u instanceof Ice.ServantError){}else{this._logger.error("unexpected exception:\n"+u.toString());this.invokeException(new Ice.UnknownException(u),t)}}},scheduleTimeout:function(e,t){if(t<0){return}var n=this;if((e&f.Read)!==0){this._readTimeoutId=this._timer.schedule(function(){n.timedOut()},t);this._readTimeoutScheduled=true}if((e&(f.Write|f.Connect))!==0){this._writeTimeoutId=this._timer.schedule(function(){n.timedOut()},t);this._writeTimeoutScheduled=true}},unscheduleTimeout:function(e){if((e&f.Read)!==0&&this._readTimeoutScheduled){this._timer.cancel(this._readTimeoutId);this._readTimeoutScheduled=false}if((e&(f.Write|f.Connect))!==0&&this._writeTimeoutScheduled){this._timer.cancel(this._writeTimeoutId);this._writeTimeoutScheduled=false}},connectTimeout:function(){var e=this._instance.defaultsAndOverrides();if(e.overrideConnectTimeout){return e.overrideConnectTimeoutValue}else{return this._endpoint.timeout()}},closeTimeout:function(){var e=this._instance.defaultsAndOverrides();if(e.overrideCloseTimeout){return e.overrideCloseTimeoutValue}else{return this._endpoint.timeout()}},warning:function(e,t){this._logger.warning(e+":\n"+this._desc+"\n"+t.toString())},checkState:function(){if(this._state0){return}var e;if(this._holdPromises.length>0){for(e=0;e0){this._adapter=null;for(e=0;e=3&&e.position!=t){var i=[];i.push("received ");if(this._endpoint.datagram()){i.push(e.limit)}else{i.push(e.position-t);i.push(" of ");i.push(e.limit-t)}i.push(" bytes via ");i.push(this._endpoint.protocol());i.push("\n");i.push(this.toString());this._instance.initializationData().logger.trace(this._instance.traceLevels().networkCat,i.join(""))}return n},write:function(e){var t=e.position;var n=this._transceiver.write(e);if(this._instance.traceLevels().network>=3&&e.position!=t){var i=[];i.push("sent ");i.push(e.position-t);if(!this._endpoint.datagram()){i.push(" of ");i.push(e.limit-t)}i.push(" bytes via ");i.push(this._endpoint.protocol());i.push("\n");i.push(this.toString());this._instance.initializationData().logger.trace(this._instance.traceLevels().networkCat,i.join(""))}return n}});O.ObjectAdapterDeactivated=0;O.CommunicatorDestroyed=1;Ice.ConnectionI=O;var k=M({__init__:function(){this.stream=null;this.outAsync=null;this.compress=false;this.requestId=0;this.prepared=false},canceled:function(){s.assert(this.outAsync!==null);this.outAsync=null},doAdopt:function(){if(this.adopt){var e=new n(this.stream.instance,h.currentProtocolEncoding);e.swap(this.stream);this.stream=e;this.adopt=false}},sent:function(){if(this.outAsync!==null){this.outAsync.__sent()}},completed:function(e){if(this.outAsync!==null){this.outAsync.__completedEx(e)}}});k.createForStream=function(e,t,n){var i=new k;i.stream=e;i.compress=t;i.adopt=n;i.isSent=false;i.requestId=0;i.outAsync=null;return i};k.create=function(e,t,n,i){var r=new k;r.stream=t;r.compress=n;r.outAsync=e;r.requestId=i;r.isSent=false;r.adopt=false;return r}})();(function(){var e=Ice.__M.module("IceSSL");var t=Ice.HashUtil;var n=Ice.StringUtil;var i=Ice.EndpointI;var r=Ice.Class;var s=r(i,{__init__:function(e,t,n){this._instance=e;this._delegate=t;this._resource=n||"/"},getInfo:function(){var t=this._delegate.secure()?new e.WSSEndpointInfo:new Ice.WSEndpointInfo;t.resource=this._resource;this._delegate.fillEndpointInfo(t);return t},type:function(){return this._delegate.type()},protocol:function(){return this._delegate.protocol()},streamWrite:function(e){e.startWriteEncaps();this._delegate.streamWriteImpl(e);e.writeString(this._resource);e.endWriteEncaps()},timeout:function(){return this._delegate.timeout()},changeTimeout:function(e){if(e===this._delegate.timeout()){return this}else{return new s(this._instance,this._delegate.changeTimeout(e),this._resource)}},changeConnectionId:function(e){if(e===this._delegate.connectionId()){return this}else{return new s(this._instance,this._delegate.changeConnectionId(e),this._resource)}},compress:function(){return this._delegate.compress()},changeCompress:function(e){if(e===this._delegate.compress()){return this}else{return new s(this._instance,this._delegate.changeCompress(e),this._resource)}},datagram:function(){return this._delegate.datagram()},secure:function(){return this._delegate.secure()},connect:function(){return Ice.WSTransceiver.createOutgoing(this._instance,this._delegate.secure(),this._delegate.getAddress(),this._resource)},hashCode:function(){if(this._hashCode===undefined){this._hashCode=this._delegate.hashCode();this._hashCode=t.addString(this._hashCode,this._resource)}return this._hashCode},compareTo:function(e){if(this===e){return 0}if(e===null){return 1}if(!(e instanceof s)){return this.type()0){e+=" -r ";e+=this._resource.indexOf(":")!==-1?'"'+this._resource+'"':this._resource}return e},toConnectorString:function(){return this._delegate.toConnectorString()},initWithStream:function(e){this._resource=e.readString()},checkOption:function(e,t,n){if(e==="-r"){if(t===null){throw new Ice.EndpointParseException("no argument provided for -r option in endpoint "+n)}this._resource=t}else{return false}return true}});if(typeof Ice.WSTransceiver!=="undefined"){s.prototype.connectable=function(){return true}}else{s.prototype.connectable=function(){return false}}Ice.WSEndpoint=s})();(function(){var e=Ice.HashMap;var t=Ice.RouterInfo;var n=Ice.RouterPrx;var i=Ice.Class({__init__:function(){this._table=new e(e.compareEquals)},destroy:function(){for(var e=this._table.entries;e!==null;e=e.next){e.value.destroy()}this._table.clear()},find:function(e){if(e===null){return null}var i=n.uncheckedCast(e.ice_router(null));var r=this._table.get(i);if(r===undefined){r=new t(i);this._table.set(i,r)}return r},erase:function(e){var t=null;if(e!==null){var i=n.uncheckedCast(e.ice_router(null));t=this._table.get(i);this._table.delete(i)}return t}});Ice.RouterManager=i})();(function(){var e=Ice.Class;var t=Ice.Debug;var n=e({__init__:function(e,t,n,i){if(e===undefined){this.timeout=60*1e3;this.heartbeat=Ice.ACMHeartbeat.HeartbeatOnInvocation;this.close=Ice.ACMClose.CloseOnInvocationAndIdle;return}var r;if((n=="Ice.ACM.Client"||n=="Ice.ACM.Server")&&e.getProperty(n+".Timeout").length===0){r=n}else{r=n+".Timeout"}this.timeout=e.getPropertyAsIntWithDefault(r,i.timeout/1e3)*1e3;var s=e.getPropertyAsIntWithDefault(n+".Heartbeat",i.heartbeat.value);if(s>=0&&s<=Ice.ACMHeartbeat.maxValue){this.heartbeat=Ice.ACMHeartbeat.valueOf(s)}else{t.warning("invalid value for property `"+n+".Heartbeat"+"', default value will be used instead");this.heartbeat=i.heartbeat}var o=e.getPropertyAsIntWithDefault(n+".Close",i.close.value);if(o>=0&&o<=Ice.ACMClose.maxValue){this.close=Ice.ACMClose.valueOf(o)}else{t.warning("invalid value for property `"+n+".Close"+"', default value will be used instead");this.close=i.close}}});var i=e({add:function(e){t.assert(false)},remove:function(e){t.assert(false)},reap:function(e){t.assert(false)},acm:function(e){t.assert(false);return null},getACM:function(){t.assert(false);return 0}});var r=e(i,{__init__:function(e,t){this._instance=e;this._config=t;this._reapedConnections=[];this._connections=[]},destroy:function(){if(this._instance===null){return}this._instance=null},add:function(e){if(this._config.timeout===0){return}this._connections.push(e);if(this._connections.length==1){var t=this;this._timerToken=this._instance.timer().scheduleRepeated(function(){t.runTimerTask()},this._config.timeout/2)}},remove:function(e){if(this._config.timeout===0){return}var n=this._connections.indexOf(e);t.assert(n>=0);this._connections.splice(n,1);if(this._connections.length===0){this._instance.timer().cancel(this._timerToken);return}},reap:function(e){this._reapedConnections.push(e)},acm:function(e,i,r){t.assert(this._instance!==null);var o=new n;o.timeout=this._config.timeout;o.close=this._config.close;o.heartbeat=this._config.heartbeat;if(e!==undefined){o.timeout=e*1e3}if(i!==undefined){o.close=i}if(r!==undefined){o.heartbeat=r}return new s(this,this._instance.timer(),o)},getACM:function(){return new Ice.ACM(this._config.timeout/1e3,this._config.close,this._config.heartbeat)},swapReapedConnections:function(){if(this._reapedConnections.length===0){return null}var e=this._reapedConnections;this._reapedConnections=[];return e},runTimerTask:function(){if(this._instance===null){this._connections=null;return}var e=Date.now();for(var t=0;t0){var n=this;this._timerToken=this._timer.scheduleRepeated(function(){n.runTimerTask()},this._config.timeout/2)}},remove:function(e){t.assert(this._connection===e);this._connection=null;if(this._config.timeout>0){this._timer.cancel(this._timerToken)}},reap:function(e){this._parent.reap(e)},acm:function(e,t,n){return this._parent.acm(e,t,n)},getACM:function(){return new Ice.ACM(this._config.timeout/1e3,this._config.close,this._config.heartbeat); +},runTimerTask:function(){try{this._connection.monitor(Date.now(),this._config)}catch(e){this._parent.handleException(e)}}});Ice.FactoryACMMonitor=r;Ice.ACMConfig=n})();(function(){var e=Ice.Context;var t=Ice.InitializationException;var n=Ice.Class({__init__:function(){this._context=new e},getContext:function(){return new e(this._context)},setContext:function(t){if(t!==null&&t.size>0){this._context=new e(t)}else{this._context.clear()}},containsKey:function(e){if(e===null){e=""}return this._context.has(e)},get:function(e){if(e===null){e=""}var t=this._context.get(e);if(t===null){t=""}return t},put:function(e,t){if(e===null){e=""}if(t===null){t=""}var n=this._context.get(e);if(n===null){n=""}this._context.set(e,t);return n},remove:function(e){if(e===null){e=""}var t=this._context.get(e);this._context.delete(e);if(t===null){t=""}return t},write:function(t,n){if(t.size===0){Ice.ContextHelper.write(n,this._context)}else{var i=null;if(this._context.size===0){i=t}else{i=new e(this._context);i.merge(t)}Ice.ContextHelper.write(n,i)}}});n.create=function(e){if(e.length===0||e==="None"){return null}else if(e==="Shared"){return new n}else{throw new t("'"+e+"' is not a valid value for Ice.ImplicitContext")}};Ice.ImplicitContextI=n})();(function(){var e=Ice.ArrayUtil;var t=Ice.Debug;var n=Ice.BatchRequestQueue;var i=Ice.HashMap;var r=Ice.HashUtil;var s=Ice.OpaqueEndpointI;var o=Ice.Promise;var c=Ice.Protocol;var a=Ice.ReferenceMode;var u=Ice.StringUtil;var l=Ice.StringSeqHelper;var h=Ice.EndpointSelectionType;var f=Ice.Identity;var d=Ice.RouterPrx;var p=Ice.LocatorPrx;var _=Ice.PropertyNames;var I=Ice.ConnectionRequestHandler;var g=Ice.Class;var v=["EndpointSelection","ConnectionCached","PreferSecure","EncodingVersion","LocatorCacheTimeout","InvocationTimeout","Locator","Router","CollocationOptimized"];var m=g({__init__:function(e,t){this._instance=e;this._communicator=t;this._defaultRouter=null;this._defaultLocator=null},create:function(e,t,n,i){if(e.name.length===0&&e.category.length===0){return null}return this.createImpl(e,t,n.getMode(),n.getSecure(),n.getProtocol(),n.getEncoding(),i,null,null)},createWithAdapterId:function(e,t,n,i){if(e.name.length===0&&e.category.length===0){return null}return this.createImpl(e,t,n.getMode(),n.getSecure(),n.getProtocol(),n.getEncoding(),null,i,null)},createFixed:function(e,t){if(e.name.length===0&&e.category.length===0){return null}var n=new w(this._instance,this._communicator,e,"",t.endpoint().datagram()?a.ModeDatagram:a.ModeTwoway,t.endpoint().secure(),this._instance.defaultsAndOverrides().defaultEncoding,t);return n},copy:function(e){var t=e.getIdentity();if(t.name.length===0&&t.category.length===0){return null}return e.clone()},createFromString:function(e,n){if(e===undefined||e===null||e.length===0){return null}var i=" \t\n\r";var r;var s=0;r=u.findFirstNotOf(e,i,s);if(r==-1){throw new Ice.ProxyParseException("no non-whitespace characters found in `"+e+"'")}var o=null;s=u.checkQuote(e,r);if(s===-1){throw new Ice.ProxyParseException("mismatched quotes around identity in `"+e+"'")}else if(s===0){s=u.findFirstOf(e,i+":@",r);if(s===-1){s=e.length}o=e.substring(r,s)}else{r++;o=e.substring(r,s);s++}if(r===s){throw new Ice.ProxyParseException("no identity in `"+e+"'")}var c=this._instance.stringToIdentity(o);if(c.name.length===0){if(c.category.length>0){throw new Ice.IllegalIdentityException(c)}else if(u.findFirstNotOf(e,i,s)!=-1){throw new Ice.ProxyParseException("invalid characters after identity in `"+e+"'")}else{return null}}var l="";var h=a.ModeTwoway;var f=false;var d=this._instance.defaultsAndOverrides().defaultEncoding;var p=Ice.Protocol_1_0;var _="";while(true){r=u.findFirstNotOf(e,i,s);if(r===-1){break}if(e.charAt(r)==":"||e.charAt(r)=="@"){break}s=u.findFirstOf(e,i+":@",r);if(s==-1){s=e.length}if(r==s){break}var I=e.substring(r,s);if(I.length!=2||I.charAt(0)!="-"){throw new Ice.ProxyParseException("expected a proxy option but found `"+I+"' in `"+e+"'")}var g=null;var v=u.findFirstNotOf(e,i,s);if(v!=-1){var m=e.charAt(v);if(m!="@"&&m!=":"&&m!="-"){r=v;s=u.checkQuote(e,r);if(s==-1){throw new Ice.ProxyParseException("mismatched quotes around value for "+I+" option in `"+e+"'")}else if(s===0){s=u.findFirstOf(e,i+":@",r);if(s===-1){s=e.length}g=e.substring(r,s)}else{r++;g=e.substring(r,s);s++}}}switch(I.charAt(1)){case"f":{if(g===null){throw new Ice.ProxyParseException("no argument provided for -f option in `"+e+"'")}try{l=u.unescapeString(g,0,g.length)}catch(y){throw new Ice.ProxyParseException("invalid facet in `"+e+"': "+y.message)}break}case"t":{if(g!==null){throw new Ice.ProxyParseException("unexpected argument `"+g+"' provided for -t option in `"+e+"'")}h=a.ModeTwoway;break}case"o":{if(g!==null){throw new Ice.ProxyParseException("unexpected argument `"+g+"' provided for -o option in `"+e+"'")}h=a.ModeOneway;break}case"O":{if(g!==null){throw new Ice.ProxyParseException("unexpected argument `"+g+"' provided for -O option in `"+e+"'")}h=a.ModeBatchOneway;break}case"d":{if(g!==null){throw new Ice.ProxyParseException("unexpected argument `"+g+"' provided for -d option in `"+e+"'")}h=a.ModeDatagram;break}case"D":{if(g!==null){throw new Ice.ProxyParseException("unexpected argument `"+g+"' provided for -D option in `"+e+"'")}h=a.ModeBatchDatagram;break}case"s":{if(g!==null){throw new Ice.ProxyParseException("unexpected argument `"+g+"' provided for -s option in `"+e+"'")}f=true;break}case"e":{if(g===null){throw new Ice.ProxyParseException("no argument provided for -e option in `"+e+"'")}try{d=Ice.stringToEncodingVersion(g)}catch(w){throw new Ice.ProxyParseException("invalid encoding version `"+g+"' in `"+e+"':\n"+w.str)}break}case"p":{if(g===null){throw new Ice.ProxyParseException("no argument provided for -p option in `"+e+"'")}try{p=Ice.stringToProtocolVersion(g)}catch(w){throw new Ice.ProxyParseException("invalid protocol version `"+g+"' in `"+e+"':\n"+w.str)}break}default:{throw new Ice.ProxyParseException("unknown option `"+I+"' in `"+e+"'")}}}if(r===-1){return this.createImpl(c,l,h,f,p,d,null,null,n)}var E=[];if(e.charAt(r)==":"){var x=[];s=r;while(s0);throw new Ice.EndpointParseException("invalid endpoint `"+x[0]+"' in `"+e+"'")}else if(x.length!==0&&this._instance.initializationData().properties.getPropertyAsIntWithDefault("Ice.Warn.Endpoints",1)>0){var M=[];M.push("Proxy contains unknown endpoints:");for(var O=0;O0){if(n.length>1){throw new Ice.ProxyUnmarshalException}i=n[0]}else{i=""}var r=t.readByte();if(r<0||r>a.ModeLast){throw new Ice.ProxyUnmarshalException}var s=t.readBool();var o=null;var c=null;if(!t.getReadEncoding().equals(Ice.Encoding_1_0)){o=new Ice.ProtocolVersion;o.__read(t);c=new Ice.EncodingVersion;c.__read(t)}else{o=Ice.Protocol_1_0;c=Ice.Encoding_1_0}var u=null;var h=null;var f=t.readSize();if(f>0){u=[];for(var d=0;d0){var c=[];c.push("found unknown properties for proxy '");c.push(e);c.push("':");for(n=0,i=t.length;n0){var y=this._instance.initializationData().properties;if(y.getPropertyAsIntWithDefault("Ice.Warn.UnknownProperties",1)>0){this.checkForUnknownProperties(a)}var w;w=a+".Locator";var x=p.uncheckedCast(this._communicator.propertyToProxy(w));if(x!==null){if(!x.__reference().getEncoding().equals(s)){l=this._instance.locatorManager().find(x.ice_encodingVersion(s))}else{l=this._instance.locatorManager().find(x)}}w=a+".Router";var S=d.uncheckedCast(this._communicator.propertyToProxy(w));if(S!==null){var b=".Router";if(a.lastIndexOf(b)==a.length-b.length){var C="`"+w+"="+y.getProperty(w)+"': cannot set a router on a router; setting ignored";this._instance.initializationData().logger.warning(C)}else{f=this._instance.routerManager().find(S)}}w=a+".ConnectionCached";_=y.getPropertyAsIntWithDefault(w,_?1:0)>0;w=a+".PreferSecure";I=y.getPropertyAsIntWithDefault(w,I?1:0)>0;w=a+".EndpointSelection";if(y.getProperty(w).length>0){var P=y.getProperty(w);if(P=="Random"){g=h.Random}else if(P=="Ordered"){g=h.Ordered}else{throw new Ice.EndpointSelectionTypeParseException("illegal value `"+P+"'; expected `Random' or `Ordered'")}}w=a+".LocatorCacheTimeout";var M=y.getProperty(w);if(M.length!==0){v=y.getPropertyAsIntWithDefault(w,v);if(v<-1){v=-1;this._instance.initializationData().logger.warning("invalid value for"+w+"`"+y.getProperty(w)+"': defaulting to -1")}}w=a+".InvocationTimeout";M=y.getProperty(w);if(M.length!==0){m=y.getPropertyAsIntWithDefault(w,m);if(m<1&&m!==-1){m=-1;this._instance.initializationData().logger.warning("invalid value for"+w+"`"+y.getProperty(w)+"': defaulting to -1")}}}return new E(this._instance,this._communicator,e,t,n,i,r,s,o,c,l,f,_,I,g,v,m)}});Ice.ReferenceFactory=m;var y=g({__init__:function(e,n,i,r,s,o,c,a,u){t.assert(i===undefined||i.name!==null);t.assert(i===undefined||i.category!==null);t.assert(r===undefined||r!==null);this._instance=e;this._communicator=n;this._mode=s;this._secure=o;this._identity=i;this._context=y._emptyContext;this._facet=r;this._protocol=c;this._encoding=a;this._invocationTimeout=u;this._hashInitialized=false;this._overrideCompress=false;this._compress=false},getMode:function(){return this._mode},getSecure:function(){return this._secure},getProtocol:function(){return this._protocol},getEncoding:function(){return this._encoding},getIdentity:function(){return this._identity},getFacet:function(){return this._facet},getInstance:function(){return this._instance},getContext:function(){return this._context},getInvocationTimeout:function(){return this._invocationTimeout},getCommunicator:function(){return this._communicator},getEndpoints:function(){t.assert(false);return null},getAdapterId:function(){t.assert(false);return""},getRouterInfo:function(){t.assert(false);return null},getLocatorInfo:function(){t.assert(false);return null},getCacheConnection:function(){t.assert(false);return false},getPreferSecure:function(){t.assert(false);return false},getEndpointSelection:function(){t.assert(false);return null},getLocatorCacheTimeout:function(){t.assert(false);return 0},getConnectionId:function(){t.assert(false);return""},changeContext:function(e){if(e===undefined||e===null){e=y._emptyContext}var t=this._instance.referenceFactory().copy(this);if(e.size===0){t._context=y._emptyContext}else{t._context=new i(e)}return t},changeMode:function(e){if(e===this._mode){return this}var t=this._instance.referenceFactory().copy(this);t._mode=e;return t},changeSecure:function(e){if(e===this._secure){return this}var t=this._instance.referenceFactory().copy(this);t._secure=e;return t},changeIdentity:function(e){if(e.equals(this._identity)){return this}var t=this._instance.referenceFactory().copy(this);t._identity=new f(e.name,e.category);return t},changeFacet:function(e){if(e===this._facet){return this}var t=this._instance.referenceFactory().copy(this);t._facet=e;return t},changeInvocationTimeout:function(e){if(e===this._invocationTimeout){return this}var t=this._instance.referenceFactory().copy(this);t._invocationTimeout=e;return t},changeEncoding:function(e){if(e.equals(this._encoding)){return this}var t=this._instance.referenceFactory().copy(this);t._encoding=e;return t},changeCompress:function(e){if(this._overrideCompress&&this._compress===e){return this}var t=this._instance.referenceFactory().copy(this);t._compress=e;t._overrideCompress=true;return t},changeAdapterId:function(e){t.assert(false);return null},changeEndpoints:function(e){t.assert(false);return null},changeLocator:function(e){t.assert(false);return null},changeRouter:function(e){t.assert(false);return null},changeCacheConnection:function(e){t.assert(false);return null},changePreferSecure:function(e){t.assert(false);return null},changeEndpointSelection:function(e){t.assert(false);return null},changeLocatorCacheTimeout:function(e){t.assert(false);return null},changeTimeout:function(e){t.assert(false);return null},changeConnectionId:function(e){t.assert(false);return null},hashCode:function(){if(this._hashInitialized){return this._hashValue}var e=5381;e=r.addNumber(e,this._mode);e=r.addBoolean(e,this._secure);e=r.addHashable(e,this._identity);if(this._context!==null&&this._context!==undefined){for(var t=this._context.entries;t!==null;t=t.next){e=r.addString(e,t.key);e=r.addString(e,t.value)}}e=r.addString(e,this._facet);e=r.addBoolean(e,this._overrideCompress);if(this._overrideCompress){e=r.addBoolean(e,this._compress)}e=r.addHashable(e,this._protocol);e=r.addHashable(e,this._encoding);e=r.addNumber(e,this._invocationTimeout);this._hashValue=e;this._hashInitialized=true;return this._hashValue},isIndirect:function(){t.assert(false);return false},isWellKnown:function(){t.assert(false);return false},streamWrite:function(e){if(this._facet.length===0){e.writeSize(0)}else{e.writeSize(1);e.writeString(this._facet)}e.writeByte(this._mode);e.writeBool(this._secure);if(!e.getWriteEncoding().equals(Ice.Encoding_1_0)){this._protocol.__write(e);this._encoding.__write(e)}},toString:function(){var e=[];var t=this._instance.identityToString(this._identity);if(t.search(/[ :@]/)!=-1){e.push('"');e.push(t);e.push('"')}else{e.push(t)}if(this._facet.length>0){e.push(" -f ");var n=u.escapeString(this._facet,"");if(n.search(/[ :@]/)!=-1){e.push('"');e.push(n);e.push('"')}else{e.push(n)}}switch(this._mode){case a.ModeTwoway:{e.push(" -t");break}case a.ModeOneway:{e.push(" -o");break}case a.ModeBatchOneway:{e.push(" -O");break}case a.ModeDatagram:{e.push(" -d");break}case a.ModeBatchDatagram:{e.push(" -D");break}}if(this._secure){e.push(" -s")}if(!this._protocol.equals(Ice.Protocol_1_0)){e.push(" -p ");e.push(Ice.protocolVersionToString(this._protocol))}e.push(" -e ");e.push(Ice.encodingVersionToString(this._encoding));return e.join("")},toProperty:function(e){t.assert(false);return null},getRequestHandler:function(e){t.assert(false)},getBatchRequestQueue:function(){t.assert(false)},equals:function(e){if(this._mode!==e._mode){return false}if(this._secure!==e._secure){return false}if(!this._identity.equals(e._identity)){return false}if(!this._context.equals(e._context)){return false}if(this._facet!==e._facet){return false}if(this._overrideCompress!==e._overrideCompress){return false}if(this._overrideCompress&&this._compress!==e._compress){return false}if(!this._protocol.equals(e._protocol)){return false}if(!this._encoding.equals(e._encoding)){return false}if(this._invocationTimeout!==e._invocationTimeout){return false}return true},clone:function(){t.assert(false);return null},copyMembers:function(e){e._context=this._context;e._overrideCompress=this._overrideCompress;e._compress=this._compress}});y._emptyContext=new i;y._emptyEndpoints=[];Ice.Reference=y;var w=g(y,{__init__:function(e,t,n,i,r,s,o,c){y.call(this,e,t,n,i,r,s,Ice.Protocol_1_0,o);this._fixedConnection=c},getEndpoints:function(){return y._emptyEndpoints},getAdapterId:function(){return""},getRouterInfo:function(){return null},getLocatorInfo:function(){return null},getCacheConnection:function(){return true},getPreferSecure:function(){return false},getEndpointSelection:function(){return h.Random},getLocatorCacheTimeout:function(){return 0},getConnectionId:function(){return""},changeAdapterId:function(e){throw new Ice.FixedProxyException},changeEndpoints:function(e){throw new Ice.FixedProxyException},changeLocator:function(e){throw new Ice.FixedProxyException},changeRouter:function(e){throw new Ice.FixedProxyException},changeCacheConnection:function(e){throw new Ice.FixedProxyException},changePreferSecure:function(e){throw new Ice.FixedProxyException},changeEndpointSelection:function(e){throw new Ice.FixedProxyException},changeLocatorCacheTimeout:function(e){throw new Ice.FixedProxyException},changeTimeout:function(e){throw new Ice.FixedProxyException},changeConnectionId:function(e){throw new Ice.FixedProxyException},isIndirect:function(){return false},isWellKnown:function(){return false},streamWrite:function(e){throw new Ice.FixedProxyException},toString:function(){throw new Ice.FixedProxyException},toProperty:function(e){throw new Ice.FixedProxyException},clone:function(){var e=new w(this.getInstance(),this.getCommunicator(),this.getIdentity(),this.getFacet(),this.getMode(),this.getSecure(),this.getEncoding(),this._fixedConnection);this.copyMembers(e);return e},getRequestHandler:function(e){switch(this.getMode()){case a.ModeTwoway:case a.ModeOneway:case a.ModeBatchOneway:{if(this._fixedConnection.endpoint().datagram()){throw new Ice.NoEndpointException("")}break}case a.ModeDatagram:case a.ModeBatchDatagram:{if(!this._fixedConnection.endpoint().datagram()){throw new Ice.NoEndpointException("")}break}}var t;var n=this.getInstance().defaultsAndOverrides();if(n.overrideSecure){t=n.overrideSecureValue}else{t=this.getSecure()}if(t&&!this._fixedConnection.endpoint().secure()){throw new Ice.NoEndpointException("")}this._fixedConnection.throwException();var i;if(n.overrideCompress){i=n.overrideCompressValue}else if(this._overrideCompress){i=this._compress}else{i=this._fixedConnection.endpoint().compress()}return e.__setRequestHandler(new I(this,this._fixedConnection,i))},getBatchRequestQueue:function(){return this._fixedConnection.getBatchRequestQueue()},equals:function(e){if(this===e){return true}if(!(e instanceof w)){return false}if(!y.prototype.equals.call(this,e)){return false}return this._fixedConnection.equals(e._fixedConnection)}});Ice.FixedReference=w;var E=g(y,{__init__:function(e,n,i,r,s,o,c,a,u,l,h,f,d,p,_,I,g){y.call(this,e,n,i,r,s,o,c,a,g);this._endpoints=u;this._adapterId=l;this._locatorInfo=h;this._routerInfo=f;this._cacheConnection=d;this._preferSecure=p;this._endpointSelection=_;this._locatorCacheTimeout=I;this._overrideTimeout=false;this._timeout=-1;if(this._endpoints===null){this._endpoints=y._emptyEndpoints}if(this._adapterId===null){this._adapterId=""}this._connectionId="";t.assert(this._adapterId.length===0||this._endpoints.length===0)},getEndpoints:function(){return this._endpoints},getAdapterId:function(){return this._adapterId},getRouterInfo:function(){return this._routerInfo},getLocatorInfo:function(){return this._locatorInfo},getCacheConnection:function(){return this._cacheConnection},getPreferSecure:function(){return this._preferSecure},getEndpointSelection:function(){return this._endpointSelection},getLocatorCacheTimeout:function(){return this._locatorCacheTimeout},getConnectionId:function(){return this._connectionId},changeEncoding:function(e){var t=y.prototype.changeEncoding.call(this,e);if(t!==this){var n=t._locatorInfo;if(n!==null&&!n.getLocator().ice_getEncodingVersion().equals(e)){t._locatorInfo=this.getInstance().locatorManager().find(n.getLocator().ice_encodingVersion(e))}}return t},changeCompress:function(e){var t=y.prototype.changeCompress.call(this,e);if(t!==this&&this._endpoints.length>0){var n=[];for(var i=0;i0){var n=[];for(var i=0;i0){var n=[];for(var i=0;i0){t.assert(this._adapterId.length===0);for(var n=0;n0){for(var t=0;t0){e.push(":");e.push(n)}}}else if(this._adapterId.length>0){e.push(" @ ");var i=u.escapeString(this._adapterId,null);if(i.search(/[ :@]/)!=-1){e.push('"');e.push(i);e.push('"')}else{e.push(i)}}return e.join("")},toProperty:function(e){var t=new i,n;t.set(e,this.toString());t.set(e+".CollocationOptimized","0");t.set(e+".ConnectionCached",this._cacheConnection?"1":"0");t.set(e+".PreferSecure",this._preferSecure?"1":"0");t.set(e+".EndpointSelection",this._endpointSelection===h.Random?"Random":"Ordered");t.set(e+".LocatorCacheTimeout",""+this._locatorCacheTimeout);t.set(e+".InvocationTimeout",""+this.getInvocationTimeout());if(this._routerInfo!==null){var r=this._routerInfo.getRouter();var s=r.__reference().toProperty(e+".Router");for(n=s.entries;n!==null;n=n.next){t.set(n.key,n.value)}}if(this._locatorInfo!==null){var o=this._locatorInfo.getLocator();var c=o.__reference().toProperty(e+".Locator");for(n=c.entries;n!==null;n=n.next){t.set(n.key,n.value)}}return t},hashCode:function(){if(!this._hashInitialized){y.prototype.hashCode.call(this);this._hashValue=r.addString(this._hashValue,this._adapterId)}return this._hashValue},equals:function(t){if(this===t){return true}if(!(t instanceof E)){return false}if(!y.prototype.equals.call(this,t)){return false}if(this._locatorInfo===null?t._locatorInfo!==null:!this._locatorInfo.equals(t._locatorInfo)){return false}if(this._routerInfo===null?t._routerInfo!==null:!this._routerInfo.equals(t._routerInfo)){return false}if(this._cacheConnection!==t._cacheConnection){return false}if(this._preferSecure!==t._preferSecure){return false}if(this._endpointSelection!==t._endpointSelection){return false}if(this._locatorCacheTimeout!==t._locatorCacheTimeout){return false}if(this._connectionId!==t._connectionId){return false}if(this._overrideTimeout!==t._overrideTimeout){return false}if(this._overrideTimeout&&this._timeout!==t._timeout){return false}if(!e.equals(this._endpoints,t._endpoints,function(e,t){return e.equals(t)})){return false}if(this._adapterId!==t._adapterId){return false}return true},getRequestHandler:function(e){return this._instance.requestHandlerFactory().getRequestHandler(this,e)},getBatchRequestQueue:function(){return new n(this._instance,this._mode===a.ModeBatchDatagram)},getConnection:function(){var e=new o;if(this._routerInfo!==null){var t=this;this._routerInfo.getClientEndpoints().then(function(n){if(n.length>0){t.applyOverrides(n);t.createConnection(n).then(function(t,n){e.succeed(t,n)},function(t){e.fail(t)})}else{t.getConnectionNoRouterInfo(e)}}).exception(function(t){e.fail(t)})}else{this.getConnectionNoRouterInfo(e)}return e},getConnectionNoRouterInfo:function(e){if(this._endpoints.length>0){this.createConnection(this._endpoints).then(function(t,n){e.succeed(t,n)}).exception(function(t){e.fail(t)});return}var n=this;if(this._locatorInfo!==null){this._locatorInfo.getEndpoints(this,null,this._locatorCacheTimeout).then(function(i,r){if(i.length===0){e.fail(new Ice.NoEndpointException(n.toString()));return}n.applyOverrides(i);n.createConnection(i).then(function(t,n){e.succeed(t,n)},function(i){if(i instanceof Ice.NoEndpointException){e.fail(i)}else{t.assert(n._locatorInfo!==null);n.getLocatorInfo().clearCache(n);if(r){var s=n.getInstance().traceLevels();if(s.retry>=2){var o="connection to cached endpoints failed\n"+"removing endpoints from cache and trying one more time\n"+i.toString();n.getInstance().initializationData().logger.trace(s.retryCat,o)}n.getConnectionNoRouterInfo(e);return}e.fail(i)}})}).exception(function(t){e.fail(t)})}else{e.fail(new Ice.NoEndpointException(this.toString()))}},clone:function(){var e=new E(this.getInstance(),this.getCommunicator(),this.getIdentity(),this.getFacet(),this.getMode(),this.getSecure(),this.getProtocol(),this.getEncoding(),this._endpoints,this._adapterId,this._locatorInfo,this._routerInfo,this._cacheConnection,this._preferSecure,this._endpointSelection,this._locatorCacheTimeout,this._invocationTimeout);this.copyMembers(e);return e},copyMembers:function(e){y.prototype.copyMembers.call(this,e);e._overrideTimeout=this._overrideTimeout;e._timeout=this._timeout;e._connectionId=this._connectionId},applyOverrides:function(e){for(var t=0;t0){throw new n("unrecognized argument `"+a[0]+"' in endpoint `"+e+"'")}return f}}if(u==="opaque"){var d=new i;d.initWithOptions(a);if(a.length>0){throw new n("unrecognized argument `"+a[0]+"' in endpoint `"+e+"'")}for(l=0,h=this._factories.length;l0){this._retryIntervals=[];for(var n=0;n0?r:0}}else{this._retryIntervals=[0]}},stringToProxy:function(e){var t=this._instance.referenceFactory().createFromString(e,null);return this.referenceToProxy(t)},proxyToString:function(e){if(e!==null){return e.__reference().toString()}else{return""}},propertyToProxy:function(e){var t=this._instance.initializationData().properties.getProperty(e);var n=this._instance.referenceFactory().createFromString(t,e);return this.referenceToProxy(n)},proxyToProperty:function(e,n){if(e!==null){return e.__reference().toProperty(n)}else{return new t}},streamToProxy:function(e,t){var n=new r;n.__read(e);var i=this._instance.referenceFactory().createFromStream(n,e);return this.referenceToProxy(i,t)},referenceToProxy:function(e,t){if(e!==null){var i=t?new t:new n;i.__setup(e);return i}else{return null}},proxyToStream:function(e,t){if(e!==null){var n=e.__reference();n.getIdentity().__write(t);n.streamWrite(t)}else{var i=new r("","");i.__write(t)}},checkRetryAfterException:function(t,n,i,r){var s=this._instance.traceLevels();var o=this._instance.initializationData().logger;if(n.getMode()===Ice.Reference.ModeBatchOneway||n.getMode()===Ice.Reference.ModeBatchDatagram){throw t}if(t instanceof Ice.ObjectNotExistException){var c=t;if(n.getRouterInfo()!==null&&c.operation==="ice_add_proxy"){n.getRouterInfo().clearCache(n);if(s.retry>=1){o.trace(s.retryCat,"retrying operation call to add proxy to router\n"+t.toString())}if(i!==null){i.value=0}return r}else if(n.isIndirect()){if(n.isWellKnown()){var a=n.getLocatorInfo();if(a!==null){a.clearCache(n)}}}else{throw t}}else if(t instanceof Ice.RequestFailedException){throw t}if(t instanceof Ice.MarshalException){throw t}if(t instanceof Ice.CommunicatorDestroyedException||t instanceof Ice.ObjectAdapterDeactivatedException){throw t}if(t instanceof Ice.InvocationTimeoutException||t instanceof Ice.InvocationCanceledException){throw t}++r;e.assert(r>0);var u;if(r===this._retryIntervals.length+1&&t instanceof Ice.CloseConnectionException){u=0}else if(r>this._retryIntervals.length){if(s.retry>=1){o.trace(s.retryCat,"cannot retry operation call because retry limit has been exceeded\n"+t.toString())}throw t}else{u=this._retryIntervals[r-1]}if(s.retry>=1){var l="retrying operation call";if(u>0){l+=" in "+u+"ms"}l+=" because of exception\n"+t.toString();o.trace(s.retryCat,l)}e.assert(i!==null);i.value=u;return r}});Ice.ProxyFactory=s})();(function(){var e=Ice.FormatType;var t=Ice.EndpointSelectionType;var n=Ice.Protocol;var i=function(i,r){this.defaultProtocol=i.getPropertyWithDefault("Ice.Default.Protocol",Ice.TcpEndpointFactory!==undefined?"tcp":"ws");var s=i.getProperty("Ice.Default.Host");this.defaultHost=s.length>0?s:null;s=i.getProperty("Ice.Default.SourceAddress");this.defaultSourceAddress=s.length>0?s:null;s=i.getProperty("Ice.Override.Timeout");if(s.length>0){this.overrideTimeout=true;this.overrideTimeoutValue=i.getPropertyAsInt("Ice.Override.Timeout");if(this.overrideTimeoutValue<1&&this.overrideTimeoutValue!==-1){this.overrideTimeoutValue=-1;r.warning("invalid value for Ice.Override.Timeout `"+i.getProperty("Ice.Override.Timeout")+"': defaulting to -1")}}else{this.overrideTimeout=false;this.overrideTimeoutValue=-1}s=i.getProperty("Ice.Override.ConnectTimeout");if(s.length>0){this.overrideConnectTimeout=true;this.overrideConnectTimeoutValue=i.getPropertyAsInt("Ice.Override.ConnectTimeout");if(this.overrideConnectTimeoutValue<1&&this.overrideConnectTimeoutValue!==-1){this.overrideConnectTimeoutValue=-1;r.warning("invalid value for Ice.Override.ConnectTimeout `"+i.getProperty("Ice.Override.ConnectTimeout")+"': defaulting to -1")}}else{this.overrideConnectTimeout=false;this.overrideConnectTimeoutValue=-1}s=i.getProperty("Ice.Override.CloseTimeout");if(s.length>0){this.overrideCloseTimeout=true;this.overrideCloseTimeoutValue=i.getPropertyAsInt("Ice.Override.CloseTimeout");if(this.overrideCloseTimeoutValue<1&&this.overrideCloseTimeoutValue!==-1){this.overrideCloseTimeoutValue=-1;r.warning("invalid value for Ice.Override.CloseTimeout `"+i.getProperty("Ice.Override.CloseTimeout")+"': defaulting to -1")}}else{this.overrideCloseTimeout=false;this.overrideCloseTimeoutValue=-1}this.overrideCompress=false;this.overrideSecure=false;s=i.getPropertyWithDefault("Ice.Default.EndpointSelection","Random");if(s==="Random"){this.defaultEndpointSelection=t.Random}else if(s==="Ordered"){this.defaultEndpointSelection=t.Ordered}else{var o=new Ice.EndpointSelectionTypeParseException;o.str="illegal value `"+s+"'; expected `Random' or `Ordered'";throw o}this.defaultTimeout=i.getPropertyAsIntWithDefault("Ice.Default.Timeout",6e4);if(this.defaultTimeout<1&&this.defaultTimeout!==-1){this.defaultTimeout=6e4;r.warning("invalid value for Ice.Default.Timeout `"+i.getProperty("Ice.Default.Timeout")+"': defaulting to 60000")}this.defaultLocatorCacheTimeout=i.getPropertyAsIntWithDefault("Ice.Default.LocatorCacheTimeout",-1);if(this.defaultLocatorCacheTimeout<-1){this.defaultLocatorCacheTimeout=-1;r.warning("invalid value for Ice.Default.LocatorCacheTimeout `"+i.getProperty("Ice.Default.LocatorCacheTimeout")+"': defaulting to -1")}this.defaultInvocationTimeout=i.getPropertyAsIntWithDefault("Ice.Default.InvocationTimeout",-1);if(this.defaultInvocationTimeout<1&&this.defaultInvocationTimeout!==-1){this.defaultInvocationTimeout=-1;r.warning("invalid value for Ice.Default.InvocationTimeout `"+i.getProperty("Ice.Default.InvocationTimeout")+"': defaulting to -1")}this.defaultPreferSecure=i.getPropertyAsIntWithDefault("Ice.Default.PreferSecure",0)>0;s=i.getPropertyWithDefault("Ice.Default.EncodingVersion",Ice.encodingVersionToString(n.currentEncoding));this.defaultEncoding=Ice.stringToEncodingVersion(s);n.checkSupportedEncoding(this.defaultEncoding);var c=i.getPropertyAsIntWithDefault("Ice.Default.SlicedFormat",0)>0;this.defaultFormat=c?e.SlicedFormat:e.CompactFormat};Ice.DefaultsAndOverrides=i})();(function(){var e=Ice.StringUtil;var t=Ice.Identity;var n=Ice.IdentityParseException;Ice.stringToIdentity=function(i){var r=new t;var s=-1;var o=0;while((o=i.indexOf("/",o))!==-1){var c=0;while(o-c>0&&i.charAt(o-c-1)=="\\"){c++}if(c%2===0){if(s==-1){s=o}else{var a=new n;a.str="unescaped backslash in identity `"+i+"'";throw a}}o++}if(s==-1){r.category="";try{r.name=e.unescapeString(i)}catch(u){var a=new n;a.str="invalid identity name `"+i+"': "+a.toString();throw a}}else{try{r.category=e.unescapeString(i,0,s)}catch(u){var a=new n;a.str="invalid category in identity `"+i+"': "+a.toString();throw a}if(s+10);var i=this.applyOverrides(e);try{var s={value:false};var c=this.findConnectionByEndpoint(i,s);if(c!==null){return(new o).succeed(c,s.value)}}catch(a){return(new o).fail(a)}var u=new f(this,i,t,n);return u.start()},setRouterInfo:function(e){var t=this;return Ice.Promise.try(function(){if(t._destroyed){throw new Ice.CommunicatorDestroyedException}return e.getClientEndpoints()}).then(function(n){var i=e.getAdapter();var r=t._instance.defaultsAndOverrides();for(var s=0;s0);for(var i=0;i=0);if(this._destroyed&&this._pendingConnectCount===0){this.checkFinished()}},getConnection:function(e,t,n){if(this._destroyed){throw new Ice.CommunicatorDestroyedException}var i=this._monitor.swapReapedConnections();if(i!==null){for(var r=0;r=2){var i=[];i.push("connection to endpoint failed");if(e instanceof Ice.CommunicatorDestroyedException){i.push("\n")}else{if(t){i.push(", trying next endpoint\n")}else{i.push(" and no more endpoints to try\n")}}i.push(e.toString());this._instance.initializationData().logger.trace(n.retryCat,i.join(""))}},handleException:function(e,t){var n=this._instance.traceLevels();if(n.retry>=2){var i=[];i.push("couldn't resolve endpoint host");if(e instanceof Ice.CommunicatorDestroyedException){i.push("\n")}else{if(t){i.push(", trying next endpoint\n")}else{i.push(" and no more endpoints to try\n")}}i.push(e.toString());this._instance.initializationData().logger.trace(n.retryCat,i.join(""))}},checkFinished:function(){if(!this._waitPromise||!this._destroyed||this._pending.size>0||this._pendingConnectCount>0){return}var e=this;o.all(e._connectionsByEndpoint.map(function(e){return e.waitUntilFinished().exception(function(e){r.assert(false)})})).then(function(){var t=e._monitor.swapReapedConnections();if(t!==null){var n=[];for(var i=e._connectionsByEndpoint.entries;i!==null;i=i.next){var s=i.value;for(var o=0;o=2){var t=[];t.push("trying to establish ");t.push(this._current.protocol());t.push(" connection to ");t.push(this._current.toConnectorString());this._factory._instance.initializationData().logger.trace(e.networkCat,t.join(""))}var n=this._factory.createConnection(this._current.connect(),this._current);var i=this;n.start().then(function(){i.connectionStartCompleted(n)},function(e){i.connectionStartFailed(n,e)})}catch(s){if(e.network>=2){var t=[];t.push("failed to establish ");t.push(this._current.protocol());t.push(" connection to ");t.push(this._current.toString());t.push("\n");t.push(s.toString());this._factory._instance.initializationData().logger.trace(e.networkCat,t.join(""))}if(this.connectionStartFailedImpl(s)){continue}}break}},connectionStartFailedImpl:function(e){if(e instanceof Ice.LocalException){this._factory.handleConnectionException(e,this._hasMore||this._index=1){this.getEndpointsTrace(t,c,true)}o.succeed(c,true);return o},clearCache:function(t){e.assert(t.isIndirect());if(!t.isWellKnown()){var n=this._table.removeAdapterEndpoints(t.getAdapterId());if(n!==null&&t.getInstance().traceLevels().location>=2){this.trace("removed endpoints from locator table\n",t,n)}}else{var i=this._table.removeObjectReference(t.getIdentity());if(i!==null){if(!i.isIndirect()){if(t.getInstance().traceLevels().location>=2){this.trace("removed endpoints from locator table",t,i.getEndpoints())}}else if(!i.isWellKnown()){this.clearCache(i)}}}},trace:function(t,n,i){e.assert(n.isIndirect());var r=[];r.push(t);r.push("\n");if(!n.isWellKnown()){r.push("adapter = ");r.push(n.getAdapterId());r.push("\n")}else{r.push("object = ");r.push(n.getInstance().identityToString(n.getIdentity()));r.push("\n")}r.push("endpoints = ");for(var s=0;s=1){r=[];r.push("adapter not found\n");r.push("adapter = ");r.push(t.getAdapterId());i.initializationData().logger.trace(i.traceLevels().locationCat,r.join(""))}s=new Ice.NotRegisteredException;s.kindOfObject="object adapter";s.id=t.getAdapterId();throw s}else if(o instanceof Ice.ObjectNotFoundException){if(i.traceLevels().location>=1){r=[];r.push("object not found\n");r.push("object = ");r.push(i.identityToString(t.getIdentity()));i.initializationData().logger.trace(i.traceLevels().locationCat,r.join(""))}s=new Ice.NotRegisteredException;s.kindOfObject="object";s.id=i.identityToString(t.getIdentity());throw s}else if(o instanceof Ice.NotRegisteredException){throw o}else if(o instanceof Ice.LocalException){if(i.traceLevels().location>=1){r=[];r.push("couldn't contact the locator to retrieve adapter endpoints\n");if(t.getAdapterId().length>0){r.push("adapter = ");r.push(t.getAdapterId());r.push("\n")}else{r.push("object = ");r.push(i.identityToString(t.getIdentity()));r.push("\n")}r.push("reason = "+o.toString());i.initializationData().logger.trace(i.traceLevels().locationCat,r.join(""))}throw o}else{e.assert(false)}}},getEndpointsTrace:function(e,t,n){if(t!==null&&t.length>0){if(n){this.trace("found endpoints in locator table",e,t)}else{this.trace("retrieved endpoints from locator, adding to locator table",e,t)}}else{var i=e.getInstance();var r=[];r.push("no endpoints configured for ");if(e.getAdapterId().length>0){r.push("adapter\n");r.push("adapter = ");r.push(e.getAdapterId());r.push("\n")}else{r.push("object\n");r.push("object = ");r.push(i.identityToString(e.getIdentity()));r.push("\n")}i.initializationData().logger.trace(i.traceLevels().locationCat,r.join(""))}},getAdapterRequest:function(e){if(e.getInstance().traceLevels().location>=1){var t=e.getInstance();var n=[];n.push("searching for adapter by id\n");n.push("adapter = ");n.push(e.getAdapterId());t.initializationData().logger.trace(t.traceLevels().locationCat,n.join(""))}var i=this._adapterRequests.get(e.getAdapterId());if(i!==undefined){return i}i=new l(this,e);this._adapterRequests.set(e.getAdapterId(),i);return i},getObjectRequest:function(e){if(e.getInstance().traceLevels().location>=1){var t=e.getInstance();var n=[];n.push("searching for object by id\n");n.push("object = ");n.push(t.identityToString(e.getIdentity()));t.initializationData().logger.trace(t.traceLevels().locationCat,n.join(""))}var i=this._objectRequests.get(e.getIdentity());if(i!==undefined){return i}i=new u(this,e);this._objectRequests.set(e.getIdentity(),i);return i},finishRequest:function(t,n,i,r){if(i===null||i.__reference().isIndirect()){for(var s=0;s=1){e.getEndpointsTrace(this._ref,n,false)}if(this._promise!==null){this._promise.succeed(n===null?[]:n,false)}},exception:function(e,t){try{e.getEndpointsException(this._ref,t)}catch(n){if(this._promise!==null){this._promise.fail(n)}}}});var a=s({__init__:function(e,t){this._locatorInfo=e;this._ref=t;this._callbacks=[];this._wellKnownRefs=[];this._sent=false;this._response=false;this._proxy=null;this._exception=null},addCallback:function(e,t,n,i){var r=new c(e,n,i);if(this._response){r.response(this._locatorInfo,this._proxy)}else if(this._exception!==null){r.exception(this._locatorInfo,this._exception)}else{this._callbacks.push(r);if(t!==null){this._wellKnownRefs.push(t)}if(!this._sent){this._sent=true;this.send()}}},response:function(e){this._locatorInfo.finishRequest(this._ref,this._wellKnownRefs,e,false);this._response=true;this._proxy=e;for(var t=0;t0){var d=["found unknown properties for object adapter `"+r+"':"];for(var p=0;p2147483647/1024){this._messageSizeMax=2147483647}else{this._messageSizeMax=m*1024}}try{if(o===null){o=Ice.RouterPrx.uncheckedCast(this._instance.proxyFactory().propertyToProxy(this._name+".Router"))}if(o!==null){this._routerInfo=this._instance.routerManager().find(o);t.assert(this._routerInfo!==null);if(this._routerInfo.getAdapter()!==null){throw new Ice.AlreadyRegisteredException("object adapter with router",this._instance.identityToString(o.ice_getIdentity()))}var y=this;this._routerInfo.getServerEndpoints().then(function(e){var t;for(t=0;t0){throw new Ice.FeatureNotSupportedException("object adapter endpoints not supported")}u.succeed(this,u)}}catch(_){this.destroy();throw _}},getName:function(){return this._noConfig?"":this._name},getCommunicator:function(){return this._communicator; +},activate:function(){},hold:function(){this.checkForDeactivation()},waitForHold:function(){var t=new e(this._communicator,"waitForHold",null,null,this);if(this.checkForDeactivation(t)){return t}return t.succeed(t)},deactivate:function(){var t=new e(this._communicator,"deactivate",null,null,this);if(this._state=u},destroy:function(){var t=new e(this._communicator,"destroy",null,null,this);var n=this;var i=function(){if(n._state=u){var t=new Ice.ObjectAdapterDeactivatedException;t.name=this.getName();if(e!==undefined){e.fail(t,e);return true}else{throw t}}return false},checkIdentity:function(e){if(e.name===undefined||e.name===null||e.name.length===0){throw new Ice.IllegalIdentityException(e)}if(e.category===undefined||e.category===null){e.category=""}},checkServant:function(e){if(e===undefined||e===null){throw new Ice.IllegalServantException("cannot add null servant to Object Adapter")}},filterProperties:function(e){var t=true,n;var i=this._name+".";for(n=0;n0;this._table=new e(e.compareEquals);this._locatorTables=new e(e.compareEquals)},destroy:function(){for(var e=this._table.entries;e!==null;e=e.next){e.value.destroy()}this._table.clear();this._locatorTables.clear()},find:function(e){if(e===null){return null}var r=i.uncheckedCast(e.ice_locator(null));var s=this._table.get(r);if(s===undefined){var o=this._locatorTables.get(r.ice_getIdentity());if(o===undefined){o=new n;this._locatorTables.set(r.ice_getIdentity(),o)}s=new t(r,o,this._background);this._table.set(r,s)}return s}});Ice.LocatorManager=r})();(function(){var e=Ice.AsyncResultBase;var t=Ice.ObjectAdapterI;var n=Ice.Promise;var i=Ice.Class({__init__:function(e,t){this._instance=e;this._communicator=t;this._adapters=[];this._adapterNamesInUse=[];this._shutdownPromise=new n},shutdown:function(){if(this._instance===null){return this._shutdownPromise}this._instance=null;this._communicator=null;this._shutdownPromise=n.all(this._adapters.map(function(e){return e.deactivate()}));return this._shutdownPromise},waitForShutdown:function(){var e=this;return this._shutdownPromise.then(function(){return n.all(e._adapters.map(function(e){return e.waitForDeactivate()}))})},isShutdown:function(){return this._instance===null},destroy:function(){var e=this;return this.waitForShutdown().then(function(){return n.all(e._adapters.map(function(e){return e.destroy()}))})},createObjectAdapter:function(e,n,i){if(this._instance===null){throw new Ice.ObjectAdapterDeactivatedException}var r=null;try{if(e.length===0){var s=Ice.generateUUID();r=new t(this._instance,this._communicator,this,s,null,true,i)}else{if(this._adapterNamesInUse.indexOf(e)!==-1){throw new Ice.AlreadyRegisteredException("object adapter",e)}r=new t(this._instance,this._communicator,this,e,n,false,i);this._adapterNamesInUse.push(e)}this._adapters.push(r)}catch(o){i.fail(o,i)}},removeObjectAdapter:function(e){if(this._instance===null){return}var t=this._adapters.indexOf(e);if(t!==-1){this._adapters.splice(t,1)}t=this._adapterNamesInUse.indexOf(e.getName());if(t!==-1){this._adapterNamesInUse.splice(t,1)}}});Ice.ObjectAdapterFactory=i})();(function(){t.defineDictionary(IceMX,"StringIntDict","StringIntDictHelper","Ice.StringHelper","Ice.IntHelper",false,undefined,undefined);IceMX.Metrics=t.defineObject(function(e,t,n,i,r){Ice.Object.call(this);this.id=e!==undefined?e:"";this.total=t!==undefined?t:new Ice.Long(0,0);this.current=n!==undefined?n:0;this.totalLifetime=i!==undefined?i:new Ice.Long(0,0);this.failures=r!==undefined?r:0},Ice.Object,undefined,1,["::Ice::Object","::IceMX::Metrics"],-1,function(e){e.writeString(this.id);e.writeLong(this.total);e.writeInt(this.current);e.writeLong(this.totalLifetime);e.writeInt(this.failures)},function(e){this.id=e.readString();this.total=e.readLong();this.current=e.readInt();this.totalLifetime=e.readLong();this.failures=e.readInt()},false);IceMX.MetricsPrx=t.defineProxy(Ice.ObjectPrx,IceMX.Metrics.ice_staticId,undefined);t.defineOperations(IceMX.Metrics,IceMX.MetricsPrx);IceMX.MetricsFailures=t.defineStruct(function(e,t){this.id=e!==undefined?e:"";this.failures=t!==undefined?t:null},false,function(e){e.writeString(this.id);IceMX.StringIntDictHelper.write(e,this.failures)},function(e){this.id=e.readString();this.failures=IceMX.StringIntDictHelper.read(e)},2,false);t.defineSequence(IceMX,"MetricsFailuresSeqHelper","IceMX.MetricsFailures",false);t.defineSequence(IceMX,"MetricsMapHelper","Ice.ObjectHelper",false,"IceMX.Metrics");t.defineDictionary(IceMX,"MetricsView","MetricsViewHelper","Ice.StringHelper","IceMX.MetricsMapHelper",false,undefined,undefined,Ice.ArrayUtil.equals);IceMX.UnknownMetricsView=t.defineUserException(function(e){Ice.UserException.call(this,e)},Ice.UserException,"IceMX::UnknownMetricsView",undefined,undefined,false,false);IceMX.MetricsAdmin=t.defineObject(undefined,Ice.Object,undefined,1,["::Ice::Object","::IceMX::MetricsAdmin"],-1,undefined,undefined,false);IceMX.MetricsAdminPrx=t.defineProxy(Ice.ObjectPrx,IceMX.MetricsAdmin.ice_staticId,undefined);t.defineOperations(IceMX.MetricsAdmin,IceMX.MetricsAdminPrx,{getMetricsViewNames:[,,,,2,["Ice.StringSeqHelper"],,[["Ice.StringSeqHelper"]],,,],enableMetricsView:[,,,,2,,[[7]],,[IceMX.UnknownMetricsView],,],disableMetricsView:[,,,,2,,[[7]],,[IceMX.UnknownMetricsView],,],getMetricsView:[,,,,2,["IceMX.MetricsViewHelper"],[[7]],[[4]],[IceMX.UnknownMetricsView],,true],getMapMetricsFailures:[,,,,2,["IceMX.MetricsFailuresSeqHelper"],[[7],[7]],,[IceMX.UnknownMetricsView],,],getMetricsFailures:[,,,,2,[IceMX.MetricsFailures],[[7],[7],[7]],,[IceMX.UnknownMetricsView],,]});IceMX.ThreadMetrics=t.defineObject(function(e,t,n,i,r,s,o,c){IceMX.Metrics.call(this,e,t,n,i,r);this.inUseForIO=s!==undefined?s:0;this.inUseForUser=o!==undefined?o:0;this.inUseForOther=c!==undefined?c:0},IceMX.Metrics,undefined,2,["::Ice::Object","::IceMX::Metrics","::IceMX::ThreadMetrics"],-1,function(e){e.writeInt(this.inUseForIO);e.writeInt(this.inUseForUser);e.writeInt(this.inUseForOther)},function(e){this.inUseForIO=e.readInt();this.inUseForUser=e.readInt();this.inUseForOther=e.readInt()},false);IceMX.ThreadMetricsPrx=t.defineProxy(IceMX.MetricsPrx,IceMX.ThreadMetrics.ice_staticId,undefined);t.defineOperations(IceMX.ThreadMetrics,IceMX.ThreadMetricsPrx);IceMX.DispatchMetrics=t.defineObject(function(e,t,n,i,r,s,o,c){IceMX.Metrics.call(this,e,t,n,i,r);this.userException=s!==undefined?s:0;this.size=o!==undefined?o:new Ice.Long(0,0);this.replySize=c!==undefined?c:new Ice.Long(0,0)},IceMX.Metrics,undefined,1,["::Ice::Object","::IceMX::DispatchMetrics","::IceMX::Metrics"],-1,function(e){e.writeInt(this.userException);e.writeLong(this.size);e.writeLong(this.replySize)},function(e){this.userException=e.readInt();this.size=e.readLong();this.replySize=e.readLong()},false);IceMX.DispatchMetricsPrx=t.defineProxy(IceMX.MetricsPrx,IceMX.DispatchMetrics.ice_staticId,undefined);t.defineOperations(IceMX.DispatchMetrics,IceMX.DispatchMetricsPrx);IceMX.ChildInvocationMetrics=t.defineObject(function(e,t,n,i,r,s,o){IceMX.Metrics.call(this,e,t,n,i,r);this.size=s!==undefined?s:new Ice.Long(0,0);this.replySize=o!==undefined?o:new Ice.Long(0,0)},IceMX.Metrics,undefined,1,["::Ice::Object","::IceMX::ChildInvocationMetrics","::IceMX::Metrics"],-1,function(e){e.writeLong(this.size);e.writeLong(this.replySize)},function(e){this.size=e.readLong();this.replySize=e.readLong()},false);IceMX.ChildInvocationMetricsPrx=t.defineProxy(IceMX.MetricsPrx,IceMX.ChildInvocationMetrics.ice_staticId,undefined);t.defineOperations(IceMX.ChildInvocationMetrics,IceMX.ChildInvocationMetricsPrx);IceMX.CollocatedMetrics=t.defineObject(function(e,t,n,i,r,s,o){IceMX.ChildInvocationMetrics.call(this,e,t,n,i,r,s,o)},IceMX.ChildInvocationMetrics,undefined,2,["::Ice::Object","::IceMX::ChildInvocationMetrics","::IceMX::CollocatedMetrics","::IceMX::Metrics"],-1,undefined,undefined,false);IceMX.CollocatedMetricsPrx=t.defineProxy(IceMX.ChildInvocationMetricsPrx,IceMX.CollocatedMetrics.ice_staticId,undefined);t.defineOperations(IceMX.CollocatedMetrics,IceMX.CollocatedMetricsPrx);IceMX.RemoteMetrics=t.defineObject(function(e,t,n,i,r,s,o){IceMX.ChildInvocationMetrics.call(this,e,t,n,i,r,s,o)},IceMX.ChildInvocationMetrics,undefined,3,["::Ice::Object","::IceMX::ChildInvocationMetrics","::IceMX::Metrics","::IceMX::RemoteMetrics"],-1,undefined,undefined,false);IceMX.RemoteMetricsPrx=t.defineProxy(IceMX.ChildInvocationMetricsPrx,IceMX.RemoteMetrics.ice_staticId,undefined);t.defineOperations(IceMX.RemoteMetrics,IceMX.RemoteMetricsPrx);IceMX.InvocationMetrics=t.defineObject(function(e,t,n,i,r,s,o,c,a){IceMX.Metrics.call(this,e,t,n,i,r);this.retry=s!==undefined?s:0;this.userException=o!==undefined?o:0;this.remotes=c!==undefined?c:null;this.collocated=a!==undefined?a:null},IceMX.Metrics,undefined,1,["::Ice::Object","::IceMX::InvocationMetrics","::IceMX::Metrics"],-1,function(e){e.writeInt(this.retry);e.writeInt(this.userException);IceMX.MetricsMapHelper.write(e,this.remotes);IceMX.MetricsMapHelper.write(e,this.collocated)},function(e){this.retry=e.readInt();this.userException=e.readInt();this.remotes=IceMX.MetricsMapHelper.read(e);this.collocated=IceMX.MetricsMapHelper.read(e)},false);IceMX.InvocationMetricsPrx=t.defineProxy(IceMX.MetricsPrx,IceMX.InvocationMetrics.ice_staticId,undefined);t.defineOperations(IceMX.InvocationMetrics,IceMX.InvocationMetricsPrx);IceMX.ConnectionMetrics=t.defineObject(function(e,t,n,i,r,s,o){IceMX.Metrics.call(this,e,t,n,i,r);this.receivedBytes=s!==undefined?s:new Ice.Long(0,0);this.sentBytes=o!==undefined?o:new Ice.Long(0,0)},IceMX.Metrics,undefined,1,["::Ice::Object","::IceMX::ConnectionMetrics","::IceMX::Metrics"],-1,function(e){e.writeLong(this.receivedBytes);e.writeLong(this.sentBytes)},function(e){this.receivedBytes=e.readLong();this.sentBytes=e.readLong()},false);IceMX.ConnectionMetricsPrx=t.defineProxy(IceMX.MetricsPrx,IceMX.ConnectionMetrics.ice_staticId,undefined);t.defineOperations(IceMX.ConnectionMetrics,IceMX.ConnectionMetricsPrx)})();(function(){var e=Ice.Debug;var t=Ice.HashMap;var n=Ice.ConnectRequestHandler;var i=Ice.Class({__init__:function(e){this._instance=e;this._handlers=new t(t.compareEquals)},getRequestHandler:function(e,t){var i=false;var r;if(e.getCacheConnection()){r=this._handlers.get(e);if(!r){r=new n(e,t);this._handlers.set(e,r);i=true}}else{i=true;r=new n(e,t)}if(i){e.getConnection().then(function(e,t){r.setConnection(e,t)},function(e){r.setException(e)})}return t.__setRequestHandler(r.connect(t))},removeRequestHandler:function(e,t){if(e.getCacheConnection()){if(this._handlers.get(e)===t){this._handlers.delete(e)}}}});Ice.RequestHandlerFactory=i})();(function(){Ice.Process=t.defineObject(undefined,Ice.Object,undefined,1,["::Ice::Object","::Ice::Process"],-1,undefined,undefined,false);Ice.ProcessPrx=t.defineProxy(Ice.ObjectPrx,Ice.Process.ice_staticId,undefined);t.defineOperations(Ice.Process,Ice.ProcessPrx,{shutdown:[,,,,,,,,,,],writeMessage:[,,,,,,[[7],[3]],,,,]})})();(function(){var e=Ice.TcpEndpointI;var t=Ice.Class({__init__:function(e){this._instance=e},type:function(){return this._instance.type()},protocol:function(){return this._instance.protocol()},create:function(t,n){var i=new e(this._instance);i.initWithOptions(t,n);return i},read:function(t){var n=new e(this._instance);n.initWithStream(t);return n},destroy:function(){this._instance=null},clone:function(e){return new t(e)}});Ice.TcpEndpointFactory=t})();(function(){t.defineDictionary(Ice,"PropertyDict","PropertyDictHelper","Ice.StringHelper","Ice.StringHelper",false,undefined,undefined);Ice.PropertiesAdmin=t.defineObject(undefined,Ice.Object,undefined,1,["::Ice::Object","::Ice::PropertiesAdmin"],-1,undefined,undefined,false);Ice.PropertiesAdminPrx=t.defineProxy(Ice.ObjectPrx,Ice.PropertiesAdmin.ice_staticId,undefined);t.defineOperations(Ice.PropertiesAdmin,Ice.PropertiesAdminPrx,{getProperty:[,,,,,[7],[[7]],,,,],getPropertiesForPrefix:[,,,,,["Ice.PropertyDictHelper"],[[7]],,,,],setProperties:[,,,1,,,[["Ice.PropertyDictHelper"]],,,,]})})();(function(){Ice.LogMessageType=t.defineEnum([["PrintMessage",0],["TraceMessage",1],["WarningMessage",2],["ErrorMessage",3]]);t.defineSequence(Ice,"LogMessageTypeSeqHelper","Ice.LogMessageType.__helper",false);Ice.LogMessage=t.defineStruct(function(e,t,n,i){this.type=e!==undefined?e:Ice.LogMessageType.PrintMessage;this.timestamp=t!==undefined?t:new Ice.Long(0,0);this.traceCategory=n!==undefined?n:"";this.message=i!==undefined?i:""},true,function(e){Ice.LogMessageType.__write(e,this.type);e.writeLong(this.timestamp);e.writeString(this.traceCategory);e.writeString(this.message)},function(e){this.type=Ice.LogMessageType.__read(e);this.timestamp=e.readLong();this.traceCategory=e.readString();this.message=e.readString()},11,false);t.defineSequence(Ice,"LogMessageSeqHelper","Ice.LogMessage",false);Ice.RemoteLogger=t.defineObject(undefined,Ice.Object,undefined,1,["::Ice::Object","::Ice::RemoteLogger"],-1,undefined,undefined,false);Ice.RemoteLoggerPrx=t.defineProxy(Ice.ObjectPrx,Ice.RemoteLogger.ice_staticId,undefined);t.defineOperations(Ice.RemoteLogger,Ice.RemoteLoggerPrx,{init:[,,,,,,[[7],["Ice.LogMessageSeqHelper"]],,,,],log:[,,,,,,[[Ice.LogMessage]],,,,]});Ice.RemoteLoggerAlreadyAttachedException=t.defineUserException(function(e){Ice.UserException.call(this,e)},Ice.UserException,"Ice::RemoteLoggerAlreadyAttachedException",undefined,undefined,false,false);Ice.LoggerAdmin=t.defineObject(undefined,Ice.Object,undefined,0,["::Ice::LoggerAdmin","::Ice::Object"],-1,undefined,undefined,false);Ice.LoggerAdminPrx=t.defineProxy(Ice.ObjectPrx,Ice.LoggerAdmin.ice_staticId,undefined);t.defineOperations(Ice.LoggerAdmin,Ice.LoggerAdminPrx,{attachRemoteLogger:[,,,,,,[["Ice.RemoteLoggerPrx"],["Ice.LogMessageTypeSeqHelper"],["Ice.StringSeqHelper"],[3]],,[Ice.RemoteLoggerAlreadyAttachedException],,],detachRemoteLogger:[,,,,,[1],[["Ice.RemoteLoggerPrx"]],,,,],getLog:[,,,,,["Ice.LogMessageSeqHelper"],[["Ice.LogMessageTypeSeqHelper"],["Ice.StringSeqHelper"],[3]],[[7]],,,]})})();(function(){var e=Ice.WSEndpoint;var t=Ice.Class({__init__:function(e,t){this._instance=e;this._delegate=t},type:function(){return this._instance.type()},protocol:function(){return this._instance.protocol()},create:function(t,n){var i=new e(this._instance,this._delegate.create(t,n));i.initWithOptions(t);return i},read:function(t){var n=new e(this._instance,this._delegate.read(t));n.initWithStream(t);return n},destroy:function(){this._delegate.destroy();this._instance=null}});Ice.WSEndpointFactory=t})();(function(){t.defineDictionary(Ice,"SliceChecksumDict","SliceChecksumDictHelper","Ice.StringHelper","Ice.StringHelper",false,undefined,undefined)})();(function(){var e=Ice.AsyncResultBase;var t=Ice.Debug;var n=Ice.DefaultsAndOverrides;var i=Ice.EndpointFactoryManager;var r=Ice.HashMap;var s=Ice.ImplicitContextI;var o=Ice.LocatorManager;var c=Ice.Logger;var a=Ice.ObjectAdapterFactory;var u=Ice.ObjectFactoryManager;var l=Ice.OutgoingConnectionFactory;var h=Ice.Promise;var f=Ice.Properties;var d=Ice.ProxyFactory;var p=Ice.RetryQueue;var _=Ice.RouterManager;var I=Ice.Timer;var g=Ice.TraceLevels;var v=Ice.ReferenceFactory;var m=Ice.RequestHandlerFactory;var y=Ice.ACMConfig;var w=0;var E=1;var x=2;var S=Ice.Class({__init__:function(e){this._state=w;this._initData=e;this._traceLevels=null;this._defaultsAndOverrides=null;this._messageSizeMax=0;this._batchAutoFlushSize=0;this._clientACM=null;this._implicitContext=null;this._routerManager=null;this._locatorManager=null;this._referenceFactory=null;this._requestHandlerFactory=null;this._proxyFactory=null;this._outgoingConnectionFactory=null;this._servantFactoryManager=null;this._objectAdapterFactory=null;this._retryQueue=null;this._endpointHostResolver=null;this._endpointFactoryManager=null},initializationData:function(){return this._initData},traceLevels:function(){t.assert(this._traceLevels!==null);return this._traceLevels},defaultsAndOverrides:function(){t.assert(this._defaultsAndOverrides!==null);return this._defaultsAndOverrides},routerManager:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._routerManager!==null);return this._routerManager},locatorManager:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._locatorManager!==null);return this._locatorManager},referenceFactory:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._referenceFactory!==null);return this._referenceFactory},requestHandlerFactory:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._requestHandlerFactory!==null);return this._requestHandlerFactory},proxyFactory:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._proxyFactory!==null);return this._proxyFactory},outgoingConnectionFactory:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._outgoingConnectionFactory!==null);return this._outgoingConnectionFactory},servantFactoryManager:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._servantFactoryManager!==null);return this._servantFactoryManager},objectAdapterFactory:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._objectAdapterFactory!==null);return this._objectAdapterFactory},retryQueue:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._retryQueue!==null);return this._retryQueue},timer:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._timer!==null);return this._timer},endpointFactoryManager:function(){if(this._state===x){throw new Ice.CommunicatorDestroyedException}t.assert(this._endpointFactoryManager!==null);return this._endpointFactoryManager},messageSizeMax:function(){return this._messageSizeMax},batchAutoFlushSize:function(){return this._batchAutoFlushSize},clientACM:function(){return this._clientACM},getImplicitContext:function(){return this._implicitContext},stringToIdentity:function(e){return Ice.stringToIdentity(e)},identityToString:function(e){return Ice.identityToString(e)},setDefaultLocator:function(e){if(this._state==x){throw new Ice.CommunicatorDestroyedException}this._referenceFactory=this._referenceFactory.setDefaultLocator(e)},setDefaultRouter:function(e){if(this._state==x){throw new Ice.CommunicatorDestroyedException}this._referenceFactory=this._referenceFactory.setDefaultRouter(e)},setLogger:function(e){this._initData.logger=e},finishSetup:function(e,t){try{if(this._initData.properties===null){this._initData.properties=f.createProperties()}if(Ice.__oneOfDone===undefined){Ice.__printStackTraces=this._initData.properties.getPropertyAsIntWithDefault("Ice.PrintStackTraces",0)>0;Ice.__oneOfDone=true}if(this._initData.logger===null){this._initData.logger=Ice.getProcessLogger()}this._traceLevels=new g(this._initData.properties);this._defaultsAndOverrides=new n(this._initData.properties,this._initData.logger);var r=1024;var c=this._initData.properties.getPropertyAsIntWithDefault("Ice.MessageSizeMax",r);if(c<1||c>2147483647/1024){this._messageSizeMax=2147483647}else{this._messageSizeMax=c*1024}if(this._initData.properties.getProperty("Ice.BatchAutoFlushSize").length===0&&this._initData.properties.getProperty("Ice.BatchAutoFlush").length>0){if(this._initData.properties.getPropertyAsInt("Ice.BatchAutoFlush")>0){this._batchAutoFlushSize=this._messageSizeMax}}else{c=this._initData.properties.getPropertyAsIntWithDefault("Ice.BatchAutoFlushSize",1024);if(c<1){this._batchAutoFlushSize=c}else if(c>2147483647/1024){this._batchAutoFlushSize=2147483647}else{this._batchAutoFlushSize=c*1024}}this._clientACM=new y(this._initData.properties,this._initData.logger,"Ice.ACM.Client",new y(this._initData.properties,this._initData.logger,"Ice.ACM",new y));this._implicitContext=s.create(this._initData.properties.getProperty("Ice.ImplicitContext"));this._routerManager=new _;this._locatorManager=new o(this._initData.properties);this._referenceFactory=new v(this,e);this._requestHandlerFactory=new m(this,e);this._proxyFactory=new d(this);this._endpointFactoryManager=new i(this);var h=new Ice.ProtocolInstance(this,Ice.TCPEndpointType,"tcp",false);var w=new Ice.TcpEndpointFactory(h);this._endpointFactoryManager.add(w);var E=new Ice.ProtocolInstance(this,Ice.WSEndpointType,"ws",false);var x=new Ice.WSEndpointFactory(E,w.clone(E));this._endpointFactoryManager.add(x);var S=new Ice.ProtocolInstance(this,IceSSL.EndpointType,"ssl",true);var b=new Ice.TcpEndpointFactory(S);this._endpointFactoryManager.add(b);var C=new Ice.ProtocolInstance(this,Ice.WSSEndpointType,"wss",true);var P=new Ice.WSEndpointFactory(C,b.clone(C));this._endpointFactoryManager.add(P);this._outgoingConnectionFactory=new l(e,this);this._servantFactoryManager=new u;this._objectAdapterFactory=new a(this,e);this._retryQueue=new p(this);this._timer=new I(this._initData.logger);var M=Ice.RouterPrx.uncheckedCast(this._proxyFactory.propertyToProxy("Ice.Default.Router"));if(M!==null){this._referenceFactory=this._referenceFactory.setDefaultRouter(M)}var O=Ice.LocatorPrx.uncheckedCast(this._proxyFactory.propertyToProxy("Ice.Default.Locator"));if(O!==null){this._referenceFactory=this._referenceFactory.setDefaultLocator(O)}if(t!==null){t.succeed(e)}}catch(k){if(t!==null){if(k instanceof Ice.LocalException){this.destroy().finally(function(){t.fail(k)})}else{t.fail(k)}}else{if(k instanceof Ice.LocalException){this.destroy()}throw k}}},destroy:function(){var t=new e(null,"destroy",null,this,null);if(this._state==E){if(!this._destroyPromises){this._destroyPromises=[]}this._destroyPromises.push(t);return t}this._state=E;var n=this;Ice.Promise.try(function(){if(n._objectAdapterFactory){return n._objectAdapterFactory.shutdown()}}).then(function(){if(n._outgoingConnectionFactory!==null){n._outgoingConnectionFactory.destroy()}if(n._objectAdapterFactory!==null){return n._objectAdapterFactory.destroy()}}).then(function(){if(n._outgoingConnectionFactory!==null){return n._outgoingConnectionFactory.waitUntilFinished()}}).then(function(){if(n._retryQueue){n._retryQueue.destroy()}if(n._timer){n._timer.destroy()}if(n._servantFactoryManager){n._servantFactoryManager.destroy()}if(n._routerManager){n._routerManager.destroy()}if(n._locatorManager){n._locatorManager.destroy()}if(n._endpointFactoryManager){n._endpointFactoryManager.destroy()}var e;if(n._initData.properties.getPropertyAsInt("Ice.Warn.UnusedProperties")>0){var i=n._initData.properties.getUnusedProperties();if(i.length>0){var r=[];r.push("The following properties were set but never read:");for(e=0;e Math.abs( eye.z ) ) this.activePlane = this.planes[ "XZ" ]; + + } + + if ( axis === "Y" ) { + + this.activePlane = this.planes[ "XY" ]; + + if ( Math.abs( eye.x ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "YZ" ]; + + } + + if ( axis === "Z" ) { + + this.activePlane = this.planes[ "XZ" ]; + + if ( Math.abs( eye.x ) > Math.abs( eye.y ) ) this.activePlane = this.planes[ "YZ" ]; + + } + + if ( axis === "XYZ" ) this.activePlane = this.planes[ "XYZE" ]; + + if ( axis === "XY" ) this.activePlane = this.planes[ "XY" ]; + + if ( axis === "YZ" ) this.activePlane = this.planes[ "YZ" ]; + + if ( axis === "XZ" ) this.activePlane = this.planes[ "XZ" ]; + + }; + + this.init(); + + }; + + THREE.TransformGizmoTranslate.prototype = Object.create( THREE.TransformGizmo.prototype ); + THREE.TransformGizmoTranslate.prototype.constructor = THREE.TransformGizmoTranslate; + + + THREE.JoyStickControls = function ( camera, domElement ) { + + // TODO: Make non-uniform scale and rotate play nice in hierarchies + // TODO: ADD RXYZ contol + + THREE.Object3D.call( this ); + + domElement = ( domElement !== undefined ) ? domElement : document; + + this.object = undefined; + this.visible = false; + this.snap = null; + this.space = "world"; + this.size = 1; + this.axis = null; + + var scope = this; + + var _mode = "translate"; + var _dragging = false; + var _plane = "XY"; + var _gizmo = { + + "translate": new THREE.TransformGizmoTranslate(), +// "rotate": new THREE.TransformGizmoRotate(), +// "scale": new THREE.TransformGizmoScale() + }; + + for ( var type in _gizmo ) { + + var gizmoObj = _gizmo[ type ]; + + gizmoObj.visible = ( type === _mode ); + this.add( gizmoObj ); + + } + + var changeEvent = { type: "change" }; + var mouseDownEvent = { type: "mouseDown" }; + var mouseUpEvent = { type: "mouseUp", mode: _mode }; + var objectChangeEvent = { type: "objectChange" }; + + var ray = new THREE.Raycaster(); + var pointerVector = new THREE.Vector2(); + + var point = new THREE.Vector3(); + var offset = new THREE.Vector3(); + + var rotation = new THREE.Vector3(); + var offsetRotation = new THREE.Vector3(); + var scale = 1; + + var lookAtMatrix = new THREE.Matrix4(); + var eye = new THREE.Vector3(); + + var tempMatrix = new THREE.Matrix4(); + var tempVector = new THREE.Vector3(); + var tempQuaternion = new THREE.Quaternion(); + var unitX = new THREE.Vector3( 1, 0, 0 ); + var unitY = new THREE.Vector3( 0, 1, 0 ); + var unitZ = new THREE.Vector3( 0, 0, 1 ); + + var quaternionXYZ = new THREE.Quaternion(); + var quaternionX = new THREE.Quaternion(); + var quaternionY = new THREE.Quaternion(); + var quaternionZ = new THREE.Quaternion(); + var quaternionE = new THREE.Quaternion(); + + var oldPosition = new THREE.Vector3(); + var oldScale = new THREE.Vector3(); + var oldRotationMatrix = new THREE.Matrix4(); + + var parentRotationMatrix = new THREE.Matrix4(); + var parentScale = new THREE.Vector3(); + + var worldPosition = new THREE.Vector3(); + var worldRotation = new THREE.Euler(); + var worldRotationMatrix = new THREE.Matrix4(); + var camPosition = new THREE.Vector3(); + var camRotation = new THREE.Euler(); + + + + this.attach = function ( object ) { + + this.object = object; + this.visible = true; + this.update(); + + }; + + this.detach = function () { + + this.object = undefined; + this.visible = false; + this.axis = null; + + }; + + this.setMode = function ( mode ) { + + _mode = mode ? mode : _mode; + + if ( _mode === "scale" ) scope.space = "local"; + + for ( var type in _gizmo ) _gizmo[ type ].visible = ( type === _mode ); + + this.update(); + scope.dispatchEvent( changeEvent ); + + }; + + this.setSnap = function ( snap ) { + + scope.snap = snap; + + }; + + this.setSize = function ( size ) { + + scope.size = size; + this.update(); + scope.dispatchEvent( changeEvent ); + + }; + + this.setSpace = function ( space ) { + + scope.space = space; + this.update(); + scope.dispatchEvent( changeEvent ); + + }; + + this.update = function () { + + if ( scope.object === undefined ) return; + + scope.object.updateMatrixWorld(); + worldPosition.setFromMatrixPosition( scope.object.matrixWorld ); + worldRotation.setFromRotationMatrix( tempMatrix.extractRotation( scope.object.matrixWorld ) ); + + camera.updateMatrixWorld(); + camPosition.setFromMatrixPosition( camera.matrixWorld ); + camRotation.setFromRotationMatrix( tempMatrix.extractRotation( camera.matrixWorld ) ); + + scale = worldPosition.distanceTo( camPosition ) / 6 * scope.size; + this.position.copy( worldPosition ); + this.scale.set( scale, scale, scale ); + + eye.copy( camPosition ).sub( worldPosition ).normalize(); + + if ( scope.space === "local" ) { + + _gizmo[ _mode ].update( worldRotation, eye ); + + } else if ( scope.space === "world" ) { + + _gizmo[ _mode ].update( new THREE.Euler(), eye ); + + } + + _gizmo[ _mode ].highlight( scope.axis ); + + }; + + this.onPointerHover = function ( event ) { + + if ( scope.object === undefined || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return; + + var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; + + var intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children ); + + var axis = null; + + if ( intersect ) { + + axis = intersect.object.name; + + event.preventDefault(); + + } + + if ( scope.axis !== axis ) { + + scope.axis = axis; + scope.update(); + scope.dispatchEvent( changeEvent ); + + } + + } + + this.onPointerDown = function ( event ) { + + if ( scope.object === undefined || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return; + + var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; + + if ( pointer.button === 0 || pointer.button === undefined ) { + + var intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children ); + + if ( intersect ) { + + event.preventDefault(); + event.stopPropagation(); + + scope.dispatchEvent( mouseDownEvent ); + + scope.axis = intersect.object.name; + + scope.update(); + + eye.copy( camPosition ).sub( worldPosition ).normalize(); + + _gizmo[ _mode ].setActivePlane( scope.axis, eye ); + + var planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] ); + + if ( planeIntersect ) { + + oldPosition.copy( scope.object.position ); + oldScale.copy( scope.object.scale ); + + oldRotationMatrix.extractRotation( scope.object.matrix ); + worldRotationMatrix.extractRotation( scope.object.matrixWorld ); + + parentRotationMatrix.extractRotation( scope.object.parent.matrixWorld ); + parentScale.setFromMatrixScale( tempMatrix.getInverse( scope.object.parent.matrixWorld ) ); + + offset.copy( planeIntersect.point ); + + } + + } + + } + + _dragging = true; + + + } + + this.onPointerMove = function ( event ) { + + if ( scope.object === undefined || scope.axis === null || _dragging === false || ( event.button !== undefined && event.button !== 0 ) ) return; + + var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; + + var planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] ); + + if ( planeIntersect === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + point.copy( planeIntersect.point ); + + if ( _mode === "translate" ) { + + point.sub( offset ); + point.multiply( parentScale ); + + if ( scope.space === "local" ) { + + point.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); + + if ( scope.axis.search( "X" ) === - 1 ) point.x = 0; + if ( scope.axis.search( "Y" ) === - 1 ) point.y = 0; + if ( scope.axis.search( "Z" ) === - 1 ) point.z = 0; + + point.applyMatrix4( oldRotationMatrix ); + + scope.object.position.copy( oldPosition ); + scope.object.position.add( point ); + + } + + if ( scope.space === "world" || scope.axis.search( "XYZ" ) !== - 1 ) { + + if ( scope.axis.search( "X" ) === - 1 ) point.x = 0; + if ( scope.axis.search( "Y" ) === - 1 ) point.y = 0; + if ( scope.axis.search( "Z" ) === - 1 ) point.z = 0; + + point.applyMatrix4( tempMatrix.getInverse( parentRotationMatrix ) ); + + scope.object.position.copy( oldPosition ); + scope.object.position.add( point ); + + } + + if ( scope.snap !== null ) { + + if ( scope.axis.search( "X" ) !== - 1 ) scope.object.position.x = Math.round( scope.object.position.x / scope.snap ) * scope.snap; + if ( scope.axis.search( "Y" ) !== - 1 ) scope.object.position.y = Math.round( scope.object.position.y / scope.snap ) * scope.snap; + if ( scope.axis.search( "Z" ) !== - 1 ) scope.object.position.z = Math.round( scope.object.position.z / scope.snap ) * scope.snap; + + } + + } + + scope.update(); + scope.dispatchEvent( changeEvent ); + scope.dispatchEvent( objectChangeEvent ); + + } + + this.onPointerUp= function ( event ) { + + if ( event.button !== undefined && event.button !== 0 ) return; + + if ( _dragging && ( scope.axis !== null ) ) { + + mouseUpEvent.mode = _mode; + scope.dispatchEvent( mouseUpEvent ) + + } + + _dragging = false; + scope.onPointerHover( event ); + + }; + + function intersectObjects( pointer, objects ) { + + var rect = domElement.getBoundingClientRect(); + var x = ( pointer.clientX - rect.left ) / rect.width; + var y = ( pointer.clientY - rect.top ) / rect.height; + + pointerVector.set( ( x * 2 ) - 1, - ( y * 2 ) + 1 ); + ray.setFromCamera( pointerVector, camera ); + + var intersections = ray.intersectObjects( objects, true ); + return intersections[ 0 ] ? intersections[ 0 ] : false; + + } + + domElement.addEventListener( "mousedown", this.onPointerDown, false ); + domElement.addEventListener( "touchstart", this.onPointerDown, false ); + + domElement.addEventListener( "mousemove", this.onPointerHover, false ); + domElement.addEventListener( "touchmove", this.onPointerHover, false ); + + domElement.addEventListener( "mousemove",this.onPointerMove, false ); + domElement.addEventListener( "touchmove", this.onPointerMove, false ); + + domElement.addEventListener( "mouseup", this.onPointerUp, false ); + domElement.addEventListener( "mouseout", this.onPointerUp, false ); + domElement.addEventListener( "touchend", this.onPointerUp, false ); + domElement.addEventListener( "touchcancel", this.onPointerUp, false ); + domElement.addEventListener( "touchleave", this.onPointerUp, false ); + + this.dispose = function () { + + domElement.removeEventListener( "mousedown", this.onPointerDown ); + domElement.removeEventListener( "touchstart", this.onPointerDown ); + + domElement.removeEventListener( "mousemove", this.onPointerHover ); + domElement.removeEventListener( "touchmove", this.onPointerHover ); + + domElement.removeEventListener( "mousemove", this.onPointerMove ); + domElement.removeEventListener( "touchmove", this.onPointerMove ); + + domElement.removeEventListener( "mouseup", this.onPointerUp ); + domElement.removeEventListener( "mouseout", this.onPointerUp ); + domElement.removeEventListener( "touchend", this.onPointerUp ); + domElement.removeEventListener( "touchcancel", this.onPointerUp ); + domElement.removeEventListener( "touchleave", this.onPointerUp ); + + }; + + + }; + + THREE.JoyStickControls.prototype = Object.create( THREE.Object3D.prototype ); + THREE.JoyStickControls.prototype.constructor = THREE.JoyStickControls; + +}() ); diff --git a/src/tools/TurtlebotViewer-web/public/js/TrackballControls.js b/src/tools/TurtlebotViewer-web/public/js/TrackballControls.js new file mode 100644 index 000000000..ba95438c0 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/js/TrackballControls.js @@ -0,0 +1,634 @@ +/** + * @author Eberhard Graether / http://egraether.com/ + * @author Mark Lundin / http://mark-lundin.com + * @author Simone Manini / http://daron1337.github.io + * @author Luca Antiga / http://lantiga.github.io + */ + +THREE.TrackballControls = function ( object, domElement ) { + + var _this = this; + var STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 }; + + this.object = object; + this.domElement = ( domElement !== undefined ) ? domElement : document; + + // API + + this.enabled = true; + + this.screen = { left: 0, top: 0, width: 0, height: 0 }; + + this.rotateSpeed = 1.0; + this.zoomSpeed = 1.2; + this.panSpeed = 0.3; + + this.noRotate = false; + this.noZoom = false; + this.noPan = false; + + this.staticMoving = false; + this.dynamicDampingFactor = 0.2; + + this.minDistance = 0; + this.maxDistance = Infinity; + + this.keys = [ 65 /*A*/, 83 /*S*/, 68 /*D*/ ]; + + // internals + + this.target = new THREE.Vector3(); + + var EPS = 0.000001; + + var lastPosition = new THREE.Vector3(); + + var _state = STATE.NONE, + _prevState = STATE.NONE, + + _eye = new THREE.Vector3(), + + _movePrev = new THREE.Vector2(), + _moveCurr = new THREE.Vector2(), + + _lastAxis = new THREE.Vector3(), + _lastAngle = 0, + + _zoomStart = new THREE.Vector2(), + _zoomEnd = new THREE.Vector2(), + + _touchZoomDistanceStart = 0, + _touchZoomDistanceEnd = 0, + + _panStart = new THREE.Vector2(), + _panEnd = new THREE.Vector2(); + + // for reset + + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.up0 = this.object.up.clone(); + + // events + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + + // methods + + this.handleResize = function () { + + if ( this.domElement === document ) { + + this.screen.left = 0; + this.screen.top = 0; + this.screen.width = window.innerWidth; + this.screen.height = window.innerHeight; + + } else { + + var box = this.domElement.getBoundingClientRect(); + // adjustments come from similar code in the jquery offset() function + var d = this.domElement.ownerDocument.documentElement; + this.screen.left = box.left + window.pageXOffset - d.clientLeft; + this.screen.top = box.top + window.pageYOffset - d.clientTop; + this.screen.width = box.width; + this.screen.height = box.height; + + } + + }; + + this.handleEvent = function ( event ) { + + if ( typeof this[ event.type ] == 'function' ) { + + this[ event.type ]( event ); + + } + + }; + + var getMouseOnScreen = ( function () { + + var vector = new THREE.Vector2(); + + return function getMouseOnScreen( pageX, pageY ) { + + vector.set( + ( pageX - _this.screen.left ) / _this.screen.width, + ( pageY - _this.screen.top ) / _this.screen.height + ); + + return vector; + + }; + + }() ); + + var getMouseOnCircle = ( function () { + + var vector = new THREE.Vector2(); + + return function getMouseOnCircle( pageX, pageY ) { + + vector.set( + ( ( pageX - _this.screen.width * 0.5 - _this.screen.left ) / ( _this.screen.width * 0.5 ) ), + ( ( _this.screen.height + 2 * ( _this.screen.top - pageY ) ) / _this.screen.width ) // screen.width intentional + ); + + return vector; + + }; + + }() ); + + this.rotateCamera = ( function() { + + var axis = new THREE.Vector3(), + quaternion = new THREE.Quaternion(), + eyeDirection = new THREE.Vector3(), + objectUpDirection = new THREE.Vector3(), + objectSidewaysDirection = new THREE.Vector3(), + moveDirection = new THREE.Vector3(), + angle; + + return function rotateCamera() { + + moveDirection.set( _moveCurr.x - _movePrev.x, _moveCurr.y - _movePrev.y, 0 ); + angle = moveDirection.length(); + + if ( angle ) { + + _eye.copy( _this.object.position ).sub( _this.target ); + + eyeDirection.copy( _eye ).normalize(); + objectUpDirection.copy( _this.object.up ).normalize(); + objectSidewaysDirection.crossVectors( objectUpDirection, eyeDirection ).normalize(); + + objectUpDirection.setLength( _moveCurr.y - _movePrev.y ); + objectSidewaysDirection.setLength( _moveCurr.x - _movePrev.x ); + + moveDirection.copy( objectUpDirection.add( objectSidewaysDirection ) ); + + axis.crossVectors( moveDirection, _eye ).normalize(); + + angle *= _this.rotateSpeed; + quaternion.setFromAxisAngle( axis, angle ); + + _eye.applyQuaternion( quaternion ); + _this.object.up.applyQuaternion( quaternion ); + + _lastAxis.copy( axis ); + _lastAngle = angle; + + } else if ( ! _this.staticMoving && _lastAngle ) { + + _lastAngle *= Math.sqrt( 1.0 - _this.dynamicDampingFactor ); + _eye.copy( _this.object.position ).sub( _this.target ); + quaternion.setFromAxisAngle( _lastAxis, _lastAngle ); + _eye.applyQuaternion( quaternion ); + _this.object.up.applyQuaternion( quaternion ); + + } + + _movePrev.copy( _moveCurr ); + + }; + + }() ); + + + this.zoomCamera = function () { + + var factor; + + if ( _state === STATE.TOUCH_ZOOM_PAN ) { + + factor = _touchZoomDistanceStart / _touchZoomDistanceEnd; + _touchZoomDistanceStart = _touchZoomDistanceEnd; + _eye.multiplyScalar( factor ); + + } else { + + factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed; + + if ( factor !== 1.0 && factor > 0.0 ) { + + _eye.multiplyScalar( factor ); + + if ( _this.staticMoving ) { + + _zoomStart.copy( _zoomEnd ); + + } else { + + _zoomStart.y += ( _zoomEnd.y - _zoomStart.y ) * this.dynamicDampingFactor; + + } + + } + + } + + }; + + this.panCamera = ( function() { + + var mouseChange = new THREE.Vector2(), + objectUp = new THREE.Vector3(), + pan = new THREE.Vector3(); + + return function panCamera() { + + mouseChange.copy( _panEnd ).sub( _panStart ); + + if ( mouseChange.lengthSq() ) { + + mouseChange.multiplyScalar( _eye.length() * _this.panSpeed ); + + pan.copy( _eye ).cross( _this.object.up ).setLength( mouseChange.x ); + pan.add( objectUp.copy( _this.object.up ).setLength( mouseChange.y ) ); + + _this.object.position.add( pan ); + _this.target.add( pan ); + + if ( _this.staticMoving ) { + + _panStart.copy( _panEnd ); + + } else { + + _panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) ); + + } + + } + + }; + + }() ); + + this.checkDistances = function () { + + if ( ! _this.noZoom || ! _this.noPan ) { + + if ( _eye.lengthSq() > _this.maxDistance * _this.maxDistance ) { + + _this.object.position.addVectors( _this.target, _eye.setLength( _this.maxDistance ) ); + _zoomStart.copy( _zoomEnd ); + + } + + if ( _eye.lengthSq() < _this.minDistance * _this.minDistance ) { + + _this.object.position.addVectors( _this.target, _eye.setLength( _this.minDistance ) ); + _zoomStart.copy( _zoomEnd ); + + } + + } + + }; + + this.update = function () { + + _eye.subVectors( _this.object.position, _this.target ); + + if ( ! _this.noRotate ) { + + _this.rotateCamera(); + + } + + if ( ! _this.noZoom ) { + + _this.zoomCamera(); + + } + + if ( ! _this.noPan ) { + + _this.panCamera(); + + } + + _this.object.position.addVectors( _this.target, _eye ); + + _this.checkDistances(); + + _this.object.lookAt( _this.target ); + + if ( lastPosition.distanceToSquared( _this.object.position ) > EPS ) { + + _this.dispatchEvent( changeEvent ); + + lastPosition.copy( _this.object.position ); + + } + + }; + + this.reset = function () { + + _state = STATE.NONE; + _prevState = STATE.NONE; + + _this.target.copy( _this.target0 ); + _this.object.position.copy( _this.position0 ); + _this.object.up.copy( _this.up0 ); + + _eye.subVectors( _this.object.position, _this.target ); + + _this.object.lookAt( _this.target ); + + _this.dispatchEvent( changeEvent ); + + lastPosition.copy( _this.object.position ); + + }; + + // listeners + + function keydown( event ) { + + if ( _this.enabled === false ) return; + + window.removeEventListener( 'keydown', keydown ); + + _prevState = _state; + + if ( _state !== STATE.NONE ) { + + return; + + } else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && ! _this.noRotate ) { + + _state = STATE.ROTATE; + + } else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && ! _this.noZoom ) { + + _state = STATE.ZOOM; + + } else if ( event.keyCode === _this.keys[ STATE.PAN ] && ! _this.noPan ) { + + _state = STATE.PAN; + + } + + } + + function keyup( event ) { + + if ( _this.enabled === false ) return; + + _state = _prevState; + + window.addEventListener( 'keydown', keydown, false ); + + } + + function mousedown( event ) { + + if ( _this.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + if ( _state === STATE.NONE ) { + + _state = event.button; + + } + + if ( _state === STATE.ROTATE && ! _this.noRotate ) { + + _moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) ); + _movePrev.copy( _moveCurr ); + + } else if ( _state === STATE.ZOOM && ! _this.noZoom ) { + + _zoomStart.copy( getMouseOnScreen( event.pageX, event.pageY ) ); + _zoomEnd.copy( _zoomStart ); + + } else if ( _state === STATE.PAN && ! _this.noPan ) { + + _panStart.copy( getMouseOnScreen( event.pageX, event.pageY ) ); + _panEnd.copy( _panStart ); + + } + + document.addEventListener( 'mousemove', mousemove, false ); + document.addEventListener( 'mouseup', mouseup, false ); + + _this.dispatchEvent( startEvent ); + + } + + function mousemove( event ) { + + if ( _this.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + if ( _state === STATE.ROTATE && ! _this.noRotate ) { + + _movePrev.copy( _moveCurr ); + _moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) ); + + } else if ( _state === STATE.ZOOM && ! _this.noZoom ) { + + _zoomEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) ); + + } else if ( _state === STATE.PAN && ! _this.noPan ) { + + _panEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) ); + + } + + } + + function mouseup( event ) { + + if ( _this.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + _state = STATE.NONE; + + document.removeEventListener( 'mousemove', mousemove ); + document.removeEventListener( 'mouseup', mouseup ); + _this.dispatchEvent( endEvent ); + + } + + function mousewheel( event ) { + + if ( _this.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + var delta = 0; + + if ( event.wheelDelta ) { + + // WebKit / Opera / Explorer 9 + + delta = event.wheelDelta / 40; + + } else if ( event.detail ) { + + // Firefox + + delta = - event.detail / 3; + + } + + _zoomStart.y += delta * 0.01; + _this.dispatchEvent( startEvent ); + _this.dispatchEvent( endEvent ); + + } + + function touchstart( event ) { + + if ( _this.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: + _state = STATE.TOUCH_ROTATE; + _moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) ); + _movePrev.copy( _moveCurr ); + break; + + case 2: + _state = STATE.TOUCH_ZOOM_PAN; + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + _touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy ); + + var x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2; + var y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2; + _panStart.copy( getMouseOnScreen( x, y ) ); + _panEnd.copy( _panStart ); + break; + + default: + _state = STATE.NONE; + + } + _this.dispatchEvent( startEvent ); + + + } + + function touchmove( event ) { + + if ( _this.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: + _movePrev.copy( _moveCurr ); + _moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) ); + break; + + case 2: + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + _touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy ); + + var x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2; + var y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2; + _panEnd.copy( getMouseOnScreen( x, y ) ); + break; + + default: + _state = STATE.NONE; + + } + + } + + function touchend( event ) { + + if ( _this.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: + _movePrev.copy( _moveCurr ); + _moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) ); + break; + + case 2: + _touchZoomDistanceStart = _touchZoomDistanceEnd = 0; + + var x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2; + var y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2; + _panEnd.copy( getMouseOnScreen( x, y ) ); + _panStart.copy( _panEnd ); + break; + + } + + _state = STATE.NONE; + _this.dispatchEvent( endEvent ); + + } + + function contextmenu( event ) { + + event.preventDefault(); + + } + + this.dispose = function() { + + this.domElement.removeEventListener( 'contextmenu', contextmenu, false ); + this.domElement.removeEventListener( 'mousedown', mousedown, false ); + this.domElement.removeEventListener( 'mousewheel', mousewheel, false ); + this.domElement.removeEventListener( 'DOMMouseScroll', mousewheel, false ); // firefox + + this.domElement.removeEventListener( 'touchstart', touchstart, false ); + this.domElement.removeEventListener( 'touchend', touchend, false ); + this.domElement.removeEventListener( 'touchmove', touchmove, false ); + + document.removeEventListener( 'mousemove', mousemove, false ); + document.removeEventListener( 'mouseup', mouseup, false ); + + window.removeEventListener( 'keydown', keydown, false ); + window.removeEventListener( 'keyup', keyup, false ); + + } + + this.domElement.addEventListener( 'contextmenu', contextmenu, false ); + this.domElement.addEventListener( 'mousedown', mousedown, false ); + this.domElement.addEventListener( 'mousewheel', mousewheel, false ); + this.domElement.addEventListener( 'DOMMouseScroll', mousewheel, false ); // firefox + + this.domElement.addEventListener( 'touchstart', touchstart, false ); + this.domElement.addEventListener( 'touchend', touchend, false ); + this.domElement.addEventListener( 'touchmove', touchmove, false ); + + window.addEventListener( 'keydown', keydown, false ); + window.addEventListener( 'keyup', keyup, false ); + + this.handleResize(); + + // force an update at start + this.update(); + +}; + +THREE.TrackballControls.prototype = Object.create( THREE.EventDispatcher.prototype ); +THREE.TrackballControls.prototype.constructor = THREE.TrackballControls; diff --git a/src/tools/TurtlebotViewer-web/public/js/api.js b/src/tools/TurtlebotViewer-web/public/js/api.js new file mode 100644 index 000000000..6fe4b05e9 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/js/api.js @@ -0,0 +1,543 @@ +var API = API || {}; + +/* + * API.Camera's Constructor. + * Params: + * - config (contents client's Config)={server,id,epname,fpsid,imgFormat}: + * + id (canvas' id to show RGB camera) + * + fpsid (id of element to show fps, is optional) + * + server (server's direction and port)={dir:direction,port: port} + * + epname (name of camera endpoint, default cameraA) + * + imgFormat (format of image that is going to request to the server, default RGB8) + */ +API.Camera = function (config) { + var conf = config || {}; + + + this.workerFile = "js/api_workers/camera_worker.js"; + this.w = undefined; + this.onmessage = undefined; + this.isRunning = false; + + + this.conPromise = undefined; + + this.description = undefined; + this.data = undefined; + + this.imgFormat = conf.imgFormat || "RGB8"; + this.epname = conf.epname || "cameraA"; + this.server = conf.server; + + this.toError = undefined; // connection error message timeout + this.timeoutE = 3000; + + + + var self = this; + + + this.createWork = function () { + this.w = new Worker(this.workerFile); + this.w.onerror = function (err) { + console.log ("worker error: "+ err.message); + }; + }; + + this.deleteWork = function () { + if (this.w){ + this.w.terminate(); + this.w = undefined; + } + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + this.connect = function () { + this.conPromise = new Promise( + // The resolver function is called with the ability to resolve or + // reject the promise + function(resolve, reject) { + self.w.onmessage = function(mes) { + if (mes.data){ + self.isRunning = true; + resolve(); + }else{ + self.isRunning = false; + reject(); + } + }; + self.w.postMessage({func:"connect",serv:self.server,epname: self.epname}); + }); + }; + + this.disconnect = function (){ + this.w.postMessage({func:"disconnect"}); + this.isRunning = false; + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + this.startStreaming = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func:"startImageStream", imgFormat: self.imgFormat}); + self.toError=setTimeout(self.conErr, self.timeoutE); + }); + }; + + this.getImage = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func:"getImage", imgFormat: self.imgFormat}); + }); + }; + + this.stopStreaming = function(){ + this.conPromise.then( + function() { + self.w.postMessage({func:"stopImageStream"}); + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }); + }; + + this.getDescription = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func:"getCameraDescription"}); + }); + }; + + this.onmessageDefault = function(event) { + if (self.toError){ + clearTimeout(self.toError); + self.toError=setTimeout(self.conErr, self.timeoutE+10); + } + self.data=event.data.img; + self.description=event.data.desc || self.description; + if (event.data.delay){ + var tt = new Date().getTime(); + self.delay = event.data.delay; + self.delay.worker = tt - event.data.delay._ctime; + } + }; + + /* + * conErr + * Displays an error message and closes the webworker + */ + this.conErr=function(){ + alert ("connection to server "+self.epname+" "+self.server.dir+":"+self.server.port+" failed"); + self.deleteWork(); + }; + + this.createWork(); + +}; + +/* + * API.Motors's Constructor. + * Params: + * - config (contents client's Config)={server,epname,onmessage}: + * + server (server's direction and port)={dir:direction,port: port} + * + epname (name of motor endpoint, default Motors) + */ +API.Motors = function (config){ + var conf = config || {}; + + this.id = conf.id; + + this.workerFile = "js/api_workers/motors_worker.js"; + this.w = undefined; + this.onmessage = undefined; + this.isRunning = false; + + this.conPromise = undefined; + + this.data=undefined; + + this.epname = conf.epname || "Motors"; + this.server = conf.server; + + var self = this; + + + this.createWork = function(){ + this.w = new Worker(this.workerFile); + this.w.onerror = function (err){ + console.log ("worker error: "+ err.message); + }; + }; + + this.deleteWork = function (){ + if (this.w){ + this.w.terminate(); + this.w = undefined; + } + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + this.connect = function (){ + this.conPromise = new Promise( + // The resolver function is called with the ability to resolve or + // reject the promise + function(resolve, reject) { + self.w.onmessage = function(mes){ + if (mes.data){ + self.isRunning = true; + resolve(); + }else{ + self.isRunning = false; + reject(); + } + }; + self.w.postMessage({func:"connect",serv:self.server,epname: self.epname}); + }); + + }; + + this.disconnect = function (){ + this.w.postMessage({func:"disconnect"}); + this.isRunning = false; + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + + + this.getAll = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func: "getAll"}); + }); + }; + + this.getV = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func: "getV"}); + }); + }; + + this.getW = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func: "getW"}); + }); + }; + + this.getL = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func: "getL"}); + }); + }; + + this.setAll = function(v,w,l){ + this.conPromise.then( + function() { + var data = {v:v,w:w,l:l}; + self.w.postMessage({func: "setAll", data: data}); + }); + }; + + this.setV = function(v){ + this.conPromise.then( + function() { + self.w.postMessage({func: "setV", data: v}); + }); + }; + + this.setW = function(w){ + this.conPromise.then( + function() { + self.w.postMessage({func: "setW", data: w}); + }); + }; + + this.setL = function(l){ + this.conPromise.then( + function() { + self.w.postMessage({func: "setL", data: l}); + }); + }; + + + this.onmessageDefault = function(event) { + self.data=event.data; + }; + + this.createWork(); +}; + +/* + * API.Pose3D's Constructor. + * Params: + * - config (contents client's Config)={server,id,epname}: + * + server (server's direction and port)={dir:direction,port: port} + * + epname (name of pose3d endpoint, default Pose3D) + */ +API.Pose3D= function (config){ + var conf = config || {}; + + this.workerFile = "js/api_workers/pose3d_worker.js"; + this.w = undefined; + this.onmessage = undefined; + this.isRunning = false; + + this.conPromise = undefined; + + this.data = undefined; + this.update = false; + + this.epname = conf.epname || "Pose3D"; + this.server = conf.server; + + this.toError = undefined; // connection error message timeout + this.timeoutE = 3000; + + var self = this; + + + this.createWork = function(){ + this.w = new Worker(this.workerFile); + this.w.onerror = function (err){ + console.log ("worker error: "+ err.message); + }; + }; + + this.deleteWork = function (){ + if (this.w){ + this.w.terminate(); + this.w = undefined; + } + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + this.connect = function (){ + this.conPromise = new Promise( + // The resolver function is called with the ability to resolve or + // reject the promise + function(resolve, reject) { + self.w.onmessage = function(mes){ + if (mes.data){ + self.isRunning = true; + resolve(); + }else{ + self.isRunning = false; + reject(); + } + }; + self.w.postMessage({func:"connect",serv:self.server,epname: self.epname}); + }); + }; + + this.disconnect = function (){ + this.w.postMessage({func:"disconnect"}); + this.isRunning = false; + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + this.getPose3D = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func:"getPose3D"}); + }); + }; + + this.startStreaming = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func:"startPose3DStream"}); + self.toError=setTimeout(self.conErr, self.timeoutE); + }); + }; + + this.stopStreaming = function(){ + this.conPromise.then( + function() { + self.w.postMessage({func:"stopPose3DStream"}); + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }); + }; + + + this.onmessageDefault = function(event) { + if (self.toError){ + clearTimeout(this.toError); + self.toError=setTimeout(self.conErr, self.timeoutE); + } + var respwork=event.data; + self.data= respwork; + }; + /* + * conErr + * Displays an error message and closes the webworker + */ + this.conErr=function(){ + alert ("connection to server "+self.epname+" "+self.server.dir+":"+self.server.port+" failed"); + self.deleteWork(); + }; + + this.createWork(); +}; + +/* + * API.Laser's Constructor. + * Params: + * - config (contents client's Config)={server,id,epname}: + * + server (server's direction and port)={dir:direction,port: port} + * + epname (name of laser endpoint, default Laser) + * + convertUpAxis (height is represented in Y instead of Z in 3d) + * + scale3d (scale of laser 3d representation ) + * + canv2dWidth (canvas' width to show laser in 2D, default 360 ) + */ +API.Laser= function (config){ + var conf = config || {}; + + this.workerFile = "js/api_workers/laser_worker.js"; + this.w = undefined; + this.onmessage = undefined; + this.isRunning = false; + + this.conPromise = undefined; + + this.data = undefined; + this.update = false; + + this.epname = conf.epname || "Laser"; + this.server = conf.server; + this.canv2dWidth = conf.canv2dWidth || 360; + this.scale3d = conf.scale3d || 1; + this.convertUpAxis = conf.convertUpAxis || false; + + this.toError = undefined; // connection error message timeout + this.timeoutE = 3000; + + var self = this; + + + this.createWork = function(){ + this.w = new Worker(this.workerFile); + this.w.onerror = function (err){ + console.log ("worker error: "+ err.message); + }; + }; + + this.deleteWork = function (){ + if (this.w){ + this.w.terminate(); + this.w = undefined; + } + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + this.connect = function (){ + this.conPromise = new Promise( + // The resolver function is called with the ability to resolve or + // reject the promise + function(resolve, reject) { + self.w.onmessage = function(mes){ + if (mes.data){ + self.isRunning = true; + resolve(); + }else{ + self.isRunning = false; + reject(); + } + }; + self.w.postMessage({func:"connect",serv:self.server,epname: self.epname}); + }); + }; + + this.disconnect = function (){ + this.w.postMessage({func:"disconnect"}); + this.isRunning = false; + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }; + + this.getLaser = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func:"getLaser",convertUpAxis:self.convertUpAxis,canv2dWidth:self.canv2dWidth, scale3d: self.scale3d, height3d: self.height3d}); + }); + }; + + this.startStreaming = function(){ + this.conPromise.then( + function() { + self.w.onmessage = self.onmessage || self.onmessageDefault; + self.w.postMessage({func:"startLaserStream",convertUpAxis:self.convertUpAxis,canv2dWidth:self.canv2dWidth, scale3d: self.scale3d , height3d: self.height3d}); + self.toError=setTimeout(self.conErr, self.timeoutE); + }); + }; + + this.stopStreaming = function(){ + this.conPromise.then( + function() { + self.w.postMessage({func:"stopLaserStream"}); + if(self.toError){ + clearTimeout(self.toError); + toError=undefined; + } + }); + }; + + + this.onmessageDefault = function(event) { + if (self.toError){ + clearTimeout(this.toError); + self.toError=setTimeout(self.conErr, self.timeoutE); + } + var respwork=event.data; + self.data= respwork; + }; + /* + * conErr + * Displays an error message and closes the webworker + */ + this.conErr=function(){ + alert ("connection to server "+self.epname+" "+self.server.dir+":"+self.server.port+" failed"); + // self.deleteWork(); + }; + + this.createWork(); + +}; diff --git a/src/tools/TurtlebotViewer-web/public/js/api_workers/camera_worker.js b/src/tools/TurtlebotViewer-web/public/js/api_workers/camera_worker.js new file mode 100644 index 000000000..5aea7ffb3 --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/js/api_workers/camera_worker.js @@ -0,0 +1,195 @@ +// variables to make believe to ICE that is in the main thread +var window=self; +var global=self; + +// importing required files +importScripts('../Ice.min.js'); +importScripts('../jderobot/datetime.js'); +importScripts('../jderobot/exceptions.js'); +importScripts('../jderobot/containers.js'); +importScripts('../jderobot/common.js'); +importScripts('../jderobot/image.js'); +importScripts('../jderobot/camera.js'); + + +// variables related to the configuration and connection of ICE +var id = new Ice.InitializationData(); +var communicator; + +var Promise; +var Prx = jderobot.CameraPrx; +var stream = false; +var srv; + +var oldFrameTime = undefined; +var frameCount = 0; + +var description = undefined; +var img = undefined; + +function calculateFPS(){ + var fps = undefined; + var d = new Date(); + var currentFrameTime = d.getTime(); + var diff = (currentFrameTime - oldFrameTime); + if (diff < 1000){ + frameCount+=1; + }else{ + oldFrameTime = currentFrameTime; + fps = frameCount*1000.0/diff; + frameCount=0; + } + return fps; + } + +function calculateDelay(time) { + var d = new Date(); + var currentTime = d.getTime(); + return currentTime - time; + +} + +var procesar = []; + +procesar["RGB8"] = function (pixelData, width, height){ + // Once received the image (RGB), I adapt it to the format that canvas needs (RGBA) + var imgData=new Uint8Array(4*width*height); + var j=0; + var length = imgData.length; + + for (var i=0;i=1.0){ + rotateY=math.PI/2.0; + } else if(rotateYa0<=-1.0){ + rotateY=-Math.PI/2.0 + } else { + rotateY=Math.asin(rotateYa0) + } + + return rotateY; +} + +function connect (config){ + + id.properties = Ice.createProperties(); + //id.properties.setProperty("Ice.Trace.Network", "3"); + //id.properties.setProperty("Ice.Trace.Protocol", "1"); + communicator = Ice.initialize(id); + + + // Create the proxy to connect + var proxy = communicator.stringToProxy(config.epname+":ws -h " + config.server.dir + " -p " + config.server.port); + // connects to the proxy and asks the image + Promise = Prx.checkedCast(proxy).then( + function(ar){ + console.log("Pose3D connected: " + ar); + srv = ar; + + postMessage(true); + }, + function(ex, ar){ + console.log("Pose3D NOT connected: " + ex); + postMessage(false); + }); +} + + +function getPose3D(){ + srv.getPose3DData().then(function (data){ + var response={}; + response.x=data.x; + response.y=data.y; + response.z=data.z; + response.q0=data.q0; + response.q1=data.q1; + response.q2=data.q2; + response.q3=data.q3; + response.yaw=getYaw(data.q0,data.q1,data.q2,data.q3); + response.pitch=getPitch(data.q0,data.q1,data.q2,data.q3); + response.roll=getRoll(data.q0,data.q1,data.q2,data.q3); + postMessage(response); + if (stream){ + getPose3D(); + } + + },function(err){console.log(err);}); +} + + +onmessage = function(e) { + var config={}; + // Collects the data provided by the main thread and initialized ICE + config.server = e.data.serv; + config.epname = e.data.epname; + + switch (e.data.func){ + case "getPose3D": + getPose3D(); + break; + case "setPose3D": + //setPose3D(config); + break; + case "startPose3DStream": + stream = true; + getPose3D(); + break; + case "stopPose3DStream": + stream = false; + break; + case "connect": + connect(config); + break; + case "disconnect": + srv = undefined; + break; + default: + + } +} diff --git a/src/tools/TurtlebotViewer-web/public/js/bootstrap-toggle.min.js b/src/tools/TurtlebotViewer-web/public/js/bootstrap-toggle.min.js new file mode 100644 index 000000000..37113200b --- /dev/null +++ b/src/tools/TurtlebotViewer-web/public/js/bootstrap-toggle.min.js @@ -0,0 +1,9 @@ +/*! ======================================================================== + * Bootstrap Toggle: bootstrap-toggle.js v2.2.0 + * http://www.bootstraptoggle.com + * ======================================================================== + * Copyright 2014 Min Hur, The New York Times Company + * Licensed under MIT + * ======================================================================== */ ++function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('