From 970e50d1f1d5bc49a3bf0697e82b2472fc314714 Mon Sep 17 00:00:00 2001 From: Vilbrekin Date: Sun, 26 Oct 2014 01:54:50 +0200 Subject: [PATCH 1/2] Correctly check whether parent directory is writable for current user. "&04" was checking if file is readable by others, while "&0200" checks if it's writable for current user. (Fixes #904) --- CONTRIBUTORS | 1 + internal/model/sharedpullerstate.go | 6 ++++-- internal/model/sharedpullerstate_test.go | 26 +++++++++++++++++++++++- internal/model/testdata/read_only_dir/a | 0 internal/osutil/osutil.go | 2 +- 5 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 internal/model/testdata/read_only_dir/a diff --git a/CONTRIBUTORS b/CONTRIBUTORS index af9ec2fb1..9eb21bfe2 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -22,3 +22,4 @@ Phill Luby Ryan Sullivan Tully Robinson Veeti Paananen +Vil Brekin diff --git a/internal/model/sharedpullerstate.go b/internal/model/sharedpullerstate.go index 9557b0b67..eeb22a61c 100644 --- a/internal/model/sharedpullerstate.go +++ b/internal/model/sharedpullerstate.go @@ -20,6 +20,7 @@ import ( "path/filepath" "sync" + "github.com/syncthing/syncthing/internal/osutil" "github.com/syncthing/syncthing/internal/protocol" ) @@ -68,7 +69,7 @@ func (s *sharedPullerState) tempFile() (*os.File, error) { if info, err := os.Stat(dir); err != nil { s.earlyCloseLocked("dst stat dir", err) return nil, err - } else if info.Mode()&04 == 0 { + } else if info.Mode()&0200 == 0 { err := os.Chmod(dir, 0755) if err == nil { defer func() { @@ -136,7 +137,8 @@ func (s *sharedPullerState) earlyCloseLocked(context string, err error) { s.err = err if s.fd != nil { s.fd.Close() - os.Remove(s.tempName) + // Delete temporary file, even if parent dir is read-only + osutil.InWritableDir(func(string) error { os.Remove(s.tempName); return nil }, s.tempName) } s.closed = true } diff --git a/internal/model/sharedpullerstate_test.go b/internal/model/sharedpullerstate_test.go index b669218c9..8d2f6c181 100644 --- a/internal/model/sharedpullerstate_test.go +++ b/internal/model/sharedpullerstate_test.go @@ -15,7 +15,11 @@ package model -import "testing" +import ( + "os" + "path/filepath" + "testing" +) func TestSourceFileOK(t *testing.T) { s := sharedPullerState{ @@ -61,3 +65,23 @@ func TestSourceFileBad(t *testing.T) { t.Fatal("Unexpected nil failed()") } } + +// Test creating temporary file inside read-only directory +func TestReadOnlyDir(t *testing.T) { + s := sharedPullerState{ + tempName: "testdata/read_only_dir/.temp_name", + } + + // Ensure dir is read-only (git doesn't store full permissions) + os.Chmod(filepath.Dir(s.tempName), 0555) + + fd, err := s.tempFile() + if err != nil { + t.Fatal(err) + } + if fd == nil { + t.Fatal("Unexpected nil fd") + } + + s.earlyClose("Test done", nil) +} diff --git a/internal/model/testdata/read_only_dir/a b/internal/model/testdata/read_only_dir/a new file mode 100644 index 000000000..e69de29bb diff --git a/internal/osutil/osutil.go b/internal/osutil/osutil.go index a760a9e8e..66dfd4f91 100644 --- a/internal/osutil/osutil.go +++ b/internal/osutil/osutil.go @@ -66,7 +66,7 @@ func Rename(from, to string) error { // containing `path` is writable for the duration of the call. func InWritableDir(fn func(string) error, path string) error { dir := filepath.Dir(path) - if info, err := os.Stat(dir); err == nil && info.IsDir() && info.Mode()&04 == 0 { + if info, err := os.Stat(dir); err == nil && info.IsDir() && info.Mode()&0200 == 0 { // A non-writeable directory (for this user; we assume that's the // relevant part). Temporarily change the mode so we can delete the // file or directory inside it. From 4b899a813e59ac34db06aa03d42de7b55075157e Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Sun, 26 Oct 2014 13:59:03 +0100 Subject: [PATCH 2/2] Add Vilbrekin --- gui/index.html | 3 ++- internal/auto/gui.files.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gui/index.html b/gui/index.html index 391952805..651cb6e73 100644 --- a/gui/index.html +++ b/gui/index.html @@ -789,11 +789,11 @@
  • Daniel Martí
  • Felix Ableitner
  • Felix Unterpaintner
  • +
  • Gilli Sigurdsson
    • -
    • Gilli Sigurdsson
    • James Patterson
    • Jens Diemer
    • Jochen Voss
    • @@ -805,6 +805,7 @@
    • Ryan Sullivan
    • Tully Robinson
    • Veeti Paananen
    • +
    • Vil Brekin
    diff --git a/internal/auto/gui.files.go b/internal/auto/gui.files.go index 5d8e54678..535743589 100644 --- a/internal/auto/gui.files.go +++ b/internal/auto/gui.files.go @@ -92,7 +92,7 @@ func Assets() map[string][]byte { bs, _ = ioutil.ReadAll(gr) assets["img/logo-text-64.png"] = bs - bs, _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/+x97XLjtrLg/zwFhvckY29Zkp1JZu9ObN/yx0ziZD68ln2y2VT2FCRCEmOK5BCgPYrj+0b7FPti290Av0GRsmWPz81JVTwiCTTQjUZ3o9Fo7D47/nB0/svpazZTc3//i91nvd4XgwE7CqNF7E1nim0cbbKvt3e+YT/yy3DEDsN4ynjgQolAxd4oUWEs2YYUgqmZYEcf3p+fnRxenH84G7KJ54vNPoBDiOczT7IoDqcxnzP4OYmhigwn6prH4hVbhAkb84DFwvWkBiyYp7CpQRizeeh6kwW8QFBJ4IqYmlMinksWTujh+/cX7HsRiJj77DQZ+d6YvfXGIpCCcWga38iZcNloQcXfQAcQ2tD0gb0JATBXXhhsMeFBkZhdiVjCM3uRtmEAbjHo0wZX2O2YhRFW2kRgPFgwn6u8ahP6OZYu8wKCPQsjJCJABbyvPd9nI8ESKSaJv8WgJPv55PyHDxfnCO7g/S/s54Ozs4P35798B4XVLIQC4kpoUN488j2ADHjFPFAL7P6712dHP0D5g8OTtyfnvwAGCOjNyfn718Mhe/PhjB2w04Oz85Oji7cHZ+z04uz0w/B1nw3N0C4h70TDmodARVco7vkyxfsXGFcJnfNdNuNXAsZ3LLwr6BpnY+CxLmPnh8EUQSGWUDinY5+dTFgQqi2G7Lc7Uyp6NRhcX1/3p0HSB0Yd+BqGHOz3v+j1gL2Ry2GAgumeIwKHBdMej6I9Ry6CMUAOpvRqjKwd+r6I95xh+uVIxb7Dxj6Xcs/BQn7ILx0EKbi7/wVju3PAnI1nPJZC7TmJmvT+3ck/YO964mPiXe05/6t3cdA7CucRcNvIFwAWWhQB1Dp5vSfcqSjUC/hc7DlXnriOwlgVil57rprtueIKcOzRwxZwkqc87vfkmPtib6e/XQPkCjmOPWLYAqxaMZ4AR8W1Er4XXMIQ+kAx+KzGwHPeGCHNYjHZc7z5dDDhV/iqHwEx97/ASspTvtjPCMn+ZDc3OIzH1PX30N7G5u3t7kCXy5rRIEdhqGCm8GgwlnKQPfXnXtCHN47pjVr4Aia3UE4VwAQwGABbiWu+6FYjhKkbe0CopuK7Az3mX+yOQndB1V3vqso5r2EyKuKa/d0BfNfEAPnKzsOIjXjMkCPxXcCvMsbiV/hF/9NTUND8dMWEJz6MP4AXVM6bkqyi7pseGCDYC+7BZDLf4KuMQLaW2uiNQDK40DcYtPSLH05Dh8l4rIcSH3tKfFK9l9/QeLKZQJ2w57z42mGa/5ydnf/uDABDbCFrLqq0hUDYzHNdEfQ+SWffzgBRVj/xCwBSEhR+kmrKsKPhQ/J7MHpJBKLBFSfBJGRffcUKj/1AXBdoQvVArCqQ72oRAVH1QzbJRypI28Of8H8vir05jxf0W85TttdCA2TNZdb8xmapncoITP1FNMNZwrJfvfFMXMXwbxI5KTW/EnMZfWcBAzMgkKhm8l+9K+4n8FdrnT3n5qaIOZaQ6vbW2b/Qb4EH2c2XpvSXt+Xho4YGmhoFGoM0LVPcYOPGYeSG10GZstwQ59+cajlg6+kUpR4oW24eilDaSRVOMxrtDnip2ZxzsubmIkiqowGoZD0sDh9YH2oolAI5JXEMV+qLHq/KEO2n4AodLpNyaYc8V8+STp35GI9DV7T1ZxZes5Pjtu5kZPSuQBbGziqdlrNEIek7dTqcTFp7rMHdjYIxcD6PVae+QGUoPmvpz5mG+JAU5COw5zp1GVRRrHpiHqlFS7cPEOaSTu8OEt8+3fMvRpPhDxCNWn01aB5dHvXdGy+WChTXNZjNgb9Ae/A6YB7YbmAMSgkC9TtmaIoWa4BGgtGNuWpF2f4M4E+86UmAxkQmVwBwruhKnfF7c7e383VRURS+Ax2Ez+hvzzRbFmHVskhrl0rtzl4UhHCpDFkxTsoj7L0QrnDBYnixn9GuuQG0J6qiKioM4TmYypoGSUzaH4xqCcsEMPslR6salwlgETM+Vt4V1HDBfs8Mr3mCw2A6psKsEFngoBzLoPsFhVwa+ubuT8A8q2jYDjpWK1P6x1g5sFjzfaPkH3UmV3VejaV8mG0T75NjGczyi9Jj4SE3BcuTQ0wTHww/4OUK65eYPIVHFUMfl8GwqIVFOlqKvpiozby2dTK8XDYXetM4BPODeS6azQhdLp8QZvLc3OjSR/hpQ//unxyDTUejF4tIcJWCxNWu/vUWel63kxonXdlcAHx8HsnUiohgAY/LlH9L+51aH/oZuvg3L3DFJ+wS2fIAIYllGL9iUegFda6FnsAct83sSrEOpt3MdSt8mFIMqHR7uxxgPhUKBjSSVcJ6eDxLyTpUXCVF4ls6WjcfMzC965kAqzEJLgOywS70j7pd2BWSBI6MBOA91D/uAWnMAy2bh+ZXG6waBJCAVeHe2D4tVJc2wtjGzQ3CPBXxGLiOT0WJ6b/ctPVsxT57rpXXbB0+gaKP1Fv7e9Ju5VlclY5mYueSpTQjS9Msndksn+KkAqjIjRe8Yroi29vbY9u39XnbRatSQcVHfqa99QP9xWW8i34j1zyjq46Y2UYqlToBbN9i+wf8NGtXYjBYLQrMKIGCOQ9wG5t0M2RxUW8W0SVZBPXdBlwGTcjcF0vDEGEkgm7YnnI1WwO+CObOGKcm6RwWXP6vGQV/63sBrMQ9O690JokxR3vSm7bR5HUch/F9qNGEwedhhqkfjtpWsN9DGe4zVHlirZhPCfAbzxeS/cm4f80X8n0yH4n49rYmdj0FnTPNb7H/bAR3uFAEbuQFsNK5vT38HGSdhfM2qr4Nxw9CVB/hro2mBO1JkHTsh4nbQ7+EH/KqgVdF7AOsyz5MaC12d+I2lCZnW5M4CmD9qYm/z7bLPprwGhenRZMxdUTYhjEHtIZRRGCWQeRLUEytpBYs0SZw9rdb+rTNDpdZTMQ2j85QwNqX3RTgOy5hxfIQjFS3xb1JarL1z2Al9iHwwZb6Rcjl9GsE9awG63349IYiCcYzMb4UbdP6ZBrgnieY1nNPoitdPvqg6C5gD+Q6xqUE7ikOTWfHDkYTnODKHqyZNViLGmIKcAhiT34O9OWMx6LHfdXqM4dyLvvZu5+pTM1JLXaMpti8i2EI7+3LJPiAS6z6krK2gOzscKSixunY4GbkwRSqNYg33DbsrkfT3WKrHm0XNFEX48E0wY5m2HG51F1J2NsdSPb163JKpdvOhS0KtBwa3U6ogJ+j8+J5xXMLk6fERtpHtdbp3kqXu2Bb2BgsT4MOnYcV7djz2xZwALl9RJscMt2c0w1TaiUndrmxSRjPjb/YtqF+F/c+d11D4U609RPZtuHlusZLvoS+nShYfZzFaZUrT3rkIpo7g4q7v+is15u4BWc9YV/21lNoCIY36Zie+3jyjWM+4+eCF14DP5pM0RH/ax6GsbH5W8fdryZHvPG4m4gkhNzR197R074LIjBQxAbUA4p4KCDU14icHOPwZWUzj7ubR5tkVTYr3veqJ9O+54VezBKWy/2XQOjWTQ6ri3IdDspm92SjJbL+1e+xKcbOujgXGo0RaDcQY9yblL8+V6Hi/nP0Vo0iXEbOBdBgfHuLTxsNZU8CWnSe42Nx5bnZZNA0mjNroF0n1X8RPRTdwkR1J9yHRD0JyqlWQ+DgHbtQnu/9QXvYd6eZXMASe96Hf7r4mR4GW5fL2SjkcRuTHJ1erBXpcZSYzaKKrwceA7D3Yu6/2rm9/fIO1EhNbtMStH4QBCEst8WHn9izPQrtnnhBw15LR7qNwLyYhXGb59y4kY89OUYjfsGGsLTr4FZZbf1e6i3qLUaVZDLG2BdnGUFSK6iwEgh8IE7Ww6Vrc3u7laXPs47tTiYdG35kedC6QfZ3HeJ49zlhYiSbF712zBoWvNblbkczPH9GS/FMzGHta2xFWTQWbfZFIbLD1OgY2WFMJYrsKJpNzTZliCcntCkm1x7ekXa+Ymw+aHjHw5ud1Exr0MfS4AGczEXVXe/eb+jXGIfzyBdYxFai/w9S+LiG39ne7hh+cBFhLNlxbqGwDah81yCIteKxuwIa5bAPbQl1aQNUIunGV9t3jPyou2Jb8Hf2SWVRmebAmnWEalhmV0uoxtMOxujIYPfbu3/AlVFHG9/GrR2WSbZqK6+YWnzfjzgCa19f3YP6XRZbtnqrr7sedIPSC9o2KA9cNwaz9j601HRAQCWF+aQZLpzPQe+3bcmAhpnFYdB1mbaU37qppuriLddUnyViAnqN3NG6rXoBKuXIFO5OqZoizUlTAObYKEr7pk0EaYD+rDt43Ed9fHKrGQy3rB8oq21i45lFNxl3jihYQugc1kPQuQX6ncn8KEJifWvVeyiiI98DQfX3tjVtR3q1W6r3IZhYiC5BoW+5VHgA/M5i4plUXNnJhbCHAPqYox/wT9ax5P4ee/HyWzuPCnIxLZ8DqU+oW2u7jY3d3LSDALUAy1rxylnAf71373quy3744dV87vxT7PM37XTv8rvt8ZrNsNzyeJBtXt7oQ/svtqG7wuHVjhu6GuJaN3Rrx7O0h21QPoyFryjYWtoPJwr8ps809X0RTNVMh4p83lOKNhdXlazvQ1Uk6X2OKhacgkAPdAcWyIItz7nvg1yCt/1zby4y6YMS55WUIHReQUeoFLu5mcSgrlx/kboTsRqNQTlfgJ3113A8seCHaxIjObsTs2kO6XbwuW0x9eGnz3IwsTQHshO9WbYKfH0YQnfm3ZJYpDLCPEInhQvcQwCqzs2WLBZNaSHKmSAKst8UoYWrEfgmS4yLLrQklqKf5X7pB0IN6rNjmESYeYUN2JswTuaNB6g7tSyh6akHlvmoD6uhQdZ24VcsYCwlOujrlg5mcWBnusD9OrKEBGNoZhrGi4EbjhNc15o8I3XfVeHzg5PFkzKxEeUwWZJaYU2NW5gCCDfGRarbNA7Lz8zjJHov1HUYX2oJiRGHsGRPZ5N+Qh9soEuRXHHIAE1oQ09v46EgAVH7CTCc0zjoI0OMJD1mAXl+lJnoWns9B5Gb4XGbHp8rnTI3GOQHx8G6nkv08o8EQ8cmpb/CbR6Bqaw45mMC226uMzRRSiyKk4Wus3yF0AfGVfEC4H01E77vmcwmRozvDgjlnDrmaDadW28gTZwVSQmRRgsW8M/hVDHPiOkFkzCjQ32oMzIArnmT/XSnoFr+lGYnu+aZvdfv95uw1OlYliGZpCWW4JhBWQeKWYPrwTBN3tGIYJosJMUP84Fk/c62yQ2yGbQj7QETNv7N0cmzI0A9Yt3Gfp4cN/bQcz/CVPN5PIUeLISskBXESyjTLxoHk4ilMEQmAPCE9gcn3pgma2W42FdzDPn4jpV2DYshepv5hC1oymuYTgz/oHFC6795GIQwMGOhHzGUA/Xozc18oU955mof0z+lx2rgY2b66Dq9EZ5KYVBIu5MCDgsdnSHqYzz4D4S+l0LVAZA1whrMcXFVE3PpRlO+8sra1wUnnMjIR7QBtef0diz4U9Ge63E/NPOo50+txrb+aJKaNRjcugwa0dVkUbNvKsfUKRD6GXYemO31JzByaZ6WABmbu7h0mX3TAWwnqLiotIJdstDTAGrm+y4uAE12MfzpZAnjEPprGr0lm/mF5WPxuPZzmIE9UnDPX7EiqL5rPBH9v5nzprit21DC9WK1sJz09vkI1kY58aATaYdxOz6dc8egl7Fkrb4XRJgvxbiBahQvEgBnRr4lWpgnhLjJ+1aZfI5ZVOBbogqdKqDQBAxn0N3LwwdAuXxMPDy1QfTo6aaAMBg1jGmETJxSD58dNqi7TbjiFGFMHa0Ub8LS4oLQ+SyLa7kNz93iemtnExd1GXCHmXCImxtolaHKqfdrkHbM6uhJl88N/L5EuJHD00rLkogrtJflpQMLJNKyrdGp1ODlrjGnZt4//2xi3igmjKC3mL3HTXkSzSkSsYzsKDytNEIOToIsIahD03ufmYxdDjMiLtSfKdDGAOyzIVJEUmpWVCL4E8DqoQRBuuHRwS53s9/oeapjbRdwOFE37kkMWB//PAO9DEyFEDmlH9LFttilEBHSYA5CXydEVYWweMpiBKSCqjBVSrSQeEhGheEqOC4ZWZJb/WxWtsin6vhispKQejryeXC51j4RmY9T+dCpY8RrgEXeQTcEJsEu+mF4qWVOn52oNF0rkph9+zWa+t++pLymfIzsivEXMGQg8qThh3DCwBSDb5r99C6j3NLLAVnjy5GgSoYzG+hS8e7YvZ3t7ksqZlUTKNwzFYGG1nIlQUsxrGKT+90E/Xuuz+ATQItoqrGAXbZhdFbJUivKsqFOrRZIBfYLDkymA1OhMvYTqYcRTdg++9kkGuYuyHPlUZxNWJItEtMnA4tmsiT36MxFNUvYirg8exBckgidioQIpTaDftIPw/sZqhKT0GHaLEb58+q4rJvpjA5FP8ZB+rPVOAFli1snbjtDIJPmTdydU7O+DVXcjWMtw/ealBuGRnAmRQTiA4fE8aJXOpFx1lGUMI67gFHyxg6OWSRiMkZ5okL0aoxzeyPNF20qdx+xivkzFP7E6TKMRYckHgkfhZ9sFoN1CAvDqKmeQWikfDGSoL7wtsdFWPbaGrrTNmQF2NrZoQNbXJ2jfB7SRqtKIgvdu21H/XMNRiHcoD4WtaiJ9Q3DQbDIRG+aklGbOhzlYdpuKs6uMwnupjIvt5ZAdKPxfNcB2x3geKywrrTssXRKAFnNrFxIVMKvRLaNWJaHJavnb1nmpfvvvAyhzWVbjF0wSrVkihEFj0PfMVOEoVan889zEHxtB4DQAdWhv/alFtqP5am4HC9yPestX9Kd9SGDuSSUWGHvFyz91s3fYwLaiGXLvlZpg6uQPrPVLaXLPXG31IrOqA4Hpes+qtU8U7bwh2VtrM9hpY/ntzqsivvxtu+2fXlbuS6Or2KX+vqh4vhqKNHg+KI+aAOTzMq0Qp3s9fyAbcqxSES0KckLxF1M3GwZ+jyhY4NLrMXgfJPmgih4v5LA+5gIkxYQq0QcF5fBnjP4P7/y3h8Hvf+93fsfvX/0f7vZ2Xr5ze3fBo02KuHVzelDRe1L8YbByXwdDd9zx88QL8tgnvH9A1ITvX9mavbZO+PTwHcSVyuo630/W+AYa6DRh7B657UfQZPaiDhyE0xShsn8LLrM2psuulWWcX+1W13dKnftl2G2VbuVeaWYrA72xstvcvcJrXZ88qNaPShbqfuEPCa0aAVsN/qbW+Q+YRu9TfpCdyBJ3GViG//YLMGHmbqEKhZD0GoK0uv7yzlMstkm6XSZdllXWUznlZ1yZtBVRBxV7yzkdOk7izldPeX8Rxdams7LxJYukQsufE69KIbXjcOV8jDSMbxEoQRLXS9joCPdaTXBW6wyF6NAYvYZzhnlAZyCP3HjPzdT73eC3id0NrHseqFJltyU7SK356fUCQ46+ul1fy206SSaCuxakgIREqu7eHq0iRiXM5c1z8ZawY7mR6Ve3QqxZ2NjG3Kz62StNpHGf5RfLpmYWqo2T82zKqyMCWBtsud8+8AmxrPlA7HKeGme1N+YZz7m+kkxjN5Q7FsmBR6tXGZUdGfRFZw/q9nfL7ub31YMurmMqGgjJ9LXjq6jN9X0ljXHkS2Hp71DS+aGXUy0u5Z0CjvcGYziUNEBYjaJwznKY0wtx+Z4OVQYlDcA9PWD1SJFN1Pqg5KYNMQoDIyVSv21xpC1uaFWFXpPaZhL2TLrLsKm7KCPOtzoTjfts5Gn9Oib3WCGlw3Q/h9aobgqMYPcZ+hrhhpvDs7pHk+tdK2O37UM4JJQDunobJaUzNJsAjXtmlSbLQ1hOV1Fa66Kct/WxDFS+DTrTKPmaE7xyBSz5IywJYzQhF8/zwyph4X9Mor8pESgesobcwd3d1dgh9aTPmsS+BVG0lPAHHij/A6d+AYjIMP784MG08gM2Le8a5rwGOVrYmqCEG3wmlh5H7IaUmsWK0+NEhIvtLXRYkgf/nr0UHw6xXAOG0nSbw9LldVXKoUwgKVY7u091+P9vOMCR5f+SYioeW1TLLNsWdPZfsJtGdptw1ADjECYRxi5p7GRqFw460uVvUilJipcUEQ+H+OWHppYuK1Bt1LnxzCsYrVJS+aoOfv4Nx3ypTqyuLgqANAR2YXneyypimDKq6mdx3TYFkfe7vsolihH62kU0YiF8vngwqhjjNoWmlZkHd3bC1nsQosTosbJ1a5m3cx9kuYjOg7X7T+t9xyGuEun8WZw6iGF+2XrUtB52d3pD+48WUUkpWK1s1RKK7zjnw6mYoloqhZcLp8sc6O2xHwsKWU/H5LKH+pBFsTDfX+RwfFoWbjQMarUpJpx7Vmc80/ePJkzPhXYsvg0FkJ7wnMWn2gEfT+81rEpBVdHP9vqssvQFglvHHoAmc7DGKAaF/RPvso3b+jmxhked+IpSTFs5lJEdBV/vGAvtlMvy1almssXjbUQZLU8QHLxsH9THfi4xZJAeX6NiE1VroW4XFHTlDnV2X9nmoGHzsqmAkNrnOrL+6idKqzP4G+vTekGxVMtVtY+6SAqPChtdE5hNDcwEB94YguDsvD7dlaoMJ9jHOzmqO87Y9SmpaxCrYwXMuc9ddQj6wG63aCgCe4wdVLhqPetMlG5ys6VHVZ5IpU/3XnHqqHby2fSUvlKW0rXdOYh49I84lwqckttgC1wJXRUbiYI04Aqi74y8cDmZob7eSVaY+AMJ3U5CmY55KD7aD/kIFgWr0EnMU0wtvJS1ND0nApyzY6EusaTjWloAO6taX06xsOZUgQS+gJExAlFswy08HgG+pSPFWjitD6GGeThBV2zhTxksF92CUQ52K8kXv4V7HfHYL91BfetcFPHGoL7cqzSsDztW5eHBo27IVvMXtOAbaGtTshi0io6D9zx5jAdbdJ8pc+qYY2mr+1xjabgEw9stIQWLiPiPSMKi4fI9fEFvU/CTFAQmFq4PI3o2vWgdvZlF3UpSGBu17dxeA3vdmgrOS1ZSNqNCMeD8ovMKqWMOPWF3v9MgEnZNNHn3pjUqUpAa0RlvmIbu7yS8aIp+4ca/Pt2kcaTBBVEOdUH3998VcXdzXKzuDCaYez9gflboKrfC3iMqZQMDpUdYbWv4zqemUAOGDYFS0rXrSF7EqSWr9lUnIJ6CzCMCmc9GcR90Ye+moiTsZ+4YjObWa7b1PR/a216CNTxBfPBlvZxr9Md8xisFNKoMNlwK4SW0mDkkp24oCisTm23N/4OZJTX2PYcv6IPPG+bisourQ8Gra0f6dymW9onoCN0tK1CmTBwLDgrXQ5Qbg6e/XuaFMVETqmotkcYFxJ4p9FC9Qis29sBmJB6ZufoV2y+u5gxNqVfsW1WUSV/LcNlVUU3FAqHWzaoOGk+P3H9VlsqlYLoUxzXHirfFpbz6Nu0epF8nO17dzmZS3Dy07mFyqusd9U8+kAHW2W/2PyjxThgajwR0EFLzFvDTuNQhUBkpj+wtnOiFSrk4O5IhEJ/Ho0G7/inMzG++mkUwTrhJBiHc1wvY1J2oMLcU2zjJ+9w0CVaEElQhLaaI7FAhlKXHpMQQxG4utUPiZqG9yREBu0+hMi7dBdCLBEYK1GsIbCncbd96V58zekJ9j7dOXFxGpxmJkROSnytS7jOklifAt2KNRr72DyMy6IRuoQpfF5iVq/WslBUFzkIgtXIWqv2KLR96mye+j907jZxkmd7s9apHv/Lztmb+tIyXlhI55kTq42YpeJfbj68pdMSy6YDlVh5NlRrPZXJcCfll01tfQ+f03xBX+s2SdFv/GyZ9CiLItPwHS2nWv9X2oL4TCa3MS+B2BcndzQ5UxArkg0a7GetPxqTXUjiLEAW5NKMLmsjpxbGO3fgLLIF5Oo8gsjqph8N01Ooeh3i5aEWbNOP3TDOQC3DOsoK1TDPu/IQ2K8t9t+SbeWH8/PTIe1AAh42u1CK87fDFmltBh8LNkngh42+fFSyDckteIjebhFbSEbfzeeOaq5U5S9AwoMgDBbzMJEglTBI4kygW7/o3Cxw4NmK65KsvN4VKG1jp57KWXh9cXYaiytPXONGrLlt09k372gLYL3jUH8/i9nA9n5VwVhPd3F6wn4Siw4pEdxOSXYxD2Wq0E5PADIG+jg9pyELJUFOfbMZ9Zd6aZsvHZBC6TY3dA82QdyLQGCyLfutAY0jYRuHp5oPKHWM/suPfm8/upYwMUmYBl96Yk9/QyiO+PjSjcNI31aECdzo9aVY0M3lMEW5Lz+ny51xXwBm9De7dXs1N/wBRoOyRqH8H2vdd9a5OsfxIsJ93KQ4Op7U5ytd7vkLStVZDBKKYSQo3R5wVASgcKJS2ClFFEnvD5OFk0d5fCAAmZizmmbjmG4Kx3hCAK3PArqY0T874BnF4Zx6Rsk99RFQPWp8yr2gtiVejAbLfuk7lHtJ7Bf2o6Hh8la0Dhbk02ksppRTgDhMApOZE6zJCCSCv2D8CghC3juu2M2XAPbL21pHVhO41emch3hpShk96FSU5lnxIwon87PEMlYZE8VZ3GW5hfzOHP3+GAfoT/a71Pe36Y+AbCweQSqb+WORyhw+ROribD0S+RfRHBHTVSDrSCZb/NIYt6s7drWTRMaLBx9CHEeGe5rEcsaFT2mPcx0Ct9n+/ZekffKSFkXRUxZadzPN7nNb16pC4L0QmMpTn3JpvhgICy27l0TfRVK5j5wVbysx95N8SCiOh/afT/CYfyowGi9lN5ewV69ozwWIviQ0PXE/wUjntMOo5gIP3nK2Ry8P6H6gjUnxAH7hhlPilh6OWodhurlBiCeYW+tX/htel5KumfWXA3NbKX4rX29Jd4Om97VMKFs3Vk9/4+3bHIQCva7XTGmU3b7J6t1Oz1X0hyAi6HJAgk5Phbu983tM3Zxn0us2C/do1m5aORiFSdWGz/mF49cyuxRZocw6hhAEMWWG2U4Jy/RSGbpBhvswntm9O/l1PfkbujMGig5AgoU9gvD1ty/7EX1TCyxNWbnHMNO5702DV6y38zL65LCZQHruOTvb2w4IQ1fN9pwXL186g/3dUTzIRc1VfqttKmBmO2nfs8jKkgo4CqOFHq2vxvDzO/b19s437Ed+GY7YYRhPsyRs+YmwI/R6ejDDw1jmQZBNmW1a3Pi7ScnvgNeVHfAYGPrQEyPyR3u174Ebg0lwnAQzPrcW8MUnjtnh2Pcxn1hLxGqWxOzgEyZwOnv9MxuOZ3Ogq7Vs4sYeKOLDRF1ieAz8thU7FAEbeu4stHbpEAjuotd55vleZAVwBPbCiMFfn1/zhbXELAYV+GMofNvXYx54gM47Hqv/939tBd4I3/sEU8QXngrspNVFLpCtI9Cw9WL5nW5Vmb7yMH8PWt4Dkk2T2JUSg2rr/fkRZI000c1NRUDssmNPzO0Y/RiOMWrz76G0Ev0tpg/8IZToK6p/BVqOQWwf/+Fx1z7q7zwwXIDq54iMrYAe8Eggh2EcaWwFg6V89jYZWcf9bAGic5hAC1fcSoPzBE+WnoUgQBuo9HchlAeE5AEPRNBpTIs/G4RH4da0gGKNZUVUyHCirumEa8zIgKWz43j0KZwUREehfX1dYemWxmnog23YB2E00Gba9yHGiE1jPqcoqbfwNeF4/pLvbzGbQPuamWq4BwRSq1+6prDaJFqII0+NkvGlUNTsJY/B8AxCOQBt8QnUQeXFspbNtIQOhBHYuKJD4xiQ25+G4dQXdB9jNJABWNKL3jQECmS/m1vdIXyHuuAqaBcugdRUH5BrecxhEjn7+e+BHyfNzb8AUmPn2UkwXqnN35PfkwE6bn0M9XL2y8/NDX4DYhMWTKg52VvlrtQmLANcFSO6GDPujoDAlTdLRncLpmUMs9PlccLOYw9/BXyV5q88FSfB4CNIbWe/8NDQ6Kp8jFMD7J3fpZk+B/r5x2EzUts9oqgewq32MUR8hBrB0gRMYh4RVs7+Yfq8hEt1Q+ewulN4HrDcUiqVSjaeHIPRrbQlZVBLUcSkC/3f9SkrKrXfUqGXybF7VO3hikJ0aPz3j4mIFwP9T+/r/nb/RXuljKiD3+Ugp3BrPZq5+go1/ClbkIuiSgFYv9EV9mA+qjmQ/v8DAAD//wEAAP//pHj3gCTBAAA=") + bs, _ = base64.StdEncoding.DecodeString("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") gr, _ = gzip.NewReader(bytes.NewBuffer(bs)) bs, _ = ioutil.ReadAll(gr) assets["index.html"] = bs