NEDDHXUK3GNFMOFO3KLU7NRIHCTYNWBT3D6HTKZAOXFDE6HMDZ6AC
6L5BK5EHPAOQX3JCKUJ273UDNAC23LPQL4HIJGM4AV3P3QK5OKIQC
MGOF7IUFGXYQKZOKMM2GGULFFVAULEHLZDSHMUW6B5DBKVXXR74AC
KEP5WUFJXTMKRRNZLYTGYYWA4VLFCMHTKTJYF5EA5IWBYFMU6WYQC
EKY7U7SKPF45OOUAHJBEQKXSUXWOHFBQFFVJWPBN5ARFJUFM2BPAC
LAROLAYUGJ4Q5AEFV5EJMIA2ZKBNCBWHHHPCJ3CKCNIUIYUKRFVQC
75N3UJ4JK56KXF56GASGPAWLFYGJDETVJNYTF4KXFCQM767JUU5AC
WO2MINIF4TXOHWSE7JWXRZYN64XRVLYIRFMF4SMPSOXKA2V77KMQC
RPAJLHMTUJU4AYNBOHVGHGGB4NY2NLY3BVPYN5FMWB3ZIMAUQHCQC
2XQD6KKKD6QVHFHAEMVE3XXY7X2T7BLTLL7XIILZAXNJJH2YONUQC
IZEVQF627FA7VV25KJAWYWGGC35LZUUBBQRPN5ZAINTQLPEDRTEAC
4U7F3CPIDTK6JSEDMNMHVKSR7HOQDLZQD2PPVMDLHO5SFSIMUXZAC
ZP62WC472OTQETO2HTHIQIPO57XZIWVKPA4KL62GYU4OZDMB6NSAC
TLQ72DSJD7GGPWN6HGBHAVPBRQFKEQ6KSK43U7JWWID4ZWAF47JAC
7HPY3QPFPN35PSPUBVNW2GTFB3CBQZBST4J2BAVJ7QMXLIUN52JAC
4IQVQL4TS35GL2GYZJG254TKJLL5EHMRSFT77Z4VTRZIG2TMBM3QC
O5FVTOM6YFBLEPF3S576K6IMT6ZZ5VQCSB3YVXNS4CKBITKCRZ7AC
HE3JTXO37O4MOMWPZ4BRBHP53KBPZDG3PCSUCVNOKIS7IY26OCIAC
QMRKFEPGFBCEWAIXPEIG5ILKAJ2JH5L3TOITHR4HNJXK5FN3KXBQC
GCVQD44VRPQVKPZEPIC4AOIXLJIG2ZMV3QI2Y7KALUT6NVUBSGSAC
7KZP4RHZ3QSYTPPQ257A65Z5UPX44TF2LAI2U5EMULQCLDCEUK2AC
A6HKMINBNGQLLX4QJMYWKQ4JAEHVJ4HIRVDKPPDI3FJUO2AAB7OQC
FD7SV5I6VCW27HZ3T3K4MMGB2OYGJTPKFFA263TNTAMRJGQJWVNAC
KNSI575VAW6HRCZYXOEPQ4DTSML4EORML5MV4DJBRKE7TXCPS4EAC
Z7KS5XHHC6PAMTVBHXY7KUSS3BWAOU6FSYIITUCFOOJZU4OUJHBAC
LD4GLVSF6YTA7OZWIGJ45H6TUXGM4WKUIYXKWQFNUP36WDMYSMXAC
TNR3TEHKVADAEZSTOD2XLSUTSW5AWST2YUW4CWK5KE7DSC6XHZNAC
ZITLSTYXUOESFELOW3DLBKWKMSS5ZJYCTKMK4Z44WGIYAKYSMMVAC
EMVTF2IWNQGRL44FC4JNG5FYYQTZSFPNM6SOM7IAEH6T7PPK2NVAC
EQXRXRZDYCM7BDAVBOXQYPG6C7IJT3OFGNIXCDAHJJBRKAXNGL7AC
4SCFOJGNDAN4XZEAPWQQCBJ3CGZCJP3HUADRQLYZ2ITAKA7EJJTQC
SCXG6TJWYIPRUMT27KGKIIF6FYKTUTY74UNZ2FQTT63XZ6HIF3AAC
NVOCQVASZWTKQJG7GPH7KHKZZR7NUG4WLV5YY4KAIRPCJRWCZPIAC
EZQG2APB36DDMIAYDPPDGOIXOD7K2RZZSGC2NKGZIHB2HZBTW7EQC
5DRIWGLUKMQZU2ZPBXSTLAWJKAMOD5YXAHM5LEDQHDFGYYLHWCDQC
7DBNV3GV773FH5ZLQWFX4RBOS4Q3CIK2RYZNNABY3ZOETYZCXRNQC
RSEB2NFGUBTFESE5BJKDUVQL5Y5ZVGY5O4CJX2LNP63MS3NRHHZQC
GKGVYBZGPJXO7N7GLHLRNYQPXFHBQSNQN53OKRFCXLQEYDTC5I4QC
Y35QCWYW2OTZ27ZVTH2BA3XJTUCJ2WMLKU32ZCOCDY3AW7TIZXRAC
4QX5E5ACVN57KJLCWOM4JEI6JSV4XZNCWVYPOTKSOMUW3SOMCNJAC
N4NDAZYTLSI2W22KT3SYXL257DBMSH3UT2BXOYM7LH7FSZAY4RLAC
SLL7262CJUE7TZDDZZXFROHCVVDA527WA4PHXCKEGZUJF2EN5MQAC
PBD7LZYQHXAA3KLH2ZUX5GW4UFML6BQ32KXZF4KZ6OYFASUYFJ5QC
V2VDN77HCSRYYWXDJJ2XOVHV4P6PVWNJZLXZ7JUYPQEZQIH5BZ3QC
I2KHGVD44KT4MQJXGCTVSQKMBO6TVCY72F26TLXGWRL6PHGF6RNQC
BROSTG5KP3NUNLSYPVQID254TE47E5RKQAKLPIY7PGWETE6JNMTAC
BXGLKYRXO2O4NRM3BLNWQ7AWVPQXAMFS57MFYHJNOZZEZZW5BH6AC
MB5SHULBN3WP7TGUWZDP6BRGP423FTYKF67T5IF5YHHLNXKQ5REAC
XTBSG4C7SCZUFOU2BTNFR6B6TCGYI35BWUV4PVTS3N7KNH5VEARQC
TCOAKCGGHOIRJCTZYEZQ3K6KCGL2LGAYGYFRGSPCHBTJJY2V6AXAC
ADMKQQGCGVSHHIMVQ4XFRDCG544SBJCYALSKZV45CQQBZ4ACUH2AC
2Y2QZFVFSKXEFEGYJB5A7GI735ONWPCF7DVTIY5T73AUEVTZTBBQC
4ZLEDBK7VGLKFUPENAFLUJYNFLKFYJ3TREPQ7P6PKMYGJUXB55HQC
W35DDBFYF6Z4ZPCFEO5RPAONZLYCSNTXUSTS6FIUUVZHCI6Q7GHAC
WZUHEZSBRKHQMNWDKVG4X6DDIQEAXTGI6IGAJ5ERPRQ3W2KUMX4QC
64C6AWH66FDKU6UE6Z6JPX2J2GBM2JOPTH2GL6LHKAIUBGNGDZ5AC
Z3M53KTLZMPOISMHE25SZJSWX5TA37IV33IRE7KNRAD3PKEAEJXQC
VJPT6HDRMJAJD5PT3VOYJYW43ISKLICEHLSDWSROX2XZWO2OFZPQC
2G3GNDDUOVPF45PELJ65ZB2IXEHJJXJILFRVHZXGPXUL4BVNZJFQC
NMWWP4ZNOKHZKSJ6F5KYEREWXXR5F4UD35WOKI3EH42AZWVCTCJAC
P6NR2CGXCWAW6GXXSIXCGOBIRAS2BM4LEM6D5ADPN4IL7TMW6UVAC
OV5AKJHA773ETIJPTMQ7K64U7BRQE34OXJ6FJNH6TZG22WS5QTIAC
import ClassyPrelude
import Control.Lens
import Data.Hourglass
import Data.UUID
import Data.Thyme.Clock as C
import ClassyPrelude
import Control.Lens
import Data.Hourglass
import Data.Thyme.Clock as C
import Data.UUID
import ClassyPrelude
import Control.Lens
import Data.Aeson(toJSON)
import qualified Data.ByteString.Char8 as B
import Control.Monad.Trans.Either
import Data.List as L
import Data.Hourglass
import Data.Thyme.Clock as C
import Data.Thyme.Time
import Data.UUID(UUID)
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Simple.FromField
import Database.PostgreSQL.Simple.FromRow
import ClassyPrelude
import Control.Lens
import Control.Monad.Trans.Either
import Data.Aeson (toJSON)
import qualified Data.ByteString.Char8 as B
import Data.Hourglass
import Data.List as L
import Data.Thyme.Clock as C
import Data.Thyme.Time
import Data.UUID (UUID)
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Simple.FromField
import Database.PostgreSQL.Simple.FromRow
import Aftok
import Aftok.Auction
import Aftok.Database
import Aftok.Interval
import Aftok.TimeLog
import Aftok.Types
import Aftok
import Aftok.Auction
import Aftok.Database
import Aftok.Interval
import Aftok.TimeLog
import Aftok.Types
import Control.Lens(makeLenses, (^.))
import Data.Aeson
import Data.AffineSpace
import Data.Aeson.Types
import Data.Thyme.Clock as C
import Data.Thyme.LocalTime()
import Data.Thyme.Format.Aeson()
import Control.Lens (makeLenses, (^.))
import Data.Aeson
import Data.Aeson.Types
import Data.AffineSpace
import Data.Thyme.Clock as C
import Data.Thyme.Format.Aeson ()
import Data.Thyme.LocalTime ()
import Control.Lens
import Data.AdditiveGroup
import Data.Aeson as A
import Data.AffineSpace
import Data.Foldable as F
import Data.Heap as H
import Data.List.NonEmpty as L
import Data.Map.Strict as MS
import Data.Ratio()
import Data.Thyme.Clock as C
import Data.UUID
import Data.VectorSpace
import Control.Lens
import Data.AdditiveGroup
import Data.Aeson as A
import Data.AffineSpace
import Data.Foldable as F
import Data.Heap as H
import Data.List.NonEmpty as L
import Data.Map.Strict as MS
import Data.Ratio ()
import Data.Thyme.Clock as C
import Data.UUID
import Data.VectorSpace
import Control.Lens(makePrisms, makeLenses)
import Data.Aeson
import Data.Aeson.Types
import Data.ByteString.Base64.URL as B64
import Data.Data
import Data.Thyme.Clock as C
import Data.UUID
import OpenSSL.Random
import Control.Lens (makeLenses, makePrisms)
import Data.Aeson
import Data.Aeson.Types
import Data.ByteString.Base64.URL as B64
import Data.Data
import Data.Thyme.Clock as C
import Data.UUID
import OpenSSL.Random
import qualified Data.ByteString.Char8 as C
import qualified Data.Configurator as C
import qualified Data.Configurator.Types as CT
import qualified Network.Socket as NS
import qualified Network.Mail.SMTP as SMTP
import System.Environment
import System.IO (FilePath)
import qualified Data.ByteString.Char8 as C
import qualified Data.Configurator as C
import qualified Data.Configurator.Types as CT
import qualified Network.Mail.SMTP as SMTP
import qualified Network.Socket as NS
import System.Environment
import System.IO (FilePath)
, pgsConfig :: PGSConfig
, smtpConfig :: SmtpConfig
, templatePath :: System.IO.FilePath
}
, pgsConfig :: PGSConfig
, smtpConfig :: SmtpConfig
, templatePath :: System.IO.FilePath
}
requireProjectId = do
maybePid <- parseParam "projectId" pidParser
maybe (snapError 400 "Value of parameter \"projectId\" cannot be parsed as a valid UUID")
requireProjectId = do
maybePid <- parseParam "projectId" pidParser
maybe (snapError 400 "Value of parameter \"projectId\" cannot be parsed as a valid UUID")
import Control.Lens
import Data.Aeson as A
import Data.Text as T
import Data.Thyme.Clock as C
import Control.Lens
import Data.Aeson as A
import Data.Text as T
import Data.Thyme.Clock as C
import Control.Monad.Trans.Maybe
import Data.ByteString.Char8 as B
import Data.Time.ISO8601
import Data.Thyme.Time
import Data.Thyme.Clock as C
import Control.Monad.Trans.Maybe
import Data.ByteString.Char8 as B
import Data.Thyme.Clock as C
import Data.Thyme.Time
import Data.Time.ISO8601
import Control.Lens
import qualified Data.Aeson as A
import Data.Aeson.Types
import Data.UUID as U
import Data.Thyme.Clock as C
import Control.Lens
import qualified Data.Aeson as A
import Data.Aeson.Types
import Data.Thyme.Clock as C
import Data.UUID as U
import Control.Lens
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Trans.Either
import qualified Data.Aeson as A
import Data.Attoparsec.ByteString(Parser, parseOnly)
import Control.Lens
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Trans.Either
import qualified Data.Aeson as A
import Data.Attoparsec.ByteString (Parser, parseOnly)
import Aftok
import Aftok.Database
import Aftok.Database.PostgreSQL
import Aftok.Util
import Aftok
import Aftok.Database
import Aftok.Database.PostgreSQL
import Aftok.Util
import Snap.Core
import Snap.Snaplet
import Snap.Snaplet.PostgresqlSimple
import qualified Snap.Snaplet.Auth as AU
import Snap.Snaplet.Session
import Snap.Core
import Snap.Snaplet
import qualified Snap.Snaplet.Auth as AU
import Snap.Snaplet.PostgresqlSimple
import Snap.Snaplet.Session
import Aftok.QConfig
import Aftok.Snaplet
import Aftok.Snaplet.Auth
import Aftok.Snaplet.Users
import Aftok.Snaplet.WorkLog
import Aftok.Snaplet.Projects
import Aftok.QConfig
import Aftok.Snaplet
import Aftok.Snaplet.Auth
import Aftok.Snaplet.Projects
import Aftok.Snaplet.Users
import Aftok.Snaplet.WorkLog
import Snap.Core
import Snap.Snaplet
import Snap.Snaplet.PostgresqlSimple
import Snap.Snaplet.Auth.Backends.PostgresqlSimple
import Snap.Snaplet.Session.Backends.CookieSession
import Snap.Core
import Snap.Snaplet
import Snap.Snaplet.Auth.Backends.PostgresqlSimple
import Snap.Snaplet.PostgresqlSimple
import Snap.Snaplet.Session.Backends.CookieSession
]
]
import Control.Lens ((^.))
import Data.AffineSpace
import qualified Data.List.NonEmpty as L
import qualified Data.Map.Strict as M
import Data.Time.ISO8601
import Data.Thyme.Time as T
import Control.Lens ((^.))
import Data.AffineSpace
import qualified Data.List.NonEmpty as L
import qualified Data.Map.Strict as M
import Data.Thyme.Time as T
import Data.Time.ISO8601