From 106ab7dd43cfde7740d54150737c333b10da4c80 Mon Sep 17 00:00:00 2001 From: Jean Carlo Machado Date: Tue, 16 Jan 2018 22:45:51 -0200 Subject: [PATCH] improvements --- README.md | 7 + build/.SRCINFO | 11 -- build/.gitignore | 2 - build/Makefile | 15 -- build/PKGBUILD | 25 --- build/src/whatnext-master/.gitignore | 1 - build/src/whatnext-master/.travis.yml | 13 -- build/src/whatnext-master/LICENSE | 19 --- build/src/whatnext-master/Makefile | 3 - build/src/whatnext-master/README.md | 119 -------------- build/src/whatnext-master/TODO.md | 13 -- build/src/whatnext-master/build/Makefile | 2 - build/src/whatnext-master/build/PKGBUILD | 26 --- .../build/whatnext-0.1-1-x86_64.pkg.tar.xz | Bin 21184 -> 0 bytes build/src/whatnext-master/build/wn-link | 5 - build/src/whatnext-master/config.sh | 14 -- build/src/whatnext-master/data | 3 - build/src/whatnext-master/detail.py | 58 ------- build/src/whatnext-master/doc.md | 30 ---- build/src/whatnext-master/done.sh | 72 -------- .../whatnext-master/editSubjectDescription.sh | 16 -- build/src/whatnext-master/gateway.sh | 155 ------------------ build/src/whatnext-master/goalStatus.sh | 54 ------ build/src/whatnext-master/goals.sh | 21 --- build/src/whatnext-master/init.sh | 14 -- build/src/whatnext-master/log.sh | 56 ------- build/src/whatnext-master/scheduler.py | 150 ----------------- build/src/whatnext-master/status.sh | 63 ------- build/src/whatnext-master/test/.gitignore | 1 - build/src/whatnext-master/test/done.sh | 26 --- build/src/whatnext-master/test/editThings.sh | 26 --- build/src/whatnext-master/test/goals.sh | 50 ------ build/src/whatnext-master/test/happyPath.sh | 38 ----- build/src/whatnext-master/test/status.sh | 27 --- build/src/whatnext-master/testAll.sh | 14 -- build/src/whatnext-master/timePerSubject.py | 93 ----------- build/src/whatnext-master/timeToStr.py | 43 ----- build/src/whatnext-master/whatnext | 116 ------------- build/whatnext-0.1-1-x86_64.pkg.tar.xz | Bin 21208 -> 0 bytes 39 files changed, 7 insertions(+), 1394 deletions(-) delete mode 100644 build/.SRCINFO delete mode 100644 build/.gitignore delete mode 100644 build/Makefile delete mode 100644 build/PKGBUILD delete mode 100644 build/src/whatnext-master/.gitignore delete mode 100644 build/src/whatnext-master/.travis.yml delete mode 100644 build/src/whatnext-master/LICENSE delete mode 100644 build/src/whatnext-master/Makefile delete mode 100644 build/src/whatnext-master/README.md delete mode 100644 build/src/whatnext-master/TODO.md delete mode 100644 build/src/whatnext-master/build/Makefile delete mode 100644 build/src/whatnext-master/build/PKGBUILD delete mode 100644 build/src/whatnext-master/build/whatnext-0.1-1-x86_64.pkg.tar.xz delete mode 100755 build/src/whatnext-master/build/wn-link delete mode 100644 build/src/whatnext-master/config.sh delete mode 100644 build/src/whatnext-master/data delete mode 100755 build/src/whatnext-master/detail.py delete mode 100644 build/src/whatnext-master/doc.md delete mode 100755 build/src/whatnext-master/done.sh delete mode 100755 build/src/whatnext-master/editSubjectDescription.sh delete mode 100755 build/src/whatnext-master/gateway.sh delete mode 100755 build/src/whatnext-master/goalStatus.sh delete mode 100755 build/src/whatnext-master/goals.sh delete mode 100755 build/src/whatnext-master/init.sh delete mode 100755 build/src/whatnext-master/log.sh delete mode 100755 build/src/whatnext-master/scheduler.py delete mode 100755 build/src/whatnext-master/status.sh delete mode 100644 build/src/whatnext-master/test/.gitignore delete mode 100755 build/src/whatnext-master/test/done.sh delete mode 100755 build/src/whatnext-master/test/editThings.sh delete mode 100755 build/src/whatnext-master/test/goals.sh delete mode 100755 build/src/whatnext-master/test/happyPath.sh delete mode 100755 build/src/whatnext-master/test/status.sh delete mode 100755 build/src/whatnext-master/testAll.sh delete mode 100755 build/src/whatnext-master/timePerSubject.py delete mode 100755 build/src/whatnext-master/timeToStr.py delete mode 100755 build/src/whatnext-master/whatnext delete mode 100644 build/whatnext-0.1-1-x86_64.pkg.tar.xz diff --git a/README.md b/README.md index aed1a18..e9e40fb 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,13 @@ The projects rests on some premises: - It's better to study in many little sessions than in few big one's - We want to study a lot of things and there are subjects more important than others (and their importance change quite often) +## Installation + +### Archlinux + +```sh +yaourt -Sa whatnext +``` ## Starting diff --git a/build/.SRCINFO b/build/.SRCINFO deleted file mode 100644 index a88664a..0000000 --- a/build/.SRCINFO +++ /dev/null @@ -1,11 +0,0 @@ -pkgbase = whatnext - pkgver = 0.1 - pkgrel = 1 - url = https://github.com/jeanCarloMachado/whatnext - arch = x86_64 - license = MIT - depends = python - depends = jq - -pkgname = whatnext - diff --git a/build/.gitignore b/build/.gitignore deleted file mode 100644 index 23c7960..0000000 --- a/build/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.zip -*.tar.gz diff --git a/build/Makefile b/build/Makefile deleted file mode 100644 index b90d63e..0000000 --- a/build/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -all: - rm -rf /tmp/whatnext || true - git clone ssh://aur@aur.archlinux.org/whatnext.git /tmp/whatnext - makepkg --printsrcinfo > /tmp/whatnext/.SRCINFO - cp PKGBUILD /tmp/whatnext - cd /tmp/whatnext ; git add . - cd /tmp/whatnext ; git commit -m 'wip' - cd /tmp/whatnext ; git push - -build: - makepkg -rsi -f - -md5sha: - makepkg -g - diff --git a/build/PKGBUILD b/build/PKGBUILD deleted file mode 100644 index d5fe6a2..0000000 --- a/build/PKGBUILD +++ /dev/null @@ -1,25 +0,0 @@ -# Maintainer: Jean Carlo Machado -pkgname=whatnext -pkgver=0.1 -pkgrel=1 -arch=('x86_64') -pkgdesc="Control your recurrent activities in a smart way" -url="https://github.com/jeanCarloMachado/whatnext" -source=("https://github.com/jeanCarloMachado/whatnext/archive/master.zip") -md5sums=('344a735ed9ee4e8c7ae391d411ad0614') -license=('MIT') -depends=('python' 'jq') - -package() { - - cd "$pkgdir" - srcDir="../../src/whatnext-master" - mkdir -p usr/lib/whatnext - mkdir -p usr/bin - cp $srcDir/*.sh usr/lib/whatnext/ - cp $srcDir/*.py usr/lib/whatnext/ - cp $srcDir/whatnext usr/lib/whatnext/ - cp $srcDir/wn-link usr/bin/whatnext - pwd - find . -} diff --git a/build/src/whatnext-master/.gitignore b/build/src/whatnext-master/.gitignore deleted file mode 100644 index 87364a2..0000000 --- a/build/src/whatnext-master/.gitignore +++ /dev/null @@ -1 +0,0 @@ -test-results diff --git a/build/src/whatnext-master/.travis.yml b/build/src/whatnext-master/.travis.yml deleted file mode 100644 index e602c92..0000000 --- a/build/src/whatnext-master/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: bash - -before_script: - - wget "https://github.com/chriscool/sharness/archive/master.zip" && unzip master.zip && sudo mv sharness-master/* /usr/local/bin - - sudo add-apt-repository ppa:deadsnakes/ppa -y - - sudo apt-get update - - sudo apt-get install jq - - sudo apt-get install python3.6 - - virtualenv venv --python=python3.6 - - source venv/bin/activate - -script: - - bash ./testAll.sh diff --git a/build/src/whatnext-master/LICENSE b/build/src/whatnext-master/LICENSE deleted file mode 100644 index a19b60a..0000000 --- a/build/src/whatnext-master/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2013 Jean Carlo Machado - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/build/src/whatnext-master/Makefile b/build/src/whatnext-master/Makefile deleted file mode 100644 index 7da9680..0000000 --- a/build/src/whatnext-master/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -.PHONY: test -test: - testAll.sh diff --git a/build/src/whatnext-master/README.md b/build/src/whatnext-master/README.md deleted file mode 100644 index aed1a18..0000000 --- a/build/src/whatnext-master/README.md +++ /dev/null @@ -1,119 +0,0 @@ -# Whatnext - -![BuildStatus](https://travis-ci.org/jeanCarloMachado/whatnext.svg?branch=master) - -Whatnext is the only way I found myself being able to have some control -over my studies. - -It's methodology is quite simple. You define the subjects you want to -study, the importance of any one of these subjects and the complexity of -them. Given that whatnext will calculate what's more -important for you to study right now. It will give you an ordered list -of "what to do next". You may follow it or not. Next time you study any -of the subjects you tell whatnext. With this info in hand whatnext will -refine what's more important to do next. - -Anytime your requirements change over the subjects you may only change -the configuration file and whatnext will figure out what's more -important next. - -The projects rests on some premises: - -- Life is too complicated to prepare beforehand a calendar of what to study and follow it accordingly -- Yet we want some control and balance over the subjects we study -- What really matters is that we know what to do next -- What to do next cannot be a "must follow" only an advice -- It's better to study in many little sessions than in few big one's -- We want to study a lot of things and there are subjects more important than others (and their importance change quite often) - - -## Starting - -Create your map of study ``whatnext edit-subjects`` - -```sh -crypto currencies|99|80|continue reading the book -category theory|70|90|read category theory for programmers -cormen book|65|90|do the exercise of how much you can do with a given complexity (wiki) -kubernetes|79|70|do a tutorial -haskell|45|90|continue reading the book -meditation|80|50|read more papers -math|50|70|master mathematical proophs reading the paper math_proofs -elm|40|90|do some other tutorials -music theory|43|80| -paraiso perdido|33|20| -kernel development|30|60| -chemistry|30|70| -climate change|10|10| -dragons book|20|80| -open source|99|50| -``` - -Where the columns are: -1. name of the subject -2. priority of the subject (0 to the least important 100 to the most) -3. the complexity of the subject (0 to the easiest 100 to the hardest) -4. optional description of what to do in the next session - -The output of the program will a contextualized list of priorities to -study at the moment. The most important one's will be on the top. - -```sh -whatnext -``` - -![output](https://i.imgur.com/sbXFpnd.png) - -When you study some subject you feed whatnext with this info in order to calculate the next most important item - -```sh -whatnext done 'tese cristiano' 'read about types of polymorpishms' -#the arguments are: subject studied, description of what was studied -``` -Informing whatnext about your studies also gives you a nice history of your progress -```sh -whatnext log -``` - -![log](https://i.imgur.com/N2OMkvH.png) - - -## Goals - -You can configure how much you need to spent with a given subject. -```sh -wn edit-goals -``` -```sh -{ - "haskellMastry": { - "from": "2018-01-01", - "to": "2018-12-31", - "minutes": 2000, - "subject": "haskell" - }, - "weekOfPython": { - "from": "2017-12-15", - "to": "2017-12-22", - "minutes": 120, - "subject": "python" - }, - "readABitOfLisp": { - "from": "2017-12-14", - "to": "2017-12-30", - "minutes": 120, - "subject": "lisp" - } -} -``` - -When you get something done your goal status will be updated - -```sh -wn status -``` - -![status](https://i.imgur.com/imsMToT.png) - - -[Installation and documentation](doc.md) diff --git a/build/src/whatnext-master/TODO.md b/build/src/whatnext-master/TODO.md deleted file mode 100644 index caed829..0000000 --- a/build/src/whatnext-master/TODO.md +++ /dev/null @@ -1,13 +0,0 @@ -# Implement Hooked system - -## Trigger - -Create a email trigger - -Send status through email every morning. - -Create notifications as well - -## Variable reward - -Give motivational quotes sometimes diff --git a/build/src/whatnext-master/build/Makefile b/build/src/whatnext-master/build/Makefile deleted file mode 100644 index 8872ec8..0000000 --- a/build/src/whatnext-master/build/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -all: - makepkg -rsi -f --skipinteg diff --git a/build/src/whatnext-master/build/PKGBUILD b/build/src/whatnext-master/build/PKGBUILD deleted file mode 100644 index 224d6d2..0000000 --- a/build/src/whatnext-master/build/PKGBUILD +++ /dev/null @@ -1,26 +0,0 @@ -# Maintainer: Jean Carlo Machado -pkgname=whatnext -pkgver=0.1 -pkgrel=1 -pkgdesc="" -arch=('x86_64') -url="https://github.com/jeanCarloMachado/whatnext" -license=('MIT') -depends=('python' 'jq') -md5sums=() - -package() { - - scriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - baseDir="$scriptDir/../" - - cd "$pkgdir" - mkdir -p usr/lib/whatnext - mkdir -p usr/bin - cp $baseDir/*.sh usr/lib/whatnext/ - cp $baseDir/*.py usr/lib/whatnext/ - cp $baseDir/whatnext usr/lib/whatnext/ - cp $scriptDir/wn-link usr/bin/whatnext - pwd - find . -} diff --git a/build/src/whatnext-master/build/whatnext-0.1-1-x86_64.pkg.tar.xz b/build/src/whatnext-master/build/whatnext-0.1-1-x86_64.pkg.tar.xz deleted file mode 100644 index 124862decc6b4baa8ff5dc75c3193138b806d294..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21184 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 jRK0`56-lWF00Eh$0f4{> $file - $EDITOR "$file" - doneDescription=$(cat "$file" | sed "/^\#.*/d" | tr "\n" "_") -} - -[ -z "$nextStep" ] && { - file=$(echo /tmp/whatnext_$(date "+%Y-%m-%d_%H-%I-%S")) - echo "# describe the next steps of this subject" >> $file - $EDITOR "$file" - nextStep=$(cat "$file" | sed "/^\#.*/d" | tr "\n" "_") - - $__dir/gateway.sh addWhatToDoNextToSubjet "$subject" "$nextStep" -} - -goalsNamesBefore=$(NO_COLOR=1 $__dir/goals.sh | grep -v "100%" | cut -d ':' -f1) - -echo "$( date "+%Y-%m-%d %H:%M:%S")|$subject|$doneDescription|$goalStr" >> $WHATNEXT_HISTORY - -goalsToBeDoneAfter=$(NO_COLOR=1 $__dir/goals.sh | grep -v "100%") -[ $(echo "$goalsNamesBefore" | wc -l) -ne $( echo "$goalsToBeDoneAfter" | wc -l ) ] && { - goals=$(cat $WHATNEXT_GOALS) - -IFS=' -' - for goalName in $goalsNamesBefore - do - #if the goal is not anymore between the one's to be done it's done - echo "$goalsToBeDoneAfter" | grep "$goalName" &> /dev/null - [[ $? -ne 0 ]] && { - minutes=$( echo "$goals" | jq ".$goalName"'.minutes' -r) - #remove the previously added entry to readd with the goal info - sed -i '$ d' $WHATNEXT_HISTORY - goalStr="$goalName $minutes" - echo "$( date "+%Y-%m-%d %H:%M:%S")|$subject|$doneDescription|$goalStr" >> "$WHATNEXT_HISTORY" - exit - } - - done -} - -exit 0 diff --git a/build/src/whatnext-master/editSubjectDescription.sh b/build/src/whatnext-master/editSubjectDescription.sh deleted file mode 100755 index b3057e0..0000000 --- a/build/src/whatnext-master/editSubjectDescription.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -subject=$1 -[[ -z "$subject" ]] || [[ ! $($__dir/gateway.sh listSubjectsNames | egrep "^$subject") ]] && { - echo 'subject not found' - exit 1 -} -file=$(echo /tmp/$(date "+%Y-%m-%d_%H-%I-%S")) -subjectDescription=$($__dir/gateway.sh listSubjects | egrep "^$subject" | rev | cut -d'|' -f1 | rev ) -echo "$subjectDescription" | tr '_' '\n' > $file - -$EDITOR "$file" -newContent=$(cat $file | tr '\n' '_') -$__dir/gateway.sh addWhatToDoNextToSubjet "$subject" "$newContent" -exit diff --git a/build/src/whatnext-master/gateway.sh b/build/src/whatnext-master/gateway.sh deleted file mode 100755 index a33de72..0000000 --- a/build/src/whatnext-master/gateway.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env bash - -listSubjectsNames() { - cat "$WHATNEXT_CONF" | cut -d '|' -f1 -} - -listSubjects() { - cat "$WHATNEXT_CONF" | sed -e /^$/d -} - -listSubject() { - subject=$1 - cat "$WHATNEXT_CONF" | grep "$subject" | sed -e /^$/d -} - -goalExists() { - goalName="$1" - goals=$(cat $WHATNEXT_GOALS) - result=$(echo "$goals" | jq ".$goalName") - test "$result" != "null" -} - -subjectExists() { - subject="$1" - [[ -z "$subject" ]] && { - return 1 - } - - listSubjectsNames | grep "$subject"&>/dev/null || { - return 1 - } - - - return 0 -} - - -listHistoryDesc() { - tac "$WHATNEXT_HISTORY" | sed -e /^$/d -} - -listHistory() { - cat "$WHATNEXT_HISTORY" | sed -e /^$/d -} - -lastEntryName() { - tail -n 1 "$WHATNEXT_HISTORY" | cut -d '|' -f2 | tr -d "\n" -} - -lastStudiedDateForSubject() { - subject="$1" - tac "$WHATNEXT_HISTORY" | grep "|$subject|" | head -n1 | cut -d '|' -f1 | tr -d "\n" -} - -daysSinceLastStudy() { - date=$(lastStudiedDateForSubject "$1") - - # subject never studied - [ -z "$date" ] && { - return - } - - start_ts=$(date -d "$date" '+%s') - end_ts=$(date '+%s') - - echo $(( ( $end_ts - $start_ts )/(60*60*24) )) | tr -d "\n" -} - -unique_occurence_from_last_to_earlier() { - cat "$WHATNEXT_HISTORY" | cut -d '|' -f2 | uniq -} - -new_subjects() { - already_practiced_names=$(unique_occurence_from_last_to_earlier) - subjects=$(listSubjectsNames) - - pattern=$(tr "\n" "|" <<< $already_practiced_names) - #deletes last pipe - pattern=${pattern%?} - [[ -z "$pattern" ]] && { - echo "$subjects" - return - } - - echo "$subjects" | grep -E -v "$pattern" -} - - -doneToday() { - cat "$WHATNEXT_HISTORY" | grep "$(date '+%Y-%m-%d')" -} - - -missingTimeToTaskByName() -{ - listSubjects | egrep "^$1" | cut -d'|' -f4 | tr -d "\n" -} - - -donePeriod() { -from=$1 -to="$2" -[[ -z "$to" ]] && { - to=$(date -d'today 23:59:59' +%s) -} -IFS=' -' - for entry in $(listHistory) - do - date=$(cut -d ' ' -f1 <<< $entry) - realDate=$(date --date "$date 00:00:00" +%s) - if [[ $realDate -lt $from ]] - then - continue - fi - if [[ $realDate -gt $to ]] - then - continue - fi - - echo $entry - done -} - -addWhatToDoNextToSubjet() { - subject="$1" - what_to_do_next="$2" - subject_config=$(cat $WHATNEXT_CONF | egrep "^$subject") - subject_config_without_description=$(echo "$subject_config" | rev | cut -d '|' -f1 --complement | rev) - newSubjectConfigEntry="$subject_config_without_description|$what_to_do_next" - - sed -i "/^$subject/d" $WHATNEXT_CONF - echo "$newSubjectConfigEntry" >> $WHATNEXT_CONF -} - -currentStreak() { - hist=$(listHistoryDesc) - -IFS=' -' - streak=0 - daysAgoCounter=1 - - while true - do - refDate=$(date --date "$daysAgoCounter day ago" "+%Y-%m-%d") - (echo "$hist" | grep "$refDate" &>/dev/null) || break - daysAgoCounter=$(($daysAgoCounter + 1)) - streak=$(($streak + 1)) - done - - echo $streak -} - -"$@" diff --git a/build/src/whatnext-master/goalStatus.sh b/build/src/whatnext-master/goalStatus.sh deleted file mode 100755 index f950fda..0000000 --- a/build/src/whatnext-master/goalStatus.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash - -# set -o xtrace -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -timeOnSubject() { - $__dir/timePerSubject.py --no-color | grep "$1" | cut -d ' ' -f2 -} - -goalName="$1" -goals=$(cat $WHATNEXT_GOALS) -$__dir/gateway.sh goalExists "$goalName" -if [ $? -ne 0 ] -then - echo "No goal named $goalName" - exit 1 -fi - -subject=$( echo "$goals" | jq ".$goalName"'.subject' -r) -dateStart=$( echo "$goals" | jq ".$goalName"'.from' -r) -dateEnd=$( echo "$goals" | jq ".$goalName"'.to' -r) -minutes=$( echo "$goals" | jq ".$goalName"'.minutes' -r) - -doneInPeriod=$(NO_COLOR=1 $__dir/timePerSubject.py "$dateStart" "$dateEnd" | - grep "$subject" | cut -d ':' -f2 | tr -d " ") -doneInPeriod=${doneInPeriod:-0} - -timeMissing=$(($minutes - $doneInPeriod)) -percentageDone=$(( 100 * $doneInPeriod / $minutes )) -resetColor=$WN_COLOR_RESET -titleColor=$WN_COLOR_TITLE - -start_ts=$(date '+%s') -end_ts=$(date -d "$dateEnd" '+%s') -remaingingDays=$(( ( end_ts - start_ts )/(60*60*24) )) - -percentageColor=$WN_COLOR_RED -[ $percentageDone -ge 33 ] && { - percentageColor=$WN_COLOR_ORANGE -} -[ $percentageDone -ge 66 ] && { - percentageColor=$WN_COLOR_GREEN -} -[ $percentageDone -ge 100 ] && { - percentageDone=100 -} - -[ ! -z ${NO_COLOR+x} ] && { - percentageColor="" - resetColor="" - titleColor="" -} - -echo -e "$percentageColor$percentageDone$resetColoryour$resetColor% done $titleColor$timeMissing$resetColor min remaining in $remaingingDays days" diff --git a/build/src/whatnext-master/goals.sh b/build/src/whatnext-master/goals.sh deleted file mode 100755 index b4c759c..0000000 --- a/build/src/whatnext-master/goals.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -goals=$(cat $WHATNEXT_GOALS | jq 'keys[]' -r) - -IFS=' -' - -[ ! -z ${NO_COLOR+x} ] && { - WN_COLOR_TITLE="" - WN_COLOR_RESET="" -} - -data="" -for i in $goals -do - data="$(echo -e "$WN_COLOR_TITLE$i:$WN_COLOR_RESET "$($__dir/goalStatus.sh $i )) -$data" -done - -echo "$data" | egrep -v "^$" | sort -k2 -t " " -r diff --git a/build/src/whatnext-master/init.sh b/build/src/whatnext-master/init.sh deleted file mode 100755 index acbda96..0000000 --- a/build/src/whatnext-master/init.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -[ ! -f "$WHATNEXT_CONF" ] && { - echo "myFirstSubject|50|50|do something" > "$WHATNEXT_CONF" -} - -[ ! -f "$WHATNEXT_HISTORY" ] && { - touch "$WHATNEXT_HISTORY" -} - -[ ! -f "$WHATNEXT_GOALS" ] && { - touch "$WHATNEXT_GOALS" -} - diff --git a/build/src/whatnext-master/log.sh b/build/src/whatnext-master/log.sh deleted file mode 100755 index ad6cf74..0000000 --- a/build/src/whatnext-master/log.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash - -IFS=' -' -[ ! -z ${NO_COLOR+x} ] && { - WN_COLOR_ORANGE="" - WN_COLOR_RESET="" - WN_COLOR_TITLE="" - WN_COLOR_GREEN="" -} - -[[ "$*" =~ "--help" ]] && { - - echo "View the log - - Options: - --filter to filter by text - " - exit 0 -} - - -filter="" -if [[ "$1" =~ "--filter" ]] -then -shift - filter="$1" - log=$(tac "$WHATNEXT_HISTORY" | grep "$filter") -else - log=$(tac "$WHATNEXT_HISTORY") -fi - -current_entry=$(echo "$log" | wc -l ) - -for i in $log -do - date=$(echo $i | cut -d '|' -f1) - subject=$(echo $i | cut -d '|' -f2) - description=$(echo $i | cut -d '|' -f3) - goal=$(echo $i | cut -d '|' -f4) - echo -e $WN_COLOR_ORANGE"task $current_entry: $subject$WN_COLOR_RESET" - echo "Date: $date" - [ ! -z "$goal" ] && { - name=$(echo $goal | cut -d ' ' -f1) - minutes=$(echo $goal | cut -d ' ' -f2 | tr -d ' ') - echo -e "$WN_COLOR_GREEN Goal: $name completed a total of $minutes minutes" - } - [ ! -z "$description" ] && { - echo " - $description" - } - echo "" - current_entry=$(( $current_entry - 1 )) - -done - diff --git a/build/src/whatnext-master/scheduler.py b/build/src/whatnext-master/scheduler.py deleted file mode 100755 index 214b494..0000000 --- a/build/src/whatnext-master/scheduler.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env python3 - -import operator -import subprocess -import datetime -import sys -import math -import os -from timePerSubject import time_of_subjects -from timeToStr import minutes_to_str - -def memoize(function): - from functools import wraps - memo = {} - @wraps(function) - def wrapper(*args): - if str(args) in memo: - return memo[str(args)] - else: - rv = function(*args) - memo[str(args)] = rv - return rv - return wrapper - -@memoize -def gateway(params): - prefix = [ os.path.dirname(os.path.realpath(__file__)) + '/gateway.sh'] - return subprocess.run(prefix + params, stdout=subprocess.PIPE).stdout.decode('UTF-8') - -class Subject: - def __init__(self, name, weight, priority, complexity, what_to_do_next, days_since_last_study, time_already_invested): - self.name = name - self.weight = weight - self.priority = priority - self.complexity = complexity - self.what_to_do_next = what_to_do_next - self.days_since_last_study = days_since_last_study - self.time_already_invested = time_already_invested - - -def factory_subjects(): - subjects = gateway(['listSubjects']) - time_already_invested = time_of_subjects() - #build the initial dic - subjects_configs = {} - for line in subjects.splitlines() : - columns = line.split('|') - subjects_configs[columns[0]] = Subject( - name=columns[0], - weight=1, - priority=int(columns[1]), - complexity=int(columns[2]), - what_to_do_next=columns[3], - days_since_last_study=gateway(['daysSinceLastStudy', columns[0]]), - time_already_invested=time_already_invested[columns[0]] if columns[0] in time_already_invested else 0 - ) - - return subjects_configs - - -# change values based on the importance of the subject configured -def configure_importance(subjects_configs): - for subject in subjects_configs: - subjects_configs[subject].weight += subjects_configs[subject].weight * (math.pow(subjects_configs[subject].priority, 2) * 0.9) - - return subjects_configs - -def configure_subjects(): - subjects_configs = factory_subjects() - subjects_configs = configure_importance(subjects_configs) - - # give less probability to the latest and more to the earlier - for subject in subjects_configs: - if subjects_configs[subject].days_since_last_study == "": - subjects_configs[subject].weight = (subjects_configs[subject].weight * subjects_configs[subject].weight * 0.2) - continue - days_since_last_study = int(subjects_configs[subject].days_since_last_study) - subjects_configs[subject].weight += subjects_configs[subject].weight * days_since_last_study - - # turns the last one less probable to repeat - last_entry = gateway(['lastEntryName']) - if last_entry in subjects_configs: - subjects_configs[last_entry].weight = subjects_configs[last_entry].weight / 4 - - # give more probability to new subjects (which were never used) - new_subjects = gateway(['new_subjects']) - for subject in new_subjects.splitlines() : - subjects_configs[subject].weight = subjects_configs[subject].weight * 1.1 - - # -- contextual calculai in the end -- - - now = datetime.datetime.now() - #tired period - if (now.hour > 22 or now.hour < 4) or os.environ.get('TIRED') is not None: - for subject in subjects_configs: - base = (1 / math.pow(subjects_configs[subject].complexity,9)) - subjects_configs[subject].weight = subjects_configs[subject].weight * base - - return subjects_configs - -# -- printing --- - -orange = os.getenv('WN_COLOR_ORANGE').encode('utf-8').decode('unicode_escape') -green = os.getenv('WN_COLOR_GREEN').encode('utf-8').decode('unicode_escape') -red = os.getenv('WN_COLOR_RED').encode('utf-8').decode('unicode_escape') -reset = os.getenv('WN_COLOR_RESET').encode('utf-8').decode('unicode_escape') -title = os.getenv('WN_COLOR_TITLE').encode('utf-8').decode('unicode_escape') -section_color = os.getenv('WN_COLOR_SECTION').encode('utf-8').decode('unicode_escape') - -if os.environ.get('NO_COLOR') is not None: - orange='' - green='' - red='' - reset='' - title='' - - -def get_days_since_last_study_str(subject): - days_since_last_study_str = subject.days_since_last_study - days_since_last_study_int = int(days_since_last_study_str) if days_since_last_study_str.isdigit() else 0 - - if days_since_last_study_int < 7: - daysColor = green - elif days_since_last_study_int > 7 and days_since_last_study_int < 30: - daysColor = orange - else: - daysColor = red - - if days_since_last_study_str == '': - days_since_last_study_str = '' - daysColor = orange - else: - days_since_last_study_str = daysColor + days_since_last_study_str + ' days ago' - - return days_since_last_study_str - -def print_result(subjects_configs): - sorted_subjects = sorted(subjects_configs.items(), key=lambda x: x[1].weight, reverse=True) - counter = 1 - first = True - for subject,weight in sorted_subjects: - days_since_last_study_str = get_days_since_last_study_str(subjects_configs[subject]) - time_invested = green + minutes_to_str(subjects_configs[subject].time_already_invested) + reset - - time_invested = " - " + time_invested if len(time_invested) > 4 else "" - - print ( title + str(counter) + '. ' + subject + reset + ': ' + days_since_last_study_str + reset + time_invested + reset + ' ' + subjects_configs[subject].what_to_do_next + reset) - counter += 1 - -print_result(configure_subjects()) diff --git a/build/src/whatnext-master/status.sh b/build/src/whatnext-master/status.sh deleted file mode 100755 index a879a83..0000000 --- a/build/src/whatnext-master/status.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash - -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -doneToday=$($__dir/gateway.sh donePeriod $(date --date='today 00:00:00' +%s) | wc -l) - -doneYesterday=$($__dir/gateway.sh donePeriod $(date --date='yesterday 00:00:00' +%s) $(date --date='yesterday 23:59:59' +%s) | wc -l) - -doneWeek=$($__dir/gateway.sh donePeriod "$(date --date='last sunday' +%s)" | wc -l) - - -previousWeek=$(python -c " -from datetime import timedelta,datetime -from dateutil.relativedelta import relativedelta, FR -date = datetime.now() + relativedelta(weekday=FR(-1)) -year, week, dow = date.isocalendar() -if dow == 7: - start_date = date -else: - start_date = date - timedelta(dow) -end_date = start_date + timedelta(6) -print (start_date.strftime('%s')) -print (end_date.strftime('%s')) -") - -previousWeekFrom=$(echo "$previousWeek" | head -n1) -previousWeekTo=$(echo "$previousWeek" | tail -n1) - -donePreviousWeek=$($__dir/gateway.sh donePeriod "$previousWeekFrom" "$previousWeekTo" | wc -l) - - -daysInARow=$($__dir/gateway.sh currentStreak) - -resetColor=$WN_COLOR_RESET -sectionColor="\x1b[1;49;95m" -[ $doneToday -ge $doneYesterday ] && { - dayColor=$WN_COLOR_GREEN -} || { - dayColor=$WN_COLOR_RED -} -[ $doneWeek -ge $donePreviousWeek ] && { - weekColor=$WN_COLOR_GREEN -} || { - weekColor=$WN_COLOR_RED -} - - -[ ! -z ${NO_COLOR+x} ] && { - resetColor="" - sectionColor="" - dayColor="" - weekColor="" - WN_COLOR_TITLE="" -} - -echo -e "$sectionColor""Status$resetColor" -echo -e "$WN_COLOR_TITLE""Today$resetColor: $dayColor$doneToday$resetColor" -echo -e "$WN_COLOR_TITLE""Yesterday$resetColor: $dayColor$doneYesterday$resetColor" -echo -e "$WN_COLOR_TITLE""Week$resetColor: $weekColor$doneWeek$resetColor" -echo -e "$WN_COLOR_TITLE""Previous Week$resetColor: $weekColor$donePreviousWeek$resetColor" - -echo -e "$WN_COLOR_TITLE""Current streak$resetColor: $weekColor$daysInARow$resetColor days" - diff --git a/build/src/whatnext-master/test/.gitignore b/build/src/whatnext-master/test/.gitignore deleted file mode 100644 index 87364a2..0000000 --- a/build/src/whatnext-master/test/.gitignore +++ /dev/null @@ -1 +0,0 @@ -test-results diff --git a/build/src/whatnext-master/test/done.sh b/build/src/whatnext-master/test/done.sh deleted file mode 100755 index 387bec4..0000000 --- a/build/src/whatnext-master/test/done.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - - # set -o xtrace -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -WHATNEXT_BIN="$__dir/../whatnext" -test_description="basic testing" - -. sharness.sh - -touch /tmp/foo -export WHATNEXT_CONF="/tmp/wncfg" -export WHATNEXT_HISTORY="/tmp/wnhistory" -export NO_COLOR=1 - - -rm -rf $WHATNEXT_CONF || true -rm -rf $WHATNEXT_HISTORY || true - -$WHATNEXT_BIN init - -test_expect_failure "cannot done empty subject" " - $WHATNEXT_BIN done -" - -test_done diff --git a/build/src/whatnext-master/test/editThings.sh b/build/src/whatnext-master/test/editThings.sh deleted file mode 100755 index df94a47..0000000 --- a/build/src/whatnext-master/test/editThings.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - - # set -o xtrace -__dir="$(cd "$(dirname "${bash_source[0]}")" && pwd)" - -whatnext_bin="$__dir/../whatnext" -test_description="basic testing" - -. sharness.sh - -touch /tmp/foo -export whatnext_conf="/tmp/wncfg" -export whatnext_history="/tmp/wnhistory" -export no_color=1 - - -rm -rf $whatnext_conf || true -rm -rf $whatnext_history || true - -$whatnext_bin init &> /dev/null - -test_expect_failure "cannot edit empty subject" " - $whatnext_bin esd -" - -test_done diff --git a/build/src/whatnext-master/test/goals.sh b/build/src/whatnext-master/test/goals.sh deleted file mode 100755 index 0cf8384..0000000 --- a/build/src/whatnext-master/test/goals.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -WHATNEXT_BIN="$__dir/../whatnext" -test_description="basic testing" - -. sharness.sh - -touch /tmp/foo -export WHATNEXT_CONF="/tmp/wncfg" -export WHATNEXT_HISTORY="/tmp/wnhistory" -export WHATNEXT_GOALS="/tmp/wngoals" -export NO_COLOR=1 - - -rm -rf $WHATNEXT_CONF || true -rm -rf $WHATNEXT_HISTORY || true -rm -rf $WHATNEXT_GOALS || true - -test_expect_success "goal initalization" " - $WHATNEXT_BIN init && - test -f $WHATNEXT_GOALS && - echo \"math|90|90|study calculus\" >> $WHATNEXT_CONF -" - -today=$(date --date="today" "+%Y-%m-%d") -nextWeek=$(date --date="next Friday" "+%Y-%m-%d") - -cat >$WHATNEXT_GOALS <> $WHATNEXT_CONF && - $WHATNEXT_BIN | grep math -" - -test_expect_success "done subject appears on log" " - $WHATNEXT_BIN done math \"studied calculus\" && - $WHATNEXT_BIN log | grep 'math' -" - -test_done diff --git a/build/src/whatnext-master/test/status.sh b/build/src/whatnext-master/test/status.sh deleted file mode 100755 index a5d2504..0000000 --- a/build/src/whatnext-master/test/status.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - - # set -o xtrace -scriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -whatnextBin="$scriptDir/../whatnext" -statusBin="$scriptDir/../status.sh" -test_description="status" - -. sharness.sh - -touch /tmp/foo -export WHATNEXT_CONF="/tmp/wncfg" -export WHATNEXT_HISTORY="/tmp/wnhistory" -export WHATNEXT_GOALS="/tmp/wngoals" -export NO_COLOR=1 - -rm -rf $WHATNEXT_CONF || true -rm -rf $WHATNEXT_HISTORY || true - -$whatnextBin init &> /dev/null - -test_expect_success "test has fields" " - $statusBin | grep -i today -" - -test_done diff --git a/build/src/whatnext-master/testAll.sh b/build/src/whatnext-master/testAll.sh deleted file mode 100755 index d81d45d..0000000 --- a/build/src/whatnext-master/testAll.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -files=$(ls test/*.sh) - -IFS=' -' - -for i in $files -do - ./$i -done - - - diff --git a/build/src/whatnext-master/timePerSubject.py b/build/src/whatnext-master/timePerSubject.py deleted file mode 100755 index 44b12b4..0000000 --- a/build/src/whatnext-master/timePerSubject.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python3 - -import operator -import subprocess -import datetime -import sys -import math -from datetime import datetime, timedelta -import os -from timeToStr import minutes_to_str - -humanMode=False - -def gateway(params): - prefix = [ os.path.dirname(os.path.realpath(__file__)) + '/gateway.sh'] - return subprocess.run(prefix + params, stdout=subprocess.PIPE).stdout.decode('UTF-8') - -def time_of_subjects(dateStart=None, dateEnd=None): - if dateStart is None: - dateStart = datetime.strptime('1970-01-01', '%Y-%m-%d') - if dateEnd is None: - dateEnd = datetime.strptime('3000-01-01', '%Y-%m-%d') - - history = gateway(['listHistory']) - subjectsConfigs = {} - subjects = gateway(['listHistory']) - #build the initial dic - subjectData = {} - - for line in subjects.splitlines(): - columns = line.split('|') - name=columns[1] - doneStartStr=columns[0] - doneStart = datetime.strptime(doneStartStr, '%Y-%m-%d %H:%M:%S') - - if doneStart > dateStart and doneStart < dateEnd: - subjectData[name] = subjectData[name]+50 if name in subjectData else 50; - - return subjectData - - -if __name__ == '__main__': - if len(sys.argv) > 1 and any(map(lambda x: x == "help", sys.argv)): - print("""The total of time one spent on each subject - Usage: - - program month returns the totals of the month - program week returns the totals of the year - - """) - sys.exit() - - - if len(sys.argv) > 1 and any(map(lambda x: x == "human", sys.argv)): - humanMode=True - - dateStart = None - dateEnd = None - if len(sys.argv) > 1 and any(map(lambda x: x == "month", sys.argv)): - dateStart = datetime.now().replace(day=1) - dateEnd = dateStart + timedelta(days=30) - if len(sys.argv) > 1 and any(map(lambda x: x == "week", sys.argv)): - today = datetime.now() - dateStart = today - timedelta(days=today.weekday()) - dateEnd = dateStart + timedelta(days=6) - - if len(list(filter(lambda x: x != "--no-color", sys.argv))) == 3: - dateStart = datetime.strptime(sys.argv[1], '%Y-%m-%d') - dateEnd = datetime.strptime(sys.argv[2], '%Y-%m-%d') - - subjectData=time_of_subjects(dateStart, dateEnd) - - sortedSubjects = sorted(subjectData.items(), key=lambda value: value[1], reverse=True) - - resetColor = os.getenv('WN_COLOR_RESET').encode('utf-8').decode('unicode_escape') - titleColor = os.getenv('WN_COLOR_TITLE').encode('utf-8').decode('unicode_escape') - orange = os.getenv('WN_COLOR_ORANGE').encode('utf-8').decode('unicode_escape') - - - if os.environ.get('NO_COLOR') is not None: - titleColor='' - resetColor='' - orange='' - - total = 0 - for item in sortedSubjects: - total+= item[1] - timeInSubject = minutes_to_str(item[1]) if (humanMode) else str(item[1]) - print( titleColor + item[0] + resetColor + ": " + orange + timeInSubject + resetColor) - - total = minutes_to_str(total) if (humanMode) else str(total) - - print( titleColor + "Total" + resetColor + ": " + orange + total + resetColor) diff --git a/build/src/whatnext-master/timeToStr.py b/build/src/whatnext-master/timeToStr.py deleted file mode 100755 index efc6aba..0000000 --- a/build/src/whatnext-master/timeToStr.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 -import sys - -intervals = ( - ('weeks', 604800), # 60 * 60 * 24 * 7 - ('days', 86400), # 60 * 60 * 24 - ('hours', 3600), # 60 * 60 - ('minutes', 60), - ('seconds', 1), - ) - -granularity = 2 - - -def seconds_to_str(seconds): - result = [] - for name, count in intervals: - value = seconds // count - if value: - seconds -= value * count - if value == 1: - name = name.rstrip('s') - result.append("{} {}".format(value, name)) - return ', '.join(result[:granularity]) - - -def minutes_to_str(minutes): - seconds = minutes * 60 - return seconds_to_str(seconds) - - -if __name__ == '__main__': - if len(sys.argv) == 1: - time = int(sys.stdin.readlines()[0]) - else: - time = int(sys.argv[1]) - - if len(sys.argv) > 2: - if sys.argv[2] == "--from-minutes" : - print(minutes_to_str(time)) - sys.exit(0) - - print (seconds_to_str(time)) diff --git a/build/src/whatnext-master/whatnext b/build/src/whatnext-master/whatnext deleted file mode 100755 index 2484f20..0000000 --- a/build/src/whatnext-master/whatnext +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env bash - -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source $__dir/config.sh - - -get_help() { - command="whatnext" - echo "A tool to help schedule studies - - Usage: - - $command (edit-subjects|es) opens the subjects on your editor - $command (edit-subject-description|esd) edit the subject description - $command (edit-history|eh) opens the history on your editor - $command (done | -d ) [what to do next] opens the history on your editor - $command total show how much did you spent in any activity - $command log shows the log - $command (status|s) get current status of your studies - $command goal show your goals status $command (edit-goals|eg) edit your goals - " -} - -[[ "$*" =~ ^--help$ ]] || [[ "$*" =~ ^-h$ ]] || [[ "$*" =~ ^h$ ]] && { - get_help - exit -} - -[[ "$1" == "-d" ]] || [[ "$1" == "done" ]] && { - $__dir/done.sh "${@:2}" - exit -} - -[[ "$1" == "level" ]] && { - $__dir/level.sh "${@:2}" - exit -} -[[ "$1" =~ "detail" ]] && { - $__dir/detail.py "${@:2}" | less - exit -} - -[[ "$*" =~ "total" ]] && { - $__dir/timePerSubject.py human "${@:2}" | less - exit -} -[[ "$*" =~ goal$ ]] && { - $__dir/goals.sh "${@:2}" - exit -} - -[[ "$*" == "status" ]] || [[ "$*" == "s" ]] && { - $__dir/status.sh "${@:2}" - - echo "" - echo -e "$sectionColor""Goals$resetColor" - $__dir/goals.sh | head -n 5 - - echo "" - echo -e "$sectionColor""Top subjects$resetColor" - - - result=$($__dir/timePerSubject.py human) - echo "$result" | tail -n1 - echo "$result" | head -n 5 - - exit -} - -[[ "$*" == "init" ]] && { - $__dir/init.sh "${@:2}" - exit -} - -[[ "$*" =~ "log" ]] && { - $__dir/log.sh "${@:2}" | less - exit -} - -[[ "$*" == "list-subjects" ]] && { - $__dir/gateway.sh list_subjects_names - exit -} - -[[ "$*" == "edit-goals" ]] || [[ "$*" =~ ^eg$ ]] && { - $EDITOR "$WHATNEXT_GOALS" - exit -} - -[[ "$*" == "edit-subjects" ]] || [[ "$1" == "es" ]] && { - $EDITOR "$WHATNEXT_CONF" - exit -} - -[[ "$*" =~ "edit-subject-description" ]] || [[ "$*" =~ "esd" ]] && { - $__dir/editSubjectDescription.sh "${@:2}" - exit -} - -[[ "$*" == "eh" ]] || [[ "$*" == "edit-history" ]] && { - $EDITOR "$WHATNEXT_HISTORY" - exit -} - -[[ ! -z "$*" ]] && { - echo "Option not found" - exit 1 -} - -if [ ! -z ${NO_COLOR+x} ] -then - $__dir/scheduler.py -else - $__dir/scheduler.py | less -fi - diff --git a/build/whatnext-0.1-1-x86_64.pkg.tar.xz b/build/whatnext-0.1-1-x86_64.pkg.tar.xz deleted file mode 100644 index 3cd342936fd4536cc770a2f29ad6510a759fa39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21208 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