{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyNkYYWvl4WxyJKFVm1V0hhE",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"source": [
"# **What are the differences between Iterables and Iterators?**\n",
"Let's do a quick recap of what we have learned so far.\n",
"\n",
"We have seen that Iterators and Iterables can be different objects even if they don’t always be or have to.\n",
"\n",
"We already know that Iterator can be defined if an object implements the __iter__() and the __next__() methods.\n",
"\n",
"We have already verified that Lists implement the __iter__() method and Lists can be defined as Iterables, but we have proved that Lists are not Iterators."
],
"metadata": {
"id": "dCRFWhyAIHlh"
}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "mP2865ByH2SG",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "0d1016d9-bdff-497a-fd24-e816993b10ed"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Ravi\n",
"Shivam\n",
"5\n",
"10\n",
"5\n",
"10\n",
"c\n",
"h\n",
"i\n",
"r\n",
"a\n",
"g\n",
"-----\n",
"2\n",
"4\n",
"6\n",
"\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"1\n",
"2\n",
"3\n",
"-----\n",
"1\n",
"2\n",
"3\n",
"-----\n",
"1\n",
"2\n",
"3\n",
"-----\n",
"\n",
"1 2 3 4 5 \n",
"1 2 3 4 5 \n",
"\n",
"True\n",
"\n",
"25\n",
"78\n",
"Coding\n",
"is\n",
"<3\n",
"87\n",
"90\n",
"100\n",
"500\n"
]
}
],
"source": [
"class FibonacciIterator:\n",
" def __init__(self, max: int):\n",
" self.max = max\n",
" self.a = 0\n",
" self.b = 1\n",
" self.counter = self.a\n",
"\n",
" def __iter__(self):\n",
" \"\"\"\n",
" This method returns the iterator itself\n",
"\n",
" :return:\n",
" \"\"\"\n",
"\n",
" return self\n",
"\n",
" def __next__(self):\n",
" \"\"\"\n",
" This method returns the next element.\n",
"\n",
" :return:\n",
" \"\"\"\n",
"\n",
" if self.counter > self.max:\n",
" raise StopIteration\n",
" else:\n",
" self.a, self.b = self.b, self.a + self.b\n",
" self.counter = self.a\n",
" return self.counter\n",
"\n",
"'''\n",
"series = FibonacciIterator(20)\n",
"for num in series:\n",
" print(num)\n",
"else:\n",
" print(\"stop\")\n",
"\n",
"for num in series:\n",
" print(num)\n",
"else:\n",
" print(\"stop\")\n",
"\n",
"for num in series:\n",
" print(num)\n",
"else:\n",
" print(\"stop\")\n",
"\n",
"\n",
"for _ in range(10):\n",
" fibonacci_series = [print(num) for num in FibonacciIterator(20)]\n",
"\n",
"\n",
"series = FibonacciIterator(20)\n",
"for num in series:\n",
" print(num)\n",
"else:\n",
" print(\"stop\")\n",
"for num in series:\n",
" print(num)\n",
"else:\n",
" print(\"stop\")\n",
"'''\n",
"student_list=['Ravi','Shivam','Teja','Rohan']\n",
"student_tuple=('Ravi','Shivam','Teja','Rohan')\n",
"student_set={'Ravi','Shivam','Teja','Rohan'}\n",
"student_dict = {'name': 'Ravi', 'branch': 'CSE', 'year': 3 }\n",
"\n",
"itr = iter(student_list)\n",
"next(itr)\n",
"next(itr)\n",
"\n",
"student_list = ['Ravi','Shivam','Teja','Rohan']\n",
"\n",
"itr = iter(student_list)\n",
"\n",
"print(next(itr))\n",
"print(next(itr))\n",
"\n",
"class FiveMultiple:\n",
"\n",
" def __iter__(self):\n",
" self.num = 5\n",
" return self\n",
"\n",
" def __next__(self):\n",
" val = self.num\n",
" self.num += 5\n",
" return val\n",
"\n",
"tableiter = iter(FiveMultiple())\n",
"\n",
"print(next(tableiter))\n",
"print(next(tableiter))\n",
"\n",
"class FiveMultiple:\n",
"\n",
" def __iter__(self):\n",
" self.num = 5\n",
" return self\n",
"\n",
" def __next__(self):\n",
" val = self.num\n",
" self.num += 5\n",
" return val\n",
"\n",
"tableiter = iter(FiveMultiple())\n",
"\n",
"print(next(tableiter))\n",
"print(next(tableiter))\n",
"\n",
"# String as an iterable\n",
"for i in 'chirag':\n",
" print(i)\n",
"print('-----')\n",
"# list as an iterable\n",
"for i in [1, 2, 3]:\n",
" print(str(i*2))\n",
"\n",
"number_iterator = iter([1, 2, 3, 4, 5])\n",
"print(type(number_iterator))\n",
"print(next(number_iterator))\n",
"print(next(number_iterator))\n",
"print(next(number_iterator))\n",
"print(next(number_iterator))\n",
"print(next(number_iterator))\n",
"# Once the iterator is exhausted, next() function raise StopIteration.\n",
"#print(next(number_iterator))\n",
"\n",
"number_iterator = iter([1, 2, 3, 4, 5])\n",
"for element in number_iterator:\n",
" print(element)\n",
"\n",
"\n",
"# Use iterables in for-loops for multiple times\n",
"number_iterable = [1, 2, 3]\n",
"for i in number_iterable:\n",
" print(i)\n",
"print('-----')\n",
"for i in number_iterable:\n",
" print(i)\n",
"print('-----')\n",
"# Use iterators in for-loops for multiple times\n",
"number_iterator = iter([1, 2, 3])\n",
"for i in number_iterator:\n",
" print(i)\n",
"print('-----')\n",
"for i in number_iterator:\n",
" print(i)\n",
"# nothing is printed\n",
"\n",
"list_1 = [1,2,3,4,5]\n",
"list_2 = iter(list_1)\n",
"print (list_2)\n",
"# Iterating through iterable(list_1) using for loop.\n",
"for element in list_1:\n",
" print (element,end=\" \")\n",
"print (\" \")\n",
"# Iterating through iterator(list_2) using for loop.\n",
"for element in list_2:\n",
" print(element,end=\" \")\n",
"\n",
"list_1 = [1,2,3,4,5]\n",
"# Returns an iterator\n",
"list_2 = iter(list_1)\n",
"print (list_2)\n",
"# Calling iter() function on iterator itself.\n",
"list_3 = iter(list_2)\n",
"print (list_3)\n",
"print (list_2 == list_3)\n",
"\n",
"# Program to print the list using Iterator protocols\n",
"X = [25, 78, 'Coding', 'is', '<3']\n",
"# Get an iterator using iter()\n",
"a = iter(X)\n",
"\n",
"# Printing the a iterator\n",
"print(a)\n",
"\n",
"# next() for fetching the 1st element in the list that is 25\n",
"print(next(a))\n",
"\n",
"# Fetch the 2nd element in the list that is 78\n",
"print(next(a))\n",
"\n",
"# Fetching the consecutive elements\n",
"print(next(a))\n",
"print(next(a))\n",
"print(next(a))\n",
"\n",
"\n",
"# Program to print the tuple using Iterator protocols\n",
"tup = (87, 90, 100, 500)\n",
"\n",
"# get an iterator using iter()\n",
"tup_iter = iter(tup)\n",
"\n",
"# Infinite loop\n",
"while True:\n",
" try:\n",
" # To fetch the next element\n",
" print(next(tup_iter))\n",
" # if exception is raised, break from the loop\n",
" except StopIteration:\n",
" break"
]
},
{
"cell_type": "markdown",
"source": [
"# **The iter built-in function**\n",
"Python has a built-in iter() function to get an Iterator and a next() function to loop through its elements.\n",
"\n",
"Iterators can be easily created from a sequence using the iter() built-in function.\n",
"\n",
"We have already learned that Iterable is an object we iterate over and generates an Iterator when passed to the iter() function."
],
"metadata": {
"id": "Dw5AMJ7rIIPg"
}
},
{
"cell_type": "code",
"source": [
"class MyNumbers:\n",
" # __iter__() is same as iter()\n",
" def __iter__(self):\n",
" self.a = 1\n",
" return self\n",
"\n",
" # __next__() is same as next()\n",
" def __next__(self):\n",
" # 20th is the highest value\n",
" if self.a <= 5:\n",
" x = self.a\n",
" # Manually increment\n",
" self.a += 1\n",
" # returning the iterator to the function call\n",
" return x\n",
"\n",
"# Create the object of the class\n",
"myclass = MyNumbers()\n",
"# get an iterator using iter()\n",
"myiter = iter(myclass)\n",
"\n",
"'''\n",
"# printing the values using a for-in loop\n",
"for x in myiter:\n",
" print(x)\n",
"\n",
"class MyNumbers:\n",
" # __iter__() is same as iter()\n",
" def __iter__(self):\n",
" self.a = 1\n",
" return self\n",
"\n",
" # __next__() is same as next()\n",
" def __next__(self):\n",
" # 20th is the highest value\n",
" if self.a <= 5:\n",
" x = self.a\n",
" # Manually increment\n",
" self.a += 1\n",
" # returning the iterator to the function call\n",
" return x\n",
" # added the terminating statement to prevent the iteration to go on forever\n",
" else:\n",
" raise StopIteration\n",
"\n",
"# Create the object of the class\n",
"myclass = MyNumbers()\n",
"# get an iterator using iter()\n",
"myiter = iter(myclass)\n",
"\n",
"# printing the values using a for-in loop\n",
"for x in myiter:\n",
" print(x)\n",
"\n",
"class PowerTwo:\n",
" # Class to implement an iterator of powers of two\n",
" # Constructor accepting the max value\n",
" def __init__(self, max=0):\n",
" self.max = max\n",
"\n",
" # defined __iter__() to point the first element\n",
" def __iter__(self):\n",
" self.n = 1\n",
" return self\n",
"\n",
" # __next__() to fetch the next value from the iterator\n",
" def __next__(self):\n",
" if self.n <= self.max:\n",
" result = 2 ** self.n\n",
" self.n += 1\n",
" return result\n",
"\n",
" # Terminating condition\n",
" else:\n",
" raise StopIteration\n",
"\n",
"# create an object\n",
"numbers = PowerTwo(4)\n",
"\n",
"# create an iterable from the object\n",
"i = iter(numbers)\n",
"\n",
"# Using for-in loop to print the elements up to max\n",
"for it in i:\n",
" print(it)\n",
"\n",
"# Program to print the Power of two up to the given number\n",
"def PowerTwoGen( max=0 ):\n",
" n = 1\n",
" while n < max:\n",
" yield 2 ** n\n",
" n += 1\n",
"\n",
"a = PowerTwoGen(6)\n",
"\n",
"# Printing the values stored in a\n",
"for i in a:\n",
" print(i)\n",
"\n",
"# A simple generator for Fibonacci Numbers\n",
"def fib(max):\n",
" # Initialize first two Fibonacci Numbers\n",
" p, q = 0, 1\n",
"\n",
" # yield next Fibonacci Number one at a time\n",
" while p < max:\n",
" yield p\n",
" p, q = q, p + q\n",
"\n",
"# Ask the user to enter the maximum number\n",
"n = int(input(\"Enter the number up to which you wish the Fibonacci series to be printed: \\n\"))\n",
"\n",
"# Create a generator object\n",
"x = fib(n)\n",
"# Iterating over the generator object using for\n",
"# in a loop.\n",
"print(\"Resultant Series up to\", n, \"is :\")\n",
"for i in x:\n",
" print(i)\n",
"\n",
"def for_loop(iterable):\n",
" for item in iterable:\n",
" print(\"Do something with\", item)\n",
"\n",
"def for_loop(iterable):\n",
" iterator = iter(iterable)\n",
" while True:\n",
" try:\n",
" item = next(iterator)\n",
" except StopIteration:\n",
" break # Iterator exhausted\n",
" else:\n",
" print(\"Do something with\", item)\n",
"\n",
" while True:\n",
" try:\n",
" item = next(iterator)\n",
" except StopIteration:\n",
" break # Iterator exhausted\n",
" else:\n",
" print(\"Do something with\", item)\n",
"\n",
"\n",
"\n",
"class CustomIterator:\n",
" def __init__(self, data):\n",
" self.data = data\n",
" self.index = 0\n",
"\n",
" def __iter__(self):\n",
" return self\n",
"\n",
" def __next__(self):\n",
" if self.index >= len(self.data):\n",
" raise StopIteration\n",
" item = self.data[self.index]\n",
" self.index += 1\n",
" return item\n",
"\n",
"\n",
"class CustomObject:\n",
" def __init__(self):\n",
" self.data = [1, 2, 3, 4, 5]\n",
"\n",
" def __iter__(self):\n",
" return CustomIterator(self.data)\n",
"\n",
"import itertools\n",
"\n",
"for num in itertools.count(1, 2):\n",
" print(num)\n",
"\n",
"import itertools\n",
"\n",
"colors = ['red', 'green', 'blue']\n",
"color_cycle = itertools.cycle(colors)\n",
"\n",
"for color in color_cycle:\n",
" print(color)\n",
"\n",
"'''\n",
"my_list = [1, 2, 3, 4, 5]\n",
"my_iterator = (my_list)\n",
"\n",
"for item in my_iterator:\n",
" print(item)\n",
" break\n",
"my_list = [1, 2, 3, 4, 5]\n",
"my_iterator = (my_list)\n",
"\n",
"for item in my_iterator:\n",
" print(item)\n",
" break\n",
"import itertools\n",
"\n",
"for num in itertools.repeat(10):\n",
" print(num)\n",
" break\n",
"# items that appear on the RHS of the for-loop is an iterable\n",
"for i in [1,2,3,4,5]:\n",
" print(i)\n",
"\n",
"# Get iterator from iterable\n",
"iterator_from_list = iter([1,2,3,4,5])\n",
"type(iterator_from_list)\n",
"\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "56ptdKroIIWw",
"outputId": "0c9cd0bf-5002-4bfd-e123-b8438556270d"
},
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1\n",
"1\n",
"10\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"list_iterator"
]
},
"metadata": {},
"execution_count": 1
}
]
},
{
"cell_type": "markdown",
"source": [
"# **How to build our Iterator**\n",
"An easy way of seeing an Iterator is like an object that contains data. We have seen that an object has to implement the __iter__() and __next__() methods.\n",
"\n",
"The __next__() method is the one that produces data.\n",
"\n",
"An important note: the __next__() doesn't have to be defined as long as the __iter__() is defined.\n",
"\n",
"The __iter_() method returns the iterator object itself. So every Iterator is also an Iterable and may be used in most places where other Iterables are accepted."
],
"metadata": {
"id": "byVh6whZIIdx"
}
},
{
"cell_type": "code",
"source": [
"numbers = [1, 2, 3]\n",
"\n",
"for number in numbers:\n",
" print(number)\n",
"\n",
"word = \"Testing\"\n",
"\n",
"for character in word:\n",
" print(character)\n",
"\n",
"'''\n",
"class Course:\n",
" participants = [\"Alice\", \"Bob\", \"Charlie\"]\n",
"\n",
" def __iter__(self):\n",
" return iter(self.participants)\n",
"\n",
" def __next__(self):\n",
" while True:\n",
" try:\n",
" value = next(self)\n",
" except StopIteration:\n",
" break\n",
" return value\n",
"\n",
"'''\n",
"numbers = [1, 2, 3, 4, 5]\n",
"print(dir(numbers))\n",
"\n",
"numbers = [1, 2, 3, 4, 5]\n",
"iter_numbers = (numbers)\n",
"print(dir(iter_numbers))\n",
"\n",
"numbers = [1, 2, 3, 4, 5]\n",
"\n",
"# Get the iterator from numbers list\n",
"iter_numbers = iter(numbers)\n",
"\n",
"# Start retrieving the next values indefinitely\n",
"while True:\n",
" try:\n",
" # Try to get the next value from the iterator and print it\n",
" number = next(iter_numbers)\n",
" print(number)\n",
" # If the iterator has no more values, escape the loop\n",
" except StopIteration:\n",
" break\n",
"'''\n",
"for i in range(4):\n",
" print(i)\n",
"\n",
"class RangeValues:\n",
" def __init__(self, start_value, end_value):\n",
" self.current_value = start_value\n",
" self.end_value = end_value\n",
"\n",
" def __iter__(self):\n",
" return self\n",
"\n",
" def __next__(self):\n",
" if self.current_value >= self.end_value:\n",
" raise StopIteration\n",
" value = self.current_value\n",
" self.current_value += 1\n",
" return value\n",
"\n",
"for i in RangeValues(1,5):\n",
" print(i)\n",
"\n",
"def range_values(start, end):\n",
" current = start\n",
" while current < end:\n",
" yield current\n",
" current += 1\n",
"\n",
"\n",
"for i in range_values(0,5):\n",
" print(i)\n",
"\n",
"def infinite_values(start):\n",
" current = start\n",
" while True:\n",
" yield current\n",
" current += 1\n",
"\n",
"infinite_nums = infinite_values(0)\n",
"\n",
"for num in infinite_nums:\n",
" print(num)\n",
"\n",
"class NumberIterable:\n",
" def __init__(self, *numbers):\n",
" self.numbers = numbers\n",
"\n",
" def __getitem__(self, idx: int) -> int:\n",
" if idx < len(self.numbers):\n",
" return self.numbers[idx]\n",
" raise IndexError(\"list index out of range\")\n",
"'''\n",
"numbers = (1, 2, 3, 4, 5)\n",
"for number in numbers:\n",
" print(number)\n",
"\n",
"\n",
"iterator = iter([1, 2, 3, 4, 5])\n",
"print(iterator)\n",
"for i in iterator:\n",
" print(i)\n",
"\n",
"class Range:\n",
" def __init__(self, start: int, end: int, step: int = 1):\n",
" self.start = start\n",
" self.end = end\n",
" self.step = step\n",
" self.current = start\n",
"\n",
" def __iter__(self):\n",
" return self\n",
"\n",
" def __next__(self):\n",
" if self.current > self.end:\n",
" raise StopIteration\n",
" current = self.current\n",
" self.current += self.step\n",
" return current\n",
"\n",
"\n",
"my_range = Range(0, 10)\n",
"first = next(my_range)\n",
"print(f\"first: {first}\")\n",
"second = next(my_range)\n",
"print(f\"second: {second}\")\n",
"for item in my_range:\n",
" print(item)\n",
"'''\n",
"def mapper_gen(func: Callable[[int], int], collection: list[int]):\n",
" for item in collection:\n",
" yield func(item)\n",
"\n",
"items = [1, 2, 3, 4, 5]\n",
"#mapper = (lambda x: x * 2, items)\n",
"#first = next(mapper)\n",
"print(f\"first: {first}\")\n",
"second = next(mapper)\n",
"print(f\"second: {second}\")\n",
"for item in mapper:\n",
" print(item)\n",
"empty = next(mapper, None)\n",
"'''\n",
"even_numbers = [i for i in filter(lambda x: x % 2 == 0, range(10))]\n",
"print(even_numbers)\n",
"\n",
"generator_expression = (i for i in filter(lambda x: x % 2 == 0, range(10)))\n",
"print(generator_expression)\n",
"\n",
"class EvenNumbers:\n",
" last = 0\n",
"\n",
" def __iter__(self):\n",
" return self\n",
"\n",
" def __next__(self):\n",
" self.last += 2\n",
"\n",
" if self.last > 8:\n",
" raise StopIteration\n",
"\n",
" return self.last\n",
"\n",
"even_numbers = EvenNumbers()\n",
"\n",
"for num in even_numbers:\n",
" print(num)\n",
"\n",
"nums_iter = iter({1,2,3,4,5})\n",
"\n",
"print(nums_iter.__next__())\n",
"print(nums_iter.__next__())\n",
"print(nums_iter.__next__())\n",
"\n",
"\n",
"for city in (\"Delhi\", \"Punjab\", \"Chennai\", \"Pune\"):\n",
" print(city)\n",
"\n",
"for character in \"Hello!\":\n",
" print(character)\n",
"\n",
"class EvenNumbers:\n",
" def __iter__(self):\n",
" self.num = 0\n",
" return self\n",
"\n",
" def __next__(self):\n",
" next_num = self.num\n",
" self.num += 2\n",
" return self.num\n",
"\n",
"evens = EvenNumbers()\n",
"even_iter = iter(evens)\n",
"\n",
"print(next(even_iter))\n",
"print(next(even_iter))\n",
"print(next(even_iter))\n",
"print(next(even_iter))\n",
"print(next(even_iter))\n",
"print(next(even_iter))\n",
"\n"
],
"metadata": {
"id": "FSB0Gmg4IImI",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "c07fd42a-d404-4add-ecf8-61a3647b605a"
},
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1\n",
"2\n",
"3\n",
"T\n",
"e\n",
"s\n",
"t\n",
"i\n",
"n\n",
"g\n",
"['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n",
"['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"first: 0\n",
"second: 1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n",
"8\n",
"9\n",
"10\n",
"[0, 2, 4, 6, 8]\n",
" at 0x7fd552cdd840>\n",
"2\n",
"4\n",
"6\n",
"8\n",
"1\n",
"2\n",
"3\n",
"Delhi\n",
"Punjab\n",
"Chennai\n",
"Pune\n",
"H\n",
"e\n",
"l\n",
"l\n",
"o\n",
"!\n",
"2\n",
"4\n",
"6\n",
"8\n",
"10\n",
"12\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"# **User Defined Iterators**\n",
"Python supports user-defined iterators. To build a user-defined iterator, one needs to implement __iter__() and __next__():\n",
"\n",
"__iter__() should return the iterator object and initialize if required.\n",
"__next__() should return the next item in the defined pattern."
],
"metadata": {
"id": "agacgQEnIIsw"
}
}
]
}