diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0875e20 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/data_preprocess/doc_index/ +/data_preprocess/doc_index.zip diff --git a/.idea/TTDS.iml b/.idea/TTDS.iml index 8d6ec71..7d66110 100644 --- a/.idea/TTDS.iml +++ b/.idea/TTDS.iml @@ -1,8 +1,10 @@ - - + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index ede2aec..9b51c46 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/data_preprocess/data_preprocess.py b/data_preprocess/data_preprocess.py new file mode 100644 index 0000000..6cdea0f --- /dev/null +++ b/data_preprocess/data_preprocess.py @@ -0,0 +1,104 @@ +import numpy as np +import json, re +from nltk.stem.snowball import SnowballStemmer +from nltk.corpus import stopwords +import pickle + +def preprocess(line, stopword_set=None): + output = [] + # CASE FOLDING + lowercase_line = line.lower() + # TOKENIZATION + tokens = re.findall(r'\b[a-z0-9][a-z0-9]*', lowercase_line) + # STOPPING + # noneST_tokens = [x for x in tokens if not x in stopword_set] + # NORMALISATION + stop_words = set(stopwords.words('english')) + stemmer = SnowballStemmer("english") + # remove stopwords + tokens = [x for x in tokens if not x.lower() in stop_words] + stems = [stemmer.stem(x) for x in tokens] + output.extend(stems) + return output + +# load json file +with open('recipes.json', 'r') as f: + dataset = json.load(f) + +# 2-d dictionary of recipe index +dataset_index = {} +# 2-d dictionary for term frequency +term_frequency = {} +# 1-d document length +doc_len = {} +# integer for doc frequency +num_docs = 0 + + +for data in dataset: +# print(f"id: {data['id']}") +# print(f"title: {data['title']}, ingredients: {data['ingredients']}, instructions: {data['instructions']}") + num_docs += 1 + if num_docs % 10000 == 0: + print('current state: {}'.format(num_docs)) + # store id + + doc_id = data['id'] + + title = data['title'] + instructions = '' + ingredients = '' + for d in data['instructions']: + instructions += d['text'] + ' ' + for d in data['ingredients']: + ingredients += d['text'] + ' ' +# print(title, ingredients, instructions) +# combine title and instructions + + text = title + instructions + ingredients + processed_text = preprocess(text) + position_index = 1 + + +# store doc_len + doc_len[doc_id] = len(processed_text) + + for token in processed_text: + + # term_frequency + + + # dataset_index + if token in dataset_index: + if doc_id in dataset_index[token]: + dataset_index[token][doc_id].append(position_index) + term_frequency[token][doc_id] += 1 + else: + dataset_index[token][doc_id] = [position_index] + term_frequency[token][doc_id] = 1 + else: + # create new token + term_frequency[token] = {} + term_frequency[token][doc_id] = 1 + dataset_index[token] = {} + dataset_index[token][doc_id] = [position_index] + position_index += 1 + + # restriction for test + #if num_docs == 5: + #break + +for key, value in dataset_index.items(): + with open('./doc_index/' + key, 'wb') as f: + pickle.dump(value, f) + +with open('./doc_index/term_frequency', 'wb') as f: + pickle.dump(term_frequency, f) + +with open('./doc_index/doc_len', 'wb') as f: + pickle.dump(doc_len, f) + +with open('./doc_index/num_docs', 'wb') as f: + pickle.dump(num_docs, f) +#print(dataset_index) +#print(len(dataset_index)) \ No newline at end of file diff --git a/data_preprocess/pickle_writer.py b/data_preprocess/pickle_writer.py new file mode 100644 index 0000000..8496a72 --- /dev/null +++ b/data_preprocess/pickle_writer.py @@ -0,0 +1,11 @@ +# for generate temporary pickle file (yogurt) for testing + +import pickle + +data = {"000095fc1d": [1], "0014d451fe": [24], "002e719123": [10], "003accb978": [17, 39], "0061d05e1f": [4, 6], "00dc8db512": [9], "00e4b5828c": [36], "0137b6f374": [36, 178], "014b508baf": [14], "01538f9474": [8], "01587fc8bf": [33, 97], "0188800c1b": [7, 17, 31], "01946d0227": [17, 42], "01d1f84aac": [9], "01e6a87ec7": [35, 98], "01ecbeaa15": [2, 4, 22], "020631a7b9": [16, 68], "023deb69e3": [7], "025ae820eb": [10, 42], "0275308a0c": [3, 27], "0293ddd299": [54, 66, 80, 108, 116, 148], "02ac5e7a07": [31], "02bb84fdf7": [76], "02f33111be": [6], "03105fe44b": [60], "031b360481": [17], "0336f465de": [17], "035ae1672c": [14], "03606ca959": [9], "03764efd5b": [63], "039e6a6e43": [12, 142], "03a403b8ed": [9], "03aa4dfb56": [27, 39], "03d2ee5c37": [2, 19], "03e4ea009a": [12], "040eb2a023": [27], "0428c1cfcb": [2], "0454858cb9": [15], "04754124ce": [17], "04adac998e": [12, 34], "04b3c1ee97": [19, 100], "04ef6fc322": [19, 49], "04ffe17d35": [42], "0523d9ec50": [7], "053cbd7571": [28, 71], "057f6ed6aa": [5, 15, 70], "058cb992f5": [17, 55, 65], "059d17069e": [36], "05a4479d7c": [124], "05dd4840bd": [94], "05f9b8d514": [8, 24, 56, 70, 83], "062bd2bba7": [4, 22, 46, 101], "06602ed5e2": [22, 80], "0675262010": [7], "06992af880": [6], "06b5cb98d8": [14, 68, 101], "06c0f54974": [17, 70], "06c3e76eb6": [8, 62, 76], "06e12f844e": [10, 46], "06fc48b104": [13, 83, 130], "07054eaca1": [8, 45], "0751a18c0c": [18], "076e0fb537": [7, 24], "0774fa6697": [230], "07891f6db6": [21, 41], "0793b5083e": [30, 93, 105], "07c0d2d6a5": [2, 73], "07d0876a86": [32, 56], "07f5a891f9": [3, 24], "0813d382e1": [9, 43], "08289dd369": [13, 49], "0830bb4132": [5], "0840758779": [18], "086238171c": [4], "087944f50c": [8, 37], "0882a7246b": [24, 69], "08b3cebc8a": [1, 11], "08b5eec33c": [15], "08dcd199fb": [1, 11, 24], "0930c51f91": [21, 41], "093735729f": [5, 30], "09463562cf": [31, 91], "09588cad1e": [7, 22, 31], "096427269d": [11], "096c40dc52": [31], "096e2660e9": [2, 20, 62], "097782ff7b": [19, 51], "09ac57c2b0": [2, 14], "09bd0dd300": [7, 55], "09e0a2770b": [18], "09f3899b26": [13], "0a049888df": [4], "0a07b1a3d2": [23, 143], "0a086a2d85": [1, 27, 43], "0a2ba70000": [17], "0a64f7d9dc": [9, 26], "0a8393c8bb": [12], "0a9ad14e01": [10], "0ab6fca491": [17], "0ad28cc3cb": [51], "0ae1bd1e27": [9, 18], "0b0390cc9e": [13], "0b202de6d2": [2, 23, 38, 43], "0b29352f13": [15, 42], "0b31e91f7e": [25, 62, 120, 143], "0b65ae7534": [25], "0b7e06e365": [13], "0b871a2064": [12, 43], "0b8c3a3793": [22], "0bb410e5e3": [23, 53, 91], "0bb677c789": [1, 22], "0bd661cb2b": [30], "0bd6714a87": [38, 202], "0bd7799c10": [3, 25], "0c0524ef3f": [57], "0c1eb48bdc": [45], "0ca2a12575": [53], "0cff7e2770": [1], "0cffa3d5bd": [15], "0cffc0e24e": [4, 80], "0d0c74e96b": [16, 35], "0d12c6c7ed": [1, 22, 46], "0d4ae87aef": [3, 15], "0d667df3cb": [27], "0d938aed89": [25], "0d952abf60": [18], "0db4abed19": [3, 8, 32, 44], "0deea007ce": [4], "0dff9d7564": [14], "0e06737d8f": [8], "0e06e94ca2": [7], "0e264d072d": [41, 50], "0e30007228": [25], "0e6998cbd5": [8], "0e72dc8bcb": [8], "0e7b9716aa": [4, 6, 25], "0e8dbb93c4": [41, 178, 185, 262, 266], "0e97be6c57": [10, 38], "0e9df2c919": [2, 18, 223, 237, 252], "0eb54e9c94": [21], "0ec9d11a43": [3, 40], "0efacab145": [100], "0f01dbf93b": [12], "0f079bab37": [11], "0f338f2724": [18, 49], "0f383ca18f": [7, 25], "0f4f59e2f2": [2], "0f53aba210": [43, 204], "0f6bb2fe1a": [30, 55], "0f6eb859a3": [2, 17], "0fc18ad6ee": [19], "0fca97c0e5": [146], "0fee88d5cd": [10], "0ffe997e64": [5], "10b91c4ba2": [278], "10be15db0e": [12], "10f718629c": [19, 120], "10f7ade064": [6], "110c147fa2": [247], "1123d37fba": [13], "113d7fe698": [18, 57], "11a5e03f16": [46], "11a7b88402": [2, 17], "11ba10c3bb": [17, 129], "11be1a2a34": [16], "11edf6d0f7": [6, 22], "122042f263": [29, 52, 71], "12750c73b2": [11, 31], "129a7e632e": [13], "129e665df8": [44, 201], "12a48bfa62": [34, 78], "12daf42bc3": [8], "12f29d699e": [1, 10, 35], "1300a8e474": [9], "13032372da": [9, 30], "13076066a2": [37], "131012ef64": [22], "13238e9c0d": [8, 29], "133a6a6a24": [28], "13541720d0": [9, 32], "1373a37db9": [16, 65, 74, 101, 139, 144], "138f8e9c7b": [4, 24], "13ff35caa0": [152], "140cbb7462": [20, 44], "141a993793": [1, 23, 47], "143457a337": [23, 91], "1471514aa1": [4], "1486ccfbf9": [35, 169], "148aa33bc5": [13, 41], "14c1b6b5ee": [9, 18], "1517ca8f28": [44, 178], "1522a8eade": [19], "154a40a5f2": [18], "155f40d9e5": [1, 17, 82], "15a547750a": [5, 27, 31], "15aba87220": [8], "15c4b8de73": [44], "15cc3e2b4e": [46], "15cfb709ca": [37, 88], "15ff45fdc5": [29], "1604726096": [23], "16369a902a": [28], "166ba905f4": [55], "1694705dc4": [2, 28], "16a3675813": [5, 28], "16aa661306": [30], "16f50e1ffb": [101], "17024db5b4": [2, 9], "170564bb82": [6, 25], "170adbe9a8": [26], "173b80de09": [83], "173e22c5ed": [16, 39], "17485e8e70": [34, 77], "176165eb1f": [4, 10, 67, 129, 138, 149, 173, 177], "17f6e9c4fe": [13, 43], "18116283ed": [30, 48], "1842287487": [9, 41], "18433ed7cc": [13], "184c8e48a0": [1, 29], "18733898f9": [16], "187a79afa5": [45, 114], "187f4e7e17": [54, 129, 208, 219, 239], "188877affe": [6, 37], "18a8a3929a": [26], "18a920aa32": [3, 19, 29], "1907690ed1": [18, 56], "190c682ac4": [7], "19181cb2cf": [16, 39, 49], "1948c4075b": [9], "1962f02190": [6, 30], "1970646e27": [19, 112, 151, 161], "198ad97010": [8], "19a6b05bb5": [3, 10], "19b6a83634": [7], "19b9f1ca2d": [12], "19c236c7c5": [210], "1a0a373c6a": [5], "1a0f1662f0": [19], "1a3d9c2a27": [12, 25], "1a6bdfc429": [183], "1aa6bdffb2": [21], "1aa777b40e": [13], "1ac5fdabbc": [9, 49, 71], "1acc8c1359": [8, 58], "1aed628288": [23, 59], "1b351004cc": [2, 14, 88], "1b57175631": [27, 95], "1b64602e10": [17, 39], "1b6fdcf465": [3], "1b88055a1d": [14], "1bc169231b": [38], "1bcb19ae4d": [25], "1c1046a3ca": [17], "1c134d8bda": [27], "1c3bfcac0a": [12], "1c4dad8036": [6], "1c574f9414": [44], "1c7c33a9ce": [15], "1c86e3c0cf": [16], "1c9886b127": [41, 90], "1cdaef2d03": [2, 13], "1cebe03520": [14, 109, 135, 178, 201, 229, 253, 293], "1d1367e984": [12, 21], "1d2d46887e": [24], "1d59acf7b7": [91], "1d5a4b70cc": [89], "1db6f98781": [41, 110], "1de7a1fce3": [6, 55], "1e15ba3469": [3, 23, 71], "1e18c1a9dd": [19], "1e1e000cf1": [3, 28], "1e33b7c2a3": [2, 26, 90], "1e4c9c2a69": [10, 39, 75], "1e598decfc": [10], "1ecdacf60d": [13], "1ed82d8cf1": [40, 98], "1eecbd6b1d": [216], "1f054e8843": [16], "1f16adb3db": [28], "1f39c3a26e": [14], "1f6d8a6696": [27, 49], "1fa18c254e": [6], "1fb67a736e": [31], "1fb6bf407c": [62], "1fc227bd0f": [9, 36], "205dcefb8d": [23], "205eefdfaa": [34, 95], "2068b59303": [116], "206901a74d": [1, 22, 46], "206fbc0ddc": [161], "20cd4bc856": [266], "20ebfa4b6a": [18], "2103c8416b": [20, 39], "211706dd6c": [28], "213c4f26a8": [7, 27], "21711cfd06": [23, 58, 79], "217a17be04": [1, 7], "21ac439a20": [1, 4, 16], "21adfb2010": [25, 88], "21c6064b3e": [5, 54, 211], "21cd1d86aa": [63], "21d0919091": [37, 80], "21e30f1027": [25, 59], "21ebbdc05e": [3, 20], "221d814a6f": [12, 147, 164], "22203ea5ba": [139], "222b70f60a": [9, 39], "2295614b75": [16, 56], "22de587e66": [11], "230e8c8395": [19], "232df62669": [14], "23791b78aa": [6], "238e1e178e": [66], "23aa8f3f79": [9, 26], "23b800420d": [1], "23bc24a5c3": [31], "23c3fe67e4": [7], "23d2f3f63a": [9, 22], "23e887caaa": [283, 290], "24325a73ba": [17], "245b98b982": [9, 105, 120, 213], "246a46b593": [14], "24e48d6d99": [3, 14, 18, 38, 75], "2501a93cf3": [20, 63], "251cc99a64": [27, 50], "253f55c7c9": [7, 14], "254375b85d": [1, 8, 28, 81, 88], "254c7cdc8d": [50, 145], "255f4755b2": [14, 30], "258ea03e87": [2, 10, 34, 48, 68, 70, 82, 86, 95, 112], "259e8bfe7f": [2], "25a294cd90": [36, 95], "25e9f962b4": [7, 35], "26013d9298": [42, 173], "26034f0dd3": [123], "261edaf6f3": [8, 29], "2620c6003f": [9, 28], "2674b9985a": [5], "26750cc6d6": [8, 19], "26ab8e88b6": [26, 107], "26e7a4b2e5": [8, 57], "2702de5b6e": [14, 66], "2715945ff6": [12], "27375abc81": [1], "27451fb342": [4, 64], "2770415c33": [3, 14, 42], "277dd2cfb3": [92], "278aae9bbb": [15, 65], "27cdd91e1f": [8, 56], "27d7a2d468": [2, 5], "27dab3fb75": [35, 60, 72], "27e3ef474d": [5, 20, 73], "280d5ea0f0": [14], "284cc5121d": [74], "287162ff83": [2, 15], "287687defb": [3, 7, 61], "287a4c2984": [51, 123], "2907f7a877": [17], "2910477620": [2, 9], "2911390b0b": [7], "291cd3b216": [11], "292f032ec6": [7], "2932029b8b": [83], "2944ba54ad": [1], "295aadae83": [23, 31, 66], "296bfa5b52": [6], "297c65ec3a": [13, 23, 29], "29838c1324": [14, 110, 148, 207, 217, 236, 260, 266], "2983c65f27": [46], "299c8954e3": [27], "29daa0c5da": [5], "29fb25cec7": [15, 27, 61, 67, 72], "2a04afc17c": [32, 67], "2a16c1b8db": [28, 103, 134, 216, 221], "2a2197c72f": [8], "2a2c27f4db": [61, 108], "2a3319f8b0": [10, 21], "2a70eee191": [13, 30], "2a98088655": [19], "2a9b728bd8": [5, 15], "2aa3809295": [53], "2ac50c58a7": [10], "2adc812526": [11], "2b15590a35": [24], "2b52778c1d": [118], "2b7c07273d": [20], "2bad05e932": [35], "2bb1e7fd18": [25, 71, 142, 159], "2bd7da64be": [3, 32, 56, 60], "2bdb41af08": [4], "2c2cbbc0e5": [3], "2c4625ade5": [35, 52], "2c487b72a3": [43], "2c81869c45": [7, 33], "2d58988be4": [5, 20], "2dc0f077da": [12, 44], "2def6899c1": [11], "2e0aa43eb3": [18], "2e33949869": [3, 8], "2e3af4ceaf": [164], "2e630495c4": [20], "2f187e1d7f": [9], "2f89f7ce27": [55], "2fa6ce56d7": [73], "2fa8b71c2f": [23], "2fad58e679": [18], "2fb2290817": [26, 31, 56], "3072b59c95": [157], "30a7d01a3b": [83], "30c9c68340": [1], "314b1747aa": [44, 174, 213], "314cece241": [13, 36, 73], "3196cd1fd8": [396], "31a1708b1e": [14], "31ac5392fa": [12], "31c2c820fd": [5], "31d534627b": [36, 71], "32354c03fc": [45], "326538ecf6": [14, 30], "326cfdbd47": [23], "32aaa154d0": [3, 10], "32ad22b692": [30, 46], "32ba707dd1": [3], "32c756c08b": [20, 48], "32d5c46cf9": [23, 75], "32e177e041": [69], "32e5fe88a4": [56, 121], "3326c16d33": [19], "33432d27cb": [21], "336bb633f4": [11], "337997e109": [12], "33a7e829e5": [8], "33cfd710b1": [12], "33ecf8aef4": [39], "341f89c11f": [12], "342e577691": [23], "34a7b3643d": [7, 22], "34afd77c0a": [1, 24, 29], "34cdc8cc16": [13, 74], "34d1f34713": [17, 87], "34ee2b33f6": [17, 34], "3503f09b24": [2], "3520623eb5": [102, 108], "35243cf0e1": [36, 114, 129, 172, 209], "354c958af1": [48], "3563d2467d": [61, 116], "356dfc3b5b": [5], "35d9b96071": [13], "35f257ef91": [6, 43], "36031386d8": [194], "3633264877": [15], "3646374d5e": [274], "366c69e6c0": [23], "369ee786f6": [29], "36ebe0ec62": [32], "36ed371b23": [2, 6, 44, 52, 78, 98, 115], "370b88ff63": [22], "372f65598b": [5, 27], "372f7ecce0": [40, 81], "3794d6068d": [2, 6, 41, 55], "37e30ea5f1": [20, 44], "37f7ed47fc": [1], "380d35e2de": [2, 8, 35], "382baf8455": [15, 36], "382eba2b66": [3, 9], "387c2c1ca2": [16, 58], "387fa9178f": [9, 69], "388b47516d": [7, 26], "389056fe8e": [5], "389835c33b": [10, 51], "38bf47d0a0": [1], "38c0c77799": [2], "38e910cb57": [35], "3903323b77": [3], "391f1393d4": [11], "39245dc052": [31, 90], "3929b8c070": [17], "3942d34eaa": [10], "3979eb7a17": [4, 27, 72, 187], "398bd8bc55": [2, 10, 70], "39ba25d9bc": [3, 11], "39c803b61a": [24, 44], "39e515c94e": [18], "3a0dfc4c1e": [31, 50, 62], "3a141ccc23": [31], "3a2f76fbfc": [20], "3a592e568d": [8, 41], "3ad56ab892": [5, 32], "3aeb6795e7": [14, 156, 309, 364, 376], "3b027a7898": [3, 12], "3b0e05f82a": [23, 58, 84, 131, 203, 275], "3b15e24d18": [14, 74, 130, 142], "3b47afca2a": [13, 88], "3b5e2648c7": [21, 76], "3b838020ff": [7, 67], "3ba76bc4d3": [1, 24], "3bab7ef285": [22, 72], "3bb939c9a7": [4, 21], "3c07f98d75": [28, 77], "3c225df3c8": [40, 101], "3c34cd282b": [7, 64, 81], "3c3b0c993e": [6, 43], "3c550832ba": [52], "3c6dcad784": [10, 34], "3c98b1e46e": [9, 37], "3d1234222f": [49, 100, 126], "3d1f91f56c": [16], "3d34c2174d": [37, 63], "3d6f95d4fd": [29], "3d8222f527": [5, 37], "3d84337cc6": [1, 8, 62, 146, 175], "3d870e511c": [7], "3dc1ad7c6b": [5], "3dcc4736ad": [16], "3e377c3466": [8, 51, 62, 112], "3e8f1179c7": [25, 73], "3ec0dfcd75": [7], "3f055b4bf1": [43, 89], "3f142a1cf2": [2, 7], "3f604cb7de": [1, 8, 431, 457, 471], "3f6aa11ab7": [24, 36], "3fb0b56934": [91], "4019e1ecde": [28, 85, 126], "406bc05d5f": [13], "4074c75f84": [26, 79], "407f6cd502": [10], "409af9a7ee": [3], "40a93aeff6": [283], "40f2ebe521": [1, 26, 103], "4109db54d8": [26, 50, 151], "41320a3bb0": [31, 73], "4132998d98": [4, 8, 20], "415744312a": [109, 115], "4182388ef6": [54], "418b681ee3": [49], "41c156c2f6": [13, 110, 133, 172, 197, 215, 238, 273], "41e4aaa8cd": [153], "41f8394bdd": [6, 29], "420cc1e078": [7], "421f74bd95": [2, 23, 62], "4238a4b723": [3, 15], "42396d825d": [12], "424b4799cc": [31, 91], "42569c0eea": [7], "425c232a53": [110], "426d869b87": [4], "429d0f04f9": [5], "42b7b5032f": [144], "43293cc69d": [28], "435b6442fb": [4, 11, 18, 27, 81, 103], "4381254341": [57], "43a558b4c1": [271], "43d2149bc2": [25], "43fe655aa4": [99], "4414f2986e": [14], "4415919bd5": [2, 7, 46], "44164b59eb": [11, 45], "447c420b66": [12, 50], "4489d4d14f": [27, 134], "4495c94f39": [23, 67], "44e0ceeb47": [44, 178], "44ff3e65f2": [22, 52, 61], "4522ed1400": [19, 37], "4572e862bb": [42, 76], "45797f9c64": [13, 84, 104, 145, 161], "4595de5392": [15], "45cd5ad364": [11], "4629037d3e": [17], "46331133e3": [7, 36], "467cd26279": [40, 132, 146], "46c4363c69": [5], "46cb2938ae": [144], "470383b3da": [8], "4765e22bba": [1], "479c930231": [7, 11, 26, 42], "47e7bae245": [6, 28], "47e89515f0": [44, 112], "48113caf6c": [13, 36, 51], "482a230d13": [7], "48521931b2": [10], "4854b0e343": [14], "48604cf5a5": [9], "48dd7bce7d": [26, 52], "4919f41a78": [11], "492974b774": [6], "493b68ecb5": [4], "494392348f": [12, 40], "4953b098e5": [23], "495551509d": [45, 115], "495b2cadd5": [46, 157], "49836acf21": [40, 114], "49c3016f36": [8], "49dc7fa156": [17], "49fd3a3be7": [2], "4a1ef7124d": [37, 105], "4a46bab1e9": [2, 23], "4a808d881f": [14], "4a819ce3fe": [10, 39], "4abe710d73": [22], "4ad85d5cbe": [2, 21, 61], "4af76c3ffe": [14, 48], "4b232954a2": [5, 34], "4b3cadf5ab": [2, 15, 24, 104, 150, 199, 255], "4b83186eff": [19, 72], "4baa1cfa1a": [5], "4bb6fbc338": [5, 29, 46, 64, 83], "4bcc629a89": [5, 19, 73], "4bd8f3f16b": [1, 9, 28, 38, 68, 72, 83, 120], "4bdbb0fd90": [12, 54], "4c1372ac55": [25, 53], "4c140e11c8": [2, 18, 50, 64, 126, 167, 196, 207, 218], "4c2d3f4ecb": [40, 80], "4c3431be06": [5, 30], "4c3793276f": [24], "4c4854885c": [8], "4c63f63bca": [94], "4c771f91d6": [29], "4c8d96d8a2": [203], "4cc0870918": [17], "4d062c2734": [6, 43], "4d575261fc": [30, 72], "4d625aa253": [6], "4d8e225d3d": [265, 399, 435], "4db4e34990": [132], "4dda56ea8e": [33], "4e4cecb68c": [3], "4e736c2fe5": [16, 24, 30], "4e7d602b0c": [18, 134], "4f3b34229d": [13, 73], "4f3e17ba2b": [8], "4f45f1a38c": [47], "4f55e81386": [3, 14], "4f814b702a": [29, 75], "5057c5b8b4": [51, 122], "50606b623f": [97], "50c00f300d": [3], "50cc7579d6": [2, 13, 56], "50d0b82872": [6, 55], "5123466553": [1, 25], "51267d2c1f": [21, 67, 89], "51972ee722": [31, 124, 166], "51bf42c5a9": [27, 72, 189, 201], "51d24b5bbc": [2, 14, 61, 68], "521008b5f1": [14, 68], "525b583b37": [13, 46], "5284d43edb": [35], "529fdb6cce": [2, 14], "52d1f9fc05": [24, 48], "52ee74ac14": [33], "52f0272d4e": [14], "52f5d795f8": [33], "52fc548f6f": [21, 25], "53541f31c3": [9], "5364520def": [20, 99], "53d2e23155": [2, 6, 24], "53da287bc4": [6, 28], "544bc1ce02": [38, 79], "549a46fb60": [26, 104], "549dafe2da": [3, 65], "54a448bb83": [14], "54edef68c8": [14], "55142e08ac": [142], "5551214f27": [104], "5562cd5860": [31, 194, 292, 316, 350, 380, 406], "557599f80d": [24], "5575ca6c49": [13], "55ab7204d2": [3], "55d90268af": [7], "55e0cf897f": [167], "55f1e3a048": [6], "560fd8f0eb": [57], "561ca9b9d1": [26], "56236a1895": [16, 84], "5623c9b29e": [5, 72], "5634029478": [23], "569aff66aa": [7], "56bbb0271e": [1], "5708271139": [38], "57543d00c5": [35, 98], "5765492789": [54], "577dd9f75a": [19, 36], "57c85e43ec": [6, 26], "57e42990bd": [13], "582a1779fb": [19], "5842ff1756": [101], "585afb1bb7": [125, 128], "586aa53bba": [42, 243], "58b14541e1": [5], "58b665bfb0": [86], "58c23ff0d4": [34], "58ee871ac9": [119, 128], "58fd9ba0f7": [1, 24], "59502ea328": [5, 38], "596dac75c1": [16], "5983ae71b6": [23, 45], "598ee17e08": [12, 64], "59bb3a649d": [3, 23], "5a0028dea6": [2, 11, 28], "5a11427217": [6, 73], "5a247696a1": [8, 71, 89, 131], "5a398a3a22": [8, 58, 76], "5a4986aa7a": [53, 128], "5a4a5bb311": [8], "5a7a29e096": [24], "5a7d047b8b": [66], "5a88da5822": [7, 33, 43, 134], "5a95c16f68": [6, 28, 41], "5aa2c47151": [5, 26], "5aa621baea": [41, 130], "5ac055d439": [54], "5ad03c0912": [32], "5afd5cf2f7": [25], "5b00a5d79a": [37, 197], "5b41fc80c0": [6], "5b4a60149d": [34, 84], "5b4cf01276": [3], "5b603ca1b8": [27, 113, 122, 135], "5b8c7b9104": [2, 25, 179, 190, 195, 218, 238, 267, 273, 370, 381, 420, 425, 428, 491], "5bb97a5d4c": [16], "5bd6e040ed": [52], "5bea212951": [1, 32, 84], "5c114bbe5c": [26], "5c12047087": [40], "5c23e34818": [25], "5c9357bf7f": [152], "5cb7e705ff": [12], "5cc65c2b69": [41, 69], "5d03e865c1": [18, 93], "5d056d2493": [3], "5d584ebb01": [2, 14, 27, 36], "5dc7c20148": [24, 45], "5e5ce14ceb": [14, 95], "5e6af3516f": [28], "5e9aa7a3cc": [147], "5eb8fffff3": [31, 40, 284, 333, 338, 369, 384, 402, 410, 460, 470, 479, 503, 512, 523], "5ed3ee38b3": [30, 55], "5ed5e12c64": [282, 296], "5ed6b70921": [7, 49], "5eddcc511b": [13], "5eeb48ff4f": [1, 12], "5eefc01f5f": [7, 53], "5ef2bf0c65": [29], "5f13b1a4fc": [8], "5f3508ed1e": [13], "5f69c3eef9": [30], "5f6b02e58c": [2, 28, 55, 127, 193], "5fbda0d3a7": [51, 147], "6019b592d5": [34, 54, 135, 141, 201], "6020c1abe5": [4, 6], "6037d934de": [34, 72], "603ebe4c7d": [31], "60410c0f50": [36, 112], "60652cd27a": [10, 33], "60685caf4a": [12, 43, 105], "607a716730": [21], "607f3b700b": [10, 32], "6082359f60": [162], "60b34d1ce3": [8, 29], "60baff6fa6": [2], "60ca370b32": [4, 28, 42], "60d4f485de": [28], "60fa67b696": [8], "610858e5d9": [19, 46, 70], "614d9b5986": [24, 57], "618034471e": [13, 21], "6180c7b4ba": [16, 27], "61a9f31f4f": [2, 21], "61b203c0b7": [8], "61b75edd21": [2, 18], "61bff551e4": [15, 87, 96], "61c21fe240": [190], "620c3b8290": [7, 12], "622f3068bd": [6], "62322d9819": [6], "627f78cb52": [8], "6283566874": [3, 5], "62e44f9ae2": [41, 150], "631420634e": [11, 47, 60], "632501ce9e": [15], "633faa5386": [11, 25, 28, 45, 63, 72, 75, 89, 99, 106, 122, 133, 145, 155], "634375b9a8": [17], "63439047d4": [3, 18, 86], "63616cb9e5": [17, 72, 90, 93], "638f9e4817": [6, 29], "63c1c72ec3": [20], "63d76de48e": [8], "63e754bbc8": [2, 5], "63e7fe20d3": [56, 142], "641962833a": [34], "642c931dbe": [14], "6443dd5b69": [260], "6495267208": [13, 110, 150], "64bdb595db": [23], "64bf49df97": [29, 45, 60, 135], "64c5940357": [15], "64ee7bcb7e": [15], "6524c79ea0": [51, 92, 111], "6541de58b7": [22], "656d1fb62f": [1], "65c3eb5e58": [3, 8, 138], "65cf5baba3": [11, 52], "6628cfddb3": [3, 10, 59], "662ef9326a": [28, 46, 94, 118, 126], "664b6ff221": [8, 74], "664e9e83fa": [2, 8, 20], "6665fbd63e": [24, 101], "669a057792": [40, 152], "66afbc0a8f": [40], "66b1d6022f": [4, 49], "66cb6baae1": [119], "66dd536ce1": [1], "66fd9129d7": [23, 96], "6706808dc5": [3, 6, 25, 34, 49], "673655d50f": [1, 4, 22, 26, 55, 69], "6751d9a690": [6, 33, 44], "67851654f4": [32, 87], "67ad5b0241": [11], "67b2cac98c": [20], "67ef06d61f": [65], "680b79c570": [36], "682595d8e1": [8, 28, 50], "6832199963": [19, 216, 231, 240, 290, 303, 324, 332, 338, 353, 363, 383, 419, 439], "689817609f": [23], "691bfe5e18": [10], "6933b051df": [37], "6942a735f0": [18, 32], "695add54d2": [6], "696571729c": [11], "6968c6bbd2": [5, 37], "69bb9788e0": [2, 13], "69ccd079de": [6], "69d085fd2b": [51], "69d35bb54f": [144, 196], "69e1537dbf": [7, 14], "6a10bb0fdd": [30, 109], "6a2a58a711": [4, 12], "6a530c7f4e": [22], "6a5ac5bd46": [25, 29, 59, 74, 106], "6a60305df6": [10], "6a6e4b8b4d": [246], "6a843038c8": [17], "6aa597b224": [15], "6b056aeb45": [13], "6b309d0d74": [5, 9, 30], "6b4adc3725": [30, 61], "6b4b8f4490": [26, 76, 81], "6b67e002dc": [4, 17, 77, 133], "6b82203d03": [14], "6bd2ab28a4": [6], "6c031d4473": [145], "6c0f4d3216": [2, 19, 27, 42], "6c5c61fdde": [125], "6c89da12c7": [13], "6c8ccfd8f5": [12, 29], "6c9b4ef285": [19, 33], "6ca7c5f254": [2, 21, 71], "6cc3c2cf13": [9], "6cd4932f1e": [1, 24, 44, 55, 76], "6d25c5fb71": [4, 24], "6d3146e022": [16, 44], "6d82f1a416": [24], "6db0a162fd": [2, 24, 53], "6df901580e": [17, 114, 140], "6e31a62fbe": [26, 73], "6e34207ff3": [7, 31], "6e70260b6f": [5], "6e77e51fa8": [2, 24, 73, 87, 94], "6eba65aedd": [1, 31], "6ebf63ba45": [18], "6eccbe634a": [19, 72, 90, 93], "6edc63d9ad": [1, 24], "6eff1a251f": [46, 57, 78], "6f32e25733": [18], "6f47013b58": [38, 158, 189], "6f48dac2ed": [42, 115, 126], "6f6cab6f70": [27, 65], "6f84cdd9e7": [14], "6fe99a175b": [6, 11, 26, 29], "6feb7db5ab": [9], "6ffeab9f89": [1, 5, 16], "6fffb7c410": [15, 65, 70], "7008971129": [44], "7018400971": [39, 103], "70192e87db": [44, 125, 162, 262, 305, 317, 373, 395, 425, 474, 491], "7027a7b045": [5, 12], "703ddd795a": [14, 77], "7049fc26a2": [41, 79], "70523f2080": [13], "707fd7cab0": [7, 29], "708cc91dd8": [26], "70aeac9eaf": [21, 78, 105, 116, 133, 143], "70d417df11": [37, 127], "70ddbab1c9": [35, 52], "710ddc8e95": [152, 245, 263], "7139677167": [33], "714e73e776": [4, 7, 43, 50, 84], "7172919580": [12], "71c0570a2b": [12, 20, 25], "71e0bea236": [92], "71f2ef2ad8": [6, 17], "71f4ed4253": [6], "7207d5f9be": [59], "72145e1e64": [20, 78], "7228763eb6": [10, 23], "725ec3bc1a": [10, 48], "7288abb0e7": [19, 47], "72970579ad": [15], "72a573765e": [20, 47], "72af6a1a5f": [34], "72b4a8b8af": [3, 11, 60, 81], "72c5779792": [16], "72cd07fe2c": [1, 7], "72dfd7221a": [1, 21], "72e1ed74c7": [2, 10, 32], "73416767b5": [17, 73], "73489acebe": [9], "73580f766d": [33, 175, 191], "73bb3ab49f": [27, 82], "73eee7bc02": [11, 32], "742550f70a": [23, 100], "744edcd192": [24], "745fcab356": [2], "74b04a6e0d": [19], "74c168f4b0": [6, 58], "74ceaa18e2": [31], "74e3486b1c": [23, 45], "74fb2db6d1": [70], "74fdd7ccb2": [1, 31, 60], "7512b49ae9": [9, 28], "751e59755d": [7], "75552273da": [9, 61], "7595c024b8": [27], "75bec727e9": [39, 44, 59, 84], "75c8878288": [10], "75d1814060": [52, 121], "75f6b785eb": [5], "76038c7fdc": [32, 92], "76071d6bec": [45], "76088c81a0": [4, 11, 21], "7611e40657": [17, 35], "7641f8737b": [2, 7, 24], "7652f376b6": [21, 27, 32], "767e7a7afc": [103], "76804cf704": [8, 57], "76a42e8855": [5, 41], "770065e262": [8, 32], "771aaf6770": [15, 61, 66], "772d7052e5": [7, 16], "772e549f39": [14, 65], "773a2cbaf6": [115], "773dc06160": [14], "774e2c5c16": [17, 32, 47], "7765d0a754": [16, 58, 67, 70, 79, 126], "7791e1fb62": [48, 89], "77a01ca058": [23], "77a676fa96": [14, 45, 53, 59, 65, 82, 94, 102, 114, 127, 166, 176, 184, 198, 202, 207, 216, 240, 252, 266, 275, 280, 286], "77ac280506": [16], "77b99a20dc": [4], "77c090890d": [11], "77dd5553e6": [16], "77df7f6467": [375], "77ec9f1833": [8, 81], "780c86b7d7": [70], "782d4cb162": [5, 33, 41], "787d585d12": [17, 26, 78, 124, 131, 141, 147, 169], "78803516ba": [24], "78891fca35": [3, 10], "78b2d4707b": [25], "78ce08320a": [13], "78d35489de": [8], "78eec5fb02": [8, 29], "790eff08ad": [7, 60, 80], "793e441f5e": [8], "797939ad46": [6], "7980f4e68b": [4, 22], "7986e3cfcc": [1, 14], "798f68676a": [16, 62], "79fc412ec5": [43, 108], "79ffaf4d97": [37, 95], "79ffd9f0a8": [11, 45], "7a1fbb371a": [22], "7a2ff6d707": [7, 23], "7a6f415ea3": [17, 35], "7a77d6189b": [25, 116], "7a80baa3a3": [5, 37], "7a82b4999d": [12, 36], "7a8bc6b7f9": [7, 10, 21, 68, 75, 80, 93, 116, 128, 148], "7a9298b819": [9], "7ace379e29": [13, 39], "7b01c03121": [20], "7b60267121": [15, 21, 28], "7b6ef1510a": [5, 36], "7b7aba9eb9": [1], "7b947edf4f": [101, 115], "7b9f325ebb": [2, 13, 53], "7ba4045af4": [2, 28, 78, 105, 170], "7bb342c33f": [22, 33], "7bdb2671d3": [2, 30, 37, 98, 109, 122], "7bfd59ffdd": [9], "7c09e8d055": [25], "7c1e3dad6a": [35, 76, 114], "7c22dfab7a": [1], "7c35cacfbf": [10, 29, 41, 54, 83, 95], "7c38687b66": [26, 89], "7c391988e9": [3, 8], "7c7836865d": [3, 19], "7cae37e64a": [19, 36], "7ccb4a517d": [35, 54], "7cd66bec0e": [2, 23, 58], "7ceaca6678": [6], "7cf9fb7114": [13, 58, 103], "7d210e84ce": [34], "7d21e658ae": [5, 37], "7d30dd78c7": [32, 131, 181, 188], "7d92987b98": [15, 57], "7d94c1efb0": [5, 39, 70, 87, 111], "7dac56d1c7": [42], "7dae928dac": [10], "7dfe857174": [20, 60], "7e09e70000": [28], "7e362d32cf": [47, 100], "7e3f3b88da": [5, 35], "7e50bac4ea": [22], "7e5a9d1ff6": [5, 25, 63], "7e99fe08ec": [30, 48], "7e9d3ee375": [30, 48], "7ee60b0dfd": [4], "7f1f07f651": [9], "7f695eed61": [17, 51, 106, 133, 137, 193, 242], "7fbe2047c8": [15], "7fda8ac08d": [13, 32], "7fdc3db67e": [17], "7fdedaf1fe": [5], "7fdf6392b7": [25], "80789e8e5b": [5, 30], "8079e5a1c0": [6, 29, 59], "80e947f3b2": [15], "810286db53": [33, 55], "81224b2233": [17, 31], "8149421c3d": [15, 35], "81726f3e53": [53, 100], "8177ea83d3": [8, 65, 110, 182], "81ce53e544": [10, 57], "820d431551": [69], "8262fbbc73": [7, 33, 133], "827ec81721": [2, 12], "82f0d8253f": [2, 14], "82f5bc8cab": [6], "83009ac07b": [23, 53], "8331a86bcb": [25, 58], "833cbed39e": [5, 30], "83470dbce5": [1, 17], "8366f2c04d": [9, 63], "8399d3ab85": [26], "83d45136ed": [14, 34], "83f715c1b6": [3], "84047aacb1": [1, 25], "842767ec46": [7, 28, 82, 116], "8433a18df0": [27, 105], "8444271b7a": [7, 35], "848cdcbd41": [26, 93], "84a8133b04": [19], "84c31543b7": [14, 30, 82, 132, 154, 163], "84dc3a8e0e": [33], "85053cd7fe": [8], "853f908c20": [60], "856eaef8d2": [17, 30, 35], "8583fdc2f8": [1, 26, 79, 98, 112, 123], "8586831d13": [6], "859037f61c": [5], "85e02a6088": [20], "86026a6b05": [10], "863b442c8f": [2, 9, 110], "86793e042f": [5, 11, 56, 144], "8698ec2712": [160], "86a2d8aa5b": [168], "86c54b9e22": [26, 53], "86d798d546": [6], "872d52ccec": [6], "8753ff7129": [5, 52], "87550dce97": [1124, 1140], "8760cdf3da": [34, 118], "8793965c8e": [11], "87f399eb3c": [16], "88043e47df": [7, 47], "8815257be0": [22, 56], "8818265f80": [31], "884702cd5f": [28], "8880332e49": [10, 70], "889fbf0ab4": [2, 12, 23, 48], "88a059d58c": [48], "88a3f62594": [9, 88, 104], "88eba8e160": [24, 28, 61], "88f977e1c9": [19], "89123ddd08": [20], "891a620b7f": [20, 62, 80], "891d8fec24": [20, 49, 59], "892b3ab561": [7], "894f73832d": [16], "8961840a38": [16, 74, 99], "898d05c885": [9], "89ce24a7e4": [26], "89ce928a3a": [45], "89d9703163": [5, 7, 24, 51], "8a4c7d9152": [36], "8a5bda7119": [9, 25], "8a7c02e3a2": [9], "8aa07fc4c8": [12, 41], "8aa364b1e2": [9], "8abbf499bc": [27], "8ad2a58fae": [6, 12, 30, 41], "8afe7c12e4": [27], "8b4d387de6": [1, 6, 32, 100, 128, 153, 166, 191], "8b535f39fd": [7], "8b5ac0a9f5": [28], "8b7ced7727": [8, 22], "8b7e8fae0c": [3, 30, 76, 130, 156, 189, 198], "8bbf13c9e5": [7], "8bc0d7ddeb": [19, 27, 49], "8bd2c05998": [107], "8c3fd62f70": [4, 19], "8c40b7a08a": [16, 36, 43], "8c7ed96f26": [39], "8c860499fe": [14, 36], "8cc2b264f8": [4, 19], "8ce6103cec": [14], "8d4208abaa": [6], "8d6c6b2526": [34, 187], "8da3f2044b": [8], "8dcad41a16": [20], "8de1e33207": [12], "8de5abd5bb": [33, 44, 76], "8e1c1a3b05": [4, 16], "8ea5cacccb": [153], "8eb74bcdb2": [70], "8eb7b77eac": [18, 72, 113], "8ebce02fcc": [4, 26, 105], "8ec0ab4c1c": [6, 30], "8eca5b6291": [67], "8f1d3295d3": [45, 95], "8f426fb922": [24], "8f81fcc06d": [6], "8fc9265bbb": [16], "8fd3be80c1": [16, 28], "900b694037": [15], "902439b88a": [65], "902f50cc49": [8], "9031790467": [27], "9062dd1b2b": [6], "90973efc4c": [9], "90d17979f6": [126], "90d362899c": [12], "91550f9cc2": [26, 86], "9161ccba4c": [17], "9170fb566c": [6, 19, 92, 106, 109], "917188c1c8": [5, 46], "918521c1a1": [12, 37], "9185ba7ba4": [20, 38], "918c873626": [10], "91a109c7b3": [20, 50], "91c12b6df6": [18], "91daadfbf3": [99], "91df7e73d1": [7, 118], "91e8f0576a": [3, 26, 32], "921d08255b": [4, 16, 21], "9241a167ad": [29, 73], "9260919d29": [14], "9261cee398": [2, 39, 65], "92d1a76a1e": [2, 7], "93010ae831": [123], "9321a7470e": [3, 11, 28], "935a58d7f0": [22, 50], "939c160b9a": [10], "93ac47db45": [5, 25, 38], "93b4c8839e": [30, 127], "93ccbb734d": [2], "93dd8bca90": [7, 15], "93e7e20764": [45, 101], "93ff63cc37": [2, 29], "941726aae3": [54, 75], "9450799d63": [3, 30, 36, 54, 69], "9461459053": [43, 96], "946d766608": [27], "947f5fd6bb": [3, 26, 54, 86], "94b626af29": [6], "94bbf09849": [14, 30], "94cd058619": [9], "94d638cada": [2, 27], "94dd8a8804": [14], "94ef671655": [1, 27, 68], "9508036a46": [13], "95162978d8": [31, 48, 53, 66], "952061783c": [17, 44], "9522b364bc": [14], "952d415bd0": [4, 34, 54, 64, 88], "952f3bdc0c": [9, 49], "9535af5b01": [36], "953adcb448": [12], "9548c2a0af": [140], "959709f400": [1, 4], "95fcd35296": [42, 118], "9600def039": [9, 62], "960c00d45b": [42], "963d364084": [11], "96b24917f2": [11, 19, 32, 57], "96babb7944": [8, 69], "96de2fb2f9": [30], "96f85d9754": [9, 27], "970226a4f6": [2, 16], "970569cef4": [10, 19, 42], "977a205f2b": [13, 58], "977feea9fb": [5], "97846e1477": [38], "97c088d35d": [13], "97d1e10a2e": [1, 20, 26], "97feadff93": [26, 81], "982fff7834": [143], "983f6f2af3": [2, 18, 196], "9847df394d": [1, 19], "985a80121f": [18, 110, 127], "9897ed7e4f": [9], "98c69fe963": [26, 78], "990b070149": [8, 31, 52, 140], "9945f39f88": [13], "994d3cd5de": [5, 16], "9953d5bcdb": [27, 89], "995a6107a6": [66, 224, 231], "999139f48b": [96], "99d9861d2b": [9, 34], "99dbb51790": [5, 15], "99e2274615": [7, 27], "9a32bad7ef": [3, 8, 17, 32], "9a32c0ee98": [23, 36, 49, 57, 64, 72], "9a896fb4af": [6, 18, 41], "9a95a4f62a": [6], "9aa56f7110": [10, 41], "9ac8a009cf": [13, 113], "9acdbb1489": [116], "9acebef170": [13, 73], "9b2819e850": [31], "9b3687d7a3": [1, 24], "9b67090f75": [13], "9b774edb00": [19, 82], "9ba5756f0f": [2, 10], "9baa888266": [3, 23], "9be0216b78": [10, 44], "9be5d5b7cd": [14, 45], "9bed52b6f2": [9, 18], "9bf781cfd0": [9, 33], "9bf9cd4d4d": [19, 27, 49], "9c0efca2aa": [1], "9c9be63cea": [15], "9cf8d7ff74": [17], "9d13614ac0": [33, 105, 133, 139], "9d2be3e097": [9], "9d33c224ca": [29, 58], "9d597d249c": [27], "9d7af85cc8": [12, 25], "9da1a642d2": [14], "9da326210a": [4, 49], "9ddbefb2f4": [5, 17], "9ddff901b0": [7, 16], "9de4751934": [6, 37], "9df610f8da": [11], "9e123ed7f4": [2, 16, 59], "9e28f229f1": [2], "9e2a1024f8": [3, 11, 24], "9e3aa869d1": [1, 8, 39], "9e48ba244a": [1, 26], "9e5b01b5ff": [30], "9eadb6d035": [17], "9eb7601872": [26, 82], "9ed292c91b": [15, 28], "9ed4d97eb6": [13], "9ed6853d12": [7], "9ed73a7199": [101], "9ef08e5c37": [10], "9f0915b8b6": [19], "9f39cd3fe5": [3, 6, 25], "9f4360708f": [28], "9f58f02029": [17, 31], "9f61c13582": [2, 29], "9f7fa7985e": [7], "9f83ac8a37": [11], "9f9a597beb": [7], "9fd2fd721e": [7], "9fdc47b282": [15, 58, 82, 246], "9fef560cc3": [14, 32], "9ff1d7e100": [9, 33], "9ff6b3bc40": [8], "9ffcd8fa83": [10, 96, 115, 130], "a0346320c1": [14], "a0372e1344": [22, 38], "a05122d1dd": [2, 67, 133, 152], "a05d95321c": [8, 102], "a0acba9011": [9], "a13d240a5b": [45, 146], "a14404e6c0": [68], "a1629e8ec1": [39], "a1b5fe7957": [17], "a1b69714ca": [20], "a1d928f492": [17, 46], "a1db05f1aa": [2, 6, 43, 48], "a24cb481b0": [137], "a260e6addf": [9], "a2ac0f3c52": [38], "a2acd7485d": [3, 23, 104], "a2d0a590c2": [20], "a2e08d930f": [6, 8, 34], "a32349c04f": [41, 76], "a32c79c469": [24, 170, 271], "a3515ff7e2": [36, 111], "a357faf8d3": [16], "a3617e6379": [38, 74], "a366485f51": [3, 5, 45], "a383dd16b7": [35, 79], "a38c04aef1": [29, 66], "a3f42f394b": [10, 31], "a3fd84d744": [11], "a43e94476d": [35, 86], "a458f3eccc": [2, 5, 17], "a4662bec21": [14], "a4702e5847": [7], "a4746d5b55": [4, 35], "a485dc99ee": [22, 61, 139], "a4d4654cf6": [3, 7, 16], "a4f0ebc9a8": [47, 71], "a4f6e0a9b0": [28], "a50350de60": [17, 21, 38], "a5219fc0aa": [200], "a54045e585": [8, 91], "a5702d0a3d": [2, 18], "a579e89259": [31, 76], "a5965b31a6": [4, 35, 43], "a596bb7f92": [30, 89, 99, 115, 131, 141], "a5b7430b29": [32, 36, 64, 136, 155], "a5c16e5d1f": [3, 33, 62, 67, 93], "a5cbbbcf14": [22], "a66f46e9a9": [18], "a67bcbad7e": [25, 103], "a69b54a190": [25], "a6aeadef13": [38], "a6e83c839b": [43, 160], "a6f9f9d8e2": [1], "a6fb41983a": [1], "a7338b7ef8": [71], "a7b3c0b72d": [48, 103], "a7b4e351fd": [9, 58], "a7e2039272": [323], "a7f47ec744": [33, 144], "a85e58d065": [4], "a8a2b710d9": [8, 26], "a8a65a05dc": [12, 56, 70], "a8ca604f8b": [27, 119], "a8d10c9008": [2, 12, 81, 108], "a8d9c799ca": [7, 32], "a8ea66486f": [15, 82], "a935a55f36": [41, 67], "a99a688f52": [7, 33, 120, 133, 170], "a9c95b5a8c": [17], "aa0c470553": [6], "aa11aad012": [12, 23], "aa2898fee2": [24, 104, 133, 176, 190, 203, 211, 231], "aa3ca47297": [28, 76], "aa58862b97": [18], "aa5b03cce1": [6], "aa72aac7bc": [17], "aa764afad4": [26, 174, 190], "aadc99f9f2": [1, 9, 28], "aaff53e206": [8], "ab025d0abe": [1, 4, 11], "ab0dfd26ca": [9, 35], "ab2c478d08": [13], "ab687c806b": [31, 72], "ab6a3f64aa": [4], "ab77d2a62d": [5, 8, 33], "ab8aa527ab": [18, 60], "abb1f1026b": [1, 16], "abc8c78e25": [12, 32, 51], "abe60e5646": [7, 23, 51, 63], "abf2154f1b": [24, 43], "ac13e5a11e": [6, 12, 40], "ac3004c744": [122], "ac784e8c9c": [7], "aca718515a": [24, 62], "aca8131126": [1, 39, 72, 103], "acb3995f87": [108], "acd963e034": [130], "ace1d3d722": [14, 31], "aced4b8766": [2, 52, 68, 123, 143, 171], "acf78b78fa": [10], "acf9f75a32": [13], "acffd5e4ce": [1, 5, 38], "ad028114df": [49], "ad314f59cb": [5, 35], "ad412d6351": [17], "ad50146616": [2, 25], "ad78fd446b": [27, 92], "ad7fe7fea4": [11], "ad86fb6f3d": [12, 76, 100, 114], "adc0e07841": [24, 50, 67], "adcf65afaa": [29, 35, 49, 65, 93], "add62c8998": [4, 32, 66], "addbfd58c3": [11, 25], "ade39a4b55": [14, 45], "adeaa91549": [10], "ae0134a157": [4], "ae0fbff846": [9, 40, 74], "ae5ecae3c1": [35, 76], "aeafa32137": [17, 52], "aee761d7be": [51, 265], "aef0a38590": [17, 33, 51, 92, 164, 169, 180, 186, 201, 219, 246, 255, 292, 306, 318, 338, 371, 387, 413, 417, 420, 458], "af00c2aa2b": [1, 38, 50, 54], "af0207d0ce": [7, 63, 80], "af103e2537": [5, 32], "af116c0e68": [17, 57], "af3ea97713": [45, 81], "af3f236eb9": [32], "af5d471fd1": [54], "af7c33411b": [14], "af9304ddc3": [8, 51], "b03b685377": [41, 78], "b04a86bf70": [39, 63, 92], "b061c067b7": [13], "b06e84c069": [33], "b06f8244b1": [17, 56], "b07a2697ce": [5, 23, 35], "b08100783c": [9], "b0bbb23026": [7], "b0e6630575": [22, 72], "b0ee987b5b": [32], "b118acde48": [1], "b1196e8c7f": [1, 12], "b141101106": [9, 26], "b144887895": [16, 48], "b1548ad3c3": [1, 5], "b16a86c68c": [26, 110], "b1a792ff7e": [9], "b1b4909316": [17], "b1e782b14b": [2], "b2180d9101": [17, 72, 108, 147, 184, 219, 252], "b24d15577e": [20, 38], "b2fac8157d": [25, 86], "b30fad3886": [15, 76], "b32106bd77": [1, 8, 35], "b35030d75e": [41, 149], "b36411ba14": [14], "b37580d442": [11, 31], "b38ac6f0a2": [142], "b3a01f066f": [2, 18], "b43a38ef06": [17, 28], "b456b49009": [25], "b45b39383d": [8, 50], "b45c7ca9ca": [4, 6, 25], "b49a1ae8a4": [12, 24], "b4c71d54df": [7, 44, 61, 71], "b52c25719c": [2, 18, 25], "b5488c9c71": [121], "b5775ed5b6": [15], "b5c11f653c": [8], "b60955f642": [7, 34], "b62888aa95": [10], "b63755fe08": [37], "b639718b14": [8], "b6560f94f1": [5], "b660564811": [14, 47], "b6983010c2": [1, 4, 15], "b6a2b03839": [63], "b6a7cb9783": [16], "b6b5e88515": [12, 25], "b6d6ca0008": [6, 23], "b6edb1a0e7": [2, 29, 35, 53], "b74344800b": [3, 11, 30], "b7666d7662": [6, 40], "b7cbfff0fc": [125, 128], "b7dce76f49": [114], "b7e2f663d0": [5, 27], "b7f6e92853": [5, 39], "b80b923778": [13], "b8286ef5b0": [190, 192, 203], "b82d7cacaf": [5, 37], "b84d120971": [1, 6], "b85d861170": [3, 14, 112, 115, 131, 155, 160], "b86360c2d7": [34, 128], "b8b35e36b7": [27, 41], "b8c1cff78e": [4, 7, 31], "b904f92c07": [16], "b925d00162": [1], "b9307d9fb5": [41, 96], "b952df5c95": [28, 67], "b96995e450": [81, 109], "b96bd954e3": [16, 27], "b9800989d9": [1, 34], "b9a8cf4750": [11, 39], "b9b25be440": [2, 88], "b9b3ccaa75": [21], "b9bc80f128": [4], "b9bc89b0e5": [10, 28], "b9ce0d5b7a": [21], "b9dd84f95c": [23], "b9e5b278d6": [13], "b9ec51fd8a": [6, 16], "ba12192efa": [32, 139], "ba277917ec": [3, 22], "ba6336243a": [1], "ba725e868b": [34, 64], "ba9790ed87": [124], "baaab0c8fb": [12], "bb1e2792d2": [113], "bb3de0a0fe": [8], "bb46877688": [36, 58, 77], "bb6dbe0a79": [75, 94], "bbbd9f44eb": [21, 66], "bbddba4510": [27], "bbeb593637": [19], "bbffe12b82": [2, 7, 75], "bc04ad56fb": [30, 47], "bc479c25db": [16], "bc4dc202a3": [3, 20], "bc74a6cd9b": [17], "bc7630cca5": [32], "bc9216ed6a": [2], "bd1c63c0a4": [4, 15, 49], "bd2c26d66c": [14], "bd7c1ec2ac": [11], "bd80b754ef": [7], "bd8422c7a1": [27, 88], "be13712e6d": [19], "be1e0b0733": [8, 44], "be3833f36b": [4], "be43bc266e": [46, 100], "be62b7f422": [3, 11, 47], "be75836a63": [16, 72], "bf0053dc54": [20, 62, 80], "bf06dc5779": [2, 16, 23], "bf2d12bd42": [15, 36, 53], "bf6a7f3854": [16], "bf6d2c3db1": [7, 41], "bf7849bf00": [24, 34, 49], "bf868acf79": [2, 34], "bf8829c7b7": [3, 22], "bf9179a3ad": [5], "bfa2702047": [7], "bfb1df9242": [28], "c0056a8ee4": [68], "c00666dc93": [13], "c00dea39df": [57], "c0117ef411": [7, 64], "c01df237ac": [26, 68], "c027904f24": [85], "c031cb1f01": [14, 32], "c06a8c0501": [21, 117], "c09171071c": [50, 111], "c09711e49e": [2, 12, 85, 108], "c09dacfe20": [5], "c0a86c3a12": [17], "c0a9c94b76": [12], "c0b45aa682": [13], "c0d627e0c8": [5], "c0e292e79b": [6, 12, 48, 92], "c124da7508": [12], "c12b22c384": [2], "c134e78b01": [10, 50], "c14195e7be": [58, 198, 203], "c15ec68c11": [49, 198], "c17ea759c2": [17, 34, 40], "c1827107b3": [20, 37], "c1b6a0e751": [11, 35, 44, 146, 164], "c1c0088239": [9], "c1c0c034a1": [175], "c1c76550ce": [3], "c1e07b13c3": [22], "c1ff8f931f": [16, 79], "c21257c08f": [1, 4, 31], "c21953ee91": [6, 26], "c2233fc13e": [18], "c22b2cea95": [74], "c3320c1de6": [2], "c34984e324": [5, 35], "c3552b18bb": [16, 64], "c35dc9cf32": [16], "c3625e4f2d": [15, 29], "c37aa8affe": [76], "c384e008b0": [17], "c39450f938": [17, 73], "c3a2bae04c": [11, 42], "c3bdebc352": [1], "c3cfb15afc": [18], "c3f302d2ea": [12], "c401691844": [22], "c41a5d3bcf": [20], "c44e164175": [9], "c4560751e2": [2, 14], "c459d92e43": [16], "c4653ec400": [2, 18], "c47a8ea258": [5, 22], "c483d117c7": [11], "c49e56971c": [28], "c4db91233f": [9, 20, 75], "c520811b99": [17], "c59969b2f2": [11], "c5b8f745db": [33, 80], "c5bdfe9492": [4], "c5c738babf": [1, 29], "c5d9e8748b": [43], "c5dfddf30e": [8, 12, 67, 85], "c6029e6d46": [56], "c619ee7c2e": [13, 54, 80], "c632b08ace": [6, 20, 38, 96], "c641cac09e": [8, 45, 122, 148], "c641cf762d": [12], "c6c78151ed": [124], "c6d7c81c2c": [26, 70], "c6e268d5d8": [2, 13], "c6e582415e": [17], "c70e4a1ff6": [8], "c71a26e079": [8, 37], "c7214621fc": [118], "c7513fdd36": [2, 5, 28, 59, 95, 114, 116, 154], "c759194b1b": [14], "c77041f71c": [50], "c78db9ca82": [22, 40, 51], "c790c8c8d6": [22], "c79b4eed11": [24, 52], "c7db5230e0": [159], "c7fa201cc9": [72], "c7fd3ed5a1": [1, 4, 18, 55], "c81734d0ce": [26], "c8190eed22": [1, 22, 35], "c82a03f6b1": [4], "c8690a673c": [2, 13, 79, 94, 276, 285, 294], "c881d5ac51": [15, 79, 113, 157, 171, 219], "c8a3c0c0b6": [44, 169], "c8dc79b229": [9], "c91d9627b6": [1, 22], "c921d4d152": [4], "c956af8e58": [24], "c95a0d75b8": [37], "c9a536f4cc": [1, 21, 99], "c9c043aac0": [5, 41], "c9c6c7f2f8": [15], "c9c76c02da": [85], "c9d05123b5": [7], "c9d9c6f20c": [15, 41, 72], "ca0bd2969d": [22], "ca28e55879": [9], "ca501bc92f": [6, 39], "ca528caecc": [13], "ca75ff727b": [11], "ca79b139f6": [2, 20, 62], "caa273b8c5": [9, 158, 190], "caa64c261e": [24, 66], "cad21e9ee1": [170], "caf24d064f": [1, 19, 51], "cb33e91d70": [1, 15], "cb39c16a30": [38, 94], "cb4a61bb47": [77, 110, 145, 236], "cb78431ac2": [28, 94, 98, 108, 122, 136, 144], "cb83add9e4": [24, 95], "cbccef15eb": [23], "cbef627c71": [16], "cc0f8d86a2": [43], "cc14362de3": [9], "ccbf02e0e6": [37, 106], "ccc245f486": [8], "cd0b78b2f3": [15, 75], "cd30498387": [3], "cd580b3dc8": [103], "cd7f3a069c": [36, 110], "cd82c3040a": [13, 23], "cd863eb376": [9, 66], "cda0d28bb2": [6, 73, 120], "cdf207f672": [9], "cdf570e89f": [8, 19], "ce2ffee6d0": [7], "ce769be28c": [5], "ce769db947": [6], "ce7e8798d8": [137], "ce7e8ce937": [27, 98], "ce8603303d": [10], "cea9bdd102": [7], "cedc951656": [43], "cee9f2bfc5": [95], "cef6415f38": [3, 19, 29], "cf30d8b0fc": [2, 17, 40], "cfa364df92": [10], "cfd9f3ebd6": [67], "cfebec745b": [2, 18, 86, 108], "d047ef39b9": [12], "d05173a55d": [17, 64], "d080ae31d9": [25, 88], "d082e454ee": [18, 35], "d086b07802": [3], "d0957f8cf6": [7, 23], "d0b6d19fae": [7, 26], "d103778a30": [3, 14, 16], "d1157cc4b7": [15], "d16b7c6d62": [1, 7, 17], "d19ae82a8b": [30, 91], "d1f88d7e3d": [67], "d201572806": [26, 64, 86], "d207efa0fc": [13, 79], "d245bac442": [1, 16, 42, 64, 79], "d24e7597c6": [8, 18], "d2950719ff": [1], "d2af8b0889": [40, 145, 162], "d2b64920ac": [3, 7, 58, 566, 585, 655], "d2fd81909e": [32], "d327050027": [101], "d3586656e8": [103], "d3ba32034c": [6], "d3cb9494ed": [2, 15], "d3cd33e949": [16], "d3cfe7d459": [14, 80], "d3d2334051": [2, 37, 154], "d3fb4d650e": [14, 69], "d4004dfd3a": [8], "d40fe0beba": [26, 55], "d4298fde96": [20], "d42c6220c1": [14, 42], "d42ce06ca4": [7, 15, 75], "d447b7baf1": [3], "d46141a69f": [30, 94], "d469722f86": [57], "d4a8548a1e": [11], "d4e440cfb0": [4, 34], "d4e7229103": [14, 90, 106, 206, 217, 250], "d4ed7d0b18": [5, 20], "d4f4989ad0": [40, 131, 152], "d50d432d35": [68], "d52320c49f": [4, 29], "d5246b6cbd": [2, 27, 79, 84], "d52f1e9dbe": [22], "d537dfa050": [15, 31], "d538badcd6": [2, 13], "d54edc4e9e": [1, 24, 63], "d58545d6a8": [1, 5, 12], "d5961604b5": [15, 30], "d5bb4e2b75": [36, 47, 128, 139, 146], "d5bb9737f8": [24], "d5bf4ad660": [19, 56], "d5d43e8364": [23, 42], "d5e5ea09b8": [23, 55], "d5f4d98c54": [4], "d5fa845159": [13], "d60650a4c5": [8], "d64f74145f": [16, 32], "d68e491898": [16, 25, 40, 62, 75, 87, 110, 278, 286, 302, 312, 345, 367, 421], "d6b9d28d89": [15], "d6c644b914": [7, 22], "d6c7aa2562": [2, 34], "d6dcb5d065": [21], "d6e4a9bc2e": [1, 27, 120], "d6f122768e": [2, 30], "d6f5b0b4d1": [6, 25], "d71394f0d9": [7], "d78d8713e9": [15, 41], "d795599db6": [12], "d7ab1343f2": [14], "d7c36d0e50": [2, 5, 46, 65, 96, 121], "d804e1795b": [9], "d83bc35acd": [12, 61], "d840129414": [3, 21, 28], "d8679821e9": [18], "d8b79a4e11": [7], "d8ca83aba2": [10], "d9062aa0b6": [13, 27], "d939bb20d7": [181], "d95e4bb4d8": [26], "d965a14d26": [35, 127], "d98a7862f5": [18], "d9a232446d": [6], "d9c70c3bdf": [2, 6, 25], "d9d6394363": [2, 7, 30], "d9e0839d42": [19, 29, 59, 71], "d9e989db6c": [11], "da261870eb": [8, 20], "da2c4f044c": [42, 179], "da44887eaf": [43], "da4908d7d4": [5], "da5522f575": [7, 30], "da59fbe582": [19], "da84eca227": [16, 34], "da8cc11d54": [13, 46], "daa0446d50": [7, 18], "daa3e1d59c": [27], "daa6ae9af6": [14, 76], "daac796e14": [3, 15, 35, 52], "daacb84505": [7], "daed83c16a": [13], "daf1abd32e": [1, 6, 19], "daf4c16210": [59], "daf4d7a8df": [5, 8, 33], "daff4ef3e2": [43, 141, 168, 182, 190, 202], "db04eec3ac": [18, 46], "db0aa0ca62": [21, 39], "db26a9054b": [8, 19], "db36808594": [21], "db5b94da79": [94], "db6f761034": [6], "db84d74df5": [29, 58], "db851638e4": [13, 45, 58, 72, 93], "db996aa2c3": [8, 39], "dbb699c734": [116], "dbb86ae01f": [12, 68], "dbcce669d3": [33, 124], "dbf07aeb16": [27, 60], "dbfebbbe9f": [5, 37], "dc262a5229": [44, 146, 153, 167], "dc28b5dfae": [16, 33, 58, 93, 115], "dc31b0c2a8": [8], "dc3fce0518": [58], "dc445b7fd6": [17], "dc7ec2c8c2": [9], "dc82e63057": [28], "dcc1a2cdec": [1, 21], "dced6f38be": [131], "dcfcb6e56b": [1, 33, 62], "dd15e3de0b": [13, 89, 102, 222, 245, 251, 257, 266], "dd32445fbe": [6, 31], "dd33e53885": [19, 56], "dd37d4928d": [1, 16, 169, 199, 209, 221], "dd3a05f5db": [6], "dd5ddaa826": [25], "dd794b30ec": [12, 68], "dd7fdc008d": [28, 67], "ddc46d5025": [13, 39], "ddd5fea123": [36, 64, 79, 97], "ddf771f267": [22], "de1092b94d": [15, 82, 111], "de3246890a": [60], "de675e1f50": [9, 33], "de7ffba6d7": [5], "deb42bc4aa": [3, 18, 65], "deb6b325f2": [9], "deedbfddb2": [4, 13], "df28cda46d": [20], "df3f04d1fd": [6, 25], "df43e15824": [40], "df5c8e9974": [17], "dfc7bbe79f": [1], "dfffc797d9": [26, 72], "e0094eea8f": [28, 87], "e00db71f67": [2], "e03bd80c82": [8], "e085773390": [4], "e095e32b23": [14], "e0ff582d1a": [38, 57], "e104be3a11": [141, 147], "e122029242": [24], "e1756261c7": [1], "e19a7cc2c3": [17, 63, 93, 102, 131], "e20f0175e4": [45], "e2174eed41": [4, 27], "e21940e9d1": [23], "e26a89c6fc": [7], "e291173bad": [2, 29], "e29e0030bb": [7, 71], "e2f3e41975": [3, 9, 64], "e31edceac8": [14], "e33fba9373": [26, 57], "e354ffe2dd": [5], "e3726a2184": [4, 10, 30], "e38b7b1c40": [3, 5, 36], "e3b48a5cc6": [14, 54, 118, 146], "e3b7c0e719": [15], "e3bb4297ba": [16], "e3bbfbd029": [12], "e3d581ad9b": [122], "e3dfbe3482": [3, 6, 16], "e413012d7f": [7, 34], "e414605b0c": [2], "e43c2efc4e": [18], "e45c4924a7": [104], "e46fb9699b": [30], "e48ba0abbe": [2, 33], "e4b872e23d": [10, 33], "e4e52ebcac": [52, 167, 206], "e4e8d3b7e3": [11], "e4ff921e67": [161], "e51ae0a087": [21], "e52470c5b2": [6, 19], "e5300fc8a0": [57, 140], "e538277fab": [16], "e53d925b04": [9, 29], "e54bd7d310": [31, 88], "e5541beb5c": [7, 61], "e5673533f4": [5], "e58ff513dc": [15], "e5913fc490": [11, 59], "e5bac2b8e8": [12], "e5ef2d39aa": [9], "e63c41fdc3": [13], "e6682b6b35": [32, 46, 99, 240], "e68f4d8cd9": [9], "e69aeef3dc": [44, 168], "e70966dff3": [34], "e717acda40": [15], "e76afced63": [19, 117], "e789796e76": [44], "e7fc4d95da": [6], "e81b4b604c": [15], "e862aab614": [7, 53], "e88afd2818": [30, 46], "e8b5335b03": [85], "e8e0932323": [7], "e8e820977f": [17, 36], "e91c2cdc33": [97], "e91e504728": [12], "e95d3eaa79": [2, 39, 92], "e98c07e4d1": [18, 104], "e99d81a373": [1], "ea58d9d09f": [19], "ea5ea58684": [73], "eaf988d133": [7, 23], "eb22b1a17b": [9, 23], "eb6b7e7420": [10], "eb975d954f": [6, 52], "ebb308f0de": [28, 74], "ebc4383dfd": [1], "ebcb13cee8": [21, 40], "ebe8db7e55": [43], "ebebd77a26": [3, 28, 59, 68], "ebf2680320": [30, 93], "ec48511c3d": [22, 107], "ec5906bba9": [49, 195], "ec65b28b5b": [480], "ec8f237c2e": [32, 97], "ecabab4f0e": [27, 43], "ecad1ae737": [15, 114], "ecd6fb6af9": [2], "ece0e93caf": [6, 29], "ece16a8e02": [4], "ecf4d88917": [21], "ecfffcfb5a": [20, 45], "ed222b0633": [37], "ed2ef519bc": [75], "ed4040493c": [20, 47, 115], "ed5435c1e8": [101], "ed68042583": [22, 64], "ed97bfa031": [5], "edae920efa": [4, 38, 66], "edd56a554a": [55], "edefbefd10": [2, 15], "edf7fccfd4": [45], "ee05ce376d": [5, 17, 68, 86, 90], "ee7a4119b3": [2], "ee7b0b45d3": [6], "ee845a3bbc": [20, 181], "ee975f8656": [20], "eea5a2b57f": [21], "eecbe3f224": [2], "eecc835af4": [15, 35], "eeff9739f9": [30], "ef7218110d": [33, 61], "ef7b0a170e": [6], "efa6c0dbab": [28, 75, 101, 105], "efb4bf867c": [22, 31], "eff473f0a4": [10], "f00162c57a": [120, 137], "f01647f0d0": [11, 43, 56, 83], "f033bb458c": [12, 66], "f03cf2a466": [14, 43], "f045fe66f9": [3, 15, 28], "f0522eca12": [5, 32, 70], "f0877b72d7": [147], "f08d396a5c": [35], "f098266b71": [7, 16], "f0aa38e11f": [6], "f0b8b1a97a": [12], "f0d922d0f5": [93], "f0d980d8d9": [66, 294], "f0df9b019b": [2, 11, 33], "f12dd8c607": [40, 200], "f13370195f": [92], "f17f77ba29": [22, 24], "f18675b1fd": [1, 7], "f1aa9af89c": [149], "f1d6257be3": [4], "f1e91025fa": [19], "f1edc0a9a8": [10, 35, 53, 60, 73], "f1f3134dc9": [1, 9, 102], "f2254de71d": [40], "f2378cbf88": [5], "f24176f079": [8, 16], "f2594a3822": [34, 63], "f25ebad2c9": [32], "f28ff86a40": [9, 30, 65, 103], "f295bbdddf": [33, 66], "f2a0641a0d": [16, 66], "f2a18b4443": [8], "f2ea7026ed": [28], "f329c3a4cd": [3, 8, 71], "f34258bc5e": [5], "f3516bf203": [19, 31], "f36b4f6cc1": [27, 59], "f3dd6f5f17": [23, 79], "f3fea667cb": [36, 90], "f406afe527": [12], "f47f2748d0": [71, 157, 163], "f4801c5abd": [3, 30, 61], "f481dfa57a": [15, 147], "f4b2e06a84": [3, 7, 42], "f4be40da30": [2], "f4f904b7e6": [234], "f51943321a": [1, 48], "f53d380c80": [5, 32, 72, 83], "f5470c6180": [42], "f56e7eadae": [46, 52], "f57f0f4073": [1, 10, 15, 24, 31, 105, 117], "f58154d3fd": [9], "f596796a7d": [14, 54], "f59f5942b2": [2, 22, 53, 67], "f5a7bf17b6": [6, 28], "f5d5dbfde5": [14], "f5f2b25ab9": [15, 73, 125, 131, 149, 171, 176], "f608a3df24": [1, 16], "f608c820d1": [18], "f6373d1d5a": [6, 51], "f6454f1662": [29], "f681d12b12": [13, 64], "f685e38ccd": [25, 100], "f6cd4fe5a9": [4], "f6e0f48d70": [6, 45], "f73c68bcba": [13], "f74b12c80c": [31, 92], "f76d41f128": [2, 7, 24], "f77c474574": [3, 30], "f77d437a9a": [37, 79], "f77fe8df63": [6], "f79730ccf6": [16], "f7a53f4052": [164], "f7b0fd2f52": [14], "f7dbff29f7": [4], "f82a80dba1": [10], "f8365bb6a9": [6], "f84f6b205c": [11], "f85dd54bf9": [13, 41], "f85fe4b0dc": [6, 19, 76], "f87debfc46": [5, 27], "f8a798db4a": [2], "f8b8491afb": [31, 47], "f8ba27bfa5": [3, 15], "f8ccb4df18": [7], "f906fd0e7b": [5, 22], "f983688cfa": [36, 157], "f9b319a8ab": [17], "f9dfabc4f2": [28], "f9e4c4ae4a": [15, 58], "f9eaffe1d2": [43], "f9f037d7e1": [24], "f9f7a2c4f1": [8], "fa0fd864ff": [160], "fa411cc401": [2], "fa6c2a0bab": [1, 32, 42, 79, 113, 136], "fa8d79c839": [6], "fa99d7eb8e": [18, 112], "fab5e47221": [4, 83], "fad92017f0": [2, 15], "fadd58ad80": [7], "fb0a0a86e0": [24, 107], "fb0e72748f": [1, 15, 65], "fb2a6d23e6": [26, 66], "fba511e53b": [16, 41], "fbaeeb5989": [14, 40, 57, 65, 72, 96], "fbe3ac3be1": [5, 41], "fc8da0e08c": [18, 29], "fc9261bbb7": [203], "fc9821081d": [3, 12], "fca07b1c6a": [5, 8, 33], "fcdf88bad3": [23, 38, 106], "fd463cea22": [5], "fd5441c02d": [1, 18], "fda6347a84": [118], "fdbc5e6bc6": [117], "fdde94fba6": [9], "fde9ac5b3d": [33], "fdf4b7ad0a": [2, 11, 52, 75], "fe2aac73ea": [11, 69], "fe8cafce3b": [5, 10], "feb5a4d1d0": [1, 9], "fecb0cc8d2": [2, 23, 62], "ff2472efd3": [1, 29], "ff378a7a03": [14, 88, 111, 139, 186, 210], "ff3a7dde67": [125], "ff6d02648d": [32, 66], "ff76970538": [13, 68, 113, 127, 140], "ff899defe7": [10, 36], "ff8bcac74c": [52], "ffc406ae23": [17, 76, 135, 162, 165, 168, 217, 265, 275, 296, 338, 351], "ffe08e8b49": [11, 63], "ffe3ed3067": [8]} + +file = open('yogurt', 'wb') + +pickle.dump(data, file) + +file.close() diff --git a/mysite/polls/__init__.py b/mysite/__init__.py similarity index 100% rename from mysite/polls/__init__.py rename to mysite/__init__.py diff --git a/mysite/db.sqlite3 b/mysite/db.sqlite3 deleted file mode 100644 index 912504e..0000000 Binary files a/mysite/db.sqlite3 and /dev/null differ diff --git a/mysite/manage.py b/mysite/manage.py index a7da667..48a5561 100644 --- a/mysite/manage.py +++ b/mysite/manage.py @@ -13,7 +13,7 @@ def main(): raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" + "forget to activate a virtual environpython manage.py runserverment?" ) from exc execute_from_command_line(sys.argv) diff --git a/mysite/mysite/settings.py b/mysite/mysite/settings.py index 310c2c4..f1e061f 100644 --- a/mysite/mysite/settings.py +++ b/mysite/mysite/settings.py @@ -32,7 +32,6 @@ INSTALLED_APPS = [ 'recipe', - 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -78,7 +77,7 @@ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + 'NAME': BASE_DIR / 'recipes.db', } } diff --git a/mysite/mysite/urls.py b/mysite/mysite/urls.py index 96eb4e3..68b5512 100644 --- a/mysite/mysite/urls.py +++ b/mysite/mysite/urls.py @@ -18,6 +18,5 @@ urlpatterns = [ path('recipe/', include('recipe.urls')), - path('polls/', include('polls.urls')), path('admin/', admin.site.urls), ] diff --git a/mysite/polls/admin.py b/mysite/polls/admin.py deleted file mode 100644 index 33937e0..0000000 --- a/mysite/polls/admin.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.contrib import admin - -from .models import Question - -admin.site.register(Question) \ No newline at end of file diff --git a/mysite/polls/apps.py b/mysite/polls/apps.py deleted file mode 100644 index 5a5f94c..0000000 --- a/mysite/polls/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class PollsConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'polls' diff --git a/mysite/polls/migrations/0001_initial.py b/mysite/polls/migrations/0001_initial.py deleted file mode 100644 index 2e815b3..0000000 --- a/mysite/polls/migrations/0001_initial.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 4.1 on 2023-02-22 14:20 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Question', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('question_text', models.CharField(max_length=200)), - ('pub_date', models.DateTimeField(verbose_name='date published')), - ], - ), - migrations.CreateModel( - name='Choice', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('choice_text', models.CharField(max_length=200)), - ('votes', models.IntegerField(default=0)), - ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')), - ], - ), - ] diff --git a/mysite/polls/migrations/__init__.py b/mysite/polls/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/mysite/polls/models.py b/mysite/polls/models.py deleted file mode 100644 index 1dfa966..0000000 --- a/mysite/polls/models.py +++ /dev/null @@ -1,23 +0,0 @@ -import datetime - -from django.db import models -from django.utils import timezone - - -class Question(models.Model): - question_text = models.CharField(max_length=200) - pub_date = models.DateTimeField('date published') - - def __str__(self): - return self.question_text - - def was_published_recently(self): - return self.pub_date >= timezone.now() - datetime.timedelta(days=1) - -class Choice(models.Model): - question = models.ForeignKey(Question, on_delete=models.CASCADE) - choice_text = models.CharField(max_length=200) - votes = models.IntegerField(default=0) - - def __str__(self): - return self.choice_text \ No newline at end of file diff --git a/mysite/polls/templates/polls/detail.html b/mysite/polls/templates/polls/detail.html deleted file mode 100644 index 0fdccce..0000000 --- a/mysite/polls/templates/polls/detail.html +++ /dev/null @@ -1,21 +0,0 @@ - -
- {% csrf_token %} -
-

{{ question.question_text }}

- {% if error_message %}

{{ error_message }}

{% endif %} - {% for choice in question.choice_set.all %} - -
- {% endfor %} -
- -
\ No newline at end of file diff --git a/mysite/polls/templates/polls/index.html b/mysite/polls/templates/polls/index.html deleted file mode 100644 index 942781e..0000000 --- a/mysite/polls/templates/polls/index.html +++ /dev/null @@ -1,12 +0,0 @@ -{% if latest_question_list %} - -{% else %} -

No polls are available.

-{% endif %} \ No newline at end of file diff --git a/mysite/polls/templates/polls/results.html b/mysite/polls/templates/polls/results.html deleted file mode 100644 index 33b67b2..0000000 --- a/mysite/polls/templates/polls/results.html +++ /dev/null @@ -1,9 +0,0 @@ -

{{ question.question_text }}

- - - -Vote again? \ No newline at end of file diff --git a/mysite/polls/tests.py b/mysite/polls/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/mysite/polls/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/mysite/polls/urls.py b/mysite/polls/urls.py deleted file mode 100644 index 5b0483b..0000000 --- a/mysite/polls/urls.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.urls import path - -from . import views - -app_name = 'polls' -urlpatterns = [ - path('', views.index, name='index'), - # ex: /polls/5/ - path('/', views.detail, name='detail'), - # ex: /polls/5/results/ - path('/results/', views.results, name='results'), - # ex: /polls/5/vote/ - path('/vote/', views.vote, name='vote'), -] -''' - -app_name = 'polls' -urlpatterns = [ - path('', views.IndexView.as_view(), name='index'), - path('/', views.DetailView.as_view(), name='detail'), - path('/results/', views.ResultsView.as_view(), name='results'), - path('/vote/', views.vote, name='vote'), -] -''' \ No newline at end of file diff --git a/mysite/polls/views.py b/mysite/polls/views.py deleted file mode 100644 index db55bfe..0000000 --- a/mysite/polls/views.py +++ /dev/null @@ -1,61 +0,0 @@ -# from django.shortcuts import render - -from django.http import HttpResponse, HttpResponseRedirect -from django.urls import reverse -from django.shortcuts import get_object_or_404, render -from django.http import Http404 -from django.views import generic - -from .models import Question -from django.template import loader -# Create your views here. - -def index(request): - ''' - latest_question_list = Question.objects.order_by('-pub_date')[:5] - output = ', '.join([q.question_text for q in latest_question_list]) - return HttpResponse(output) - ''' - latest_question_list = Question.objects.order_by('-pub_date')[:5] - template = loader.get_template('polls/index.html') - context = { - 'latest_question_list': latest_question_list, - } - #return HttpResponse(template.render(context, request)) - return render(request, 'polls/index.html', context) - -def detail(request, question_id): - #return HttpResponse("You're looking at question %s." % question_id) - ''' - try: - question = Question.objects.get(pk=question_id) - except Question.DoesNotExist: - raise Http404("Question does not exist") - ''' - question = get_object_or_404(Question, pk=question_id) - return render(request, 'polls/detail.html', {'question': question, 'question_id':question_id}) - -def results(request, question_id): - #response = "You're looking at the results of question %s." - #eturn HttpResponse(response % question_id) - question = get_object_or_404(Question, pk=question_id) - return render(request, 'polls/results.html', {'question': question}) - -def vote(request, question_id): - #return HttpResponse("You're voting on question %s." % question_id) - question = get_object_or_404(Question, pk=question_id) - try: - selected_choice = question.choice_set.get(pk=request.POST['choice']) - except (KeyError, Choice.DoesNotExist): - # Redisplay the question voting form. - return render(request, 'polls/detail.html', { - 'question': question, - 'error_message': "You didn't select a choice.", - }) - else: - selected_choice.votes += 1 - selected_choice.save() - # Always return an HttpResponseRedirect after successfully dealing - # with POST data. This prevents data from being posted twice if a - # user hits the Back button. - return HttpResponseRedirect(reverse('polls:results', args=(question.id,))) \ No newline at end of file diff --git a/mysite/recipe/admin.py b/mysite/recipe/admin.py index ccc5109..5da0394 100644 --- a/mysite/recipe/admin.py +++ b/mysite/recipe/admin.py @@ -1,8 +1,8 @@ from django.contrib import admin # Register your models here. -from .models import Recipe, TokenData +from .models import Recipes -admin.site.register(Recipe) -admin.site.register(TokenData) +admin.site.register(Recipes) + diff --git a/mysite/recipe/boolean_test.py b/mysite/recipe/boolean_test.py new file mode 100644 index 0000000..664dceb --- /dev/null +++ b/mysite/recipe/boolean_test.py @@ -0,0 +1,16 @@ +import boolean_tree as bt +import time + +start_time = time.time() +query = '(("cat" AND "dog" OR "hamster") NOT "rabbit") AND (apples OR "pears and bananas" OR "grapefruit"*) AND ("green" OR "yellow" AND ("blue" OR "purple"))' +query_ = '"apple pie" OR *berry OR ((apple OR banana) AND (pie NOT ("orange juice" OR grape))) OR "pear*"' +query__2 = 'tomato AND NOT potato' +tokens = bt.split_query(query__2) +#print(query) +#print(tokens) +tree = bt.build_tree(tokens) +bt.display_tree(tree) +end_time = time.time() +t = end_time - start_time +print(f'{t * 1000} ms') + diff --git a/mysite/recipe/boolean_tree.py b/mysite/recipe/boolean_tree.py new file mode 100644 index 0000000..355eaa0 --- /dev/null +++ b/mysite/recipe/boolean_tree.py @@ -0,0 +1,173 @@ +import re + + +class Node: + def __init__(self, value): + self.value = value + self.left = None + self.right = None + + +def split_query(query): + global tokens + pattern = r'\(|\)|NOT|AND|OR|\w+|"[^"]*"|\b\w+\*|\*\w+\b' + if isinstance(query, str): + tokens = re.findall(pattern, query) + return tokens + + +def op_count(tokens, op_count=0): + operators = ['NOT', 'AND', 'OR'] + for op in operators: + op_count += tokens.count(op) + return op_count + + +def p_stack(tokens): + lp_stack = [] + rp_stack = [] + if tokens.count('(') == tokens.count(')') != 0: + # generate index for '(' and ')' + for i in range(len(tokens)): + if tokens[i] == '(': + lp_stack.append(i) + if tokens[i] == ')': + rp_stack.append(i) + return lp_stack, rp_stack + + +def build_tree(tokens): + operators = ['NOT', 'AND', 'OR'] + prec = {'NOT': 1, 'AND': 2, 'OR': 3} + lp_stack, rp_stack = p_stack(tokens) + op_idx = [] + node_op = None + tree = None + left = [] + right = [] + + if op_count(tokens) > 0: + # print(f'lp: {lp_stack}') + # print(f'rp: {rp_stack}') + # if query contains parentheses + if len(lp_stack) == len(rp_stack) != 0: + # op with lowest prec among parentheses pairs + # ex. '(...) AND (...) AND (...) OR (...)' + for i in range(len(lp_stack)): + if lp_stack[i] > rp_stack[i - 1]: # end of parentheses pairs found + for idx, token in enumerate(tokens[rp_stack[i - 1] + 1: lp_stack[i]]): + if token in operators: # op with lowest prec found among parentheses pairs + op_idx.append((token, rp_stack[i - 1] + 1 + idx)) # + + # print(len(op_idx)) + if len(op_idx) < 1: + # op with lowest prec on left side of parentheses pairs + # ex. '... AND (... OR (...))' + if min(lp_stack) > 0 and max(rp_stack) == len(tokens) - 1: + for idx, token in enumerate(tokens[:min(lp_stack)]): + if token in operators: + op_idx.append((token, idx)) + + # op with lowest prec on right side of parentheses pairs + # ex. '(... OR (...)) AND ...' + if min(lp_stack) == 0 and max(rp_stack) < len(tokens) - 1: + for idx, token in enumerate(tokens[max(rp_stack) + 1:]): + if token in operators: + op_idx.append((token, max(rp_stack) + 1 + idx)) + + # op with lowest prec on both left and right sides of parentheses pairs + # ex. '... OR (...) OR ...' + if min(lp_stack) > 0 and max(rp_stack) < len(tokens) - 1: + for idx, token in enumerate(tokens[:min(lp_stack)]): + if token in operators: + op_idx.append((token, idx)) + for idx, token in enumerate(tokens[max(rp_stack) + 1:]): + if token in operators: + op_idx.append((token, max(rp_stack) + 1 + idx)) + + elif tokens.count('(') == tokens.count(')') == 0: + for idx, token in enumerate(tokens): + if token in operators: + op_idx.append((token, idx)) + + else: + print("Number of parentheses mismatching") + # print(len(op_idx)) + # print(op_idx) + + # find op with lowest prec if more than one in op_idx + if len(op_idx) > 0: + top_prec = 0 # top_prec means the lowest prec + for op in op_idx: + if op[0] in prec and prec[op[0]] > top_prec: + node_op = op + top_prec = prec[op[0]] + + if node_op is not None: + left = tokens[:node_op[1]] + right = tokens[node_op[1] + 1:] + + # + lp_left, rp_left = p_stack(left) + lp_right, rp_right = p_stack(right) + + # print(f'op: {node_op}') + # print(f'left: {left}') + # print(f'lp: {lp_left}') + # print(f'rp: {rp_left}') + # print(f'right: {right}') + # print(f'lp: {lp_right}') + # print(f'rp: {rp_right}') + + pr_left = True + pr_right = True + if len(lp_left) == len(rp_left) != 0: + if left[0] == '(' and left[len(left) - 1] == ')': + for i in range(len(lp_left)): + if lp_left[i] > rp_left[i - 1]: + pr_left = False + break + if pr_left: + left = left[1:-1] + # print(f'new left: {left}') + if len(lp_right) == len(rp_right) != 0: + if right[0] == '(' and right[len(right) - 1] == ')': + for i in range(len(lp_right)): + if lp_right[i] > rp_right[i - 1]: + pr_right = False + break + if pr_right: + right = right[1:-1] + # print(f'new right: {right}') + + # print('------') + + # build root node of the tree + tree = Node(tokens[node_op[1]]) + + # recursively add nodes to the tree + if op_count(left) > 0: + tree.left = build_tree(left) + else: + tree.left = left[0] + if op_count(right) > 0: + tree.right = build_tree(right) + else: + tree.right = right[0] + + return tree + + +def display_tree(tree, indent=0): + print(' ' * indent + tree.value) + if tree.left: + if isinstance(tree.left, str): + print(' ' * (indent + 1) + tree.left) + else: + display_tree(tree.left, indent + 1) + if tree.right: + if isinstance(tree.right, str): + print(' ' * (indent + 1) + tree.right) + else: + display_tree(tree.right, indent + 1) + diff --git a/mysite/recipe/models.py b/mysite/recipe/models.py index b809339..f25319f 100644 --- a/mysite/recipe/models.py +++ b/mysite/recipe/models.py @@ -1,33 +1,166 @@ +# This is an auto-generated Django model module. +# You'll have to do the following manually to clean this up: +# * Rearrange models' order +# * Make sure each model has one field with primary_key=True +# * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior +# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table +# Feel free to rename the models, but don't rename db_table values or field names. from django.db import models -# Create your models here. -class Recipe(models.Model): +class AuthGroup(models.Model): + name = models.CharField(unique=True, max_length=150) + + class Meta: + managed = False + db_table = 'auth_group' + + +class AuthGroupPermissions(models.Model): + group = models.ForeignKey(AuthGroup, models.DO_NOTHING) + permission = models.ForeignKey('AuthPermission', models.DO_NOTHING) + + class Meta: + managed = False + db_table = 'auth_group_permissions' + unique_together = (('group', 'permission'),) + + +class AuthPermission(models.Model): + content_type = models.ForeignKey('DjangoContentType', models.DO_NOTHING) + codename = models.CharField(max_length=100) name = models.CharField(max_length=255) - def __str__(self): - return self.name -''' -class Token(models.Model): - token = models.CharField(max_length=255) - def __str__(self): - return self.token + class Meta: + managed = False + db_table = 'auth_permission' + unique_together = (('content_type', 'codename'),) -class Document(models.Model): - doc_id = models.CharField(max_length=255) - tokens = models.ManyToManyField(Token, through='TokenValue') - def __str__(self): - return self.doc_id - -class TokenValue(models.Model): - token = models.ForeignKey(Token, on_delete=models.CASCADE) - document = models.ForeignKey(Document, on_delete=models.CASCADE) - value = models.IntegerField() - def __str__(self): - return (self.token, self.document, self.value) -''' - -class TokenData(models.Model): + +class AuthUser(models.Model): + password = models.CharField(max_length=128) + last_login = models.DateTimeField(blank=True, null=True) + is_superuser = models.BooleanField() + username = models.CharField(unique=True, max_length=150) + last_name = models.CharField(max_length=150) + email = models.CharField(max_length=254) + is_staff = models.BooleanField() + is_active = models.BooleanField() + date_joined = models.DateTimeField() + first_name = models.CharField(max_length=150) + + class Meta: + managed = False + db_table = 'auth_user' + + +class AuthUserGroups(models.Model): + user = models.ForeignKey(AuthUser, models.DO_NOTHING) + group = models.ForeignKey(AuthGroup, models.DO_NOTHING) + + class Meta: + managed = False + db_table = 'auth_user_groups' + unique_together = (('user', 'group'),) + + +class AuthUserUserPermissions(models.Model): + user = models.ForeignKey(AuthUser, models.DO_NOTHING) + permission = models.ForeignKey(AuthPermission, models.DO_NOTHING) + + class Meta: + managed = False + db_table = 'auth_user_user_permissions' + unique_together = (('user', 'permission'),) + + +class DjangoAdminLog(models.Model): + object_id = models.TextField(blank=True, null=True) + object_repr = models.CharField(max_length=200) + action_flag = models.PositiveSmallIntegerField() + change_message = models.TextField() + content_type = models.ForeignKey('DjangoContentType', models.DO_NOTHING, blank=True, null=True) + user = models.ForeignKey(AuthUser, models.DO_NOTHING) + action_time = models.DateTimeField() + + class Meta: + managed = False + db_table = 'django_admin_log' + + +class DjangoContentType(models.Model): + app_label = models.CharField(max_length=100) + model = models.CharField(max_length=100) + + class Meta: + managed = False + db_table = 'django_content_type' + unique_together = (('app_label', 'model'),) + + +class DjangoMigrations(models.Model): + app = models.CharField(max_length=255) + name = models.CharField(max_length=255) + applied = models.DateTimeField() + + class Meta: + managed = False + db_table = 'django_migrations' + + +class DjangoSession(models.Model): + session_key = models.CharField(primary_key=True, max_length=40) + session_data = models.TextField() + expire_date = models.DateTimeField() + + class Meta: + managed = False + db_table = 'django_session' + + +class NutritionalInfo(models.Model): + fsa_lights_per100g = models.TextField(blank=True, null=True) + id = models.TextField(primary_key=True, blank=True) + ingredients = models.TextField(blank=True, null=True) + instructions = models.TextField(blank=True, null=True) + nutr_per_ingredient = models.TextField(blank=True, null=True) + nutr_values_per100g = models.TextField(blank=True, null=True) + quantity = models.TextField(blank=True, null=True) + title = models.TextField(blank=True, null=True) + unit = models.TextField(blank=True, null=True) + url = models.TextField(blank=True, null=True) + weight_per_ingr = models.TextField(blank=True, null=True) + + class Meta: + managed = False + db_table = 'nutritional_info' + + +class RecipeRecipe(models.Model): + name = models.CharField(max_length=255) + + class Meta: + managed = False + db_table = 'recipe_recipe' + + +class RecipeTokendata(models.Model): token = models.CharField(max_length=255) + data = models.CharField(max_length=255) doc_id = models.CharField(max_length=255) - data = models.CharField(max_length=255) \ No newline at end of file + + class Meta: + managed = False + db_table = 'recipe_tokendata' + + +class Recipes(models.Model): + ingredients = models.TextField(blank=True, null=True) + url = models.TextField(blank=True, null=True) + title = models.TextField(blank=True, null=True) + id = models.TextField(primary_key=True, blank=True) + instructions = models.TextField(blank=True, null=True) + + class Meta: + managed = False + db_table = 'recipes' diff --git a/mysite/recipe/query_process.py b/mysite/recipe/query_process.py new file mode 100644 index 0000000..9c0f1f7 --- /dev/null +++ b/mysite/recipe/query_process.py @@ -0,0 +1,100 @@ +import pickle +import math +from . import boolean_tree as bt +from pathlib import Path + +BASE_DIR = Path(__file__).resolve().parent + + +def merge_dict(b, x, y): + z = {} + if b == 'AND': + for key, value in x.items(): + if key in x.keys() and key in y.keys(): + z[key] = y[key] + x[key] + return z + elif b == 'OR': + for key, value in x.items(): + if key in x.keys() and key in y.keys(): + z[key] = y[key] + x[key] + else: + z[key] = x[key] + for key, value in y.items(): + if key not in z: + z[key] = y[key] + return z + elif b == 'NOT': + for key, value in x.items(): + if key not in y.keys(): + z[key] = x[key] + return z + + +def bm25(term_freq, doc_len, doc_freq, num_docs, k1=1.2, b=0.75): + """ + Calculates the BM25 score for a term in a document. + + Args: + term_freq (int): The frequency of the term in the document. + doc_len (int): The length of the document in words. + doc_freq (int): The number of documents that contain the term. + num_docs (int): The total number of documents in the corpus. + k1 (float, optional): The k1 parameter. Default is 1.2. + b (float, optional): The b parameter. Default is 0.75. + + Returns: + float: The BM25 score for the term in the document. + """ + idf = math.log((num_docs - doc_freq + 0.5) / (doc_freq + 0.5)) + tf_weight = ((k1 + 1) * term_freq) / (k1 * ((1 - b) + (b * (doc_len / num_docs))) + term_freq) + return idf * tf_weight + + +def term_query(term, term_freq, doc_len, doc_num): + # Binary search is built in system address search + address = BASE_DIR / 'doc_index' / term + try: + with open(address, "rb") as f: + inverse_index = pickle.load(f) + except: + print("Inverse_Index not found") + return {} + bm25_scores = {} + doc_freq = len(inverse_index) + for id in inverse_index.keys(): + bm25_scores[id] = bm25(term_freq[term][id], doc_len[id], doc_freq, doc_num) + + return bm25_scores + + +def tree_traverse(tree, term_freq, doc_len, doc_num): + if isinstance(tree, str): + return term_query(tree, term_freq, doc_len, doc_num) + else: + return merge_dict(tree.value, tree_traverse(tree.left, term_freq, doc_len, doc_num), + tree_traverse(tree.right, term_freq, doc_len, doc_num)) + + +def tree_query(query, term_freq, doc_len, doc_num): + tokens = bt.split_query(query) + tree = bt.build_tree(tokens) + final_scores = tree_traverse(tree, term_freq, doc_len, doc_num) + return final_scores +#test +#load frequency, doc lengths, doc number +# term_frequency_address = BASE_DIR / 'doc_index' / 'term_frequency' +# doc_len_address = BASE_DIR / 'doc_index' / 'doc_len' +# num_docs = BASE_DIR / 'doc_index' / 'num_docs' +# +# with open(term_frequency_address, "rb") as f: +# term_frequency = pickle.load(f) +# with open(doc_len_address, "rb") as f: +# doc_len = pickle.load(f) +# with open(num_docs, "rb") as f: +# doc_num = pickle.load(f) +# +# query = 'tomato' +# c_query = 'tomato AND potato' +# #ir_list = term_query(query, term_frequency, doc_len, doc_num) +# ir_list = set(sorted(tree_query(c_query, term_frequency, doc_len, doc_num))) +# print(ir_list) diff --git a/mysite/recipe/templates/recipe/home.html b/mysite/recipe/templates/recipe/home.html index 318a6ed..d376a3d 100644 --- a/mysite/recipe/templates/recipe/home.html +++ b/mysite/recipe/templates/recipe/home.html @@ -1,5 +1,6 @@

HomePage

- -
\ No newline at end of file + + + diff --git a/mysite/recipe/templates/recipe/search_results.html b/mysite/recipe/templates/recipe/search_results.html index 64ad9d0..e1b4770 100644 --- a/mysite/recipe/templates/recipe/search_results.html +++ b/mysite/recipe/templates/recipe/search_results.html @@ -3,7 +3,9 @@

Search Results

    {% for recipe in object_list %}
  • - {{ recipe.name }} + {{ recipe.title }} + {{ recipe.ingredients }} + {{ recipe.instructions }}
  • {% endfor %}
\ No newline at end of file diff --git a/mysite/recipe/urls.py b/mysite/recipe/urls.py index cde8668..a693c64 100644 --- a/mysite/recipe/urls.py +++ b/mysite/recipe/urls.py @@ -5,5 +5,6 @@ app_name = 'recipe' urlpatterns = [ path("", HomePageView.as_view(), name="home"), - path("search/", SearchResultsView.as_view(), name="search_results") + path("search/", SearchResultsView.as_view(), name="search_results"), + path("search_ir/", SearchResultsView.as_view(), name="search_ir_results") ] \ No newline at end of file diff --git a/mysite/recipe/views.py b/mysite/recipe/views.py index 5393263..8036f60 100644 --- a/mysite/recipe/views.py +++ b/mysite/recipe/views.py @@ -1,18 +1,62 @@ from django.views.generic import TemplateView, ListView -from django.db.models import Q # new -from .models import Recipe +from .models import Recipes +import pickle +import math +from . import query_process as qp +from pathlib import Path + +BASE_DIR = Path(__file__).resolve().parent + +term_frequency_address = BASE_DIR / 'doc_index' / 'term_frequency' +doc_len_address = BASE_DIR / 'doc_index' / 'doc_len' +num_docs = BASE_DIR / 'doc_index' / 'num_docs' + +with open(term_frequency_address, "rb") as f: + term_frequency = pickle.load(f) +with open(doc_len_address, "rb") as f: + doc_len = pickle.load(f) +with open(num_docs, "rb") as f: + doc_num = pickle.load(f) class HomePageView(TemplateView): template_name = 'recipe/home.html' + class SearchResultsView(ListView): - model = Recipe + model = Recipes template_name = 'recipe/search_results.html' def get_queryset(self): # new query = self.request.GET.get("q") - object_list = Recipe.objects.filter( - Q(name__icontains=query) - ) - return object_list \ No newline at end of file + ir = self.request.GET.get("ir_check") + # load frequency, doc lengths, doc number + + if ir: + if ' ' not in query: + ir_list = set(sorted(qp.term_query(query, term_frequency, doc_len, doc_num), reverse=True)) + else: + ir_list = set(sorted(qp.tree_query(query, term_frequency, doc_len, doc_num), reverse=True)) + limit_count = 0 + limit = 20 + all_data = None + for doc_id in ir_list: + if limit_count == limit: + break + if limit_count == 0: + all_data = Recipes.objects.filter( + id=doc_id + ) + else: + data = Recipes.objects.filter( + id=doc_id + ) + all_data = all_data | data + limit_count += 1 + return all_data + + else: + mydata = Recipes.objects.filter( + title=query + ) + return mydata