From e35f67f1e7865c4c749e70db7270bacc7ddc9214 Mon Sep 17 00:00:00 2001
From: Abhisha Nirmalathas <a.nirmalathas1@student.unimelb.edu.au>
Date: Sat, 13 Apr 2019 21:01:38 +1000
Subject: [PATCH] starting cookie functionality
---
1_welcome.html | 3 +--
2_start.html | 2 +-
3_first_turn.html | 2 +-
4_accepted.html | 2 +-
5_discarded.html | 2 +-
hashtable.c | 13 +++++++++++
hashtable.h | 2 ++
hashtable.o | Bin 12232 -> 13112 bytes
http-parser.c | 2 +-
http-parser.o | Bin 7240 -> 7240 bytes
http-response.c | 30 +++++++++++++++++++++----
http-response.h | 7 +++++-
http-response.o | Bin 6928 -> 8376 bytes
http-server.c | 56 +++++++++++++++++++++++++++++++++++++---------
http-server.o | Bin 22176 -> 24272 bytes
image_tagger | Bin 37096 -> 42288 bytes
16 files changed, 99 insertions(+), 22 deletions(-)
diff --git a/1_welcome.html b/1_welcome.html
index a0d9e68..9f5fb94 100644
--- a/1_welcome.html
+++ b/1_welcome.html
@@ -7,7 +7,7 @@
<h2>Image Tagger Game</h2>
-<img src="http://203.101.227.119/image-3.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
+<img src="https://swift.rc.nectar.org.au/v1/AUTH_eab314456b624071ac5aecd721b977f0/comp30023-project/image-3.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
<p>Welcome to the image tagging game. Please enter your name below.</p>
@@ -19,4 +19,3 @@
</body>
</html>
-
diff --git a/2_start.html b/2_start.html
index a36ed6a..d09da4d 100644
--- a/2_start.html
+++ b/2_start.html
@@ -6,7 +6,7 @@
<h2>Image Tagger Game</h2>
-<img src="http://203.101.227.119/image-3.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
+<img src="https://swift.rc.nectar.org.au/v1/AUTH_eab314456b624071ac5aecd721b977f0/comp30023-project/image-3.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
<form method="GET">
<input type="submit" class="button" name="start" value="Start"/>
diff --git a/3_first_turn.html b/3_first_turn.html
index bc6d153..92f3ca0 100644
--- a/3_first_turn.html
+++ b/3_first_turn.html
@@ -6,7 +6,7 @@
<h2>You are ready now!</h2>
-<img src="http://203.101.227.119/image-2.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
+<img src="https://swift.rc.nectar.org.au/v1/AUTH_eab314456b624071ac5aecd721b977f0/comp30023-project/image-2.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
<p>Rule: Try to guess the above image by typing a keyword which describes it:</p>
diff --git a/4_accepted.html b/4_accepted.html
index d061a58..d3bdc8b 100644
--- a/4_accepted.html
+++ b/4_accepted.html
@@ -6,7 +6,7 @@
<h2>Keyword Accepted! Keep trying more.</h2>
-<img src="http://203.101.227.119/image-2.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
+<img src="https://swift.rc.nectar.org.au/v1/AUTH_eab314456b624071ac5aecd721b977f0/comp30023-project/image-2.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
<p>Rule: Try to guess the above image by typing a keyword which describes it:</p>
diff --git a/5_discarded.html b/5_discarded.html
index e6b4b8f..bc5effa 100644
--- a/5_discarded.html
+++ b/5_discarded.html
@@ -6,7 +6,7 @@
<h2>Keyword Discarded. The other player is not ready yet.</h2>
-<img src="http://203.101.227.119/image-2.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
+<img src="https://swift.rc.nectar.org.au/v1/AUTH_eab314456b624071ac5aecd721b977f0/comp30023-project/image-2.jpg" alt="HTML5 Icon" style="width:700px;height:400px;">
<p>Rule: Try to guess the above image by typing a keyword which describes it:</p>
diff --git a/hashtable.c b/hashtable.c
index c4955f3..14c6890 100644
--- a/hashtable.c
+++ b/hashtable.c
@@ -174,3 +174,16 @@ bool hash_table_has(HashTable *table, char *key) {
}
return false;
}
+char* print_hash_map(HashTable *table){
+ char* headers = malloc(100*sizeof(char));
+ for (int i = 0; i < table->size; i++) {
+ if (table->buckets[i].n_elems > 0){
+ for (int j=0; j< table->buckets[i].n_elems; j++){
+ strcat(headers, table->buckets[i].keys[j]);
+ strcat(headers, table->buckets[i].values[j]);
+ strcat(headers, "\r\n");
+ }
+ }
+ }
+ return headers;
+}
\ No newline at end of file
diff --git a/hashtable.h b/hashtable.h
index 9dbea8a..eb041bf 100644
--- a/hashtable.h
+++ b/hashtable.h
@@ -22,3 +22,5 @@ char* hash_table_get(HashTable *table, char *key);
//Checks if the key exists in hash table
bool hash_table_has(HashTable *table, char *key);
+
+char* print_hash_map(HashTable *table);
\ No newline at end of file
diff --git a/hashtable.o b/hashtable.o
index 3d009356e879e27341f185114559a9f4dd7c78e1..181ffc4f2d1b1f243e3a17c0104bfeb5cda7f9f7 100644
GIT binary patch
delta 2033
zcmX>Rzawpe2GbASjam{M^`Rb}Pd%F7D0p<%zSy6_z`*c=fq{X+qto@ran}zZ=1VC?
z1_qCA*B2h$9vt1SA3TyTcywOyU_9W#c){b~17;7#6WtCXtq1t~-ZC&S9C!T!*0ddD
z2wqJd-3;BKU+O)QFL@k%#0)a5Tfn2+^@m62HIL5Y5LXZ|z=5MX^a}w4es~-|`2YX^
z{~n!(c7R;w(RuyTI*-m19^Wr`^alKo23yH^A?-K=FV`^#CWdC$FN_3zYwh}lzhD0U
z|NqUdAHb@+8LVAD@b_Q;_y0f0z>|j=yc8HGdvhFNJTX~-Q-LX*bF&erBx^k{$O()a
zb3hanhcZGKjB~cJGB9w1IE)*Um>3wCCPoN>d7D7WnI>ikgLoip3f01s$-uZdoB^aX
z0WJxO1&|`1EC$A{5J^z9ih{&82k_-HGKF(aKFBY|czg2={`rhn`n#|1X3`X9U}9n3
z4I-Evz-%T*2xY|2z{JAH=EcCo!o<d;B>>^EF>^lgo?I?i%~w#AnO72@kyxA&pPN{)
z`J><@M)r)<#FW&c;>k_IlQ&C<*f286Ob!*5mr-C~U`T*E9qemIK7lqSXI?hu0LIDr
zq6(WQh<Y$fhA=WP2r)1+FmZrf%)kIv$-uynJULN9eDVzm6-ML9iIU<>hK3-D(QtBt
zqy&>OM9dT<Cc$Vlxk_@AII7DSic5-;6H6EvHfu|zve}A2O=n_YV31*8VE6+{Bme*Z
zpNS-{iX?suS$uM<f-$4w<eduTjB=9=6~!g%p}w+%IGKTqfq_AQfq~)d<U~br$&FB1
zA2iu%lP4;QdrpChCPHbLUPh>{3^eh1P<|<thN*ur`J<w^<Y%a850r+<UYM+?Brf>?
zD!Ld-!(<I62P%nAPEh0!+=C`_Y;vQLxFi?UEtk<`t0r$$5|<Q&%DzUET{QWjlDOnE
zsHgx`70k}w$%4xIj0Te(mBkr@CPymk!);lNrt;L}h05ZL%O~$t)@OV=`6ZG{Hc<32
zFu=om_hdsAkeP`p2){a`saZaGqKZCa!sLT0`iu`Ie^ddP%&Dr+xO%dss=lNERJA-a
z#Mv;{woYzT1*zYtDlT~nBE^t~re^u%hpPIF1(OBU#F@AlCu^zcF`7<}R6}^|37Upm
zlNYLq8%jXE%fJFL7iJ|Z)G7RE;?9#_s_Da{(g#iU-DE>`ke58w^`#1+CRC%T;bNRT
zNnLO91vQSzC)71Sp#avxse#bK&5G(6F2>108hZ6*5K#tqs5HpwAWLAGH4Z8c^8+lw
z<)Dd+fiy8NFjPUsVdls{v)Obs@j!^U6vK9?1k8euAe{^h42L&&YWOn>r9inL<H49?
z^Ce9&aFO>)%ZzgaD62CtFszuYscp_QgL86{wjI+PaB(<!f+)-6J=!Wv3pgh~(zfG_
z2id^Dz;I@=rj9vhgfhhA3npjkm@{b$OkSj8$5|){5j2?GC@MVpkB$n{5ADfHx^|ok
zp%V8eXX=_WY3NK|q-)3704<@bC%@D+=ll&Wj~N(D!Fp}<RG19JK&3L+88vz;oCabL
z!y6{A)HCOD(1Gwc7$?8dGvoBog>W}ObnB~dZV-ovOqiUhZ_ec)4dG=mPJX2&2LR%w
Bpn?DZ
delta 1174
zcmdmyb|QX)22+RDMlA^rP6h@q1x5x228PMAIgc><O-|raU}ECf+{7ixx>;19gprAf
zWAa9EF~)_P7YWX1oLntjy_r>HBID$FqLY{y7&hyR*)lRJOwJXTpUkW$v-yO$2lHeH
zX%$Ap$s44_nG7t!l%YA8GKL76Km^SUCO?wiw0Vt83ftreWerB5$&Je8lI%<%w=gi6
zLnsC=1_lNJ1_p+L$$~24lMPfk1YOZ&7EN|k5tnQS`+<QW7)`cya-oX2<R_?T29$=G
z+CO=rin!!OsNQxo*(Z}Ps)$P-go;jw(lEUjCo`&wOG-lByB<w;{bWN`anJ2glaHgx
z{)X}|Lur_q*--WO(Zrc1PgE6`oD7xyjwXA3@<CN`#=6NjRrTTSNrS3|nQT2-QBB_v
zX76G&+1*eRH=>EpnB1tQ&v<R}Mm2p&m|ixhk6|XSnfy}?VXrBg?8V8B>f($uCP%94
zGkQ+$RM(fh2(@b^n#viIFRJS^&Y8@pq0h)T*-%5Av23!Z210!VGejfI-rbWYYJf~$
zsi7|w2{o%7P0eqH$)7az8097_Y9c)U1WnOth`9`((8M_>H)@JYeuD-HKMO<|%zB;4
z8#VPAFHU}_DJ}_%t|&A$GbRga=`%)7cGMDQ`pqyoN=uLN`Q%P5gr8nvXt)U0z^Dz@
zAf>Ix`3P#i=jMmn{*0SFbOpd!GD^>k(?AO1q=d;c^~{-EI3{1xvt#lAXV=LZ`Wj3D
z9Fv3e?Kt^4A<BX#&(t^PoS*>V2~57JZ_bp+H(AKQj%hjn<RAk(rUe?4CmGmrUgw7>
zSvvWqfjQF!jmbiWcAPbW5W$qmk%s0>4}>RAGPGk76#<nElV2EWa7u_k<P#=K8kuvw
q(17qhFiegzGGn@-IeC(i9cP6oL^NUYO(S!z8xjy+2;<}^Jvjg_D8pC)
diff --git a/http-parser.c b/http-parser.c
index ddbe631..b55de39 100644
--- a/http-parser.c
+++ b/http-parser.c
@@ -7,7 +7,7 @@
#include "http-parser.h"
#define MAX_URL_SIZE 60
-#define MAX_HEADER_SIZE 300
+#define MAX_HEADER_SIZE 600
#define MAX_VERSION_SIZE 10
Request* parse_request(char* request_message){
diff --git a/http-parser.o b/http-parser.o
index 988eedd96577d49a833768472065914ea30d7f3d..66aae21511f7e3a278dab384323187d943ac15ab 100644
GIT binary patch
delta 684
zcmX?Mal&GPJLdxy1_qDLy&AtK2FP(*{Qm#nqj|5z?}_CK^(Mdn|L0<0VDRW})%gAY
z|1K5=28MkMAc4-~FF<tbfl@_}?pBbd;~+kRM>AL@%YG0KtmL%~OgAeQ-SSWktZ-8p
z85kI#y0t(yL99lx)uZzeRJliI00)>k*@0118{|f)Ww_M~K-4!dimHLs?+5u0>`)X_
zC0?>HLj65?H=|5FNGXPyy{!(Q(CWPA0Syihn8-1(4|c!<0jsN;4={Q#f`bdIbmt+D
z-qr<w|Nr;syvBoM!-C0-OcG2QzbD^k67vPQ3+$o)|2?`LBs_Yjf_3!vLR@wZt`8E7
z{M#68cuRz!_JMd@{H=HXfi$;5O!R=72%<ppyrq1|s!K%RwoL^o@#qXtc+C$JJMN$W
z@-mpa*_K&?NpMD)Kv8NT10&x|Mg|7vi7Uz`r?Dz1EGZKLsbf^!0v6o><tjnA6RIaK
WW7T2`XWD#;^$9zp<>u|Y6Zrscrx}6(
delta 703
zcmX?Mal&GPJLd!@1_qDLy%m2a2FP)C{Qdvmqj_(~--+c4^(}w@|L0<0VDRW}t@!)@
z|1K5=28MkMAc4-~FF<tbfl@_}?pBbd;~+kRM>AL@%YG0KtmL%~OgAeQ-SSWktZ-8p
z85kI#y0t(yL99lx)uZzeRJliI00)>k*@0118{|f)Ww_M~K-4!dimHLs?+5u0>`)X_
zC0?>HLj65?H=|5FNGXPyy{!{Kq1AcK0~#D2Fp*<mAMAh!0#;WwA7J!g1P2#Z>CQtQ
zy{!lS{r~ULc})$;28a+=8z$dp67vN)73|0V|2?`LBs_Yjf_3!vLL7SzZWJVB`L{9H
z@RkTcodDu-@weUqSqqW}ndkvE5k!IHc}w|_RhNjsZJP>G;?WtP@R}bccHBV$6bfMO
zW?N<nCczg~0!68X42*m;85tOuC;q6KoW`o4@TE!!q>fQ>3s|(F8p2hAa5vOWUdF1$
Uq|Lbb66+IoM)S?vc_;D#0GHS<+5i9m
diff --git a/http-response.c b/http-response.c
index e7d1846..9b3c755 100644
--- a/http-response.c
+++ b/http-response.c
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <stdlib.h>
#include <assert.h>
#include "http-parser.h"
#include "http-response.h"
@@ -18,7 +19,28 @@ Response* redirect(Request* request, char* url_string){
resp->version = request->version;
resp->phrase = "Moved Permanently";
resp->header = new_hash_table(2);
- hash_table_put(resp->header, "Location:", url_string);
+ hash_table_put(resp->header, "Location: ", url_string);
+ resp->body="";
+ return resp;
+}
+
+char* cookie_generator(){
+ char* cookie_value;
+ cookie_value = (char*) malloc(sizeof(char)*60);
+ snprintf(cookie_value, 60, "sessionToken=%d; Expires=Wed, 01 Apr 2019 10:10:10 GMT", rand());
+ return cookie_value;
+}
+
+
+Response* initialise_session(Request* request){
+ Response *resp = malloc(sizeof *resp);
+ assert(resp);
+ resp->status_code=200;
+ resp->version = request->version;
+ resp->phrase = "OK";
+ resp->header = new_hash_table(2);
+ char *cook = cookie_generator();
+ hash_table_put(resp->header, "Set-cookie: ", cook);
resp->body="";
return resp;
}
@@ -34,14 +56,14 @@ char* parse_response(Response* response){
strcat(response_string, " ");
strcat(response_string, response->phrase);
strcat(response_string, "\r\n");
- strcat(response_string, "Location: ");
- strcat(response_string,hash_table_get(response->header, "Location:"));
- strcat(response_string, "\r\n\r\n");
+ strcat(response_string, print_hash_map(response->header));
+ strcat(response_string, "\r\n");
strcat(response_string, response->body);
return response_string;
}
+
void free_response(Response* resp){
free_hash_table(resp->header);
free(resp);
diff --git a/http-response.h b/http-response.h
index 1421696..adbcb3a 100644
--- a/http-response.h
+++ b/http-response.h
@@ -13,4 +13,9 @@ typedef struct Response {
//Creates a new hash table of input size
Response *redirect(Request *req, char* url_string);
-char* parse_response(Response* response);
\ No newline at end of file
+char* parse_response(Response* response);
+
+char* cookie_generator();
+
+
+Response* initialise_session(Request* request);
\ No newline at end of file
diff --git a/http-response.o b/http-response.o
index 5ab883eb71fd341af4e8733938c009aefa145748..55b6aae6b41e473941b9be6f93416a2973bd89f6 100644
GIT binary patch
delta 3346
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
Tz~sGB+MFMtIbUe<M{#)o)6+D@
delta 2010
zcmdntIKga!2Ga%6iCT_~0uyuUH{WCwV4N(<q^9Dr&nG`Qu_QA;&!f{I?YIMnmBKLx
zE(VWo*Bc()4g&ia7#J8PzhiRdJkG$&#mjZffn~BKbNu85%m%^?45}$0>7vw>%%arf
z5{5jc$)POrOzW67m$4);GV)En&Z;2G_lS{!foWodAV?`AUk(F^7a#=Y@lO_Ev&j(v
zv!y^XAQlMUX9ST942*L;nHU%#TBYuQ4f23!l?Ewiniv7$$y9=kO<)iK>0{Idksz!M
zA{apCK+MqHoWRb-IJt#GjcFaz<VI;R#x;`<bL0u}GJd|!z{JAHR>H>7Jpc1<4)4hc
zoKn0F!c6MIOvb_->E0aClUq1HPoB=DHu)Uaq{*q=|0ThWbmS9gV{+zYW4^`6!_L7V
z!@$50GkGu1W=;#J)tr+j@*bDeVqjnpVu1RJfq`KORMvQMA)h#-6`1q@li?szG7YL8
zrVeZu0|P@TNS3h%Otyf@$ske^qz+_$GZVyMn8!DPWEl^E$jKl0)tQV;CmRXaPF^S=
z$Cr^<oDpA=n3R(mpPpJW`K*AMrWiys1IQ3ito->80cucjE(Qh$Rt5$Ji^+z9&WwVS
zO9k~Ag(fc*)UOw2U|@i$o&{CS4OMLj<sXI8=%znF5*I}>M;01fFk6kF>a?KZAag)2
z{`3Do8`zz;lNp7@8Jj?4JtIh#fq?<0SskjG6Dkg(#E~qM1_^)?5d#AQvLjM)h}R;C
zOCXsu8zMgWxUit=atIq7oYF{Y*r09!xs79TuZXxLD5zlG1*cS~%eg1-6%l9To_tkA
zpB1E<VX~p1uqjCOJ7^%7BbfyfFN2EPp^2ZE94IO*3sSKes=^0NMbG3$sEX-OnM5cJ
zvKge4WAa8(VNVciAylRmO2bq<fto!LP5d>KKMhKQ)lcRX6ZZv~_7p0*14@Hs85kH|
zLQMk~La-2FU|?v0io+5VOg-o1LNQ@*Sl)%2bO%a<RZN~M1_^0)s3<HyLS)ZEWd)(8
z%R_01>|Zf)aOi;}lYxQ33|W?efk9xhp*X~DnCX7VDkjH@L-dP5Mbn@(*mMR42EoY_
zq55Gq)FG>wyjNVG6%<wnCVzygn*o*I4W+>*O_r5_*s}`i$IDPz5CzG)ffB-OAd`MF
zOwN+fss}M|gJc;P7<8ct7Hkv)1H)pdxHX!%43zH$rD5tDpq2(e#X;IZOjxOu4B{X~
z<T(b0$;?uMjO>#|rK*{lnKmDi5@Q6F%(tY?xGwNQOw(YREG1*c^bTBJPyWEeGC4;^
z1(~}>MuqbO)MUrWGv(zc|B#X3GGvBmFJhW3C2Pj@gCD}3!7@2Y){Jv8C@dHl82Bg8
zlr`tv1kI5KlOOU3Pktk-!Zbl-vXGn|=Od`Z2CzhqoC?zck;#+f>^LVuV_9|bO*wPU
z?VJ$9O~J}^<W-p7aDr+Vh->9lI6puYR7{>JZ_arGTuU)9cuc-2Z_cRzDsC7U7$A1&
jD5!{LfWni3fnfpEQy}I1lT#J6IXR$VavW^Y8)+T@|0Gd(
diff --git a/http-server.c b/http-server.c
index 9b7244d..1e8b3e9 100644
--- a/http-server.c
+++ b/http-server.c
@@ -33,7 +33,37 @@ static char const * const HTTP_404 = "HTTP/1.1 404 Not Found\r\nContent-Length:
static int const HTTP_404_LENGTH = 45;
-
+bool player_session(char* buff, int sockfd, char* file_name, char* response){
+ // get the size of the file
+ printf("runnning player session functin\n");
+ struct stat st;
+ stat(file_name, &st);
+ int n = sprintf(buff, response, st.st_size);
+ // send the header first
+ printf("sending header\n");
+ if (write(sockfd, buff, n) < 0)
+ {
+ perror("write");
+ return false;
+ }
+ // send the file
+ printf("sending file\n");
+ int filefd = open(file_name, O_RDONLY);
+ do
+ {
+ n = sendfile(sockfd, filefd, NULL, 2048);
+ }
+ while (n > 0);
+ if (n < 0)
+ {
+ perror("sendfile");
+ close(filefd);
+ return false;
+ }
+ printf("about to close");
+ close(filefd);
+ return true;
+}
bool get_request(char* buff, int sockfd, char* file_name){
// get the size of the file
struct stat st;
@@ -165,14 +195,8 @@ static bool handle_http_request(int sockfd, User_list* users)
free(response);
}
}
- // assume the only valid request URI is "/" but it can be modified to accept more files
-
- else if (*req->url == '/')
- if (req->method == GET)
- {
- get_request(buff,sockfd, "1_welcome.html");
- }
- else if (req->method == POST)
+ else if (*req->url == '/' && (strlen(req->url) == 1)){
+ if (req->method == POST)
{
char *name = strchr(req->body, '=')+1;
printf("**%s**\n", name);
@@ -189,9 +213,21 @@ static bool handle_http_request(int sockfd, User_list* users)
free(response);
}
}
+ else if (req->method == GET)
+ {
+ printf("matches a / url but url isize is %zu\n\n", strlen(req->url));
+ Response* resp = initialise_session(req);
+ char* resp_string = parse_response(resp);
+ printf("COOKIE CREATING RESP %s\n", resp_string);
+ // player_session(buff, sockfd, "1_welcome.html", resp_string);
+ free(resp_string);
+ free(resp);
+ get_request(buff,sockfd, "1_welcome.html");
+ }
else
// never used, just for completeness
- fprintf(stderr, "no other methods supported");
+ fprintf(stderr, "no other methods supported");
+ }
// send 404
else if (write(sockfd, HTTP_404, HTTP_404_LENGTH) < 0)
{
diff --git a/http-server.o b/http-server.o
index 093df8e7e2a3ddabcd0698b5ad7665901308b55f..85a765b9a537f150bbd39e98668b57dcc9742cdc 100644
GIT binary patch
delta 10089
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
Lz;JMKW3W5`f3W$;
delta 8167
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
I-WV+p0JYl|ivR!s
diff --git a/image_tagger b/image_tagger
index 0032bce3a0d8b40dcdcd0f00cb256e60db02cc9b..246fb881cbe59963a6c0f1db99e86b9f6a69cf6a 100644
GIT binary patch
delta 18405
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
delta 16085
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
--
GitLab