<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="default.xsl"?>
<fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="true"
expanded="true"
root="true"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>365</fr:anchor><fr:addr
type="user">ocs-0001</fr:addr><fr:route>index.xml</fr:route><fr:title
text="Owen">Owen</fr:title><fr:authors><fr:author>owensmith</fr:author></fr:authors><fr:meta
name="author">false</fr:meta></fr:frontmatter><fr:mainmatter><fr:p>I am a <fr:em>Sr. Scientific Software Developer</fr:em> for <fr:link
type="external"
href="https://www.earthdata.nasa.gov/centers/gesdisc-daac">NASA Goddard's Earth Sciences Data Information Services Center</fr:link> and a <fr:em>Ph.D. Candidate</fr:em> in <fr:link
type="external"
href="https://cnr.ncsu.edu/geospatial/">Geospatial Analytics @ NCSU</fr:link>.
You can also find me elsewhere at <fr:link
type="external"
href="https://bsky.app/profile/bean.computer">bsky</fr:link>, <fr:link
type="external"
href="https://git.sr.ht/~obeancomputer/">sourcehut</fr:link>, <fr:link
type="external"
href="https://github.com/ocsmit">github</fr:link>.</fr:p><fr:p>This website is built using <fr:link
type="external"
href="https://www.forester-notes.org">Forester</fr:link> and is used to collect various notes. You can search the site using <fr:code>ctrl+k</fr:code></fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>364</fr:anchor><fr:addr
type="user">ocs-0002</fr:addr><fr:route>ocs-0002.xml</fr:route><fr:title
text="Notes">Notes</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>This is a notebook in which I keep notes of a variety of subjects at varying degrees of disjointedness.</fr:p><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>249</fr:anchor><fr:addr
type="user">ocs-0006</fr:addr><fr:route>ocs-0006.xml</fr:route><fr:title
text="Double Logistic Greendown Model">Double Logistic Greendown Model</fr:title><fr:taxon>Note</fr:taxon><fr:date><fr:year>2025</fr:year><fr:month>3</fr:month><fr:day>20</fr:day></fr:date><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Logistic sigmoid function for modeling <fr:link
type="local"
href="ocs-0007.xml"
addr="ocs-0007"
title="Phenology">Phenology</fr:link> detailed in <fr:link
type="local"
href="elmore_ea_2011.xml"
addr="elmore_ea_2011"
title="Landscape controls on the timing of spring, autumn, and growing season length in mid-Atlantic forests">Elmore et. al 2011</fr:link> &amp; <fr:link
type="local"
href="gao_ea_2021.xml"
addr="gao_ea_2021"
title="Long-term, medium spatial resolution annual land surface phenology with a Bayesian hierarchical model">Gao et al. 2011</fr:link>. The function combines spring and autumn seasons into a single equation to account for the <fr:strong>greendown</fr:strong> phenomena by allowing for a gradual reduction of VI values in mid-summer. Typically the model is fit to all VI observations within a single year using maximum likelihood methods.</fr:p><fr:tex
display="block"><![CDATA[ 	v(t, M) = m_1 + (m_2 - m_7t)\left (\frac {1}{1+e^{(m_3-t)/m_4}}-\frac {1}{1 + e^{(m_5-t)/m_6}}\right ) ]]></fr:tex><fr:p>	where
		<fr:ul><fr:li><fr:tex
display="inline"><![CDATA[v(t,m)]]></fr:tex> is the modeled VI value at time <fr:tex
display="inline"><![CDATA[t]]></fr:tex> in terms of day of year (DOY)</fr:li>
			<fr:li><fr:tex
display="inline"><![CDATA[M = [m_1, \dots  , m_7]^T]]></fr:tex> is a parameter vector controlling the shape of the double-logistic function.</fr:li>
			<fr:li><fr:tex
display="inline"><![CDATA[m_1]]></fr:tex> represents the mean VI value in the dormant period;</fr:li>
			<fr:li><fr:tex
display="inline"><![CDATA[(m_2 − m_7t)]]></fr:tex> represents the <fr:strong>difference</fr:strong> between VI value at time <fr:tex
display="inline"><![CDATA[t]]></fr:tex> and the dormant mean;</fr:li>
			<fr:li><fr:tex
display="inline"><![CDATA[m_3]]></fr:tex> and <fr:tex
display="inline"><![CDATA[m_5]]></fr:tex> are the inflection points that are commonly used to represent start-of-season (SOS) and end-of-season (EOS) dates in terms of DOY in the spring and autumn;</fr:li>
			<fr:li><fr:tex
display="inline"><![CDATA[m_4]]></fr:tex> and <fr:tex
display="inline"><![CDATA[m_6]]></fr:tex> are the corresponding slopes of the VI trajectories in spring and autumn;</fr:li>
			<fr:li><fr:tex
display="inline"><![CDATA[m_7]]></fr:tex> is the “greendown” parameter that accounts for the VI greendown phenomenon in the mid-summer time.</fr:li></fr:ul></fr:p><fr:p>Given the set <fr:tex
display="inline"><![CDATA[t \in  [1, \dots , 366]]]></fr:tex> and <fr:tex
display="inline"><![CDATA[M = \{0.05, 1, 120, 8, 290, 6, 0.0011\}]]></fr:tex>, a single years <fr:link
type="local"
href="ocs-0007.xml"
addr="ocs-0007"
title="Phenology">phenology</fr:link> would be estimated by the following curve.</fr:p>
 
  
  <fr:figure><fr:resource
hash="c346ce0392b9a0ec33885eff7e0fa5eb"><fr:resource-content><fr:img
src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KPCEtLSBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBkdmlzdmdtIDMuMi4yIC0tPgo8c3ZnIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9JzY2Ni41NzM0NnB0JyBoZWlnaHQ9JzU1MC4zNzg1OTVwdCcgdmlld0JveD0nLTcyIC03MiA0NDQuMzgyMzA2IDM2Ni45MTkwNjQnPgo8c3R5bGUgdHlwZT0ndGV4dC9jc3MnPgo8IVtDREFUQVtAZm9udC1mYWNle2ZvbnQtZmFtaWx5OmNtc3k1O3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjtiYXNlNjQsZDA5R1JnQUJBQUFBQUFMNEFBb0FBQUFBQTFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJQVXk4eUFBQUE5QUFBQUVvQUFBQmdxbDJWcjJOdFlYQUFBQUZBQUFBQUtnQUFBRFFBRENKbFoyeDVaZ0FBQVd3QUFBQTBBQUFBTkdmUCtEcG9aV0ZrQUFBQm9BQUFBQzBBQUFBMksyL3p0MmhvWldFQUFBSFFBQUFBSGdBQUFDUUhnUUNSYUcxMGVBQUFBZkFBQUFBSUFBQUFDQWdGQUtWc2IyTmhBQUFCK0FBQUFBWUFBQUFHQUJvQUFHMWhlSEFBQUFJQUFBQUFGd0FBQUNBQUJBQU5ibUZ0WlFBQUFoZ0FBQURPQUFBQk9CTjlLcmR3YjNOMEFBQUM2QUFBQUJBQUFBQWdBQU1BQVhqYVkyQm1DV1djd01ES3dNQTBpK25zUHhHR2ZoRE4rSWJ4RFlNeEl5Y0RFTEF4b0FBSEdDT2x1Q3lkZ1UxSlNFbUlXZXVQSlFNRHN4YnpjYUF3STBMcC8vOE1EQURwZWc1QkFBQjQybU5nWUdCaVlHQmdCbUlSSU1rSXBsa1lGSUEwQ3hBQytVcEMvLzlEeUx2dndmSU1BRkdvQnBBQUFBQUJBS1VBNGdPd0FSNEFDd0FBSlNFR0pqUTJGeUUyRmhRR0E0WDlTdzBlSGcwQ3RRMGVIdU1CQ2lnS0FRRUtLQW9BQUFCNDJtTmdaR0JnQU9MSGYzNnVqdWUzK2NyQXpNSUFBaytZSXM0aDB5eWhqSEpBaW9PQkNjUURBRWxPQ2NZQUFBQjQybU5nWkdCZzF2cGp5Y0RBRXNxd0ZNamV3QUFVUVFGTUFFNmhBeGdBQUFSVkFBQURzQUNsQUFBQUFBQWFBQUI0Mm1OZ1pHQmdZR0xnWVFEUkRGQVNDUUFBQWNrQUVnQjQyazJNUFcvQ01CQ0duNGdFaVRDd1ZCMDZnQWZtQ0VKWnV6QXdzVEt4QURZb1F4eGtoMGlScW83OTNiMjRIampKcCtmOU9BTTVQeVFNa3pBTGU1aVVUTlEvWjB4NWl6d1d0WWljODhHU0VVazZFV2ZPVitSVWtsUGtqSGR1a2NmaWYwZk8rZVIzMTlTUFoydWNPalRhT0h1dGZiODlHdWVyeHFwMXNRcDZiNnh4NTlab2RlbVY3aXJmM1d1MUtjcWlaRWREellNbkxRYUg0aUNPRG15NVN1YnAyWElNanFlUzFFcHJUY0hxSmQ5TGJrUG5ISDdTMHJsSW9vUTZ1Zkt5NzlKV2JPU3lITjRmOEhNd1NRQUFlTnBqWUdaQUJvd01hQUFBQUk0QUJRPT0pIGZvcm1hdCgnd29mZicpO30KQGZvbnQtZmFjZXtmb250LWZhbWlseTpjbW1pNTtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmY7YmFzZTY0LGQwOUdSZ0FCQUFBQUFBZjBBQW9BQUFBQUNlZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUFV5OHlBQUFBOUFBQUFFTUFBQUJnaFVkMXhHTnRZWEFBQUFFNEFBQUFUd0FBQUhRQmdBSmJaMng1WmdBQUFZZ0FBQVRvQUFBR1ZGUC9KV05vWldGa0FBQUdjQUFBQUM4QUFBQTJMRVgwcEdob1pXRUFBQWFnQUFBQUh3QUFBQ1FJZ3dPRmFHMTBlQUFBQnNBQUFBQW9BQUFBS0NJYUJFRnNiMk5oQUFBRzZBQUFBQllBQUFBV0I2Z0YybTFoZUhBQUFBY0FBQUFBR0FBQUFDQUFEUUIxYm1GdFpRQUFCeGdBQUFET0FBQUJPUE5kS3A5d2IzTjBBQUFINkFBQUFBd0FBQUFnQUFNQUFIamFZMkJtem1TY3dNREt3TUEwaStuc1B4R0dmaEROK0lieERZTXhJeWNERUxBeHdBRWpBeEpJS1M1TEIwcnFNSlF4TS93SDhwa2gwa2hxL2dPRkFjOEJEUHdBZU5wallHQmdZbUJnWUFaaUVTREpDS1paR0JMQXRBQlFoSVZCaDBHUHdZWEJsOEdmSVpJaGw2R0VvZXovZjZBc0Z0SC9WLzlmK2IvLy8vYi8yLzZ2L1Qvci81VC9rOEhtWVFBQVhiWVp6QUI0Mm0yVlMyd1RSeGpIOTV2WjdIclgrMzdHN3ppMmQrMlkyUEZyTnlIRTJ3UUhhQktLRUJCQUpWSVBVS2tJVlVHSUM2SVVCSW9vYlNtdHVQUWhrUmFodHJSYzJ3dWNlMFNxS3ZWVVRoVlNUKzBsSitxNHM1c0FyVlROeXZiTXJFYi83Ly83ZjJNS3FPOEhVK0JUNzFBbVJaVVl0d1p0ejgrQ3ljakFzRFhrZHdFTU5aSEo1ek9GTWRxVlhKRVZRTEo5U1FZb05rc0EzYzZ4amprT0lJcWNlcFNpS0tBZVVBQVY2aUlWSStkSk1PcTB2YVlGRlNpMml1VHBKc0xQSWtVaDZzSmdRR2ZRUXlwSE5TbksxLzJPVXdmRzZiUTlPNThGbTJIRGtkOWFhSG82WnUxVzB5Tnlha0EwVnNGaC9sN0RxcEUyTkVPQnU5Y2ZZTHpTM252eG84MVRrbUVaazVrL2IrRDgvUU9mNzVxc3dVZzYvNGIvWlU0NWdoS0NTQU1BSXhvY3dPM0xhNmRucWtzSUdNSGtRRUcxL3E4Nm1wcnRyWitlVDJaU0lFUzFYQnIwaDhhSXhvTmtnbG5HeW9Gbm1STFVnWFhjU0pldkErT09PbTRjV01iMkxKdXBJN0xWQmJzTC95bXBSZlowSU92a2gwRUtLemdNL2MwYUJrN2JvV2lnTVRkdnFCRHF4amMzTzZZaThlam1HbzBYT0FXUXRYUG12SXhBamZYSytOM25GZDgxWmZvcWZDdVk2bWVTemlFbTRXZlF5ZjVUbWFGaHV5Q2F4bEpZbDQxMjl0OUxZVVZDYi9XZkRwZkMzUnpDUUNQWjRBRlhiWGoyYjFNNHZmOElMVWdzbVNkRUJLQVNUdWNIZitBbjZHZEtwUnppd2hZWEFzSHp3NUVsQ1FCQ2hUQXBiRzFaTmhuNENWNlpQblR0enAwZkVYNTlldm5xK3AwZitzOE9mK3IxV29BL09IbnJ6R2p5R0QwVUNOSThmSGR0ZFcvN0FFMS9kZW5LNm1MbklNYjMrazloS1RqeWRlUGNLajZSTFp6OTRxSVg1NnFFeFpuQkFHK2dSOVEraXVLSTJ5U2ZMM0FnR1NJZWxoY0FEcFU0SFMrSGZNK1d3Q1dTOUVnaG9VUVdBMmhhdHNFVUpHRHh4T2JqQ2tjTWV3NWh6OUpDVHdOTDgzT3gya00yWFpjMFpNM04zcFl4YUdMYVF2ZEFNZ1M2d0FnRXl1U3VpUm90Z0JidnpCbG9ldk8zZTNsT2VtaytCc0NSL1NEbkg4SlJSU1QyWmtQWFFTT3VJOFJ0UGdac1NEWmk0K0V5aVJhdjgzUlJpekozWXJCQmZ3Zy9VZWRJL3dUZ2RkcE9LRllDR1lmZDVBYTAxL0VjTjFvcXVJN3JSQnk4SEZoaDVyYStrUlgxTDNsTXhvNzR0QWdWNHlXNjhFMDM0clY5YXR0SDViTEFqTGl0UUhBYUtHbHdYRHBsQVZQZ1JaNEJOVG5pQ0lnVHhCaUpCSzlucDZ3eG9jS21WaGJ6RTNLTno1Mzg1RFZrMGJiRVk1UXZCVExOQ1VJTTBxSlM2ZFVEa2lsakhLR0ZwZWF3V29veFl6RStsVFpoNlBoNks2V09scEVyRkE4eWJ5N25kRm5Uc3RmSEo4WXRVUzBDMmx2ak9ZVDRvWG82WGFlUnloZ3pJN3N4VW1MbW5tb1B6VTd0ZUNYZXphZmpTZ0hEWEYwbWI4YU5ocUhWYVppb0pMVDY1Zm8rUkRlczRiWmgzNDhPWnZYUTErWEJCdnlPcmxEdHFKY042MytNYVFlb3NOMnZBY2wxaTl5RE1teDNMTXd0Z3Bhb0hFcGlQazdLS3loMmMzRnlIb1ppdTg3S3BDTXZqSEJzVnRRTTNWeVY5QmltNGYzTlg5VGhERUF3R1dlSlFLVmhHVVNndDRNM1NuOXRkZHZWckVuU0poNDRRcG90amlIVXVETFlRQjhUOWpOa1lvVTNNTUVjMGdtSmRSejJCZlQyZHZQWjBUV2RoYTBNMU1qRkZGNCt2bWVoV3lDRDJra2REL2FmUXNsTW5JVnNNVkJ4TEVTWUVWUzMxK2dDRWlvS3dGUmxkNzFnWmlIREN3eEF3VmJMOExhMkdOdC91TG9IN1Y1SUw3OXFKYVV5d0d3N0hoSXhXcm82UVVQTFRTUk9OMXkvRFBSMHRkR2JMekZpVExMSTM0RkxJdndQc3c3c0xYamFZMkJrWUdBQVloK3A4OWZqK1cyK01qQ3pNSURBRTZhSWN3ajZ2eVdyRnRNbElKZURnUWtrQ2dBZmpBb1NBSGphWTJCa1lHQm0rTS9Bd01DcXpCRDJQNXhWaXdFb2dnSzRBRXJhQXhJQUExUUFBQUhWQUt3QjFRQ3RCSEFBZWdVakFINEVNQUIxQTB3QWJBVHBBRndDUVFCV0F1TUFYUUFBQUFBQUtBQThBSTRCRUFGVUFjZ0NkQUxHQXlvQUFIamFZMkJrWUdEZ1lpaGhZR0lBQVVZR05BQUFET0FBZzNqYVRZdzliOEl3RUlhZmlBU0pNTENnRGgyS2g4NFJCRmk3TURDeE1yRUFkbEVHMjhnSmtaQ3FqdjNkdmJnZWVwSlB6L3R4QmtxK3lSZ21ZeGIzTURtRnFEOHVtREpQUEJhMVNGenl5anNqc253aXpoc2ZpWE5KVG9rTFh2aE1QQmIvSzNISmhwK2R0L2RIWjRJNmVHMkN1MXJiYkk4bXRJMTNhbFV0bzk0Ylo4SzVNMXBkbmtyM1RkdmZyRnBYZFZXencyTzU4NkRERUZBY3hOR1JIVmZKTEExYmp0RnBoYjM0aWhVVnkzLzVYbklYTytmNGs1Yk9oYWRzVFMrTlZ2Wk51b3ExWE5iRCt3WElteS94QUFCNDJtTmdac0FMQUFCOUFBUT0pIGZvcm1hdCgnd29mZicpO30KQGZvbnQtZmFjZXtmb250LWZhbWlseTpjbXI1O3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjtiYXNlNjQsZDA5R1JnQUJBQUFBQUFoZ0FBb0FBQUFBQ2hRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJQVXk4eUFBQUE5QUFBQUVRQUFBQmdoVU4wNW1OdFlYQUFBQUU0QUFBQU9RQUFBRVFBUUFETVoyeDVaZ0FBQVhRQUFBVnJBQUFHdE1EVXdGcG9aV0ZrQUFBRzRBQUFBQzRBQUFBMkt0TDBtV2hvWldFQUFBY1FBQUFBSHdBQUFDUUcrZ05QYUcxMGVBQUFCekFBQUFBa0FBQUFKQkFlQXZKc2IyTmhBQUFIVkFBQUFCd0FBQUFjQ1JBSzFtMWhlSEFBQUFkd0FBQUFHQUFBQUNBQUVRQkJibUZ0WlFBQUI0Z0FBQURKQUFBQk11c0lrZWh3YjNOMEFBQUlWQUFBQUF3QUFBQWdBQU1BQUhqYVkyQm1Pc2s0Z1lHVmdZRnBGdFBaZnlJTS9TQ2E4UTNqR3daalJrNEdJR0JqZ0FOR0JpU1FVbHlXRHBUVVlMQmdadmdQNURORHBKSFUvQWNLQXdEcUFRMFplTnBqWUdCZ1ltQmdZQVppRVNESkNLWlpHQXlBTkFjUWd1UTBHYlFaTFA3L0I3STBnQ3lELy8vLzMveC80LzhWc0Zvd0FBRFdhZ3NHQUFBQWVObzlWRXRzRzFVVW5mdmVmT3p4cng3Yk00N2ozOHpZTTBuOFNlUGZ4QW1PNnpZTmFlcWtqdE0wVGF3b2hIeWFSQlJLcXlxbExXcG82YUtxa0twS29GTGFTbXhvMWJKZ0FTb0xZRlVWc1dBQlpjVVdDUXBiaElSQU9MeVpCT1pKbHUvMStKMTd6N25uVWtEZDNxYmdhMHhSVVlvQ04zQ3NKRnJIenlwNkZuUk5MeGxEWUpSeVlvQ0ZKODJyREZac2ZPYWNEZGhRVFI2TFYyaTZFaCtUYXlFVzBDK2xQNzZZZnlNb25WK2hlWm92Uk9ZcXB4NDhlTDB5R3lud3RKMGlEMUJMQk9zR3dlb2tBY3VaYUZvdkZDd0FRZE0xOGtXS2dpVENqZDFiTVdMMEdhMElxMmM0akhjQWdkcTVFeGlialk0c0hic01vYi9uSFE0R0xFQ0NzYng5REQ5R0QwMk1wRmRrRmMzd3lxeFdLRW15VnlOdGNGNjVKUHBaSGFYQTNtMkg5bTFISk9LQVZTdUFaV2M0N1B5cGZjY1ppVGhoR2ZndTNzeVJvSDNIQ2lnS1VVZTJmMFhyMXYxOXBBdlI2b0xUTEs0TXpXckZFSGU2RUV0R3FXcFNTSTdaYllBbGVYUUM4VnhDTFYrOFdGWVRISTlJbEZUTEZ5NlUxU1RIdDM5WDVpVUhJZyt2bkUyMEFrNEcrOFFGR05YSFU3T0pJWVlaU3N5bXhuV3RubWtsOXRIMHZrUXJVMi9mUmVsRHZlVlhWNDN1azRCU1ErbTE4cVhwdytrZHZtK1NnZzMweU5MV3k0cURFTkIwbGVXSytWeEo5N3BCVjR0NXNRcWtUQkZ1MGNwRVBqM3czVUE2UHlIajdGR2ZJQWhEWExVY2RLUHIvM3dyK1RNWUFHZjhFcUlFSjJRUWovZ3MyRTJNZVlMUklueWtDTitjWEN4VUVlR0FzS0d3SEdIQkRTcXI2U1NURXlXVEtROGtyWUZDTGFXZHdQYS9LdU9BMXNZTFRURW9BMmdCZHhxaHR6ZE9mWURSMm1odmNSMVFEKy95b0tkUFl3eXkvOUMzVWExUFFZK0tZcDN4Q0hUbzR5dG9mYW14bm8zckV3QzBveVpZUFRlSlBxdWtua0VTcUtid2VZSkg1RkUxczZEQWZ3V1pDdTFXeUNsbWdoUklFbUlNUkNOWEttalFISGE3WGZZWGpnd0RqSlI5Szhsd0FPVGduaTZFdHA1Y1JXaDRibllGNE1hbFY5N0ZrTXduQURxaWVsa3lIQ1BUUjJFSzJDQ0xiYXQ5QlFPOENxTUs0UmlFRWdmck1Ma3YrM0xjdjFpYjJLVHJEVG11Ukh4SlZyWFRIRXplbWFMTTJhcVJqM1BvTXlwTXhRaWJhc0NTckJjOFlDbFdsSXN3Qkhsemh2TVlaSFJ1QzNmV0VsT3QxcFJhQytQMkl6aHZjN2o5ZHRqNnNmME1NdmNiUVdGSE5DSFl5TUQzUE9NVTJoVTQwMzVuWnpibUNVK21ibFdLOGdWSytSMG1pRzdFZzhUc2ZwT2J2R2hxcFpmTTRWWTh3S3FtbVRTRGJJY2NHV3hUVWN6cDJqZTFoWk5YRUw1NzlzUVdBczNYRVEvRk9sNHFDSWNTWVMvZ09GOU1ydzA0c00zTkF2WjZtak9GMmNnZXpBTSttQm9yZGtWUTRmTWN2ankzZUJuajlRazFCUEVPbjRxemFSQ1U2TGhjTDNrMU9PQkVnZ3Z5bllnT2c4QXpyTVBYUjZ5RmtNVlhjL3U1NWNVZXFrSzZzQ3FYUkU3Y1hTMWtkWmtuQ2lUVUZUSUpaQ3pOWDl6Z00vc3FtS1pWTFZ1U2YzMGx0ekw3cCtRNmh0amVqdW5EcDI5aGVzYmhYcmpVT2dSSTg0aXhpQ3ZZdjJkMFVRcTVQcHpTZ3p3dlNZWSsyY1FPTGhpSGhyRVh0T2pCbG42c1cwd0QzSC84M29MTE1ZM1FpMmxWZ21pdUF3czhvT0ZVZnFOOWo2eXAvVFBEblRFSnIxYzdCelExdDdzWG42UHI2Rk5LSllGWllZQzBRT3JYTEtzd3hMSEVONnFSajZJWTVBTWkydm80V3dRazZKNGt3b1hqc2NOeSs1bXoyK2F5OFNrOUJUYTUvOEtmZ0ZhL3pIMXl6ZS9zbzBIcTdudTZtV3hvZ0xCRDJmdXp6Y1VTTGhtQ2kvLzNTb2pxcGd4em01SHB0d3pSQ3laNzFqUVlsakdTVXM0aU13dkUxNndva1lMTUNjbFpMOEZqbzU4dDBmajkxNWFPTUJNMC9WSHFPTVpYRm85Zlk2RGEvdTBlMCtWeGQ5RjQrYTBsREtHNXpsNS9oc2FiTnpkcE5CQ0IwMktLeVRSYUc5RERwT2ZlclBqSFJpWVdvTjVJTjBZbkpic3ozajg0bU8zekpSL3lNYTkyWUdSa29OTGQ2L2tYS3hJZjZBQjQybU5nWkdCZ0FPSTFPMDdVeHZQYmZHVmdabUVBZ1NkTUVlY1E5SDhHNXUzTUlDNEhBeE9JQWdBMi9Bb3dBQUI0Mm1OZ1pHQmdadmpQd01EQUlzUGd5S0RMdkowQktJSUNXQUU1SEFKU0FBTlNBQUFDS2dDYUFpb0FZd1FjQUdRQ3VBQlBBSklBWFFCU0FFRUFYUUJTQUdNQVVnQUFBQUFBTmdCb0FKZ0E3Z0VnQVdnQnhnSDhBbDRDd2dMK0ExcDQybU5nWkdCZzRHVndZR0JtQUFGR0JqUUFBQWcwQUZONDJqMk1NUXZDTUJDRnYySVZyWU9ENE9BZ3dSOVF0T3JtNXVEazZ1Qm1UWkFPVFNXdFJSZnhwM3NOd1FzNXZudnYzUUVKSHlLNmlwajQzbFVzYnhLNHo1aHA0SUhvaThBSmM1YjBpT0tSS0F2MmdXT0dYQUwzbVpFSEhvaitDcHl3NVh1b3lzZXpNVTZkS20yY3ZaVnVkemF1TGlxcjF1bXFHNC9HR25kdGpGYjVXK20ycU50N3FUWnBsbVljcUNoNThLVEI0RkNjUk5HZUxUZnhIRHZPZnE0cHhMT1NXWk95K3J0SGNhMVBYUDBWTFltY3QzUk5LenUxOUx0a0ZSdlp5N3IvQTFXNExrVUFBQUI0Mm1OZ1pzQUxBQUI5QUFRPSkgZm9ybWF0KCd3b2ZmJyk7fQp0ZXh0LmYwIHtmb250LWZhbWlseTpjbXN5NTtmb250LXNpemU6NC45ODEzMnB4fQp0ZXh0LmYxIHtmb250LWZhbWlseTpjbW1pNTtmb250LXNpemU6NC45ODEzMnB4fQp0ZXh0LmYyIHtmb250LWZhbWlseTpjbXI1O2ZvbnQtc2l6ZTo0Ljk4MTMycHh9Cl1dPgo8L3N0eWxlPgo8ZyBpZD0ncGFnZTEnPgo8ZyBzdHJva2UtbWl0ZXJsaW1pdD0nMTAnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0xNi41NDk0MzYsMjUxLjE3NDkpc2NhbGUoMC45OTYyNjQsLTAuOTk2MjY0KSc+CjxnIGZpbGw9JyMwMDAnIHN0cm9rZT0nIzAwMCc+CjxnIHN0cm9rZS13aWR0aD0nMC40Jz4KPGcgdHJhbnNmb3JtPSdtYXRyaXgoMi4wLDAuMCwwLjAsMi4wLDAuMCwwLjApJz4KPGcgc3Ryb2tlPSdub25lJyB0cmFuc2Zvcm09J3NjYWxlKC0xLjAwMzc1LDEuMDAzNzUpdHJhbnNsYXRlKC0xNi41NDk0MzYsMjUxLjE3NDkpc2NhbGUoLTEsLTEpJy8+CjwvZz4KPGcgdHJhbnNmb3JtPSdtYXRyaXgoMi4wLDAuMCwwLjAsMi4wLC01NS42NTg1MSwtNDMuOTA4MiknPgo8ZyBzdHJva2U9J25vbmUnIHRyYW5zZm9ybT0nc2NhbGUoLTEuMDAzNzUsMS4wMDM3NSl0cmFuc2xhdGUoLTE2LjU0OTQzNiwyNTEuMTc0OSlzY2FsZSgtMSwtMSknPgo8ZyBzdHJva2U9JyMwMDAnIHN0cm9rZS1taXRlcmxpbWl0PScxMCcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMTEuMTc1ODQ5LDIyOS4zMDI4MTkpc2NhbGUoMC45OTYyNjQsLTAuOTk2MjY0KSc+CjxnIGZpbGw9JyMwMDAnIHN0cm9rZT0nIzAwMCc+CjxnIHN0cm9rZS13aWR0aD0nMC40Jz4KPGcgc3Ryb2tlLXdpZHRoPScwLjInPgo8ZyBmaWxsPScjODA4MDgwJyBzdHJva2U9JyM4MDgwODAnPgo8cGF0aCBkPSdNMCAwVjQuMjY3NjFNNDguNzQ4NzggMFY0LjI2NzYxTTk3LjQ5NzU2IDBWNC4yNjc2MU0xNDYuMjQ2MzQgMFY0LjI2NzYxJyBmaWxsPSdub25lJy8+CjwvZz4KPC9nPgo8ZyBzdHJva2Utd2lkdGg9JzAuMic+CjxnIGZpbGw9JyM4MDgwODAnIHN0cm9rZT0nIzgwODA4MCc+CjxwYXRoIGQ9J00wIDBINC4yNjc2NU0wIDM1Ljk5ODU0SDQuMjY3NjVNMCA3MS45OTcwN0g0LjI2NzY1TTAgMTA3Ljk5NTZINC4yNjc2NU0wIDE0My45OTQxNEg0LjI2NzY1JyBmaWxsPSdub25lJy8+CjwvZz4KPC9nPgo8cGF0aCBkPSdNMCAwVjE2MS45OTM0MUgxOTQuOTk1MTJWMEgwWicgZmlsbD0nbm9uZScvPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMS43MDE0MiwtNi43NTUxNyknPgo8ZyBzdHJva2U9J25vbmUnIHRyYW5zZm9ybT0nc2NhbGUoLTEuMDAzNzUsMS4wMDM3NSl0cmFuc2xhdGUoMTEuMTc1ODQ5LDIyOS4zMDI4MTkpc2NhbGUoLTEsLTEpJz4KPGcgZmlsbD0nIzAwMCc+CjxnIHN0cm9rZT0nbm9uZSc+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTEuMTc1ODQ5JyB5PScyMjkuMzAyODE5Jz4wPC90ZXh0Pgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDQzLjY0NDUzLC02Ljc1NTE3KSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YyJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPjEwMDwvdGV4dD4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSg5Mi4zOTMzMSwtNi43NTUxNyknPgo8ZyBzdHJva2U9J25vbmUnIHRyYW5zZm9ybT0nc2NhbGUoLTEuMDAzNzUsMS4wMDM3NSl0cmFuc2xhdGUoMTEuMTc1ODQ5LDIyOS4zMDI4MTkpc2NhbGUoLTEsLTEpJz4KPGcgZmlsbD0nIzAwMCc+CjxnIHN0cm9rZT0nbm9uZSc+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTEuMTc1ODQ5JyB5PScyMjkuMzAyODE5Jz4yMDA8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPGcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMTQxLjE0MjA5LC02Ljc1NTE3KSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YyJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPjMwMDwvdGV4dD4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtNi45MzU4LC0xLjYxMTEpJz4KPGcgc3Ryb2tlPSdub25lJyB0cmFuc2Zvcm09J3NjYWxlKC0xLjAwMzc1LDEuMDAzNzUpdHJhbnNsYXRlKDExLjE3NTg0OSwyMjkuMzAyODE5KXNjYWxlKC0xLC0xKSc+CjxnIGZpbGw9JyMwMDAnPgo8ZyBzdHJva2U9J25vbmUnPgo8dGV4dCBjbGFzcz0nZjInIHg9JzExLjE3NTg0OScgeT0nMjI5LjMwMjgxOSc+MDwvdGV4dD4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMTIuNjMwMzMsMzQuMzg3NDQpJz4KPGcgc3Ryb2tlPSdub25lJyB0cmFuc2Zvcm09J3NjYWxlKC0xLjAwMzc1LDEuMDAzNzUpdHJhbnNsYXRlKDExLjE3NTg0OSwyMjkuMzAyODE5KXNjYWxlKC0xLC0xKSc+CjxnIGZpbGw9JyMwMDAnPgo8ZyBzdHJva2U9J25vbmUnPgo8dGV4dCBjbGFzcz0nZjInIHg9JzExLjE3NTg0OScgeT0nMjI5LjMwMjgxOSc+MDwvdGV4dD4KPHRleHQgY2xhc3M9J2YxJyB4PScxNC41NjU5NycgeT0nMjI5LjMwMjgxOSc+LjwvdGV4dD4KPHRleHQgY2xhc3M9J2YyJyB4PScxNi44NDkwOTcnIHk9JzIyOS4zMDI4MTknPjI8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPGcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoLTEyLjYzMDMzLDcwLjM4NTk3KSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YyJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPjA8L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMScgeD0nMTQuNTY1OTcnIHk9JzIyOS4zMDI4MTknPi48L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTYuODQ5MDk3JyB5PScyMjkuMzAyODE5Jz40PC90ZXh0Pgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0xMi42MzAzMywxMDYuMzg0NSknPgo8ZyBzdHJva2U9J25vbmUnIHRyYW5zZm9ybT0nc2NhbGUoLTEuMDAzNzUsMS4wMDM3NSl0cmFuc2xhdGUoMTEuMTc1ODQ5LDIyOS4zMDI4MTkpc2NhbGUoLTEsLTEpJz4KPGcgZmlsbD0nIzAwMCc+CjxnIHN0cm9rZT0nbm9uZSc+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTEuMTc1ODQ5JyB5PScyMjkuMzAyODE5Jz4wPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjEnIHg9JzE0LjU2NTk3JyB5PScyMjkuMzAyODE5Jz4uPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjInIHg9JzE2Ljg0OTA5NycgeT0nMjI5LjMwMjgxOSc+NjwvdGV4dD4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMTIuNjMwMzMsMTQyLjM4MzA0KSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YyJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPjA8L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMScgeD0nMTQuNTY1OTcnIHk9JzIyOS4zMDI4MTknPi48L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTYuODQ5MDk3JyB5PScyMjkuMzAyODE5Jz44PC90ZXh0Pgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxjbGlwUGF0aCBpZD0ncGdmY3AxJz4KPHBhdGggZD0nTTAgMEgxOTQuOTk1MTJWMTYxLjk5MzQxSDBaJy8+IDwvY2xpcFBhdGg+CjxnIGNsaXAtcGF0aD0ndXJsKCNwZ2ZjcDEpJz4KPGcgZmlsbD0nIzAwMCcgc3Ryb2tlPScjMDAwJz4KPHBhdGggZD0nTTAgOC45OTk2OEwuNTM0MjQgOC45OTk3SDEuMDY4NDhMMS42MDI3NCA4Ljk5OTcxTDIuMTM2OTggOC45OTk3M0wyLjY3MTIzIDguOTk5NzRMMy4yMDU0NyA4Ljk5OTc2TDMuNzM5NzIgOC45OTk3N0w0LjI3Mzk3IDguOTk5NzlMNC44MDgyMyA4Ljk5OTgyTDUuMzQyNDcgOC45OTk4NUw1Ljg3NjcxIDguOTk5ODhMNi40MTA5NiA4Ljk5OTkxTDYuOTQ1MiA4Ljk5OTk1TDcuNDc5NDYgOUw4LjAxMzcgOS4wMDAwNUw4LjU0Nzk2IDkuMDAwMUw5LjA4MjIgOS4wMDAxOEw5LjYxNjQ2IDkuMDAwMjZMMTAuMTUwNyA5LjAwMDM1TDEwLjY4NDk0IDkuMDAwNDZMMTEuMjE5MiA5LjAwMDU4TDExLjc1MzQzIDkuMDAwNzJMMTIuMjg3NjkgOS4wMDA4N0wxMi44MjE5MyA5LjAwMTA1TDEzLjM1NjE5IDkuMDAxMjdMMTMuODkwNDMgOS4wMDE1MUwxNC40MjQ2NyA5LjAwMTc3TDE0Ljk1ODkyIDkuMDAyMDlMMTUuNDkzMTggOS4wMDI0NkwxNi4wMjc0MiA5LjAwMjg1TDE2LjU2MTY2IDkuMDAzMzNMMTcuMDk1OTIgOS4wMDM4NkwxNy42MzAxNiA5LjAwNDQ5TDE4LjE2NDQxIDkuMDA1MTlMMTguNjk4NjUgOS4wMDZMMTkuMjMyOSA5LjAwNjkzTDE5Ljc2NzE1IDkuMDA4TDIwLjMwMTQgOS4wMDkyTDIwLjgzNTY1IDkuMDEwNTlMMjEuMzY5ODkgOS4wMTIxOUwyMS45MDQxNCA5LjAxNEwyMi40MzgzOSA5LjAxNjExTDIyLjk3MjY0IDkuMDE4NTFMMjMuNTA2ODggOS4wMjEyNkwyNC4wNDExNCA5LjAyNDM4TDI0LjU3NTM4IDkuMDI3OThMMjUuMTA5NjIgOS4wMzIxMkwyNS42NDM4OCA5LjAzNjgzTDI2LjE3ODEyIDkuMDQyMjRMMjYuNzEyMzcgOS4wNDg0M0wyNy4yNDY2MSA5LjA1NTUzTDI3Ljc4MDg1IDkuMDYzNjRMMjguMzE1MTEgOS4wNzI5NUwyOC44NDkzNyA5LjA4MzU5TDI5LjM4MzYgOS4wOTU4TDI5LjkxNzg1IDkuMTA5NzRMMzAuNDUyMSA5LjEyNTc1TDMwLjk4NjM2IDkuMTQ0MDdMMzEuNTIwNiA5LjE2NTAxTDMyLjA1NDg0IDkuMTg5MDZMMzIuNTg5MSA5LjIxNjU0TDMzLjEyMzM0IDkuMjQ4MDJMMzMuNjU3NiA5LjI4NDA0TDM0LjE5MTgzIDkuMzI1MjlMMzQuNzI2MDcgOS4zNzI1MUwzNS4yNjAzMyA5LjQyNjU2TDM1Ljc5NDU3IDkuNDg4NDhMMzYuMzI4ODMgOS41NTkxNkwzNi44NjMwNyA5LjY0MDE4TDM3LjM5NzMyIDkuNzMyODZMMzcuOTMxNTYgOS44Mzg4OEwzOC40NjU4IDkuOTYwMDRMMzkuMDAwMDYgMTAuMDk4NjNMMzkuNTM0MzIgMTAuMjU3MDhMNDAuMDY4NTYgMTAuNDM4M0w0MC42MDI4IDEwLjY0NTI4TDQxLjEzNzA1IDEwLjg4MTE2TDQxLjY3MTMgMTEuMTUxMTRMNDIuMjA1NTUgMTEuNDU5MTdMNDIuNzM5NzkgMTEuODEwMjdMNDMuMjc0MDUgMTIuMjEwMjhMNDMuODA4MjkgMTIuNjY2TDQ0LjM0MjU0IDEzLjE4NDk1TDQ0Ljg3Njc5IDEzLjc3NTEyTDQ1LjQxMTAzIDE0LjQ0NTQ1TDQ1Ljk0NTI4IDE1LjIwNTQzTDQ2LjQ3OTUyIDE2LjA2NzExTDQ3LjAxMzc4IDE3LjA0MjExTDQ3LjU0ODAyIDE4LjE0MzE5TDQ4LjA4MjI4IDE5LjM4Mzc0TDQ4LjYxNjUyIDIwLjc4MDJMNDkuMTUwNzYgMjIuMzQ3NzVMNDkuNjg1MDEgMjQuMTAzNzRMNTAuMjE5MjUgMjYuMDYwNDdMNTAuNzUzNSAyOC4yMzM1TDUxLjI4Nzc1IDMwLjY0NTdMNTEuODIxOTkgMzMuMzA1NTZMNTIuMzU2MjMgMzYuMjI0N0w1Mi44OTA0OSAzOS40MTE2Mkw1My40MjQ3MyA0Mi44NzQ2TDUzLjk1ODk3IDQ2LjYxNDE0TDU0LjQ5MzIzIDUwLjYyMjY4TDU1LjAyNzQ3IDU0Ljg4OTYzTDU1LjU2MTcgNTkuNDA0NDJMNTYuMDk1OTYgNjQuMTI5ODJMNTYuNjMwMiA2OS4wNDc2N0w1Ny4xNjQ0NiA3NC4xMTAwNkw1Ny42OTg3IDc5LjI4MDMyTDU4LjIzMjk0IDg0LjUxMUw1OC43NjcyIDg5Ljc0MjU0TDU5LjMwMTQ0IDk0Ljk0MjFMNTkuODM1NjggMTAwLjA1MDU4TDYwLjM2OTkzIDEwNS4wMzI1Nkw2MC45MDQxNyAxMDkuODMyNTdMNjEuNDM4NDIgMTE0LjQyMzQ4TDYxLjk3MjY3IDExOC43NzM1M0w2Mi41MDY5MSAxMjIuODU1OUw2My4wNDExNSAxMjYuNjc0NjhMNjMuNTc1NDEgMTMwLjE5NzA3TDY0LjEwOTY1IDEzMy40MzE5OUw2NC42NDM4OSAxMzYuMzg2NzJMNjUuMTc4MTUgMTM5LjA1MzE5TDY1LjcxMjM5IDE0MS40NzU1NEw2Ni4yNDY2MyAxNDMuNjI1NjZMNjYuNzgwODggMTQ1LjU0NzUyTDY3LjMxNTEyIDE0Ny4yNDUwN0w2Ny44NDkzOCAxNDguNzMxNDZMNjguMzgzNjIgMTUwLjAzNjVMNjguOTE3ODYgMTUxLjE3MTU0TDY5LjQ1MjEyIDE1Mi4xNTI1MUw2OS45ODYzNiAxNTIuOTk1MThMNzAuNTIwNiAxNTMuNzE4MzRMNzEuMDU0ODYgMTU0LjMyMzk5TDcxLjU4OTEgMTU0LjgzMzdMNzIuMTIzMzQgMTU1LjI1MjQ0TDcyLjY1NzYgMTU1LjU5NTY0TDczLjE5MTgzIDE1NS44NzI2M0w3My43MjYwNyAxNTYuMDgzN0w3NC4yNjAzMyAxNTYuMjQxMDZMNzQuNzk0NTcgMTU2LjM1NTQ4TDc1LjMyODgxIDE1Ni40MzAxMUw3NS44NjMwNyAxNTYuNDYyMTdMNzYuMzk3MzEgMTU2LjQ2NTE4TDc2LjkzMTU1IDE1Ni40Mzc3N0w3Ny40NjU4IDE1Ni4zOTJMNzguMDAwMDUgMTU2LjMyMjA1TDc4LjUzNDI5IDE1Ni4yMzA5M0w3OS4wNjg1NCAxNTYuMTIzMTdMNzkuNjAyNzggMTU2LjAwMzIzTDgwLjEzNzA0IDE1NS44NzI3Nkw4MC42NzEyOCAxNTUuNzI4NzZMODEuMjA1NTIgMTU1LjU3NTc0TDgxLjczOTc4IDE1NS40MTIyOEw4Mi4yNzQwMiAxNTUuMjQ4NTdMODIuODA4MjYgMTU1LjA3MDE0TDgzLjM0MjUxIDE1NC44OTMwNUw4My44NzY3NSAxNTQuNzA3MUw4NC40MTEgMTU0LjUxOTU5TDg0Ljk0NTI1IDE1NC4zMjYxNEw4NS40Nzk0OSAxNTQuMTMxMkw4Ni4wMTM3MyAxNTMuOTM0NzRMODYuNTQ3OTkgMTUzLjczMUw4Ny4wODIyMyAxNTMuNTI3MThMODcuNjE2NDcgMTUzLjMyNjIyTDg4LjE1MDczIDE1My4xMTUxM0w4OC42ODQ5NyAxNTIuOTA5NzlMODkuMjE5MjEgMTUyLjY5ODY1TDg5Ljc1MzQ2IDE1Mi40ODYwNUw5MC4yODc3IDE1Mi4yNzYzTDkwLjgyMTk1IDE1Mi4wNjhMOTEuMzU2MiAxNTEuODU4Mkw5MS44OTA0NCAxNTEuNjQ1NTRMOTIuNDI0NyAxNTEuNDI4Nkw5Mi45NTg5NCAxNTEuMjE1OTNMOTMuNDkzMTggMTUxLjAwMDRMOTQuMDI3NDQgMTUwLjc4OTEyTDk0LjU2MTY4IDE1MC41NzM1OEw5NS4wOTU5MiAxNTAuMzU2Nkw5NS42MzAxNyAxNTAuMTQxMDRMOTYuMTY0NDEgMTQ5LjkyNDA5TDk2LjY5ODY1IDE0OS43MDcwOUw5Ny4yMzI5MSAxNDkuNDkyOTRMOTcuNzY3MTUgMTQ5LjI3NTk5TDk4LjMwMTM5IDE0OS4wNjA0TDk4LjgzNTY1IDE0OC44NDM0TDk5LjM2OTg5IDE0OC42MjY0Mkw5OS45MDQxMyAxNDguNDA5NDRMMTAwLjQzODM5IDE0OC4xOTUyNEwxMDAuOTcyNjMgMTQ3Ljk3ODIzTDEwMS41MDY4NyAxNDcuNzYxMjJMMTAyLjA0MTEyIDE0Ny41NDQyTDEwMi41NzUzNiAxNDcuMzI3MkwxMDMuMTA5NiAxNDcuMTEwMThMMTAzLjY0Mzg2IDE0Ni44OTMxNEwxMDQuMTc4MSAxNDYuNjc2MDlMMTA0LjcxMjM2IDE0Ni40NTkwM0wxMDUuMjQ2NiAxNDYuMjQ2MUwxMDUuNzgwODQgMTQ2LjAyODk5TDEwNi4zMTUxIDE0NS44MTE4NEwxMDYuODQ5MzMgMTQ1LjU5NDY4TDEwNy4zODM1OCAxNDUuMzc3NTNMMTA3LjkxNzgzIDE0NS4xNjAzMUwxMDguNDUyMDcgMTQ0Ljk0MzA1TDEwOC45ODYzMSAxNDQuNzI1NjhMMTA5LjUyMDU3IDE0NC41MDgyN0wxMTAuMDU0ODEgMTQ0LjI5MDgyTDExMC41ODkwNSAxNDQuMDczMjNMMTExLjEyMzMgMTQzLjg1NTU1TDExMS42NTc1NSAxNDMuNjM3NjZMMTEyLjE5MTc5IDE0My40MTk2NUwxMTIuNzI2MDQgMTQzLjIwMTQ1TDExMy4yNjAyOCAxNDIuOTgyOTdMMTEzLjc5NDUzIDE0Mi43NjQxOUwxMTQuMzI4NzggMTQyLjU0NTA3TDExNC44NjMwMiAxNDIuMzI1NTNMMTE1LjM5NzI4IDE0Mi4xMDU1TDExNS45MzE1MiAxNDEuODg0ODRMMTE2LjQ2NTc2IDE0MS42NjM0NUwxMTcuMDAwMDIgMTQxLjQ0MTE4TDExNy41MzQyNiAxNDEuMjE3ODhMMTE4LjA2ODUgMTQwLjk5MzM1TDExOC42MDI3NSAxNDAuNzY3MjZMMTE5LjEzNyAxNDAuNTM5NDFMMTE5LjY3MTIzIDE0MC4zMDkzN0wxMjAuMjA1NDkgMTQwLjA3Njc4TDEyMC43Mzk3MyAxMzkuODQxMTNMMTIxLjI3Mzk3IDEzOS42MDE2OEwxMjEuODA4MjMgMTM5LjM1NzlMMTIyLjM0MjQ3IDEzOS4xMDg3NUwxMjIuODc2NzEgMTM4Ljg1MzI2TDEyMy40MTA5NiAxMzguNTkwMTJMMTIzLjk0NTIgMTM4LjMxNzkyTDEyNC40Nzk0NSAxMzguMDM0NzdMMTI1LjAxMzcgMTM3LjczODY2TDEyNS41NDc5NCAxMzcuNDI2OTdMMTI2LjA4MjE4IDEzNy4wOTY2M0wxMjYuNjE2NDQgMTM2Ljc0NDE2TDEyNy4xNTA2OCAxMzYuMzY1MTNMMTI3LjY4NDk0IDEzNS45NTQ1NkwxMjguMjE5MTggMTM1LjUwNjI2TDEyOC43NTM0MiAxMzUuMDEzNDFMMTI5LjI4NzY3IDEzNC40NjY5NkwxMjkuODIxOTEgMTMzLjg1NzYyTDEzMC4zNTYxNiAxMzMuMTc0MTVMMTMwLjg5MDQxIDEzMi40MDIzNEwxMzEuNDI0NjUgMTMxLjUyNzYzTDEzMS45NTg5IDEzMC41MzE3NEwxMzIuNDkzMTUgMTI5LjM5NDA2TDEzMy4wMjczOSAxMjguMDkyMzVMMTMzLjU2MTYzIDEyNi42MDIwOEwxMzQuMDk1ODkgMTI0Ljg5NDhMMTM0LjYzMDEzIDEyMi45NDI2M0wxMzUuMTY0MzcgMTIwLjcxMjg5TDEzNS42OTg2MiAxMTguMTc4ODZMMTM2LjIzMjg2IDExNS4zMDg5MUwxMzYuNzY3MSAxMTIuMDg2MkwxMzcuMzAxMzYgMTA4LjQ4NTIzTDEzNy44MzU2IDEwNC41MDA2MUwxMzguMzY5ODQgMTAwLjEzNDM4TDEzOC45MDQxIDk1LjQwNDc3TDEzOS40MzgzNCA5MC4zNDk0OUwxMzkuOTcyNiA4NS4wMTgzOUwxNDAuNTA2ODQgNzkuNDgwNkwxNDEuMDQxMDggNzMuODE1ODZMMTQxLjU3NTMzIDY4LjExOTI4TDE0Mi4xMDk1NyA2Mi40NzMwNUwxNDIuNjQzODEgNTYuOTY0ODdMMTQzLjE3ODA3IDUxLjY4OTE2TDE0My43MTIzMSA0Ni43MDQzOEwxNDQuMjQ2NTUgNDIuMDY0OTFMMTQ0Ljc4MDggMzcuODA1MzdMMTQ1LjMxNTA1IDMzLjkzODI4TDE0NS44NDkyOSAzMC40NzczN0wxNDYuMzgzNTQgMjcuNDA5NjJMMTQ2LjkxNzc5IDI0LjcwNDFMMTQ3LjQ1MjAzIDIyLjM0OTM1TDE0Ny45ODYyOCAyMC4zMDUxMUwxNDguNTIwNTIgMTguNTU2NkwxNDkuMDU0NzYgMTcuMDU1NjNMMTQ5LjU4OTAyIDE1Ljc3NDdMMTUwLjEyMzI2IDE0LjY4ODgxTDE1MC42NTc1IDEzLjc2OTU5TDE1MS4xOTE3NiAxMi45OTEyNkwxNTEuNzI2IDEyLjMzNTNMMTUyLjI2MDI1IDExLjc4ODAyTDE1Mi43OTQ1IDExLjMzMDA1TDE1My4zMjg3NCAxMC45NDJMMTUzLjg2Mjk5IDEwLjYyMTE1TDE1NC4zOTcyMyAxMC4zNTA3NUwxNTQuOTMxNDcgMTAuMTIzNDdMMTU1LjQ2NTczIDkuOTM0NDNMMTU1Ljk5OTk3IDkuNzc4NzNMMTU2LjUzNDIxIDkuNjQ4MDdMMTU3LjA2ODQ3IDkuNTM5OTZMMTU3LjYwMjcgOS40NDk2M0wxNTguMTM2OTUgOS4zNzM1N0wxNTguNjcxMiA5LjMxMDQ3TDE1OS4yMDU0NCA5LjI1Nzk4TDE1OS43Mzk2OSA5LjIxNzIxTDE2MC4yNzM5NCA5LjE3ODg2TDE2MC44MDgxOCA5LjE0ODcxTDE2MS4zNDI0MiA5LjEyNTUzTDE2MS44NzY2OCA5LjEwMjQ2TDE2Mi40MTA5MiA5LjA4NjI5TDE2Mi45NDUxNiA5LjA3MjQ4TDE2My40Nzk0MiA5LjA1OTg0TDE2NC4wMTM2NiA5LjA0OTUxTDE2NC41NDc5MSA5LjA0MjYzTDE2NS4wODIxNSA5LjAzODA0TDE2NS42MTY0IDkuMDI4OTNMMTY2LjE1MDY1IDkuMDIzMjdMMTY2LjY4NDg5IDkuMDE5ODRMMTY3LjIxOTEzIDkuMDE2NDNMMTY3Ljc1MzM5IDkuMDE1MjlMMTY4LjI4NzYzIDkuMDEwOEwxNjguODIxODcgOS4wMDk2NkwxNjkuMzU2MTIgOS4wMDg1M0wxNjkuODkwMzcgOS4wMDg1MUwxNzAuNDI0NiA5LjAwNjI5TDE3MC45NTg4NiA5LjAwNjI3TDE3MS40OTMxIDkuMDA1MTRMMTcyLjAyNzM0IDkuMDA1MTNIMTcyLjU2MTZMMTczLjA5NTg0IDkuMDAyOTFIMTczLjYzMDA4TDE3NC4xNjQzNCA5LjAwMjlIMTc0LjY5ODU4SDE3NS4yMzI4M0wxNzUuNzY3MDcgOS4wMDI4OEwxNzYuMzAxMzIgOC45OTk2M0gxNzYuODM1NTdIMTc3LjM2OTgxSDE3Ny45MDQwNUgxNzguNDM4MzFIMTc4Ljk3MjU1SDE3OS41MDY3OUgxODAuMDQxMDVIMTgwLjU3NTI5SDE4MS4xMDk1M0gxODEuNjQzNzhIMTgyLjE3ODAySDE4Mi43MTIyN0gxODMuMjQ2NTJIMTgzLjc4MDc2SDE4NC4zMTVIMTg0Ljg0OTI2SDE4NS4zODM1SDE4NS45MTc3NEgxODYuNDUySDE4Ni45ODYyNEgxODcuNTIwNUgxODguMDU0NzNIMTg4LjU4ODk3SDE4OS4xMjMyM0gxODkuNjU3NDdIMTkwLjE5MTcxSDE5MC43MjU5N0gxOTEuMjYwMjFIMTkxLjc5NDQ1SDE5Mi4zMjg3SDE5Mi44NjI5NUgxOTMuMzk3MTlIMTkzLjkzMTQ0SDE5NC40NjU2OEgxOTQuOTk5OTInIGZpbGw9J25vbmUnLz4KPC9nPgo8ZyBzdHJva2UtZGFzaGFycmF5PSczLjAsMy4wJyBzdHJva2UtZGFzaG9mZnNldD0nMC4wJz4KPGcgc3Ryb2tlLWRhc2hhcnJheT0nMi4wLDIuMCcgc3Ryb2tlLWRhc2hvZmZzZXQ9JzAuMCc+CjxwYXRoIGQ9J00wIDguOTk5NjNIMTk0Ljk5NTEySDE3OC40MjA1MycgZmlsbD0nbm9uZScvPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSg5Mi40NzYwNywxNC4wMzI2MSknPgo8ZyBzdHJva2U9J25vbmUnIHRyYW5zZm9ybT0nc2NhbGUoLTEuMDAzNzUsMS4wMDM3NSl0cmFuc2xhdGUoMTEuMTc1ODQ5LDIyOS4zMDI4MTkpc2NhbGUoLTEsLTEpJz4KPGcgZmlsbD0nIzAwMCc+CjxnIHN0cm9rZT0nbm9uZSc+Cjx0ZXh0IGNsYXNzPSdmMScgeD0nMTEuMTc1ODQ5JyB5PScyMjkuMzAyODE5Jz5tPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjInIHg9JzE3LjI5MzA2JyB5PScyMzAuNzk3MjE1Jz4xPC90ZXh0Pgo8L2c+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8ZyBzdHJva2UtZGFzaGFycmF5PSczLjAsMy4wJyBzdHJva2UtZGFzaG9mZnNldD0nMC4wJz4KPGcgc3Ryb2tlLWRhc2hhcnJheT0nMi4wLDIuMCcgc3Ryb2tlLWRhc2hvZmZzZXQ9JzAuMCc+CjxwYXRoIGQ9J001OC40OTg1NCAwVjE3OS45OTI2OCcgZmlsbD0nbm9uZScvPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSg2Mi4wMzE1MSwxODMuNTI1NjUpJz4KPGcgc3Ryb2tlPSdub25lJyB0cmFuc2Zvcm09J3NjYWxlKC0xLjAwMzc1LDEuMDAzNzUpdHJhbnNsYXRlKDExLjE3NTg0OSwyMjkuMzAyODE5KXNjYWxlKC0xLC0xKSc+CjxnIGZpbGw9JyMwMDAnPgo8ZyBzdHJva2U9J25vbmUnLz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIHN0cm9rZS1kYXNoYXJyYXk9JzMuMCwzLjAnIHN0cm9rZS1kYXNob2Zmc2V0PScwLjAnPgo8ZyBzdHJva2UtZGFzaGFycmF5PScyLjAsMi4wJyBzdHJva2UtZGFzaG9mZnNldD0nMC4wJz4KPHBhdGggZD0nTTE0MS4zNzE0NiAwVjE3OS45OTI2OCcgZmlsbD0nbm9uZScvPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgxNDQuOTA0NDMsMTgzLjUyNTY1KSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJy8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8cGF0aCBkPSdNNTMuOTIzNjUgODAuOTk2N0g2My4wNzM0MycgZmlsbD0nbm9uZScvPgo8ZyB0cmFuc2Zvcm09J21hdHJpeCgtMS4wLDAuMCwwLjAsLTEuMCw1My44MjM2NSw4MC45OTY3KSc+CjxnIHN0cm9rZS1kYXNoYXJyYXk9J25vbmUnIHN0cm9rZS1kYXNob2Zmc2V0PScwLjAnPgogPGcgc3Ryb2tlLWxpbmVjYXA9J2J1dHQnPgogPGcgc3Ryb2tlLWxpbmVqb2luPSdtaXRlcic+CiA8cGF0aCBkPSdNMCAyLjI5OTk5Vi0yLjI5OTk5JyBmaWxsPSdub25lJy8+CiA8L2c+CiA8L2c+CiA8L2c+CjwvZz4KPGcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoNjMuMTczNDIsODAuOTk2NyknPgo8ZyBzdHJva2UtZGFzaGFycmF5PSdub25lJyBzdHJva2UtZGFzaG9mZnNldD0nMC4wJz4KIDxnIHN0cm9rZS1saW5lY2FwPSdidXR0Jz4KIDxnIHN0cm9rZS1saW5lam9pbj0nbWl0ZXInPgogPHBhdGggZD0nTTAgMi4yOTk5OVYtMi4yOTk5OScgZmlsbD0nbm9uZScvPgogPC9nPgogPC9nPgogPC9nPgo8L2c+CjxnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDM5Ljc5NzQ3LDgwLjY3MDMyKSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YxJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPm08L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTcuMjkzMDYnIHk9JzIzMC43OTcyMTUnPjQ8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPHBhdGggZD0nTTE0NS45NDYzNSA4MC45OTY3SDEzNi43OTY1NycgZmlsbD0nbm9uZScvPgo8ZyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgxNDYuMDQ2MzQsODAuOTk2NyknPgo8ZyBzdHJva2UtZGFzaGFycmF5PSdub25lJyBzdHJva2UtZGFzaG9mZnNldD0nMC4wJz4KIDxnIHN0cm9rZS1saW5lY2FwPSdidXR0Jz4KIDxnIHN0cm9rZS1saW5lam9pbj0nbWl0ZXInPgogPHBhdGggZD0nTTAgMi4yOTk5OVYtMi4yOTk5OScgZmlsbD0nbm9uZScvPgogPC9nPgogPC9nPgogPC9nPgo8L2c+CjxnIHRyYW5zZm9ybT0nbWF0cml4KC0xLjAsMC4wLDAuMCwtMS4wLDEzNi42OTY1OCw4MC45OTY3KSc+CjxnIHN0cm9rZS1kYXNoYXJyYXk9J25vbmUnIHN0cm9rZS1kYXNob2Zmc2V0PScwLjAnPgogPGcgc3Ryb2tlLWxpbmVjYXA9J2J1dHQnPgogPGcgc3Ryb2tlLWxpbmVqb2luPSdtaXRlcic+CiA8cGF0aCBkPSdNMCAyLjI5OTk5Vi0yLjI5OTk5JyBmaWxsPSdub25lJy8+CiA8L2c+CiA8L2c+CiA8L2c+CjwvZz4KPGcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMTUwLjAyOTU2LDgwLjY3MDMyKSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YxJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPm08L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTcuMjkzMDYnIHk9JzIzMC43OTcyMTUnPjY8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPHBhdGggZD0nTTE0MS4zNzE0NiAyNi45OTg5JyBmaWxsPSdub25lJy8+CjxnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDEyNy43OTU1MiwyNi42NzI1MiknPgo8ZyBzdHJva2U9J25vbmUnIHRyYW5zZm9ybT0nc2NhbGUoLTEuMDAzNzUsMS4wMDM3NSl0cmFuc2xhdGUoMTEuMTc1ODQ5LDIyOS4zMDI4MTkpc2NhbGUoLTEsLTEpJz4KPGcgZmlsbD0nIzAwMCc+CjxnIHN0cm9rZT0nbm9uZSc+Cjx0ZXh0IGNsYXNzPSdmMScgeD0nMTEuMTc1ODQ5JyB5PScyMjkuMzAyODE5Jz5tPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjInIHg9JzE3LjI5MzA2JyB5PScyMzAuNzk3MjE1Jz41PC90ZXh0Pgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxwYXRoIGQ9J001OC40OTg1NCAyNi45OTg5JyBmaWxsPSdub25lJy8+CjxnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDYyLjAzMTUxLDI2LjY3MjUyKSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YxJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPm08L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTcuMjkzMDYnIHk9JzIzMC43OTcyMTUnPjM8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPGcgc3Ryb2tlLWRhc2hhcnJheT0nMy4wLDMuMCcgc3Ryb2tlLWRhc2hvZmZzZXQ9JzAuMCc+CjxnIHN0cm9rZS1kYXNoYXJyYXk9JzIuMCwyLjAnIHN0cm9rZS1kYXNob2Zmc2V0PScwLjAnPgo8cGF0aCBkPSdNNjguMjQ4MjkgMTYxLjk5MzQxTDE5NC45OTUxMiAxMDcuOTk1NicgZmlsbD0nbm9uZScvPgo8ZyB0cmFuc2Zvcm09J21hdHJpeCgwLjkxOTk3LC0wLjM5MTkyLDAuMzkxOTIsMC45MTk5NywxMTkuNzczNSwxNDUuNTEyNTQpJz4KPGcgc3Ryb2tlPSdub25lJyB0cmFuc2Zvcm09J3NjYWxlKC0xLjAwMzc1LDEuMDAzNzUpdHJhbnNsYXRlKDExLjE3NTg0OSwyMjkuMzAyODE5KXNjYWxlKC0xLC0xKSc+CjxnIGZpbGw9JyMwMDAnPgo8ZyBzdHJva2U9J25vbmUnPgo8dGV4dCBjbGFzcz0nZjEnIHg9JzExLjE3NTg0OScgeT0nMjI5LjMwMjgxOSc+bTwvdGV4dD4KPHRleHQgY2xhc3M9J2YyJyB4PScxNy4yOTMwNicgeT0nMjMwLjc5NzIxNSc+MTx0c3BhbiB4PScyMi44MTEwMDMnIHk9JzIyOS4zMDI4MTknPis8L3RzcGFuPjwvdGV4dD4KPHRleHQgY2xhc3M9J2YxJyB4PScyOS41NjA0NzUnIHk9JzIyOS4zMDI4MTknPm08L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMzUuNjc3Njg2JyB5PScyMzAuNzk3MjE1Jz4yPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjAnIHg9JzQxLjE5NTYyOScgeT0nMjI5LjMwMjgxOSc+4oiSPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjEnIHg9JzQ4LjIyMTgzJyB5PScyMjkuMzAyODE5Jz5tPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjInIHg9JzU0LjMzOTA0MicgeT0nMjMwLjc5NzIxNSc+NzwvdGV4dD4KPHRleHQgY2xhc3M9J2YxJyB4PSc1OC4yMjcyOTMnIHk9JzIyOS4zMDI4MTknPnQ8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPGcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoODUuMDU3NzIsLTE3LjM3MTEyKSc+CjxnIHN0cm9rZT0nbm9uZScgdHJhbnNmb3JtPSdzY2FsZSgtMS4wMDM3NSwxLjAwMzc1KXRyYW5zbGF0ZSgxMS4xNzU4NDksMjI5LjMwMjgxOSlzY2FsZSgtMSwtMSknPgo8ZyBmaWxsPScjMDAwJz4KPGcgc3Ryb2tlPSdub25lJz4KPHRleHQgY2xhc3M9J2YxJyB4PScxMS4xNzU4NDknIHk9JzIyOS4zMDI4MTknPnQ8L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMicgeD0nMTMuOTgzNjQ2JyB5PScyMjkuMzAyODE5Jz4oPC90ZXh0Pgo8dGV4dCBjbGFzcz0nZjEnIHg9JzE2LjY4MTkwMScgeT0nMjI5LjMwMjgxOSc+RDx0c3BhbiB4PScyMi4zODM1MTMnPk88L3RzcGFuPjx0c3BhbiB4PScyNy43NzQ0NzYnPlk8L3RzcGFuPjwvdGV4dD4KPHRleHQgY2xhc3M9J2YyJyB4PSczMy4yNjQzODUnIHk9JzIyOS4zMDI4MTknPik8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPGcgdHJhbnNmb3JtPSdtYXRyaXgoMC4wLDEuMCwtMS4wLDAuMCwtMjAuNzQ2MjgsNjkuNzQxOTkpJz4KPGcgc3Ryb2tlPSdub25lJyB0cmFuc2Zvcm09J3NjYWxlKC0xLjAwMzc1LDEuMDAzNzUpdHJhbnNsYXRlKDExLjE3NTg0OSwyMjkuMzAyODE5KXNjYWxlKC0xLC0xKSc+CjxnIGZpbGw9JyMwMDAnPgo8ZyBzdHJva2U9J25vbmUnPgo8dGV4dCBjbGFzcz0nZjEnIHg9JzExLjE3NTg0OScgeT0nMjI5LjMwMjgxOSc+djwvdGV4dD4KPHRleHQgY2xhc3M9J2YyJyB4PScxNC45NTIyMjknIHk9JzIyOS4zMDI4MTknPig8L3RleHQ+Cjx0ZXh0IGNsYXNzPSdmMScgeD0nMTcuNjUwNDg0JyB5PScyMjkuMzAyODE5Jz50LDx0c3BhbiB4PScyMy45NjM2NzcnPk08L3RzcGFuPjwvdGV4dD4KPHRleHQgY2xhc3M9J2YyJyB4PSczMC45MDMwMDEnIHk9JzIyOS4zMDI4MTknPik8L3RleHQ+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9zdmc+" /></fr:resource-content><fr:resource-source
type="latex"
part="preamble"><![CDATA[
   
  \RequirePackage{tikz}
 \RequirePackage{amsmath}
 \usetikzlibrary{backgrounds, intersections, calc, spath3, fit}

 \definecolor{catccolor}{RGB}{255,244,138}
 \tikzstyle{dot}=[circle, draw=black, fill=black, minimum size=1mm, inner sep=0mm]
 \tikzstyle{catc}=[catccolor!60]
 \tikzstyle{catd}=[orange!40]
 \tikzstyle{cate}=[red!40]
 \tikzstyle{catf}=[blue!10]
 \tikzstyle{catg}=[green!25]


 \tikzstyle{blue halo}=[fill=blue!10, opacity=0.7, rounded corners]
 \tikzstyle{white halo}=[fill=white, opacity=0.7, rounded corners]

 \NewDocumentCommand\CreateRect{D<>{} m m}{
   \path
     coordinate (#1nw)
     ++(#2,-#3) coordinate (#1se)
     coordinate (#1sw) at (#1se -| #1nw)
     coordinate (#1ne) at (#1nw -| #1se)
   ;

   \path[spath/save = #1north] (#1nw) to (#1ne);
   \path[spath/save = #1west] (#1nw) to (#1sw);
   \path[spath/save = #1east] (#1ne) to (#1se);
   \path[spath/save = #1south] (#1sw) to (#1se);
 }

   
  \usepackage{tikz, tikz-cd, mathtools, amssymb, stmaryrd}

\usepackage{pgfplots}
\usepackage{amsmath}


 \usetikzlibrary{matrix,arrows, patterns}
 \usetikzlibrary{backgrounds,fit,positioning,calc,shapes}
 \usetikzlibrary{decorations.pathreplacing}
 \usetikzlibrary{decorations.pathmorphing}
 \usetikzlibrary{decorations.markings}

 \tikzset{
   desc/.style={sloped, fill=white,inner sep=2pt},
   upright desc/.style={fill=white,inner sep=2pt},
   pullback/.style = {
     append after command={
       \pgfextra{
         \draw ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
       }
     }
   },
   pullback 45/.style = {
     append after command={
       \pgfextra{
         \draw[rotate = 45] ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
       }
     }
   },
   ne pullback/.style = {
     append after command={
       \pgfextra{
         \draw ($(\tikzlastnode) + (-.2cm,-.5cm)$) -- ++(-0.3cm,0) -- ++(0,0.3cm);
       }
     }
   },
   sw pullback/.style = {
     append after command={
       \pgfextra{
         \draw ($(\tikzlastnode) + (.2cm,.5cm)$) -- ++(0.3cm,0) -- ++(0,-0.3cm);
       }
     }
   },
   dotted pullback/.style = {
     append after command={
       \pgfextra{
         \draw [densely dotted] ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
       }
     }
   },
   muted pullback/.style = {
     append after command={
       \pgfextra{
         \draw [gray] ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
       }
     }
   },
   pushout/.style = {
     append after command={
       \pgfextra{
         \draw ($(\tikzlastnode) + (-.2cm,.5cm)$) -- ++(-0.3cm,0) -- ++(0,-0.3cm);
       }
     }
   },
   between/.style args={#1 and #2}{
     at = ($(#1)!0.5!(#2)$)
   },
   diagram/.style = {
     on grid,
     node distance=2cm,
     commutative diagrams/every diagram,
     line width = .5pt,
     every node/.append style = {
       commutative diagrams/every cell,
     }
   },
   fibration/.style = {
     -{Triangle[open]}
   },
   etale/.style = {
     -{Triangle[open]}
   },
   etale cover/.style= {
     >={Triangle[open]},->.>
   },
   opfibration/.style = {
     -{Triangle}
   },
   lies over/.style = {
     |-{Triangle[open]}
   },
   op lies over/.style = {
     |-{Triangle}
   },
   embedding/.style = {
     {right hook}->
   },
   open immersion/.style = {
     {right hook}-{Triangle[open]}
   },
   closed immersion/.style = {
     {right hook}-{Triangle}
   },
   closed immersion*/.style = {
     {left hook}-{Triangle}
   },
   embedding*/.style = {
     {left hook}->
   },
   open immersion*/.style = {
     {left hook}-{Triangle[open]}
   },
   exists/.style = {
     densely dashed
   },
 }

 \newlength{\dontworryaboutit}

 \tikzset{
   inline diagram/.style = {
     commutative diagrams/every diagram,
     commutative diagrams/cramped,
     line width = .5pt,
     every node/.append style = {
       commutative diagrams/every cell,
       anchor = base,
       inner sep = 0pt
     },
     every path/.append style = {
       outer xsep = 2pt
     }
   }
 }

 \tikzset{
   square/nw/.style = {},
   square/ne/.style = {},
   square/se/.style = {},
   square/sw/.style = {},
   square/north/.style = {->},
   square/south/.style = {->},
   square/west/.style = {->},
   square/east/.style = {->},
   square/north/node/.style = {above},
   square/south/node/.style = {below},
   square/west/node/.style = {left},
   square/east/node/.style = {right},
 }

 \ExplSyntaxOn

 \bool_new:N \l_jon_glue_west

 \keys_define:nn { jon-tikz/diagram } {
   nw .tl_set:N = \l_jon_tikz_diagram_nw,
   sw .tl_set:N = \l_jon_tikz_diagram_sw,
   ne .tl_set:N = \l_jon_tikz_diagram_ne,
   se .tl_set:N = \l_jon_tikz_diagram_se,

   width .tl_set:N = \l_jon_tikz_diagram_width,
   height .tl_set:N = \l_jon_tikz_diagram_height,

   north .tl_set:N = \l_jon_tikz_diagram_north,
   south .tl_set:N = \l_jon_tikz_diagram_south,
   west .tl_set:N = \l_jon_tikz_diagram_west,
   east .tl_set:N = \l_jon_tikz_diagram_east,

   nw/style .code:n = {\tikzset{square/nw/.style = {#1}}},
   sw/style .code:n = {\tikzset{square/sw/.style = {#1}}},
   ne/style .code:n = {\tikzset{square/ne/.style = {#1}}},
   se/style .code:n = {\tikzset{square/se/.style = {#1}}},

   glue .choice:,
   glue / west .code:n = {\bool_set:Nn \l_jon_glue_west \c_true_bool},

   glue~target .tl_set:N = \l_jon_tikz_glue_target,

   north/style .code:n = {\tikzset{square/north/.style = {#1}}},
   north/node/style .code:n = {\tikzset{square/north/node/.style = {#1}}},
   south/style .code:n = {\tikzset{square/south/.style = {#1}}},
   south/node/style .code:n = {\tikzset{square/south/node/.style = {#1}}},
   west/style .code:n = {\tikzset{square/west/.style = {#1}}},
   west/node/style .code:n = {\tikzset{square/west/node/.style = {#1}}},
   east/style .code:n = {\tikzset{square/east/.style = {#1}}},
   east/node/style .code:n = {\tikzset{square/east/node/.style = {#1}}},

   draft .meta:n = {
     nw = {\__jon_tikz_diagram_fmt_placeholder:n {nw}},
     sw = {\__jon_tikz_diagram_fmt_placeholder:n {sw}},
     se = {\__jon_tikz_diagram_fmt_placeholder:n {se}},
     ne = {\__jon_tikz_diagram_fmt_placeholder:n {ne}},
     north = {\__jon_tikz_diagram_fmt_placeholder:n {north}},
     south = {\__jon_tikz_diagram_fmt_placeholder:n {south}},
     west = {\__jon_tikz_diagram_fmt_placeholder:n {west}},
     east = {\__jon_tikz_diagram_fmt_placeholder:n {east}},
   }
 }

 \tl_set:Nn \l_jon_tikz_diagram_width { 2cm }
 \tl_set:Nn \l_jon_tikz_diagram_height { 2cm }


 \cs_new:Npn \__jon_tikz_diagram_fmt_placeholder:n #1 {
   \texttt{\textcolor{red}{#1}}
 }

 \keys_set:nn { jon-tikz/diagram } {
   glue~target = {},
 }


 \cs_new:Nn \__jon_tikz_render_square:nn {
   \group_begin:
   \keys_set:nn {jon-tikz/diagram} {#2}
   \bool_if:nTF \l_jon_glue_west {
     \node (#1ne) [right = \l_jon_tikz_diagram_width~of~\l_jon_tikz_glue_target ne,square/ne] {$\l_jon_tikz_diagram_ne$};
     \node (#1se) [below = \l_jon_tikz_diagram_height~of~#1ne,square/se] {$\l_jon_tikz_diagram_se$};
     \draw[square/north] (\l_jon_tikz_glue_target ne) to node [square/north/node] {$\l_jon_tikz_diagram_north$} (#1ne);
     \draw[square/east] (#1ne) to node [square/east/node] {$\l_jon_tikz_diagram_east$} (#1se);
     \draw[square/south] (\l_jon_tikz_glue_target se) to node [square/south/node] {$\l_jon_tikz_diagram_south$} (#1se);
   } {
     \node (#1nw) [square/nw] {$\l_jon_tikz_diagram_nw$};
     \node (#1sw) [below = \l_jon_tikz_diagram_height~of~#1nw,square/sw] {$\l_jon_tikz_diagram_sw$};
     \draw[square/west] (#1nw) to node [square/west/node] {$\l_jon_tikz_diagram_west$} (#1sw);

     \node (#1ne) [right = \l_jon_tikz_diagram_width~of~#1nw,square/ne] {$\l_jon_tikz_diagram_ne$};
     \node (#1se) [below = \l_jon_tikz_diagram_height~of~#1ne,square/se] {$\l_jon_tikz_diagram_se$};
     \draw[square/north] (#1nw) to node [square/north/node] {$\l_jon_tikz_diagram_north$} (#1ne);
     \draw[square/east] (#1ne) to node [square/east/node] {$\l_jon_tikz_diagram_east$} (#1se);
     \draw[square/south] (#1sw) to node [square/south/node] {$\l_jon_tikz_diagram_south$} (#1se);
   }
   \group_end:
 }

 \NewDocumentCommand\SpliceDiagramSquare{D<>{}m}{
   \__jon_tikz_render_square:nn {#1} {#2}
 }


 \NewDocumentCommand\DiagramSquare{D<>{}O{}m}{
   \begin{tikzpicture}[diagram,#2,baseline=(#1sw.base)]
     \__jon_tikz_render_square:nn {#1} {#3}
   \end{tikzpicture}
 }

 \ExplSyntaxOff

  ]]></fr:resource-source><fr:resource-source
type="latex"
part="body"><![CDATA[
\begin {tikzpicture}[scale=2]
\tikzstyle {every node}=[font=\tiny ]
    \begin {axis}[
        domain=0:400,
        samples=366,
        xmin=0, xmax=400,
        ymin=0, ymax=0.9,
        xlabel={$t(DOY)$},
        ylabel={$v(t, M)$},
        xtick={0, 100, 200, 300},
        ytick={0, 0.2, 0.4, 0.6, 0.8},
        xlabel near ticks,
        ylabel near ticks,
        legend pos=north west,
       xtick pos=bottom,ytick pos=left
    ]

\pgfmathsetmacro {\mone }{0.05}    \pgfmathsetmacro {\mtwo }{1.00}    \pgfmathsetmacro {\mthree }{120}  \pgfmathsetmacro {\mfour }{8}    \pgfmathsetmacro {\mfive }{290}   \pgfmathsetmacro {\msix }{6}     \pgfmathsetmacro {\mseven }{0.0011} 
\addplot [black]
{(\mone  + (\mtwo  - \mseven  * x)*
 (1 / (1 + exp((\mthree  - x) / \mfour )) -
  1 / (1 + exp((\mfive  - x) / \msix ))))};


\draw [dashed, dash pattern=on 2pt off 2pt] (axis cs:0,\mone ) -- node[above] {$m_1$} (axis cs:400, \mone ) -- (axis cs:366,\mone ) ;
\draw [dashed, dash pattern=on 2pt off 2pt] (axis cs:\mthree ,0) -- (axis cs:\mthree ,1) node[above right] {};
\draw [dashed, dash pattern=on 2pt off 2pt] (axis cs:\mfive ,0) -- (axis cs:\mfive ,1) node[above right] {};

\draw [{| - |}] (axis cs:\mthree -10,0.45) -- (axis cs:\mthree +10,0.45) node[left, xshift=-10] {$m_4$};
\draw [{| - |}] (axis cs:\mfive +10,0.45) -- (axis cs:\mfive -10,0.45) node[right, xshift=10] {$m_6$};


\draw  (axis cs:\mfive ,0.15) node[left] {$m_5$};
\draw  (axis cs:\mthree ,0.15) node[right] {$m_3$};

\draw [dashed, dash pattern=on 2pt off 2pt] (axis cs:140,0.9) -- (axis cs:400,0.6)  node[midway,sloped,above, xshift=10] {$m_1 + m_2 - m_7 t$};

\end {axis}

\end {tikzpicture}

]]></fr:resource-source></fr:resource></fr:figure>
 
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>250</fr:anchor><fr:addr
type="user">ocs-0003</fr:addr><fr:route>ocs-0003.xml</fr:route><fr:title
text="Arena Allocator">Arena Allocator</fr:title><fr:taxon>Note</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>5</fr:month><fr:day>29</fr:day></fr:date><fr:authors /></fr:frontmatter><fr:mainmatter><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>251</fr:anchor><fr:addr
type="user">ocs-0004</fr:addr><fr:route>ocs-0004.xml</fr:route><fr:title
text="Logic behind the allocator">Logic behind the allocator</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Only requires an offset or pointer to state the end of the last allocation. To allocate some memory from the arena it is as simple as moving the offset (or pointer) forward. The allocation has the complexity of <fr:tex
display="inline"><![CDATA[O(1)]]></fr:tex>.

 Due to being the simplest allocator possible, the arena allocator does nto allow the user to free certain blocks of memory. The memory is usually <fr:em>freed all at once</fr:em>.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>252</fr:anchor><fr:addr
type="user">ocs-0005</fr:addr><fr:route>ocs-0005.xml</fr:route><fr:title
text="Basic arena interface">Basic arena interface</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>An arena is like a stack with extensions, e.g. it can be named.</fr:p><fr:pre><![CDATA[Arena *arena_alloc(void);
void arena_release(Arena *arena);
void arena_set_auto_align(Arena *arena, u64 align);

u64 arena_pos(Arena *arena);

void *arena_push_no_zero(Arena *arena, u64 size);
void *arena_push_aligner(Arena *arena, u64 alignment);
void *arena_push(Arena *arena, u64 size);

void arena_pop_to(Arena *arena, u64 pos);
void arena_pop(Arena *arena, u64 size);
void arena_clear(Arena *arena);

#define PushArrayNoZero(arena, type, count) (type *) \
    arena_push_no_zero((arena), sizeof(type) * (count))
#define PushArray(arena, type, count) (type *) \
    arena_push((arena), sizeof(type) * (count))]]></fr:pre><fr:p>the simplest arena allocator will look something like</fr:p><fr:pre><![CDATA[static unsigned char *arena_buffer;
static size_t arena_buffer_length;
static size_t arena_offset;

void *arena_alloc(size_t size) {
    // Check to see if the backing memory has space left
    if (arena_offset+size <= arena_buffer_length) {
        void *ptr = &arena_buffer[arena_offset];
        arena_offset += size;

        // Zero memory
        memset(ptr, 0, size);
        return ptr;
    }
    return NULL;
}]]></fr:pre><fr:p>While this is as simple as it gets, there are two issues with the basic approach
  * You cannot reuse this procedure for different arenas.
  * The pointer returned may not be aligned correctly for the data you need.

 The first issue can be solved by coupling the data into a structure and passing that to the procedure =arena_alloc=.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>253</fr:anchor><fr:addr
type="user">ocs-0008</fr:addr><fr:route>ocs-0008.xml</fr:route><fr:title
text="Bash color codes">Bash color codes</fr:title><fr:taxon>Snippet</fr:taxon><fr:authors /></fr:frontmatter><fr:mainmatter><fr:pre><![CDATA[# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>254</fr:anchor><fr:addr
type="user">ocs-0009</fr:addr><fr:route>ocs-0009.xml</fr:route><fr:title
text="Single Instruction Multiple Vector (SIMD)">Single Instruction Multiple Vector (SIMD)</fr:title><fr:taxon>Note</fr:taxon><fr:date><fr:year>2025</fr:year><fr:month>3</fr:month><fr:day>20</fr:day></fr:date><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Single vector instruction sets are extensions to the original architecture instruction sets, and thus you have to invest extra effort to use and support them. With compiled code, you need to write inline assembly, or use vector intrinsics.</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>255</fr:anchor><fr:addr
type="user">ocs-000J</fr:addr><fr:route>ocs-000J.xml</fr:route><fr:title
text="Vector intrinsics">Vector intrinsics</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Intrinsics appear like regular libary functions. You include the relevant header, and then you can use it just like any other lib. E.g. assuming a visual c++ compiler, if you wanted to add four float numbers to another four numbers, you would include the <fr:code>xmmintrin.h</fr:code> header which contains the following declaration for the <fr:code>_mm_add_ps</fr:code> intrinsic:</fr:p><fr:pre><![CDATA[extern _m128 _mm_add_ps( _m128 _A, _m128 _B);]]></fr:pre><fr:p>However unlike lib functions, intrinsics are implemented directly in compilers. The example SSE intrinsic typically compiles to a single instruction, x86 and amd64 instructions. For the time it takes CPU to call a library function, it might have completed dozen of these functions.</fr:p><fr:p>For all x86 the current best practice is to use <fr:code>&lt;immintrin.h&gt;</fr:code> which loads in the the correct compatible instruction set.
<fr:ul><fr:li>__MMX__ -- X86 MMX :: <fr:code>mmintrin.h</fr:code></fr:li>
<fr:li>__SSE__ -- X86 SSE :: <fr:code>xmmintrin.h</fr:code></fr:li>
<fr:li>__SSE2__ -- X86 SSE2 :: <fr:code>emmintrin.h</fr:code></fr:li>
<fr:li>__VEC__ -- altivec functions :: <fr:code>altivec.h</fr:code></fr:li>
<fr:li>__ARM_NEON__ -- ARM Neon functions :: <fr:code>arm_neon.h</fr:code></fr:li></fr:ul></fr:p>
  <html:table
xmlns:html="http://www.w3.org/1999/xhtml">
  
  
  <html:tr>
    
  <html:td><fr:strong>Operation</fr:strong></html:td>

    
  <html:td><fr:strong>Altivec</fr:strong></html:td>

    
  <html:td><fr:strong>Neon</fr:strong></html:td>

    
  <html:td><fr:strong>MMX/SSE/SSE2</fr:strong></html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>
  <html:hr />
</html:td>

    
  <html:td>
  <html:hr />
</html:td>

    
  <html:td>
  <html:hr />
</html:td>

    
  <html:td>
  <html:hr />
</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>loading</html:td>

    
  <html:td>vec_ld</html:td>

    
  <html:td>vld1q_f32</html:td>

    
  <html:td>_mm_set_epi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>vector</html:td>

    
  <html:td>vec_splat</html:td>

    
  <html:td>vld1q_s16</html:td>

    
  <html:td>_mm_set1_epi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_splat_s16</html:td>

    
  <html:td>vsetq_lane_f32</html:td>

    
  <html:td>_mm_set1_pi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_splat_s32</html:td>

    
  <html:td>vld1_u8</html:td>

    
  <html:td>_mm_set_pi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_splat_s8</html:td>

    
  <html:td>vdupq_lane_s16</html:td>

    
  <html:td>_mm_load_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_splat_u16</html:td>

    
  <html:td>vdupq_n_s16</html:td>

    
  <html:td>_mm_set1_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_splat_u32</html:td>

    
  <html:td>vmovq_n_f32</html:td>

    
  <html:td>_mm_loadh_pi</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_splat_u8</html:td>

    
  <html:td>vset_lane_u8</html:td>

    
  <html:td>_mm_loadl_pi</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>storing</html:td>

    
  <html:td>vec_st</html:td>

    
  <html:td>vst1_u8</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>vector</html:td>

    
  <html:td />

    
  <html:td>vst1q_s16</html:td>

    
  <html:td>_mm_store_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vst1q_f32</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vst1_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>add</html:td>

    
  <html:td>vec_madd</html:td>

    
  <html:td>vaddq_s16</html:td>

    
  <html:td>_mm_add_epi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_mladd</html:td>

    
  <html:td>vaddq_f32</html:td>

    
  <html:td>_mm_add_pi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_adds</html:td>

    
  <html:td>vmlaq_n_f32</html:td>

    
  <html:td>_mm_add_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>subtract</html:td>

    
  <html:td>vec_sub</html:td>

    
  <html:td>vsubq_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>multiply</html:td>

    
  <html:td>vec_madd</html:td>

    
  <html:td>vmulq_n_s16</html:td>

    
  <html:td>_mm_mullo_epi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_mladd</html:td>

    
  <html:td>vmulq_s16</html:td>

    
  <html:td>_mm_mullo_pi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vmulq_f32</html:td>

    
  <html:td>_mm_mul_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vmlaq_n_f32</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>arithmetic</html:td>

    
  <html:td>vec_sra</html:td>

    
  <html:td>vshrq_n_s16</html:td>

    
  <html:td>_mm_srai_epi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>shift</html:td>

    
  <html:td>vec_srl</html:td>

    
  <html:td />

    
  <html:td>_mm_srai_pi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_sr</html:td>

    
  <html:td />

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>byte</html:td>

    
  <html:td>vec_perm</html:td>

    
  <html:td>vtbl1_u8</html:td>

    
  <html:td>_mm_shuffle_pi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>permutation</html:td>

    
  <html:td>vec_sel</html:td>

    
  <html:td>vtbx1_u8</html:td>

    
  <html:td>_mm_shuffle_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_mergeh</html:td>

    
  <html:td>vget_high_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_mergel</html:td>

    
  <html:td>vget_low_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vdupq_lane_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vdupq_n_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vmovq_n_f32</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vbsl_u8</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>type</html:td>

    
  <html:td>vec_cts</html:td>

    
  <html:td>vmovl_u8</html:td>

    
  <html:td>_mm_packs_pu16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>conversion</html:td>

    
  <html:td>vec_unpackh</html:td>

    
  <html:td>vreinterpretq_s16_u16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_unpackl</html:td>

    
  <html:td>vcvtq_u32_f32</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_cts</html:td>

    
  <html:td>vqmovn_s32</html:td>

    
  <html:td>_mm_cvtps_pi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td>vec_ctu</html:td>

    
  <html:td>vqmovun_s16</html:td>

    
  <html:td>_mm_packus_epi16</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vqmovn_u16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vcvtq_f32_s32</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vmovl_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vmovq_n_f32</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>vector</html:td>

    
  <html:td>vec_pack</html:td>

    
  <html:td>vcombine_u16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>combination</html:td>

    
  <html:td>vec_packsu</html:td>

    
  <html:td>vcombine_u8</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td>vcombine_s16</html:td>

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>maximum</html:td>

    
  <html:td />

    
  <html:td />

    
  <html:td>_mm_max_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>minimum</html:td>

    
  <html:td />

    
  <html:td />

    
  <html:td>_mm_min_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>vector</html:td>

    
  <html:td />

    
  <html:td />

    
  <html:td>_mm_andnot_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>logic</html:td>

    
  <html:td />

    
  <html:td />

    
  <html:td>_mm_and_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td />

    
  <html:td />

    
  <html:td />

    
  <html:td>_mm_or_ps</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>rounding</html:td>

    
  <html:td>vec_trunc</html:td>

    
  <html:td />

    
  <html:td />

  </html:tr>



  
  
  <html:tr>
    
  <html:td>misc</html:td>

    
  <html:td />

    
  <html:td />

    
  <html:td>_mm_empty</html:td>

  </html:tr>



  
  
  <html:tr>
    
  <html:td>
  <html:hr />
</html:td>

    
  <html:td>
  <html:hr />
</html:td>

    
  <html:td>
  <html:hr />
</html:td>

    
  <html:td>
  <html:hr />
</html:td>

  </html:tr>



</html:table>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:p>Links
  <fr:ul><fr:li><fr:link
type="external"
href="https://www.youtube.com/watch?v=DXPfE2jGqg0">Utilizing the other 80% of your system's performance: Starting with Vectorization</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="https://stackoverflow.blog/2020/07/08/improving-performance-with-simd-intrinsics-in-three-use-cases/">Improving perf with simd intrinsics in three use cases</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="http://ftp.cvut.cz/kernel/people/geoff/cell/ps3-linux-docs/CellProgrammingTutorial/BasicsOfSIMDProgramming.html">Basics of SIMD programming</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="http://librestats.com/RparallelGuide/#the-simd-keyword">SIMD Keyword OpenMP, R, Parallelism</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="https://lowleveldev.substack.com/p/simd-a-practical-guide">SIMD a practical guide</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="https://stackoverflow.com/questions/70569824/organizing-multiple-implementations-for-simd">Organizing SIMD code - stackoverflow</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="https://stackoverflow.com/questions/661338/sse-sse2-and-sse3-for-gnu-c">SSE SSE2 and SSE3 for GNU C++ [closed] - stackoverflow</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="https://statmodeling.stat.columbia.edu/2023/11/01/simd-memory-locality-vectorization-and-branch-point-prediction/">SIMD, memory locality, vectorization, and branch point prediction</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="https://eclecticlight.co/2021/07/27/code-in-arm-assembly-rounding-and-arithmetic/">Code in ARM assembly: Rounding and arithmetic (scalar)</fr:link></fr:li>
    <fr:li><fr:link
type="external"
href="https://blog.yiningkarlli.com/2021/09/neon-vs-sse.html">Comparing SIMD on x86-64 and arm64</fr:link></fr:li></fr:ul></fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>256</fr:anchor><fr:addr
type="user">ocs-000B</fr:addr><fr:route>ocs-000B.xml</fr:route><fr:title
text="Makefiles">Makefiles</fr:title><fr:taxon>Note</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>9</fr:month><fr:day>13</fr:day></fr:date><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>A well written makefile describes all the files and settings used to compile a project and link it with the appropriate libraries</fr:p><fr:p>Managing a build with a makefile is less error-prone and far simpler after a _one-time setup cost_. A makefile with a proper dependency graph will only rebuild a target when one or more of the components it depends on has changed. This allows seperating the components of a project whcih can be built independently.</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>257</fr:anchor><fr:addr
type="user">ocs-000D</fr:addr><fr:route>ocs-000D.xml</fr:route><fr:title
text="Makefile syntax">Makefile syntax</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>It is common practice to copy and modify old makefules rather than generating new ones from scratch.</fr:p><fr:pre><![CDATA[#
# A simple makefile for managing build of project composed of C source files.
#


# It is likely that default C compiler is already gcc, but explicitly
# set, just to be sure
CC = gcc

# The CFLAGS variable sets compile flags for gcc:
#  -g        compile with debug information
#  -Wall     give verbose compiler warnings
#  -O0       do not optimize generated code
#  -std=c99  use the C99 standard language definition
CFLAGS = -g -Wall -O0 -std=c99

# The LDFLAGS variable sets flags for linker
#  -lm   says to link in libm (the math library)
LDFLAGS = -lm

# In this section, you list the files that are part of the project.
# If you add/change names of source files, here is where you
# edit the Makefile.
SOURCES = demo.c vector.c map.c
OBJECTS = $(SOURCES:.c=.o)
TARGET = demo


# The first target defined in the makefile is the one
# used when make is invoked with no argument. Given the definitions
# above, this Makefile file will build the one named TARGET and
# assume that it depends on all the named OBJECTS files.

$(TARGET) : $(OBJECTS)
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

# Phony means not a "real" target, it doesn't build anything
# The phony target "clean" is used to remove all compiled object files.

.PHONY: clean

clean:
    @rm -f $(TARGET) $(OBJECTS) core]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>258</fr:anchor><fr:addr
type="user">ocs-000E</fr:addr><fr:route>ocs-000E.xml</fr:route><fr:title
text="Makefile macros">Makefile macros</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Subsitutions defined toward top of the file, e.g. (<fr:code>CFLAGS = -g -Wall</fr:code>), and are similar to <fr:code>#define</fr:code> in <fr:link
type="external"
href="%7B%7B%3C%20relref%20%2220240401132118-c.md%22%20%3E%7D%7D">C</fr:link> . It can be referenced later with <fr:code>$(CFLAGS)</fr:code>.</fr:p><fr:p>Example macros: - <fr:code>OBJECTS = $(SOURCES:.c=o)</fr:code> - Defines the <fr:code>OBJECTS</fr:code> macro to be the same as the <fr:code>SOURCES</fr:code> macro except that every instance of <fr:code>.c</fr:code> is replaced with <fr:code>.o</fr:code>. - <fr:code>$@</fr:code>: - built-in, name of the current target - <fr:code>$^</fr:code>: - built-in, current targets list of dependencies</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>259</fr:anchor><fr:addr
type="user">ocs-000F</fr:addr><fr:route>ocs-000F.xml</fr:route><fr:title
text="Targets">Targets</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Written in the following form</fr:p><fr:pre><![CDATA[target-name : dependencies
    action]]></fr:pre><fr:p>where the target name is the name of the file that will be produced when this target is built. The first target listed in a make file is the default target, meaning it is invoked by <fr:code>make</fr:code> with no args.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>260</fr:anchor><fr:addr
type="user">ocs-000C</fr:addr><fr:route>ocs-000C.xml</fr:route><fr:title
text="Phony targets">Phony targets</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>The clean target in the example does not fit the pattern which is     previously described of targets. It does not create a file named     <fr:code>clean</fr:code>, rather it is a shortcut for running a command whcih cclears out     the projects build files. These commands are listed as dependencies of     <fr:code>.PHONY</fr:code> which allows Make to run the target without any dependency     checks.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:p>links</fr:p><fr:ul><fr:li><fr:link
type="external"
href="https://web.stanford.edu/class/archive/cs/cs107/cs107.1174/guide_make.html">cs107 makefile guide</fr:link></fr:li>
<fr:li><fr:link
type="external"
href="https://gist.github.com/isaacs/62a2d1825d04437c6f08">Makefile basics - gist</fr:link></fr:li></fr:ul></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>261</fr:anchor><fr:addr
type="user">go-00rs</fr:addr><fr:route>go-00rs.xml</fr:route><fr:title
text="Golang">Golang</fr:title><fr:taxon>Language</fr:taxon><fr:authors /></fr:frontmatter><fr:mainmatter><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>262</fr:anchor><fr:addr
type="user">go-00rv</fr:addr><fr:route>go-00rv.xml</fr:route><fr:title
text="Initialize module">Initialize module</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Within a new directory, initialize a module with</fr:p><fr:pre><![CDATA[go mod init your/module]]></fr:pre><fr:p>This will create a new file `go.mod`</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>263</fr:anchor><fr:addr
type="user">go-00rx</fr:addr><fr:route>go-00rx.xml</fr:route><fr:title
text="Types">Types</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter>
  <html:table
xmlns:html="http://www.w3.org/1999/xhtml">
  
  
  <html:tr>
    
  <html:td><fr:strong>Zero:</fr:strong></html:td>

    
  <html:td>Predeclared</html:td>

    
  <html:td>Default value assigned to declared but unassigned variables</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>Literals:</fr:strong></html:td>

    
  <html:td>Predeclared</html:td>

    
  <html:td>Explicitly specified values</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>Integer:</fr:strong></html:td>

    
  <html:td>Literals</html:td>

    
  <html:td>Base 10 by default</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>Floating-point:</fr:strong></html:td>

    
  <html:td>Literals</html:td>

    
  <html:td>Uses decimal point for fractions</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>Rune:</fr:strong></html:td>

    
  <html:td>Literals</html:td>

    
  <html:td>Single character representation</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>String:</fr:strong></html:td>

    
  <html:td>Literals</html:td>

    
  <html:td>Two creation methods</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>Booleans:</fr:strong></html:td>

    
  <html:td>Predeclared</html:td>

    
  <html:td>Binary true/false values</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>byte:</fr:strong></html:td>

    
  <html:td>Integer</html:td>

    
  <html:td>Alias for uint8</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>int:</fr:strong></html:td>

    
  <html:td>Integer</html:td>

    
  <html:td>Signed integer sized to architecture's word size</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>uint:</fr:strong></html:td>

    
  <html:td>Integer</html:td>

    
  <html:td>Unsigned integer sized to architecture's word size</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>rune:</fr:strong></html:td>

    
  <html:td>Integer</html:td>

    
  <html:td>Alias for int32</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>uintptr:</fr:strong></html:td>

    
  <html:td>Integer</html:td>

    
  <html:td>Integer type for storing pointer values</html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><fr:strong>String:</fr:strong></html:td>

    
  <html:td>Predeclared</html:td>

    
  <html:td>Immutable sequence of bytes, zero value is empty string</html:td>

  </html:tr>


</html:table>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>264</fr:anchor><fr:addr
type="user">go-00ry</fr:addr><fr:route>go-00ry.xml</fr:route><fr:title
text="Type conversion">Type conversion</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Go does not support automatic type conversion. All variable types need to be converted to interact.</fr:p><fr:pre><![CDATA[var x int = 10
var y float64 = 30.2
var sum1 float64 = float64(x) + y
var sum2 int = x + int(y)
fmt.Println(sum1, sum2) // 40.2  40]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>265</fr:anchor><fr:addr
type="user">go-00rz</fr:addr><fr:route>go-00rz.xml</fr:route><fr:title
text="Quotes">Quotes</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Different qoutes are used for different contexts.</fr:p><fr:p>The double qoute <fr:code>"</fr:code> will be used to create string literals, while the backtick is used to create <fr:em>raw</fr:em> string literals. The single qoute <fr:code>'</fr:code> is used to create runes, a single unicode point. E.g. <fr:code>r := '學'</fr:code>.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>266</fr:anchor><fr:addr
type="user">go-00s0</fr:addr><fr:route>go-00s0.xml</fr:route><fr:title
text="Slices">Slices</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:ul><fr:li>Slices will have a zero value of <fr:code>nil</fr:code> and is only comprable with <fr:code>nil</fr:code> and <fr:code>==</fr:code>.</fr:li>
    <fr:li>Modifying shared slices will affect all references.</fr:li>
    <fr:li>Length can differ from capacity</fr:li></fr:ul><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>267</fr:anchor><fr:addr
type="user">go-00s3</fr:addr><fr:route>go-00s3.xml</fr:route><fr:title
text="Creation">Creation</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:pre><![CDATA[var s []int             // nil slice
s := []int{1, 2, 3}     // slice literal
s := make([]int, 5)     // length 5, capacity 5
s := make([]int, 0, 10) // length 0, capacity 10]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>268</fr:anchor><fr:addr
type="user">go-00s4</fr:addr><fr:route>go-00s4.xml</fr:route><fr:title
text="Modification">Modification</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:pre><![CDATA[s = append(s, 10)           // single element
s = append(s, 1, 2, 3)      // multiple elements
s = append(s, other...)     // append slice
clear(s)                    // zero all elements (Go 1.21+)]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>269</fr:anchor><fr:addr
type="user">go-00s5</fr:addr><fr:route>go-00s5.xml</fr:route><fr:title
text="Slicing">Slicing</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:pre><![CDATA[s[low:high]     // items low through high-1
s[low:]         // items low through end
s[:high]        // items beginning through high-1
s[:]            // copy of entire slice
s[low:high:max] // control capacity of new slice]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>270</fr:anchor><fr:addr
type="user">go-00s6</fr:addr><fr:route>go-00s6.xml</fr:route><fr:title
text="Copying">Copying</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:pre><![CDATA[copy(dest, src)        // copies min(len(dest), len(src)) elements
copy(dest, src[1:])    // copy from middle of src]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>271</fr:anchor><fr:addr
type="user">go-00s7</fr:addr><fr:route>go-00s7.xml</fr:route><fr:title
text="Array Conversion">Array Conversion</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:pre><![CDATA[array := [4]int{1, 2, 3, 4}
slice := array[:]              // array to slice
array2 := [4]int(slice)       // slice to array (new memory)
arrayPtr := (*[4]int)(slice)  // slice to array pointer (shared memory)]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>272</fr:anchor><fr:addr
type="user">go-00s9</fr:addr><fr:route>go-00s9.xml</fr:route><fr:title
text="When to Use What">When to Use What</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>1.  `var` declaration (nil slice): When size unknown, no initial data 2.  Slice literal: When starting values are known 3.  `make`:     -   With length: For buffers or exact size known     -   Zero length + capacity: For growing slices</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>273</fr:anchor><fr:addr
type="user">go-00sa</fr:addr><fr:route>go-00sa.xml</fr:route><fr:title
text="Memory Management">Memory Management</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>-   Capacity doubles when &amp;lt; 256 -   Growth slows to ~25/for larger slices -   Use full slice expression `s[low:high:max]` to prevent capacity issues -   Be careful with shared memory when slicing</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>274</fr:anchor><fr:addr
type="user">go-00sb</fr:addr><fr:route>go-00sb.xml</fr:route><fr:title
text="Standard Library">Standard Library</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>-   `slices.Equal(a, b)`: Compare if length and elements match -   `slices.EqualFunc(a, b, fn)`: Custom comparison function</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>275</fr:anchor><fr:addr
type="user">go-00sc</fr:addr><fr:route>go-00sc.xml</fr:route><fr:title
text="Maps">Maps</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Maps are declared as `map[keyType]valueType`. A `nil` map (e.g., `var m map[string]int`) cannot be written to. Use `make` or a map literal for writable maps.</fr:p><fr:pre><![CDATA[// Map literal
m := map[string]int{"Alice": 10, "Bob": 20}

// Using make
m := make(map[string]int, 10) // Capacity 10
m["Charlie"] = 30]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>276</fr:anchor><fr:addr
type="user">go-00sd</fr:addr><fr:route>go-00sd.xml</fr:route><fr:title
text="Structs">Structs</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Structs are user-defined types with fields. Define them with `type` and access fields using dot notation.</fr:p><fr:pre><![CDATA[type Person struct {
    Name string
    Age  int
}
p := Person{Name: "Alice", Age: 30}
fmt.Println(p.Name)]]></fr:pre><fr:p>Anonymous structs are inline struct definitions:</fr:p><fr:pre><![CDATA[pet := struct {
    Name string
    Kind string
}{Name: "Fido", Kind: "dog"}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>277</fr:anchor><fr:addr
type="user">go-00se</fr:addr><fr:route>go-00se.xml</fr:route><fr:title
text="Pointers">Pointers</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Use `&amp;` to get a pointer and `*` to dereference. `nil` pointers cannot be dereferenced.</fr:p><fr:pre><![CDATA[x := 10
p := &x
fmt.Println(*p) // 10]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>278</fr:anchor><fr:addr
type="user">go-00sf</fr:addr><fr:route>go-00sf.xml</fr:route><fr:title
text="Shadowing">Shadowing</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Inner-scope variables can shadow outer-scope ones:</fr:p><fr:pre><![CDATA[x := 10
if x > 5 {
    x := 5
    fmt.Println(x) // 5
}
fmt.Println(x) // 10]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>279</fr:anchor><fr:addr
type="user">go-00sg</fr:addr><fr:route>go-00sg.xml</fr:route><fr:title
text="Control Flow">Control Flow</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>280</fr:anchor><fr:addr
type="user">go-00sh</fr:addr><fr:route>go-00sh.xml</fr:route><fr:title
text="If">If</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Go's `if` statements do not require parentheses. You can declare variables scoped to the condition:</fr:p><fr:pre><![CDATA[if n := rand.Intn(10); n > 5 {
    fmt.Println("Big:", n)
} else {
    fmt.Println("Small:", n)
}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>281</fr:anchor><fr:addr
type="user">go-00si</fr:addr><fr:route>go-00si.xml</fr:route><fr:title
text="For">For</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Loops in go support complete (C-style), condition only, for-range styles.</fr:p><fr:pre><![CDATA[// C-style
for i := 0; i < 10; i++ {
    fmt.Println(i)
}

// condition only (while)
i := 1
for i < 10 {
    fmt.Println(i)
    i++
}

// for-range
nums := []int{1, 2, 3}
for i, v := range nums {
    fmt.Println(i, v)
}]]></fr:pre><fr:p>If you don't need the key/index in,  the underscore <fr:code>_</fr:code> can be used, telling go to ignore the value.</fr:p><fr:pre><![CDATA[evenVals := []int{2, 4, 6, 8, 10, 12}
for _, v := range evenVals {
    fmt.Printf("%d ", v)
}]]></fr:pre><fr:p>If you just need the key/index, you can leave off the second variable:</fr:p><fr:pre><![CDATA[uniqueNames := map[string]bool{"Fred": true, "Raul": true, "Wilma": true}
for k := range uniqueNames {
    fmt.Printf("%s ", k)
}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>282</fr:anchor><fr:addr
type="user">go-00sj</fr:addr><fr:route>go-00sj.xml</fr:route><fr:title
text="Switch">Switch</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:pre><![CDATA[words := []string{"a", "cow", "smile", "gopher",
    "octopus", "anthropologist"}
for _, word := range words {
    switch size := len(word); size {
    case 1, 2, 3, 4:
        fmt.Println(word, "is a short word!")
    case 5:
        wordLen := len(word)
        fmt.Println(word, "is exactly the right length:", wordLen)
    case 6, 7, 8, 9:
    default:
        fmt.Println(word, "is a long word!")
    }
}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>283</fr:anchor><fr:addr
type="user">go-00sk</fr:addr><fr:route>go-00sk.xml</fr:route><fr:title
text="Functions">Functions</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>284</fr:anchor><fr:addr
type="user">go-00sl</fr:addr><fr:route>go-00sl.xml</fr:route><fr:title
text="Variadic Parameters">Variadic Parameters</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Variadic functions accept a variable number of arguments as a slice:</fr:p><fr:pre><![CDATA[func addTo(base int, vals ...int) []int {
    out := make([]int, 0, len(vals))
    for _, v := range vals {
        out = append(out, base+v)
    }
    return out
}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>285</fr:anchor><fr:addr
type="user">go-00sm</fr:addr><fr:route>go-00sm.xml</fr:route><fr:title
text="Multiple Return Values">Multiple Return Values</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Functions can return multiple values, often used with errors:</fr:p><fr:pre><![CDATA[func divAndRemainder(num, denom int) (int, int, error) {
    if denom == 0 {
        return 0, 0, errors.New("cannot divide by zero")
    }
    return num / denom, num % denom, nil
}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>286</fr:anchor><fr:addr
type="user">go-00sn</fr:addr><fr:route>go-00sn.xml</fr:route><fr:title
text="Named return values">Named return values</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Functions can have names specified for the return values, which predeclares variables that are used within the function to hold the return values. These values are initialized to their zero values allowing you to return them before any explicit use or assignment.</fr:p><fr:pre><![CDATA[func divAndRemainder(num, denom int) (result int, remainder int, err error) {
    if denom == 0 {
        err = errors.New("cannot divide by zero")
        return result, remainder, err
    }
    result, remainder = num / denom, num % denom
    return result, remainder, err
}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>287</fr:anchor><fr:addr
type="user">go-00sp</fr:addr><fr:route>go-00sp.xml</fr:route><fr:title
text="Closures">Closures</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>These are functions defined _within_ a function, and are able to access and modify variables declared in the outer function. Closures allow you to pass fome function state to another function. These can also be returned from a function.</fr:p><fr:pre><![CDATA[package main

import "fmt"

func main() {
    a := 20
    f := func() {
        fmt.Println(a)
        a = 30
    }
    f()
    fmt.Println(a)
}]]></fr:pre><fr:p>Anonymous function `f` can read and write `a` even though `a` is not passed in to the function. Using `:=` instead of `=` inside the closure creates a new `a` that ceases to exist when the closure exits.</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>288</fr:anchor><fr:addr
type="user">go-00sq</fr:addr><fr:route>go-00sq.xml</fr:route><fr:title
text="Why use closures?">Why use closures?</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:ul><fr:li>Limit function scope</fr:li>
<fr:p>If a function is going to be called from only one other function, but it's called multiple times, you can use an inner function to "hide" the called function. This reduces the number of declarations at a package level, making it easier to find an unused name.</fr:p>
<fr:li>Removing logic repetetion</fr:li>
<fr:p>Given a piece of logic that is repeated multiple times within a function, a closure can be used to remove that repetition.</fr:p>
<fr:li>Passing to funcs/returning from funcs</fr:li>
<fr:p>These become really interesting, allowing you to take variables within your function and use those variables <fr:em>outside</fr:em> of the function</fr:p></fr:ul></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>289</fr:anchor><fr:addr
type="user">go-00sv</fr:addr><fr:route>go-00sv.xml</fr:route><fr:title
text="Pointers">Pointers</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Standard address (`&amp;`) and indirection/dereferencing (`*`) operators. Pointer tricks such as _pointer arithmetic_ that you can do in C are not allowed in go.</fr:p><fr:p>Before dereferencing a pointer, you must make sure it is non-nil, otherwise the program will panic if you attempt to dereference a `nil` pointer:</fr:p><fr:pre><![CDATA[var * int
fmt.Println(x == nil)			// prints true
fmt.Println(*x)					// panics]]></fr:pre><fr:p>The pointer type can be based on any type, and the built in function `new` creates a pointer variable which returns a pointer to a zero-value instance of the type.</fr:p><fr:pre><![CDATA[var x = new(int)
fmt.Println(x == nil)			// prints false
fmt.Println(*x)					// prints 0]]></fr:pre><fr:p>However, the `new` function is rarely used.</fr:p><fr:p>For structs use `&amp;` before a struct literal to create a pointer instance. When you need a pointer to a primitive type, declare a variable and then point to it.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>290</fr:anchor><fr:addr
type="user">go-00sw</fr:addr><fr:route>go-00sw.xml</fr:route><fr:title
text="Pointers of constants / literals">Pointers of constants / literals</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Constant literals cannot use `&amp;` because they don't have a memory address, e.g.</fr:p><fr:pre><![CDATA[type person struct {
    FirstName string
    MiddleName *string
    LastName string
}

p := person {
        FirstName: "Pat",
        MiddleName: "Perry", // This line will not compile
        LastName: "Peterson",
    }]]></fr:pre><fr:p>There are two ways around the problem. The first is to introduce a variable to hold the constant. The second is to write a generic helper function that takes a parameter of any type and returns a pointer to that type:</fr:p><fr:pre><![CDATA[func makePointer[T any](t T) *T {
  return &t
}]]></fr:pre><fr:p>which allows one to write the previous code as</fr:p><fr:pre><![CDATA[p := person {
        FirstName: "Pat",
        MiddleName: makePointer("Perry"),
        LastName: "Peterson",
    }]]></fr:pre><fr:p>**NOTE**: The only time you should use pointer parameters to modify a variable is when the function expects an interface, e.g. JSON.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>291</fr:anchor><fr:addr
type="user">go-00sx</fr:addr><fr:route>go-00sx.xml</fr:route><fr:title
text="Difference between maps and slices">Difference between maps and slices</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Within the go runtime, a map is implemented as a pointer to a struct, so passing a map to a function means that you are copying a pointer. Thus changes made to a map within the functions are reflected in the original.</fr:p><fr:p>**NOTE**: maps for input parameters or return values should be carefully considered. On an API design level, they are a bad choice because they say nothing about the values contained within. In general one should prefer a struct for these cases.</fr:p><fr:p>A slice is more complicated. Any modification to a slices contents within a function is reflected in the original, but using append to change the length of the array is not, even if the slice has a capacity greater than its length. This is due to slice being implemented a struct with three fields:</fr:p><fr:ul><fr:li><fr:code>int</fr:code> for length</fr:li>
<fr:li><fr:code>int</fr:code> for capcity</fr:li>
<fr:li>a pointer to a block of memory</fr:li></fr:ul></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>292</fr:anchor><fr:addr
type="user">ocs-000N</fr:addr><fr:route>ocs-000N.xml</fr:route><fr:title
text="Enums in Go">Enums in Go</fr:title><fr:taxon>Note</fr:taxon><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>2</fr:day></fr:date><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Go does not have enums like other languages e.g. with an `enum`
keyword, but it's fairly straight forward to implement and extend the
same functionality.</fr:p><fr:p>The following defines the type that will enumerate our variables,
and then we construct the enumeration as constants.</fr:p><fr:pre><![CDATA[type Environment int

const (
      OPS Environment = iota
      UAT
      SITS
)]]></fr:pre><fr:p>That we can create a new type to alias each of these constants,
instead of just doing something like `OPS int = iota`, makes it so
that we can actually reliably use these enumerated values in a type
safe way.</fr:p><fr:p>This way we can define methods that only operate on `Environment`
types, instead of just `int` types. E.g. the following methods take a
`Environment` and return a corresponding endpoint/url.</fr:p><fr:pre><![CDATA[func (e Environment) URS_URL() string {
     switch e {
     case OPS:
          return "https://urs.earthdata.nasa.gov"
     case UAT:
          return "https://uat.urs.earthdata.nasa.gov"
     case SITs:
          return "https://sit.urs.earthdata.nasa.gov"
     default:
          return "https://uat.urs.earthdata.nasa.gov"
}

func (e Environment) CMR_Search_URL() string {
     switch e {
     case OPS:
          return "https://cmr.earthdata.nasa.gov/search/"
     case UAT:
          return "https://cmr.uat.earthdata.nasa.gov/search/"
     case OPS:
          return "https://cmr.sit.earthdata.nasa.gov/search/"
     default:
          return "https://cmr.uat.earthdata.nasa.gov/search/"
}]]></fr:pre><fr:p>Since the underlying type of the enums values are just `int`s, we can also use them just as we would `int`s.</fr:p><fr:pre><![CDATA[func (e Environment) String() string {
     names := [...]string{"OPS", "UAT", "SITS"}
     if e < OPS || e > SITS {
            return fmt.Sprintf("Unkown(%d)", e)
     }
     return names[e]
}]]></fr:pre></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree>