1dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar/*
2dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
4dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * you may not use this file except in compliance with the License.
5dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * You may obtain a copy of the License at
6dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
7dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * Unless required by applicable law or agreed to in writing, software
8dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
9dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * See the License for the specific language governing permissions and
11dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * limitations under the License.
12dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar */
13dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
14fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.testapp;
15dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
16ed6428586a939e00d9e66314d5cf1056ad48767eGeorge Mountimport android.databinding.DataBindingUtil;
17e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mountimport android.databinding.OnRebindCallback;
18ed6428586a939e00d9e66314d5cf1056ad48767eGeorge Mountimport android.databinding.testapp.databinding.BasicBindingBinding;
194eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mountimport android.databinding.testapp.databinding.NoExpressionsBinding;
204eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mountimport android.databinding.testapp.databinding.NoDataElementBinding;
214eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mountimport android.databinding.testapp.databinding.JustIdBinding;
22dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyarimport android.test.UiThreadTest;
23e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mountimport android.view.View;
24ed6428586a939e00d9e66314d5cf1056ad48767eGeorge Mountimport android.view.ViewGroup;
25fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mountimport android.widget.TextView;
26dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
274c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mountpublic class BasicBindingTest extends BaseDataBinderTest<BasicBindingBinding> {
28dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    public BasicBindingTest() {
294c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount        super(BasicBindingBinding.class);
30dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    }
31dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
323f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar    @Override
333f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar    protected void setUp() throws Exception {
343f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar        super.setUp();
353f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar        initBinder();
363f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar    }
373f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar
38dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    @UiThreadTest
390fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    public void testTextViewContentInInitialization() {
400fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar        assertAB("X", "Y");
410fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    }
420fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar
430fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    @UiThreadTest
440fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    public void testNullValuesInInitialization() {
450fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar        assertAB(null, null);
460fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    }
470fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar
480fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    @UiThreadTest
490fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    public void testSecondIsNullInInitialization() {
500fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar        assertAB(null, "y");
510fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    }
520fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar
530fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    @UiThreadTest
540fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    public void testFirstIsNullInInitialization() {
550fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar        assertAB("x", null);
560fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    }
570fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar
580fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar    @UiThreadTest
59dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    public void testTextViewContent() {
60dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        assertAB("X", "Y");
61dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    }
62dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
63dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    @UiThreadTest
64dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    public void testNullValues() {
65dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        assertAB(null, null);
66dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    }
67dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
68dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    @UiThreadTest
69dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    public void testSecondIsNull() {
70dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        assertAB(null, "y");
71dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    }
72dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
73dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    @UiThreadTest
74dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    public void testFirstIsNull() {
75dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        assertAB("x", null);
76dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    }
77dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
78e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    public void testStopBinding() throws Throwable {
79e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        final NoRebind noRebind = new NoRebind();
80e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        runTestOnUiThread(new Runnable() {
81e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            @Override
82e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            public void run() {
83e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertAB("X", "Y");
84e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                mBinder.addOnRebindCallback(noRebind);
85e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            }
86e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        });
87e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        mBinder.setA("Q");
88e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        WaitForRun waitForRun = new WaitForRun();
89e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        View root = mBinder.getRoot();
90e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        root.postOnAnimation(waitForRun);
91e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        waitForRun.waitForRun();
92e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        runTestOnUiThread(new Runnable() {
93e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            @Override
94e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            public void run() {
95e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(1, noRebind.rebindAttempts);
96e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(1, noRebind.rebindHalted);
97e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(0, noRebind.rebindWillEvaluate);
98e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals("XY", mBinder.textView.getText().toString());
99e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            }
100e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        });
101e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        mBinder.removeOnRebindCallback(noRebind);
102e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        final AllowRebind allowRebind = new AllowRebind();
103e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        mBinder.addOnRebindCallback(allowRebind);
104e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        mBinder.setB("R");
105e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        root.postOnAnimation(waitForRun);
106e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        waitForRun.waitForRun();
107e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        runTestOnUiThread(new Runnable() {
108e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            @Override
109e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            public void run() {
110e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(1, noRebind.rebindAttempts);
111e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(1, noRebind.rebindHalted);
112e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(0, noRebind.rebindWillEvaluate);
113e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(1, allowRebind.rebindAttempts);
114e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(0, allowRebind.rebindHalted);
115e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals(1, allowRebind.rebindWillEvaluate);
116e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                assertEquals("QR", mBinder.textView.getText().toString());
117e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            }
118e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        });
119e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    }
120e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
1214eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    @UiThreadTest
1224eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    public void testNoExpressionBinding() throws Throwable {
1234eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        NoExpressionsBinding binding = NoExpressionsBinding.inflate(getActivity().getLayoutInflater());
1244eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        assertNotNull(binding);
1254eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    }
1264eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount
1274eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    @UiThreadTest
1284eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    public void testNoDataElement() throws Throwable {
1294eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        NoDataElementBinding binding = NoDataElementBinding.inflate(getActivity().getLayoutInflater());
1304eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        assertNotNull(binding);
1314eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    }
1324eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount
1334eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    @UiThreadTest
1344eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    public void testJustIds() throws Throwable {
1354eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        JustIdBinding binding = JustIdBinding.inflate(getActivity().getLayoutInflater());
1364eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        assertNotNull(binding);
1374eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        assertNotNull(binding.textView);
1384eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    }
1394eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount
1404eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    @UiThreadTest
1414eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    public void testNoBinding() throws Throwable {
1424eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount        assertNull(DataBindingUtil.inflate(getActivity().getLayoutInflater(), R.layout.plain_layout,
1434eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount                null, false));
1444eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount    }
1454eb96071f10f4c65aaade8c8b76dc0bdc350f671George Mount
146081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount    @UiThreadTest
147081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount    public void testInflation() throws Throwable {
148081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount        ViewGroup viewGroup = (ViewGroup) mBinder.getRoot();
149081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount        BasicBindingBinding binding =
150081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount                BasicBindingBinding.inflate(getActivity().getLayoutInflater(), viewGroup, true);
151081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount        assertNotNull(binding);
152081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount        assertNotNull(binding.textView);
153081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount        assertNotSame(binding.textView, mBinder.textView);
154081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount    }
155081ec223f1f2f801bd907ec6344b0c6aeee133e5George Mount
156fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount    @UiThreadTest
157fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount    public void testAndroidId() throws Throwable {
158fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount        JustIdBinding binding = JustIdBinding.inflate(getActivity().getLayoutInflater());
159fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount        assertNotNull(binding);
160fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount        assertNotNull(binding.empty);
161fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount        assertTrue(binding.empty instanceof TextView);
162fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount    }
163fdfbbcd5ecf37d77a4b9ab1cefdebd68de71ca2bGeorge Mount
164dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    private void assertAB(String a, String b) {
165dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        mBinder.setA(a);
166dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        mBinder.setB(b);
167dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar        rebindAndAssert(a + b);
168dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    }
169dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar
170dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    private void rebindAndAssert(String text) {
1714c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount        mBinder.executePendingBindings();
17234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount        assertEquals(text, mBinder.textView.getText().toString());
173dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar    }
174e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
175e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    private class AllowRebind extends OnRebindCallback<BasicBindingBinding> {
176e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public int rebindAttempts;
177e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public int rebindHalted;
178e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public int rebindWillEvaluate;
179e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
180e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        @Override
181e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public boolean onPreBind(BasicBindingBinding binding) {
182e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            rebindAttempts++;
183e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            return true;
184e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        }
185e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
186e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        @Override
187e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public void onCanceled(BasicBindingBinding binding) {
188e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            rebindHalted++;
189e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        }
190e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
191e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        @Override
192e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public void onBound(BasicBindingBinding binding) {
193e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            rebindWillEvaluate++;
194e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        }
195e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    }
196e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
197e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    private class NoRebind extends AllowRebind {
198e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        @Override
199e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public boolean onPreBind(BasicBindingBinding binding) {
200e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            super.onPreBind(binding);
201e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            return false;
202e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        }
203e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    }
204e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
205e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    private static class WaitForRun implements Runnable {
206e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
207e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        @Override
208e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public void run() {
209e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            synchronized (this) {
210e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                this.notifyAll();
211e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            }
212e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        }
213e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount
214e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        public void waitForRun() {
215e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            synchronized (this) {
216e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                try {
217e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                    this.wait(1000);
218e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                } catch (InterruptedException e) {
219e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                    e.printStackTrace();
220e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount                }
221e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount            }
222e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount        }
223e725f0d81e1b07e88f819be9a82181eeeb680dbfGeorge Mount    }
224dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar}
225