{ "info": { "author": "Van-Kha Nguyen", "author_email": "hainguyen579@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2" ], "description": "# Detect Attacks: \n\nA python package which detects network attacks includes: \n\n* Collecting data from attacks \n* Classifying data to predict the risks of the network attacks \n* Warning users risks which could be a network attack.\n\n# Getting Started\n\n## Prerequisites\n\n* These packages should be installed before using detect_attacks:\n\n```\ntensorflow\t1.5.0\nsklearn\t0.19.1\nkeras\t2.1.3\nnumpy\t1.14.0\nmatplotlib\t2.1.2\ndeepmg 0.5.9\n```\n\n* Please install if you do not have them\n\n```\npip install matplotlib\npip install numpy\n\nconda install scikit-learn\nconda install -c conda-forge tensorflow \nconda install -c conda-forge keras\n\npip install Keras-Applications\npip install Keras-Preprocessing\npip install keras_sequential_ascii\n\npip install deepmg\n```\n\n## Install or Download the package detect_attacks\n```\npip install detect_attacks\n```\n\n# Running Experiments\n## How to use detect_attacks\n\n* **Input**: \n - mandatory: csv files containing data (\\*_x.csv) and labels (\\*_y.csv) \n - optional: if use external validation set: data (\\*_zx.csv) and labels (\\*_zy.csv)) put in [data](data/) changable with parameters *--orginal_data_folder*). \n\n For examples, data1_x.csv and data1_y.csv for.\n\n* **Output**:\n - *results*: performance/training/testing information of each fold and summary results put in [results/*name_dataset_parameters_to_generate_image*/] (results/) (changable with parameters **--parent_folder_results**), includes more than 5 files: \n - \\*file_sum.txt: parameters used to run, performance at each fold. The last rows show training/testing performance in ACC, AUC, execution time, and other metrics of the experiment. When the experiment finishes, a suffix \"_ok\" (changable with parameters **--suff_fini**) appended to the name of file marking that the experiment finishes.\n\n - \\*file_eachfold.txt (if **--save_folds=y**): results of each fold with accuracy, auc, mcc, loss of training and testing.\n\n - \\*file_mean_acc.txt (if **--save_avg_run=y**): if the experiment includes *n* runs repeated independently, so the file includes average performance on *k*-folds of each run measured by **accuracy** and time execution at training/testing of beginning, training/testing when finished.\n\n - \\*file_mean_auc.txt (if **--save_avg_run=y**): if the experiment includes *n* runs repeated independently, so the file includes average performance on *k*-folds of each run measured by **AUC** at training/testing of beginning, training/testing when finished.\n\n - If **--save_para=y**: configuration file to repeat the experiment\n\n - If use **--save_w=y** (save weights of trained networks) and/or **--save_entire_w=y**, **--save_d=y**, then 2 folders will be created:\n\n - results/*name_dataset_parameters_to_generate_image*/models/: includes \\*weightmodel\\*.json contains structure of the model \\*weightmodel\\*.h5 stores weights.\n\n - results/*name_dataset_parameters_to_generate_image*/details/\\*weight_\\*.txt: contains accuracy and loss of training and testing every epochs **--save_d=y**. If **--save_rf=y**, then we will have important scores generated from RFs for each run.\n\n## Some examples\n\n```\ndb_name='data1';\nfolder_data='/Users/hainguyen//test/data/';\nfolder_res='/Users/hainguyen//test/results/';\n\npython -m detect_attacks -i $db_name -r $folder_data --parent_folder_results $folder_res --model rf_model\npython -m detect_attacks -i $db_name -r $folder_data --parent_folder_results $folder_res --model svm_model\npython -m detect_attacks -i $db_name -r $folder_data --parent_folder_results $folder_res --model model_cnn1d\npython -m detect_attacks -i $db_name -r $folder_data --parent_folder_results $folder_res --model model_mlp\npython -m detect_attacks -i $db_name -r $folder_data --parent_folder_results $folder_res --model fc_model\n\n```\n\n## Download data\n\nPlease use the link below to download data for the experiments\n\n[darpa29f](https://drive.google.com/file/d/1xv6NhPHOQD3YxjTeQ0EgeW0px3QljXIw/view?usp=sharing)\n\n\n# References:\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "detect-attacks", "package_url": "https://pypi.org/project/detect-attacks/", "platform": "", "project_url": "https://pypi.org/project/detect-attacks/", "project_urls": null, "release_url": "https://pypi.org/project/detect-attacks/0.0.12/", "requires_dist": null, "requires_python": "", "summary": "A python package to detect attacks via networks", "version": "0.0.12" }, "last_serial": 5188753, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "aa7f1a8eab6c948b99b6ed9e0bbd1ee5", "sha256": "1fd675b48dc18840fade9fc1dcf9ebf959294f14da097ea4eca7d40e19fa3630" }, "downloads": -1, "filename": "detect_attacks-0.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "aa7f1a8eab6c948b99b6ed9e0bbd1ee5", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 69850, "upload_time": "2019-02-11T07:44:27", "url": "https://files.pythonhosted.org/packages/2e/a9/1dfba513027a2a550871d0e1faa73c1243edf9ef12c4966be66353af3a8b/detect_attacks-0.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68318de97aaef066da1c4a82f2c592bd", "sha256": "d6016b9c5e1ae620d5e883235b173fda2742d4156ef5620a4dfcbafe51732b0b" }, "downloads": -1, "filename": "detect_attacks-0.0.1.tar.gz", "has_sig": false, "md5_digest": "68318de97aaef066da1c4a82f2c592bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63928, "upload_time": "2019-02-11T07:44:34", "url": "https://files.pythonhosted.org/packages/c9/0b/e070f4936206598321dbec8d248b8dadbed0ef3ebdae6bad6b995c7981a9/detect_attacks-0.0.1.tar.gz" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "8ee1bf5491e2798c0894379630dba5ac", "sha256": "349d2c1bc327045c416a04f34fea68a4c091e5285cc36ff7713d13288c7d2dfb" }, "downloads": -1, "filename": "detect_attacks-0.0.10-py2-none-any.whl", "has_sig": false, "md5_digest": "8ee1bf5491e2798c0894379630dba5ac", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4533, "upload_time": "2019-04-11T13:48:08", "url": "https://files.pythonhosted.org/packages/95/57/bd37b87507bfcec34a1e0702a2331b40c9b2147a1f404456b4bbfa365bd1/detect_attacks-0.0.10-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "03673a9f63d4ca4d40098b369969a9e4", "sha256": "e66f64699059ee915d7317bf0e567e3509efe42cd9c2b1d741bcc316066ae6c7" }, "downloads": -1, "filename": "detect_attacks-0.0.10.tar.gz", "has_sig": false, "md5_digest": "03673a9f63d4ca4d40098b369969a9e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3195, "upload_time": "2019-04-11T13:48:10", "url": "https://files.pythonhosted.org/packages/93/32/8ccb28c1795ca2caa6b6bf9ad5108560a07efd35b0e0323536d519c5a46f/detect_attacks-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "bc9e96fef4ef0bb5852d6e67e8f3bffb", "sha256": "fa9be0a0a3af1efc88d33b3df89cba3e17e16394a213c6db37d8f9915625d09f" }, "downloads": -1, "filename": "detect_attacks-0.0.11-py2-none-any.whl", "has_sig": false, "md5_digest": "bc9e96fef4ef0bb5852d6e67e8f3bffb", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4647, "upload_time": "2019-04-11T13:56:05", "url": "https://files.pythonhosted.org/packages/2a/67/ccc2fa83f61fcbab6ce5ed4c9e8c5750b959e46e1b19b17dd87b5988774b/detect_attacks-0.0.11-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4743d5848c3e27ec3358a0f7bfa29b8a", "sha256": "c1e9dac72a0500cbb9a7321271688072ae1f31f8f019118f8a66f137239cc458" }, "downloads": -1, "filename": "detect_attacks-0.0.11.tar.gz", "has_sig": false, "md5_digest": "4743d5848c3e27ec3358a0f7bfa29b8a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3308, "upload_time": "2019-04-11T13:56:07", "url": "https://files.pythonhosted.org/packages/4b/7c/d2f864a5e1dc9f29edbd817f0c431130701e0577978a9e3258d4f4f448cd/detect_attacks-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "94c37872dbe208bf1d33b903c6a46e9b", "sha256": "422857d7503d2b26eaac11398295aca44d0fb36a9000913dbc5c335305cd8449" }, "downloads": -1, "filename": "detect_attacks-0.0.12-py2-none-any.whl", "has_sig": false, "md5_digest": "94c37872dbe208bf1d33b903c6a46e9b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4317, "upload_time": "2019-04-11T14:04:20", "url": "https://files.pythonhosted.org/packages/74/ca/edb5670697d5d44494a9aa15e35fa9535e86aba71c62b3b13fd894c8c8d6/detect_attacks-0.0.12-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4778872d7b48479d0ad933e11cd0ffd", "sha256": "e9f809d649121da43c4f30ae3afeb6de341eee2f569363aa45ec5604ab804038" }, "downloads": -1, "filename": "detect_attacks-0.0.12.tar.gz", "has_sig": false, "md5_digest": "b4778872d7b48479d0ad933e11cd0ffd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3007, "upload_time": "2019-04-11T14:04:22", "url": "https://files.pythonhosted.org/packages/11/48/840ef1dd496eb0c176de84fec6b47c110961afe9addba7eecf0bb18291f8/detect_attacks-0.0.12.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "1fac514133aad7b395538626957ff87a", "sha256": "4d0ffe5d5ac15e1eb32e84302967a57245ed3ae9cee836e8882904ae2aa1bcf6" }, "downloads": -1, "filename": "detect_attacks-0.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "1fac514133aad7b395538626957ff87a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 3169, "upload_time": "2019-02-11T08:11:49", "url": "https://files.pythonhosted.org/packages/8a/09/022c0e9683d27254fba9529b6a27cc12627788c148d32dfcf2dfdd3456f2/detect_attacks-0.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b5c87d62edbed8ec8b967955879e5a7", "sha256": "8e214cba1931690ba621edab7e1c5effc53a7dc0bf348f80f03110028f20731a" }, "downloads": -1, "filename": "detect_attacks-0.0.2.tar.gz", "has_sig": false, "md5_digest": "8b5c87d62edbed8ec8b967955879e5a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1706, "upload_time": "2019-02-11T08:11:50", "url": "https://files.pythonhosted.org/packages/e9/1d/41fd7ef936b97c85c0abf2f04fec25f7e8a9c7f9d020afc49a97e5dae983/detect_attacks-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "0a242cd0fd6dcaad64ce859ef6a10b4a", "sha256": "7d1403082be2f0ae7d74093a55a6dd7654f8a4b4a1f1d42bd2d2263cf74cbf1d" }, "downloads": -1, "filename": "detect_attacks-0.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "0a242cd0fd6dcaad64ce859ef6a10b4a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4370, "upload_time": "2019-02-11T08:29:15", "url": "https://files.pythonhosted.org/packages/43/3c/1ad32552af0a148278a155860f7e066d8dee0c1a3b6fe87f65e0b907ffd1/detect_attacks-0.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a321068c619c99cece7e5d8d0bf5786", "sha256": "870efd24f36528a6de4459785bed715a8f7a0270eb7c3bd3f4ee75a2514e87e7" }, "downloads": -1, "filename": "detect_attacks-0.0.3.tar.gz", "has_sig": false, "md5_digest": "7a321068c619c99cece7e5d8d0bf5786", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3032, "upload_time": "2019-02-11T08:29:16", "url": "https://files.pythonhosted.org/packages/f6/35/0f99df051294a9d693e1b187b2b88740856e92c37dda03f827924f227cdf/detect_attacks-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "7e922c75242f619eff01527587721e91", "sha256": "8f3ad0c715a10a0d6f88fc846034a45523dc618d7a1299e3b2e5d527edf924f4" }, "downloads": -1, "filename": "detect_attacks-0.0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "7e922c75242f619eff01527587721e91", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4373, "upload_time": "2019-02-11T08:30:15", "url": "https://files.pythonhosted.org/packages/f0/5a/e14a1efd4a61bebef739607225931e2d478a3fa5b9dd1bc8b3af5f8dda3a/detect_attacks-0.0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c73e1eaa4f816770603424f664e37af8", "sha256": "e7f361b0a107619997ca939396a83d73f60e48293a4058c0c061b6490b268fb3" }, "downloads": -1, "filename": "detect_attacks-0.0.4.tar.gz", "has_sig": false, "md5_digest": "c73e1eaa4f816770603424f664e37af8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3033, "upload_time": "2019-02-11T08:30:17", "url": "https://files.pythonhosted.org/packages/00/c1/3d8c5fa21508be1b93af885511b83279dfcf52a3e9cda37a0b2f82634642/detect_attacks-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "75a6f152d9c7f5dbd9d5a1662eb28244", "sha256": "9a82efd659cbe8af742eb39b719b4455644b5e08a9d4914ada7b502f80f0b908" }, "downloads": -1, "filename": "detect_attacks-0.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "75a6f152d9c7f5dbd9d5a1662eb28244", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4391, "upload_time": "2019-02-11T08:56:12", "url": "https://files.pythonhosted.org/packages/53/5c/d15051bb012ac7c1ec7bd6ec51e4fb180cdc7fa1a6888be5e73fb51dabe5/detect_attacks-0.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fc26040eda1cf9b38ea0d5e349a7ce3d", "sha256": "738d7b6be4830717ec37ba0615ab2ac46549b52ccd6132ebd2d45c12ad2be865" }, "downloads": -1, "filename": "detect_attacks-0.0.5.tar.gz", "has_sig": false, "md5_digest": "fc26040eda1cf9b38ea0d5e349a7ce3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3042, "upload_time": "2019-02-11T08:56:14", "url": "https://files.pythonhosted.org/packages/e0/a3/2584bf91a5ddf72ee4db21b49a8602acbdce6279f4b23fb361cd877be88b/detect_attacks-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "7d7cf8d7b5caf4f3cbaea5a586daaa7c", "sha256": "f8f9edfe1f4a9484b12bf6d61660fc69b2fd77351d842ef9b058ebed98044c78" }, "downloads": -1, "filename": "detect_attacks-0.0.6-py2-none-any.whl", "has_sig": false, "md5_digest": "7d7cf8d7b5caf4f3cbaea5a586daaa7c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4389, "upload_time": "2019-02-11T09:15:24", "url": "https://files.pythonhosted.org/packages/91/7e/5d00170c6141ccf064c823db9019f0d62b2ee798bd22a31289a49e746a06/detect_attacks-0.0.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c4b49504d0380de0d397ec926bc182d1", "sha256": "348111989af80ee82280509926296cd511ce6f30c13d000380987a44330d852b" }, "downloads": -1, "filename": "detect_attacks-0.0.6.tar.gz", "has_sig": false, "md5_digest": "c4b49504d0380de0d397ec926bc182d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3051, "upload_time": "2019-02-11T09:15:26", "url": "https://files.pythonhosted.org/packages/f5/1e/30cdcfe4c97ee719aceeb612e655c9564b6fa1af12b670d31093f7138cb9/detect_attacks-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "1f05abdedca4f7f7a5c2414e84706759", "sha256": "b33a4c86df6391fef36ddf37966dccac9dccb079c6d9a21c9000d0fb86e9784b" }, "downloads": -1, "filename": "detect_attacks-0.0.7-py2-none-any.whl", "has_sig": false, "md5_digest": "1f05abdedca4f7f7a5c2414e84706759", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4390, "upload_time": "2019-02-11T09:18:17", "url": "https://files.pythonhosted.org/packages/ac/03/1f67584e35f46ee7f20ba3d507c0fda24d0096e270c47d57dab59634a302/detect_attacks-0.0.7-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4ed394bcdf5f053b9e2edb66e90c4fe", "sha256": "a04abef7fac35d9b1d421a2d705c1aa391bb61ee11be0b4501b29090128dc791" }, "downloads": -1, "filename": "detect_attacks-0.0.7.tar.gz", "has_sig": false, "md5_digest": "b4ed394bcdf5f053b9e2edb66e90c4fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3052, "upload_time": "2019-02-11T09:18:18", "url": "https://files.pythonhosted.org/packages/7e/11/21316c9dcfd840d7eb1d4286230dec2c523505c6c2274571627bc742fee9/detect_attacks-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "752035612f8698aaff8b7b6c349d080f", "sha256": "29ec8abf92865a317b37508b92788e3337b5fd950ccb137b7c0e231875f9dd6b" }, "downloads": -1, "filename": "detect_attacks-0.0.8-py2-none-any.whl", "has_sig": false, "md5_digest": "752035612f8698aaff8b7b6c349d080f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4414, "upload_time": "2019-02-11T09:29:39", "url": "https://files.pythonhosted.org/packages/0e/17/92ead7c4b80c841bdf1ce2aec1c76663ee61190f268f4a387b188a5d0e01/detect_attacks-0.0.8-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "155213bab196e0bcd5e5b4833f361d01", "sha256": "9f1019838f353a49d8e81cebcc74376f128fc7b1807e62ba0ab834fc7608142b" }, "downloads": -1, "filename": "detect_attacks-0.0.8.tar.gz", "has_sig": false, "md5_digest": "155213bab196e0bcd5e5b4833f361d01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3082, "upload_time": "2019-02-11T09:29:40", "url": "https://files.pythonhosted.org/packages/d3/46/fcc4be692d8b249a853584d0a6cabea0fbe9f4534d35db7760bb3709ab3c/detect_attacks-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "7c94e0249fcb4bd90f6ddd527384ea51", "sha256": "b7c48aa3442489edd48a3372aa39a253c287d8365b4588c7842eb97727d43367" }, "downloads": -1, "filename": "detect_attacks-0.0.9-py2-none-any.whl", "has_sig": false, "md5_digest": "7c94e0249fcb4bd90f6ddd527384ea51", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4400, "upload_time": "2019-02-11T09:37:53", "url": "https://files.pythonhosted.org/packages/48/51/61650e7fbcb3c4c48c6ac2e123118fca77633ec6174c4e3c1b38100ad5ec/detect_attacks-0.0.9-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ae974ef37c99382cb7821fba2d0f77f0", "sha256": "221ad8b3489aba595e2759af992cad4762e22a9e6b1c173964f9e8b712d3152d" }, "downloads": -1, "filename": "detect_attacks-0.0.9.tar.gz", "has_sig": false, "md5_digest": "ae974ef37c99382cb7821fba2d0f77f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3066, "upload_time": "2019-02-11T09:37:54", "url": "https://files.pythonhosted.org/packages/da/78/913ec2a91a013a00894cf47627970ddff78740501b9a1e7c5d6fd6e8ea2c/detect_attacks-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "94c37872dbe208bf1d33b903c6a46e9b", "sha256": "422857d7503d2b26eaac11398295aca44d0fb36a9000913dbc5c335305cd8449" }, "downloads": -1, "filename": "detect_attacks-0.0.12-py2-none-any.whl", "has_sig": false, "md5_digest": "94c37872dbe208bf1d33b903c6a46e9b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4317, "upload_time": "2019-04-11T14:04:20", "url": "https://files.pythonhosted.org/packages/74/ca/edb5670697d5d44494a9aa15e35fa9535e86aba71c62b3b13fd894c8c8d6/detect_attacks-0.0.12-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4778872d7b48479d0ad933e11cd0ffd", "sha256": "e9f809d649121da43c4f30ae3afeb6de341eee2f569363aa45ec5604ab804038" }, "downloads": -1, "filename": "detect_attacks-0.0.12.tar.gz", "has_sig": false, "md5_digest": "b4778872d7b48479d0ad933e11cd0ffd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3007, "upload_time": "2019-04-11T14:04:22", "url": "https://files.pythonhosted.org/packages/11/48/840ef1dd496eb0c176de84fec6b47c110961afe9addba7eecf0bb18291f8/detect_attacks-0.0.12.tar.gz" } ] }