├── .gitignore
├── turn-left.png
├── src
├── index.js
├── modules
│ ├── display.js
│ └── CRUD.js
├── index.html
└── style.css
├── .hintrc
├── .eslintrc.json
├── .stylelintrc.json
├── webpack.config.js
├── LICENSE.md
├── dist
├── index.html
├── runtime.bundle.js
└── index.bundle.js
├── package.json
├── .github
└── workflows
│ └── linters.yml
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/turn-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/saluumaa/To-do-List/HEAD/turn-left.png
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import './style.css';
2 | import './modules/CRUD.js';
3 | import './modules/display.js';
4 |
--------------------------------------------------------------------------------
/.hintrc:
--------------------------------------------------------------------------------
1 | {
2 | "connector": {
3 | "name": "local",
4 | "options": {
5 | "pattern": ["**", "!.git/**", "!node_modules/**"]
6 | }
7 | },
8 | "extends": ["development"],
9 | "formatters": ["stylish"],
10 | "hints": [
11 | "button-type",
12 | "disown-opener",
13 | "html-checker",
14 | "meta-charset-utf-8",
15 | "meta-viewport",
16 | "no-inline-styles:error"
17 | ]
18 | }
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es6": true,
5 | "jest": true
6 | },
7 | "parser": "babel-eslint",
8 | "parserOptions": {
9 | "ecmaVersion": 2018,
10 | "sourceType": "module"
11 | },
12 | "extends": ["airbnb-base"],
13 | "rules": {
14 | "no-shadow": "off",
15 | "no-param-reassign": "off",
16 | "eol-last": "off",
17 | "import/extensions": [ 1, {
18 | "js": "always", "json": "always"
19 | }]
20 | },
21 | "ignorePatterns": [
22 | "dist/",
23 | "build/"
24 | ]
25 | }
--------------------------------------------------------------------------------
/.stylelintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["stylelint-config-standard"],
3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"],
4 | "rules": {
5 | "at-rule-no-unknown": [
6 | true,
7 | {
8 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"]
9 | }
10 | ],
11 | "scss/at-rule-no-unknown": [
12 | true,
13 | {
14 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"]
15 | }
16 | ],
17 | "csstree/validator": true
18 | },
19 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"]
20 | }
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const HtmlWebpackPlugin = require('html-webpack-plugin');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | entry: {
7 | index: './src/index.js',
8 | },
9 | devServer: {
10 | static: './dist',
11 | },
12 | devtool: 'inline-source-map',
13 | plugins: [
14 | new HtmlWebpackPlugin({
15 | template: './src/index.html',
16 | }),
17 | ],
18 | output: {
19 | filename: '[name].bundle.js',
20 | path: path.resolve(__dirname, 'dist'),
21 | clean: true,
22 | },
23 | optimization: {
24 | runtimeChunk: 'single',
25 | },
26 | module: {
27 | rules: [
28 | {
29 | test: /\.css$/i,
30 | use: ['style-loader', 'css-loader'],
31 | },
32 | ],
33 | },
34 | };
--------------------------------------------------------------------------------
/src/modules/display.js:
--------------------------------------------------------------------------------
1 | export const listContainer = document.querySelector('.to-do-holder');
2 | export const tasks = JSON.parse(localStorage.getItem('tasks')) || [];
3 | export const displaytasks = () => {
4 | listContainer.innerHTML = '';
5 | tasks.forEach((todo) => {
6 | tasks.sort((a, b) => a.index - b.index);
7 | listContainer.innerHTML += `
8 |
9 |
11 |
${todo.description}
12 |
13 |
14 |
15 | `;
16 | });
17 | };
18 |
19 | displaytasks();
20 |
21 | // document.addEventListener('DOMContentLoaded', displaytasks);
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | To Do List
8 |
9 |
10 |
11 |
12 |
16 |
20 |
21 | Clear All Completed
22 |
23 |
24 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 saluumaa
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/dist/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | To Do List
8 |
9 |
10 |
11 |
12 |
16 |
20 |
21 | Clear All Completed
22 |
23 |
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "to-do-list",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "private": true,
7 | "scripts": {
8 | "test": "echo \"Error: no test specified\" && exit 1",
9 | "build": "webpack",
10 | "start": "webpack serve --open"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "git+https://github.com/saluumaa/To-do-List.git"
15 | },
16 | "keywords": [],
17 | "author": "",
18 | "license": "ISC",
19 | "bugs": {
20 | "url": "https://github.com/saluumaa/To-do-List/issues"
21 | },
22 | "homepage": "https://github.com/saluumaa/To-do-List#readme",
23 | "devDependencies": {
24 | "babel-eslint": "^10.1.0",
25 | "css-loader": "^6.7.3",
26 | "eslint": "^7.32.0",
27 | "eslint-config-airbnb-base": "^14.2.1",
28 | "eslint-plugin-import": "^2.27.5",
29 | "hint": "^7.1.3",
30 | "html-webpack-plugin": "^5.5.0",
31 | "style-loader": "^3.3.1",
32 | "stylelint": "^13.13.1",
33 | "stylelint-config-standard": "^21.0.0",
34 | "stylelint-csstree-validator": "^1.9.0",
35 | "stylelint-scss": "^3.21.0",
36 | "webpack": "^5.75.0",
37 | "webpack-cli": "^5.0.1"
38 | },
39 | "dependencies": {
40 | "lodash": "^4.17.21"
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/style.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Dancing+Script&family=Lato&family=Nunito:ital,wght@0,200;0,300;0,500;0,600;0,700;1,200;1,300;1,700;1,900&family=Poppins:wght@300&family=Roboto:ital,wght@0,300;0,500;0,700;1,300;1,400;1,500&display=swap');
2 |
3 | * {
4 | padding: 0;
5 | margin: 0;
6 | box-sizing: border-box;
7 | }
8 |
9 | body {
10 | font-family: 'Roboto', sans-serif;
11 | font-size: 16px;
12 | }
13 |
14 | .container {
15 | display: flex;
16 | flex-direction: column;
17 | justify-content: space-between;
18 | width: 80%;
19 | position: relative;
20 | margin: 80px auto;
21 | background-color: rgb(231, 230, 230);
22 | }
23 |
24 | .header {
25 | display: flex;
26 | justify-content: space-between;
27 | align-items: center;
28 | padding: 10px 10px;
29 | border-bottom: 2px solid rgba(0, 0, 0, 0.4);
30 | }
31 |
32 | .header p {
33 | font-size: 18px;
34 | font-weight: 600;
35 | }
36 |
37 | .arrow-img {
38 | font-size: 30px;
39 | color: rgba(0, 0, 0, 0.7);
40 | cursor: pointer;
41 | }
42 |
43 | .form {
44 | display: flex;
45 | justify-content: space-between;
46 | padding: 10px 10px;
47 | border-bottom: 2px solid rgba(0, 0, 0, 0.3);
48 | }
49 |
50 | #todo-input {
51 | width: 90%;
52 | padding-top: 5px;
53 | padding-bottom: 5px;
54 | background-color: inherit;
55 | border: none;
56 | outline: none;
57 | }
58 |
59 | input::placeholder {
60 | font-style: italic;
61 | font-weight: 500;
62 | }
63 |
64 | .to-do-holder {
65 | display: flex;
66 | flex-direction: column;
67 | justify-content: space-between;
68 | padding: 10px 0;
69 | }
70 |
71 | .todo {
72 | display: flex;
73 | gap: 10px;
74 | padding-top: 13px;
75 | font-weight: 400;
76 | padding-bottom: 7px;
77 | border-bottom: 2px solid rgba(0, 0, 0, 0.3);
78 | }
79 |
80 | .Edit,
81 | .delete {
82 | margin-left: 100%;
83 | position: absolute;
84 | right: 10px;
85 | cursor: pointer;
86 | font-size: 24px;
87 | }
88 |
89 | .delete {
90 | display: none;
91 | }
92 |
93 | i.show {
94 | display: flex;
95 | }
96 |
97 | i.hide {
98 | display: none;
99 | }
100 |
101 | .list-text {
102 | outline: none;
103 | }
104 |
105 | .checkbox {
106 | margin-left: 10px;
107 | cursor: pointer;
108 | }
109 |
110 | .checkbox:checked + .list-text {
111 | text-decoration: line-through;
112 | color: rebeccapurple;
113 | font-style: italic;
114 | font-size: 17px;
115 | font-weight: 500;
116 | }
117 |
118 | .clear-btn {
119 | padding: 15px 20px;
120 | cursor: pointer;
121 | border: none;
122 | margin-top: -9px;
123 | background-color: rgb(189, 189, 189);
124 | font-size: 20px;
125 | }
126 |
--------------------------------------------------------------------------------
/.github/workflows/linters.yml:
--------------------------------------------------------------------------------
1 | name: Linters
2 |
3 | on: pull_request
4 |
5 | env:
6 | FORCE_COLOR: 1
7 |
8 | jobs:
9 | lighthouse:
10 | name: Lighthouse
11 | runs-on: ubuntu-22.04
12 | steps:
13 | - uses: actions/checkout@v2
14 | - uses: actions/setup-node@v1
15 | with:
16 | node-version: "12.x"
17 | - name: Setup Lighthouse
18 | run: npm install -g @lhci/cli@0.7.x
19 | - name: Lighthouse Report
20 | run: lhci autorun --upload.target=temporary-public-storage --collect.staticDistDir=.
21 | webhint:
22 | name: Webhint
23 | runs-on: ubuntu-22.04
24 | steps:
25 | - uses: actions/checkout@v2
26 | - uses: actions/setup-node@v1
27 | with:
28 | node-version: "18.x"
29 | - name: Setup Webhint
30 | run: |
31 | npm install --save-dev hint@7.x
32 | [ -f .hintrc ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.hintrc
33 | - name: Webhint Report
34 | run: npx hint .
35 | stylelint:
36 | name: Stylelint
37 | runs-on: ubuntu-22.04
38 | steps:
39 | - uses: actions/checkout@v2
40 | - uses: actions/setup-node@v1
41 | with:
42 | node-version: "18.x"
43 | - name: Setup Stylelint
44 | run: |
45 | npm install --save-dev stylelint@13.x stylelint-scss@3.x stylelint-config-standard@21.x stylelint-csstree-validator@1.x
46 | [ -f .stylelintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.stylelintrc.json
47 | - name: Stylelint Report
48 | run: npx stylelint "**/*.{css,scss}"
49 | eslint:
50 | name: ESLint
51 | runs-on: ubuntu-22.04
52 | steps:
53 | - uses: actions/checkout@v2
54 | - uses: actions/setup-node@v1
55 | with:
56 | node-version: "18.x"
57 | - name: Setup ESLint
58 | run: |
59 | npm install --save-dev eslint@7.x eslint-config-airbnb-base@14.x eslint-plugin-import@2.x babel-eslint@10.x
60 | [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.eslintrc.json
61 | - name: ESLint Report
62 | run: npx eslint .
63 | nodechecker:
64 | name: node_modules checker
65 | runs-on: ubuntu-22.04
66 | steps:
67 | - uses: actions/checkout@v2
68 | - name: Check node_modules existence
69 | run: |
70 | if [ -d "node_modules/" ]; then echo -e "\e[1;31mThe node_modules/ folder was pushed to the repo. Please remove it from the GitHub repository and try again."; echo -e "\e[1;32mYou can set up a .gitignore file with this folder included on it to prevent this from happening in the future." && exit 1; fi
--------------------------------------------------------------------------------
/src/modules/CRUD.js:
--------------------------------------------------------------------------------
1 | import { listContainer, displaytasks, tasks } from './display.js';
2 |
3 | const form = document.querySelector('.form');
4 | const todoInput = document.querySelector('#todo-input');
5 | const arrow = document.querySelector('.arrow-img');
6 | /* eslint-disable no-use-before-define */
7 | form.addEventListener('submit', (e) => {
8 | e.preventDefault();
9 | saveTodo();
10 | displaytasks();
11 | localStorage.setItem('tasks', JSON.stringify(tasks));
12 | });
13 |
14 | arrow.addEventListener('click', () => {
15 | saveTodo();
16 | displaytasks();
17 | localStorage.setItem('tasks', JSON.stringify(tasks));
18 | });
19 |
20 | // Save todo function
21 | const saveTodo = (todoIndex = null, todoValue = todoInput.value) => {
22 | if (todoIndex !== null) {
23 | tasks[todoIndex].description = todoValue;
24 | } else {
25 | const index = tasks.length + 1;
26 | tasks.push({
27 | description: todoValue,
28 | completed: false,
29 | index,
30 | });
31 | }
32 |
33 | todoInput.value = '';
34 | };
35 |
36 | // eventlistener for all Tasks
37 | listContainer.addEventListener('click', (e) => {
38 | const { target } = e;
39 | const parentElement = target.parentNode;
40 | if (parentElement.className !== 'todo') {
41 | return;
42 | }
43 | // todo id
44 | const todo = parentElement;
45 | const todoId = Number(todo.id);
46 | // target action
47 | const actions = target.dataset.action;
48 | if (actions === 'edit') {
49 | editTodo(todoId);
50 | } else if (actions === 'delete') {
51 | deleteTodo(todoId);
52 | } else if (actions === 'check') {
53 | checkTodo(todoId);
54 | }
55 | });
56 |
57 | const editTodo = (todoId) => {
58 | const container = document.getElementById(todoId);
59 | const taskDescription = container.querySelector('.list-text');
60 | const editIcon = container.querySelector('.Edit');
61 | const deleteIcon = container.querySelector('.delete');
62 | taskDescription.contentEditable = true;
63 | taskDescription.focus();
64 | editIcon.classList.add('hide');
65 | deleteIcon.classList.add('show');
66 | taskDescription.addEventListener('keydown', (e) => {
67 | if (e.key === 'Enter') {
68 | e.preventDefault();
69 | saveTodo(todoId - 1, taskDescription.textContent);
70 | displaytasks();
71 | localStorage.setItem('tasks', JSON.stringify(tasks));
72 | taskDescription.contentEditable = false;
73 | editIcon.classList.remove('hide');
74 | deleteIcon.classList.remove('show');
75 | }
76 | });
77 | };
78 |
79 | const deleteTodo = (todoId) => {
80 | tasks.splice(todoId - 1, 1); // remove one element at index todoId - 1
81 | const todoElement = document.getElementById(todoId);
82 | todoElement.parentNode.removeChild(todoElement);
83 | for (let i = 0; i < tasks.length; i += 1) {
84 | tasks[i].index = i + 1;
85 | }
86 | displaytasks();
87 | localStorage.setItem('tasks', JSON.stringify(tasks));
88 | };
89 |
90 | function checkTodo(todoId) {
91 | tasks.forEach((todo, index) => {
92 | if (index === todoId - 1) {
93 | todo.completed = !todo.completed;
94 | }
95 | });
96 | displaytasks();
97 | localStorage.setItem('tasks', JSON.stringify(tasks));
98 | }
99 |
100 | const btnClear = document.querySelector('.clear-btn');
101 | btnClear.addEventListener('click', () => {
102 | const incompleteTasks = tasks.filter((todo) => !todo.completed);
103 | tasks.length = 0; // clear the original tasks array
104 | tasks.push(...incompleteTasks); // add the incomplete tasks back to the original array
105 | for (let i = 0; i < tasks.length; i += 1) {
106 | tasks[i].index = i + 1;
107 | }
108 | displaytasks();
109 | localStorage.setItem('tasks', JSON.stringify(tasks));
110 | });
111 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
TO-DO-List-App
7 |
8 |
9 |
10 |
11 |
12 | # 📗 Table of Contents
13 |
14 | - [📖 About the Project](#about-project)
15 | - [🛠 Built With](#built-with)
16 | - [Tech Stack](#tech-stack)
17 | - [Key Features](#key-features)
18 | - [🚀 Live Demo](#live-demo)
19 | - [💻 Getting Started](#getting-started)
20 | - [Setup](#setup)
21 | - [Prerequisites](#prerequisites)
22 | - [Install](#install)
23 | - [Run tests](#run-tests)
24 | - [👥 Authors](#authors)
25 | - [🔭 Future Features](#future-features)
26 | - [🤝 Contributing](#contributing)
27 | - [⭐️ Show your support](#support)
28 | - [🙏 Acknowledgements](#acknowledgements)
29 | - [📝 License](#license)
30 |
31 | # 📖 [To-Do-list]
32 |
33 | >To do list application helps you to manage your daily task effectively and let you reserve your schedule and daily plan.
34 |
35 | **[To-do-list-project]**
36 |
37 | ## 🛠 Built With
38 |
39 | ### Tech Stack
40 |
41 |
42 |
43 | Client
44 |
50 |
51 |
52 | ### Key Features
53 |
54 | - **[Github Flow execution]**
55 |
56 | - **[Implement both Mobile and desktop version]**
57 |
58 | (back to top )
59 |
60 |
61 | ## 🚀 Live Demo
62 |
63 | - [Live Demo Link](https://saluumaa.github.io/To-do-List/dist/)
64 |
65 | (back to top )
66 |
67 | ## 💻 Getting Started
68 |
69 | To get a local copy up and running, follow these steps.
70 |
71 | ### Prerequisites
72 |
73 | In order to run this project you need:
74 |
75 | ### Setup
76 |
77 | Clone this repository to your desired folder:
78 | Use Terminal:
79 |
80 | cd my-folder
81 |
82 | git clone git@github.com:saluumaa/Saluma-s-Portfolio.git
83 |
84 | ### Install
85 |
86 | Install this project with:
87 |
88 | cd my-project
89 |
90 | npm install
91 |
92 |
93 | ### Run tests
94 |
95 | To run tests, run the following command:
96 |
97 | Npx hint . for testing the html file errors
98 |
99 | npx stylelint "**/*.{css,scss}" to check errors for CSS file.
100 |
101 |
102 | (back to top )
103 |
104 |
105 | ## 👥 Authors
106 |
107 | 👤 **Saluuma Hassan**
108 |
109 | - GitHub: [@Saluumaa](https://github.com/saluumaa)
110 | - Twitter: [@SalmaHIbrahim20](https://twitter.com/SalmaHIbrahim20)
111 | - LinkedIn: [Salma ibrahim](https://www.linkedin.com/in/salma-ibrahim-78bb5a14a/)
112 |
113 | (back to top )
114 |
115 |
116 | ## 🔭 Future Features
117 |
118 | - [ ] **[drag and drop tasks]**
119 |
120 | (back to top )
121 |
122 |
123 | ## 🤝 Contributing
124 |
125 | Contributions, issues, and feature requests are welcome!
126 |
127 | Feel free to check the [issues page](../../issues/).
128 |
129 | (back to top )
130 |
131 |
132 | ## ⭐️ Show your support
133 |
134 | Please give a ⭐️ if you like this project
135 |
136 | (back to top )
137 |
138 |
139 | ## 🙏 Acknowledgments
140 |
141 | I would like to thank everyone contributed the completion of this project
142 |
143 | (back to top )
144 |
145 |
146 | ## 📝 License
147 | This project is [MIT](./LICENSE.md) licensed.
148 | (back to top )
149 |
--------------------------------------------------------------------------------
/dist/runtime.bundle.js:
--------------------------------------------------------------------------------
1 | /******/ (() => { // webpackBootstrap
2 | /******/ "use strict";
3 | /******/ var __webpack_modules__ = ({});
4 | /************************************************************************/
5 | /******/ // The module cache
6 | /******/ var __webpack_module_cache__ = {};
7 | /******/
8 | /******/ // The require function
9 | /******/ function __webpack_require__(moduleId) {
10 | /******/ // Check if module is in cache
11 | /******/ var cachedModule = __webpack_module_cache__[moduleId];
12 | /******/ if (cachedModule !== undefined) {
13 | /******/ return cachedModule.exports;
14 | /******/ }
15 | /******/ // Create a new module (and put it into the cache)
16 | /******/ var module = __webpack_module_cache__[moduleId] = {
17 | /******/ id: moduleId,
18 | /******/ // no module.loaded needed
19 | /******/ exports: {}
20 | /******/ };
21 | /******/
22 | /******/ // Execute the module function
23 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
24 | /******/
25 | /******/ // Return the exports of the module
26 | /******/ return module.exports;
27 | /******/ }
28 | /******/
29 | /******/ // expose the modules object (__webpack_modules__)
30 | /******/ __webpack_require__.m = __webpack_modules__;
31 | /******/
32 | /************************************************************************/
33 | /******/ /* webpack/runtime/chunk loaded */
34 | /******/ (() => {
35 | /******/ var deferred = [];
36 | /******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
37 | /******/ if(chunkIds) {
38 | /******/ priority = priority || 0;
39 | /******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
40 | /******/ deferred[i] = [chunkIds, fn, priority];
41 | /******/ return;
42 | /******/ }
43 | /******/ var notFulfilled = Infinity;
44 | /******/ for (var i = 0; i < deferred.length; i++) {
45 | /******/ var [chunkIds, fn, priority] = deferred[i];
46 | /******/ var fulfilled = true;
47 | /******/ for (var j = 0; j < chunkIds.length; j++) {
48 | /******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
49 | /******/ chunkIds.splice(j--, 1);
50 | /******/ } else {
51 | /******/ fulfilled = false;
52 | /******/ if(priority < notFulfilled) notFulfilled = priority;
53 | /******/ }
54 | /******/ }
55 | /******/ if(fulfilled) {
56 | /******/ deferred.splice(i--, 1)
57 | /******/ var r = fn();
58 | /******/ if (r !== undefined) result = r;
59 | /******/ }
60 | /******/ }
61 | /******/ return result;
62 | /******/ };
63 | /******/ })();
64 | /******/
65 | /******/ /* webpack/runtime/compat get default export */
66 | /******/ (() => {
67 | /******/ // getDefaultExport function for compatibility with non-harmony modules
68 | /******/ __webpack_require__.n = (module) => {
69 | /******/ var getter = module && module.__esModule ?
70 | /******/ () => (module['default']) :
71 | /******/ () => (module);
72 | /******/ __webpack_require__.d(getter, { a: getter });
73 | /******/ return getter;
74 | /******/ };
75 | /******/ })();
76 | /******/
77 | /******/ /* webpack/runtime/define property getters */
78 | /******/ (() => {
79 | /******/ // define getter functions for harmony exports
80 | /******/ __webpack_require__.d = (exports, definition) => {
81 | /******/ for(var key in definition) {
82 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
83 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
84 | /******/ }
85 | /******/ }
86 | /******/ };
87 | /******/ })();
88 | /******/
89 | /******/ /* webpack/runtime/hasOwnProperty shorthand */
90 | /******/ (() => {
91 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
92 | /******/ })();
93 | /******/
94 | /******/ /* webpack/runtime/make namespace object */
95 | /******/ (() => {
96 | /******/ // define __esModule on exports
97 | /******/ __webpack_require__.r = (exports) => {
98 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
99 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
100 | /******/ }
101 | /******/ Object.defineProperty(exports, '__esModule', { value: true });
102 | /******/ };
103 | /******/ })();
104 | /******/
105 | /******/ /* webpack/runtime/jsonp chunk loading */
106 | /******/ (() => {
107 | /******/ // no baseURI
108 | /******/
109 | /******/ // object to store loaded and loading chunks
110 | /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
111 | /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
112 | /******/ var installedChunks = {
113 | /******/ "runtime": 0
114 | /******/ };
115 | /******/
116 | /******/ // no chunk on demand loading
117 | /******/
118 | /******/ // no prefetching
119 | /******/
120 | /******/ // no preloaded
121 | /******/
122 | /******/ // no HMR
123 | /******/
124 | /******/ // no HMR manifest
125 | /******/
126 | /******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);
127 | /******/
128 | /******/ // install a JSONP callback for chunk loading
129 | /******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
130 | /******/ var [chunkIds, moreModules, runtime] = data;
131 | /******/ // add "moreModules" to the modules object,
132 | /******/ // then flag all "chunkIds" as loaded and fire callback
133 | /******/ var moduleId, chunkId, i = 0;
134 | /******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
135 | /******/ for(moduleId in moreModules) {
136 | /******/ if(__webpack_require__.o(moreModules, moduleId)) {
137 | /******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
138 | /******/ }
139 | /******/ }
140 | /******/ if(runtime) var result = runtime(__webpack_require__);
141 | /******/ }
142 | /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
143 | /******/ for(;i < chunkIds.length; i++) {
144 | /******/ chunkId = chunkIds[i];
145 | /******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
146 | /******/ installedChunks[chunkId][0]();
147 | /******/ }
148 | /******/ installedChunks[chunkId] = 0;
149 | /******/ }
150 | /******/ return __webpack_require__.O(result);
151 | /******/ }
152 | /******/
153 | /******/ var chunkLoadingGlobal = self["webpackChunkto_do_list"] = self["webpackChunkto_do_list"] || [];
154 | /******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
155 | /******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
156 | /******/ })();
157 | /******/
158 | /******/ /* webpack/runtime/nonce */
159 | /******/ (() => {
160 | /******/ __webpack_require__.nc = undefined;
161 | /******/ })();
162 | /******/
163 | /************************************************************************/
164 | /******/
165 | /******/
166 | /******/ })()
167 | ;
168 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5idW5kbGUuanMiLCJtYXBwaW5ncyI6Ijs7OztVQUFBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7Ozs7V0N6QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSwrQkFBK0Isd0NBQXdDO1dBQ3ZFO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsaUJBQWlCLHFCQUFxQjtXQUN0QztXQUNBO1dBQ0Esa0JBQWtCLHFCQUFxQjtXQUN2QztXQUNBO1dBQ0EsS0FBSztXQUNMO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7O1dDTkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLE1BQU0scUJBQXFCO1dBQzNCO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7V0FDQTtXQUNBOzs7OztXQ2hEQSIsInNvdXJjZXMiOlsid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC93ZWJwYWNrL3J1bnRpbWUvY2h1bmsgbG9hZGVkIiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly90by1kby1saXN0L3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly90by1kby1saXN0L3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly90by1kby1saXN0L3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsInZhciBkZWZlcnJlZCA9IFtdO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5PID0gKHJlc3VsdCwgY2h1bmtJZHMsIGZuLCBwcmlvcml0eSkgPT4ge1xuXHRpZihjaHVua0lkcykge1xuXHRcdHByaW9yaXR5ID0gcHJpb3JpdHkgfHwgMDtcblx0XHRmb3IodmFyIGkgPSBkZWZlcnJlZC5sZW5ndGg7IGkgPiAwICYmIGRlZmVycmVkW2kgLSAxXVsyXSA+IHByaW9yaXR5OyBpLS0pIGRlZmVycmVkW2ldID0gZGVmZXJyZWRbaSAtIDFdO1xuXHRcdGRlZmVycmVkW2ldID0gW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldO1xuXHRcdHJldHVybjtcblx0fVxuXHR2YXIgbm90RnVsZmlsbGVkID0gSW5maW5pdHk7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWQubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldID0gZGVmZXJyZWRbaV07XG5cdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjaHVua0lkcy5sZW5ndGg7IGorKykge1xuXHRcdFx0aWYgKChwcmlvcml0eSAmIDEgPT09IDAgfHwgbm90RnVsZmlsbGVkID49IHByaW9yaXR5KSAmJiBPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLk8pLmV2ZXJ5KChrZXkpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fLk9ba2V5XShjaHVua0lkc1tqXSkpKSkge1xuXHRcdFx0XHRjaHVua0lkcy5zcGxpY2Uoai0tLCAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZ1bGZpbGxlZCA9IGZhbHNlO1xuXHRcdFx0XHRpZihwcmlvcml0eSA8IG5vdEZ1bGZpbGxlZCkgbm90RnVsZmlsbGVkID0gcHJpb3JpdHk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKGZ1bGZpbGxlZCkge1xuXHRcdFx0ZGVmZXJyZWQuc3BsaWNlKGktLSwgMSlcblx0XHRcdHZhciByID0gZm4oKTtcblx0XHRcdGlmIChyICE9PSB1bmRlZmluZWQpIHJlc3VsdCA9IHI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59OyIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcInJ1bnRpbWVcIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuX193ZWJwYWNrX3JlcXVpcmVfXy5PLmogPSAoY2h1bmtJZCkgPT4gKGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9PT0gMCk7XG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rdG9fZG9fbGlzdFwiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmt0b19kb19saXN0XCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsIiIsIiIsIiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
--------------------------------------------------------------------------------
/dist/index.bundle.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | (self["webpackChunkto_do_list"] = self["webpackChunkto_do_list"] || []).push([["index"],{
3 |
4 | /***/ "./node_modules/css-loader/dist/cjs.js!./src/style.css":
5 | /*!*************************************************************!*\
6 | !*** ./node_modules/css-loader/dist/cjs.js!./src/style.css ***!
7 | \*************************************************************/
8 | /***/ ((module, __webpack_exports__, __webpack_require__) => {
9 |
10 | __webpack_require__.r(__webpack_exports__);
11 | /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
13 | /* harmony export */ });
14 | /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
15 | /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
16 | /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
17 | /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
18 | // Imports
19 |
20 |
21 | var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
22 | ___CSS_LOADER_EXPORT___.push([module.id, "@import url(https://fonts.googleapis.com/css2?family=Dancing+Script&family=Lato&family=Nunito:ital,wght@0,200;0,300;0,500;0,600;0,700;1,200;1,300;1,700;1,900&family=Poppins:wght@300&family=Roboto:ital,wght@0,300;0,500;0,700;1,300;1,400;1,500&display=swap);"]);
23 | // Module
24 | ___CSS_LOADER_EXPORT___.push([module.id, "* {\r\n padding: 0;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\nbody {\r\n font-family: 'Roboto', sans-serif;\r\n font-size: 16px;\r\n}\r\n\r\n.container {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n width: 80%;\r\n position: relative;\r\n margin: 80px auto;\r\n background-color: rgb(231, 230, 230);\r\n}\r\n\r\n.header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 10px 10px;\r\n border-bottom: 2px solid rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n.header p {\r\n font-size: 18px;\r\n font-weight: 600;\r\n}\r\n\r\n.arrow-img {\r\n font-size: 30px;\r\n color: rgba(0, 0, 0, 0.7);\r\n cursor: pointer;\r\n}\r\n\r\n.form {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 10px 10px;\r\n border-bottom: 2px solid rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n#todo-input {\r\n width: 90%;\r\n padding-top: 5px;\r\n padding-bottom: 5px;\r\n background-color: inherit;\r\n border: none;\r\n outline: none;\r\n}\r\n\r\ninput::placeholder {\r\n font-style: italic;\r\n font-weight: 500;\r\n}\r\n\r\n.to-do-holder {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n padding: 10px 0;\r\n}\r\n\r\n.todo {\r\n display: flex;\r\n gap: 10px;\r\n padding-top: 13px;\r\n font-weight: 400;\r\n padding-bottom: 7px;\r\n border-bottom: 2px solid rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.Edit,\r\n.delete {\r\n margin-left: 100%;\r\n position: absolute;\r\n right: 10px;\r\n cursor: pointer;\r\n font-size: 24px;\r\n}\r\n\r\n.delete {\r\n display: none;\r\n}\r\n\r\ni.show {\r\n display: flex;\r\n}\r\n\r\ni.hide {\r\n display: none;\r\n}\r\n\r\n.list-text {\r\n outline: none;\r\n}\r\n\r\n.checkbox {\r\n margin-left: 10px;\r\n cursor: pointer;\r\n}\r\n\r\n.checkbox:checked + .list-text {\r\n text-decoration: line-through;\r\n color: rebeccapurple;\r\n font-style: italic;\r\n font-size: 17px;\r\n font-weight: 500;\r\n}\r\n\r\n.clear-btn {\r\n padding: 15px 20px;\r\n cursor: pointer;\r\n border: none;\r\n margin-top: -9px;\r\n background-color: rgb(189, 189, 189);\r\n font-size: 20px;\r\n}\r\n", "",{"version":3,"sources":["webpack://./src/style.css"],"names":[],"mappings":"AAEA;EACE,UAAU;EACV,SAAS;EACT,sBAAsB;AACxB;;AAEA;EACE,iCAAiC;EACjC,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;EAC9B,UAAU;EACV,kBAAkB;EAClB,iBAAiB;EACjB,oCAAoC;AACtC;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,kBAAkB;EAClB,2CAA2C;AAC7C;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,yBAAyB;EACzB,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,kBAAkB;EAClB,2CAA2C;AAC7C;;AAEA;EACE,UAAU;EACV,gBAAgB;EAChB,mBAAmB;EACnB,yBAAyB;EACzB,YAAY;EACZ,aAAa;AACf;;AAEA;EACE,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;EAC9B,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,SAAS;EACT,iBAAiB;EACjB,gBAAgB;EAChB,mBAAmB;EACnB,2CAA2C;AAC7C;;AAEA;;EAEE,iBAAiB;EACjB,kBAAkB;EAClB,WAAW;EACX,eAAe;EACf,eAAe;AACjB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,6BAA6B;EAC7B,oBAAoB;EACpB,kBAAkB;EAClB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,eAAe;EACf,YAAY;EACZ,gBAAgB;EAChB,oCAAoC;EACpC,eAAe;AACjB","sourcesContent":["@import url('https://fonts.googleapis.com/css2?family=Dancing+Script&family=Lato&family=Nunito:ital,wght@0,200;0,300;0,500;0,600;0,700;1,200;1,300;1,700;1,900&family=Poppins:wght@300&family=Roboto:ital,wght@0,300;0,500;0,700;1,300;1,400;1,500&display=swap');\r\n\r\n* {\r\n padding: 0;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\nbody {\r\n font-family: 'Roboto', sans-serif;\r\n font-size: 16px;\r\n}\r\n\r\n.container {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n width: 80%;\r\n position: relative;\r\n margin: 80px auto;\r\n background-color: rgb(231, 230, 230);\r\n}\r\n\r\n.header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 10px 10px;\r\n border-bottom: 2px solid rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n.header p {\r\n font-size: 18px;\r\n font-weight: 600;\r\n}\r\n\r\n.arrow-img {\r\n font-size: 30px;\r\n color: rgba(0, 0, 0, 0.7);\r\n cursor: pointer;\r\n}\r\n\r\n.form {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 10px 10px;\r\n border-bottom: 2px solid rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n#todo-input {\r\n width: 90%;\r\n padding-top: 5px;\r\n padding-bottom: 5px;\r\n background-color: inherit;\r\n border: none;\r\n outline: none;\r\n}\r\n\r\ninput::placeholder {\r\n font-style: italic;\r\n font-weight: 500;\r\n}\r\n\r\n.to-do-holder {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n padding: 10px 0;\r\n}\r\n\r\n.todo {\r\n display: flex;\r\n gap: 10px;\r\n padding-top: 13px;\r\n font-weight: 400;\r\n padding-bottom: 7px;\r\n border-bottom: 2px solid rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.Edit,\r\n.delete {\r\n margin-left: 100%;\r\n position: absolute;\r\n right: 10px;\r\n cursor: pointer;\r\n font-size: 24px;\r\n}\r\n\r\n.delete {\r\n display: none;\r\n}\r\n\r\ni.show {\r\n display: flex;\r\n}\r\n\r\ni.hide {\r\n display: none;\r\n}\r\n\r\n.list-text {\r\n outline: none;\r\n}\r\n\r\n.checkbox {\r\n margin-left: 10px;\r\n cursor: pointer;\r\n}\r\n\r\n.checkbox:checked + .list-text {\r\n text-decoration: line-through;\r\n color: rebeccapurple;\r\n font-style: italic;\r\n font-size: 17px;\r\n font-weight: 500;\r\n}\r\n\r\n.clear-btn {\r\n padding: 15px 20px;\r\n cursor: pointer;\r\n border: none;\r\n margin-top: -9px;\r\n background-color: rgb(189, 189, 189);\r\n font-size: 20px;\r\n}\r\n"],"sourceRoot":""}]);
25 | // Exports
26 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
27 |
28 |
29 | /***/ }),
30 |
31 | /***/ "./node_modules/css-loader/dist/runtime/api.js":
32 | /*!*****************************************************!*\
33 | !*** ./node_modules/css-loader/dist/runtime/api.js ***!
34 | \*****************************************************/
35 | /***/ ((module) => {
36 |
37 |
38 |
39 | /*
40 | MIT License http://www.opensource.org/licenses/mit-license.php
41 | Author Tobias Koppers @sokra
42 | */
43 | module.exports = function (cssWithMappingToString) {
44 | var list = [];
45 |
46 | // return the list of modules as css string
47 | list.toString = function toString() {
48 | return this.map(function (item) {
49 | var content = "";
50 | var needLayer = typeof item[5] !== "undefined";
51 | if (item[4]) {
52 | content += "@supports (".concat(item[4], ") {");
53 | }
54 | if (item[2]) {
55 | content += "@media ".concat(item[2], " {");
56 | }
57 | if (needLayer) {
58 | content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
59 | }
60 | content += cssWithMappingToString(item);
61 | if (needLayer) {
62 | content += "}";
63 | }
64 | if (item[2]) {
65 | content += "}";
66 | }
67 | if (item[4]) {
68 | content += "}";
69 | }
70 | return content;
71 | }).join("");
72 | };
73 |
74 | // import a list of modules into the list
75 | list.i = function i(modules, media, dedupe, supports, layer) {
76 | if (typeof modules === "string") {
77 | modules = [[null, modules, undefined]];
78 | }
79 | var alreadyImportedModules = {};
80 | if (dedupe) {
81 | for (var k = 0; k < this.length; k++) {
82 | var id = this[k][0];
83 | if (id != null) {
84 | alreadyImportedModules[id] = true;
85 | }
86 | }
87 | }
88 | for (var _k = 0; _k < modules.length; _k++) {
89 | var item = [].concat(modules[_k]);
90 | if (dedupe && alreadyImportedModules[item[0]]) {
91 | continue;
92 | }
93 | if (typeof layer !== "undefined") {
94 | if (typeof item[5] === "undefined") {
95 | item[5] = layer;
96 | } else {
97 | item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
98 | item[5] = layer;
99 | }
100 | }
101 | if (media) {
102 | if (!item[2]) {
103 | item[2] = media;
104 | } else {
105 | item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
106 | item[2] = media;
107 | }
108 | }
109 | if (supports) {
110 | if (!item[4]) {
111 | item[4] = "".concat(supports);
112 | } else {
113 | item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
114 | item[4] = supports;
115 | }
116 | }
117 | list.push(item);
118 | }
119 | };
120 | return list;
121 | };
122 |
123 | /***/ }),
124 |
125 | /***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js":
126 | /*!************************************************************!*\
127 | !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***!
128 | \************************************************************/
129 | /***/ ((module) => {
130 |
131 |
132 |
133 | module.exports = function (item) {
134 | var content = item[1];
135 | var cssMapping = item[3];
136 | if (!cssMapping) {
137 | return content;
138 | }
139 | if (typeof btoa === "function") {
140 | var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));
141 | var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
142 | var sourceMapping = "/*# ".concat(data, " */");
143 | return [content].concat([sourceMapping]).join("\n");
144 | }
145 | return [content].join("\n");
146 | };
147 |
148 | /***/ }),
149 |
150 | /***/ "./src/style.css":
151 | /*!***********************!*\
152 | !*** ./src/style.css ***!
153 | \***********************/
154 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
155 |
156 | __webpack_require__.r(__webpack_exports__);
157 | /* harmony export */ __webpack_require__.d(__webpack_exports__, {
158 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
159 | /* harmony export */ });
160 | /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
161 | /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
162 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
163 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
164 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
165 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
166 | /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
167 | /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
168 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
169 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
170 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
171 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
172 | /* harmony import */ var _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./style.css */ "./node_modules/css-loader/dist/cjs.js!./src/style.css");
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 | var options = {};
185 |
186 | options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
187 | options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
188 |
189 | options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
190 |
191 | options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
192 | options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
193 |
194 | var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
195 |
196 |
197 |
198 |
199 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
200 |
201 |
202 | /***/ }),
203 |
204 | /***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
205 | /*!****************************************************************************!*\
206 | !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
207 | \****************************************************************************/
208 | /***/ ((module) => {
209 |
210 |
211 |
212 | var stylesInDOM = [];
213 |
214 | function getIndexByIdentifier(identifier) {
215 | var result = -1;
216 |
217 | for (var i = 0; i < stylesInDOM.length; i++) {
218 | if (stylesInDOM[i].identifier === identifier) {
219 | result = i;
220 | break;
221 | }
222 | }
223 |
224 | return result;
225 | }
226 |
227 | function modulesToDom(list, options) {
228 | var idCountMap = {};
229 | var identifiers = [];
230 |
231 | for (var i = 0; i < list.length; i++) {
232 | var item = list[i];
233 | var id = options.base ? item[0] + options.base : item[0];
234 | var count = idCountMap[id] || 0;
235 | var identifier = "".concat(id, " ").concat(count);
236 | idCountMap[id] = count + 1;
237 | var indexByIdentifier = getIndexByIdentifier(identifier);
238 | var obj = {
239 | css: item[1],
240 | media: item[2],
241 | sourceMap: item[3],
242 | supports: item[4],
243 | layer: item[5]
244 | };
245 |
246 | if (indexByIdentifier !== -1) {
247 | stylesInDOM[indexByIdentifier].references++;
248 | stylesInDOM[indexByIdentifier].updater(obj);
249 | } else {
250 | var updater = addElementStyle(obj, options);
251 | options.byIndex = i;
252 | stylesInDOM.splice(i, 0, {
253 | identifier: identifier,
254 | updater: updater,
255 | references: 1
256 | });
257 | }
258 |
259 | identifiers.push(identifier);
260 | }
261 |
262 | return identifiers;
263 | }
264 |
265 | function addElementStyle(obj, options) {
266 | var api = options.domAPI(options);
267 | api.update(obj);
268 |
269 | var updater = function updater(newObj) {
270 | if (newObj) {
271 | if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
272 | return;
273 | }
274 |
275 | api.update(obj = newObj);
276 | } else {
277 | api.remove();
278 | }
279 | };
280 |
281 | return updater;
282 | }
283 |
284 | module.exports = function (list, options) {
285 | options = options || {};
286 | list = list || [];
287 | var lastIdentifiers = modulesToDom(list, options);
288 | return function update(newList) {
289 | newList = newList || [];
290 |
291 | for (var i = 0; i < lastIdentifiers.length; i++) {
292 | var identifier = lastIdentifiers[i];
293 | var index = getIndexByIdentifier(identifier);
294 | stylesInDOM[index].references--;
295 | }
296 |
297 | var newLastIdentifiers = modulesToDom(newList, options);
298 |
299 | for (var _i = 0; _i < lastIdentifiers.length; _i++) {
300 | var _identifier = lastIdentifiers[_i];
301 |
302 | var _index = getIndexByIdentifier(_identifier);
303 |
304 | if (stylesInDOM[_index].references === 0) {
305 | stylesInDOM[_index].updater();
306 |
307 | stylesInDOM.splice(_index, 1);
308 | }
309 | }
310 |
311 | lastIdentifiers = newLastIdentifiers;
312 | };
313 | };
314 |
315 | /***/ }),
316 |
317 | /***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js":
318 | /*!********************************************************************!*\
319 | !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***!
320 | \********************************************************************/
321 | /***/ ((module) => {
322 |
323 |
324 |
325 | var memo = {};
326 | /* istanbul ignore next */
327 |
328 | function getTarget(target) {
329 | if (typeof memo[target] === "undefined") {
330 | var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself
331 |
332 | if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
333 | try {
334 | // This will throw an exception if access to iframe is blocked
335 | // due to cross-origin restrictions
336 | styleTarget = styleTarget.contentDocument.head;
337 | } catch (e) {
338 | // istanbul ignore next
339 | styleTarget = null;
340 | }
341 | }
342 |
343 | memo[target] = styleTarget;
344 | }
345 |
346 | return memo[target];
347 | }
348 | /* istanbul ignore next */
349 |
350 |
351 | function insertBySelector(insert, style) {
352 | var target = getTarget(insert);
353 |
354 | if (!target) {
355 | throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
356 | }
357 |
358 | target.appendChild(style);
359 | }
360 |
361 | module.exports = insertBySelector;
362 |
363 | /***/ }),
364 |
365 | /***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js":
366 | /*!**********************************************************************!*\
367 | !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***!
368 | \**********************************************************************/
369 | /***/ ((module) => {
370 |
371 |
372 |
373 | /* istanbul ignore next */
374 | function insertStyleElement(options) {
375 | var element = document.createElement("style");
376 | options.setAttributes(element, options.attributes);
377 | options.insert(element, options.options);
378 | return element;
379 | }
380 |
381 | module.exports = insertStyleElement;
382 |
383 | /***/ }),
384 |
385 | /***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js":
386 | /*!**********************************************************************************!*\
387 | !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***!
388 | \**********************************************************************************/
389 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
390 |
391 |
392 |
393 | /* istanbul ignore next */
394 | function setAttributesWithoutAttributes(styleElement) {
395 | var nonce = true ? __webpack_require__.nc : 0;
396 |
397 | if (nonce) {
398 | styleElement.setAttribute("nonce", nonce);
399 | }
400 | }
401 |
402 | module.exports = setAttributesWithoutAttributes;
403 |
404 | /***/ }),
405 |
406 | /***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js":
407 | /*!***************************************************************!*\
408 | !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***!
409 | \***************************************************************/
410 | /***/ ((module) => {
411 |
412 |
413 |
414 | /* istanbul ignore next */
415 | function apply(styleElement, options, obj) {
416 | var css = "";
417 |
418 | if (obj.supports) {
419 | css += "@supports (".concat(obj.supports, ") {");
420 | }
421 |
422 | if (obj.media) {
423 | css += "@media ".concat(obj.media, " {");
424 | }
425 |
426 | var needLayer = typeof obj.layer !== "undefined";
427 |
428 | if (needLayer) {
429 | css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
430 | }
431 |
432 | css += obj.css;
433 |
434 | if (needLayer) {
435 | css += "}";
436 | }
437 |
438 | if (obj.media) {
439 | css += "}";
440 | }
441 |
442 | if (obj.supports) {
443 | css += "}";
444 | }
445 |
446 | var sourceMap = obj.sourceMap;
447 |
448 | if (sourceMap && typeof btoa !== "undefined") {
449 | css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
450 | } // For old IE
451 |
452 | /* istanbul ignore if */
453 |
454 |
455 | options.styleTagTransform(css, styleElement, options.options);
456 | }
457 |
458 | function removeStyleElement(styleElement) {
459 | // istanbul ignore if
460 | if (styleElement.parentNode === null) {
461 | return false;
462 | }
463 |
464 | styleElement.parentNode.removeChild(styleElement);
465 | }
466 | /* istanbul ignore next */
467 |
468 |
469 | function domAPI(options) {
470 | var styleElement = options.insertStyleElement(options);
471 | return {
472 | update: function update(obj) {
473 | apply(styleElement, options, obj);
474 | },
475 | remove: function remove() {
476 | removeStyleElement(styleElement);
477 | }
478 | };
479 | }
480 |
481 | module.exports = domAPI;
482 |
483 | /***/ }),
484 |
485 | /***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js":
486 | /*!*********************************************************************!*\
487 | !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***!
488 | \*********************************************************************/
489 | /***/ ((module) => {
490 |
491 |
492 |
493 | /* istanbul ignore next */
494 | function styleTagTransform(css, styleElement) {
495 | if (styleElement.styleSheet) {
496 | styleElement.styleSheet.cssText = css;
497 | } else {
498 | while (styleElement.firstChild) {
499 | styleElement.removeChild(styleElement.firstChild);
500 | }
501 |
502 | styleElement.appendChild(document.createTextNode(css));
503 | }
504 | }
505 |
506 | module.exports = styleTagTransform;
507 |
508 | /***/ }),
509 |
510 | /***/ "./src/index.js":
511 | /*!**********************!*\
512 | !*** ./src/index.js ***!
513 | \**********************/
514 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
515 |
516 | __webpack_require__.r(__webpack_exports__);
517 | /* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style.css */ "./src/style.css");
518 | /* harmony import */ var _modules_CRUD_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/CRUD.js */ "./src/modules/CRUD.js");
519 | /* harmony import */ var _modules_display_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/display.js */ "./src/modules/display.js");
520 |
521 |
522 |
523 |
524 |
525 | /***/ }),
526 |
527 | /***/ "./src/modules/CRUD.js":
528 | /*!*****************************!*\
529 | !*** ./src/modules/CRUD.js ***!
530 | \*****************************/
531 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
532 |
533 | __webpack_require__.r(__webpack_exports__);
534 | /* harmony import */ var _display_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./display.js */ "./src/modules/display.js");
535 |
536 |
537 | const form = document.querySelector('.form');
538 | const todoInput = document.querySelector('#todo-input');
539 | const arrow = document.querySelector('.arrow-img');
540 | /* eslint-disable no-use-before-define */
541 | form.addEventListener('submit', (e) => {
542 | e.preventDefault();
543 | saveTodo();
544 | (0,_display_js__WEBPACK_IMPORTED_MODULE_0__.displaytasks)();
545 | localStorage.setItem('tasks', JSON.stringify(_display_js__WEBPACK_IMPORTED_MODULE_0__.tasks));
546 | });
547 |
548 | arrow.addEventListener('click', () => {
549 | saveTodo();
550 | (0,_display_js__WEBPACK_IMPORTED_MODULE_0__.displaytasks)();
551 | localStorage.setItem('tasks', JSON.stringify(_display_js__WEBPACK_IMPORTED_MODULE_0__.tasks));
552 | });
553 |
554 | // Save todo function
555 | const saveTodo = (todoIndex = null, todoValue = todoInput.value) => {
556 | if (todoIndex !== null) {
557 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks[todoIndex].description = todoValue;
558 | } else {
559 | const index = _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.length + 1;
560 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.push({
561 | description: todoValue,
562 | completed: false,
563 | index,
564 | });
565 | }
566 |
567 | todoInput.value = '';
568 | };
569 |
570 | // eventlistener for all Tasks
571 | _display_js__WEBPACK_IMPORTED_MODULE_0__.listContainer.addEventListener('click', (e) => {
572 | const { target } = e;
573 | const parentElement = target.parentNode;
574 | if (parentElement.className !== 'todo') {
575 | return;
576 | }
577 | // todo id
578 | const todo = parentElement;
579 | const todoId = Number(todo.id);
580 | // target action
581 | const actions = target.dataset.action;
582 | if (actions === 'edit') {
583 | editTodo(todoId);
584 | } else if (actions === 'delete') {
585 | deleteTodo(todoId);
586 | } else if (actions === 'check') {
587 | checkTodo(todoId);
588 | }
589 | });
590 |
591 | const editTodo = (todoId) => {
592 | const container = document.getElementById(todoId);
593 | const taskDescription = container.querySelector('.list-text');
594 | const editIcon = container.querySelector('.Edit');
595 | const deleteIcon = container.querySelector('.delete');
596 | taskDescription.contentEditable = true;
597 | taskDescription.focus();
598 | editIcon.classList.add('hide');
599 | deleteIcon.classList.add('show');
600 | taskDescription.addEventListener('keydown', (e) => {
601 | if (e.key === 'Enter') {
602 | e.preventDefault();
603 | saveTodo(todoId - 1, taskDescription.textContent);
604 | (0,_display_js__WEBPACK_IMPORTED_MODULE_0__.displaytasks)();
605 | localStorage.setItem('tasks', JSON.stringify(_display_js__WEBPACK_IMPORTED_MODULE_0__.tasks));
606 | taskDescription.contentEditable = false;
607 | editIcon.classList.remove('hide');
608 | deleteIcon.classList.remove('show');
609 | }
610 | });
611 | };
612 |
613 | const deleteTodo = (todoId) => {
614 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.splice(todoId - 1, 1); // remove one element at index todoId - 1
615 | const todoElement = document.getElementById(todoId);
616 | todoElement.parentNode.removeChild(todoElement);
617 | for (let i = 0; i < _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.length; i += 1) {
618 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks[i].index = i + 1;
619 | }
620 | (0,_display_js__WEBPACK_IMPORTED_MODULE_0__.displaytasks)();
621 | localStorage.setItem('tasks', JSON.stringify(_display_js__WEBPACK_IMPORTED_MODULE_0__.tasks));
622 | };
623 |
624 | function checkTodo(todoId) {
625 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.forEach((todo, index) => {
626 | if (index === todoId - 1) {
627 | todo.completed = !todo.completed;
628 | }
629 | });
630 | (0,_display_js__WEBPACK_IMPORTED_MODULE_0__.displaytasks)();
631 | localStorage.setItem('tasks', JSON.stringify(_display_js__WEBPACK_IMPORTED_MODULE_0__.tasks));
632 | }
633 |
634 | const btnClear = document.querySelector('.clear-btn');
635 | btnClear.addEventListener('click', () => {
636 | const incompleteTasks = _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.filter((todo) => !todo.completed);
637 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.length = 0; // clear the original tasks array
638 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.push(...incompleteTasks); // add the incomplete tasks back to the original array
639 | for (let i = 0; i < _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks.length; i += 1) {
640 | _display_js__WEBPACK_IMPORTED_MODULE_0__.tasks[i].index = i + 1;
641 | }
642 | (0,_display_js__WEBPACK_IMPORTED_MODULE_0__.displaytasks)();
643 | localStorage.setItem('tasks', JSON.stringify(_display_js__WEBPACK_IMPORTED_MODULE_0__.tasks));
644 | });
645 |
646 |
647 | /***/ }),
648 |
649 | /***/ "./src/modules/display.js":
650 | /*!********************************!*\
651 | !*** ./src/modules/display.js ***!
652 | \********************************/
653 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
654 |
655 | __webpack_require__.r(__webpack_exports__);
656 | /* harmony export */ __webpack_require__.d(__webpack_exports__, {
657 | /* harmony export */ "displaytasks": () => (/* binding */ displaytasks),
658 | /* harmony export */ "listContainer": () => (/* binding */ listContainer),
659 | /* harmony export */ "tasks": () => (/* binding */ tasks)
660 | /* harmony export */ });
661 | const listContainer = document.querySelector('.to-do-holder');
662 | const tasks = JSON.parse(localStorage.getItem('tasks')) || [];
663 | const displaytasks = () => {
664 | listContainer.innerHTML = '';
665 | tasks.forEach((todo) => {
666 | tasks.sort((a, b) => a.index - b.index);
667 | listContainer.innerHTML += `
668 |
669 |
671 |
${todo.description}
672 |
673 |
674 |
675 | `;
676 | });
677 | };
678 |
679 | displaytasks();
680 |
681 | // document.addEventListener('DOMContentLoaded', displaytasks);
682 |
683 | /***/ })
684 |
685 | },
686 | /******/ __webpack_require__ => { // webpackRuntimeModules
687 | /******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
688 | /******/ var __webpack_exports__ = (__webpack_exec__("./src/index.js"));
689 | /******/ }
690 | ]);
691 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUU7QUFDcEMsSUFBSSw4Q0FBSztBQUNUO0FBQ0EsRUFBRSx5REFBWTtBQUNkLCtDQUErQyw4Q0FBSztBQUNwRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdHTTtBQUNBO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxXQUFXO0FBQzNDLG1EQUFtRDtBQUNuRDtBQUNBLHFEQUFxRCxpQkFBaUI7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3RvLWRvLWxpc3QvLi9zcmMvc3R5bGUuY3NzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vc3JjL3N0eWxlLmNzcz83MTYzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vc3JjL21vZHVsZXMvQ1JVRC5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vc3JjL21vZHVsZXMvZGlzcGxheS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PURhbmNpbmcrU2NyaXB0JmZhbWlseT1MYXRvJmZhbWlseT1OdW5pdG86aXRhbCx3Z2h0QDAsMjAwOzAsMzAwOzAsNTAwOzAsNjAwOzAsNzAwOzEsMjAwOzEsMzAwOzEsNzAwOzEsOTAwJmZhbWlseT1Qb3BwaW5zOndnaHRAMzAwJmZhbWlseT1Sb2JvdG86aXRhbCx3Z2h0QDAsMzAwOzAsNTAwOzAsNzAwOzEsMzAwOzEsNDAwOzEsNTAwJmRpc3BsYXk9c3dhcCk7XCJdKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIioge1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcblxcclxcbmJvZHkge1xcclxcbiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC1zaXplOiAxNnB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY29udGFpbmVyIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcclxcbiAgd2lkdGg6IDgwJTtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIG1hcmdpbjogODBweCBhdXRvO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzMSwgMjMwLCAyMzApO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4O1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC40KTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlciBwIHtcXHJcXG4gIGZvbnQtc2l6ZTogMThweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxyXFxufVxcclxcblxcclxcbi5hcnJvdy1pbWcge1xcclxcbiAgZm9udC1zaXplOiAzMHB4O1xcclxcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC43KTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmZvcm0ge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXHJcXG4gIHBhZGRpbmc6IDEwcHggMTBweDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7XFxyXFxufVxcclxcblxcclxcbiN0b2RvLWlucHV0IHtcXHJcXG4gIHdpZHRoOiA5MCU7XFxyXFxuICBwYWRkaW5nLXRvcDogNXB4O1xcclxcbiAgcGFkZGluZy1ib3R0b206IDVweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dDo6cGxhY2Vob2xkZXIge1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbiAgZm9udC13ZWlnaHQ6IDUwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvLWRvLWhvbGRlciB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXHJcXG4gIHBhZGRpbmc6IDEwcHggMDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8ge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGdhcDogMTBweDtcXHJcXG4gIHBhZGRpbmctdG9wOiAxM3B4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXHJcXG4gIHBhZGRpbmctYm90dG9tOiA3cHg7XFxyXFxuICBib3JkZXItYm90dG9tOiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO1xcclxcbn1cXHJcXG5cXHJcXG4uRWRpdCxcXHJcXG4uZGVsZXRlIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAxMDAlO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDEwcHg7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBmb250LXNpemU6IDI0cHg7XFxyXFxufVxcclxcblxcclxcbi5kZWxldGUge1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuaS5zaG93IHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxufVxcclxcblxcclxcbmkuaGlkZSB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC10ZXh0IHtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5jaGVja2JveCB7XFxyXFxuICBtYXJnaW4tbGVmdDogMTBweDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmNoZWNrYm94OmNoZWNrZWQgKyAubGlzdC10ZXh0IHtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xcclxcbiAgY29sb3I6IHJlYmVjY2FwdXJwbGU7XFxyXFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxyXFxuICBmb250LXNpemU6IDE3cHg7XFxyXFxuICBmb250LXdlaWdodDogNTAwO1xcclxcbn1cXHJcXG5cXHJcXG4uY2xlYXItYnRuIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHggMjBweDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG1hcmdpbi10b3A6IC05cHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTg5LCAxODksIDE4OSk7XFxyXFxuICBmb250LXNpemU6IDIwcHg7XFxyXFxufVxcclxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9zdHlsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBRUE7RUFDRSxVQUFVO0VBQ1YsU0FBUztFQUNULHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLGlDQUFpQztFQUNqQyxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsYUFBYTtFQUNiLHNCQUFzQjtFQUN0Qiw4QkFBOEI7RUFDOUIsVUFBVTtFQUNWLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsb0NBQW9DO0FBQ3RDOztBQUVBO0VBQ0UsYUFBYTtFQUNiLDhCQUE4QjtFQUM5QixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLDJDQUEyQztBQUM3Qzs7QUFFQTtFQUNFLGVBQWU7RUFDZixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxlQUFlO0VBQ2YseUJBQXlCO0VBQ3pCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsOEJBQThCO0VBQzlCLGtCQUFrQjtFQUNsQiwyQ0FBMkM7QUFDN0M7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsWUFBWTtFQUNaLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxhQUFhO0VBQ2Isc0JBQXNCO0VBQ3RCLDhCQUE4QjtFQUM5QixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsYUFBYTtFQUNiLFNBQVM7RUFDVCxpQkFBaUI7RUFDakIsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQiwyQ0FBMkM7QUFDN0M7O0FBRUE7O0VBRUUsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsZUFBZTtFQUNmLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLDZCQUE2QjtFQUM3QixvQkFBb0I7RUFDcEIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLFlBQVk7RUFDWixnQkFBZ0I7RUFDaEIsb0NBQW9DO0VBQ3BDLGVBQWU7QUFDakJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGFuY2luZytTY3JpcHQmZmFtaWx5PUxhdG8mZmFtaWx5PU51bml0bzppdGFsLHdnaHRAMCwyMDA7MCwzMDA7MCw1MDA7MCw2MDA7MCw3MDA7MSwyMDA7MSwzMDA7MSw3MDA7MSw5MDAmZmFtaWx5PVBvcHBpbnM6d2dodEAzMDAmZmFtaWx5PVJvYm90bzppdGFsLHdnaHRAMCwzMDA7MCw1MDA7MCw3MDA7MSwzMDA7MSw0MDA7MSw1MDAmZGlzcGxheT1zd2FwJyk7XFxyXFxuXFxyXFxuKiB7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuXFxyXFxuYm9keSB7XFxyXFxuICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXNpemU6IDE2cHg7XFxyXFxufVxcclxcblxcclxcbi5jb250YWluZXIge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxyXFxuICB3aWR0aDogODAlO1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA4MHB4IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjMxLCAyMzAsIDIzMCk7XFxyXFxufVxcclxcblxcclxcbi5oZWFkZXIge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxuICBib3JkZXItYm90dG9tOiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjQpO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyIHAge1xcclxcbiAgZm9udC1zaXplOiAxOHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXHJcXG59XFxyXFxuXFxyXFxuLmFycm93LWltZyB7XFxyXFxuICBmb250LXNpemU6IDMwcHg7XFxyXFxuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uZm9ybSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4O1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTtcXHJcXG59XFxyXFxuXFxyXFxuI3RvZG8taW5wdXQge1xcclxcbiAgd2lkdGg6IDkwJTtcXHJcXG4gIHBhZGRpbmctdG9wOiA1cHg7XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbmlucHV0OjpwbGFjZWhvbGRlciB7XFxyXFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxyXFxuICBmb250LXdlaWdodDogNTAwO1xcclxcbn1cXHJcXG5cXHJcXG4udG8tZG8taG9sZGVyIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcclxcbiAgcGFkZGluZzogMTBweCAwO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kbyB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZ2FwOiAxMHB4O1xcclxcbiAgcGFkZGluZy10b3A6IDEzcHg7XFxyXFxuICBmb250LXdlaWdodDogNDAwO1xcclxcbiAgcGFkZGluZy1ib3R0b206IDdweDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7XFxyXFxufVxcclxcblxcclxcbi5FZGl0LFxcclxcbi5kZWxldGUge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDEwMCU7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMTBweDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIGZvbnQtc2l6ZTogMjRweDtcXHJcXG59XFxyXFxuXFxyXFxuLmRlbGV0ZSB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG5pLnNob3cge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG59XFxyXFxuXFxyXFxuaS5oaWRlIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5saXN0LXRleHQge1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLmNoZWNrYm94IHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uY2hlY2tib3g6Y2hlY2tlZCArIC5saXN0LXRleHQge1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxyXFxuICBjb2xvcjogcmViZWNjYXB1cnBsZTtcXHJcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXHJcXG4gIGZvbnQtc2l6ZTogMTdweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA1MDA7XFxyXFxufVxcclxcblxcclxcbi5jbGVhci1idG4ge1xcclxcbiAgcGFkZGluZzogMTVweCAyMHB4O1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgbWFyZ2luLXRvcDogLTlweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxODksIDE4OSwgMTg5KTtcXHJcXG4gIGZvbnQtc2l6ZTogMjBweDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdHlsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5cbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuXG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cblxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcblxuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdXBkYXRlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cblxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcblxuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcblxuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcblxuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7IC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5cbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cblxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cblxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG5cbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcblxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuXG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuXG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cblxuICBjc3MgKz0gb2JqLmNzcztcblxuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH0gLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiaW1wb3J0ICcuL3N0eWxlLmNzcyc7XHJcbmltcG9ydCAnLi9tb2R1bGVzL0NSVUQuanMnO1xyXG5pbXBvcnQgJy4vbW9kdWxlcy9kaXNwbGF5LmpzJztcclxuIiwiaW1wb3J0IHsgbGlzdENvbnRhaW5lciwgZGlzcGxheXRhc2tzLCB0YXNrcyB9IGZyb20gJy4vZGlzcGxheS5qcyc7XHJcblxyXG5jb25zdCBmb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZvcm0nKTtcclxuY29uc3QgdG9kb0lucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvZG8taW5wdXQnKTtcclxuY29uc3QgYXJyb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXJyb3ctaW1nJyk7XHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXHJcbmZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGUpID0+IHtcclxuICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgc2F2ZVRvZG8oKTtcclxuICBkaXNwbGF5dGFza3MoKTtcclxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGFza3MnLCBKU09OLnN0cmluZ2lmeSh0YXNrcykpO1xyXG59KTtcclxuXHJcbmFycm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gIHNhdmVUb2RvKCk7XHJcbiAgZGlzcGxheXRhc2tzKCk7XHJcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rhc2tzJywgSlNPTi5zdHJpbmdpZnkodGFza3MpKTtcclxufSk7XHJcblxyXG4vLyBTYXZlIHRvZG8gZnVuY3Rpb25cclxuY29uc3Qgc2F2ZVRvZG8gPSAodG9kb0luZGV4ID0gbnVsbCwgdG9kb1ZhbHVlID0gdG9kb0lucHV0LnZhbHVlKSA9PiB7XHJcbiAgaWYgKHRvZG9JbmRleCAhPT0gbnVsbCkge1xyXG4gICAgdGFza3NbdG9kb0luZGV4XS5kZXNjcmlwdGlvbiA9IHRvZG9WYWx1ZTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgaW5kZXggPSB0YXNrcy5sZW5ndGggKyAxO1xyXG4gICAgdGFza3MucHVzaCh7XHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0b2RvVmFsdWUsXHJcbiAgICAgIGNvbXBsZXRlZDogZmFsc2UsXHJcbiAgICAgIGluZGV4LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2RvSW5wdXQudmFsdWUgPSAnJztcclxufTtcclxuXHJcbi8vIGV2ZW50bGlzdGVuZXIgZm9yIGFsbCBUYXNrc1xyXG5saXN0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICBjb25zdCB7IHRhcmdldCB9ID0gZTtcclxuICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgaWYgKHBhcmVudEVsZW1lbnQuY2xhc3NOYW1lICE9PSAndG9kbycpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgLy8gdG9kbyBpZFxyXG4gIGNvbnN0IHRvZG8gPSBwYXJlbnRFbGVtZW50O1xyXG4gIGNvbnN0IHRvZG9JZCA9IE51bWJlcih0b2RvLmlkKTtcclxuICAvLyB0YXJnZXQgYWN0aW9uXHJcbiAgY29uc3QgYWN0aW9ucyA9IHRhcmdldC5kYXRhc2V0LmFjdGlvbjtcclxuICBpZiAoYWN0aW9ucyA9PT0gJ2VkaXQnKSB7XHJcbiAgICBlZGl0VG9kbyh0b2RvSWQpO1xyXG4gIH0gZWxzZSBpZiAoYWN0aW9ucyA9PT0gJ2RlbGV0ZScpIHtcclxuICAgIGRlbGV0ZVRvZG8odG9kb0lkKTtcclxuICB9IGVsc2UgaWYgKGFjdGlvbnMgPT09ICdjaGVjaycpIHtcclxuICAgIGNoZWNrVG9kbyh0b2RvSWQpO1xyXG4gIH1cclxufSk7XHJcblxyXG5jb25zdCBlZGl0VG9kbyA9ICh0b2RvSWQpID0+IHtcclxuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b2RvSWQpO1xyXG4gIGNvbnN0IHRhc2tEZXNjcmlwdGlvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcubGlzdC10ZXh0Jyk7XHJcbiAgY29uc3QgZWRpdEljb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLkVkaXQnKTtcclxuICBjb25zdCBkZWxldGVJY29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5kZWxldGUnKTtcclxuICB0YXNrRGVzY3JpcHRpb24uY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcclxuICB0YXNrRGVzY3JpcHRpb24uZm9jdXMoKTtcclxuICBlZGl0SWNvbi5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XHJcbiAgZGVsZXRlSWNvbi5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XHJcbiAgdGFza0Rlc2NyaXB0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xyXG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgc2F2ZVRvZG8odG9kb0lkIC0gMSwgdGFza0Rlc2NyaXB0aW9uLnRleHRDb250ZW50KTtcclxuICAgICAgZGlzcGxheXRhc2tzKCk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0YXNrcycsIEpTT04uc3RyaW5naWZ5KHRhc2tzKSk7XHJcbiAgICAgIHRhc2tEZXNjcmlwdGlvbi5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcclxuICAgICAgZWRpdEljb24uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xyXG4gICAgICBkZWxldGVJY29uLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcclxuICAgIH1cclxuICB9KTtcclxufTtcclxuXHJcbmNvbnN0IGRlbGV0ZVRvZG8gPSAodG9kb0lkKSA9PiB7XHJcbiAgdGFza3Muc3BsaWNlKHRvZG9JZCAtIDEsIDEpOyAvLyByZW1vdmUgb25lIGVsZW1lbnQgYXQgaW5kZXggdG9kb0lkIC0gMVxyXG4gIGNvbnN0IHRvZG9FbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodG9kb0lkKTtcclxuICB0b2RvRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvZG9FbGVtZW50KTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICB0YXNrc1tpXS5pbmRleCA9IGkgKyAxO1xyXG4gIH1cclxuICBkaXNwbGF5dGFza3MoKTtcclxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGFza3MnLCBKU09OLnN0cmluZ2lmeSh0YXNrcykpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gY2hlY2tUb2RvKHRvZG9JZCkge1xyXG4gIHRhc2tzLmZvckVhY2goKHRvZG8sIGluZGV4KSA9PiB7XHJcbiAgICBpZiAoaW5kZXggPT09IHRvZG9JZCAtIDEpIHtcclxuICAgICAgdG9kby5jb21wbGV0ZWQgPSAhdG9kby5jb21wbGV0ZWQ7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgZGlzcGxheXRhc2tzKCk7XHJcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rhc2tzJywgSlNPTi5zdHJpbmdpZnkodGFza3MpKTtcclxufVxyXG5cclxuY29uc3QgYnRuQ2xlYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2xlYXItYnRuJyk7XHJcbmJ0bkNsZWFyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gIGNvbnN0IGluY29tcGxldGVUYXNrcyA9IHRhc2tzLmZpbHRlcigodG9kbykgPT4gIXRvZG8uY29tcGxldGVkKTtcclxuICB0YXNrcy5sZW5ndGggPSAwOyAvLyBjbGVhciB0aGUgb3JpZ2luYWwgdGFza3MgYXJyYXlcclxuICB0YXNrcy5wdXNoKC4uLmluY29tcGxldGVUYXNrcyk7IC8vIGFkZCB0aGUgaW5jb21wbGV0ZSB0YXNrcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBhcnJheVxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgIHRhc2tzW2ldLmluZGV4ID0gaSArIDE7XHJcbiAgfVxyXG4gIGRpc3BsYXl0YXNrcygpO1xyXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0YXNrcycsIEpTT04uc3RyaW5naWZ5KHRhc2tzKSk7XHJcbn0pO1xyXG4iLCJleHBvcnQgY29uc3QgbGlzdENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50by1kby1ob2xkZXInKTtcclxuZXhwb3J0IGNvbnN0IHRhc2tzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGFza3MnKSkgfHwgW107XHJcbmV4cG9ydCBjb25zdCBkaXNwbGF5dGFza3MgPSAoKSA9PiB7XHJcbiAgbGlzdENvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICB0YXNrcy5mb3JFYWNoKCh0b2RvKSA9PiB7XHJcbiAgICB0YXNrcy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XHJcbiAgICBsaXN0Q29udGFpbmVyLmlubmVySFRNTCArPSBgXHJcbiAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2RvXCIgaWQ9JHt0b2RvLmluZGV4fT5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrYm94XCIke3RvZG8uY29tcGxldGVkID8gJ2NoZWNrZWQnIDogJyd9XHJcbiAgICAgICAgICBkYXRhLWFjdGlvbj1cImNoZWNrXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cImxpc3QtdGV4dFwiIGRhdGEtYWN0aW9uPVwiY2hlY2tcIj4ke3RvZG8uZGVzY3JpcHRpb259PC9wPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1lbGxpcHNpcy12ZXJ0aWNhbCBFZGl0XCIgZGF0YS1hY3Rpb249XCJlZGl0XCI+PC9pPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS10cmFzaC1jYW4gZGVsZXRlXCIgZGF0YS1hY3Rpb249XCJkZWxldGVcIj4gPC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICBgO1xyXG4gIH0pO1xyXG59O1xyXG5cclxuZGlzcGxheXRhc2tzKCk7XHJcblxyXG4vLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZGlzcGxheXRhc2tzKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
--------------------------------------------------------------------------------