diff --git a/encheres/server/controller/HtmlResponseBuilder.js b/encheres/server/controller/HtmlResponseBuilder.js
deleted file mode 100644
index 4a2b925d9f96850e7e20b74db93624ece5f560ab..0000000000000000000000000000000000000000
--- a/encheres/server/controller/HtmlResponseBuilder.js
+++ /dev/null
@@ -1,19 +0,0 @@
-
-export default class HtmlResponseBuilder {
-
-    request;
-    response;
-    url;
-    
-    constructor(request, response) {
-        this.request =request,
-        this.response =response;
-    }
-
-    endResponse() {
-        this.response.write(`<footer>${Date()}</footer>`);
-        this.response.write(`</body> </html>`);
-        this.response.end();
-    }
-     
-} 
\ No newline at end of file
diff --git a/encheres/server/controller/RequestController.js b/encheres/server/controller/RequestController.js
deleted file mode 100644
index 6b323d2d64e004709b7e44510119fb7c79aa1de4..0000000000000000000000000000000000000000
--- a/encheres/server/controller/RequestController.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { URL } from 'url';
-import ResponseBuilder from './ResponseBuilder.js'
-
-export default class RequestController {
-
-  #request;
-  #response;
-  #url;
-
-  constructor(request, response) {
-    this.#request = request,
-    this.#response = response;
-    this.#url = new URL(request.url, `http://${request.headers.host}`);
-  }
-
-  get response() {
-    return this.#response;
-  }
-
-  handleRequest() {
-    this.buildResponse();
-  }
-
-  buildResponse()  {
-    new ResponseBuilder(this.#request, this.#response).handleResponse();
-  }
-
-}
\ No newline at end of file
diff --git a/encheres/server/controller/ResponseBuilder.js b/encheres/server/controller/ResponseBuilder.js
deleted file mode 100644
index 15207edbb151fe5fb7a3848e309a02884e695554..0000000000000000000000000000000000000000
--- a/encheres/server/controller/ResponseBuilder.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import defaultBuilder from './defaultBuilder.js';
-import aboutBuilder from './aboutBuilder.js';
-import auctioneerBuilder from './auctioneerBuilder.js'
-import { URL } from 'url';
-
-export default class ResponseBuilder {
-    request;
-    response;
-    url;
-    
-    constructor(request, response) {
-        this.request =request,
-        this.response =response; 
-        this.url = new URL(request.url, `http://${request.headers.host}`);      }
-
-      handleResponse() {
-        this.prepareResponse();
-        this.buildResponse();
-      }
-      
-      prepareResponse() {
-        this.response.statusCode = 200;
-        this.response.setHeader( 'Content-Type' , 'text/html');
-      } 
-
-      buildResponse()  {    
-        
-        // routage "à la main"
-        if (this.url.pathname.startsWith('/about')){
-          const about = new aboutBuilder(this.request, this.response);
-          about.bresponse();
-          about.endResponse();
-        }
-        else if(this.url.pathname.startsWith('/auctioneer')) {
-          const auctioneer = new auctioneerBuilder(this.request, this.response);
-          auctioneer.bresponse();
-          auctioneer.endResponse();
-        }
-        else if (this.url.pathname.startsWith('/')){
-          const def = new defaultBuilder(this.request, this.response);
-          def.bresponse();
-          def.endResponse();
-        }
-        else {
-          new ErrorResponseBuilder(this.request, this.response, 404).handleError(); 
-        }
-      }      
-    
-}
\ No newline at end of file
diff --git a/encheres/server/controller/aboutBuilder.js b/encheres/server/controller/aboutBuilder.js
deleted file mode 100644
index aa9f2120599bad152517b2b98b0a1c2050b5a68f..0000000000000000000000000000000000000000
--- a/encheres/server/controller/aboutBuilder.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import HtmlResponseBuilder from "./HtmlResponseBuilder.js";
-
-export default class aboutBuilder extends HtmlResponseBuilder{
-    
-    constructor(request, response){
-        super(request, response);
-    } 
-
-    bresponse() {
-        this.response.write(`<html>
-                                <head>
-                                    <meta charset="UTF-8">
-                                    <title>Welcome to second node server</title>
-                                    <h1>Node server</h1>
-                                </head>
-                                
-                                <body>
-                                    <p>Welcome to second trivial server</p>
-                                </body>`);
-    } 
-
-} 
\ No newline at end of file
diff --git a/encheres/server/controller/auctioneerBuilder.js b/encheres/server/controller/auctioneerBuilder.js
deleted file mode 100644
index 3bf760e8f7d581a2a7f152416f4bd766b10d966c..0000000000000000000000000000000000000000
--- a/encheres/server/controller/auctioneerBuilder.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import HtmlResponseBuilder from "./HtmlResponseBuilder.js";
-
-export default class auctioneerBuilder extends HtmlResponseBuilder{
-    
-    constructor(request, response){
-        super(request, response);
-    } 
-
-    bresponse() {
-        this.response.write(`<html>
-                                <head>
-                                    <meta charset="UTF-8">
-                                    <title>Welcome to second node server</title>
-                                    <h1>Node server</h1>
-                                </head>
-                                
-                                <body>
-                                    <p>Welcome to second trivial server</p>
-                                </body>`);
-    } 
-
-} 
\ No newline at end of file
diff --git a/encheres/server/controller/defaultBuilder.js b/encheres/server/controller/defaultBuilder.js
deleted file mode 100644
index b92cf8c3dd225384ffd84b75a0a698388730ac09..0000000000000000000000000000000000000000
--- a/encheres/server/controller/defaultBuilder.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import HtmlResponseBuilder from "./HtmlResponseBuilder.js";
-
-
-export default class defaultBuilder extends HtmlResponseBuilder{
-    
-    constructor(request, response){
-        super(request, response);
-    }
-
-    bresponse() {
-        this.response.write(`<html>
-                                <head>
-                                    <meta charset="UTF-8">
-                                    <title>Welcome to first node server </title>
-                                    <link href="./public/style/style.css" rel="" type="text/css">
-                                    <h1>Node server</h1>
-                                </head>
-                                
-                                <body>
-                                    <p class="ok">Welcome server</p>
-                                    <ul>
-                                        <li> <a href="http://${this.request.headers.host}/about">about</a> </li>
-                                        <li> <a href="http://${this.request.headers.host}/auctioneer">auctioneer</a> </li>
-                                        <li> <a href="http://${this.request.headers.host}/bidder">bidder</a> </li>
-                                    </ul>
-                                    `);
-    }
-
-} 
\ No newline at end of file
diff --git a/encheres/server/controllers/ErrorResponseBuilder.js b/encheres/server/controllers/ErrorResponseBuilder.js
new file mode 100644
index 0000000000000000000000000000000000000000..b8a86c8c0d85732eb65838ef7efefa47a39ee83e
--- /dev/null
+++ b/encheres/server/controllers/ErrorResponseBuilder.js
@@ -0,0 +1,29 @@
+
+export default class ErrorResponseBuilder {
+    
+    #response;
+    #errorStatus;
+    #url;
+
+    constructor(url, response, errorStatus) {
+        this.#response = response;
+        this.#errorStatus = errorStatus;
+        this.#url = url;
+    }
+
+    handleError() {
+        this.prepareResponse();
+        this.bResponse();
+    }
+
+    prepareResponse() {
+        this.#response.statusCode = this.#errorStatus;
+        this.#response.setHeader( 'Content-Type' , 'text/html');
+      }
+
+    bResponse() {
+        this.#response.write(`${this.#errorStatus} : ${this.#url} not found`);
+        this.#response.end();
+    }
+
+}
\ No newline at end of file
diff --git a/encheres/server/controllers/HtmlResponseBuilder.js b/encheres/server/controllers/HtmlResponseBuilder.js
new file mode 100644
index 0000000000000000000000000000000000000000..a51f8aa2fed272569985b0a1d87fdf2e57a408c5
--- /dev/null
+++ b/encheres/server/controllers/HtmlResponseBuilder.js
@@ -0,0 +1,12 @@
+
+export default class HtmlResponseBuilder {
+
+    response;
+    url;
+    
+    constructor(url, response) {
+        this.url = url;
+        this.response =response;
+    }
+     
+} 
\ No newline at end of file
diff --git a/encheres/server/controllers/RequestController.js b/encheres/server/controllers/RequestController.js
new file mode 100644
index 0000000000000000000000000000000000000000..23f0f85dd1114c6fe1a944b1bd23aae41325ac0f
--- /dev/null
+++ b/encheres/server/controllers/RequestController.js
@@ -0,0 +1,39 @@
+import { URL } from 'url';
+import ResponseBuilder from './ResponseBuilder.js'
+import { getContentTypeFrom }  from '../scripts/contentTypeUtil.js';
+
+const BASE = 'http://localhost/';
+
+export default class RequestController {
+
+  #request;
+  #response;
+  #url;
+
+  constructor(request, response) {
+    this.#request = request,
+    this.#response = response;
+    this.#url = new URL(this.request.url,BASE).pathname;   // on ne considère que le "pathname" de l'URL de la requête
+  }
+
+  get response() {
+    return this.#response;
+  }
+  get request() {
+    return this.#request;
+  }
+  get url() {
+    return this.#url;
+  }
+
+  async handleRequest() {
+    this.response.setHeader("Content-Type" , getContentTypeFrom(this.url) || 'text/html');
+    await this.buildResponse();
+    this.response.end();
+  }
+
+  buildResponse()  {
+    new ResponseBuilder(this.url, this.#response).handleResponse();
+  }
+
+}
\ No newline at end of file
diff --git a/encheres/server/controllers/ResponseBuilder.js b/encheres/server/controllers/ResponseBuilder.js
new file mode 100644
index 0000000000000000000000000000000000000000..c0b10973ee7c4dec0ddbcfc024003aa1189e067a
--- /dev/null
+++ b/encheres/server/controllers/ResponseBuilder.js
@@ -0,0 +1,54 @@
+import defaultBuilder from './default.js';
+import aboutBuilder from './about.js';
+import auctioneerBuilder from './auctioneer.js'
+import ErrorResponseBuilder from './ErrorResponseBuilder.js';
+import bidderBuilder from './bidder.js';
+import { URL } from 'url';
+
+export default class ResponseBuilder {
+    #request;
+    #response;
+    #url;
+    
+    constructor(url, response) {
+        this.#response =response; 
+        this.#url = url;
+    }
+
+    get url() {
+      return this.#url;
+    }
+
+    get response() {
+      return this.#response;
+    }
+
+    get request() {
+      return this.#request;
+    }
+
+      handleResponse() {
+        this.buildResponse();
+      }
+      
+      buildResponse()  {    
+        
+        // routage "à la main"
+        if (this.url === '/' ){
+          new defaultBuilder(this.url, this.response).buildResponse();
+        }
+        else if (this.url.startsWith('/about')){
+          new aboutBuilder(this.url, this.response).buildResponse();
+        }
+        else if(this.url.startsWith('/auctioneer')) {
+          new auctioneerBuilder(this.url, this.response).buildResponse();
+        }
+        else if(this.url.startsWith('/bidder')) {
+          new bidderBuilder(this.url, this.response).buildResponse();
+        }
+        else {
+          new ErrorResponseBuilder(this.url, this.response, 404).handleError(); 
+        }
+      }      
+    
+}
\ No newline at end of file
diff --git a/encheres/server/controllers/about.js b/encheres/server/controllers/about.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd890ab5b1b8c56babca36107ef4baf8ac3538e5
--- /dev/null
+++ b/encheres/server/controllers/about.js
@@ -0,0 +1,24 @@
+import HtmlResponseBuilder from "./HtmlResponseBuilder.js";
+import * as fs from 'fs';
+
+
+export default class about extends HtmlResponseBuilder{
+    
+    constructor(url, response){
+        super(url, response);
+    } 
+
+    buildResponse()  {
+        let path = `..${this.url}.html`;
+        try {
+            fs.accessSync(path, fs.constants.R_OK);
+            const content = fs.readFileSync(path);
+            this.response.write(content);
+            this.response.end();
+        }catch(err) {
+            new ErrorResponseBuilder(this.url, this.response, 404).handleError();
+        }
+    
+      }
+    
+} 
\ No newline at end of file
diff --git a/encheres/server/controllers/auctioneer.js b/encheres/server/controllers/auctioneer.js
new file mode 100644
index 0000000000000000000000000000000000000000..2f52a85f7d8931d0cdf6ac35346d62d9b01f053e
--- /dev/null
+++ b/encheres/server/controllers/auctioneer.js
@@ -0,0 +1,22 @@
+import HtmlResponseBuilder from "./HtmlResponseBuilder.js";
+import * as fs from 'fs';
+
+export default class auctioneer extends HtmlResponseBuilder{
+    
+    constructor(url, response){
+        super(url, response);
+    } 
+
+    buildResponse()  {
+        let path = `..${this.url}.html`;
+        try {
+            fs.accessSync(path, fs.constants.R_OK);
+            const content = fs.readFileSync(path);
+            this.response.write(content);
+        }catch(err) {
+            new ErrorResponseBuilder(this.url, this.response, 404).handleError();
+        }
+    
+      }
+
+} 
\ No newline at end of file
diff --git a/encheres/server/controllers/bidder.js b/encheres/server/controllers/bidder.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0f1dbb7964a638a02c0f71056e95b9857400d21
--- /dev/null
+++ b/encheres/server/controllers/bidder.js
@@ -0,0 +1,22 @@
+import HtmlResponseBuilder from "./HtmlResponseBuilder.js";
+import * as fs from 'fs';
+
+export default class bidder extends HtmlResponseBuilder{
+    
+    constructor(url, response){
+        super(url, response);
+    } 
+
+    buildResponse()  {
+        let path = `..${this.url}.html`;
+        try {
+            fs.accessSync(path, fs.constants.R_OK);
+            const content = fs.readFileSync(path);
+            this.response.write(content);
+        }catch(err) {
+            new ErrorResponseBuilder(this.url, this.response, 404).handleError();
+        }
+    
+      }
+
+} 
\ No newline at end of file
diff --git a/encheres/server/controllers/default.js b/encheres/server/controllers/default.js
new file mode 100644
index 0000000000000000000000000000000000000000..59126338c28b99ad20b59f5b1aa1a96dcb783021
--- /dev/null
+++ b/encheres/server/controllers/default.js
@@ -0,0 +1,29 @@
+import HtmlResponseBuilder from "./HtmlResponseBuilder.js";
+import * as fs from 'fs';
+
+import ErrorResponseBuilder from "./ErrorResponseBuilder.js";
+
+
+export default class defaultBuilder extends HtmlResponseBuilder{
+    
+    constructor(url, response){
+        super(url, response);
+    }
+
+  /**
+  * send the requested resource as it is, if it exists, else responds with a 404
+  */
+  buildResponse()  {
+    const path = `..${this.url}index.html`;
+    try {
+        console.log(path);
+        fs.accessSync(path, fs.constants.R_OK);
+        const content = fs.readFileSync(path);
+        this.response.write(content);
+    }catch(err) {
+        new ErrorResponseBuilder(this.url, this.response, 404).handleError();
+    }
+
+  }
+
+} 
\ No newline at end of file
diff --git a/encheres/server/controllers/ioController.js b/encheres/server/controllers/ioController.js
new file mode 100644
index 0000000000000000000000000000000000000000..9ec5381fe1d57e4d03832779281cc19f7ea30e29
--- /dev/null
+++ b/encheres/server/controllers/ioController.js
@@ -0,0 +1,50 @@
+export default class IOController {
+    #io;
+    #clients;
+    #interval = 2000;
+    #maxRandomNumber = 8;
+  
+    constructor(io) {
+      this.#io = io;
+      this.#clients = new Map();
+    }
+  
+    registerSocket(socket) {
+      console.log(`new connection with id ${socket.id}`);
+      socket.emit('ping', 'ping');
+      this.setupListeners(socket);
+    }
+  
+    setupListeners(socket) {
+      socket.on( 'pong', () => this.greatings(socket) );
+      socket.on( 'disconnect' , () => this.leave(socket) );
+    }
+  
+    greatings(socket) {
+      console.log(`pong received from (id : ${socket.id}) at ${new Date().toLocaleTimeString()}`);
+      //const timerId = setInterval(this.randomNumber.bind(this), this.#interval);
+      //const timerId = setInterval(this.randomNumber.bind(this), this.#interval, socket); /**si on veut que le nombre random soit différent */
+      this.#clients.set(socket.id, timerId);
+    }
+  
+    leave(socket) {
+      const timerId = this.#clients.get(socket.id) || 'unknown' ;
+      console.log(`disconnection from ${socket.id}`);
+      clearInterval(timerId);
+      this.#clients.delete(socket.id);
+    }
+  
+    randomNumber(socket=undefined) {
+        const number = randInt(this.#maxRandomNumber);
+        if (socket) {
+          socket.emit('change number', number);
+        }
+        else{
+          this.#io.emit('change number', number);
+        }
+        console.log(`nombre envoyé ${number}`);
+    }
+  
+}
+const randInt = max => Math.floor( Math.random() * max );
+  
\ No newline at end of file
diff --git a/encheres/server/main.js b/encheres/server/main.js
index f8525cde071ba0b6ee06859dad275cddbdb8e347..9a1144e0a64c5f275d19f89c37bdb7f4a6b09e0d 100644
--- a/encheres/server/main.js
+++ b/encheres/server/main.js
@@ -1,8 +1,13 @@
 import http from 'http';
-import RequestController from './controller/RequestController.js';
+import RequestController from './controllers/RequestController.js';
+import { Server as ServerIO } from 'socket.io';
+import IOController from './controllers/ioController.js';
+
 
 const server = http.createServer(
 	(request, response) => new RequestController(request, response).handleRequest()
 );
 
+
+
 server.listen(8080);
\ No newline at end of file
diff --git a/encheres/server/public/index.html b/encheres/server/public/index.html
index f19e6d39d687f01d87643fd27f252a20474a9145..121c59332a0c66f35201924ffb5325947e852f0a 100644
--- a/encheres/server/public/index.html
+++ b/encheres/server/public/index.html
@@ -1,23 +1 @@
-<!DOCTYPE html>
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
-
-<head>
-	<meta charset="UTF-8"/>
-	<title>PAGE TITLE</title>
-	<meta name="author" content="your name"/>
-
-	<link rel="stylesheet" type="text/css" href="./style/style.css" title="starship style"/>
-<script defer src="scripts/bundle.js?298a7feaf160465c83e4"></script></head>
-
-<body>
-
-	<h1>Your page</h1>
-
-	<p>Write your html code here.</p>
-
-	<p>Consultez la console pour la trace de création du bundle&nbsp;: <kbd>Ctrl+Shift+K</kbd></p>
-
-</body>
-
-</html>
+<head><script defer src="scripts/bundle.js?50d73e68ded995014797"></script></head>
\ No newline at end of file
diff --git a/encheres/server/public/scripts/bundle.js b/encheres/server/public/scripts/bundle.js
index 99e540b86bb8350a98fe0aaee5421d309e8c52cc..b11f4fd027562d010cd11e1757bcec01a00cdb3d 100644
--- a/encheres/server/public/scripts/bundle.js
+++ b/encheres/server/public/scripts/bundle.js
@@ -1,2 +1,2 @@
 /*! For license information please see bundle.js.LICENSE.txt */
-(()=>{"use strict";var __webpack_modules__={"./src/controller/RequestController.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ RequestController)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js");\n/* harmony import */ var _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classPrivateFieldGet */ "./node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js");\n/* harmony import */ var _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classPrivateFieldSet */ "./node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js");\nObject(function webpackMissingModule() { var e = new Error("Cannot find module \'url\'"); e.code = \'MODULE_NOT_FOUND\'; throw e; }());\n/* harmony import */ var _ResponseBuilder_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ResponseBuilder.js */ "./src/controller/ResponseBuilder.js");\n\n\n\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }\n\n\nvar _request = /*#__PURE__*/new WeakMap();\nvar _response = /*#__PURE__*/new WeakMap();\nvar _url = /*#__PURE__*/new WeakMap();\nvar RequestController = /*#__PURE__*/function () {\n  function RequestController(request, response) {\n    (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__["default"])(this, RequestController);\n    _classPrivateFieldInitSpec(this, _request, {\n      writable: true,\n      value: void 0\n    });\n    _classPrivateFieldInitSpec(this, _response, {\n      writable: true,\n      value: void 0\n    });\n    _classPrivateFieldInitSpec(this, _url, {\n      writable: true,\n      value: void 0\n    });\n    (0,_babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_3__["default"])(this, _request, request), (0,_babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_3__["default"])(this, _response, response);\n    (0,_babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_3__["default"])(this, _url, new Object(function webpackMissingModule() { var e = new Error("Cannot find module \'url\'"); e.code = \'MODULE_NOT_FOUND\'; throw e; }())(request.url, "http://".concat(request.headers.host)));\n  }\n  (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__["default"])(RequestController, [{\n    key: "response",\n    get: function get() {\n      return (0,_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_2__["default"])(this, _response);\n    }\n  }, {\n    key: "handleRequest",\n    value: function handleRequest() {\n      this.buildResponse();\n    }\n  }, {\n    key: "buildResponse",\n    value: function buildResponse() {\n      new _ResponseBuilder_js__WEBPACK_IMPORTED_MODULE_5__["default"]((0,_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_2__["default"])(this, _request), (0,_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_2__["default"])(this, _response)).handleResponse();\n    }\n  }]);\n  return RequestController;\n}();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29udHJvbGxlci9SZXF1ZXN0Q29udHJvbGxlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQTBCO0FBQ3dCO0FBQUEsSUFBQUUsUUFBQSxvQkFBQUMsT0FBQTtBQUFBLElBQUFDLFNBQUEsb0JBQUFELE9BQUE7QUFBQSxJQUFBRSxJQUFBLG9CQUFBRixPQUFBO0FBQUEsSUFFN0JHLGlCQUFpQjtFQU1wQyxTQUFBQSxrQkFBWUMsT0FBTyxFQUFFQyxRQUFRLEVBQUU7SUFBQUMsaUZBQUEsT0FBQUgsaUJBQUE7SUFBQUksMEJBQUEsT0FBQVIsUUFBQTtNQUFBUyxRQUFBO01BQUFDLEtBQUE7SUFBQTtJQUFBRiwwQkFBQSxPQUFBTixTQUFBO01BQUFPLFFBQUE7TUFBQUMsS0FBQTtJQUFBO0lBQUFGLDBCQUFBLE9BQUFMLElBQUE7TUFBQU0sUUFBQTtNQUFBQyxLQUFBO0lBQUE7SUFDN0JDLHVGQUFBLEtBQUksRUFBQVgsUUFBQSxFQUFZSyxPQUFPLEdBQUFNLHVGQUFBLENBQ3ZCLElBQUksRUFBQVQsU0FBQSxFQUFhSSxRQUFRO0lBQ3pCSyx1RkFBQSxLQUFJLEVBQUFSLElBQUEsRUFBUSxJQUFJTCxrSUFBRyxDQUFDTyxPQUFPLENBQUNPLEdBQUcsWUFBQUMsTUFBQSxDQUFZUixPQUFPLENBQUNTLE9BQU8sQ0FBQ0MsSUFBSSxDQUFFLENBQUM7RUFDcEU7RUFBQ0MsOEVBQUEsQ0FBQVosaUJBQUE7SUFBQWEsR0FBQTtJQUFBQyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFlO01BQ2IsT0FBQUMsdUZBQUEsQ0FBTyxJQUFJLEVBQUFqQixTQUFBO0lBQ2I7RUFBQztJQUFBZSxHQUFBO0lBQUFQLEtBQUEsRUFFRCxTQUFBVSxjQUFBLEVBQWdCO01BQ2QsSUFBSSxDQUFDQyxhQUFhLENBQUMsQ0FBQztJQUN0QjtFQUFDO0lBQUFKLEdBQUE7SUFBQVAsS0FBQSxFQUVELFNBQUFXLGNBQUEsRUFBaUI7TUFDZixJQUFJdEIsMkRBQWUsQ0FBQW9CLHVGQUFBLENBQUMsSUFBSSxFQUFBbkIsUUFBQSxHQUFBbUIsdUZBQUEsQ0FBVyxJQUFJLEVBQUFqQixTQUFBLENBQVUsQ0FBQyxDQUFDb0IsY0FBYyxDQUFDLENBQUM7SUFDckU7RUFBQztFQUFBLE9BQUFsQixpQkFBQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwLy4vc3JjL2NvbnRyb2xsZXIvUmVxdWVzdENvbnRyb2xsZXIuanM/Nzg3NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnO1xuaW1wb3J0IFJlc3BvbnNlQnVpbGRlciBmcm9tICcuL1Jlc3BvbnNlQnVpbGRlci5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVxdWVzdENvbnRyb2xsZXIge1xuXG4gICNyZXF1ZXN0O1xuICAjcmVzcG9uc2U7XG4gICN1cmw7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICB0aGlzLiNyZXF1ZXN0ID0gcmVxdWVzdCxcbiAgICB0aGlzLiNyZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMuI3VybCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIGBodHRwOi8vJHtyZXF1ZXN0LmhlYWRlcnMuaG9zdH1gKTtcbiAgfVxuXG4gIGdldCByZXNwb25zZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzcG9uc2U7XG4gIH1cblxuICBoYW5kbGVSZXF1ZXN0KCkge1xuICAgIHRoaXMuYnVpbGRSZXNwb25zZSgpO1xuICB9XG5cbiAgYnVpbGRSZXNwb25zZSgpICB7XG4gICAgbmV3IFJlc3BvbnNlQnVpbGRlcih0aGlzLiNyZXF1ZXN0LCB0aGlzLiNyZXNwb25zZSkuaGFuZGxlUmVzcG9uc2UoKTtcbiAgfVxuXG59Il0sIm5hbWVzIjpbIlVSTCIsIlJlc3BvbnNlQnVpbGRlciIsIl9yZXF1ZXN0IiwiV2Vha01hcCIsIl9yZXNwb25zZSIsIl91cmwiLCJSZXF1ZXN0Q29udHJvbGxlciIsInJlcXVlc3QiLCJyZXNwb25zZSIsIl9jbGFzc0NhbGxDaGVjayIsIl9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjIiwid3JpdGFibGUiLCJ2YWx1ZSIsIl9jbGFzc1ByaXZhdGVGaWVsZFNldCIsInVybCIsImNvbmNhdCIsImhlYWRlcnMiLCJob3N0IiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwiZ2V0IiwiX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwiaGFuZGxlUmVxdWVzdCIsImJ1aWxkUmVzcG9uc2UiLCJoYW5kbGVSZXNwb25zZSIsImRlZmF1bHQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/controller/RequestController.js\n')},"./src/controller/ResponseBuilder.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ ResponseBuilder)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js");\nObject(function webpackMissingModule() { var e = new Error("Cannot find module \'url\'"); e.code = \'MODULE_NOT_FOUND\'; throw e; }());\n\n\n\n\nvar ResponseBuilder = /*#__PURE__*/function () {\n  function ResponseBuilder(request, response) {\n    (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__["default"])(this, ResponseBuilder);\n    (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "request", void 0);\n    (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "response", void 0);\n    (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "url", void 0);\n    this.request = request, this.response = response;\n    this.url = new Object(function webpackMissingModule() { var e = new Error("Cannot find module \'url\'"); e.code = \'MODULE_NOT_FOUND\'; throw e; }())(request.url, "http://".concat(request.headers.host));\n  }\n  (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__["default"])(ResponseBuilder, [{\n    key: "handleResponse",\n    value: function handleResponse() {\n      this.prepareResponse();\n      this.buildResponse();\n    }\n  }, {\n    key: "prepareResponse",\n    value: function prepareResponse() {\n      this.response.statusCode = 200;\n      this.response.setHeader(\'Content-Type\', \'text/html\');\n    }\n  }, {\n    key: "buildResponse",\n    value: function buildResponse() {\n      // routage "à la main"\n      if (this.url.pathname.startsWith(\'/\')) {\n        var first = new defaultBuilder(this.request, this.response);\n        first.bresponse();\n        first.endResponse();\n      } else {\n        new ErrorResponseBuilder(this.request, this.response, 404).handleError();\n      }\n    }\n  }]);\n  return ResponseBuilder;\n}();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29udHJvbGxlci9SZXNwb25zZUJ1aWxkZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBMEI7QUFBQSxJQUVMQyxlQUFlO0VBS2hDLFNBQUFBLGdCQUFZQyxPQUFPLEVBQUVDLFFBQVEsRUFBRTtJQUFBQyxpRkFBQSxPQUFBSCxlQUFBO0lBQUFJLGlGQUFBO0lBQUFBLGlGQUFBO0lBQUFBLGlGQUFBO0lBQzNCLElBQUksQ0FBQ0gsT0FBTyxHQUFFQSxPQUFPLEVBQ3JCLElBQUksQ0FBQ0MsUUFBUSxHQUFFQSxRQUFRO0lBQ3ZCLElBQUksQ0FBQ0csR0FBRyxHQUFHLElBQUlOLGtJQUFHLENBQUNFLE9BQU8sQ0FBQ0ksR0FBRyxZQUFBQyxNQUFBLENBQVlMLE9BQU8sQ0FBQ00sT0FBTyxDQUFDQyxJQUFJLENBQUUsQ0FBQztFQUFPO0VBQUNDLDhFQUFBLENBQUFULGVBQUE7SUFBQVUsR0FBQTtJQUFBQyxLQUFBLEVBRTNFLFNBQUFDLGVBQUEsRUFBaUI7TUFDZixJQUFJLENBQUNDLGVBQWUsQ0FBQyxDQUFDO01BQ3RCLElBQUksQ0FBQ0MsYUFBYSxDQUFDLENBQUM7SUFDdEI7RUFBQztJQUFBSixHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBRSxnQkFBQSxFQUFrQjtNQUNoQixJQUFJLENBQUNYLFFBQVEsQ0FBQ2EsVUFBVSxHQUFHLEdBQUc7TUFDOUIsSUFBSSxDQUFDYixRQUFRLENBQUNjLFNBQVMsQ0FBRSxjQUFjLEVBQUcsV0FBVyxDQUFDO0lBQ3hEO0VBQUM7SUFBQU4sR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQUcsY0FBQSxFQUFpQjtNQUVmO01BQ0EsSUFBSSxJQUFJLENBQUNULEdBQUcsQ0FBQ1ksUUFBUSxDQUFDQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUM7UUFDcEMsSUFBTUMsS0FBSyxHQUFHLElBQUlDLGNBQWMsQ0FBQyxJQUFJLENBQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDQyxRQUFRLENBQUM7UUFDN0RpQixLQUFLLENBQUNFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pCRixLQUFLLENBQUNHLFdBQVcsQ0FBQyxDQUFDO01BQ3JCLENBQUMsTUFDSTtRQUNILElBQUlDLG9CQUFvQixDQUFDLElBQUksQ0FBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUNDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQ3NCLFdBQVcsQ0FBQyxDQUFDO01BQzFFO0lBQ0Y7RUFBQztFQUFBLE9BQUF4QixlQUFBO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9zcmMvY29udHJvbGxlci9SZXNwb25zZUJ1aWxkZXIuanM/ZGQ1MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNwb25zZUJ1aWxkZXIge1xuICAgIHJlcXVlc3Q7XG4gICAgcmVzcG9uc2U7XG4gICAgdXJsO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9cmVxdWVzdCxcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9cmVzcG9uc2U7IFxuICAgICAgICB0aGlzLnVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIGBodHRwOi8vJHtyZXF1ZXN0LmhlYWRlcnMuaG9zdH1gKTsgICAgICB9XG5cbiAgICAgIGhhbmRsZVJlc3BvbnNlKCkge1xuICAgICAgICB0aGlzLnByZXBhcmVSZXNwb25zZSgpO1xuICAgICAgICB0aGlzLmJ1aWxkUmVzcG9uc2UoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcHJlcGFyZVJlc3BvbnNlKCkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0SGVhZGVyKCAnQ29udGVudC1UeXBlJyAsICd0ZXh0L2h0bWwnKTtcbiAgICAgIH0gXG5cbiAgICAgIGJ1aWxkUmVzcG9uc2UoKSAgeyAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIHJvdXRhZ2UgXCLDoCBsYSBtYWluXCJcbiAgICAgICAgaWYgKHRoaXMudXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy8nKSl7XG4gICAgICAgICAgY29uc3QgZmlyc3QgPSBuZXcgZGVmYXVsdEJ1aWxkZXIodGhpcy5yZXF1ZXN0LCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICBmaXJzdC5icmVzcG9uc2UoKTtcbiAgICAgICAgICBmaXJzdC5lbmRSZXNwb25zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIG5ldyBFcnJvclJlc3BvbnNlQnVpbGRlcih0aGlzLnJlcXVlc3QsIHRoaXMucmVzcG9uc2UsIDQwNCkuaGFuZGxlRXJyb3IoKTsgXG4gICAgICAgIH1cbiAgICAgIH0gICAgICBcbiAgICBcbn0iXSwibmFtZXMiOlsiVVJMIiwiUmVzcG9uc2VCdWlsZGVyIiwicmVxdWVzdCIsInJlc3BvbnNlIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5IiwidXJsIiwiY29uY2F0IiwiaGVhZGVycyIsImhvc3QiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsImhhbmRsZVJlc3BvbnNlIiwicHJlcGFyZVJlc3BvbnNlIiwiYnVpbGRSZXNwb25zZSIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJmaXJzdCIsImRlZmF1bHRCdWlsZGVyIiwiYnJlc3BvbnNlIiwiZW5kUmVzcG9uc2UiLCJFcnJvclJlc3BvbnNlQnVpbGRlciIsImhhbmRsZUVycm9yIiwiZGVmYXVsdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/controller/ResponseBuilder.js\n')},"./src/scripts/main.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\nObject(function webpackMissingModule() { var e = new Error(\"Cannot find module 'http'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }());\n/* harmony import */ var _controller_RequestController_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../controller/RequestController.js */ \"./src/controller/RequestController.js\");\n// write your code here\nconsole.log('le bundle a été généré');\n\n\nvar server = Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'http'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())(function (request, response) {\n  return new _controller_RequestController_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](request, response).handleRequest();\n});\nserver.listen(8080);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9tYWluLmpzIiwibWFwcGluZ3MiOiI7OztBQUFBO0FBQ0FBLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0FBR2I7QUFDMkM7QUFFbkUsSUFBTUcsTUFBTSxHQUFHRixtSUFBaUIsQ0FDL0IsVUFBQ0ksT0FBTyxFQUFFQyxRQUFRO0VBQUEsT0FBSyxJQUFJSix3RUFBaUIsQ0FBQ0csT0FBTyxFQUFFQyxRQUFRLENBQUMsQ0FBQ0MsYUFBYSxDQUFDLENBQUM7QUFBQSxDQUNoRixDQUFDO0FBRURKLE1BQU0sQ0FBQ0ssTUFBTSxDQUFDLElBQUksQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FwcC8uL3NyYy9zY3JpcHRzL21haW4uanM/Mjk2MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB3cml0ZSB5b3VyIGNvZGUgaGVyZVxuY29uc29sZS5sb2coJ2xlIGJ1bmRsZSBhIMOpdMOpIGfDqW7DqXLDqScpO1xuXG5cbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IFJlcXVlc3RDb250cm9sbGVyIGZyb20gJy4uL2NvbnRyb2xsZXIvUmVxdWVzdENvbnRyb2xsZXIuanMnO1xuXG5jb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihcblx0KHJlcXVlc3QsIHJlc3BvbnNlKSA9PiBuZXcgUmVxdWVzdENvbnRyb2xsZXIocmVxdWVzdCwgcmVzcG9uc2UpLmhhbmRsZVJlcXVlc3QoKVxuKTtcblxuc2VydmVyLmxpc3Rlbig4MDgwKTsiXSwibmFtZXMiOlsiY29uc29sZSIsImxvZyIsImh0dHAiLCJSZXF1ZXN0Q29udHJvbGxlciIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsInJlcXVlc3QiLCJyZXNwb25zZSIsImhhbmRsZVJlcXVlc3QiLCJsaXN0ZW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/scripts/main.js\n")},"./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorGet.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _classApplyDescriptorGet)\n/* harmony export */ });\nfunction _classApplyDescriptorGet(receiver, descriptor) {\n  if (descriptor.get) {\n    return descriptor.get.call(receiver);\n  }\n  return descriptor.value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NBcHBseURlc2NyaXB0b3JHZXQuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FwcC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0FwcGx5RGVzY3JpcHRvckdldC5qcz9mZjZjIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvckdldChyZWNlaXZlciwgZGVzY3JpcHRvcikge1xuICBpZiAoZGVzY3JpcHRvci5nZXQpIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvci5nZXQuY2FsbChyZWNlaXZlcik7XG4gIH1cbiAgcmV0dXJuIGRlc2NyaXB0b3IudmFsdWU7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorGet.js\n')},"./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorSet.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _classApplyDescriptorSet)\n/* harmony export */ });\nfunction _classApplyDescriptorSet(receiver, descriptor, value) {\n  if (descriptor.set) {\n    descriptor.set.call(receiver, value);\n  } else {\n    if (!descriptor.writable) {\n      throw new TypeError("attempted to set read only private field");\n    }\n    descriptor.value = value;\n  }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NBcHBseURlc2NyaXB0b3JTZXQuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFlO0FBQ2Y7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NBcHBseURlc2NyaXB0b3JTZXQuanM/NzY2OSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NBcHBseURlc2NyaXB0b3JTZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IsIHZhbHVlKSB7XG4gIGlmIChkZXNjcmlwdG9yLnNldCkge1xuICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkXCIpO1xuICAgIH1cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gdmFsdWU7XG4gIH1cbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorSet.js\n')},"./node_modules/@babel/runtime/helpers/esm/classCallCheck.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _classCallCheck)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError("Cannot call a class as a function");\n  }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanM/NDNiMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/classCallCheck.js\n')},"./node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _classExtractFieldDescriptor)\n/* harmony export */ });\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) {\n  if (!privateMap.has(receiver)) {\n    throw new TypeError("attempted to " + action + " private field on non-instance");\n  }\n  return privateMap.get(receiver);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yLmpzPzg2MWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgYWN0aW9uKSB7XG4gIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBcIiArIGFjdGlvbiArIFwiIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG4gIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js\n')},"./node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _classPrivateFieldGet)\n/* harmony export */ });\n/* harmony import */ var _classApplyDescriptorGet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./classApplyDescriptorGet.js */ "./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorGet.js");\n/* harmony import */ var _classExtractFieldDescriptor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./classExtractFieldDescriptor.js */ "./node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js");\n\n\nfunction _classPrivateFieldGet(receiver, privateMap) {\n  var descriptor = (0,_classExtractFieldDescriptor_js__WEBPACK_IMPORTED_MODULE_1__["default"])(receiver, privateMap, "get");\n  return (0,_classApplyDescriptorGet_js__WEBPACK_IMPORTED_MODULE_0__["default"])(receiver, descriptor);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NQcml2YXRlRmllbGRHZXQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQW1FO0FBQ1E7QUFDNUQ7QUFDZixtQkFBbUIsMkVBQTJCO0FBQzlDLFNBQVMsdUVBQXVCO0FBQ2hDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzUHJpdmF0ZUZpZWxkR2V0LmpzPzQ2Y2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNsYXNzQXBwbHlEZXNjcmlwdG9yR2V0IGZyb20gXCIuL2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0LmpzXCI7XG5pbXBvcnQgY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yIGZyb20gXCIuL2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvci5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBcImdldFwiKTtcbiAgcmV0dXJuIGNsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js\n')},"./node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _classPrivateFieldSet)\n/* harmony export */ });\n/* harmony import */ var _classApplyDescriptorSet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./classApplyDescriptorSet.js */ "./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorSet.js");\n/* harmony import */ var _classExtractFieldDescriptor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./classExtractFieldDescriptor.js */ "./node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js");\n\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) {\n  var descriptor = (0,_classExtractFieldDescriptor_js__WEBPACK_IMPORTED_MODULE_1__["default"])(receiver, privateMap, "set");\n  (0,_classApplyDescriptorSet_js__WEBPACK_IMPORTED_MODULE_0__["default"])(receiver, descriptor, value);\n  return value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NQcml2YXRlRmllbGRTZXQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQW1FO0FBQ1E7QUFDNUQ7QUFDZixtQkFBbUIsMkVBQTJCO0FBQzlDLEVBQUUsdUVBQXVCO0FBQ3pCO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NQcml2YXRlRmllbGRTZXQuanM/MjZmYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2xhc3NBcHBseURlc2NyaXB0b3JTZXQgZnJvbSBcIi4vY2xhc3NBcHBseURlc2NyaXB0b3JTZXQuanNcIjtcbmltcG9ydCBjbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IgZnJvbSBcIi4vY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBcInNldFwiKTtcbiAgY2xhc3NBcHBseURlc2NyaXB0b3JTZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js\n')},"./node_modules/@babel/runtime/helpers/esm/createClass.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _createClass)\n/* harmony export */ });\n/* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js");\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if ("value" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(descriptor.key), descriptor);\n  }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, "prototype", {\n    writable: false\n  });\n  return Constructor;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBK0M7QUFDL0M7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDZEQUFhO0FBQy9DO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanM/OGYwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCB0b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/createClass.js\n')},"./node_modules/@babel/runtime/helpers/esm/defineProperty.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _defineProperty)\n/* harmony export */ });\n/* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js");\n\nfunction _defineProperty(obj, key, value) {\n  key = (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__["default"])(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBK0M7QUFDaEM7QUFDZixRQUFRLDZEQUFhO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanM/NGE4MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/defineProperty.js\n')},"./node_modules/@babel/runtime/helpers/esm/toPrimitive.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ toPrimitive)\n/* harmony export */ });\n/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js");\n\nfunction toPrimitive(t, r) {\n  if ("object" != (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || "default");\n    if ("object" != (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(i)) return i;\n    throw new TypeError("@@toPrimitive must return a primitive value.");\n  }\n  return ("string" === r ? String : Number)(t);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBa0M7QUFDbkI7QUFDZixrQkFBa0Isc0RBQU87QUFDekI7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNEQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzP2FkOTQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/toPrimitive.js\n')},"./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ toPropertyKey)\n/* harmony export */ });\n/* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js");\n/* harmony import */ var _toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toPrimitive.js */ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js");\n\n\nfunction toPropertyKey(t) {\n  var i = (0,_toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__["default"])(t, "string");\n  return "symbol" == (0,_typeof_js__WEBPACK_IMPORTED_MODULE_0__["default"])(i) ? i : String(i);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBa0M7QUFDUztBQUM1QjtBQUNmLFVBQVUsMkRBQVc7QUFDckIscUJBQXFCLHNEQUFPO0FBQzVCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanM/MzYxZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogU3RyaW5nKGkpO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js\n')},"./node_modules/@babel/runtime/helpers/esm/typeof.js":(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "default": () => (/* binding */ _typeof)\n/* harmony export */ });\nfunction _typeof(o) {\n  "@babel/helpers - typeof";\n\n  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;\n  }, _typeof(o);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzPzZjZTAiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/esm/typeof.js\n')}},__webpack_module_cache__={};function __webpack_require__(e){var _=__webpack_module_cache__[e];if(void 0!==_)return _.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](s,s.exports,__webpack_require__),s.exports}__webpack_require__.d=(e,_)=>{for(var s in _)__webpack_require__.o(_,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:_[s]})},__webpack_require__.o=(e,_)=>Object.prototype.hasOwnProperty.call(e,_),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/scripts/main.js")})();
\ No newline at end of file
+(()=>{var __webpack_modules__={"./src/scripts/main.js":()=>{eval("// write your code here\nconsole.log('le bundle a été généré');\nconst socket = io();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9tYWluLmpzIiwibmFtZXMiOlsiY29uc29sZSIsImxvZyIsInNvY2tldCIsImlvIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHAvLi9zcmMvc2NyaXB0cy9tYWluLmpzPzI5NjMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gd3JpdGUgeW91ciBjb2RlIGhlcmVcbmNvbnNvbGUubG9nKCdsZSBidW5kbGUgYSDDqXTDqSBnw6luw6lyw6knKTtcblxuY29uc3Qgc29ja2V0ID0gaW8oKTtcblxuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0FBLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0FBRXJDLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxDQUFDLENBQUMifQ==\n//# sourceURL=webpack-internal:///./src/scripts/main.js\n")}},__webpack_exports__={};__webpack_modules__["./src/scripts/main.js"]()})();
\ No newline at end of file
diff --git a/encheres/server/public/scripts/bundle.js.LICENSE.txt b/encheres/server/public/scripts/bundle.js.LICENSE.txt
index 1dcd9c99e4a41f70b6cd48847c55e9da5cc9c58e..3974d88d6383d2ead72e92f1784e9549c0415159 100644
--- a/encheres/server/public/scripts/bundle.js.LICENSE.txt
+++ b/encheres/server/public/scripts/bundle.js.LICENSE.txt
@@ -1,55 +1,3 @@
 /*!*****************************!*\
   !*** ./src/scripts/main.js ***!
   \*****************************/
-
-/*!*******************************************!*\
-  !*** ./src/controller/ResponseBuilder.js ***!
-  \*******************************************/
-
-/*!*********************************************!*\
-  !*** ./src/controller/RequestController.js ***!
-  \*********************************************/
-
-/*!***********************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/typeof.js ***!
-  \***********************************************************/
-
-/*!****************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/createClass.js ***!
-  \****************************************************************/
-
-/*!****************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/toPrimitive.js ***!
-  \****************************************************************/
-
-/*!******************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js ***!
-  \******************************************************************/
-
-/*!*******************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***!
-  \*******************************************************************/
-
-/*!*******************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/defineProperty.js ***!
-  \*******************************************************************/
-
-/*!*************************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js ***!
-  \*************************************************************************/
-
-/*!*************************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js ***!
-  \*************************************************************************/
-
-/*!****************************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorGet.js ***!
-  \****************************************************************************/
-
-/*!****************************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/classApplyDescriptorSet.js ***!
-  \****************************************************************************/
-
-/*!********************************************************************************!*\
-  !*** ./node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js ***!
-  \********************************************************************************/
diff --git a/encheres/server/scripts/contentTypeUtil.js b/encheres/server/scripts/contentTypeUtil.js
new file mode 100644
index 0000000000000000000000000000000000000000..42e72cead45b5f51723c5b326895ce6e2bf62dd6
--- /dev/null
+++ b/encheres/server/scripts/contentTypeUtil.js
@@ -0,0 +1,20 @@
+/**
+  return a content-type deduced from <path> final extension
+  @param path the path where to look for final extension
+*/
+export const getContentTypeFrom = path => {
+    const lastPointPosition = path.lastIndexOf('.');
+    const extension = path.substring(lastPointPosition);
+    return  contentTypes.get(extension) || '';
+  }
+  
+  // the map that associates extenstion to content-type
+  const contentTypes = new Map().set('.css', 'text/css')
+                                .set('.html', 'text/html')
+                                .set('.jpg',"image/jpeg")
+                                .set('.jpeg',"image/jpeg")
+                                .set('.txt',"plain/text")
+                                .set('.png',"image/png")
+                                .set('.js', 'application/javascript')
+                                .set('.json', 'application/json');
+  
\ No newline at end of file