modif css, retrait section test, ajout config.nim
This commit is contained in:
		
							parent
							
								
									46ca5ca67a
								
							
						
					
					
						commit
						3c0d7eea68
					
				
							
								
								
									
										1
									
								
								build_main.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								build_main.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | nim c -r -d:ssl,release main.nim | ||||||
							
								
								
									
										12
									
								
								code/joplin_json_utils.nim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								code/joplin_json_utils.nim
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | 
 | ||||||
|  | # Data structure for TAGS | ||||||
|  | type Tag = object | ||||||
|  |     id : string | ||||||
|  |     parent_id  : string | ||||||
|  |     title: string | ||||||
|  | 
 | ||||||
|  | type Tags = object | ||||||
|  |     items: seq[Tag] | ||||||
|  |     has_more: string | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @ -6,7 +6,7 @@ import jester | |||||||
| from os import sleep | from os import sleep | ||||||
| import httpcore, net, times, strutils | import httpcore, net, times, strutils | ||||||
| 
 | 
 | ||||||
| 
 | # Setup joplin_ping data | ||||||
| type | type | ||||||
|   joplin_ping* = object |   joplin_ping* = object | ||||||
|     ping_result*: seq[string] |     ping_result*: seq[string] | ||||||
| @ -17,18 +17,22 @@ type | |||||||
| type | type | ||||||
|   joplin_tags* = object |   joplin_tags* = object | ||||||
|     id*, parent_id*, title*: seq[string] |     id*, parent_id*, title*: seq[string] | ||||||
|  |     created_time*, updated_time*, user_created_time*, user_updated_time*, is_shared*: seq[int]  | ||||||
|     req*: Request |     req*: Request | ||||||
| 
 | 
 | ||||||
| # Setup joplin_notebooks data | # Setup joplin_notebooks data | ||||||
| type | type | ||||||
|   joplin_notebooks* = object     |   joplin_notebooks* = object     | ||||||
|     id*, parent_id*, title*: seq[string] |     id*, parent_id*, title*, share_id*, icon*: seq[string] | ||||||
|  |     created_time*, updated_time*, user_created_time*, user_updated_time*, is_shared*: seq[int]  | ||||||
|     req*: Request |     req*: Request | ||||||
| 
 | 
 | ||||||
| # Setup joplin_notes data | # Setup joplin_notes data | ||||||
| type | type | ||||||
|   joplin_notes* = object     |   joplin_notes* = object     | ||||||
|     id*, parent_id*, title*: seq[string] |     id*, parent_id*, title*, body*, author*, source_url*, source*, source_application*, application_data*, share_id*, conflict_original_id*, body_html*, base_url*: seq[string] | ||||||
|  |     created_time*, updated_time*, is_conflict*, is_todo*, todo_due*, todo_completed*, user_created_time*, user_updated_time*, markup_language*, is_shared*: seq[int] | ||||||
|  |     latitude*, longitude*, altitude*, order*:seq[float]  | ||||||
|     req*: Request |     req*: Request | ||||||
| 
 | 
 | ||||||
| let | let | ||||||
| @ -111,6 +115,7 @@ proc get_joplin_notebooks*(token:string): Future[joplin_notebooks] {.async.} = | |||||||
|        |        | ||||||
|       # request joplin API for notebooks |       # request joplin API for notebooks | ||||||
|       url = fmt"http://localhost:41184/folders?page={page}&token={token}" |       url = fmt"http://localhost:41184/folders?page={page}&token={token}" | ||||||
|  |       echo("URL notebooks : ", url) | ||||||
|       var json = await client.getContent(url) |       var json = await client.getContent(url) | ||||||
| 
 | 
 | ||||||
|       # parse jason |       # parse jason | ||||||
| @ -150,8 +155,9 @@ proc get_joplin_notes*(token:string): Future[joplin_notes] {.async.} = | |||||||
|     # make sure to check all pages  |     # make sure to check all pages  | ||||||
|     while has_more == true: |     while has_more == true: | ||||||
|        |        | ||||||
|       # request joplin API for notebooks |       # request joplin API for Notes | ||||||
|       url = fmt"http://localhost:41184/notes?page={page}&token={token}" |       url = fmt"http://localhost:41184/notes?page={page}&token={token}" | ||||||
|  |       echo("URL notes : ", url) | ||||||
|       var json = await client.getContent(url) |       var json = await client.getContent(url) | ||||||
| 
 | 
 | ||||||
|       # parse jason |       # parse jason | ||||||
| @ -194,6 +200,7 @@ proc get_joplin_tags*(token:string): Future[joplin_tags] {.async.} = | |||||||
|        |        | ||||||
|       # request joplin API for notebooks |       # request joplin API for notebooks | ||||||
|       url = fmt"http://localhost:41184/tags?page={page}&token={token}" |       url = fmt"http://localhost:41184/tags?page={page}&token={token}" | ||||||
|  |       echo("URL tags : ", url) | ||||||
|       var json = await client.getContent(url) |       var json = await client.getContent(url) | ||||||
| 
 | 
 | ||||||
|       # parse jason |       # parse jason | ||||||
| @ -217,3 +224,52 @@ proc get_joplin_tags*(token:string): Future[joplin_tags] {.async.} = | |||||||
|   return j_tags |   return j_tags | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | # proc get_joplin_tags_json*(token:string): Future[] {.async.} = | ||||||
|  | 
 | ||||||
|  | #   # url = fmt"http://localhost:41184/notes/{id}?fields=id,parent_id,title,body,created_time,updated_time,is_conflict,latitude,longitude,altitude,author,source_url,is_todo,todo_due,todo_completed,source,source_application,application_data,order,user_created_time,user_updated_time,encryption_cipher_text,encryption_applied,markup_language,is_shared,share_id,conflict_original_id,master_key_id&token={token}" | ||||||
|  | 
 | ||||||
|  | #   # url = fmt"http://localhost:41184/tags/{id}?fields=id,parent_id,title,created_time,updated_time,user_created_time,user_updated_time,is_shared&token={token}" | ||||||
|  | 
 | ||||||
|  | #   # http://localhost:41184/tags?token=e5f6644fbf6a97ddc55648dae72b11caecda6c6642d8ce0d3b20129b89b196385737eb908923542c3343649ebbf865b55bda031ab4c3a16edc7723ef2ad77d8f | ||||||
|  |    | ||||||
|  | #   # Variables | ||||||
|  | #   var j_tags: joplin_tags | ||||||
|  | #   var has_more: bool = true | ||||||
|  | #   var page: int = 1 | ||||||
|  | #   var url: string | ||||||
|  | #   var client = newAsyncHttpClient() | ||||||
|  | #   var pingCheck: joplin_ping | ||||||
|  | #   pingCheck = waitFor ping_joplin(token) | ||||||
|  |    | ||||||
|  | 
 | ||||||
|  | #   # check the joplin status befor query  | ||||||
|  | #   if pingCheck.ping_status: | ||||||
|  | 
 | ||||||
|  | #     # make sure to check all pages  | ||||||
|  | #     while has_more == true: | ||||||
|  |        | ||||||
|  | #       # request joplin API for notebooks | ||||||
|  | #       url = fmt"http://localhost:41184/tags?page={page}&token={token}" | ||||||
|  | #       echo("URL tags : ", url) | ||||||
|  | #       var json = await client.getContent(url) | ||||||
|  | 
 | ||||||
|  | #       # parse jason | ||||||
|  | #       let joplin_tags_Json = parseJson(json) | ||||||
|  | 
 | ||||||
|  | #       # valider qu'il n'y a plus de page  | ||||||
|  | #       if not joplin_tags_Json["has_more"].getBool: | ||||||
|  | #         has_more = false  | ||||||
|  |        | ||||||
|  | #       # store json info into an object | ||||||
|  | #       var count: int = 1 | ||||||
|  | #       for nb in joplin_tags_Json["items"]: | ||||||
|  | #         echo nb["id"].getstr | ||||||
|  | #         echo nb["parent_id"].getstr | ||||||
|  | #         echo nb["title"].getstr | ||||||
|  | #         count += 1 | ||||||
|  |        | ||||||
|  | #       # aller à la page suivante | ||||||
|  | #       page += 1 | ||||||
|  |    | ||||||
|  | 
 | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								config.nims
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								config.nims
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | switch("d","release") | ||||||
|  | switch("d","ssl") | ||||||
|  | # --threads:on  | ||||||
|  | --opt:size  | ||||||
|  | switch("passL","-s") | ||||||
							
								
								
									
										9
									
								
								main.nim
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								main.nim
									
									
									
									
									
								
							| @ -9,7 +9,7 @@ import parsecfg  # Parse CFG (config) files | |||||||
| import strutils  # Basic functions | import strutils  # Basic functions | ||||||
| import times     # Time and date | import times     # Time and date | ||||||
| import uri       # We need to encode urls: encodeUrl() | import uri       # We need to encode urls: encodeUrl() | ||||||
| 
 | import std/json | ||||||
| 
 | 
 | ||||||
| import code/database_utils # Utils used in the database | import code/database_utils # Utils used in the database | ||||||
| import code/password_utils # Our file with password utils | import code/password_utils # Our file with password utils | ||||||
| @ -321,6 +321,13 @@ routes: | |||||||
|     createTFD() |     createTFD() | ||||||
|     resp test_viewtree(c) |     resp test_viewtree(c) | ||||||
| 
 | 
 | ||||||
|  |   get "/test_tags_json": | ||||||
|  |     createTFD() | ||||||
|  |     var tags: JsonNodeObj | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # http://localhost:41184/notes/77ec1bfbaccd4708a9f649f42896f437&token=e5f6644fbf6a97ddc55648dae72b11caecda6c6642d8ce0d3b20129b89b196385737eb908923542c3343649ebbf865b55bda031ab4c3a16edc7723ef2ad77d8f | ||||||
|  | # http://localhost:41184/notes/77ec1bfbaccd4708a9f649f42896f437?fields=id,parent_id,title,body,created_time,updated_time,is_conflict,latitude,longitude,altitude,author,source_url,is_todo,todo_due,todo_completed,source,source_application,application_data,order,user_created_time,user_updated_time,encryption_cipher_text,encryption_applied,markup_language,is_shared,share_id,conflict_original_id,master_key_id&token=e5f6644fbf6a97ddc55648dae72b11caecda6c6642d8ce0d3b20129b89b196385737eb908923542c3343649ebbf865b55bda031ab4c3a16edc7723ef2ad77d8f | ||||||
| 
 | 
 | ||||||
| # #                    ## | # #                    ## | ||||||
| # # END TESTS SECTION  ## | # # END TESTS SECTION  ## | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								nimweb.code-workspace
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								nimweb.code-workspace
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  | 	"folders": [ | ||||||
|  | 		{ | ||||||
|  | 			"path": "." | ||||||
|  | 		} | ||||||
|  | 	], | ||||||
|  | 	"settings": {} | ||||||
|  | } | ||||||
| @ -22,15 +22,18 @@ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| body { | html, body { | ||||||
|   margin: 0; |   margin: 0; | ||||||
|   font-family: Poppins-Regular, sans-serif; |   font-family: Poppins-Regular, sans-serif; | ||||||
|  |   height:100%; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| *, | *, | ||||||
| *::before, | *::before, | ||||||
| *::after { | *::after { | ||||||
|   box-sizing: border-box; |   box-sizing: border-box; | ||||||
|  |   margin: 0; | ||||||
|  |   padding: 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| a { | a { | ||||||
| @ -51,11 +54,11 @@ a { | |||||||
|   --light-gray: rgb(144, 144, 144); |   --light-gray: rgb(144, 144, 144); | ||||||
|   --medium-gray: rgb(96, 96, 96); |   --medium-gray: rgb(96, 96, 96); | ||||||
|   --dark-gray: rgb(13, 13, 13); |   --dark-gray: rgb(13, 13, 13); | ||||||
|   --header-height: 40px; |  | ||||||
|   --animation-duration: 200ms; |   --animation-duration: 200ms; | ||||||
|   --animation-timing-curve: ease-in-out; |   --animation-timing-curve: ease-in-out; | ||||||
|   --blue-joplin-color: #0053b8; |   --blue-joplin-color: #0053b8; | ||||||
|   --light-blue-joplin-color: rgb(237, 241, 243); |   --light-blue-joplin-color: rgb(237, 241, 243); | ||||||
|  |   --header-height: 50px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .header { | .header { | ||||||
| @ -85,6 +88,7 @@ a { | |||||||
|   float: left; |   float: left; | ||||||
|   padding: 10px; |   padding: 10px; | ||||||
|   height: calc(100vh - var(--header-height)); |   height: calc(100vh - var(--header-height)); | ||||||
|  |   /* height: auto; */ | ||||||
|   /* flex: 50%; */ |   /* flex: 50%; */ | ||||||
|   width: 100%; |   width: 100%; | ||||||
| } | } | ||||||
| @ -92,8 +96,8 @@ a { | |||||||
| .column .scrollbar { | .column .scrollbar { | ||||||
|   /* margin-left: 30px; */ |   /* margin-left: 30px; */ | ||||||
|   /* float: left; */ |   /* float: left; */ | ||||||
|   height: 950px; |   /* min-height: 100px; */ | ||||||
|   /* width: 300px; */ |   height: 800px; | ||||||
|   background: #fff; |   background: #fff; | ||||||
|   overflow-y: scroll; |   overflow-y: scroll; | ||||||
|   /* margin-bottom: 25px; */ |   /* margin-bottom: 25px; */ | ||||||
| @ -202,6 +206,7 @@ a { | |||||||
| 
 | 
 | ||||||
| .container { | .container { | ||||||
|   display: flex; |   display: flex; | ||||||
|  |   height: 94%; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .vertical-center { | .vertical-center { | ||||||
| @ -215,7 +220,16 @@ a { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .content { | .content { | ||||||
|   margin: 1rem; |   /* margin: 1rem; */ | ||||||
|  |   width: 1200px; | ||||||
|  |   min-height: 100px; | ||||||
|  |   height: auto; | ||||||
|  |   margin: 80px auto 0px auto; | ||||||
|  |   /* background-color: black; */ | ||||||
|  |   padding: 10px 10px; | ||||||
|  |   display:table; | ||||||
|  |   overflow:hidden; | ||||||
|  |   height:100%; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .sidebar-list { | .sidebar-list { | ||||||
| @ -300,7 +314,7 @@ a { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .sidebar.open .top-sidebar { | .sidebar.open .top-sidebar { | ||||||
|   height: 140px; |   height: 150px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .sidebar .top-sidebar .hidden-sidebar { | .sidebar .top-sidebar .hidden-sidebar { | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								test/oop_example
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								test/oop_example
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -1,33 +0,0 @@ | |||||||
| # type |  | ||||||
| #   Notebook = object |  | ||||||
| #     id: string |  | ||||||
| #     title: string |  | ||||||
| 
 |  | ||||||
| # var notebooks = newSeq[Notebook]() |  | ||||||
| # notebooks.add(Notebook(id:"12345", title: "un notebook titre")) |  | ||||||
| 
 |  | ||||||
| # echo notebooks |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| type |  | ||||||
|     Notebook2 = ref object of RootObj |  | ||||||
|         id: seq[string] |  | ||||||
|         title: seq[string] |  | ||||||
|     Notebooks = ref object of Notebook2 |  | ||||||
|         nb_list: seq[int] |  | ||||||
| 
 |  | ||||||
| var nb: Notebooks |  | ||||||
| 
 |  | ||||||
| # nb.add(Notebook2(id:"123456", title: "mon titre")) |  | ||||||
| 
 |  | ||||||
| # nb.id.add("toto") |  | ||||||
| # nb.title.add("tata") |  | ||||||
| # nb.nb_list.add(0)  |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| echo nb.id |  | ||||||
| echo nb.title |  | ||||||
| echo nb.nb_list |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
										
											Binary file not shown.
										
									
								
							| @ -1,26 +0,0 @@ | |||||||
| type |  | ||||||
|     Node = ref object of RootObj |  | ||||||
|         value: string |  | ||||||
|         active: bool |  | ||||||
| 
 |  | ||||||
| type |  | ||||||
|     NumNode = ref object of Node |  | ||||||
| 
 |  | ||||||
| type |  | ||||||
|     BinOp = ref object of Node |  | ||||||
|         left, op, right: string |  | ||||||
| 
 |  | ||||||
| var numnum = NumNode(value: "3", active: true) |  | ||||||
| 
 |  | ||||||
| echo numnum[] |  | ||||||
| # > (value: "3", active: true) |  | ||||||
| 
 |  | ||||||
| var add = BinOp( |  | ||||||
|     left: "7", |  | ||||||
|     op: "+", |  | ||||||
|     right: "9", |  | ||||||
|     active: true |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| echo add[] |  | ||||||
| # > (left: "7", op: "+", right: "9", value: "", active: true)) |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								test/testJson
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								test/testJson
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -1,84 +0,0 @@ | |||||||
| import std/[asyncdispatch, httpclient] |  | ||||||
| import std/json |  | ||||||
| import std/options |  | ||||||
| import std/strformat |  | ||||||
| import jester |  | ||||||
| 
 |  | ||||||
| # type |  | ||||||
| #   joplin_notebooks* = object |  | ||||||
| #     id: seq[string] |  | ||||||
| #     parent_id: seq[string] |  | ||||||
| #     title: seq[string] |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # proc get_joplin_notebooks*(): Future[joplin_notebooks] {.async.} = |  | ||||||
| #   var j_nb: joplin_notebooks |  | ||||||
| #   var count = 0 |  | ||||||
| #   var client = newAsyncHttpClient() |  | ||||||
| #   var json = await client.getContent("http://localhost:41184/folders?token=e5f6644fbf6a97ddc55648dae72b11caecda6c6642d8ce0d3b20129b89b196385737eb908923542c3343649ebbf865b55bda031ab4c3a16edc7723ef2ad77d8f") |  | ||||||
| 
 |  | ||||||
| #   let joplin_notebooks_Json = parseJson(json) |  | ||||||
|      |  | ||||||
| #   for nb in joplin_notebooks_Json["items"]: |  | ||||||
| #     j_nb.id.add(nb["id"].getstr)  |  | ||||||
| #     j_nb.parent_id.add(nb["parent_id"].getstr) |  | ||||||
| #     j_nb.title.add(nb["title"].getstr)  |  | ||||||
| #     count += 1 |  | ||||||
| 
 |  | ||||||
| #   echo joplin_notebooks_Json["has_more"] |  | ||||||
| 
 |  | ||||||
| #   return j_nb |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # Setup user data |  | ||||||
| type |  | ||||||
|   joplin_notebooks* = object     |  | ||||||
|     id*, parent_id*, title*: seq[string] |  | ||||||
|     req*: Request |  | ||||||
| 
 |  | ||||||
| proc get_joplin_notebooks*(token:string): Future[joplin_notebooks] {.async.} = |  | ||||||
|    |  | ||||||
|   # Variables |  | ||||||
|   var j_nb: joplin_notebooks |  | ||||||
|   var has_more: bool = true |  | ||||||
|   var page: int = 1 |  | ||||||
|   var url: string |  | ||||||
|   var client = newAsyncHttpClient() |  | ||||||
|    |  | ||||||
|   # make sure to check all pages  |  | ||||||
|   while has_more == true: |  | ||||||
|      |  | ||||||
|     # request joplin API for notebooks |  | ||||||
|     url = fmt"http://localhost:41184/folders?page={page}&token={token}" |  | ||||||
|     var json = await client.getContent(url) |  | ||||||
| 
 |  | ||||||
|     # parse jason |  | ||||||
|     let joplin_notebooks_Json = parseJson(json) |  | ||||||
| 
 |  | ||||||
|     # valider qu'il n'y a plus de page  |  | ||||||
|     if not joplin_notebooks_Json["has_more"].getBool: |  | ||||||
|       has_more = false  |  | ||||||
|      |  | ||||||
|     # store json info into an object |  | ||||||
|     var count: int = 1 |  | ||||||
|     for nb in joplin_notebooks_Json["items"]: |  | ||||||
|       j_nb.id.add(nb["id"].getstr) |  | ||||||
|       j_nb.parent_id.add(nb["parent_id"].getstr) |  | ||||||
|       j_nb.title.add(nb["title"].getstr) |  | ||||||
|       count += 1 |  | ||||||
|      |  | ||||||
|     # aller à la page suivante |  | ||||||
|     page += 1     |  | ||||||
| 
 |  | ||||||
|   return j_nb |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # var all_notebooks = ""  |  | ||||||
| var nb: joplin_notebooks |  | ||||||
| nb = waitFor get_joplin_notebooks("e5f6644fbf6a97ddc55648dae72b11caecda6c6642d8ce0d3b20129b89b196385737eb908923542c3343649ebbf865b55bda031ab4c3a16edc7723ef2ad77d8f") |  | ||||||
| # echo nb.title[1] |  | ||||||
| 
 |  | ||||||
| for i in nb.title: |  | ||||||
|   echo i |  | ||||||
| 
 |  | ||||||
| echo nb.title |  | ||||||
| @ -14,6 +14,7 @@ | |||||||
|         </head> |         </head> | ||||||
|         <body> |         <body> | ||||||
|             <h1>TEST Home Page</h1> |             <h1>TEST Home Page</h1> | ||||||
|  |             <a href="/" class="newJoplinHomePage"><h3>The newJoplin Homepage</h3></a> | ||||||
|             <a href="/test_pingjoplin" class="test_ping"><h3>Test ping Joplin</h3></a> |             <a href="/test_pingjoplin" class="test_ping"><h3>Test ping Joplin</h3></a> | ||||||
|             <a href="/test_notebooks" class="test_notebooks"><h3>Test joplin Notebooks</h3></a> |             <a href="/test_notebooks" class="test_notebooks"><h3>Test joplin Notebooks</h3></a> | ||||||
|             <a href="/test_notes" class="test_notes"><h3>Test Joplin Notes</h3></a> |             <a href="/test_notes" class="test_notes"><h3>Test Joplin Notes</h3></a> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user