diff --git a/internal/view/js/component/bookmark.js b/internal/view/js/component/bookmark.js index bfce771..a1086b8 100644 --- a/internal/view/js/component/bookmark.js +++ b/internal/view/js/component/bookmark.js @@ -75,7 +75,7 @@ export default { this.$emit("delete", this.eventItem); }, updateBookmark() { - this.$emit("update", this.id, this.index); + this.$emit("update", this.eventItem); } } } \ No newline at end of file diff --git a/internal/view/js/page/home.js b/internal/view/js/page/home.js index 449c23e..5104424 100644 --- a/internal/view/js/page/home.js +++ b/internal/view/js/page/home.js @@ -24,7 +24,8 @@ var template = ` :listMode="displayOptions.listMode" @tagClicked="filterTag" @delete="showDialogDelete" - @edit="showDialogEdit"> + @edit="showDialogEdit" + @update="showDialogUpdateArchive">
Page
@@ -287,70 +288,6 @@ export default { } }); }, - showDialogDelete(items) { - // Check and filter items - if (typeof items !== "object") return; - if (!Array.isArray(items)) items = [items]; - - items = items.filter(item => { - var id = (typeof item.id === "number") ? item.id : 0, - index = (typeof item.index === "number") ? item.index : -1; - - return id > 0 && index > -1; - }); - - if (items.length === 0) return; - - // Split ids and indices - var ids = items.map(item => item.id), - indices = items.map(item => item.index).sort((a, b) => b - a); - - // Create title and content - var title = "Delete Bookmarks", - content = "Delete the selected bookmarks ? This action is irreversible."; - - if (items.length === 1) { - title = "Delete Bookmark"; - content = "Are you sure ? This action is irreversible."; - } - - // Show dialog - this.showDialog({ - title: title, - content: content, - mainText: "Yes", - secondText: "No", - mainClick: () => { - this.dialog.loading = true; - fetch("/api/bookmarks", { - method: "delete", - body: JSON.stringify(ids), - headers: { - "Content-Type": "application/json", - }, - }) - .then(response => { - if (!response.ok) throw response; - return response; - }) - .then(() => { - this.dialog.loading = false; - this.dialog.visible = false; - indices.forEach(index => this.bookmarks.splice(index, 1)) - - if (this.bookmarks.length < 20) { - this.loadData(false); - } - }) - .catch(err => { - this.dialog.loading = false; - err.text().then(msg => { - this.showErrorDialog(`${msg} (${err.status})`); - }) - }); - } - }); - }, showDialogEdit(item) { // Check the item if (typeof item !== "object") return; @@ -434,6 +371,122 @@ export default { } }); }, + showDialogDelete(items) { + // Check and filter items + if (typeof items !== "object") return; + if (!Array.isArray(items)) items = [items]; + + items = items.filter(item => { + var id = (typeof item.id === "number") ? item.id : 0, + index = (typeof item.index === "number") ? item.index : -1; + + return id > 0 && index > -1; + }); + + if (items.length === 0) return; + + // Split ids and indices + var ids = items.map(item => item.id), + indices = items.map(item => item.index).sort((a, b) => b - a); + + // Create title and content + var title = "Delete Bookmarks", + content = "Delete the selected bookmarks ? This action is irreversible."; + + if (items.length === 1) { + title = "Delete Bookmark"; + content = "Are you sure ? This action is irreversible."; + } + + // Show dialog + this.showDialog({ + title: title, + content: content, + mainText: "Yes", + secondText: "No", + mainClick: () => { + this.dialog.loading = true; + fetch("/api/bookmarks", { + method: "delete", + body: JSON.stringify(ids), + headers: { + "Content-Type": "application/json", + }, + }) + .then(response => { + if (!response.ok) throw response; + return response; + }) + .then(() => { + this.dialog.loading = false; + this.dialog.visible = false; + indices.forEach(index => this.bookmarks.splice(index, 1)) + + if (this.bookmarks.length < 20) { + this.loadData(false); + } + }) + .catch(err => { + this.dialog.loading = false; + err.text().then(msg => { + this.showErrorDialog(`${msg} (${err.status})`); + }) + }); + } + }); + }, + showDialogUpdateArchive(items) { + // Check and filter items + if (typeof items !== "object") return; + if (!Array.isArray(items)) items = [items]; + + items = items.filter(item => { + var id = (typeof item.id === "number") ? item.id : 0, + index = (typeof item.index === "number") ? item.index : -1; + + return id > 0 && index > -1; + }); + + if (items.length === 0) return; + + // Show dialog + var ids = items.map(item => item.id); + + this.showDialog({ + title: 'Update Archive', + content: 'Update archive for selected bookmarks ? This action is irreversible.', + mainText: 'Yes', + secondText: 'No', + mainClick: () => { + this.dialog.loading = true; + fetch("/api/archive", { + method: "put", + body: JSON.stringify(ids), + 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; + json.forEach(book => { + var item = items.find(el => el.id === book.id); + this.bookmarks.splice(item.index, 1, book); + }); + }) + .catch(err => { + this.dialog.loading = false; + err.text().then(msg => { + this.showErrorDialog(`${msg} (${err.status})`); + }) + }); + } + }); + } }, mounted() { var stateWatcher = (e) => { diff --git a/internal/webserver/assets-prod.go b/internal/webserver/assets-prod.go index 366fcd9..0600d38 100644 --- a/internal/webserver/assets-prod.go +++ b/internal/webserver/assets-prod.go @@ -171,10 +171,10 @@ var assets = func() http.FileSystem { }, "/js/component/bookmark.js": &vfsgen۰CompressedFileInfo{ name: "bookmark.js", - modTime: time.Date(2019, 5, 29, 23, 1, 15, 229377636, time.UTC), - uncompressedSize: 2214, + modTime: time.Date(2019, 5, 30, 6, 57, 16, 777962324, time.UTC), + uncompressedSize: 2209, - 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"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\x4d\x6f\xdb\x38\x10\xbd\xfb\x57\xcc\x12\x39\xd8\x80\x3f\xf6\xac\x58\xc6\x6e\xda\x1e\x02\xa4\x3d\x24\xc8\xa9\x28\x6a\x5a\x1c\x5b\x84\x29\x52\xa0\x48\x27\x81\xa0\xff\x5e\x90\x12\x6d\xc9\x52\x5c\xf1\x60\x53\xf3\xf1\xde\xe3\x70\x38\x27\xaa\xc1\x60\x96\x0b\x6a\x10\x62\xd8\x4e\xd6\x8c\x9f\x20\x11\xb4\x28\x62\xb2\x53\xea\x98\x51\x7d\x24\x10\x35\x96\x52\xf0\xc2\x44\xe0\x7e\xbf\x2b\x86\x15\xd9\x4c\x00\x00\xd6\xf4\x3a\x65\x21\xb8\x74\x79\xa9\xc6\x7d\x4c\xac\x16\x04\x0c\xd5\x07\x34\x31\xf9\xbd\x13\x54\x1e\x9b\x4c\x9f\x5d\xe4\x54\x06\x00\x93\xda\x6c\x27\x29\x17\x04\x4e\x0b\xbe\x8f\x09\xcf\xe8\x01\x5f\x9f\x9f\x08\x44\x85\xf9\x10\xd8\x0a\x79\x71\xdf\xce\xb5\x59\xaf\x1c\x46\x0b\x32\x3f\xe3\x71\x23\x90\x6c\xca\xd2\x6f\xaa\x6a\xbd\xca\x87\xc2\xf0\x3d\x41\x9d\x9b\x40\xfa\xcf\x99\x75\x53\x96\x8d\xef\xd3\x5c\xce\x5c\x5a\x91\xaa\xb7\x98\xb8\xdf\x47\xe6\xb2\x38\x6b\x25\xac\x57\xb4\xd9\x0c\x94\x77\x61\xe8\xa1\x08\xcc\x6e\xbf\x14\x28\x0f\x26\x85\x0d\xfc\xdb\x2e\x13\x85\xd3\x62\xaf\xb4\x8f\x01\x2e\xa1\x4e\xfb\x2f\x11\x3c\x39\x7a\xe3\x17\xb7\x43\x36\x35\xf4\xb0\x94\x34\xc3\x99\x3f\x77\xf3\xe1\xd4\x04\x11\x2b\xc6\x4f\x7d\x3d\x45\x4e\x13\xd4\xae\x98\x83\xee\xb3\xdc\x0c\xa5\xed\xea\x6a\x22\xfc\x35\x8f\xba\x72\xb7\xca\x32\x55\x85\x71\xd2\x5e\x9f\x9f\xaa\xea\x82\x17\x64\x36\xe0\xfe\xe2\x62\xf2\x8d\x71\x03\x97\x8e\x0c\xc7\x46\xc6\xcd\x43\xb0\x76\x09\xd6\x3c\x08\xdb\xd3\x02\xf6\x74\x91\xa3\x4c\xb8\x58\x50\x61\xdc\x21\xf9\xe6\x6f\x94\x5f\x51\xa0\xc1\x01\x52\xe6\x1d\x63\x69\x8d\xa6\x45\x3a\x9e\xf5\x35\x67\xee\x31\x26\x34\x49\xf1\x42\x69\xbd\x75\x2c\x65\x22\x94\x65\x0b\xa6\xde\xa4\x50\x94\xdd\xe2\x6e\x2e\xbb\xfe\xdb\xde\x4f\x26\xf8\x9e\x2b\x6d\x80\xe1\x9e\x5a\x61\xa0\xf4\x51\x61\x44\x44\xe7\xdd\xdc\xdb\x73\xad\xf2\x22\x6a\x82\xdc\xe2\x2c\x82\x1f\x36\xdb\xa1\x9e\x9f\x6d\x56\x8b\x08\x5e\x8c\xe6\xf2\x70\x31\xfa\xc3\xf6\xcd\xcd\x5b\xeb\x3b\xc2\x83\xec\x7b\xea\x27\x17\xc1\x83\x52\x02\xa9\xbc\x38\xc2\x94\x1a\x70\x71\xc9\xf0\xbd\xaf\xd4\xbd\xa8\xf6\x69\xbc\xed\x23\xc7\x08\xfe\xd7\x9a\x7e\xcc\x3b\x8e\x50\xa1\xe9\xec\x2a\xc3\x2d\x8d\xc6\x6a\x09\x3f\x7f\x75\x3c\x97\x26\xaf\x77\x55\x8d\xc8\xa8\xa1\x1d\x94\x26\xbb\xac\xee\xdb\x61\x89\xca\x72\x6b\x90\xb5\x15\xb6\x9e\x50\x4f\x87\x9b\xed\x56\x0b\x88\x41\xe2\x1b\xb8\x08\x93\xf2\x62\x69\xb5\x98\xdd\x4f\x06\xc4\x5a\x2d\x96\x01\xef\x12\x50\xb5\xca\x73\x3d\x78\x7b\x94\x41\x78\xaf\x1e\x3b\x9a\x1c\x0f\x5a\x59\xc9\x1e\xdd\x45\x46\xb0\xb5\x5a\x4c\xc9\x5d\xe9\x25\x85\xcb\xad\xc8\x6c\xfb\x59\xc1\x5a\x3d\x72\x42\x69\x1e\x0d\x66\xe3\xe9\x5d\x5b\xd6\x4c\x6c\xde\x77\xd6\xcd\x50\xfb\xdd\x7e\x3e\xe6\xd2\x32\x34\xa9\x62\x9d\x76\x69\x8d\x60\x3f\x7e\xaf\x3b\xc9\x11\xdc\x61\xc6\xcd\xb4\x35\xad\xc9\x1c\x7c\xf0\x60\xc5\xdb\xd3\xad\x77\xda\x36\x9e\x0b\x24\xf3\xda\x74\xae\xcf\x30\x66\x77\x78\xdd\x44\xad\x43\x47\xe2\x76\x27\xd4\x4d\xdc\x3a\xf4\x26\x6e\x5d\xea\x49\xf5\x27\x00\x00\xff\xff\xb1\x58\x88\xa3\xa1\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, 30, 1, 38, 49, 478966287, time.UTC), - uncompressedSize: 16894, + modTime: time.Date(2019, 5, 30, 6, 57, 3, 344629573, time.UTC), + uncompressedSize: 19069, - 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"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x5d\x73\xdb\x38\x92\xef\xf9\x15\x3d\x4c\x2a\xa6\x36\x12\x65\xcf\xa3\xc6\xf4\x4c\x92\xc9\x4e\xe5\x2e\x9b\xc9\xc5\xce\x5d\x6d\x79\xb2\x65\x98\x6c\x49\x18\x53\x04\x17\x00\x25\xab\x1c\xfd\xf7\x2b\x7c\x90\x02\x45\x90\x92\x9d\x99\x5c\xdd\xae\xf9\x10\x53\x40\x77\xa3\xbb\xd1\xe8\x0f\x00\xcc\x92\x70\x90\xb8\x28\x32\x22\x11\x62\xb8\x7a\x72\x9a\xd2\x25\xd0\x34\x0e\x0a\x32\xc3\xd1\x9c\x2d\x30\x38\x7b\x02\x00\xa0\x3b\x92\x8c\x08\x51\xf5\x21\x49\x91\xdb\x5e\x0d\x41\xf3\xa2\x94\x20\xd7\x05\xc6\x81\xc4\x5b\x19\x40\x91\x91\x04\xe7\x2c\x4b\x91\xc7\xc1\x39\x12\x9e\xcc\xa1\xe4\xd9\x10\x6e\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\x33\x5c\x62\x2e\x23\x49\xf8\x0c\x65\x24\x30\xc3\x44\x86\x83\x00\x7e\xba\xc1\x75\x59\x44\x98\x4b\x35\x80\xc1\x7a\xc5\xd8\xcd\x82\xf0\x1b\x11\x8c\x1d\xde\x08\x48\x2a\x33\x8c\x83\x8f\x38\xe5\x28\xe6\x20\x24\xe3\x64\x86\x01\xfc\x94\x64\x34\xb9\x89\x03\x8e\x19\x23\xe9\xcf\x44\x12\x47\x26\x23\x57\x25\xf7\x94\x08\x98\x92\xd1\x74\xa5\xfe\x15\xeb\x3c\x19\x91\x4c\x06\x30\xb1\xdd\x0a\x9f\xe6\x33\x78\xfe\x1c\x8e\x14\x40\x41\xf3\xa3\xe0\xec\x74\x4c\x1d\x3e\xc6\xc4\xc7\xd4\xcb\x34\x85\x1c\x57\x70\x6d\x79\xdf\x72\x25\xe6\x6c\xf5\x33\x25\x19\x9b\xbd\x4c\xd3\xc3\x18\x2b\xb2\x52\x8c\x12\xca\x93\x0c\x0f\x1b\xfd\x15\x91\xc9\x1c\x30\xa5\xf2\xc0\x01\x30\x4f\x68\xa6\x65\x3f\x88\xfe\xf9\x9c\xad\xcc\x34\x1f\x44\xde\x40\xfa\x09\x9f\x8e\x53\xba\x74\x0c\x52\x59\x6a\xa5\x34\x31\x9a\x71\x9a\x06\xc0\x71\xea\x34\xfe\xa2\xdb\xaa\x29\xba\xcb\xa8\x90\x13\x48\xa9\x28\x32\xb2\xfe\xb5\x90\x94\xe5\x22\x52\x8d\x7f\x63\x29\x6e\x5c\x6b\xae\x28\x8c\xa8\xc4\x05\x2c\x47\x53\xc6\xe3\x20\x54\xad\x43\xa0\x79\x8a\xb7\x03\xa0\x79\x3d\x63\x22\x80\x86\x6c\xcb\xd1\x35\xcd\x2d\x73\x3b\x5d\x13\x8d\x1d\x07\xfa\x4f\xd0\xec\xba\xc1\xb5\xc1\x89\x14\xd7\xcd\x3e\x65\x0a\x6f\xd3\x38\xd8\x61\xde\x34\xef\xd0\xa9\x24\x6a\x41\x57\x1d\x4d\xf8\x9f\x24\x99\xbd\x56\x06\x87\x69\x1c\x4c\x69\x26\x91\x5f\x90\xd9\x0e\x4c\x8a\x19\x4a\x74\x4d\xf2\x67\xdd\xb2\x03\xa6\xec\xc8\x05\x7a\xa3\xec\xaa\x09\x52\x16\x29\x69\x52\xfa\xa4\x5b\x5e\xf2\x64\x4e\x97\xe8\xce\xc2\xb8\x31\x0d\x4e\x47\xd3\x1d\xd1\x9c\x28\xf9\x46\xd7\xec\x56\xf9\x12\x3a\x8d\x83\x05\xb9\xfd\x40\x66\x08\x67\x70\xbc\x6b\x77\xc5\x99\xea\x39\x1d\x17\xbb\xf6\xd8\x72\x60\x8d\xfe\xea\x69\x78\xb5\x93\x0e\xa0\xc9\x92\x64\x25\x1a\x5f\xd9\x01\xb2\xcf\xbb\xf9\x91\x1a\x2e\x2f\x99\x93\x7c\x86\x4a\x9a\xb0\x49\x45\x8f\xde\x45\x63\x92\x52\x41\xae\x33\x35\xd9\x6a\xb6\xb4\x3d\xb4\x54\x74\x77\x67\x35\xb8\xd9\xb4\x35\xe5\x68\x5f\x14\x24\x51\x71\xc0\x59\x9a\x35\x58\x1d\x5a\xcc\x94\x7c\xd7\x31\x1a\x18\x77\x61\x80\x0a\x33\x69\xdf\x07\x95\xfb\xf8\x85\x81\x64\x30\xa5\x5c\x48\x28\x1a\x2e\xdb\x91\xfe\x64\xe0\xa1\x09\xdd\x4e\x86\xe4\xb3\x0c\x47\x29\x2b\xaf\x33\x1c\x65\x38\xdd\x75\x65\x35\xba\xeb\xd2\xba\x78\x3d\xd9\xe1\xb5\xe0\xb8\xa4\xac\x14\xdd\xec\xea\x08\x7a\x10\xcf\xbb\x2c\x7f\x1d\xaf\xa7\x60\x27\x75\x87\xe3\x1c\x6f\x7b\x94\xab\x3a\x5e\x3c\x88\x5b\x4e\x67\xf3\x3f\x82\x5d\x18\xb5\x94\x9c\x91\x3e\x7b\xb0\x78\x5f\x63\x15\xf7\xe2\xfd\x74\x5c\xd9\xba\xeb\xbc\xb6\xc1\xca\x79\x2d\xaa\xa1\x71\x51\xc8\xf5\x68\x81\x42\x68\x29\xec\x1a\x71\xb2\x08\xe5\xac\xdf\x8a\x37\x0a\x2c\x38\x7b\xcf\x40\x90\x25\xa6\xdb\x90\x03\x6b\x94\x30\x09\xeb\xd5\xe9\xae\x4a\x4b\x65\xc4\x96\xc8\x33\xb2\xae\xa8\xdb\xe6\xe0\xac\x2b\xa9\x29\x68\x5e\xfd\xcd\xcd\xaa\xa6\xee\xca\x3e\x4d\x4a\x21\xd9\x62\x94\x6a\xaf\x5d\x47\x39\xf3\x53\x25\x5c\x06\xf6\xea\xc9\x13\xba\x28\x18\x97\x35\xb3\x6f\x55\x10\x9d\x72\xb6\x80\x20\x8a\xc6\x09\x5b\x14\x2c\xc7\x5c\xd6\xee\x3d\xfa\x5d\x04\x3f\x54\x48\x66\x10\x13\x19\x7c\x48\x66\xb8\x06\xca\x35\x11\x7a\xe2\x2b\xf0\xb1\x6a\x30\x10\x4f\xf0\x56\x83\xa4\x38\x25\x65\x26\xe1\x4e\x4b\x52\x4d\xd7\xa4\x7e\x1b\xea\xf6\x05\xbd\xa5\xb9\x98\xc0\x65\x45\xf1\xb3\x69\xaf\x47\x17\x13\x4b\x41\x3d\xae\x78\xc3\xba\xd5\xe5\x5f\x37\x6e\x4c\x5f\x4a\x24\x09\x07\x0e\x3a\x47\x59\xf2\xdc\x69\x50\x8f\x9d\xa3\x09\x4c\x49\x26\x70\xd8\xe8\xab\x1c\xa8\xb7\xd3\xe4\xbf\x13\x08\x82\x66\xbb\x5a\x24\x13\x38\x6e\x36\xda\x05\xd2\x6a\xaf\xad\x6b\x02\x97\x9f\x9b\x5d\x2a\x31\x6b\xb6\x6e\x5c\xe9\x94\x86\x4a\x89\xa9\xab\x1f\xc7\x82\x1b\x82\x3b\xc2\xcb\x39\x15\x51\x3d\x6a\x94\x61\x3e\x93\x73\x38\x8d\xe1\xf8\x07\xff\x38\x0b\x94\x73\x96\x36\xa6\x61\x9b\xbb\xb7\x46\xa1\x53\x08\xf5\x10\x56\xad\x03\x3b\xee\x0f\x4d\xd1\x14\x84\x76\x39\x31\x9c\x78\xba\x8c\x6a\x21\x86\x20\xf0\xf4\xd6\x83\x4b\x5e\xe2\x10\xd4\xbf\x03\x87\xf9\xad\xbe\x6a\x40\xb5\x92\xcf\xa5\x32\x3a\x98\xa2\x4c\xe6\x17\x64\x26\x0e\xe7\xbc\x01\x36\x1e\xc3\x39\x6e\xad\x9b\xf0\x99\x68\x5a\x45\x35\x14\xc4\x10\xaa\xdc\x86\x4d\xdd\xb6\x38\x06\x95\x70\x66\x48\xf2\x60\x00\x3f\x3a\x5d\x13\x2d\x48\x53\xdc\x9a\x59\x87\x98\xd3\xb6\x4b\x6c\xdb\x65\x0d\xb6\xcd\xfb\x07\xc2\x05\x5a\xd3\x85\x7f\x96\xc8\xd7\xcd\x3c\x9a\x70\xe0\xb7\x17\x64\xf6\x12\x62\x18\x5f\x1e\x05\x9f\x9f\x86\x97\xff\x38\x0a\x3e\xbf\x18\xa8\x1f\xe3\xd9\x50\x11\x09\x9e\x4a\x32\x83\x15\x95\x73\xd0\xe9\x48\xd0\x72\xd8\x9a\xc6\x2b\x45\x23\xfc\xc7\x97\xdf\xc4\x8b\xc1\xd3\xf0\xb7\xf3\x17\x03\x8b\xaf\xd0\x47\x0a\x9d\x95\x72\xa4\x29\xb4\x08\x54\x15\x6b\xec\x1a\xc4\xb0\x05\x26\x8d\x6e\x76\x97\x8e\x61\xe1\x23\x8a\x32\x93\x6d\x1d\xfc\x55\xa9\x49\xa1\xc2\x4b\x93\xe7\x34\x00\x56\x73\x9a\x21\x84\x15\x3a\xc4\x56\x21\x11\xde\x62\x12\x5a\xbe\x06\xbb\xd6\x53\x31\x13\x15\xa5\x98\xd7\xc8\x97\x27\x9f\x07\xcd\x19\xdd\xb4\xb8\x79\x9d\x21\xe1\x15\x37\xca\x9b\xda\x21\x9e\xf8\xd5\x61\xdf\x22\x8e\x3a\x2f\x0e\x0d\x73\x43\x08\x82\x41\x9f\xa4\xaf\x0e\x91\xf1\xd5\x83\x64\xfc\xfe\x3e\x32\xbe\x6a\xc8\x38\x04\x39\xc7\x1c\x24\xa7\x0f\x12\xfb\x95\x16\x5b\x6f\x62\x84\x83\xba\x6b\xfc\x9b\x78\xa1\x0c\x2d\x00\x9f\x4a\x3e\x70\x2c\x08\x47\xf8\xf4\xf1\x1d\x4c\x19\x87\x97\x1f\xde\xb6\x56\x40\xc9\x33\x88\xf5\x0e\xc1\xa7\x8f\xef\xc2\x60\x4c\x0a\x3a\xde\x56\x9e\x43\x48\x59\x52\x2e\x54\xf6\xff\xe9\xe3\xbb\x1d\xd9\x4b\x9e\x6d\xbd\x97\xa5\x60\x76\x62\x3e\x10\x4e\x16\x22\x6c\xab\xd4\x8a\x36\xa9\x95\xe2\x55\xfa\xc4\xa8\xfe\x77\x46\xf3\x30\x18\x06\x83\x36\x94\x89\x3b\xb5\x6b\x6d\x4e\x49\xa7\x71\xa8\x20\x69\xe6\xc4\xa7\x09\x71\x43\x8b\xbf\x3a\x4e\xe8\x0d\xe7\x8c\x87\x81\x6a\x36\xde\x46\xa5\x4e\x7a\x07\x61\x77\x00\xd7\x95\xaa\x55\xec\xf7\x6d\x61\xc9\xb3\x41\x4b\x92\x48\x59\x45\xc8\x51\x14\x2c\x17\x08\xf1\x99\xc7\x10\xc1\xba\xec\xef\x2a\xb0\x88\xdd\x0c\x40\xce\x39\x5b\x41\xd5\xf4\x83\x17\xcb\x06\xc2\x1a\xef\x77\xc1\xf2\x70\xd0\x86\xdd\x74\x31\xa6\x10\xba\x99\xaa\x02\x04\x91\xc4\xdb\xef\xc6\x3e\x45\x49\xbf\xfb\x39\xd5\xa0\x55\x4a\x6e\xa1\xed\xcf\x1e\x84\x6d\xc2\x6a\x51\xea\x86\x9d\x29\x72\x39\x26\x4b\x04\xa1\xe3\x10\xc9\x53\x30\x99\xbd\x5e\x23\x74\x0a\x39\x62\x8a\x69\xe7\x0c\xd4\x21\xcc\xe7\x2f\xaa\x47\x19\xd3\x9c\x0a\xc9\xf8\x1a\xe2\x1e\x38\xf5\x90\x44\xd2\x25\x9a\x74\xc9\xd9\x18\x6d\x5b\xbc\xfb\x54\xd9\x58\x6f\xb8\x70\x9f\xbe\xe5\xe2\x3e\x9b\x0e\xad\xc1\xd6\x59\xfc\x57\x89\x9c\xa2\x09\x44\xfe\x89\x01\x37\xc1\xa8\xca\xd8\x81\x83\x6b\x7c\xea\x95\xea\x8a\x9f\xdd\xd5\x60\x9b\x2b\x8f\x61\xb6\x08\x5a\x87\xf3\x9d\xca\x07\x02\x0f\x55\xd3\x5f\xd1\x35\xbf\x34\xe5\x7d\x82\xa9\x0c\xec\xa9\x56\x7e\x2f\x13\xce\x80\x36\x9f\x3c\x83\xe3\x3e\x6b\x00\xe3\x29\xe1\x45\x0c\x57\x3f\x3e\xbb\x73\xf0\x8d\x7f\x7b\x1e\x0c\x36\x57\xdd\x82\x6f\xba\x19\x5f\xd1\x3c\x65\xab\xc8\x9a\x9a\x96\x5f\xdb\x66\x68\x5b\x86\x0d\x8b\x52\x4c\x74\x28\xb8\x63\x0c\x37\xa8\x0a\x25\x3c\xc7\x7f\x96\x28\x64\xcf\xfa\xe8\xcc\x38\xdd\xc7\x3a\x25\xe3\x14\x4d\xc4\xa9\xdc\xaa\x97\x3b\xc0\x4c\x60\x0f\xbd\x1d\xf7\x6b\xb3\xc1\x6e\x68\xe5\x36\x1b\xce\xbe\x4b\x2b\xad\x96\x7f\x31\xf7\xad\x15\x67\xd3\x4a\x05\xd9\xe3\x68\xf7\xaa\xd7\xc7\x42\x42\xd4\x0c\x23\xe7\x7b\x58\x68\x11\xef\x54\xa1\xa2\xa5\x96\x7e\x63\xfa\xfa\x6c\x0d\x39\x8f\x24\xde\xca\x70\x60\x14\xb2\x10\xb3\x6e\x66\x1a\x4c\x89\x39\x5b\xe9\x14\xc0\x14\xdb\xe1\xd5\xb3\xbb\x85\x98\x6d\x20\x7c\x76\xa7\x88\xaa\x00\x52\x8a\xcd\xa0\xcf\x69\x79\x74\x02\x1d\x86\xe5\xad\xe9\x76\x4e\x9d\x5a\x05\xe8\xbe\xd2\x72\x5b\xb9\x7a\xc9\xef\x6c\xc3\xed\x52\xb7\x84\x0b\x55\x45\xbd\xcd\xa5\x86\x19\xc2\xc9\xf1\x00\xbe\x7c\x71\x2b\x68\xb0\x73\x63\x5c\x7d\xdc\x88\xe4\x83\x06\x8f\x6e\x4f\x13\x5f\xaf\xf0\x9a\xc8\x69\xac\x02\x46\x8f\x74\x1a\xdc\xed\x37\x79\x45\x5b\x03\xcf\x38\x4e\x9d\x2c\xe1\x17\x4e\xd3\x48\x24\x9c\x65\xd9\x05\x2b\x20\xde\x15\xe3\x10\xad\xd5\x67\x18\xa1\x24\xb3\xf7\x64\xd1\xd2\x9b\xa9\x2b\xcf\x55\xa9\xa7\x8a\x42\x93\xa1\xb7\xa6\x3c\xc7\xd5\x05\x99\xe9\x6a\x44\x83\x46\x12\x85\xdc\x92\xfc\x11\xae\x82\xa7\xcf\xee\xec\xef\x4d\x70\x05\x13\xb8\x72\x1a\xae\x76\xa4\xd5\xfe\xc5\x09\x79\x11\xcd\x93\xac\x4c\x51\x84\x66\x20\x7f\x81\xe3\x04\x54\x15\x9e\xe0\xd9\x9d\x81\xf6\x05\xa4\x4e\xdd\x40\xc3\xa4\x5d\xf3\x75\x0f\x18\xfd\xc6\xbb\x05\xf1\x14\x0b\x7a\x4f\x76\x02\xc1\x7b\x5c\x41\xb5\x08\x3c\x99\x51\xc2\x72\x89\xb9\x9c\x40\xf0\x9a\xa3\xce\xea\x9a\x07\x9e\x6d\x8c\x29\xc5\x2c\x15\x13\xb8\xf4\xbb\x81\x9c\x2c\xd4\xb0\x25\xcf\x3a\xf2\xb0\x8c\x5c\x63\x36\x81\xe0\x13\xcf\x86\x2a\x93\xe4\xd2\x6c\x10\xcc\xa5\x2c\x26\xe3\x71\x14\x45\x1e\xc4\xcd\xb0\xc3\xeb\xd8\xe1\xb4\xb4\x7b\x06\x7c\xad\x77\xff\x8c\x62\x20\x64\xfa\xe0\x8d\x64\x83\x76\xc6\xb2\x6f\x30\xbc\x4d\x90\x17\xf2\xb0\xe1\x2c\xb0\x3b\xa0\x1f\x4f\xae\x0b\x45\x9c\x70\x24\xf7\x67\x49\xa7\x00\x7b\xf8\x61\x8b\x05\x01\xa1\x8a\x5a\x22\x31\x35\x79\xc9\x5e\xae\x2c\x3c\xe3\x13\x08\x86\x1d\x30\x29\x4d\x34\x11\xbe\x9e\x6c\xa3\x62\xb4\x20\x85\x5a\x91\x2a\x60\x48\x32\x8b\x14\xa3\x6d\x8f\xbe\xf1\xec\xc7\x2c\x08\xcd\x2f\xf0\x56\xd9\xe4\xaf\xff\xe9\x19\x52\x60\xc2\xf2\xd4\x42\xbc\x26\x79\x82\x3e\x53\x53\x54\xf4\xd1\xe9\x04\x42\x55\x62\x0d\x7a\x0b\xb1\xbf\x91\x1b\x04\x51\xda\x72\x9f\x0a\xc8\x99\x04\x7d\x0e\xd0\x19\x4d\x15\xd1\x48\x55\xf1\x66\x57\xc1\x6c\xb2\x05\x7d\xe1\xd4\x1b\x19\x03\x35\xe0\xa2\x14\x72\x3b\x64\x57\x2e\x07\x75\x52\x73\xdf\x4c\xb4\xda\xcb\x50\x13\xe3\x85\x59\x9a\x5d\x17\x95\xcb\x68\xb9\x3a\x01\x41\x67\x47\xec\x1d\x5b\x21\x7f\x4d\x04\x86\xfe\x28\xad\xc1\x7c\xfb\x2c\xdd\xd0\xa2\xc8\xa8\x54\xb0\x7f\x19\xfe\x26\xfe\x32\x9e\xf5\x80\x9a\x28\xe2\x5a\x97\x9d\x03\x5b\xd8\x74\x63\x3a\x46\xd9\x9f\xc5\x78\x4f\x00\x7c\x8f\x59\x80\x5b\x1e\x7a\x11\x36\x7d\xe9\x4e\x4f\xd1\x8d\x79\xda\xbd\x4f\xa0\xe6\x4e\x6f\xce\xf4\x95\xcb\x25\xcf\x26\xb0\x63\xb2\xdd\x65\xaf\x0d\x1e\xc6\x14\xd4\xfb\x5e\x0c\xeb\xe6\x2c\x8e\xfd\xb5\x7f\x9c\x7a\xbf\xca\x6f\xd0\x1d\x2a\xd1\x0b\xc9\x1e\x36\xf5\xed\x1c\x55\x8f\x5b\x2c\xb9\xdb\x73\xfd\xb3\x6b\xce\x33\x26\x10\x14\x4c\x74\x39\xfb\xea\xb9\x66\xe9\x7a\x02\xff\x71\xfe\xeb\xfb\x48\x48\x4e\xf3\x19\x9d\xae\x8d\xdb\xe9\xc7\x33\x97\xb5\x1a\x67\x26\x5d\x4f\xf0\xda\x84\xea\xd1\xc5\xba\xc0\x40\x45\x8a\xa2\xc8\x68\xa2\xef\x57\x8c\x55\x01\xb2\x87\xc5\x4d\x77\x77\x47\xaa\x0d\xf7\x28\xd1\xaa\xe7\x61\xa5\x5a\xf5\x1c\x5a\xb2\x1d\xcc\x78\x7f\x09\x57\x3d\x7e\x7b\xda\x53\x0a\xef\x22\x2e\xa9\xa0\xd7\x19\xde\x03\x71\x7b\xb8\xa6\x7c\x5f\x82\xe1\xf1\x10\x8e\x87\xba\x98\x7c\xa0\xcc\x07\xd4\x8c\x5f\x2d\xf3\x83\x8a\x42\xf8\x03\x0b\xc3\x3d\x4a\xd8\xf8\x4a\xfc\x27\x5d\x10\xde\x8c\xfb\x4d\x4a\x65\x48\x25\x2e\x76\xa3\xf9\x78\x0c\xaf\xe7\x98\xdc\x80\x9c\x23\x28\x80\x56\x19\x61\xcf\xde\xf4\xdd\x34\x1d\x8d\xd8\xf5\xef\x98\xc8\xa0\xe3\x90\x50\xf9\x6e\x9a\x3a\x87\x76\x0a\x31\x52\x2d\x0a\x37\x2f\x17\xd7\xc8\xf5\x89\x5d\xd5\xde\x3a\x17\xd6\x03\xe7\x29\xde\xb6\x88\x98\x46\x2f\x1d\xdd\x35\x81\xd1\x89\xa7\x10\xa2\x29\x9c\xc2\x89\x2a\x53\x0d\xd8\x29\x1c\x77\x9f\x70\xfe\x82\x52\xeb\x02\x6f\xa9\x90\xca\x84\x2a\x9b\x06\x7d\xd1\xa9\x25\xab\xea\x86\xd8\x38\x4a\x5d\x1b\x87\x3b\x3e\xb3\xb9\x30\x2e\x35\x0b\x9f\x07\x1e\x2f\x2a\x24\xb7\x47\x0d\xfa\x5a\x5e\x67\xca\x59\x1d\x84\xb4\xcf\x78\x0e\xaf\xa1\x94\x3d\x1c\x56\x44\x69\x48\xa5\x90\x4a\x84\x23\xa1\x23\xa2\x2f\x8d\x9d\xb3\xd5\x3b\x93\x9b\xeb\xe3\xe9\x07\x16\x5a\x87\x54\x3e\x17\x3d\x30\x7a\x9e\x26\x56\x89\x0a\xee\xfe\xc5\xd7\x61\xf5\xd0\x9b\x5e\x28\xb7\xfa\xd9\xcf\xa8\x1d\xf1\x01\x75\xe2\xfe\x3a\xe9\xa2\x1b\xc4\xb2\x60\x4d\xef\xdf\xba\x60\xfa\x6f\x92\xd1\x94\x48\x04\x7d\x37\xb3\xbf\x48\x72\x33\xc8\xba\x4c\xf2\x7a\x14\x67\x80\xc7\x92\xc5\x62\xfe\x7f\x2d\x59\xa4\xde\x48\xea\xac\x5a\xb6\x0e\xa7\x9e\x40\xc7\x4c\xfc\x83\xba\x6b\xbf\xc2\x6a\x96\x1a\x3d\x78\xd6\x56\xa4\x3e\xb2\x78\x58\xa5\xf5\xad\xeb\x8e\xf2\x41\x65\x87\x1a\xe9\xb1\xec\x78\x2c\x3b\xba\x10\x5b\x65\x87\x4e\xb2\x86\x70\xf2\x58\x7a\xfc\xdf\x97\x1e\xe6\xd3\x0d\x5d\x7c\xb4\x8e\xe6\xea\xea\x83\xe4\xa9\x3d\x49\xd1\xf9\xbc\xe8\xab\x42\x44\x47\x19\xb2\x8b\xf2\xdd\x4b\xce\xc9\x3a\xa2\x42\xff\xb5\x0c\x0c\x2c\x89\x18\x2e\xf5\xcb\xe7\xdd\x7a\xc1\xf6\xea\xbf\x55\x8c\xd3\xb5\x8f\x77\x5a\xfe\x98\x6a\x07\xfe\xc8\x8a\x07\xb6\xcb\x9f\xa6\x70\x06\xc7\xf0\xfc\xb9\xa5\x7e\xa6\xa1\x77\x67\xaf\x5d\x2f\x69\xd9\xed\x75\x06\x35\x78\x4f\xb9\x74\xae\x12\x06\xa0\xa9\xd0\x53\x48\xf3\x94\x26\x28\x3c\x05\xe1\x56\xa7\x2a\xfa\x57\x0a\xb5\x5a\xf1\xf8\x76\x4b\xa9\x07\x4b\x7f\x18\x15\x09\xc6\x65\x18\x92\x21\x5c\xeb\xec\xee\x1a\x46\x40\x3c\x17\xbe\xec\x51\x90\x89\xce\xfa\x9a\x8f\x89\x01\x2d\x4e\xab\xf8\x1d\x18\xb3\x85\xed\x37\x7e\x9d\x45\x92\x03\xad\xea\x24\xf3\x55\x4d\xe3\xf6\xfc\x8f\x70\x31\xa7\x42\x5f\xee\x61\x39\x50\x01\x94\x73\x5c\x22\xd7\x7e\x2e\x0a\x0e\x99\x82\x13\xef\x81\x5d\x07\xb3\x41\x7b\xd1\x3a\xbc\xbe\xe4\x08\x6b\x56\x9a\xc3\x81\xbd\xac\x35\xac\xa5\x3d\xfd\x73\xb6\x82\x74\x7b\xfd\xbc\xe6\xec\xd0\x4a\xb4\xa3\x40\xab\xeb\x4f\xfb\xd2\x5b\x22\xfc\x1d\x7d\xb3\xd3\xa8\x11\xde\xb3\x3d\xf5\x41\x4f\x6d\xf0\x8d\x73\x24\xf3\xf1\xdb\x43\xd2\x24\x9a\x8a\xc7\x2c\xe9\x2b\xb2\xa4\xaf\x48\x8f\xfa\xec\xa7\x7a\xbe\x7d\x72\x64\x9d\x68\x34\x65\xfc\x0d\x49\xe6\xa1\x0d\x27\x67\x7b\xb2\xa6\xc1\xa0\xfb\x92\x19\xb8\x97\xef\xda\xdf\x52\xc0\xf7\x7b\x2f\xbf\x41\xeb\xf2\x80\x96\x64\x5f\x8e\xf2\x98\xc2\xf5\xd1\xfa\x73\x53\xb8\xc6\x37\xb3\x8f\x99\xdc\xbf\x68\x26\xd7\x11\xca\x0f\xc9\xdf\x1e\xba\x0f\x7d\x64\x2c\x0b\xac\x69\x1d\xf5\x24\x02\x15\x28\x31\xa0\xfa\x03\x86\x7b\xa7\x5a\x9e\x01\xb6\x79\xc4\xd1\xdf\x51\x78\x00\xdc\x3c\xe2\xe8\x3d\xeb\x20\xf1\x27\xe7\x11\x56\xea\x3f\x7d\xa7\xe5\x31\x85\x78\xdc\x68\xf1\x3f\xfa\x73\x8a\x2a\x91\x30\x87\x5e\x87\x04\x39\xed\x3d\xb4\xb7\xa8\x1d\x71\x9e\x86\x98\x29\x6c\xcc\x2a\xff\x6a\xff\x1f\x8a\x3d\x41\x0e\xba\xf7\x7b\x6a\x3f\xaa\x37\x7d\xf4\x7e\xe1\xbe\x80\xf9\xb8\x29\xf4\x8d\x32\x0a\xfd\x56\x7d\x51\xcb\xca\x5c\x62\xf3\xf6\xa7\xfe\xd8\x4a\x12\x89\xff\xa3\x74\x8b\x5c\x85\x4e\xf4\xf8\xd1\x1a\x0e\x62\xc0\xc8\xbc\x7d\xf9\x02\x77\x1e\x37\xb1\xfd\x8c\x06\x62\x83\x13\x39\x4d\x5f\xbe\xf4\x7f\x5b\x53\x7f\xc4\x66\x30\xed\x4f\x85\xe5\x01\x2e\xdc\x41\x0a\x4b\xde\x77\x0a\xed\x30\xa0\xb3\x9e\x2d\x07\x1d\x31\xb9\x7d\xa1\xb9\xd5\xbb\xe5\x54\xbf\xf4\xdd\x5e\xde\x4d\xb2\x9d\x5a\xde\x7e\x38\x42\xd2\xf4\xcd\x12\x73\xf9\x8e\x0a\x89\x39\xf2\xf0\xa8\x60\x85\x96\xeb\x68\xd8\x98\x20\x87\x8a\xb9\x55\xcd\xf2\x04\xc3\xa3\x39\x63\x37\x93\x6b\x9c\x32\x8e\x3f\xa3\x90\x9c\xad\x8f\x86\x30\x2d\x73\x1d\x8a\x5b\xf7\x7d\xed\xa0\x1c\x17\x6c\x89\xf7\x1e\x77\xe3\x94\x28\x1e\x39\x1b\x5f\x46\x6f\x9e\x6c\xfe\x37\x00\x00\xff\xff\x98\x34\x3d\x30\x7d\x4a\x00\x00"), }, "/js/vue.js": &vfsgen۰CompressedFileInfo{ name: "vue.js", diff --git a/internal/webserver/handler-api.go b/internal/webserver/handler-api.go index 5c72453..f371700 100644 --- a/internal/webserver/handler-api.go +++ b/internal/webserver/handler-api.go @@ -11,6 +11,7 @@ import ( fp "path/filepath" "strconv" "strings" + "sync" "time" "github.com/go-shiori/go-readability" @@ -263,11 +264,11 @@ func (h *handler) apiInsertBookmark(w http.ResponseWriter, r *http.Request, ps h book = results[0] // Save article image to local disk - imgPath := fp.Join(h.DataDir, "thumb", fmt.Sprintf("%d", book.ID)) + strID := strconv.Itoa(book.ID) + imgPath := fp.Join(h.DataDir, "thumb", strID) for _, imageURL := range imageURLs { err = downloadBookImage(imageURL, imgPath, time.Minute) if err == nil { - strID := strconv.Itoa(book.ID) book.ImageURL = path.Join("/", "thumb", strID) break } @@ -329,7 +330,7 @@ func (h *handler) apiUpdateBookmark(w http.ResponseWriter, r *http.Request, ps h bookmarks, err := h.DB.GetBookmarks(filter) checkError(err) if len(bookmarks) == 0 { - panic(fmt.Errorf("no bookmark with matching index")) + panic(fmt.Errorf("no bookmark with matching ids")) } // Set new bookmark data @@ -369,3 +370,133 @@ func (h *handler) apiUpdateBookmark(w http.ResponseWriter, r *http.Request, ps h err = json.NewEncoder(w).Encode(&newBook) checkError(err) } + +// apiUpdateArchive is handler for PUT /api/archive +func (h *handler) apiUpdateArchive(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Make sure session still valid + err := h.validateSession(r) + checkError(err) + + // Decode request + ids := []int{} + err = json.NewDecoder(r.Body).Decode(&ids) + checkError(err) + + // Get existing bookmark from database + filter := database.GetBookmarksOptions{ + IDs: ids, + } + + bookmarks, err := h.DB.GetBookmarks(filter) + checkError(err) + if len(bookmarks) == 0 { + panic(fmt.Errorf("no bookmark with matching ids")) + } + + // For web interface, let's limit to max 20 IDs to update. + // This is done to prevent the REST request from client took too long to finish. + if len(bookmarks) > 20 { + panic(fmt.Errorf("max 20 bookmarks to update")) + } + + // Fetch data from internet + mx := sync.RWMutex{} + wg := sync.WaitGroup{} + chDone := make(chan struct{}) + chProblem := make(chan int, 10) + semaphore := make(chan struct{}, 10) + + for i, book := range bookmarks { + wg.Add(1) + + go func(i int, book model.Bookmark) { + // Make sure to finish the WG + defer wg.Done() + + // Register goroutine to semaphore + semaphore <- struct{}{} + defer func() { + <-semaphore + }() + + // Download article + resp, err := httpClient.Get(book.URL) + if err != nil { + chProblem <- book.ID + return + } + defer resp.Body.Close() + + article, err := readability.FromReader(resp.Body, book.URL) + if err != nil { + chProblem <- book.ID + return + } + + book.Author = article.Byline + book.Content = article.TextContent + book.HTML = article.Content + book.HasContent = book.Content != "" + + if article.Title != "" { + book.Title = article.Title + } + + if article.Excerpt != "" { + book.Excerpt = article.Excerpt + } + + // Get image for thumbnail and save it to local disk + var imageURLs []string + if article.Image != "" { + imageURLs = append(imageURLs, article.Image) + } + + if article.Favicon != "" { + imageURLs = append(imageURLs, article.Favicon) + } + + // Save article image to local disk + strID := strconv.Itoa(book.ID) + imgPath := fp.Join(h.DataDir, "thumb", strID) + for _, imageURL := range imageURLs { + err = downloadBookImage(imageURL, imgPath, time.Minute) + if err == nil { + book.ImageURL = path.Join("/", "thumb", strID) + break + } + } + + // Update list of bookmarks + mx.Lock() + bookmarks[i] = book + mx.Unlock() + }(i, book) + } + + // Receive all problematic bookmarks + idWithProblems := []int{} + go func() { + for { + select { + case <-chDone: + return + case id := <-chProblem: + idWithProblems = append(idWithProblems, id) + } + } + }() + + // Wait until all download finished + wg.Wait() + close(chDone) + + // Update database + _, err = h.DB.SaveBookmarks(bookmarks...) + checkError(err) + + // Return new saved result + w.Header().Set("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(&bookmarks) + checkError(err) +} diff --git a/internal/webserver/server.go b/internal/webserver/server.go index a1a1007..911777c 100644 --- a/internal/webserver/server.go +++ b/internal/webserver/server.go @@ -42,7 +42,7 @@ func ServeApp(DB database.DB, dataDir string, port int) error { 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/archive", hdl.apiUpdateArchive) // router.PUT("/api/bookmarks/tags", hdl.apiUpdateBookmarkTags) // Route for panic