diff --git a/internal/cmd/print.go b/internal/cmd/print.go index a2a2e1a0..23c7ea31 100644 --- a/internal/cmd/print.go +++ b/internal/cmd/print.go @@ -45,11 +45,16 @@ func printHandler(cmd *cobra.Command, args []string) { } // Read bookmarks from database + orderMethod := database.DefaultOrder + if orderLatest { + orderMethod = database.ByLastModified + } + searchOptions := database.GetBookmarksOptions{ IDs: ids, Tags: tags, Keyword: keyword, - OrderLatest: orderLatest, + OrderMethod: orderMethod, } bookmarks, err := DB.GetBookmarks(searchOptions) diff --git a/internal/database/database.go b/internal/database/database.go index d2360f66..1afd0e15 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -6,13 +6,25 @@ import ( "github.com/go-shiori/shiori/internal/model" ) +// OrderMethod is the order method for getting bookmarks +type OrderMethod int + +const ( + // DefaultOrder is oldest to newest. + DefaultOrder OrderMethod = iota + // ByLastAdded is from newest addition to the oldest. + ByLastAdded + // ByLastModified is from latest modified to the oldest. + ByLastModified +) + // GetBookmarksOptions is options for fetching bookmarks from database. type GetBookmarksOptions struct { IDs []int Tags []string Keyword string WithContent bool - OrderLatest bool + OrderMethod OrderMethod Limit int Offset int } diff --git a/internal/database/sqlite.go b/internal/database/sqlite.go index 89620031..c6645d02 100644 --- a/internal/database/sqlite.go +++ b/internal/database/sqlite.go @@ -246,8 +246,13 @@ func (db *SQLiteDatabase) GetBookmarks(opts GetBookmarksOptions) ([]model.Bookma } // Add order clause - if opts.OrderLatest { + switch opts.OrderMethod { + case ByLastAdded: + query += ` ORDER BY b.id DESC` + case ByLastModified: query += ` ORDER BY b.modified DESC` + default: + query += ` ORDER BY b.id` } if opts.Limit > 0 && opts.Offset >= 0 { @@ -398,14 +403,21 @@ func (db *SQLiteDatabase) DeleteBookmarks(ids ...int) (err error) { // GetBookmark fetchs bookmark based on its ID or URL. // Returns the bookmark and boolean whether it's exist or not. func (db *SQLiteDatabase) GetBookmark(id int, url string) (model.Bookmark, bool) { - book := model.Bookmark{} - db.Get(&book, `SELECT + args := []interface{}{id} + query := `SELECT b.id, b.url, b.title, b.excerpt, b.author, b.modified, bc.content, bc.html, bc.content <> "" has_content FROM bookmark b LEFT JOIN bookmark_content bc ON bc.docid = b.id - WHERE b.id = ? OR b.url = ?`, - id, url) + WHERE b.id = ?` + + if url != "" { + query += ` OR b.url = ?` + args = append(args, url) + } + + book := model.Bookmark{} + db.Get(&book, query, args...) return book, book.ID != 0 } diff --git a/internal/view/css/custom-dialog.css b/internal/view/css/custom-dialog.css index af5f9052..3b826a0c 100644 --- a/internal/view/css/custom-dialog.css +++ b/internal/view/css/custom-dialog.css @@ -1 +1 @@ -:root{--dialogHeaderBg:#292929;--colorDialogHeader:#FFF}.custom-dialog-overlay{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;min-width:0;min-height:0;overflow:hidden;position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:10001;background-color:rgba(0,0,0,0.6);padding:32px}.custom-dialog-overlay .custom-dialog{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;width:100%;max-width:400px;min-height:0;max-height:100%;overflow:auto;background-color:var(--contentBg);font-size:16px}.custom-dialog-overlay .custom-dialog .custom-dialog-header{padding:16px;color:var(--colorDialogHeader);background-color:var(--dialogHeaderBg);font-weight:600;font-size:1em;text-transform:uppercase;border-bottom:1px solid var(--border)}.custom-dialog-overlay .custom-dialog .custom-dialog-body{padding:16px;display:grid;max-height:100%;min-height:80px;min-width:0;overflow:auto;font-size:1em;grid-template-columns:max-content 1fr;-webkit-box-align:baseline;align-items:baseline;grid-gap:16px}.custom-dialog-overlay .custom-dialog .custom-dialog-body .custom-dialog-content{grid-column:1 / span 2;color:var(--color);align-self:baseline}.custom-dialog-overlay .custom-dialog .custom-dialog-body>input,.custom-dialog-overlay .custom-dialog .custom-dialog-body>textarea{color:var(--color);padding:8px;font-size:1em;border:1px solid var(--border);background-color:var(--contentBg);min-width:0}.custom-dialog-overlay .custom-dialog .custom-dialog-body>textarea{min-height:37px;resize:vertical}.custom-dialog-overlay .custom-dialog .custom-dialog-body>.suggestion{position:absolute;display:block;padding:8px;background-color:var(--contentBg);border:1px solid var(--border);color:var(--color);font-size:.9em}.custom-dialog-overlay .custom-dialog .custom-dialog-footer{padding:16px;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;-webkit-box-pack:end;justify-content:flex-end;border-top:1px solid var(--border)}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>a{padding:0 8px;font-size:.9em;font-weight:600;color:var(--color);text-transform:uppercase}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>a:hover{color:var(--main)}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>a:focus{outline:none;color:var(--main);border-bottom:1px dashed var(--main)}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>i.fa-spinner.fa-spin{width:19px;line-height:19px;text-align:center} \ No newline at end of file +:root{--dialogHeaderBg:#292929;--colorDialogHeader:#FFF}.custom-dialog-overlay{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;min-width:0;min-height:0;overflow:hidden;position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:10001;background-color:rgba(0,0,0,0.6);padding:32px}.custom-dialog-overlay .custom-dialog{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;width:100%;max-width:400px;min-height:0;max-height:100%;overflow:auto;background-color:var(--contentBg);font-size:16px}.custom-dialog-overlay .custom-dialog .custom-dialog-header{padding:16px;color:var(--colorDialogHeader);background-color:var(--dialogHeaderBg);font-weight:600;font-size:1em;text-transform:uppercase;border-bottom:1px solid var(--border)}.custom-dialog-overlay .custom-dialog .custom-dialog-body{padding:16px;display:grid;max-height:100%;min-height:80px;min-width:0;overflow:auto;font-size:1em;grid-template-columns:max-content 1fr;-webkit-box-align:baseline;align-items:baseline;grid-gap:16px}.custom-dialog-overlay .custom-dialog .custom-dialog-body::after{content:"";display:block;min-height:1px;grid-column-end:-1;grid-column-start:1}.custom-dialog-overlay .custom-dialog .custom-dialog-body .custom-dialog-content{grid-column-end:-1;grid-column-start:1;color:var(--color);align-self:baseline}.custom-dialog-overlay .custom-dialog .custom-dialog-body>input,.custom-dialog-overlay .custom-dialog .custom-dialog-body>textarea{color:var(--color);padding:8px;font-size:1em;border:1px solid var(--border);background-color:var(--contentBg);min-width:0}.custom-dialog-overlay .custom-dialog .custom-dialog-body>textarea{height:6em;min-height:37px;resize:vertical}.custom-dialog-overlay .custom-dialog .custom-dialog-body>.suggestion{position:absolute;display:block;padding:8px;background-color:var(--contentBg);border:1px solid var(--border);color:var(--color);font-size:.9em}.custom-dialog-overlay .custom-dialog .custom-dialog-footer{padding:16px;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;-webkit-box-pack:end;justify-content:flex-end;border-top:1px solid var(--border)}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>a{padding:0 8px;font-size:.9em;font-weight:600;color:var(--color);text-transform:uppercase}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>a:hover{color:var(--main)}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>a:focus{outline:none;color:var(--main);border-bottom:1px dashed var(--main)}.custom-dialog-overlay .custom-dialog .custom-dialog-footer>i.fa-spinner.fa-spin{width:19px;line-height:19px;text-align:center} \ No newline at end of file diff --git a/internal/view/js/component/bookmark.js b/internal/view/js/component/bookmark.js index 785777da..bfce7716 100644 --- a/internal/view/js/component/bookmark.js +++ b/internal/view/js/component/bookmark.js @@ -56,6 +56,12 @@ export default { return { backgroundImage: `url("${this.imageURL}")` } + }, + eventItem() { + return { + id: this.id, + index: this.index, + } } }, methods: { @@ -63,13 +69,10 @@ export default { this.$emit("tagClicked", name); }, editBookmark() { - this.$emit("edit", this.id, this.index); + this.$emit("edit", this.eventItem); }, deleteBookmark() { - this.$emit("delete", { - id: this.id, - index: this.index - }); + this.$emit("delete", this.eventItem); }, updateBookmark() { this.$emit("update", this.id, this.index); diff --git a/internal/view/js/page/home.js b/internal/view/js/page/home.js index 1f5720cf..449c23e5 100644 --- a/internal/view/js/page/home.js +++ b/internal/view/js/page/home.js @@ -23,7 +23,8 @@ var template = ` :showId="displayOptions.showId" :listMode="displayOptions.listMode" @tagClicked="filterTag" - @delete="showDialogDelete"> + @delete="showDialogDelete" + @edit="showDialogEdit">
Page
@@ -110,7 +111,7 @@ export default { } // Clear tag A from keyword - keyword = keyword.replace(rxTagA, ''); + keyword = keyword.replace(rxTagA, ""); // Fetch tag B while (rxResult = rxTagB.exec(keyword)) { @@ -118,7 +119,7 @@ export default { } // Clear tag B from keyword, then trim keyword - keyword = keyword.replace(rxTagB, '').trim().replace(/\s+/g, ' '); + keyword = keyword.replace(rxTagB, "").trim().replace(/\s+/g, " "); // Prepare URL for API var url = new URL("/api/bookmarks", document.URL); @@ -213,26 +214,26 @@ export default { }, showDialogAdd() { this.showDialog({ - title: 'New Bookmark', - content: 'Create a new bookmark', + title: "New Bookmark", + content: "Create a new bookmark", fields: [{ - name: 'url', - label: 'Url, start with http://...', + name: "url", + label: "Url, start with http://...", }, { - name: 'title', - label: 'Custom title (optional)' + name: "title", + label: "Custom title (optional)" }, { - name: 'excerpt', - label: 'Custom excerpt (optional)', - type: 'area' + name: "excerpt", + label: "Custom excerpt (optional)", + type: "area" }, { - name: 'tags', - label: 'Comma separated tags (optional)', - separator: ',', + name: "tags", + label: "Comma separated tags (optional)", + separator: ",", dictionary: this.tags.map(tag => tag.name) }], - mainText: 'OK', - secondText: 'Cancel', + mainText: "OK", + secondText: "Cancel", mainClick: (data) => { // Make sure URL is not empty if (data.url.trim() === "") { @@ -243,12 +244,12 @@ export default { // Prepare tags var tags = data.tags .toLowerCase() - .replace(/\s+/g, ' ') + .replace(/\s+/g, " ") .split(/\s*,\s*/g) - .filter(tag => tag !== '') + .filter(tag => tag.trim() !== "") .map(tag => { return { - name: tag + name: tag.trim() }; }); @@ -317,8 +318,8 @@ export default { this.showDialog({ title: title, content: content, - mainText: 'Yes', - secondText: 'No', + mainText: "Yes", + secondText: "No", mainClick: () => { this.dialog.loading = true; fetch("/api/bookmarks", { @@ -350,6 +351,89 @@ export default { } }); }, + showDialogEdit(item) { + // Check the item + if (typeof item !== "object") return; + + var id = (typeof item.id === "number") ? item.id : 0, + index = (typeof item.index === "number") ? item.index : -1; + + if (id < 1 || index < 0) return; + + // Get the existing bookmark value + var book = JSON.parse(JSON.stringify(this.bookmarks[index])), + strTags = book.tags.map(tag => tag.name).join(", "); + + this.showDialog({ + title: "Edit Bookmark", + content: "Edit the bookmark's data", + showLabel: true, + fields: [{ + name: "title", + label: "Title", + value: book.title, + }, { + name: "excerpt", + label: "Excerpt", + type: "area", + value: book.excerpt, + }, { + name: "tags", + label: "Tags", + value: strTags, + separator: ",", + dictionary: this.tags.map(tag => tag.name) + }], + mainText: "OK", + secondText: "Cancel", + mainClick: (data) => { + // Validate input + if (data.title.trim() === "") return; + + // Prepare tags + var tags = data.tags + .toLowerCase() + .replace(/\s+/g, " ") + .split(/\s*,\s*/g) + .filter(tag => tag.trim() !== "") + .map(tag => { + return { + name: tag.trim() + }; + }); + + // Set new data + book.title = data.title.trim(); + book.excerpt = data.excerpt.trim(); + book.tags = tags; + + // Send data + this.dialog.loading = true; + fetch("/api/bookmarks", { + method: "put", + body: JSON.stringify(book), + headers: { + "Content-Type": "application/json", + }, + }) + .then(response => { + if (!response.ok) throw response; + return response.json(); + }) + .then(json => { + this.dialog.loading = false; + this.dialog.visible = false; + this.bookmarks.splice(index, 1, json); + }) + .catch(err => { + this.dialog.loading = false; + err.text().then(msg => { + this.showErrorDialog(`${msg} (${err.status})`); + }) + }); + } + }); + }, }, mounted() { var stateWatcher = (e) => { diff --git a/internal/view/less/custom-dialog.less b/internal/view/less/custom-dialog.less index 62876ac1..b2cc8283 100644 --- a/internal/view/less/custom-dialog.less +++ b/internal/view/less/custom-dialog.less @@ -53,8 +53,17 @@ align-items: baseline; grid-gap: 16px; + &::after { + content: ""; + display: block; + min-height: 1px; + grid-column-end: -1; + grid-column-start: 1; + } + .custom-dialog-content { - grid-column: 1 / span 2; + grid-column-end: -1; + grid-column-start: 1; color: var(--color); align-self: baseline; } @@ -70,6 +79,7 @@ } >textarea { + height: 6em; min-height: 37px; resize: vertical; } diff --git a/internal/webserver/assets-prod.go b/internal/webserver/assets-prod.go index 93715c14..f3230bb3 100644 --- a/internal/webserver/assets-prod.go +++ b/internal/webserver/assets-prod.go @@ -36,10 +36,10 @@ var assets = func() http.FileSystem { }, "/css/custom-dialog.css": &vfsgen۰CompressedFileInfo{ name: "custom-dialog.css", - modTime: time.Date(2019, 5, 28, 9, 38, 36, 616837964, time.UTC), - uncompressedSize: 2674, + modTime: time.Date(2019, 5, 29, 23, 7, 40, 986027559, time.UTC), + uncompressedSize: 2845, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\xed\x6a\xeb\x38\x10\x7d\x15\x43\x29\x34\x50\x65\x9d\x76\xe9\xb6\x12\xf4\x47\x59\xca\xbe\x86\x6c\x8d\x6d\x6d\x64\x8d\x90\xe4\xc4\xa9\xe9\xbb\x5f\xe4\xaf\xda\x71\x42\x4b\x72\xe1\x92\x3f\xd6\x48\x1a\x9d\x39\x67\x3e\x42\x2d\xa2\x6f\x08\x11\x92\x2b\xcc\xff\x03\x2e\xc0\xbe\xe5\xf4\xe6\xe1\x25\xfc\x18\x21\x29\x2a\xb4\xff\x4e\x76\xe9\xcd\xfb\xfb\xfb\xe7\x3a\xad\x9c\xc7\xb2\xbf\x47\x70\x07\x56\xf1\x43\x23\xa4\x33\x8a\x1f\x28\xd9\x43\xb2\x95\x9e\x24\x58\xb3\xc1\x96\x29\xa8\xd9\x64\x83\xa0\x95\xa0\x3d\xdd\x81\xf5\x32\xe5\x6a\xb6\x27\xa4\x85\xd4\x4b\xd4\x54\xa3\x2d\xb9\x62\xe1\x36\xc9\x14\xee\x69\x8a\xaa\x2a\x75\xa4\x71\x6f\xb9\x99\x5d\xe2\x4a\xe6\x9a\xa6\xa0\x3d\x58\xd6\x2e\x88\xf4\x50\xba\xc1\x34\x3d\x6b\x78\xba\x1d\xec\xff\x57\xce\xcb\xec\x40\x52\xd4\x3e\x20\xea\xcd\xa5\xd4\x64\x2f\x85\x2f\x68\xdc\x7e\x17\x20\xf3\xc2\xd3\x98\x85\x68\x5b\x28\x85\x14\x02\x34\x33\xe8\x64\x8b\x35\x93\x35\x08\xe6\xd1\xd0\x98\x29\xc8\xc2\xd9\xce\xc1\x26\x8e\x77\x7b\xd6\x3b\x08\x8b\x82\x7d\x10\xa9\x05\xd4\x61\x15\x6f\x58\xc2\xd3\x6d\x6e\xb1\xd2\xa2\x63\x9c\xda\x3c\xe1\x77\xf1\x7d\xfb\x5b\x3f\xad\x98\xe1\x42\x48\x9d\xd3\xc7\x07\x53\x9f\x61\x3f\x9a\x9b\xff\x80\x18\x63\xb0\xb7\xac\xe4\x75\x4f\xde\xdf\x71\x6c\xea\x39\x81\x61\xf3\x8b\x8c\xdb\x2f\x42\x79\xe5\x71\xc9\xc5\x8e\xdb\x3b\x32\xa8\xf3\x96\xaf\x58\x86\xda\x13\x27\x3f\x80\x6e\x9e\x7e\x4a\xc7\xd1\x92\x14\x6d\x36\x37\x03\xaf\xc1\x11\x9b\x3f\x77\x94\xf8\xab\x73\xc0\xe6\xb5\xd3\xa3\xdb\x77\xe1\x3d\xc5\xf1\x14\x2d\x94\xcc\x43\xed\x89\xb7\x5c\xbb\x0c\x6d\x49\x2b\x63\xc0\xa6\xdc\x01\x4b\xd0\x0a\xb0\x24\x41\xef\xb1\xa4\x1b\x53\x47\x0e\x95\x14\x51\xf7\x48\xb7\xbb\xba\x2c\xd6\x04\xc5\x61\x1e\xe9\x90\x07\xb9\x95\x62\x21\xc7\x44\xab\xe7\x41\xbb\xa1\x10\xe6\x52\xcd\x43\x0b\xce\x88\x87\xd2\x28\xee\x81\x74\xa9\xe1\x68\xf0\xde\x6b\x17\x6d\x32\x7b\xa2\x62\x13\xee\x40\x49\x0d\xb3\x9a\x1d\x8d\xad\xd7\x9c\x9b\x2b\xb4\x0e\xf1\x1f\xdb\x7a\x48\x4d\xeb\xbe\xc3\x4a\x37\xd1\x5f\x91\x33\x5c\x47\x0f\xcb\x54\x58\xf5\xe8\x1c\xa8\x6c\x04\x77\x39\x9c\x57\xa9\x4d\xe5\xef\x2f\xbf\x1f\xf2\x88\x5b\xe0\xcd\x09\xa4\x83\xd4\xcf\xa6\x3e\x92\xa8\x4b\xa3\x73\xd9\xf5\x83\xd2\x9b\xe4\xc2\x15\xc1\x8f\xe0\x27\xa9\xf6\xf8\x8f\xa9\x99\x85\x16\xea\xd0\x86\xae\x78\x62\xed\xaa\x3c\x07\x17\xda\x56\x33\x36\x68\x9e\x38\x54\x95\x87\x31\xff\x13\x85\xe9\x76\xc6\xd7\xf7\x14\x7c\xc3\xe1\x09\x3d\xbe\x34\x58\xbf\x40\x79\x59\x50\x19\xa2\x3f\xee\x57\x97\x74\xf8\x02\xad\xfc\x40\xed\x7f\xde\xe3\x2d\xee\xa3\xc5\xac\x6d\xe7\x27\x68\xb1\x18\x9e\xed\xbd\xb0\xd1\xf7\xb3\x30\x0d\x7f\x6b\x33\xeb\x88\x78\xe5\x23\x15\x71\x34\xcf\xf3\xc0\xf1\xa2\x09\x9f\x50\xe5\x5c\x27\xbe\x0e\x16\x2d\xc2\xf9\x59\x55\x96\x5c\xea\x2b\x83\xa5\x19\xa6\x95\x6b\xb0\xf2\xa1\xed\x50\x8d\x1a\xd8\xe2\x89\x13\x23\x44\x70\x57\xc0\x40\xfb\xf5\x38\xe4\x3a\xe3\xc4\x19\xa9\x35\xd8\xe1\xb3\xe9\xa7\xfe\x8b\xa9\x59\x00\x37\x8e\x92\x60\x68\x39\x9e\xfe\x2f\xfb\xfc\x15\x00\x00\xff\xff\x8b\x69\x46\x05\x72\x0a\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\xed\x6a\xc3\x38\x10\x7c\x95\xd0\x52\x68\xa0\x0a\x76\x7b\xe4\x5a\x09\xfa\xa3\x1c\xe5\x5e\x43\xb6\xd6\xb6\x2e\xb2\x56\x48\x72\xe2\xd4\xf4\xdd\x0f\xf9\xab\x76\x3e\x68\x48\x0e\x0e\xff\xb1\x56\x96\x34\x33\x3b\xda\x35\xb5\x88\xbe\x21\x44\x48\xae\x30\xff\x1b\xb8\x00\xfb\x91\xd3\xfb\xe7\xb7\xf0\x30\x42\x52\x54\x68\xff\x9a\xcc\xd2\xfb\xcf\xcf\xcf\xef\x55\x5a\x39\x8f\x65\xbf\x8e\xe0\x16\xac\xe2\xfb\x46\x48\x67\x14\xdf\x53\xb2\x83\x64\x23\x3d\x49\xb0\x66\x43\x2c\x53\x50\xb3\xc9\x04\x41\x2b\x41\x7b\xba\x05\xeb\x65\xca\xd5\x6c\x4e\x48\x0b\xa9\x97\xa8\xa9\x46\x5b\x72\xc5\xc2\x6a\x92\x29\xdc\xd1\x14\x55\x55\xea\x85\xc6\x9d\xe5\x66\xb6\x88\x2b\x99\x6b\x9a\x82\xf6\x60\x59\x3b\x20\xd2\x43\xe9\x86\xd0\xf4\x5b\xc3\xd3\xcd\x10\xff\xa7\x72\x5e\x66\x7b\x92\xa2\xf6\x01\x51\x1f\x2e\xa5\x26\x3b\x29\x7c\x41\xa3\xf6\xbd\x00\x99\x17\x9e\x46\x2c\xb0\x6d\xa1\x14\x52\x08\xd0\xcc\xa0\x93\x2d\xd6\x4c\xd6\x20\x98\x47\x43\x23\xa6\x20\x0b\xdf\x76\x1b\xc4\x51\xb4\xdd\xb1\x7e\x83\x30\x28\xd8\x17\x91\x5a\x40\x1d\x46\x51\xcc\x12\x9e\x6e\x72\x8b\x95\x16\x9d\xe2\xd4\xe6\x09\x7f\x8c\x9e\xda\x67\xb5\x5e\x32\xc3\x85\x90\x3a\xa7\x2f\xcf\xa6\x3e\xa3\xfe\x62\x1e\xfe\x1f\x92\x31\x92\x7d\x60\x25\xaf\x7b\xf1\xfe\x88\x22\x53\xcf\x05\x0c\x93\x3f\x62\x3c\xfc\x08\xca\x2b\x8f\xc7\x5a\x6c\xb9\x7d\x24\x43\x76\x3e\xf2\x25\xcb\x50\x7b\xe2\xe4\x17\xd0\x78\x7d\xa9\x1c\x07\x43\x52\xb4\x6e\x6e\x06\x5d\xc3\x46\x6c\x7e\xdc\x81\xf1\x97\xe7\x80\xcd\xef\x4e\x8f\x6e\xd7\xd1\x5b\x47\xd1\x14\x2d\x94\xcc\x43\xed\x89\xb7\x5c\xbb\x0c\x6d\x49\x2b\x63\xc0\xa6\xdc\x01\x4b\xd0\x0a\xb0\x24\x41\xef\xb1\xa4\xb1\xa9\x17\x0e\x95\x14\x8b\xee\x90\x6e\x76\x79\x1d\xd7\x04\xc5\x7e\xce\x74\xf0\x41\x6e\xa5\x38\x4a\xc7\x24\x57\xaf\x43\xee\x86\x8b\x30\x4f\xd5\x9c\x5a\xd8\x8c\x78\x28\x8d\xe2\x1e\x48\x67\x0d\x47\xc3\xee\x7d\xee\x16\x71\x66\x4f\xdc\xd8\x84\x3b\x50\x52\xc3\xec\xce\x8e\xc1\x76\xd7\x9c\x9b\x1b\x72\x1d\xf8\x53\xca\x33\x0f\xb6\x19\x2e\xf9\xdd\xdd\x28\x42\xa2\x30\xdd\x4c\x59\xc7\xa6\xee\x8e\xed\x38\x10\xd0\x82\x92\x78\x16\x72\x9e\x5b\x4f\xe3\xeb\xf1\x1c\xc6\x7a\x5c\xcd\x65\xe7\x1e\x5b\x75\xd9\xab\xe7\x40\x65\xa3\x78\xd7\xc3\x7b\x97\xda\x54\xfe\xe9\xfa\xf5\xc1\xe7\xdc\x02\x6f\x4e\x20\x1d\xac\xf8\x6a\xea\x03\x0b\x75\x36\x3f\xe7\xfe\x0b\x4a\xc3\xc4\xab\x37\x90\x1f\xc1\xf7\x86\x58\x43\x39\xf5\xc7\xcb\x9f\xa6\x66\x16\x5a\xd4\x43\xc5\xbc\xe1\xb4\x95\xab\xf2\x1c\x5c\xa8\xb0\xcd\xd8\x4b\x78\xe2\x50\x55\x1e\x0e\x5c\x3a\x95\xee\x77\x35\x7e\x91\xf3\x44\x6a\x7e\xd2\xb1\x7a\x83\xf2\x3a\x52\x19\xa2\x3f\x2c\xad\xd7\x34\xa3\x02\xad\xfc\x42\xed\x2f\x6f\x47\x16\x77\x8b\xa3\xdf\x82\xb6\xd5\x83\x16\x47\x7d\xbe\x5d\x17\x26\xfa\xd2\x1b\x1a\xf7\x7f\x5a\x77\x3b\x21\xde\xf9\x28\x45\xb4\x98\x5b\x3e\x68\x7c\xd4\x2f\x4e\x64\xe5\x5c\xd3\xb8\x0d\x16\x2d\xc2\xf7\xb3\x0b\x5a\x72\xa9\x6f\x24\x4b\x33\x4c\x2b\xd7\x60\xe5\x43\x05\xa2\x1a\x35\xb0\xa3\x23\x4e\x74\x3b\xc1\x5d\x01\x83\xec\xb7\xe3\x90\xab\x8c\x13\x67\xa4\xd6\x60\x87\xd7\xa6\xff\x41\x79\x33\x35\x0b\xe0\xc6\x7a\x1f\x02\xad\xc6\xd3\x5f\xc8\xef\x7f\x03\x00\x00\xff\xff\x53\x34\xef\x4c\x1d\x0b\x00\x00"), }, "/css/fontawesome.min.css": &vfsgen۰CompressedFileInfo{ name: "fontawesome.min.css", @@ -171,10 +171,10 @@ var assets = func() http.FileSystem { }, "/js/component/bookmark.js": &vfsgen۰CompressedFileInfo{ name: "bookmark.js", - modTime: time.Date(2019, 5, 29, 9, 27, 6, 506781745, time.UTC), - uncompressedSize: 2151, + modTime: time.Date(2019, 5, 29, 23, 1, 15, 229377636, time.UTC), + uncompressedSize: 2214, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\xcd\x6e\xdb\x30\x0c\xbe\xe7\x29\x38\xa1\x87\x04\xc8\xcf\xce\x6e\x1c\x6c\xdd\x76\x28\xd0\xed\xd0\xa2\xa7\x61\x58\x14\x8b\x89\x85\xc8\x92\x21\x4b\x69\x0b\xc3\xef\x3e\x48\xb6\x62\x3b\xf6\xda\xf8\x90\xd0\xfc\xfb\x3e\x92\x26\x4f\x54\x83\xc1\x2c\x17\xd4\x20\xc4\xb0\x9d\xac\x19\x3f\x41\x22\x68\x51\xc4\x64\xa7\xd4\x31\xa3\xfa\x48\x20\x6a\x34\xa5\xe0\x85\x89\xc0\xfd\xfe\x54\x0c\x2b\xb2\x99\x00\x00\xac\xe9\x65\xc8\x42\x70\xe9\xe2\x52\x8d\xfb\x98\x58\x2d\x08\x18\xaa\x0f\x68\x62\xf2\x77\x27\xa8\x3c\x36\x91\x3e\xba\xc8\xa9\x0c\x09\x4c\x6a\xb3\x9d\xa4\x5c\x10\x38\x2d\xf8\x3e\x26\x3c\xa3\x07\x7c\x7e\x7c\x20\x10\x15\xe6\x4d\x60\xc7\xe5\xc9\xbd\x3b\xd3\x66\xbd\x72\x39\x3a\x29\xf3\x73\x3e\x6e\x04\x92\x4d\x59\x7a\xa1\xaa\xd6\xab\x7c\xcc\x0d\x5f\x13\xd4\xb9\x09\xa0\x9f\xce\xa8\x9b\xb2\x6c\x6c\xff\x8d\xe5\xcc\x85\x15\xa9\x7a\x89\x89\xfb\xbd\x67\x2e\x8a\xb3\x4e\xc0\x7a\x45\x1b\x61\xa4\xbd\x0b\x43\x0f\x45\x40\x76\xf2\x52\xa0\x3c\x98\x14\x36\xf0\xb9\xdb\x26\x0a\xa7\xc5\x5e\x69\xef\x03\x5c\x42\x1d\xf6\x25\x11\x3c\x39\x7a\xe5\x37\x27\x21\x9b\x1a\x7a\x58\x4a\x9a\xe1\xcc\xd7\xdd\xbc\x38\x36\x81\xc4\x8a\xf1\xd3\x90\x4f\x91\xd3\x04\xb5\x6b\xe6\xa8\xf9\x4c\x37\x43\x69\xfb\xbc\x1a\x0f\x3f\xe6\xab\x46\xee\x9e\xb2\x4c\x55\x61\x1c\xb5\xe7\xc7\x87\xaa\x6a\xf3\x05\x9a\x4d\x72\x3f\xb8\x98\xfc\x60\xdc\x40\xfb\x45\x86\xb2\x91\x71\x73\x17\xb4\x7d\x80\x35\x0f\xc4\xf6\xb4\x80\x3d\x5d\xe4\x28\x13\x2e\x16\x54\x18\x57\x24\xdf\x7c\x04\xf9\x1d\x05\x1a\x1c\x01\x65\xde\x70\x2d\xac\xd1\xb4\x48\xaf\x47\x7d\xce\x99\x5b\xc6\x84\x26\x29\xb6\x90\xd6\x6b\xaf\x85\x4c\x84\xb2\x6c\xc1\xd4\x8b\x14\x8a\xb2\xf7\xb0\x9b\x61\xd7\x7f\xdb\xdb\xc9\x04\x5f\x73\xa5\x0d\x30\xdc\x53\x2b\x0c\x94\xde\x2b\x9c\x88\xe8\x2c\xcd\xbd\x3e\xd7\x2a\x2f\xa2\xc6\xc9\x3d\x9c\x45\xf0\xcb\x66\x3b\xd4\xf3\xb3\xce\x6a\x11\xc1\x93\xd1\x5c\x1e\x5a\xa5\x2f\x76\xa8\x6e\x76\x6d\x68\x08\x0b\x39\xb4\xd4\x2b\x17\xc1\x9d\x52\x02\xa9\x6c\x0d\xe1\x4a\x8d\x98\xb8\x64\xf8\x3a\x64\xea\x36\xaa\x5b\x8d\xd7\xbd\xe5\x18\xc1\x57\xad\xe9\xdb\xbc\x67\x08\x1d\x9a\xce\x2e\x22\xdc\xa3\xd1\x58\x2d\xe1\xf7\x9f\x9e\xa5\xfd\xc8\x6b\xa9\xaa\x33\x32\x6a\x68\x2f\x4b\x13\x5d\x56\xb7\x5d\xb7\x44\x65\xb9\x35\xc8\xba\x0c\x3b\x2b\x34\xe0\xe1\x6e\xbb\xd5\x02\x62\x90\xf8\x02\xce\xc3\xa4\xbc\x58\x5a\x2d\x66\xb7\x93\x11\xb2\x56\x8b\x65\xc8\xd7\x3a\x54\x9d\xf6\x5c\x1e\xde\x01\x64\x20\x3e\xe8\xc7\x8e\x26\xc7\x83\x56\x56\xb2\x7b\x37\xc8\x08\xb6\x56\x8b\x29\xb9\x29\x3d\xa5\x30\xdc\x8a\xcc\xb6\xd7\x34\x2c\x43\x93\x2a\xd6\x1b\x55\xe7\xfc\xf9\xd3\x77\x39\x45\x07\x73\x83\x19\x37\xd3\xce\xa5\x24\x73\xf0\xce\xa3\xd5\x76\x2f\xcb\xa0\xd0\x6e\x3e\xe7\x48\xe6\xb5\x8a\xb3\x20\xb8\x2f\x6c\x3c\x71\xff\x7a\xbc\x9b\xba\x76\x25\xf3\x91\x8e\xba\x4d\x0b\x90\x43\x63\xfd\x7d\xb7\x4c\xfa\x5d\x1d\xe7\xd5\x3f\x31\xef\xf2\xaa\x5d\x3f\x2e\xba\x1e\xda\xa4\xfa\x17\x00\x00\xff\xff\xc2\x7c\x91\x31\x67\x08\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\xcf\x6f\xda\x30\x14\xbe\xf3\x57\xbc\x59\x3d\x80\x14\x60\xe7\x94\xa0\xad\xdb\x0e\x95\xba\x1d\x5a\xf5\x34\x4d\xc3\xc4\x0f\x62\xe1\xd8\x91\xe3\xd0\x56\x51\xfe\xf7\xc9\x4e\x0c\x0e\x49\x3b\x7c\x00\xe7\xfd\xf8\xbe\xcf\xcf\xcf\xef\x48\x35\x18\xcc\x0b\x41\x0d\x42\x02\x9b\xc9\x8a\xf1\x23\xa4\x82\x96\x65\x42\xb6\x4a\x1d\x72\xaa\x0f\x04\xe2\xce\x52\x0b\x5e\x9a\x18\xec\xef\x4f\xc5\xb0\x21\xeb\x09\x00\xc0\x8a\x5e\xa6\xcc\x05\x97\x36\x2f\xd3\xb8\x4b\x48\xa5\x05\x01\x43\xf5\x1e\x4d\x42\xfe\x6e\x05\x95\x87\x2e\xd3\x65\x97\x05\x95\x1e\xc0\x64\x55\xbe\x95\x94\x0b\x02\xc7\x39\xdf\x25\x84\xe7\x74\x8f\xcf\x8f\x0f\x04\xe2\xd2\xbc\x09\x0c\x42\x9e\xec\xb7\x75\xad\x57\x4b\x8b\x11\x40\x16\x27\x3c\x6e\x04\x92\x75\x5d\xbb\x4d\xd3\xac\x96\xc5\x58\x18\xbe\xa6\xa8\x0b\xe3\x49\x3f\x9d\x58\xd7\x75\xdd\xf9\xde\xcd\xe5\xcc\xa6\x95\x99\x7a\x49\x88\xfd\xbd\x67\x36\x8b\xb3\x20\x61\xb5\xa4\xdd\x66\xa4\xbc\x73\x43\xf7\xa5\x67\xb6\xfb\x85\x40\xb9\x37\x19\xac\xe1\x73\x58\x26\x0a\xc7\xf9\x4e\x69\x17\x03\x5c\x42\x9b\xf6\x25\x15\x3c\x3d\x38\xe3\x37\xbb\x43\x36\x35\x74\xbf\x90\x34\xc7\x99\x3b\x77\xf7\x61\xd5\x78\x11\x4b\xc6\x8f\x43\x3d\x65\x41\x53\xd4\xb6\x98\xa3\xee\x93\xdc\x1c\x65\xd5\xd7\xd5\x45\xb8\x6b\xbe\xea\xca\xed\xaa\xeb\x4c\x95\xc6\x4a\x7b\x7e\x7c\x68\x9a\x33\x9e\x97\xd9\x81\xbb\x8b\x4b\xc8\x0f\xc6\x0d\x9c\x3b\xd2\x1f\x1b\x19\x37\x77\xde\xda\x27\x58\x71\x2f\x6c\x47\x4b\xd8\xd1\x79\x81\x32\xe5\x62\x4e\x85\xb1\x87\xe4\xeb\xff\x51\x7e\x47\x81\x06\x47\x48\x99\x73\x5c\x4b\x6b\x34\x2d\xb3\xeb\x59\x9f\x0b\x66\x1f\x63\x4a\xd3\x0c\xcf\x94\x95\xb3\x5e\x4b\x99\x0a\x55\xb1\x39\x53\x2f\x52\x28\xca\x3e\xe2\xee\x2e\xbb\xfd\xdb\xdc\x4e\x26\xf8\x5a\x28\x6d\x80\xe1\x8e\x56\xc2\x40\xed\xa2\xfc\x88\x88\x4f\xbb\xc8\xd9\x0b\xad\x8a\x32\xee\x82\xec\xe2\x2c\x86\x5f\x55\xbe\x45\x1d\x9d\x6c\x95\x16\x31\x3c\x19\xcd\xe5\xfe\x6c\x74\x87\x1d\x9a\xbb\xb7\x36\x74\xf8\x07\x39\xf4\xb4\x4f\x2e\x86\x3b\xa5\x04\x52\x79\x76\xf8\x29\x35\xe2\xe2\x92\xe1\xeb\x50\xa9\x7d\x51\xe1\x69\x9c\xed\xad\xc0\x18\xbe\x6a\x4d\xdf\xa2\x9e\xc3\x57\x68\x3a\xbb\xc8\xb0\x4b\xa3\xa9\xb4\x84\xdf\x7f\x7a\x9e\x73\x93\xb7\xbb\xa6\x45\x64\xd4\xd0\x1e\x4a\x97\x5d\x37\xb7\x61\x58\xaa\xf2\xa2\x32\xc8\x42\x85\xc1\x13\x1a\xe8\xb0\xb3\xbd\xd2\x02\x12\x90\xf8\x02\x36\xc2\x64\xbc\x5c\x54\x5a\xcc\x6e\x27\x23\x62\x2b\x2d\x16\x1e\xef\x1c\xd0\x04\xe5\xb9\x1c\xbc\x03\x4a\x2f\x7c\x50\x8f\x2d\x4d\x0f\x7b\xad\x2a\xc9\xee\xed\x45\xc6\xb0\xa9\xb4\x98\x92\x9b\xda\x49\xf2\x97\xdb\x90\xd9\xe6\xbd\x82\x05\x3d\x72\x44\x69\xee\x0d\xe6\xd7\xd3\xdb\xb6\x6c\x99\x58\x34\x74\xb6\xcd\xd0\xfa\xed\x3e\xba\xe6\xd2\x72\x34\x99\x62\xbd\x76\x09\x46\xb0\x1b\xbf\x97\x9d\x64\x09\x6e\x30\xe7\x66\x1a\x4c\x6b\x12\x81\x0b\x1e\xad\x78\x38\xdd\x06\xa7\x0d\xf1\x6c\x20\x89\x5a\xd3\xa9\x3e\xe3\x98\xfd\xe1\xf5\x21\x6a\x1b\x7a\x25\x6e\x7f\x42\x7d\x88\xdb\x86\x7a\x5c\xce\xa2\xa0\xf8\x21\x78\x5b\xef\x49\xf3\x2f\x00\x00\xff\xff\x92\x8a\x66\xe4\xa6\x08\x00\x00"), }, "/js/component/dialog.js": &vfsgen۰CompressedFileInfo{ name: "dialog.js", @@ -196,10 +196,10 @@ var assets = func() http.FileSystem { }, "/js/page/home.js": &vfsgen۰CompressedFileInfo{ name: "home.js", - modTime: time.Date(2019, 5, 29, 13, 6, 50, 626211126, time.UTC), - uncompressedSize: 13650, + modTime: time.Date(2019, 5, 30, 1, 38, 49, 478966287, time.UTC), + uncompressedSize: 16894, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3a\x5d\x73\xdb\x38\x92\xef\xfe\x15\x3d\x8c\x2b\xa2\x36\x12\x65\xcf\x23\xc7\xf4\x4c\xe2\x64\xa7\x72\x97\xcd\xe4\x12\xa7\xae\xae\x92\x6c\x19\x26\x5b\x12\x62\x8a\xe0\x02\xa0\x6c\x95\xa3\xff\x7e\x85\x0f\x52\xa0\x08\x52\x76\x32\xb5\x0f\x5b\xc3\x07\x9b\x02\xfa\x1b\x8d\xfe\x00\xb8\x26\x1c\x24\xae\xca\x9c\x48\x84\x04\xae\x8e\xce\x32\xba\x06\x9a\x25\x41\x49\x16\x38\x5d\xb2\x15\x06\xe7\x47\x00\x00\x7a\x22\xcd\x89\x10\xf5\x1c\x92\x0c\xb9\x9d\xd5\x10\xb4\x28\x2b\x09\x72\x53\x62\x12\x48\xbc\x93\x01\x94\x39\x49\x71\xc9\xf2\x0c\x79\x12\x7c\x40\xc2\xd3\x25\x54\x3c\x9f\xc0\x0d\x6e\x6e\x19\xcf\x80\x71\x90\x64\x21\x02\x58\x4f\x57\x2c\xc3\x3c\x92\x9c\xae\x92\x40\x68\xd0\x00\x7e\x9b\xb3\xb4\x12\x49\x70\x8c\x6b\x2c\x64\x24\x09\x5f\xa0\x8c\x04\xe6\x98\xca\x70\x1c\xc0\x6f\x37\xb8\xa9\xca\x08\x0b\xa9\x18\x18\xac\x17\x8c\xdd\xac\x08\xbf\x11\xc1\xcc\x91\x8d\x80\xa4\x32\xc7\x24\x78\x8f\x73\x8e\x62\x09\x42\x32\x4e\x16\x18\xc0\x6f\x69\x4e\xd3\x9b\x24\xe0\x98\x33\x92\xbd\x24\x92\x38\x3a\x19\xbd\x6a\xbd\xe7\x44\xc0\x9c\x4c\xe7\xb7\xea\xaf\xd8\x14\xe9\x94\xe4\x32\x80\xd8\x4e\x2b\x7c\x5a\x2c\xe0\xe9\x53\x18\x29\x80\x92\x16\xa3\xe0\xfc\x6c\x46\x1d\x39\x66\xc4\x27\xd4\xf3\x2c\x83\x02\x6f\xe1\xda\xca\xbe\x93\x4a\x2c\xd9\xed\x4b\x4a\x72\xb6\x78\x9e\x65\x0f\x13\xac\xcc\x2b\x31\x4d\x29\x4f\x73\x7c\x18\xf7\x17\x44\xa6\x4b\xc0\x8c\xca\x07\x32\xc0\x22\xa5\xb9\xd6\xfd\x41\xf4\x3f\x2c\xd9\xad\x59\xe6\x07\x91\x37\x90\x7e\xc2\x67\xb3\x8c\xae\x1d\x87\x54\x9e\x5a\x1b\x4d\x4c\x17\x9c\x66\x01\x70\x9c\x3b\x83\xbf\xeb\xb1\x7a\x89\xee\x73\x2a\x64\x0c\x19\x15\x65\x4e\x36\x7f\x94\x92\xb2\x42\x44\x6a\xf0\x1f\x2c\xc3\xad\xeb\xcd\x35\x85\x29\x95\xb8\x82\xf5\x74\xce\x78\x12\x84\x6a\x74\x02\xb4\xc8\xf0\x6e\x0c\xb4\x68\x56\x4c\x04\xd0\xd2\x6d\x3d\xbd\xa6\x85\x15\x6e\x6f\x2a\xd6\xd8\x49\xa0\xff\x05\xed\xa9\x1b\xdc\x18\x9c\x48\x49\xdd\x9e\x53\xae\xf0\x3a\x4b\x82\x3d\xe1\xcd\xf0\x1e\x9d\x5a\xa3\x0e\x74\x3d\xd1\x86\xff\x4d\x92\xc5\x85\x72\x38\xcc\x92\x60\x4e\x73\x89\xfc\x92\x2c\xf6\x60\x32\xcc\x51\xa2\xeb\x92\x2f\xf5\x88\x6b\xb4\x59\xcb\x6a\xce\x44\x3b\x7a\xd0\x82\x28\x71\xa6\xd7\xec\x4e\x6d\x7d\x3a\x4f\x82\x15\xb9\x7b\x47\x16\x08\xe7\x70\xb2\xef\x26\xe5\xb9\x9a\x39\x9b\x95\xfb\xee\xd3\x89\x37\xad\xf9\xfa\x69\x05\xa1\xd3\x1e\xa0\x78\x4d\xf2\x0a\x4d\x68\xeb\x01\x39\x14\x8c\xfc\x48\xad\x08\x95\x2e\x49\xb1\x40\xa5\x4d\xd8\xa6\xa2\xb9\xf7\xd1\x88\x33\x2a\xc8\x75\xae\xd6\x46\x6d\x52\xbd\x7c\x1d\x13\xdd\xdf\x5b\x0b\x6e\xb7\x5d\x4b\x39\xd6\x17\x25\x49\x55\xd8\x76\x76\x52\x03\xd6\x64\x02\xb3\x24\x3f\xf5\x70\x03\xb3\xbb\x0d\x50\x69\x16\xed\xe7\xa0\xde\xed\xbf\x33\x90\x0c\xe6\x94\x0b\x09\x65\x2b\xc2\x3a\xda\x9f\x8e\x3d\x34\xa1\x3f\x26\x90\x62\x91\xe3\x34\x63\xd5\x75\x8e\xd3\x1c\xe7\xfb\x91\xa7\x41\x77\x23\x50\x9f\xac\xa7\x7b\xb2\x96\x1c\xd7\x94\x55\xa2\x5f\x5c\x9d\xf0\x1e\x24\xf3\xbe\xc8\x3f\x26\xeb\x19\xd8\x45\xdd\x93\xb8\xc0\xbb\x01\xe3\xaa\x89\x67\xdf\x25\x2d\xa7\x8b\xe5\x9f\x21\x2e\x4c\x3b\x46\xce\xc9\x90\x3f\x58\xbc\x1f\xf1\x8a\x47\xc9\x7e\x36\xab\x7d\xdd\x0d\x5e\xbb\xdc\xe2\xbc\x96\x35\x6b\x5c\x95\x72\x33\x5d\xa1\x10\x5a\x0b\xbb\x47\x9c\xa4\xaf\x62\xeb\x6b\xf1\x4a\x81\x05\xe7\x6f\x19\x08\xb2\xc6\x6c\x97\x21\x60\x83\x12\xe2\xb0\xd9\x9d\xee\xae\xb4\x54\xa6\x6c\x8d\x3c\x27\x9b\x9a\xba\x1d\x0e\xce\xfb\x6a\x90\x92\x16\xf5\xff\xc2\xec\x6a\xea\xee\xec\xb3\xb4\x12\x92\xad\xa6\x99\x0e\xd7\x4d\x52\x32\x3f\x55\x7d\x64\x60\xaf\x8e\x8e\xe8\xaa\x64\x5c\x36\xc2\xbe\x56\x39\x6f\xce\xd9\x0a\x82\x28\x9a\xa5\x6c\x55\xb2\x02\x0b\xd9\x84\xf7\xe8\xab\x08\x7e\xa9\x91\x0c\x13\x93\x12\x7c\x48\x86\x5d\x0b\xe5\x9a\x08\xbd\xf0\x35\xf8\x4c\x0d\x18\x88\x23\xbc\xd3\x20\x19\xce\x49\x95\x4b\xb8\xd7\x9a\xd4\xcb\x15\x37\x6f\x13\x3d\xbe\xa2\x77\xb4\x10\x31\x7c\xaa\x29\x7e\x31\xe3\x0d\x77\x11\x5b\x0a\xea\x71\xd5\x9b\x34\xa3\xae\xfc\x7a\x70\x6b\xe6\x32\x22\x49\x38\x76\xd0\x39\xca\x8a\x17\xce\x80\x7a\xec\x1a\xc5\x30\x27\xb9\xc0\x49\x6b\xae\x0e\xa0\xde\x49\x53\xae\xc6\x10\x04\xed\x71\xb5\x49\x62\x38\x69\x0f\xda\x0d\xd2\x19\x6f\xbc\x2b\x86\x4f\x5f\xda\x53\xaa\x8e\x6a\x8f\x6e\x5d\xed\x94\x85\x2a\x89\x99\x6b\x1f\xc7\x83\x5b\x8a\x3b\xca\xcb\x25\x15\x51\xc3\x35\xca\xb1\x58\xc8\x25\x9c\x25\x70\xf2\x8b\x9f\xcf\x0a\xe5\x92\x65\xad\x65\xd8\x95\xda\x1d\x2e\x74\x0e\xa1\x66\x61\xcd\x3a\xb6\x7c\x7f\x69\xab\xa6\x20\x74\xc8\x49\xe0\xd4\x33\x65\x4c\x0b\x09\x04\x81\x67\xb6\x61\x2e\x79\x85\x13\x50\x7f\xc7\x8e\xf0\x3b\x7b\x35\x80\x6a\x27\x7f\x90\xca\xe9\x60\x8e\x32\x5d\x5e\x92\x85\x78\xb8\xe4\x2d\xb0\xd9\x0c\x3e\xe0\xce\xbb\x09\x5f\x88\xb6\x57\xd4\xac\x20\x81\x50\xd5\x36\x6c\xee\x8e\x25\x09\xa8\xfa\x30\x47\x52\x04\x63\xf8\xd5\x99\x8a\xb5\x22\x6d\x75\x1b\x61\x1d\x62\xce\xd8\x3e\xb1\xdd\x94\x75\xd8\xae\xec\xef\x08\x17\x68\x5d\x17\xfe\x55\x21\xdf\xb4\xcb\x5e\xc2\x81\xdf\x5d\x92\xc5\x73\x48\x60\xf6\x69\x14\x7c\x79\x12\x7e\xfa\xe7\x28\xf8\xf2\x6c\xac\x7e\xcc\x16\x13\x45\x24\x78\x22\xc9\x02\x6e\xa9\x5c\x82\x2e\x47\x82\x4e\xc0\xd6\x34\x5e\x28\x1a\xe1\x3f\xbf\x7d\x16\xcf\xc6\x4f\xc2\xcf\x1f\x9e\x8d\x2d\xbe\x42\x9f\x2a\x74\x56\xc9\xa9\xa6\xd0\x21\x50\x37\x98\x89\xeb\x10\x93\x0e\x98\x34\xb6\xd9\xdf\x3a\x46\x84\xf7\x28\xaa\x5c\x76\x6d\xf0\x77\x65\x26\x85\x0a\xcf\x4d\x9d\xd3\x02\xb8\x5d\xd2\x1c\x21\xac\xd1\x21\xb1\x06\x89\xf0\x0e\xd3\xd0\xca\x35\xde\xf7\x9e\x5a\x98\xa8\xac\xc4\xb2\x41\xfe\x74\xfa\x65\xdc\x5e\xd1\x6d\x47\x9a\x8b\x1c\x09\xaf\xa5\x51\xd1\xd4\xb2\x38\xf2\x9b\xc3\xbe\x45\x1c\x75\x5d\x1c\x1a\xe1\x26\x30\x1a\x8d\x87\x34\x7d\xf1\x10\x1d\x5f\x7c\x97\x8e\x3f\x3f\x46\xc7\x17\x2d\x1d\x27\x20\x97\x58\x80\xe4\xf4\xbb\xd4\x7e\xa1\xd5\xd6\x67\x0e\xe1\xb8\x99\x9a\x7d\x16\xcf\x94\xa3\x8d\xc0\x67\x92\x77\x1c\x4b\xc2\x11\x3e\xbe\x7f\x03\x73\xc6\xe1\xf9\xbb\xd7\x9d\x1d\x50\xf1\x1c\x12\xdd\xd0\x7f\x7c\xff\x26\x0c\x66\xa4\xa4\xb3\x5d\xa3\x38\x81\x8c\xa5\xd5\x4a\x55\xff\x1f\xdf\xbf\xd9\xd3\xbd\xe2\xf9\x2e\x7a\x59\x0a\xe6\xe0\xe4\x1d\xe1\x64\x25\xc2\xae\x49\xad\x6a\x71\x63\x14\xaf\xd1\x63\x63\xfa\xaf\x8c\x16\x61\x30\x09\xc6\x5d\x28\x93\x77\x9a\xd0\xda\x5e\x92\x5e\xe7\x50\x49\xd2\xac\x89\xcf\x12\xe2\x86\x96\x7f\x77\x82\xd0\x2b\xce\x19\x0f\x03\x35\x6c\xa2\x8d\x2a\x9d\x74\xc3\xbf\xcf\xc0\x0d\xa5\x6a\x17\xfb\x63\x5b\x58\xf1\x7c\xdc\xd1\x24\x52\x5e\x11\x72\x14\x25\x2b\x04\x42\x72\xee\x71\x44\xb0\x21\xfb\xa7\x1a\x2c\x62\x37\x63\x90\x4b\xce\x6e\xa1\x1e\xfa\xc5\x8b\x65\x13\x61\x83\xf7\x55\xb0\x22\x1c\x77\x61\xb7\x7d\x82\x29\x84\x7e\xa1\xea\x04\x41\x24\xf1\xce\xbb\xb9\x4f\x51\xd2\xef\x7e\x49\x35\x68\x5d\x92\x5b\x68\xfb\x73\x00\x61\x57\xb0\x5a\x94\x66\x60\x6f\x89\x5c\x89\xc9\x1a\x41\xe8\x3c\x44\x8a\x0c\x4c\x65\xaf\xf7\x08\x9d\x43\x81\x98\x61\xd6\xbb\x02\x4d\x0a\xf3\xc5\x8b\xfa\x51\xce\xb4\xa4\x42\x32\xbe\x81\x64\x00\x4e\x3d\x24\x95\x74\x8d\xa6\x5c\x72\xce\x31\xbb\x1e\xef\x3e\x75\x35\x36\x98\x2e\xdc\x67\x68\xbb\xb8\xcf\xb6\xc7\x6a\xb0\x0b\x16\xff\x53\x21\xa7\x68\x12\x91\x7f\x61\xc0\x2d\x30\xea\x36\x76\xec\xe0\x9a\x98\x7a\xa5\xa6\x92\xe3\xfb\x06\x6c\x7b\xe5\x71\xcc\x0e\x41\x1b\x70\x7e\x52\xf5\x40\xe0\xa1\x6a\xe6\x6b\xba\xe6\x97\xa6\x7c\x48\x31\x55\x81\x3d\xd1\xc6\x1f\x14\xc2\x61\x68\xeb\xc9\x73\x38\x19\xf2\x06\x30\x91\x12\x9e\x25\x70\xf5\xeb\xf1\xbd\x83\x6f\xe2\xdb\xd3\x60\xbc\xbd\xea\x57\x7c\xdb\x2f\xf8\x2d\x2d\x32\x76\x1b\x59\x57\xd3\xfa\x6b\xdf\x0c\xed\xc8\xa4\xe5\x51\x4a\x88\x1e\x03\xf7\xf0\x70\x93\xaa\x50\xca\x73\xfc\x57\x85\x42\x0e\xec\x8f\xde\x8a\xd3\x7d\x6c\x50\x32\x41\xd1\x64\x9c\x3a\xac\x7a\xa5\x03\xcc\x05\x0e\xd0\xdb\x0b\xbf\xb6\x1a\xec\x87\x56\x61\xb3\x15\xec\xfb\xac\xd2\x19\xf9\x0f\x0b\xdf\xda\x70\xb6\xac\x54\x90\x03\x81\xf6\xa0\x79\x7d\x22\xa4\x44\xad\x30\x72\x7e\x40\x84\x0e\xf1\x5e\x13\x2a\x5a\x6a\xeb\xb7\x96\x6f\xc8\xd7\x90\xf3\x48\xe2\x9d\x0c\xc7\xc6\x20\x2b\xb1\xe8\x17\xa6\x25\x94\x58\xb2\x5b\x5d\x02\x98\x66\x3b\xbc\x3a\xbe\x5f\x89\xc5\x16\xc2\xe3\x7b\x45\x54\x25\x90\x4a\x6c\xc7\x43\x41\xcb\x63\x13\xe8\x71\x2c\x6f\x4f\xb7\x77\x49\xd4\x69\x40\x0f\xb5\x96\xbb\xce\xd5\x4b\x7e\xef\x18\x6e\x9f\xba\x25\x5c\xaa\x2e\xea\x75\x21\x35\xcc\x04\x4e\x4f\xc6\xf0\xed\x9b\xdb\x41\x83\x5d\x1b\x13\xea\x93\x56\x26\x1f\xb7\x64\x74\x67\xda\xf8\x7a\x87\x37\x44\xce\x12\x95\x30\x06\xb4\xd3\xe0\xee\xbc\xa9\x2b\xba\x16\x38\xe6\x38\x77\xaa\x84\xdf\x39\xcd\x22\x91\x72\x96\xe7\x97\xac\x84\x64\x5f\x8d\x87\x58\xad\xb9\x72\x08\x25\x59\xbc\x25\xab\x8e\xdd\x4c\x5f\xf9\x41\xb5\x7a\xaa\x29\x34\x15\x7a\x67\xc9\x0b\xbc\xbd\x24\x0b\xdd\x8d\x68\xd0\x48\xa2\x90\x3b\x92\xbf\xc2\x55\xf0\xe4\xf8\xde\xfe\xde\x06\x57\x10\xc3\x95\x33\x70\xb5\xa7\xad\x8e\x2f\x4e\xca\x8b\x68\x91\xe6\x55\x86\x22\x34\x8c\xfc\x0d\x8e\x93\x50\x55\x7a\x82\xe3\x7b\x03\xed\x4b\x48\xbd\xb6\x81\x96\x4b\xbb\xee\xeb\xde\x07\xfa\x9d\x77\x07\xe2\x69\x16\xf4\x99\x6c\x0c\xa3\xb7\x78\x0b\xf5\x26\x18\x75\x2d\x99\xb2\x42\x62\x21\x63\x18\x5d\x70\xd4\x55\x5d\xeb\x7e\xd2\x83\x31\xa7\x98\x67\x22\x86\x4f\xfe\x30\x50\x90\x95\x62\x5b\xf1\xdc\x83\xab\x9e\x9c\x5c\x63\x1e\xc3\xe8\x23\xcf\x27\xaa\x92\xe4\xd2\x1c\x10\x2c\xa5\x2c\xe3\xd9\x2c\x8a\x22\x0f\xe2\x76\xd2\x13\x75\x2c\x3b\xad\xed\x01\x86\x17\xfa\xf4\xcf\x18\x06\x42\xa6\xef\xc9\x48\x3e\x1e\x3d\x9a\x19\xde\xa5\xc8\x4b\xf9\x30\x76\x16\xd8\x65\xe8\xc7\x93\x9b\x52\x11\x27\x1c\xc9\xe3\x45\x52\x79\xe8\x90\x3c\x6c\xb5\x22\x20\x54\x53\x4b\x24\x66\xa6\x2e\x39\x28\x95\x85\x67\x3c\x86\xd1\xa4\x07\x26\xa3\xa9\x26\xc2\x37\xf1\x2e\x2b\x46\x2b\x52\xaa\x1d\xa9\x12\x86\x24\x8b\x48\x09\xda\x8d\xe8\x5b\xcf\x79\xcc\x8a\xd0\xe2\x12\xef\x94\x4f\xfe\xf1\xdf\x1e\x96\x02\x53\x56\x64\x16\xe2\x82\x14\x29\xfa\x5c\x4d\x51\xd1\x37\x9d\x31\x84\xaa\xc5\x1a\x0f\x36\x62\xff\x20\x37\x08\xa2\xb2\xed\x3e\x15\x50\x30\x09\xfa\x1e\xa0\x37\x9b\x2a\xa2\x91\xea\xe2\xcd\xa9\x82\x39\x64\x0b\x86\xd2\xa9\x37\x33\x06\x8a\xe1\xaa\x12\x72\xc7\xb2\xaf\x96\x83\xa6\xa8\x79\x6c\x25\x5a\x9f\x65\xa8\x85\xf1\xc2\xac\xcd\xa9\x8b\xaa\x65\xb4\x5e\xbd\x80\xa0\xab\x23\xf6\x86\xdd\x22\xbf\x20\x02\x43\x7f\x96\xd6\x60\xbe\x73\x96\x7e\x68\x51\xe6\x54\x2a\xd8\xbf\x4d\x3e\x8b\xbf\xcd\x16\x03\xa0\x26\x8b\x38\xde\xa5\xcb\x9a\xd1\x10\x75\xc7\x1b\x87\xcb\x17\xef\xd1\xbf\xef\x31\x3b\x4f\x92\xc5\x20\xe4\x76\xa8\xc0\x19\x68\xb3\xb1\xc8\xfa\x4f\x06\xd4\x6a\xe9\xe3\x98\xa1\x06\xb9\xe2\x79\x0c\x7b\x4e\xda\xdf\xe8\xda\x74\x61\x16\x5f\xbd\x1f\xc4\xb0\x81\xcd\xe2\xd8\x5f\x87\xf9\x34\x27\x54\x7e\x17\xee\x31\x89\xde\x3a\xf6\x7a\x69\xe8\xac\xa8\x7e\xdc\xf6\xc8\x3d\x90\x1b\x5e\x56\x73\x83\x11\x43\x50\x32\x21\x0f\x1c\x23\x5c\xb3\x6c\x13\xc3\x7f\x7d\xf8\xe3\x6d\x24\x24\xa7\xc5\x82\xce\x37\x26\xd0\x0c\xe3\x99\xaf\xa9\x5a\xb7\x24\x7d\x4f\x70\x61\x92\xf3\xf4\x72\x53\x62\x10\x43\x40\xca\x32\xa7\xa9\xfe\xa2\x62\xa6\x5a\x8e\x03\x22\x6e\xfb\xa7\x7b\x8a\x6b\x78\x44\x53\x56\x3f\xdf\xd7\x9c\xd5\xcf\x43\x9b\xb4\x07\x0b\x3e\xdc\xb4\xd5\x8f\xdf\x9f\x0e\x34\xbf\xfb\x88\x6b\x2a\xe8\x75\x8e\x8f\x40\xdc\x5d\xa7\xa9\x68\x97\x62\x78\x32\x81\x93\x89\x6e\x1f\xbf\x53\xe7\x07\x74\x89\x3f\xac\xf3\x77\xb5\x81\xf0\x27\xb6\x82\x07\x8c\xb0\xf5\x35\xf5\x47\x7d\x10\xde\x1a\xdb\x7c\xe0\x14\x52\x89\xab\x4e\x47\x3c\x9b\xc1\xc5\x12\xd3\x1b\x7d\xe0\x69\x52\x0f\x68\xc0\x4e\x0f\x61\x2f\xde\xf4\xa4\x39\x64\x63\xd7\x5f\x31\x95\x81\xff\x72\x53\xef\x9c\xe7\x9c\x93\x4d\x44\x85\xfe\x6f\x05\x18\x5b\x12\x09\x7c\xd2\x2f\x5f\xf6\xfb\x15\x3b\xab\xff\xd7\xd9\x50\x7f\xbd\xe6\x5d\x16\x95\x2e\x68\xe6\xdc\x0c\x2a\xd0\x48\x8d\x28\x11\x8b\x6a\x75\x8d\x5c\x5f\x0b\xd6\xe3\x9d\xcb\xe7\x86\x71\x91\xe1\x5d\x87\x90\x19\xf4\xd2\xd2\x53\x31\x4c\x4f\x3d\x71\xdd\x6e\x7d\x9a\xc1\x39\x9c\xc0\xd3\xa7\x96\xfa\xb9\x86\xde\x5f\xbd\x8e\xe1\x8c\xee\xf6\x14\x51\x31\x3f\x19\xb8\x87\x55\xa5\x05\xd0\x4c\xe8\x25\xa4\x45\x46\x53\x14\x9d\xb6\x53\xcd\xd7\x36\x55\xe5\x42\x6d\x50\x6b\x15\x4f\x5c\xb7\x94\x06\xb0\xf4\xe7\x83\x91\x60\x5c\x86\x21\x99\xc0\xb5\xae\x42\xaf\x61\x0a\xc4\x73\xcf\x62\x3b\x30\xd3\xa0\xe8\xd3\x75\x13\xff\x3b\x92\x1a\x88\x04\x02\xe3\xb6\xb0\xfb\x12\xb6\xb7\xc1\x73\xa0\xe5\x12\xc1\x7c\xcc\xd6\xfa\x68\xe5\x57\xb8\x5c\x52\xa1\xcf\xd4\x59\xa1\x4a\x60\xca\x39\xae\x91\xeb\x18\x17\x05\x0f\x59\x82\x53\x6f\x9f\xdc\x23\x6c\xd0\xdd\xb4\x8e\xac\xcf\x39\xc2\x86\x55\xa6\x26\x3f\x28\x5a\xcb\x5b\xba\xcb\xbf\x64\xb7\x90\xed\xbe\xfa\x68\x24\x7b\x68\x13\xad\xff\x0d\xf4\xce\xf6\x65\xb0\x95\xf9\x3f\xf4\x35\x68\xad\x5e\xe6\x2d\x3b\xd0\xc7\x0c\xf4\x30\xff\xe6\x02\xc9\x7c\x22\xfa\x3d\x25\x12\xcd\xc4\x5f\x15\xd2\x0f\x54\x48\x3f\x50\x1a\x0d\xf9\x4f\xfd\xfc\xfb\x0b\x23\x1b\x44\xa3\x39\xe3\xaf\x48\xba\x0c\x6d\x3a\x39\xef\xa9\x98\xf4\xf4\x04\x4e\xc7\xe3\xfe\xbb\x1d\x70\xef\xbc\xba\x9f\x30\xc1\xcf\x07\xef\x9c\xa0\x73\x66\xa7\x35\x39\x54\xa3\xfc\x55\xc2\x0d\xd1\xfa\xb3\x4b\xb8\xfa\xbb\x33\x56\x15\x12\xdb\x67\xa4\xfa\x93\x04\x49\x24\xfe\xaf\x32\x2e\x72\x55\xb3\xa0\xc7\xfd\x1b\x38\x48\x00\x23\xf3\xf6\xed\x1b\xdc\x7b\x02\xc3\xee\xb2\x19\x12\x83\x13\x39\x43\xdf\xbe\x0d\xdf\x40\x37\x9f\x7a\x18\x4c\xfb\x53\x61\x79\x80\x4b\x97\x49\x69\xc9\xef\x97\x50\xca\xc1\x1d\x01\x74\xb9\xb9\x93\xa0\xa7\x18\xea\x1e\xfb\x77\x66\x77\x92\xea\x97\xa1\x33\xfe\xfd\x3d\xe1\xa4\x5e\x7b\xbd\x4a\xb2\xec\xd5\x1a\x0b\xf9\x86\x0a\x89\x05\xf2\x70\x54\xb2\x52\xeb\x35\x9a\xb4\x16\xc8\xa1\x62\xee\x1e\x58\x91\x62\x38\x5a\x32\x76\x13\x5f\xe3\x9c\x71\x7c\x89\x42\x72\xb6\x19\x4d\x60\x5e\x15\xba\x12\xe8\x9c\x8a\x5b\xa6\x1c\x57\x6c\x8d\x8f\xe6\xbb\x75\x22\x8a\x47\xcf\xd6\xf7\x83\xdb\xa3\xed\xff\x07\x00\x00\xff\xff\x59\x7d\xa6\x64\x52\x35\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3b\xef\x73\xdb\xb6\x92\xdf\xfd\x57\x6c\x19\x4f\x4c\xbd\x48\x94\xdd\x8f\xaa\xe9\x36\x71\xf3\x3a\xb9\xcb\x4b\x73\x89\x7b\x37\x37\x6e\xde\x18\x26\x57\x12\x6a\x8a\x60\x01\x50\xb2\xc6\xd6\xff\x7e\x83\x1f\xa4\x40\x11\xa4\x14\x27\xd7\x9b\xbb\x0b\x3f\x58\x12\xb0\xbb\xd8\x5d\x2c\xf6\x17\xe1\x25\xe1\x20\x71\x51\x64\x44\x22\xc4\x70\x73\x74\x9e\xd2\x25\xd0\x34\x0e\x0a\x32\xc3\xd1\x9c\x2d\x30\xb8\x38\x02\x00\xd0\x13\x49\x46\x84\xa8\xe6\x90\xa4\xc8\xed\xac\x86\xa0\x79\x51\x4a\x90\xeb\x02\xe3\x40\xe2\xbd\x0c\xa0\xc8\x48\x82\x73\x96\xa5\xc8\xe3\xe0\x23\x12\x9e\xcc\xa1\xe4\xd9\x10\xee\x70\xbd\x62\x3c\x05\xc6\x41\x92\x99\x08\x60\x39\x5a\xb0\x14\xb3\x48\x72\xba\x88\x03\xa1\x41\x03\xf8\x69\xca\x92\x52\xc4\xc1\x31\x2e\x31\x97\x91\x24\x7c\x86\x32\x12\x98\x61\x22\xc3\x41\x00\x3f\xdd\xe1\xba\x2c\x22\xcc\xa5\x5a\xc0\x60\xbd\x62\xec\x6e\x41\xf8\x9d\x08\xc6\x0e\x6f\x04\x24\x95\x19\xc6\xc1\x07\x9c\x72\x14\x73\x10\x92\x71\x32\xc3\x00\x7e\x4a\x32\x9a\xdc\xc5\x01\xc7\x8c\x91\xf4\x67\x22\x89\x23\x93\x91\xab\x92\x7b\x4a\x04\x4c\xc9\x68\xba\x52\x7f\xc5\x3a\x4f\x46\x24\x93\x01\x4c\xec\xb4\xc2\xa7\xf9\x0c\x9e\x3f\x87\x13\x05\x50\xd0\xfc\x24\xb8\x38\x1f\x53\x87\x8f\x31\xf1\x31\xf5\x32\x4d\x21\xc7\x15\xdc\x5a\xde\xb7\x5c\x89\x39\x5b\xfd\x4c\x49\xc6\x66\x2f\xd3\xf4\x30\xc6\x8a\xac\x14\xa3\x84\xf2\x24\xc3\xc3\x56\x7f\x45\x64\x32\x07\x4c\xa9\x3c\x70\x01\xcc\x13\x9a\x69\xd9\x0f\xa2\xff\x71\xce\x56\x66\x9b\x0f\x22\x6f\x20\xfd\x84\xcf\xc7\x29\x5d\x3a\x06\xa9\x2c\xb5\x52\x9a\x18\xcd\x38\x4d\x03\xe0\x38\x75\x06\x7f\xd1\x63\xd5\x16\x3d\x64\x54\xc8\x09\xa4\x54\x14\x19\x59\xff\x5a\x48\xca\x72\x11\xa9\xc1\x7f\xb0\x14\x37\xae\x35\x57\x14\x46\x54\xe2\x02\x96\xa3\x29\xe3\x71\x10\xaa\xd1\x21\xd0\x3c\xc5\xfb\x01\xd0\xbc\xde\x31\x11\x40\x43\xb6\xe5\xe8\x96\xe6\x96\xb9\x9d\xa9\x89\xc6\x8e\x03\xfd\x11\x34\xa7\xee\x70\x6d\x70\x22\xc5\x75\x73\x4e\x99\xc2\x9b\x34\x0e\x76\x98\x37\xc3\x3b\x74\x2a\x89\x5a\xd0\xd5\x44\x13\xfe\x27\x49\x66\x97\xca\xe0\x30\x8d\x83\x29\xcd\x24\xf2\x2b\x32\xdb\x81\x49\x31\x43\x89\xae\x49\xfe\xac\x47\x76\xc0\x94\x1d\xb9\x40\xaf\x9b\x76\x75\x3e\x6e\x28\xd6\x99\x68\x3a\x18\x9a\x13\xc5\xf1\xe8\x96\xdd\x2b\xef\x40\xa7\x71\xb0\x20\xf7\xef\xc9\x0c\xe1\x02\x4e\x77\x2d\xa9\xb8\x50\x33\xe7\xe3\x62\xd7\xc2\x5a\x2e\xa9\x31\x5f\x3d\x0d\x3f\x75\xd6\x01\x34\x59\x92\xac\x44\xe3\xfd\x3a\x40\xf6\xf9\x2b\x3f\x52\xc3\x89\x25\x73\x92\xcf\x50\x49\x13\x36\xa9\xe8\xd5\xbb\x68\x4c\x52\x2a\xc8\x6d\xa6\xb6\x4f\xe9\x5f\xef\x70\x4b\x45\x0f\x0f\x56\x83\x9b\x4d\x5b\x53\x8e\xf6\x45\x41\x12\xe5\xd9\x9d\xc3\x56\x83\xd5\xc1\xc2\x6c\xc9\x77\x1d\xab\x81\x71\x00\x06\xa8\x30\x9b\xf6\x7d\x50\x39\x84\x5f\x18\x48\x06\x53\xca\x85\x84\xa2\xe1\x84\x1d\xe9\xcf\x06\x1e\x9a\xd0\xed\x36\x48\x3e\xcb\x70\x94\xb2\xf2\x36\xc3\x51\x86\xd3\x5d\xe7\x54\xa3\xbb\x4e\xaa\x8b\xd7\xb3\x1d\x5e\x0b\x8e\x4b\xca\x4a\xd1\xcd\xae\x8e\x89\x07\xf1\xbc\xcb\xf2\x97\xf1\x7a\x0e\x76\x53\x77\x38\xce\xf1\xbe\x47\xb9\x6a\xe2\xc5\x93\xb8\xe5\x74\x36\xff\x1a\xec\xc2\xa8\xa5\xe4\x8c\xf4\xd9\x83\xc5\xfb\x12\xab\xf8\x2c\xde\xcf\xc7\x95\xad\xbb\xce\x6b\x1b\x7e\x9c\xaf\x45\xb5\x34\x2e\x0a\xb9\x1e\x2d\x50\x08\x2d\x85\x3d\x23\x4e\x5e\xa0\xdc\xef\x1b\xf1\x5a\x81\x05\x17\xef\x18\x08\xb2\xc4\x74\x1b\x44\x60\x8d\x12\x26\x61\x7d\x3a\xdd\x53\x69\xa9\x8c\xd8\x12\x79\x46\xd6\x15\x75\x3b\x1c\x5c\x74\xa5\x29\x05\xcd\xab\xcf\xdc\x9c\x6a\xea\x9e\xec\xf3\xa4\x14\x92\x2d\x46\xa9\x76\xd6\x75\xdc\x32\x3f\x55\x0a\x65\x60\x6f\x8e\x8e\xe8\xa2\x60\x5c\xd6\xcc\xbe\x51\x61\x71\xca\xd9\x02\x82\x28\x1a\x27\x6c\x51\xb0\x1c\x73\x59\xbb\xf7\xe8\x0f\x11\xfc\x50\x21\x99\x45\x4c\x40\xf0\x21\x99\xe5\x1a\x28\xb7\x44\xe8\x8d\xaf\xc0\xc7\x6a\xc0\x40\x1c\xe1\xbd\x06\x49\x71\x4a\xca\x4c\xc2\x83\x96\xa4\xda\xae\x49\xfd\x6d\xa8\xc7\x17\xf4\x9e\xe6\x62\x02\xd7\x15\xc5\x4f\x66\xbc\x5e\x5d\x4c\x2c\x05\xf5\xb8\xe2\x0d\xeb\x51\x97\x7f\x3d\xb8\x31\x73\x29\x91\x24\x1c\x38\xe8\x1c\x65\xc9\x73\x67\x40\x3d\x76\x8f\x26\x30\x25\x99\xc0\x61\x63\xae\x72\xa0\xde\x49\x93\xd1\x4e\x20\x08\x9a\xe3\xea\x90\x4c\xe0\xb4\x39\x68\x0f\x48\x6b\xbc\xb6\xae\x09\x5c\x7f\x6a\x4e\xa9\x54\xab\x39\xba\x71\xa5\x53\x1a\x2a\x25\xa6\xae\x7e\x1c\x0b\x6e\x08\xee\x08\x2f\xe7\x54\x44\xf5\xaa\x51\x86\xf9\x4c\xce\xe1\x3c\x86\xd3\x1f\xfc\xeb\x2c\x50\xce\x59\xda\xd8\x86\x6d\x36\xde\x5a\x85\x4e\x21\xd4\x4b\x58\xb5\x0e\xec\xba\x3f\x34\x45\x53\x10\xda\xe5\xc4\x70\xe6\x99\x32\xaa\x85\x18\x82\xc0\x33\x5b\x2f\x2e\x79\x89\x43\x50\x7f\x07\x0e\xf3\x5b\x7d\xd5\x80\xea\x24\x7f\x94\xca\xe8\x60\x8a\x32\x99\x5f\x91\x99\x38\x9c\xf3\x06\xd8\x78\x0c\x1f\x71\x6b\xdd\x84\xcf\x44\xd3\x2a\xaa\xa5\x20\x86\x50\xe5\x36\x6c\xea\x8e\xc5\x31\xa8\x14\x32\x43\x92\x07\x03\xf8\xd1\x99\x9a\x68\x41\x9a\xe2\xd6\xcc\x3a\xc4\x9c\xb1\x5d\x62\xdb\x29\x6b\xb0\x6d\xde\xdf\x13\x2e\xd0\x9a\x2e\xfc\x59\x22\x5f\x37\x33\x63\xc2\x81\xdf\x5f\x91\xd9\x4b\x88\x61\x7c\x7d\x12\x7c\x7a\x16\x5e\xff\xf3\x24\xf8\xf4\x62\xa0\x7e\x8c\x67\x43\x45\x24\x78\x26\xc9\x0c\x56\x54\xce\x41\xa7\x23\x41\xcb\x61\x6b\x1a\xaf\x14\x8d\xf0\x9f\x8f\xbf\x8b\x17\x83\x67\xe1\xef\x1f\x5f\x0c\x2c\xbe\x42\x1f\x29\x74\x56\xca\x91\xa6\xd0\x22\x50\xd5\xa0\xb1\x6b\x10\xc3\x16\x98\x34\xba\xd9\x3d\x3a\x86\x85\x0f\x28\xca\x4c\xb6\x75\xf0\x77\xa5\x26\x85\x0a\x2f\x4d\x9e\xd3\x00\x58\xcd\x69\x86\x10\x56\xe8\x10\x5b\x85\x44\x78\x8f\x49\x68\xf9\x1a\xec\x5a\x4f\xc5\x4c\x54\x94\x62\x5e\x23\x5f\x9f\x7d\x1a\x34\x77\x74\xd3\xe2\xe6\x32\x43\xc2\x2b\x6e\x94\x37\xb5\x4b\x1c\xf9\xd5\x61\xbf\x45\x1c\x75\x5e\x1c\x1a\xe6\x86\x10\x04\x83\x3e\x49\x5f\x1d\x22\xe3\xab\x27\xc9\xf8\xfd\xe7\xc8\xf8\xaa\x21\xe3\x10\xe4\x1c\x73\x90\x9c\x3e\x49\xec\x57\x5a\x6c\xdd\x96\x08\x07\xf5\xd4\xf8\x77\xf1\x42\x19\x5a\x00\x3e\x95\xbc\xe7\x58\x10\x8e\xf0\xdb\x87\xb7\x30\x65\x1c\x5e\xbe\x7f\xd3\x3a\x01\x25\xcf\x20\xd6\x35\xff\x6f\x1f\xde\x86\xc1\x98\x14\x74\xbc\xad\x25\x87\x90\xb2\xa4\x5c\xa8\xec\xff\xb7\x0f\x6f\x77\x64\x2f\x79\xb6\xf5\x5e\x96\x82\xe9\xad\xbc\x27\x9c\x2c\x44\xd8\x56\xa9\x15\x6d\x52\x2b\xc5\xab\xf4\x89\x51\xfd\x1f\x8c\xe6\x61\x30\x0c\x06\x6d\x28\x13\x77\x6a\xd7\xda\xdc\x92\x4e\xe3\x50\x41\xd2\xec\x89\x4f\x13\xe2\x8e\x16\x7f\x77\x9c\xd0\x6b\xce\x19\x0f\x03\x35\x6c\xbc\x8d\x4a\x9d\x74\x4f\x60\x77\x01\xd7\x95\xaa\x53\xec\xf7\x6d\x61\xc9\xb3\x41\x4b\x92\x48\x59\x45\xc8\x51\x14\x2c\x17\x08\xf1\x85\xc7\x10\xc1\xba\xec\xef\x2a\xb0\x88\xdd\x0d\x40\xce\x39\x5b\x41\x35\xf4\x83\x17\xcb\x06\xc2\x1a\xef\x0f\xc1\xf2\x70\xd0\x86\xdd\x74\x31\xa6\x10\xba\x99\xaa\x02\x04\x91\xc4\x3b\xef\xc6\x3e\x45\x49\x7f\xf7\x73\xaa\x41\xab\x94\xdc\x42\xdb\x9f\x3d\x08\xdb\x84\xd5\xa2\xd4\x03\x3b\x5b\xe4\x72\x4c\x96\x08\x42\xc7\x21\x92\xa7\x60\x32\x7b\x7d\x46\xe8\x14\x72\xc4\x14\xd3\xce\x1d\xa8\x43\x98\xcf\x5f\x54\x8f\x32\xa6\x39\x15\x92\xf1\x35\xc4\x3d\x70\xea\x21\x89\xa4\x4b\x34\xe9\x92\xd3\xea\x6c\x5b\xbc\xfb\x54\xd9\x58\x6f\xb8\x70\x9f\xbe\xe3\xe2\x3e\x9b\x0e\xad\xc1\xd6\x59\xfc\x5b\x89\x9c\xa2\x09\x44\xfe\x8d\x01\x37\xc1\xa8\xca\xd8\x81\x83\x6b\x7c\xea\x8d\x9a\x8a\x8f\x1f\x6a\xb0\xcd\x8d\xc7\x30\x5b\x04\xad\xc3\xf9\x4e\xe5\x03\x81\x87\xaa\x99\xaf\xe8\x9a\x5f\x9a\xf2\x3e\xc1\x54\x06\xf6\x4c\x2b\xbf\x97\x09\x67\x41\x9b\x4f\x5e\xc0\x69\x9f\x35\x80\xf1\x94\xf0\x22\x86\x9b\x1f\x8f\x1f\x1c\x7c\xe3\xdf\x9e\x07\x83\xcd\x4d\xb7\xe0\x9b\x6e\xc6\x57\x34\x4f\xd9\x2a\xb2\xa6\xa6\xe5\xd7\xb6\x19\xda\x91\x61\xc3\xa2\x14\x13\x1d\x0a\xee\x58\xc3\x0d\xaa\x42\x09\xcf\xf1\xcf\x12\x85\xec\x39\x1f\x9d\x19\xa7\xfb\x58\xa7\x64\x9c\xa2\x89\x38\x95\x5b\xf5\x72\x07\x98\x09\xec\xa1\xb7\xe3\x7e\x6d\x36\xd8\x0d\xad\xdc\x66\xc3\xd9\x77\x69\xa5\x35\xf2\x7f\xcc\x7d\x6b\xc5\xd9\xb4\x52\x41\xf6\x38\xda\xbd\xea\xf5\xb1\x90\x10\xb5\xc3\xc8\xf9\x1e\x16\x5a\xc4\x3b\x55\xa8\x68\xa9\xa3\xdf\xd8\xbe\x3e\x5b\x43\xce\x23\x89\xf7\x32\x1c\x18\x85\x2c\xc4\xac\x9b\x99\x06\x53\x62\xce\x56\x3a\x05\x30\xc5\x76\x78\x73\xfc\xb0\x10\xb3\x0d\x84\xc7\x0f\x8a\xa8\x0a\x20\xa5\xd8\x0c\xfa\x9c\x96\x47\x27\xd0\x61\x58\xde\x9a\x6e\xe7\x3d\x52\xab\x00\xdd\x57\x5a\x6e\x2b\x57\x2f\xf9\x9d\x36\xdc\x2e\x75\x4b\xb8\x50\x55\xd4\x9b\x5c\x6a\x98\x21\x9c\x9d\x0e\xe0\xf1\xd1\xad\xa0\xc1\xee\x8d\x71\xf5\x71\x23\x92\x0f\x1a\x3c\xba\x33\x4d\x7c\x7d\xc2\x6b\x22\xe7\xb1\x0a\x18\x3d\xd2\x69\x70\x77\xde\xe4\x15\x6d\x0d\x1c\x73\x9c\x3a\x59\xc2\x2f\x9c\xa6\x91\x48\x38\xcb\xb2\x2b\x56\x40\xbc\x2b\xc6\x21\x5a\xab\xdf\x4a\x84\x92\xcc\xde\x91\x45\x4b\x6f\xa6\xae\xfc\xa8\x4a\x3d\x55\x14\x9a\x0c\xbd\xb5\xe5\x39\xae\xae\xc8\x4c\x57\x23\x1a\x34\x92\x28\xe4\x96\xe4\x8f\x70\x13\x3c\x3b\x7e\xb0\xbf\x37\xc1\x0d\x4c\xe0\xc6\x19\xb8\xd9\x91\x56\xfb\x17\x27\xe4\x45\x34\x4f\xb2\x32\x45\x11\x9a\x85\xfc\x05\x8e\x13\x50\x55\x78\x82\xe3\x07\x03\xed\x0b\x48\x9d\xba\x81\x86\x49\xbb\xe6\xeb\xbe\x32\xf4\x1b\xef\x16\xc4\x53\x2c\xe8\x9e\xec\x04\x82\x77\xb8\x82\xea\x10\x78\x32\xa3\x84\xe5\x12\x73\x39\x81\xe0\x92\xa3\xce\xea\x9a\xaf\x30\xdb\x18\x53\x8a\x59\x2a\x26\x70\xed\x77\x03\x39\x59\xa8\x65\x4b\x9e\x75\xe4\x61\x19\xb9\xc5\x6c\x02\xc1\x6f\x3c\x1b\xaa\x4c\x92\x4b\xd3\x20\x98\x4b\x59\x4c\xc6\xe3\x28\x8a\x3c\x88\x9b\x61\x87\xd7\xb1\xcb\x69\x69\xf7\x2c\x78\xa9\xbb\x7f\x46\x31\x10\x32\xfd\x2a\x8d\x64\x83\x76\xc6\xb2\x6f\x31\xbc\x4f\x90\x17\xf2\xb0\xe5\x2c\xb0\xbb\xa0\x1f\x4f\xae\x0b\x45\x9c\x70\x24\x9f\xcf\x92\x4e\x01\xf6\xf0\xc3\x16\x0b\x02\x42\x15\xb5\x44\x62\x6a\xf2\x92\xbd\x5c\x59\x78\xc6\x27\x10\x0c\x3b\x60\x52\x9a\x68\x22\x7c\x3d\xd9\x46\xc5\x68\x41\x0a\x75\x22\x55\xc0\x90\x64\x16\x29\x46\xdb\x1e\x7d\xe3\xe9\xc7\x2c\x08\xcd\xaf\xf0\x5e\xd9\xe4\xaf\xff\xea\x59\x52\x60\xc2\xf2\xd4\x42\x5c\x92\x3c\x41\x9f\xa9\x29\x2a\xfa\x65\xe8\x04\x42\x55\x62\x0d\x7a\x0b\xb1\x7f\x90\x3b\x04\x51\xda\x72\x9f\x0a\xc8\x99\x04\xfd\x1e\xa0\x33\x9a\x2a\xa2\x91\xaa\xe2\x4d\x57\xc1\x34\xd9\x82\xbe\x70\xea\x8d\x8c\x81\x5a\x70\x51\x0a\xb9\x5d\xb2\x2b\x97\x83\x3a\xa9\xf9\xdc\x4c\xb4\xea\x65\xa8\x8d\xf1\xc2\x2c\x4d\xd7\x45\xe5\x32\x5a\xae\x4e\x40\xd0\xd9\x11\x7b\xcb\x56\xc8\x2f\x89\xc0\xd0\x1f\xa5\x35\x98\xaf\xcf\xd2\x0d\x2d\x8a\x8c\x4a\x05\xfb\xb7\xe1\xef\xe2\x6f\xe3\x59\x0f\xa8\x89\x22\xae\x75\xd9\x3d\xb0\x85\x4d\x37\xa6\x63\x94\xfd\x59\x8c\xf7\x0d\x80\xef\x31\x07\x70\xcb\x43\x2f\xc2\xa6\x2f\xdd\xe9\x29\xba\x31\x4f\xbb\xfb\x04\x6a\xef\x74\x73\xa6\xaf\x5c\x2e\x79\x36\x81\x1d\x93\xed\x2e\x7b\x6d\xf0\x30\xa6\xa0\xbe\xef\xc5\xb0\x6e\xce\xe2\xd8\x5f\xfb\xd7\xa9\xfb\x55\x7e\x83\xee\x50\x89\x3e\x48\xf6\x65\x53\x5f\xe7\xa8\x7a\xdc\x62\xc9\x6d\xcf\xf5\xef\xae\x79\x9f\x31\x81\xa0\x60\xa2\xcb\xd9\x57\xcf\x2d\x4b\xd7\x13\xf8\x97\x8f\xbf\xbe\x8b\x84\xe4\x34\x9f\xd1\xe9\xda\xb8\x9d\x7e\x3c\x73\xfd\xaa\xf1\xce\xa4\xeb\x09\x2e\x4d\xa8\x1e\x5d\xad\x0b\x0c\x54\xa4\x28\x8a\x8c\x26\xfa\x7e\xc5\x58\x15\x20\x7b\x58\xdc\x74\x4f\x77\xa4\xda\xf0\x19\x25\x5a\xf5\x3c\xad\x54\xab\x9e\x43\x4b\xb6\x83\x19\xef\x2f\xe1\xaa\xc7\x6f\x4f\x7b\x4a\xe1\x5d\xc4\x25\x15\xf4\x36\xc3\xcf\x40\xdc\xbe\x5c\x53\xbe\x2f\xc1\xf0\x74\x08\xa7\x43\x5d\x4c\x3e\x51\xe6\x03\x6a\xc6\x2f\x96\xf9\x49\x45\x21\x7c\xc5\xc2\x70\x8f\x12\x36\xbe\x12\xff\xa8\x0b\xc2\x9b\x71\x9b\x1b\x51\x21\x95\xb8\x68\xd5\xc7\xe3\x31\x5c\xce\x31\xb9\xd3\xed\x4f\x13\x88\x40\x03\xb6\x2a\x0a\xfb\x1a\x4e\x4f\x9a\xc8\xc4\x6e\xff\xc0\x44\x06\xfe\x57\x9d\xfa\xe4\xbc\xe4\x9c\xac\x23\x2a\xf4\xa7\x65\x60\x60\x49\xc4\x70\xad\xbf\x7c\xda\xad\x5e\xec\xac\xfe\xac\x62\xa3\xbe\xee\xe6\xdd\x16\x15\x2e\x68\xea\xbc\x27\x54\xa0\x91\x1a\x51\x2c\xe6\xe5\xe2\x16\xb9\x7e\x49\x58\x8d\xb7\x5e\x45\xd7\x0b\xe7\x29\xde\xb7\x08\x99\x41\x2f\x2d\x3d\x35\x81\xd1\x99\xc7\xaf\xdb\xa3\x4f\x53\xb8\x80\x53\x78\xfe\xdc\x52\xbf\xd0\xd0\xbb\xbb\xd7\x52\x9c\x91\xdd\xf6\x14\xd5\xe2\xa7\x3d\x6f\x65\x55\xa2\x01\x34\x15\x7a\x0b\x69\x9e\xd2\x04\x45\xab\x08\x55\xf3\x95\x4e\x55\xd6\x50\x29\xd4\x6a\xc5\xe3\xd7\x2d\xa5\x1e\x2c\x7d\xdf\x30\x12\x8c\xcb\x30\x24\x43\xb8\xd5\x39\xe9\x2d\x8c\x80\x78\xde\xba\xd8\x7a\xcc\x94\x2b\xba\xd7\x6e\xfc\x7f\x8b\x53\x03\x11\x43\x60\xcc\x16\xb6\x57\x67\x3b\xcb\x3d\x07\x5a\xce\x11\xcc\xd5\xb6\xc6\x15\x96\x1f\xe1\x6a\x4e\x85\xee\xb0\xb3\x5c\x25\xc4\x94\x73\x5c\x22\xd7\x3e\x2e\x0a\x0e\xd9\x82\x33\x6f\xd5\xdc\xc1\x6c\xd0\x3e\xb4\x0e\xaf\x2f\x39\xc2\x9a\x95\x26\x43\xdf\xcb\x5a\xc3\x5a\xda\xdb\x3f\x67\x2b\x48\xb7\x77\x40\x6a\xce\x0e\x2d\xa9\xf5\x47\x4f\x25\x6d\xbf\xf4\x16\x36\xff\x89\xbe\xdd\x69\x54\x36\xef\xd8\x9e\xaa\xa6\xa7\xa2\xf9\x8b\x13\x24\x73\xa7\xf4\x29\x29\x12\x4d\xc5\xb7\x0c\xe9\x0b\x32\xa4\x2f\x48\x8d\xfa\xec\xa7\x7a\xfe\xfa\xc4\xc8\x3a\xd1\x68\xca\xf8\x6b\x92\xcc\x43\x1b\x4e\x2e\x3a\x32\x26\x3d\x3d\x84\xb3\xc1\xa0\xfb\x4d\x0f\xb8\x6f\xc0\xda\x17\x9a\xe0\xfb\xbd\x6f\xa0\xa0\xd5\xc1\xd3\x92\xec\xcb\x51\xbe\xa5\x70\x7d\xb4\xfe\x7b\x53\xb8\xd7\x29\x95\x3a\x24\x75\xe6\x6f\x2a\xf0\x29\x80\xbe\xbc\xad\x23\x6d\xf3\x24\x0b\x5f\x9a\x4f\x7d\xb5\x5c\x4a\x87\xe2\x14\xce\xe1\x0c\x1e\x1f\x2d\xd9\xf3\xbe\x74\xe8\x17\x94\x5a\x17\x78\x4f\x85\x54\x26\x54\x1d\x11\xd0\x77\xd5\x5b\xb2\xaa\x69\x88\x8d\x23\xd7\xaf\x37\xc2\x1d\x9f\xde\x3c\x67\xd7\x9a\x85\x4f\x03\x8f\x9b\x17\x92\xdb\xdb\x22\xfa\x7f\x25\x3a\xbb\x86\xd5\x5d\x96\xf6\x35\x9d\xc3\xdb\xe0\xca\x1e\x0e\xeb\x83\x6b\x48\xa5\x90\x4a\x84\x13\xa1\x9b\x1a\xbe\x78\x3d\x67\xab\xb7\xa6\xbd\xaa\x6f\x18\xb6\x00\x0e\xeb\x95\x1f\xd2\xbc\xbe\xea\x81\xd1\xfb\x34\xb1\x4a\xf4\x27\x27\x5f\xa7\xa5\xfd\xba\x17\xca\x6d\x60\xef\x67\xd4\xae\xf8\x84\x56\xff\xfe\x56\xf7\x55\x37\x88\x65\xc1\x9a\xde\xff\xeb\x9e\xf7\xbf\x93\x8c\xa6\xaa\xc4\xd0\xff\x5e\xe3\xaf\xf0\xaa\x3e\xb7\xdb\x04\xac\x3b\xdd\x5e\x8f\xe2\x2c\xf0\xad\xeb\x6c\x31\xff\xb7\x76\x9d\xa5\x7e\x17\xd8\xd9\x78\xde\x3a\x9c\x7a\x03\x1d\x33\xf1\x2f\xea\x9e\xfd\x0a\xab\xd9\x2d\xee\xc1\xb3\xb6\x22\xf5\xad\x93\x6e\xb6\xfb\x9a\xe5\x7f\x75\xeb\xb8\x7c\x52\xe7\x58\xad\xf4\xad\x2e\xfa\xd6\x39\xee\x42\xec\xac\x83\xbe\x75\x8f\xff\x27\x4a\x8f\xea\x1f\x60\x58\x99\x4b\x6c\x5e\xd6\xd0\x77\xa3\x25\x91\xf8\x1f\x4a\xb9\xc8\x55\x8a\x8f\x9e\xb8\x5c\xc3\x41\x0c\x18\x99\x6f\x8f\x8f\xf0\xe0\x39\x7b\xdb\x5b\xaf\x10\x1b\x9c\xc8\x19\x7a\x7c\xec\xbf\x0a\x5b\xdf\x39\x37\x98\xf6\xa7\xc2\xf2\x00\x17\xee\x22\x85\x25\xef\xab\x38\x1c\x06\x74\x34\xdc\x72\xd0\x91\x26\xb4\xef\x1f\xb5\x66\xb7\x9c\xea\x2f\x7d\x97\x8d\x76\xcb\x71\xa7\xeb\x67\xef\x79\x92\x34\x7d\xbd\xc4\x5c\xbe\xa5\x42\x62\x8e\x3c\x3c\x29\x58\xa1\xe5\x3a\x19\x36\x36\xc8\xa1\x62\x2e\x41\xb1\x3c\xc1\xf0\x64\xce\xd8\xdd\xe4\x16\xa7\x8c\xe3\xcf\x28\x24\x67\xeb\x93\x21\x4c\xcb\x5c\x67\x81\xad\xeb\x39\x76\x51\x8e\x0b\xb6\xc4\xcf\x5e\x77\xe3\x34\x33\x3c\x72\x36\xfe\x91\x69\x73\xb4\xf9\xaf\x00\x00\x00\xff\xff\x82\xa6\x22\x04\xfe\x41\x00\x00"), }, "/js/vue.js": &vfsgen۰CompressedFileInfo{ name: "vue.js", @@ -228,10 +228,10 @@ var assets = func() http.FileSystem { }, "/less/custom-dialog.less": &vfsgen۰CompressedFileInfo{ name: "custom-dialog.less", - modTime: time.Date(2019, 5, 28, 9, 38, 36, 556837967, time.UTC), - uncompressedSize: 3089, + modTime: time.Date(2019, 5, 29, 23, 7, 40, 902694229, time.UTC), + uncompressedSize: 3359, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x56\xdb\x8e\xe3\x28\x10\x7d\xcf\x57\x94\x34\xda\xd5\x44\x1a\xb2\x4e\xcf\xaa\x77\x9a\x48\xf3\x30\x5a\xb5\xf6\x37\x88\x29\xdb\xec\x60\xb0\x00\xe7\xd2\xab\xfc\xfb\xca\xc6\x76\x8c\x8d\x73\x99\x74\x3f\x58\x55\x50\x75\xea\xd4\x81\x82\x1a\xad\x1d\xfc\xb7\x02\x00\x20\x84\x0b\x26\x75\xfe\x0f\x32\x8e\xe6\x47\x4e\xe1\xd3\xcb\x5b\xf3\xb7\xeb\xdc\xa9\x96\xda\xfc\x3d\x5a\x43\xe1\xd3\xfb\xfb\xfb\x6e\x75\x59\xad\x36\x69\x6d\x9d\x2e\xbb\x10\x44\x1f\xd0\x48\x76\xee\x22\x73\x61\x2b\xc9\xce\x14\x32\x89\x27\x1f\xad\xf9\x22\x99\xd4\x47\x0a\xa9\x96\x75\xa9\x40\xe9\xa3\x61\x95\xf7\x32\x29\x72\x45\x84\xc3\xd2\x52\x48\x51\x39\x34\xde\xf1\x6f\x6d\x9d\xc8\xce\x24\xd5\xca\xa1\x72\xa1\xb3\x14\x8a\x1c\x05\x77\x05\x85\xe4\x6a\x29\x50\xe4\x85\x1b\x4c\x0d\x32\x9f\xb7\x10\x9c\xa3\xf2\xd6\x4a\x5b\xe1\x84\x56\x14\x32\x71\x42\xee\x8d\x4e\x57\xc3\x36\x89\xd9\x35\x46\x97\x64\x9b\x24\x87\xa3\xb7\xf4\x49\x1a\x53\xe1\x4d\x1f\x44\x28\x8e\xa7\xd6\x96\x6c\xbd\x6d\xcf\xd2\x9f\xb9\xd1\xb5\xe2\x9e\x4c\x0a\x26\xdf\xb3\xcf\xc9\x17\xe8\xfe\x37\xaf\xeb\x0e\x10\xe3\x5c\xa8\x9c\xc2\xd7\x97\xea\xb4\x5b\xb5\xb6\x90\xe3\x8e\xdb\x05\x7e\xef\x73\x1c\x16\xf2\xdb\xd5\x58\xb2\x53\x4f\xe3\x9f\x49\x52\x8d\x02\x46\xe8\xec\x37\x8c\x08\x18\x85\xba\x92\xcd\x6a\xa7\xaf\xf6\x39\x0f\x07\x66\x3e\x93\xbe\xad\x3f\xf2\xf5\xa8\x0a\xad\x1c\xb1\xe2\x03\x29\x6c\x5f\x07\x2e\xe6\x7c\x90\xa2\xd5\xe4\x88\x96\x80\x47\xbf\x77\xec\x9a\x64\x9e\x68\x7b\x1d\x2e\x5e\x42\x1c\x1e\x99\xc9\xa6\x16\xfa\xb1\x63\xe6\x35\x49\x22\xde\xae\x30\x2c\x43\x9f\xc3\x93\x23\xce\x30\x65\x33\x6d\x4a\x0a\x75\x55\xa1\x49\x99\xc5\x09\x2a\x6d\x38\x1a\xb2\xd7\xce\xe9\x92\xc2\xb6\x3a\x81\xd5\x52\xf0\x0e\x9c\x77\x8f\x40\x5d\x16\xc9\xdb\x6b\x7e\x7e\x9c\xba\x41\x70\xb9\x11\x3c\x74\x2d\x8b\x01\x26\x0a\xfa\x96\x4c\xc3\xce\x0f\x70\xff\x5b\x12\xd2\x3d\x1e\x1b\x7c\xc4\x61\x59\x49\xe6\x90\xf8\x53\x60\x69\x0b\xb2\xd3\x1a\x6c\x33\x13\xee\x09\x2e\x9f\x3d\xb3\x28\x85\xc2\x48\xd8\x9c\x55\x33\x49\x46\x98\xed\xf3\x84\xe4\x0e\x51\x3c\x26\x0a\x5b\xf8\x03\x6c\xc5\x14\xbc\xec\x66\x0b\xe7\x4a\x5d\xcf\x17\x79\xd8\x16\x65\xb6\x84\xfa\x12\xe2\xfc\x2e\x54\x55\xbb\x2f\xa1\xad\x11\x1e\x33\xc8\x22\x70\x1f\x42\x31\x88\xe6\xdb\xb4\xb9\x70\xa7\x55\x30\xe8\xf9\x01\x21\x0f\x1b\x9e\xb8\x48\xfa\xdf\xb2\xca\xa6\x04\xdd\x20\x63\x2c\xe4\xaf\x7f\xc5\x6a\x35\xe8\x0b\x3d\xa0\x71\x22\x65\xf2\x76\xaa\x8d\xad\xf3\x1c\x6d\x33\x83\x22\xd9\xae\xe3\x89\xed\xad\x96\xb5\xc3\x79\xbe\xe1\x4c\xee\xa5\x4e\x7f\x3e\xdb\x99\x5f\x21\xf2\xe9\x6e\x3d\xa4\xa0\x91\x46\x92\xcd\xdb\x54\x25\x97\x07\xee\xb2\x4c\x6b\xf7\xcc\x20\x58\x18\x9f\x10\x8e\x50\xa3\x8f\x10\x4e\x4f\x88\x3d\x48\xda\x1d\xa8\x78\xf4\xa2\x6e\x5f\x14\x8b\x74\x85\x8a\x88\xa9\x6e\x28\x22\xb9\x7b\xbe\x22\xdc\xc1\xdd\x91\x04\x8f\x36\xe9\xc6\x7c\x9a\xad\xfd\x9d\x16\xcd\xf5\x1d\x29\x67\x96\xae\x64\x42\x45\xb2\x5d\x62\x41\x33\x9d\xd6\x76\x21\xa8\xae\x5d\x73\xfd\x51\x50\x7a\x7a\x09\x3e\x93\x17\xe2\x23\x96\x33\x5b\x20\xbf\x07\xf9\x46\x01\xdf\xc5\x26\x63\xc4\x56\x42\x29\x34\xfd\x67\xa4\x94\xfe\x79\xf6\x16\xeb\x75\x53\xe0\x75\xd2\x46\x97\xb4\x5d\x6a\xe7\x42\xf8\x50\x9e\x83\xf4\x5f\x97\xd5\xe5\xff\x00\x00\x00\xff\xff\xca\x6f\x42\xc6\x11\x0c\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x6d\x8f\xdb\x36\x0c\xfe\x9e\x5f\x41\xb4\x58\xd1\x03\xaa\xc0\x69\x87\xac\xa7\x00\xfd\x50\x0c\x87\xfd\x0d\xc5\xa2\x6d\xad\xb2\x64\x48\x72\x5e\x6e\xc8\x7f\x1f\x6c\xd9\x8e\x65\xcb\x79\x19\xe6\xbb\x0f\x02\x29\x51\xe4\xc3\x87\xa4\x42\x8d\xd6\x0e\xfe\x59\x01\x00\x10\xc2\x05\x93\x3a\xff\x0b\x19\x47\xf3\x33\xa7\xf0\xf1\xeb\x6b\xf3\xb7\xeb\xd4\xa9\x96\xda\xfc\x39\xda\x43\xe1\xe3\xdb\xdb\xdb\x6e\x75\x59\xad\xd6\x69\x6d\x9d\x2e\x3b\x13\x44\x1f\xd0\x48\x76\xee\x2c\x73\x61\x2b\xc9\xce\x14\x32\x89\x27\x6f\xad\x59\x91\x4c\xea\x23\x85\x54\xcb\xba\x54\xa0\xf4\xd1\xb0\xca\x6b\x99\x14\xb9\x22\xc2\x61\x69\x29\xa4\xa8\x1c\x1a\xaf\xf8\xbb\xb6\x4e\x64\x67\x92\x6a\xe5\x50\xb9\x50\x59\x0a\x45\x8e\x82\xbb\x82\x42\x72\x95\x14\x28\xf2\xc2\x0d\xa2\xc6\x33\x7f\x6f\x21\x38\x47\xe5\xa5\x95\xb6\xc2\x09\xad\x28\x64\xe2\x84\xdc\x0b\x9d\xae\x86\x63\x12\xb3\xab\x8d\xee\x92\x4d\x92\x1c\x8e\x5e\xd2\x5f\xd2\x88\x0a\x2f\x7a\x27\x42\x71\x3c\xb5\xb2\x64\xe3\x65\x7b\x96\xfe\xca\x8d\xae\x15\xf7\x60\x52\x30\xf9\x9e\x7d\x4e\xbe\x40\xf7\xbf\xde\xbe\x74\x0e\x31\xce\x85\xca\x29\x7c\xfb\x5a\x9d\x76\xab\x56\x16\x62\xdc\x61\xbb\x80\xef\x7d\x8c\xc3\x40\x7e\xbb\x0a\x4b\x76\xea\x61\xfc\x3d\x49\xaa\x91\xc1\x08\x9c\xfd\x81\x11\x00\x23\x53\x57\xb0\x59\xed\xf4\x55\x3e\xc7\xe1\xc0\xcc\x67\xd2\xa7\xf5\x67\xfe\x32\x8a\x42\x2b\x47\xac\x78\x47\x0a\x9b\xed\x80\xc5\x1c\x0f\x52\xb4\x9c\x1c\xc1\x12\xe0\xe8\xcf\x8e\x55\x93\x9b\x27\xdc\x7e\x09\x37\x2f\x79\x1c\x96\xcc\xe4\x50\xeb\xfa\xb1\x43\x66\x9b\x24\x11\x6d\x17\x18\x96\xa1\xce\xe1\xc9\x11\x67\x98\xb2\x99\x36\x25\x85\xba\xaa\xd0\xa4\xcc\xe2\xc4\x2b\x6d\x38\x1a\xb2\xd7\xce\xe9\x92\xc2\xa6\x3a\x81\xd5\x52\xf0\xce\x39\xaf\x1e\x39\x75\x59\x04\x6f\xaf\xf9\xf9\x71\xe8\x06\xc2\xe5\x46\xf0\x50\xb5\x4c\x06\x98\x30\xe8\x7b\x32\x35\x3b\x2f\xe0\xfe\x5b\x22\xd2\x3d\x1c\x1b\xff\x88\xc3\xb2\x92\xcc\x21\xf1\x55\x60\x69\xeb\x64\xc7\x35\xd8\x64\x26\x3c\x13\x34\x9f\x3d\xb3\x28\x85\xc2\x88\xd9\x9c\x55\x33\x4a\x36\xdf\x27\x4a\x59\xe6\x66\x4c\x84\x96\x72\x5d\xdb\xfa\xf0\x61\x37\x53\x0e\xa0\xee\xa5\x4e\x7f\xcd\xf5\x63\xec\x36\x53\xe8\x06\xaf\x7c\x8c\x04\x15\xa7\x40\x36\xb7\x37\x59\xc7\x4c\x63\x2c\xdc\x75\x09\xc3\x99\x10\xa5\x87\x6d\x1e\xdc\xff\x74\x3d\x44\x4b\xf3\x65\xbe\xc9\xe7\xc9\xa2\xcc\x96\xd2\x34\x89\xe4\x87\x50\x55\xed\xbe\x84\xb2\xa6\xd2\x98\x41\x16\xcd\xd6\x03\x5e\x0c\x55\xf2\x3d\x96\x92\x5b\xdc\x84\xa1\x80\x1f\xa8\xdc\xe1\xc0\x13\x9d\xb3\xff\x96\xcb\x6a\x0a\xd0\x0d\x30\x7a\xe6\x6d\x63\x61\x8c\xa9\xf9\xed\x8f\x18\x10\x06\x3d\x0a\x07\x34\x4e\xa4\x4c\xde\xf6\x63\x6d\xeb\x3c\x47\xdb\x4c\xe4\x88\x2b\xd7\x61\xcd\xf6\x56\xcb\xda\xe1\xf3\xc5\x74\x3b\x6d\xff\x05\xe5\xa7\x53\xf9\x10\xbd\x46\x04\x4a\xd6\xaf\x53\xec\x2f\x0f\x74\xf6\x4c\xeb\x79\x33\x7a\xa4\xb7\x87\x8f\x09\x08\x1f\x14\x46\x1f\x21\x7c\x4b\x40\xec\x79\xd6\x9e\x40\xc5\xa3\x63\xab\x7d\x5f\x2d\xc2\x15\x32\x22\x46\xc9\x21\x88\xe4\x6e\xf1\x45\xb0\x83\xbb\x03\x1a\x1e\x4d\xd2\x8d\x69\x3d\xdb\xfb\x89\x16\xcd\x30\x8b\x84\x33\xbb\xae\x64\x42\x45\x6e\xbb\xc4\x8c\x66\x3a\xad\xed\x82\x51\x5d\xbb\xa6\x37\x52\x50\x7a\xda\x21\x9f\xb9\x17\xe2\x0f\x0e\xce\x6c\x81\xfc\x9e\xcb\x37\x02\xf8\x21\xd6\x19\x23\xb6\x12\x4a\xa1\xe9\x97\x91\x50\xfa\xc7\xea\x6b\x2c\xd7\x4d\x80\xd7\xe9\x18\xdd\xd2\x66\xa9\x1d\x1a\xe1\xcf\x86\xb9\x93\x7e\x75\x59\x5d\xfe\x0d\x00\x00\xff\xff\x37\x4e\x55\x2c\x1f\x0d\x00\x00"), }, "/less/stylesheet.less": &vfsgen۰CompressedFileInfo{ name: "stylesheet.less", diff --git a/internal/webserver/handler-api.go b/internal/webserver/handler-api.go index 73b614f4..5c724538 100644 --- a/internal/webserver/handler-api.go +++ b/internal/webserver/handler-api.go @@ -136,7 +136,7 @@ func (h *handler) apiGetBookmarks(w http.ResponseWriter, r *http.Request, ps htt Keyword: keyword, Limit: 30, Offset: (page - 1) * 30, - OrderLatest: true, + OrderMethod: database.ByLastAdded, } // Calculate max page @@ -303,3 +303,69 @@ func (h *handler) apiDeleteBookmark(w http.ResponseWriter, r *http.Request, ps h fmt.Fprint(w, 1) } + +// apiUpdateBookmark is handler for PUT /api/bookmarks +func (h *handler) apiUpdateBookmark(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Make sure session still valid + err := h.validateSession(r) + checkError(err) + + // Decode request + request := model.Bookmark{} + err = json.NewDecoder(r.Body).Decode(&request) + checkError(err) + + // Validate input + if request.Title == "" { + panic(fmt.Errorf("Title must not empty")) + } + + // Get existing bookmark from database + filter := database.GetBookmarksOptions{ + IDs: []int{request.ID}, + WithContent: true, + } + + bookmarks, err := h.DB.GetBookmarks(filter) + checkError(err) + if len(bookmarks) == 0 { + panic(fmt.Errorf("no bookmark with matching index")) + } + + // Set new bookmark data + book := bookmarks[0] + book.Title = request.Title + book.Excerpt = request.Excerpt + + // Set new tags + for i := range book.Tags { + book.Tags[i].Deleted = true + } + + for _, newTag := range request.Tags { + for i, oldTag := range book.Tags { + if newTag.Name == oldTag.Name { + newTag.ID = oldTag.ID + book.Tags[i].Deleted = false + break + } + } + + if newTag.ID == 0 { + book.Tags = append(book.Tags, newTag) + } + } + + // Update database + res, err := h.DB.SaveBookmarks(book) + checkError(err) + + // Add thumbnail image to the saved bookmarks again + newBook := res[0] + newBook.ImageURL = request.ImageURL + + // Return new saved result + w.Header().Set("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(&newBook) + checkError(err) +} diff --git a/internal/webserver/server.go b/internal/webserver/server.go index a7172172..a1a10075 100644 --- a/internal/webserver/server.go +++ b/internal/webserver/server.go @@ -41,8 +41,8 @@ func ServeApp(DB database.DB, dataDir string, port int) error { router.GET("/api/tags", hdl.apiGetTags) router.POST("/api/bookmarks", hdl.apiInsertBookmark) router.DELETE("/api/bookmarks", hdl.apiDeleteBookmark) + router.PUT("/api/bookmarks", hdl.apiUpdateBookmark) // router.PUT("/api/cache", hdl.apiUpdateCache) - // router.PUT("/api/bookmarks", hdl.apiUpdateBookmark) // router.PUT("/api/bookmarks/tags", hdl.apiUpdateBookmarkTags) // Route for panic