summary refs log tree commit diff
path: root/synapse (follow)
Commit message (Expand)AuthorAgeFilesLines
* Don't prepopulate event_resultsErik Johnston2015-05-211-1/+1
* Don't readd things that are already in event_resultsErik Johnston2015-05-211-1/+2
* PriorityQueue gives lowest firstErik Johnston2015-05-211-2/+2
* Correctly capture Queue.Empty exceptionErik Johnston2015-05-211-2/+5
* Merge branch 'develop' of github.com:matrix-org/synapse into erikj/backfill_f...Erik Johnston2015-05-211-0/+1
|\
| * Oops, get_rooms_for_user returns a namedtuple, not a room_idMark Haines2015-05-211-0/+1
* | Merge branch 'erikj/join_perf' of github.com:matrix-org/synapse into erikj/ba...Erik Johnston2015-05-2112-188/+579
|\ \
| * | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/join_perfErik Johnston2015-05-2112-188/+579
| |\|
| | * Merge pull request #155 from matrix-org/erikj/perfErik Johnston2015-05-2112-188/+579
| | |\
| | | * s/for events/for requests for events/Erik Johnston2015-05-211-1/+1
| | | * s/for events/for requests for events/Erik Johnston2015-05-211-1/+1
| | | * Add commentsErik Johnston2015-05-211-3/+14
| | | * Split up _get_events into defer and txn versionsErik Johnston2015-05-201-24/+35
| | | * Make not return a deferred _get_event_from_row_txnErik Johnston2015-05-201-20/+5
| | | * PEP8Erik Johnston2015-05-201-2/+2
| | | * Split out _get_event_from_row back into defer and _txn versionErik Johnston2015-05-201-11/+57
| | | * Comments and shuffle of functionsErik Johnston2015-05-181-38/+42
| | | * Remove unused metricErik Johnston2015-05-181-1/+0
| | | * Remove rejected events if we don't want rejected eventsErik Johnston2015-05-181-0/+3
| | | * Merge branch 'erikj/events_move' of github.com:matrix-org/synapse into erikj/...Erik Johnston2015-05-187-229/+301
| | | |\
| | | * | Remove pointless newlineErik Johnston2015-05-181-1/+0
| | | * | Newline, remove debug loggingErik Johnston2015-05-183-4/+1
| | | * | Remove debug loggingErik Johnston2015-05-181-8/+0
| | | * | PEP8Erik Johnston2015-05-152-2/+1
| | | * | Revert limiting of fetching, it didn't help perf.Erik Johnston2015-05-151-9/+2
| | | * | init jErik Johnston2015-05-151-0/+1
| | | * | Don't completely drain the listErik Johnston2015-05-151-2/+9
| | | * | Don't fetch prev_content for current_stateErik Johnston2015-05-151-1/+1
| | | * | Err, defer.gatherResults ftwErik Johnston2015-05-151-21/+12
| | | * | Make store.get_current_state fetch events asynclyErik Johnston2015-05-152-4/+4
| | | * | Remove more debug loggingErik Johnston2015-05-151-2/+0
| | | * | Remove debug loggingErik Johnston2015-05-151-11/+3
| | | * | preserve log contextErik Johnston2015-05-151-1/+2
| | | * | Add a waitErik Johnston2015-05-152-3/+12
| | | * | Srsly. Don't use closures. BaaaaaadErik Johnston2015-05-151-10/+8
| | | * | Correctly pass through paramsErik Johnston2015-05-151-3/+3
| | | * | Sort out error handlingErik Johnston2015-05-151-25/+22
| | | * | Fix daedlockErik Johnston2015-05-156-83/+120
| | | * | Remove race conditionErik Johnston2015-05-144-96/+157
| | | * | Call from right threadErik Johnston2015-05-141-1/+3
| | | * | Count and loopErik Johnston2015-05-142-37/+35
| | | * | Don't start up more fetch_eventsErik Johnston2015-05-141-0/+1
| | | * | Awful idea for speeding up fetching of eventsErik Johnston2015-05-143-40/+139
| | | * | Turn off preemptive transactionsErik Johnston2015-05-141-17/+7
| | | * | PEP8Erik Johnston2015-05-141-2/+1
| | | * | Move from _base to eventsErik Johnston2015-05-142-232/+247
| | | * | Jump out earlyErik Johnston2015-05-141-0/+6
| | | * | Actually, we probably want to run this in a transactionErik Johnston2015-05-141-15/+12
| | | * | Preemptively jump into a transaction if we ask for get_prev_contentErik Johnston2015-05-141-12/+22
| | | * | loop -> gatherResultsErik Johnston2015-05-141-10/+14
| | | * | Err, we probably want a bigger limitErik Johnston2015-05-141-1/+1
| | | * | Move fetching of events into their own transactionsErik Johnston2015-05-144-53/+45
| | | * | Refactor _get_eventsErik Johnston2015-05-143-253/+123
| | | * | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/perfErik Johnston2015-05-142-2/+13
| | | |\ \
| | | * | | Add index on eventsErik Johnston2015-05-132-1/+20
| | | * | | Actually use async methodErik Johnston2015-05-131-3/+1
| | | * | | Fetch events from events_id in their own transactionsErik Johnston2015-05-133-18/+168
| | | * | | TypoErik Johnston2015-05-131-1/+1
| | | * | | Don't insert NoneErik Johnston2015-05-131-1/+4
| | | * | | Don't return NoneErik Johnston2015-05-131-1/+1
| | | * | | Limit batch sizeErik Johnston2015-05-131-5/+10
| | | * | | Fetch events in bulkErik Johnston2015-05-132-34/+63
| | | * | | Don't fetch redaction and rejection stuff for each event, so we can use index...Erik Johnston2015-05-132-6/+24
| | | * | | Temp turn off checking for rejections and redactionsErik Johnston2015-05-131-5/+2
| | | * | | defer.gatherResults loopErik Johnston2015-05-131-1/+7
| | | * | | Batch fetching of events for state groupsErik Johnston2015-05-131-1/+24
| | | * | | Load events for state group seperatelyErik Johnston2015-05-132-5/+11
| | * | | | Handle the case when things return empty but non none thingsErik Johnston2015-05-191-2/+2
| | * | | | Don't always hit get_server_verify_key_v1_directErik Johnston2015-05-191-5/+10
* | | | | | Fix _get_backfill_events to return events in the correct orderErik Johnston2015-05-201-27/+28
* | | | | | Actually fetch state for new backwards extremeties when backfilling.Erik Johnston2015-05-202-62/+108
* | | | | | Ensure event_results is a setErik Johnston2015-05-191-1/+1
|/ / / / /
* | | | | Add None checkErik Johnston2015-05-191-1/+1
* | | | | Fix event_backwards_extrem insertion to ignore outliersErik Johnston2015-05-191-2/+3
* | | | | Add a timeout param to get_eventErik Johnston2015-05-194-16/+25
* | | | | Handle the case when things return empty but non none thingsErik Johnston2015-05-191-2/+2
* | | | | Don't apply new room join hack if depth > 5Erik Johnston2015-05-191-3/+6
* | | | | Don't always hit get_server_verify_key_v1_directErik Johnston2015-05-191-5/+10
* | | | | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/join_perfErik Johnston2015-05-191-2/+8
|\| | | |
| * | | | Disable GZip encoding on static file resources as per commentDavid Baker2015-05-191-1/+7
| * | | | SYN-383: Actually, we expect this value to be a dictErik Johnston2015-05-191-1/+2
| * | | | Revert accidental commitErik Johnston2015-05-191-3/+3
* | | | | SYN-383: Actually, we expect this value to be a dictErik Johnston2015-05-191-1/+2
* | | | | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/join_perfErik Johnston2015-05-192-4/+4
|\| | | |
| * | | | SYN-383: Handle the fact the server might not have signed thingsErik Johnston2015-05-192-4/+4
| * | | | Don't reuse var namesErik Johnston2015-05-191-2/+2
* | | | | Don't reuse var namesErik Johnston2015-05-191-2/+2
* | | | | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/join_perfErik Johnston2015-05-191-18/+18
|\| | | |
| * | | | SYN-383: Fix parsing of verify_keys and catching of _DefGen_ReturnErik Johnston2015-05-191-18/+18
* | | | | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/join_perfErik Johnston2015-05-199-144/+270
|\| | | |
| * | | | SYN-383: Extract the response list from 'server_keys' in the response JSON as...Mark Haines2015-05-191-1/+3
| * | | | Merge pull request #152 from matrix-org/notifier_performanceMark Haines2015-05-188-143/+267
| |\ \ \ \ | | |_|_|/ | |/| | |
| | * | | Don't bother sorting by the room_stream_ids, it shouldn't matter which order ...Mark Haines2015-05-181-1/+1
| | * | | Merge branch 'develop' into notifier_performanceMark Haines2015-05-188-57/+266
| | |\ \ \
| | * | | | Make sure the notifier stream token goes forward when it is updated. Sort the...Mark Haines2015-05-182-4/+21
| | * | | | Add some doc-strings to notifierMark Haines2015-05-141-19/+33
| | * | | | Use the current token when timing out a notifier, make sure the user_id is a ...Mark Haines2015-05-141-2/+2
| | * | | | Merge branch 'notifier_unify' into notifier_performanceMark Haines2015-05-143-20/+9
| | |\ \ \ \
| | * | | | | Fix v2 sync, update the last_notified_ms only if there was an active listenerMark Haines2015-05-142-6/+7
| | * | | | | Fix metric counterMark Haines2015-05-131-2/+2
| | * | | | | Discard unused NotifierUserStreamsMark Haines2015-05-131-16/+34
| | * | | | | Don't set a timer if there's already a result to returnMark Haines2015-05-131-3/+10
| | * | | | | Don't bother checking for new events from a source if the stream token hasn't...Mark Haines2015-05-131-2/+6
| | * | | | | Don't bother checking for updates if the stream token hasn't advanced for a userMark Haines2015-05-137-38/+99
| | * | | | | Merge branch 'notifier_unify' into notifier_performanceMark Haines2015-05-1227-306/+630
| | |\ \ \ \ \
| | * \ \ \ \ \ Merge branch 'notifier_unify' into notifier_performanceMark Haines2015-05-123-24/+28
| | |\ \ \ \ \ \
| | * | | | | | | Add a NotifierUserStream to hold all the notification listeners for a userMark Haines2015-05-121-114/+116
* | | | | | | | | Do work in parellel when joining a roomErik Johnston2015-05-181-19/+50
|/ / / / / / / /
* | | | | / / / Move get_events functions to storage.eventsErik Johnston2015-05-182-155/+132
| |_|_|_|/ / / |/| | | | | |
* | | | | | | Merge pull request #153 from matrix-org/markjh/presence_docstringMark Haines2015-05-151-49/+220
|\ \ \ \ \ \ \
| * | | | | | | More whitespaceMark Haines2015-05-151-0/+1
| * | | | | | | Add some missed argument types, cleanup the whitespace a bitMark Haines2015-05-141-6/+17
| * | | | | | | More doc-stringsMark Haines2015-05-141-39/+202
| * | | | | | | Remove unused arguments and doc PresenceHandler.push_update_to_clientsMark Haines2015-05-141-12/+8
* | | | | | | | Support gzip encoding for client, client v2 and web client resources (SYN-176).David Baker2015-05-141-5/+16
|/ / / / / / /
* | | | | | | Treat setting your display name to the empty string as removing it (SYN-186).David Baker2015-05-141-0/+3
* | | | | | | Merge pull request #150 from matrix-org/notifier_unifyMark Haines2015-05-141-174/+48
|\ \ \ \ \ \ \ | | |_|_|/ / / | |/| | | | |
| * | | | | | Merge branch 'develop' into notifier_unifyMark Haines2015-05-143-20/+9
| |\ \ \ \ \ \ | | |_|_|/ / / | |/| | | / / | | | |_|/ / | | |/| | |
| * | | | | Merge branch 'develop' into notifier_unifyMark Haines2015-05-1227-306/+630
| |\ \ \ \ \ | | |_|_|/ / | |/| | | |
| * | | | | Update the end_token correctly, otherwise the token doesn't advance and the c...Mark Haines2015-05-121-1/+1
| * | | | | Merge branch 'develop' into notifier_unifyMark Haines2015-05-122-23/+27
| |\ \ \ \ \ | | |_|_|/ / | |/| | | |
| * | | | | Don't bother passing the events to the notifier since it isn't using themMark Haines2015-05-111-95/+18
| * | | | | Use wait_for_events to implement 'get_events'Mark Haines2015-05-111-79/+30
* | | | | | Disallow whitespace in aliases here tooDavid Baker2015-05-141-0/+5
* | | | | | Throw error when creating room if alias contains whitespace #SYN-335David Baker2015-05-141-0/+5
* | | | | | Make shared secret registration work againDavid Baker2015-05-141-1/+4
| |_|_|_|/ |/| | | |
* | | | | Add ID generator for push_rules_enable to #resolve SYN-378David Baker2015-05-142-2/+13
| |_|_|/ |/| | |
* | | | Don't talk to yourself when backfillingErik Johnston2015-05-121-0/+2
* | | | You need to call contextmanagerErik Johnston2015-05-121-0/+1
* | | | Revert "Improvement to performance of presence event stream handling"Mark Haines2015-05-121-20/+6
| |_|/ |/| |
* | | Merge pull request #143 from matrix-org/erikj/SYN-375Mark Haines2015-05-123-16/+60
|\ \ \
| * | | Change the way we create observers to deferreds so that we don't get spammed ...Erik Johnston2015-05-083-16/+60
* | | | Merge pull request #147 from matrix-org/presence-performanceMark Haines2015-05-121-6/+20
|\ \ \ \
| * | | | Use the presence cachemap ordering to early-abort the iteration loopPaul "LeoNerd" Evans2015-05-071-2/+7
| * | | | Store presence cachemap in an ordered dict, so that the newer serials will be...Paul "LeoNerd" Evans2015-05-071-4/+13
* | | | | Merge pull request #144 from matrix-org/erikj/logging_contextMark Haines2015-05-1220-156/+238
|\ \ \ \ \
| * | | | | Make distributer.fire work as it didErik Johnston2015-05-121-20/+30
| * | | | | Unwrap defer.gatherResults failuresErik Johnston2015-05-126-7/+18
| * | | | | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/logging_co...Erik Johnston2015-05-127-83/+116
| |\ \ \ \ \ | | | |_|_|/ | | |/| | |
| * | | | | Fix up leak. Add warnings.Erik Johnston2015-05-088-49/+70
| * | | | | Add some docsErik Johnston2015-05-081-2/+14
| * | | | | PEP8Erik Johnston2015-05-082-4/+2
| * | | | | Change the way we do logging contexts so that they survive divergencesErik Johnston2015-05-0812-100/+130
| | |/ / / | |/| | |
* | | | | Merge pull request #149 from matrix-org/erikj/backfillMark Haines2015-05-128-126/+310
|\ \ \ \ \ | |_|/ / / |/| | | |
| * | | | Err, delete the right stuffErik Johnston2015-05-121-4/+5
| * | | | NewlinesErik Johnston2015-05-121-2/+0
| * | | | We do actually want to delete rows out of event_backward_extremitiesErik Johnston2015-05-121-4/+11
| * | | | Fix up _handle_prev_events to not try to insert duplicate rowsErik Johnston2015-05-121-23/+13
| * | | | Do state groups persistence /after/ checking if we have already persisted the...Erik Johnston2015-05-121-6/+9
| * | | | s/backfil/backfill/Erik Johnston2015-05-121-4/+4
| * | | | Typos everywhereErik Johnston2015-05-121-1/+1
| * | | | And another typo.Erik Johnston2015-05-121-3/+3
| * | | | Err, gatherResults doesn't take a dict...Erik Johnston2015-05-121-4/+7
| * | | | Handle the case where the other side is unreachable when backfillingErik Johnston2015-05-121-14/+42
| * | | | Make get_current_token accept a direction parameter, which tells whether the ...Erik Johnston2015-05-124-8/+26
| * | | | Initial hack at wiring together pagination and backfillErik Johnston2015-05-113-5/+141
| * | | | Move storage.stream._StreamToken to types.RoomStreamTokenErik Johnston2015-05-112-85/+85
| | |_|/ | |/| |
* / | | SYN-377: Make sure that the StreamIdGenerator.get_next.__exit__ is called fro...Mark Haines2015-05-122-23/+27
|/ / /
* | | Merge pull request #146 from matrix-org/erikj/push_rules_fixesErik Johnston2015-05-112-57/+54
|\ \ \
| * | | Prefer to use _simple_*.Erik Johnston2015-05-111-44/+41
| * | | push_rules table expects an 'id' fieldErik Johnston2015-05-112-13/+13
* | | | Bump versionErik Johnston2015-05-111-1/+1
|/ / /
* | | Bump versionErik Johnston2015-05-101-1/+1
* | | Fix push rule bug: can't insert bool into small int columnErik Johnston2015-05-101-1/+1
* | | Bump versionErik Johnston2015-05-081-1/+1
| |/ |/|
* | Merge branch 'master' of github.com:matrix-org/synapse into developErik Johnston2015-05-081-1/+1
|\ \
| * | Bump versionErik Johnston2015-05-081-1/+1
* | | Drop the old table not the new tableMark Haines2015-05-081-1/+1
* | | Rename unique constraintMark Haines2015-05-081-1/+1
* | | Remove unsignedMark Haines2015-05-081-2/+2
* | | Bump schema versionMark Haines2015-05-081-1/+1
* | | Make the timestamps in server_keys_json bigintsMark Haines2015-05-081-0/+32
| |/ |/|
* | Merge branch 'master' of github.com:matrix-org/synapse into developErik Johnston2015-05-072-4/+4
|\|
| * Bump syweb versionErik Johnston2015-05-071-3/+3
| * Bump versionErik Johnston2015-05-061-1/+1
* | revert accidental bcrypt gensalt round reduction from loadtestingMark Haines2015-05-071-1/+1
* | pynacl-0.3.0 was released so we can finally start using it directly from pypiMark Haines2015-05-072-7/+2
* | Merge branch 'develop' of github.com:matrix-org/synapse into developDavid Baker2015-05-0715-136/+261
|\ \
| * | Optional profiling using cProfileMark Haines2015-05-061-1/+21
| * | Don't read from the config file before checking it existsMark Haines2015-05-061-9/+10
| |/
| * Merge branch 'erikj/executemany' of github.com:matrix-org/synapse into erikj/...Erik Johnston2015-05-058-48/+129
| |\
| | * And use buffer(...) there as wellErik Johnston2015-05-052-2/+3
| | * Merge branch 'develop' of github.com:matrix-org/synapse into erikj/executemanyErik Johnston2015-05-058-46/+118
| | |\
| | | * Use buffer(...) when inserting into bytea columnErik Johnston2015-05-052-4/+3
| | | * Merge pull request #139 from matrix-org/bugs/SYN-369Mark Haines2015-05-054-16/+80
| | | |\
| | | | * Add some doc-stringMark Haines2015-05-051-0/+4
| | | | * Collect the invalidate callbacks on the transaction object rather than passin...Mark Haines2015-05-057-51/+51
| | | | * SYN-369: Add comments to the sequence number logic in the cacheMark Haines2015-05-051-0/+7
| | | | * Add debug flag in synapse/storage/_base.py for debugging the cache logic by c...Mark Haines2015-05-051-1/+12
| | | | * Invalidate the room_member cache if the current state events updatesMark Haines2015-05-051-0/+5
| | | | * Missing return for when the event was already persistedMark Haines2015-05-051-1/+1
| | | | * Invalidate the caches from the correct threadMark Haines2015-05-056-29/+46
| | | | * Sequence the modifications to the cache so that selects don't race with insertsMark Haines2015-05-051-3/+23
| | | * | Fix the --help option for synapseMark Haines2015-05-051-18/+29
| | | * | Missed events are not outliersErik Johnston2015-05-051-1/+1
| | * | | Add a comment about the zip(*[zip(sorted(...),...)])Erik Johnston2015-05-051-0/+8
| * | | | Don't insert without deduplication. In this case we never actually use this t...Erik Johnston2015-05-051-22/+0
| |/ / /
| * | | Fix indentationErik Johnston2015-05-051-10/+10
| * | | Add support for using executemanyErik Johnston2015-05-054-59/+97
| |/ /
| * / Don't call 'encode_parameter' no-opErik Johnston2015-05-053-10/+0
| |/
| * Correctly name transactionErik Johnston2015-05-051-1/+1
| * Remove some unused indexesErik Johnston2015-05-011-0/+18
| * Don't log enqueue_Erik Johnston2015-05-011-1/+0
* | TypoDavid Baker2015-05-071-1/+1
|/
* user_id now in user_threepidsDavid Baker2015-05-012-6/+6
* That wasn't a deferredErik Johnston2015-05-012-4/+2
* Remove inlineCallbacks from non-generatorErik Johnston2015-05-011-2/+0
* TypoErik Johnston2015-05-011-1/+1
* Remove some run_on_reactorsErik Johnston2015-05-013-10/+0
* Don't log all auth events every time we call auth.checkErik Johnston2015-05-011-1/+4
* Use the daemonize key from the config if it existsMark Haines2015-05-011-1/+4
* Don't use self.execute: it's designed for fetching stuffDavid Baker2015-05-011-3/+8
* Merge pull request #136 from matrix-org/markjh/config_cleanupMark Haines2015-05-0117-482/+559
|\
| * Allow generate-config to run against an existing config file to generate defa...Mark Haines2015-05-013-14/+26
| * Allow "manhole" to be ommited from the configMark Haines2015-04-301-1/+1
| * Remove the ~, comment the lines insteadMark Haines2015-04-302-2/+2
| * Update key.pyMark Haines2015-04-301-1/+2
| * Update metrics.pyMark Haines2015-04-301-2/+2
| * missing importMark Haines2015-04-301-0/+2
| * read the pid_file from the config file in synctlMark Haines2015-04-301-2/+3
| * Merge branch 'develop' into markjh/config_cleanupMark Haines2015-04-3016-88/+176
| |\
| * | Write a default log_config when generating configMark Haines2015-04-304-4/+57
| * | Don't break when sizes or durations are given as integersMark Haines2015-04-301-9/+12
| * | Add a random string to the auto generated key idMark Haines2015-04-301-1/+3
| * | Allow --enable-registration to be passed on the commandlineMark Haines2015-04-301-3/+16
| * | Use disable_registration keys if they are presentMark Haines2015-04-301-0/+5
| * | Allow multiple config files, set up a default config before applying the conf...Mark Haines2015-04-302-22/+38
| * | remove duplicate parse_size methodMark Haines2015-04-302-10/+0
| * | Manually generate the default config yaml, remove most of the commandline arg...Mark Haines2015-04-3016-464/+444
* | | No id field on userDavid Baker2015-05-011-5/+1
* | | More missed get_user_by_id API changesDavid Baker2015-05-012-4/+4
* | | One too many lensErik Johnston2015-05-011-1/+1
* | | Change public room list to use defer.gatherResultsErik Johnston2015-05-011-5/+13
* | | This api now no longer returns an arrayDavid Baker2015-05-011-1/+1
* | | Don't wait for storage of access_tokenErik Johnston2015-05-011-1/+1
* | | Cache latest_event_ids_in_roomErik Johnston2015-05-011-1/+4
* | | Don't lock user_ips table for upsert.Erik Johnston2015-05-012-4/+10
* | | Fix bug where we reconnected to the database on every query.Erik Johnston2015-05-012-1/+2
* | | Split a storage function in two so that we don't have to do extra work.Erik Johnston2015-05-013-8/+14
* | | Remove pointless joinErik Johnston2015-04-301-5/+4
* | | Fix broken SQLErik Johnston2015-04-301-1/+1
* | | Need more yieldErik Johnston2015-04-301-1/+1
* | | Add missing paramErik Johnston2015-04-301-1/+1
* | | More join conditionsErik Johnston2015-04-301-2/+6
* | | Add more conditions on JOINs to make postgres go a little faster.Erik Johnston2015-04-302-4/+6
* | | Fix up get_current_state and get_room_name_and_aliases queries to parse event...Erik Johnston2015-04-302-32/+30
| |/ |/|
* | Add get_rooms_for_user cacheErik Johnston2015-04-301-0/+2
* | Undo changes to logger config, ie. remove the access_log_file option: decisio...David Baker2015-04-301-16/+0
* | Do access log using python's logging stuff, just under a separate logger nameDavid Baker2015-04-302-14/+39
* | Don't use sub queries, it makes postgres sadErik Johnston2015-04-301-11/+5