Commit Graph

413 Commits

Author SHA1 Message Date
Josh de Leeuw
b09384929f add setProgressBar #325 2017-06-01 15:37:43 -04:00
Josh de Leeuw
f6adf2f8af adjust #384 style 2017-05-30 10:01:36 -04:00
Josh de Leeuw
934f394de0 first pass at #384 2017-05-27 18:09:28 -04:00
Josh de Leeuw
d287f7a4d3 fixes #343 2017-05-25 11:17:56 -04:00
Josh de Leeuw
6b53fced9d reset variables when timeline loops #343 2017-05-25 10:51:08 -04:00
Josh de Leeuw
a0ecd6dc23 only preload unique files; fixes #377 2017-05-25 10:40:59 -04:00
Josh de Leeuw
41f6f4d8ed fix .unique bug 2017-05-25 10:38:55 -04:00
Josh de Leeuw
25b4f28f40 move utility functions to .utils module for better testing 2017-05-25 10:33:23 -04:00
Josh de Leeuw
6dc62aec0e remove fullscreen from jsPsych.init #380 2017-05-24 22:18:16 -04:00
Josh de Leeuw
5ad4e4c9a4 implement #349 2017-03-19 16:38:59 -04:00
Josh de Leeuw
f941731a5b #334 add data collection method .uniqueNames 2017-02-04 16:05:22 -05:00
Josh de Leeuw
065fd8d4b0 change jsPsych.data.getData() to jsPsych.data.get() 2017-02-02 16:47:35 -05:00
Josh de Leeuw
12043f2ffc Merge pull request #289 from rivasd/parallelport
Changes for supporting parallel port triggers with our Chrome extension
2017-01-18 12:55:52 -05:00
Josh de Leeuw
ba356b6588 change execution order of finishExperiment 2017-01-17 15:07:23 -05:00
Rob Wilkinson
15016febc6 cleaned up console logs 2017-01-13 17:49:27 -08:00
Xiaolu Bai
467dcb0460 bugfix_multiple_choice_module 2017-01-13 01:57:04 -08:00
Josh de Leeuw
f40214066b pretty print json; fix #318; adjust timelineVaribale to return function by default 2017-01-12 14:43:38 -05:00
Josh de Leeuw
accc619352 trial finish events get passed a modifiable copy of the raw data object 2017-01-09 11:30:23 -05:00
Josh de Leeuw
4fc383cab1 manual preloading from init method 2017-01-04 15:25:01 -05:00
Josh de Leeuw
354ff1dc94 add DataCollection.first and .last 2016-12-31 14:39:53 -05:00
Josh de Leeuw
e821ae6bb0 add DataColumn.all 2016-12-31 14:19:51 -05:00
Josh de Leeuw
7a966c2248 add ConvertKeyCodeToKeyCharacter, variance, min, max 2016-12-22 17:00:48 -05:00
Josh de Leeuw
658b1db363 implement pluginapi tests 2016-12-20 13:21:13 -05:00
Josh de Leeuw
72deca2348 centralize keyboard listeners for better held_key detection 2016-12-20 11:28:24 -05:00
Josh de Leeuw
f7b917adaa replace .which with .keyCode 2016-12-20 10:38:20 -05:00
Josh de Leeuw
2d46484365 fixes audio load bug #308 2016-12-20 09:24:53 -05:00
Josh de Leeuw
db8730d4b3 testing and fixing data module 2016-12-18 11:31:35 -05:00
Josh de Leeuw
347c7d0a66 fix DataCollection bugs 2016-12-17 15:40:19 -05:00
Josh de Leeuw
979ee70d58 fix addToAll, test it 2016-12-16 14:00:15 -05:00
Josh de Leeuw
66fea32f5b don't reset data properties 2016-12-16 13:33:19 -05:00
Josh de Leeuw
099c1da963 remove ref to ignored data 2016-12-16 11:26:00 -05:00
Josh de Leeuw
05b255dc5c reset data storage if .init() is called. 2016-12-16 11:10:48 -05:00
Josh de Leeuw
d7d6d5b971 test addProperties 2016-12-16 11:05:47 -05:00
Josh de Leeuw
f125065451 fix ^ -> Math.pow() 2016-12-15 22:18:22 -05:00
Josh de Leeuw
788ea0833b fix sqrt() 2016-12-15 22:08:43 -05:00
Josh de Leeuw
30a7401e92 missing .length 2016-12-15 21:59:29 -05:00
Josh de Leeuw
c8ff0ad884 bug 2016-12-15 21:56:56 -05:00
Josh de Leeuw
c1fbe542df datacollection tests 2016-12-15 21:53:52 -05:00
Josh de Leeuw
7806cd14e6 More changes to how data is handled... 2016-12-15 21:38:22 -05:00
Josh de Leeuw
22cc5bf878 DataCollection and DataColumn, breaks code for now. 2016-12-15 15:13:18 -05:00
Josh de Leeuw
41cd3e87a7 don't remove DOM element when adding progress bar! 2016-12-15 11:29:23 -05:00
Josh de Leeuw
4e95436a58 changes default_iti #312 2016-12-14 13:53:39 -05:00
Josh de Leeuw
1c60540396 html5 fallback for webaudio #311 2016-12-14 12:16:07 -05:00
Josh de Leeuw
df49035118 first jest test runs! 2016-12-09 21:25:56 -05:00
Josh de Leeuw
7b099b39ee demo rt experiment seems to work... 2016-11-25 15:22:16 -05:00
Josh de Leeuw
2f6db7a603 no refs to jquery in main library 2016-11-24 01:12:39 -05:00
Josh de Leeuw
920e4fd5e0 removing some $ 2016-11-23 12:42:29 -05:00
Josh de Leeuw
5048bca4cb starting to implement. 2016-11-18 15:16:42 -05:00
Daniel Rivas
af133eb79f Adds DOM trace without jQuery 2016-09-08 11:58:48 -04:00
Daniel Rivas
5d00e36111 Preparing Chrome extension support for hardware
- init function now declares a "jspsych" attribute on the <html> element
so that our Chrome Extension can tell when jsPsych is loaded on a page

- new method jsPsych.pluginAPI.hardware that dispatches an event caught
by our extension. allows sending triggers to the parallel port!
2016-09-07 18:17:29 -04:00
Josh de Leeuw
a2e9f8674c progress bar fixes 2016-08-16 11:16:14 -04:00
Josh de Leeuw
0bdfd39702 fixes #285 2016-08-15 23:58:13 -04:00
Josh de Leeuw
17f0aa6fa0 fixes #284 2016-08-15 23:48:02 -04:00
Josh de Leeuw
bb7009e374 fix indexing bug 2016-08-15 18:34:47 -04:00
Josh de Leeuw
3cfde8a504 remove data.getTrialsOfType and data.getDataByTrialIndex 2016-08-15 18:02:43 -04:00
Josh de Leeuw
e46b84941f begin implementing data filters #283 2016-08-15 17:17:43 -04:00
Josh de Leeuw
0128e74540 error message if display_element does not exist 2016-08-15 16:29:30 -04:00
Josh de Leeuw
2efa5fefeb CSS rules for vertical centering 2016-08-12 16:54:15 -04:00
Josh de Leeuw
606600598c implements features for #281 2016-08-10 16:58:30 -04:00
Josh de Leeuw
5fde5c27dd support exclusions for WebAudio API #253 2016-08-10 16:13:05 -04:00
Josh de Leeuw
237572c3ea first implementation of automatic exclusions #253. implements min_width and min_height. 2016-08-10 15:22:27 -04:00
Josh de Leeuw
31ae9b0e6a implements #280 2016-08-10 14:23:50 -04:00
Josh de Leeuw
09e50d9f51 convert plugins to use centralized setTimeout handler #272 2016-08-10 14:08:54 -04:00
LOG67
b4d537b3be Fixed the missing comma which prevented jsPsych from working 2016-07-27 11:44:09 -04:00
Josh de Leeuw
d269f11c5c add on_interaction_data_update event to init settings 2016-07-22 16:12:33 -04:00
Josh de Leeuw
d4d8220b87 jsPsych.progress returns sensible results before experiment runs 2016-07-01 09:24:36 -04:00
Josh de Leeuw
72511a9c9c initialize interaction listeners after startup 2016-07-01 09:22:28 -04:00
Josh de Leeuw
3b910469d3 standardize ALL_KEYS and NO_KEYS (#252) 2016-06-30 13:20:34 -04:00
Josh de Leeuw
6d8b877987 fixes #231 2016-06-30 12:43:15 -04:00
Josh de Leeuw
bc7f0f0f1a fixes #254 2016-06-30 10:22:36 -04:00
Josh de Leeuw
472e0696d5 add fullscreenenter and fullscreenexit detection (#273) 2016-06-29 23:10:10 -04:00
Josh de Leeuw
c863a3b03c Initial implementation of focus recording (#273) 2016-06-29 22:54:12 -04:00
Josh de Leeuw
01f7782da6 Implements a solution for #228 2016-06-29 17:34:59 -04:00
Josh de Leeuw
a2e458615a implements data.ignore method (#264) 2016-06-27 22:55:35 -04:00
Josh de Leeuw
a951dd3e0b implements shared AudioContext (#271) 2016-06-27 13:29:43 -04:00
Josh de Leeuw
52e673fb1b more plugin.info (#270) 2016-06-27 13:21:51 -04:00
Josh de Leeuw
8b2d12a79c further work on plugin.info (#270) 2016-06-26 23:45:17 -04:00
Josh de Leeuw
73c77214d9 update param types 2016-06-24 09:51:56 -04:00
Josh de Leeuw
0f71617963 start implementing plugin.info methods (#270) 2016-06-24 09:46:30 -04:00
Josh de Leeuw
9b2c5d5932 better version of #255 2016-05-21 22:10:40 -04:00
Josh de Leeuw
1126aa6768 implements #255 and some minimal CSS support 2016-05-21 20:49:31 -04:00
Josh de Leeuw
e8db59b44b don't try to auto preload functions 2016-05-21 17:09:39 -04:00
Josh de Leeuw
613e692567 fix bug from #233 2016-05-21 16:53:54 -04:00
Josh de Leeuw
88ea761973 quick bug fixes 2016-05-18 17:29:03 -04:00
Josh de Leeuw
01b78b54b9 implement pause/unpause #232 2016-05-18 17:21:25 -04:00
Josh de Leeuw
ecbdfa50dd implements adding node to end of timeline 2016-05-18 17:04:14 -04:00
Josh de Leeuw
94e884ca1e fix window reference for server-side use 2016-04-14 15:35:27 -04:00
Josh de Leeuw
e011ced826 remove dependency on window object for query_string 2016-04-13 18:30:02 -04:00
Josh de Leeuw
2367a276f2 major cleanup, and basic level test works. 2016-04-07 15:01:50 -04:00
Josh de Leeuw
3e1bae218c first (buggy) implementation of timeline variables 2016-04-06 18:28:49 -04:00
Josh de Leeuw
1a715c86ad fixes #237 and adds test 2016-03-02 23:15:06 -05:00
Josh de Leeuw
d6ba7c9a26 fixes #222 2016-01-23 22:35:45 -05:00
Josh de Leeuw
9c6396cba3 remove old empty function 2016-01-23 22:30:05 -05:00
Josh de Leeuw
58bd9c9550 fixes #223 2016-01-23 22:23:38 -05:00
Josh de Leeuw
4de65db9d9 fixes #211 2016-01-07 16:34:03 -05:00
Josh de Leeuw
486b543a29 fixes #215 2016-01-07 12:08:29 -05:00
Josh de Leeuw
17cb2cd1f7 getting data docs renamed, renaming some data functions 2016-01-05 14:36:08 -05:00
Josh de Leeuw
95419af8ae renaming chunks to timeline 2016-01-05 14:04:01 -05:00
Josh de Leeuw
5ff4e2666a add randomID method (#214) 2016-01-05 13:31:52 -05:00
Josh de Leeuw
b289e182d5 allow end_message in endExperiment (#213) 2016-01-05 13:16:56 -05:00
Josh de Leeuw
d917f74d3a implements URL variables (#192) 2016-01-05 12:09:17 -05:00
Josh de Leeuw
9a9b7bba7a adds dataAsJSON (#212) 2016-01-05 11:34:53 -05:00
Josh de Leeuw
4ce36b8460 implements override of display_element (#204) 2016-01-05 11:19:53 -05:00
Josh de Leeuw
784632c9d2 fix bug with randomization.repeat (#210) 2016-01-05 10:47:53 -05:00
Josh de Leeuw
77a29acfd7 siphon plugins into .plugins namespace (#184) 2016-01-05 10:16:58 -05:00
Josh de Leeuw
80a16968cf making endExperiment work with new version 2015-12-17 15:05:35 -05:00
Josh de Leeuw
1440ff23ce making audio work with new timeline, auto preload (#117) 2015-12-17 12:43:51 -05:00
Josh de Leeuw
38ef295220 implements the progress bar for new timeline 2015-12-16 10:56:06 -05:00
Josh de Leeuw
3cc0ab85fc making sure loop function gets the data from the chunk 2015-12-15 21:26:26 -05:00
Josh de Leeuw
6489923cff error messages for bad experiment timelines 2015-12-15 21:07:29 -05:00
Josh de Leeuw
0742ebc246 allow setting parameters at any point on timeline 2015-12-11 16:57:06 -05:00
Josh de Leeuw
ff7ffd3de4 merging data.write with finishTrial (#154)
still need to update more plugins
2015-12-10 17:05:12 -05:00
Josh de Leeuw
f90dd3a8d6 basic test with single-stim is working 2015-12-10 16:02:25 -05:00
Josh de Leeuw
3e840bca6b getting started with revisions
- remove chunks/blocks
- add timeline node “class”
- modifying single-stim plugin for testing
2015-12-10 15:29:39 -05:00
Josh de Leeuw
e99fb56fd3 implement fullscreen option (#199) 2015-12-08 11:46:31 -05:00
Josh de Leeuw
29497fb7b3 fix audio for Safari (#159) 2015-12-08 10:58:39 -05:00
Josh de Leeuw
dba6c4befc fixes double call of function as parameter (#158)
fixed by changing the evaluate parameters function to modify the trial
object directly, so the function is replaced by its value.
2015-12-08 10:35:29 -05:00
Josh de Leeuw
ed4b2ba99c change progress bar behavior (#156) 2015-12-08 09:54:37 -05:00
Josh de Leeuw
94f772e41e allow override of default timing_post_trial (#176) 2015-12-07 16:48:37 -05:00
Josh de Leeuw
2f61a960ab fix clone on shuffle (issue #175) 2015-12-07 15:37:16 -05:00
Josh de Leeuw
1b37453a43 implements #153 2015-06-26 16:55:13 -04:00
Josh de Leeuw
3ef2f16f22 implements #144 2015-06-26 15:30:26 -04:00
Josh de Leeuw
981d15fdc8 implements #98 & #152
adds a routine that detects when keys are being held down. an optional
parameter for getKeyboardResponse allows held keys to be ignored.
2015-06-12 12:58:31 -04:00
Josh de Leeuw
c091cbaa28 fix bug in endExperiment
caused on_finish handler to fire twice
2015-06-08 12:39:33 -04:00
Josh de Leeuw
1974ff4498 fixes #147 2015-06-08 09:03:32 -04:00
Josh de Leeuw
240f409a06 fix bug with data and timing_post_trial function params 2015-06-02 09:27:05 -04:00
Josh de Leeuw
3d597a8f52 implements #107 2015-05-28 13:14:22 -04:00
Josh de Leeuw
eff15d8fa6 fixes #116 2015-05-28 12:45:43 -04:00
Josh de Leeuw
37fa9d9113 implements #142 2015-05-28 09:58:47 -04:00
Josh de Leeuw
23653e7eef implements #143 2015-05-28 09:45:21 -04:00
Josh de Leeuw
9bba6fe2dd finishes #104 2015-05-22 09:52:04 -04:00
Josh de Leeuw
af2543d566 starting to implement #104 2015-05-20 23:09:48 -04:00
Josh de Leeuw
b948e4bc6f fixes #134 2015-05-15 16:39:40 -04:00
Josh de Leeuw
4b4faa6636 fixes #105, #137 2015-05-15 15:31:39 -04:00
Josh de Leeuw
c7e1f40ddc *actually* fixes #128 2015-05-15 15:16:00 -04:00
Josh de Leeuw
b5bb1a552d fixes #128 2015-05-15 15:09:10 -04:00
Josh de Leeuw
d1f9985bf8 implements #136
does the stuff in #136.

- adds the addProperties function
- removes other ways to append data.
2015-05-15 14:46:12 -04:00
Josh de Leeuw
ab44b665a3 add list of variables that are always protected from norming
fixes #133, and provides framework for other related issues.
2015-05-15 14:04:39 -04:00
Josh de Leeuw
0cb807500f avoid loading audio twice
fixes issue #125
2015-03-27 13:43:11 -04:00
Josh de Leeuw
7f9db95c5d update docs loc 2015-02-19 10:24:33 -05:00
Josh de Leeuw
a1900a199b allow skip_load_check
issue #92
2015-02-19 10:15:59 -05:00
Josh de Leeuw
c780dd4557 add sample method
issue #102
2015-02-05 17:19:08 -05:00
Josh de Leeuw
686a6bcdaf fix issues with html content rendering in displayData
issue #99
2015-02-05 17:00:22 -05:00
Josh de Leeuw
0849f8bd9f add randomization.shuffle function
issue #100
2015-02-05 16:52:16 -05:00
Josh de Leeuw
45820a5249 comments removed 2015-02-05 16:49:21 -05:00
Josh de Leeuw
6a634244e3 temp fix to prevent non AudioContext browsers from breaking
issue #95
2014-11-14 15:28:33 -05:00
Josh de Leeuw
55f1d3c5d6 add convertKeyCharacterToKeyCode method 2014-11-14 15:14:48 -05:00
Josh de Leeuw
8ca0e2576c adds a check in init function to see if all audio is loaded 2014-11-11 10:18:12 -05:00
Josh de Leeuw
840cfa908c working audio plugin
- needed to change keyboardResponse method to support measuring RT off
of the audio context
- related to issues #3 and #4
2014-11-11 09:15:26 -05:00
Josh de Leeuw
bb1379b5e4 adding audio support functions to core 2014-11-11 08:37:57 -05:00
Josh de Leeuw
f7d02198d0 fix issue with flatten data
Fixes #85
2014-10-30 16:06:07 -04:00
Josh de Leeuw
b60a331e1f bug fix in displayData 2014-10-28 18:01:47 -04:00
Josh de Leeuw
3c6d7fdd66 removing force_refresh option for turkInfo
just parse the string every time
2014-10-16 11:06:43 -04:00
Josh de Leeuw
9d816dbf2b change blocks to timeline
closes #77
2014-10-15 13:43:28 -04:00
Josh de Leeuw
5546f08094 add getLastChunkData; edge case handling 2014-10-01 08:34:28 -04:00
Josh de Leeuw
f2c0ebf63d add getLastTrialData function 2014-10-01 08:28:50 -04:00
Josh de Leeuw
4171f8d461 adding if chunk 2014-10-01 02:51:47 +00:00
Josh de Leeuw
8cef6f089e semicolon 2014-10-01 02:22:51 +00:00
Josh de Leeuw
6f10c190c5 implement randomize_order and repetitions opts
closes issue #70
2014-09-25 09:13:08 -04:00
Josh de Leeuw
c5c0298c9a remove line 2014-09-24 08:53:49 -04:00
Josh de Leeuw
e07e05ce35 implement ability to get index of trial relative to block 2014-09-24 08:51:44 -04:00
Josh de Leeuw
c1c60c209d update progress bar spec
shows progress based on which chunk the subject is currently doing in
the root_chunk object. this means that progress updates less often, but
the experimenter can always break out blocks into lots of chunks if
they want the progress to update more frequently.
2014-09-24 08:37:28 -04:00
Josh de Leeuw
e4d2766f8b cleaning up stuff that isn't needed. 2014-09-23 16:31:01 -04:00
Josh de Leeuw
044cbc3d6e more fixes for nested chunks
- fixed method to get data associated with chunk ID
- isComplete now works for root type chunk
2014-09-23 16:14:36 -04:00
Josh de Leeuw
619d9ffa05 reconfiguring chunk to be tree-like
now there is a root chunk which contains the entire experiment, with
all other chunks being branches off of the root. lots of tweaking to
chunk ID code to get dynamic IDs depending on how many iterations of a
chunk have happened.
2014-09-23 14:10:51 -04:00
Josh de Leeuw
044cf9c780 trying to implement nested chunks
this is really broken right now.
2014-09-22 09:40:34 -04:00
Josh de Leeuw
d9c356f6d7 replace block.next with jsPsych.finishTrial(); 2014-09-19 15:19:01 -04:00
Josh de Leeuw
e7e3271731 more work to support while chunks
Issue #8
2014-09-19 15:05:11 -04:00
Josh de Leeuw
fcf8239578 implements while chunk
related to Issue #8
2014-09-19 14:43:59 -04:00
Josh de Leeuw
03386a661f various bug fixes to get chunks working 2014-09-19 14:21:49 -04:00
Josh de Leeuw
4128984f36 more work on chunk code 2014-09-19 08:45:59 -04:00
Josh de Leeuw
ab30087973 starting to fill in chunk behavior 2014-09-18 16:55:45 -04:00
Josh de Leeuw
73b6524c0f changing what blocks do
now they are just collections of trials, rather than having significant
functionality for running the experiment. the running code is now part
of the jsPsych object.
2014-09-18 09:58:21 -04:00
Josh de Leeuw
ba0ac9c6bf more changes to support chunks 2014-09-17 17:09:37 -04:00
Josh de Leeuw
4a783ea684 more sketching for chunks 2014-09-17 12:00:36 -04:00
Josh de Leeuw
6fc666ec1e start sketching out chunks 2014-09-17 11:41:54 -04:00
Josh de Leeuw
c19295bd98 add datastore object 2014-09-17 11:34:00 -04:00
Josh de Leeuw
80158e52f2 wake up this branch 2014-09-17 11:24:29 -04:00
Josh de Leeuw
bc00b48ee2 remove genericParameters from plugin specific implementations 2014-09-16 08:54:09 -04:00
Josh de Leeuw
1d5adf787a streamline generic trial options 2014-09-16 08:40:10 -04:00
Josh de Leeuw
2ed85be15b add generic trial options support in core
related to issue #36, #68
2014-09-15 10:53:24 -04:00
Josh de Leeuw
9ab6543cb0 starting to handle trial level callbacks
however, this will probably not be able to happen until the code for
creating trials is refactored somewhat. it’s difficult to specify trial
parameters without editing each plugin manually. when plugins can have
standardized values, then the other half of this can go in.
2014-09-12 16:41:01 -04:00
Josh de Leeuw
89f4f1535c remove part parameter in do trial method
closes #64
2014-09-12 16:25:56 -04:00
Josh de Leeuw
12118247b1 add progress bar option
Can now pass ‘show_progress_bar: true’ to init method to display a
progress bar throughout the experiment.

* default styling has been added to jspsych.css for the progress bar
* bug fixes to jspsych.progress method to support this change (bug was
related to getting progress after experiment had ended)
* improved logic for when on_finish_trial callback function will trigger
2014-09-10 10:15:13 -04:00
Josh de Leeuw
2c33d7603d add block_index to default data
records the index of the current block
2014-09-09 08:32:12 -04:00
Josh de Leeuw
146d1dae20 add time_elapsed to default data
records the number of ms since the start of the experiment when a trial ends.
2014-09-09 08:28:52 -04:00
Josh de Leeuw
8db4ea307e add default data for all trials
records default data for all trials:

- trial type
- trial index within the block
- trial index for entire experiment (global index -- related to issue #63)
2014-09-08 15:22:17 -04:00
Josh de Leeuw
a07f59d323 namespace bug 2014-09-03 14:19:24 -04:00
Josh de Leeuw
26052c22a1 remove append_data 2014-07-10 12:14:05 -04:00
Josh de Leeuw
fdf77c79dd make json pretty 2014-07-10 12:03:51 -04:00
Josh de Leeuw
fc16067939 add getter method for DOM_target, update module methods 2014-07-10 12:00:56 -04:00
Josh de Leeuw
8d3d9af0db bug fix flatten_data -> flattenData 2014-07-10 11:49:40 -04:00
Josh de Leeuw
594be10e52 add dataAPI.displayData 2014-07-10 11:45:01 -04:00
Josh de Leeuw
959447be1e move flatten function 2014-07-04 16:04:36 -04:00
Josh de Leeuw
3e8fb4f780 change header doc 2014-07-01 11:08:48 -04:00
Josh de Leeuw
11f644f6a6 add dataAPI.getTrialsOfType 2014-07-01 11:05:40 -04:00
Josh de Leeuw
107ca90748 a few unrelated bug fixes 2014-06-30 14:19:51 -04:00
Josh de Leeuw
ebd50e7726 replace core with module 2014-06-30 09:47:23 -04:00
Josh de Leeuw
e656894011 move getKeys to the right module 2014-06-30 09:46:32 -04:00
Josh de Leeuw
3b184648fd missing ) 2014-06-30 09:43:47 -04:00